【ポケモンEm】進化したID調整自動化

 

1.はじめに

この記事は Pokémon Past Generation Advent Calendar 2023 の178日目の記事です。

ポケモンエメラルドにおけるID調整は人力ではほぼ不可能です。TIDとSIDを両方調整するとなると、「"さいしょから はじめる"選択から、名前入力開始まで」、「名前入力開始から終了まで」、「名前入力終了からオダマキ博士との会話終了まで」を全て1F単位でフレームを合わせることが前提で、更にOPでAを押すタイミングや、暗転時間のキー入力によって出現するIDがブレるという鬼畜っぷりです。私の知る限り、手動で任意TID&SIDの調整に成功した方はおりません。

そのため、GC自動化を使ってID調整するのが主流です。今回はNx macro ControllerでC#スクリプトを使用したプログラムを作成したので、紹介します。

 

なお、EmのID調整への知識をある程度持っている方に向けた記事となりますので、「全然分からん!」という方は先行して、ぼんじり様の記事を読むことを奨めます。

 

 

2.従来のプログラムとの違い

EmでID調整されている方はDOL macro ControllerまたはORCA GC Controllerを利用されている方がほとんどだと思います。DOLは「IDの画像認識」と「乱数値確認」により、ID調整に特化したツールとなり、ORCAは「複数タイマー機能」により、フレームの調整がものすごく楽です。加えて、どちらのツールもプログラム文法が簡単で誰でも使いやすいツールとなっています。

今回作成したNx macro Controller用のプログラムはC#スクリプト使用のため、視覚的な分かりやすさや、修正しやすさは劣るかもしれませんが、「画像認識」、「乱数値確認」、「タイマー機能」に加えて、以下の機能を追加しております。

名前入力スクリプト
LINEトークンによる通知
高精度タイマーによる±1Fの確保(環境によるかも)

特に名前入力スクリプトは便利で、任意のトレーナーネームを設定するだけで、勝手に目的の名前を入力をしてくれます。要はキー入力のコマンドを書き換える作業が不要となったということです。

※ 名前入力スクリプトはフウ様が作成し、ジュナリ様がデバックしたものを、C#用に調整して使わせていただいています。ありがとうございました。

 

 

3.ID調整自動化プログラム

リセットから「さいしょからはじめる」を選択し、目的のTIDを引くまで、ループする自動化プログラムとなります。

※ Nx Macro Controller用の自動化プログラムです。GC(GBA)自動化の導入はこちらの記事を参考にしましょう。また、フレーム設定には「TIDFinder」というツールを使いますので、ダウンロードしていない方はぼんじり様のGoogleドライブより入手して下さい。

 

※ 2024年7月24日追記

北米版のID調整にも対応しました。9行目の「Var Region」を"USA"」にすると動作します。日本版とベースは変わりませんが、TIDFinderのフレーム設定がそのまま使えないので、目的のIDを狙うには調査が必要となります。

 

 

ゲームでの設定

・「はなしの はやさ」を「はやい」にする。
・ ゲームボーイプレイヤーの画面設定を「フル」にする。

 

Nx Macro Controllerでの設定

・「Var TrainerName」で任意のトレーナーネームを入力する。
・「Var Gender」で任意の性別を入力する。
・「Var TID」で目的のTIDを入力する
・「Var Frame1」、「Var Frame2」、「Var Frame3」をそれぞれ目的のIDが出現するフレームを入力する。(少数単位まで指定可能。)
・IDが合ったらレポートを書く場合は、「Var Report」を「"あり"」にする。

 

初期設定ではFrame1=1676F、Frame2=2064F、Frame3=6609Fの固定臆病5VA7用のIDの設定にしています。この設定はSelectズレが5回で発生となり、名前入力時間も余裕がありますので、ID0狙いであれば使いまわせると思います。もし余分にSelectボタンを押下したい場合は48行目のVar SelectPlus」に増やしたい回数を入力すればOKです。

 

 

OP待機時間をランダムに生成するC#スクリプト

EmのIDはOPを押下するタイミングで出現するTIDが若干ズレます。目的のTIDに合わせるために、OPでの待機時間を変える作業が生じますが、手作業で設定を変えるのは大変ですので、待機時間をランダムにするC♯スクリプトを用意しています。

33行目の 「Var OPRandom」を「"あり"にして、ログを確認すればランダムに生成された5.5秒~12秒までの待機時間を確認できます。

例えば、目的のIDが出現した際の待機時間が「9.825秒」だった場合は、39行目の「Var OPWaitTime」を9.825に変更して、「Var OPRandom」を無効にすればOKです。

 

いわゆるDOL Macro Controllerの「乱数値確認」機能のような使い方ができますので、ぜひ役立てて下さい。なお、Var Frame3」は初期設定だとTID確認まで時間がかかりすぎるので、750程度にしておくと回転率が良くなります。

