ユウのブログ

なんでも書きますよ。

MtGがやりたすぎて気が狂いそうになったのでDiscordでモミールベーシックが遊べるようにした

MtGがやりたい。

 

でも周りにやってる人が少ない。

 

使ってるマシンがMacオンリーなのでMOもできない。

 

MtGがやりたい!

 

そうだ、Discordでモミールベーシックやろう。

 

f:id:f_julover:20180622121526p:plain

 

できました(所要時間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. 

http://gatherer.wizards.com/Pages/Search/Default.aspx?page=0&action=advanced&type=+[%22Creature%22]&cmc=+=[4]" にまず飛んで

3. ページ上部のこれ↓

f:id:f_julover:20180622121736p:plain

の(2062)を読んで(要するに合計カード数を調べてる)

4. 0~2061の間で1個乱数生成して

5. 生成した乱数を10の位以下と100の位以降の数字に分ける(1234だったら前者が34、後者が12)

6. http://gatherer.wizards.com/Pages/Search/Default.aspx?page=12&action=advanced&type=+[%22Creature%22]&cmc=+=[4]に飛んで

7. カードリストの34番目のカードのカード名やテキスト、P/Tなどをパースして

8. 整形して出力する

 

以上終わり。合間合間に銀枠セットだった場合redoさせたり、検索結果が0件だった場合(X=14とX=17以上で発生)にそれ用のメッセージを表示したりする。

f:id:f_julover:20180622122400p:plain

(英語が合ってるか怪しい)

 

問題があるとしたらカード数が多いマナ域は処理が重いってことぐらいですかね。Gathererが重いのが全部悪い(責任転嫁)

 

処理を軽くするなら、まず使用する全カードをパースしてJSON形式とかで保存して、使うときにそこから取り出すって感じが丸そう。

 

ただまぁ、そうするとGathererの更新に合わせて追加でパースしなきゃいけなくてめんどいのでこの形式が楽だと思う(怠惰)

 

あとはX=13で起動すると新エムラが出るはずなんですが、Gathererは検索結果がユニークだった場合カードリストではなくそのカードの詳細ページに直接リダイレクトしてくれるので、エラーを吐きます。まぁX=13起動できたら実質勝ちだし多少はね?

(同じ理由でX=16も駄目です。ドラコしか出ない)

 

Githubにソース載せるか〜って思ったんですが、ClientIDとかtokenとかが表示されちゃうとマズいのでめんどくさくてやってません(貧乏人はプライベートリポジトリを持てない)

 

以下ソース全文。文字に起こして整形するのがめんどいので例によってTerminalのスクショ載せます

 

f:id:f_julover:20180622124528p:plain

 

 

ちょっと汚いけど、スクレイピングってこんなもんだと思う(怠惰) 

 

ところで、

bot.commandにdescriptionを設定すると/help commandでその内容を表示してくれるので便利です(今回はMomir Vigの日本語テキストを表示するようにした)

 

f:id:f_julover:20180622123242p:plain

 

以上。いつも通り聞きたいことはコメントかTwitterで聞いてください。

上のアカウントの方が幾分か真面目な話をしてます(当社比)。

ゆっちゃん/ユウ (@yuhachi0220) | Twitter

ゆっちゃん (@F_Julover) | Twitter