ポケモンイエローのバグによるゲームボーイの再プログラミング

ポケモンイエローは、独自のルールを持つポケットユニバースです。その中で、アイテムを売買したり、ポケモンを訓練したり、他のトレーナーを倒したりすることができますが、ゲーム自体のルールを変更することはできません。自分で家を建てたり、音楽を変えたり、服を着替えたりすることはできません。より正確には、それはそのように意図されていました。実際、ゲームをパックマン、テトリス、ポン、MIDIプレーヤーなどに変えることができる一連の有効なコマンド(ある場所から別の場所への移動やオブジェクトの操作など)があります。





ありやり込みフェリペ・ロペス・デ・フレイタス(p4wn3r)ポケモンイエローが1分36秒で終了したが、。このスピードランは、次のハックに基づいています。通常、プレイヤーのインベントリは20アイテムに制限されています。ただし、この制限を無視して、インベントリの直後にあるメモリをアイテムのリストであるかのように扱うことができるバグがあります。したがって、標準のオブジェクト操作により、このメモリを書き換えることができます。スピードランナーはこの機会を利用して、スタートルームからドアを強制的に最終的な場所に移動させます。そこでは、おめでとうしか聞くことができません。





このスピードランを最初に見て、ゲームボーイのメモリは外部ツールなしでアイテムのリストだけで操作できることに気付いたとき、p4wn3rテクニックを改善できるかどうかを確認することにしました。何が起こったのか:





Gameboy — . , — , . , [62 16 37 224 47 240 37 230 15 55]



, , , A. , - , . - ( ) Gameboy — , (, ) Pokemon Yellow. 





-, ? , (, , ..) :





item-one-id         (0-255)
item-one-quantity   (0-255)
item-two-id         (0-255)
item-two-quantity   (0-255)
.
.
.
      
      



, :





lemonade     x16
guard spec.  x224
leaf stone   x240
guard spec.  x230
parlyz heal  x55
      
      



— . , , ID . - , , 2-3 . , , 92 ; , .





— , . , , , , . , , .





!

, Lp/k. , . , , p4wn3r: , . 8 10 , 20- ( ). Celadon Dept. store. p4wn3r “ ” , .





, 0x00, . , 0xFF 0x00 . , , . 255 0x00- . 2 0x00 414925 , :





+-------------------+----------+
|##| Item           | Quantity |
+--+----------------+----------+
|1 | TM02           |  98      |
|2 | TM37           |  71      |
|3 | TM05           |   1      |
|4 | TM09           |   1      |
|5 | burn-heal      |  12      |
|6 | ice-heal       |  55      |
|7 | parlyz-heal    |  99      |
|8 | parlyz-heal    |  55      |
|9 | TM18           |   1      |
|10| fire-stone     |  23      |
|11| water-stone    |  29      |
|12| x-accuracy     |  58      |
|13| guard-spec     |  99      |
|14| guard-spec     |  24      |
|15| lemonade       |  16      |
|16| TM13           |   1      |
+--+----------------+----------+
      
      



, . — . , , A, B, start select. 4 ; 200 , , . , 8 , . , , , , .





, Celadon mansion ( , ). . , , . , , .





, Gameboy (, ) . — , . http://hg.bortreb.com/vba-clojure





, , vba-rerecording. C, Java JNI. : Gameboy, . , Java .





JNI clojure, vba-rerecording. , C . , , , . , . , , Viridian City :





(defn-memo viridian-store->oaks-lab
  ([] (viridian-store->oaks-lab
       (get-oaks-parcel)))
  ([script]
     (->> script
          (walk [↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
                 ← ← ← ← ← ← ← ← ← 
                 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
                 ← ←
                 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
                 ↓ ↓ ↓ ↓ ↓ ↓ ↓
                 → → → → → → → →
                 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
                 ← ← ← ← ←
                 ↓ ↓ ↓ ↓
                 ])
          (walk-thru-grass
           [↓ ↓ ↓ ↓ ↓ ↓ ↓])
          (walk [↓ ↓ ← ↓ ↓ ↓ ←
                 ↓ ↓ ↓ ↓ ↓ ↓
                 → → → ↑])
                
          (do-nothing 1))))

      
      



, :





