【ポケモン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ドライブより入手して下さい。

 

ゲームでの設定

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

 

Nx Macro Controllerでの設定

・「Var TrainerName」で任意のトレーナーネームを入力する。
・「Var Gender」で任意の性別を入力する。
・「Var Frame1」、「Var Frame2」、「Var Frame3」をそれぞれ目的のIDが出現するフレームを入力する。(少数単位まで指定可能。)
・「Var TID」で目的のTIDを入力するする
。(初期設定ではTID 00000用)

※ マクロ実行前にテストをしてみて、画像認識がうまくいかない場合は、画像の差し替えや、Var Threshold」の引数を変更して、閾値を増減するなどしてみて下さい。減らすと「認識しやすさ↑ 精度↓」となり、増やすと「認識しやすさ↓ 精度↑」となります。私は差し替え&閾値

 

初期設定ではFrame1=1676F、Frame2=2064F、Frame3=6609Fの固定臆病5VA7用のIDの設定にしています。この設定はSelectズレが5回で発生となり、名前入力時間も余裕がありますので、ID0狙いであれば使いまわせると思います。(Hopeさんに見つけてもらった設定に変えたら、めっちゃ安定しました。)

 

 

OP待機時間を変更するC#スクリプト

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

40行目の 「Press(A, 0.10, 7.684)」を「CallCsx(R"Aボタンをランダムな時間で押下する.csx")にして、ログを確認すれば実際に生成された待機時間を確認できます。

例えば、目的のIDが出現した際の待機時間が「9.27秒」だった場合は、40行目を「CallCsx(R"Aボタンをランダムな時間で押下する.csx")」の代わりにPress(A, 0.10, 9.27)」に変更すればOKです。

Nxのヘルプを確認すれば分かりますが、上記コマンドの0.10はボタン押下時間、9.27は押下した後の待機時間(sec単位)となります。

 

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

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

 

 

マクロの実行

以上の準備ができたら、マクロの実行をして下さい。Frame1とFrame2がズレることが多い場合などはTIDFinderを使用し、各自で設定を見直したり、ツールを再起動するなど色々試してみて下さい。(長時間C#スクリプトを稼働するとメモリ使用量が増加するかも?)

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

 

なお、C#スクリプト内の性別変更時のキー入力は何故か上下キーが反転してしまったので、うまく動作しないという方はご連絡下さい。FWの問題なのか、スクリプトにおかしな部分があるのか分かりませんが...。

 

 

画像認識について(余談)

今回作成したマクロは実機からキャプチャした画像を使用して、TIDがズレていないか画像認識しています。元々はOCRを使う予定でしたが、下処理や、閾値の設定をしても精度が中々確保できませんでした。うまく設定できれば正常に動作するかもしれませんが、GCのキャプチャ環境が人によって違う場合が多いということもあり、泣く泣く画像認識利用に切り替えました。

認識がうまくいかなかった場合、C#スクリプトのOCR処理を修正させるよりは、実機の画像を差し替えたり、閾値を変更する方が簡単かなぁと思っています。と、いいつつも、精度は完璧ではなく、「3」、「8」、「9」の違いには弱いので、コマンドを書き換えて、認識したい数字の処理を先に持ってくると安心できるかもしれません。

 

 

4.御三家乱数自動化

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

 

Nx Macro Controllerでの設定

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

 

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

Wait((Frame - 1098)/59.7275)

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

 

設定ができたら、オダマキ博士の前でレポートを書いてマクロを実行します。目標の個体が色違いになるか確認し、光らない場合は前後のSIDを引いた場合の個体が光っているかを調べます。このような流れで、SIDを特定&待機時間の調整をしましょう。

 

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

 

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



5.おわりに

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

といいつつも、名前入力スクリプト(通称フウさんジュナリさんありがとうスクリプト)など、自分ではどう組めばいいか分からない部分もありましたので、少しずつ手札を増やしていきたいなと思います。

また、任意TID、TN、性別でのOP待機時間を調べるのが大変という方は、筆者のXアカウント(@Natu5307051)まで連絡いただければ、こちらで調べることも可能ですが、必ず互いの環境で成功する保証はないです。

 

今後のマクロについて

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

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