裏技は研究しないといいながら、今頃興味を持ってきました#私はとても気まぐれだったりします(おいおい)どうしてバグだったのか?
超有名な「道具のn番目」→セレクト→キャンセル のバグを突いた数々の裏技のメカニズムです。
バグの原点はROM:4-617Eから始まるルーチンにあります(赤/緑) 解説付き逆アセンブルリスト
ここはポケモンの並び替えをやるルーチンです。n番目のポケモンとm番目とを入れ替えるところですね。
(1)まずここが呼ばれた時に、(CC35H)に1回目にセレクトされた時の、メニューでの順番、(CC26H)に2回目にセレクトが押された時のセレクトのメニュー内でのカーソル位置が入ってます。並びで1番目だったら0、2番目だったら1です。
ということは、1番目と6番目のポケモンを入れ替えようとして、1つ目のポケモンのところでセレクト、6番目でセレクトを押したとしたら、(CC35H)=0 (CC26H)=5 ってことですね
これは道具でセレクトした場合も同じ値が入ってます。例えば道具の14番目でセレクトして、バグモード突入前は、(CC35H)=0DHです。
(2)ここから、メニューのn番目とm番目を交換するとします
まず、 (D124H+n)←→(D124H+m)
D124H〜は連れているポケモンの番号だけが入ってます。たとえば、ピカチュー、ポッポ、コラッタ、オニスズメ、ミュゥ、ニドラン♂ って順番で連れているとしたら、54 24 A5 05 15 03 です。この並びの順番をまず先に入れ替える。
(3)次にポケモンのステータス、親の名前、ポケモンの名前を入れ替えます。それぞれ、
D12B+m*2CH ←→ D12B+n*2CH から2CHバイト分
D233+m*6 ←→ D233+n*6 から6バイト
D257+m*6 ←→ D257+n*6 から6バイト
実際のコピーは CC97〜必要バイト数を介して行われます。具体的には、次の3ステップでコピーします
D12B+m*2CH〜2CHバイト →CC97H〜
D12B+n*2CH〜 → D12B+m*2CH〜
CC97H〜 → D12B*n〜
このコピーがバグの核心部分です
連れて歩けるポケモンは6匹ですよね。ということはメモリー中に割り当てられているポケモンのデーター領域も6匹分しかありません。しかし「道具」でセレクトしてキャンセルして、ポケモンの並び替え(このルーチン)に来てしまうと、本来割り当てられていない領域と、ポケモンのデーターの領域間でコピーが行われます。
このあたりのメモリーの割り当ては、だいたいこうなってます。
[ポケモン6匹分のステータス情報] [ポケモンの親の名前] [ポケモンの名前] [つかまえたポケモンとかいろいろ] [道具のデーター
ということで、本来割り当てられている6匹を越えた範囲(道具の7番目以降)の交換がされてしまうと、それぞれ割り当てられた領域を越えてコピーされてバグるわけです。だからポケモンの名前とかで道具が増やせたりするわけですね。
たとえば(2)の交換を利用して、ミュゥを作ってみましょう
道具の11番目と6番目のポケモンを交換します。
(D124H+n)←→(D124H+m) は、(D129)←→(D12E)の交換です。D129は6匹目のポケモンの番号、(D12E)はパソコンから出した時の1匹目のポケモンのレベルです。レベル21のポケモンをパソコンに預けて引き取ってから、道具の11番目→セレクトでバグらせると、6匹目のポケモンがミュゥになってます。ただこの場合、この後ハングします(^^;
こんな感じで、アドレスを追いかけていけば、交換される場所がわかるので、出尽くしたように思えるんですけど、バグ新技を研究してみるのもいいかもしれないですね
D12B+m*2CH D233+m*6 D257+m*6 のアドレス対応表
道具のm番目 | D12B+m*2CH | D233+m*6 | D257+m*6 |
1 | D12B | D233 | D257 |
2 | D157 | D239 | D25D |
3 | D183 | D23F | D263 |
4 | D1AF | D245 | D269 |
5 | D1DB | D24B | D26F |
6 | D207 | D251 | D275 |
7 | D233 | D257 | D27B |
8 | D25F | D25D | D281 |
9 | D28B | D263 | D287 |
10 | D2B7 | D269 | D28D |
11 | D2E3 | D26F | D293 |
12 | D30F | D275 | D299 |
13 | D33B | D27B | D29F |
14 | D367 | D281 | D2A5 |
15 | D393 | D287 | D2AB |
16 | D3BF | D28D | D2B1 |
17 | D3EB | D293 | D2B7 |
18 | D417 | D299 | D2BD |
19 | D443 | D29F | D2C3 |
20 | D46F | D2A5 | D2C9 |
応用:「道具の個数を増やす」技のしくみ
戻る