どうも、オーキドせんせい撃破RTA研究者です。
ここからどうやって自由にデータを変更するのか全くわからん。
という人のために入門編を作ってみました。
(作り方についてはこちら)
1.基礎編
初代ポケモンでは「メモリ」というものがあり、
1つのメモリに1つの数値(00~FF)が保存されています。
それはポケモンの種類だったりレベルだったり名前だったり、
あるいはゲーム進行のフラグ情報だったりします。
例えば下の図はメモリ構造の一部なんですが、
D14Cのメモリは手持ちポケモン1匹目の「Lv」の情報を管理しています。
ということで、実際にバイナリエディタを使って
メモリアドレスD14Cを「64」(16進数で100を意味する)にしてやれば、
手持ち1匹目がLv100になる、という感じになります。
要するに、「どのメモリに何の情報が入っているのか」さえわかれば、
あらゆることが可能、ということです。
入れる数値については以前作成したこちらのリストが参考になるかも。
たとえば道具の1番目の種類のメモリは「D2A2」。
マスターボールの内部番号はリストの通り「01」なので、
D2A2を01にすればマスターボールが手に入る、という感じです。
(※なかよしバッヂは道具の2番目に避難させておきましょう)
そうなると、
「じゃあそのメモリ構造ってのはどうやったら知れるの?」
という疑問が当然生じると思うんですが、
これについてはネットで調べたり、
実際にいろいろメモリをいじってみてどうなるか研究したりするしかないです。
thfanさんの下記ブログはけっこう詳しく載っていて、
自分もよく参考にしていました。
qawsedrftgyflanlp.blog.fc2.com
2.任意コード実行編
メモリ変更についてはこんな感じですが、
バイナリエディタの真骨頂である「任意コード実行」については、
ガチでやる場合けっこう勉強する必要があります。
入口としては、ぽけもんとか。さんの以下のサイトがおすすめ。
てらろーしゃさんの動画も難しいけどおススメです。
コメント欄にアイスさんがいる。
このあたりから入門して、わかってきたらz80命令説明書とかを使って勉強したり、
先人たちの任意コードを解読してみたりすることでいろんなことができるようになると思います。
簡単な任意コード作成の例↓
①手持ちポケモンに「キノコのほうし」を覚えさせる任意コードを作りたいな…
②手持ち1匹目の1番目の技のメモリはD133、キノコのほうしの内部番号は0x93か。
③z80アセンブリで、メモリに数値を入れる命令はいくつかあるけど、
「ld a,n」でaレジスタに数値を代入してから、「ld (nn),a」でメモリに入れると
うまくいきそうだな。それぞれの命令の内部番号は0x3Eと0xEAか。
あ、命令終了の「ret」も必要だな。これは0xC9か。
④「ld a,93 / ld (D133),a / ret」だから、「3E,93,EA,33,D1,C9」だな!
キノコのほうし習得任意コード完成!
だいたいこんな感じです。
イベント関係のもっと複雑な任意コードについてはこんなもんじゃないですが、
まずはこのあたりから任意コードを作るのに慣れていくといいかも。
ジャンプ命令による条件分岐なども覚えるとさらに自由度が広がります。
3.おわりに
「3E15EA36D0C9」という文字列を見て、
「お、ミュウを出現させる効果だな。」とわかるようになったら一人前。
そこまで廃人になる必要はないですが、頑張っていきましょう。
それではよいバグポケライフを!