これはPokémon Past Generation Advent Calendar 2022の12月20日の記事です。遅れてすいませんでした。
バイナリエディタは導入済みとする。
アドレス0xd2ebから2バイト、NPCのスクリプトの配列が格納されたアドレスが入っている。 また、0xffe8にそのROMバンク番号が入っている。
そこで0xd2ebに適当に使えるアドレス (0xd000など)を代入して、0xd000を適切に書き換えればNPCのスクリプトを入れ替えることができる。
実際やってみた動画
ポケセンのおじさんを受付にする pic.twitter.com/jctGbO26D6
— でぃぐ(ゲーム用垢) (@fujidig_game) 2022年12月25日
本日の任意コード実行。NPCのスクリプトアドレスをいじることでお姉さんを無理やりジム誘導お兄さんに変更。 pic.twitter.com/V8Q6FTkYyh
— でぃぐ(ゲーム用垢) (@fujidig_game) 2022年12月16日
ATフィールドに連れていかれる主人公くん pic.twitter.com/7u24LqyDOb
— でぃぐ(ゲーム用垢) (@fujidig_game) 2022年12月16日
例
タマムシのポケモンセンターでバイナリエディタを開く。 0xd2ebを見ると、スクリプトのアドレスは0x4fa3となっている。 また、0xffe8は12になっている。 ここで、0xffb8 (現在のROMバンク)を12に書き換えよう。 そして先ほど分かった0x4fa3に移動。 0x4fa3から順番に次のように格納されていることが分かる:
ac 4f ad 4f e2 4f ab 4f
これはスクリプトのアドレスの配列が
0x4fac 0x4fad 0x4fe2 0x4fab
となっていることを意味する。 さて、0xd000に
0x4fac 0x4fac 0x4fec 0x4fac
を意味する
ac 4f ac 4f ac 4f ac 4f
を書き込む。そして0xd2ebを00 d0
にする。
これでNPCのスクリプトが全部0番目のスクリプトのアドレス0x4facに変わるはずだ。
バイナリエディタを閉じよう (0xffb8 (現在のROMバンク)の値は特に戻す必要はない)。
そして、NPCに話しかけると、見事NPCがポケモンセンターの受け付けのスクリプトに変わる。
ここでスクリプトのアドレスの参照先を自分で書いたセリフやプログラムにすることも可能である。