1.はじめに
この記事は Pokémon Past Generation Advent Calendar 2023 の347日目の記事です。
ポケモンコロシアムに出現するダークポケモンは「ナショナルリボン」が付いており、後世代でもそれなりに人気がありますが、色違い&理想個体で捕獲する場合はID調整が必須です。
ID調整は今ではGCの時刻設定を変える必要もなく、CoSeedDataBaseにより「とにかくバトル」のパーティ生成結果を利用したSeed検索も高速化されました。更には生成結果も「CoReader」による画像認識を使うことで、手動で入力する必要がなくなり、数年前に比べると格段にID調整が楽になっております。
せっかく検索が楽になったので、TID指定で理想個体が菱形で光るIDを狙いたくなる訳ですが、約43億のSeedを1点狙いするとなると、ダブルバトルでの消費も時間がかかりますし、ファイヤー4匹で高速消費するのも準備と時間の管理が正直面倒です。また、消費が終わったとしても、フレーム合わせに成功するとは限りません。
私はコロシアムで色菱形の理想個体を捕獲しまくる野望がありますので、何度も周回することになり、無論ID調整も何度も必要です。
絶対に手動でやりたくないので、「初期Seed厳選」→「ダブルバトルで高速消費」→「突入Seedまで端数消費」→「ID調整のフレーム合わせ」→「IDを画像認識して成功判定」までを全て自動化するプログラムを作成しました。これで、ID調整が成功するまで、完全放置ができるということです。すごーい!

2.GCをリセットするためには
初期Seed厳選を自動化する場合、目標Seedの近くのSeedを引けなかった場合はリセットする必要がありますが、CoはXDと違ってリセットコマンドがありません。そのため、サーボでリセットボタンを押すか、リセットピンに直接配線してリセットする必要があります。
今回使用する自動化用ツールのNX Macro Controllerでは、GC自動化用FW「Jiangtun」を書きこんだ、XIAO RP2040またはRaspberry Pi picoを接続し、HOMEコマンドを押すことで、サーボ or リセットを実行できます。概要は下記に記します。
XIAO RP2040
過去にめらるばさんが販売していたGCMAを買った方はコンパクトに美しく接続することができます。GCMAでなくとも、XIAO RP2040のD10ピン(未確認)をGC基板のリセットピンに配線することで、リセットすることが可能らしいです。

配線の方法はこんな感じです。私はピンバイスで小さな穴をあけた後に、デザインナイフで回しながら穴を拡げました。穴を開けたくないなら、リード線をファンから通せばいいです。
リセットピンはこんな感じでどうでしょうか
— めらるば (@larvesta10) 2024年2月3日
穴の縁は隠れるからデザインナイフでぐりぐりして適当な穴開けただけ pic.twitter.com/zwPYAJReQm
Raspberry pi pico
Raspberry pi picoのサーボの配線はジュナリさんの記事に記載されています。記事では言及されてませんが、GP3ピンをリセットピンに配線することで、サーボを使わずにリセットすることもできます。
輪ゴムで固定できるようですが、非常に怪しい見た目をしています(不敬)。
個人的にはプラスチック粘土やUVレジンが簡単で面白そうなので、どなたか試してみて下さい。3Dプリンタでアタッチメントを作るのが最強ですが、とても敷居が高いので。
テープを使わずサーボ固定成功 pic.twitter.com/fXwdE6KEma
— ジュナリ (@junari000) 2024年9月5日
3.ID調整自動化
①プログラムの入手
まずはID調整自動化に使用するプログラムの入手です。以下のGoogleドライブより、nxcファイルをダウンロードして下さい。
※ NX Macro Controller用です。GC(GBA)自動化の導入はこちらの記事を参考にしましょう。
プログラム作成に当たっては夜綱さんが公開している汎用的な乱数用ライブラリである
・PokemonPRNG
・PokemonCOSeedDataBaseAPI
・PokemonCoRNGLibrary
をお借りしました。なお、PokemonCoRNGLibraryのReleaseで公開されているdllについては、とにかくバトルのパーティ生成組み合わせによる端数消費方法や、主人公の名前入力画面の消費を計算するメソッドがありませんので、新たに追加してビルドしたものを使用しています。
②事前設定
プログラムをNX Macro Controllerで開くと、nxcファイルの同階層に「Co_ID調整自動化」というフォルダが生成されます。その中に入っている「設定.exe」ファイルに諸情報を入力して下さい。目標SeedはCosearchを使って検索します。名前入力画面に突入時のSeedではなく、ID決定時のSeedを入力します。
突入時のSeedは目標Seedの2000F前のSeedに自動計算されますが、それでもSeedによって、空白時間のズレは起こりうると思うので、1点狙いするのがよいと思います。

許容する消費の上限は最も効率的な値に自動計算してくれます。算出はニアトさんの記事を参考にしました。
8回検索モードではLightDB、7回検索モードではFullDBを参照します。保存先のフォルダパスを参照して下さい。どちらか片方でいいですが、ダウンロードしていない場合は夜綱さんのdropboxより入手して下さい。
各項目を入力してOKを押すと、「setting.json」というファイルが生成されます。これで事前準備は完了です。
③プログラムの実行
事前設定が終わったら、セーブデータ作成済みのデータでプログラムを実行します。

流れは「目標Seedまでの消費が許容範囲内のSeedを引けるまで、初期Seed厳選」→「ダブルバトルで毎秒2230±30の高速消費」→「消費終了後に残り消費数が60万以下になったら、高速消費終了。60万以上ならもう一度高速消費」→「とにかくバトルのパーティ生成と、設定変更で名前入力画面の突入Seedまでは端数消費」→「最初から始めるを選択して、名前入力画面に移動。名前入力とフレーム合わせ」→「TIDを画像認識して目標のIDと合ったら終了。合わなければ初期Seed厳選に戻る」となります。
Youtubeにデバッグしてもらった際の動画を残していますので、参考にして下さい。GV-USB2でも問題なく動きますが、OBS-Cameraには対応していません。
Coはなぜか押下に失敗することがありますが、入力ミスがあったとしてもリセットして最初からやり直すので、そこまで問題にはなりません。空白時間は初期設定で584Fとしていますが、各自で調整してみて下さい。大きくはズレないと思います。
NXのオプションでWebHookのURLを設定していれば、高速消費に移行する際、高速消費が終了した際、IDを確認した際にメッセージが送信されます。目標Seedが分からないという方はログやエーフィ・ブラッキーのステータスから確認すれば良いです。
4.おわりに
dllの組み直しや、乱数処理回りにかなり苦戦しましたが、何とか組むことができました。ライブラリを使った乱数処理や、IDの画像認識、フレーム合わせなど、過去のプログラムの中でも一番重かったと思います。助言をくれた夜綱さんや、プログラムを参考にさせて頂いた りずさんにはとても感謝しております。
次はXDのID調整も完全自動化したいところです。あのゲームの乱数はオタク向けなので、あまり重要はないかもしれませんが。