(defn-memo hacking-10
  ([] (hacking-10 (hacking-9)))
  ([script]
     (->> script
          begin-deposit
          (deposit-held-item 17 230)
          (deposit-held-item-named :parlyz-heal 55)
          (deposit-held-item 14 178)
          (deposit-held-item-named :water-stone 29)
          (deposit-held-item 14 32)
          (deposit-held-item-named :TM18 1)
          (deposit-held-item 13 1)
          (deposit-held-item 13 191)
          (deposit-held-item-named :TM02 98)
          (deposit-held-item-named :TM09 1)
          close-menu)))
      
      



, , . , , 99. , :





(defn pc-item-writer-program







  []







  (let [;;limit 75







        limit 201 ;; (item-hack 201 is the smallest I could make this.) 







        [target-high target-low] (disect-bytes-2 pokemon-list-start)]







    (flatten







     [[0x00  ;; (item-hack) no-op (can't buy repel (1E) at celadon)







       0x1E  ;; load limit into E







       limit







       0x3F  ;; (item-hack) set carry flag no-op







       ;; load 2 into C.







       0x0E   ;; C == 1 means input-first nybble







       0x04   ;; C == 0 means input-second nybble







       0x21 ;; load target into HL







       target-low







       target-high







       0x37 ;; (item-hack) set carry flag no-op







       0x00 ;; (item-hack) no-op







       0x37 ;; (item-hack) set carry flag no-op







       0x00 ;; (item-hack) no-op







       0xF3 ;; disable interrupts







       ;; Input Section







       0x3E ;; load 0x20 into A, to measure buttons







       0x10 







       0x00 ;; (item-hack) no-op







       0xE0 ;; load A into [FF00]







       0x00







       0xF0 ;; load 0xFF00 into A to get







       0x00 ;; button presses







       





       0xE6







       0x0F ;; select bottom four bits of A







       0x37 ;; (item-hack) set carry flag no-op







       0x00 ;; (item-hack) no-op







       0xB8 ;; see if input is different (CP A B)







       0x00 ;; (item-hack) (INC SP)







       0x28 ;; repeat above steps if input is not different







       ;; (jump relative backwards if B != A)







       0xED ;; (literal -19) (item-hack) -19 == egg bomb (TM37)







       0x47 ;; load A into B







              0x0D ;; dec C





       0x37 ;; (item-hack) set-carry flag







       ;; branch based



on C:





       0x20 ;; JR NZ







       23 ;; skip "input second nybble" and "jump to target" below







       ;; input second nybble







       0x0C ;; inc C







       0x0C ;; inc C







       0x00 ;; (item-hack) no-op







       0xE6 ;; select bottom bits







       0x0F







       0x37 ;; (item-hack) set-carry flag no-op







       0x00 ;; (item-hack) no-op







       0xB2 ;; (OR A D) -> A







       0x22 ;; (do (A -> (HL)) (INC HL))







       0x1D ;; (DEC E)







       0x00 ;; (item-hack) 







       0x20 ;; jump back to input section if not done







       0xDA ;; literal -36 == TM 18 (counter)







       0x01 ;; (item-hack) set BC to literal (no-op)







       ;; jump to target







       0x00  ;; (item-hack) these two bytes can be anything.







       0x01 







       0x00   ;; (item-hack) no-op







       0xBF   ;; (CP A A) ensures Z







       0xCA   ;; (item-hack) jump if Z







       target-low







       target-high







       0x01   ;; (item-hack) will never be reached.







       ;; input first nybble







       0x00







       0xCB







       0x37  ;; swap nybbles on A







       0x57  ;; A -> D







       0x37  ;; (item-hack) set carry flag no-op







       0x18  ;; relative jump backwards







       0xCD  ;; literal -51 == TM05; go back to input section







       0x01  ;; (item-hack) will never reach this instruction







       ]







      (repeat 8 [0x00 0x01]);; these can be anything







      [;; jump to actual program







       0x00







       0x37  ;; (item-hack) set carry flag no-op







       0x2E  ;; 0x3A -> L







       0x3A







       0x00  ;; (item-hack) no-op







       0x26  ;; 0xD5 -> L







       0xD5  







       0x01  ;; (item-hack) set-carry BC







       0x00  ;; (item-hack) these can be anything







       0x01  







       0x00







       0xE9 ;; jump to (HL)







- 0x00 0xFF. 0x00 , , . 0x00 — NO-OP, , . 0xFF . : , , , , :





pokeball x2
      
      



- 0xFF, , :





pokeball x1
pokeball x1
pokeball x1
      
      



0xFF . 





, Gameboy, — . MIDI, GameBoy, http://www.everyponysings.com/. MIDI-, . — PNG- Gameboy- , . , , ( http://hg.bortreb.com/vba-clojure).








All Articles