やおよろず

ゆるふわな内容を書いても良い。と言うか何でも良い。そんな自由度の高いブログをめざします。

SW2.5のキャラ作成ダイスロールをDiscord上のbotにしてみた話

この記事は ニューノーマル ぴょこりんクラスタ Advent Calendar 2020 の為に書いたものです

はじめに

TRPGってあるじゃないですか。てーぶるとーくあーるぴーじー。
僕は結構好きなので良くリプレイ動画を見たり実際に遊んだりもしています。

数ヶ月ほど前、国産TRPGの定番*1であるソードワールド2.5(以下SW2.5)のお試しセッションをやって欲しい
(意訳:ゲームマスター(以下GM)をやれ)とお願いされたことがありました。

fujimi-trpg-online.jp

普段遊んでいるGM持ち回りセッションで僕のターンになって現在せき止め中…と言うくらいGMが苦手な僕ですが、
初心者ばかりのメンツだとGMやるヒトがいないと言うことで、はじめの数回、GMを行うことになったんですね。

そして、TRPGを経験したことがある人なら何となく分かると思うのですが、
こう言う時、TRPGを始めるにあたり時間がかかる*2工程の一つに、キャラ作成があります。

SW2.5ではキャラクターを作成するに当たって6つの能力値(A器用度 B敏捷 C筋力…)を サイコロで決めるのですが、
そもそもサイコロ振る前に決めている種族(エルフとか、ドワーフとか)によって振るサイコロの数も違ったりして、
何かとミスがおこりやすい&毎度調べるけど覚えられない部分だったりします。
(ダイス振るだけじゃなくてそこに生まれから定まる基準値を足して…みたいな話もあるんですが、そこは目を瞑る)

そこそこ人数も多いし、初心者が多いセッションで各種説明とかをする時間・ミスするリスクも踏まえると、
この手順は今回のケースでは簡略化出来ないかな…という突発的な需要がありました。

本題

discord*3で所定のコマンドに基づきキャラクター能力値ダイスを振ってくれるbotを作りました。

github.com

使い方

ここに書こうと思ったんですがgithubのreadmeの方にだいたいかいてしまったのでそっちをみてくれ!

結論だけかくと、以下のような事ができるbotです

f:id:yaoshimax:20201217224956p:plain
bot実行結果

2d=6面ダイスを2個振る
1d =6面ダイスを1個振る
見たいな略記で、括弧内にダイスロールの結果、矢印の先にそれらを足し合わせた値が表示されています。

実装について

discordgoのexample が大分わかりやすかったので、
この辺りのコードを読みながら後はだいたいやるだけはあります。ダイスとかは単純な乱数なので大した捻りもない。
たぶん実装自体はdiscordgoの学習も含めて3時間くらいの勢いだけでつくった感じ。

工夫をしたところを少しだけ上げるなら、以下のようなところです。

  • 出力の矢印の長さをちょこっとだけ調整する

こまかな調整をする気はなかったものの、上の図でいうところのタビットのE値みたいに、6面ダイス2回振った値に6を加えた値を結果とする、 見たいなケースでは、矢印の長さが長すぎるとちょっと結果が見づらくなる傾向が会ったので、そこだけ矢印を短くしています。

  • 種族拡張のしやすさをちょこっとだけ気をつける

自分の知る限りではSW2.5のダイスは6面ダイスしか使われないはずで、
およそ能力値を算出するときは6面ダイスをn個振った値+固定値d にしかならないので、そこだけ変数としてリストに保存することで種族増やしやすくしました。

"/人間": []roll {roll{n:2,d:0}, roll{n:2, d:0}, roll{n:2,d:0}, roll{n:2, d:0}, roll{n:2,d:0}, roll{n:2, d:0}},
"/エルフ": []roll {roll{n:2,d:0}, roll{n:2, d:0}, roll{n:1,d:0}, roll{n:2, d:0}, roll{n:2,d:0}, roll{n:2, d:0}},
"/ドワーフ": []roll {roll{n:2,d:6}, roll{n:1, d:0}, roll{n:2,d:0}, roll{n:2, d:0}, roll{n:1,d:0}, roll{n:2, d:6}},
"/タビット": []roll {roll{n:1,d:0}, roll{n:1, d:0}, roll{n:1,d:0}, roll{n:2, d:0}, roll{n:2,d:6}, roll{n:2, d:0}},

こんな感じ。実際これ作った頃はルールブックの2までしか僕は買ってなかったので、
ルールブック3に掲載されてる新種族はさっき5分と立たずに追加しました。便利。

  • ダイスを振った後で指示を出した人にメンションを返す

これ地味に重要で、複数のヒトが同じコマンドを同時に発行したときに、
どの結果がだれあてのものなのかを明言するために必要な機能です。

この辺りはdiscordgo examplesには乗っていなかったので、何か気合いでぐぐってやり方を見つけました。
結論としては以下のコードにある m.Author.Mention() を使えば出来るみたいでした。

s.ChannelMessageSend(m.ChannelID, m.Author.Mention() + " "+ m.Content[1:]+"の能力ダイス結果です\n"+message)

おわりに

と言うわけで、SW2.5のダイス振るとこ一部をdiscordのbotにしたよ、と言う話でした。

さも当然のようにGo言語をつかってかいていますが、
僕はGo言語でコードを書いたことはなかったので、ちょっと勉強ついでに簡単なことやって見るかって意図もあったり。

数時間の格闘で済ませた雑なbotだったけれども、個人的には、
作ってみてヒトに使ってみて貰えて反応を貰えて嬉しくなる、という
プログラマの原点に立ち返るような体験ができたので良かったです。
たまには 雑でもこう言うモノ作ってみると良いことあるもんですね。

ま、結論としては、以下の能力値作成を使った方が断然楽だったんですけどね!

ゆとシートⅡ(ゆと工公式)/SW2.5

お粗末*4

*1:ソードワールド2.0の方が有名で、2.5は2018年に出始めの新バージョンです。エンジョイ勢なのでわりと一緒くたにして話してる節があります。許して

*2:基本的には、その時間含めて面白いんですけどね

*3:そういえば昔はSkypeとどどんとふにお世話になったもんですが、今じゃすっかりDiscordとユドナリウムになりましたね。どどんとふといえばFlashサポート終了が近づいた時期でもありややタイムリーですね(おたく特有の早口)

*4:言い訳をするとこのサイトのことは事前に気がついていたんですが「能力値作成」が今回やりたかったことと等価な事に気付かず、と言うか右上のキャラクター作成ボタンにしか目が行かなかったからランダムでダイス振る機能無いのかーそっかーと思っちゃったんですよね。まぁ目が節穴だったって話なんですけど