ツイッターの方ではちょくちょく公開させていただいておりましたが、amiiboを使うと引くことの出来る福引を完全自動化&無限引きに対応させてみたお話です。
競馬AIとは全く関係ないですがモンハンriseの福引自動化のボット作りたい…
競馬AIを公開していることも、元を辿っていけば「エンジニアの知識を付けるとこんな面白いことも出来るよ」ということを一人でも多くの方に知っていただきたいという思い。多分数日で簡単に出来るので作って公開しようかな
— エンジニアらいむ@競馬予想AI:Gaspard(ギャスパー)運用中 (@engineer_lime) 2021年4月4日
内容
まずは動画を作ったのでご覧ください。(※2021/04/07 07:00に公開されます)
福引自動化&無限引き
通常の福引はセール中に1度という制約がありますが、amiiboで引くことの出来る福引は1日3回までの制約を除けば無限に引き続けることが出来ます。しかも日付の管理はあくまで本体側の時計でしか判断されておらず、時計さえずらしてしまえば何度でも簡単に引くことが出来てしまいます。ポケモン界隈で流行っていた自動化の手法で簡単に実装出来ると踏み切って実装してみたのがきっかけ。
結論からするとまだまだ改良の余地あり。
amiiboは純正コントローラから読み込む必要があるのですが思いの外すんなりと読み込んでくれないんですよね。 15秒ほど猶予を持たせてみましたが、これでも時々失敗してしまうことがありました。
また今回はPCからBluetoothでSwitchに接続する形式を取ってみましたが、有線と比べると多少のラグが発生してしまうこともありました。ラグが発生して然るべきキーが実行されないと処理が途中で変な方向に向かってしまうんですよね。
少々時間は掛かってしまいますが、ポケモンで実装したときと同じようにマイクロコンピュータデバイスを使って実行する方式に変更しようと思っています。ある程度の反響があればソースコード等の公開も考えています。それまでに動作を安定させたいな。
amiiboについて補足
amiiboで引くことの出来る福引には大きく分けて2パターンあります。
1つ目がMHRiseコラボとして発売された3体。マガイマガドとオトモガルクとオトモアイルーの3体ですね。
こちらについては専用の福引が用意されています。それぞれの当たりは以下の通り。
amiibo | 当たり | その他 |
---|---|---|
マガイマガド | 鎧玉系 | 原珠/罠(落とし穴/シビレ罠/タル爆弾) |
オトモガルク | 鬼神薬グレート | 硬化薬/閃光玉/音爆弾/強走薬 |
オトモアイルー | アキンドングリ | 謹製おだんご券/秘薬/粉塵 |
マガイマガド(これは普通の当たりです。大当たりのスクショ撮れていなかった…大当たりでは鎧玉と原珠のレア度が更に上がって罠の個数が増えます。)
オトモガルク(大当たり)
オトモアイルー(大当たり)
どれも魅力的ですが、個人的には防具の強化に役立つ鎧玉と、よく使うけど作るのが結構面倒臭い罠一式が入っているマガイマガドを推します。
そしてもう2つ目のパターンがその他のamiiboで実行した場合。
通常の福引と同じく、ランダムのようです。回復薬とかが手に入るのでこちらでも十分だと思いますね。
採掘自動化
福引自動化はそれなりのコンピュータ知識に加えて品薄でなかなか手に入らないamiiboが必要ということで明らかに敷居が高いです。なのでオマケとして割と簡単に実装できる採掘自動化も紹介に取り入れてみました。
こちらは連射機能付きコントローラーがあれば誰でも簡単に実装出来ます。
昔はホリパッドといえばスティックが異常に固くて使いづらい印象でしたが最近のは純正に近い使用感でかなり使いやすく感じますね。純正までの質感はないにしても、半額以下なので許容範囲です。
まとめ
競馬AI開発の傍らで作った物の紹介でした。もうちょっと動作を安定させるまで続けたいと思います。
追記
マイコンに移植しました。
非常に安定して動作してくれていますので、近日中に内部構造を公開します。
マイクロコンピュータデバイスに移植完了。安定感抜群でとてもいい感じ。
ゲーム本編より楽しくなってきたので他も作りたい…#モンハンライズ #自動化 #NintendoSwitch #無限福引き pic.twitter.com/C7UgUKv140— エンジニアらいむ@競馬予想AI:Gaspard(ギャスパー)運用中 (@engineer_lime) 2021年4月8日
内部構造公開。
使う処理は2つだけ。
1. 福引を実行する関数 2. 月日を変更する関数
これらをループするだけの簡単仕様です。joyconでも出来なくはないですが、絶望的に固定しづらいのでプロコンを推奨。
利用開始の条件としては、プロコンにamiiboを固定⇒雑貨屋の選択肢「amiiboを読み込む」にカーソルを合わせておくだけでOKです。
俗に言う『時渡り』ですね。ポケモンでもおなじみのロジックなので今更語ることもないでしょう。とってもシンプル。
ちなみにこちらのコードは緊急で書き上げたこともあり、最も語句が短くシンプルに書けそうだった『NintendoSwitchControlLibrary』というライブラリを利用させていただいております。詳しくはググってください。モンスター素材自動収集プログラムとは利用しているライブラリが異なりますのでご注意ください。気が向いたら移植するかもしれません。
福引を実行する関数
本体部分になります。
// 福引実行 void execLottery() { // amiibo読み込み pushButton(Button::A, 5000); // 回して受け取る pushButton(Button::A, 50, 11); }
月日を変更する関数
月と日をそれぞれ+1します。日付の重複判定が時々掛かってしまうようですのである程度のランダム性を持たせるためにそうしています。
理論的なことには詳しくないので体感のレベルですが、2021/1/1から開始すると1日放置しっぱなしでも延々と回り続けてくれました。
// 時計変更 void timeFlyer() { // ホーム画面 > 設定 pushButton(Button::HOME, 500); pushHat(Hat::DOWN, 25); pushHat(Hat::RIGHT, 25, 5); pushButton(Button::A, 100); // 設定 > 本体 > 日付と時刻 holdHat(Hat::DOWN, 2000); pushHat(Hat::RIGHT, 25); pushHat(Hat::DOWN, 25, 4); pushButton(Button::A, 200); // 日付と時刻 > 現在の日付と時刻 pushHat(Hat::DOWN, 25, 2); pushButton(Button::A, 500); pushHat(Hat::RIGHT, 25); pushHat(Hat::UP, 25); pushHat(Hat::RIGHT, 25); pushHat(Hat::UP, 25); pushHat(Hat::RIGHT, 25, 3); pushButton(Button::A, 50); // ホーム画面 > ゲーム画面 pushButton(Button::HOME, 1000); pushButton(Button::A, 500); }