ポケモンイエローは、独自のルールを持つポケットユニバースです。その中で、アイテムを売買したり、ポケモンを訓練したり、他のトレーナーを倒したりすることができますが、ゲーム自体のルールを変更することはできません。自分で家を建てたり、音楽を変えたり、服を着替えたりすることはできません。より正確には、それはそのように意図されていました。実際、ゲームをパックマン、テトリス、ポン、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).