裏技は研究しないといいながら、今頃興味を持ってきました#私はとても気まぐれだったりします(おいおい)どうしてバグだったのか?
超有名な「道具の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*2CHD233+m*6D257+m*6
    1D12BD233D257
    2D157D239D25D
    3D183D23FD263
    4D1AFD245D269
    5D1DBD24BD26F
    6D207D251D275
    7D233D257D27B
    8D25FD25DD281
    9D28BD263D287
    10D2B7D269D28D
    11D2E3D26FD293
    12D30FD275D299
    13D33BD27BD29F
    14D367D281D2A5
    15D393D287D2AB
    16D3BFD28DD2B1
    17D3EBD293D2B7
    18D417D299D2BD
    19D443D29FD2C3
    20D46FD2A5D2C9
応用:「道具の個数を増やす」技のしくみ

戻る