MtGがやりたすぎて気が狂いそうになったのでDiscordでモミールベーシックが遊べるようにした
MtGがやりたい。
でも周りにやってる人が少ない。
使ってるマシンがMacオンリーなのでMOもできない。
MtGがやりたい!
そうだ、Discordでモミールベーシックやろう。
できました(所要時間8時間)
モミールについてはmtgwikiみてください(丸投げ)
http://mtgwiki.com/wiki/モミール・ベーシック
使うもの
・Ruby 2.4.1(バージョンは割と自由)
・nokogiri(バージョンはRubyに合わせて)
・open-uri(nokogiriにパッケージングされてると思う)
ざっくり言うと
Gathererのクリーチャー・タイプ+点数で見たマナコストXの検索結果から、nokogiriでランダムにカードをパースして、カード名やテキスト、P/Tを表示する、というもの。
土地の管理とか手札の管理とか場の管理とかはなんか…いい感じにしてくれ。
細かい中身の話
1. /Momir X (Xは整数)がDiscordのコマンドとして叩かれると(例としてX=4)
2.
3. ページ上部のこれ↓
の(2062)を読んで(要するに合計カード数を調べてる)
4. 0~2061の間で1個乱数生成して
5. 生成した乱数を10の位以下と100の位以降の数字に分ける(1234だったら前者が34、後者が12)
7. カードリストの34番目のカードのカード名やテキスト、P/Tなどをパースして
8. 整形して出力する
以上終わり。合間合間に銀枠セットだった場合redoさせたり、検索結果が0件だった場合(X=14とX=17以上で発生)にそれ用のメッセージを表示したりする。
(英語が合ってるか怪しい)
問題があるとしたらカード数が多いマナ域は処理が重いってことぐらいですかね。Gathererが重いのが全部悪い(責任転嫁)
処理を軽くするなら、まず使用する全カードをパースしてJSON形式とかで保存して、使うときにそこから取り出すって感じが丸そう。
ただまぁ、そうするとGathererの更新に合わせて追加でパースしなきゃいけなくてめんどいのでこの形式が楽だと思う(怠惰)
あとはX=13で起動すると新エムラが出るはずなんですが、Gathererは検索結果がユニークだった場合カードリストではなくそのカードの詳細ページに直接リダイレクトしてくれるので、エラーを吐きます。まぁX=13起動できたら実質勝ちだし多少はね?
(同じ理由でX=16も駄目です。ドラコしか出ない)
Githubにソース載せるか〜って思ったんですが、ClientIDとかtokenとかが表示されちゃうとマズいのでめんどくさくてやってません(貧乏人はプライベートリポジトリを持てない)
以下ソース全文。文字に起こして整形するのがめんどいので例によってTerminalのスクショ載せます
ちょっと汚いけど、スクレイピングってこんなもんだと思う(怠惰)
ところで、
bot.commandにdescriptionを設定すると/help commandでその内容を表示してくれるので便利です(今回はMomir Vigの日本語テキストを表示するようにした)
以上。いつも通り聞きたいことはコメントかTwitterで聞いてください。
上のアカウントの方が幾分か真面目な話をしてます(当社比)。
ゆっちゃん/ユウ (@yuhachi0220) | Twitter