# ポケモンXDの乱数調整を自動化する話 この記事は[Pokémon Past Generation Advent Calendar 2022](https://adventar.org/calendars/7493) 9日目の記事です。 ポケモンXDの乱数調整と、その自動化について書きます。 # はじめに 『[ポケモンXD 闇の旋風ダーク・ルギア](https://www.nintendo.co.jp/ngc/gxxj/index.html)』は、いわゆる第3世代に分類されるポケットモンスターシリーズ外伝作品です。前作『ポケモンコロシアム』同様、基本的に野生ポケモンは出現せず、敵が繰り出す「ダークポケモン」をスナッチして(奪って)仲間を増やす異色のストーリーが特徴となっています。 ともに旅をして心を通わせ、リライブを完了した元ダークポケモンには、ほかに入手方法のない専用のリボンである「ナショナルリボン」(二つ名:こんなんをのりこえた)が付与されます。したがって、GC外伝2作品は一部のリボンコンプ勢にとって、発売から17年が経った今なお重要な作品であり続けています。 私はおもに(自分の好きなポケモンであるジュペッタが登場する)ポケモンXDについて、乱数調整の自動化をおこなってきました。この記事ではその総括と、最新のXD自動乱数調整についてご紹介します。 # XD乱数調整について 「ポケモンXD 乱数調整」などと検索して最上位にヒットする、ギンザルさんが2015年以前に発表していた「xdseed」「xdpokemon」「xdcheck」(元サイト閉鎖のためURLなし)を使用した手法は、XD乱数調整の草分け的なものです。現在でも有効ですが、基本的には以下で紹介する手法のほうが効率よく(そして自動化しやすい操作で)おこなえます。 自動化の対象となっている手法は、かけらさんによって2019年から報告されている、「いますぐバトル」で現在seedを特定するものです。さしずめ「現代XD乱数調整」と呼ぶべきでしょうか。 https://sina-poke.hatenablog.com/entry/2019/03/19/131959 ツールについては、夜綱さんの「XDSearch」を使用できます。詳細は以下の解説をご覧ください。実際に一度手動で成功させると、自動化しようとした理由がわかるはずです。 <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">XDSearchを使ったXD乱数講座 準備編</p>&mdash; 夜綱 (@sub_827) <a href="https://twitter.com/sub_827/status/1299324702016536580?ref_src=twsrc%5Etfw">August 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">XDSearchを使ったXD乱数講座 本番編</p>&mdash; 夜綱 (@sub_827) <a href="https://twitter.com/sub_827/status/1299340779412889601?ref_src=twsrc%5Etfw">August 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">XDSearchを使ったID調整講座 <a href="https://t.co/6nj3VHzo69">https://t.co/6nj3VHzo69</a></p>&mdash; 夜綱 (@sub_827) <a href="https://twitter.com/sub_827/status/1383353440194031616?ref_src=twsrc%5Etfw">April 17, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> # XD乱数調整のここがめんどくさい さて、いますぐバトルを利用した新手法―現代XD乱数調整によって、XD乱数調整は大幅に効率化されました。しかし引き続きめんどくさい点もあります。 ## 効率のよい乱数調整には、初期seed厳選が重要 ファイヤーを戦闘画面に出して待機する時間は、できるだけ短い方が好ましいことはいうまでもありません。主人公のステップを眺めてseedを特定するよりははるかに楽ではあるものの、目視で5種*2人の手持ちとHPを確認してツールに入力する作業は、相当めんどくさいです。結局、数時間では済まない~1日のような比較的長い待機時間で妥協することになりがちです。 ## 長い待機のあと、消費を止めるために予定がロックされる たとえば24時間の消費を選ぶと、24時間後にはGCの前で待機しておいて、消費を止める必要があります。大学生の頃のように時間を腐らせていた間は気になりませんでしたが、普通に働いている人にとってはなかなか難しいことです。比較的短い待機時間のseedを引き当てても、消費を止めることができないため諦める......ということもあり得るでしょう。 > ちなみに、私の自動化ツールづくりは、この「一定時間後に戦闘を離脱」の作業を自動化するところからはじまりました。 # 自動化の取り組み 自動乱数調整は、これらのめんどくさいポイントを解消します。「はじめに」でもお伝えした通り、私は以前からXD乱数調整の自動化に取り組んできました。 <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">みずようかんさん(@ AT12806379)のGCコントローラーArduinoファームフェアWHALEと夜綱さん(@ sub_827)のXDSearchを黒魔術でがっちゃんこして、ポケモンXDのseed厳選を自動化しました。<br>文字認識周りはImageMagickで下処理してTesseract OCRに食わせています、コマンドで完結してお手軽~ <a href="https://t.co/AWY3IVi3qz">pic.twitter.com/AWY3IVi3qz</a></p>&mdash; メイユール (@meilleur_pkmn) <a href="https://twitter.com/meilleur_pkmn/status/1473283040185298944?ref_src=twsrc%5Etfw">December 21, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> なお、このアプリケーションの最終版はこちらです。次の章で説明する事情により、このアプリケーションは今後アップデートする予定はありません。 https://github.com/mukai1011/XDSeedSorter しくみは説明するまでもないほど簡単で、ここまでおこなってきた操作を、OCRとみずようかんさんが紹介した「GC自動化」によって自動化したものです。 <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">RJ45の8番ピンが5Vではなく3.3Vだったので記事修正<br>GC自動化ver2アップデート|ゲーム好きの和菓子 <a href="https://twitter.com/hashtag/note?src=hash&amp;ref_src=twsrc%5Etfw">#note</a> <a href="https://t.co/iTutgnMi4L">https://t.co/iTutgnMi4L</a></p>&mdash; みずようかん (@AT12806379) <a href="https://twitter.com/AT12806379/status/1509136059984412675?ref_src=twsrc%5Etfw">March 30, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> いちおうフローチャートなんて殊勝なものも残していたりします。 https://github.com/mukai1011/XDSeedSorter/blob/main/Sorter/README.md # Poke-Controllerとの邂逅 この記事を読んでくださる方であれば、ここまでの説明で、「画像認識」と「自動操作」を組み合わせたこの取り組みが、Switchの自動化とほぼ同じものであることがわかるでしょう。そこで、最近はXD自動化も、[Poke-Controller](https://github.com/mukai1011/Poke-Controller-Modified)との融合を進めています。最後に、この取り組みのいきさつと現状を説明します。 まずはPokeConからGCを操作するためのファームウェアが必要です。みずようかんさんのWHALEをもとに、フウさんによって開発された「HITSUMABUSHI」を利用します。機材を置き換えるだけで、PokeConをGC自動化に利用できます。 https://note.com/dragonite02/n/n1107d2d97683 続いて、前掲のXDSeedSorterが依存していた、疑似乱数周りのライブラリをPythonに移植する必要がありました。これについては夜綱さんが実現してくださいました。 https://github.com/yatsuna827/xddb xddbをもとに、実際の操作"以外"を受け持つのが拙作のxdrngtoolです。 https://github.com/mukai1011/xdrngtool xdrngtoolを利用して、実際の操作をあてがいPokeCon用のXD自動乱数調整ツールとしたものがXDRNG_Auto_Adjusterです。 https://github.com/futo030/XDRNG_Auto_Adjuster なのですが、じつは私はこちらで乱数調整をしたことがまだ1度しかありません、すみません......今後コントリビュートするので許してください...... # おわりに ということで、今後のXD乱数調整自動化は、PokeConを中心に開発を進める予定です。これまでは、エンカウント前のseed調整までがメインで、エンカウントや成功判定はアドホックな感じにツールを作りながらやっていましたが、PokeConの機能とコミュニティの資産があれば、今後は個体値の判定もPython上でおこなわれるようになったりするのかな、と夢見ています。 だんだん時間がなくなってきて最後のほうが雑に......解説を書くと予告しておきながら全く書けていないのも、本当にすみません。 明日は、剣心さんの「クマ(ポケモンボックスのお話)」です。クマ......?