なるほどえたきちのブログじゃねーの

チラ裏雑記帳

ポケモン過去作の解析とか乱数調整とかそこら辺。不定期更新。

はじめての乱数調整(物理)

あまりよくない記事なので消す可能性があります

 

「任意コード実行を利用して完全に任意の個体とエンカウントすることは可能なんですか?」

との質問を頂いたので適当に思い付いた手法を検証してみたいと思います。

今回は色陽気高個体のジラーチとのエンカウントを目標とします。

 

1)TIDの特定


色高個体とエンカウントすると言っておきながら私は自ROMのTIDを全く把握していません。

ニューゲームしてTID調整するのも面倒なのでバイナリエディタを利用して自ROMのTIDを確認します。

手持ち2匹目に自己産の適当なポケモンを入れた状態でバイナリエディタを起動し、0x020241F8からの4byteの値をチェックします。

f:id:BZL:20190717234908p:plain

f:id:BZL:20190717234925p:plain

f:id:BZL:20190717234940p:plain

f:id:BZL:20190717234953p:plain

という訳でこのROMのTIDは0x5696A7DFであることが判明しました。

表ID、裏IDに変換すると42975、22166となります。

この値を色違い個体検索に利用します。

 

2)個体の呼び出し


某ツールを起動し固定乱数の個体検索で適当に検索してみます。

Methodは1です。

f:id:BZL:20190718005613p:plain

なんかそれっぽい個体がヒットしました。

今回はこの個体とエンカウントしてみたいと思います。

実際に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

f:id:BZL:20190718002437p:plain

lv90の色違いジラーチとエンカウントします。

 

捕獲したジラーチのステータス

f:id:BZL:20190718004926p:plain

f:id:BZL:20190718004939p:plain

ただのチートと大差ないですね

 

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