Blade Rondoのリモート対戦用Discord Botを作り直しました

以前作成した、Domina Games様より大好評販売中のボードゲームである『Blade Rondo』(ブレイドロンド)シリーズのリモート対戦を実現するための Discord botを作り直しました。

github.com

更新内容は以下の通りです。

  • Discord.jsのバージョンをv13に更新
  • スラッシュコマンド対応
    • /newgame normal 通常フォーマットの手札配布
    • /newgame hybrid 混成フォーマットの手札配布
    • /bake パン焼き
    • /help ヘルプ
  • 対戦可能フォーマットの追加

これまでに導入しているサーバーがある場合、権限の更新のため再度の招待が必要です。ご了承ください。

記事の残りは経緯と説明です。詳しいことは上記Githubをご覧ください。

前回のあらすじ

Blade Rondoを離れた友人と対戦するため、そしてお互いにゲームを所持しないとリモートプレイできないという理由で布教するため、私は1年前に個人利用目的でBlade Rondoの対戦を支援するためのDiscord Botを開発したのであった…

tecofalltolt.hatenablog.jp

コミュニティへの招待

Blade Rondoの対戦を行うDiscordサーバーに招待されたので、botを導入して眺めていたところ、めちゃめちゃ使いにくそうにしてたので改修を決断。1年ぶりにプロジェクトを開いて作業をすることにしました。

(これまで導入しようとしていた方へのお詫び: このサーバーへのbot導入時にbotの設定を少し間違えていたことが判明し、そのままではうまく招待ができない状態だったため、修正を行いました。この1年の間に導入しようとして失敗していた方にはお詫び申し上げます。まだ異常があれば教えてください。)

Discord.jsの更新

以前開発に使用していたGlitchでは、Node.jsのバージョンが10とか12とかそのあたりがデフォルトで使用されるようになっており、package.jsonにいくら"discord.js": "latest"と書いたところで読み込まれるDiscord.jsが古いままでした。

scrapbox.io ところが、古いDiscord APIの廃止によって、利用していたバージョンのDiscord.jsは使えなくなるとのことです。 サポートされないライブラリを使うわけには行かないため、ライブラリのアップデートとそれに伴いコマンド呼び出し周りをすべて作り直しました。

スラッシュコマンドの使用

これまでは、@blade rondo dealer BR @maria @sonyaのようなミスするかもしれないチャットメッセージを書いていましたが、スラッシュコマンドで実行できるように変更しました。

Discordのbotを使わないのでスラッシュコマンドの存在を知らなかったのですが、非常に使いやすい機能で、コマンドを増やすのも簡単なので非常に良い機能です。以前のDiscord.jsからありましたが、思いつきの突貫工事で作っていたのでよく確認していませんでした。

/newgame [format] [player1] [player2]のような形式でスラッシュコマンドを定義して候補を追加しておくことで、ユーザーの入力時にDiscord側で候補を出してくれるため、ユーザーが入力ミスを気にすることなくコマンドを実行できます。これで誰でも実行できるようになりました。安心です。

動作環境の移行

これまでは個人で借りているVPS上で動作させていたのですが、スラッシュコマンドにしたところどうにも受け取ってくれず、やむなくheroku上での動作に変更しました。なんで前は動いてたんだ。

VPSをせっかく借りているので、VPS上で動作するかまた試してみようと思います。

フォーマットの追加

しばらく対戦サーバーで動作させていたところ、「ブレイドシュトローム以外の混成フォーマットで対戦したい」の要望があり、利用するカードプールは2セットを利用した40種40枚デッキで良いとのことだったので、バランスはわかりませんがサクッと10通り分を実装。

これに伴って、10種もフォーマットが追加されたことで通常ルールより混成ルールのほうが多くなってしまったため、通常ルールを遊ぶ場合と混成ルールを遊ぶ場合でコマンドを分けることにしました。 だいぶ遊びやすくなったのではないかと思います。

今後について

現在自分が入っているサーバーではBread Rondoは遊ばれていないので問題は発生していませんが、 herokuを利用するとcyclingのタイミングでBread Rondoをプレイしているとパンのデータが失われてしまうため、どうにかしたいところです。 ちょっとしか情報のないパンのためにDB作るのもなんだかなと思いますし、DBが必要な追加機能があればついでに解決したいところです。(あと観測範囲にBread Rondoのプレイヤーがいないため優先度が低いです。)

いくつか考えてはいたのですが、魅力的でも現実的でもありませんでした。

  • トーナメント機能
    • 利用するユーザーはいないことはなさそう
    • このbotではなく別のサービス使ったほうが間違いなさそう
  • サーバーごとのカスタムフォーマット設定
    • 利用するユーザーがいるのか謎
    • 熱心に独自カードプールの研究してる人を知らない
    • 何ならこちらで実装するから教えてほしい
      • 残光ルール採用型の対戦どうしよう…
  • カードの詳細表示
    • twitchにあるMTGのカード効果書いてくれるbotみたいなのを想定
    • 膨大なカードプールのTCGと違って買えばカード全部揃うから手元見てほしい
    • wikiもあるので不要と判断

妙案ありましたらぜひ教えて下さい。