TIDFinderで目的のIDが出現する条件を調べ、待機時間を微調整して目的付近のTIDを引き、最後にC♯スクリプトでOP待機時間を調べる...というのが、一連の流れとなります。OP待機時間変更でも弾ける気配がないという方は、「TIDFinderで別のフレームを設定する」、「C#スクリプトのFrame1、Frame2のタイマー開始 or 終了時にキー入力のやり方を変える」、「別のOP押下箇所(C#スクリプトの71~79行目あたり)の待機時間を変更する」など色々試してみましょう。

 

Frame1、Frame2をランダムに生成するC#スクリプト

日本版であれば「TIDFinder」から各種フレーム設定を検索できますが、海外版の場合、Frame1とFrame2の設定は力技でフレームで探す必要があります。(ほかの方が見つけてくれれば流用できます。)

42行目の 「Var FrameRandom」を「"あり"にした場合、1600~2100Fの範囲でフレームをランダムに生成し、ログに出力し、45行目で設定している 「Var IDToleranceRange」で目標IDからの許容範囲内(初期設定では±50)のIDを引いた場合は、ログ出力&LINE Notifyで通知しますので、このフレーム設定を基に目標IDに近付けていきます。

 

プログラムの実行

以上の準備ができたら、プログラムの実行をして下さい。Frame1とFrame2がズレることが多い場合などはTIDFinderを使用し、各自で設定を見直してみましょう。

NXのオプションから、LINE Notifyトークンを設定していれば、目的のIDを引いた際に通知してくれます。


引いたIDはcsxファイルと同ディレクトリに作られる「Captures」フォルダに保存されます。TID、Frame1、Frame2、OP待機時間がファイル名になります。

 

 

なお、TIDは電池の有無、ゲーム設定、性別で変わってくるため、discordの3世代自動化鯖で設定を集約しております。OP待機時間は各自の環境によって、多少のズレがありますので、前後5F程度に広げて、同じIDを引けているか確認しながら調整すると良いです。

 

4.御三家乱数自動化

基本的には目的のSIDが引けているか調べるには、実際にそのIDで色違いになるポケモンが光るか乱数調整する必要があります。そのため、御三家を乱数用のプログラムも用意しています。

 

Nx Macro Controllerでの設定

・「Var Frame」で目標の待機フレームを入力する。
・「Var Gosanke」で任意の御三家を入力する。

 

こちらのプログラムはC#スクリプトを使っていませんが、変数(Frame)に待機フレームを渡して、御三家受け取り前にコマンド開始前までの経過フレームを引いたり、待機時間をSecからGBA用のフレームレートに直すなどして、強引にタイマーコマンドチックなことをしています。書き方としてはこんな感じです。

Wait((Frame - 1098)/59.7275)

※ 1098はWaitコマンドが開始するまでの経過フレーム

 

設定ができたら、オダマキ博士の前でレポートを書いてプログラムを実行し、目標の個体が色違いになるか確認します。

 

目標の個体が光らない場合はどのSIDを引いたか、総当たりして調べる必要があります。例えば、TID0でFrame3が6609Fで引けるSID14633を目標としている場合、前後2F程度で出現するSIDで光る個体を総当たりし、それでも光らない場合は範囲を広げてください。光る個体が見つかった場合は、目的のSIDになるようにFrame3を調整してID調整からやり直します。

 

無事に目標の個体が色違いになれば、SIDの調整も成功です。おめでとうございます

 

なお、初期設定では固定臆病5VA7用のIDで光る個体が出現する設定となっています。3gensearchを使って、各自で待機時間を調整して下さい。



5.おわりに

Nxのプログラムはタイマーの汎用コマンドがありませんが、C♯スクリプトを使えば解決できます。プログラミング言語は自分には難しいかなぁと思いましたが、組み始めてみたら意外と何とかなりました。

といいつつも、名前入力スクリプト(通称フウさんジュナリさんありがとうスクリプト)など、自分ではどう組めばいいか分からない部分もありましたので、少しずつ手札を増やしていきたいなと思います。北米版のプログラム作成に当たっては、画像の用意やフレーム設定などを調整して下さった、いぶ様にこの場を借りて心より感謝申し上げます。

 

 

今後のプログラムについて

RS、FRLG、Co/XDのID調整プログラムも順次作成しますが、その前に過去のプログラムも修正したい気持ちが強めです。Nxコマンドの最初に変数で待機フレーム、ループ数や目標アイテム数などを選択し、それ以外のコマンドは変更する必要がないという構成にすれば、かなり他のプログラムも扱いやすくなります。

また、初期のプログラムは画像認識の範囲指定を使っておらず、強引な処理をしている不細工なものが多いので、公開した状態なのが恥ずかしいレベルです。特にものひろい乱数と、タマゴ受け取り自動化はひどい有様です。そんな中ですので、次の記事ではプログラムの修正内容をまとめたものになる予定です。