あまりよくない記事なので消す可能性があります
「任意コード実行を利用して完全に任意の個体とエンカウントすることは可能なんですか?」
との質問を頂いたので適当に思い付いた手法を検証してみたいと思います。
今回は色陽気高個体のジラーチとのエンカウントを目標とします。
1)TIDの特定
色高個体とエンカウントすると言っておきながら私は自ROMのTIDを全く把握していません。
ニューゲームしてTID調整するのも面倒なのでバイナリエディタを利用して自ROMのTIDを確認します。
手持ち2匹目に自己産の適当なポケモンを入れた状態でバイナリエディタを起動し、0x020241F8からの4byteの値をチェックします。
という訳でこのROMのTIDは0x5696A7DFであることが判明しました。
表ID、裏IDに変換すると42975、22166となります。
この値を色違い個体検索に利用します。
2)個体の呼び出し
某ツールを起動し固定乱数の個体検索で適当に検索してみます。
Methodは1です。
なんかそれっぽい個体がヒットしました。
今回はこの個体とエンカウントしてみたいと思います。
実際に765055043Fも待機するのは現実的ではないのでリストの末尾にある乱数値を利用します。
起動中のバイナリエディタで以下のように操作します。
ここで打ち込むデータの詳細は3)に置いておきます。
※S1 乱数値の下から1Byte目
※S2 乱数値の下から2Byte目
※S3 乱数値の下から3Byte目
※S4 乱数値の下から4Byte目
0203CF80 | 01 |
0203CF81 | 48 |
0203CF82 | 02 |
0203CF83 | 49 |
0203CF84 | 01 |
0203CF85 | 60 |
0203CF86 | 70 |
0203CF87 | 47 |
0203CF88 | E0 |
0203CF89 | 5A |
0203CF8A | 00 |
0203CF8B | 03 |
0203CF8C | S1 |
0203CF8D | S2 |
0203CF8E | S3 |
0203CF8F | S4 |
0203CFA0 | 23 |
0203CFA1 | 81 |
0203CFA2 | CF |
0203CFA3 | 03 |
0203CFA4 | 02 |
0203CFA5 | B6 |
0203CFA6 | 99 |
0203CFA7 | 01 |
0203CFA8 | 5A |
0203CFA9 | 00 |
0203CFAA | 00 |
0203CFAB | B7 |
0203CFAC | 02 |
03000E40 | 01 |
03000E41 | 02 |
03000E44 | 00 |
03000E45 | 00 |
03000E46 | 00 |
03000E47 | 00 |
03000E48 | A0 |
03000E49 | CF |
03000E4A | 03 |
03000E4B | 02 |
03000E38 | 00 |
lv90の色違いジラーチとエンカウントします。
捕獲したジラーチのステータス
ただのチートと大差ないですね
3)おまけ
2)で打ち込んだデータの詳細
理屈としては、シンボルエンカウントで使用されるスクリプトB6(setwild)の実行直前にスクリプト23(callasm)で呼び出した任意コードで乱数値レジスタの値を直接書き換えています。
0x0203CF80:01 48 02 49 01 60 70 47 E0 5A 00 03 F5 EB B2 BF
ldr r0, =0x03005AE0 @乱数値レジスタ
ldr r1, =0xBFB2EBF5 @乱数値
str r1, [r0]
bx lr
0x0203CFA0:23 81 CF 03 02 B6 99 01 5A 00 00 B7 02
callasm 0x0203CF81
setwild 0x0199 0x5A 0x0000
wildbattle
end