summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
Diffstat (limited to 'engine')
-rw-r--r--engine/battle_start.asm46
-rwxr-xr-xengine/billspc.asm2667
-rwxr-xr-xengine/breeding/egg.asm976
-rwxr-xr-xengine/card_flip.asm2560
-rwxr-xr-xengine/clock_reset.asm251
-rw-r--r--engine/color.asm38
-rw-r--r--engine/credits.asm28
-rw-r--r--engine/diploma.asm4
-rwxr-xr-xengine/dummy_game.asm615
-rw-r--r--engine/events.asm84
-rwxr-xr-xengine/events_3.asm863
-rwxr-xr-xengine/evolution_animation.asm457
-rwxr-xr-xengine/flypoints.asm916
-rw-r--r--engine/fruit_trees.asm2
-rwxr-xr-xengine/healmachineanim.asm266
-rw-r--r--engine/landmarks.asm68
-rwxr-xr-xengine/link.asm4117
-rw-r--r--engine/map_objects.asm356
-rw-r--r--engine/map_setup.asm176
-rwxr-xr-xengine/mart.asm1000
-rwxr-xr-xengine/menu.asm587
-rw-r--r--engine/movement.asm104
-rwxr-xr-xengine/namingscreen.asm959
-rw-r--r--engine/pack.asm130
-rw-r--r--engine/party_menu.asm944
-rw-r--r--engine/phone.asm2
-rw-r--r--engine/phone_scripts.asm35
-rw-r--r--engine/pokedex.asm74
-rw-r--r--engine/predef.asm22
-rw-r--r--engine/radio.asm184
-rw-r--r--engine/radio2.asm4
-rw-r--r--engine/save.asm22
-rw-r--r--engine/scripting.asm62
-rwxr-xr-xengine/selectmenu.asm191
-rwxr-xr-xengine/slot_machine.asm2112
-rw-r--r--engine/specials.asm26
-rwxr-xr-xengine/sprites.asm1480
-rwxr-xr-xengine/startmenu.asm1970
-rw-r--r--engine/std_scripts.asm114
-rw-r--r--engine/timeofdaypals.asm12
-rw-r--r--engine/title.asm8
-rwxr-xr-xengine/tmhm.asm113
42 files changed, 23851 insertions, 794 deletions
diff --git a/engine/battle_start.asm b/engine/battle_start.asm
index 4b12bb632..0897b8a4a 100644
--- a/engine/battle_start.asm
+++ b/engine/battle_start.asm
@@ -26,7 +26,7 @@ Predef_StartBattle: ; 8c20f
ld a, $5
ld [rSVBK], a
- ld hl, Unkn1Pals
+ ld hl, wMapPals
ld bc, $0040
xor a
call ByteFill
@@ -254,7 +254,7 @@ StartTrainerBattle_SetUpBGMap: ; 8c3a1 (23:43a1)
call StartTrainerBattle_NextScene
xor a
ld [wcf64], a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
ret
StartTrainerBattle_Flash: ; 8c3ab (23:43ab)
@@ -309,10 +309,10 @@ StartTrainerBattle_Flash: ; 8c3ab (23:43ab)
StartTrainerBattle_SetUpForWavyOutro: ; 8c3e8 (23:43e8)
callba Function5602
ld a, $5
- ld [rSVBK], a ; $ff00+$70
+ ld [rSVBK], a
call StartTrainerBattle_NextScene
ld a, $43
- ld [hLCDStatCustom], a ; $ff00+$c6
+ ld [hLCDStatCustom], a
xor a
ld [hLCDStatCustom + 1], a
ld a, $90
@@ -365,7 +365,7 @@ StartTrainerBattle_SineWave: ; 8c408 (23:4408)
StartTrainerBattle_SetUpForSpinOutro: ; 8c43d (23:443d)
callba Function5602
ld a, $5
- ld [rSVBK], a ; $ff00+$70
+ ld [rSVBK], a
call StartTrainerBattle_NextScene
xor a
ld [wcf64], a
@@ -386,7 +386,7 @@ ENDM
StartTrainerBattle_SpinToBlack: ; 8c44f (23:444f)
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
ld a, [wcf64]
ld e, a
ld d, 0
@@ -400,7 +400,7 @@ endr
ld [wcf65], a
call .load
ld a, $1
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call DelayFrame
call DelayFrame
ld hl, wcf64
@@ -409,12 +409,12 @@ endr
.end
ld a, $1
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call DelayFrame
call DelayFrame
call DelayFrame
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
ld a, $20
ld [wJumptableIndex], a
ret
@@ -508,12 +508,12 @@ endr
StartTrainerBattle_SetUpForRandomScatterOutro: ; 8c578 (23:4578)
callba Function5602
ld a, $5
- ld [rSVBK], a ; $ff00+$70
+ ld [rSVBK], a
call StartTrainerBattle_NextScene
ld a, $10
ld [wcf64], a
ld a, $1
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
ret
StartTrainerBattle_SpeckleToBlack: ; 8c58f (23:458f)
@@ -533,12 +533,12 @@ StartTrainerBattle_SpeckleToBlack: ; 8c58f (23:458f)
.done
ld a, $1
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call DelayFrame
call DelayFrame
call DelayFrame
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
ld a, $20
ld [wJumptableIndex], a
ret
@@ -580,7 +580,7 @@ StartTrainerBattle_LoadPokeBallGraphics: ; 8c5dc (23:45dc)
jp z, .nextscene
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
hlcoord 0, 0, AttrMap
ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
inc b
@@ -636,11 +636,11 @@ StartTrainerBattle_LoadPokeBallGraphics: ; 8c5dc (23:45dc)
dec b
jr nz, .loop2
- ld a, [hCGB] ; $ff00+$e6
+ ld a, [hCGB]
and a
jr nz, .cgb
ld a, $1
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call DelayFrame
call DelayFrame
jr .nextscene
@@ -653,13 +653,13 @@ StartTrainerBattle_LoadPokeBallGraphics: ; 8c5dc (23:45dc)
jr nz, .daytime
ld hl, .nightpals
.daytime
- ld a, [rSVBK] ; $ff00+$70
+ ld a, [rSVBK]
push af
ld a, $5 ; WRAM5 = palettes
- ld [rSVBK], a ; $ff00+$70
+ ld [rSVBK], a
call .copypals
push hl
- ld de, Unkn1Pals + 8 * 7
+ ld de, wMapPals + 8 * 7
ld bc, $8
call CopyBytes
pop hl
@@ -667,9 +667,9 @@ StartTrainerBattle_LoadPokeBallGraphics: ; 8c5dc (23:45dc)
ld bc, $8
call CopyBytes
pop af
- ld [rSVBK], a ; $ff00+$70
+ ld [rSVBK], a
ld a, $1
- ld [hCGBPalUpdate], a ; $ff00+$e5
+ ld [hCGBPalUpdate], a
call DelayFrame
call Function8cf4f
@@ -678,7 +678,7 @@ StartTrainerBattle_LoadPokeBallGraphics: ; 8c5dc (23:45dc)
ret
.copypals: ; 8c677 (23:4677)
- ld de, Unkn1Pals + 8 * 7
+ ld de, wMapPals + 8 * 7
call .copy
ld de, BGPals + 8 * 7
call .copy
@@ -829,7 +829,7 @@ StartTrainerBattle_ZoomToBlack: ; 8c768 (23:4768)
inc de
ld h, a
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call .Copy
call WaitBGMap
jr .loop
diff --git a/engine/billspc.asm b/engine/billspc.asm
new file mode 100755
index 000000000..03a7592ca
--- /dev/null
+++ b/engine/billspc.asm
@@ -0,0 +1,2667 @@
+_DepositPKMN: ; e2391 (38:6391)
+ ld hl, Options
+ ld a, [hl]
+ push af
+ set 4, [hl]
+ ld a, [VramState]
+ push af
+ xor a
+ ld [VramState], a
+ ld a, [hInMenu]
+ push af
+ ld a, $1
+ ld [hInMenu], a
+ xor a
+ ld [hMapAnims], a
+ call Functione2963
+ xor a
+ ld [wcb2e], a
+ call DelayFrame
+.asm_e23b4
+ call JoyTextDelay
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .asm_e23c6
+ call Functione23d5
+ call DelayFrame
+ jr .asm_e23b4
+.asm_e23c6
+ call ClearSprites
+ pop af
+ ld [hInMenu], a
+ pop af
+ ld [VramState], a
+ pop af
+ ld [Options], a
+ ret
+
+Functione23d5: ; e23d5 (38:63d5)
+ ld a, [wJumptableIndex]
+ ld hl, Jumptable_e23df
+ call Functione33df
+ jp [hl]
+
+Jumptable_e23df: ; e23df (38:63df)
+ dw Functione23e9
+ dw Functione241a
+ dw Functione245d
+ dw Functione247d
+ dw Functione2992
+
+
+Functione23e9: ; e23e9 (38:63e9)
+ xor a
+ ld [hBGMapMode], a
+ call ClearSprites
+ call Functione2d30
+ call Functione2a8e
+ ld de, PCString_ChooseaPKMN
+ call Functione2a6e
+ ld a, $5
+ ld [wcb2d], a
+ call Functione2c2c
+ call PCMonInfo
+ ld a, $ff
+ ld [CurPartySpecies], a
+ ld a, $17
+ call Functione33d0
+ call WaitBGMap
+ call Functione2e01
+ call Functione298d
+ ret
+
+Functione241a: ; e241a (38:641a)
+ ld hl, hJoyPressed ; $ffa7
+ ld a, [hl]
+ and B_BUTTON
+ jr nz, .asm_e2457
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .asm_e2443
+ call Functione29b5
+ and a
+ ret z
+ call Functione2e01
+ xor a
+ ld [hBGMapMode], a
+ call Functione2c2c
+ call PCMonInfo
+ ld a, $1
+ ld [hBGMapMode], a
+ call DelayFrame
+ call DelayFrame
+ ret
+.asm_e2443
+ call Functione2def
+ and a
+ ret z
+ cp $ff
+ jr z, .asm_e2457
+ ld a, $2
+ ld [wJumptableIndex], a
+ ret
+; e2452 (38:6452)
+
+.asm_e2452
+ ld hl, wJumptableIndex
+ dec [hl]
+ ret
+
+.asm_e2457
+ ld a, $4
+ ld [wJumptableIndex], a
+ ret
+
+Functione245d: ; e245d (38:645d)
+ xor a
+ ld [hBGMapMode], a
+ call ClearSprites
+ call Functione2def
+ ld [CurPartySpecies], a
+ ld a, $17
+ call Functione33d0
+ ld de, PCString_WhatsUp
+ call Functione2a6e
+ ld a, $1
+ ld [MenuSelection2], a
+ call Functione298d
+ ret
+
+Functione247d: ; e247d (38:647d)
+ ld hl, BillsPCDepositMenuDataHeader
+ call CopyMenuDataHeader
+ ld a, [MenuSelection2]
+ call Function1d4b
+ call InterpretMenu2
+ jp c, BillsPCDepositFuncCancel
+ ld a, [MenuSelection2]
+ dec a
+ and $3
+ ld e, a
+ ld d, 0
+ ld hl, BillsPCDepositJumptable
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+BillsPCDepositJumptable: ; e24a1 (38:64a1)
+ dw BillsPCDepositFuncDeposit ; Deposit Pokemon
+ dw BillsPCDepositFuncStats ; Pokemon Stats
+ dw BillsPCDepositFuncRelease ; Release Pokemon
+ dw BillsPCDepositFuncCancel ; Cancel
+
+
+BillsPCDepositFuncDeposit: ; e24a9 (38:64a9)
+ call Functione2f18
+ jp c, BillsPCDepositFuncCancel
+ call Functione307c
+ jr c, .no_overflow_31
+ ld a, $0
+ ld [wJumptableIndex], a
+ xor a
+ ld [wcb2b], a
+ ld [wcb2a], a
+ ret
+.no_overflow_31
+ ld de, PCString_WhatsUp
+ call Functione2a6e
+ ret
+
+BillsPCDepositFuncStats: ; e24c8 (38:64c8)
+ call LoadStandardMenuDataHeader
+ call Functione2f7e
+ call ExitMenu
+ call PCMonInfo
+ call Functione2def
+ ld [CurPartySpecies], a
+ ld a, $17
+ call Functione33d0
+ ret
+
+BillsPCDepositFuncRelease: ; e24e0 (38:64e0)
+ call Functione2f18
+ jr c, BillsPCDepositFuncCancel
+ call Functione2f5f
+ jr c, BillsPCDepositFuncCancel
+ ld a, [MenuSelection2]
+ push af
+ ld de, PCString_ReleasePKMN
+ call Functione2a6e
+ call LoadStandardMenuDataHeader
+ lb bc, 14, 11
+ call PlaceYesNoBox
+ ld a, [MenuSelection2]
+ dec a
+ call ExitMenu
+ and a
+ jr nz, .asm_e252c
+ ld a, [wcb2b]
+ ld hl, wcb2a
+ add [hl]
+ ld [CurPartyMon], a
+ xor a
+ ld [wPokemonWithdrawDepositParameter], a
+ callba Functione039
+ call Functione3180
+ ld a, $0
+ ld [wJumptableIndex], a
+ xor a
+ ld [wcb2b], a
+ ld [wcb2a], a
+ pop af
+ ret
+.asm_e252c
+ ld de, PCString_WhatsUp
+ call Functione2a6e
+ pop af
+ ld [MenuSelection2], a
+ ret
+
+BillsPCDepositFuncCancel: ; e2537 (38:6537)
+ ld a, $0
+ ld [wJumptableIndex], a
+ ret
+; e253d (38:653d)
+
+BillsPCDepositMenuDataHeader: ; 0xe253d (38:653d)
+ db $40 ; flags
+ db 04, 09 ; start coords
+ db 13, 19 ; end coords
+ dw BillsPCDepositMenuData
+ db 1 ; default option
+; 0xe2545
+
+BillsPCDepositMenuData: ; 0xe2545 (38:6545)
+ db $80 ; flags
+ db 4 ; items
+ db "DEPOSIT@"
+ db "STATS@"
+ db "RELEASE@"
+ db "CANCEL@"
+; 0xe2564 (38:6564)
+
+Functione2564: ; e2564
+ hlcoord 0, 0
+ ld b, $4
+ ld c, $8
+ call ClearBox
+ hlcoord 0, 4
+ ld b, $a
+ ld c, $9
+ call ClearBox
+ hlcoord 0, 14
+ ld b, $2
+ ld c, $8
+ call ClearBox
+ ret
+; e2583
+
+_WithdrawPKMN: ; e2583 (38:6583)
+ ld hl, Options
+ ld a, [hl]
+ push af
+ set 4, [hl]
+ ld a, [VramState]
+ push af
+ xor a
+ ld [VramState], a
+ ld a, [hInMenu]
+ push af
+ ld a, $1
+ ld [hInMenu], a
+ xor a
+ ld [hMapAnims], a
+ call Functione2963
+ ld a, $f
+ ld [wcb2e], a
+ call DelayFrame
+.asm_e25a7
+ call JoyTextDelay
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .no_overflow_49
+ call Functione25c8
+ call DelayFrame
+ jr .asm_e25a7
+.no_overflow_49
+ call ClearSprites
+ pop af
+ ld [hInMenu], a
+ pop af
+ ld [VramState], a
+ pop af
+ ld [Options], a
+ ret
+
+Functione25c8: ; e25c8 (38:65c8)
+ ld a, [wJumptableIndex]
+ ld hl, .jumptable
+ call Functione33df
+ jp [hl]
+
+.jumptable: ; e25d2 (38:65d2)
+ dw Functione25dc
+ dw Functione2612
+ dw Functione2655
+ dw BillsPC_Withdraw
+ dw Functione2992
+
+
+Functione25dc: ; e25dc (38:65dc)
+ ld a, $f
+ ld [wcb2e], a
+ xor a
+ ld [hBGMapMode], a
+ call ClearSprites
+ call Functione2d30
+ call Functione2a8e
+ ld de, PCString_ChooseaPKMN
+ call Functione2a6e
+ ld a, $5
+ ld [wcb2d], a
+ call Functione2c2c
+ call PCMonInfo
+ ld a, $ff
+ ld [CurPartySpecies], a
+ ld a, $17
+ call Functione33d0
+ call WaitBGMap
+ call Functione2e01
+ call Functione298d
+ ret
+
+Functione2612: ; e2612 (38:6612)
+ ld hl, hJoyPressed ; $ffa7
+ ld a, [hl]
+ and B_BUTTON
+ jr nz, .asm_e264f
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .asm_e263b
+ call Functione29b5
+ and a
+ ret z
+ call Functione2e01
+ xor a
+ ld [hBGMapMode], a
+ call Functione2c2c
+ call PCMonInfo
+ ld a, $1
+ ld [hBGMapMode], a
+ call DelayFrame
+ call DelayFrame
+ ret
+.asm_e263b
+ call Functione2def
+ and a
+ ret z
+ cp $ff
+ jr z, .asm_e264f
+ ld a, $2
+ ld [wJumptableIndex], a
+ ret
+; e264a (38:664a)
+
+.asm_e264a
+ ld hl, wJumptableIndex
+ dec [hl]
+ ret
+
+.asm_e264f
+ ld a, $4
+ ld [wJumptableIndex], a
+ ret
+; e2655
+
+Functione2655: ; e2655 (38:6655)
+ xor a
+ ld [hBGMapMode], a
+ call ClearSprites
+ call Functione2def
+ ld [CurPartySpecies], a
+ ld a, $17
+ call Functione33d0
+ ld de, PCString_WhatsUp
+ call Functione2a6e
+ ld a, $1
+ ld [MenuSelection2], a
+ call Functione298d
+ ret
+
+BillsPC_Withdraw: ; e2675 (38:6675)
+ ld hl, .MenuDataHeader
+ call CopyMenuDataHeader
+ ld a, [MenuSelection2]
+ call Function1d4b
+ call InterpretMenu2
+ jp c, .cancel
+ ld a, [MenuSelection2]
+ dec a
+ and 3
+ ld e, a
+ ld d, 0
+ ld hl, .jumptable
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+.jumptable: ; e2699 (38:6699) #mark
+ dw .withdraw ; Withdraw
+ dw .stats ; Stats
+ dw .release ; Release
+ dw .cancel ; Cancel
+
+
+.withdraw: ; e26a1 (38:66a1)
+ call Functione2f18
+ jp c, .cancel
+ call TryWithdrawPokemon
+ jr c, .FailedWithdraw
+ ld a, $0
+ ld [wJumptableIndex], a
+ xor a
+ ld [wcb2b], a
+ ld [wcb2a], a
+ ret
+.FailedWithdraw
+ ld de, PCString_WhatsUp
+ call Functione2a6e
+ ret
+
+.stats: ; e26c0 (38:66c0)
+ call LoadStandardMenuDataHeader
+ call Functione2f7e
+ call ExitMenu
+ call PCMonInfo
+ call Functione2def
+ ld [CurPartySpecies], a
+ ld a, $17
+ call Functione33d0
+ ret
+
+.release: ; e26d8 (38:66d8)
+ ld a, [MenuSelection2]
+ push af
+ call Functione2f5f
+ jr c, .FailedRelease
+ ld de, PCString_ReleasePKMN
+ call Functione2a6e
+ call LoadStandardMenuDataHeader
+ lb bc, 14, 11
+ call PlaceYesNoBox
+ ld a, [MenuSelection2]
+ dec a
+ call ExitMenu
+ and a
+ jr nz, .FailedRelease
+ ld a, [wcb2b]
+ ld hl, wcb2a
+ add [hl]
+ ld [CurPartyMon], a
+ ld a, PC_DEPOSIT
+ ld [wPokemonWithdrawDepositParameter], a
+ callba Functione039
+ call Functione3180
+ ld a, $0
+ ld [wJumptableIndex], a
+ xor a
+ ld [wcb2b], a
+ ld [wcb2a], a
+ pop af
+ ret
+.FailedRelease
+ ld de, PCString_WhatsUp
+ call Functione2a6e
+ pop af
+ ld [MenuSelection2], a
+ ret
+
+.cancel: ; e272b (38:672b)
+ ld a, $0
+ ld [wJumptableIndex], a
+ ret
+; e2731 (38:6731)
+
+.MenuDataHeader: ; 0xe2731
+ db $40 ; flags
+ db 04, 09 ; start coords
+ db 13, 19 ; end coords
+ dw .MenuData
+ db 1 ; default option
+; 0xe2739
+
+.MenuData: ; 0xe2739
+ db $80 ; flags
+ db 4 ; items
+ db "WITHDRAW@"
+ db "STATS@"
+ db "RELEASE@"
+ db "CANCEL@"
+; 0xe2759
+
+_MovePKMNWithoutMail: ; e2759
+ ld hl, Options
+ ld a, [hl]
+ push af
+ set 4, [hl]
+ ld a, [VramState]
+ push af
+ xor a
+ ld [VramState], a
+ ld a, [hInMenu]
+ push af
+ ld a, $1
+ ld [hInMenu], a
+ xor a
+ ld [hMapAnims], a
+ call Functione2963
+ ld a, [wCurBox]
+ and $f
+ inc a
+ ld [wcb2e], a
+ call DelayFrame
+.asm_e2781
+ call JoyTextDelay
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .asm_e2793
+ call Functione27a2
+ call DelayFrame
+ jr .asm_e2781
+
+.asm_e2793
+ call ClearSprites
+ pop af
+ ld [hInMenu], a
+ pop af
+ ld [VramState], a
+ pop af
+ ld [Options], a
+ ret
+; e27a2
+
+Functione27a2: ; e27a2
+ ld a, [wJumptableIndex]
+ ld hl, Jumptable_e27ac
+ call Functione33df
+ jp [hl]
+; e27ac
+
+Jumptable_e27ac: ; e27ac
+ dw Functione27ba
+ dw Functione27eb
+ dw Functione283d
+ dw Functione285d
+ dw Functione28df
+ dw Functione2903
+ dw Functione2992
+; e27ba
+
+Functione27ba: ; e27ba
+ xor a
+ ld [hBGMapMode], a
+ call ClearSprites
+ call Functione2d30
+ ld de, PCString_ChooseaPKMN
+ call Functione2a6e
+ ld a, $5
+ ld [wcb2d], a
+ call Functione2c2c
+ call Functione2a80
+ call PCMonInfo
+ ld a, $ff
+ ld [CurPartySpecies], a
+ ld a, $17
+ call Functione33d0
+ call WaitBGMap
+ call Functione2e01
+ call Functione298d
+ ret
+; e27eb
+
+Functione27eb: ; e27eb
+ ld hl, hJoyPressed
+ ld a, [hl]
+ and B_BUTTON
+ jr nz, .asm_e2837
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .asm_e2823
+ call Functione29d0
+ jr c, .asm_e2816
+ and a
+ ret z
+ call Functione2e01
+ xor a
+ ld [hBGMapMode], a
+ call Functione2c2c
+ call PCMonInfo
+ ld a, $1
+ ld [hBGMapMode], a
+ call DelayFrame
+ call DelayFrame
+ ret
+
+.asm_e2816
+ xor a
+ ld [wcb2b], a
+ ld [wcb2a], a
+ ld a, $0
+ ld [wJumptableIndex], a
+ ret
+
+.asm_e2823
+ call Functione2def
+ and a
+ ret z
+ cp $ff
+ jr z, .asm_e2837
+ ld a, $2
+ ld [wJumptableIndex], a
+ ret
+
+ ld hl, wJumptableIndex
+ dec [hl]
+ ret
+
+.asm_e2837
+ ld a, $6
+ ld [wJumptableIndex], a
+ ret
+; e283d
+
+Functione283d: ; e283d
+ xor a
+ ld [hBGMapMode], a
+ call ClearSprites
+ call Functione2def
+ ld [CurPartySpecies], a
+ ld a, $17
+ call Functione33d0
+ ld de, PCString_WhatsUp
+ call Functione2a6e
+ ld a, $1
+ ld [MenuSelection2], a
+ call Functione298d
+ ret
+; e285d
+
+Functione285d: ; e285d
+ ld hl, MenuDataHeader_0xe28c3
+ call CopyMenuDataHeader
+ ld a, [MenuSelection2]
+ call Function1d4b
+ call InterpretMenu2
+ jp c, Functione28bd
+ ld a, [MenuSelection2]
+ dec a
+ and 3
+ ld e, a
+ ld d, 0
+ ld hl, Jumptable_e2881
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; e2881
+
+Jumptable_e2881: ; e2881
+ dw Functione2887
+ dw Functione28a5
+ dw Functione28bd
+; e2887
+
+Functione2887: ; e2887
+ call Functione2f18
+ jp c, Functione28bd
+ ld a, [wcb2a]
+ ld [wcb2f], a
+ ld a, [wcb2b]
+ ld [wcb30], a
+ ld a, [wcb2e]
+ ld [wcb31], a
+ ld a, $4
+ ld [wJumptableIndex], a
+ ret
+; e28a5
+
+Functione28a5: ; e28a5
+ call LoadStandardMenuDataHeader
+ call Functione2f7e
+ call ExitMenu
+ call PCMonInfo
+ call Functione2def
+ ld [CurPartySpecies], a
+ ld a, $17
+ call Functione33d0
+ ret
+; e28bd
+
+Functione28bd: ; e28bd
+ ld a, $0
+ ld [wJumptableIndex], a
+ ret
+; e28c3
+
+MenuDataHeader_0xe28c3: ; 0xe28c3
+ db $40 ; flags
+ db 04, 09 ; start coords
+ db 13, 19 ; end coords
+ dw MenuData2_0xe28cb
+ db 1 ; default option
+; 0xe28cb
+
+MenuData2_0xe28cb: ; 0xe28cb
+ db $80 ; flags
+ db 3 ; items
+ db "MOVE@"
+ db "STATS@"
+ db "CANCEL@"
+; 0xe28df
+
+Functione28df: ; e28df
+ xor a
+ ld [hBGMapMode], a
+ call Functione2d30
+ ld de, PCString_MoveToWhere
+ call Functione2a6e
+ ld a, $5
+ ld [wcb2d], a
+ call Functione2c2c
+ call Functione2a80
+ call ClearSprites
+ call Functione2e8c
+ call WaitBGMap
+ call Functione298d
+ ret
+; e2903
+
+Functione2903: ; e2903
+ ld hl, hJoyPressed
+ ld a, [hl]
+ and B_BUTTON
+ jr nz, .asm_e294b
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .asm_e2938
+ call Functione29f4
+ jr c, .asm_e292b
+ and a
+ ret z
+ call Functione2e8c
+ xor a
+ ld [hBGMapMode], a
+ call Functione2c2c
+ ld a, $1
+ ld [hBGMapMode], a
+ call DelayFrame
+ call DelayFrame
+ ret
+
+.asm_e292b
+ xor a
+ ld [wcb2b], a
+ ld [wcb2a], a
+ ld a, $4
+ ld [wJumptableIndex], a
+ ret
+
+.asm_e2938
+ call Functione2ee5
+ jr c, .asm_e2946
+ call Functione31e7
+ ld a, $0
+ ld [wJumptableIndex], a
+ ret
+
+.asm_e2946
+ ld hl, wJumptableIndex
+ dec [hl]
+ ret
+
+.asm_e294b
+ ld a, [wcb2f]
+ ld [wcb2a], a
+ ld a, [wcb30]
+ ld [wcb2b], a
+ ld a, [wcb31]
+ ld [wcb2e], a
+ ld a, $0
+ ld [wJumptableIndex], a
+ ret
+; e2963
+
+Functione2963: ; e2963 (38:6963)
+ call ClearBGPalettes
+ call ClearSprites
+ call ClearTileMap
+ call Functione33e8
+ ld hl, OverworldMap
+ ld bc, $338
+ xor a
+ call ByteFill
+ xor a
+ ld [wJumptableIndex], a
+ ld [wcf64], a
+ ld [wcf65], a
+ ld [wcf66], a
+ ld [wcb2b], a
+ ld [wcb2a], a
+ ret
+
+Functione298d: ; e298d (38:698d)
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+Functione2992: ; e2992 (38:6992)
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+Functione2998: ; e2998 (38:6998)
+ ld a, [wcb2d]
+ ld d, a
+ ld a, [wcb2c]
+ and a
+ jr z, .asm_e29b2
+ dec a
+ cp $1
+ jr z, .asm_e29b2
+ ld e, a
+ ld a, [hl]
+ and D_UP
+ jr nz, Functione2a18
+ ld a, [hl]
+ and D_DOWN
+ jr nz, Functione2a2c
+.asm_e29b2
+ jp Functione2a65
+
+Functione29b5: ; e29b5 (38:69b5)
+ ld hl, hJoyLast
+ ld a, [wcb2d]
+ ld d, a
+ ld a, [wcb2c]
+ ld e, a
+ and a
+ jr z, .asm_e29cd
+ ld a, [hl]
+ and D_UP
+ jr nz, Functione2a18
+ ld a, [hl]
+ and D_DOWN
+ jr nz, Functione2a2c
+.asm_e29cd
+ jp Functione2a65
+; e29d0 (38:69d0)
+
+Functione29d0: ; e29d0
+ ld hl, hJoyLast
+ ld a, [wcb2d]
+ ld d, a
+ ld a, [wcb2c]
+ ld e, a
+ and a
+ jr z, .asm_e29e8
+ ld a, [hl]
+ and D_UP
+ jr nz, Functione2a18
+ ld a, [hl]
+ and D_DOWN
+ jr nz, Functione2a2c
+
+.asm_e29e8
+ ld a, [hl]
+ and D_LEFT
+ jr nz, Functione2a48
+ ld a, [hl]
+ and D_RIGHT
+ jr nz, Functione2a56
+ jr Functione2a65
+
+Functione29f4: ; e29f4
+ ld hl, hJoyLast
+ ld a, [wcb2d]
+ ld d, a
+ ld a, [wcb2c]
+ ld e, a
+ and a
+ jr z, .asm_e2a0c
+
+ ld a, [hl]
+ and D_UP
+ jr nz, Functione2a18
+ ld a, [hl]
+ and D_DOWN
+ jr nz, Functione2a2c
+
+.asm_e2a0c
+ ld a, [hl]
+ and D_LEFT
+ jr nz, Functione2a48
+ ld a, [hl]
+ and D_RIGHT
+ jr nz, Functione2a56
+ jr Functione2a65
+
+Functione2a18: ; e2a18 (38:6a18)
+ ld hl, wcb2b
+ ld a, [hl]
+ and a
+ jr z, .asm_e2a22
+ dec [hl]
+ jr Functione2a68
+
+.asm_e2a22
+ ld hl, wcb2a
+ ld a, [hl]
+ and a
+ jr z, Functione2a65
+ dec [hl]
+ jr Functione2a68
+
+Functione2a2c: ; e2a2c (38:6a2c)
+ ld a, [wcb2b]
+ ld hl, wcb2a
+ add [hl]
+ inc a
+ cp e
+ jr nc, Functione2a65
+
+ ld hl, wcb2b
+ ld a, [hl]
+ inc a
+ cp d
+ jr nc, .asm_e2a42
+ inc [hl]
+ jr Functione2a68
+
+.asm_e2a42
+ ld hl, wcb2a
+ inc [hl]
+ jr Functione2a68
+; e2a48 (38:6a48)
+
+Functione2a48: ; e2a48
+ ld hl, wcb2e
+ ld a, [hl]
+ and a
+ jr z, .asm_e2a52
+ dec [hl]
+ jr Functione2a6c
+
+.asm_e2a52
+ ld [hl], $e
+ jr Functione2a6c
+
+Functione2a56: ; e2a56
+ ld hl, wcb2e
+ ld a, [hl]
+ cp $e
+ jr z, .asm_e2a61
+ inc [hl]
+ jr Functione2a6c
+
+.asm_e2a61
+ ld [hl], $0
+ jr Functione2a6c
+
+Functione2a65: ; e2a65 (38:6a65)
+ xor a
+ and a
+ ret
+
+Functione2a68: ; e2a68 (38:6a68)
+ ld a, $1
+ and a
+ ret
+; e2a6c (38:6a6c)
+
+Functione2a6c: ; e2a6c
+ scf
+ ret
+; e2a6e
+
+Functione2a6e: ; e2a6e (38:6a6e)
+ push de
+ hlcoord 0, 15
+ lb bc, 1, 18
+ call TextBox
+ pop de
+ hlcoord 1, 16
+ call PlaceString
+ ret
+; e2a80 (38:6a80)
+
+Functione2a80: ; e2a80
+ call Functione2a8e
+ hlcoord 8, 1
+ ld [hl], $5f
+ hlcoord 19, 1
+ ld [hl], $5e
+ ret
+; e2a8e
+
+Functione2a8e: ; e2a8e (38:6a8e)
+ hlcoord 8, 0
+ lb bc, 1, 10
+ call TextBox
+
+ ld a, [wcb2e]
+ and a
+ jr z, .party
+
+ cp NUM_BOXES + 1
+ jr nz, .gotbox
+
+ ld a, [wCurBox]
+ inc a
+.gotbox
+ dec a
+ ld hl, wBoxNames
+ ld bc, BOX_NAME_LENGTH
+ call AddNTimes
+ ld e, l
+ ld d, h
+ jr .print
+
+.party
+ ld de, String_e2abd
+.print
+ hlcoord 10, 1
+ call PlaceString
+ ret
+; e2abd (38:6abd)
+
+String_e2abd:
+ db "PARTY <PK><MN>@"
+; e2ac6
+
+PCMonInfo: ; e2ac6 (38:6ac6)
+; Display a monster's pic and
+; attributes when highlighting
+; it in a PC menu.
+
+; Includes the neat cascading
+; effect when showing the pic.
+
+; Example: Species, level, gender,
+; whether it's holding an item.
+
+ hlcoord 0, 0
+ lb bc, 15, 8
+ call ClearBox
+
+ hlcoord 8, 14
+ lb bc, 1, 3
+ call ClearBox
+
+ call Functione2def
+ and a
+ ret z
+ cp $ff
+ ret z
+
+ ld [wd265], a
+ hlcoord 1, 4
+ xor a
+ ld b, 7
+.asm_e2ae9
+ ld c, 7
+ push af
+ push hl
+.asm_e2aed
+ ld [hli], a
+ add 7
+ dec c
+ jr nz, .asm_e2aed
+ pop hl
+ ld de, 20
+ add hl, de
+ pop af
+ inc a
+ dec b
+ jr nz, .asm_e2ae9
+
+ call Functione2b6d
+ ld a, [wd265]
+ ld [CurPartySpecies], a
+ ld [CurSpecies], a
+ ld hl, TempMonDVs
+ predef GetUnownLetter
+ call GetBaseData
+ ld de, VTiles2 tile $00
+ predef GetFrontpic
+ xor a
+ ld [wcb32], a
+ ld a, [CurPartySpecies]
+ ld [wd265], a
+
+ cp EGG
+ ret z
+
+ call GetBasePokemonName
+ hlcoord 1, 14
+ call PlaceString
+
+ hlcoord 1, 12
+ call PrintLevel
+
+ ld a, $3
+ ld [MonType], a
+ callba GetGender
+ jr c, .asm_e2b4f
+ ld a, "♂"
+ jr nz, .printgender
+ ld a, "♀"
+.printgender
+ hlcoord 5, 12
+ ld [hl], a
+.asm_e2b4f
+
+ ld a, [TempMonItem]
+ and a
+ ret z
+
+ ld d, a
+ callab ItemIsMail
+ jr c, .mail
+ ld a, $5d ; item icon
+ jr .printitem
+.mail
+ ld a, $1
+ ld [wcb32], a
+ ld a, $5c ; mail icon
+.printitem
+ hlcoord 7, 12
+ ld [hl], a
+ ret
+
+Functione2b6d: ; e2b6d (38:6b6d)
+ ld a, [wcb2b]
+ ld hl, wcb2a
+ add [hl]
+ ld e, a
+ ld d, $0
+ ld hl, wc801
+rept 3
+ add hl, de
+endr
+ ld a, [hl]
+ and a
+ jr z, .asm_e2bc6
+ cp $f
+ jr z, .asm_e2bf5
+ ld b, a
+ call Functione3396
+ ld a, b
+ call GetSRAMBank
+ push hl
+ ld bc, $35
+ add hl, bc
+ ld bc, $20
+ ld a, e
+ call AddNTimes
+ ld a, [hl]
+ ld [TempMonLevel], a
+ pop hl
+ push hl
+ ld bc, $17
+ add hl, bc
+ ld bc, $20
+ ld a, e
+ call AddNTimes
+ ld a, [hl]
+ ld [TempMonItem], a
+ pop hl
+ ld bc, $2b
+ add hl, bc
+ ld bc, $20
+ ld a, e
+ call AddNTimes
+ ld de, TempMonDVs
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ ld [de], a
+ call CloseSRAM
+ ret
+.asm_e2bc6
+ ld hl, PartyMon1Level
+ ld bc, $30
+ ld a, e
+ call AddNTimes
+ ld a, [hl]
+ ld [TempMonLevel], a
+ ld hl, PartyMon1Item
+ ld bc, $30
+ ld a, e
+ call AddNTimes
+ ld a, [hl]
+ ld [TempMonItem], a
+ ld hl, PartyMon1DVs
+ ld bc, $30
+ ld a, e
+ call AddNTimes
+ ld de, TempMonDVs
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ ld [de], a
+ ret
+
+.asm_e2bf5
+ ld a, BANK(sBox)
+ call GetSRAMBank
+ ld hl, sBoxMon1Level
+ ld bc, $20
+ ld a, e
+ call AddNTimes
+ ld a, [hl]
+ ld [TempMonLevel], a
+
+ ld hl, sBoxMon1Item
+ ld bc, $20
+ ld a, e
+ call AddNTimes
+ ld a, [hl]
+ ld [TempMonItem], a
+
+ ld hl, sBoxMon1DVs
+ ld bc, $20
+ ld a, e
+ call AddNTimes
+ ld de, TempMonDVs
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ ld [de], a
+
+ call CloseSRAM
+ ret
+
+Functione2c2c: ; e2c2c (38:6c2c)
+ hlcoord 8, 2
+ lb bc, 10, 10
+ call TextBox
+
+ hlcoord 8, 2
+ ld [hl], "└"
+ hlcoord 19, 2
+ ld [hl], "┘"
+
+ ld a, [wcb2a]
+ ld e, a
+ ld d, 0
+ ld hl, OverworldMap
+rept 3
+ add hl, de
+endr
+ ld e, l
+ ld d, h
+ hlcoord 9, 4
+ ld a, [wcb2d]
+.asm_e2c53
+ push af
+ push de
+ push hl
+ call Functione2c6e
+ pop hl
+ ld de, $28
+ add hl, de
+ pop de
+rept 3
+ inc de
+endr
+ pop af
+ dec a
+ jr nz, .asm_e2c53
+ ret
+; e2c67 (38:6c67)
+
+String_e2c67:
+ db "CANCEL@"
+; e2c6e
+
+Functione2c6e: ; e2c6e (38:6c6e)
+ ld a, [de]
+ and a
+ ret z
+ cp $ff
+ jr nz, .asm_e2c7c
+ ld de, String_e2c67
+ call PlaceString
+ ret
+.asm_e2c7c
+ inc de
+ ld a, [de]
+ ld b, a
+ inc de
+ ld a, [de]
+ ld e, a
+ ld a, b
+ and a
+ jr z, .asm_e2cc8
+ cp $f
+ jr z, .asm_e2cf1
+ push hl
+ call Functione3396
+ ld a, b
+ call GetSRAMBank
+ push hl
+ ld bc, $16
+ add hl, bc
+ ld bc, $20
+ ld a, e
+ call AddNTimes
+ ld a, [hl]
+ pop hl
+ and a
+ jr z, .asm_e2cc2
+ ld bc, $372
+ add hl, bc
+ ld bc, $b
+ ld a, e
+ call AddNTimes
+ ld de, StringBuffer1
+ ld bc, $b
+ call CopyBytes
+ call CloseSRAM
+ pop hl
+ ld de, StringBuffer1
+ call PlaceString
+ ret
+.asm_e2cc2
+ call CloseSRAM
+ pop hl
+ jr .asm_e2d23
+.asm_e2cc8
+ push hl
+ ld hl, PartySpecies
+ ld d, $0
+ add hl, de
+ ld a, [hl]
+ and a
+ jr z, .asm_e2cee
+ ld hl, PartyMonNicknames
+ ld bc, $b
+ ld a, e
+ call AddNTimes
+ ld de, StringBuffer1
+ ld bc, $b
+ call CopyBytes
+ pop hl
+ ld de, StringBuffer1
+ call PlaceString
+ ret
+.asm_e2cee
+ pop hl
+ jr .asm_e2d23
+.asm_e2cf1
+ push hl
+ ld a, BANK(sBox)
+ call GetSRAMBank
+ ld hl, sBoxSpecies
+ ld d, $0
+ add hl, de
+ ld a, [hl]
+ and a
+ jr z, .asm_e2d1f
+ ld hl, sBoxMonNicknames
+ ld bc, PKMN_NAME_LENGTH
+ ld a, e
+ call AddNTimes
+ ld de, StringBuffer1
+ ld bc, PKMN_NAME_LENGTH
+ call CopyBytes
+ call CloseSRAM
+ pop hl
+ ld de, StringBuffer1
+ call PlaceString
+ ret
+.asm_e2d1f
+ call CloseSRAM
+ pop hl
+.asm_e2d23
+ ld de, String_e2d2a
+ call PlaceString
+ ret
+; e2d2a (38:6d2a)
+
+String_e2d2a:
+ db "-----@"
+; e2d30
+
+Functione2d30: ; e2d30 (38:6d30)
+ xor a
+ ld hl, OverworldMap
+ ld bc, $5a
+ call ByteFill
+ ld de, OverworldMap
+ xor a
+ ld [wd003], a
+ ld [wd004], a
+ ld a, [wcb2e]
+ and a
+ jr z, .asm_e2d87
+ cp $f
+ jr z, .asm_e2db7
+ ld b, a
+ call Functione3396
+ ld a, b
+ call GetSRAMBank
+ inc hl
+.asm_e2d57
+ ld a, [hl]
+ cp $ff
+ jr z, .asm_e2d79
+ and a
+ jr z, .asm_e2d79
+ ld [de], a
+ inc de
+ ld a, [wcb2e]
+ ld [de], a
+ inc de
+ ld a, [wd003]
+ ld [de], a
+ inc a
+ ld [wd003], a
+ inc de
+ inc hl
+ ld a, [wd004]
+ inc a
+ ld [wd004], a
+ jr .asm_e2d57
+.asm_e2d79
+ call CloseSRAM
+ ld a, $ff
+ ld [de], a
+ ld a, [wd004]
+ inc a
+ ld [wcb2c], a
+ ret
+.asm_e2d87
+ ld hl, PartySpecies
+.asm_e2d8a
+ ld a, [hl]
+ cp $ff
+ jr z, .asm_e2dac
+ and a
+ jr z, .asm_e2dac
+ ld [de], a
+ inc de
+ ld a, [wcb2e]
+ ld [de], a
+ inc de
+ ld a, [wd003]
+ ld [de], a
+ inc a
+ ld [wd003], a
+ inc de
+ inc hl
+ ld a, [wd004]
+ inc a
+ ld [wd004], a
+ jr .asm_e2d8a
+.asm_e2dac
+ ld a, $ff
+ ld [de], a
+ ld a, [wd004]
+ inc a
+ ld [wcb2c], a
+ ret
+.asm_e2db7
+ ld a, BANK(sBox)
+ call GetSRAMBank
+ ld hl, sBoxSpecies
+.asm_e2dbf
+ ld a, [hl]
+ cp $ff
+ jr z, .asm_e2de1
+ and a
+ jr z, .asm_e2de1
+ ld [de], a
+ inc de
+ ld a, [wcb2e]
+ ld [de], a
+ inc de
+ ld a, [wd003]
+ ld [de], a
+ inc a
+ ld [wd003], a
+ inc de
+ inc hl
+ ld a, [wd004]
+ inc a
+ ld [wd004], a
+ jr .asm_e2dbf
+.asm_e2de1
+ call CloseSRAM
+ ld a, $ff
+ ld [de], a
+ ld a, [wd004]
+ inc a
+ ld [wcb2c], a
+ ret
+
+Functione2def: ; e2def (38:6def)
+ ld a, [wcb2b]
+ ld hl, wcb2a
+ add [hl]
+ ld e, a
+ ld d, $0
+ ld hl, OverworldMap
+rept 3
+ add hl, de
+endr
+ ld a, [hl]
+ ret
+
+Functione2e01: ; e2e01 (38:6e01)
+ ld a, [wcb2c]
+ and a
+ jr nz, .asm_e2e0b
+ call ClearSprites
+ ret
+.asm_e2e0b
+ ld hl, Unknown_e2e2b
+ ld de, Sprites
+.done1
+ ld a, [hl]
+ cp $ff
+ ret z
+ ld a, [wcb2b]
+ and $7
+ swap a
+ add [hl]
+ inc hl
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ jr .done1
+; e2e2b (38:6e2b)
+
+Unknown_e2e2b: ; e2e2b
+ db $26, $50, $00, $00
+ db $26, $58, $00, $00
+ db $26, $60, $00, $00
+ db $26, $68, $00, $00
+ db $26, $70, $00, $00
+ db $26, $78, $00, $00
+ db $26, $80, $00, $00
+ db $26, $88, $00, $00
+ db $26, $90, $00, $00
+ db $26, $97, $00, $00
+ db $39, $50, $00, $40
+ db $39, $58, $00, $40
+ db $39, $60, $00, $40
+ db $39, $68, $00, $40
+ db $39, $70, $00, $40
+ db $39, $78, $00, $40
+ db $39, $80, $00, $40
+ db $39, $88, $00, $40
+ db $39, $90, $00, $40
+ db $39, $97, $00, $40
+ db $2e, $4e, $01, $00
+ db $31, $4e, $01, $40
+ db $2e, $99, $01, $20
+ db $31, $99, $01, $60
+ db $ff
+; e2e8c
+
+Functione2e8c: ; e2e8c
+ ld hl, Unknown_e2eac
+ ld de, Sprites
+.asm_e2e92
+ ld a, [hl]
+ cp $ff
+ ret z
+ ld a, [wcb2b]
+ and $7
+ swap a
+ add [hl]
+ inc hl
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ jr .asm_e2e92
+; e2eac
+
+Unknown_e2eac: ; e2eac
+ db $27, $50, $06, $00
+ db $2b, $58, $00, $40
+ db $2b, $60, $00, $40
+ db $2b, $68, $00, $40
+ db $2b, $70, $00, $40
+ db $2b, $78, $00, $40
+ db $2b, $80, $00, $40
+ db $2b, $88, $00, $40
+ db $2b, $90, $00, $40
+ db $27, $98, $07, $00
+ db $ff
+; e2ed5
+
+Functione2ed5: ; e2ed5
+.asm_e2ed5
+ push bc
+ push hl
+.asm_e2ed7
+ ld [hli], a
+ dec c
+ jr nz, .asm_e2ed7
+ pop hl
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .asm_e2ed5
+ ret
+; e2ee5
+
+Functione2ee5: ; e2ee5
+ ld hl, wcb2e
+ ld a, [wcb31]
+ cp [hl]
+ jr z, .asm_e2f00
+ ld a, [wcb2e]
+ and a
+ jr z, .asm_e2ef8
+ ld e, $15
+ jr .asm_e2efa
+
+.asm_e2ef8
+ ld e, $7
+
+.asm_e2efa
+ ld a, [wcb2c]
+ cp e
+ jr nc, .asm_e2f02
+
+.asm_e2f00
+ and a
+ ret
+
+.asm_e2f02
+ ld de, PCString_TheresNoRoom
+ call Functione2a6e
+ ld de, SFX_WRONG
+ call WaitPlaySFX
+ call WaitSFX
+ ld c, 50
+ call DelayFrames
+ scf
+ ret
+; e2f18
+
+Functione2f18: ; e2f18 (38:6f18)
+ ld a, [wcb2e]
+ and a
+ jr nz, .Okay
+ ld a, [wcb2c]
+ cp $3
+ jr c, .ItsYourLastPokemon
+ ld a, [wcb2b]
+ ld hl, wcb2a
+ add [hl]
+ ld [CurPartyMon], a
+ callba CheckCurPartyMonFainted
+ jr c, .AllOthersFainted
+ ld a, [wcb32]
+ and a
+ jr nz, .HasMail
+.Okay
+ and a
+ ret
+.HasMail
+ ld de, PCString_RemoveMail
+ jr .NotOkay
+.AllOthersFainted
+ ld de, PCString_NoMoreUsablePKMN
+ jr .NotOkay
+.ItsYourLastPokemon
+ ld de, PCString_ItsYourLastPKMN
+.NotOkay
+ call Functione2a6e
+ ld de, SFX_WRONG
+ call WaitPlaySFX
+ call WaitSFX
+ ld c, 50
+ call DelayFrames
+ scf
+ ret
+
+Functione2f5f: ; e2f5f (38:6f5f)
+ ld a, [CurPartySpecies]
+ cp EGG
+ jr z, .asm_e2f68
+ and a
+ ret
+.asm_e2f68
+ ld de, PCString_NoReleasingEGGS
+ call Functione2a6e
+ ld de, SFX_WRONG
+ call WaitPlaySFX
+ call WaitSFX
+ ld c, 50
+ call DelayFrames
+ scf
+ ret
+
+Functione2f7e: ; e2f7e (38:6f7e)
+ call LowVolume
+ call Functione2fd6
+ ld a, $3
+ ld [MonType], a
+ predef StatsScreenInit
+ call Functione33e8
+ call MaxVolume
+ ret
+
+Functione2f95: ; e2f95 (38:6f95)
+ ld hl, hJoyPressed ; $ffa7
+ ld a, [hl]
+ and A_BUTTON | B_BUTTON | D_RIGHT | D_LEFT
+ ld [wcf73], a
+ jr nz, .pressed_a_b_right_left
+ ld a, [hl]
+ and D_DOWN | D_UP
+ ld [wcf73], a
+ jr nz, .pressed_down_up
+ jr .pressed_a_b_right_left
+
+.pressed_down_up
+ call Functione2998
+ and a
+ jr z, .asm_e2fd1
+ call Functione2def
+ ld [wd265], a
+ call Functione2b6d
+ ld a, [wd265]
+ ld [CurPartySpecies], a
+ ld [CurSpecies], a
+ ld hl, TempMonDVs
+ predef GetUnownLetter
+ call GetBaseData
+ call Functione2fd6
+.pressed_a_b_right_left
+ ret
+
+.asm_e2fd1
+ xor a
+ ld [wcf73], a
+ ret
+
+Functione2fd6: ; e2fd6 (38:6fd6)
+ ld a, [wcb2b]
+ ld hl, wcb2a
+ add [hl]
+ ld [CurPartyMon], a
+ ld a, [wcb2e]
+ and a
+ jr z, .asm_e3020
+ cp $f
+ jr nz, .asm_e3048
+ ld a, BANK(sBox)
+ call GetSRAMBank
+ ld hl, sBoxSpecies
+ call Functione3357
+ ld hl, sBoxMonNicknames
+ call Functione3363
+ ld hl, sBoxMonOT
+ call Functione3376
+ ld hl, sBoxMons
+ ld bc, BOXMON_STRUCT_LENGTH
+ ld a, [CurPartyMon]
+ call AddNTimes
+ ld de, wd018_Mon
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call CopyBytes
+ call CloseSRAM
+ callba Function5088b
+ ret
+
+.asm_e3020
+ ld hl, PartySpecies
+ call Functione3357
+ ld hl, PartyMonNicknames
+ call Functione3363
+ ld hl, PartyMonOT
+ call Functione3376
+ ld hl, PartyMons ; wdcdf (aliases: PartyMon1, PartyMon1Species)
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld a, [CurPartyMon]
+ call AddNTimes
+ ld de, wd018_Mon
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call CopyBytes
+ ret
+
+.asm_e3048
+ ld b, a
+ call Functione3396
+ ld a, b
+ call GetSRAMBank
+ push hl
+ inc hl
+ call Functione3357
+ pop hl
+ push hl
+ ld bc, $372
+ add hl, bc
+ call Functione3363
+ pop hl
+ push hl
+ ld bc, $296
+ add hl, bc
+ call Functione3376
+ pop hl
+ ld bc, $16
+ add hl, bc
+ ld bc, $20
+ call Functione3389
+ call CloseSRAM
+ callba Function5088b
+ ret
+
+Functione307c: ; e307c (38:707c)
+ ld a, [wcb2b]
+ ld hl, wcb2a
+ add [hl]
+ ld [CurPartyMon], a
+ ld hl, PartyMonNicknames
+ ld a, [CurPartyMon]
+ call GetNick
+ ld a, PC_DEPOSIT
+ ld [wPokemonWithdrawDepositParameter], a
+ predef SentGetPkmnIntoFromBox
+ jr c, .asm_boxisfull
+ xor a
+ ld [wPokemonWithdrawDepositParameter], a
+ callba Functione039
+ ld a, [CurPartySpecies]
+ call PlayCry
+ hlcoord 0, 0
+ lb bc, 15, 8
+ call ClearBox
+ hlcoord 8, 14
+ lb bc, 1, 3
+ call ClearBox
+ hlcoord 0, 15
+ lb bc, 1, 18
+ call TextBox
+ call WaitBGMap
+ hlcoord 1, 16
+ ld de, PCString_Stored
+ call PlaceString
+ ld l, c
+ ld h, b
+ ld de, StringBuffer1
+ call PlaceString
+ ld a, "!"
+ ld [bc], a
+ ld c, 50
+ call DelayFrames
+ and a
+ ret
+
+.asm_boxisfull
+ ld de, PCString_BoxFull
+ call Functione2a6e
+ ld de, SFX_WRONG
+ call WaitPlaySFX
+ call WaitSFX
+ ld c, 50
+ call DelayFrames
+ scf
+ ret
+
+TryWithdrawPokemon: ; e30fa (38:70fa)
+ ld a, [wcb2b]
+ ld hl, wcb2a
+ add [hl]
+ ld [CurPartyMon], a
+ ld a, BANK(sBoxMonNicknames)
+ call GetSRAMBank
+ ld a, [CurPartyMon]
+ ld hl, sBoxMonNicknames
+ call GetNick
+ call CloseSRAM
+ xor a
+ ld [wPokemonWithdrawDepositParameter], a
+ predef SentGetPkmnIntoFromBox
+ jr c, .PartyFull
+ ld a, PC_DEPOSIT
+ ld [wPokemonWithdrawDepositParameter], a
+ callba Functione039
+ ld a, [CurPartySpecies]
+ call PlayCry
+ hlcoord 0, 0
+ lb bc, 15, 8
+ call ClearBox
+ hlcoord 8, 14
+ lb bc, 1, 3
+ call ClearBox
+ hlcoord 0, 15
+ lb bc, 1, 18
+ call TextBox
+ call WaitBGMap
+ hlcoord 1, 16
+ ld de, PCString_Got
+ call PlaceString
+ ld l, c
+ ld h, b
+ ld de, StringBuffer1
+ call PlaceString
+ ld a, $e7
+ ld [bc], a
+ ld c, 50
+ call DelayFrames
+ and a
+ ret
+
+.PartyFull
+ ld de, PCString_PartyFull
+ call Functione2a6e
+ ld de, SFX_WRONG
+ call WaitPlaySFX
+ call WaitSFX
+ ld c, 50
+ call DelayFrames
+ scf
+ ret
+
+
+Functione3180: ; e3180 (38:7180)
+ hlcoord 0, 0
+ lb bc, 15, 8
+ call ClearBox
+ hlcoord 8, 14
+ lb bc, 1, 3
+ call ClearBox
+ hlcoord 0, 15
+ lb bc, 1, 18
+ call TextBox
+
+ call WaitBGMap
+ ld a, [CurPartySpecies]
+ call GetCryIndex
+ jr c, .asm_e31ab
+ ld e, c
+ ld d, b
+ call PlayCryHeader
+.asm_e31ab
+
+ ld a, [CurPartySpecies]
+ ld [wd265], a
+ call GetPokemonName
+ hlcoord 1, 16
+ ld de, PCString_ReleasedPKMN
+ call PlaceString
+ ld c, 80
+ call DelayFrames
+ hlcoord 0, 15
+ lb bc, 1, 18
+ call TextBox
+ hlcoord 1, 16
+ ld de, PCString_Bye
+ call PlaceString
+ ld l, c
+ ld h, b
+ inc hl
+ ld de, StringBuffer1
+ call PlaceString
+ ld l, c
+ ld h, b
+ ld [hl], $e7
+ ld c, 50
+ call DelayFrames
+ ret
+; e31e7 (38:71e7)
+
+Functione31e7: ; e31e7
+ push hl
+ push de
+ push bc
+ push af
+ hlcoord 0, 15
+ lb bc, 1, 18
+ call TextBox
+ hlcoord 1, 16
+ ld de, String_e3233
+ call PlaceString
+ ld c, 20
+ call DelayFrames
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ld a, [wCurBox]
+ push af
+ ld bc, 0
+ ld a, [wcb31]
+ and a
+ jr nz, .asm_e3215
+ set 0, c
+
+.asm_e3215
+ ld a, [wcb2e]
+ and a
+ jr nz, .asm_e321d
+ set 1, c
+
+.asm_e321d
+ ld hl, Jumptable_e3245
+rept 2
+ add hl, bc
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, Functione322a
+ push de
+ jp [hl]
+; e322a
+
+Functione322a: ; e322a
+ pop af
+ ld e, a
+ callba Function14ad5
+ ret
+; e3233
+
+String_e3233:
+ db "Saving… Leave ON!@"
+; e3245
+
+Jumptable_e3245: ; e3245
+ dw Functione324d
+ dw Functione3267
+ dw Functione327d
+ dw Functione3284
+; e324d
+
+Functione324d: ; e324d
+ ld hl, wcb31
+ ld a, [wcb2e]
+ cp [hl]
+ jr z, .asm_e325d
+ call Functione32b0
+ call Functione32fa
+ ret
+
+.asm_e325d
+ call Functione32b0
+ call Functione328e
+ call Functione32fa
+ ret
+; e3267
+
+Functione3267: ; e3267
+ call Functione3316
+ ld a, $1
+ ld [wc2cd], a
+ callba SaveGameData
+ xor a
+ ld [wc2cd], a
+ call Functione32fa
+ ret
+; e327d
+
+Functione327d: ; e327d
+ call Functione32b0
+ call Functione3346
+ ret
+; e3284
+
+Functione3284: ; e3284
+ call Functione3316
+ call Functione328e
+ call Functione3346
+ ret
+; e328e
+
+Functione328e: ; e328e
+ ld a, [wcb2b]
+ ld hl, wcb2a
+ add [hl]
+ ld e, a
+ ld a, [wcb30]
+ ld hl, wcb2f
+ add [hl]
+ cp e
+ ret nc
+ ld hl, wcb2b
+ ld a, [hl]
+ and a
+ jr z, .asm_e32a8
+ dec [hl]
+ ret
+
+.asm_e32a8
+ ld hl, wcb2a
+ ld a, [hl]
+ and a
+ ret z
+ dec [hl]
+ ret
+; e32b0
+
+Functione32b0: ; e32b0
+ ld a, [wcb31]
+ dec a
+ ld e, a
+ callba Function14ac2
+ ld a, [wcb30]
+ ld hl, wcb2f
+ add [hl]
+ ld [CurPartyMon], a
+ ld a, $1
+ call GetSRAMBank
+ ld hl, sBoxSpecies
+ call Functione3357
+ ld hl, sBoxMonNicknames
+ call Functione3363
+ ld hl, sBoxMonOT
+ call Functione3376
+ ld hl, sBoxMons
+ ld bc, BOXMON_STRUCT_LENGTH
+ call Functione3389
+ call CloseSRAM
+ callba Function5088b
+ ld a, PC_DEPOSIT
+ ld [wPokemonWithdrawDepositParameter], a
+ callba Functione039
+ ret
+; e32fa
+
+Functione32fa: ; e32fa
+ ld a, [wcb2e]
+ dec a
+ ld e, a
+ callba Function14ac2
+ ld a, [wcb2b]
+ ld hl, wcb2a
+ add [hl]
+ ld [CurPartyMon], a
+ callba Function51322
+ ret
+; e3316
+
+Functione3316: ; e3316
+ ld a, [wcb30]
+ ld hl, wcb2f
+ add [hl]
+ ld [CurPartyMon], a
+ ld hl, PartySpecies
+ call Functione3357
+ ld hl, PartyMonNicknames
+ call Functione3363
+ ld hl, PartyMonOT
+ call Functione3376
+ ld hl, PartyMon1Species
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call Functione3389
+ xor a
+ ld [wPokemonWithdrawDepositParameter], a
+ callba Functione039
+ ret
+; e3346
+
+Functione3346: ; e3346
+ ld a, [wcb2b]
+ ld hl, wcb2a
+ add [hl]
+ ld [CurPartyMon], a
+ callba Function5138b
+ ret
+; e3357
+
+Functione3357: ; e3357 (38:7357)
+ ld a, [CurPartyMon]
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld a, [hl]
+ ld [CurPartySpecies], a
+ ret
+
+Functione3363: ; e3363 (38:7363)
+ ld bc, $b
+ ld a, [CurPartyMon]
+ call AddNTimes
+ ld de, wd002
+ ld bc, $b
+ call CopyBytes
+ ret
+
+Functione3376: ; e3376 (38:7376)
+ ld bc, $b
+ ld a, [CurPartyMon]
+ call AddNTimes
+ ld de, wd00d
+ ld bc, $b
+ call CopyBytes
+ ret
+
+Functione3389: ; e3389 (38:7389)
+ ld a, [CurPartyMon]
+ call AddNTimes
+ ld de, wd018
+ call CopyBytes
+ ret
+
+Functione3396: ; e3396 (38:7396)
+ dec b
+ ld c, b
+ ld b, 0
+ ld hl, Unknown_e33a6
+rept 3
+ add hl, bc
+endr
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+; e33a6 (38:73a6)
+
+Unknown_e33a6: ; e33a6
+ ; bank, address
+ dba sBox1
+ dba sBox2
+ dba sBox3
+ dba sBox4
+ dba sBox5
+ dba sBox6
+ dba sBox7
+ dba sBox8
+ dba sBox9
+ dba sBox10
+ dba sBox11
+ dba sBox12
+ dba sBox13
+ dba sBox14
+; e33d0
+
+Functione33d0: ; e33d0 (38:73d0)
+ ld b, a
+ call GetSGBLayout
+ ld a, $e4
+ call DmgToCgbBGPals
+ ld a, $fc
+ call Functioncf8
+ ret
+
+Functione33df: ; e33df (38:73df)
+ ld e, a
+ ld d, $0
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+Functione33e8: ; e33e8 (38:73e8)
+ call DisableLCD
+ ld hl, VTiles2 tile $00
+ ld bc, $310
+ xor a
+ call ByteFill
+ call LoadStandardFont
+ call LoadFontsBattleExtra
+ ld hl, PCMailGFX
+ ld de, VTiles2 tile $5c
+ ld bc, $40
+ call CopyBytes
+ ld hl, PCSelectLZ
+ ld de, VTiles0 tile $00
+ call Decompress
+ ld a, 6
+ call SkipMusic
+ call EnableLCD
+ ret
+; e3419 (38:7419)
+
+PCSelectLZ: INCBIN "gfx/pc.2bpp.lz"
+PCMailGFX: INCBIN "gfx/pc_mail.2bpp"
+; e34dd
+
+PCString_ChooseaPKMN: db "Choose a <PK><MN>.@"
+PCString_WhatsUp: db "What's up?@"
+PCString_ReleasePKMN: db "Release <PK><MN>?@"
+PCString_MoveToWhere: db "Move to where?@"
+PCString_ItsYourLastPKMN: db "It's your last <PK><MN>!@"
+PCString_TheresNoRoom: db "There's no room!@"
+PCString_NoMoreUsablePKMN: db "No more usable <PK><MN>!@"
+PCString_RemoveMail: db "Remove MAIL.@"
+PCString_ReleasedPKMN: db "Released <PK><MN>.@"
+PCString_Bye: db "Bye,@"
+PCString_Stored: db "Stored @"
+PCString_Got: db "Got @"
+PCString_Non: db "Non.@"
+PCString_BoxFull: db "The BOX is full.@"
+PCString_PartyFull: db "The party's full!@"
+PCString_NoReleasingEGGS: db "No releasing EGGS!@"
+; e35aa
+
+
+_ChangeBox: ; e35aa (38:75aa)
+ call LoadStandardMenuDataHeader
+ call Functione35e2
+.loop
+ xor a
+ ld [hBGMapMode], a
+ call Functione36cf
+ call Functione379c
+ ld hl, _ChangeBox_menudataheader
+ call CopyMenuDataHeader
+ xor a
+ ld [wd0e4], a
+ hlcoord 0, 4
+ lb bc, 8, 9
+ call TextBox
+ call HandleScrollingMenu
+ ld a, [wcf73]
+ cp $2
+ jr z, .done
+ call Functione37af
+ call Functione36f9
+ jr .loop
+.done
+ call WriteBackup
+ ret
+
+Functione35e2: ; e35e2 (38:75e2)
+ xor a
+ ld [hBGMapMode], a
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, " "
+ call ByteFill
+ ret
+; e35f1 (38:75f1)
+
+_ChangeBox_menudataheader: ; 0xe35f1
+ db $40 ; flags
+ db 05, 01 ; start coords
+ db 12, 09 ; end coords
+ dw .menudata2
+ db 1 ; default option
+; 0xe35f9
+
+.menudata2: ; 0xe35f9
+ db $22 ; flags
+ db 4, 0
+ db 1
+ dba .boxes
+ dba .boxnames
+ dba NULL
+ dba Functione3632
+; e3609
+
+.boxes: ; e3609
+ db NUM_BOXES
+x = 1
+rept NUM_BOXES
+ db x
+x = x + 1
+endr
+ db -1
+; e3619
+
+.boxnames: ; e3619
+ push de
+ ld a, [MenuSelection]
+ dec a
+ call GetBoxName
+ pop hl
+ call PlaceString
+ ret
+; e3626
+
+GetBoxName: ; e3626 (38:7626)
+ ld bc, BOX_NAME_LENGTH
+ ld hl, wBoxNames
+ call AddNTimes
+ ld d, h
+ ld e, l
+ ret
+; e3632 (38:7632)
+
+Functione3632: ; e3632
+ hlcoord 11, 7
+ lb bc, 5, 7
+ call TextBox
+ ld a, [MenuSelection]
+ cp -1
+ ret z
+ hlcoord 12, 9
+ ld de, String_e3663
+ call PlaceString
+ call GetBoxCount
+ ld [wd265], a
+ hlcoord 13, 11
+ ld de, wd265
+ lb bc, 1, 2
+ call PrintNum
+ ld de, String_e3668
+ call PlaceString
+ ret
+; e3663
+
+String_e3663: ; e3663
+ db "#MON@"
+; e3668
+
+String_e3668: ; e3668
+ ; db "/20@"
+ db "/"
+ db "0" + MONS_PER_BOX / 10 ; "2"
+ db "0" + MONS_PER_BOX % 10 ; "0"
+ db "@"
+; e366c
+
+GetBoxCount: ; e366c (38:766c)
+ ld a, [wCurBox]
+ ld c, a
+ ld a, [MenuSelection]
+ dec a
+ cp c
+ jr z, .activebox
+ ld c, a
+ ld b, 0
+ ld hl, .boxbanks
+rept 3
+ add hl, bc
+endr
+ ld a, [hli]
+ ld b, a
+ call GetSRAMBank
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [hl]
+ call CloseSRAM
+ ld c, a
+ ld a, [wSavedAtLeastOnce]
+ and a
+ jr z, .newfile
+ ld a, c
+ ret
+
+.newfile
+ xor a
+ ret
+
+.activebox
+ ld a, BANK(sBoxCount)
+ ld b, a
+ call GetSRAMBank
+ ld hl, sBoxCount
+ ld a, [hl]
+ call CloseSRAM
+ ret
+; e36a5 (38:76a5)
+
+.boxbanks: ; e36a5
+ dba sBox1
+ dba sBox2
+ dba sBox3
+ dba sBox4
+ dba sBox5
+ dba sBox6
+ dba sBox7
+ dba sBox8
+ dba sBox9
+ dba sBox10
+ dba sBox11
+ dba sBox12
+ dba sBox13
+ dba sBox14
+; e36cf
+
+Functione36cf: ; e36cf (38:76cf)
+ hlcoord 0, 0
+ ld b, 2
+ ld c, 18
+ call TextBox
+ hlcoord 1, 2
+ ld de, String_e36f1
+ call PlaceString
+ ld a, [wCurBox]
+ and $f
+ call GetBoxName
+ hlcoord 11, 2
+ call PlaceString
+ ret
+; e36f1 (38:76f1)
+
+String_e36f1: ; e36f1
+ db "CURRENT@"
+; e36f9
+
+Functione36f9: ; e36f9 (38:76f9)
+ ld hl, MenuDataHeader_0xe377b
+ call LoadMenuDataHeader
+ call InterpretMenu2
+ call ExitMenu
+ ret c
+ ld a, [MenuSelection2]
+ cp $1
+ jr z, .asm_e3734
+ cp $2
+ jr z, .asm_e3745
+ cp $3
+ jr z, .asm_e3717
+ and a
+ ret
+
+.asm_e3717
+ call GetBoxCount
+ and a
+ jr z, .asm_e372f
+ ld e, l
+ ld d, h
+ ld a, [MenuSelection]
+ dec a
+ ld c, a
+ callba Function844bc
+ call Functione35e2
+ and a
+ ret
+
+.asm_e372f
+ call Functione37be
+ and a
+ ret
+
+.asm_e3734
+ ld a, [MenuSelection]
+ dec a
+ ld e, a
+ ld a, [wCurBox]
+ cp e
+ ret z
+ callba Function14a83
+ ret
+
+.asm_e3745
+ ld b, $4
+ ld de, wd002
+ callba NamingScreen
+ call ClearTileMap
+ call LoadStandardFont
+ call LoadFontsBattleExtra
+ ld a, [MenuSelection]
+ dec a
+ call GetBoxName
+ ld e, l
+ ld d, h
+ ld hl, wd002
+ ld c, $8
+ call InitString
+ ld a, [MenuSelection]
+ dec a
+ call GetBoxName
+ ld de, wd002
+ call CopyName2
+ ret
+; e3778 (38:7778)
+
+ hlcoord 11, 7 ; XXX
+
+MenuDataHeader_0xe377b: ; 0xe377b
+ db $40 ; flags
+ db 04, 11 ; start coords
+ db 13, 19 ; end coords
+ dw MenuData2_0xe3783
+ db 1 ; default option
+; 0xe3783
+
+MenuData2_0xe3783: ; 0xe3783
+ db $80 ; flags
+ db 4 ; items
+ db "SWITCH@"
+ db "NAME@"
+ db "PRINT@"
+ db "QUIT@"
+; 0xe379c
+
+Functione379c: ; e379c (38:779c)
+ ld de, String_e37a1
+ jr Functione37e3
+; e37a1 (38:77a1)
+
+String_e37a1: ; e37a1
+ db "Choose a BOX.@"
+; e37af
+
+Functione37af: ; e37af (38:77af)
+ ld de, String_e37b4
+ jr Functione37e3
+; e37b4 (38:77b4)
+
+String_e37b4: ; e37b4
+ db "What's up?@"
+; e37be
+
+Functione37be: ; e37be (38:77be)
+ ld de, String_e37d3
+ call Functione37e3
+ ld de, SFX_WRONG
+ call WaitPlaySFX
+ call WaitSFX
+ ld c, 50
+ call DelayFrames
+ ret
+; e37d3 (38:77d3)
+
+String_e37d3: ; e37d3
+ db "There's no #MON.@"
+; e37e3
+
+Functione37e3: ; e37e3 (38:77e3)
+ push de
+ hlcoord 0, 14
+ lb bc, 2, 18
+ call TextBox
+ pop de
+ hlcoord 1, 16
+ call PlaceString
+ ld a, $1
+ ld [hBGMapMode], a
+ ret
diff --git a/engine/breeding/egg.asm b/engine/breeding/egg.asm
new file mode 100755
index 000000000..7c4d8ba62
--- /dev/null
+++ b/engine/breeding/egg.asm
@@ -0,0 +1,976 @@
+Function16e1d: ; 16e1d
+ call Function16ed6
+ ld c, $0
+ jp nc, .asm_16eb7
+ ld a, [wBreedMon1Species]
+ ld [CurPartySpecies], a
+ ld a, [wBreedMon1DVs]
+ ld [TempMonDVs], a
+ ld a, [wBreedMon1DVs + 1]
+ ld [TempMonDVs + 1], a
+ ld a, $3
+ ld [MonType], a
+ predef GetGender
+ jr c, .asm_16e70
+ ld b, $1
+ jr nz, .asm_16e48
+ inc b
+
+.asm_16e48
+ push bc
+ ld a, [wBreedMon2Species]
+ ld [CurPartySpecies], a
+ ld a, [wBreedMon2DVs]
+ ld [TempMonDVs], a
+ ld a, [wBreedMon2DVs + 1]
+ ld [TempMonDVs + 1], a
+ ld a, $3
+ ld [MonType], a
+ predef GetGender
+ pop bc
+ jr c, .asm_16e70
+ ld a, $1
+ jr nz, .asm_16e6d
+ inc a
+
+.asm_16e6d
+ cp b
+ jr nz, .asm_16e89
+
+.asm_16e70
+ ld c, $0
+ ld a, [wBreedMon1Species]
+ cp DITTO
+ jr z, .asm_16e82
+ ld a, [wBreedMon2Species]
+ cp DITTO
+ jr nz, .asm_16eb7
+ jr .asm_16e89
+
+.asm_16e82
+ ld a, [wBreedMon2Species]
+ cp DITTO
+ jr z, .asm_16eb7
+
+.asm_16e89
+ call Function16ebc
+ ld c, $ff
+ jp z, .asm_16eb7
+ ld a, [wBreedMon2Species]
+ ld b, a
+ ld a, [wBreedMon1Species]
+ cp b
+ ld c, $fe
+ jr z, .asm_16e9f
+ ld c, $80
+.asm_16e9f
+ ld a, [wBreedMon1ID]
+ ld b, a
+ ld a, [wBreedMon2ID]
+ cp b
+ jr nz, .asm_16eb7
+ ld a, [wBreedMon1ID + 1]
+ ld b, a
+ ld a, [wBreedMon2ID + 1]
+ cp b
+ jr nz, .asm_16eb7
+ ld a, c
+ sub $4d
+ ld c, a
+
+.asm_16eb7
+ ld a, c
+ ld [wd265], a
+ ret
+; 16ebc
+
+
+Function16ebc: ; 16ebc (5:6ebc)
+ ld a, [wBreedMon1DVs]
+ and $f
+ ld b, a
+ ld a, [wBreedMon2DVs]
+ and $f
+ cp b
+ ret nz
+ ld a, [wBreedMon1DVs + 1]
+ and $7
+ ld b, a
+ ld a, [wBreedMon2DVs + 1]
+ and $7
+ cp b
+ ret
+; 16ed6
+
+Function16ed6: ; 16ed6
+ ld a, [wBreedMon2Species]
+ ld [CurSpecies], a
+ call GetBaseData
+ ld a, [BaseEggGroups]
+ cp $ff
+ jr z, .asm_16f3a
+ ld a, [wBreedMon1Species]
+ ld [CurSpecies], a
+ call GetBaseData
+ ld a, [BaseEggGroups]
+ cp $ff
+ jr z, .asm_16f3a
+ ld a, [wBreedMon2Species]
+ cp DITTO
+ jr z, .asm_16f3c
+ ld [CurSpecies], a
+ call GetBaseData
+ ld a, [BaseEggGroups]
+ push af
+ and $f
+ ld b, a
+ pop af
+ and $f0
+ swap a
+ ld c, a
+ ld a, [wBreedMon1Species]
+ cp DITTO
+ jr z, .asm_16f3c
+ ld [CurSpecies], a
+ push bc
+ call GetBaseData
+ pop bc
+ ld a, [BaseEggGroups]
+ push af
+ and $f
+ ld d, a
+ pop af
+ and $f0
+ swap a
+ ld e, a
+ ld a, d
+ cp b
+ jr z, .asm_16f3c
+ cp c
+ jr z, .asm_16f3c
+ ld a, e
+ cp b
+ jr z, .asm_16f3c
+ cp c
+ jr z, .asm_16f3c
+
+.asm_16f3a
+ and a
+ ret
+
+.asm_16f3c
+ scf
+ ret
+; 16f3e
+
+DoEggStep:: ; 16f3e
+ ld de, PartySpecies
+ ld hl, PartyMon1Happiness
+ ld c, 0
+.loop
+ ld a, [de]
+ inc de
+ cp -1
+ ret z
+ cp EGG
+ jr nz, .next
+ dec [hl]
+ jr nz, .next
+ ld a, 1
+ and a
+ ret
+
+.next
+ push de
+ ld de, PARTYMON_STRUCT_LENGTH
+ add hl, de
+ pop de
+ jr .loop
+; 16f5e
+
+OverworldHatchEgg:: ; 16f5e
+ call ResetWindow
+ call LoadStandardMenuDataHeader
+ call Function16f70
+ call Function2b4d
+ call RestartMapMusic
+ jp LoadMoveSprites
+; 16f70
+
+Function16f70: ; 16f70 (5:6f70)
+ ld de, PartySpecies
+ ld hl, PartyMon1Happiness
+ xor a
+ ld [CurPartyMon], a
+
+Function16f7a: ; 16f7a (5:6f7a)
+ ld a, [de]
+ inc de
+ cp -1
+ jp z, Function1708a
+ push de
+ push hl
+ cp EGG
+ jp nz, Function1707d
+ ld a, [hl]
+ and a
+ jp nz, Function1707d
+ ld [hl], $78
+
+ push de
+
+ callba Function4dbb8
+ callba MobileFn_10608d
+ ld a, [CurPartyMon]
+ ld hl, PartyMons ; wdcdf (aliases: PartyMon1, PartyMon1Species)
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call AddNTimes
+ ld a, [hl]
+ ld [CurPartySpecies], a
+ dec a
+ call SetSeenAndCaughtMon
+
+ ld a, [CurPartySpecies]
+ cp TOGEPI
+ jr nz, .nottogepi
+ ; set the event flag for hatching togepi
+ ld de, EVENT_TOGEPI_HATCHED
+ ld b, SET_FLAG
+ call EventFlagAction
+.nottogepi
+
+ pop de
+
+ ld a, [CurPartySpecies]
+ dec de
+ ld [de], a
+ ld [wd265], a
+ ld [CurSpecies], a
+ call GetPokemonName
+ xor a
+ ld [wd26b], a
+ call GetBaseData
+ ld a, [CurPartyMon]
+ ld hl, PartyMons ; wdcdf (aliases: PartyMon1, PartyMon1Species)
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call AddNTimes
+ push hl
+ ld bc, MON_MAXHP
+ add hl, bc
+ ld d, h
+ ld e, l
+ pop hl
+ push hl
+ ld bc, MON_LEVEL
+ add hl, bc
+ ld a, [hl]
+ ld [CurPartyLevel], a
+ pop hl
+ push hl
+ ld bc, MON_STATUS
+ add hl, bc
+ xor a
+ ld [hli], a
+ ld [hl], a
+ pop hl
+ push hl
+ ld bc, MON_EXP + 2
+ add hl, bc
+ ld b, $0
+ predef CalcPkmnStats
+ pop bc
+ ld hl, MON_MAXHP
+ add hl, bc
+ ld d, h
+ ld e, l
+ ld hl, MON_HP
+ add hl, bc
+ ld a, [de]
+ inc de
+ ld [hli], a
+ ld a, [de]
+ ld [hl], a
+ ld hl, MON_ID
+ add hl, bc
+ ld a, [PlayerID]
+ ld [hli], a
+ ld a, [PlayerID + 1]
+ ld [hl], a
+ ld a, [CurPartyMon]
+ ld hl, PartyMonOT ; wddff (aliases: PartyMonOT)
+ ld bc, NAME_LENGTH
+ call AddNTimes
+ ld d, h
+ ld e, l
+ ld hl, PlayerName
+ call CopyBytes
+ ld hl, UnknownText_0x1708b
+ call PrintText
+ ld a, [CurPartyMon]
+ ld hl, PartyMonNicknames
+ ld bc, PKMN_NAME_LENGTH
+ call AddNTimes
+ ld d, h
+ ld e, l
+ push de
+ ld hl, UnknownText_0x170ba
+ call PrintText
+ call YesNoBox
+ pop de
+ jr c, .nonickname
+ ld a, $1
+ ld [wd26b], a
+ xor a
+ ld [MonType], a
+ push de
+ ld b, $0
+ callba NamingScreen
+ pop hl
+ ld de, StringBuffer1
+ call InitName
+ jr Function1707d
+.nonickname
+ ld hl, StringBuffer1
+ ld bc, PKMN_NAME_LENGTH
+ call CopyBytes
+
+Function1707d: ; 1707d (5:707d)
+ ld hl, CurPartyMon
+ inc [hl]
+ pop hl
+ ld de, PARTYMON_STRUCT_LENGTH
+ add hl, de
+ pop de
+ jp Function16f7a
+
+Function1708a: ; 1708a (5:708a)
+ ret
+; 1708b (5:708b)
+
+UnknownText_0x1708b: ; 0x1708b
+ ; Huh? @ @
+ text_jump UnknownText_0x1c0db0
+ start_asm
+; 0x17090
+
+Function17090: ; 17090
+ ld hl, VramState
+ res 0, [hl]
+ push hl
+ push de
+ push bc
+ ld a, [CurPartySpecies]
+ push af
+ call Function1728f
+ ld hl, UnknownText_0x170b0
+ call PrintText
+ pop af
+ ld [CurPartySpecies], a
+ pop bc
+ pop de
+ pop hl
+ ld hl, UnknownText_0x170b5
+ ret
+; 170b0 (5:70b0)
+
+UnknownText_0x170b0: ; 0x170b0
+ ;
+ text_jump UnknownText_0x1c0db8
+ db "@"
+; 0x170b5
+
+UnknownText_0x170b5: ; 0x170b5
+ ; came out of its EGG!@ @
+ text_jump UnknownText_0x1c0dba
+ db "@"
+; 0x170ba
+
+UnknownText_0x170ba: ; 0x170ba
+ ; Give a nickname to @ ?
+ text_jump UnknownText_0x1c0dd8
+ db "@"
+; 0x170bf
+
+Function170bf: ; 170bf
+ call Function17197
+ ld d, h
+ ld e, l
+ ld b, NUM_MOVES
+.loop
+ ld a, [de]
+ and a
+ jr z, .done
+ ld hl, wEggMonMoves
+ ld c, NUM_MOVES
+.next
+ ld a, [de]
+ cp [hl]
+ jr z, .skip
+ inc hl
+ dec c
+ jr nz, .next
+ call Function170e4
+ jr nc, .skip
+ call Function17169
+
+.skip
+ inc de
+ dec b
+ jr nz, .loop
+
+.done
+ ret
+; 170e4
+
+Function170e4: ; 170e4
+GLOBAL EggMoves
+
+ push bc
+ ld a, [wEggMonSpecies]
+ dec a
+ ld c, a
+ ld b, 0
+ ld hl, EggMovePointers
+rept 2
+ add hl, bc
+endr
+ ld a, BANK(EggMovePointers)
+ call GetFarHalfword
+.loop
+ ld a, BANK(EggMoves)
+ call GetFarByte
+ cp -1
+ jr z, .found_mon
+ ld b, a
+ ld a, [de]
+ cp b
+ jr z, .done_carry
+ inc hl
+ jr .loop
+
+.found_mon
+ call Function1720b
+ ld b, NUM_MOVES
+.loop2
+ ld a, [de]
+ cp [hl]
+ jr z, .found_eggmove
+ inc hl
+ dec b
+ jr z, .inherit_tmhm
+ jr .loop2
+
+.found_eggmove
+ ld a, [wEggMonSpecies]
+ dec a
+ ld c, a
+ ld b, 0
+ ld hl, EvosAttacksPointers
+rept 2
+ add hl, bc
+endr
+ ld a, BANK(EvosAttacksPointers)
+ call GetFarHalfword
+.loop3
+ ld a, BANK(EvosAttacks)
+ call GetFarByte
+ inc hl
+ and a
+ jr nz, .loop3
+.loop4
+ ld a, BANK(EvosAttacks)
+ call GetFarByte
+ and a
+ jr z, .inherit_tmhm
+ inc hl
+ ld a, BANK(EvosAttacks)
+ call GetFarByte
+ ld b, a
+ ld a, [de]
+ cp b
+ jr z, .done_carry
+ inc hl
+ jr .loop4
+
+.inherit_tmhm
+ ld hl, TMHMMoves
+.loop5
+ ld a, BANK(TMHMMoves)
+ call GetFarByte
+ inc hl
+ and a
+ jr z, .done
+ ld b, a
+ ld a, [de]
+ cp b
+ jr nz, .loop5
+ ld [wd262], a
+ predef CanLearnTMHMMove
+ ld a, c
+ and a
+ jr z, .done
+
+.done_carry
+ pop bc
+ scf
+ ret
+
+.done
+ pop bc
+ and a
+ ret
+; 17169
+
+Function17169: ; 17169
+ push de
+ push bc
+ ld a, [de]
+ ld b, a
+ ld hl, wEggMonMoves
+ ld c, NUM_MOVES
+.loop
+ ld a, [hli]
+ and a
+ jr z, .done
+ dec c
+ jr nz, .loop
+ ld de, wEggMonMoves
+ ld hl, wEggMonMoves + 1
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+
+.done
+ dec hl
+ ld [hl], b
+ ld hl, wEggMonMoves
+ ld de, wEggMonPP
+ predef FillPP
+ pop bc
+ pop de
+ ret
+; 17197
+
+Function17197: ; 17197
+ ld hl, wBreedMon2Moves
+ ld a, [wBreedMon1Species]
+ cp DITTO
+ jr z, .ditto1
+ ld a, [wBreedMon2Species]
+ cp DITTO
+ jr z, .ditto2
+ ld a, [wDittoInDaycare]
+ and a
+ ret z
+ ld hl, wBreedMon1Moves
+ ret
+
+.ditto1
+ ld a, [CurPartySpecies]
+ push af
+ ld a, [wBreedMon2Species]
+ ld [CurPartySpecies], a
+ ld a, [wBreedMon2DVs]
+ ld [TempMonDVs], a
+ ld a, [wBreedMon2DVs + 1]
+ ld [TempMonDVs + 1], a
+ ld a, $3
+ ld [MonType], a
+ predef GetGender
+ jr c, .inherit_mon2_moves
+ jr nz, .inherit_mon2_moves
+ jr .inherit_mon1_moves
+
+.ditto2
+ ld a, [CurPartySpecies]
+ push af
+ ld a, [wBreedMon1Species]
+ ld [CurPartySpecies], a
+ ld a, [wBreedMon1DVs]
+ ld [TempMonDVs], a
+ ld a, [wBreedMon1DVs + 1]
+ ld [TempMonDVs + 1], a
+ ld a, $3
+ ld [MonType], a
+ predef GetGender
+ jr c, .inherit_mon1_moves
+ jr nz, .inherit_mon1_moves
+
+.inherit_mon2_moves
+ ld hl, wBreedMon2Moves
+ pop af
+ ld [CurPartySpecies], a
+ ret
+
+.inherit_mon1_moves
+ ld hl, wBreedMon1Moves
+ pop af
+ ld [CurPartySpecies], a
+ ret
+; 1720b
+
+Function1720b: ; 1720b
+ ld hl, wBreedMon1Moves
+ ld a, [wBreedMon1Species]
+ cp DITTO
+ ret z
+ ld a, [wBreedMon2Species]
+ cp DITTO
+ jr z, .ditto
+ ld a, [wDittoInDaycare]
+ and a
+ ret z
+
+.ditto
+ ld hl, wBreedMon2Moves
+ ret
+; 17224
+
+
+Function17224: ; 17224 (5:7224)
+ push de
+ ld [CurPartySpecies], a
+ ld [CurSpecies], a
+ call GetBaseData
+ ld hl, BattleMonDVs
+ predef GetUnownLetter
+ pop de
+ predef_jump GetFrontpic
+
+Function1723c: ; 1723c (5:723c)
+ push de
+ ld [CurPartySpecies], a
+ ld [CurSpecies], a
+ call GetBaseData
+ ld hl, BattleMonDVs
+ predef GetUnownLetter
+ pop de
+ predef_jump Function5108b
+
+Function17254: ; 17254 (5:7254)
+ push af
+ call WaitTop
+ push hl
+ push bc
+ hlcoord 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ ld a, " "
+ call ByteFill
+ pop bc
+ pop hl
+ ld a, b
+ ld [hBGMapAddress + 1], a
+ ld a, c
+ ld [hFillBox], a
+ lb bc, 7, 7
+ predef FillBox
+ pop af
+ call Function17363
+ call SetPalettes
+ jp WaitBGMap
+
+Function1727f: ; 1727f (5:727f)
+ push hl
+ push de
+ push bc
+ callab Function8cf69
+ call DelayFrame
+ pop bc
+ pop de
+ pop hl
+ ret
+
+Function1728f: ; 1728f (5:728f)
+ ld a, [wd265]
+ ld [wJumptableIndex], a
+ ld a, [CurSpecies]
+ push af
+ ld de, MUSIC_NONE
+ call PlayMusic
+ callba Function8000
+ call DisableLCD
+ ld hl, EggHatchGFX
+ ld de, VTiles0 tile $00
+ ld bc, $20
+ ld a, BANK(EggHatchGFX)
+ call FarCopyBytes
+ callba Function8cf53
+ ld de, VTiles2 tile $00
+ ld a, [wJumptableIndex]
+ call Function1723c
+ ld de, VTiles2 tile $31
+ ld a, EGG
+ call Function17224
+ ld de, MUSIC_EVOLUTION
+ call PlayMusic
+ call EnableLCD
+ hlcoord 7, 4
+ ld b, $98
+ ld c, $31
+ ld a, EGG
+ call Function17254
+ ld c, $50
+ call DelayFrames
+ xor a
+ ld [wcf64], a
+ ld a, [hSCX]
+ ld b, a
+.asm_172ee
+ ld hl, wcf64
+ ld a, [hl]
+ inc [hl]
+ cp $8
+ jr nc, .asm_17327
+ ld e, [hl]
+.asm_172f8
+ ld a, $2
+ ld [hSCX], a
+ ld a, $fe
+ ld [wc3c0], a
+ call Function1727f
+ ld c, $2
+ call DelayFrames
+ ld a, $fe
+ ld [hSCX], a
+ ld a, $2
+ ld [wc3c0], a
+ call Function1727f
+ ld c, $2
+ call DelayFrames
+ dec e
+ jr nz, .asm_172f8
+ ld c, $10
+ call DelayFrames
+ call Function1736d
+ jr .asm_172ee
+.asm_17327
+ ld de, SFX_EGG_HATCH
+ call PlaySFX
+ xor a
+ ld [hSCX], a
+ ld [wc3c0], a
+ call ClearSprites
+ call Function173b3
+ hlcoord 6, 3
+ ld b, $98
+ ld c, $0
+ ld a, [wJumptableIndex]
+ call Function17254
+ call Function17418
+ call WaitSFX
+ ld a, [wJumptableIndex]
+ ld [CurPartySpecies], a
+ hlcoord 6, 3
+ ld d, $0
+ ld e, ANIM_MON_HATCH
+ predef AnimateFrontpic
+ pop af
+ ld [CurSpecies], a
+ ret
+
+Function17363: ; 17363 (5:7363)
+ ld [PlayerHPPal], a
+ ld b, $b
+ ld c, $0
+ jp GetSGBLayout
+
+Function1736d: ; 1736d (5:736d)
+ ld a, [wcf64]
+ dec a
+ and $7
+ cp $7
+ ret z
+ srl a
+ ret nc
+ swap a
+ srl a
+ add $4c
+ ld d, a
+ ld e, $58
+ ld a, $19
+ call Function3b2a
+ ld hl, $3
+ add hl, bc
+ ld [hl], $0
+ ld de, SFX_EGG_CRACK
+ jp PlaySFX
+; 17393 (5:7393)
+
+EggHatchGFX: ; 17393
+INCBIN "gfx/unknown/017393.2bpp"
+; 173b3
+
+Function173b3: ; 173b3 (5:73b3)
+ callba Function8cf53
+ ld hl, Unknown_173ef
+.loop
+ ld a, [hli]
+ cp $ff
+ jr z, .done
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+ push hl
+ push bc
+ ld a, $1c
+ call Function3b2a
+ ld hl, $3
+ add hl, bc
+ ld [hl], $0
+ pop de
+ ld a, e
+ ld hl, $1
+ add hl, bc
+ add [hl]
+ ld [hl], a
+ ld hl, $b
+ add hl, bc
+ ld [hl], d
+ pop hl
+ jr .loop
+.done
+ ld de, SFX_EGG_HATCH
+ call PlaySFX
+ call Function1727f
+ ret
+; 173ef (5:73ef)
+
+Unknown_173ef: ; 173ef
+; Probably OAM.
+ db $54, $48, $00, $3c
+ db $5c, $48, $01, $04
+ db $54, $50, $00, $30
+ db $5c, $50, $01, $10
+ db $54, $58, $02, $24
+ db $5c, $58, $03, $1c
+ db $50, $4c, $00, $36
+ db $60, $4c, $01, $0a
+ db $50, $54, $02, $2a
+ db $60, $54, $03, $16
+ db $ff
+; 17418
+
+Function17418: ; 17418 (5:7418)
+ ld c, $81
+.asm_1741a
+ call Function1727f
+ dec c
+ jr nz, .asm_1741a
+ ret
+
+Special_DayCareMon1: ; 17421
+ ld hl, UnknownText_0x17467
+ call PrintText
+ ld a, [wBreedMon1Species]
+ call PlayCry
+ ld a, [wDaycareLady]
+ bit 0, a
+ jr z, Function1745f
+ call KeepTextOpen
+ ld hl, wBreedMon2Nick
+ call Function1746c
+ jp PrintText
+
+Special_DayCareMon2: ; 17440
+ ld hl, UnknownText_0x17462
+ call PrintText
+ ld a, [wBreedMon2Species]
+ call PlayCry
+ ld a, [wDaycareMan]
+ bit 0, a
+ jr z, Function1745f
+ call KeepTextOpen
+ ld hl, wBreedMon1Nick
+ call Function1746c
+ jp PrintText
+
+Function1745f: ; 1745f
+ jp WaitPressAorB_BlinkCursor
+; 17462
+
+UnknownText_0x17462: ; 0x17462
+ ; It's @ that was left with the DAY-CARE LADY.
+ text_jump UnknownText_0x1c0df3
+ db "@"
+; 0x17467
+
+UnknownText_0x17467: ; 0x17467
+ ; It's @ that was left with the DAY-CARE MAN.
+ text_jump UnknownText_0x1c0e24
+ db "@"
+; 0x1746c
+
+Function1746c: ; 1746c
+ push bc
+ ld de, StringBuffer1
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ call Function16e1d
+ pop bc
+ ld a, [wd265]
+ ld hl, UnknownText_0x1749c
+ cp $ff
+ jr z, .asm_1749b
+ ld hl, UnknownText_0x174a1
+ and a
+ jr z, .asm_1749b
+ ld hl, UnknownText_0x174a6
+ cp 230
+ jr nc, .asm_1749b
+ cp 70
+ ld hl, UnknownText_0x174ab
+ jr nc, .asm_1749b
+ ld hl, UnknownText_0x174b0
+
+.asm_1749b
+ ret
+; 1749c
+
+UnknownText_0x1749c: ; 0x1749c
+ ; It's brimming with energy.
+ text_jump UnknownText_0x1c0e54
+ db "@"
+; 0x174a1
+
+UnknownText_0x174a1: ; 0x174a1
+ ; It has no interest in @ .
+ text_jump UnknownText_0x1c0e6f
+ db "@"
+; 0x174a6
+
+UnknownText_0x174a6: ; 0x174a6
+ ; It appears to care for @ .
+ text_jump UnknownText_0x1c0e8d
+ db "@"
+; 0x174ab
+
+UnknownText_0x174ab: ; 0x174ab
+ ; It's friendly with @ .
+ text_jump UnknownText_0x1c0eac
+ db "@"
+; 0x174b0
+
+UnknownText_0x174b0: ; 0x174b0
+ ; It shows interest in @ .
+ text_jump UnknownText_0x1c0ec6
+ db "@"
+; 0x174b5
+
+Function_174b5: ; 174b5
+ ld hl, String_174b9
+ ret
+; 174b9
+
+String_174b9: ; 174b9
+ db "@"
+; 174ba
+
diff --git a/engine/card_flip.asm b/engine/card_flip.asm
new file mode 100755
index 000000000..8ee1e5cd9
--- /dev/null
+++ b/engine/card_flip.asm
@@ -0,0 +1,2560 @@
+_CardFlip: ; e00ee (38:40ee)
+ ld hl, Options
+ set 4, [hl]
+ call ClearBGPalettes
+ call ClearTileMap
+ call ClearSprites
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call DelayFrame
+ call DisableLCD
+ call LoadStandardFont
+ call LoadFontsExtra
+ ld hl, LZ_e0d16
+ ld de, VTiles2 tile $00
+ call Decompress
+ ld hl, LZ_e0ea8
+ ld de, VTiles2 tile $3e
+ call Decompress
+ ld hl, LZ_e0cdb
+ ld de, VTiles0 tile $00
+ call Decompress
+ ld hl, GFX_e0cf6
+ ld de, VTiles1 tile $6f
+ ld bc, $10
+ call CopyBytes
+ ld hl, GFX_e0d06
+ ld de, VTiles1 tile $75
+ ld bc, $10
+ call CopyBytes
+ call Functione0521
+ call Functione04c1
+ call Functione0c37
+ call EnableLCD
+ call Function3200
+ ld a, $e4
+ call DmgToCgbBGPals
+ ld de, $e4e4
+ call DmgToCgbObjPals
+ call DelayFrame
+ xor a
+ ld [wJumptableIndex], a
+ ld a, $2
+ ld [wcf64], a
+ ld [wcf65], a
+ ld de, MUSIC_GAME_CORNER
+ call PlayMusic
+.MasterLoop
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .leavethegame
+ call .CardFlip
+ jr .MasterLoop
+.leavethegame
+ call WaitSFX
+ ld de, SFX_QUIT_SLOTS
+ call PlaySFX
+ call WaitSFX
+ call ClearBGPalettes
+ ld hl, Options
+ res 4, [hl]
+ ret
+
+.CardFlip: ; e0191 (38:4191)
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, 0
+ ld hl, .Jumptable
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; e01a0 (38:41a0)
+
+.Jumptable: ; e01a0
+ dw .AskPlayWithThree
+ dw .DeductCoins
+ dw .ChooseACard
+ dw .PlaceYourBet
+ dw .CheckTheCard
+ dw .TabulateTheResult
+ dw .PlayAgain
+ dw .Quit
+; e01b0
+
+.Increment: ; e01b0
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+; e01b5
+
+.AskPlayWithThree: ; e01b5
+ ld hl, .PlayWithThreeCoinsText
+ call Functione0489
+ call YesNoBox
+ jr c, .SaidNo
+ call Functione0366
+ call .Increment
+ ret
+
+.SaidNo
+ ld a, $7
+ ld [wJumptableIndex], a
+ ret
+; e01cd
+
+.PlayWithThreeCoinsText: ; 0xe01cd
+ ; Play with three coins?
+ text_jump UnknownText_0x1c5793
+ db "@"
+; 0xe01d2
+
+.DeductCoins: ; e01d2
+ ld a, [Coins]
+ ld h, a
+ ld a, [Coins + 1]
+ ld l, a
+ ld a, h
+ and a
+ jr nz, .deduct ; You have at least 256 coins.
+ ld a, l
+ cp 3
+ jr nc, .deduct ; You have at least 3 coins.
+ ld hl, .NotEnoughCoinsText
+ call Functione0489
+ ld a, $7
+ ld [wJumptableIndex], a
+ ret
+
+.deduct
+ ld de, -3
+ add hl, de
+ ld a, h
+ ld [Coins], a
+ ld a, l
+ ld [Coins + 1], a
+ ld de, SFX_TRANSACTION
+ call PlaySFX
+ xor a
+ ld [hBGMapMode], a
+ call Functione049c
+ ld a, $1
+ ld [hBGMapMode], a
+ call WaitSFX
+ call .Increment
+ ret
+; e0212
+
+.NotEnoughCoinsText: ; 0xe0212
+ ; Not enough coins…
+ text_jump UnknownText_0x1c57ab
+ db "@"
+; 0xe0217
+
+.ChooseACard: ; e0217
+ xor a
+ ld [hBGMapMode], a
+ hlcoord 0, 0
+ lb bc, 12, 9
+ call Functione04e5
+ hlcoord 9, 0
+ ld bc, SCREEN_WIDTH
+ ld a, [wc6e8]
+ call AddNTimes
+ ld [hl], $f5
+ ld a, $1
+ ld [hBGMapMode], a
+ ld c, 20
+ call DelayFrames
+ hlcoord 2, 0
+ call Functione03c1
+ ld a, $1
+ ld [hBGMapMode], a
+ ld c, 20
+ call DelayFrames
+ hlcoord 2, 6
+ call Functione03c1
+ call WaitBGMap
+ ld hl, .ChooseACardText
+ call Functione0489
+ xor a
+ ld [wcf66], a
+.loop
+ call JoyTextDelay
+ ld a, [hJoyLast]
+ and A_BUTTON
+ jr nz, .next
+ ld de, SFX_KINESIS
+ call PlaySFX
+ call Functione0849
+ ld c, 4
+ call DelayFrames
+ ld hl, wcf66
+ ld a, [hl]
+ xor $1
+ ld [hl], a
+ jr .loop
+
+.next
+ ld de, SFX_SLOT_MACHINE_START
+ call PlaySFX
+ ld a, $3
+.loop2
+ push af
+ call Functione0849
+ ld c, 4
+ call DelayFrames
+ call ClearSprites
+ ld c, 4
+ call DelayFrames
+ pop af
+ dec a
+ jr nz, .loop2
+ ld hl, wcf66
+ ld a, [hl]
+ push af
+ xor $1
+ ld [hl], a
+ call Functione03ac
+ lb bc, 6, 5
+ call Functione04e5
+ pop af
+ ld [wcf66], a
+ call .Increment
+ ret
+; e02b2
+
+.ChooseACardText: ; 0xe02b2
+ ; Choose a card.
+ text_jump UnknownText_0x1c57be
+ db "@"
+; 0xe02b7
+
+.PlaceYourBet: ; e02b7
+ ld hl, .PlaceYourBetText
+ call Functione0489
+.betloop
+ call JoyTextDelay
+ ld a, [hJoyLast]
+ and A_BUTTON
+ jr nz, .betdone
+ call Functione089c
+ call Functione0960
+ call DelayFrame
+ jr .betloop
+
+.betdone
+ call .Increment
+ ret
+; e02d5
+
+.PlaceYourBetText: ; 0xe02d5
+ ; Place your bet.
+ text_jump UnknownText_0x1c57ce
+ db "@"
+; 0xe02da
+
+.CheckTheCard: ; e02da
+ xor a
+ ld [hVBlankCounter], a
+ call Functione0960
+ call WaitSFX
+ ld de, SFX_CHOOSE_A_CARD
+ call PlaySFX
+ call WaitSFX
+ ld a, [wc6e8]
+ ld e, a
+ ld d, 0
+ ld hl, wc6d0
+rept 2
+ add hl, de
+endr
+ ld a, [wcf66]
+ ld e, a
+ add hl, de
+ ld a, [hl]
+ ld [CurEnemyMoveNum], a
+ ld e, a
+ ld hl, wc6ea
+ add hl, de
+ ld [hl], $1
+ call Functione03ac
+ call Functione03ec
+ call Function3200
+ call .Increment
+ ret
+; e0314
+
+.TabulateTheResult: ; e0314
+ call Functione0637
+ call WaitPressAorB_BlinkCursor
+ call .Increment
+ ret
+; e031e
+
+.PlayAgain: ; e031e
+ call ClearSprites
+ ld hl, .PlayAgainText
+ call Functione0489
+ call YesNoBox
+ jr nc, .Continue
+ call .Increment
+ ret
+
+.Continue
+ ld a, [wc6e8]
+ inc a
+ ld [wc6e8], a
+ cp $c
+ jr c, .KeepTheCurrentDeck
+ call Functione04c1
+ ld a, $1
+ ld [hBGMapMode], a
+ call Functione0366
+ ld hl, .CardsShuffledText
+ call PrintText
+ jr .LoopAround
+
+.KeepTheCurrentDeck
+ call Functione0534
+
+.LoopAround
+ ld a, $1
+ ld [wJumptableIndex], a
+ ret
+; e0356
+
+.PlayAgainText: ; 0xe0356
+ ; Want to play again?
+ text_jump UnknownText_0x1c57df
+ db "@"
+; 0xe035b
+
+.CardsShuffledText: ; 0xe035b
+ ; The cards have been shuffled.
+ text_jump UnknownText_0x1c57f4
+ db "@"
+; 0xe0360
+
+.Quit: ; e0360
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+; e0366
+
+Functione0366: ; e0366
+ ld hl, wc6d0
+ ld bc, $18
+ xor a
+ call ByteFill
+ ld de, wc6d0
+ ld c, $17
+.asm_e0375
+ call Random
+ and $1f
+ cp $18
+ jr nc, .asm_e0375
+ ld l, a
+ ld h, $0
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .asm_e0375
+ ld [hl], c
+ dec c
+ jr nz, .asm_e0375
+ xor a
+ ld [wc6e8], a
+ ld hl, wc6ea
+ ld bc, $18
+ call ByteFill
+ ret
+; e0398
+
+Functione0398: ; e0398
+ ld hl, 0
+ ld bc, 6
+ ld a, [wcf64]
+ call AddNTimes
+ ld b, $0
+ ld a, [wcf65]
+ ld c, a
+ add hl, bc
+ ret
+; e03ac
+
+Functione03ac: ; e03ac
+ ld a, [wcf66]
+ and a
+ jr nz, .asm_e03ba
+ hlcoord 2, 0
+ ld bc, $1018
+ jr .asm_e03c0
+
+.asm_e03ba
+ hlcoord 2, 6
+ ld bc, $4018
+
+.asm_e03c0
+ ret
+; e03c1
+
+Functione03c1: ; e03c1
+ xor a
+ ld [hBGMapMode], a
+ ld de, Unknown_e03ce
+ lb bc, 6, 5
+ call Functione04f7
+ ret
+; e03ce
+
+Unknown_e03ce: ; e03ce
+ db $08, $09, $09, $09, $0a
+ db $0b, $28, $2b, $28, $0c
+ db $0b, $2c, $2d, $2e, $0c
+ db $0b, $2f, $30, $31, $0c
+ db $0b, $32, $33, $34, $0c
+ db $0d, $0e, $0e, $0e, $0f
+; e03ec
+
+Functione03ec: ; e03ec
+ xor a
+ ld [hBGMapMode], a
+ push hl
+ push hl
+ ld de, Unknown_e043b
+ lb bc, 6, 5
+ call Functione04f7
+ ld a, [CurEnemyMoveNum]
+ ld e, a
+ ld d, 0
+ ld hl, Unknown_e0459
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld e, a
+ ld d, [hl]
+ pop hl
+ ld bc, $17
+ add hl, bc
+ ld [hl], e
+ ld bc, SCREEN_HEIGHT
+ add hl, bc
+ ld a, d
+ ld de, SCREEN_WIDTH
+ ld b, $3
+.asm_e0418
+ push hl
+ ld c, $3
+.asm_e041b
+ ld [hli], a
+ inc a
+ dec c
+ jr nz, .asm_e041b
+ pop hl
+ add hl, de
+ dec b
+ jr nz, .asm_e0418
+ pop hl
+ ld a, [hCGB]
+ and a
+ ret z
+ ld de, AttrMap - TileMap
+ add hl, de
+ ld a, [CurEnemyMoveNum]
+ and 3
+ inc a
+ lb bc, 6, 5
+ call Functione04e7
+ ret
+; e043b
+
+Unknown_e043b: ; e043b
+ db $18, $19, $19, $19, $1a
+ db $1b, $35, $7f, $7f, $1c
+ db $0b, $28, $28, $28, $0c
+ db $0b, $28, $28, $28, $0c
+ db $0b, $28, $28, $28, $0c
+ db $1d, $1e, $1e, $1e, $1f
+; e0459
+
+Unknown_e0459: ; e0459
+ db $f7,$4e, $f7,$57, $f7,$69, $f7,$60
+ db $f8,$4e, $f8,$57, $f8,$69, $f8,$60
+ db $f9,$4e, $f9,$57, $f9,$69, $f9,$60
+ db $fa,$4e, $fa,$57, $fa,$69, $fa,$60
+ db $fb,$4e, $fb,$57, $fb,$69, $fb,$60
+ db $fc,$4e, $fc,$57, $fc,$69, $fc,$60
+; e0489
+
+Functione0489: ; e0489
+ push hl
+ hlcoord 0, 12
+ ld b, $4
+ ld c, $12
+ call TextBox
+ pop hl
+ call PrintTextBoxText
+ call Functione049c
+ ret
+; e049c
+
+Functione049c: ; e049c
+ hlcoord 9, 15
+ ld b, $1
+ ld c, $9
+ call TextBox
+ hlcoord 10, 16
+ ld de, String_e04bc
+ call PlaceString
+ hlcoord 15, 16
+ ld de, Coins
+ lb bc, PRINTNUM_LEADINGZEROS | 2, 4
+ call PrintNum
+ ret
+; e04bc
+
+String_e04bc:
+ db "COIN@"
+; e04c1
+
+Functione04c1: ; e04c1 (38:44c1)
+ xor a
+ ld [hBGMapMode], a
+ hlcoord 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ ld a, $29
+ call ByteFill
+ hlcoord 9, 0
+ ld de, Unknown_e110c
+ lb bc, 12, 11
+ call Functione04f7
+ hlcoord 0, 12
+ lb bc, 4, 18
+ call TextBox
+ ret
+; e04e5 (38:44e5)
+
+Functione04e5: ; e04e5
+ ld a, $29
+
+Functione04e7: ; e04e7 (38:44e7)
+ push bc
+ push hl
+.asm_e04e9
+ ld [hli], a
+ dec c
+ jr nz, .asm_e04e9
+ pop hl
+ ld bc, $14
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, Functione04e7
+ ret
+
+Functione04f7: ; e04f7 (38:44f7)
+ push bc
+ push hl
+.asm_e04f9
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .asm_e04f9
+ pop hl
+ ld bc, $14
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, Functione04f7
+ ret
+; e0509 (38:4509)
+
+Functione0509: ; e0509
+ ld de, Sprites
+ ld a, [hli]
+.asm_e050d
+ push af
+ ld a, [hli]
+ add b
+ ld [de], a
+ inc de
+ ld a, [hli]
+ add c
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ pop af
+ dec a
+ jr nz, .asm_e050d
+ ret
+; e0521
+
+Functione0521: ; e0521 (38:4521)
+ ld de, VTiles1 tile $76
+ ld hl, $8f62
+ ld bc, $9e
+ call CopyBytes
+ ld hl, $8ffe
+ xor a
+ ld [hli], a
+ ld [hl], a
+ ret
+; e0534 (38:4534)
+
+Functione0534: ; e0534
+ xor a
+ ld [hBGMapMode], a
+ ld a, [CurEnemyMoveNum]
+ ld e, a
+ ld d, 0
+ and 3
+ ld c, a
+ ld b, 0
+ ld a, e
+ and $1c
+ srl a
+ add Jumptable_e0553 % $100
+ ld l, a
+ ld a, 0
+ adc Jumptable_e0553 / $100
+ ld h, a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; e0553
+
+Jumptable_e0553: ; e0553
+ dw Functione055f
+ dw Functione0583
+ dw Functione05a7
+ dw Functione05cb
+ dw Functione05ef
+ dw Functione0613
+; e055f
+
+Functione055f: ; e055f
+ ld hl, wc6e6 + 8
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .asm_e0575
+ hlcoord 13, 3
+rept 2
+ add hl, bc
+endr
+ ld [hl], $36
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $37
+ ret
+
+.asm_e0575
+ hlcoord 13, 3
+rept 2
+ add hl, bc
+endr
+ ld [hl], $36
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3d
+ ret
+; e0583
+
+Functione0583: ; e0583
+ ld hl, wc6e6
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .asm_e0599
+ hlcoord 13, 4
+rept 2
+ add hl, bc
+endr
+ ld [hl], $3b
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3a
+ ret
+
+.asm_e0599
+ hlcoord 13, 4
+rept 2
+ add hl, bc
+endr
+ ld [hl], $3d
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3a
+ ret
+; e05a7
+
+Functione05a7: ; e05a7
+ ld hl, wc6e6 + 8
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .asm_e05bd
+ hlcoord 13, 6
+rept 2
+ add hl, bc
+endr
+ ld [hl], $36
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $38
+ ret
+
+.asm_e05bd
+ hlcoord 13, 6
+rept 2
+ add hl, bc
+endr
+ ld [hl], $36
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3d
+ ret
+; e05cb
+
+Functione05cb: ; e05cb
+ ld hl, wc6e6
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .asm_e05e1
+ hlcoord 13, 7
+rept 2
+ add hl, bc
+endr
+ ld [hl], $3c
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3a
+ ret
+
+.asm_e05e1
+ hlcoord 13, 7
+rept 2
+ add hl, bc
+endr
+ ld [hl], $3d
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3a
+ ret
+; e05ef
+
+Functione05ef: ; e05ef
+ ld hl, wc6e6 + 8
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .asm_e0605
+ hlcoord 13, 9
+rept 2
+ add hl, bc
+endr
+ ld [hl], $36
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $39
+ ret
+
+.asm_e0605
+ hlcoord 13, 9
+rept 2
+ add hl, bc
+endr
+ ld [hl], $36
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3d
+ ret
+; e0613
+
+Functione0613: ; e0613
+ ld hl, wc6e6
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .asm_e0629
+ hlcoord 13, 10
+rept 2
+ add hl, bc
+endr
+ ld [hl], $3c
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3a
+ ret
+
+.asm_e0629
+ hlcoord 13, 10
+rept 2
+ add hl, bc
+endr
+ ld [hl], $3d
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3a
+ ret
+; e0637
+
+Functione0637: ; e0637
+ call Functione0398
+ add hl, hl
+ ld de, Jumptable_e0643
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; e0643
+
+Jumptable_e0643: ; e0643
+ dw Functione06a3
+ dw Functione06a3
+ dw Functione06a6
+ dw Functione06a6
+ dw Functione06b0
+ dw Functione06b0
+ dw Functione06a3
+ dw Functione06a3
+ dw Functione06ec
+ dw Functione06f6
+ dw Functione0702
+ dw Functione070e
+ dw Functione06c2
+ dw Functione0722
+ dw Functione0770
+ dw Functione0774
+ dw Functione0778
+ dw Functione077c
+ dw Functione06c2
+ dw Functione072c
+ dw Functione0780
+ dw Functione0784
+ dw Functione0788
+ dw Functione078c
+ dw Functione06cc
+ dw Functione0738
+ dw Functione0790
+ dw Functione0794
+ dw Functione0798
+ dw Functione079c
+ dw Functione06cc
+ dw Functione0744
+ dw Functione07a0
+ dw Functione07a4
+ dw Functione07a8
+ dw Functione07ac
+ dw Functione06d8
+ dw Functione0750
+ dw Functione07b0
+ dw Functione07b4
+ dw Functione07b8
+ dw Functione07bc
+ dw Functione06d8
+ dw Functione075c
+ dw Functione07c0
+ dw Functione07c4
+ dw Functione07c8
+ dw Functione07cc
+; e06a3
+
+Functione06a3: ; e06a3
+ jp Functione07db
+; e06a6
+
+Functione06a6: ; e06a6
+ ld a, [CurEnemyMoveNum]
+ and $2
+ jp nz, Functione07db
+ jr Functione06ba
+
+Functione06b0: ; e06b0
+ ld a, [CurEnemyMoveNum]
+ and $2
+ jr nz, Functione06ba
+ jp Functione07db
+
+Functione06ba: ; e06ba
+ ld c, $6
+ ld de, SFX_2ND_PLACE
+ jp Functione07eb
+; e06c2
+
+Functione06c2: ; e06c2
+ ld a, [CurEnemyMoveNum]
+ and $18
+ jr z, Functione06e4
+ jp Functione07db
+
+Functione06cc: ; e06cc
+ ld a, [CurEnemyMoveNum]
+ and $18
+ cp $8
+ jr z, Functione06e4
+ jp Functione07db
+
+Functione06d8: ; e06d8
+ ld a, [CurEnemyMoveNum]
+ and $18
+ cp $10
+ jr z, Functione06e4
+ jp Functione07db
+
+Functione06e4: ; e06e4
+ ld c, $9
+ ld de, SFX_2ND_PLACE
+ jp Functione07eb
+; e06ec
+
+Functione06ec: ; e06ec
+ ld a, [CurEnemyMoveNum]
+ and $3
+ jr z, Functione071a
+ jp Functione07db
+
+Functione06f6: ; e06f6
+ ld a, [CurEnemyMoveNum]
+ and $3
+ cp $1
+ jr z, Functione071a
+ jp Functione07db
+
+Functione0702: ; e0702
+ ld a, [CurEnemyMoveNum]
+ and $3
+ cp $2
+ jr z, Functione071a
+ jp Functione07db
+
+Functione070e: ; e070e
+ ld a, [CurEnemyMoveNum]
+ and $3
+ cp $3
+ jr z, Functione071a
+ jp Functione07db
+
+Functione071a: ; e071a
+ ld c, $c
+ ld de, SFX_2ND_PLACE
+ jp Functione07eb
+; e0722
+
+Functione0722: ; e0722
+ ld a, [CurEnemyMoveNum]
+ and $1c
+ jr z, Functione0768
+ jp Functione07db
+
+Functione072c: ; e072c
+ ld a, [CurEnemyMoveNum]
+ and $1c
+ cp $4
+ jr z, Functione0768
+ jp Functione07db
+
+Functione0738: ; e0738
+ ld a, [CurEnemyMoveNum]
+ and $1c
+ cp $8
+ jr z, Functione0768
+ jp Functione07db
+
+Functione0744: ; e0744
+ ld a, [CurEnemyMoveNum]
+ and $1c
+ cp $c
+ jr z, Functione0768
+ jp Functione07db
+
+Functione0750: ; e0750
+ ld a, [CurEnemyMoveNum]
+ and $1c
+ cp $10
+ jr z, Functione0768
+ jp Functione07db
+
+Functione075c: ; e075c
+ ld a, [CurEnemyMoveNum]
+ and $1c
+ cp $14
+ jr z, Functione0768
+ jp Functione07db
+
+Functione0768: ; e0768
+ ld c, $12
+ ld de, SFX_2ND_PLACE
+ jp Functione07eb
+; e0770
+
+
+Functione0770: ; e0770
+ ld e, $0
+ jr Functione07ce
+
+Functione0774: ; e0774
+ ld e, $1
+ jr Functione07ce
+
+Functione0778: ; e0778
+ ld e, $2
+ jr Functione07ce
+
+Functione077c: ; e077c
+ ld e, $3
+ jr Functione07ce
+
+Functione0780: ; e0780
+ ld e, $4
+ jr Functione07ce
+
+Functione0784: ; e0784
+ ld e, $5
+ jr Functione07ce
+
+Functione0788: ; e0788
+ ld e, $6
+ jr Functione07ce
+
+Functione078c: ; e078c
+ ld e, $7
+ jr Functione07ce
+
+Functione0790: ; e0790
+ ld e, $8
+ jr Functione07ce
+
+Functione0794: ; e0794
+ ld e, $9
+ jr Functione07ce
+
+Functione0798: ; e0798
+ ld e, $a
+ jr Functione07ce
+
+Functione079c: ; e079c
+ ld e, $b
+ jr Functione07ce
+
+Functione07a0: ; e07a0
+ ld e, $c
+ jr Functione07ce
+
+Functione07a4: ; e07a4
+ ld e, $d
+ jr Functione07ce
+
+Functione07a8: ; e07a8
+ ld e, $e
+ jr Functione07ce
+
+Functione07ac: ; e07ac
+ ld e, $f
+ jr Functione07ce
+
+Functione07b0: ; e07b0
+ ld e, $10
+ jr Functione07ce
+
+Functione07b4: ; e07b4
+ ld e, $11
+ jr Functione07ce
+
+Functione07b8: ; e07b8
+ ld e, $12
+ jr Functione07ce
+
+Functione07bc: ; e07bc
+ ld e, $13
+ jr Functione07ce
+
+Functione07c0: ; e07c0
+ ld e, $14
+ jr Functione07ce
+
+Functione07c4: ; e07c4
+ ld e, $15
+ jr Functione07ce
+
+Functione07c8: ; e07c8
+ ld e, $16
+ jr Functione07ce
+
+Functione07cc: ; e07cc
+ ld e, $17
+
+Functione07ce: ; e07ce
+ ld a, [CurEnemyMoveNum]
+ cp e
+ jr nz, Functione07db
+ ld c, $48
+ ld de, SFX_2ND_PLACE
+ jr Functione07eb
+
+Functione07db: ; e07db
+ ld de, SFX_WRONG
+ call PlaySFX
+ ld hl, UnknownText_0xe0816
+ call Functione0489
+ call WaitSFX
+ ret
+
+Functione07eb: ; e07eb
+ push bc
+ push de
+ ld hl, UnknownText_0xe0811
+ call Functione0489
+ pop de
+ call PlaySFX
+ call WaitSFX
+ pop bc
+.asm_e07fb
+ push bc
+ call Functione0833
+ jr c, .asm_e0804
+ call Functione081b
+
+.asm_e0804
+ call Functione049c
+ ld c, 2
+ call DelayFrames
+ pop bc
+ dec c
+ jr nz, .asm_e07fb
+ ret
+; e0811
+
+UnknownText_0xe0811: ; 0xe0811
+ ; Yeah!
+ text_jump UnknownText_0x1c5813
+ db "@"
+; 0xe0816
+
+UnknownText_0xe0816: ; 0xe0816
+ ; Darn…
+ text_jump UnknownText_0x1c581a
+ db "@"
+; 0xe081b
+
+Functione081b: ; e081b
+ ld a, [Coins]
+ ld h, a
+ ld a, [Coins + 1]
+ ld l, a
+ inc hl
+ ld a, h
+ ld [Coins], a
+ ld a, l
+ ld [Coins + 1], a
+ ld de, SFX_PAY_DAY
+ call PlaySFX
+ ret
+; e0833
+
+Functione0833: ; e0833
+ ld a, [Coins]
+ cp 9999 / $100
+ jr c, .asm_e0847
+ jr z, .asm_e083e
+ jr .asm_e0845
+
+.asm_e083e
+ ld a, [Coins + 1]
+ cp 9999 % $100
+ jr c, .asm_e0847
+
+.asm_e0845
+ scf
+ ret
+
+.asm_e0847
+ and a
+ ret
+; e0849
+
+Functione0849: ; e0849
+ call Functione03ac
+ ld hl, Unknown_e0853
+ call Functione0509
+ ret
+; e0853
+
+Unknown_e0853: ; e0853
+ db 18
+ db $00, $00, $04, $00
+ db $00, $08, $06, $00
+ db $00, $10, $06, $00
+ db $00, $18, $06, $00
+ db $00, $20, $04, $20
+ db $08, $00, $05, $00
+ db $08, $20, $05, $20
+ db $10, $00, $05, $00
+ db $10, $20, $05, $20
+ db $18, $00, $05, $00
+ db $18, $20, $05, $20
+ db $20, $00, $05, $00
+ db $20, $20, $05, $20
+ db $28, $00, $04, $40
+ db $28, $08, $06, $40
+ db $28, $10, $06, $40
+ db $28, $18, $06, $40
+ db $28, $20, $04, $60
+; e089c
+
+Functione089c: ; e089c
+ ld hl, hJoyLast
+ ld a, [hl]
+ and D_LEFT
+ jp nz, Functione08b8
+ ld a, [hl]
+ and D_RIGHT
+ jp nz, Functione08ef
+ ld a, [hl]
+ and D_UP
+ jp nz, Functione090a
+ ld a, [hl]
+ and D_DOWN
+ jp nz, Functione093d
+ ret
+; e08b8
+
+Functione08b8: ; e08b8
+ ld hl, wcf65
+ ld a, [wcf64]
+ and a
+ jr z, .asm_e08d5
+ cp $1
+ jr z, .asm_e08cc
+ ld a, [hl]
+ and a
+ ret z
+ dec [hl]
+ jp Functione0959
+
+.asm_e08cc
+ ld a, [hl]
+ cp $3
+ jr c, .asm_e08e2
+ dec [hl]
+ jp Functione0959
+
+.asm_e08d5
+ ld a, [hl]
+ and $e
+ ld [hl], a
+ cp $3
+ jr c, .asm_e08e2
+rept 2
+ dec [hl]
+endr
+ jp Functione0959
+
+.asm_e08e2
+ ld a, $2
+ ld [wcf64], a
+ ld a, $1
+ ld [wcf65], a
+ jp Functione0959
+; e08ef
+
+Functione08ef: ; e08ef
+ ld hl, wcf65
+ ld a, [wcf64]
+ and a
+ jr z, .asm_e08ff
+ ld a, [hl]
+ cp $5
+ ret nc
+ inc [hl]
+ jr Functione0959
+
+.asm_e08ff
+ ld a, [hl]
+ and $e
+ ld [hl], a
+ cp $4
+ ret nc
+rept 2
+ inc [hl]
+endr
+ jr Functione0959
+
+Functione090a: ; e090a
+ ld hl, wcf64
+ ld a, [wcf65]
+ and a
+ jr z, .asm_e0925
+ cp $1
+ jr z, .asm_e091d
+ ld a, [hl]
+ and a
+ ret z
+ dec [hl]
+ jr Functione0959
+
+.asm_e091d
+ ld a, [hl]
+ cp $3
+ jr c, .asm_e0931
+ dec [hl]
+ jr Functione0959
+
+.asm_e0925
+ ld a, [hl]
+ and $e
+ ld [hl], a
+ cp $3
+ jr c, .asm_e0931
+rept 2
+ dec [hl]
+endr
+ jr Functione0959
+
+.asm_e0931
+ ld a, $1
+ ld [wcf64], a
+ ld a, $2
+ ld [wcf65], a
+ jr Functione0959
+
+Functione093d: ; e093d
+ ld hl, wcf64
+ ld a, [wcf65]
+ and a
+ jr z, .asm_e0950
+ ld hl, wcf64
+ ld a, [hl]
+ cp $7
+ ret nc
+ inc [hl]
+ jr Functione0959
+
+.asm_e0950
+ ld a, [hl]
+ and $e
+ ld [hl], a
+ cp $6
+ ret nc
+rept 2
+ inc [hl]
+endr
+
+Functione0959: ; e0959
+ ld de, SFX_POKEBALLS_PLACED_ON_TABLE
+ call PlaySFX
+ ret
+; e0960
+
+Functione0960: ; e0960
+ call ClearSprites
+ ld a, [hCGB]
+ and a
+ jr nz, .asm_e096d
+ ld a, [hVBlankCounter]
+ and $4
+ ret nz
+
+.asm_e096d
+ call Functione0398
+rept 2
+ add hl, hl
+endr
+ ld de, Unknown_e0981
+ add hl, de
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call Functione0509
+ ret
+; e0981
+
+Unknown_e0981: ; e0981
+ dbbw $58, $10, Unknown_e0c26
+ dbbw $60, $10, Unknown_e0c26
+ dbbw $68, $10, Unknown_e0b8d
+ dbbw $68, $10, Unknown_e0b8d
+ dbbw $88, $10, Unknown_e0b8d
+ dbbw $88, $10, Unknown_e0b8d
+
+ dbbw $58, $18, Unknown_e0c26
+ dbbw $60, $18, Unknown_e0c26
+ dbbw $68, $18, Unknown_e0a5a
+ dbbw $78, $18, Unknown_e0a5a
+ dbbw $88, $18, Unknown_e0a5a
+ dbbw $98, $18, Unknown_e0a5a
+
+ dbbw $58, $28, Unknown_e0b14
+ dbbw $60, $28, Unknown_e0ac3
+ dbbw $68, $28, Unknown_e0a41
+ dbbw $78, $28, Unknown_e0a41
+ dbbw $88, $28, Unknown_e0a41
+ dbbw $98, $28, Unknown_e0a41
+ dbbw $58, $28, Unknown_e0b14
+
+ dbbw $60, $34, Unknown_e0ac3
+ dbbw $68, $34, Unknown_e0a41
+ dbbw $78, $34, Unknown_e0a41
+ dbbw $88, $34, Unknown_e0a41
+ dbbw $98, $34, Unknown_e0a41
+
+ dbbw $58, $40, Unknown_e0b14
+ dbbw $60, $40, Unknown_e0ac3
+ dbbw $68, $40, Unknown_e0a41
+ dbbw $78, $40, Unknown_e0a41
+ dbbw $88, $40, Unknown_e0a41
+ dbbw $98, $40, Unknown_e0a41
+ dbbw $58, $40, Unknown_e0b14
+
+ dbbw $60, $4c, Unknown_e0ac3
+ dbbw $68, $4c, Unknown_e0a41
+ dbbw $78, $4c, Unknown_e0a41
+ dbbw $88, $4c, Unknown_e0a41
+ dbbw $98, $4c, Unknown_e0a41
+
+ dbbw $58, $58, Unknown_e0b14
+ dbbw $60, $58, Unknown_e0ac3
+ dbbw $68, $58, Unknown_e0a41
+ dbbw $78, $58, Unknown_e0a41
+ dbbw $88, $58, Unknown_e0a41
+ dbbw $98, $58, Unknown_e0a41
+ dbbw $58, $58, Unknown_e0b14
+
+ dbbw $60, $64, Unknown_e0ac3
+ dbbw $68, $64, Unknown_e0a41
+ dbbw $78, $64, Unknown_e0a41
+ dbbw $88, $64, Unknown_e0a41
+ dbbw $98, $64, Unknown_e0a41
+; e0a41
+
+Unknown_e0a41: ; e0a41
+ db 6
+ db $00, $ff, $00, $80
+ db $00, $00, $02, $80
+ db $00, $08, $03, $80
+ db $05, $ff, $00, $c0
+ db $05, $00, $02, $c0
+ db $05, $08, $03, $80
+
+Unknown_e0a5a: ; e0a5a
+ db 26
+ db $00, $ff, $00, $80
+ db $00, $00, $02, $80
+ db $00, $08, $00, $a0
+ db $08, $ff, $01, $80
+ db $08, $08, $01, $a0
+ db $10, $ff, $01, $80
+ db $10, $08, $03, $80
+ db $18, $ff, $01, $80
+ db $18, $08, $03, $80
+ db $20, $ff, $01, $80
+ db $20, $08, $03, $80
+ db $28, $ff, $01, $80
+ db $28, $08, $03, $80
+ db $30, $ff, $01, $80
+ db $30, $08, $03, $80
+ db $38, $ff, $01, $80
+ db $38, $08, $03, $80
+ db $40, $ff, $01, $80
+ db $40, $08, $03, $80
+ db $48, $ff, $01, $80
+ db $48, $08, $03, $80
+ db $50, $ff, $01, $80
+ db $50, $08, $03, $80
+ db $51, $ff, $00, $c0
+ db $51, $00, $02, $c0
+ db $51, $08, $03, $80
+
+Unknown_e0ac3: ; e0ac3
+ db 20
+ db $00, $ff, $00, $80
+ db $00, $00, $02, $80
+ db $00, $08, $02, $80
+ db $00, $10, $03, $80
+ db $00, $18, $02, $80
+ db $00, $20, $03, $80
+ db $00, $28, $02, $80
+ db $00, $30, $03, $80
+ db $00, $38, $02, $80
+ db $00, $40, $03, $80
+ db $05, $ff, $00, $c0
+ db $05, $00, $02, $c0
+ db $05, $08, $02, $c0
+ db $05, $10, $03, $80
+ db $05, $18, $02, $c0
+ db $05, $20, $03, $80
+ db $05, $28, $02, $c0
+ db $05, $30, $03, $80
+ db $05, $38, $02, $c0
+ db $05, $40, $03, $80
+
+Unknown_e0b14: ; e0b14
+ db 30
+ db $00, $00, $00, $80
+ db $00, $08, $02, $80
+ db $00, $10, $02, $80
+ db $00, $18, $03, $80
+ db $00, $20, $02, $80
+ db $00, $28, $03, $80
+ db $00, $30, $02, $80
+ db $00, $38, $03, $80
+ db $00, $40, $02, $80
+ db $00, $48, $03, $80
+ db $08, $00, $01, $80
+ db $08, $18, $03, $80
+ db $08, $28, $03, $80
+ db $08, $38, $03, $80
+ db $08, $48, $03, $80
+ db $10, $00, $01, $80
+ db $10, $18, $03, $80
+ db $10, $28, $03, $80
+ db $10, $38, $03, $80
+ db $10, $48, $03, $80
+ db $11, $00, $00, $c0
+ db $11, $08, $02, $c0
+ db $11, $10, $02, $c0
+ db $11, $18, $03, $80
+ db $11, $20, $03, $80
+ db $11, $28, $03, $80
+ db $11, $30, $03, $80
+ db $11, $38, $03, $80
+ db $11, $40, $03, $80
+ db $11, $48, $03, $80
+
+Unknown_e0b8d: ; e0b8d
+ db 38
+ db $00, $ff, $00, $80
+ db $00, $18, $00, $a0
+ db $08, $ff, $01, $80
+ db $08, $18, $01, $a0
+ db $10, $ff, $01, $80
+ db $10, $18, $01, $a0
+ db $18, $ff, $01, $80
+ db $18, $08, $03, $80
+ db $18, $18, $03, $80
+ db $20, $ff, $01, $80
+ db $20, $08, $03, $80
+ db $20, $18, $03, $80
+ db $28, $ff, $01, $80
+ db $28, $08, $03, $80
+ db $28, $18, $03, $80
+ db $30, $ff, $01, $80
+ db $30, $08, $03, $80
+ db $30, $18, $03, $80
+ db $38, $ff, $01, $80
+ db $38, $08, $03, $80
+ db $38, $18, $03, $80
+ db $40, $ff, $01, $80
+ db $40, $08, $03, $80
+ db $40, $18, $03, $80
+ db $48, $ff, $01, $80
+ db $48, $08, $03, $80
+ db $48, $18, $03, $80
+ db $50, $ff, $01, $80
+ db $50, $08, $03, $80
+ db $50, $18, $03, $80
+ db $58, $ff, $01, $80
+ db $58, $08, $03, $80
+ db $58, $18, $03, $80
+ db $59, $ff, $00, $c0
+ db $59, $00, $02, $c0
+ db $59, $08, $03, $c0
+ db $59, $10, $02, $c0
+ db $59, $18, $03, $e0
+
+Unknown_e0c26: ; e0c26
+ db 4
+ db $00, $00, $00, $80
+ db $00, $08, $00, $a0
+ db $08, $00, $00, $c0
+ db $08, $08, $00, $e0
+; e0c37
+
+Functione0c37: ; e0c37 (38:4c37)
+ ld a, [hCGB]
+ and a
+ ret z
+ hlcoord 0, 0, AttrMap
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ xor a
+ call ByteFill
+ hlcoord 12, 1, AttrMap
+ lb bc, 2, 2
+ ld a, $1
+ call Functione04e7
+ hlcoord 14, 1, AttrMap
+ lb bc, 2, 2
+ ld a, $2
+ call Functione04e7
+ hlcoord 16, 1, AttrMap
+ lb bc, 2, 2
+ ld a, $3
+ call Functione04e7
+ hlcoord 18, 1, AttrMap
+ lb bc, 2, 2
+ ld a, $4
+ call Functione04e7
+ hlcoord 9, 0, AttrMap
+ lb bc, 12, 1
+ ld a, $1
+ call Functione04e7
+ ld a, [rSVBK]
+ push af
+ ld a, $5
+ ld [rSVBK], a
+ ld hl, Palette_e0c93
+ ld de, wMapPals
+ ld bc, $48
+ call CopyBytes
+ pop af
+ ld [rSVBK], a
+ ret
+; e0c93 (38:4c93)
+
+Palette_e0c93: ; e0c93
+ RGB 31, 31, 31
+ RGB 17, 07, 31
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 29, 25, 00
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 31, 13, 30
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 08, 17, 30
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 08, 31, 08
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 17, 07, 31
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 17, 07, 31
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 17, 07, 31
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 31, 31, 31
+ RGB 31, 00, 00
+ RGB 31, 00, 00
+; e0cdb
+
+LZ_e0cdb: ; e0cdb
+INCBIN "gfx/unknown/0e0cdb.2bpp.lz"
+
+GFX_e0cf6: ; e0cf6
+INCBIN "gfx/unknown/0e0cf6.2bpp"
+
+GFX_e0d06: ; e0d06
+INCBIN "gfx/unknown/0e0d06.2bpp"
+
+LZ_e0d16: ; e0d16
+INCBIN "gfx/unknown/0e0d16.2bpp.lz"
+
+LZ_e0ea8: ; e0ea8
+INCBIN "gfx/unknown/0e0ea8.2bpp.lz"
+
+Unknown_e110c: ; e110c
+ db $ef, $15, $27, $2a, $2a, $06, $27, $2a, $2a, $06, $27
+ db $ef, $07, $27, $3e, $3f, $42, $43, $46, $47, $4a, $4b
+ db $ef, $17, $26, $40, $41, $44, $45, $48, $49, $4c, $4d
+ db $ef, $25, $04, $00, $01, $00, $01, $00, $01, $00, $01
+ db $ef, $05, $14, $10, $11, $10, $11, $10, $11, $10, $11
+ db $ef, $16, $24, $20, $21, $20, $21, $20, $21, $20, $21
+ db $ef, $25, $04, $00, $02, $00, $02, $00, $02, $00, $02
+ db $ef, $05, $14, $10, $12, $10, $12, $10, $12, $10, $12
+ db $ef, $16, $24, $20, $22, $20, $22, $20, $22, $20, $22
+ db $ef, $25, $04, $00, $03, $00, $03, $00, $03, $00, $03
+ db $ef, $05, $14, $10, $13, $10, $13, $10, $13, $10, $13
+ db $ef, $16, $24, $20, $23, $20, $23, $20, $23, $20, $23
+; e1190
+
+Functione1190: ; e1190
+ ld a, [hInMenu]
+ push af
+ ld a, $1
+ ld [hInMenu], a
+ call ClearBGPalettes
+ call ClearTileMap
+ call ClearSprites
+ xor a
+ ld [hBGMapMode], a
+ call DisableLCD
+ ld hl, wc608
+ ld bc, $1e0
+ xor a
+ call ByteFill
+ ld hl, GFX_e17c5
+ ld de, VTiles1 tile $60
+ ld bc, $40
+ call CopyBytes
+ ld hl, LZ_e1805
+ ld de, VTiles1 tile $6d
+ call Decompress
+ call Functione17a3
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, $ee
+ call ByteFill
+ hlcoord 4, 3
+ lb bc, 12, 12
+ ld a, $ef
+ call Functione13ee
+ call Functione124e
+ call Functione13fe
+ call Functione127d
+ xor a
+ ld [hSCY], a
+ ld [hSCX], a
+ ld [rWY], a
+ ld [wJumptableIndex], a
+ ld [wcf64], a
+ ld [wcf65], a
+ ld [wcf66], a
+ ld a, $93
+ ld [rLCDC], a
+ call WaitBGMap
+ ld b, $18
+ call GetSGBLayout
+ ld a, $e4
+ call DmgToCgbBGPals
+ ld a, $24
+ call Functioncf8
+ xor a
+ ld [wd0ec], a
+ call DelayFrame
+.asm_e1217
+ call JoyTextDelay
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .asm_e123d
+ call Functione12ca
+ ld a, [wcf64]
+ and a
+ jr nz, .asm_e1230
+ ld a, [hVBlankCounter]
+ and $10
+ jr z, .asm_e1235
+
+.asm_e1230
+ call Functione14d9
+ jr .asm_e1238
+
+.asm_e1235
+ call ClearSprites
+
+.asm_e1238
+ call DelayFrame
+ jr .asm_e1217
+
+.asm_e123d
+ pop af
+ ld [hInMenu], a
+ call ClearBGPalettes
+ call ClearTileMap
+ call ClearSprites
+ ld a, $e3
+ ld [rLCDC], a
+ ret
+; e124e
+
+Functione124e: ; e124e
+ ld c, $1
+ ld b, $10
+.asm_e1252
+ call Random
+ and $f
+ ld hl, Unknown_e126d
+ ld e, a
+ ld d, $0
+ add hl, de
+ ld e, [hl]
+ ld hl, wc6d0
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .asm_e1252
+ ld [hl], c
+ inc c
+ dec b
+ jr nz, .asm_e1252
+ ret
+; e126d
+
+Unknown_e126d: ; e126d
+ db $00, $01, $02, $03
+ db $04, $05, $06, $0b
+ db $0c, $11, $12, $17
+ db $18, $1d, $1e, $23
+; e127d
+
+Functione127d: ; e127d
+ call Functione128d
+ hlcoord 5, 16
+ ld a, $f6
+ ld c, $a
+.asm_e1287
+ ld [hli], a
+ inc a
+ dec c
+ jr nz, .asm_e1287
+ ret
+; e128d
+
+Functione128d: ; e128d
+ hlcoord 4, 15
+ ld a, $f0
+ ld [hli], a
+ ld bc, $a
+ ld a, $f1
+ call ByteFill
+ hlcoord 15, 15
+ ld a, $f2
+ ld [hli], a
+ hlcoord 4, 16
+ ld a, $f3
+ ld [hli], a
+ ld bc, $a
+ ld a, $ef
+ call ByteFill
+ hlcoord 15, 16
+ ld a, $f3
+ ld [hli], a
+ hlcoord 4, 17
+ ld a, $f4
+ ld [hli], a
+ ld bc, $a
+ ld a, $f1
+ call ByteFill
+ hlcoord 15, 17
+ ld a, $f5
+ ld [hl], a
+ ret
+; e12ca
+
+Functione12ca: ; e12ca
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, 0
+ ld hl, Jumptable_e12d9
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; e12d9
+
+Jumptable_e12d9: ; e12d9
+ dw Functione12db
+; e12db
+
+Functione12db: ; e12db
+ ld a, [hJoyPressed]
+ and START
+ jp nz, Functione13de
+ ld a, [hJoyPressed]
+ and A_BUTTON
+ jp nz, Functione1376
+ ld hl, hJoyLast
+ ld a, [hl]
+ and D_UP
+ jr nz, .asm_e1301
+ ld a, [hl]
+ and D_DOWN
+ jr nz, .asm_e130d
+ ld a, [hl]
+ and D_LEFT
+ jr nz, .asm_e1325
+ ld a, [hl]
+ and D_RIGHT
+ jr nz, .asm_e1345
+ ret
+
+.asm_e1301
+ ld hl, wcf65
+ ld a, [hl]
+ cp $6
+ ret c
+ sub $6
+ ld [hl], a
+ jr .asm_e1364
+
+.asm_e130d
+ ld hl, wcf65
+ ld a, [hl]
+ cp $19
+ ret z
+ cp $1a
+ ret z
+ cp $1b
+ ret z
+ cp $1c
+ ret z
+ cp $1e
+ ret nc
+ add $6
+ ld [hl], a
+ jr .asm_e1364
+
+.asm_e1325
+ ld hl, wcf65
+ ld a, [hl]
+ and a
+ ret z
+ cp $6
+ ret z
+ cp $c
+ ret z
+ cp $12
+ ret z
+ cp $18
+ ret z
+ cp $1e
+ ret z
+ cp $23
+ jr z, .asm_e1341
+ dec [hl]
+ jr .asm_e1364
+
+.asm_e1341
+ ld [hl], $1e
+ jr .asm_e1364
+
+.asm_e1345
+ ld hl, wcf65
+ ld a, [hl]
+ cp $5
+ ret z
+ cp $b
+ ret z
+ cp $11
+ ret z
+ cp $17
+ ret z
+ cp $1d
+ ret z
+ cp $23
+ ret z
+ cp $1e
+ jr z, .asm_e1362
+ inc [hl]
+ jr .asm_e1364
+
+.asm_e1362
+ ld [hl], $23
+
+.asm_e1364
+ ld a, [wcf64]
+ and a
+ jr nz, .asm_e136f
+ ld de, SFX_POUND
+ jr .asm_e1372
+
+.asm_e136f
+ ld de, SFX_MOVE_PUZZLE_PIECE
+
+.asm_e1372
+ call PlaySFX
+ ret
+; e1376
+
+Functione1376: ; e1376
+ ld a, [wcf64]
+ and a
+ jr nz, .asm_e139f
+ call Functione1475
+ and a
+ jr z, Functione13e4
+ ld de, SFX_MEGA_KICK
+ call PlaySFX
+ ld [hl], $0
+ ld [wcf66], a
+ call Functione14d9
+ call Functione1441
+ call WaitBGMap
+ call WaitSFX
+ ld a, $1
+ ld [wcf64], a
+ ret
+
+.asm_e139f
+ call Functione1475
+ and a
+ jr nz, Functione13e4
+ ld de, SFX_PLACE_PUZZLE_PIECE_DOWN
+ call PlaySFX
+ ld a, [wcf66]
+ ld [hl], a
+ call Functione141f
+ call WaitBGMap
+ xor a
+ ld [wcf66], a
+ call Functione14d9
+ xor a
+ ld [wcf64], a
+ call WaitSFX
+ call Functione14a0
+ ret nc
+ call Functione128d
+ call ClearSprites
+ ld de, SFX_1ST_PLACE
+ call PlaySFX
+ call WaitSFX
+ call SimpleWaitPressAorB
+ ld a, $1
+ ld [wd0ec], a
+
+Functione13de: ; e13de
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+Functione13e4: ; e13e4
+ ld de, SFX_WRONG
+ call PlaySFX
+ call WaitSFX
+ ret
+; e13ee
+
+Functione13ee: ; e13ee
+ ld de, SCREEN_WIDTH
+.asm_e13f1
+ push bc
+ push hl
+.asm_e13f3
+ ld [hli], a
+ dec c
+ jr nz, .asm_e13f3
+ pop hl
+ add hl, de
+ pop bc
+ dec b
+ jr nz, .asm_e13f1
+ ret
+; e13fe
+
+Functione13fe: ; e13fe
+ xor a
+ ld [wcf65], a
+ ld c, $24
+.asm_e1404
+ push bc
+ call Functione1475
+ ld [wcf66], a
+ and a
+ jr z, .asm_e1413
+ call Functione141f
+ jr .asm_e1416
+
+.asm_e1413
+ call Functione1441
+
+.asm_e1416
+ ld hl, wcf65
+ inc [hl]
+ pop bc
+ dec c
+ jr nz, .asm_e1404
+ ret
+; e141f
+
+Functione141f: ; e141f
+ ld a, $2
+ call Functione1463
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ push hl
+ call Functione1481
+ pop hl
+ ld de, SCREEN_WIDTH
+ ld b, $3
+.asm_e1431
+ ld c, $3
+ push hl
+.asm_e1434
+ ld [hli], a
+ inc a
+ dec c
+ jr nz, .asm_e1434
+ add $9
+ pop hl
+ add hl, de
+ dec b
+ jr nz, .asm_e1431
+ ret
+; e1441
+
+Functione1441: ; e1441
+ ld a, $2
+ call Functione1463
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ push hl
+ ld a, $4
+ call Functione1463
+ ld a, [hl]
+ pop hl
+ ld de, SCREEN_WIDTH
+ ld b, $3
+.asm_e1456
+ ld c, $3
+ push hl
+.asm_e1459
+ ld [hli], a
+ dec c
+ jr nz, .asm_e1459
+ pop hl
+ add hl, de
+ dec b
+ jr nz, .asm_e1456
+ ret
+; e1463
+
+Functione1463: ; e1463
+ ld e, a
+ ld d, 0
+ ld hl, Unknown_e1559
+ add hl, de
+ ld a, [wcf65]
+ ld e, a
+rept 4
+ add hl, de
+endr
+rept 2
+ add hl, de
+endr
+ ret
+; e1475
+
+Functione1475: ; e1475
+ ld hl, wc6d0
+ ld a, [wcf65]
+ ld e, a
+ ld d, $0
+ add hl, de
+ ld a, [hl]
+ ret
+; e1481
+
+Functione1481: ; e1481
+ ld a, [wcf66]
+ ld hl, Unknown_e148f
+ add l
+ ld l, a
+ ld a, $0
+ adc h
+ ld h, a
+ ld a, [hl]
+ ret
+; e148f
+
+Unknown_e148f: ; e148f
+ db $e0
+ db $00, $03, $06, $09
+ db $24, $27, $2a, $2d
+ db $48, $4b, $4e, $51
+ db $6c, $6f, $72, $75
+; e14a0
+
+Functione14a0: ; e14a0
+ ld hl, Unknown_e14b5
+ ld de, wc6d0
+ ld c, $24
+.asm_e14a8
+ ld a, [de]
+ cp [hl]
+ jr nz, .asm_e14b3
+ inc de
+ inc hl
+ dec c
+ jr nz, .asm_e14a8
+ scf
+ ret
+
+.asm_e14b3
+ and a
+ ret
+; e14b5
+
+Unknown_e14b5: ; e14b5
+ db $00, $00, $00, $00, $00, $00
+ db $00, $01, $02, $03, $04, $00
+ db $00, $05, $06, $07, $08, $00
+ db $00, $09, $0a, $0b, $0c, $00
+ db $00, $0d, $0e, $0f, $10, $00
+ db $00, $00, $00, $00, $00, $00
+; e14d9
+
+Functione14d9: ; e14d9
+ call Functione1481
+ ld [wd002], a
+ xor a
+ call Functione1463
+ ld a, [hli]
+ ld b, [hl]
+ ld c, a
+ ld a, [wd002]
+ cp $e0
+ jr z, .asm_e14f2
+ ld hl, Unknown_e150f
+ jr .asm_e14f5
+
+.asm_e14f2
+ ld hl, Unknown_e1534
+
+.asm_e14f5
+ ld de, Sprites
+.asm_e14f8
+ ld a, [hli]
+ cp $ff
+ ret z
+ add b
+ ld [de], a
+ inc de
+ ld a, [hli]
+ add c
+ ld [de], a
+ inc de
+ ld a, [wd002]
+ add [hl]
+ ld [de], a
+ inc hl
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ jr .asm_e14f8
+; e150f
+
+Unknown_e150f: ; e150f
+ db $f4, $f4, $00, $00
+ db $f4, $fc, $01, $00
+ db $f4, $04, $02, $00
+ db $fc, $f4, $0c, $00
+ db $fc, $fc, $0d, $00
+ db $fc, $04, $0e, $00
+ db $04, $f4, $18, $00
+ db $04, $fc, $19, $00
+ db $04, $04, $1a, $00
+ db $ff
+
+Unknown_e1534: ; e1534
+ db $f4, $f4, $00, $00
+ db $f4, $fc, $01, $00
+ db $f4, $04, $00, $20
+ db $fc, $f4, $02, $00
+ db $fc, $fc, $03, $00
+ db $fc, $04, $02, $20
+ db $04, $f4, $00, $40
+ db $04, $fc, $01, $40
+ db $04, $04, $00, $60
+ db $ff
+
+Unknown_e1559: ; e1559
+
+macro_e1559: macro
+ db \1, \2
+ dwcoord \3, \4
+ db \5, \6
+endm
+
+ macro_e1559 $1c, $1c, 1, 0, $ee, $00
+ macro_e1559 $34, $1c, 4, 0, $ee, $00
+ macro_e1559 $4c, $1c, 7, 0, $ee, $00
+ macro_e1559 $64, $1c, 10, 0, $ee, $00
+ macro_e1559 $7c, $1c, 13, 0, $ee, $00
+ macro_e1559 $94, $1c, 16, 0, $ee, $00
+ macro_e1559 $1c, $34, 1, 3, $ee, $00
+ macro_e1559 $34, $34, 4, 3, $ef, $00
+ macro_e1559 $4c, $34, 7, 3, $ef, $00
+ macro_e1559 $64, $34, 10, 3, $ef, $00
+ macro_e1559 $7c, $34, 13, 3, $ef, $00
+ macro_e1559 $94, $34, 16, 3, $ee, $00
+ macro_e1559 $1c, $4c, 1, 6, $ee, $00
+ macro_e1559 $34, $4c, 4, 6, $ef, $00
+ macro_e1559 $4c, $4c, 7, 6, $ef, $00
+ macro_e1559 $64, $4c, 10, 6, $ef, $00
+ macro_e1559 $7c, $4c, 13, 6, $ef, $00
+ macro_e1559 $94, $4c, 16, 6, $ee, $00
+ macro_e1559 $1c, $64, 1, 9, $ee, $00
+ macro_e1559 $34, $64, 4, 9, $ef, $00
+ macro_e1559 $4c, $64, 7, 9, $ef, $00
+ macro_e1559 $64, $64, 10, 9, $ef, $00
+ macro_e1559 $7c, $64, 13, 9, $ef, $00
+ macro_e1559 $94, $64, 16, 9, $ee, $00
+ macro_e1559 $1c, $7c, 1, 12, $ee, $00
+ macro_e1559 $34, $7c, 4, 12, $ef, $00
+ macro_e1559 $4c, $7c, 7, 12, $ef, $00
+ macro_e1559 $64, $7c, 10, 12, $ef, $00
+ macro_e1559 $7c, $7c, 13, 12, $ef, $00
+ macro_e1559 $94, $7c, 16, 12, $ee, $00
+ macro_e1559 $1c, $94, 1, 15, $ee, $00
+ macro_e1559 $34, $94, 4, 15, $ee, $00
+ macro_e1559 $4c, $94, 7, 15, $ee, $00
+ macro_e1559 $64, $94, 10, 15, $ee, $00
+ macro_e1559 $7c, $94, 13, 15, $ee, $00
+ macro_e1559 $94, $94, 16, 15, $ee, $00
+
+Functione1631: ; e1631
+ ld hl, VTiles2
+ ld de, VTiles0
+ ld b, $6
+.asm_e1639
+ push bc
+ push hl
+ push hl
+ call Functione1654
+ pop hl
+ ld bc, 8
+ add hl, bc
+ call Functione1654
+ pop hl
+ ld bc, $60
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .asm_e1639
+ call Functione16c7
+ ret
+; e1654
+
+Functione1654: ; e1654
+ ld c, $6
+.asm_e1656
+ push bc
+ push hl
+ push hl
+ ld c, $4
+.asm_e165b
+ push bc
+ ld a, [hli]
+ and $f0
+ swap a
+ call Functione16aa
+ ld c, a
+ ld a, [hli]
+ and $f0
+ swap a
+ call Functione16aa
+ ld b, a
+ ld a, c
+ ld [de], a
+ inc de
+ ld a, b
+ ld [de], a
+ inc de
+ ld a, c
+ ld [de], a
+ inc de
+ ld a, b
+ ld [de], a
+ inc de
+ pop bc
+ dec c
+ jr nz, .asm_e165b
+ pop hl
+ ld c, $4
+.asm_e1681
+ push bc
+ ld a, [hli]
+ and $f
+ call Functione16aa
+ ld c, a
+ ld a, [hli]
+ and $f
+ call Functione16aa
+ ld b, a
+ ld a, c
+ ld [de], a
+ inc de
+ ld a, b
+ ld [de], a
+ inc de
+ ld a, c
+ ld [de], a
+ inc de
+ ld a, b
+ ld [de], a
+ inc de
+ pop bc
+ dec c
+ jr nz, .asm_e1681
+ pop hl
+ ld bc, $10
+ add hl, bc
+ pop bc
+ dec c
+ jr nz, .asm_e1656
+ ret
+; e16aa
+
+Functione16aa: ; e16aa
+ push hl
+ ld hl, Unknown_e16b7
+ add l
+ ld l, a
+ ld a, 0
+ adc h
+ ld h, a
+ ld a, [hl]
+ pop hl
+ ret
+; e16b7
+
+Unknown_e16b7: ; e16b7
+ db $00, $03, $0c, $0f
+ db $30, $33, $3c, $3f
+ db $c0, $c3, $cc, $cf
+ db $f0, $f3, $fc, $ff
+; e16c7
+
+Functione16c7: ; e16c7
+ ld hl, Unknown_e1703
+ ld a, $8
+.asm_e16cc
+ push af
+ push hl
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call Functione16e2
+ pop hl
+rept 4
+ inc hl
+endr
+ pop af
+ dec a
+ jr nz, .asm_e16cc
+ ret
+; e16e2
+
+Functione16e2: ; e16e2
+ lb bc, 4, 4
+.asm_e16e5
+ push bc
+.asm_e16e6
+ push de
+ push hl
+ ld b, $10
+.asm_e16ea
+ ld a, [de]
+ or [hl]
+ ld [hli], a
+ inc de
+ dec b
+ jr nz, .asm_e16ea
+ pop hl
+ ld de, $30
+ add hl, de
+ pop de
+ dec c
+ jr nz, .asm_e16e6
+ ld bc, $180
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .asm_e16e5
+ ret
+; e1703
+
+Unknown_e1703: ; e1703
+ dw GFX_e1723 + $00, $8000
+ dw GFX_e1723 + $10, $8010
+ dw GFX_e1723 + $20, $8020
+ dw GFX_e1723 + $30, $80c0
+ dw GFX_e1723 + $40, $80e0
+ dw GFX_e1723 + $50, $8180
+ dw GFX_e1723 + $60, $8190
+ dw GFX_e1723 + $70, $81a0
+; e1723
+
+GFX_e1723: ; e1723
+INCBIN "gfx/unknown/0e1723.2bpp"
+
+Functione17a3: ; e17a3
+ ld a, [ScriptVar]
+ and 3
+ ld e, a
+ ld d, 0
+ ld hl, Unknown_e17bd
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, VTiles2
+ call Decompress
+ call Functione1631
+ ret
+; e17bd
+
+Unknown_e17bd: ; e17bd
+ dw LZ_e1bab
+ dw LZ_e1c9b
+ dw LZ_e19fb
+ dw LZ_e18ab
+; e17c5
+
+GFX_e17c5: ; e17c5
+INCBIN "gfx/unknown/0e17c5.2bpp"
+
+LZ_e1805: ; e1805
+INCBIN "gfx/unknown/0e1805.2bpp.lz"
+
+LZ_e18ab: ; e18ab
+INCBIN "gfx/unknown/0e18ab.2bpp.lz"
+
+LZ_e19fb: ; e19fb
+INCBIN "gfx/unknown/0e19fb.2bpp.lz"
+
+LZ_e1bab: ; e1bab
+INCBIN "gfx/unknown/0e1bab.2bpp.lz"
+
+LZ_e1c9b: ; e1c9b
+INCBIN "gfx/unknown/0e1c9b.2bpp.lz"
diff --git a/engine/clock_reset.asm b/engine/clock_reset.asm
new file mode 100755
index 000000000..e51db6249
--- /dev/null
+++ b/engine/clock_reset.asm
@@ -0,0 +1,251 @@
+
+ResetClock_GetWraparoundTime: ; 20000 (8:4000)
+ push hl
+ dec a
+ ld e, a
+ ld d, 0
+ ld hl, .WrapAroundTimes
+rept 4
+ add hl, de
+endr
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc hl
+ ld b, [hl]
+ inc hl
+ ld c, [hl]
+ pop hl
+ ret
+; 20015 (8:4015)
+
+.WrapAroundTimes: ; 20015
+ dw Buffer4
+ db 7, 4
+
+ dw Buffer5
+ db 24, 12
+
+ dw Buffer6
+ db 60, 15
+; 20021
+
+RestartClock: ; 20021 (8:4021)
+; If we're here, we had an RTC overflow.
+ ld hl, .Text_ClockTimeMayBeWrong
+ call PrintText
+ ld hl, Options
+ ld a, [hl]
+ push af
+ set NO_TEXT_SCROLL, [hl]
+ call LoadStandardMenuDataHeader
+ call ClearTileMap
+ ld hl, .Text_SetWithControlPad
+ call PrintText
+ call .SetClock
+ call ExitMenu
+ pop bc
+ ld hl, Options
+ ld [hl], b
+ ld c, a
+ ret
+; 20047 (8:4047)
+
+.Text_ClockTimeMayBeWrong: ; 0x20047
+ ; The clock's time may be wrong. Please reset the time.
+ text_jump UnknownText_0x1c40e6
+ db "@"
+; 0x2004c
+
+.Text_SetWithControlPad: ; 0x2004c
+ ; Set with the Control Pad. Confirm: A Button Cancel: B Button
+ text_jump UnknownText_0x1c411c
+ db "@"
+; 0x20051
+
+.SetClock: ; 20051 (8:4051)
+ ld a, 1
+ ld [Buffer1], a ; which digit
+ ld [Buffer2], a ; wd1eb (aliases: MovementType)
+ ld a, 8
+ ld [Buffer3], a
+ call UpdateTime
+ call GetWeekday
+ ld [Buffer4], a
+ ld a, [hHours]
+ ld [Buffer5], a
+ ld a, [hMinutes]
+ ld [Buffer6], a
+
+.loop
+ call .joy_loop
+ jr nc, .loop
+ and a
+ ret nz
+ call .PrintTime
+ ld hl, .Text_IsThisOK
+ call PrintText
+ call YesNoBox
+ jr c, .cancel
+ ld a, [Buffer4]
+ ld [StringBuffer2], a
+ ld a, [Buffer5]
+ ld [StringBuffer2 + 1], a
+ ld a, [Buffer6]
+ ld [StringBuffer2 + 2], a
+ xor a
+ ld [StringBuffer2 + 3], a
+ call Function677
+ call .PrintTime
+ ld hl, .Text_ClockReset
+ call PrintText
+ call WaitPressAorB_BlinkCursor
+ xor a
+ ret
+
+.cancel
+ ld a, $1
+ ret
+; 200b0 (8:40b0)
+
+.Text_IsThisOK: ; 0x200b0
+ ; Is this OK?
+ text_jump UnknownText_0x1c415b
+ db "@"
+; 0x200b5
+
+.Text_ClockReset: ; 0x200b5
+ ; The clock has been reset.
+ text_jump UnknownText_0x1c4168
+ db "@"
+; 0x200ba
+
+.joy_loop
+ call Function354b
+ ld c, a
+ push af
+ call .PrintTime
+ pop af
+ bit 0, a
+ jr nz, .press_A
+ bit 1, a
+ jr nz, .press_B
+ bit 6, a
+ jr nz, .pressed_up
+ bit 7, a
+ jr nz, .pressed_down
+ bit 5, a
+ jr nz, .pressed_left
+ bit 4, a
+ jr nz, .pressed_right
+ jr .joy_loop
+
+.press_A
+ ld a, $0
+ scf
+ ret
+
+.press_B
+ ld a, $1
+ scf
+ ret
+
+.pressed_up
+ ld a, [Buffer1] ; wd1ea (aliases: MagikarpLength)
+ call ResetClock_GetWraparoundTime
+ ld a, [de]
+ inc a
+ ld [de], a
+ cp b
+ jr c, .done_scroll
+ ld a, $0
+ ld [de], a
+ jr .done_scroll
+
+.pressed_down
+ ld a, [Buffer1] ; wd1ea (aliases: MagikarpLength)
+ call ResetClock_GetWraparoundTime
+ ld a, [de]
+ dec a
+ ld [de], a
+ cp -1
+ jr nz, .done_scroll
+ ld a, b
+ dec a
+ ld [de], a
+ jr .done_scroll
+
+.pressed_left
+ ld hl, Buffer1 ; wd1ea (aliases: MagikarpLength)
+ dec [hl]
+ jr nz, .done_scroll
+ ld [hl], $3
+ jr .done_scroll
+
+.pressed_right
+ ld hl, Buffer1 ; wd1ea (aliases: MagikarpLength)
+ inc [hl]
+ ld a, [hl]
+ cp $4
+ jr c, .done_scroll
+ ld [hl], $1
+
+.done_scroll
+ xor a
+ ret
+
+.PrintTime: ; 2011f (8:411f)
+ hlcoord 0, 5
+ ld b, 5
+ ld c, 18
+ call TextBox
+ decoord 1, 8
+ ld a, [Buffer4]
+ ld b, a
+ callba PrintDayOfWeek
+ ld a, [Buffer5]
+ ld b, a
+ ld a, [Buffer6]
+ ld c, a
+ decoord 11, 8
+ callba PrintHoursMins
+ ld a, [Buffer2] ; wd1eb (aliases: MovementType)
+ lb de, " ", " "
+ call .PlaceChars
+ ld a, [Buffer1] ; wd1ea (aliases: MagikarpLength)
+ lb de, "▲", "▼"
+ call .PlaceChars
+ ld a, [Buffer1] ; wd1ea (aliases: MagikarpLength)
+ ld [Buffer2], a ; wd1eb (aliases: MovementType)
+ ret
+; 20160 (8:4160)
+
+.unreferenced: ; 20160
+ ld a, [Buffer3]
+ ld b, a
+ call Coord2Tile
+ ret
+; 20168
+
+.PlaceChars: ; 20168 (8:4168)
+ push de
+ call ResetClock_GetWraparoundTime
+ ld a, [Buffer3]
+ dec a
+ ld b, a
+ call Coord2Tile
+ pop de
+ ld [hl], d
+ ld bc, 2 * SCREEN_WIDTH
+ add hl, bc
+ ld [hl], e
+ ret
+; 2017c (8:417c)
+
+String_2017c: ; 2017c
+ db "じ@" ; HR
+; 2017e
+
+String_2017e: ; 2017e
+ db "ふん@" ; MIN
+; 20181
diff --git a/engine/color.asm b/engine/color.asm
index 9fde4d77d..8530c2181 100644
--- a/engine/color.asm
+++ b/engine/color.asm
@@ -149,7 +149,7 @@ Function8b07: ; 8b07
call CheckCGB
ret z
ld hl, Palette8b2f
- ld de, Unkn1Pals
+ ld de, wMapPals
ld bc, $0008
ld a, $5
call FarCopyWRAM
@@ -275,7 +275,7 @@ endr
asm_8bd7
push hl
- ld hl, Unkn1Pals
+ ld hl, wMapPals
ld de, $0008
.asm_8bde
and a
@@ -319,7 +319,7 @@ Function8bec: ; 8bec
ld a, [EnemySafeguardCount]
and $3
call Function9663
- call Function323d
+ call LoadDETile
ret
; 8c1d
@@ -338,7 +338,7 @@ Function8c1d: ; 8c1d
call Function976b
.asm_8c33
- ld de, Unkn1Pals
+ ld de, wMapPals
call Function9643
call Function9699
call Function96b3
@@ -412,11 +412,11 @@ endr
ld a, $5
ld [rSVBK], a
ld a, [hli]
- ld [Unkn1Pals], a
- ld [Unkn1Pals + 8 * 2], a
+ ld [wMapPals], a
+ ld [wMapPals + 8 * 2], a
ld a, [hl]
- ld [Unkn1Pals + 1], a
- ld [Unkn1Pals + 8 * 2 + 1], a
+ ld [wMapPals + 1], a
+ ld [wMapPals + 8 * 2 + 1], a
pop af
ld [rSVBK], a
call Function96a4
@@ -458,7 +458,7 @@ endr
ret
.asm_8cf0
- ld de, Unkn1Pals
+ ld de, wMapPals
ld bc, $0008
ld a, $5
call FarCopyWRAM
@@ -525,7 +525,7 @@ INCLUDE "predef/cgb.asm"
Function95f0: ; 95f0
ld hl, Palette_9608
- ld de, Unkn1Pals
+ ld de, wMapPals
ld bc, 8
ld a, $5
call FarCopyWRAM
@@ -544,7 +544,7 @@ Palette_9608: ; 9608
CopyFourPalettes: ; 9610
- ld de, Unkn1Pals
+ ld de, wMapPals
ld c, $4
CopyPalettes: ; 9615
@@ -644,7 +644,7 @@ Function9673: ; 9673
push af
ld a, $5
ld [rSVBK], a
- ld hl, Unkn1Pals
+ ld hl, wMapPals
ld c, $8
.asm_9683
ld a, $ff
@@ -676,7 +676,7 @@ Function9699: ; 9699
; 96a4
Function96a4: ; 96a4
- ld hl, Unkn1Pals
+ ld hl, wMapPals
ld de, BGPals
ld bc, $0080
ld a, $5
@@ -768,7 +768,7 @@ Function971a: ; 971a
Function9729: ; 9729
push de
- callba Function3da85
+ callba GetPartyMonDVs
ld c, l
ld b, h
ld a, [TempBattleMonSpecies]
@@ -779,7 +779,7 @@ Function9729: ; 9729
Function973a: ; 973a
push de
- callba Function3da97
+ callba GetEnemyMonDVs
ld c, l
ld b, h
ld a, [TempEnemyMonSpecies]
@@ -1047,7 +1047,7 @@ Function9890:: ; 9890
push af
ld a, $5
ld [rSVBK], a
- ld hl, Unkn1Pals
+ ld hl, wMapPals
call Function98df
ld hl, BGPals
call Function98df
@@ -1945,7 +1945,7 @@ INCLUDE "gfx/trainers/palette_pointers.asm"
; b1de
Functionb1de: ; b1de
- callba Function494ac
+ callba LoadSpecialMapPalette
jr c, .asm_b230
ld a, [wPermission]
@@ -1973,7 +1973,7 @@ endr
push af
ld a, $5
ld [rSVBK], a
- ld hl, Unkn1Pals
+ ld hl, wMapPals
ld b, $8
.asm_b210
ld a, [de]
@@ -2036,7 +2036,7 @@ rept 4
inc hl
endr
.asm_b26d
- ld de, Unkn1Pals + 8 * 6 + 2
+ ld de, wMapPals + 8 * 6 + 2
ld bc, 4
ld a, $5
call FarCopyWRAM
diff --git a/engine/credits.asm b/engine/credits.asm
index 793891dd2..6b35fbe6a 100644
--- a/engine/credits.asm
+++ b/engine/credits.asm
@@ -131,7 +131,7 @@ Function109847:: ; 109847
ld a, $5
ld [rSVBK], a
- call WhiteBGMap
+ call ClearBGPalettes
call ClearTileMap
call ClearSprites
@@ -210,7 +210,7 @@ Function109847:: ; 109847
jr .asm_1098de
.asm_1098ee
- call WhiteBGMap
+ call ClearBGPalettes
xor a
ld [hLCDStatCustom], a
ld [hBGMapAddress], a
@@ -300,7 +300,7 @@ Function109956: ; 109956 (42:5956)
Function10995e: ; 10995e (42:595e)
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
jp Function109951
Function109964: ; 109964 (42:5964)
@@ -317,13 +317,13 @@ Function109964: ; 109964 (42:5964)
Function10997b: ; 10997b (42:597b)
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
ld a, $8
ld [Requested2bpp], a
jp Function109951
Function109986: ; 109986 (42:5986)
- ld a, [rLY] ; $ff00+$44
+ ld a, [rLY]
cp $30
jr c, Function109986
ld a, [wcf66]
@@ -366,7 +366,7 @@ ParseCredits: ; 1099aa
; First, let's clear the current text display,
; starting from line 5.
xor a
- ld [$ffd4], a
+ ld [hBGMapMode], a
hlcoord 0, 5
ld bc, 20 * 12
ld a, " "
@@ -479,9 +479,9 @@ endr
ld [CreditsTimer], a
xor a
- ld [$ffd5], a
+ ld [hBGMapThird], a
ld a, 1
- ld [$ffd4], a
+ ld [hBGMapMode], a
.done
jp Function109951
@@ -523,9 +523,9 @@ endr
Function109a95: ; 109a95 (42:5a95)
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
ld a, $c
- ld [hBGMapAddress], a ; $ff00+$d6
+ ld [hBGMapAddress], a
ld a, $28
hlcoord 0, 0
ld bc, $168
@@ -558,8 +558,8 @@ Function109a95: ; 109a95 (42:5a95)
call ByteFill
call Function3200
xor a
- ld [hBGMapMode], a ; $ff00+$d4
- ld [hBGMapAddress], a ; $ff00+$d6
+ ld [hBGMapMode], a
+ ld [hBGMapAddress], a
hlcoord 0, 0
call Function109aff
call Function3200
@@ -637,10 +637,10 @@ GetCreditsPalette: ; 109b2c
push af
push hl
- add Unkn1Pals % $100
+ add wMapPals % $100
ld e, a
ld a, 0
- adc Unkn1Pals / $100
+ adc wMapPals / $100
ld d, a
ld bc, 24
call CopyBytes
diff --git a/engine/diploma.asm b/engine/diploma.asm
index eff2ff5f1..7699cf930 100644
--- a/engine/diploma.asm
+++ b/engine/diploma.asm
@@ -1,12 +1,12 @@
Function1dd702: ; 1dd702
call Function1dd709
- call Functiona80
+ call WaitPressAorB_BlinkCursor
ret
; 1dd709
Function1dd709: ; 1dd709
- call WhiteBGMap
+ call ClearBGPalettes
call ClearTileMap
call ClearSprites
call DisableLCD
diff --git a/engine/dummy_game.asm b/engine/dummy_game.asm
new file mode 100755
index 000000000..86d505e0e
--- /dev/null
+++ b/engine/dummy_game.asm
@@ -0,0 +1,615 @@
+_DummyGame: ; e1e5b (38:5e5b)
+ call Functione1e67
+ call DelayFrame
+.asm_e1e61
+ call Functione1ebb
+ jr nc, .asm_e1e61
+ ret
+
+Functione1e67: ; e1e67 (38:5e67)
+ call DisableLCD
+ ld b, $8
+ call GetSGBLayout
+ callab Function8cf53
+ ld hl, LZ_e2221
+ ld de, VTiles2 tile $00
+ call Decompress
+ ld hl, Unknown_e00ed
+ ld de, VTiles0 tile $00
+ ld bc, $40
+ ld a, BANK(Unknown_e00ed)
+ call FarCopyBytes
+ ld a, $8
+ ld hl, wc300
+ ld [hli], a
+ ld [hl], $0
+ hlcoord 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ xor a
+ call ByteFill
+ xor a
+ ld [hSCY], a
+ ld [hSCX], a
+ ld [rWY], a
+ ld [wJumptableIndex], a
+ ld a, $1
+ ld [hBGMapMode], a
+ ld a, $e3
+ ld [rLCDC], a
+ ld a, $e4
+ call DmgToCgbBGPals
+ ld a, $e0
+ call Functioncf8
+ ret
+
+Functione1ebb: ; e1ebb (38:5ebb)
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .asm_e1ed0
+ call Functione1ed2
+ callab Function8cf69
+ call DelayFrame
+ and a
+ ret
+.asm_e1ed0
+ scf
+ ret
+
+Functione1ed2: ; e1ed2 (38:5ed2)
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, 0
+ ld hl, Jumptable_e1ee1
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; e1ee1 (38:5ee1)
+
+Jumptable_e1ee1: ; e1ee1
+ dw Functione1ef3
+ dw Functione1efb
+ dw Functione1f1c
+ dw Functione1f42
+ dw Functione1f61
+ dw Functione1f8b
+ dw Functione1fba
+ dw Functione1fcc
+ dw Functione2000
+; e1ef3
+
+Functione1ef3: ; e1ef3
+ call Functione2152
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+; e1efb
+
+Functione1efb: ; e1efb
+ call Functione00ed
+ jr nc, .asm_e1f06
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+.asm_e1f06
+ call Functione209d
+ ld hl, wJumptableIndex
+ inc [hl]
+ xor a
+ ld [wc708], a
+ ld hl, wc703
+rept 4
+ ld [hli], a
+endr
+ ld [hl], a
+ ld [wc709], a
+
+Functione1f1c: ; e1f1c
+ ld hl, wc708
+ ld a, [hl]
+ cp $2d
+ jr nc, .asm_e1f30
+ inc [hl]
+ call Functione2183
+ xor a
+ ld [wc6fd], a
+ call Functione2128
+ ret
+
+.asm_e1f30
+ ld de, $341c
+ ld a, $c
+ call Function3b2a
+ ld a, $5
+ ld [wc702], a
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+; e1f42
+
+Functione1f42: ; e1f42
+ ld a, [wc702]
+ hlcoord 17, 0
+ add $f6
+ ld [hl], a
+ ld hl, wc702
+ ld a, [hl]
+ and a
+ jr nz, .asm_e1f58
+ ld a, $7
+ ld [wJumptableIndex], a
+ ret
+
+.asm_e1f58
+ dec [hl]
+ xor a
+ ld [wcf64], a
+ ld hl, wJumptableIndex
+ inc [hl]
+
+Functione1f61: ; e1f61
+ ld a, [wcf64]
+ and a
+ ret z
+ dec a
+ ld e, a
+ ld d, $0
+ ld hl, wc6d0
+ add hl, de
+ ld a, [hl]
+ cp $ff
+ ret z
+ ld [wc6fd], a
+ ld [wPlayerMinimized], a
+ ld a, e
+ ld [EnemyScreens], a
+ call Functione2183
+ call Functione2128
+ xor a
+ ld [wcf64], a
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+; e1f8b
+
+Functione1f8b: ; e1f8b
+ ld a, [wcf64]
+ and a
+ ret z
+ dec a
+ ld hl, EnemyScreens
+ cp [hl]
+ ret z
+ ld e, a
+ ld d, $0
+ ld hl, wc6d0
+ add hl, de
+ ld a, [hl]
+ cp $ff
+ ret z
+ ld [wc6fd], a
+ ld [PlayerScreens], a
+ ld a, e
+ ld [wc701], a
+ call Functione2183
+ call Functione2128
+ ld a, $40
+ ld [wc708], a
+ ld hl, wJumptableIndex
+ inc [hl]
+
+Functione1fba: ; e1fba
+ ld hl, wc708
+ ld a, [hl]
+ and a
+ jr z, .asm_e1fc3
+ dec [hl]
+ ret
+
+.asm_e1fc3
+ call Functione2010
+ ld a, $3
+ ld [wJumptableIndex], a
+ ret
+; e1fcc
+
+Functione1fcc: ; e1fcc
+ ld a, [hJoypadPressed]
+ and A_BUTTON
+ ret z
+ xor a
+ ld [wc708], a
+.asm_e1fd5
+ ld hl, wc708
+ ld a, [hl]
+ cp $2d
+ jr nc, .asm_e1ff9
+ inc [hl]
+ push af
+ call Functione2183
+ pop af
+ push hl
+ ld e, a
+ ld d, $0
+ ld hl, wc6d0
+ add hl, de
+ ld a, [hl]
+ pop hl
+ cp $ff
+ jr z, .asm_e1fd5
+ ld [wc6fd], a
+ call Functione2128
+ jr .asm_e1fd5
+
+.asm_e1ff9
+ call WaitPressAorB_BlinkCursor
+ ld hl, wJumptableIndex
+ inc [hl]
+
+Functione2000: ; e2000
+ call Functione00ed
+ jr nc, .asm_e200b
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+.asm_e200b
+ xor a
+ ld [wJumptableIndex], a
+ ret
+; e2010
+
+Functione2010: ; e2010
+ ld hl, wPlayerMinimized
+ ld a, [hli]
+ cp [hl]
+ jr nz, .asm_e2066
+ ld a, [EnemyScreens]
+ call Functione2183
+ call Functione2142
+ ld a, [wc701]
+ call Functione2183
+ call Functione2142
+ ld a, [EnemyScreens]
+ ld e, a
+ ld d, $0
+ ld hl, wc6d0
+ add hl, de
+ ld [hl], $ff
+ ld a, [wc701]
+ ld e, a
+ ld d, $0
+ ld hl, wc6d0
+ add hl, de
+ ld [hl], $ff
+ ld hl, wc703
+.asm_e2044
+ ld a, [hli]
+ and a
+ jr nz, .asm_e2044
+ dec hl
+ ld a, [wPlayerMinimized]
+ ld [hl], a
+ ld [wc6fd], a
+ ld hl, wc709
+ ld e, [hl]
+rept 2
+ inc [hl]
+endr
+ ld d, $0
+ hlcoord 5, 0
+ add hl, de
+ call Functione2128
+ ld hl, UnknownText_0xe2083
+ call PrintText
+ ret
+
+.asm_e2066
+ xor a
+ ld [wc6fd], a
+ ld a, [EnemyScreens]
+ call Functione2183
+ call Functione2128
+ ld a, [wc701]
+ call Functione2183
+ call Functione2128
+ ld hl, UnknownText_0xe2098
+ call PrintText
+ ret
+; e2083
+
+UnknownText_0xe2083: ; 0xe2083
+ start_asm
+; 0xe2084
+
+Functione2084: ; e2084
+ push bc
+ hlcoord 2, 13
+ call Functione2128
+ ld hl, UnknownText_0xe2093
+ pop bc
+rept 3
+ inc bc
+endr
+ ret
+; e2093
+
+UnknownText_0xe2093: ; 0xe2093
+ ; , yeah!
+ text_jump UnknownText_0x1c1a5b
+ db "@"
+; 0xe2098
+
+UnknownText_0xe2098: ; 0xe2098
+ ; Darn…
+ text_jump UnknownText_0x1c1a65
+ db "@"
+; 0xe209d
+
+Functione209d: ; e209d
+ ld hl, wc6d0
+ ld bc, $2d
+ xor a
+ call ByteFill
+ call Functione2101
+ ld c, $2
+ ld b, [hl]
+ call Functione20e5
+ ld c, $8
+ ld b, [hl]
+ call Functione20e5
+ ld c, $4
+ ld b, [hl]
+ call Functione20e5
+ ld c, $7
+ ld b, [hl]
+ call Functione20e5
+ ld c, $3
+ ld b, [hl]
+ call Functione20e5
+ ld c, $6
+ ld b, [hl]
+ call Functione20e5
+ ld c, $1
+ ld b, [hl]
+ call Functione20e5
+ ld c, $5
+ ld hl, wc6d0
+ ld b, $2d
+.asm_e20db
+ ld a, [hl]
+ and a
+ jr nz, .asm_e20e0
+ ld [hl], c
+
+.asm_e20e0
+ inc hl
+ dec b
+ jr nz, .asm_e20db
+ ret
+; e20e5
+
+Functione20e5: ; e20e5
+ push hl
+ ld de, wc6d0
+.asm_e20e9
+ call Random
+ and $3f
+ cp $2d
+ jr nc, .asm_e20e9
+ ld l, a
+ ld h, $0
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .asm_e20e9
+ ld [hl], c
+ dec b
+ jr nz, .asm_e20e9
+ pop hl
+ inc hl
+ ret
+; e2101
+
+Functione2101: ; e2101
+ ld a, [MenuSelection2]
+ dec a
+ ld l, a
+ ld h, 0
+rept 3
+ add hl, hl
+endr
+ ld de, Unknown_e2110
+ add hl, de
+ ret
+; e2110
+
+Unknown_e2110: ; e2110
+ db $02, $03, $06, $06, $06, $08, $08, $06
+ db $02, $02, $04, $06, $06, $08, $08, $09
+ db $02, $02, $02, $04, $07, $08, $08, $0c
+; e2128
+
+Functione2128: ; e2128
+ ld a, [wc6fd]
+ sla a
+ sla a
+ add $4
+ ld [hli], a
+ inc a
+ ld [hld], a
+ inc a
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hli], a
+ inc a
+ ld [hl], a
+ ld c, 3
+ call DelayFrames
+ ret
+; e2142
+
+Functione2142: ; e2142
+ ld a, $1
+ ld [hli], a
+ ld [hld], a
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hli], a
+ ld [hl], a
+ ld c, 3
+ call DelayFrames
+ ret
+; e2152
+
+Functione2152: ; e2152
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, $1
+ call ByteFill
+ hlcoord 0, 0
+ ld de, String_e2177
+ call PlaceString
+ hlcoord 15, 0
+ ld de, String_e217d
+ call PlaceString
+ ld hl, UnknownText_0xe2176
+ call PrintText
+ ret
+; e2176
+
+UnknownText_0xe2176: ; 0xe2176
+ db "@"
+; 0xe2177
+
+String_e2177: db "とったもの@"
+String_e217d: db "あと かい@"
+; e2183
+
+Functione2183: ; e2183
+ ld d, $0
+.asm_e2185
+ sub $9
+ jr c, .asm_e218c
+ inc d
+ jr .asm_e2185
+
+.asm_e218c
+ add $9
+ ld e, a
+ hlcoord 1, 2
+ ld bc, $28
+.asm_e2195
+ ld a, d
+ and a
+ jr z, .asm_e219d
+ add hl, bc
+ dec d
+ jr .asm_e2195
+
+.asm_e219d
+ sla e
+ add hl, de
+ ret
+; e21a1
+
+Functione21a1: ; e21a1 (38:61a1)
+ ld a, [wJumptableIndex]
+ cp $7
+ jr nc, .quit
+ call JoyTextDelay
+ ld hl, hJoypadPressed ; $ffa3
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .pressed_a
+ ld a, [hl]
+ and D_LEFT
+ jr nz, .pressed_left
+ ld a, [hl]
+ and D_RIGHT
+ jr nz, .pressed_right
+ ld a, [hl]
+ and D_UP
+ jr nz, .pressed_up
+ ld a, [hl]
+ and D_DOWN
+ jr nz, .pressed_down
+ ret
+
+.quit
+ ld hl, 0
+ add hl, bc
+ ld [hl], $0
+ ret
+
+.pressed_a
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ inc a
+ ld [wcf64], a
+ ret
+
+.pressed_left
+ ld hl, $6
+ add hl, bc
+ ld a, [hl]
+ and a
+ ret z
+ sub $10
+ ld [hl], a
+ ld hl, $c
+ add hl, bc
+ dec [hl]
+ ret
+
+.pressed_right
+ ld hl, $6
+ add hl, bc
+ ld a, [hl]
+ cp $80
+ ret z
+ add $10
+ ld [hl], a
+ ld hl, $c
+ add hl, bc
+ inc [hl]
+ ret
+
+.pressed_up
+ ld hl, $7
+ add hl, bc
+ ld a, [hl]
+ and a
+ ret z
+ sub $10
+ ld [hl], a
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ sub $9
+ ld [hl], a
+ ret
+
+.pressed_down
+ ld hl, $7
+ add hl, bc
+ ld a, [hl]
+ cp $40
+ ret z
+ add $10
+ ld [hl], a
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ add $9
+ ld [hl], a
+ ret
+; e2221 (38:6221)
+
+LZ_e2221: ; e2221
+INCBIN "gfx/unknown/0e2221.2bpp.lz"
diff --git a/engine/events.asm b/engine/events.asm
index 20e2bc0dd..bd26afffd 100644
--- a/engine/events.asm
+++ b/engine/events.asm
@@ -138,7 +138,7 @@ EnterMap: ; 9673e
call ClearAllScriptFlags3
ld a, [hMapEntryMethod]
- cp MAPSETUP_07
+ cp MAPSETUP_CONNECTION
jr nz, .dontset
call SetAll_ScriptFlags3
.dontset
@@ -247,7 +247,7 @@ Function967d1: ; 967d1
Function967e1: ; 967e1
callba RefreshMapAppearDisappear
callba Functiond4d2
- callba Functionb8098
+ callba PlaceMapNameSign
ret
; 967f4
@@ -322,13 +322,13 @@ PlayerEvents: ; 9681f
ld [ScriptRunning], a
call DoPlayerEvent
ld a, [ScriptRunning]
- cp 4
+ cp PLAYEREVENT_CONNECTION
jr z, .ok2
- cp 9
+ cp PLAYEREVENT_JOYCHANGEFACING
jr z, .ok2
xor a
- ld [wc2da], a
+ ld [wLandmarkSignTimer], a
.ok2
scf
@@ -342,7 +342,7 @@ CheckTrainerBattle3: ; 96867
call CheckTrainerBattle2
jr nc, .nope
- ld a, 1
+ ld a, PLAYEREVENT_SEENBYTRAINER
scf
ret
@@ -359,10 +359,10 @@ CheckTileEvent: ; 96874
jr z, .bit2
callba CheckMovingOffEdgeOfMap
- jr c, .return4
+ jr c, .map_connection
call CheckWarpTile
- jr c, .return6
+ jr c, .warp_tile
.bit2
call CheckBit1_ScriptFlags3
@@ -390,21 +390,21 @@ CheckTileEvent: ; 96874
xor a
ret
-.return4
- ld a, 4
+.map_connection
+ ld a, PLAYEREVENT_CONNECTION
scf
ret
-.return6
+.warp_tile
ld a, [PlayerStandingTile]
call CheckPitTile
- jr nz, .pittile
- ld a, 6
+ jr nz, .not_pit
+ ld a, PLAYEREVENT_FALL
scf
ret
-.pittile
- ld a, 5
+.not_pit
+ ld a, PLAYEREVENT_WARP
scf
ret
@@ -711,7 +711,7 @@ TryReadSign: ; 96a38
ret
.IsSign
- ld a, [wd040]
+ ld a, [EngineBuffer3]
ld hl, .signs
rst JumpTable
ret
@@ -749,7 +749,7 @@ TryReadSign: ; 96a38
.read
call PlayTalkObject
- ld hl, wd041
+ ld hl, EngineBuffer4
ld a, [hli]
ld h, [hl]
ld l, a
@@ -811,7 +811,7 @@ endr
CheckSignFlag: ; 96ad8
- ld hl, wd041
+ ld hl, EngineBuffer4
ld a, [hli]
ld h, [hl]
ld l, a
@@ -820,7 +820,7 @@ CheckSignFlag: ; 96ad8
call GetFarHalfword
ld e, l
ld d, h
- ld b, $2 ; check
+ ld b, CHECK_FLAG
call EventFlagAction
ld a, c
and a
@@ -899,7 +899,7 @@ PlayerMovement: ; 96af0
CheckMenuOW: ; 96b30
xor a
ld [hMenuReturn], a
- ld [$ffa1], a
+ ld [hMenuReturn + 1], a
ld a, [hJoyPressed]
bit 2, a ; SELECT
@@ -1050,14 +1050,16 @@ DoPlayerEvent: ; 96beb
ld a, [ScriptRunning]
and a
ret z
- cp -1 ; run script
+
+ cp PLAYEREVENT_MAPSCRIPT ; run script
ret z
- cp 10
+
+ cp NUM_PLAYER_EVENTS
ret nc
ld c, a
ld b, 0
- ld hl, ScriptPointers96c0c
+ ld hl, PlayerEventScriptPointers
rept 3
add hl,bc
endr
@@ -1070,25 +1072,25 @@ endr
ret
; 96c0c
-ScriptPointers96c0c: ; 96c0c
- dba Invalid_0x96c2d
- dba SeenByTrainerScript
- dba TalkToTrainerScript
- dba FindItemInBallScript
- dba UnknownScript_0x96c4d
- dba WarpToNewMapScript
- dba FallIntoMapScript
- dba UnknownScript_0x124c8
- dba HatchEggScript
- dba UnknownScript_0x96c4f
- dba Invalid_0x96c2d
+PlayerEventScriptPointers: ; 96c0c
+ dba Invalid_0x96c2d ; 0
+ dba SeenByTrainerScript ; 1
+ dba TalkToTrainerScript ; 2
+ dba FindItemInBallScript ; 3
+ dba UnknownScript_0x96c4d ; 4
+ dba WarpToNewMapScript ; 5
+ dba FallIntoMapScript ; 6
+ dba Script_OverworldWhiteout ; 7
+ dba HatchEggScript ; 8
+ dba UnknownScript_0x96c4f ; 9
+ dba Invalid_0x96c2d ; 10
; 96c2d
Invalid_0x96c2d: ; 96c2d
end
; 96c2e
-UnknownScript_0x96c2e: ; 96c2e
+; unreferenced
end
; 96c2f
@@ -1099,12 +1101,12 @@ HatchEggScript: ; 96c2f
WarpToNewMapScript: ; 96c34
warpsound
- newloadmap MAPSETUP_05
+ newloadmap MAPSETUP_DOOR
end
; 96c38
FallIntoMapScript: ; 96c38
- newloadmap MAPSETUP_06
+ newloadmap MAPSETUP_FALL
playsound SFX_KINESIS
applymovement PLAYER, MovementData_0x96c48
playsound SFX_STRENGTH
@@ -1122,11 +1124,11 @@ LandAfterPitfallScript: ; 96c4a
end
; 96c4d
-UnknownScript_0x96c4d: ; 96c4d
- reloadandreturn $f7
+UnknownScript_0x96c4d: ; 4
+ reloadandreturn MAPSETUP_CONNECTION
; 96c4f
-UnknownScript_0x96c4f: ; 96c4f
+UnknownScript_0x96c4f: ; 9
deactivatefacing $3
callasm SetBit4_ScriptFlags3
end
diff --git a/engine/events_3.asm b/engine/events_3.asm
new file mode 100755
index 000000000..f9f8ffedc
--- /dev/null
+++ b/engine/events_3.asm
@@ -0,0 +1,863 @@
+ReturnFromMapSetupScript:: ; b8000
+ xor a
+ ld [hBGMapMode], a
+ ; For some reson, GameFreak chose to use a callba here instead of just falling through.
+ ; No other function in the game references the function at 2E:400A, here labeled
+ ; ReturnFromMapSetupScript.inefficientcallba.
+ callba .inefficientcallba ; this is a waste of 6 ROM bytes and 2 stack bytes
+ ret
+; b800a
+
+.inefficientcallba: ; b800a
+ ld a, [MapGroup]
+ ld b, a
+ ld a, [MapNumber]
+ ld c, a
+ call GetWorldMapLocation
+ ld [wCurrentLandmark], a
+ call .CheckNationalParkGate
+ jr z, .nationalparkgate
+
+ call GetMapPermission
+ cp GATE
+ jr nz, .not_gate
+
+.nationalparkgate
+ ld a, -1
+ ld [wCurrentLandmark], a
+
+.not_gate
+ ld hl, wEnteredMapFromContinue
+ bit 1, [hl]
+ res 1, [hl]
+ jr nz, .dont_do_map_sign
+
+ call .CheckMovingWithinLandmark
+ jr z, .dont_do_map_sign
+ ld a, [wCurrentLandmark]
+ ld [wPreviousLandmark], a
+
+ call .CheckSpecialMap
+ jr z, .dont_do_map_sign
+
+; Display for 60 frames
+ ld a, 60
+ ld [wLandmarkSignTimer], a
+ call LoadMapNameSignGFX
+ call InitMapNameFrame
+ callba Function104303
+ ret
+
+.dont_do_map_sign
+ ld a, [wCurrentLandmark]
+ ld [wPreviousLandmark], a
+ ld a, $90
+ ld [rWY], a
+ ld [hWY], a
+ xor a
+ ld [hLCDStatCustom], a
+ ret
+; b8064
+
+.CheckMovingWithinLandmark: ; b8064
+ ld a, [wCurrentLandmark]
+ ld c, a
+ ld a, [wPreviousLandmark]
+ cp c
+ ret z
+ cp $0
+ ret
+; b8070
+
+.CheckSpecialMap: ; b8070
+ cp -1
+ ret z
+ cp SPECIAL_MAP
+ ret z
+ cp RADIO_TOWER
+ ret z
+ cp LAV_RADIO_TOWER
+ ret z
+ cp UNDERGROUND
+ ret z
+ cp INDIGO_PLATEAU
+ ret z
+ cp POWER_PLANT
+ ret z
+ ld a, $1
+ and a
+ ret
+; b8089
+
+.CheckNationalParkGate: ; b8089
+ ld a, [MapGroup]
+ cp GROUP_ROUTE_35_NATIONAL_PARK_GATE
+ ret nz
+ ld a, [MapNumber]
+ cp MAP_ROUTE_35_NATIONAL_PARK_GATE
+ ret z
+ cp MAP_ROUTE_36_NATIONAL_PARK_GATE
+ ret
+; b8098
+
+
+PlaceMapNameSign:: ; b8098 (2e:4098)
+ ld hl, wLandmarkSignTimer
+ ld a, [hl]
+ and a
+ jr z, .disappear
+ dec [hl]
+ cp 60
+ ret z
+ cp 59
+ jr nz, .skip2
+ call InitMapNameFrame
+ call PlaceMapNameCenterAlign
+ callba Function104303
+.skip2
+ ld a, $80
+ ld a, $70
+ ld [rWY], a
+ ld [hWY], a
+ ret
+
+.disappear
+ ld a, $90
+ ld [rWY], a
+ ld [hWY], a
+ xor a
+ ld [hLCDStatCustom], a
+ ret
+
+
+LoadMapNameSignGFX: ; b80c6
+ ld de, MapEntryFrameGFX
+ ld hl, VTiles2 tile $60
+ lb bc, BANK(MapEntryFrameGFX), $e
+ call Get2bpp
+ ret
+; b80d3
+
+InitMapNameFrame: ; b80d3
+ hlcoord 0, 0
+ ld b, 2
+ ld c, 18
+ call InitMapSignAttrMap
+ call PlaceMapNameFrame
+ ret
+; b80e1
+
+
+PlaceMapNameCenterAlign: ; b80e1 (2e:40e1)
+ ld a, [wCurrentLandmark]
+ ld e, a
+ callba GetLandmarkName
+ call .GetNameLength
+ ld a, SCREEN_WIDTH
+ sub c
+ srl a
+ ld b, $0
+ ld c, a
+ hlcoord 0, 2
+ add hl, bc
+ ld de, StringBuffer1
+ call PlaceString
+ ret
+
+.GetNameLength: ; b8101 (2e:4101)
+ ld c, 0
+ push hl
+ ld hl, StringBuffer1
+.loop
+ ld a, [hli]
+ cp "@"
+ jr z, .stop
+ cp "%"
+ jr z, .loop
+ inc c
+ jr .loop
+.stop
+ pop hl
+ ret
+
+
+InitMapSignAttrMap: ; b8115
+ ld de, AttrMap - TileMap
+ add hl, de
+rept 2
+ inc b
+endr
+rept 2
+ inc c
+endr
+ ld a, $87
+.loop
+ push bc
+ push hl
+.inner_loop
+ ld [hli], a
+ dec c
+ jr nz, .inner_loop
+ pop hl
+ ld de, SCREEN_WIDTH
+ add hl, de
+ pop bc
+ dec b
+ jr nz, .loop
+ ret
+; b812f
+
+PlaceMapNameFrame: ; b812f
+ hlcoord 0, 0
+ ; top left
+ ld a, $61
+ ld [hli], a
+ ; top row
+ ld a, $62
+ call .FillTopBottom
+ ; top right
+ ld a, $64
+ ld [hli], a
+ ; left, first line
+ ld a, $65
+ ld [hli], a
+ ; first line
+ call .FillMiddle
+ ; right, first line
+ ld a, $6b
+ ld [hli], a
+ ; left, second line
+ ld a, $66
+ ld [hli], a
+ ; second line
+ call .FillMiddle
+ ; right, second line
+ ld a, $6c
+ ld [hli], a
+ ; bottom left
+ ld a, $67
+ ld [hli], a
+ ; bottom
+ ld a, $68
+ call .FillTopBottom
+ ; bottom right
+ ld a, $6a
+ ld [hl], a
+ ret
+; b815b
+
+.FillMiddle: ; b815b
+ ld c, 18
+ ld a, $6d
+.loop
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ret
+; b8164
+
+.FillTopBottom: ; b8164
+ ld c, 5
+ jr .enterloop
+
+.continueloop
+rept 2
+ ld [hli], a
+endr
+
+.enterloop
+ inc a
+rept 2
+ ld [hli], a
+endr
+ dec a
+ dec c
+ jr nz, .continueloop
+ ret
+; b8172
+
+CheckForSignpostItems: ; b8172
+; Checks to see if there are hidden items on the screen that have not yet been found. If it finds one, returns carry.
+ call GetMapScriptHeaderBank
+ ld [Buffer1], a
+; Get the coordinate of the bottom right corner of the screen, and load it in wd1ec/wd1ed.
+ ld a, [XCoord]
+ add SCREEN_WIDTH / 4
+ ld [wd1ed], a
+ ld a, [YCoord]
+ add SCREEN_HEIGHT / 4
+ ld [wd1ec], a
+; Get the pointer for the first signpost header in the map...
+ ld hl, wdc02
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+; ... before even checking to see if there are any signposts on this map.
+ ld a, [wCurrentMapSignpostCount]
+ and a
+ jr z, .nosignpostitems
+; For i = 1:wCurrentMapSignpostCount...
+.loop
+; Store the counter in Buffer2, and store the signpost header pointer in the stack.
+ ld [Buffer2], a
+ push hl
+; Get the Y coordinate of the signpost.
+ call .GetFarByte
+ ld e, a
+; Is the Y coordinate of the signpost on the screen? If not, go to the next signpost.
+ ld a, [wd1ec]
+ sub e
+ jr c, .next
+ cp SCREEN_HEIGHT / 2
+ jr nc, .next
+; Is the X coordinate of the signpost on the screen? If not, go to the next signpost.
+ call .GetFarByte
+ ld d, a
+ ld a, [wd1ed]
+ sub d
+ jr c, .next
+ cp SCREEN_WIDTH / 2
+ jr nc, .next
+; Is this signpost a hidden item? If not, go to the next signpost.
+ call .GetFarByte
+ cp SIGNPOST_ITEM
+ jr nz, .next
+; Has this item already been found? If not, set off the Itemfinder.
+ ld a, [Buffer1]
+ call GetFarHalfword
+ ld a, [Buffer1]
+ call GetFarHalfword
+ ld d, h
+ ld e, l
+ ld b, CHECK_FLAG
+ call EventFlagAction
+ ld a, c
+ and a
+ jr z, .itemnearby
+
+.next
+; Restore the signpost header pointer and increment it by the length of a signpost header.
+ pop hl
+ ld bc, 5
+ add hl, bc
+; Restore the signpost counter and decrement it. If it hits zero, there are no hidden items in range.
+ ld a, [Buffer2]
+ dec a
+ jr nz, .loop
+
+.nosignpostitems
+ xor a
+ ret
+
+.itemnearby
+ pop hl
+ scf
+ ret
+; b81e2
+
+.GetFarByte: ; b81e2
+ ld a, [Buffer1]
+ call GetFarByte
+ inc hl
+ ret
+; b81ea
+
+
+TreeMonEncounter: ; b81ea
+ callba MobileFn_1060ef
+
+ xor a
+ ld [TempWildMonSpecies], a
+ ld [CurPartyLevel], a
+
+ ld hl, TreeMonMaps
+ call GetTreeMonSet
+ jr nc, .no_battle
+
+ call GetTreeMons
+ jr nc, .no_battle
+
+ call GetTreeMon
+ jr nc, .no_battle
+
+ ld a, BATTLETYPE_TREE
+ ld [BattleType], a
+ ld a, 1
+ ld [ScriptVar], a
+ ret
+
+.no_battle
+ xor a
+ ld [ScriptVar], a
+ ret
+; b8219
+
+RockMonEncounter: ; b8219
+
+ xor a
+ ld [TempWildMonSpecies], a
+ ld [CurPartyLevel], a
+
+ ld hl, RockMonMaps
+ call GetTreeMonSet
+ jr nc, .no_battle
+
+ call GetTreeMons
+ jr nc, .no_battle
+
+ ld a, 10
+ call RandomRange
+ cp 4
+ jr nc, .no_battle
+
+ call SelectTreeMon
+ jr nc, .no_battle
+
+ ret
+
+.no_battle
+ xor a
+ ret
+; b823e
+
+ db $05 ; ????
+
+GetTreeMonSet: ; b823f
+; Return carry and treemon set in a
+; if the current map is in table hl.
+ ld a, [MapNumber]
+ ld e, a
+ ld a, [MapGroup]
+ ld d, a
+.loop
+ ld a, [hli]
+ cp -1
+ jr z, .not_in_table
+
+ cp d
+ jr nz, .skip2
+
+ ld a, [hli]
+ cp e
+ jr nz, .skip1
+
+ jr .in_table
+
+.skip2
+ inc hl
+.skip1
+ inc hl
+ jr .loop
+
+.not_in_table
+ xor a
+ ret
+
+.in_table
+ ld a, [hl]
+ scf
+ ret
+; b825e
+
+TreeMonMaps: ; b825e
+treemon_map: macro
+ map \1
+ db \2 ; treemon set
+endm
+ treemon_map ROUTE_26, 4
+ treemon_map ROUTE_27, 4
+ treemon_map ROUTE_28, 0
+ treemon_map ROUTE_29, 3
+ treemon_map ROUTE_30, 3
+ treemon_map ROUTE_31, 3
+ treemon_map ROUTE_32, 4
+ treemon_map ROUTE_33, 2
+ treemon_map ROUTE_34, 3
+ treemon_map ROUTE_35, 3
+ treemon_map ROUTE_36, 3
+ treemon_map ROUTE_37, 3
+ treemon_map ROUTE_38, 3
+ treemon_map ROUTE_39, 3
+ treemon_map ROUTE_40, 0
+ treemon_map ROUTE_41, 0
+ treemon_map ROUTE_42, 2
+ treemon_map ROUTE_43, 5
+ treemon_map ROUTE_44, 1
+ treemon_map ROUTE_45, 1
+ treemon_map ROUTE_46, 1
+ treemon_map NEW_BARK_TOWN, 0
+ treemon_map CHERRYGROVE_CITY, 0
+ treemon_map VIOLET_CITY, 0
+ treemon_map AZALEA_TOWN, 2
+ treemon_map CIANWOOD_CITY, 0
+ treemon_map GOLDENROD_CITY, 0
+ treemon_map OLIVINE_CITY, 0
+ treemon_map ECRUTEAK_CITY, 0
+ treemon_map MAHOGANY_TOWN, 0
+ treemon_map LAKE_OF_RAGE, 5
+ treemon_map BLACKTHORN_CITY, 0
+ treemon_map SILVER_CAVE_OUTSIDE, 0
+ treemon_map ILEX_FOREST, 6
+ db -1
+; b82c5
+
+RockMonMaps: ; b82c5
+ treemon_map CIANWOOD_CITY, 7
+ treemon_map ROUTE_40, 7
+ treemon_map DARK_CAVE_VIOLET_ENTRANCE, 7
+ treemon_map SLOWPOKE_WELL_B1F, 7
+ db -1
+; b82d2
+
+GetTreeMons: ; b82d2
+; Return the address of TreeMon table a in hl.
+; Return nc if table a doesn't exist.
+
+ cp 8
+ jr nc, .quit
+
+ and a
+ jr z, .quit
+
+ ld e, a
+ ld d, 0
+ ld hl, TreeMons
+rept 2
+ add hl, de
+endr
+
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+ scf
+ ret
+
+.quit
+ xor a
+ ret
+; b82e8
+
+TreeMons: ; b82e8
+ dw TreeMons1
+ dw TreeMons1
+ dw TreeMons2
+ dw TreeMons3
+ dw TreeMons4
+ dw TreeMons5
+ dw TreeMons6
+ dw RockMons
+ dw TreeMons1
+
+; Two tables each (normal, rare).
+; Structure:
+; db %, species, level
+
+TreeMons1: ; b82fa
+ db 50, SPEAROW, 10
+ db 15, SPEAROW, 10
+ db 15, SPEAROW, 10
+ db 10, AIPOM, 10
+ db 5, AIPOM, 10
+ db 5, AIPOM, 10
+ db -1
+
+ db 50, SPEAROW, 10
+ db 15, HERACROSS, 10
+ db 15, HERACROSS, 10
+ db 10, AIPOM, 10
+ db 5, AIPOM, 10
+ db 5, AIPOM, 10
+ db -1
+
+TreeMons2: ; b8320
+ db 50, SPEAROW, 10
+ db 15, EKANS, 10
+ db 15, SPEAROW, 10
+ db 10, AIPOM, 10
+ db 5, AIPOM, 10
+ db 5, AIPOM, 10
+ db -1
+
+ db 50, SPEAROW, 10
+ db 15, HERACROSS, 10
+ db 15, HERACROSS, 10
+ db 10, AIPOM, 10
+ db 5, AIPOM, 10
+ db 5, AIPOM, 10
+ db -1
+
+TreeMons3: ; b8346
+ db 50, HOOTHOOT, 10
+ db 15, SPINARAK, 10
+ db 15, LEDYBA, 10
+ db 10, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db -1
+
+ db 50, HOOTHOOT, 10
+ db 15, PINECO, 10
+ db 15, PINECO, 10
+ db 10, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db -1
+
+TreeMons4: ; b836c
+ db 50, HOOTHOOT, 10
+ db 15, EKANS, 10
+ db 15, HOOTHOOT, 10
+ db 10, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db -1
+
+ db 50, HOOTHOOT, 10
+ db 15, PINECO, 10
+ db 15, PINECO, 10
+ db 10, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db -1
+
+TreeMons5: ; b8392
+ db 50, HOOTHOOT, 10
+ db 15, VENONAT, 10
+ db 15, HOOTHOOT, 10
+ db 10, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db -1
+
+ db 50, HOOTHOOT, 10
+ db 15, PINECO, 10
+ db 15, PINECO, 10
+ db 10, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db -1
+
+TreeMons6: ; b83b8
+ db 50, HOOTHOOT, 10
+ db 15, PINECO, 10
+ db 15, PINECO, 10
+ db 10, NOCTOWL, 10
+ db 5, BUTTERFREE, 10
+ db 5, BEEDRILL, 10
+ db -1
+
+ db 50, HOOTHOOT, 10
+ db 15, CATERPIE, 10
+ db 15, WEEDLE, 10
+ db 10, HOOTHOOT, 10
+ db 5, METAPOD, 10
+ db 5, KAKUNA, 10
+ db -1
+
+RockMons: ; b83de
+ db 90, KRABBY, 15
+ db 10, SHUCKLE, 15
+ db -1
+; b83e5
+
+GetTreeMon: ; b83e5
+ push hl
+ call GetTreeScore
+ pop hl
+ and a
+ jr z, .bad
+ cp 1
+ jr z, .good
+ cp 2
+ jr z, .rare
+ ret
+
+.bad
+ ld a, 10
+ call RandomRange
+ and a
+ jr nz, NoTreeMon
+ jr SelectTreeMon
+
+.good
+ ld a, 10
+ call RandomRange
+ cp 5
+ jr nc, NoTreeMon
+ jr SelectTreeMon
+
+.rare
+ ld a, 10
+ call RandomRange
+ cp 8
+ jr nc, NoTreeMon
+ jr .skip
+.skip
+ ld a, [hli]
+ cp -1
+ jr nz, .skip
+ call SelectTreeMon
+ ret
+; b841f
+
+SelectTreeMon: ; b841f
+; Read a TreeMons table and pick one monster at random.
+
+ ld a, 100
+ call RandomRange
+.loop
+ sub [hl]
+ jr c, .ok
+rept 3
+ inc hl
+endr
+ jr .loop
+
+.ok
+ ld a, [hli]
+ cp $ff
+ jr z, NoTreeMon
+
+ ld a, [hli]
+ ld [TempWildMonSpecies], a
+ ld a, [hl]
+ ld [CurPartyLevel], a
+ scf
+ ret
+
+NoTreeMon: ; b843b
+ xor a
+ ld [TempWildMonSpecies], a
+ ld [CurPartyLevel], a
+ ret
+; b8443
+
+GetTreeScore: ; b8443
+ call .CoordScore
+ ld [Buffer1], a
+ call .OTIDScore
+ ld [Buffer2], a
+ ld c, a
+ ld a, [Buffer1]
+ sub c
+ jr z, .rare
+ jr nc, .ok
+ add 10
+.ok
+ cp 5
+ jr c, .good
+
+.bad
+ xor a
+ ret
+
+.good
+ ld a, 1
+ ret
+
+.rare
+ ld a, 2
+ ret
+; b8466
+
+.CoordScore: ; b8466
+ call GetFacingTileCoord
+ ld hl, 0
+ ld c, e
+ ld b, 0
+ ld a, d
+
+ and a
+ jr z, .next
+.loop
+ add hl, bc
+ dec a
+ jr nz, .loop
+.next
+
+ add hl, bc
+ ld c, d
+ add hl, bc
+
+ ld a, h
+ ld [hDividend], a
+ ld a, l
+ ld [hDividend + 1], a
+ ld a, 5
+ ld [hDivisor], a
+ ld b, 2
+ call Divide
+
+ ld a, [hQuotient + 1]
+ ld [hDividend], a
+ ld a, [hQuotient + 2]
+ ld [hDividend + 1], a
+ ld a, 10
+ ld [hDivisor], a
+ ld b, 2
+ call Divide
+
+ ld a, [hQuotient + 3]
+ ret
+; b849d
+
+.OTIDScore: ; b849d
+ ld a, [PlayerID]
+ ld [hDividend], a
+ ld a, [PlayerID + 1]
+ ld [hDividend + 1], a
+ ld a, 10
+ ld [hDivisor], a
+ ld b, 2
+ call Divide
+ ld a, [hQuotient + 3]
+ ret
+; b84b3
+
+LoadFishingGFX: ; b84b3
+ ld a, [rVBK]
+ push af
+ ld a, $1
+ ld [rVBK], a
+
+ ld de, FishingGFX
+ ld a, [PlayerGender]
+ bit 0, a
+ jr z, .got_gender
+ ld de, KrisFishingGFX
+.got_gender
+
+ ld hl, VTiles0 tile $02
+ call .LoadGFX
+ ld hl, VTiles0 tile $06
+ call .LoadGFX
+ ld hl, VTiles0 tile $0a
+ call .LoadGFX
+ ld hl, VTiles1 tile $7c
+ call .LoadGFX
+
+ pop af
+ ld [rVBK], a
+ ret
+; b84e3
+
+.LoadGFX: ; b84e3
+ lb bc, BANK(FishingGFX), 2
+ push de
+ call Get2bpp
+ pop de
+ ld hl, 2 tiles
+ add hl, de
+ ld d, h
+ ld e, l
+ ret
+; b84f2
+
+FishingGFX: ; b84f2
+INCBIN "gfx/overworld/chris_fish.2bpp"
+; b8582
+
+KrisFishingGFX: ; b8582
+INCBIN "gfx/overworld/kris_fish.2bpp"
+; b8612
diff --git a/engine/evolution_animation.asm b/engine/evolution_animation.asm
new file mode 100755
index 000000000..69e7aec4c
--- /dev/null
+++ b/engine/evolution_animation.asm
@@ -0,0 +1,457 @@
+EvolutionAnimation: ; 4e5e1
+ push hl
+ push de
+ push bc
+ ld a, [CurSpecies]
+ push af
+ ld a, [rOBP0]
+ push af
+ ld a, [BaseDexNo]
+ push af
+
+ call _EvolutionAnimation
+
+ pop af
+ ld [BaseDexNo], a
+ pop af
+ ld [rOBP0], a
+ pop af
+ ld [CurSpecies], a
+ pop bc
+ pop de
+ pop hl
+
+ ld a, [wd1ed]
+ and a
+ ret z
+
+ scf
+ ret
+; 4e607
+
+_EvolutionAnimation: ; 4e607
+ ld a, $e4
+ ld [rOBP0], a
+
+ ld de, MUSIC_NONE
+ call PlayMusic
+
+ callba Function8cf53
+
+ ld de, EvolutionGFX
+ ld hl, VTiles0
+ lb bc, BANK(EvolutionGFX), 8
+ call Request2bpp
+
+ xor a
+ ld [Danger], a
+ call WaitBGMap
+ xor a
+ ld [hBGMapMode], a
+ ld a, [Buffer1]
+ ld [PlayerHPPal], a
+
+ ld c, $0
+ call Function4e703
+ ld a, [Buffer1]
+ ld [CurPartySpecies], a
+ ld [CurSpecies], a
+ call Function4e708
+
+ ld de, VTiles2
+ ld hl, VTiles2 tile $31
+ ld bc, $31
+ call Request2bpp
+
+ ld a, $31
+ ld [wd1ec], a
+ call Evolution_FlashFrontpics
+ ld a, [Buffer2]
+ ld [CurPartySpecies], a
+ ld [CurSpecies], a
+ call Function4e711
+ ld a, [Buffer1]
+ ld [CurPartySpecies], a
+ ld [CurSpecies], a
+
+ ld a, $1
+ ld [hBGMapMode], a
+ call Function4e794
+ jr c, .skip_cry
+
+ ld a, [Buffer1]
+ call PlayCry
+
+.skip_cry
+ ld de, MUSIC_EVOLUTION
+ call PlayMusic
+
+ ld c, 80
+ call DelayFrames
+
+ ld c, $1
+ call Function4e703
+ call Function4e726
+ jr c, .pressed_b
+
+ ld a, $cf
+ ld [wd1ec], a
+
+ call Evolution_FlashFrontpics
+ xor a
+ ld [wd1ed], a
+
+ ld a, [Buffer2]
+ ld [PlayerHPPal], a
+
+ ld c, $0
+ call Function4e703
+ call Function4e7a6
+ callba Function8cf53
+ call Function4e794
+ jr c, .asm_4e6de
+
+ ld a, [wc2c6]
+ push af
+ ld a, $1
+ ld [wc2c6], a
+ ld a, [CurPartySpecies]
+ push af
+
+ ld a, [PlayerHPPal]
+ ld [CurPartySpecies], a
+ hlcoord 7, 2
+ ld d, $0
+ ld e, ANIM_MON_EVOLVE
+ predef AnimateFrontpic
+
+ pop af
+ ld [CurPartySpecies], a
+ pop af
+ ld [wc2c6], a
+ ret
+
+.asm_4e6de
+ ret
+
+.pressed_b
+ ld a, $1
+ ld [wd1ed], a
+
+ ld a, [Buffer1]
+ ld [PlayerHPPal], a
+
+ ld c, $0
+ call Function4e703
+ call Function4e7a6
+ callba Function8cf53
+ call Function4e794
+ ret c
+
+ ld a, [PlayerHPPal]
+ call PlayCry
+ ret
+; 4e703
+
+Function4e703: ; 4e703
+ ld b, $b
+ jp GetSGBLayout
+; 4e708
+
+Function4e708: ; 4e708
+ call GetBaseData
+ hlcoord 7, 2
+ jp PrepMonFrontpic
+; 4e711
+
+Function4e711: ; 4e711
+ call GetBaseData
+ ld a, $1
+ ld [wc2c6], a
+ ld de, VTiles2
+ predef Function5108b
+ xor a
+ ld [wc2c6], a
+ ret
+; 4e726
+
+Function4e726: ; 4e726
+ call ClearJoypad
+ lb bc, 1, 14
+.loop
+ push bc
+ call Evolution_CheckPressedB
+ pop bc
+ jr c, .pressed_b
+ push bc
+ call Evolution_NextFrame
+ pop bc
+ inc b
+rept 2
+ dec c
+endr
+ jr nz, .loop
+ and a
+ ret
+
+.pressed_b
+ scf
+ ret
+; 4e741
+
+Evolution_NextFrame: ; 4e741
+.loop
+ ld a, -49
+ ld [wd1ec], a
+ call Evolution_FlashFrontpics
+ ld a, 49
+ ld [wd1ec], a
+ call Evolution_FlashFrontpics
+ dec b
+ jr nz, .loop
+ ret
+; 4e755
+
+Evolution_FlashFrontpics: ; 4e755
+ push bc
+ xor a
+ ld [hBGMapMode], a
+ hlcoord 7, 2
+ lb bc, 7, 7
+ ld de, $d
+.loop1
+ push bc
+.loop2
+ ld a, [wd1ec]
+ add [hl]
+ ld [hli], a
+ dec c
+ jr nz, .loop2
+ pop bc
+ add hl, de
+ dec b
+ jr nz, .loop1
+ ld a, $1
+ ld [hBGMapMode], a
+ call WaitBGMap
+ pop bc
+ ret
+; 4e779
+
+Evolution_CheckPressedB: ; 4e779
+.loop
+ call DelayFrame
+ push bc
+ call JoyTextDelay
+ ld a, [hJoyDown]
+ pop bc
+ and B_BUTTON
+ jr nz, .pressed_b
+.loop2
+ dec c
+ jr nz, .loop
+ and a
+ ret
+
+.pressed_b
+ ld a, [wd1e9]
+ and a
+ jr nz, .loop2
+ scf
+ ret
+; 4e794
+
+Function4e794: ; 4e794
+ ld a, [CurPartyMon]
+ ld hl, PartyMon1Species
+ call GetPartyLocation
+ ld b, h
+ ld c, l
+ callba CheckFaintedFrzSlp
+ ret
+; 4e7a6
+
+Function4e7a6: ; 4e7a6
+ ld a, [wd1ed]
+ and a
+ ret nz
+ ld de, SFX_EVOLVED
+ call PlaySFX
+ ld hl, wJumptableIndex
+ ld a, [hl]
+ push af
+ ld [hl], $0
+.asm_4e7b8
+ call Function4e7cf
+ jr nc, .asm_4e7c2
+ call Function4e80c
+ jr .asm_4e7b8
+
+.asm_4e7c2
+ ld c, $20
+.asm_4e7c4
+ call Function4e80c
+ dec c
+ jr nz, .asm_4e7c4
+ pop af
+ ld [wJumptableIndex], a
+ ret
+; 4e7cf
+
+Function4e7cf: ; 4e7cf
+ ld hl, wJumptableIndex
+ ld a, [hl]
+ cp $20
+ ret nc
+ ld d, a
+ inc [hl]
+ and $1
+ jr nz, .asm_4e7e6
+ ld e, $0
+ call Function4e7e8
+ ld e, $10
+ call Function4e7e8
+
+.asm_4e7e6
+ scf
+ ret
+; 4e7e8
+
+Function4e7e8: ; 4e7e8
+ push de
+ ld de, $4858
+ ld a, $13
+ call Function3b2a
+ ld hl, $b
+ add hl, bc
+ ld a, [wJumptableIndex]
+ and $e
+ sla a
+ pop de
+ add e
+ ld [hl], a
+ ld hl, $3
+ add hl, bc
+ ld [hl], $0
+ ld hl, $c
+ add hl, bc
+ ld [hl], $10
+ ret
+; 4e80c
+
+Function4e80c: ; 4e80c
+ push bc
+ callab Function8cf69
+ ld a, [hVBlankCounter]
+ and $e
+ srl a
+rept 2
+ inc a
+endr
+ and $7
+ ld b, a
+ ld hl, Sprites + 3
+ ld c, $28
+.asm_4e823
+ ld a, [hl]
+ or b
+ ld [hli], a
+rept 3
+ inc hl
+endr
+ dec c
+ jr nz, .asm_4e823
+ pop bc
+ call DelayFrame
+ ret
+; 4e831
+
+
+EvolutionGFX:
+INCBIN "gfx/evo/bubble_large.2bpp"
+INCBIN "gfx/evo/bubble.2bpp"
+
+Function4e881: ; 4e881
+ call ClearBGPalettes
+ call ClearTileMap
+ call ClearSprites
+ call DisableLCD
+ call LoadStandardFont
+ call LoadFontsBattleExtra
+ ld hl, VBGMap0
+ ld bc, VBGMap1 - VBGMap0
+ ld a, " "
+ call ByteFill
+ hlcoord 0, 0, AttrMap
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ xor a
+ call ByteFill
+ xor a
+ ld [hSCY], a
+ ld [hSCX], a
+ call EnableLCD
+ ld hl, UnknownText_0x4e8bd
+ call PrintText
+ call Function3200
+ call SetPalettes
+ ret
+; 4e8bd
+
+UnknownText_0x4e8bd: ; 0x4e8bd
+ ; SAVING RECORD… DON'T TURN OFF!
+ text_jump UnknownText_0x1bd39e
+ db "@"
+; 0x4e8c2
+
+
+Function4e8c2: ; 4e8c2
+ call ClearBGPalettes
+ call ClearTileMap
+ call ClearSprites
+ call DisableLCD
+ call LoadStandardFont
+ call LoadFontsBattleExtra
+ ld hl, VBGMap0
+ ld bc, VBGMap1 - VBGMap0
+ ld a, " "
+ call ByteFill
+ hlcoord 0, 0, AttrMap
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ xor a
+ call ByteFill
+ ld hl, wd000
+ ld c, $40
+.asm_4e8ee
+ ld a, -1
+ ld [hli], a
+ ld a, " "
+ ld [hli], a
+ dec c
+ jr nz, .asm_4e8ee
+ xor a
+ ld [hSCY], a
+ ld [hSCX], a
+ call EnableLCD
+ call Function3200
+ call SetPalettes
+ ret
+; 4e906
+
+Function4e906: ; 4e906
+ ld a, [rSVBK]
+ push af
+ ld a, $6
+ ld [rSVBK], a
+ ld hl, w6_d000
+ ld bc, w6_d400 - w6_d000
+ ld a, " "
+ call ByteFill
+ ld hl, VBGMap0
+ ld de, w6_d000
+ ld b, $0
+ ld c, $40
+ call Request2bpp
+ pop af
+ ld [rSVBK], a
+ ret
+; 4e929
diff --git a/engine/flypoints.asm b/engine/flypoints.asm
new file mode 100755
index 000000000..7f6d384aa
--- /dev/null
+++ b/engine/flypoints.asm
@@ -0,0 +1,916 @@
+_FlyMap: ; 91af3
+ call ClearBGPalettes
+ call ClearTileMap
+ call ClearSprites
+ ld hl, hInMenu
+ ld a, [hl]
+ push af
+ ld [hl], $1
+ xor a
+ ld [hBGMapMode], a
+ callba Function8cf53
+ call Function91ff2
+ ld de, GFX_922e1
+ ld hl, VTiles2 tile $30
+ lb bc, BANK(GFX_922e1), 6
+ call Request1bpp
+ call FlyMap
+ call Function91c8f
+ ld b, $2
+ call GetSGBLayout
+ call SetPalettes
+.loop
+ call JoyTextDelay
+ ld hl, hJoyPressed
+ ld a, [hl]
+ and B_BUTTON
+ jr nz, .pressedB
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .pressedA
+ call FlyMapScroll
+ call GetMapCursorCoordinates
+ callba Function8cf69
+ call DelayFrame
+ jr .loop
+
+.pressedB
+ ld a, -1
+ jr .exit
+
+.pressedA
+ ld a, [wd002]
+ ld l, a
+ ld h, 0
+ add hl, hl
+ ld de, Flypoints + 1
+ add hl, de
+ ld a, [hl]
+
+.exit
+ ld [wd002], a
+ pop af
+ ld [hInMenu], a
+ call ClearBGPalettes
+ ld a, $90
+ ld [hWY], a
+ xor a
+ ld [hBGMapAddress], a
+ ld a, VBGMap0 / $100
+ ld [hBGMapAddress + 1], a
+ ld a, [wd002]
+ ld e, a
+ ret
+; 91b73
+
+FlyMapScroll: ; 91b73
+ ld a, [StartFlypoint]
+ ld e, a
+ ld a, [EndFlypoint]
+ ld d, a
+ ld hl, hJoyLast
+ ld a, [hl]
+ and D_UP
+ jr nz, .ScrollNext
+ ld a, [hl]
+ and D_DOWN
+ jr nz, .ScrollPrev
+ ret
+
+.ScrollNext
+ ld hl, wd002
+ ld a, [hl]
+ cp d
+ jr nz, .NotAtEndYet
+ ld a, e
+ dec a
+ ld [hl], a
+
+.NotAtEndYet
+ inc [hl]
+ call CheckIfVisitedFlypoint
+ jr z, .ScrollNext
+ jr .Finally
+
+.ScrollPrev
+ ld hl, wd002
+ ld a, [hl]
+ cp e
+ jr nz, .NotAtStartYet
+ ld a, d
+ inc a
+ ld [hl], a
+
+.NotAtStartYet
+ dec [hl]
+ call CheckIfVisitedFlypoint
+ jr z, .ScrollPrev
+
+.Finally
+ call TownMapBubble
+ call WaitBGMap
+ xor a
+ ld [hBGMapMode], a
+ ret
+; 91bb5
+
+TownMapBubble: ; 91bb5
+; Draw the bubble containing the location text in the town map HUD
+
+; Top-left corner
+ hlcoord 1, 0
+ ld a, $30
+ ld [hli], a
+
+; Top row
+ ld bc, 16
+ ld a, " "
+ call ByteFill
+
+; Top-right corner
+ ld a, $31
+ ld [hl], a
+ hlcoord 1, 1
+
+
+; Middle row
+ ld bc, 18
+ ld a, " "
+ call ByteFill
+
+
+; Bottom-left corner
+ hlcoord 1, 2
+ ld a, $32
+ ld [hli], a
+
+; Bottom row
+ ld bc, 16
+ ld a, " "
+ call ByteFill
+
+; Bottom-right corner
+ ld a, $33
+ ld [hl], a
+
+
+; Print "Where?"
+ hlcoord 2, 0
+ ld de, .Where
+ call PlaceString
+
+; Print the name of the default flypoint
+ call .Name
+
+; Up/down arrows
+ hlcoord 18, 1
+ ld [hl], $34
+ ret
+
+.Where
+ db "Where?@"
+
+.Name
+; We need the map location of the default flypoint
+ ld a, [wd002]
+ ld l, a
+ ld h, 0
+ add hl, hl ; two bytes per flypoint
+ ld de, Flypoints
+ add hl, de
+ ld e, [hl]
+
+ callba GetLandmarkName
+
+ hlcoord 2, 1
+ ld de, StringBuffer1
+ call PlaceString
+ ret
+; 91c17
+
+GetMapCursorCoordinates: ; 91c17
+ ld a, [wd002]
+ ld l, a
+ ld h, $0
+ add hl, hl
+ ld de, Flypoints
+ add hl, de
+ ld e, [hl]
+ callba GetLandmarkCoords
+ ld a, [wd003]
+ ld c, a
+ ld a, [wd004]
+ ld b, a
+ ld hl, $4
+ add hl, bc
+ ld [hl], e
+ ld hl, $5
+ add hl, bc
+ ld [hl], d
+ ret
+; 91c3c
+
+CheckIfVisitedFlypoint: ; 91c3c
+; Check if the flypoint loaded in [hl] has been visited yet.
+ push bc
+ push de
+ push hl
+ ld l, [hl]
+ ld h, 0
+ add hl, hl
+ ld de, Flypoints + 1
+ add hl, de
+ ld c, [hl]
+ call HasVisitedSpawn
+ pop hl
+ pop de
+ pop bc
+ and a
+ ret
+; 91c50
+
+HasVisitedSpawn: ; 91c50
+; Check if spawn point c has been visited.
+ ld hl, VisitedSpawns
+ ld b, CHECK_FLAG
+ ld d, 0
+ predef FlagPredef
+ ld a, c
+ ret
+; 91c5e
+
+Flypoints: ; 91c5e
+; landmark, spawn point
+
+ const_def
+
+flypoint: MACRO
+; \1\@FLY EQUS "FLY_\1"
+; \1\@SPAWN EQUS "SPAWN_\1"
+ ; const \1\@FLY
+ ; db \2, \1\@SPAWN
+ const FLY_\1
+ db \2, SPAWN_\1
+ENDM
+
+; Johto
+ flypoint NEW_BARK, NEW_BARK_TOWN
+ flypoint CHERRYGROVE, CHERRYGROVE_CITY
+ flypoint VIOLET, VIOLET_CITY
+ flypoint AZALEA, AZALEA_TOWN
+ flypoint GOLDENROD, GOLDENROD_CITY
+ flypoint ECRUTEAK, ECRUTEAK_CITY
+ flypoint OLIVINE, OLIVINE_CITY
+ flypoint CIANWOOD, CIANWOOD_CITY
+ flypoint MAHOGANY, MAHOGANY_TOWN
+ flypoint LAKE, LAKE_OF_RAGE
+ flypoint BLACKTHORN, BLACKTHORN_CITY
+ flypoint MT_SILVER, SILVER_CAVE
+
+; Kanto
+KANTO_FLYPOINT EQU const_value
+
+ flypoint PALLET, PALLET_TOWN
+ flypoint VIRIDIAN, VIRIDIAN_CITY
+ flypoint PEWTER, PEWTER_CITY
+ flypoint CERULEAN, CERULEAN_CITY
+ flypoint VERMILION, VERMILION_CITY
+ flypoint ROCK_TUNNEL, ROCK_TUNNEL
+ flypoint LAVENDER, LAVENDER_TOWN
+ flypoint CELADON, CELADON_CITY
+ flypoint SAFFRON, SAFFRON_CITY
+ flypoint FUCHSIA, FUCHSIA_CITY
+ flypoint CINNABAR, CINNABAR_ISLAND
+ flypoint INDIGO, INDIGO_PLATEAU
+
+ db -1
+; 91c8f
+
+Function91c8f: ; 91c8f
+ ret
+; 91c90
+
+FlyMap: ; 91c90
+
+ ld a, [MapGroup]
+ ld b, a
+ ld a, [MapNumber]
+ ld c, a
+ call GetWorldMapLocation
+
+; If we're not in a valid location, i.e. Pokecenter floor 2F,
+; the backup map information is used
+
+ cp SPECIAL_MAP
+ jr nz, .CheckRegion
+
+ ld a, [BackupMapGroup]
+ ld b, a
+ ld a, [BackupMapNumber]
+ ld c, a
+ call GetWorldMapLocation
+
+.CheckRegion
+; The first 46 locations are part of Johto. The rest are in Kanto
+ cp KANTO_LANDMARK
+ jr nc, .KantoFlyMap
+
+.JohtoFlyMap
+; Note that .NoKanto should be modified in tandem with this branch
+
+ push af
+
+; Start from New Bark Town
+ ld a, FLY_NEW_BARK
+ ld [wd002], a
+
+; Flypoints begin at New Bark Town...
+ ld [StartFlypoint], a
+; ..and end at Silver Cave
+ ld a, FLY_MT_SILVER
+ ld [EndFlypoint], a
+
+; Fill out the map
+ call FillJohtoMap
+ call .MapHud
+ pop af
+ call TownMapPlayerIcon
+ ret
+
+.KantoFlyMap
+
+; The event that there are no flypoints enabled in a map is not
+; accounted for. As a result, if you attempt to select a flypoint
+; when there are none enabled, the game will crash. Additionally,
+; the flypoint selection has a default starting point that
+; can be flown to even if none are enabled
+
+; To prevent both of these things from happening when the player
+; enters Kanto, fly access is restricted until Indigo Plateau is
+; visited and its flypoint enabled
+
+ push af
+ ld c, SPAWN_INDIGO
+ call HasVisitedSpawn
+ and a
+ jr z, .NoKanto
+
+; Kanto's map is only loaded if we've visited Indigo Plateau
+
+; Flypoints begin at Pallet Town...
+ ld a, FLY_PALLET
+ ld [StartFlypoint], a
+; ...and end at Indigo Plateau
+ ld a, FLY_INDIGO
+ ld [EndFlypoint], a
+
+; Because Indigo Plateau is the first flypoint the player
+; visits, it's made the default flypoint
+ ld [wd002], a
+
+; Fill out the map
+ call FillKantoMap
+ call .MapHud
+ pop af
+ call TownMapPlayerIcon
+ ret
+
+.NoKanto
+; If Indigo Plateau hasn't been visited, we use Johto's map instead
+
+; Start from New Bark Town
+ ld a, FLY_NEW_BARK
+ ld [wd002], a
+
+; Flypoints begin at New Bark Town...
+ ld [StartFlypoint], a
+; ..and end at Silver Cave
+ ld a, FLY_MT_SILVER
+ ld [EndFlypoint], a
+
+ call FillJohtoMap
+
+ pop af
+
+.MapHud
+ call TownMapBubble
+ call TownMapPals
+
+ ld hl, VBGMap0 ; BG Map 0
+ call TownMapBGUpdate
+
+ call TownMapMon
+ ld a, c
+ ld [wd003], a
+ ld a, b
+ ld [wd004], a
+ ret
+; 91d11
+
+Function91d11: ; 91d11
+ ld a, [wd002]
+ push af
+ ld a, [wd003]
+ push af
+ ld a, e
+ ld [wd002], a
+ call ClearSprites
+ xor a
+ ld [hBGMapMode], a
+ ld a, $1
+ ld [hInMenu], a
+ ld de, GFX_922d1
+ ld hl, VTiles0 tile $7f
+ lb bc, BANK(GFX_922d1), 1
+ call Request2bpp ; actually 1bpp
+ call Function91ed0
+ ld hl, VTiles0 tile $78
+ ld c, $4
+ call Request2bpp
+ call Function91ff2
+ call FillKantoMap
+ call Function91de9
+ call TownMapPals
+ ld hl, VBGMap1
+ call TownMapBGUpdate
+ call FillJohtoMap
+ call Function91de9
+ call TownMapPals
+ ld hl, VBGMap0
+ call TownMapBGUpdate
+ ld b, $2
+ call GetSGBLayout
+ call SetPalettes
+ xor a
+ ld [hBGMapMode], a
+ xor a
+ call Function91e1e
+.asm_91d6e
+ call JoyTextDelay
+ ld hl, hJoyPressed
+ ld a, [hl]
+ and A_BUTTON | B_BUTTON
+ jr nz, .asm_91d8f
+ ld a, [hJoypadDown]
+ and SELECT
+ jr nz, .asm_91d87
+ call Function91d9b
+ call Function91dcd
+ jr .asm_91d8a
+
+.asm_91d87
+ call Function91e5a
+
+.asm_91d8a
+ call DelayFrame
+ jr .asm_91d6e
+
+.asm_91d8f
+ call ClearSprites
+ pop af
+ ld [wd003], a
+ pop af
+ ld [wd002], a
+ ret
+; 91d9b
+
+Function91d9b: ; 91d9b
+ ld a, [hl]
+ and $20
+ jr nz, .asm_91da6
+ ld a, [hl]
+ and $10
+ jr nz, .asm_91db7
+ ret
+
+.asm_91da6
+ ld a, [hWY]
+ cp $90
+ ret z
+ call ClearSprites
+ ld a, $90
+ ld [hWY], a
+ xor a
+ call Function91e1e
+ ret
+
+.asm_91db7
+ ld a, [StatusFlags]
+ bit 6, a
+ ret z
+ ld a, [hWY]
+ and a
+ ret z
+ call ClearSprites
+ xor a
+ ld [hWY], a
+ ld a, $1
+ call Function91e1e
+ ret
+; 91dcd
+
+Function91dcd: ; 91dcd
+ ld a, [hVBlankCounter]
+ ld e, a
+ and $f
+ ret nz
+ ld a, e
+ and $10
+ jr nz, .asm_91ddc
+ call ClearSprites
+ ret
+
+.asm_91ddc
+ hlcoord 0, 0
+ ld de, Sprites
+ ld bc, $a0
+ call CopyBytes
+ ret
+; 91de9
+
+Function91de9: ; 91de9
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH
+ ld a, $7f
+ call ByteFill
+ hlcoord 0, 1
+ ld a, $6
+ ld [hli], a
+ ld bc, SCREEN_HEIGHT
+ ld a, $7
+ call ByteFill
+ ld [hl], $17
+ call GetPokemonName
+ hlcoord 2, 0
+ call PlaceString
+ ld h, b
+ ld l, c
+ ld de, String_91e16
+ call PlaceString
+ ret
+; 91e16
+
+String_91e16:
+ db "'S NEST@"
+; 91e1e
+
+Function91e1e: ; 91e1e
+ ld [wd003], a
+ ld e, a
+ callba Function2a01f
+ decoord 0, 0
+ ld hl, Sprites
+.asm_91e2e
+ ld a, [de]
+ and a
+ jr z, .asm_91e4d
+ push de
+ ld e, a
+ push hl
+ callba GetLandmarkCoords
+ pop hl
+ ld a, d
+ sub $4
+ ld [hli], a
+ ld a, e
+ sub $4
+ ld [hli], a
+ ld a, $7f
+ ld [hli], a
+ xor a
+ ld [hli], a
+ pop de
+ inc de
+ jr .asm_91e2e
+
+.asm_91e4d
+ ld hl, Sprites
+ decoord 0, 0
+ ld bc, $a0
+ call CopyBytes
+ ret
+; 91e5a
+
+Function91e5a: ; 91e5a
+ call Function91ea9
+ ret c
+
+ ld a, [wd002]
+ ld e, a
+ callba GetLandmarkCoords
+ ld c, e
+ ld b, d
+ ld de, Unknown_91e9c
+ ld hl, Sprites
+.asm_91e70
+ ld a, [de]
+ cp $80
+ jr z, .asm_91e91
+
+ add b
+ ld [hli], a
+ inc de
+
+ ld a, [de]
+ add c
+ ld [hli], a
+ inc de
+
+ ld a, [de]
+ add $78
+ ld [hli], a
+ inc de
+
+ push bc
+ ld c, 0
+ ld a, [PlayerGender]
+ bit 0, a
+ jr z, .asm_91e8c
+ inc c
+.asm_91e8c
+ ld a, c
+ ld [hli], a
+ pop bc
+
+ jr .asm_91e70
+
+.asm_91e91
+ ld hl, Sprites + $10
+ ld bc, SpritesEnd - (Sprites + $10)
+ xor a
+ call ByteFill
+ ret
+; 91e9c
+
+Unknown_91e9c: ; 91e9c
+ db -8, -8, 0
+ db -8, 0, 1
+ db 0, -8, 2
+ db 0, 0, 3
+ db $80 ; terminator
+; 91ea9
+
+Function91ea9: ; 91ea9
+ ld a, [wd002]
+ cp FAST_SHIP
+ jr z, .johto
+ cp KANTO_LANDMARK
+ jr c, .johto
+
+.kanto
+ ld a, [wd003]
+ and a
+ jr z, .clear
+ jr .ok
+
+.johto
+ ld a, [wd003]
+ and a
+ jr nz, .clear
+
+.ok
+ and a
+ ret
+
+.clear
+ ld hl, Sprites
+ ld bc, SpritesEnd - Sprites
+ xor a
+ call ByteFill
+ scf
+ ret
+; 91ed0
+
+Function91ed0: ; 91ed0
+ ld a, [wd002]
+ cp FAST_SHIP
+ jr z, .asm_91ede
+ callba GetPlayerIcon
+ ret
+
+.asm_91ede
+ ld de, FastShipGFX
+ ld b, BANK(FastShipGFX)
+ ret
+; 91ee4
+
+TownMapBGUpdate: ; 91ee4
+; Update BG Map tiles and attributes
+
+; BG Map address
+ ld a, l
+ ld [hBGMapAddress], a
+ ld a, h
+ ld [hBGMapAddress + 1], a
+
+; Only update palettes on CGB
+ ld a, [hCGB]
+ and a
+ jr z, .tiles
+
+; BG Map mode 2 (palettes)
+ ld a, 2
+ ld [hBGMapMode], a
+
+; The BG Map is updated in thirds, so we wait
+; 3 frames to update the whole screen's palettes.
+ ld c, 3
+ call DelayFrames
+
+.tiles
+; Update BG Map tiles
+ call WaitBGMap
+
+; Turn off BG Map update
+ xor a
+ ld [hBGMapMode], a
+ ret
+; 91eff
+
+FillJohtoMap: ; 91eff
+ ld de, JohtoMap
+ jr FillTownMap
+
+FillKantoMap: ; 91f04
+ ld de, KantoMap
+
+FillTownMap: ; 91f07
+ hlcoord 0, 0
+.loop
+ ld a, [de]
+ cp $ff
+ ret z
+ ld a, [de]
+ ld [hli], a
+ inc de
+ jr .loop
+; 91f13
+
+TownMapPals: ; 91f13
+; Assign palettes based on tile ids
+
+ hlcoord 0, 0
+ decoord 0, 0, AttrMap
+ ld bc, 360
+.loop
+; Current tile
+ ld a, [hli]
+ push hl
+
+; HP/borders use palette 0
+ cp $60
+ jr nc, .pal0
+
+; The palette data is condensed to nybbles,
+; least-significant first.
+ ld hl, TownMapPalMap
+ srl a
+ jr c, .odd
+
+; Even-numbered tile ids take the bottom nybble...
+ add l
+ ld l, a
+ ld a, h
+ adc 0
+ ld h, a
+ ld a, [hl]
+ and %111
+ jr .update
+
+.odd
+; ...and odd ids take the top.
+ add l
+ ld l, a
+ ld a, h
+ adc 0
+ ld h, a
+ ld a, [hl]
+ swap a
+ and %111
+ jr .update
+
+.pal0
+ xor a
+
+.update
+ pop hl
+ ld [de], a
+ inc de
+ dec bc
+ ld a, b
+ or c
+ jr nz, .loop
+ ret
+
+TownMapPalMap:
+ db $11, $21, $22, $00, $11, $13, $54, $54, $11, $21, $22, $00
+ db $11, $10, $01, $00, $11, $21, $22, $00, $00, $00, $00, $00
+ db $00, $00, $44, $04, $00, $00, $00, $00, $33, $33, $33, $33
+ db $33, $33, $33, $03, $33, $33, $33, $33, $00, $00, $00, $00
+; 91f7b
+
+TownMapMon: ; 91f7b
+; Draw the FlyMon icon at town map location in
+
+; Get FlyMon species
+ ld a, [CurPartyMon]
+ ld hl, PartySpecies
+ ld e, a
+ ld d, $0
+ add hl, de
+ ld a, [hl]
+ ld [wd265], a
+
+; Get FlyMon icon
+ ld e, 8 ; starting tile in VRAM
+ callba GetSpeciesIcon
+
+; Animation/palette
+ ld de, 0
+ ld a, $0
+ call Function3b2a
+
+ ld hl, 3
+ add hl, bc
+ ld [hl], 8
+ ld hl, 2
+ add hl, bc
+ ld [hl], 0
+ ret
+; 91fa6
+
+TownMapPlayerIcon: ; 91fa6
+; Draw the player icon at town map location in a
+ push af
+
+ callba GetPlayerIcon
+
+; Standing icon
+ ld hl, VTiles0 tile $10
+ ld c, 4 ; # tiles
+ call Request2bpp
+
+; Walking icon
+ ld hl, $c0
+ add hl, de
+ ld d, h
+ ld e, l
+ ld hl, VTiles0 tile $14
+ ld c, 4 ; # tiles
+ ld a, BANK(ChrisSpriteGFX) ; does nothing
+ call Request2bpp
+
+; Animation/palette
+ ld de, 0
+ ld b, $0a ; Male
+ ld a, [PlayerGender]
+ bit 0, a
+ jr z, .asm_91fd3
+ ld b, $1e ; Female
+.asm_91fd3
+ ld a, b
+ call Function3b2a
+
+ ld hl, $3
+ add hl, bc
+ ld [hl], $10
+
+ pop af
+ ld e, a
+ push bc
+ callba GetLandmarkCoords
+ pop bc
+
+ ld hl, 4
+ add hl, bc
+ ld [hl], e
+ ld hl, 5
+ add hl, bc
+ ld [hl], d
+ ret
+; 0x91ff2
+
+Function91ff2: ; 91ff2
+ ld hl, TownMapGFX
+ ld de, VTiles2
+ lb bc, BANK(TownMapGFX), $30
+ call DecompressRequest2bpp
+ ret
+; 91fff
+
+
+JohtoMap: ; 91fff
+INCBIN "gfx/misc/johto.bin"
+; 92168
+
+KantoMap: ; 92168
+INCBIN "gfx/misc/kanto.bin"
+; 922d1
+
+
+GFX_922d1: ; 922d1
+INCBIN "gfx/unknown/0922d1.2bpp"
+GFX_922e1: ; 922e1
+INCBIN "gfx/unknown/0922e1.2bpp"
+GFX_92301: ; 92301
+INCBIN "gfx/unknown/092301.2bpp"
diff --git a/engine/fruit_trees.asm b/engine/fruit_trees.asm
index 9002404fd..28e6e8cec 100644
--- a/engine/fruit_trees.asm
+++ b/engine/fruit_trees.asm
@@ -15,7 +15,7 @@ FruitTreeScript:: ; 44000
.fruit
writetext HeyItsFruitText
copybytetovar CurFruit
- giveitem $ff, 1
+ giveitem ITEM_FROM_MEM
iffalse .packisfull
keeptextopen
writetext ObtainedFruitText
diff --git a/engine/healmachineanim.asm b/engine/healmachineanim.asm
new file mode 100755
index 000000000..174d1ae5a
--- /dev/null
+++ b/engine/healmachineanim.asm
@@ -0,0 +1,266 @@
+HealMachineAnim: ; 12324
+ ; If you have no Pokemon, don't change the buffer. This can lead to some glitchy effects if you have no Pokemon.
+ ld a, [PartyCount]
+ and a
+ ret z
+ ; The location of the healing machine relative to the player is stored in ScriptVar.
+ ; 0: Up and left (Pokemon Center)
+ ; 1: Left (Elm's Lab)
+ ; 2: Up (Hall of Fame)
+ ld a, [ScriptVar]
+ ld [Buffer1], a
+ ld a, [rOBP1]
+ ld [Buffer2], a
+ call .DoJumptableFunctions
+ ld a, [Buffer2]
+ call Functiond24
+ ret
+; 1233e
+
+.DoJumptableFunctions: ; 1233e
+ xor a
+ ld [wd1ec], a
+.jumpable_loop
+ ld a, [Buffer1]
+ ld e, a
+ ld d, 0
+ ld hl, .Pointers
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wd1ec]
+ ld e, a
+ inc a
+ ld [wd1ec], a
+ add hl, de
+ ld a, [hl]
+ cp 5
+ jr z, .finish
+ ld hl, .Jumptable
+ rst JumpTable
+ jr .jumpable_loop
+
+.finish
+ ret
+; 12365
+
+.Pointers: ; 12365
+ dw .Pokecenter
+ dw .ElmLab
+ dw .HallOfFame
+; 1236b
+
+.Pokecenter: ; 1236b
+ db 0, 1, 3, 5
+.ElmLab: ; 1236f
+ db 0, 1, 3, 5
+.HallOfFame: ; 12373
+ db 0, 2, 4, 5
+; 12377
+
+.Jumptable: ; 12377
+ dw .LoadGFX
+ dw .PC_LoadBallsOntoMachine
+ dw .HOF_LoadBallsOntoMachine
+ dw .PlayHealMusic
+ dw .HOF_PlaySFX
+ dw .dummy_5 ; never encountered
+; 12383
+
+.LoadGFX: ; 12383
+ call .LoadPalettes
+ ld de, .HealMachineGFX
+ ld hl, VTiles0 tile $7c
+ lb bc, BANK(.HealMachineGFX), $2
+ call Request2bpp
+ ret
+; 12393
+
+.PC_LoadBallsOntoMachine: ; 12393
+ ld hl, Sprites + $80
+ ld de, .PC_ElmsLab_TileMap
+ call .PlaceHealingMachineTile
+ call .PlaceHealingMachineTile
+ jr .LoadBallsOntoMachine
+
+.HOF_LoadBallsOntoMachine: ; 123a1
+ ld hl, Sprites + $80
+ ld de, .HOF_TileMap
+
+.LoadBallsOntoMachine: ; 123a7
+ ld a, [PartyCount]
+ ld b, a
+.party_loop
+ call .PlaceHealingMachineTile
+ push de
+ ld de, SFX_SECOND_PART_OF_ITEMFINDER
+ call PlaySFX
+ pop de
+ ld c, 30
+ call DelayFrames
+ dec b
+ jr nz, .party_loop
+ ret
+; 123bf
+
+.PlayHealMusic: ; 123bf
+ ld de, MUSIC_HEAL
+ call PlayMusic
+ jp .FlashPalettes8Times
+; 123c8
+
+.HOF_PlaySFX: ; 123c8
+ ld de, SFX_GAME_FREAK_LOGO_GS
+ call PlaySFX
+ call .FlashPalettes8Times
+ call WaitSFX
+ ld de, SFX_BOOT_PC
+ call PlaySFX
+ ret
+; 123db
+
+.dummy_5: ; 123db
+ ret
+; 123dc
+
+.PC_ElmsLab_TileMap: ; 123dc
+ db $20, $22, $7c, $16
+ db $20, $26, $7c, $16
+ db $26, $20, $7d, $16
+ db $26, $28, $7d, $36
+ db $2b, $20, $7d, $16
+ db $2b, $28, $7d, $36
+ db $30, $20, $7d, $16
+ db $30, $28, $7d, $36
+; 123fc
+
+.HealMachineGFX: ; 123fc
+INCBIN "gfx/unknown/0123fc.2bpp"
+; 1241c
+
+.HOF_TileMap: ; 1241c
+ db $3c, $51, $7d, $16
+ db $3c, $56, $7d, $16
+ db $3b, $4d, $7d, $16
+ db $3b, $5a, $7d, $16
+ db $39, $49, $7d, $16
+ db $39, $5d, $7d, $16
+; 12434
+
+.LoadPalettes: ; 12434
+ call IsCGB
+ jr nz, .cgb
+ ld a, %11100000
+ ld [rOBP1], a
+ ret
+
+.cgb
+ ld hl, .palettes
+ ld de, OBPals + 8 * 6
+ ld bc, 8
+ ld a, $5
+ call FarCopyWRAM
+ ld a, $1
+ ld [hCGBPalUpdate], a
+ ret
+; 12451
+
+.palettes: ; 12451
+ RGB 31, 31, 31
+ RGB 31, 19, 10
+ RGB 31, 07, 01
+ RGB 00, 00, 00
+; 12459
+
+.FlashPalettes8Times: ; 12459
+ ld c, $8
+.palette_loop
+ push bc
+ call .FlashPalettes
+ ld c, 10
+ call DelayFrames
+ pop bc
+ dec c
+ jr nz, .palette_loop
+ ret
+; 12469
+
+.FlashPalettes: ; 12469
+ call IsCGB
+ jr nz, .go
+ ld a, [rOBP1]
+ xor %00101000
+ ld [rOBP1], a
+ ret
+
+.go
+ ld a, [rSVBK]
+ push af
+ ld a, $5
+ ld [rSVBK], a
+
+ ld hl, OBPals + 8 * 6
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ push de
+ ld c, $3
+.palette_loop_2
+ ld a, [hli]
+ ld e, a
+ ld a, [hld]
+ ld d, a
+ dec hl
+ ld a, d
+ ld [hld], a
+ ld a, e
+ ld [hli], a
+rept 3
+ inc hl
+endr
+ dec c
+ jr nz, .palette_loop_2
+ pop de
+ dec hl
+ ld a, d
+ ld [hld], a
+ ld a, e
+ ld [hl], a
+
+ pop af
+ ld [rSVBK], a
+ ld a, $1
+ ld [hCGBPalUpdate], a
+ ret
+; 124a3
+
+.PlaceHealingMachineTile: ; 124a3
+ push bc
+ ld a, [Buffer1]
+ lb bc, $10, $20
+ cp $1 ; ElmsLab
+ jr z, .okay
+ lb bc, $00, $00
+
+.okay
+ ld a, [de]
+ add c
+ inc de
+ ld [hli], a
+ ld a, [de]
+ add b
+ inc de
+ ld [hli], a
+ ld a, [de]
+ inc de
+ ld [hli], a
+ ld a, [de]
+ inc de
+ ld [hli], a
+ pop bc
+ ret
+; 124c1
diff --git a/engine/landmarks.asm b/engine/landmarks.asm
index e9b1c3668..8fb7035f2 100644
--- a/engine/landmarks.asm
+++ b/engine/landmarks.asm
@@ -154,52 +154,52 @@ ENDM
landmark 148, 132, FastShipName
-NewBarkTownName: db "NEW BARK", $1f, "TOWN@"
-CherrygroveCityName: db "CHERRYGROVE", $1f, "CITY@"
+NewBarkTownName: db "NEW BARK¯TOWN@"
+CherrygroveCityName: db "CHERRYGROVE¯CITY@"
VioletCityName: db "VIOLET CITY@"
AzaleaTownName: db "AZALEA TOWN@"
-GoldenrodCityName: db "GOLDENROD", $1f, "CITY@"
-EcruteakCityName: db "ECRUTEAK", $1f, "CITY@"
-OlivineCityName: db "OLIVINE", $1f, "CITY@"
-CianwoodCityName: db "CIANWOOD", $1f, "CITY@"
-MahoganyTownName: db "MAHOGANY", $1f, "TOWN@"
-BlackthornCityName: db "BLACKTHORN", $1f, "CITY@"
-LakeOfRageName: db "LAKE OF", $1f, "RAGE@"
+GoldenrodCityName: db "GOLDENROD¯CITY@"
+EcruteakCityName: db "ECRUTEAK¯CITY@"
+OlivineCityName: db "OLIVINE¯CITY@"
+CianwoodCityName: db "CIANWOOD¯CITY@"
+MahoganyTownName: db "MAHOGANY¯TOWN@"
+BlackthornCityName: db "BLACKTHORN¯CITY@"
+LakeOfRageName: db "LAKE OF¯RAGE@"
SilverCaveName: db "SILVER CAVE@"
-SproutTowerName: db "SPROUT", $1f, "TOWER@"
-RuinsOfAlphName: db "RUINS", $1f, "OF ALPH@"
+SproutTowerName: db "SPROUT¯TOWER@"
+RuinsOfAlphName: db "RUINS¯OF ALPH@"
UnionCaveName: db "UNION CAVE@"
-SlowpokeWellName: db "SLOWPOKE", $1f, "WELL@"
+SlowpokeWellName: db "SLOWPOKE¯WELL@"
RadioTowerName: db "RADIO TOWER@"
PowerPlantName: db "POWER PLANT@"
-NationalParkName: db "NATIONAL", $1f, "PARK@"
+NationalParkName: db "NATIONAL¯PARK@"
TinTowerName: db "TIN TOWER@"
LighthouseName: db "LIGHTHOUSE@"
-WhirlIslandsName: db "WHIRL", $1f, "ISLANDS@"
+WhirlIslandsName: db "WHIRL¯ISLANDS@"
MtMortarName: db "MT.MORTAR@"
-DragonsDenName: db "DRAGON'S", $1f, "DEN@"
+DragonsDenName: db "DRAGON'S¯DEN@"
IcePathName: db "ICE PATH@"
NotApplicableName: db "N/A@"
PalletTownName: db "PALLET TOWN@"
-ViridianCityName: db "VIRIDIAN", $1f, "CITY@"
+ViridianCityName: db "VIRIDIAN¯CITY@"
PewterCityName: db "PEWTER CITY@"
-CeruleanCityName: db "CERULEAN", $1f, "CITY@"
-LavenderTownName: db "LAVENDER", $1f, "TOWN@"
-VermilionCityName: db "VERMILION", $1f, "CITY@"
-CeladonCityName: db "CELADON", $1f, "CITY@"
-SaffronCityName: db "SAFFRON", $1f, "CITY@"
-FuchsiaCityName: db "FUCHSIA", $1f, "CITY@"
-CinnabarIslandName: db "CINNABAR", $1f, "ISLAND@"
-IndigoPlateauName: db "INDIGO", $1f, "PLATEAU@"
-VictoryRoadName: db "VICTORY", $1f, "ROAD@"
+CeruleanCityName: db "CERULEAN¯CITY@"
+LavenderTownName: db "LAVENDER¯TOWN@"
+VermilionCityName: db "VERMILION¯CITY@"
+CeladonCityName: db "CELADON¯CITY@"
+SaffronCityName: db "SAFFRON¯CITY@"
+FuchsiaCityName: db "FUCHSIA¯CITY@"
+CinnabarIslandName: db "CINNABAR¯ISLAND@"
+IndigoPlateauName: db "INDIGO¯PLATEAU@"
+VictoryRoadName: db "VICTORY¯ROAD@"
MtMoonName: db "MT.MOON@"
RockTunnelName: db "ROCK TUNNEL@"
-LavRadioTowerName: db "LAV", $1f, "RADIO TOWER@"
+LavRadioTowerName: db "LAV¯RADIO TOWER@"
SilphCoName: db "SILPH CO.@"
SafariZoneName: db "SAFARI ZONE@"
-SeafoamIslandsName: db "SEAFOAM", $1f, "ISLANDS@"
-PokemonMansionName: db "#MON", $1f, "MANSION@"
-CeruleanCaveNane: db "CERULEAN", $1f, "CAVE@"
+SeafoamIslandsName: db "SEAFOAM¯ISLANDS@"
+PokemonMansionName: db "#MON¯MANSION@"
+CeruleanCaveNane: db "CERULEAN¯CAVE@"
Route1Name: db "ROUTE 1@"
Route2Name: db "ROUTE 2@"
Route3Name: db "ROUTE 3@"
@@ -247,14 +247,14 @@ Route44Name: db "ROUTE 44@"
Route45Name: db "ROUTE 45@"
Route46Name: db "ROUTE 46@"
DarkCaveName: db "DARK CAVE@"
-IlexForestName: db "ILEX", $1f, "FOREST@"
-BurnedTowerName: db "BURNED", $1f, "TOWER@"
+IlexForestName: db "ILEX¯FOREST@"
+BurnedTowerName: db "BURNED¯TOWER@"
FastShipName: db "FAST SHIP@"
-ViridianForestName: db "VIRIDIAN", $1f, "FOREST@"
-DiglettsCaveName: db "DIGLETT'S", $1f, "CAVE@"
+ViridianForestName: db "VIRIDIAN¯FOREST@"
+DiglettsCaveName: db "DIGLETT'S¯CAVE@"
TohjoFallsName: db "TOHJO FALLS@"
UndergroundName: db "UNDERGROUND@"
-BattleTowerName: db "BATTLE", $1f, "TOWER@"
+BattleTowerName: db "BATTLE¯TOWER@"
SpecialMapName: db "SPECIAL@"
diff --git a/engine/link.asm b/engine/link.asm
new file mode 100755
index 000000000..a1fa0661b
--- /dev/null
+++ b/engine/link.asm
@@ -0,0 +1,4117 @@
+LinkCommunications: ; 28000
+ call ClearBGPalettes
+ ld c, 80
+ call DelayFrames
+ call ClearScreen
+ call ClearSprites
+ call UpdateSprites
+ xor a
+ ld [hSCX], a
+ ld [hSCY], a
+ ld c, 80
+ call DelayFrames
+ call ClearScreen
+ call UpdateSprites
+ call LoadStandardFont
+ call LoadFontsBattleExtra
+ callba Function16d69a
+ call Function3200
+ hlcoord 3, 8
+ ld b, $2
+ ld c, $c
+ ld d, h
+ ld e, l
+ callba Function4d35b
+ hlcoord 4, 10
+ ld de, String28419
+ call PlaceString
+ call Function28eff
+ call Function3200
+ ld hl, wcf5d
+ xor a
+ ld [hli], a
+ ld [hl], $50
+ ld a, [wLinkMode]
+ cp LINK_TIMECAPSULE
+ jp nz, Function28177
+
+Function2805d: ; 2805d
+ call Function28426
+ call Function28499
+ call Function28434
+ xor a
+ ld [wcf56], a
+ call Function87d
+ ld a, [hLinkPlayerNumber]
+ cp $2
+ jr nz, .asm_28091
+ ld c, $3
+ call DelayFrames
+ xor a
+ ld [hSerialSend], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ call DelayFrame
+ xor a
+ ld [hSerialSend], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+
+.asm_28091
+ ld de, MUSIC_NONE
+ call PlayMusic
+ ld c, $3
+ call DelayFrames
+ xor a
+ ld [rIF], a
+ ld a, $8
+ ld [rIE], a
+ ld hl, wd1f3
+ ld de, EnemyMonSpecies
+ ld bc, $11
+ call Function75f
+ ld a, $fe
+ ld [de], a
+ ld hl, OverworldMap
+ ld de, wd26b
+ ld bc, $1a8
+ call Function75f
+ ld a, $fe
+ ld [de], a
+ ld hl, wc608
+ ld de, wc6d0
+ ld bc, $c8
+ call Function75f
+ xor a
+ ld [rIF], a
+ ld a, $1d
+ ld [rIE], a
+ call Function287ab
+ ld hl, wd26b
+ call Function287ca
+ push hl
+ ld bc, NAME_LENGTH
+ add hl, bc
+ ld a, [hl]
+ pop hl
+ and a
+ jp z, Function28b22
+ cp $7
+ jp nc, Function28b22
+ ld de, OverworldMap
+ ld bc, $1a2
+ call Function2879e
+ ld de, wc6d0
+ ld hl, wc813
+ ld c, $2
+.asm_280fe
+ ld a, [de]
+ inc de
+ and a
+ jr z, .asm_280fe
+ cp $fd
+ jr z, .asm_280fe
+ cp $fe
+ jr z, .asm_280fe
+ cp $ff
+ jr z, .asm_2811d
+ push hl
+ push bc
+ ld b, $0
+ dec a
+ ld c, a
+ add hl, bc
+ ld a, $fe
+ ld [hl], a
+ pop bc
+ pop hl
+ jr .asm_280fe
+
+.asm_2811d
+ ld hl, wc90f
+ dec c
+ jr nz, .asm_280fe
+ ld hl, OverworldMap
+ ld de, wd26b
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ld de, OTPartyCount
+ ld a, [hli]
+ ld [de], a
+ inc de
+.asm_28135
+ ld a, [hli]
+ cp $ff
+ jr z, .asm_2814e
+ ld [wd265], a
+ push hl
+ push de
+ callab ConvertMon_1to2
+ pop de
+ pop hl
+ ld a, [wd265]
+ ld [de], a
+ inc de
+ jr .asm_28135
+
+.asm_2814e
+ ld [de], a
+ ld hl, wc813
+ call Function2868a
+ ld a, OTPartyMonOT % $100
+ ld [wd102], a
+ ld a, OTPartyMonOT / $100
+ ld [wd103], a
+ ld de, MUSIC_NONE
+ call PlayMusic
+ ld a, [hLinkPlayerNumber]
+ cp $2
+ ld c, 66
+ call z, DelayFrames
+ ld de, MUSIC_ROUTE_30
+ call PlayMusic
+ jp Function287e3
+; 28177
+
+Function28177: ; 28177
+ call Function28426
+ call Function28595
+ call Function28434
+ call Function29dba
+ ld a, [ScriptVar]
+ and a
+ jp z, Function283b2
+ ld a, [hLinkPlayerNumber]
+ cp $2
+ jr nz, .asm_281ae
+ ld c, $3
+ call DelayFrames
+ xor a
+ ld [hSerialSend], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ call DelayFrame
+ xor a
+ ld [hSerialSend], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+
+.asm_281ae
+ ld de, MUSIC_NONE
+ call PlayMusic
+ ld c, $3
+ call DelayFrames
+ xor a
+ ld [rIF], a
+ ld a, $8
+ ld [rIE], a
+ ld hl, wd1f3
+ ld de, EnemyMonSpecies
+ ld bc, $11
+ call Function75f
+ ld a, $fe
+ ld [de], a
+ ld hl, OverworldMap
+ ld de, wd26b
+ ld bc, $1c2
+ call Function75f
+ ld a, $fe
+ ld [de], a
+ ld hl, wc608
+ ld de, wc6d0
+ ld bc, $c8
+ call Function75f
+ ld a, [wLinkMode]
+ cp LINK_TRADECENTER
+ jr nz, .asm_281fd
+ ld hl, wc9f4
+ ld de, wcb84
+ ld bc, $186
+ call Function283f2
+
+.asm_281fd
+ xor a
+ ld [rIF], a
+ ld a, $1d
+ ld [rIE], a
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call Function287ab
+ ld hl, wd26b
+ call Function287ca
+ ld de, OverworldMap
+ ld bc, $1b9
+ call Function2879e
+ ld de, wc6d0
+ ld hl, wc813
+ ld c, $2
+.asm_28224
+ ld a, [de]
+ inc de
+ and a
+ jr z, .asm_28224
+ cp $fd
+ jr z, .asm_28224
+ cp $fe
+ jr z, .asm_28224
+ cp $ff
+ jr z, .asm_28243
+ push hl
+ push bc
+ ld b, $0
+ dec a
+ ld c, a
+ add hl, bc
+ ld a, $fe
+ ld [hl], a
+ pop bc
+ pop hl
+ jr .asm_28224
+
+.asm_28243
+ ld hl, wc90f
+ dec c
+ jr nz, .asm_28224
+ ld a, [wLinkMode]
+ cp LINK_TRADECENTER
+ jp nz, .asm_282fe
+ ld hl, wcb84
+.asm_28254
+ ld a, [hli]
+ cp $20
+ jr nz, .asm_28254
+.asm_28259
+ ld a, [hli]
+ cp $fe
+ jr z, .asm_28259
+ cp $20
+ jr z, .asm_28259
+ dec hl
+ ld de, wcb84
+ ld bc, $190
+ call CopyBytes
+ ld hl, wcb84
+ ld bc, $c6
+.asm_28272
+ ld a, [hl]
+ cp $21
+ jr nz, .asm_28279
+ ld [hl], $fe
+
+.asm_28279
+ inc hl
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_28272
+ ld de, wcc9e
+.asm_28282
+ ld a, [de]
+ inc de
+ cp $ff
+ jr z, .asm_28294
+ ld hl, wcc4a
+ dec a
+ ld b, $0
+ ld c, a
+ add hl, bc
+ ld [hl], $fe
+ jr .asm_28282
+
+.asm_28294
+ ld hl, wcb84
+ ld de, wc9f4
+ ld b, $6
+.asm_2829c
+ push bc
+ ld bc, $21
+ call CopyBytes
+ ld a, $e
+ add e
+ ld e, a
+ ld a, $0
+ adc d
+ ld d, a
+ pop bc
+ dec b
+ jr nz, .asm_2829c
+ ld de, wc9f4
+ ld b, $6
+.asm_282b4
+ push bc
+ ld a, $21
+ add e
+ ld e, a
+ ld a, $0
+ adc d
+ ld d, a
+ ld bc, $e
+ call CopyBytes
+ pop bc
+ dec b
+ jr nz, .asm_282b4
+ ld b, $6
+ ld de, wc9f4
+.asm_282cc
+ push bc
+ push de
+ callba Function1de5c8
+ ld a, c
+ or a
+ jr z, .asm_282ee
+ sub $3
+ jr nc, .asm_282e4
+ callba Function1df203
+ jr .asm_282ee
+
+.asm_282e4
+ cp $2
+ jr nc, .asm_282ee
+ callba Function1df220
+
+.asm_282ee
+ pop de
+ ld hl, $2f
+ add hl, de
+ ld d, h
+ ld e, l
+ pop bc
+ dec b
+ jr nz, .asm_282cc
+ ld de, wcb0e
+ xor a
+ ld [de], a
+
+.asm_282fe
+ ld hl, OverworldMap
+ ld de, wd26b
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ld de, OTPartyCount
+ ld bc, 8
+ call CopyBytes
+ ld de, wd276
+ ld bc, 2
+ call CopyBytes
+ ld de, OTPartyMon1Species
+ ld bc, $1a4
+ call CopyBytes
+ ld a, OTPartyMonOT % $100
+ ld [wd102], a
+ ld a, OTPartyMonOT / $100
+ ld [wd103], a
+ ld de, MUSIC_NONE
+ call PlayMusic
+ ld a, [hLinkPlayerNumber]
+ cp $2
+ ld c, 66
+ call z, DelayFrames
+ ld a, [wLinkMode]
+ cp LINK_COLOSSEUM
+ jr nz, .asm_283a9
+ ld a, CAL
+ ld [OtherTrainerClass], a
+ call ClearScreen
+ callba Function4d354
+ ld hl, Options
+ ld a, [hl]
+ push af
+ and $20
+ or $3
+ ld [hl], a
+ ld hl, wd26b
+ ld de, OTName
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ call ReturnToMapFromSubmenu
+ ld a, [wc2d7]
+ push af
+ ld a, $1
+ ld [wc2d7], a
+ ld a, [rIE]
+ push af
+ ld a, [rIF]
+ push af
+ xor a
+ ld [rIF], a
+ ld a, [rIE]
+ set 1, a
+ ld [rIE], a
+ pop af
+ ld [rIF], a
+ predef StartBattle
+ ld a, [rIF]
+ ld h, a
+ xor a
+ ld [rIF], a
+ pop af
+ ld [rIE], a
+ ld a, h
+ ld [rIF], a
+ pop af
+ ld [wc2d7], a
+ pop af
+ ld [Options], a
+ callba LoadPokemonData
+ jp Function28b22
+
+.asm_283a9
+ ld de, MUSIC_ROUTE_30
+ call PlayMusic
+ jp Function287e3
+; 283b2
+
+Function283b2: ; 283b2
+ ld de, UnknownText_0x283ed
+ ld b, $a
+.asm_283b7
+ call DelayFrame
+ call Function908
+ dec b
+ jr nz, .asm_283b7
+ xor a
+ ld [hld], a
+ ld [hl], a
+ ld [hVBlank], a
+ push de
+ hlcoord 0, 12
+ ld b, $4
+ ld c, $12
+ push de
+ ld d, h
+ ld e, l
+ callba Function4d35b
+ pop de
+ pop hl
+ bccoord 1, 14
+ call PlaceWholeStringInBoxAtOnce
+ call FadeToWhite
+ call ClearScreen
+ ld b, $8
+ call GetSGBLayout
+ call Function3200
+ ret
+; 283ed
+
+UnknownText_0x283ed: ; 0x283ed
+ ; Too much time has elapsed. Please try again.
+ text_jump UnknownText_0x1c4183
+ db "@"
+; 0x283f2
+
+Function283f2: ; 283f2
+ ld a, $1
+ ld [hFFCC], a
+.asm_283f6
+ ld a, [hl]
+ ld [hSerialSend], a
+ call Function78a
+ push bc
+ ld b, a
+ inc hl
+ ld a, $30
+.asm_28401
+ dec a
+ jr nz, .asm_28401
+ ld a, [hFFCC]
+ and a
+ ld a, b
+ pop bc
+ jr z, .asm_28411
+ dec hl
+ xor a
+ ld [hFFCC], a
+ jr .asm_283f6
+
+.asm_28411
+ ld [de], a
+ inc de
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_283f6
+ ret
+; 28419
+
+String28419: ; 28419
+ db "PLEASE WAIT!@"
+; 28426
+
+Function28426: ; 28426
+ ld hl, OverworldMap
+ lb bc, 5, SCREEN_WIDTH
+.asm_2842c
+ xor a
+ ld [hli], a
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_2842c
+ ret
+; 28434
+
+Function28434: ; 28434
+ ld hl, wd1f3
+ ld a, $fd
+ ld b, $7
+.asm_2843b
+ ld [hli], a
+ dec b
+ jr nz, .asm_2843b
+ ld b, $a
+.asm_28441
+ call Random
+ cp $fd
+ jr nc, .asm_28441
+ ld [hli], a
+ dec b
+ jr nz, .asm_28441
+ ld hl, wc608
+ ld a, $fd
+rept 3
+ ld [hli], a
+endr
+ ld b, $c8
+ xor a
+.asm_28457
+ ld [hli], a
+ dec b
+ jr nz, .asm_28457
+ ld hl, wc818
+ ld de, wc608 + 10
+ ld bc, 0
+.asm_28464
+ inc c
+ ld a, c
+ cp $fd
+ jr z, .asm_2848c
+ ld a, b
+ dec a
+ jr nz, .asm_2847f
+ push bc
+ ld a, [wLinkMode]
+ cp LINK_TIMECAPSULE
+ ld b, $d
+ jr z, .asm_2847a
+ ld b, $27
+
+.asm_2847a
+ ld a, c
+ cp b
+ pop bc
+ jr z, .asm_28495
+
+.asm_2847f
+ inc hl
+ ld a, [hl]
+ cp $fe
+ jr nz, .asm_28464
+ ld a, c
+ ld [de], a
+ inc de
+ ld [hl], $ff
+ jr .asm_28464
+
+.asm_2848c
+ ld a, $ff
+ ld [de], a
+ inc de
+ lb bc, 1, 0
+ jr .asm_28464
+
+.asm_28495
+ ld a, $ff
+ ld [de], a
+ ret
+; 28499
+
+Function28499: ; 28499
+ ld de, OverworldMap
+ ld a, $fd
+ ld b, $6
+.asm_284a0
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .asm_284a0
+ ld hl, PlayerName
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ push de
+ ld hl, PartyCount
+ ld a, [hli]
+ ld [de], a
+ inc de
+.asm_284b5
+ ld a, [hli]
+ cp $ff
+ jr z, .asm_284ce
+ ld [wd265], a
+ push hl
+ push de
+ callab ConvertMon_2to1
+ pop de
+ pop hl
+ ld a, [wd265]
+ ld [de], a
+ inc de
+ jr .asm_284b5
+
+.asm_284ce
+ ld [de], a
+ pop de
+ ld hl, $8
+ add hl, de
+ ld d, h
+ ld e, l
+ ld hl, PartyMon1Species
+ ld c, $6
+.asm_284db
+ push bc
+ call Function284f6
+ ld bc, PARTYMON_STRUCT_LENGTH
+ add hl, bc
+ pop bc
+ dec c
+ jr nz, .asm_284db
+ ld hl, PartyMonOT
+ call .asm_284f0
+ ld hl, PartyMonNicknames
+.asm_284f0
+ ld bc, $42
+ jp CopyBytes
+; 284f6
+
+Function284f6: ; 284f6
+ ld b, h
+ ld c, l
+ push de
+ push bc
+ ld a, [hl]
+ ld [wd265], a
+ callab ConvertMon_2to1
+ pop bc
+ pop de
+ ld a, [wd265]
+ ld [de], a
+ inc de
+ ld hl, $22
+ add hl, bc
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ ld [de], a
+ inc de
+ xor a
+ ld [de], a
+ inc de
+ ld hl, $20
+ add hl, bc
+ ld a, [hl]
+ ld [de], a
+ inc de
+ ld a, [bc]
+ cp $51
+ jr z, .asm_28528
+ cp $52
+ jr nz, .asm_28530
+
+.asm_28528
+ ld a, $17
+ ld [de], a
+ inc de
+ ld [de], a
+ inc de
+ jr .asm_28544
+
+.asm_28530
+ push bc
+ dec a
+ ld hl, BaseData + 7 ; type
+ ld bc, BaseData1 - BaseData0
+ call AddNTimes
+ ld bc, 2
+ ld a, BANK(BaseData)
+ call FarCopyBytes
+ pop bc
+
+.asm_28544
+ push bc
+ ld hl, $1
+ add hl, bc
+ ld bc, $1a
+ call CopyBytes
+ pop bc
+
+ ld hl, $1f
+ add hl, bc
+ ld a, [hl]
+ ld [de], a
+ ld [CurPartyLevel], a
+ inc de
+
+ push bc
+ ld hl, $24
+ add hl, bc
+ ld bc, 8
+ call CopyBytes
+ pop bc
+
+ push de
+ push bc
+
+ ld a, [bc]
+ dec a
+ push bc
+ ld b, 0
+ ld c, a
+ ld hl, KantoMonSpecials
+ add hl, bc
+ ld a, BANK(KantoMonSpecials)
+ call GetFarByte
+ ld [BaseSpecialAttack], a
+ pop bc
+
+ ld hl, $a
+ add hl, bc
+ ld c, $5
+ ld b, $1
+ predef CalcPkmnStatC
+
+ pop bc
+ pop de
+
+ ld a, [$ffb5]
+ ld [de], a
+ inc de
+ ld a, [$ffb6]
+ ld [de], a
+ inc de
+ ld h, b
+ ld l, c
+ ret
+; 28595
+
+Function28595: ; 28595
+ ld de, OverworldMap
+ ld a, $fd
+ ld b, $6
+.loop1
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .loop1
+ ld hl, PlayerName
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ld hl, PartyCount
+ ld bc, 8
+ call CopyBytes
+ ld hl, PlayerID
+ ld bc, 2
+ call CopyBytes
+ ld hl, PartyMon1Species
+ ld bc, $120
+ call CopyBytes
+ ld hl, PartyMonOT
+ ld bc, $42
+ call CopyBytes
+ ld hl, PartyMonNicknames
+ ld bc, $42
+ call CopyBytes
+ ld a, [wLinkMode]
+ cp LINK_TRADECENTER
+ ret nz
+ ld de, wc9f4
+ ld a, $20
+ call Function28682
+ ld a, BANK(sPartyScratch1)
+ call GetSRAMBank
+ ld hl, sPartyScratch1
+ ld b, PARTY_LENGTH
+.loop2
+ push bc
+ ld bc, $21
+ call CopyBytes
+ ld bc, $e
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .loop2
+ ld hl, sPartyScratch1
+ ld b, PARTY_LENGTH
+.loop3
+ push bc
+ ld bc, $21
+ add hl, bc
+ ld bc, $e
+ call CopyBytes
+ pop bc
+ dec b
+ jr nz, .loop3
+ ld b, PARTY_LENGTH
+ ld de, sPartyScratch1
+ ld hl, wc9f9
+.loop4
+ push bc
+ push hl
+ push de
+ push hl
+ callba Function1de5c8
+ pop de
+ ld a, c
+ or a
+ jr z, .next
+ sub $3
+ jr nc, .skip
+ callba Function1df1e6
+ jr .next
+
+.skip
+ cp $2
+ jr nc, .next
+ callba Function1df220
+
+.next
+ pop de
+ ld hl, SCRATCHMON_STRUCT_LENGTH
+ add hl, de
+ ld d, h
+ ld e, l
+ pop hl
+ ld bc, $21
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .loop4
+ call CloseSRAM
+ ld hl, wc9f9
+ ld bc, $c6
+.loop5
+ ld a, [hl]
+ cp $fe
+ jr nz, .skip2
+ ld [hl], $21
+
+.skip2
+ inc hl
+ dec bc
+ ld a, b
+ or c
+ jr nz, .loop5
+ ld hl, wcabf
+ ld de, wcb13
+ ld b, $54
+ ld c, $0
+.loop6
+ inc c
+ ld a, [hl]
+ cp $fe
+ jr nz, .skip3
+ ld [hl], $ff
+ ld a, c
+ ld [de], a
+ inc de
+
+.skip3
+ inc hl
+ dec b
+ jr nz, .loop6
+ ld a, $ff
+ ld [de], a
+ ret
+; 28682
+
+Function28682: ; 28682
+ ld c, $5
+.loop
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .loop
+ ret
+; 2868a
+
+Function2868a: ; 2868a
+ push hl
+ ld d, h
+ ld e, l
+ ld bc, wcbea
+ ld hl, wcbe8
+ ld a, c
+ ld [hli], a
+ ld [hl], b
+ ld hl, OTPartyMon1Species
+ ld c, $6
+.loop
+ push bc
+ call Function286ba
+ pop bc
+ dec c
+ jr nz, .loop
+ pop hl
+ lb bc, 1, 8
+ add hl, bc
+ ld de, OTPartyMonOT
+ ld bc, $42
+ call CopyBytes
+ ld de, OTPartyMonNicknames
+ ld bc, $42
+ jp CopyBytes
+; 286ba
+
+Function286ba: ; 286ba
+ ld b, h
+ ld c, l
+ ld a, [de]
+ inc de
+ push bc
+ push de
+ ld [wd265], a
+ callab ConvertMon_1to2
+ pop de
+ pop bc
+ ld a, [wd265]
+ ld [bc], a
+ ld [CurSpecies], a
+ ld hl, $22
+ add hl, bc
+ ld a, [de]
+ inc de
+ ld [hli], a
+ ld a, [de]
+ inc de
+ ld [hl], a
+ inc de
+ ld hl, $20
+ add hl, bc
+ ld a, [de]
+ inc de
+ ld [hl], a
+ ld hl, wcbe8
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, l
+ ld [wcbe8], a
+ ld a, h
+ ld [wcbe9], a
+ push bc
+ ld hl, $1
+ add hl, bc
+ push hl
+ ld h, d
+ ld l, e
+ pop de
+ push bc
+ ld a, [hli]
+ ld b, a
+ call Function28771
+ ld a, b
+ ld [de], a
+ inc de
+ pop bc
+ ld bc, $19
+ call CopyBytes
+ pop bc
+ ld d, h
+ ld e, l
+ ld hl, $1f
+ add hl, bc
+ ld a, [de]
+ inc de
+ ld [hl], a
+ ld [CurPartyLevel], a
+ push bc
+ ld hl, $24
+ add hl, bc
+ push hl
+ ld h, d
+ ld l, e
+ pop de
+ ld bc, 8
+ call CopyBytes
+ pop bc
+ call GetBaseData
+ push de
+ push bc
+ ld d, h
+ ld e, l
+ ld hl, $a
+ add hl, bc
+ ld c, $5
+ ld b, $1
+ predef CalcPkmnStatC
+ pop bc
+ pop hl
+ ld a, [$ffb5]
+ ld [hli], a
+ ld a, [$ffb6]
+ ld [hli], a
+ push hl
+ push bc
+ ld hl, $a
+ add hl, bc
+ ld c, $6
+ ld b, $1
+ predef CalcPkmnStatC
+ pop bc
+ pop hl
+ ld a, [$ffb5]
+ ld [hli], a
+ ld a, [$ffb6]
+ ld [hli], a
+ push hl
+ ld hl, $1b
+ add hl, bc
+ ld a, $46
+ ld [hli], a
+ xor a
+rept 2
+ ld [hli], a
+endr
+ ld [hl], a
+ pop hl
+rept 2
+ inc de
+endr
+ ret
+; 28771
+
+Function28771: ; 28771
+ ld a, b
+ and a
+ ret z
+ push hl
+ ld hl, .TimeCapsuleAlt
+.loop
+ ld a, [hli]
+ and a
+ jr z, .end
+ cp b
+ jr z, .found
+ inc hl
+ jr .loop
+
+.found
+ ld b, [hl]
+
+.end
+ pop hl
+ ret
+
+.TimeCapsuleAlt ; 28785
+; Pokémon traded from RBY do not have held items, so GSC usually interprets the
+; catch rate as an item. However, if the catch rate appears in this table, the
+; item associated with the table entry is used instead.
+ db ITEM_19, LEFTOVERS
+ db ITEM_2D, BITTER_BERRY
+ db ITEM_32, GOLD_BERRY
+ db ITEM_5A, BERRY
+ db ITEM_64, BERRY
+ db ITEM_78, BERRY
+ db ITEM_87, BERRY
+ db ITEM_BE, BERRY
+ db ITEM_C3, BERRY
+ db ITEM_DC, BERRY
+ db HM_08, BERRY
+ db $ff, BERRY
+ db $00
+; 2879e
+
+Function2879e: ; 2879e
+.asm_2879e
+ ld a, [hli]
+ cp $fe
+ jr z, .asm_2879e
+ ld [de], a
+ inc de
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_2879e
+ ret
+; 287ab
+
+Function287ab: ; 287ab
+ ld a, [hLinkPlayerNumber]
+ cp $2
+ ret z
+ ld hl, EnemyMonSpecies
+ call Function287d8
+ ld de, LinkBattleRNs
+ ld c, $a
+.asm_287bb
+ ld a, [hli]
+ cp $fe
+ jr z, .asm_287bb
+ cp $fd
+ jr z, .asm_287bb
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .asm_287bb
+ ret
+; 287ca
+
+Function287ca: ; 287ca
+.asm_287ca
+ ld a, [hli]
+ and a
+ jr z, .asm_287ca
+ cp $fd
+ jr z, .asm_287ca
+ cp $fe
+ jr z, .asm_287ca
+ dec hl
+ ret
+; 287d8
+
+Function287d8: ; 287d8
+.asm_287d8
+ ld a, [hli]
+ cp $fd
+ jr z, .asm_287d8
+ cp $fe
+ jr z, .asm_287d8
+ dec hl
+ ret
+; 287e3
+
+Function287e3: ; 287e3
+ call ClearScreen
+ call Function28ef8
+ callba Function16d673
+ xor a
+ ld hl, wcf51
+rept 3
+ ld [hli], a
+endr
+ ld [hl], a
+ ld a, $1
+ ld [MenuSelection2], a
+ inc a
+ ld [wcf56], a
+ jp Function2888b
+; 28803
+
+Function28803: ; 28803
+ ld a, $1
+ ld [MonType], a
+ ld a, $c1
+ ld [wcfa8], a
+ ld a, [OTPartyCount]
+ ld [wcfa3], a
+ ld a, $1
+ ld [wcfa4], a
+ ld a, $9
+ ld [wcfa1], a
+ ld a, $6
+ ld [wcfa2], a
+ ld a, $1
+ ld [wcfaa], a
+ ld a, $10
+ ld [wcfa7], a
+ ld a, $20
+ ld [wcfa5], a
+ xor a
+ ld [wcfa6], a
+
+Function28835: ; 28835
+ callba Function16d70c
+ ld a, d
+ and a
+ jp z, Function2891c
+ bit 0, a
+ jr z, .asm_2885b
+ ld a, $1
+ ld [wd263], a
+ callab Function50db9
+ ld hl, OTPartyMon1Species
+ callba Function4d319
+ jp Function2891c
+
+.asm_2885b
+ bit 6, a
+ jr z, .asm_28883
+ ld a, [MenuSelection2]
+ ld b, a
+ ld a, [OTPartyCount]
+ cp b
+ jp nz, Function2891c
+ xor a
+ ld [MonType], a
+ call Function1bf7
+ push hl
+ push bc
+ ld bc, NAME_LENGTH
+ add hl, bc
+ ld [hl], $7f
+ pop bc
+ pop hl
+ ld a, [PartyCount]
+ ld [MenuSelection2], a
+ jr Function2888b
+
+.asm_28883
+ bit 7, a
+ jp z, Function2891c
+ jp Function28ac9
+; 2888b
+
+Function2888b: ; 2888b
+ callba Function49856
+ xor a
+ ld [MonType], a
+ ld a, $c1
+ ld [wcfa8], a
+ ld a, [PartyCount]
+ ld [wcfa3], a
+ ld a, $1
+ ld [wcfa4], a
+ ld a, $1
+ ld [wcfa1], a
+ ld a, $6
+ ld [wcfa2], a
+ ld a, $1
+ ld [wcfaa], a
+ ld a, $10
+ ld [wcfa7], a
+ ld a, $20
+ ld [wcfa5], a
+ xor a
+ ld [wcfa6], a
+ call Function3200
+
+Function288c5: ; 288c5
+ callba Function16d70c
+ ld a, d
+ and a
+ jr nz, .asm_288d2
+ jp Function2891c
+
+.asm_288d2
+ bit 0, a
+ jr z, .asm_288d9
+ jp Function28926
+
+.asm_288d9
+ bit 7, a
+ jr z, .asm_288fe
+ ld a, [MenuSelection2]
+ dec a
+ jp nz, Function2891c
+ ld a, $1
+ ld [MonType], a
+ call Function1bf7
+ push hl
+ push bc
+ ld bc, NAME_LENGTH
+ add hl, bc
+ ld [hl], $7f
+ pop bc
+ pop hl
+ ld a, $1
+ ld [MenuSelection2], a
+ jp Function28803
+
+.asm_288fe
+ bit 6, a
+ jr z, Function2891c
+ ld a, [MenuSelection2]
+ ld b, a
+ ld a, [PartyCount]
+ cp b
+ jr nz, Function2891c
+ call Function1bf7
+ push hl
+ push bc
+ ld bc, NAME_LENGTH
+ add hl, bc
+ ld [hl], $7f
+ pop bc
+ pop hl
+ jp Function28ade
+; 2891c
+
+Function2891c: ; 2891c
+ ld a, [MonType]
+ and a
+ jp z, Function288c5
+ jp Function28835
+; 28926
+
+Function28926: ; 28926
+ call LoadTileMapToTempTileMap
+ ld a, [MenuSelection2]
+ push af
+ hlcoord 0, 15
+ ld b, $1
+ ld c, $12
+ call Function28eef
+ hlcoord 2, 16
+ ld de, String28ab4
+ call PlaceString
+ callba Function4d354
+
+.asm_28946
+ ld a, $7f
+ ldcoord_a 11, 16
+ ld a, $13
+ ld [wcfa8], a
+ ld a, $1
+ ld [wcfa3], a
+ ld a, $1
+ ld [wcfa4], a
+ ld a, $10
+ ld [wcfa1], a
+ ld a, $1
+ ld [wcfa2], a
+ ld a, $1
+ ld [MenuSelection2], a
+ ld [wcfaa], a
+ ld a, $20
+ ld [wcfa7], a
+ xor a
+ ld [wcfa5], a
+ ld [wcfa6], a
+ call Function1bd3
+ bit 4, a
+ jr nz, .asm_2898d
+ bit 1, a
+ jr z, .asm_289cd
+.asm_28983
+ pop af
+ ld [MenuSelection2], a
+ call Call_LoadTempTileMapToTileMap
+ jp Function2888b
+
+.asm_2898d
+ ld a, $7f
+ ldcoord_a 1, 16
+ ld a, $23
+ ld [wcfa8], a
+ ld a, $1
+ ld [wcfa3], a
+ ld a, $1
+ ld [wcfa4], a
+ ld a, $10
+ ld [wcfa1], a
+ ld a, $b
+ ld [wcfa2], a
+ ld a, $1
+ ld [MenuSelection2], a
+ ld [wcfaa], a
+ ld a, $20
+ ld [wcfa7], a
+ xor a
+ ld [wcfa5], a
+ ld [wcfa6], a
+ call Function1bd3
+ bit 5, a
+ jp nz, .asm_28946
+ bit 1, a
+ jr nz, .asm_28983
+ jr .asm_289fe
+
+.asm_289cd
+ pop af
+ ld [MenuSelection2], a
+ ld a, $4
+ ld [wd263], a
+ callab Function50db9
+ callba Function4d319
+ call Call_LoadTempTileMapToTileMap
+ hlcoord 6, 1
+ lb bc, 6, 1
+ ld a, " "
+ call Function28b77
+ hlcoord 17, 1
+ lb bc, 6, 1
+ ld a, " "
+ call Function28b77
+ jp Function2888b
+
+.asm_289fe
+ call Function1bee
+ pop af
+ ld [MenuSelection2], a
+ dec a
+ ld [wd002], a
+ ld [wcf56], a
+ callba Function16d6ce
+ ld a, [wcf51]
+ cp $f
+ jp z, Function287e3
+ ld [wd003], a
+ call Function28b68
+ ld c, $64
+ call DelayFrames
+ callba Functionfb57e
+ jr c, .asm_28a58
+ callba Functionfb5dd
+ jp nc, Function28b87
+ xor a
+ ld [wcf57], a
+ ld [wcf52], a
+ hlcoord 0, 12
+ ld b, $4
+ ld c, $12
+ call Function28eef
+ callba Function4d354
+ ld hl, UnknownText_0x28aaf
+ bccoord 1, 14
+ call PlaceWholeStringInBoxAtOnce
+ jr .asm_28a89
+
+.asm_28a58
+ xor a
+ ld [wcf57], a
+ ld [wcf52], a
+ ld a, [wd003]
+ ld hl, OTPartySpecies
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld a, [hl]
+ ld [wd265], a
+ call GetPokemonName
+ hlcoord 0, 12
+ ld b, $4
+ ld c, $12
+ call Function28eef
+ callba Function4d354
+ ld hl, UnknownText_0x28ac4
+ bccoord 1, 14
+ call PlaceWholeStringInBoxAtOnce
+
+.asm_28a89
+ hlcoord 0, 12
+ ld b, $4
+ ld c, $12
+ call Function28eef
+ hlcoord 1, 14
+ ld de, String28ece
+ call PlaceString
+ ld a, $1
+ ld [wcf56], a
+ callba Function16d6ce
+ ld c, $64
+ call DelayFrames
+ jp Function287e3
+; 28aaf
+
+
+UnknownText_0x28aaf: ; 0x28aaf
+ ; If you trade that #MON, you won't be able to battle.
+ text_jump UnknownText_0x1c41b1
+ db "@"
+; 0x28ab4
+
+String28ab4: ; 28ab4
+ db "STATS TRADE@"
+
+UnknownText_0x28ac4: ; 0x28ac4
+ ; Your friend's @ appears to be abnormal!
+ text_jump UnknownText_0x1c41e6
+ db "@"
+; 0x28ac9
+
+
+Function28ac9: ; 28ac9
+ ld a, [MenuSelection2]
+ cp $1
+ jp nz, Function2891c
+ call Function1bf7
+ push hl
+ push bc
+ ld bc, NAME_LENGTH
+ add hl, bc
+ ld [hl], $7f
+ pop bc
+ pop hl
+
+Function28ade: ; 28ade
+.asm_28ade
+ ld a, $ed
+ ldcoord_a 9, 17
+.asm_28ae3
+ call JoyTextDelay
+ ld a, [hJoyLast]
+ and a
+ jr z, .asm_28ae3
+ bit 0, a
+ jr nz, .asm_28b0b
+ push af
+ ld a, " "
+ ldcoord_a 9, 17
+ pop af
+ bit 6, a
+ jr z, .asm_28b03
+ ld a, [OTPartyCount]
+ ld [MenuSelection2], a
+ jp Function28803
+
+.asm_28b03
+ ld a, $1
+ ld [MenuSelection2], a
+ jp Function2888b
+
+.asm_28b0b
+ ld a, $ec
+ ldcoord_a 9, 17
+ ld a, $f
+ ld [wcf56], a
+ callba Function16d6ce
+ ld a, [wcf51]
+ cp $f
+ jr nz, .asm_28ade
+
+Function28b22: ; 28b22
+ call FadeToWhite
+ call ClearScreen
+ ld b, $8
+ call GetSGBLayout
+ call Function3200
+ xor a
+ ld [wcfbb], a
+ xor a
+ ld [rSB], a
+ ld [hSerialSend], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ ret
+; 28b42
+
+Function28b42: ; 28b42
+ hlcoord 0, 16
+ ld a, "┘"
+ ld bc, 2 * SCREEN_WIDTH
+ call ByteFill
+ hlcoord 1, 16
+ ld a, " "
+ ld bc, SCREEN_WIDTH - 2
+ call ByteFill
+ hlcoord 2, 16
+ ld de, String_28b61
+ jp PlaceString
+; 28b61
+
+String_28b61: ; 28b61
+ db "CANCEL@"
+; 28b68
+
+Function28b68: ; 28b68
+ ld a, [wcf51]
+ hlcoord 6, 9
+ ld bc, SCREEN_WIDTH
+ call AddNTimes
+ ld [hl], $ec
+ ret
+; 28b77
+
+Function28b77: ; 28b77
+.asm_28b77
+ push bc
+ push hl
+.asm_28b79
+ ld [hli], a
+ dec c
+ jr nz, .asm_28b79
+ pop hl
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .asm_28b77
+ ret
+; 28b87
+
+Function28b87: ; 28b87
+ xor a
+ ld [wcf57], a
+ ld [wcf52], a
+ hlcoord 0, 12
+ ld b, $4
+ ld c, $12
+ call Function28eef
+ callba Function4d354
+ ld a, [wd002]
+ ld hl, PartySpecies
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld a, [hl]
+ ld [wd265], a
+ call GetPokemonName
+ ld hl, StringBuffer1
+ ld de, wd004
+ ld bc, PKMN_NAME_LENGTH
+ call CopyBytes
+ ld a, [wd003]
+ ld hl, OTPartySpecies
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld a, [hl]
+ ld [wd265], a
+ call GetPokemonName
+ ld hl, UnknownText_0x28eb8
+ bccoord 1, 14
+ call PlaceWholeStringInBoxAtOnce
+ call LoadStandardMenuDataHeader
+ hlcoord 10, 7
+ ld b, $3
+ ld c, $7
+ call Function28eef
+ ld de, String28eab
+ hlcoord 12, 8
+ call PlaceString
+ ld a, $8
+ ld [wcfa1], a
+ ld a, $b
+ ld [wcfa2], a
+ ld a, $1
+ ld [wcfa4], a
+ ld a, $2
+ ld [wcfa3], a
+ xor a
+ ld [wcfa5], a
+ ld [wcfa6], a
+ ld a, $20
+ ld [wcfa7], a
+ ld a, $3
+ ld [wcfa8], a
+ ld a, $1
+ ld [MenuSelection2], a
+ ld [wcfaa], a
+ callba Function4d354
+ call Function1bd3
+ push af
+ call Call_ExitMenu
+ call Function3200
+ pop af
+ bit 1, a
+ jr nz, .asm_28c33
+ ld a, [MenuSelection2]
+ dec a
+ jr z, .asm_28c54
+
+.asm_28c33
+ ld a, $1
+ ld [wcf56], a
+ hlcoord 0, 12
+ ld b, 4
+ ld c, 18
+ call Function28eef
+ hlcoord 1, 14
+ ld de, String28ece
+ call PlaceString
+ callba Function16d6ce
+ jp Function28ea3
+
+.asm_28c54
+ ld a, $2
+ ld [wcf56], a
+ callba Function16d6ce
+ ld a, [wcf51]
+ dec a
+ jr nz, .asm_28c7b
+ hlcoord 0, 12
+ ld b, 4
+ ld c, 18
+ call Function28eef
+ hlcoord 1, 14
+ ld de, String28ece
+ call PlaceString
+ jp Function28ea3
+
+.asm_28c7b
+ ld hl, sPartyScratch1
+ ld a, [wd002]
+ ld bc, SCRATCHMON_STRUCT_LENGTH
+ call AddNTimes
+ ld a, BANK(sPartyScratch1)
+ call GetSRAMBank
+ ld d, h
+ ld e, l
+ ld bc, SCRATCHMON_STRUCT_LENGTH
+ add hl, bc
+ ld a, [wd002]
+ ld c, a
+.asm_28c96
+ inc c
+ ld a, c
+ cp $6
+ jr z, .asm_28ca6
+ push bc
+ ld bc, SCRATCHMON_STRUCT_LENGTH
+ call CopyBytes
+ pop bc
+ jr .asm_28c96
+
+.asm_28ca6
+ ld hl, sPartyScratch1
+ ld a, [PartyCount]
+ dec a
+ ld bc, SCRATCHMON_STRUCT_LENGTH
+ call AddNTimes
+ push hl
+ ld hl, wc9f4
+ ld a, [wd003]
+ ld bc, SCRATCHMON_STRUCT_LENGTH
+ call AddNTimes
+ pop de
+ ld bc, SCRATCHMON_STRUCT_LENGTH
+ call CopyBytes
+ call CloseSRAM
+ ld hl, PlayerName
+ ld de, wc6e7
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ld a, [wd002]
+ ld hl, PartySpecies
+ ld b, $0
+ ld c, a
+ add hl, bc
+ ld a, [hl]
+ ld [wc6d0], a
+ push af
+ ld a, [wd002]
+ ld hl, PartyMonOT
+ call SkipNames
+ ld de, wc6f2
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ld hl, PartyMon1ID
+ ld a, [wd002]
+ call GetPartyLocation
+ ld a, [hli]
+ ld [PlayerScreens], a
+ ld a, [hl]
+ ld [EnemyScreens], a
+ ld hl, PartyMon1DVs
+ ld a, [wd002]
+ call GetPartyLocation
+ ld a, [hli]
+ ld [wc6fd], a
+ ld a, [hl]
+ ld [wPlayerMinimized], a
+ ld a, [wd002]
+ ld hl, PartyMon1Species
+ call GetPartyLocation
+ ld b, h
+ ld c, l
+ callba GetCaughtGender
+ ld a, c
+ ld [wc701], a
+ ld hl, wd26b
+ ld de, wc719
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ld a, [wd003]
+ ld hl, OTPartySpecies
+ ld b, $0
+ ld c, a
+ add hl, bc
+ ld a, [hl]
+ ld [wc702], a
+ ld a, [wd003]
+ ld hl, OTPartyMonOT
+ call SkipNames
+ ld de, wc724
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ld hl, OTPartyMon1ID
+ ld a, [wd003]
+ call GetPartyLocation
+ ld a, [hli]
+ ld [wEnemyWrapCount], a
+ ld a, [hl]
+ ld [wPlayerCharging], a
+ ld hl, OTPartyMon1DVs
+ ld a, [wd003]
+ call GetPartyLocation
+ ld a, [hli]
+ ld [wEnemyTrappingMove], a
+ ld a, [hl]
+ ld [wPlayerWrapCount], a
+ ld a, [wd003]
+ ld hl, OTPartyMon1Species
+ call GetPartyLocation
+ ld b, h
+ ld c, l
+ callba GetCaughtGender
+ ld a, c
+ ld [wEnemyCharging], a
+ ld a, [wd002]
+ ld [CurPartyMon], a
+ ld hl, PartySpecies
+ ld b, $0
+ ld c, a
+ add hl, bc
+ ld a, [hl]
+ ld [wd002], a
+ xor a
+ ld [wPokemonWithdrawDepositParameter], a
+ callab Functione039
+ ld a, [PartyCount]
+ dec a
+ ld [CurPartyMon], a
+ ld a, $1
+ ld [wd1e9], a
+ ld a, [wd003]
+ push af
+ ld hl, OTPartySpecies
+ ld b, $0
+ ld c, a
+ add hl, bc
+ ld a, [hl]
+ ld [wd003], a
+ ld c, 100
+ call DelayFrames
+ call ClearTileMap
+ call LoadFontsBattleExtra
+ ld b, $8
+ call GetSGBLayout
+ ld a, [hLinkPlayerNumber]
+ cp $1
+ jr z, .asm_28de4
+ predef Function28f24
+ jr .asm_28de9
+
+.asm_28de4
+ predef Function28f63
+
+.asm_28de9
+ pop af
+ ld c, a
+ ld [CurPartyMon], a
+ ld hl, OTPartySpecies
+ ld d, $0
+ ld e, a
+ add hl, de
+ ld a, [hl]
+ ld [CurPartySpecies], a
+ ld hl, OTPartyMon1Species
+ ld a, c
+ call GetPartyLocation
+ ld de, TempMonSpecies
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call CopyBytes
+ predef Functionda96
+ ld a, [PartyCount]
+ dec a
+ ld [CurPartyMon], a
+ callab Function421d8
+ call ClearScreen
+ call Function28ef8
+ call Function28eff
+ callba Function4d354
+ ld b, $1
+ pop af
+ ld c, a
+ cp MEW
+ jr z, .asm_28e49
+ ld a, [CurPartySpecies]
+ cp MEW
+ jr z, .asm_28e49
+ ld b, $2
+ ld a, c
+ cp CELEBI
+ jr z, .asm_28e49
+ ld a, [CurPartySpecies]
+ cp CELEBI
+ jr z, .asm_28e49
+ ld b, $0
+
+.asm_28e49
+ ld a, b
+ ld [wcf56], a
+ push bc
+ call Function862
+ pop bc
+ ld a, [wLinkMode]
+ cp LINK_TIMECAPSULE
+ jr z, .asm_28e63
+ ld a, b
+ and a
+ jr z, .asm_28e63
+ ld a, [wcf52]
+ cp b
+ jr nz, .asm_28e49
+
+.asm_28e63
+ callba Function14a58
+ callba MobileFn_1060af
+ callba BackupMobileEventIndex
+ ld c, 40
+ call DelayFrames
+ hlcoord 0, 12
+ ld b, 4
+ ld c, 18
+ call Function28eef
+ hlcoord 1, 14
+ ld de, String28ebd
+ call PlaceString
+ callba Function4d354
+ ld c, 50
+ call DelayFrames
+ ld a, [wLinkMode]
+ cp LINK_TIMECAPSULE
+ jp z, Function2805d
+ jp Function28177
+; 28ea3
+
+Function28ea3: ; 28ea3
+ ld c, 100
+ call DelayFrames
+ jp Function287e3
+; 28eab
+
+String28eab: ; 28eab
+ db "TRADE"
+ next "CANCEL@"
+
+UnknownText_0x28eb8: ; 0x28eb8
+ ; Trade @ for @ ?
+ text_jump UnknownText_0x1c4212
+ db "@"
+; 0x28ebd
+
+String28ebd: ; 28ebd
+ db "Trade completed!@"
+
+String28ece: ; 28ece
+ db "Too bad! The trade"
+ next "was canceled!@"
+
+
+Function28eef: ; 28eef
+ ld d, h
+ ld e, l
+ callba Function16d6ca
+ ret
+; 28ef8
+
+Function28ef8: ; 28ef8
+ callba Function16d696
+ ret
+; 28eff
+
+Function28eff: ; 28eff
+ callba Function16d6a7
+ call SetPalettes
+ ret
+; 28f09
+
+Function28f09: ; 28f09
+ hlcoord 0, 0
+ ld b, 6
+ ld c, 18
+ call Function28eef
+ hlcoord 0, 8
+ ld b, 6
+ ld c, 18
+ call Function28eef
+ callba Functionfb60d
+ ret
+; 28f24
+
+Function28f24: ; 28f24
+ xor a
+ ld [wcf66], a
+ ld hl, wc6e7
+ ld de, wc719
+ call Function297ff
+ ld hl, wc6d0
+ ld de, wc702
+ call Function29814
+ ld de, .data_28f3f
+ jr Function28fa1
+
+.data_28f3f
+ db $1b
+ db $1
+ db $1c
+ db $21
+ db $2d
+ db $27
+ db $23
+ db $3
+ db $25
+ db $28
+ db $25
+ db $1e
+ db $29
+ db $6
+ db $16
+ db $1f
+ db $19
+ db $17
+ db $22
+ db $1f
+ db $2a
+ db $e
+ db $3
+ db $24
+ db $5
+ db $25
+ db $2
+ db $27
+ db $25
+ db $1d
+ db $2c
+ db $2e
+ db $1e
+ db $18
+ db $1f
+ db $2b
+
+Function28f63: ; 28f63
+ xor a
+ ld [wcf66], a
+ ld hl, wc719
+ ld de, wc6e7
+ call Function297ff
+ ld hl, wc702
+ ld de, wc6d0
+ call Function29814
+ ld de, .data_28f7e
+ jr Function28fa1
+
+.data_28f7e
+ db $1a
+ db $17
+ db $22
+ db $1f
+ db $2a
+ db $6
+ db $3
+ db $24
+ db $5
+ db $25
+ db $2
+ db $27
+ db $25
+ db $1d
+ db $2c
+ db $2f
+ db $1e
+ db $18
+ db $1f
+ db $1b
+ db $1
+ db $1c
+ db $22
+ db $27
+ db $23
+ db $3
+ db $25
+ db $28
+ db $25
+ db $1e
+ db $29
+ db $e
+ db $16
+ db $1f
+ db $2b
+
+Function28fa1: ; 28fa1
+ ld hl, BattleEnded
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld a, [hMapAnims]
+ push af
+ xor a
+ ld [hMapAnims], a
+ ld hl, VramState
+ ld a, [hl]
+ push af
+ res 0, [hl]
+ ld hl, Options
+ ld a, [hl]
+ push af
+ set 4, [hl]
+ call Function28fdb
+ ld a, [wcf66]
+ and a
+ jr nz, .asm_28fca
+ ld de, MUSIC_EVOLUTION
+ call PlayMusic2
+.asm_28fca
+ call Function29082
+ jr nc, .asm_28fca
+ pop af
+ ld [Options], a
+ pop af
+ ld [VramState], a
+ pop af
+ ld [hMapAnims], a
+ ret
+; 28fdb
+
+Function28fdb: ; 28fdb
+ xor a
+ ld [wJumptableIndex], a
+ call ClearBGPalettes
+ call ClearSprites
+ call ClearTileMap
+ call DisableLCD
+ call LoadFontsBattleExtra
+ callab Function8cf53
+ ld a, [hCGB]
+ and a
+ jr z, .asm_2900b
+ ld a, $1
+ ld [rVBK], a
+ ld hl, VTiles0
+ ld bc, sScratch - VTiles0
+ xor a
+ call ByteFill
+ ld a, $0
+ ld [rVBK], a
+
+.asm_2900b
+ ld hl, VBGMap0
+ ld bc, sScratch - VBGMap0
+ ld a, " "
+ call ByteFill
+ ld hl, TradeGameBoyLZ
+ ld de, VTiles2 tile $31
+ call Decompress
+ ld hl, TradeArrowGFX
+ ld de, VTiles1 tile $6d
+ ld bc, $10
+ ld a, BANK(TradeArrowGFX)
+ call FarCopyBytes
+ ld hl, TradeArrowGFX + $10
+ ld de, VTiles1 tile $6e
+ ld bc, $10
+ ld a, BANK(TradeArrowGFX)
+ call FarCopyBytes
+ xor a
+ ld [hSCX], a
+ ld [hSCY], a
+ ld a, $7
+ ld [hWX], a
+ ld a, $90
+ ld [hWY], a
+ callba Function4d7fd
+ call EnableLCD
+ call Function2982b
+ ld a, [wc6d0]
+ ld hl, wc6fd
+ ld de, VTiles0
+ call Function29491
+ ld a, [wc702]
+ ld hl, wEnemyTrappingMove
+ ld de, VTiles0 tile $31
+ call Function29491
+ ld a, [wc6d0]
+ ld de, wc6d1
+ call Function294a9
+ ld a, [wc702]
+ ld de, wc703
+ call Function294a9
+ call Function297ed
+ ret
+; 29082
+
+Function29082: ; 29082
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .asm_2909b
+ call Function290a0
+ callab Function8cf69
+ ld hl, wcf65
+ inc [hl]
+ call DelayFrame
+ and a
+ ret
+
+.asm_2909b
+ call LoadStandardFont
+ scf
+ ret
+; 290a0
+
+Function290a0: ; 290a0
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, 0
+ ld hl, JumpTable290af
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; 290af
+
+JumpTable290af: ; 290af
+ dw Function29114
+ dw Function2942e
+ dw Function29461
+ dw Function29348
+ dw Function2937e
+ dw Function29391
+ dw Function29129
+ dw Function291af
+ dw Function291c4
+ dw Function291d9
+ dw Function2925d
+ dw Function29220
+ dw Function2925d
+ dw Function29229
+ dw Function2913c
+ dw Function2925d
+ dw Function291e8
+ dw Function291fd
+ dw Function29211
+ dw Function29220
+ dw Function2925d
+ dw Function29229
+ dw Function29701
+ dw Function2973c
+ dw Function2975c
+ dw Function2977f
+ dw Function297a4
+ dw Function293a6
+ dw Function293b6
+ dw Function293d2
+ dw Function293de
+ dw Function293ea
+ dw Function2940c
+ dw Function294e7
+ dw Function294f0
+ dw Function2961b
+ dw Function2962c
+ dw Function29879
+ dw Function29886
+ dw Function29649
+ dw Function29660
+ dw Function2926d
+ dw Function29277
+ dw Function29123
+ dw Function29487
+ dw Function294f9
+ dw Function29502
+ dw Function2950c
+; 2910f
+
+Function2910f: ; 2910f
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+; 29114
+
+Function29114: ; 29114
+ ld hl, BattleEnded
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld a, [de]
+ ld [wJumptableIndex], a
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ ret
+; 29123
+
+Function29123: ; 29123
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+; 29129
+
+Function29129: ; 29129
+ ld a, $ed
+ call Function292f6
+ ld a, [wc74c]
+ ld [wd265], a
+ xor a
+ ld de, $2c58
+ ld b, $0
+ jr Function2914e
+
+Function2913c: ; 2913c
+ ld a, $ee
+ call Function292f6
+ ld a, [wc74d]
+ ld [wd265], a
+ ld a, $2
+ lb de, $4c, $94
+ ld b, $4
+
+Function2914e: ; 2914e
+ push bc
+ push de
+ push bc
+ push de
+ push af
+ call DisableLCD
+ callab Function8cf53
+ ld hl, $9874
+ ld bc, $c
+ ld a, $60
+ call ByteFill
+ pop af
+ call Function29281
+ xor a
+ ld [hSCX], a
+ ld a, $7
+ ld [hWX], a
+ ld a, $70
+ ld [hWY], a
+ call EnableLCD
+ call Function2985a
+ pop de
+ ld a, $11
+ call Function3b2a
+ ld hl, $b
+ add hl, bc
+ pop bc
+ ld [hl], b
+ pop de
+ ld a, $12
+ call Function3b2a
+ ld hl, $b
+ add hl, bc
+ pop bc
+ ld [hl], b
+ call WaitBGMap
+ ld b, $1b
+ call GetSGBLayout
+ ld a, $e4
+ call DmgToCgbBGPals
+ ld a, $d0
+ call Functioncf8
+ call Function2910f
+ ld a, $5c
+ ld [wcf64], a
+ ret
+; 291af
+
+Function291af: ; 291af
+ call Function2981d
+ ld a, [hSCX]
+ add $2
+ ld [hSCX], a
+ cp $50
+ ret nz
+ ld a, $1
+ call Function29281
+ call Function2910f
+ ret
+; 291c4
+
+Function291c4: ; 291c4
+ call Function2981d
+ ld a, [hSCX]
+ add $2
+ ld [hSCX], a
+ cp $a0
+ ret nz
+ ld a, $2
+ call Function29281
+ call Function2910f
+ ret
+; 291d9
+
+Function291d9: ; 291d9
+ call Function2981d
+ ld a, [hSCX]
+ add $2
+ ld [hSCX], a
+ and a
+ ret nz
+ call Function2910f
+ ret
+; 291e8
+
+Function291e8: ; 291e8
+ call Function2981d
+ ld a, [hSCX]
+ sub $2
+ ld [hSCX], a
+ cp $b0
+ ret nz
+ ld a, $1
+ call Function29281
+ call Function2910f
+ ret
+; 291fd
+
+Function291fd: ; 291fd
+ call Function2981d
+ ld a, [hSCX]
+ sub $2
+ ld [hSCX], a
+ cp $60
+ ret nz
+ xor a
+ call Function29281
+ call Function2910f
+ ret
+; 29211
+
+Function29211: ; 29211
+ call Function2981d
+ ld a, [hSCX]
+ sub $2
+ ld [hSCX], a
+ and a
+ ret nz
+ call Function2910f
+ ret
+; 29220
+
+Function29220: ; 29220
+ ld a, $80
+ ld [wcf64], a
+ call Function2910f
+ ret
+; 29229
+
+Function29229: ; 29229
+ call ClearBGPalettes
+ call ClearTileMap
+ call ClearSprites
+ call DisableLCD
+ callab Function8cf53
+ ld hl, VBGMap0
+ ld bc, sScratch - VBGMap0
+ ld a, " "
+ call ByteFill
+ xor a
+ ld [hSCX], a
+ ld a, $90
+ ld [hWY], a
+ call EnableLCD
+ call Function2982b
+ call WaitBGMap
+ call Function297ed
+ call Function29114
+ ret
+; 2925d
+
+Function2925d: ; 2925d
+ call Function2981d
+ ld hl, wcf64
+ ld a, [hl]
+ and a
+ jr z, .asm_29269
+ dec [hl]
+ ret
+
+.asm_29269
+ call Function2910f
+ ret
+; 2926d
+
+Function2926d: ; 2926d
+ call Function29114
+ ld de, SFX_GIVE_TRADEMON
+ call PlaySFX
+ ret
+; 29277
+
+Function29277: ; 29277
+ call Function29114
+ ld de, SFX_GET_TRADEMON
+ call PlaySFX
+ ret
+; 29281
+
+Function29281: ; 29281
+ and 3
+ ld e, a
+ ld d, 0
+ ld hl, Jumptable_2928f
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; 2928f
+
+Jumptable_2928f: ; 2928f
+ dw Function29297
+ dw Function292af
+ dw Function292be
+ dw Function29297
+; 29297
+
+Function29297: ; 29297
+ call Function297cf
+ hlcoord 9, 3
+ ld [hl], $5b
+ inc hl
+ ld bc, $a
+ ld a, $60
+ call ByteFill
+ hlcoord 3, 2
+ call Function292ec
+ ret
+; 292af
+
+Function292af: ; 292af
+ call Function297cf
+ hlcoord 0, 3
+ ld bc, SCREEN_WIDTH
+ ld a, $60
+ call ByteFill
+ ret
+; 292be
+
+Function292be: ; 292be
+ call Function297cf
+ hlcoord 0, 3
+ ld bc, $11
+ ld a, $60
+ call ByteFill
+ hlcoord 17, 3
+ ld a, $5d
+ ld [hl], a
+ ld a, $61
+ ld de, SCREEN_WIDTH
+ ld c, $3
+.asm_292d9
+ add hl, de
+ ld [hl], a
+ dec c
+ jr nz, .asm_292d9
+ add hl, de
+ ld a, $5f
+ ld [hld], a
+ ld a, $5b
+ ld [hl], a
+ hlcoord 10, 6
+ call Function292ec
+ ret
+; 292ec
+
+Function292ec: ; 292ec
+ ld de, TradeGameBoyTilemap
+ lb bc, 8, 6
+ call Function297db
+ ret
+; 292f6
+
+Function292f6: ; 292f6
+ push af
+ call ClearBGPalettes
+ call WaitTop
+ ld a, VBGMap1 / $100
+ ld [hBGMapAddress + 1], a
+ call ClearTileMap
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH
+ ld a, "─"
+ call ByteFill
+ hlcoord 0, 1
+ ld de, wc736
+ call PlaceString
+ ld hl, wc741
+ ld de, 0
+.asm_2931e
+ ld a, [hli]
+ cp "@"
+ jr z, .asm_29326
+ dec de
+ jr .asm_2931e
+
+.asm_29326
+ hlcoord 0, 4
+ add hl, de
+ ld de, wc741
+ call PlaceString
+ hlcoord 7, 2
+ ld bc, 6
+ pop af
+ call ByteFill
+ call WaitBGMap
+ call WaitTop
+ ld a, VBGMap0 / $100
+ ld [hBGMapAddress + 1], a
+ call ClearTileMap
+ ret
+; 29348
+
+Function29348: ; 29348
+ call ClearTileMap
+ call WaitTop
+ ld a, $a0
+ ld [hSCX], a
+ call DelayFrame
+ hlcoord 8, 2
+ ld de, Tilemap_298f7
+ lb bc, 3, 12
+ call Function297db
+ call WaitBGMap
+ ld b, $1b
+ call GetSGBLayout
+ ld a, $e4
+ call DmgToCgbBGPals
+ ld de, $e4e4
+ call DmgToCgbObjPals
+ ld de, SFX_POTION
+ call PlaySFX
+ call Function2910f
+ ret
+; 2937e
+
+Function2937e: ; 2937e
+ ld a, [hSCX]
+ and a
+ jr z, .asm_29388
+ add $4
+ ld [hSCX], a
+ ret
+
+.asm_29388
+ ld c, $50
+ call DelayFrames
+ call Function29114
+ ret
+; 29391
+
+Function29391: ; 29391
+ ld a, [hSCX]
+ cp $a0
+ jr z, .asm_2939c
+ sub $4
+ ld [hSCX], a
+ ret
+
+.asm_2939c
+ call ClearTileMap
+ xor a
+ ld [hSCX], a
+ call Function29114
+ ret
+; 293a6
+
+Function293a6: ; 293a6
+ ld a, $8f
+ ld [hWX], a
+ ld a, $88
+ ld [hSCX], a
+ ld a, $50
+ ld [hWY], a
+ call Function29114
+ ret
+; 293b6
+
+Function293b6: ; 293b6
+ ld a, [hWX]
+ cp $7
+ jr z, .asm_293c7
+ sub $4
+ ld [hWX], a
+ ld a, [hSCX]
+ sub $4
+ ld [hSCX], a
+ ret
+
+.asm_293c7
+ ld a, $7
+ ld [hWX], a
+ xor a
+ ld [hSCX], a
+ call Function29114
+ ret
+; 293d2
+
+Function293d2: ; 293d2
+ ld a, $7
+ ld [hWX], a
+ ld a, $50
+ ld [hWY], a
+ call Function29114
+ ret
+; 293de
+
+Function293de: ; 293de
+ ld a, $7
+ ld [hWX], a
+ ld a, $90
+ ld [hWY], a
+ call Function29114
+ ret
+; 293ea
+
+Function293ea: ; 293ea
+ call WaitTop
+ ld a, VBGMap1 / $100
+ ld [hBGMapAddress + 1], a
+ call WaitBGMap
+ ld a, $7
+ ld [hWX], a
+ xor a
+ ld [hWY], a
+ call DelayFrame
+ call WaitTop
+ ld a, VBGMap0 / $100
+ ld [hBGMapAddress + 1], a
+ call ClearTileMap
+ call Function2910f
+ ret
+; 2940c
+
+Function2940c: ; 2940c
+ ld a, [hWX]
+ cp $a1
+ jr nc, .asm_29417
+ add $4
+ ld [hWX], a
+ ret
+
+.asm_29417
+ ld a, VBGMap1 / $100
+ ld [hBGMapAddress + 1], a
+ call WaitBGMap
+ ld a, $7
+ ld [hWX], a
+ ld a, $90
+ ld [hWY], a
+ ld a, VBGMap0 / $100
+ ld [hBGMapAddress + 1], a
+ call Function29114
+ ret
+; 2942e
+
+Function2942e: ; 2942e
+ call Function2951f
+ ld a, [wc6d0]
+ ld [CurPartySpecies], a
+ ld a, [wc6fd]
+ ld [TempMonDVs], a
+ ld a, [wPlayerMinimized]
+ ld [TempMonDVs + 1], a
+ ld b, $1a
+ call GetSGBLayout
+ ld a, $e4
+ call DmgToCgbBGPals
+ call Function294bb
+
+ ld a, [wc6d0]
+ call GetCryIndex
+ jr c, .asm_2945d
+ ld e, c
+ ld d, b
+ call PlayCryHeader
+.asm_2945d
+
+ call Function29114
+ ret
+; 29461
+
+Function29461: ; 29461
+ call Function29549
+ ld a, [wc702]
+ ld [CurPartySpecies], a
+ ld a, [wEnemyTrappingMove]
+ ld [TempMonDVs], a
+ ld a, [wPlayerWrapCount]
+ ld [TempMonDVs + 1], a
+ ld b, $1a
+ call GetSGBLayout
+ ld a, $e4
+ call DmgToCgbBGPals
+ call Function294c0
+ call Function29114
+ ret
+; 29487
+
+Function29487: ; 29487
+ callba Function4d81e
+ call Function29114
+ ret
+; 29491
+
+Function29491: ; 29491
+ push de
+ push af
+ predef GetUnownLetter
+ pop af
+ ld [CurPartySpecies], a
+ ld [CurSpecies], a
+ call GetBaseData
+ pop de
+ predef GetFrontpic
+ ret
+; 294a9
+
+Function294a9: ; 294a9
+ push de
+ ld [wd265], a
+ call GetPokemonName
+ ld hl, StringBuffer1
+ pop de
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ret
+; 294bb
+
+Function294bb: ; 294bb
+ ld de, VTiles0
+ jr Function294c3
+
+Function294c0: ; 294c0
+ ld de, VTiles0 tile $31
+
+Function294c3: ; 294c3
+ call DelayFrame
+ ld hl, VTiles2
+ ld bc, $a31
+ call Request2bpp
+ call WaitTop
+ call Function297cf
+ hlcoord 7, 2
+ xor a
+ ld [hFillBox], a
+ lb bc, 7, 7
+ predef FillBox
+ call WaitBGMap
+ ret
+; 294e7
+
+Function294e7: ; 294e7
+ ld c, $50
+ call DelayFrames
+ call Function29114
+ ret
+; 294f0
+
+Function294f0: ; 294f0
+ ld c, $28
+ call DelayFrames
+ call Function29114
+ ret
+; 294f9
+
+Function294f9: ; 294f9
+ ld c, $60
+ call DelayFrames
+ call Function29114
+ ret
+; 29502
+
+Function29502: ; 29502
+ call Function29516
+ ret nz
+ ld c, $50
+ call DelayFrames
+ ret
+; 2950c
+
+Function2950c: ; 2950c
+ call Function29516
+ ret nz
+ ld c, $b4
+ call DelayFrames
+ ret
+; 29516
+
+Function29516: ; 29516
+ call Function29114
+ ld a, [wc702]
+ cp $fd
+ ret
+; 2951f
+
+Function2951f: ; 2951f
+ ld de, wc6d0
+ ld a, [de]
+ cp $fd
+ jr z, Function295a1
+ call Function29573
+ ld de, wc6d0
+ call Function295e3
+ ld de, wc6d1
+ call Function295ef
+ ld a, [wc701]
+ ld de, wc6f2
+ call Function295f6
+ ld de, PlayerScreens
+ call Function29611
+ call Function295d8
+ ret
+; 29549
+
+Function29549: ; 29549
+ ld de, wc702
+ ld a, [de]
+ cp $fd
+ jr z, Function295a1
+ call Function29573
+ ld de, wc702
+ call Function295e3
+ ld de, wc703
+ call Function295ef
+ ld a, [wEnemyCharging]
+ ld de, wc724
+ call Function295f6
+ ld de, wEnemyWrapCount
+ call Function29611
+ call Function295d8
+ ret
+; 29573
+
+Function29573: ; 29573
+ call WaitTop
+ call Function297cf
+ ld a, VBGMap1 / $100
+ ld [hBGMapAddress + 1], a
+ hlcoord 3, 0
+ ld b, $6
+ ld c, $d
+ call TextBox
+ hlcoord 4, 0
+ ld de, String29591
+ call PlaceString
+ ret
+; 29591
+
+String29591: ; 29591
+ db "─── №."
+ next ""
+ next "OT/"
+ next $73, "№.@"
+; 295a1
+
+Function295a1: ; 295a1
+ call WaitTop
+ call Function297cf
+ ld a, VBGMap1 / $100
+ ld [hBGMapAddress + 1], a
+ hlcoord 3, 0
+ ld b, $6
+ ld c, $d
+ call TextBox
+ hlcoord 4, 2
+ ld de, String295c2
+ call PlaceString
+ call Function295d8
+ ret
+; 295c2
+
+String295c2: ; 295c2
+ db "EGG"
+ next "OT/?????"
+ next $73, "№.?????@"
+; 295d8
+
+Function295d8: ; 295d8
+ call WaitBGMap
+ call WaitTop
+ ld a, VBGMap0 / $100
+ ld [hBGMapAddress + 1], a
+ ret
+; 295e3
+
+Function295e3: ; 295e3
+ hlcoord 10, 0
+ lb bc, PRINTNUM_LEADINGZEROS | 1, 3
+ call PrintNum
+ ld [hl], $7f
+ ret
+; 295ef
+
+Function295ef: ; 295ef
+ hlcoord 4, 2
+ call PlaceString
+ ret
+; 295f6
+
+Function295f6: ; 295f6
+ cp 3
+ jr c, .asm_295fb
+ xor a
+
+.asm_295fb
+ push af
+ hlcoord 7, 4
+ call PlaceString
+ inc bc
+ pop af
+ ld hl, Unknown_2960e
+ ld d, 0
+ ld e, a
+ add hl, de
+ ld a, [hl]
+ ld [bc], a
+ ret
+; 2960e
+
+Unknown_2960e: ; 2960e
+ db " ", "♂", "♀"
+; 29611
+
+Function29611: ; 29611
+ hlcoord 7, 6
+ lb bc, PRINTNUM_LEADINGZEROS | 2, 5
+ call PrintNum
+ ret
+; 2961b
+
+Function2961b: ; 2961b
+ lb de, $54, $58
+ ld a, $e
+ call Function3b2a
+ call Function29114
+ ld a, $20
+ ld [wcf64], a
+ ret
+; 2962c
+
+Function2962c: ; 2962c
+ lb de, $54, $58
+ ld a, $e
+ call Function3b2a
+ ld hl, $b
+ add hl, bc
+ ld [hl], $1
+ ld hl, $7
+ add hl, bc
+ ld [hl], $dc
+ call Function29114
+ ld a, $38
+ ld [wcf64], a
+ ret
+; 29649
+
+Function29649: ; 29649
+ lb de, $54, $58
+ ld a, $f
+ call Function3b2a
+ call Function29114
+ ld a, $10
+ ld [wcf64], a
+ ld de, SFX_BALL_POOF
+ call PlaySFX
+ ret
+; 29660
+
+Function29660: ; 29660
+ ld a, $e4
+ call Functioncf8
+ lb de, $28, $58
+ ld a, $10
+ call Function3b2a
+ call Function29114
+ ld a, $40
+ ld [wcf64], a
+ ret
+; 29676
+
+Function29676: ; 29676 (a:5676)
+ ld hl, $b
+ add hl, bc
+ ld e, [hl]
+ ld d, 0
+ ld hl, Jumptable_29686
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; 29686
+
+Jumptable_29686: ; 29686 (a:5686)
+ dw Function2969a
+ dw Function296a4
+ dw Function296af
+ dw Function296bd
+ dw Function296cf
+ dw Function296dd
+ dw Function296f2
+; 2969a
+
+Function29694: ; 29694 (a:5694)
+ ld hl, $b
+ add hl, bc
+ inc [hl]
+ ret
+
+Function2969a: ; 2969a (a:569a)
+ call Function29694
+ ld hl, $c
+ add hl, bc
+ ld [hl], $80
+ ret
+
+Function296a4: ; 296a4 (a:56a4)
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ dec [hl]
+ and a
+ ret nz
+ call Function29694
+
+Function296af: ; 296af (a:56af)
+ ld hl, $4
+ add hl, bc
+ ld a, [hl]
+ cp $94
+ jr nc, .asm_296ba
+ inc [hl]
+ ret
+.asm_296ba
+ call Function29694
+
+Function296bd: ; 296bd (a:56bd)
+ ld hl, $5
+ add hl, bc
+ ld a, [hl]
+ cp $4c
+ jr nc, .asm_296c8
+ inc [hl]
+ ret
+.asm_296c8
+ ld hl, $
+ add hl, bc
+ ld [hl], $0
+ ret
+
+Function296cf: ; 296cf (a:56cf)
+ ld hl, $5
+ add hl, bc
+ ld a, [hl]
+ cp $2c
+ jr z, .asm_296da
+ dec [hl]
+ ret
+.asm_296da
+ call Function29694
+
+Function296dd: ; 296dd (a:56dd)
+ ld hl, $4
+ add hl, bc
+ ld a, [hl]
+ cp $58
+ jr z, .asm_296e8
+ dec [hl]
+ ret
+.asm_296e8
+ call Function29694
+ ld hl, $c
+ add hl, bc
+ ld [hl], $80
+ ret
+
+Function296f2: ; 296f2 (a:56f2)
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ dec [hl]
+ and a
+ ret nz
+ ld hl, $
+ add hl, bc
+ ld [hl], $0
+ ret
+; 29701 (a:5701)
+
+Function29701: ; 29701
+ ld a, [wLinkMode]
+ cp LINK_TIMECAPSULE
+ jr z, .asm_29725
+ ld hl, UnknownText_0x29737
+ call PrintText
+ ld c, $bd
+ call DelayFrames
+ ld hl, UnknownText_0x29732
+ call PrintText
+ call Function297c9
+ ld c, $80
+ call DelayFrames
+ call Function29114
+ ret
+
+.asm_29725
+ ld hl, UnknownText_0x29732
+ call PrintText
+ call Function297c9
+ call Function29114
+ ret
+; 29732
+
+UnknownText_0x29732: ; 0x29732
+ ; was sent to @ .
+ text_jump UnknownText_0x1bc6e9
+ db "@"
+; 0x29737
+
+UnknownText_0x29737: ; 0x29737
+ ;
+ text_jump UnknownText_0x1bc701
+ db "@"
+; 0x2973c
+
+Function2973c: ; 2973c
+ ld hl, UnknownText_0x29752
+ call PrintText
+ call Function297c9
+ ld hl, UnknownText_0x29757
+ call PrintText
+ call Function297c9
+ call Function29114
+ ret
+; 29752
+
+UnknownText_0x29752: ; 0x29752
+ ; bids farewell to
+ text_jump UnknownText_0x1bc703
+ db "@"
+; 0x29757
+
+UnknownText_0x29757: ; 0x29757
+ ; .
+ text_jump UnknownText_0x1bc719
+ db "@"
+; 0x2975c
+
+Function2975c: ; 2975c
+ call WaitTop
+ hlcoord 0, 10
+ ld bc, 8 * SCREEN_WIDTH
+ ld a, " "
+ call ByteFill
+ call WaitBGMap
+ ld hl, UnknownText_0x2977a
+ call PrintText
+ call Function297c9
+ call Function29114
+ ret
+; 2977a
+
+UnknownText_0x2977a: ; 0x2977a
+ ; Take good care of @ .
+ text_jump UnknownText_0x1bc71f
+ db "@"
+; 0x2977f
+
+Function2977f: ; 2977f
+ ld hl, UnknownText_0x2979a
+ call PrintText
+ call Function297c9
+ ld hl, UnknownText_0x2979f
+ call PrintText
+ call Function297c9
+ ld c, $e
+ call DelayFrames
+ call Function29114
+ ret
+; 2979a
+
+UnknownText_0x2979a: ; 0x2979a
+ ; For @ 's @ ,
+ text_jump UnknownText_0x1bc739
+ db "@"
+; 0x2979f
+
+UnknownText_0x2979f: ; 0x2979f
+ ; sends @ .
+ text_jump UnknownText_0x1bc74c
+ db "@"
+; 0x297a4
+
+Function297a4: ; 297a4
+ ld hl, UnknownText_0x297bf
+ call PrintText
+ call Function297c9
+ ld hl, UnknownText_0x297c4
+ call PrintText
+ call Function297c9
+ ld c, $e
+ call DelayFrames
+ call Function29114
+ ret
+; 297bf
+
+UnknownText_0x297bf: ; 0x297bf
+ ; will trade @ @
+ text_jump UnknownText_0x1bc75e
+ db "@"
+; 0x297c4
+
+UnknownText_0x297c4: ; 0x297c4
+ ; for @ 's @ .
+ text_jump UnknownText_0x1bc774
+ db "@"
+; 0x297c9
+
+Function297c9: ; 297c9
+ ld c, $50
+ call DelayFrames
+ ret
+; 297cf
+
+Function297cf: ; 297cf
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, " "
+ call ByteFill
+ ret
+; 297db
+
+Function297db: ; 297db
+.asm_297db
+ push bc
+ push hl
+.asm_297dd
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .asm_297dd
+ pop hl
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .asm_297db
+ ret
+; 297ed
+
+Function297ed: ; 297ed
+ ld a, [hSGB]
+ and a
+ ld a, $e4
+ jr z, .asm_297f6
+ ld a, $f0
+
+.asm_297f6
+ call Functioncf8
+ ld a, $e4
+ call DmgToCgbBGPals
+ ret
+; 297ff
+
+Function297ff: ; 297ff
+ push de
+ ld de, wc736
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ pop hl
+ ld de, wc741
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ret
+; 29814
+
+Function29814: ; 29814
+ ld a, [hl]
+ ld [wc74c], a
+ ld a, [de]
+ ld [wc74d], a
+ ret
+; 2981d
+
+Function2981d: ; 2981d
+ ld a, [wcf65]
+ and $7
+ ret nz
+ ld a, [rBGP]
+ xor $3c
+ call DmgToCgbBGPals
+ ret
+; 2982b
+
+Function2982b: ; 2982b
+ call DelayFrame
+ ld de, TradeBallGFX
+ ld hl, VTiles0 tile $62
+ lb bc, BANK(TradeBallGFX), $6
+ call Request2bpp
+ ld de, TradePoofGFX
+ ld hl, VTiles0 tile $68
+ lb bc, BANK(TradePoofGFX), $c
+ call Request2bpp
+ ld de, TradeCableGFX
+ ld hl, VTiles0 tile $74
+ lb bc, BANK(TradeCableGFX), $4
+ call Request2bpp
+ xor a
+ ld hl, wc300
+ ld [hli], a
+ ld [hl], $62
+ ret
+; 2985a
+
+Function2985a: ; 2985a
+ call DelayFrame
+ ld e, $3
+ callab Function8e83f
+ ld de, TradeBubbleGFX
+ ld hl, VTiles0 tile $72
+ lb bc, BANK(TradeBubbleGFX), $4
+ call Request2bpp
+ xor a
+ ld hl, wc300
+ ld [hli], a
+ ld [hl], $62
+ ret
+; 29879
+
+Function29879: ; 29879
+ ld hl, wcf64
+ ld a, [hl]
+ and a
+ jr z, .asm_29882
+ dec [hl]
+ ret
+
+.asm_29882
+ call Function29114
+ ret
+; 29886
+
+Function29886: ; 29886
+ ld hl, wcf64
+ ld a, [hl]
+ and a
+ jr z, .asm_2988f
+ dec [hl]
+ ret
+
+.asm_2988f
+ call Function29114
+ ret
+; 29893
+
+
+Function29893: ; 29893
+; This function is unreferenced.
+; It was meant for use in Japanese versions, so the
+; constant used for copy length was changed by accident.
+
+ ld hl, Unknown_298b5
+
+ ld a, [hli]
+ ld [wc6d0], a
+ ld de, wc6e7
+ ld c, 13 ; jp: 8
+.asm_2989f
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .asm_2989f
+
+ ld a, [hli]
+ ld [wc702], a
+ ld de, wc719
+ ld c, 13 ; jp: 8
+.asm_298ae
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .asm_298ae
+ ret
+; 298b5
+
+Unknown_298b5: ; 298b5
+ db $03, "ゲーフり@@", $23, $01 ; GAME FREAK
+ db $06, "クりーチャ@", $56, $04 ; Creatures Inc.
+; 298c7
+
+
+TradeGameBoyTilemap: ; 298c7
+; 6x8
+ db $31, $32, $32, $32, $32, $33
+ db $34, $35, $36, $36, $37, $38
+ db $34, $39, $3a, $3a, $3b, $38
+ db $3c, $3d, $3e, $3e, $3f, $40
+ db $41, $42, $43, $43, $44, $45
+ db $46, $47, $43, $48, $49, $4a
+ db $41, $43, $4b, $4c, $4d, $4e
+ db $4f, $50, $50, $50, $51, $52
+; 297f7
+
+Tilemap_298f7: ; 297f7
+; 12x3
+ db $43, $55, $56, $53, $53, $53, $53, $53, $53, $53, $53, $53
+ db $43, $57, $58, $54, $54, $54, $54, $54, $54, $54, $54, $54
+ db $43, $59, $5a, $43, $43, $43, $43, $43, $43, $43, $43, $43
+; 2991b
+
+TradeArrowGFX: INCBIN "gfx/trade/arrow.2bpp"
+TradeCableGFX: INCBIN "gfx/trade/cable.2bpp"
+TradeBubbleGFX: INCBIN "gfx/trade/bubble.2bpp"
+TradeGameBoyLZ: INCBIN "gfx/trade/game_boy.2bpp.lz"
+TradeBallGFX: INCBIN "gfx/trade/ball.2bpp"
+TradePoofGFX: INCBIN "gfx/trade/poof.2bpp"
+
+Special_CheckTimeCapsuleCompatibility: ; 29bfb
+; Checks to see if your Party is compatible with the generation 1 games. Returns the following in ScriptVar:
+; 0: Party is okay
+; 1: At least one Pokemon was introduced in GS
+; 2: At least one Pokemon has a move that was introduced in GS
+; 3: At least one Pokemon is holding mail
+
+; If any party Pokemon was introduced in the generation 2 games, don't let it in.
+ ld hl, PartySpecies
+ ld b, PARTY_LENGTH ; 6
+.loop
+ ld a, [hli]
+ cp $ff
+ jr z, .checkitem
+ cp CHIKORITA ; MEW + 1 ; 151 + 1
+ jr nc, .mon_too_new
+ dec b
+ jr nz, .loop
+
+; If any party Pokemon is holding mail, don't let it in.
+.checkitem
+ ld a, [PartyCount]
+ ld b, a
+ ld hl, PartyMon1Item
+.itemloop
+ push hl
+ push bc
+ ld d, [hl]
+ callba ItemIsMail
+ pop bc
+ pop hl
+ jr c, .mon_has_mail
+ ld de, PARTYMON_STRUCT_LENGTH
+ add hl, de
+ dec b
+ jr nz, .itemloop
+
+; If any party Pokemon has a move that was introduced in the generation 2 games, don't let it in.
+ ld hl, PartyMon1Moves
+ ld a, [PartyCount]
+ ld b, a
+.move_loop
+ ld c, NUM_MOVES
+.move_next
+ ld a, [hli]
+ cp STRUGGLE + 1
+ jr nc, .move_too_new
+ dec c
+ jr nz, .move_next
+ ld de, PartyMon2 - (PartyMon1 + NUM_MOVES)
+ add hl, de
+ dec b
+ jr nz, .move_loop
+ xor a
+ jr .done
+
+.mon_too_new
+ ld [wd265], a
+ call GetPokemonName
+ ld a, $1
+ jr .done
+
+.move_too_new
+ push bc
+ ld [wd265], a
+ call GetMoveName
+ call CopyName1
+ pop bc
+ call Function29c67
+ ld a, $2
+ jr .done
+
+.mon_has_mail
+ call Function29c67
+ ld a, $3
+
+.done
+ ld [ScriptVar], a
+ ret
+; 29c67
+
+Function29c67: ; 29c67
+ ld a, [PartyCount]
+ sub b
+ ld c, a
+ inc c
+ ld b, $0
+ ld hl, PartyCount
+ add hl, bc
+ ld a, [hl]
+ ld [wd265], a
+ call GetPokemonName
+ ret
+; 29c7b
+
+Special_EnterTimeCapsule: ; 29c7b
+ ld c, $a
+ call DelayFrames
+ ld a, $4
+ call Function29f17
+ ld c, $28
+ call DelayFrames
+ xor a
+ ld [hVBlank], a
+ inc a
+ ld [wLinkMode], a
+ ret
+; 29c92
+
+Special_AbortLink: ; 29c92
+ ld c, $3
+ call DelayFrames
+ ld a, -1
+ ld [hLinkPlayerNumber], a
+ xor a
+ ld [rSB], a
+ ld [hSerialReceive], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ ld c, $3
+ call DelayFrames
+ xor a
+ ld [rSB], a
+ ld [hSerialReceive], a
+ ld a, $0
+ ld [rSC], a
+ ld a, $80
+ ld [rSC], a
+ ld c, $3
+ call DelayFrames
+ xor a
+ ld [rSB], a
+ ld [hSerialReceive], a
+ ld [rSC], a
+ ld c, $3
+ call DelayFrames
+ ld a, -1
+ ld [hLinkPlayerNumber], a
+ ld a, [rIF]
+ push af
+ xor a
+ ld [rIF], a
+ ld a, $f
+ ld [rIE], a
+ pop af
+ ld [rIF], a
+ ld hl, wcf5b
+ xor a
+ ld [hli], a
+ ld [hl], a
+ ld [hVBlank], a
+ ld [wLinkMode], a
+ ret
+; 29ce8
+
+Special_SetBitsForLinkTradeRequest: ; 29ce8
+ ld a, $1
+ ld [wcf56], a
+ ld [wd265], a
+ ret
+; 29cf1
+
+Special_SetBitsForBattleRequest: ; 29cf1
+ ld a, $2
+ ld [wcf56], a
+ ld [wd265], a
+ ret
+; 29cfa
+
+Special_SetBitsForTimeCapsuleRequest: ; 29cfa
+ ld a, $2
+ ld [rSB], a
+ xor a
+ ld [hSerialReceive], a
+ ld a, $0
+ ld [rSC], a
+ ld a, $80
+ ld [rSC], a
+ xor a
+ ld [wcf56], a
+ ld [wd265], a
+ ret
+; 29d11
+
+Special_WaitForLinkedFriend: ; 29d11
+ ld a, [wcf56]
+ and a
+ jr z, .asm_29d2f
+ ld a, $2
+ ld [rSB], a
+ xor a
+ ld [hSerialReceive], a
+ ld a, $0
+ ld [rSC], a
+ ld a, $80
+ ld [rSC], a
+ call DelayFrame
+ call DelayFrame
+ call DelayFrame
+
+.asm_29d2f
+ ld a, $2
+ ld [wcf5c], a
+ ld a, $ff
+ ld [wcf5b], a
+.asm_29d39
+ ld a, [hLinkPlayerNumber]
+ cp $2
+ jr z, .asm_29d79
+ cp $1
+ jr z, .asm_29d79
+ ld a, -1
+ ld [hLinkPlayerNumber], a
+ ld a, $2
+ ld [rSB], a
+ xor a
+ ld [hSerialReceive], a
+ ld a, $0
+ ld [rSC], a
+ ld a, $80
+ ld [rSC], a
+ ld a, [wcf5b]
+ dec a
+ ld [wcf5b], a
+ jr nz, .asm_29d68
+ ld a, [wcf5c]
+ dec a
+ ld [wcf5c], a
+ jr z, .asm_29d8d
+
+.asm_29d68
+ ld a, $1
+ ld [rSB], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ call DelayFrame
+ jr .asm_29d39
+
+.asm_29d79
+ call Function908
+ call DelayFrame
+ call Function908
+ ld c, $32
+ call DelayFrames
+ ld a, $1
+ ld [ScriptVar], a
+ ret
+
+.asm_29d8d
+ xor a
+ ld [ScriptVar], a
+ ret
+; 29d92
+
+Special_CheckLinkTimeout: ; 29d92
+ ld a, $1
+ ld [wcf56], a
+ ld hl, wcf5b
+ ld a, $3
+ ld [hli], a
+ xor a
+ ld [hl], a
+ call WaitBGMap
+ ld a, $2
+ ld [hVBlank], a
+ call DelayFrame
+ call DelayFrame
+ call Function29e0c
+ xor a
+ ld [hVBlank], a
+ ld a, [ScriptVar]
+ and a
+ ret nz
+ jp Function29f04
+; 29dba
+
+Function29dba: ; 29dba
+ ld a, $5
+ ld [wcf56], a
+ ld hl, wcf5b
+ ld a, $3
+ ld [hli], a
+ xor a
+ ld [hl], a
+ call WaitBGMap
+ ld a, $2
+ ld [hVBlank], a
+ call DelayFrame
+ call DelayFrame
+ call Function29e0c
+ ld a, [ScriptVar]
+ and a
+ jr z, .asm_29e08
+ ld bc, rIE
+.asm_29de0
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_29de0
+ ld a, [wcf51]
+ cp $5
+ jr nz, .asm_29e03
+ ld a, $6
+ ld [wcf56], a
+ ld hl, wcf5b
+ ld a, $1
+ ld [hli], a
+ ld [hl], $32
+ call Function29e0c
+ ld a, [wcf51]
+ cp $6
+ jr z, .asm_29e08
+
+.asm_29e03
+ xor a
+ ld [ScriptVar], a
+ ret
+
+.asm_29e08
+ xor a
+ ld [hVBlank], a
+ ret
+; 29e0c
+
+Function29e0c: ; 29e0c
+ xor a
+ ld [hFFCA], a
+ ld a, [wcf5b]
+ ld h, a
+ ld a, [wcf5c]
+ ld l, a
+ push hl
+ call Function29e3b
+ pop hl
+ jr nz, .asm_29e2f
+ call Function29e47
+ call Function29e53
+ call Function29e3b
+ jr nz, .asm_29e2f
+ call Function29e47
+ xor a
+ jr .asm_29e31
+
+.asm_29e2f
+ ld a, $1
+
+.asm_29e31
+ ld [ScriptVar], a
+ ld hl, wcf5b
+ xor a
+ ld [hli], a
+ ld [hl], a
+ ret
+; 29e3b
+
+Function29e3b: ; 29e3b
+ call Function87d
+ ld hl, wcf5b
+ ld a, [hli]
+ inc a
+ ret nz
+ ld a, [hl]
+ inc a
+ ret
+; 29e47
+
+Function29e47: ; 29e47
+ ld b, $a
+.asm_29e49
+ call DelayFrame
+ call Function908
+ dec b
+ jr nz, .asm_29e49
+ ret
+; 29e53
+
+Function29e53: ; 29e53
+ dec h
+ srl h
+ rr l
+ srl h
+ rr l
+ inc h
+ ld a, h
+ ld [wcf5b], a
+ ld a, l
+ ld [wcf5c], a
+ ret
+; 29e66
+
+Special_TryQuickSave: ; 29e66
+ ld a, [wd265]
+ push af
+ callba Function14ab2
+ ld a, $1
+ jr nc, .asm_29e75
+ xor a
+
+.asm_29e75
+ ld [ScriptVar], a
+ ld c, $1e
+ call DelayFrames
+ pop af
+ ld [wd265], a
+ ret
+; 29e82
+
+Special_CheckBothSelectedSameRoom: ; 29e82
+ ld a, [wd265]
+ call Function29f17
+ push af
+ call Function908
+ call DelayFrame
+ call Function908
+ pop af
+ ld b, a
+ ld a, [wd265]
+ cp b
+ jr nz, .asm_29eaa
+ ld a, [wd265]
+ inc a
+ ld [wLinkMode], a
+ xor a
+ ld [hVBlank], a
+ ld a, $1
+ ld [ScriptVar], a
+ ret
+
+.asm_29eaa
+ xor a
+ ld [ScriptVar], a
+ ret
+; 29eaf
+
+Special_TimeCapsule: ; 29eaf
+ ld a, LINK_TIMECAPSULE
+ ld [wLinkMode], a
+ call DisableSpriteUpdates
+ callab LinkCommunications
+ call EnableSpriteUpdates
+ xor a
+ ld [hVBlank], a
+ ret
+; 29ec4
+
+Special_TradeCenter: ; 29ec4
+ ld a, LINK_TRADECENTER
+ ld [wLinkMode], a
+ call DisableSpriteUpdates
+ callab LinkCommunications
+ call EnableSpriteUpdates
+ xor a
+ ld [hVBlank], a
+ ret
+; 29ed9
+
+Special_Colosseum: ; 29ed9
+ ld a, LINK_COLOSSEUM
+ ld [wLinkMode], a
+ call DisableSpriteUpdates
+ callab LinkCommunications
+ call EnableSpriteUpdates
+ xor a
+ ld [hVBlank], a
+ ret
+; 29eee
+
+Special_CloseLink: ; 29eee
+ xor a
+ ld [wLinkMode], a
+ ld c, $3
+ call DelayFrames
+ jp Function29f04
+; 29efa
+
+Special_FailedLinkToPast: ; 29efa
+ ld c, $28
+ call DelayFrames
+ ld a, $e
+ jp Function29f17
+; 29f04
+
+Function29f04: ; 29f04
+ ld c, $3
+ call DelayFrames
+ ld a, -1
+ ld [hLinkPlayerNumber], a
+ ld a, $2
+ ld [rSB], a
+ xor a
+ ld [hSerialReceive], a
+ ld [rSC], a
+ ret
+; 29f17
+
+Function29f17: ; 29f17
+ add $d0
+ ld [wcf56], a
+ ld [wcf57], a
+ ld a, $2
+ ld [hVBlank], a
+ call DelayFrame
+ call DelayFrame
+.asm_29f29
+ call Function83b
+ ld a, [wcf51]
+ ld b, a
+ and $f0
+ cp $d0
+ jr z, .asm_29f40
+ ld a, [wcf52]
+ ld b, a
+ and $f0
+ cp $d0
+ jr nz, .asm_29f29
+
+.asm_29f40
+ xor a
+ ld [hVBlank], a
+ ld a, b
+ and $f
+ ret
+; 29f47
+
+Special_CableClubCheckWhichChris: ; 29f47
+ ld a, [hLinkPlayerNumber]
+ cp $1
+ ld a, $1
+ jr z, .yes
+ dec a
+
+.yes
+ ld [ScriptVar], a
+ ret
+; 29f54
+
+GFX_29f54: ; 29f54
+INCBIN "gfx/unknown/029f54.2bpp"
+; 29fe4
diff --git a/engine/map_objects.asm b/engine/map_objects.asm
index a5d792204..4c2adc9aa 100644
--- a/engine/map_objects.asm
+++ b/engine/map_objects.asm
@@ -1,20 +1,20 @@
INCLUDE "engine/facings.asm"
-ObjectStruct3_Data:: ; 4273
+SpriteMovementData:: ; 4273
; function, facing, ?, ?, ?, ?
db SPRITEMOVEFN_00, DOWN, $01, $02, $00, $00 ; 00
- db SPRITEMOVEFN_06, DOWN, $01, $0c, $00, $00 ; 01
- db SPRITEMOVEFN_03, DOWN, $01, $00, $00, $00 ; 02
- db SPRITEMOVEFN_04, DOWN, $01, $00, $00, $00 ; 03
- db SPRITEMOVEFN_01, DOWN, $01, $00, $00, $00 ; 04
- db SPRITEMOVEFN_02, DOWN, $01, $00, $00, $00 ; 05
- db SPRITEMOVEFN_06, DOWN, $01, $00, $00, $00 ; 06
- db SPRITEMOVEFN_06, UP, $01, $00, $00, $00 ; 07
- db SPRITEMOVEFN_06, LEFT, $01, $00, $00, $00 ; 08
- db SPRITEMOVEFN_06, RIGHT, $01, $00, $00, $00 ; 09
- db SPRITEMOVEFN_05, DOWN, $01, $00, $00, $00 ; 0a
- db SPRITEMOVEFN_07, DOWN, $01, $02, $00, $00 ; 0b
+ db SPRITEMOVEFN_STANDING, DOWN, $01, $0c, $00, $00 ; 01
+ db SPRITEMOVEFN_RANDOM_WALK_XY, DOWN, $01, $00, $00, $00 ; 02
+ db SPRITEMOVEFN_SLOW_RANDOM_SPIN, DOWN, $01, $00, $00, $00 ; 03
+ db SPRITEMOVEFN_RANDOM_WALK_Y, DOWN, $01, $00, $00, $00 ; 04
+ db SPRITEMOVEFN_RANDOM_WALK_X, DOWN, $01, $00, $00, $00 ; 05
+ db SPRITEMOVEFN_STANDING, DOWN, $01, $00, $00, $00 ; 06
+ db SPRITEMOVEFN_STANDING, UP, $01, $00, $00, $00 ; 07
+ db SPRITEMOVEFN_STANDING, LEFT, $01, $00, $00, $00 ; 08
+ db SPRITEMOVEFN_STANDING, RIGHT, $01, $00, $00, $00 ; 09
+ db SPRITEMOVEFN_FAST_RANDOM_SPIN, DOWN, $01, $00, $00, $00 ; 0a
+ db SPRITEMOVEFN_OBEY_DPAD, DOWN, $01, $02, $00, $00 ; 0b
db SPRITEMOVEFN_08, DOWN, $01, $00, $00, $00 ; 0c
db SPRITEMOVEFN_09, DOWN, $01, $00, $00, $00 ; 0d
db SPRITEMOVEFN_0A, DOWN, $01, $00, $00, $00 ; 0e
@@ -22,24 +22,24 @@ ObjectStruct3_Data:: ; 4273
db SPRITEMOVEFN_0C, DOWN, $01, $00, $00, $00 ; 10
db SPRITEMOVEFN_0D, DOWN, $01, $00, $00, $00 ; 11
db SPRITEMOVEFN_0E, DOWN, $01, $00, $00, $00 ; 12
- db SPRITEMOVEFN_0F, DOWN, $01, $02, $00, $00 ; 13
- db SPRITEMOVEFN_10, DOWN, $01, $02, $00, $00 ; 14
- db SPRITEMOVEFN_15, DOWN, $09, $2e, $01, $c0 ; 15
- db SPRITEMOVEFN_16, DOWN, $0a, $2e, $00, $00 ; 16
- db SPRITEMOVEFN_06, DOWN, $01, $0c, $00, $00 ; 17
- db SPRITEMOVEFN_06, DOWN, $01, $2e, $10, $00 ; 18
- db SPRITEMOVEFN_11, DOWN, $01, $2e, $00, $40 ; 19
- db SPRITEMOVEFN_12, DOWN, $01, $02, $00, $00 ; 1a
+ db SPRITEMOVEFN_FOLLOW, DOWN, $01, $02, $00, $00 ; 13
+ db SPRITEMOVEFN_SCRIPTED, DOWN, $01, $02, $00, $00 ; 14
+ db SPRITEMOVEFN_BIG_SNORLAX, DOWN, $09, $2e, $01, $c0 ; 15
+ db SPRITEMOVEFN_BOUNCE, DOWN, $0a, $2e, $00, $00 ; 16
+ db SPRITEMOVEFN_STANDING, DOWN, $01, $0c, $00, $00 ; 17
+ db SPRITEMOVEFN_STANDING, DOWN, $01, $2e, $10, $00 ; 18
+ db SPRITEMOVEFN_STRENGTH, DOWN, $01, $2e, $00, $40 ; 19
+ db SPRITEMOVEFN_FOLLOWNOTEXACT, DOWN, $01, $02, $00, $00 ; 1a
db SPRITEMOVEFN_13, DOWN, $00, $8e, $01, $00 ; 1b
db SPRITEMOVEFN_14, DOWN, $08, $8e, $02, $00 ; 1c
db SPRITEMOVEFN_17, DOWN, $00, $82, $00, $00 ; 1d
- db SPRITEMOVEFN_19, LEFT, $01, $00, $00, $00 ; 1e
- db SPRITEMOVEFN_18, RIGHT, $01, $00, $00, $00 ; 1f
- db SPRITEMOVEFN_11, DOWN, $0c, $2e, $01, $c0 ; 20
- db SPRITEMOVEFN_11, DOWN, $0d, $2e, $01, $c0 ; 21
+ db SPRITEMOVEFN_SPIN_COUNTERCLOCKWISE, LEFT, $01, $00, $00, $00 ; 1e
+ db SPRITEMOVEFN_SPIN_CLOCKWISE, RIGHT, $01, $00, $00, $00 ; 1f
+ db SPRITEMOVEFN_STRENGTH, DOWN, $0c, $2e, $01, $c0 ; 20
+ db SPRITEMOVEFN_STRENGTH, DOWN, $0d, $2e, $01, $c0 ; 21
db SPRITEMOVEFN_1A, DOWN, $0e, $8e, $01, $00 ; 22
db SPRITEMOVEFN_1B, DOWN, $0f, $8e, $02, $00 ; 23
- db SPRITEMOVEFN_03, DOWN, $01, $00, $00, $20 ; 24
+ db SPRITEMOVEFN_RANDOM_WALK_XY, DOWN, $01, $00, $00, $20 ; 24
db SPRITEMOVEFN_00, DOWN, $01, $00, $00, $00 ; 25
; 4357
@@ -655,7 +655,7 @@ Function467b: ; 467b
ld hl, OBJECT_12
add hl, bc
ld [hl], a
- ld hl, OBJECT_27
+ ld hl, OBJECT_MOVEMENT_BYTE_INDEX
add hl, bc
rept 3
ld [hli], a
@@ -848,28 +848,28 @@ RestoreDefaultMovement: ; 4769
; 4780
ClearObjectStructField27: ; 4780
- ld hl, OBJECT_27
+ ld hl, OBJECT_MOVEMENT_BYTE_INDEX
add hl, bc
ld [hl], 0
ret
; 4787
IncrementObjectStructField27: ; 4787
- ld hl, OBJECT_27
+ ld hl, OBJECT_MOVEMENT_BYTE_INDEX
add hl, bc
inc [hl]
ret
; 478d
DecrementObjectStructField27: ; 478d
- ld hl, OBJECT_27
+ ld hl, OBJECT_MOVEMENT_BYTE_INDEX
add hl, bc
dec [hl]
ret
; 4793
JumptoObjectStructField27: ; 4793
- ld hl, OBJECT_27
+ ld hl, OBJECT_MOVEMENT_BYTE_INDEX
add hl, bc
ld a, [hl]
pop hl
@@ -937,7 +937,7 @@ Function47bc: ; 47bc
Function47dd: ; 47dd
call ClearObjectStructField28
- call Function1a2f
+ call GetSpriteMovementFunction
ld a, [hl]
ld hl, .Pointers
rst JumpTable
@@ -945,63 +945,63 @@ Function47dd: ; 47dd
; 47e9
.Pointers ; 47e9
- dw Function4821 ; 00
- dw Function4822 ; 01
- dw Function482c ; 02
- dw Function4838 ; 03
- dw Function4842 ; 04
- dw Function4851 ; 05
- dw Function4869 ; 06
- dw Function487c ; 07
- dw Function4882 ; 08
- dw Function4888 ; 09
- dw Function488e ; 0a
- dw Function4891 ; 0b
- dw Function4894 ; 0c
- dw Function4897 ; 0d
- dw Function489d ; 0e
- dw Function48a0 ; 0f
- dw Function48a6 ; 10
- dw Function48ac ; 11
- dw Function48ff ; 12
- dw Function49e5 ; 13
- dw Function4a21 ; 14
- dw Function4958 ; 15
- dw Function496e ; 16
- dw Function4abc ; 17
- dw Function498d ; 18
- dw Function4984 ; 19
- dw Function4a46 ; 1a
- dw Function4a89 ; 1b
+ dw .Null_00 ; 00
+ dw .RandomWalkY ; 01
+ dw .RandomWalkX ; 02
+ dw .RandomWalkXY ; 03
+ dw .RandomSpin1 ; 04
+ dw .RandomSpin2 ; 05
+ dw .Standing ; 06
+ dw .ObeyDPad ; 07
+ dw .Movement08 ; 08
+ dw .Movement09 ; 09
+ dw .Movement0a ; 0a
+ dw .Movement0b ; 0b
+ dw .Movement0c ; 0c
+ dw .Movement0d ; 0d
+ dw .Movement0e ; 0e
+ dw .Follow ; 0f
+ dw .Script ; 10
+ dw .Strength ; 11
+ dw .FollowNotExact ; 12
+ dw .Movement13 ; 13
+ dw .Movement14 ; 14
+ dw .MovementBigStanding ; 15
+ dw .MovementBouncing ; 16
+ dw .Movement17 ; 17
+ dw .MovementSpinClockwise ; 18
+ dw .MovementSpinCounterclockwise ; 19
+ dw .Movement1a ; 1a
+ dw .Movement1b ; 1b
; 4821
-Function4821: ; 4821
+.Null_00: ; 4821
ret
; 4822
-Function4822: ; 4822
+.RandomWalkY: ; 4822
call Random
ld a, [hRandomAdd]
and %00000001
- jp Function4af0
+ jp .RandomWalkContinue
; 482c
-Function482c: ; 482c
+.RandomWalkX: ; 482c
call Random
ld a, [hRandomAdd]
and %00000001
or %00000010
- jp Function4af0
+ jp .RandomWalkContinue
; 4838
-Function4838: ; 4838
+.RandomWalkXY: ; 4838
call Random
ld a, [hRandomAdd]
and %00000011
- jp Function4af0
+ jp .RandomWalkContinue
; 4842
-Function4842: ; 4842
+.RandomSpin1: ; 4842
call Random
ld a, [hRandomAdd]
and %00001100
@@ -1011,7 +1011,7 @@ Function4842: ; 4842
jp Function4b1d
; 4851
-Function4851: ; 4851
+.RandomSpin2: ; 4851
ld hl, OBJECT_FACING
add hl, bc
ld a, [hl]
@@ -1029,7 +1029,7 @@ Function4851: ; 4851
jp Function4b26
; 4869
-Function4869: ; standing?
+.Standing: ; 4869
call Function462a
call Function467b
ld hl, OBJECT_11
@@ -1041,69 +1041,71 @@ Function4869: ; standing?
ret
; 487c
-Function487c: ; 487c
+.ObeyDPad: ; 487c
ld hl, Function5000
- jp Function5041
+ jp HandleMovementData
; 4882
-Function4882: ; 4882
+.Movement08: ; 4882
ld hl, Function5015
- jp Function5041
+ jp HandleMovementData
; 4888
-Function4888: ; 4888
+.Movement09: ; 4888
ld hl, Function5026
- jp Function5041
+ jp HandleMovementData
; 488e
-Function488e: ; 488e
+.Movement0a: ; 488e
jp Function5037
; 4891
-Function4891: ; 4891
+.Movement0b: ; 4891
jp Function5037
; 4894
-Function4894: ; 4894
+.Movement0c: ; 4894
jp Function5037
; 4897
-Function4897: ; 4897
+.Movement0d: ; 4897
ld hl, Function5000
- jp Function5041
+ jp HandleMovementData
; 489d
-Function489d: ; 489d
+.Movement0e: ; 489d
jp Function5037
; 48a0
-Function48a0: ; 48a0
+.Follow: ; 48a0
ld hl, Function54e6
- jp Function5041
+ jp HandleMovementData
; 48a6
-Function48a6: ; 48a6
- ld hl, Function500e ; scripted
- jp Function5041
+.Script: ; 48a6
+ ld hl, Function500e
+ jp HandleMovementData
; 48ac
-Function48ac: ; 48ac
+.Strength: ; 48ac
call JumptoObjectStructField27
- dw Function48b3
- dw Function48f8
+ dw .Strength_Start
+ dw .Strength_Stop
; 48b3
-Function48b3: ; 48b3
+.Strength_Start: ; 48b3
ld hl, OBJECT_STANDING_TILE
add hl, bc
ld a, [hl]
call CheckPitTile
jr z, .on_pit
+
ld hl, OBJECT_FLAGS2
add hl, bc
bit 2, [hl]
res 2, [hl]
jr z, .ok
+
ld hl, OBJECT_32
add hl, bc
ld a, [hl]
@@ -1112,6 +1114,7 @@ Function48b3: ; 48b3
call Function4690
call Function6ec1
jr c, .ok2
+
ld de, SFX_STRENGTH
call PlaySFX
call Function5538
@@ -1135,23 +1138,26 @@ Function48b3: ; 48b3
; fallthrough
; 48f8
-Function48f8: ; 48f8
+.Strength_Stop: ; 48f8
ld hl, OBJECT_DIRECTION_WALKING
add hl, bc
ld [hl], STANDING
ret
; 48ff
-Function48ff: ; 48ff
+.FollowNotExact: ; 48ff
ld hl, OBJECT_MAP_X
add hl, bc
ld d, [hl]
+
ld hl, OBJECT_MAP_Y
add hl, bc
ld e, [hl]
+
ld hl, OBJECT_32
add hl, bc
ld a, [hl]
+
push bc
call GetObjectStruct
ld hl, OBJECT_DIRECTION_WALKING
@@ -1159,6 +1165,7 @@ Function48ff: ; 48ff
ld a, [hl]
cp STANDING
jr z, .standing
+
ld hl, OBJECT_NEXT_MAP_X
add hl, bc
ld a, [hl]
@@ -1206,7 +1213,7 @@ Function48ff: ; 48ff
ret
; 4958
-Function4958: ; 4958
+.MovementBigStanding: ; 4958
call Function467b
ld hl, OBJECT_DIRECTION_WALKING
add hl, bc
@@ -1220,7 +1227,7 @@ Function4958: ; 4958
ret
; 496e
-Function496e: ; 496e
+.MovementBouncing: ; 496e
call Function467b
ld hl, OBJECT_DIRECTION_WALKING
add hl, bc
@@ -1234,27 +1241,27 @@ Function496e: ; 496e
ret
; 4984
-Function4984: ; 4984
+.MovementSpinCounterclockwise: ; 4984
call JumptoObjectStructField27
- dw Function4996
- dw Function499c
- dw Function49b8
+ dw .MovementSpinInit
+ dw .MovementSpinRepeat
+ dw .MovementSpinTurnLeft
; 498d
-Function498d: ; 498d
+.MovementSpinClockwise: ; 498d
call JumptoObjectStructField27
- dw Function4996
- dw Function499c
- dw Function49c4
+ dw .MovementSpinInit
+ dw .MovementSpinRepeat
+ dw .MovementSpinTurnRight
; 4996
-Function4996: ; 4996
+.MovementSpinInit: ; 4996
call Function467b
call IncrementObjectStructField27
; fallthrough
; 499c
-Function499c: ; 499c
+.MovementSpinRepeat: ; 499c
ld hl, OBJECT_11
add hl, bc
ld [hl], 1
@@ -1272,27 +1279,27 @@ Function499c: ; 499c
ret
; 49b8
-Function49b8: ; 49b8
- ld de, .DirectionData_49c0
- call Function49d0
- jr Function4984
+.MovementSpinTurnLeft: ; 49b8
+ ld de, .DirectionData_Counterclockwise
+ call .MovementSpinNextFacing
+ jr .MovementSpinCounterclockwise
; 49c0
-.DirectionData_49c0 ; 49c0
+.DirectionData_Counterclockwise ; 49c0
db RIGHT << 2, LEFT << 2, DOWN << 2, UP << 2
; 49c4
-Function49c4: ; 49c4
- ld de, .DirectionData_49cc
- call Function49d0
- jr Function498d
+.MovementSpinTurnRight: ; 49c4
+ ld de, .DirectionData_Clockwise
+ call .MovementSpinNextFacing
+ jr .MovementSpinClockwise
; 49cc
-.DirectionData_49cc ; 49cc
+.DirectionData_Clockwise ; 49cc
db LEFT << 2, RIGHT << 2, UP << 2, DOWN << 2
; 49d0
-Function49d0: ; 49d0
+.MovementSpinNextFacing: ; 49d0
ld hl, OBJECT_FACING
add hl, bc
ld a, [hl]
@@ -1310,8 +1317,8 @@ Function49d0: ; 49d0
ret
; 49e5
-Function49e5: ; 49e5
- call Function4aa8
+.Movement13: ; 49e5
+ call ._Movement13_14_1a_1b
ld hl, OBJECT_11
add hl, bc
ld [hl], $7
@@ -1330,12 +1337,12 @@ Function49e5: ; 49e5
and 3
ld d, $e
cp DOWN
- jr z, .ok
+ jr z, .ok_13
cp UP
- jr z, .ok
+ jr z, .ok_13
ld d, $c
-.ok
+.ok_13
ld hl, OBJECT_SPRITE_Y_OFFSET
add hl, bc
ld [hl], d
@@ -1348,9 +1355,9 @@ Function49e5: ; 49e5
ret
; 4a21
-Function4a21: ; 4a21
+.Movement14: ; 4a21
call Function467b
- call Function4aa8
+ call ._Movement13_14_1a_1b
ld hl, OBJECT_11
add hl, bc
ld [hl], 8
@@ -1369,9 +1376,9 @@ Function4a21: ; 4a21
ret
; 4a46
-Function4a46: ; 4a46
+.Movement1a: ; 4a46
call Function467b
- call Function4aa8
+ call ._Movement13_14_1a_1b
ld hl, OBJECT_11
add hl, bc
ld [hl], $e
@@ -1416,9 +1423,9 @@ endr
db -6, 2
; 4a89
-Function4a89: ; 4a89
+.Movement1b: ; 4a89
call Function467b
- call Function4aa8
+ call ._Movement13_14_1a_1b
ld hl, OBJECT_11
add hl, bc
ld [hl], $f
@@ -1435,7 +1442,7 @@ Function4a89: ; 4a89
ret
; 4aa8
-Function4aa8: ; 4aa8
+._Movement13_14_1a_1b: ; 4aa8
ld hl, OBJECT_32
add hl, bc
ld a, [hl]
@@ -1452,7 +1459,7 @@ Function4aa8: ; 4aa8
ret
; 4abc
-Function4abc: ; 4abc
+.Movement17: ; 4abc
call Function467b
ld hl, OBJECT_11
add hl, bc
@@ -1460,7 +1467,7 @@ Function4abc: ; 4abc
ld hl, OBJECT_32
add hl, bc
ld a, [hl]
- call Function4ade
+ call ._Movement17
ld hl, OBJECT_STEP_DURATION
add hl, bc
ld [hl], e
@@ -1473,7 +1480,7 @@ Function4abc: ; 4abc
ret
; 4ade
-Function4ade: ; 4ade
+._Movement17: ; 4ade
ld d, a
and %00111111
ld e, a
@@ -1491,7 +1498,7 @@ Function4ade: ; 4ade
jr .loop
; 4af0
-Function4af0: ; 4af0
+.RandomWalkContinue: ; 4af0
call Function4690
call Function6ec1
jr c, Function4b17
@@ -1502,13 +1509,13 @@ Function4af0: ; 4af0
ld hl, wd4cf
ld a, [hMapObjectIndexBuffer]
cp [hl]
- jr z, .ok
+ jr z, .load_6
ld hl, OBJECT_09
add hl, bc
- ld [hl], $7
+ ld [hl], 7
ret
-.ok
+.load_6
ld hl, OBJECT_09
add hl, bc
ld [hl], 6
@@ -2397,11 +2404,14 @@ UpdateJumpPosition: ; 4fd5
; 5000
Function5000: ; unscripted?
+; copy [wc3de] to [wc2df]
ld a, [wc2de]
ld hl, wc2df
ld [hl], a
- ld a, $3e
+; load [wc2de] with movement_step_sleep_1
+ ld a, movement_step_sleep_1
ld [wc2de], a
+; recover the previous value of [wc2de]
ld a, [hl]
ret
; 500e
@@ -2413,7 +2423,7 @@ Function500e: ; scripted
; 5015
Function5015: ; 5015
- ld hl, OBJECT_27
+ ld hl, OBJECT_MOVEMENT_BYTE_INDEX
add hl, bc
ld e, [hl]
inc [hl]
@@ -2428,7 +2438,7 @@ Function5015: ; 5015
; 5026
Function5026: ; 5026
- ld hl, OBJECT_27
+ ld hl, OBJECT_MOVEMENT_BYTE_INDEX
add hl, bc
ld e, [hl]
inc [hl]
@@ -2443,16 +2453,16 @@ Function5026: ; 5026
; 5037
Function5037: ; 5037
- ld hl, Function503d
- jp Function5041
+ ld hl, GetMovementPerson
+ jp HandleMovementData
; 503d
-Function503d: ; 503d
+GetMovementPerson: ; 503d
ld a, [wMovementPerson]
ret
; 5041
-Function5041: ; 5041
+HandleMovementData: ; 5041
call CopyMovementPointer
.loop
xor a
@@ -2481,7 +2491,7 @@ GetMovementByte: ; 505e
jp [hl]
; 5065
-Function5065: ; 5065
+ContinueReadingMovement: ; 5065
ld a, 1
ld [wc2ea], a
ret
@@ -2560,7 +2570,8 @@ Function54e6: ; 54e6
.done
call Function550a
ret c
- ld a, $3e
+
+ ld a, movement_step_sleep_1
ret
; 550a
@@ -2582,7 +2593,7 @@ Function550a: ; 550a
.nope
ld a, $ff
ld [wObjectFollow_Follower], a
- ld a, $47
+ ld a, movement_step_end
scf
ret
; 5529
@@ -2693,6 +2704,7 @@ Function5582: ; 5582
Function55ac: ; 55ac
call FindFirstEmptyObjectStruct
ret nc
+
ld d, h
ld e, l
callba Function8286
@@ -2700,11 +2712,14 @@ Function55ac: ; 55ac
; 55b9
Function55b9: ; 55b9
+; load into wc2f0:
+; -1, -1, [de], [de + 1], [de + 2], [hMapObjectIndexBuffer], [MapX], [MapY], -1
ld hl, wc2f0
ld [hl], -1
inc hl
ld [hl], -1
inc hl
+
ld a, [de]
inc de
ld [hli], a
@@ -2713,8 +2728,10 @@ Function55b9: ; 55b9
ld [hli], a
ld a, [de]
ld [hli], a
+
ld a, [hMapObjectIndexBuffer]
ld [hli], a
+
push hl
ld hl, OBJECT_MAP_X
add hl, bc
@@ -2723,6 +2740,7 @@ Function55b9: ; 55b9
add hl, bc
ld e, [hl]
pop hl
+
ld [hl], d
inc hl
ld [hl], e
@@ -2783,17 +2801,21 @@ Function561d: ; 561d
Function5629: ; 5629
cp NUM_OBJECTS
ret nc
+
call GetMapObject
ld hl, MAPOBJECT_OBJECT_STRUCT_ID
add hl, bc
ld a, [hl]
cp -1
ret z
+
cp NUM_OBJECT_STRUCTS
ret nc
+
call GetObjectStruct
call GetObjectSprite
ret z
+
call Function5673
ret
; 5645
@@ -2923,7 +2945,7 @@ Function56cd: ; 56cd
srl a
srl a
srl a
- cp $14
+ cp SCREEN_WIDTH
jr c, .ok3
sub $20
@@ -2974,9 +2996,9 @@ Function56cd: ; 56cd
.ok7
ld a, d
- ld [$ffbf], a
+ ld [hFFBF], a
.loop
- ld a, [$ffbf]
+ ld a, [hFFBF]
ld d, a
ld a, [hUsedSpriteTile]
add e
@@ -2992,7 +3014,7 @@ Function56cd: ; 56cd
jr nc, .ok8
ld c, a
push bc
- call GetTileCoord
+ call Coord2Tile
pop bc
ld a, [hl]
cp $60
@@ -3163,7 +3185,7 @@ SetFollowerIfVisible: ; 582c
ret c
ld hl, OBJECT_MOVEMENTTYPE
add hl, bc
- ld [hl], SPRITEMOVEDATA_13
+ ld [hl], SPRITEMOVEDATA_FOLLOWING
ld hl, OBJECT_09
add hl, bc
ld [hl], 0
@@ -3177,7 +3199,7 @@ ResetFollower: ; 5847
cp -1
ret z
call GetObjectStruct
- callba Function58e3
+ callba Function58e3 ; no need to bankswitch
ld a, -1
ld [wObjectFollow_Follower], a
ret
@@ -3291,16 +3313,19 @@ Function58e3: ; 58e3
add hl, bc
ld a, [hl]
cp -1
- jp z, Function5903
+ jp z, Function5903 ; a jr would have been appropriate here
+
push bc
call GetMapObject
ld hl, MAPOBJECT_MOVEMENT
add hl, bc
ld a, [hl]
pop bc
+
ld hl, OBJECT_MOVEMENTTYPE
add hl, bc
ld [hl], a
+
ld hl, OBJECT_09
add hl, bc
ld [hl], 0
@@ -3319,6 +3344,7 @@ Function5903: ; 5903
ld hl, OBJECT_MOVEMENTTYPE
add hl, bc
ld [hl], a
+
ld hl, OBJECT_09
add hl, bc
ld [hl], 0
@@ -3492,7 +3518,7 @@ Function59f3: ; 59f3
.next
ld a, [hli]
ld d, a
- and %11110000
+ and $f0
ret z
cp c
jr nz, .next
@@ -3500,20 +3526,20 @@ Function59f3: ; 59f3
push bc
push hl
ld a, d
- and %00001111
- call Function5ac2
- call Function5a0d
+ and $f
+ call .GetObjectStructPointer
+ call .asm_5a0d
pop hl
pop bc
jr .next
; 5a0d
-Function5a0d: ; 5a0d
+.asm_5a0d: ; 5a0d
ld hl, OBJECT_SPRITE_TILE
add hl, bc
ld a, [hl]
and %01111111
- ld [$ffc1], a
+ ld [hFFC1], a
xor a
bit 7, [hl]
@@ -3547,7 +3573,7 @@ Function5a0d: ; 5a0d
jr z, .skip4
or %10000000
.skip4
- ld [$ffc2], a
+ ld [hFFC2], a
ld hl, OBJECT_SPRITE_X
add hl, bc
@@ -3562,7 +3588,7 @@ Function5a0d: ; 5a0d
ld e, a
ld a, [wd14c]
add e
- ld [$ffbf], a
+ ld [hFFBF], a
ld hl, OBJECT_SPRITE_Y
add hl, bc
@@ -3577,7 +3603,7 @@ Function5a0d: ; 5a0d
ld e, a
ld a, [wd14d]
add e
- ld [$ffc0], a
+ ld [hFFC0], a
ld hl, OBJECT_FACING_STEP
add hl, bc
@@ -3606,14 +3632,14 @@ Function5a0d: ; 5a0d
jr nc, .full
.addsprite
- ld a, [$ffc0]
+ ld a, [hFFC0]
add [hl]
inc hl
ld [bc], a
inc c
- ld a, [$ffbf]
+ ld a, [hFFBF]
add [hl]
inc hl
@@ -3623,7 +3649,7 @@ Function5a0d: ; 5a0d
ld e, [hl]
inc hl
- ld a, [$ffc1]
+ ld a, [hFFC1]
bit 2, e
jr z, .nope1
xor a
@@ -3637,7 +3663,7 @@ Function5a0d: ; 5a0d
ld a, e
bit 1, a
jr z, .nope2
- ld a, [$ffc2]
+ ld a, [hFFC2]
or e
.nope2
and %11110000
@@ -3662,7 +3688,7 @@ Function5a0d: ; 5a0d
ret
; 5ac2
-Function5ac2: ; 5ac2
+.GetObjectStructPointer: ; 5ac2
ld c, a
ld b, 0
ld hl, .Addresses
diff --git a/engine/map_setup.asm b/engine/map_setup.asm
index 0e391b31c..9c99df2f6 100644
--- a/engine/map_setup.asm
+++ b/engine/map_setup.asm
@@ -17,28 +17,28 @@ endr
; 15377
MapSetupScripts: ; 15377
- dw MapSetupScript1
- dw MapSetupScript2
- dw MapSetupScript3
- dw MapSetupScript4
- dw MapSetupScript5
- dw MapSetupScript6
- dw MapSetupScript7
- dw MapSetupScript8
- dw MapSetupScript9
- dw MapSetupScript10
- dw MapSetupScript11
- dw MapSetupScript12
+ dw MapSetupScript_Warp
+ dw MapSetupScript_Continue
+ dw MapSetupScript_ReloadMap
+ dw MapSetupScript_Teleport
+ dw MapSetupScript_Door
+ dw MapSetupScript_Fall
+ dw MapSetupScript_Connection
+ dw MapSetupScript_LinkReturn
+ dw MapSetupScript_Train
+ dw MapSetupScript_Submenu
+ dw MapSetupScript_BadWarp
+ dw MapSetupScript_Fly
; 1538f
-MapSetupScript4: ; 1538f
+MapSetupScript_Teleport: ; 1538f
db map_prolong_sprites
-MapSetupScript12: ; 15390
+MapSetupScript_Fly: ; 15390
db map_fade_out_palettes
db map_keep_roam
-MapSetupScript1: ; 15392
+MapSetupScript_Warp: ; 15392
db map_lcd_off
db map_sound_off
db map_load_spawn
@@ -63,7 +63,7 @@ MapSetupScript1: ; 15392
db map_wildmons
db map_end_setup_script
-MapSetupScript11: ; 153a9
+MapSetupScript_BadWarp: ; 153a9
db map_load_spawn
db map_attributes
db map_change_callback
@@ -87,7 +87,7 @@ MapSetupScript11: ; 153a9
db map_wildmons
db map_end_setup_script
-MapSetupScript7: ; 153bf
+MapSetupScript_Connection: ; 153bf
db map_animations_off
db map_load_connection
db map_attributes
@@ -106,13 +106,13 @@ MapSetupScript7: ; 153bf
db map_animations_on
db map_end_setup_script
-MapSetupScript6: ; 153d0
+MapSetupScript_Fall: ; 153d0
db map_prolong_sprites
-MapSetupScript5: ; 153d1
+MapSetupScript_Door: ; 153d1
db map_fade_out_palettes
-MapSetupScript9: ; 153d2
+MapSetupScript_Train: ; 153d2
db map_load_warp
db map_attributes
db map_warp_face
@@ -135,7 +135,7 @@ MapSetupScript9: ; 153d2
db map_update_roam
db map_end_setup_script
-MapSetupScript3: ; 153e7
+MapSetupScript_ReloadMap: ; 153e7
db map_fade
db map_clear_bg_palettes
db map_lcd_off
@@ -153,7 +153,7 @@ MapSetupScript3: ; 153e7
db map_wildmons
db map_end_setup_script
-MapSetupScript8: ; 153f7
+MapSetupScript_LinkReturn: ; 153f7
db map_fade
db map_lcd_off
db map_sound_off
@@ -172,7 +172,7 @@ MapSetupScript8: ; 153f7
db map_text_scroll_off
db map_end_setup_script
-MapSetupScript2: ; 15408
+MapSetupScript_Continue: ; 15408
db map_lcd_off
db map_sound_off
db map_attributes_2
@@ -192,7 +192,7 @@ MapSetupScript2: ; 15408
db map_wildmons
db map_end_setup_script
-MapSetupScript10: ; 1541a
+MapSetupScript_Submenu: ; 1541a
db map_load_blocks
db map_connection_blocks
db map_end_setup_script
@@ -243,52 +243,52 @@ endr
; 15440
MapSetupCommands: ; 15440
- dbw BANK(EnableLCD), EnableLCD ; 00
- dbw BANK(DisableLCD), DisableLCD ; 01
- dbw BANK(SoundRestart), SoundRestart ; 02
- dbw BANK(PlayMapMusic), PlayMapMusic ; 03
- dbw BANK(RestartMapMusic), RestartMapMusic ; 04
- dbw BANK(FadeToMapMusic), FadeToMapMusic ; 05
- dbw BANK(FadeOutMapAndMusic), FadeOutMapAndMusic ; 06
- dbw BANK(EnterMapMusic), EnterMapMusic ; 07
- dbw BANK(ForceMapMusic), ForceMapMusic ; 08
- dbw BANK(CrankUpTheVolume), CrankUpTheVolume ; 09
- dbw BANK(LoadBlockData), LoadBlockData ; 0a
- dbw BANK(LoadNeighboringBlockData), LoadNeighboringBlockData ; 0b
- dbw BANK(SaveScreen), SaveScreen ; 0c
- dbw BANK(BufferScreen), BufferScreen ; 0d
- dbw BANK(LoadGraphics), LoadGraphics ; 0e
- dbw BANK(LoadTilesetHeader), LoadTilesetHeader ; 0f
- dbw BANK(LoadMapTimeOfDay), LoadMapTimeOfDay ; 10
- dbw BANK(LoadMapPalettes), LoadMapPalettes ; 11
- dbw BANK(LoadWildMonData), LoadWildMonData ; 12
- dbw BANK(RefreshMapSprites), RefreshMapSprites ; 13
- dbw BANK(RunCallback_05_03), RunCallback_05_03 ; 14
- dbw BANK(RunCallback_03), RunCallback_03 ; 15
- dbw BANK(LoadObjectsRunCallback_02), LoadObjectsRunCallback_02 ; 16
- dbw BANK(LoadSpawnPoint), LoadSpawnPoint ; 17
- dbw BANK(EnterMapConnection), EnterMapConnection ; 18
- dbw BANK(LoadWarpData), LoadWarpData ; 19
- dbw BANK(LoadMapAttributes), LoadMapAttributes ; 1a
- dbw BANK(LoadMapAttributes_IgnoreHidden), LoadMapAttributes_IgnoreHidden ; 1b
- dbw BANK(WhiteBGMap), WhiteBGMap ; 1c
- dbw BANK(FadeBlackBGMap), FadeBlackBGMap ; 1d
- dbw BANK(FadeInBGMap), FadeInBGMap ; 1e
- dbw BANK(GetCoordOfUpperLeftCorner), GetCoordOfUpperLeftCorner ; 1f
- dbw BANK(RestoreFacingAfterWarp), RestoreFacingAfterWarp ; 20
- dbw BANK(SpawnInFacingDown), SpawnInFacingDown ; 21
- dbw BANK(GetSpawnCoord), GetSpawnCoord ; 22
- dbw BANK(RefreshPlayerCoords), RefreshPlayerCoords ; 23
- dbw BANK(DelayClearingOldSprites), DelayClearingOldSprites ; 24
- dbw BANK(DelayLoadingNewSprites), DelayLoadingNewSprites ; 25
- dbw BANK(UpdateRoamMons), UpdateRoamMons ; 26
- dbw BANK(JumpRoamMons), JumpRoamMons ; 27
- dbw BANK(FadeOldMapMusic), FadeOldMapMusic ; 28
- dbw BANK(ActivateMapAnims), ActivateMapAnims ; 29
- dbw BANK(SuspendMapAnims), SuspendMapAnims ; 2a
- dbw BANK(RetainOldPalettes), RetainOldPalettes ; 2b
- dbw BANK(DontScrollText), DontScrollText ; 2c
- dbw BANK(ReturnFromMapSetupScript), ReturnFromMapSetupScript ; 2d
+ dba EnableLCD ; 00
+ dba DisableLCD ; 01
+ dba MapSetup_Sound_Off ; 02
+ dba PlayMapMusic ; 03
+ dba RestartMapMusic ; 04
+ dba FadeToMapMusic ; 05
+ dba FadeOutMapAndMusic ; 06
+ dba EnterMapMusic ; 07
+ dba ForceMapMusic ; 08
+ dba FadeInMusic ; 09
+ dba LoadBlockData ; 0a
+ dba LoadNeighboringBlockData ; 0b
+ dba SaveScreen ; 0c
+ dba BufferScreen ; 0d
+ dba LoadGraphics ; 0e
+ dba LoadTilesetHeader ; 0f
+ dba LoadMapTimeOfDay ; 10
+ dba LoadMapPalettes ; 11
+ dba LoadWildMonData ; 12
+ dba RefreshMapSprites ; 13
+ dba RunCallback_05_03 ; 14
+ dba RunCallback_03 ; 15
+ dba LoadObjectsRunCallback_02 ; 16
+ dba LoadSpawnPoint ; 17
+ dba EnterMapConnection ; 18
+ dba LoadWarpData ; 19
+ dba LoadMapAttributes ; 1a
+ dba LoadMapAttributes_SkipPeople ; 1b
+ dba ClearBGPalettes ; 1c
+ dba FadeOutPalettes ; 1d
+ dba FadeInPalettes ; 1e
+ dba GetCoordOfUpperLeftCorner ; 1f
+ dba RestoreFacingAfterWarp ; 20
+ dba SpawnInFacingDown ; 21
+ dba GetSpawnCoord ; 22
+ dba RefreshPlayerCoords ; 23
+ dba DelayClearingOldSprites ; 24
+ dba DelayLoadingNewSprites ; 25
+ dba UpdateRoamMons ; 26
+ dba JumpRoamMons ; 27
+ dba FadeOldMapMusic ; 28
+ dba ActivateMapAnims ; 29
+ dba SuspendMapAnims ; 2a
+ dba RetainOldPalettes ; 2b
+ dba DontScrollText ; 2c
+ dba ReturnFromMapSetupScript ; 2d
; 154ca
@@ -300,13 +300,13 @@ DontScrollText: ; 154ca
ActivateMapAnims: ; 154cf
ld a, $1
- ld [$ffde], a
+ ld [hMapAnims], a
ret
; 154d3
SuspendMapAnims: ; 154d3
xor a
- ld [$ffde], a
+ ld [hMapAnims], a
ret
; 154d7
@@ -318,7 +318,7 @@ LoadObjectsRunCallback_02: ; 154d7
ret
; 154ea (5:54ea)
-Function154ea: ; 154ea
+; unreferenced
ret
; 154eb
@@ -333,20 +333,21 @@ DelayLoadingNewSprites: ; 154f1
set 6, [hl]
ret
-Function154f7: ; 154f7
+CheckReplaceKrisSprite: ; 154f7
nop
- call Function1550c
+ call .CheckBiking
jr c, .ok
- call Function1554e
+ call .CheckSurfing
jr c, .ok
- call Function1551a
+ call .CheckSurfing2
jr c, .ok
ret
+
.ok
- call Special_ReplaceKrisSprite
+ call ReplaceKrisSprite
ret
-Function1550c: ; 1550c (5:550c)
+.CheckBiking: ; 1550c (5:550c)
and a
ld hl, BikeFlags
bit 1, [hl]
@@ -356,7 +357,7 @@ Function1550c: ; 1550c (5:550c)
scf
ret
-Function1551a: ; 1551a (5:551a)
+.CheckSurfing2: ; 1551a (5:551a)
ld a, [PlayerState]
cp PLAYER_NORMAL
jr z, .nope
@@ -367,11 +368,11 @@ Function1551a: ; 1551a (5:551a)
cp PLAYER_SURF_PIKA
jr z, .surfing
call GetMapPermission
- cp $3
+ cp INDOOR
jr z, .checkbiking
- cp $5
+ cp PERM_5
jr z, .checkbiking
- cp $7
+ cp DUNGEON
jr z, .checkbiking
jr .nope
.checkbiking
@@ -383,21 +384,22 @@ Function1551a: ; 1551a (5:551a)
ld [PlayerState], a
scf
ret
+
.nope
and a
ret
-Function1554e: ; 1554e (5:554e)
+.CheckSurfing: ; 1554e (5:554e)
call CheckOnWater
jr nz, .ret_nc
ld a, [PlayerState]
cp PLAYER_SURF
- jr z, .surfing
+ jr z, ._surfing
cp PLAYER_SURF_PIKA
- jr z, .surfing
+ jr z, ._surfing
ld a, PLAYER_SURF
ld [PlayerState], a
-.surfing
+._surfing
scf
ret
.ret_nc
diff --git a/engine/mart.asm b/engine/mart.asm
new file mode 100755
index 000000000..2c3dac0e7
--- /dev/null
+++ b/engine/mart.asm
@@ -0,0 +1,1000 @@
+ const_def
+ const MARTTEXT_HOW_MANY
+ const MARTTEXT_COSTS_THIS_MUCH
+ const MARTTEXT_NOT_ENOUGH_MONEY
+ const MARTTEXT_BAG_FULL
+ const MARTTEXT_HERE_YOU_GO
+ const MARTTEXT_SOLD_OUT
+
+OpenMartDialog:: ; 15a45
+ call GetMart
+ ld a, c
+ ld [EngineBuffer1], a
+ call LoadMartPointer
+ ld a, [EngineBuffer1]
+ ld hl, .dialogs
+ rst JumpTable
+ ret
+; 15a57
+
+.dialogs
+ dw MartDialog
+ dw HerbShop
+ dw BargainShop
+ dw Pharmacist
+ dw RooftopSale
+; 15a61
+
+MartDialog: ; 15a61
+ ld a, 0
+ ld [EngineBuffer1], a
+ xor a
+ ld [MovementAnimation], a
+ call StandardMart
+ ret
+; 15a6e
+
+HerbShop: ; 15a6e
+ call FarReadMart
+ call LoadStandardMenuDataHeader
+ ld hl, Text_HerbShop_Intro
+ call MartTextBox
+ call BuyMenu
+ ld hl, Text_HerbShop_ComeAgain
+ call MartTextBox
+ ret
+; 15a84
+
+BargainShop: ; 15a84
+ ld b, BANK(BargainShopData)
+ ld de, BargainShopData
+ call LoadMartPointer
+ call ReadMart
+ call LoadStandardMenuDataHeader
+ ld hl, Text_BargainShop_Intro
+ call MartTextBox
+ call BuyMenu
+ ld hl, wBargainShopFlags
+ ld a, [hli]
+ or [hl]
+ jr z, .skip_set
+ ld hl, DailyFlags
+ set 6, [hl]
+
+.skip_set
+ ld hl, Text_BargainShop_ComeAgain
+ call MartTextBox
+ ret
+; 15aae
+
+Pharmacist: ; 15aae
+ call FarReadMart
+ call LoadStandardMenuDataHeader
+ ld hl, UnknownText_0x15e90
+ call MartTextBox
+ call BuyMenu
+ ld hl, UnknownText_0x15eae
+ call MartTextBox
+ ret
+; 15ac4
+
+RooftopSale: ; 15ac4
+ ld b, BANK(RooftopSaleData1)
+ ld de, RooftopSaleData1
+ ld hl, StatusFlags
+ bit 6, [hl] ; hall of fame
+ jr z, .ok
+ ld b, BANK(RooftopSaleData2)
+ ld de, RooftopSaleData2
+
+.ok
+ call LoadMartPointer
+ call ReadMart
+ call LoadStandardMenuDataHeader
+ ld hl, Text_Mart_HowMayIHelpYou
+ call MartTextBox
+ call BuyMenu
+ ld hl, Text_Mart_ComeAgain
+ call MartTextBox
+ ret
+; 15aee
+
+RooftopSaleData1: ; 15aee
+ db 5
+ dbw POKE_BALL, 150
+ dbw GREAT_BALL, 500
+ dbw SUPER_POTION, 500
+ dbw FULL_HEAL, 500
+ dbw REVIVE, 1200
+ db -1
+RooftopSaleData2: ; 15aff
+ db 5
+ dbw HYPER_POTION, 1000
+ dbw FULL_RESTORE, 2000
+ dbw FULL_HEAL, 500
+ dbw ULTRA_BALL, 1000
+ dbw PROTEIN, 7800
+ db -1
+; 15b10
+
+LoadMartPointer: ; 15b10
+ ld a, b
+ ld [MartPointerBank], a
+ ld a, e
+ ld [MartPointer], a
+ ld a, d
+ ld [MartPointer + 1], a
+ ld hl, CurMart
+ xor a
+ ld bc, 16
+ call ByteFill
+ xor a
+ ld [MovementAnimation], a
+ ld [wBargainShopFlags], a
+ ld [FacingDirection], a
+ ret
+; 15b31
+
+GetMart: ; 15b31
+ ld a, e
+ cp (MartsEnd - Marts) / 2
+ jr c, .IsAMart
+ ld b, $5
+ ld de, DefaultMart
+ ret
+
+.IsAMart
+ ld hl, Marts
+rept 2
+ add hl, de
+endr
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld b, $5
+ ret
+; 15b47
+
+StandardMart: ; 15b47
+.loop
+ ld a, [MovementAnimation]
+ ld hl, .MartFunctions
+ rst JumpTable
+ ld [MovementAnimation], a
+ cp $ff
+ jr nz, .loop
+ ret
+
+.MartFunctions
+ dw .HowMayIHelpYou
+ dw .TopMenu
+ dw .Buy
+ dw .Sell
+ dw .Quit
+ dw .AnythingElse
+; 15b62
+
+.HowMayIHelpYou: ; 15b62
+ call LoadStandardMenuDataHeader
+ ld hl, Text_Mart_HowMayIHelpYou
+ call PrintText
+ ld a, $1 ; top menu
+ ret
+; 15b6e
+
+.TopMenu: ; 15b6e
+ ld hl, MenuDataHeader_BuySell
+ call CopyMenuDataHeader
+ call InterpretMenu2
+ jr c, .quit
+ ld a, [MenuSelection2]
+ cp $1
+ jr z, .buy
+ cp $2
+ jr z, .sell
+.quit
+ ld a, $4 ; Come again!
+ ret
+.buy
+ ld a, $2 ; buy
+ ret
+.sell
+ ld a, $3 ; sell
+ ret
+; 15b8d
+
+.Buy: ; 15b8d
+ call ExitMenu
+ call FarReadMart
+ call BuyMenu
+ and a
+ ld a, $5 ; Anything else?
+ ret
+; 15b9a
+
+.Sell: ; 15b9a
+ call ExitMenu
+ call SellMenu
+ ld a, $5 ; Anything else?
+ ret
+; 15ba3
+
+.Quit: ; 15ba3
+ call ExitMenu
+ ld hl, Text_Mart_ComeAgain
+ call MartTextBox
+ ld a, $ff ; exit
+ ret
+; 15baf
+
+.AnythingElse: ; 15baf
+ call LoadStandardMenuDataHeader
+ ld hl, Text_Mart_AnythingElse
+ call PrintText
+ ld a, $1 ; top menu
+ ret
+; 15bbb
+
+FarReadMart: ; 15bbb
+ ld hl, MartPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, CurMart
+.CopyMart
+ ld a, [MartPointerBank]
+ call GetFarByte
+ ld [de], a
+ inc hl
+ inc de
+ cp -1
+ jr nz, .CopyMart
+ ld hl, wMartItem1BCD
+ ld de, CurMart + 1
+.ReadMartItem
+ ld a, [de]
+ inc de
+ cp -1
+ jr z, .done
+ push de
+ call GetMartItemPrice
+ pop de
+ jr .ReadMartItem
+
+.done
+ ret
+; 15be5
+
+GetMartItemPrice: ; 15be5
+; Return the price of item a in BCD at hl and in tiles at StringBuffer1.
+ push hl
+ ld [CurItem], a
+ callba GetItemPrice
+ pop hl
+
+GetMartPrice: ; 15bf0
+; Return price de in BCD at hl and in tiles at StringBuffer1.
+ push hl
+ ld a, d
+ ld [StringBuffer2], a
+ ld a, e
+ ld [StringBuffer2 + 1], a
+ ld hl, StringBuffer1
+ ld de, StringBuffer2
+ lb bc, PRINTNUM_LEADINGZEROS | 2, 6 ; 6 digits
+ call PrintNum
+ pop hl
+
+ ld de, StringBuffer1
+ ld c, 6 / 2 ; 6 digits
+.loop
+ call .CharToNybble
+ swap a
+ ld b, a
+ call .CharToNybble
+ or b
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ret
+; 15c1a
+
+.CharToNybble ; 15c1a
+ ld a, [de]
+ inc de
+ cp " "
+ jr nz, .not_space
+ ld a, "0"
+
+.not_space
+ sub "0"
+ ret
+; 15c25
+
+ReadMart: ; 15c25
+; Load the mart pointer. Mart data is local (no need for bank).
+ ld hl, MartPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ push hl
+; set hl to the first item
+ inc hl
+ ld bc, wMartItem1BCD
+ ld de, CurMart + 1
+.loop
+; copy the item to CurMart + (ItemIndex)
+ ld a, [hli]
+ ld [de], a
+ inc de
+; -1 is the terminator
+ cp -1
+ jr z, .done
+
+ push de
+; copy the price to de
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+; convert the price to 3-byte BCD at [bc]
+ push hl
+ ld h, b
+ ld l, c
+ call GetMartPrice
+ ld b, h
+ ld c, l
+ pop hl
+
+ pop de
+ jr .loop
+
+.done
+ pop hl
+ ld a, [hl]
+ ld [CurMart], a
+ ret
+; 15c51
+
+BargainShopData: ; 15c51
+ db 5
+ dbw NUGGET, 4500
+ dbw PEARL, 650
+ dbw BIG_PEARL, 3500
+ dbw STARDUST, 900
+ dbw STAR_PIECE, 4600
+ db -1
+; 15c62
+
+
+BuyMenu: ; 15c62
+ call FadeToMenu
+ callba Function8000
+ xor a
+ ld [wd045 + 1], a
+ ld a, 1
+ ld [wd045], a
+.loop
+ call BuyMenuLoop ; menu loop
+ jr nc, .loop
+ call Function2b3c
+ ret
+; 15c7d
+
+LoadBuyMenuText: ; 15c7d
+; load text from a nested table
+; which table is in EngineBuffer1
+; which entry is in register a
+ push af
+ call GetMartDialogGroup ; gets a pointer from GetMartDialogGroup.MartTextFunctionPointers
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop af
+ ld e, a
+ ld d, 0
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call PrintText
+ ret
+; 15c91
+
+MartAskPurchaseQuantity: ; 15c91
+ call GetMartDialogGroup ; gets a pointer from GetMartDialogGroup.MartTextFunctionPointers
+rept 2
+ inc hl
+endr
+ ld a, [hl]
+ and a
+ jp z, StandardMartAskPurchaseQuantity
+ cp 1
+ jp z, BargainShopAskPurchaseQuantity
+ jp RooftopSaleAskPurchaseQuantity
+; 15ca3
+
+GetMartDialogGroup: ; 15ca3
+ ld a, [EngineBuffer1]
+ ld e, a
+ ld d, 0
+ ld hl, .MartTextFunctionPointers
+rept 3
+ add hl, de
+endr
+ ret
+; 15cb0
+
+.MartTextFunctionPointers ; 15cb0
+ dwb .StandardMartPointers, 0
+ dwb .HerbShopPointers, 0
+ dwb .BargainShopPointers, 1
+ dwb .PharmacyPointers, 0
+ dwb .StandardMartPointers, 2
+; 15cbf
+
+.StandardMartPointers: ; 15cbf
+ dw Text_Mart_HowMany
+ dw Text_Mart_CostsThisMuch
+ dw Text_Mart_InsufficientFunds
+ dw Text_Mart_BagFull
+ dw Text_Mart_HereYouGo
+ dw BuyMenuLoop
+
+.HerbShopPointers: ; 15ccb
+ dw Text_HerbShop_HowMany
+ dw Text_HerbShop_CostsThisMuch
+ dw Text_HerbShop_InsufficientFunds
+ dw Text_HerbShop_BagFull
+ dw Text_HerbShop_HereYouGo
+ dw BuyMenuLoop
+
+.BargainShopPointers: ; 15cd7
+ dw BuyMenuLoop
+ dw Text_BargainShop_CostsThisMuch
+ dw Text_BargainShop_InsufficientFunds
+ dw Text_BargainShop_BagFull
+ dw Text_BargainShop_HereYouGo
+ dw Text_BargainShop_SoldOut
+
+.PharmacyPointers: ; 15ce3
+ dw Text_Pharmacy_HowMany
+ dw Text_Pharmacy_CostsThisMuch
+ dw Text_Pharmacy_InsufficientFunds
+ dw Text_Pharmacy_BagFull
+ dw Text_Pharmacy_HereYouGo
+ dw BuyMenuLoop
+; 15cef
+
+
+BuyMenuLoop: ; 15cef
+ callba Function24ae8
+ call UpdateSprites
+ ld hl, MenuDataHeader_Buy
+ call CopyMenuDataHeader
+ ld a, [wd045]
+ ld [wMenuCursorBuffer], a
+ ld a, [wd045 + 1]
+ ld [wd0e4], a
+ call HandleScrollingMenu
+ ld a, [wd0e4]
+ ld [wd045 + 1], a
+ ld a, [MenuSelection2]
+ ld [wd045], a
+ call SpeechTextBox
+ ld a, [wcf73]
+ cp B_BUTTON
+ jr z, .set_carry
+ cp A_BUTTON
+ jr z, .useless_pointer
+
+.useless_pointer
+ call MartAskPurchaseQuantity
+ jr c, .cancel
+ call Function15d97
+ jr c, .cancel
+ ld de, Money
+ ld bc, hMoneyTemp
+ ld a, $3 ; useless load
+ call CompareMoney
+ jr c, .insufficient_funds
+ ld hl, NumItems
+ call ReceiveItem
+ jr nc, .insufficient_bag_space
+ ld a, [wMartItemID]
+ ld e, a
+ ld d, $0
+ ld b, SET_FLAG
+ ld hl, wBargainShopFlags
+ call FlagAction
+ call PlayTransactionSound
+ ld de, Money
+ ld bc, hMoneyTemp
+ call TakeMoney
+ ld a, MARTTEXT_HERE_YOU_GO
+ call LoadBuyMenuText
+ call JoyWaitAorB
+
+.cancel
+ call SpeechTextBox
+ and a
+ ret
+
+.set_carry
+ scf
+ ret
+
+.insufficient_bag_space
+ ld a, MARTTEXT_BAG_FULL
+ call LoadBuyMenuText
+ call JoyWaitAorB
+ and a
+ ret
+
+.insufficient_funds
+ ld a, MARTTEXT_NOT_ENOUGH_MONEY
+ call LoadBuyMenuText
+ call JoyWaitAorB
+ and a
+ ret
+; 15d83
+
+StandardMartAskPurchaseQuantity:
+ ld a, 99
+ ld [wItemQuantityBuffer], a
+ ld a, MARTTEXT_HOW_MANY
+ call LoadBuyMenuText
+ callba Function24fc9
+ call ExitMenu
+ ret
+; 15d97
+
+Function15d97: ; 15d97
+ predef PartyMonItemName
+ ld a, MARTTEXT_COSTS_THIS_MUCH
+ call LoadBuyMenuText
+ call YesNoBox
+ ret
+; 15da5
+
+BargainShopAskPurchaseQuantity:
+ ld a, 1
+ ld [wItemQuantityChangeBuffer], a
+ ld a, [wMartItemID]
+ ld e, a
+ ld d, $0
+ ld b, CHECK_FLAG
+ ld hl, wBargainShopFlags
+ call FlagAction
+ ld a, c
+ and a
+ jr nz, .SoldOut
+ ld a, [wMartItemID]
+ ld e, a
+ ld d, $0
+ ld hl, MartPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ inc hl
+rept 3
+ add hl, de
+endr
+ inc hl
+ ld a, [hli]
+ ld [hMoneyTemp + 2], a
+ ld a, [hl]
+ ld [hMoneyTemp + 1], a
+ xor a
+ ld [hMoneyTemp], a
+ and a
+ ret
+
+.SoldOut
+ ld a, MARTTEXT_SOLD_OUT
+ call LoadBuyMenuText
+ call JoyWaitAorB
+ scf
+ ret
+; 15de2
+
+RooftopSaleAskPurchaseQuantity:
+ ld a, MARTTEXT_HOW_MANY
+ call LoadBuyMenuText
+ call .GetSalePrice
+ ld a, 99
+ ld [wItemQuantityBuffer], a
+ callba Function24fcf
+ call ExitMenu
+ ret
+; 15df9
+
+.GetSalePrice: ; 15df9
+ ld a, [wMartItemID]
+ ld e, a
+ ld d, 0
+ ld hl, MartPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ inc hl
+rept 3
+ add hl, de
+endr
+ inc hl
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ret
+; 15e0e
+
+
+Text_Mart_HowMany: ; 0x15e0e
+ ; How many?
+ text_jump UnknownText_0x1c4bfd
+ db "@"
+; 0x15e13
+
+Text_Mart_CostsThisMuch: ; 0x15e13
+ ; @ (S) will be ¥@ .
+ text_jump UnknownText_0x1c4c08
+ db "@"
+; 0x15e18
+
+MenuDataHeader_Buy: ; 0x15e18
+ db $40 ; flags
+ db 03, 01 ; start coords
+ db 11, 19 ; end coords
+ dw .menudata2
+ db 1 ; default option
+; 0x15e20
+
+.menudata2: ; 0x15e20
+ db $30 ; pointers
+ db 4, 8 ; rows, columns
+ db 1 ; horizontal spacing
+ dbw 0, CurMart
+ dba PlaceMenuItemName
+ dba .PrintBCDPrices
+ dba Function244c3
+; 15e30
+
+.PrintBCDPrices: ; 15e30
+ ld a, [wcf77]
+ ld c, a
+ ld b, 0
+ ld hl, wMartItem1BCD
+rept 3
+ add hl, bc
+endr
+ push de
+ ld d, h
+ ld e, l
+ pop hl
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld c, PRINTNUM_LEADINGZEROS | PRINTNUM_MONEY | 3
+ call PrintBCDNumber
+ ret
+; 15e4a (5:5e4a)
+
+Text_HerbShop_Intro: ; 0x15e4a
+ ; Hello, dear. I sell inexpensive herbal medicine. They're good, but a trifle bitter. Your #MON may not like them. Hehehehe…
+ text_jump UnknownText_0x1c4c28
+ db "@"
+; 0x15e4f
+
+Text_HerbShop_HowMany: ; 0x15e4f
+ ; How many?
+ text_jump UnknownText_0x1c4ca3
+ db "@"
+; 0x15e54
+
+Text_HerbShop_CostsThisMuch: ; 0x15e54
+ ; @ (S) will be ¥@ .
+ text_jump UnknownText_0x1c4cae
+ db "@"
+; 0x15e59
+
+Text_HerbShop_HereYouGo: ; 0x15e59
+ ; Thank you, dear. Hehehehe…
+ text_jump UnknownText_0x1c4cce
+ db "@"
+; 0x15e5e
+
+Text_HerbShop_BagFull: ; 0x15e5e
+ ; Oh? Your PACK is full, dear.
+ text_jump UnknownText_0x1c4cea
+ db "@"
+; 0x15e63
+
+Text_HerbShop_InsufficientFunds: ; 0x15e63
+ ; Hehehe… You don't have the money.
+ text_jump UnknownText_0x1c4d08
+ db "@"
+; 0x15e68
+
+Text_HerbShop_ComeAgain: ; 0x15e68
+ ; Come again, dear. Hehehehe…
+ text_jump UnknownText_0x1c4d2a
+ db "@"
+; 0x15e6d
+
+Text_BargainShop_Intro: ; 0x15e6d
+ ; Hiya! Care to see some bargains? I sell rare items that nobody else carries--but only one of each item.
+ text_jump UnknownText_0x1c4d47
+ db "@"
+; 0x15e72
+
+Text_BargainShop_CostsThisMuch: ; 0x15e72
+ ; costs ¥@ . Want it?
+ text_jump UnknownText_0x1c4db0
+ db "@"
+; 0x15e77
+
+Text_BargainShop_HereYouGo: ; 0x15e77
+ ; Thanks.
+ text_jump UnknownText_0x1c4dcd
+ db "@"
+; 0x15e7c
+
+Text_BargainShop_BagFull: ; 0x15e7c
+ ; Uh-oh, your PACK is chock-full.
+ text_jump UnknownText_0x1c4dd6
+ db "@"
+; 0x15e81
+
+Text_BargainShop_SoldOut: ; 0x15e81
+ ; You bought that already. I'm all sold out of it.
+ text_jump UnknownText_0x1c4df7
+ db "@"
+; 0x15e86
+
+Text_BargainShop_InsufficientFunds: ; 0x15e86
+ ; Uh-oh, you're short on funds.
+ text_jump UnknownText_0x1c4e28
+ db "@"
+; 0x15e8b
+
+Text_BargainShop_ComeAgain: ; 0x15e8b
+ ; Come by again sometime.
+ text_jump UnknownText_0x1c4e46
+ db "@"
+; 0x15e90
+
+UnknownText_0x15e90: ; 0x15e90
+ ; What's up? Need some medicine?
+ text_jump UnknownText_0x1c4e5f
+ db "@"
+; 0x15e95
+
+Text_Pharmacy_HowMany: ; 0x15e95
+ ; How many?
+ text_jump UnknownText_0x1c4e7e
+ db "@"
+; 0x15e9a
+
+Text_Pharmacy_CostsThisMuch: ; 0x15e9a
+ ; @ (S) will cost ¥@ .
+ text_jump UnknownText_0x1c4e89
+ db "@"
+; 0x15e9f
+
+Text_Pharmacy_HereYouGo: ; 0x15e9f
+ ; Thanks much!
+ text_jump UnknownText_0x1c4eab
+ db "@"
+; 0x15ea4
+
+Text_Pharmacy_BagFull: ; 0x15ea4
+ ; You don't have any more space.
+ text_jump UnknownText_0x1c4eb9
+ db "@"
+; 0x15ea9
+
+Text_Pharmacy_InsufficientFunds: ; 0x15ea9
+ ; Huh? That's not enough money.
+ text_jump UnknownText_0x1c4ed8
+ db "@"
+; 0x15eae
+
+UnknownText_0x15eae: ; 0x15eae
+ ; All right. See you around.
+ text_jump UnknownText_0x1c4ef6
+ db "@"
+; 0x15eb3
+
+
+SellMenu: ; 15eb3
+ call DisableSpriteUpdates
+ callba Function106a5
+.asm_15ebc
+ callba Function106be
+ ld a, [wcf66]
+ and a
+ jp z, Function15ece
+ call Function15ee0
+ jr .asm_15ebc
+; 15ece
+
+Function15ece: ; 15ece
+ call Function2b74
+ and a
+ ret
+; 15ed3
+
+Function15ed3: ; unreferenced
+ ld hl, UnknownText_0x15edb
+ call MenuTextBoxBackup
+ and a
+ ret
+; 15edb
+
+UnknownText_0x15edb: ; 0x15edb
+ ; You don't have anything to sell.
+ text_jump UnknownText_0x1c4f12
+ db "@"
+; 0x15ee0
+
+
+Function15ee0: ; 15ee0
+ callba CheckItemMenu
+ ld a, [wItemAttributeParamBuffer]
+ ld hl, .jumptable
+ rst JumpTable
+ ret
+; 15eee
+
+.jumptable: ; 15eee
+ dw .try_sell
+ dw .cant_buy
+ dw .cant_buy
+ dw .cant_buy
+ dw .try_sell
+ dw .try_sell
+ dw .try_sell
+; 15efc
+
+.cant_buy: ; 15efc
+ ret
+; 15efd
+
+
+.try_sell: ; 15efd
+ callba _CheckTossableItem
+ ld a, [wItemAttributeParamBuffer]
+ and a
+ jr z, .okay_to_sell
+ ld hl, TextMart_CantBuyFromYou
+ call PrintText
+ and a
+ ret
+
+.okay_to_sell
+ ld hl, Text_Mart_SellHowMany
+ call PrintText
+ callba Function24af8
+ callba Function24fe1
+ call ExitMenu
+ jr c, .declined
+ hlcoord 1, 14
+ lb bc, 3, 18
+ call ClearBox
+ ld hl, Text_Mart_ICanPayThisMuch
+ call PrintTextBoxText
+ call YesNoBox
+ jr c, .declined
+ ld de, Money
+ ld bc, hMoneyTemp
+ call GiveMoney
+ ld a, [wMartItemID]
+ ld hl, NumItems
+ call TossItem
+ predef PartyMonItemName
+ hlcoord 1, 14
+ lb bc, 3, 18
+ call ClearBox
+ ld hl, Text_Mart_SoldForAmount
+ call PrintTextBoxText
+ call PlayTransactionSound
+ callba Function24af0
+ call JoyWaitAorB
+
+.declined
+ call ExitMenu
+ and a
+ ret
+; 15f73
+
+Text_Mart_SellHowMany: ; 0x15f73
+ ; How many?
+ text_jump UnknownText_0x1c4f33
+ db "@"
+; 0x15f78
+
+Text_Mart_ICanPayThisMuch: ; 0x15f78
+ ; I can pay you ¥@ . Is that OK?
+ text_jump UnknownText_0x1c4f3e
+ db "@"
+; 0x15f7d
+
+DummyString ; 15f7d
+ db "!ダミー!@"
+
+Text_Mart_HowMayIHelpYou: ; 0x15f83
+ ; Welcome! How may I help you?
+ text_jump UnknownText_0x1c4f62
+ db "@"
+; 0x15f88
+
+MenuDataHeader_BuySell: ; 0x15f88
+ db $40 ; flags
+ db 00, 00 ; start coords
+ db 08, 07 ; end coords
+ dw .menudata2
+ db 1 ; default option
+; 0x15f90
+
+.menudata2: ; 0x15f90
+ db $80 ; strings
+ db 3 ; items
+ db "BUY@"
+ db "SELL@"
+ db "QUIT@"
+; 0x15f96
+
+Text_Mart_HereYouGo: ; 0x15fa0
+ ; Here you are. Thank you!
+ text_jump UnknownText_0x1c4f80
+ db "@"
+; 0x15fa5
+
+Text_Mart_InsufficientFunds: ; 0x15fa5
+ ; You don't have enough money.
+ text_jump UnknownText_0x1c4f9a
+ db "@"
+; 0x15faa
+
+Text_Mart_BagFull: ; 0x15faa
+ ; You can't carry any more items.
+ text_jump UnknownText_0x1c4fb7
+ db "@"
+; 0x15faf
+
+TextMart_CantBuyFromYou: ; 0x15faf
+ ; Sorry, I can't buy that from you.
+ text_jump UnknownText_0x1c4fd7
+ db "@"
+; 0x15fb4
+
+Text_Mart_ComeAgain: ; 0x15fb4
+ ; Please come again!
+ text_jump UnknownText_0x1c4ff9
+ db "@"
+; 0x15fb9
+
+Text_Mart_AnythingElse: ; 0x15fb9
+ text_jump UnknownText_0x1c500d
+ db "@"
+; 0x15fbe
+
+Text_Mart_SoldForAmount: ; 0x15fbe
+ text_jump UnknownText_0x1c502e
+ db "@"
+; 0x15fc3
+
+PlayTransactionSound: ; 15fc3
+ call WaitSFX
+ ld de, SFX_TRANSACTION
+ call PlaySFX
+ ret
+; 15fcd
+
+MartTextBox: ; 15fcd
+ call MenuTextBox
+ call JoyWaitAorB
+ call ExitMenu
+ ret
+; 15fd7
diff --git a/engine/menu.asm b/engine/menu.asm
new file mode 100755
index 000000000..a1ec30b7a
--- /dev/null
+++ b/engine/menu.asm
@@ -0,0 +1,587 @@
+Function2400e:: ; 2400e
+ ld hl, CopyMenuData2
+ ld a, [wcf94]
+ rst FarCall
+ call Function24085
+ call UpdateSprites
+ call Function321c
+ call Function2408f
+ ret
+; 24022
+
+Function24022:: ; 24022
+ ld hl, CopyMenuData2
+ ld a, [wcf94]
+ rst FarCall
+ call Function24085
+ callba MobileTextBorder
+ call UpdateSprites
+ call Function321c
+ call Function2408f
+ ret
+; 2403c
+
+Function2403c:: ; 2403c
+ ld hl, CopyMenuData2
+ ld a, [wcf94]
+ rst FarCall
+ call Function24085
+ callba MobileTextBorder
+ call UpdateSprites
+ call Function321c
+ call Function2411a
+ ld hl, wcfa5
+ set 7, [hl]
+.asm_2405a
+ call DelayFrame
+ callba Function10032e
+ ld a, [wcd2b]
+ and a
+ jr nz, .asm_24076
+ call Function241ba
+ ld a, [wcfa8]
+ and c
+ jr z, .asm_2405a
+ call Function24098
+ ret
+
+.asm_24076
+ ld a, [wcfa4]
+ ld c, a
+ ld a, [wcfa3]
+ call SimpleMultiply
+ ld [wMenuCursorBuffer], a
+ and a
+ ret
+; 24085
+
+
+
+Function24085: ; 24085
+ xor a
+ ld [hBGMapMode], a
+ call MenuBox
+ call Function240db
+ ret
+; 2408f
+
+Function2408f: ; 2408f
+ call Function2411a
+ call Function1bc9
+ call Function1ff8
+
+Function24098: ; 24098
+ ld a, [wMenuData2Flags]
+ bit 1, a
+ jr z, .asm_240a6
+ call Function1bdd
+ bit 2, a
+ jr nz, .asm_240c9
+
+.asm_240a6
+ ld a, [wMenuData2Flags]
+ bit 0, a
+ jr nz, .asm_240b4
+ call Function1bdd
+ bit 1, a
+ jr nz, .asm_240cb
+
+.asm_240b4
+ ld a, [wcfa4]
+ ld c, a
+ ld a, [MenuSelection2]
+ dec a
+ call SimpleMultiply
+ ld c, a
+ ld a, [wcfaa]
+ add c
+ ld [wMenuCursorBuffer], a
+ and a
+ ret
+
+.asm_240c9
+ scf
+ ret
+
+.asm_240cb
+ scf
+ ret
+; 240cd
+
+Function240cd: ; 240cd
+ ld a, [wMenuData2Items]
+ and $f
+ ret
+; 240d3
+
+Function240d3: ; 240d3
+ ld a, [wMenuData2Items]
+ swap a
+ and $f
+ ret
+; 240db
+
+Function240db: ; 240db
+ ld hl, wcf95
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ call GetMenuTextStartCoord
+ call Coord2Tile
+ call Function240d3
+ ld b, a
+.asm_240eb
+ push bc
+ push hl
+ call Function240cd
+ ld c, a
+.asm_240f1
+ push bc
+ ld a, [wcf94]
+ call Function201c
+ inc de
+ ld a, [wcf93]
+ ld c, a
+ ld b, $0
+ add hl, bc
+ pop bc
+ dec c
+ jr nz, .asm_240f1
+ pop hl
+ ld bc, $28
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .asm_240eb
+ ld hl, wcf98
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ or h
+ ret z
+ ld a, [wcf97]
+ rst FarCall
+ ret
+; 2411a
+
+
+Function2411a: ; 2411a (9:411a)
+ call GetMenuTextStartCoord
+ ld a, b
+ ld [wcfa1], a
+ dec c
+ ld a, c
+ ld [wcfa2], a
+ call Function240d3
+ ld [wcfa3], a
+ call Function240cd
+ ld [wcfa4], a
+ call Function24179
+ call Function2418a
+ call Function24193
+ ld a, [wcfa4]
+ ld e, a
+ ld a, [wMenuCursorBuffer]
+ ld b, a
+ xor a
+ ld d, $0
+.asm_24146
+ inc d
+ add e
+ cp b
+ jr c, .asm_24146
+ sub e
+ ld c, a
+ ld a, b
+ sub c
+ and a
+ jr z, .asm_24157
+ cp e
+ jr z, .asm_24159
+ jr c, .asm_24159
+.asm_24157
+ ld a, $1
+.asm_24159
+ ld [wcfaa], a
+ ld a, [wcfa3]
+ ld e, a
+ ld a, d
+ and a
+ jr z, .asm_24169
+ cp e
+ jr z, .asm_2416b
+ jr c, .asm_2416b
+.asm_24169
+ ld a, $1
+.asm_2416b
+ ld [MenuSelection2], a
+ xor a
+ ld [wcfab], a
+ ld [wcfac], a
+ ld [wcfad], a
+ ret
+; 24179
+
+Function24179: ; 24179
+ xor a
+ ld hl, wcfa5
+ ld [hli], a
+ ld [hld], a
+ ld a, [wMenuData2Flags]
+ bit 5, a
+ ret z
+ set 5, [hl]
+ set 4, [hl]
+ ret
+; 2418a
+
+Function2418a: ; 2418a
+ ld a, [wcf93]
+ or $20
+ ld [wcfa7], a
+ ret
+; 24193
+
+Function24193: ; 24193
+ ld hl, wMenuData2Flags
+ ld a, $1
+ bit 0, [hl]
+ jr nz, .asm_2419e
+ or $2
+
+.asm_2419e
+ bit 1, [hl]
+ jr z, .asm_241a4
+ or $4
+
+.asm_241a4
+ ld [wcfa8], a
+ ret
+; 241a8
+
+
+Function241a8:: ; 241a8
+ call Function24329
+Function241ab:: ; 241ab
+ ld hl, wcfa6
+ res 7, [hl]
+ ld a, [hBGMapMode]
+ push af
+ call Function24216
+ pop af
+ ld [hBGMapMode], a
+ ret
+; 241ba
+
+Function241ba: ; 241ba
+ ld hl, wcfa6
+ res 7, [hl]
+ ld a, [hBGMapMode]
+ push af
+ call Function2431a
+ call Function24249
+ jr nc, .asm_241cd
+ call Function24270
+
+.asm_241cd
+ pop af
+ ld [hBGMapMode], a
+ call Function1bdd
+ ld c, a
+ ret
+; 241d5
+
+
+Function241d5: ; 241d5
+ call Function24329
+.loop
+ call Function2431a
+ call Function10402d ; BUG: This function is in another bank.
+ ; Pointer in current bank (9) is bogus.
+ call Function241fa
+ jr nc, .done
+ call Function24270
+ jr c, .done
+ ld a, [wcfa5]
+ bit 7, a
+ jr nz, .done
+ call Function1bdd
+ ld c, a
+ ld a, [wcfa8]
+ and c
+ jr z, .loop
+
+.done
+ ret
+; 241fa
+
+Function241fa: ; 241fa
+.loop
+ call Function24259
+ ret c
+ ld c, 1
+ ld b, 3
+ call Function10062d ; BUG: This function is in another bank.
+ ; Pointer in current bank (9) is bogus.
+ ret c
+ callba Function100337
+ ret c
+ ld a, [wcfa5]
+ bit 7, a
+ jr z, .loop
+ and a
+ ret
+; 24216
+
+
+Function24216: ; 24216
+.asm_24216
+ call Function2431a
+ call Function24238
+ call Function24249
+ jr nc, .asm_24237
+ call Function24270
+ jr c, .asm_24237
+ ld a, [wcfa5]
+ bit 7, a
+ jr nz, .asm_24237
+ call Function1bdd
+ ld b, a
+ ld a, [wcfa8]
+ and b
+ jr z, .asm_24216
+
+.asm_24237
+ ret
+; 24238
+
+Function24238: ; 24238
+ ld a, [hOAMUpdate]
+ push af
+ ld a, $1
+ ld [hOAMUpdate], a
+ call WaitBGMap
+ pop af
+ ld [hOAMUpdate], a
+ xor a
+ ld [hBGMapMode], a
+ ret
+; 24249
+
+Function24249: ; 24249
+.asm_24249
+ call RTC
+ call Function24259
+ ret c
+ ld a, [wcfa5]
+ bit 7, a
+ jr z, .asm_24249
+ and a
+ ret
+; 24259
+
+Function24259: ; 24259
+ ld a, [wcfa5]
+ bit 6, a
+ jr z, .asm_24266
+ callab Function8cf62
+
+.asm_24266
+ call JoyTextDelay
+ call Function1bdd
+ and a
+ ret z
+ scf
+ ret
+; 24270
+
+Function24270: ; 24270
+ call Function1bdd
+ bit 0, a
+ jp nz, Function24318
+ bit 1, a
+ jp nz, Function24318
+ bit 2, a
+ jp nz, Function24318
+ bit 3, a
+ jp nz, Function24318
+ bit 4, a
+ jr nz, .asm_242fa
+ bit 5, a
+ jr nz, .asm_242dc
+ bit 6, a
+ jr nz, .asm_242be
+ bit 7, a
+ jr nz, .asm_242a0
+ and a
+ ret
+
+.asm_24299: ; 24299
+ ld hl, wcfa6
+ set 7, [hl]
+ scf
+ ret
+
+.asm_242a0
+ ld hl, MenuSelection2
+ ld a, [wcfa3]
+ cp [hl]
+ jr z, .asm_242ac
+ inc [hl]
+ xor a
+ ret
+
+.asm_242ac
+ ld a, [wcfa5]
+ bit 5, a
+ jr nz, .asm_242ba
+ bit 3, a
+ jp nz, .asm_24299
+ xor a
+ ret
+
+.asm_242ba
+ ld [hl], $1
+ xor a
+ ret
+
+.asm_242be
+ ld hl, MenuSelection2
+ ld a, [hl]
+ dec a
+ jr z, .asm_242c8
+ ld [hl], a
+ xor a
+ ret
+
+.asm_242c8
+ ld a, [wcfa5]
+ bit 5, a
+ jr nz, .asm_242d6
+ bit 2, a
+ jp nz, .asm_24299
+ xor a
+ ret
+
+.asm_242d6
+ ld a, [wcfa3]
+ ld [hl], a
+ xor a
+ ret
+
+.asm_242dc
+ ld hl, wcfaa
+ ld a, [hl]
+ dec a
+ jr z, .asm_242e6
+ ld [hl], a
+ xor a
+ ret
+
+.asm_242e6
+ ld a, [wcfa5]
+ bit 4, a
+ jr nz, .asm_242f4
+ bit 1, a
+ jp nz, .asm_24299
+ xor a
+ ret
+
+.asm_242f4
+ ld a, [wcfa4]
+ ld [hl], a
+ xor a
+ ret
+
+.asm_242fa
+ ld hl, wcfaa
+ ld a, [wcfa4]
+ cp [hl]
+ jr z, .asm_24306
+ inc [hl]
+ xor a
+ ret
+
+.asm_24306
+ ld a, [wcfa5]
+ bit 4, a
+ jr nz, .asm_24314
+ bit 0, a
+ jp nz, .asm_24299
+ xor a
+ ret
+
+.asm_24314
+ ld [hl], $1
+ xor a
+ ret
+; 24318
+
+Function24318: ; 24318
+ xor a
+ ret
+; 2431a
+
+Function2431a: ; 2431a
+ ld hl, wcfac
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [hl]
+ cp $ed
+ jr nz, Function24329
+ ld a, [wcfab]
+ ld [hl], a
+
+Function24329: ; 24329
+ ld a, [wcfa1]
+ ld b, a
+ ld a, [wcfa2]
+ ld c, a
+ call Coord2Tile
+ ld a, [wcfa7]
+ swap a
+ and $f
+ ld c, a
+ ld a, [MenuSelection2]
+ ld b, a
+ xor a
+ dec b
+ jr z, .asm_24348
+.asm_24344
+ add c
+ dec b
+ jr nz, .asm_24344
+
+.asm_24348
+ ld c, $14
+ call AddNTimes
+ ld a, [wcfa7]
+ and $f
+ ld c, a
+ ld a, [wcfaa]
+ ld b, a
+ xor a
+ dec b
+ jr z, .asm_2435f
+.asm_2435b
+ add c
+ dec b
+ jr nz, .asm_2435b
+
+.asm_2435f
+ ld c, a
+ add hl, bc
+ ld a, [hl]
+ cp $ed
+ jr z, .asm_2436b
+ ld [wcfab], a
+ ld [hl], $ed
+
+.asm_2436b
+ ld a, l
+ ld [wcfac], a
+ ld a, h
+ ld [wcfad], a
+ ret
+; 24374
diff --git a/engine/movement.asm b/engine/movement.asm
index 0a6851ed4..21dd89e9f 100644
--- a/engine/movement.asm
+++ b/engine/movement.asm
@@ -61,32 +61,32 @@ MovementPointers: ; 5075
dw Movement_fix_facing ; 3b
dw Movement_3c ; 3c
dw Movement_hide_person ; 3d
- dw Movement_show_person ; 3e
- dw Movement_3f ; 3f
- dw Movement_40 ; 40
- dw Movement_41 ; 41
- dw Movement_42 ; 42
- dw Movement_43 ; 43
- dw Movement_44 ; 44
- dw Movement_accelerate_last ; 45
+ dw Movement_step_sleep_1 ; 3e
+ dw Movement_step_sleep_2 ; 3f
+ dw Movement_step_sleep_3 ; 40
+ dw Movement_step_sleep_4 ; 41
+ dw Movement_step_sleep_5 ; 42
+ dw Movement_step_sleep_6 ; 43
+ dw Movement_step_sleep_7 ; 44
+ dw Movement_step_sleep_8 ; 45
dw Movement_step_sleep ; 46
dw Movement_step_end ; 47
dw Movement_48 ; 48
dw Movement_remove_person ; 49
- dw Movement_4a ; 4a
+ dw Movement_step_loop ; 4a
dw Movement_4b ; 4b
dw Movement_teleport_from ; 4c
dw Movement_teleport_to ; 4d
dw Movement_skyfall ; 4e
dw Movement_step_wait5 ; 4f
dw Movement_50 ; 50
- dw Movement_51 ; 51
- dw Movement_52 ; 52
+ dw Movement_fish_got_bite ; 51
+ dw Movement_fish_cast_rod ; 52
dw Movement_hide_emote ; 53
dw Movement_show_emote ; 54
dw Movement_step_shake ; 55
dw Movement_56 ; 56
- dw Movement_57 ; 57
+ dw Movement_rock_smash ; 57
dw Movement_58 ; 58
dw Movement_59 ; 59
; 5129
@@ -139,7 +139,7 @@ Movement_step_wait5: ; 5145
ld [hl], $3
ld hl, OBJECT_DIRECTION_WALKING
add hl, bc
- ld [hl], $ff
+ ld [hl], STANDING
ret
; 516a
@@ -156,14 +156,14 @@ Movement_58: ; 516a
ld [hl], a
ld hl, OBJECT_DIRECTION_WALKING
add hl, bc
- ld [hl], $ff
+ ld [hl], STANDING
ld hl, OBJECT_09
add hl, bc
ld [hl], $12
ret
; 5189
-Movement_51: ; 5189
+Movement_fish_got_bite: ; 5189
ld hl, OBJECT_11
add hl, bc
ld [hl], $6
@@ -173,7 +173,7 @@ Movement_51: ; 5189
ret
; 5196
-Movement_57: ; 5196
+Movement_rock_smash: ; 5196
call GetMovementByte
ld hl, OBJECT_STEP_DURATION
add hl, bc
@@ -187,7 +187,7 @@ Movement_57: ; 5196
ret
; 51ab
-Movement_52: ; 51ab
+Movement_fish_cast_rod: ; 51ab
ld hl, OBJECT_11
add hl, bc
ld [hl], $6
@@ -197,11 +197,11 @@ Movement_52: ; 51ab
ret
; 51b8
-Movement_4a: ; 51b8
- ld hl, OBJECT_27
+Movement_step_loop: ; 51b8
+ ld hl, OBJECT_MOVEMENT_BYTE_INDEX
add hl, bc
ld [hl], $0
- jp Function5065
+ jp ContinueReadingMovement
; 51c1
Movement_step_end: ; 51c1
@@ -209,11 +209,14 @@ Movement_step_end: ; 51c1
ld hl, OBJECT_MOVEMENTTYPE
add hl, bc
ld [hl], a
- ld hl, OBJECT_27
+
+ ld hl, OBJECT_MOVEMENT_BYTE_INDEX
add hl, bc
ld [hl], $0
+
ld hl, VramState
res 7, [hl]
+
ld hl, OBJECT_09
add hl, bc
ld [hl], $1
@@ -225,16 +228,20 @@ Movement_48: ; 51db
ld hl, OBJECT_MOVEMENTTYPE
add hl, bc
ld [hl], a
- ld hl, OBJECT_27
+
+ ld hl, OBJECT_MOVEMENT_BYTE_INDEX
add hl, bc
ld [hl], $0
+
call GetMovementByte
ld hl, OBJECT_STEP_DURATION
add hl, bc
ld [hl], a
+
ld hl, OBJECT_09
add hl, bc
ld [hl], $3
+
ld hl, VramState
res 7, [hl]
ret
@@ -245,10 +252,10 @@ Movement_remove_person: ; 51fd
ld hl, wObjectFollow_Leader
ld a, [hMapObjectIndexBuffer]
cp [hl]
- jr nz, .asm_520a
- ld [hl], $ff
+ jr nz, .not_leading
+ ld [hl], -1
-.asm_520a
+.not_leading
ld hl, VramState
res 7, [hl]
ret
@@ -258,43 +265,45 @@ Movement_4b: ; 5210
ld hl, OBJECT_11
add hl, bc
ld [hl], $1
+
ld hl, OBJECT_09
add hl, bc
ld [hl], $4
+
ld hl, VramState
res 7, [hl]
ret
; 5222
-Movement_show_person: ; 5222
+Movement_step_sleep_1: ; 5222
ld a, $1
jr Function5247
-Movement_3f: ; 5226
+Movement_step_sleep_2: ; 5226
ld a, $2
jr Function5247
-Movement_40: ; 522a
+Movement_step_sleep_3: ; 522a
ld a, $3
jr Function5247
-Movement_41: ; 522e
+Movement_step_sleep_4: ; 522e
ld a, $4
jr Function5247
-Movement_42: ; 5232
+Movement_step_sleep_5: ; 5232
ld a, $5
jr Function5247
-Movement_43: ; 5236
+Movement_step_sleep_6: ; 5236
ld a, $6
jr Function5247
-Movement_44: ; 523a
+Movement_step_sleep_7: ; 523a
ld a, $7
jr Function5247
-Movement_accelerate_last: ; 523e
+Movement_step_sleep_8: ; 523e
ld a, $8
jr Function5247
@@ -309,15 +318,18 @@ Function5247: ; 5247
ld hl, OBJECT_STEP_DURATION
add hl, bc
ld [hl], a
+
ld hl, OBJECT_09
add hl, bc
ld [hl], $3
+
ld hl, OBJECT_11
add hl, bc
ld [hl], $1
+
ld hl, OBJECT_DIRECTION_WALKING
add hl, bc
- ld [hl], $ff
+ ld [hl], STANDING
ret
; 525f
@@ -334,7 +346,7 @@ Movement_50: ; 525f
ld [hl], $3
ld hl, OBJECT_DIRECTION_WALKING
add hl, bc
- ld [hl], $ff
+ ld [hl], STANDING
ret
; 5279
@@ -351,7 +363,7 @@ Movement_56: ; 5279
ld [hl], $b
ld hl, OBJECT_DIRECTION_WALKING
add hl, bc
- ld [hl], $ff
+ ld [hl], STANDING
ret
; 5293
@@ -359,52 +371,52 @@ Movement_38: ; 5293
ld hl, OBJECT_FLAGS1
add hl, bc
res 3, [hl]
- jp Function5065
+ jp ContinueReadingMovement
; 529c
Movement_39: ; 529c
ld hl, OBJECT_FLAGS1
add hl, bc
set 3, [hl]
- jp Function5065
+ jp ContinueReadingMovement
; 52a5
Movement_remove_fixed_facing: ; 52a5
ld hl, OBJECT_FLAGS1
add hl, bc
res 2, [hl]
- jp Function5065
+ jp ContinueReadingMovement
; 52ae
Movement_fix_facing: ; 52ae
ld hl, OBJECT_FLAGS1
add hl, bc
set 2, [hl]
- jp Function5065
+ jp ContinueReadingMovement
; 52b7
Movement_3c: ; 52b7
ld hl, OBJECT_FLAGS1
add hl, bc
res 0, [hl]
- jp Function5065
+ jp ContinueReadingMovement
; 52c0
Movement_hide_person: ; 52c0
ld hl, OBJECT_FLAGS1
add hl, bc
set 0, [hl]
- jp Function5065
+ jp ContinueReadingMovement
; 52c9
Movement_hide_emote: ; 52c9
call Function5579
- jp Function5065
+ jp ContinueReadingMovement
; 52cf
Movement_show_emote: ; 52cf
call Function5547
- jp Function5065
+ jp ContinueReadingMovement
; 52d5
Movement_step_shake: ; 52d5
@@ -413,7 +425,7 @@ Movement_step_shake: ; 52d5
call GetMovementByte
call Function5565
- jp Function5065
+ jp ContinueReadingMovement
; 52de
Movement_turn_head_down: ; 52de
@@ -441,7 +453,7 @@ TurnHead: ; 52ee
ld [hl], $1
ld hl, OBJECT_DIRECTION_WALKING
add hl, bc
- ld [hl], $ff
+ ld [hl], STANDING
ret
; 5300
diff --git a/engine/namingscreen.asm b/engine/namingscreen.asm
new file mode 100755
index 000000000..21ec969b4
--- /dev/null
+++ b/engine/namingscreen.asm
@@ -0,0 +1,959 @@
+_NamingScreen: ; 0x116b7
+ call DisableSpriteUpdates
+ call NamingScreen
+ call Function2b74
+ ret
+; 0x116c1
+
+NamingScreen: ; 116c1
+ ld hl, wc6d0
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, wc6d4
+ ld [hl], b
+ ld hl, Options
+ ld a, [hl]
+ push af
+ set NO_TEXT_SCROLL, [hl]
+ ld a, [hMapAnims]
+ push af
+ xor a
+ ld [hMapAnims], a
+ ld a, [hInMenu]
+ push af
+ ld a, $1
+ ld [hInMenu], a
+ call Function116f8
+ call DelayFrame
+.asm_116e5
+ call Function11915
+ jr nc, .asm_116e5
+ pop af
+ ld [hInMenu], a
+ pop af
+ ld [hMapAnims], a
+ pop af
+ ld [Options], a
+ call ClearJoypad
+ ret
+; 116f8
+
+Function116f8: ; 116f8
+ call ClearBGPalettes
+ ld b, $8
+ call GetSGBLayout
+ call DisableLCD
+ call Function11c51
+ call Function118a8
+ ld a, $e3
+ ld [rLCDC], a
+ call Function1171d
+ call WaitBGMap
+ call WaitTop
+ call SetPalettes
+ call Function11be0
+ ret
+; 1171d
+
+Function1171d: ; 1171d
+ ld a, [wc6d4]
+ and 7
+ ld e, a
+ ld d, 0
+ ld hl, Jumptable_1172e
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; 1172e
+
+
+Jumptable_1172e: ; 1172e (4:572e)
+ dw Function1173e
+ dw Function1178d
+ dw Function117ae
+ dw Function117d1
+ dw Function117f5
+ dw Function1182c
+ dw Function1173e
+ dw Function1173e
+
+
+Function1173e: ; 1173e (4:573e)
+ ld a, [CurPartySpecies]
+ ld [wd265], a
+ ld hl, Function8e83f
+ ld a, BANK(Function8e83f)
+ ld e, $1
+ rst FarCall ; ; indirect jump to Function8e83f (8e83f (23:683f))
+ ld a, [CurPartySpecies]
+ ld [wd265], a
+ call GetPokemonName
+ hlcoord 5, 2
+ call PlaceString
+ ld l, c
+ ld h, b
+ ld de, Strings_11780
+ call PlaceString
+ inc de
+ hlcoord 5, 4
+ call PlaceString
+ callba GetGender
+ jr c, .asm_1177c
+ ld a, $ef
+ jr nz, .asm_11778
+ ld a, $f5
+.asm_11778
+ hlcoord 1, 2
+ ld [hl], a
+.asm_1177c
+ call Function1187b
+ ret
+; 11780 (4:5780)
+
+Strings_11780: ; 11780
+ db "'S@"
+ db "NICKNAME?@"
+; 1178d
+
+Function1178d: ; 1178d (4:578d)
+ callba GetPlayerIcon
+ call Function11847
+ hlcoord 5, 2
+ ld de, String_117a3
+ call PlaceString
+ call Function11882
+ ret
+; 117a3 (4:57a3)
+
+String_117a3: ; 117a3
+ db "YOUR NAME?@"
+; 117ae
+
+Function117ae: ; 117ae (4:57ae)
+ ld de, SilverSpriteGFX
+ ld b, BANK(SilverSpriteGFX)
+ call Function11847
+ hlcoord 5, 2
+ ld de, String_117c3
+ call PlaceString
+ call Function11882
+ ret
+; 117c3 (4:57c3)
+
+String_117c3: ; 117c3
+ db "RIVAL'S NAME?@"
+; 117d1
+
+Function117d1: ; 117d1 (4:57d1)
+ ld de, MomSpriteGFX
+ ld b, BANK(MomSpriteGFX)
+ call Function11847
+ hlcoord 5, 2
+ ld de, String_117e6
+ call PlaceString
+ call Function11882
+ ret
+; 117e6 (4:57e6)
+
+String_117e6: ; 117e6
+ db "MOTHER'S NAME?@"
+; 117f5
+
+Function117f5: ; 117f5 (4:57f5)
+ ld de, PokeBallSpriteGFX
+ ld hl, VTiles0 tile $00
+ lb bc, BANK(PokeBallSpriteGFX), $4
+ call Request2bpp
+ xor a
+ ld hl, wc300
+ ld [hli], a
+ ld [hl], a
+ ld de, $2420
+ ld a, $a
+ call Function3b2a
+ ld hl, $1
+ add hl, bc
+ ld [hl], $0
+ hlcoord 5, 2
+ ld de, String_11822
+ call PlaceString
+ call Function11889
+ ret
+; 11822 (4:5822)
+
+String_11822: ; 11822
+ db "BOX NAME?@"
+; 1182c
+
+Function1182c: ; 1182c (4:582c)
+ hlcoord 3, 2
+ ld de, String_11839
+ call PlaceString
+ call Function11882
+ ret
+; 11839 (4:5839)
+
+String_11839: ; 11839
+ db "おともだち の なまえは?@"
+; 11847
+
+Function11847: ; 11847 (4:5847)
+ push de
+ ld hl, VTiles0 tile $00
+ ld c, $4
+ push bc
+ call Request2bpp
+ pop bc
+ ld hl, $c0
+ add hl, de
+ ld e, l
+ ld d, h
+ ld hl, VTiles0 tile $04
+ call Request2bpp
+ xor a
+ ld hl, wc300
+ ld [hli], a
+ ld [hl], a
+ pop de
+ ld b, $a
+ ld a, d
+ cp $7a
+ jr nz, .asm_11873
+ ld a, e
+ cp $40
+ jr nz, .asm_11873
+ ld b, $1e
+.asm_11873
+ ld a, b
+ ld de, $2420
+ call Function3b2a
+ ret
+
+Function1187b: ; 1187b (4:587b)
+ ld a, $a
+ hlcoord 5, 6
+ jr Function11890
+
+Function11882: ; 11882 (4:5882)
+ ld a, $7
+ hlcoord 5, 6
+ jr Function11890
+
+Function11889: ; 11889 (4:5889)
+ ld a, $8
+ hlcoord 5, 4
+ jr Function11890
+
+Function11890: ; 11890 (4:5890)
+ ld [wc6d3], a
+ ld a, l
+ ld [wc6d8], a
+ ld a, h
+ ld [wc6d9], a
+ ret
+
+
+Function1189c: ; 1189c
+ push bc
+ push af
+ ld a, [wc6d4]
+ sub $3
+ ld b, a
+ pop af
+ dec b
+ pop bc
+ ret
+; 118a8
+
+Function118a8: ; 118a8
+ call WaitTop
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, $60
+ call ByteFill
+ hlcoord 1, 1
+ lb bc, 6, 18
+ call Function1189c
+ jr nz, .asm_118c4
+ lb bc, 4, 18
+
+.asm_118c4
+ call ClearBox
+ ld de, NameInputUpper
+Function118ca: ; 118ca
+ call Function1189c
+ jr nz, .asm_118d5
+ ld hl, BoxNameInputLower - NameInputLower
+ add hl, de
+ ld d, h
+ ld e, l
+
+.asm_118d5
+ push de
+ hlcoord 1, 8
+ lb bc, 7, 18
+ call Function1189c
+ jr nz, .asm_118e7
+ hlcoord 1, 6
+ lb bc, 9, 18
+
+.asm_118e7
+ call ClearBox
+ hlcoord 1, 16
+ lb bc, 1, 18
+ call ClearBox
+ pop de
+ hlcoord 2, 8
+ ld b, $5
+ call Function1189c
+ jr nz, .asm_11903
+ hlcoord 2, 6
+ ld b, $6
+
+.asm_11903
+ ld c, $11
+.asm_11905
+ ld a, [de]
+ ld [hli], a
+ inc de
+ dec c
+ jr nz, .asm_11905
+ push de
+ ld de, $17
+ add hl, de
+ pop de
+ dec b
+ jr nz, .asm_11903
+ ret
+; 11915
+
+Function11915: ; 11915
+ call JoyTextDelay
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .asm_11930
+ call Function11968
+ callba Function8cf62
+ call Function11940
+ call DelayFrame
+ and a
+ ret
+
+.asm_11930
+ callab Function8cf53
+ call ClearSprites
+ xor a
+ ld [hSCX], a
+ ld [hSCY], a
+ scf
+ ret
+; 11940
+
+Function11940: ; 11940
+ xor a
+ ld [hBGMapMode], a
+ hlcoord 1, 5
+ call Function1189c
+ jr nz, .asm_1194e
+ hlcoord 1, 3
+
+.asm_1194e
+ lb bc, 1, 18
+ call ClearBox
+ ld hl, wc6d0
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, wc6d8
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call PlaceString
+ ld a, $1
+ ld [hBGMapMode], a
+ ret
+; 11968
+
+Function11968: ; 11968
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, $0
+ ld hl, Jumptable_11977
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; 11977
+
+
+Jumptable_11977: ; 11977 (4:5977)
+ dw Function1197b
+ dw Function119a1
+
+
+Function1197b: ; 1197b (4:597b)
+ lb de, $50, $18
+ call Function1189c
+ jr nz, .asm_11985
+ ld d, $40
+.asm_11985
+ ld a, $2
+ call Function3b2a
+ ld a, c
+ ld [wc6d5], a
+ ld a, b
+ ld [wc6d6], a
+ ld hl, $1
+ add hl, bc
+ ld a, [hl]
+ ld hl, $e
+ add hl, bc
+ ld [hl], a
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+Function119a1: ; 119a1 (4:59a1)
+ ld hl, hJoyPressed ; $ffa7
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .a
+ ld a, [hl]
+ and B_BUTTON
+ jr nz, .b
+ ld a, [hl]
+ and START
+ jr nz, .start
+ ld a, [hl]
+ and SELECT
+ jr nz, .select
+ ret
+
+.a
+ call Function11a0b
+ cp $1
+ jr z, .select
+ cp $2
+ jr z, .b
+ cp $3
+ jr z, .asm_119eb
+ call Function11c11
+ call Function11b14
+ ret nc
+
+.start
+ ld hl, wc6d5
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+ ld hl, $c
+ add hl, bc
+ ld [hl], $8
+ ld hl, $d
+ add hl, bc
+ ld [hl], $4
+ call Function1189c
+ ret nz
+ inc [hl]
+ ret
+
+.b
+ call Function11bbc
+ ret
+
+.asm_119eb
+ call Function11bf7
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+.select
+ ld hl, wcf64
+ ld a, [hl]
+ xor 1
+ ld [hl], a
+ jr z, .asm_11a04
+ ld de, NameInputLower
+ call Function118ca
+ ret
+
+.asm_11a04
+ ld de, NameInputUpper
+ call Function118ca
+ ret
+
+Function11a0b: ; 11a0b (4:5a0b)
+ ld hl, wc6d5
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+
+Function11a11: ; 11a11 (4:5a11)
+ ld hl, $d
+ add hl, bc
+ ld a, [hl]
+ push bc
+ ld b, $4
+ call Function1189c
+ jr nz, .asm_11a1f
+ inc b
+.asm_11a1f
+ cp b
+ pop bc
+ jr nz, .asm_11a39
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ cp $3
+ jr c, .asm_11a33
+ cp $6
+ jr c, .asm_11a36
+ ld a, $3
+ ret
+.asm_11a33
+ ld a, $1
+ ret
+.asm_11a36
+ ld a, $2
+ ret
+.asm_11a39
+ xor a
+ ret
+
+Function11a3b: ; 11a3b (4:5a3b)
+ call Function11a8b
+ ld hl, $d
+ add hl, bc
+ ld a, [hl]
+ ld e, a
+ swap e
+ ld hl, $7
+ add hl, bc
+ ld [hl], e
+ ld d, $4
+ call Function1189c
+ jr nz, .asm_11a53
+ inc d
+.asm_11a53
+ cp d
+ ld de, Unknown_11a79
+ ld a, $0
+ jr nz, .asm_11a60
+ ld de, Unknown_11a82
+ ld a, $1
+.asm_11a60
+ ld hl, $e
+ add hl, bc
+ add [hl]
+ ld hl, $1
+ add hl, bc
+ ld [hl], a
+ ld hl, $c
+ add hl, bc
+ ld l, [hl]
+ ld h, $0
+ add hl, de
+ ld a, [hl]
+ ld hl, $6
+ add hl, bc
+ ld [hl], a
+ ret
+; 11a79 (4:5a79)
+
+Unknown_11a79: ; 11a79
+ db $00, $10, $20, $30, $40, $50, $60, $70, $80
+Unknown_11a82: ; 11a82
+ db $00, $00, $00, $30, $30, $30, $60, $60, $60
+; 11a8b
+
+Function11a8b: ; 11a8b (4:5a8b)
+ ld hl, hJoyLast
+ ld a, [hl]
+ and D_UP
+ jr nz, .up
+ ld a, [hl]
+ and D_DOWN
+ jr nz, .down
+ ld a, [hl]
+ and D_LEFT
+ jr nz, .left
+ ld a, [hl]
+ and D_RIGHT
+ jr nz, .right
+ ret
+.right
+ call Function11a11
+ and a
+ jr nz, .asm_11ab7
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ cp $8
+ jr nc, .asm_11ab4
+ inc [hl]
+ ret
+.asm_11ab4
+ ld [hl], $0
+ ret
+.asm_11ab7
+ cp $3
+ jr nz, .asm_11abc
+ xor a
+.asm_11abc
+ ld e, a
+ add a
+ add e
+ ld hl, $c
+ add hl, bc
+ ld [hl], a
+ ret
+.left
+ call Function11a11
+ and a
+ jr nz, .asm_11ad8
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_11ad5
+ dec [hl]
+ ret
+.asm_11ad5
+ ld [hl], $8
+ ret
+.asm_11ad8
+ cp $1
+ jr nz, .asm_11ade
+ ld a, $4
+.asm_11ade
+rept 2
+ dec a
+endr
+ ld e, a
+ add a
+ add e
+ ld hl, $c
+ add hl, bc
+ ld [hl], a
+ ret
+.down
+ ld hl, $d
+ add hl, bc
+ ld a, [hl]
+ call Function1189c
+ jr nz, .asm_11af9
+ cp $5
+ jr nc, .asm_11aff
+ inc [hl]
+ ret
+.asm_11af9
+ cp $4
+ jr nc, .asm_11aff
+ inc [hl]
+ ret
+.asm_11aff
+ ld [hl], $0
+ ret
+.up
+ ld hl, $d
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_11b0c
+ dec [hl]
+ ret
+.asm_11b0c
+ ld [hl], $4
+ call Function1189c
+ ret nz
+ inc [hl]
+ ret
+
+Function11b14: ; 11b14 (4:5b14)
+ ld a, [wc6d7]
+
+Function11b17: ; 11b17 (4:5b17)
+ ld a, [wc6d3]
+ ld c, a
+ ld a, [wc6d2]
+ cp c
+ ret nc
+
+ ld a, [wc6d7]
+
+Function11b23: ; 11b23
+ call Function11bd0
+ ld [hl], a
+
+Function11b27: ; 11b27
+ ld hl, wc6d2
+ inc [hl]
+ call Function11bd0
+ ld a, [hl]
+ cp $50
+ jr z, .asm_11b37
+ ld [hl], $f2
+ and a
+ ret
+.asm_11b37
+ scf
+ ret
+; 11b39 (4:5b39)
+
+Function11b39: ; 11b39
+ ld a, [wc6d2]
+ and a
+ ret z
+ push hl
+ ld hl, wc6d2
+ dec [hl]
+ call Function11bd0
+ ld c, [hl]
+ pop hl
+
+.asm_11b48
+ ld a, [hli]
+ cp $ff
+ jr z, Function11b27
+ cp c
+ jr z, .asm_11b53
+ inc hl
+ jr .asm_11b48
+
+.asm_11b53
+ ld a, [hl]
+ jr Function11b23
+; 11b56
+
+Dakutens: ; Dummied out
+ db "かが", "きぎ", "くぐ", "けげ", "こご"
+ db "さざ", "しじ", "すず", "せぜ", "そぞ"
+ db "ただ", "ちぢ", "つづ", "てで", "とど"
+ db "はば", "ひび", "ふぶ", "へべ", "ほぼ"
+ db "カガ", "キギ", "クグ", "ケゲ", "コゴ"
+ db "サザ", "シジ", "スズ", "セゼ", "ソゾ"
+ db "タダ", "チヂ", "ツヅ", "テデ", "トド"
+ db "ハバ", "ヒビ", "フブ", "へべ", "ホボ"
+ db $ff
+
+Handakutens: ; Dummied out
+ db "はぱ", "ひぴ", "ふぷ", "へぺ", "ほぽ"
+ db "ハパ", "ヒピ", "フプ", "へぺ", "ホポ"
+ db $ff
+; 11bbc
+
+Function11bbc: ; 11bbc (4:5bbc)
+ ld hl, wc6d2
+ ld a, [hl]
+ and a
+ ret z
+ dec [hl]
+ call Function11bd0
+ ld [hl], $f2
+ inc hl
+ ld a, [hl]
+ cp $f2
+ ret nz
+ ld [hl], $eb
+ ret
+
+Function11bd0: ; 11bd0 (4:5bd0)
+ push af
+ ld hl, wc6d0
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wc6d2]
+ ld e, a
+ ld d, 0
+ add hl, de
+ pop af
+ ret
+; 11be0
+
+Function11be0: ; 11be0
+; load $f2, ($eb * [wc6d3]), $50 into the dw address at wc6d0
+ ld hl, wc6d0
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld [hl], "·"
+ inc hl
+ ld a, [wc6d3]
+ dec a
+ ld c, a
+ ld a, "→"
+.loop
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ld [hl], "@"
+ ret
+; 11bf7
+
+
+Function11bf7: ; 11bf7 (4:5bf7)
+ ld hl, wc6d0
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wc6d3]
+ ld c, a
+.asm_11c01
+ ld a, [hl]
+ cp $eb
+ jr z, .asm_11c0a
+ cp $f2
+ jr nz, .asm_11c0c
+.asm_11c0a
+ ld [hl], $50
+.asm_11c0c
+ inc hl
+ dec c
+ jr nz, .asm_11c01
+ ret
+
+Function11c11: ; 11c11 (4:5c11)
+ ld hl, wc6d5
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+ ld hl, $6
+ add hl, bc
+ ld a, [hl]
+ ld hl, $4
+ add hl, bc
+ add [hl]
+ sub $8
+ srl a
+ srl a
+ srl a
+ ld e, a
+ ld hl, $7
+ add hl, bc
+ ld a, [hl]
+ ld hl, $5
+ add hl, bc
+ add [hl]
+ sub $10
+ srl a
+ srl a
+ srl a
+ ld d, a
+ hlcoord 0, 0
+ ld bc, $14
+.asm_11c43
+ ld a, d
+ and a
+ jr z, .asm_11c4b
+ add hl, bc
+ dec d
+ jr .asm_11c43
+.asm_11c4b
+ add hl, de
+ ld a, [hl]
+ ld [wc6d7], a
+ ret
+
+
+Function11c51: ; 11c51
+ call ClearSprites
+ callab Function8cf53
+ call LoadStandardFont
+ call LoadFontsExtra
+
+ ld de, GFX_11e65
+ ld hl, VTiles1 tile $6b
+ lb bc, BANK(GFX_11e65), 1
+ call Get1bpp
+
+ ld de, GFX_11e6d
+ ld hl, VTiles1 tile $72
+ lb bc, BANK(GFX_11e6d), 1
+ call Get1bpp
+
+ ld de, VTiles2 tile $60
+ ld hl, GFX_11cb7
+ ld bc, $10
+ ld a, BANK(GFX_11cb7)
+ call FarCopyBytes
+
+ ld de, VTiles0 tile $7e
+ ld hl, GFX_11cc7
+ ld bc, $20
+ ld a, BANK(GFX_11cc7)
+ call FarCopyBytes
+
+ ld a, $5
+ ld hl, wc312
+ ld [hli], a
+ ld [hl], $7e
+ xor a
+ ld [hSCY], a
+ ld [wc3bf], a
+ ld [hSCX], a
+ ld [wc3c0], a
+ ld [wJumptableIndex], a
+ ld [wcf64], a
+ ld [hBGMapMode], a
+ ld [wc6d2], a
+ ld a, $7
+ ld [hWX], a
+ ret
+; 11cb7
+
+GFX_11cb7: ; 11cb7
+INCBIN "gfx/unknown/011cb7.2bpp"
+; 11cc7
+
+GFX_11cc7: ; 11cc7
+INCBIN "gfx/unknown/011cc7.2bpp"
+; 11ce7
+
+NameInputLower:
+ db "a b c d e f g h i"
+ db "j k l m n o p q r"
+ db "s t u v w x y z "
+ db "× ( ) : ; [ ] <PK> <MN>"
+ db "UPPER DEL END "
+BoxNameInputLower:
+ db "a b c d e f g h i"
+ db "j k l m n o p q r"
+ db "s t u v w x y z "
+ db "é 'd 'l 'm 'r 's 't 'v 0"
+ db "1 2 3 4 5 6 7 8 9"
+ db "UPPER DEL END "
+NameInputUpper: ; Unreferenced?
+ db "A B C D E F G H I"
+ db "J K L M N O P Q R"
+ db "S T U V W X Y Z "
+ db "- ? ! / . , "
+ db "lower DEL END "
+BoxNameInputUpper:
+ db "A B C D E F G H I"
+ db "J K L M N O P Q R"
+ db "S T U V W X Y Z "
+ db "× ( ) : ; [ ] <PK> <MN>"
+ db "- ? ! ♂ ♀ / . , &"
+ db "lower DEL END "
+; 11e5d
+
+GFX_11e5d: ; ????
+INCBIN "gfx/unknown/011e5d.2bpp"
+; 11e6d
+
+GFX_11e65:
+INCBIN "gfx/unknown/011e65.2bpp"
+; 11e6d
+
+GFX_11e6d: ; 11e6d
+INCBIN "gfx/unknown/011e6d.2bpp"
+; 11e75
diff --git a/engine/pack.asm b/engine/pack.asm
index b753d6ade..2ba9c9d3a 100644
--- a/engine/pack.asm
+++ b/engine/pack.asm
@@ -44,7 +44,7 @@ Jumptable_10030: ; 10030 (4:4030)
Function10046: ; 10046 (4:4046)
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call Function10955
ld a, [wcf64]
ld [wJumptableIndex], a
@@ -67,10 +67,10 @@ Function10067: ; 10067 (4:4067)
ld [wMenuCursorBuffer], a
ld a, [wd0df]
ld [wd0e4], a
- call Function350c
+ call HandleScrollingMenu
ld a, [wd0e4]
ld [wd0df], a
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
ld [wItemsPocketCursor], a
ld b, $7
ld c, $3
@@ -95,10 +95,10 @@ Function100a6: ; 100a6 (4:40a6)
ld [wMenuCursorBuffer], a
ld a, [wd0e0]
ld [wd0e4], a
- call Function350c
+ call HandleScrollingMenu
ld a, [wd0e4]
ld [wd0e0], a
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
ld [wKeyItemsPocketCursor], a
ld b, $3
ld c, $7
@@ -113,7 +113,7 @@ Function100d3: ; 100d3 (4:40d3)
call ClearPocketList
call DrawPocketName
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call WaitBGMap_DrawPackGFX
call Function10866
ret
@@ -141,7 +141,7 @@ Function100e8: ; 100e8 (4:40e8)
call ExitMenu
pop hl
ret c
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
dec a
call Function1086b
jp [hl]
@@ -203,7 +203,7 @@ Function10159: ; 10159
ld [Options], a
.asm_10179
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call Function10955
call WaitBGMap_DrawPackGFX
call Function10a40
@@ -225,10 +225,10 @@ Function10198: ; 10198 (4:4198)
ld [wMenuCursorBuffer], a
ld a, [wd0e1]
ld [wd0e4], a
- call Function350c
+ call HandleScrollingMenu
ld a, [wd0e4]
ld [wd0e1], a
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
ld [wBallsPocketCursor], a
ld b, $1
ld c, $5
@@ -301,7 +301,7 @@ Function101c5: ; 101c5 (4:41c5)
call ExitMenu
pop hl
ret c
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
dec a
call Function1086b
jp [hl]
@@ -478,7 +478,7 @@ Function10311: ; 10311
jr z, .NoPokemon
call DoItemEffect
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call Function10955
call WaitBGMap_DrawPackGFX
call Function10a40
@@ -594,7 +594,7 @@ Function103fd: ; 103fd
ld [Options], a
ld a, $8
ld [PartyMenuActionText], a
- call WhiteBGMap
+ call ClearBGPalettes
callba Function5004f
callba Function50405
callba Function503e0
@@ -634,7 +634,7 @@ Function103fd: ; 103fd
pop af
ld [Options], a
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call Function10955
call WaitBGMap_DrawPackGFX
call Function10a40
@@ -702,7 +702,7 @@ Jumptable_104c3: ; 104c3 (4:44c3)
Function104d9: ; 104d9 (4:44d9)
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call Function10955
ld a, [wcf64]
ld [wJumptableIndex], a
@@ -725,10 +725,10 @@ Function104fa: ; 104fa (4:44fa)
ld [wMenuCursorBuffer], a
ld a, [wd0df]
ld [wd0e4], a
- call Function350c
+ call HandleScrollingMenu
ld a, [wd0e4]
ld [wd0df], a
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
ld [wItemsPocketCursor], a
ld b, $7
ld c, $3
@@ -753,10 +753,10 @@ Function10539: ; 10539 (4:4539)
ld [wMenuCursorBuffer], a
ld a, [wd0e0]
ld [wd0e4], a
- call Function350c
+ call HandleScrollingMenu
ld a, [wd0e4]
ld [wd0e0], a
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
ld [wKeyItemsPocketCursor], a
ld b, $3
ld c, $7
@@ -771,7 +771,7 @@ Function10566: ; 10566 (4:4566)
call ClearPocketList
call DrawPocketName
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call WaitBGMap_DrawPackGFX
ld hl, UnknownText_0x10b0c
call Function10889
@@ -804,10 +804,10 @@ Function105a6: ; 105a6 (4:45a6)
ld [wMenuCursorBuffer], a
ld a, [wd0e1]
ld [wd0e4], a
- call Function350c
+ call HandleScrollingMenu
ld a, [wd0e4]
ld [wd0e1], a
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
ld [wBallsPocketCursor], a
ld b, $1
ld c, $5
@@ -836,7 +836,7 @@ Function105dc: ; 105dc (4:45dc)
call ExitMenu
pop hl
ret c
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
dec a
call Function1086b
jp [hl]
@@ -915,14 +915,14 @@ Function105dc: ; 105dc (4:45dc)
and a
jr nz, .asm_1067e
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call Function10955
call WaitBGMap_DrawPackGFX
call Function10a40
ret
.asm_1066c: ; 1066c (4:466c)
- call WhiteBGMap
+ call ClearBGPalettes
jr .asm_1067e
.BattleOnly: ; 10671 (4:4671)
@@ -1010,10 +1010,10 @@ Jumptable_106d1: ; 106d1 (4:46d1)
ld [wMenuCursorBuffer], a
ld a, [wd0df]
ld [wd0e4], a
- call Function350c
+ call HandleScrollingMenu
ld a, [wd0e4]
ld [wd0df], a
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
ld [wItemsPocketCursor], a
ret
@@ -1026,10 +1026,10 @@ Jumptable_106d1: ; 106d1 (4:46d1)
ld [wMenuCursorBuffer], a
ld a, [wd0e0]
ld [wd0e4], a
- call Function350c
+ call HandleScrollingMenu
ld a, [wd0e4]
ld [wd0e0], a
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
ld [wKeyItemsPocketCursor], a
ret
@@ -1051,10 +1051,10 @@ Jumptable_106d1: ; 106d1 (4:46d1)
ld [wMenuCursorBuffer], a
ld a, [wd0e1]
ld [wd0e4], a
- call Function350c
+ call HandleScrollingMenu
ld a, [wd0e4]
ld [wd0e1], a
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
ld [wBallsPocketCursor], a
ret
@@ -1170,9 +1170,9 @@ MenuData2_0x107f7: ; 0x107f7
db 5, 8 ; rows, columns
db 2 ; horizontal spacing
dbw 0, OTPartyMons
- dbw BANK(PlaceMenuItemName), PlaceMenuItemName
- dbw BANK(PlaceMenuItemQuantity), PlaceMenuItemQuantity
- dbw BANK(Function244c3), Function244c3
+ dba PlaceMenuItemName
+ dba PlaceMenuItemQuantity
+ dba Function244c3
; 10807
Function10807: ; 10807 (4:4807)
@@ -1194,9 +1194,9 @@ MenuData2_0x10816: ; 0x10816
db 5, 8 ; rows, columns
db 1 ; horizontal spacing
dbw 0, OTPartyMon1Exp + 2
- dbw BANK(PlaceMenuItemName), PlaceMenuItemName
- dbw BANK(PlaceMenuItemQuantity), PlaceMenuItemQuantity
- dbw BANK(Function244c3), Function244c3
+ dba PlaceMenuItemName
+ dba PlaceMenuItemQuantity
+ dba Function244c3
; 10826
Function10826: ; 10826 (4:4826)
@@ -1227,9 +1227,9 @@ MenuData2_0x1084a: ; 0x1084a
db 5, 8 ; rows, columns
db 2 ; horizontal spacing
dbw 0, OTPartyMon1CaughtGender
- dbw BANK(PlaceMenuItemName), PlaceMenuItemName
- dbw BANK(PlaceMenuItemQuantity), PlaceMenuItemQuantity
- dbw BANK(Function244c3), Function244c3
+ dba PlaceMenuItemName
+ dba PlaceMenuItemQuantity
+ dba Function244c3
; 1085a
Function1085a: ; 1085a (4:485a)
@@ -1237,7 +1237,7 @@ Function1085a: ; 1085a (4:485a)
call InitPocket
pop hl
call CopyMenuDataHeader
- call Function350c
+ call HandleScrollingMenu
ret
Function10866: ; 10866 (4:4866)
@@ -1401,17 +1401,17 @@ Function108d4: ; 108d4 (4:48d4)
Function10955: ; 10955
- call WhiteBGMap
+ call ClearBGPalettes
call ClearTileMap
call ClearSprites
call DisableLCD
ld hl, PackMenuGFX
ld de, VTiles2
- ld bc, $0600
+ ld bc, $60 tiles
ld a, BANK(PackMenuGFX)
call FarCopyBytes
hlcoord 0, 1
- ld bc, 220
+ ld bc, 11 * SCREEN_WIDTH
ld a, $24
call ByteFill
hlcoord 5, 1
@@ -1419,12 +1419,12 @@ Function10955: ; 10955
call ClearBox
hlcoord 0, 0
ld a, $28
- ld c, $14
-.asm_1098a
+ ld c, SCREEN_WIDTH
+.loop
ld [hli], a
inc a
dec c
- jr nz, .asm_1098a
+ jr nz, .loop
call DrawPocketName
call Function109a5
hlcoord 0, 12
@@ -1538,9 +1538,9 @@ MenuData2_0x10a57: ; 0x10a57
db 5, 8 ; rows, columns
db 2 ; horizontal spacing
dbw 0, NumItems
- dbw BANK(PlaceMenuItemName), PlaceMenuItemName
- dbw BANK(PlaceMenuItemQuantity), PlaceMenuItemQuantity
- dbw BANK(Function244c3), Function244c3
+ dba PlaceMenuItemName
+ dba PlaceMenuItemQuantity
+ dba Function244c3
; 10a67
MenuDataHeader_0x10a67: ; 0x10a67
@@ -1556,9 +1556,9 @@ MenuData2_0x10a6f: ; 0x10a6f
db 5, 8 ; rows, columns
db 2 ; horizontal spacing
dbw 0, NumItems
- dbw BANK(PlaceMenuItemName), PlaceMenuItemName
- dbw BANK(PlaceMenuItemQuantity), PlaceMenuItemQuantity
- dbw BANK(Function244c3), Function244c3
+ dba PlaceMenuItemName
+ dba PlaceMenuItemQuantity
+ dba Function244c3
; 10a7f
MenuDataHeader_0x10a7f: ; 0x10a7f
@@ -1574,9 +1574,9 @@ MenuData2_0x10a87: ; 0x10a87
db 5, 8 ; rows, columns
db 1 ; horizontal spacing
dbw 0, NumKeyItems
- dbw BANK(PlaceMenuItemName), PlaceMenuItemName
- dbw BANK(PlaceMenuItemQuantity), PlaceMenuItemQuantity
- dbw BANK(Function244c3), Function244c3
+ dba PlaceMenuItemName
+ dba PlaceMenuItemQuantity
+ dba Function244c3
; 10a97
MenuDataHeader_0x10a97: ; 0x10a97
@@ -1592,9 +1592,9 @@ MenuData2_0x10a9f: ; 0x10a9f
db 5, 8 ; rows, columns
db 1 ; horizontal spacing
dbw 0, NumKeyItems
- dbw BANK(PlaceMenuItemName), PlaceMenuItemName
- dbw BANK(PlaceMenuItemQuantity), PlaceMenuItemQuantity
- dbw BANK(Function244c3), Function244c3
+ dba PlaceMenuItemName
+ dba PlaceMenuItemQuantity
+ dba Function244c3
; 10aaf
MenuDataHeader_0x10aaf: ; 0x10aaf
@@ -1610,9 +1610,9 @@ MenuData2_0x10ab7: ; 0x10ab7
db 5, 8 ; rows, columns
db 2 ; horizontal spacing
dbw 0, NumBalls
- dbw BANK(PlaceMenuItemName), PlaceMenuItemName
- dbw BANK(PlaceMenuItemQuantity), PlaceMenuItemQuantity
- dbw BANK(Function244c3), Function244c3
+ dba PlaceMenuItemName
+ dba PlaceMenuItemQuantity
+ dba Function244c3
; 10ac7
MenuDataHeader_0x10ac7: ; 0x10ac7
@@ -1628,9 +1628,9 @@ MenuData2_0x10acf: ; 0x10acf
db 5, 8 ; rows, columns
db 2 ; horizontal spacing
dbw 0, NumBalls
- dbw BANK(PlaceMenuItemName), PlaceMenuItemName
- dbw BANK(PlaceMenuItemQuantity), PlaceMenuItemQuantity
- dbw BANK(Function244c3), Function244c3
+ dba PlaceMenuItemName
+ dba PlaceMenuItemQuantity
+ dba Function244c3
; 10adf
UnknownText_0x10adf: ; 0x10adf
diff --git a/engine/party_menu.asm b/engine/party_menu.asm
new file mode 100644
index 000000000..4d50ee8e4
--- /dev/null
+++ b/engine/party_menu.asm
@@ -0,0 +1,944 @@
+SelectMonFromParty: ; 50000
+ call DisableSpriteUpdates
+ xor a
+ ld [PartyMenuActionText], a
+ call ClearBGPalettes
+ call Function5003f
+ call WaitBGMap
+ call SetPalettes
+ call DelayFrame
+ call PartyMenuSelect
+ call Function2b74
+ ret
+; 5001d
+
+
+Function5001d: ; 5001d
+ ld a, b
+ ld [PartyMenuActionText], a
+ call DisableSpriteUpdates
+ call ClearBGPalettes
+ call Function5003f
+ call WaitBGMap
+ ld b, $a
+ call GetSGBLayout
+ call SetPalettes
+ call DelayFrame
+ call PartyMenuSelect
+ call Function2b74
+ ret
+; 5003f
+
+Function5003f: ; 5003f
+ call Function5004f
+ call Function50405
+ call Function503e0
+ call WritePartyMenuTilemap
+ call PrintPartyMenuText
+ ret
+; 5004f
+
+Function5004f: ; 5004f
+ call LoadFontsBattleExtra
+ callab Function8ad1 ; engine/color.asm
+ callab InefficientlyClear121BytesAtwc300
+ ret
+; 5005f
+
+
+WritePartyMenuTilemap: ; 0x5005f
+ ld hl, Options
+ ld a, [hl]
+ push af
+ set 4, [hl] ; Disable text delay
+ xor a
+ ld [hBGMapMode], a
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, " "
+ call ByteFill ; blank the tilemap
+ call GetPartyMenuTilemapPointers ; This reads from a pointer table???
+.loop
+ ld a, [hli]
+ cp $ff
+ jr z, .end ; 0x5007a $8
+ push hl
+ ld hl, .Jumptable
+ rst JumpTable
+ pop hl
+ jr .loop ; 0x50082 $f3
+.end
+ pop af
+ ld [Options], a
+ ret
+; 0x50089
+
+.Jumptable: ; 50089
+ dw PlacePartyNicknames
+ dw PlacePartyHPBar
+ dw PlacePartyMenuHPDigits
+ dw PlacePartyMonLevel
+ dw PlacePartyMonStatus
+ dw PlacePartyMonTMHMCompatibility
+ dw PlacePartyMonEvoStoneCompatibility
+ dw PlacePartyMonGender
+ dw PlacePartyMonMobileBattleSelection
+; 5009b
+
+PlacePartyNicknames: ; 5009b
+ hlcoord 3, 1
+ ld a, [PartyCount]
+ and a
+ jr z, .end
+ ld c, a
+ ld b, $0
+.loop
+ push bc
+ push hl
+ push hl
+ ld hl, PartyMonNicknames
+ ld a, b
+ call GetNick
+ pop hl
+ call PlaceString
+ pop hl
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+
+.end
+rept 2
+ dec hl
+endr
+ ld de, .CANCEL
+ call PlaceString
+ ret
+; 500c8
+
+.CANCEL: ; 500c8
+ db "CANCEL@"
+; 500cf
+
+
+PlacePartyHPBar: ; 500cf
+ xor a
+ ld [wcda9], a
+ ld a, [PartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, $0
+ hlcoord 11, 2
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .skip
+ push hl
+ call PlacePartymonHPBar
+ pop hl
+ ld d, $6
+ ld b, $0
+ call DrawBattleHPBar
+ ld hl, wcd9b
+ ld a, [wcda9]
+ ld c, a
+ ld b, $0
+ add hl, bc
+ call SetHPPal
+ ld b, $fc
+ call GetSGBLayout
+
+.skip
+ ld hl, wcda9
+ inc [hl]
+ pop hl
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ld b, $a
+ call GetSGBLayout
+ ret
+; 50117
+
+PlacePartymonHPBar: ; 50117
+ ld a, b
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld hl, PartyMon1HP
+ call AddNTimes
+ ld a, [hli]
+ or [hl]
+ jr nz, .not_fainted
+ xor a
+ ld e, a
+ ld c, a
+ ret
+
+.not_fainted
+ dec hl
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld e, a
+ predef DrawPartyMenuHPBar
+ ret
+; 50138
+
+PlacePartyMenuHPDigits: ; 50138
+ ld a, [PartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, $0
+ hlcoord 13, 1
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .next
+ push hl
+ ld a, b
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld hl, PartyMon1HP
+ call AddNTimes
+ ld e, l
+ ld d, h
+ pop hl
+ push de
+ lb bc, 2, 3
+ call PrintNum
+ pop de
+ ld a, "/"
+ ld [hli], a
+rept 2
+ inc de
+endr
+ lb bc, 2, 3
+ call PrintNum
+
+.next
+ pop hl
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ret
+; 50176
+
+PlacePartyMonLevel: ; 50176
+ ld a, [PartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, 0
+ hlcoord 8, 2
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .next
+ push hl
+ ld a, b
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld hl, PartyMon1Level
+ call AddNTimes
+ ld e, l
+ ld d, h
+ pop hl
+ ld a, [de]
+ cp 100 ; This is distinct from MAX_LEVEL.
+ jr nc, .ThreeDigits
+ ld a, "<LV>"
+ ld [hli], a
+ lb bc, PRINTNUM_RIGHTALIGN | 1, 2
+ ; jr .okay
+.ThreeDigits
+ lb bc, PRINTNUM_RIGHTALIGN | 1, 3
+; .okay
+ call PrintNum
+
+.next
+ pop hl
+ ld de, SCREEN_WIDTH * 2
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ret
+; 501b2
+
+PlacePartyMonStatus: ; 501b2
+ ld a, [PartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, 0
+ hlcoord 5, 2
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .next
+ push hl
+ ld a, b
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld hl, PartyMon1Status
+ call AddNTimes
+ ld e, l
+ ld d, h
+ pop hl
+ call PlaceStatusString
+
+.next
+ pop hl
+ ld de, SCREEN_WIDTH * 2
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ret
+; 501e0
+
+PlacePartyMonTMHMCompatibility: ; 501e0
+ ld a, [PartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, 0
+ hlcoord 12, 2
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .next
+ push hl
+ ld hl, PartySpecies
+ ld e, b
+ ld d, 0
+ add hl, de
+ ld a, [hl]
+ ld [CurPartySpecies], a
+ predef CanLearnTMHMMove
+ pop hl
+ call .PlaceAbleNotAble
+ call PlaceString
+
+.next
+ pop hl
+ ld de, SCREEN_WIDTH * 2
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ret
+; 50215
+
+.PlaceAbleNotAble: ; 50215
+ ld a, c
+ and a
+ jr nz, .able
+ ld de, .string_not_able
+ ret
+
+.able
+ ld de, .string_able
+ ret
+; 50221
+
+.string_able: ; 50221
+ db "ABLE@"
+; 50226
+
+.string_not_able: ; 50226
+ db "NOT ABLE@"
+; 5022f
+
+
+PlacePartyMonEvoStoneCompatibility: ; 5022f
+ ld a, [PartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, 0
+ hlcoord 12, 2
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .next
+ push hl
+ ld a, b
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld hl, PartyMon1Species
+ call AddNTimes
+ ld a, [hl]
+ dec a
+ ld e, a
+ ld d, 0
+ ld hl, EvosAttacksPointers
+rept 2
+ add hl, de
+endr
+ call .DetermineCompatibility
+ pop hl
+ call PlaceString
+
+.next
+ pop hl
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ret
+; 50268
+
+.DetermineCompatibility: ; 50268
+ ld de, StringBuffer1
+ ld a, BANK(EvosAttacksPointers)
+ ld bc, 2
+ call FarCopyBytes
+ ld hl, StringBuffer1
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, StringBuffer1
+ ld a, BANK(EvosAttacks)
+ ld bc, $a
+ call FarCopyBytes
+ ld hl, StringBuffer1
+.loop2
+ ld a, [hli]
+ and a
+ jr z, .nope
+rept 2
+ inc hl
+endr
+ cp EVOLVE_ITEM
+ jr nz, .loop2
+rept 2
+ dec hl
+endr
+ ld a, [CurItem]
+ cp [hl]
+rept 2
+ inc hl
+endr
+ jr nz, .loop2
+ ld de, .string_able
+ ret
+
+.nope
+ ld de, .string_not_able
+ ret
+; 502a3
+
+.string_able: ; 502a3
+ db "ABLE@"
+; 502a8
+.string_not_able: ; 502a8
+ db "NOT ABLE@"
+; 502b1
+
+
+PlacePartyMonGender: ; 502b1
+ ld a, [PartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, 0
+ hlcoord 12, 2
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .next
+ ld [CurPartySpecies], a
+ push hl
+ ld a, b
+ ld [CurPartyMon], a
+ xor a
+ ld [MonType], a
+ call GetGender
+ ld de, .unknown
+ jr c, .got_gender
+ ld de, .male
+ jr nz, .got_gender
+ ld de, .female
+
+.got_gender
+ pop hl
+ call PlaceString
+
+.next
+ pop hl
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ret
+; 502ee
+
+.male: ; 502ee
+ db "♂…MALE@"
+; 502f5
+
+.female: ; 502f5
+ db "♀…FEMALE@"
+; 502fe
+
+.unknown: ; 502fe
+ db "…UNKNOWN@"
+; 50307
+
+
+PlacePartyMonMobileBattleSelection: ; 50307
+ ld a, [PartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, 0
+ hlcoord 12, 1
+.loop
+ push bc
+ push hl
+ ld de, .String_Sanka_Shinai
+ call PlaceString
+ pop hl
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ld a, l
+ ld e, PKMN_NAME_LENGTH
+ sub e
+ ld l, a
+ ld a, h
+ sbc $0
+ ld h, a
+ ld de, .String_Kettei_Yameru
+ call PlaceString
+ ld b, $3
+ ld c, $0
+ ld hl, wd002
+ ld a, [hl]
+.loop2
+ push hl
+ push bc
+ hlcoord 12, 1
+.loop3
+ and a
+ jr z, .done
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ dec a
+ jr .loop3
+
+.done
+ ld de, .String_Banme
+ push hl
+ call PlaceString
+ pop hl
+ pop bc
+ push bc
+ push hl
+ ld a, c
+ ld hl, .Strings_1_2_3
+ call GetNthString
+ ld d, h
+ ld e, l
+ pop hl
+ call PlaceString
+ pop bc
+ pop hl
+ inc hl
+ ld a, [hl]
+ inc c
+ dec b
+ ret z
+ jr .loop2
+; 5036b
+
+.String_Banme: ; 5036b
+ db " ばんめ @" ; Place
+; 50372
+.String_Sanka_Shinai: ; 50372
+ db "さんかしない@" ; Cancel
+; 50379
+.String_Kettei_Yameru: ; 50379
+ db "けってい やめる@" ; Quit
+; 50383
+.Strings_1_2_3: ; 50383
+ db "1@", "2@", "3@" ; 1st, 2nd, 3rd
+; 50389
+
+
+PartyMenuCheckEgg: ; 50389
+ ld a, PartySpecies % $100
+ add b
+ ld e, a
+ ld a, PartySpecies / $100
+ adc 0
+ ld d, a
+ ld a, [de]
+ cp EGG
+ ret
+; 50396
+
+GetPartyMenuTilemapPointers: ; 50396
+ ld a, [PartyMenuActionText]
+ and $f0
+ jr nz, .skip
+ ld a, [PartyMenuActionText]
+ and $f
+ ld e, a
+ ld d, 0
+ ld hl, .Pointers
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+.skip
+ ld hl, .Default
+ ret
+; 503b2
+
+.Pointers: ; 503b2
+ dw .Default
+ dw .Default
+ dw .Default
+ dw .TMHM
+ dw .Default
+ dw .EvoStone
+ dw .Gender
+ dw .Gender
+ dw .Default
+ dw .Mobile
+; 503c6
+
+.Default: db 0, 1, 2, 3, 4, $ff
+.TMHM: db 0, 5, 3, 4, $ff
+.EvoStone: db 0, 6, 3, 4, $ff
+.Gender: db 0, 7, 3, 4, $ff
+.Mobile: db 0, 8, 3, 4, $ff
+; 503e0
+
+
+Function503e0: ; 503e0
+ ld hl, PartyCount
+ ld a, [hli]
+ and a
+ ret z
+ ld c, a
+ xor a
+ ld [hObjectStructIndexBuffer], a
+.asm_503ea
+ push bc
+ push hl
+ ld hl, Function8e83f
+ ld a, BANK(Function8e83f)
+ ld e, $0
+ rst FarCall
+ ld a, [hObjectStructIndexBuffer]
+ inc a
+ ld [hObjectStructIndexBuffer], a
+ pop hl
+ pop bc
+ dec c
+ jr nz, .asm_503ea
+ callab Function8cf69
+ ret
+; 50405
+
+Function50405: ; 50405
+ xor a
+ ld [wd0e3], a
+ ld de, Unknown_5044f
+ call Function1bb1
+ ld a, [PartyCount]
+ inc a
+ ld [wcfa3], a
+ dec a
+ ld b, a
+ ld a, [wd0d8]
+ and a
+ jr z, .asm_50422
+ inc b
+ cp b
+ jr c, .asm_50424
+
+.asm_50422
+ ld a, $1
+
+.asm_50424
+ ld [MenuSelection2], a
+ ld a, $3
+ ld [wcfa8], a
+ ret
+; 5042d
+
+Function5042d: ; 0x5042d
+ ld de, Unknown_5044f
+ call Function1bb1
+ ld a, [PartyCount]
+ ld [wcfa3], a
+ ld b, a
+ ld a, [wd0d8]
+ and a
+ jr z, .asm_50444
+ inc b
+ cp b
+ jr c, .asm_50446
+.asm_50444
+ ld a, $1
+.asm_50446
+ ld [MenuSelection2], a
+ ld a, $3
+ ld [wcfa8], a
+ ret
+; 5044f (14:444f)
+
+Unknown_5044f: ; 5044f
+; cursor y
+; cursor x
+; list length
+; ?
+; bit 6: animate sprites bit 5: wrap around
+; ?
+; distance between items (hi: y, lo: x)
+; allowed buttons (mask)
+ db $01, $00, $00, $01, $60, $00, $20, $00
+; 50457
+
+PartyMenuSelect: ; 0x50457
+; sets carry if exitted menu.
+ call Function1bc9
+ call Function1bee
+ ld a, [PartyCount]
+ inc a
+ ld b, a
+ ld a, [MenuSelection2] ; menu selection?
+ cp b
+ jr z, .exitmenu ; CANCEL
+ ld [wd0d8], a
+ ld a, [hJoyLast]
+ ld b, a
+ bit 1, b
+ jr nz, .exitmenu ; B button?
+ ld a, [MenuSelection2]
+ dec a
+ ld [CurPartyMon], a
+ ld c, a
+ ld b, $0
+ ld hl, PartySpecies
+ add hl, bc
+ ld a, [hl]
+ ld [CurPartySpecies], a
+
+ ld de, SFX_READ_TEXT_2
+ call PlaySFX
+ call WaitSFX
+ and a
+ ret
+
+.exitmenu
+ ld de, SFX_READ_TEXT_2
+ call PlaySFX
+ call WaitSFX
+ scf
+ ret
+; 0x5049a
+
+
+PrintPartyMenuText: ; 5049a
+ hlcoord 0, 14
+ lb bc, 2, 18
+ call TextBox
+ ld a, [PartyCount]
+ and a
+ jr nz, .haspokemon
+ ld de, YouHaveNoPKMNString
+ jr .gotstring
+.haspokemon ; 504ae
+ ld a, [PartyMenuActionText]
+ and $f ; drop high nibble
+ ld hl, PartyMenuStrings
+ ld e, a
+ ld d, $0
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld d, [hl]
+ ld e, a
+.gotstring ; 504be
+ ld a, [Options]
+ push af
+ set 4, a ; disable text delay
+ ld [Options], a
+ hlcoord 1, 16 ; Coord
+ call PlaceString
+ pop af
+ ld [Options], a
+ ret
+; 0x504d2
+
+PartyMenuStrings: ; 0x504d2
+ dw ChooseAMonString
+ dw UseOnWhichPKMNString
+ dw WhichPKMNString
+ dw TeachWhichPKMNString
+ dw MoveToWhereString
+ dw UseOnWhichPKMNString
+ dw ChooseAMonString ; Probably used to be ChooseAFemalePKMNString
+ dw ChooseAMonString ; Probably used to be ChooseAMalePKMNString
+ dw ToWhichPKMNString
+
+ChooseAMonString: ; 0x504e4
+ db "Choose a #MON.@"
+UseOnWhichPKMNString: ; 0x504f3
+ db "Use on which <PK><MN>?@"
+WhichPKMNString: ; 0x50504
+ db "Which <PK><MN>?@"
+TeachWhichPKMNString: ; 0x5050e
+ db "Teach which <PK><MN>?@"
+MoveToWhereString: ; 0x5051e
+ db "Move to where?@"
+ChooseAFemalePKMNString: ; 0x5052d ; UNUSED
+ db "Choose a ♀<PK><MN>.@"
+ChooseAMalePKMNString: ; 0x5053b ; UNUSED
+ db "Choose a ♂<PK><MN>.@"
+ToWhichPKMNString: ; 0x50549
+ db "To which <PK><MN>?@"
+
+YouHaveNoPKMNString: ; 0x50556
+ db "You have no <PK><MN>!@"
+
+
+Function50566: ; 50566
+ ld a, [CurPartyMon]
+ ld hl, PartyMonNicknames
+ call GetNick
+ ld a, [PartyMenuActionText]
+ and $f
+ ld hl, Unknown_5057b
+ call Function505c1
+ ret
+; 5057b
+
+Unknown_5057b: ; 5057b
+ dw UnknownText_0x50594
+ dw UnknownText_0x5059e
+ dw UnknownText_0x505a3
+ dw UnknownText_0x505a8
+ dw UnknownText_0x50599
+ dw UnknownText_0x5058f
+ dw UnknownText_0x505ad
+ dw UnknownText_0x505b2
+ dw UnknownText_0x505b7
+ dw UnknownText_0x505bc
+; 5058f
+
+UnknownText_0x5058f: ; 0x5058f
+ ; recovered @ HP!
+ text_jump UnknownText_0x1bc0a2
+ db "@"
+; 0x50594
+
+UnknownText_0x50594: ; 0x50594
+ ; 's cured of poison.
+ text_jump UnknownText_0x1bc0bb
+ db "@"
+; 0x50599
+
+UnknownText_0x50599: ; 0x50599
+ ; 's rid of paralysis.
+ text_jump UnknownText_0x1bc0d2
+ db "@"
+; 0x5059e
+
+UnknownText_0x5059e: ; 0x5059e
+ ; 's burn was healed.
+ text_jump UnknownText_0x1bc0ea
+ db "@"
+; 0x505a3
+
+UnknownText_0x505a3: ; 0x505a3
+ ; was defrosted.
+ text_jump UnknownText_0x1bc101
+ db "@"
+; 0x505a8
+
+UnknownText_0x505a8: ; 0x505a8
+ ; woke up.
+ text_jump UnknownText_0x1bc115
+ db "@"
+; 0x505ad
+
+UnknownText_0x505ad: ; 0x505ad
+ ; 's health returned.
+ text_jump UnknownText_0x1bc123
+ db "@"
+; 0x505b2
+
+UnknownText_0x505b2: ; 0x505b2
+ ; is revitalized.
+ text_jump UnknownText_0x1bc13a
+ db "@"
+; 0x505b7
+
+UnknownText_0x505b7: ; 0x505b7
+ ; grew to level @ !@ @
+ text_jump UnknownText_0x1bc14f
+ db "@"
+; 0x505bc
+
+UnknownText_0x505bc: ; 0x505bc
+ ; came to its senses.
+ text_jump UnknownText_0x1bc16e
+ db "@"
+; 0x505c1
+
+
+Function505c1: ; 505c1
+ ld e, a
+ ld d, 0
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [Options]
+ push af
+ set 4, a
+ ld [Options], a
+ call PrintText
+ pop af
+ ld [Options], a
+ ret
+; 505da
diff --git a/engine/phone.asm b/engine/phone.asm
index 0ba5cf6e1..32481deaa 100644
--- a/engine/phone.asm
+++ b/engine/phone.asm
@@ -182,7 +182,7 @@ ChooseRandomCaller: ; 900bf (24:40bf)
; Sample a random number between 0 and 31.
ld c, a
call Random
- ld a, [hRandomAdd] ; $ff00+$e1
+ ld a, [hRandomAdd]
swap a
and $1f
; Compute that number modulo the number of available callers.
diff --git a/engine/phone_scripts.asm b/engine/phone_scripts.asm
index 5d8afd028..33541e224 100644
--- a/engine/phone_scripts.asm
+++ b/engine/phone_scripts.asm
@@ -3154,38 +3154,3 @@ String_be657: db "Dad@"
String_be65b: db "Sister@"
String_be662: db "Brother@"
-
-TalkToTrainerScript:: ; 0xbe66a
- faceplayer
- trainerstatus $2
- iftrue AlreadyBeatenTrainerScript
- loadtrainerdata
- playrammusic
- jump StartBattleWithMapTrainerScript
-; 0xbe675
-
-SeenByTrainerScript:: ; 0xbe675
- loadtrainerdata
- playrammusic
- showemote EMOTE_SHOCK, LAST_TALKED, 30
- callasm Function831e
- applymovement2 MovementBuffer
- writepersonxy LAST_TALKED
- faceperson PLAYER, LAST_TALKED
- jump StartBattleWithMapTrainerScript
-; 0xbe68a
-
-StartBattleWithMapTrainerScript: ; 0xbe68a
- loadfont
- trainertext $0
- closetext
- loadmovesprites
- loadtrainerdata
- startbattle
- returnafterbattle
- trainerstatus 1
- loadvar wd04d, -1
-
-AlreadyBeatenTrainerScript:
- scripttalkafter
-; 0xbe699
diff --git a/engine/pokedex.asm b/engine/pokedex.asm
index dd58e940d..8d5680ded 100644
--- a/engine/pokedex.asm
+++ b/engine/pokedex.asm
@@ -22,7 +22,7 @@ Pokedex: ; 40000
ld [hInMenu], a
xor a
- ld [$ffde], a
+ ld [hMapAnims], a
call InitPokedex
call DelayFrame
@@ -60,7 +60,7 @@ Pokedex: ; 40000
; 40063
InitPokedex: ; 40063
- call WhiteBGMap
+ call ClearBGPalettes
call ClearSprites
call ClearTileMap
call Function414b7
@@ -209,7 +209,7 @@ Function40136: ; 40136 (10:4136)
Function4013c: ; 4013c (10:413c)
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call ClearSprites
xor a
hlcoord 0, 0, AttrMap
@@ -226,7 +226,7 @@ Function4013c: ; 4013c (10:413c)
call Function41af7
call Function4074c
ld a, $5
- ld [hSCX], a ; $ff00+$cf
+ ld [hSCX], a
ld a, [wc7d4]
cp $1
ld a, $4a
@@ -234,9 +234,9 @@ Function4013c: ; 4013c (10:413c)
ld a, $47
.asm_4017b
- ld [hWX], a ; $ff00+$d1
+ ld [hWX], a
xor a
- ld [hWY], a ; $ff00+$d2
+ ld [hWY], a
call WaitBGMap
call Function41af7
ld a, $ff
@@ -272,7 +272,7 @@ Function401ae: ; 401ae (10:41ae)
ret nc
call Function41148
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call Function40b0f
call Function41ad7
call Function41af7
@@ -293,9 +293,9 @@ Function401ae: ; 401ae (10:41ae)
ld a, $7
ld [wJumptableIndex], a
xor a
- ld [hSCX], a ; $ff00+$cf
+ ld [hSCX], a
ld a, $a7
- ld [hWX], a ; $ff00+$d1
+ ld [hWX], a
call DelayFrame
ret
@@ -304,9 +304,9 @@ Function401ae: ; 401ae (10:41ae)
ld a, $5
ld [wJumptableIndex], a
xor a
- ld [hSCX], a ; $ff00+$cf
+ ld [hSCX], a
ld a, $a7
- ld [hWX], a ; $ff00+$d1
+ ld [hWX], a
call DelayFrame
ret
@@ -320,7 +320,7 @@ Function40217: ; 40217 (10:4217)
xor a
ld [wPokedexStatus], a
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call ClearSprites
call Function41478
call Function407fd
@@ -331,7 +331,7 @@ Function40217: ; 40217 (10:4217)
call Function40ba0
call WaitBGMap
ld a, $a7
- ld [hWX], a ; $ff00+$d1
+ ld [hWX], a
call Function40bb1
ld [CurPartySpecies], a
ld a, $4
@@ -392,7 +392,7 @@ Function402aa: ; 402aa (10:42aa)
xor a
ld [wPokedexStatus], a
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call Function407fd
call Function4134f
call Function41478
@@ -487,7 +487,7 @@ Function4034f: ; 4034f
ld [wcf64], a
pop af
ld [wcf65], a
- call WhiteBGMap
+ call ClearBGPalettes
call DisableLCD
call Function414fb
call Function4038d
@@ -509,7 +509,7 @@ Function4038d: ; 4038d
Function4039d: ; 4039d (10:439d)
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call ClearSprites
call Function4087c
call Function4134f
@@ -615,7 +615,7 @@ Function4043a: ; 4043a (10:443a)
Function40443: ; 40443 (10:4443)
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call ClearSprites
call Function408f0
call Function4134f
@@ -723,7 +723,7 @@ Function40501: ; 40501
Function4050a: ; 4050a (10:450a)
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
xor a
hlcoord 0, 0, AttrMap
ld bc, $168
@@ -739,11 +739,11 @@ Function4050a: ; 4050a (10:450a)
call Function41af7
call Function40962
ld a, $5
- ld [hSCX], a ; $ff00+$cf
+ ld [hSCX], a
ld a, $4a
- ld [hWX], a ; $ff00+$d1
+ ld [hWX], a
xor a
- ld [hWY], a ; $ff00+$d2
+ ld [hWY], a
call WaitBGMap
call Function41af7
callba Function1de1d1
@@ -768,7 +768,7 @@ Function40562: ; 40562 (10:4562)
ret nc
call Function41281
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call Function40b0f
call Function41ad7
call Function41af7
@@ -797,9 +797,9 @@ Function40562: ; 40562 (10:4562)
ld a, $5
ld [wJumptableIndex], a
xor a
- ld [hSCX], a ; $ff00+$cf
+ ld [hSCX], a
ld a, $a7
- ld [hWX], a ; $ff00+$d1
+ ld [hWX], a
ret
Function405bd: ; 405bd (10:45bd)
@@ -838,7 +838,7 @@ Function405df: ; 405df (10:45df)
ld hl, PokedexLZ
ld de, VTiles2 tile $31
lb bc, BANK(PokedexLZ), $3a
- call Functione73
+ call DecompressRequest2bpp
.asm_4060f
ret
@@ -876,14 +876,14 @@ Function40610: ; 40610 (10:4610)
.asm_40635
push af
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
pop af
call Function40654
call Function41a58
call Function40658
callba Functionfba2e
ld a, $1
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
call DelayFrame
call DelayFrame
ret
@@ -1773,7 +1773,7 @@ String_40ee4: ; 40ee4
Function40f08: ; 40f08 (10:4f08)
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
hlcoord 0, 12
ld bc, $412
call Function40ad5
@@ -1781,7 +1781,7 @@ Function40f08: ; 40f08 (10:4f08)
hlcoord 1, 14
call PlaceString
ld a, $1
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
ld c, $40
call DelayFrames
ld de, SFX_CHANGE_DEX_MODE
@@ -1861,7 +1861,7 @@ Function40f84: ; 40f84
Function40fa8: ; 40fa8 (10:4fa8)
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
hlcoord 9, 3
ld bc, $408
ld a, $7f
@@ -1873,7 +1873,7 @@ Function40fa8: ; 40fa8 (10:4fa8)
hlcoord 9, 6
call Function40fcd
ld a, $1
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
ret
Function40fcd: ; 40fcd (10:4fcd)
@@ -2363,16 +2363,16 @@ Function413fe: ; 413fe (10:53fe)
jp FillBoxWithByte
Function41401: ; 41401 (10:5401)
- ld a, [rSVBK] ; $ff00+$70
+ ld a, [rSVBK]
push af
ld a, $5
- ld [rSVBK], a ; $ff00+$70
- ld hl, Unkn1Pals
+ ld [rSVBK], a
+ ld hl, wMapPals
ld bc, $40
xor a
call ByteFill
pop af
- ld [rSVBK], a ; $ff00+$70
+ ld [rSVBK], a
Function41415: ; 41415
ld a, $ff
@@ -2487,7 +2487,7 @@ Function414b7: ; 414b7
xor a
call ByteFill
call Function414fb
- call Functione5f
+ call LoadFontsExtra
ld hl, VTiles2 tile $60
ld bc, $0200
call Function41504
@@ -2511,7 +2511,7 @@ Function414b7: ; 414b7
ret
Function414fb: ; 414fb
- call Functione51
+ call LoadStandardFont
ld hl, VTiles1
ld bc, $0800
diff --git a/engine/predef.asm b/engine/predef.asm
index 9fa26875a..6079b48a4 100644
--- a/engine/predef.asm
+++ b/engine/predef.asm
@@ -34,16 +34,16 @@ PredefPointers:: ; 856b
add_predef Predef1
add_predef HealParty
add_predef FlagPredef
- add_predef Functionc699
+ add_predef DrawPartyMenuHPBar
add_predef FillPP
add_predef TryAddMonToParty
add_predef Functionda96
add_predef SentGetPkmnIntoFromBox
add_predef SentPkmnIntoBox
add_predef GiveEgg
- add_predef Functionc6e0
+ add_predef AnimateHPBar
add_predef CalcPkmnStats
- add_predef Functione17b
+ add_predef CalcPkmnStatC
add_predef CanLearnTMHMMove
add_predef GetTMHMMove
add_predef Function28eef ; $ 10
@@ -54,8 +54,8 @@ PredefPointers:: ; 856b
add_predef UpdateEnemyHUD
add_predef StartBattle
add_predef FillInExpBar
- add_predef Function3f43d ; $18
- add_predef Function3f47c
+ add_predef GetMonBackpic ; $18
+ add_predef GetMonFrontpic
add_predef LearnLevelMoves
add_predef FillMoves
add_predef Function421e6
@@ -63,7 +63,7 @@ PredefPointers:: ; 856b
add_predef Function28f24
add_predef CopyPkmnToTempMon
add_predef ListMoves ; $20
- add_predef Function50d2e
+ add_predef PlaceNonFaintStatus
add_predef Function50cdb
add_predef Function50c50
add_predef GetGender
@@ -95,13 +95,13 @@ PredefPointers:: ; 856b
add_predef Function5108b
add_predef GetTrainerPic
add_predef DecompressPredef ; $40
- add_predef Function347d3
+ add_predef CheckTypeMatchup
add_predef ConvertMon_1to2
add_predef Functionfb877
- add_predef Functiond0000
- add_predef Function50d0a
- add_predef Functiond00a3
- add_predef Functiond008e
+ add_predef AnimateMon_Slow_Normal
+ add_predef PlaceStatusString
+ add_predef LoadMonAnimation
+ add_predef AnimateFrontpic
add_predef Functiond0669 ; $48
add_predef Functiond066e
dbw $ff, Function2d43 ; ????
diff --git a/engine/radio.asm b/engine/radio.asm
index d833b66f5..2ee550197 100644
--- a/engine/radio.asm
+++ b/engine/radio.asm
@@ -1,7 +1,7 @@
PlayRadioShow: ; b8612
; If we're already in the radio program proper, we don't need to be here.
- ld a, [wd002]
- cp 8
+ ld a, [wCurrentRadioLine]
+ cp POKE_FLUTE_RADIO
jr nc, .ok
; If Team Rocket is not occupying the radio tower, we don't need to be here.
ld a, [StatusFlags2]
@@ -12,11 +12,11 @@ PlayRadioShow: ; b8612
and a
jr nz, .ok
; Team Rocket broadcasts on all stations.
- ld a, 7
- ld [wd002], a
+ ld a, ROCKET_RADIO
+ ld [wCurrentRadioLine], a
.ok
-; Jump to the currently loaded station. The index to which we need to jump is in wd002.
- ld a, [wd002]
+; Jump to the currently loaded station. The index to which we need to jump is in wCurrentRadioLine.
+ ld a, [wCurrentRadioLine]
ld e, a
ld d, 0
ld hl, RadioJumptable
@@ -128,16 +128,16 @@ RadioJumptable: ; b863a (2e:463a)
PrintRadioLine: ; b86ea (2e:46ea)
- ld [wd003], a
- ld hl, wd00c
- ld a, [wd005]
- cp $2
+ ld [wNextRadioLine], a
+ ld hl, wRadioText
+ ld a, [wNumRadioLinesPrinted]
+ cp 2
jr nc, .print
inc hl
- ld [hl], $0
+ ld [hl], "<START>"
inc a
- ld [wd005], a
- cp $2
+ ld [wNumRadioLinesPrinted], a
+ cp 2
jr nz, .print
bccoord 1, 16
call PlaceWholeStringInBoxAtOnce
@@ -146,9 +146,9 @@ PrintRadioLine: ; b86ea (2e:46ea)
call PrintTextBoxText
.skip
ld a, RADIO_SCROLL
- ld [wd002], a
+ ld [wCurrentRadioLine], a
ld a, 100
- ld [wd004], a
+ ld [wRadioTextDelay], a
ret
; b8718 (2e:4718)
@@ -170,23 +170,23 @@ ReplacePeriodsWithSpaces: ; b8718
; b8728
RadioScroll: ; b8728 (2e:4728)
- ld hl, wd004
+ ld hl, wRadioTextDelay
ld a, [hl]
and a
jr z, .proceed
dec [hl]
ret
.proceed
- ld a, [wd003]
- ld [wd002], a
- ld a, [wd005]
+ ld a, [wNextRadioLine]
+ ld [wCurrentRadioLine], a
+ ld a, [wNumRadioLinesPrinted]
cp 1
call nz, CopyBottomLineToTopLine
jp ClearBottomLine
OaksPkmnTalk1: ; b8742 (2e:4742)
- ld a, $5
- ld [wd006], a
+ ld a, 5
+ ld [wOaksPkmnTalkSegmentCounter], a
call StartRadioStation
ld hl, UnknownText_0xb8820
ld a, OAKS_POKEMON_TALK_2
@@ -274,7 +274,7 @@ endr
ld [CurPartySpecies], a
call GetPokemonName
ld hl, StringBuffer1
- ld de, wd050
+ ld de, wOaksPkmnTalkPkmnNameBuffer
ld bc, PKMN_NAME_LENGTH
call CopyBytes
; Now that we've chosen our wild Pokemon,
@@ -290,7 +290,7 @@ endr
.overflow
pop bc
- ld a, $0
+ ld a, OAKS_POKEMON_TALK
jp PrintRadioLine
; b87f2 (2e:47f2)
@@ -361,7 +361,7 @@ UnknownText_0xb8839: ; 0xb8839
OaksPkmnTalk7: ; b883e (2e:483e)
ld a, [CurPartySpecies]
- ld [wd265], a
+ ld [wNamedObjectIndexBuffer], a
call GetPokemonName
ld hl, UnknownText_0xb884f
ld a, OAKS_POKEMON_TALK_8
@@ -517,13 +517,13 @@ endr
ld a, [hli]
ld h, [hl]
ld l, a
- ld a, [wd006]
+ ld a, [wOaksPkmnTalkSegmentCounter]
dec a
- ld [wd006], a
+ ld [wOaksPkmnTalkSegmentCounter], a
ld a, OAKS_POKEMON_TALK_4
jr nz, .ok
- ld a, $5
- ld [wd006], a
+ ld a, 5
+ ld [wOaksPkmnTalkSegmentCounter], a
ld a, OAKS_POKEMON_TALK_10
.ok
jp NextRadioLine
@@ -652,9 +652,9 @@ OaksPkmnTalk10: ; b896e (2e:496e)
ld hl, UnknownText_0xb898e
call PrintText
ld a, OAKS_POKEMON_TALK_11
- ld [wd002], a
+ ld [wCurrentRadioLine], a
ld a, 100
- ld [wd004], a
+ ld [wRadioTextDelay], a
ret
; b898e (2e:498e)
@@ -669,7 +669,7 @@ UnknownText_0xb8993: ; 0xb8993
; 0xb8994
OaksPkmnTalk11: ; b8994 (2e:4994)
- ld hl, wd004
+ ld hl, wRadioTextDelay
dec [hl]
ret nz
hlcoord 9, 14
@@ -683,7 +683,7 @@ OaksPkmnTalk11: ; b8994 (2e:4994)
; b89a9
OaksPkmnTalk12: ; b89a9 (2e:49a9)
- ld hl, wd004
+ ld hl, wRadioTextDelay
dec [hl]
ret nz
hlcoord 1, 16
@@ -697,7 +697,7 @@ OaksPkmnTalk12: ; b89a9 (2e:49a9)
; b89c6
OaksPkmnTalk13: ; b89c6 (2e:49c6)
- ld hl, wd004
+ ld hl, wRadioTextDelay
dec [hl]
ret nz
hlcoord 12, 16
@@ -711,7 +711,7 @@ OaksPkmnTalk13: ; b89c6 (2e:49c6)
; b89d7
OaksPkmnTalk14: ; b89d7 (2e:49d7)
- ld hl, wd004
+ ld hl, wRadioTextDelay
dec [hl]
ret nz
ld de, $1d
@@ -719,13 +719,13 @@ OaksPkmnTalk14: ; b89d7 (2e:49d7)
ld hl, .terminator
call PrintText
ld a, OAKS_POKEMON_TALK_4
- ld [wd003], a
+ ld [wNextRadioLine], a
xor a
- ld [wd005], a
+ ld [wNumRadioLinesPrinted], a
ld a, RADIO_SCROLL
- ld [wd002], a
+ ld [wCurrentRadioLine], a
ld a, 10
- ld [wd004], a
+ ld [wRadioTextDelay], a
ret
; b89ff (2e:49ff)
@@ -734,9 +734,9 @@ OaksPkmnTalk14: ; b89d7 (2e:49d7)
; 0xb8a00
PlaceRadioString: ; b8a00 (2e:4a00)
- ld [wd002], a
+ ld [wCurrentRadioLine], a
ld a, 100
- ld [wd004], a
+ ld [wRadioTextDelay], a
jp PlaceString
CopyBottomLineToTopLine: ; b8a0b (2e:4a0b)
@@ -747,11 +747,11 @@ CopyBottomLineToTopLine: ; b8a0b (2e:4a0b)
ClearBottomLine: ; b8a17 (2e:4a17)
hlcoord 1, 15
- ld bc, $12
+ ld bc, SCREEN_WIDTH - 2
ld a, " "
call ByteFill
hlcoord 1, 16
- ld bc, $12
+ ld bc, SCREEN_WIDTH - 2
ld a, " "
jp ByteFill
@@ -784,7 +784,7 @@ PokedexShow1: ; b8a46 (2e:4a46)
call StartRadioStation
.loop
call Random
- cp CELEBI
+ cp NUM_POKEMON
jr nc, .loop
ld c, a
push bc
@@ -795,7 +795,7 @@ PokedexShow1: ; b8a46 (2e:4a46)
inc c
ld a, c
ld [CurPartySpecies], a
- ld [wd265], a
+ ld [wNamedObjectIndexBuffer], a
call GetPokemonName
ld hl, UnknownText_0xb8b30
ld a, POKEDEX_SHOW_2
@@ -817,8 +817,8 @@ endr
push hl
call CopyDexEntryPart1
dec hl
- ld [hl], $57
- ld hl, wd26b
+ ld [hl], "<DONE>"
+ ld hl, wPokedexShowPointerAddr
call CopyRadioTextToRAM
pop hl
pop af
@@ -827,9 +827,9 @@ rept 4
inc hl
endr
ld a, l
- ld [wd26b], a
+ ld [wPokedexShowPointerAddr], a
ld a, h
- ld [wd26c], a
+ ld [wPokedexShowPointerAddr + 1], a
ld a, POKEDEX_SHOW_3
jp PrintRadioLine
@@ -864,17 +864,17 @@ PokedexShow8: ; b8acc (2e:4acc)
jp PrintRadioLine
CopyDexEntry: ; b8ad4 (2e:4ad4)
- ld a, [wd26b]
+ ld a, [wPokedexShowPointerAddr]
ld l, a
- ld a, [wd26c]
+ ld a, [wPokedexShowPointerAddr + 1]
ld h, a
- ld a, [wd26d]
+ ld a, [wPokedexShowPointerBank]
push af
push hl
call CopyDexEntryPart1
dec hl
ld [hl], "<DONE>"
- ld hl, wd26b
+ ld hl, wPokedexShowPointerAddr
call CopyRadioTextToRAM
pop hl
pop af
@@ -882,10 +882,10 @@ CopyDexEntry: ; b8ad4 (2e:4ad4)
ret
CopyDexEntryPart1: ; b8af3 (2e:4af3)
- ld de, wd26d
+ ld de, wPokedexShowPointerBank
ld bc, SCREEN_WIDTH - 1
call FarCopyBytes
- ld hl, wd26b
+ ld hl, wPokedexShowPointerAddr
ld [hl], "<START>"
inc hl
ld [hl], "<LINE>"
@@ -914,11 +914,11 @@ CopyDexEntryPart2: ; b8b11 (2e:4b11)
jr nz, .loop
.okay
ld a, l
- ld [wd26b], a
+ ld [wPokedexShowPointerAddr], a
ld a, h
- ld [wd26c], a
+ ld [wPokedexShowPointerAddr + 1], a
ld a, d
- ld [wd26d], a
+ ld [wPokedexShowPointerBank], a
ret
; b8b30 (2e:4b30)
@@ -1302,9 +1302,9 @@ PeoplePlaces4: ; People
jp NextRadioLine
; b8d3e (2e:4d3e)
-.E4Names: db WILL, BRUNO, KAREN, KOGA, CHAMPION ; $0b, $0d, $0e, $0f, $10
-.KantoLeaderNames: db BROCK, MISTY, LT_SURGE, ERIKA, JANINE, SABRINA, BLAINE, BLUE ; $11, $12, $13, $15, $1a, $23, $2e, $40
-.MiscNames: db RIVAL1, POKEMON_PROF, CAL, RIVAL2, RED ; $09, $0a, $0c, $2a, $3f
+.E4Names: db WILL, BRUNO, KAREN, KOGA, CHAMPION
+.KantoLeaderNames: db BROCK, MISTY, LT_SURGE, ERIKA, JANINE, SABRINA, BLAINE, BLUE
+.MiscNames: db RIVAL1, POKEMON_PROF, CAL, RIVAL2, RED
db -1
; b8d51
@@ -1507,11 +1507,11 @@ endr
ld l, a
call CopyRadioTextToRAM
call Random
- cp $a ; 6.25 percent
+ cp 4 percent
ld a, PLACES_AND_PEOPLE
jr c, .ok
call Random
- cp $7b ; 48 percent
+ cp 1 + 48 percent
ld a, PLACES_AND_PEOPLE_4 ; People
jr c, .ok
ld a, PLACES_AND_PEOPLE_6 ; Places
@@ -1653,41 +1653,41 @@ UnknownText_0xb8ef2: ; 0xb8ef2
PokeFluteRadio: ; b8ef7 (2e:4ef7)
call StartRadioStation
ld a, 1
- ld [wd005], a
+ ld [wNumRadioLinesPrinted], a
ret
UnownRadio: ; b8f00 (2e:4f00)
call StartRadioStation
ld a, 1
- ld [wd005], a
+ ld [wNumRadioLinesPrinted], a
ret
EvolutionRadio: ; b8f09 (2e:4f09)
call StartRadioStation
ld a, 1
- ld [wd005], a
+ ld [wNumRadioLinesPrinted], a
ret
BuenasPassword1: ; b8f12 (2e:4f12)
; Determine if we need to be here
- call BuenasPasswordCheckMidnight
+ call BuenasPasswordCheckTime
jp nc, .PlayPassword
- ld a, [wd005]
+ ld a, [wNumRadioLinesPrinted]
and a
jp z, BuenasPassword20
jp BuenasPassword8
.PlayPassword: ; b8f22 (2e:4f22)
call StartRadioStation
- ld a, [hBGMapMode] ; $ff00+$d4
+ ld a, [hBGMapMode]
push af
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
ld de, String_b9171
hlcoord 2, 9
call PlaceString
pop af
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
ld hl, UnknownText_0xb9182
ld a, BUENAS_PASSWORD_2
jp NextRadioLine
@@ -1698,14 +1698,14 @@ BuenasPassword2: ; b8f3f (2e:4f3f)
jp NextRadioLine
BuenasPassword3: ; b8f47 (2e:4f47)
- call BuenasPasswordCheckMidnight
+ call BuenasPasswordCheckTime
ld hl, UnknownText_0xb918c
jp c, BuenasPasswordAfterMidnight
ld a, BUENAS_PASSWORD_4
jp NextRadioLine
BuenasPassword4: ; b8f55 (2e:4f55)
- call BuenasPasswordCheckMidnight
+ call BuenasPasswordCheckTime
jp c, BuenasPassword8
ld a, [wBuenasPassword]
; If we already generated the password today, we don't need to generate a new one.
@@ -1716,7 +1716,7 @@ BuenasPassword4: ; b8f55 (2e:4f55)
.greater_than_11
call Random
and $f
- cp $b
+ cp NUM_PASSWORD_CATEGORIES
jr nc, .greater_than_11
; Store it in the high nybble of e.
swap a
@@ -1725,7 +1725,7 @@ BuenasPassword4: ; b8f55 (2e:4f55)
.greater_than_three
call Random
and $3
- cp $3
+ cp NUM_PASSWORDS_PER_CATEGORY
jr nc, .greater_than_three
; The high nybble of wBuenasPassword will now contain the password group index, and the low nybble contains the actual password.
add e
@@ -1808,7 +1808,7 @@ endr
ld l, c
add hl, de
ld a, [hl]
- ld [wd265], a
+ ld [wNamedObjectIndexBuffer], a
ret
.RawString: ; b8fde (2e:4fde)
@@ -1874,7 +1874,7 @@ BuenasPassword6: ; b90a4 (2e:50a4)
jp NextRadioLine
BuenasPassword7: ; b90ac (2e:50ac)
- call BuenasPasswordCheckMidnight
+ call BuenasPasswordCheckTime
ld hl, UnknownText_0xb91a0
jr c, BuenasPasswordAfterMidnight
ld a, BUENAS_PASSWORD
@@ -1951,37 +1951,37 @@ BuenasPassword19: ; b9122 (2e:5122)
jp NextRadioLine
BuenasPassword20: ; b912a (2e:512a)
- ld a, [hBGMapMode] ; $ff00+$d4
+ ld a, [hBGMapMode]
push af
callba NoRadioMusic
callba NoRadioName
pop af
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
ld hl, WeeklyFlags
res 7, [hl]
- ld a, $4
- ld [wd002], a
+ ld a, BUENAS_PASSWORD
+ ld [wCurrentRadioLine], a
xor a
- ld [wd005], a
+ ld [wNumRadioLinesPrinted], a
ld hl, UnknownText_0xb91d7
ld a, BUENAS_PASSWORD_21
jp NextRadioLine
BuenasPassword21: ; b9152 (2e:5152)
- ld a, $4
- ld [wd002], a
+ ld a, BUENAS_PASSWORD
+ ld [wCurrentRadioLine], a
xor a
- ld [wd005], a
- call BuenasPasswordCheckMidnight
+ ld [wNumRadioLinesPrinted], a
+ call BuenasPasswordCheckTime
jp nc, BuenasPassword1
ld hl, UnknownText_0xb91d7
ld a, BUENAS_PASSWORD_21
jp NextRadioLine
-BuenasPasswordCheckMidnight: ; b9169 (2e:5169)
+BuenasPasswordCheckTime: ; b9169 (2e:5169)
call UpdateTime
- ld a, [hHours] ; $ff00+$94
- cp $12
+ ld a, [hHours]
+ cp 18 ; 6 PM
ret
; b9171 (2e:5171)
@@ -2100,19 +2100,19 @@ UnknownText_0xb91d7: ; 0xb91d7
CopyRadioTextToRAM: ; b91dc (2e:51dc)
ld a, [hl]
cp TX_FAR
- jp z, FarJumpText
- ld de, wd00c
+ jp z, FarCopyRadioText
+ ld de, wRadioText
ld bc, SCREEN_WIDTH * 2
jp CopyBytes
StartRadioStation: ; b91eb (2e:51eb)
- ld a, [wd005]
+ ld a, [wNumRadioLinesPrinted]
and a
ret nz
call RadioTerminator
call PrintText
ld hl, RadioChannelSongs
- ld a, [wd002]
+ ld a, [wCurrentRadioLine]
ld c, a
ld b, 0
rept 2
diff --git a/engine/radio2.asm b/engine/radio2.asm
index 039631130..1d07c904c 100644
--- a/engine/radio2.asm
+++ b/engine/radio2.asm
@@ -371,7 +371,7 @@ NoRadioStation: ; 91888 (24:5888)
ld [wc6da], a
ld [wc6db], a
ld a, $1
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
ret
NoRadioMusic: ; 9189d (24:589d)
@@ -383,7 +383,7 @@ NoRadioMusic: ; 9189d (24:589d)
NoRadioName: ; 918a9 (24:58a9)
xor a
- ld [hBGMapMode], a ; $ff00+$d4
+ ld [hBGMapMode], a
hlcoord 1, 8
lb bc, 3, 18
call ClearBox
diff --git a/engine/save.asm b/engine/save.asm
index fa9aeda12..de11a8133 100644
--- a/engine/save.asm
+++ b/engine/save.asm
@@ -1,5 +1,5 @@
Function14a1a: ; 14a1a
- call LoadMenuDataHeader_0x1d75
+ call LoadStandardMenuDataHeader
callba Function5e9a
call SpeechTextBox
call UpdateSprites
@@ -30,7 +30,7 @@ Function14a58: ; 14a58
call Function14e13
call SaveBackupPokemonData
call SaveBackupChecksum
- callba Function44725
+ callba BackupScratchmons
callba Function1406a
call ClearWRAMStateAfterSave
ret
@@ -106,8 +106,8 @@ Function14ad5: ; 14ad5
call SaveBackupPlayerData
call SaveBackupPokemonData
call SaveBackupChecksum
- callba Function44725
- callba Function106187
+ callba BackupScratchmons
+ callba BackupMobileEventIndex
callba Function1406a
call LoadBox
call ClearWRAMStateAfterSave
@@ -212,7 +212,7 @@ SaveTheGame_yesorno: ; 14baf
call LoadMenuTextBox
lb bc, 0, 7
call PlaceYesNoBox
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
dec a
call WriteBackup
push af
@@ -284,8 +284,8 @@ SaveGameData_: ; 14c10
call SaveBackupPokemonData
call SaveBackupChecksum
call UpdateStackTop
- callba Function44725
- callba Function106187
+ callba BackupScratchmons
+ callba BackupMobileEventIndex
callba Function1406a
ld a, BANK(s1_be45)
call GetSRAMBank
@@ -630,8 +630,8 @@ TryLoadSaveFile: ; 14ea5 (5:4ea5)
call LoadPlayerData
call LoadPokemonData
call LoadBox
- callba Function44745
- callba Function10619d
+ callba RestoreScratchmons
+ callba RestoreMobileEventIndex
callba Function1050ea
call ValidateBackupSave
call SaveBackupOptions
@@ -647,8 +647,8 @@ TryLoadSaveFile: ; 14ea5 (5:4ea5)
call LoadBackupPlayerData
call LoadBackupPokemonData
call LoadBox
- callba Function44745
- callba Function10619d
+ callba RestoreScratchmons
+ callba RestoreMobileEventIndex
callba Function1050ea
call ValidateSave
call SaveOptions
diff --git a/engine/scripting.asm b/engine/scripting.asm
index 5a3895038..ae5041bc2 100644
--- a/engine/scripting.asm
+++ b/engine/scripting.asm
@@ -236,7 +236,7 @@ ENDC
dw Script_halloffame
dw Script_credits
dw Script_warpfacing
- dw Script_storetext
+ dw Script_battletowertext
dw Script_displaylocation
dw Script_trainerclassname
dw Script_name
@@ -440,14 +440,14 @@ Script_closetext: ; 0x96ed9
Script_keeptextopen: ; 0x96edc
; script command 0x55
- ld a, [$ffd8]
+ ld a, [hOAMUpdate]
push af
ld a, $1
- ld [$ffd8], a
+ ld [hOAMUpdate], a
call WaitBGMap
call KeepTextOpen
pop af
- ld [$ffd8], a
+ ld [hOAMUpdate], a
ret
; 0x96eed
@@ -515,7 +515,7 @@ Script_interpretmenu2: ; 0x96f30
ld a, [ScriptBank]
ld hl, InterpretMenu2
rst FarCall
- ld a, [wcfa9]
+ ld a, [MenuSelection2]
jr nc, .ok
xor a
.ok
@@ -537,7 +537,7 @@ Script_interpretmenu: ; 0x96f41
ret
; 0x96f52
-Script_storetext: ; 0x96f52
+Script_battletowertext: ; 0x96f52
; script command 0xa4
; parameters:
; pointer (PointerLabelBeforeBank)
@@ -546,7 +546,7 @@ Script_storetext: ; 0x96f52
call SetUpTextBox
call GetScriptByte
ld c, a
- callba StoreText
+ callba BattleTowerText
ret
; 0x96f60
@@ -1079,9 +1079,11 @@ ApplyMovement: ; 971fa
ld a, c
callba SetFlagsForMovement_1
pop bc
+
push bc
call SetFlagsForMovement_2
pop bc
+
call GetScriptByte
ld l, a
call GetScriptByte
@@ -1090,6 +1092,7 @@ ApplyMovement: ; 971fa
ld b, a
call GetMovementData
ret c
+
ld a, SCRIPT_WAIT_MOVEMENT
ld [ScriptMode], a
call StopScript
@@ -1102,6 +1105,7 @@ SetFlagsForMovement_2: ; 0x97221
; 0x97228
Script_applymovement2: ; 0x97228
+; apply movement to last talked
; script command 0x6a
; parameters:
; data (MovementPointerLabelParam)
@@ -1197,9 +1201,9 @@ ApplyPersonFacing: ; 0x9728b
add hl, bc
ld a, [hl]
push bc
- call Function1836
+ call DoesSpriteHaveFacings
pop bc
- jr c, .not_visible ; 0x9729c $1b
+ jr c, .not_visible ; STILL_SPRITE
ld hl, OBJECT_FLAGS1
add hl, bc
bit 2, [hl]
@@ -1222,7 +1226,7 @@ ApplyPersonFacing: ; 0x9728b
; 0x972bc
.DisableTextTiles: ; 0x972bc
- call Function217a
+ call LoadMapPart
hlcoord 0, 0
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
.loop
@@ -1360,7 +1364,7 @@ Script_writepersonxy: ; 0x9735b
ld a, [hLastTalked]
.ok
ld b, a
- callba Function80a1
+ callba WritePersonXY
ret
; 0x9736f
@@ -1376,7 +1380,7 @@ Script_follownotexact: ; 0x9736f
call GetScriptByte
call GetScriptPerson
ld c, a
- callba Function839e
+ callba FollowNotExact
ret
; 0x97384
@@ -1426,12 +1430,12 @@ ShowEmoteScript: ; 973b6
.Show
show_emote
- show_person
+ step_sleep_1
step_end
.Hide
hide_emote
- show_person
+ step_sleep_1
step_end
; 973c7
@@ -1460,8 +1464,8 @@ Script_earthquake: ; 0x973c7
; 973eb
EarthquakeMovement: ; 973eb
- step_shake 16
- step_sleep 16
+ step_shake 16 ; the 16 gets overwritten with the script byte
+ step_sleep 16 ; the 16 gets overwritten with the lower 6 bits of the script byte
step_end
EarthquakeMovementEnd
; 973f0
@@ -1546,7 +1550,7 @@ Script_catchtutorial: ; 0x97447
call GetScriptByte
ld [BattleType], a
call BufferScreen
- callba Function4e554
+ callba CatchTutorial
jp Script_reloadmap
; 0x97459
@@ -1560,8 +1564,8 @@ Script_returnafterbattle: ; 0x97459
and $3f
cp $1
jr nz, .notblackedout ; 0x97466 $8
- ld b, BANK(UnknownScript_0x124c1)
- ld hl, UnknownScript_0x124c1
+ ld b, BANK(Script_BattleWhiteout)
+ ld hl, Script_BattleWhiteout
jp ScriptJump
.notblackedout
@@ -1664,7 +1668,7 @@ endr
ret
; 0x974f3
-Function974f3:: ; 0x974f3
+CallCallback:: ; 0x974f3
ld a, [ScriptBank]
or $80
ld [ScriptBank], a
@@ -2339,7 +2343,7 @@ Script_giveitem: ; 0x977ca
; quantity (SingleByteParam)
call GetScriptByte
- cp -1
+ cp ITEM_FROM_MEM
jr nz, .ok ; 0x977cf $3
ld a, [ScriptVar]
.ok
@@ -2370,8 +2374,8 @@ Script_takeitem: ; 0x977f0
ld [CurItem], a
call GetScriptByte
ld [wItemQuantityChangeBuffer], a
- ld a, $ff
- ld [wd107], a
+ ld a, -1
+ ld [ItemCountBuffer], a
ld hl, NumItems
call TossItem
ret nc
@@ -2847,6 +2851,7 @@ Script_warp: ; 0x97a1d
call LoadMapStatus
call StopScript
ret
+
.not_ok
call GetScriptByte
call GetScriptByte
@@ -2869,7 +2874,7 @@ Script_warpmod: ; 0x97a65
; map_id (MapIdParam)
call GetScriptByte
- ld [wdcac], a
+ ld [BackupWarpNumber], a
call GetScriptByte
ld [BackupMapGroup], a
call GetScriptByte
@@ -2884,9 +2889,9 @@ Script_blackoutmod: ; 0x97a78
; map_id (MapIdParam)
call GetScriptByte
- ld [wdcb2], a
+ ld [wLastSpawnMapGroup], a
call GetScriptByte
- ld [wdcb3], a
+ ld [wLastSpawnMapNumber], a
ret
; 0x97a85
@@ -2970,7 +2975,7 @@ Script_reloadmappart:: ; 0x97ae3
xor a
ld [hBGMapMode], a
- call Function2173
+ call OverworldTextModeSwitch
call Function2914
callba Function104061
call UpdateSprites
@@ -2980,7 +2985,7 @@ Script_reloadmappart:: ; 0x97ae3
Script_warpcheck: ; 0x97af6
; script command 0x8e
- call Function224a
+ call WarpCheck
ret nc
callba SetAll_ScriptFlags3
ret
@@ -3117,6 +3122,7 @@ Script_end: ; 0x97b74
call ExitScriptSubroutine
jr c, .resume
ret
+
.resume
xor a
ld [ScriptRunning], a
diff --git a/engine/selectmenu.asm b/engine/selectmenu.asm
new file mode 100755
index 000000000..e73f397a5
--- /dev/null
+++ b/engine/selectmenu.asm
@@ -0,0 +1,191 @@
+SelectMenu:: ; 13327
+
+ call CheckRegisteredItem
+ jr c, .NotRegistered
+ jp UseRegisteredItem
+
+.NotRegistered
+ call LoadFont
+ ld b, BANK(ItemMayBeRegisteredText)
+ ld hl, ItemMayBeRegisteredText
+ call MapTextbox
+ call CloseText
+ jp LoadMoveSprites
+; 13340
+
+
+ItemMayBeRegisteredText: ; 13340
+ text_jump UnknownText_0x1c1cf3
+ db "@"
+; 13345
+
+
+CheckRegisteredItem: ; 13345
+
+ ld a, [WhichRegisteredItem]
+ and a
+ jr z, .NoRegisteredItem
+ and REGISTERED_POCKET
+ rlca
+ rlca
+ ld hl, .Pockets
+ rst JumpTable
+ ret
+
+.Pockets
+ dw .CheckItem
+ dw .CheckBall
+ dw .CheckKeyItem
+ dw .CheckTMHM
+
+.CheckItem
+ ld hl, NumItems
+ call .CheckRegisteredNo
+ jr c, .NoRegisteredItem
+ inc hl
+ ld e, a
+ ld d, 0
+rept 2
+ add hl, de
+endr
+ call .IsSameItem
+ jr c, .NoRegisteredItem
+ and a
+ ret
+
+.CheckKeyItem
+ ld a, [RegisteredItem]
+ ld hl, KeyItems
+ ld de, 1
+ call IsInArray
+ jr nc, .NoRegisteredItem
+ ld a, [RegisteredItem]
+ ld [CurItem], a
+ and a
+ ret
+
+.CheckBall
+ ld hl, NumBalls
+ call .CheckRegisteredNo
+ jr nc, .NoRegisteredItem
+ inc hl
+ ld e, a
+ ld d, 0
+rept 2
+ add hl, de
+endr
+ call .IsSameItem
+ jr c, .NoRegisteredItem
+ ret
+
+.CheckTMHM
+ jr .NoRegisteredItem
+
+.NoRegisteredItem
+ xor a
+ ld [WhichRegisteredItem], a
+ ld [RegisteredItem], a
+ scf
+ ret
+; 133a6
+
+
+.CheckRegisteredNo ; 133a6
+ ld a, [WhichRegisteredItem]
+ and REGISTERED_NUMBER
+ dec a
+ cp [hl]
+ jr nc, .NotEnoughItems
+ ld [wd107], a
+ and a
+ ret
+
+.NotEnoughItems
+ scf
+ ret
+; 133b6
+
+
+.IsSameItem ; 133b6
+ ld a, [RegisteredItem]
+ cp [hl]
+ jr nz, .NotSameItem
+ ld [CurItem], a
+ and a
+ ret
+
+.NotSameItem
+ scf
+ ret
+; 133c3
+
+
+UseRegisteredItem: ; 133c3
+
+ callba CheckItemMenu
+ ld a, [wItemAttributeParamBuffer]
+ ld hl, .SwitchTo
+ rst JumpTable
+ ret
+
+.SwitchTo
+ dw .CantUse
+ dw .NoFunction
+ dw .NoFunction
+ dw .NoFunction
+ dw .Current
+ dw .Party
+ dw .Overworld
+; 133df
+
+.NoFunction ; 133df
+ call LoadFont
+ call CantUseItem
+ call LoadMoveSprites
+ and a
+ ret
+; 133ea
+
+.Current ; 133ea
+ call LoadFont
+ call DoItemEffect
+ call LoadMoveSprites
+ and a
+ ret
+; 133f5
+
+.Party ; 133f5
+ call ResetWindow
+ call FadeToMenu
+ call DoItemEffect
+ call Function2b3c
+ call LoadMoveSprites
+ and a
+ ret
+; 13406
+
+.Overworld ; 13406
+ call ResetWindow
+ ld a, 1
+ ld [wd0ef], a
+ call DoItemEffect
+ xor a
+ ld [wd0ef], a
+ ld a, [wd0ec]
+ cp 1
+ jr nz, ._cantuse
+ scf
+ ld a, HMENURETURN_SCRIPT
+ ld [hMenuReturn], a
+ ret
+; 13422
+
+.CantUse ; 13422
+ call ResetWindow
+
+._cantuse
+ call CantUseItem
+ call LoadMoveSprites
+ and a
+ ret
+; 1342d
diff --git a/engine/slot_machine.asm b/engine/slot_machine.asm
new file mode 100755
index 000000000..075b1ba78
--- /dev/null
+++ b/engine/slot_machine.asm
@@ -0,0 +1,2112 @@
+_SlotMachine:
+ ld hl, Options
+ set 4, [hl]
+ call Function926f7
+ call DelayFrame
+.asm_926d2
+ call Function927af
+ jr nc, .asm_926d2
+ call WaitSFX
+ ld de, SFX_QUIT_SLOTS
+ call PlaySFX
+ call WaitSFX
+ call ClearBGPalettes
+ callba MobileFn_105fd0
+ ld hl, Options
+ res 4, [hl]
+ ld hl, rLCDC ; $ff40
+ res 2, [hl]
+ ret
+
+Function926f7: ; 926f7 (24:66f7)
+ call ClearBGPalettes
+ call ClearTileMap
+ call ClearSprites
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call DelayFrame
+ call DisableLCD
+ ld hl, VBGMap0 tile $00
+ lb bc, 4, 0
+ ld a, $7f
+ call ByteFill
+ ld b, $5
+ call GetSGBLayout
+ callab Function8cf53
+ ld hl, wc6d0
+ ld bc, $48
+ xor a
+ call ByteFill
+ ld hl, Slots2LZ
+ ld de, VTiles0 tile $00
+ call Decompress
+ ld hl, Slots3LZ
+ ld de, VTiles0 tile $40
+ call Decompress
+ ld hl, Slots1LZ
+ ld de, VTiles2 tile $00
+ call Decompress
+ ld hl, Slots2LZ
+ ld de, VTiles2 tile $25
+ call Decompress
+ ld hl, SlotsTilemap
+ decoord 0, 0
+ ld bc, 20 * 12
+ call CopyBytes
+ ld hl, rLCDC ; $ff40
+ set 2, [hl]
+ call EnableLCD
+ ld hl, wc6d0
+ ld bc, $64
+ xor a
+ call ByteFill
+ call Function92a98
+ call Function9279b
+ ld a, $7
+ ld hl, wc300
+ ld [hli], a
+ ld [hl], $40
+ xor a
+ ld [wJumptableIndex], a
+ ld a, $ff
+ ld [wc709], a
+ ld de, MUSIC_GAME_CORNER
+ call PlayMusic
+ xor a
+ ld [wd002], a
+ call Random
+ and $2a
+ ret nz
+ ld a, $1
+ ld [wd002], a
+ ret
+
+Function9279b: ; 9279b (24:679b)
+ ld a, $e4
+ call DmgToCgbBGPals
+ lb de, $e4, $e4
+ ld a, [hCGB]
+ and a
+ jr nz, .asm_927ab
+ lb de, $c0, $e4
+.asm_927ab
+ call DmgToCgbObjPals
+ ret
+
+Function927af: ; 927af (24:67af)
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .asm_927d1
+ call Function92844
+ call Function92b0f
+ xor a
+ ld [wc3b5], a
+ callab Function8cfa8
+ call Function927f8
+ call Function927d3
+ call DelayFrame
+ and a
+ ret
+.asm_927d1
+ scf
+ ret
+
+Function927d3: ; 927d3 (24:67d3)
+ ret
+; 927d4 (24:67d4)
+
+Function927d4: ; 927d4
+ ld a, [wc6d0]
+ and a
+ ret nz
+ ld a, [wc6e0]
+ and a
+ ret nz
+ ld a, [wc70c]
+ and a
+ jr nz, .asm_927ea
+ ld a, $e4
+ call DmgToCgbBGPals
+ ret
+
+.asm_927ea
+ ld a, [TextDelayFrames]
+ and $7
+ ret nz
+ ld a, [rBGP]
+ xor %1100
+ call DmgToCgbBGPals
+ ret
+; 927f8
+
+Function927f8: ; 927f8 (24:67f8)
+ hlcoord 5, 1
+ ld de, Coins
+ lb bc, PRINTNUM_LEADINGZEROS | 2, 4
+ call PrintNum
+ hlcoord 11, 1
+ ld de, wc711
+ lb bc, PRINTNUM_LEADINGZEROS | 2, 4
+ call PrintNum
+ ret
+; 92811 (24:6811)
+
+Function92811: ; 92811
+ ld a, [wc709]
+ add 0
+ daa
+ ld e, a
+ and $f
+ add "0"
+ hlcoord 1, 0
+ ld [hl], a
+ ld a, e
+ swap a
+ and $f
+ add "0"
+ hlcoord 0, 0
+ ld [hl], a
+ ret
+; 9282c
+
+Function9282c: ; 9282c
+ ld hl, wcf66
+ ld a, [hl]
+ inc [hl]
+ and $7
+ ret nz
+ ld hl, Sprites + $42
+ ld c, $18
+.asm_92839
+ ld a, [hl]
+ xor $20
+ ld [hli], a
+rept 3
+ inc hl
+endr
+ dec c
+ jr nz, .asm_92839
+ ret
+; 92844
+
+Function92844: ; 92844 (24:6844)
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, 0
+ ld hl, Jumptable_92853
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; 92853 (24:6853)
+
+
+Jumptable_92853: ; 92853 (24:6853)
+ dw Function9287e
+ dw Function9288e
+ dw Function928c6
+ dw Function928d6
+ dw Function928e6
+ dw Function92900
+ dw Function92910
+ dw Function9292a
+ dw Function9293a
+ dw Function92879
+ dw Function92879
+ dw Function92879
+ dw Function92955
+ dw Function9296b
+ dw Function92987
+ dw Function9299e
+ dw Function929a4
+ dw Function929d9
+ dw Function929f0
+
+
+Function92879: ; 92879 (24:6879)
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+Function9287e: ; 9287e (24:687e)
+ call Function92879
+ xor a
+ ld [wc70b], a
+ ld [wc70c], a
+ ld a, $ff
+ ld [wc70d], a
+ ret
+
+Function9288e: ; 9288e (24:688e)
+ call Function9307c
+ jr nc, .asm_92899
+ ld a, $12
+ ld [wJumptableIndex], a
+ ret
+.asm_92899
+ call Function92879
+ call Function9303f
+ call Function93002
+ ld a, $20
+ ld [wcf64], a
+ ld a, $4
+ ld [wc6d0], a
+ ld [wc6e0], a
+ ld [wc6f0], a
+ ld a, $4
+ ld [wc6d9], a
+ ld [wc6e9], a
+ ld [wc6f9], a
+ call WaitSFX
+ ld a, SFX_SLOT_MACHINE_START
+ call Function9331e
+ ret
+
+Function928c6: ; 928c6 (24:68c6)
+ ld hl, wcf64
+ ld a, [hl]
+ and a
+ jr z, .asm_928cf
+ dec [hl]
+ ret
+.asm_928cf
+ call Function92879
+ xor a
+ ld [hJoypadSum], a
+ ret
+
+Function928d6: ; 928d6 (24:68d6)
+ ld hl, hJoypadSum ; $ffa5
+ ld a, [hl]
+ and A_BUTTON
+ ret z
+ call Function92879
+ call Function92a2b
+ ld [wc6d0], a
+
+Function928e6: ; 928e6 (24:68e6)
+ ld a, [wc6d0]
+ cp $0
+ ret nz
+ ld a, SFX_STOP_SLOT
+ call Function9331e
+ ld bc, wc6d0
+ ld de, wc700
+ call Function929f6
+ call Function92879
+ xor a
+ ld [hJoypadSum], a
+
+Function92900: ; 92900 (24:6900)
+ ld hl, hJoypadSum ; $ffa5
+ ld a, [hl]
+ and A_BUTTON
+ ret z
+ call Function92879
+ call Function92a2e
+ ld [wc6e0], a
+
+Function92910: ; 92910 (24:6910)
+ ld a, [wc6e0]
+ cp $0
+ ret nz
+ ld a, SFX_STOP_SLOT
+ call Function9331e
+ ld bc, wc6e0
+ ld de, wc703
+ call Function929f6
+ call Function92879
+ xor a
+ ld [hJoypadSum], a
+
+Function9292a: ; 9292a (24:692a)
+ ld hl, hJoypadSum ; $ffa5
+ ld a, [hl]
+ and A_BUTTON
+ ret z
+ call Function92879
+ call Function92a60
+ ld [wc6f0], a
+
+Function9293a: ; 9293a (24:693a)
+ ld a, [wc6f0]
+ cp $0
+ ret nz
+ ld a, SFX_STOP_SLOT
+ call Function9331e
+ ld bc, wc6f0
+ ld de, wc706
+ call Function929f6
+ call Function92879
+ xor a
+ ld [hJoypadSum], a
+ ret
+
+Function92955: ; 92955 (24:6955)
+ ld a, [wc70d]
+ cp $ff
+ jr nz, .asm_92963
+ call Function92879
+ call Function92879
+ ret
+.asm_92963
+ call Function92879
+ ld a, $10
+ ld [wcf64], a
+
+Function9296b: ; 9296b (24:696b)
+ ld hl, wcf64
+ ld a, [hl]
+ and a
+ jr z, .asm_92980
+ dec [hl]
+ srl a
+ ret z
+ ld a, [rOBP0]
+ xor $ff
+ ld e, a
+ ld d, a
+ call DmgToCgbObjPals
+ ret
+.asm_92980
+ call Function9279b
+ call Function92879
+ ret
+
+Function92987: ; 92987 (24:6987)
+ xor a
+ ld [wc70b], a
+ ld [wc70c], a
+ ld a, $e4
+ call DmgToCgbBGPals
+ call Function93124
+ xor a
+ ld [wcf64], a
+ call Function92879
+ ret
+
+Function9299e: ; 9299e (24:699e)
+ call Function93158
+ call Function92879
+
+Function929a4: ; 929a4 (24:69a4)
+ ld hl, wcf64
+ ld a, [hl]
+ inc [hl]
+ and $1
+ ret z
+ ld hl, wc711
+ ld a, [hli]
+ ld d, a
+ or [hl]
+ jr z, .asm_929d5
+ ld e, [hl]
+ dec de
+ ld [hl], e
+ dec hl
+ ld [hl], d
+ ld hl, Coins
+ ld d, [hl]
+ inc hl
+ ld e, [hl]
+ call Function92a04
+ jr c, .asm_929c5
+ inc de
+.asm_929c5
+ ld [hl], e
+ dec hl
+ ld [hl], d
+ ld a, [wcf64]
+ and $7
+ ret z
+ ld de, SFX_GET_COIN_FROM_SLOTS
+ call PlaySFX
+ ret
+.asm_929d5
+ call Function92879
+ ret
+
+Function929d9: ; 929d9 (24:69d9)
+ call Function9304c
+ call WaitPressAorB_BlinkCursor
+ call Function930e9
+ jr c, .asm_929ea
+ ld a, $0
+ ld [wJumptableIndex], a
+ ret
+.asm_929ea
+ ld a, $12
+ ld [wJumptableIndex], a
+ ret
+
+Function929f0: ; 929f0 (24:69f0)
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+Function929f6: ; 929f6 (24:69f6)
+ push de
+ call Function92a12
+ pop de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ ret
+
+Function92a04: ; 92a04 (24:6a04)
+ ld a, d
+ cp 9999 / $100
+ jr c, .asm_92a10
+ ld a, e
+ cp 9999 % $100
+ jr c, .asm_92a10
+ scf
+ ret
+.asm_92a10
+ and a
+ ret
+
+Function92a12: ; 92a12 (24:6a12)
+ ld hl, $3
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr nz, .asm_92a1c
+ ld a, $f
+.asm_92a1c
+ dec a
+ and $f
+ ld e, a
+ ld d, $0
+ ld hl, $1
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ add hl, de
+ ret
+
+Function92a2b: ; 92a2b (24:6a2b)
+ ld a, $7
+ ret
+
+Function92a2e: ; 92a2e (24:6a2e)
+ ld a, [wc70a]
+ cp $2
+ jr c, .asm_92a4e
+ ld a, [wc709]
+ and a
+ jr z, .asm_92a3f
+ cp $ff
+ jr nz, .asm_92a4e
+.asm_92a3f
+ call Function92a51
+ jr nz, .asm_92a4e
+ call Random
+ cp $50
+ jr nc, .asm_92a4e
+ ld a, $a
+ ret
+.asm_92a4e
+ ld a, $8
+ ret
+
+Function92a51: ; 92a51 (24:6a51)
+ ld a, [wc700]
+ and a
+ ret z
+ ld a, [wc701]
+ and a
+ ret z
+ ld a, [wc702]
+ and a
+ ret
+
+Function92a60: ; 92a60 (24:6a60)
+ ld a, [wc70b]
+ and a
+ jr z, .asm_92a95
+ ld a, [wc70c]
+ and a
+ jr z, .asm_92a95
+ ld a, [wc709]
+ and a
+ jr nz, .asm_92a84
+ call Random
+ cp 180
+ jr nc, .asm_92a95
+ cp 120
+ jr nc, .asm_92a92
+ cp 60
+ jr nc, .asm_92a8f
+ ld a, $15
+ ret
+.asm_92a84
+ call Random
+ cp $a0
+ jr nc, .asm_92a95
+ cp $50
+ jr nc, .asm_92a92
+.asm_92a8f
+ ld a, $12
+ ret
+.asm_92a92
+ ld a, $10
+ ret
+.asm_92a95
+ ld a, $9
+ ret
+
+Function92a98: ; 92a98 (24:6a98)
+ ld bc, wc6d0
+ ld hl, $6
+ add hl, bc
+ ld de, Sprites + $40
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $1
+ add hl, bc
+ ld de, Unknown_93327
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $8
+ add hl, bc
+ ld [hl], $30
+ call Function92af9
+ ld bc, wc6e0
+ ld hl, $6
+ add hl, bc
+ ld de, Sprites + $60
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $1
+ add hl, bc
+ ld de, Unknown_93339
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $8
+ add hl, bc
+ ld [hl], $50
+ call Function92af9
+ ld bc, wc6f0
+ ld hl, $6
+ add hl, bc
+ ld de, Sprites + $80
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $1
+ add hl, bc
+ ld de, Unknown_9334b
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $8
+ add hl, bc
+ ld [hl], $70
+ call Function92af9
+ ret
+
+Function92af9: ; 92af9 (24:6af9)
+ ld hl, 0
+ add hl, bc
+ ld [hl], $0
+ ld hl, $3
+ add hl, bc
+ ld [hl], $e
+ ld hl, $4
+ add hl, bc
+ ld [hl], $0
+ call Function92b53
+ ret
+
+Function92b0f: ; 92b0f (24:6b0f)
+ ld bc, wc6d0
+ call Function92b22
+ ld bc, wc6e0
+ call Function92b22
+ ld bc, wc6f0
+ call Function92b22
+ ret
+
+Function92b22: ; 92b22 (24:6b22)
+ ld hl, $4
+ add hl, bc
+ ld a, [hl]
+ and $f
+ jr nz, .asm_92b2e
+ call Function92bd4
+.asm_92b2e
+ ld hl, $5
+ add hl, bc
+ ld a, [hl]
+ and a
+ ret z
+ ld d, a
+ ld hl, $4
+ add hl, bc
+ add [hl]
+ ld [hl], a
+ and $f
+ jr z, Function92b53
+ ld hl, $6
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld e, $8
+.asm_92b49
+ ld a, [hl]
+ add d
+ ld [hli], a
+rept 3
+ inc hl
+endr
+ dec e
+ jr nz, .asm_92b49
+ ret
+
+Function92b53: ; 92b53 (24:6b53)
+ ld hl, $8
+ add hl, bc
+ ld a, [hl]
+ ld [wc712 + 1], a
+ ld a, $50
+ ld [wc712 + 2], a
+ ld hl, $3
+ add hl, bc
+ ld e, [hl]
+ ld d, $0
+ ld hl, $1
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ add hl, de
+ ld e, l
+ ld d, h
+ call Function92b83
+ ld hl, $3
+ add hl, bc
+ ld a, [hl]
+ inc a
+ and $f
+ cp $f
+ jr nz, .asm_92b81
+ xor a
+.asm_92b81
+ ld [hl], a
+ ret
+
+Function92b83: ; 92b83 (24:6b83)
+ ld hl, $6
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+.asm_92b8a
+ ld a, [wc712 + 2]
+ ld [hli], a
+ ld a, [wc712 + 1]
+ ld [hli], a
+ ld a, [de]
+ ld [hli], a
+ srl a
+ srl a
+ set 7, a
+ ld [hli], a
+ ld a, [wc712 + 2]
+ ld [hli], a
+ ld a, [wc712 + 1]
+ add $8
+ ld [hli], a
+ ld a, [de]
+rept 2
+ inc a
+endr
+ ld [hli], a
+ srl a
+ srl a
+ set 7, a
+ ld [hli], a
+ inc de
+ ld a, [wc712 + 2]
+ sub $10
+ ld [wc712 + 2], a
+ cp $10
+ jr nz, .asm_92b8a
+ ret
+; 92bbe (24:6bbe)
+
+Function92bbe: ; 92bbe
+ push hl
+ srl a
+ srl a
+ add Unknown_92bce % $100
+ ld l, a
+ ld a, 0
+ adc Unknown_92bce / $100
+ ld h, a
+ ld a, [hl]
+ pop hl
+ ret
+; 92bce
+
+Unknown_92bce: ; 92bce
+ db 0, 1, 2, 3, 4, 5
+; 92bd4
+
+Function92bd4: ; 92bd4 (24:6bd4)
+ ld hl, 0
+ add hl, bc
+ ld e, [hl]
+ ld d, 0
+ ld hl, Jumptable_92be4
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; 92be4 (24:6be4)
+
+Jumptable_92be4: ; 92be4
+ dw Function92c16
+ dw Function92c4c
+ dw Function92c17
+ dw Function92c1e
+ dw Function92c25
+ dw Function92c2c
+ dw Function92c33
+ dw Function92c5e
+ dw Function92c86
+ dw Function92ca9
+ dw Function92cd2
+ dw Function92cf8
+ dw Function92d13
+ dw Function92df7
+ dw Function92e10
+ dw Function92e31
+ dw Function92e47
+ dw Function92e64
+ dw Function92d20
+ dw Function92d4f
+ dw Function92d6e
+ dw Function92d7e
+ dw Function92da4
+ dw Function92db3
+ dw Function92dca
+; 92c16
+
+Function92c16: ; 92c16
+ ret
+; 92c17
+
+Function92c17: ; 92c17
+ ld hl, $5
+ add hl, bc
+ ld [hl], $10
+ ret
+; 92c1e
+
+Function92c1e: ; 92c1e
+ ld hl, $5
+ add hl, bc
+ ld [hl], $8
+ ret
+; 92c25
+
+Function92c25: ; 92c25
+ ld hl, $5
+ add hl, bc
+ ld [hl], $4
+ ret
+; 92c2c
+
+Function92c2c: ; 92c2c
+ ld hl, $5
+ add hl, bc
+ ld [hl], $2
+ ret
+; 92c33
+
+Function92c33: ; 92c33
+ ld hl, $5
+ add hl, bc
+ ld [hl], $1
+ ret
+; 92c3a
+
+Function92c3a: ; 92c3a
+ ld hl, $5
+ add hl, bc
+ ld [hl], $0
+ ld hl, 0
+ add hl, bc
+ ld [hl], $1
+ ld hl, $f
+ add hl, bc
+ ld [hl], $3
+
+Function92c4c: ; 92c4c
+ ld hl, $f
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_92c56
+ dec [hl]
+ ret
+
+.asm_92c56
+ ld hl, 0
+ add hl, bc
+ ld a, $0
+ ld [hl], a
+ ret
+; 92c5e
+
+Function92c5e: ; 92c5e
+ ld a, [wc709]
+ cp $ff
+ jr z, .asm_92c72
+ ld hl, $9
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_92c72
+ dec [hl]
+ call Function92c76
+ ret nz
+
+.asm_92c72
+ call Function92c3a
+ ret
+; 92c76
+
+Function92c76: ; 92c76
+ call Function92a12
+ ld a, [wc709]
+ ld e, a
+ ld a, [hli]
+ cp e
+ ret z
+ ld a, [hli]
+ cp e
+ ret z
+ ld a, [hl]
+ cp e
+ ret
+; 92c86
+
+Function92c86: ; 92c86
+ call Function92e94
+ jr nc, .asm_92c94
+ ld a, [wc717]
+ ld hl, wc709
+ cp [hl]
+ jr z, .asm_92ca5
+
+.asm_92c94
+ ld a, [wc709]
+ cp $ff
+ jr z, .asm_92ca5
+ ld hl, $9
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_92ca5
+ dec [hl]
+ ret
+
+.asm_92ca5
+ call Function92c3a
+ ret
+; 92ca9
+
+Function92ca9: ; 92ca9
+ call Function92f1d
+ jr nc, .asm_92cbd
+ ld hl, wc709
+ cp [hl]
+ jr z, .asm_92cce
+ ld hl, $9
+ add hl, bc
+ ld a, [hl]
+ and a
+ ret z
+ dec [hl]
+ ret
+
+.asm_92cbd
+ ld a, [wc709]
+ cp $ff
+ jr z, .asm_92cce
+ ld hl, $9
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_92cce
+ dec [hl]
+ ret
+
+.asm_92cce
+ call Function92c3a
+ ret
+; 92cd2
+
+Function92cd2: ; 92cd2
+ call Function92e94
+ jr nc, .asm_92ce1
+ ld a, [wc70c]
+ and a
+ jr z, .asm_92ce1
+ call Function92c3a
+ ret
+
+.asm_92ce1
+ ld a, SFX_STOP_SLOT
+ call Function9331e
+ ld hl, 0
+ add hl, bc
+ inc [hl]
+ ld hl, $a
+ add hl, bc
+ ld [hl], $20
+ ld hl, $5
+ add hl, bc
+ ld [hl], $0
+ ret
+; 92cf8
+
+Function92cf8: ; 92cf8
+ ld hl, $a
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_92d02
+ dec [hl]
+ ret
+
+.asm_92d02
+ ld a, SFX_THROW_BALL
+ call Function9331e
+ ld hl, 0
+ add hl, bc
+ inc [hl]
+ ld hl, $5
+ add hl, bc
+ ld [hl], $8
+ ret
+; 92d13
+
+Function92d13: ; 92d13
+ call Function92e94
+ ret nc
+ ld a, [wc70c]
+ and a
+ ret z
+ call Function92c3a
+ ret
+; 92d20
+
+Function92d20: ; 92d20
+ call Function92f1d
+ ret c
+ ld a, SFX_STOP_SLOT
+ call Function9331e
+ call Function93316
+ ld hl, 0
+ add hl, bc
+ inc [hl]
+ ld hl, $5
+ add hl, bc
+ ld [hl], $0
+ call Function92fc0
+ push bc
+ push af
+ ld de, $6068
+ ld a, $6
+ call Function3b2a
+ ld hl, $e
+ add hl, bc
+ pop af
+ ld [hl], a
+ pop bc
+ xor a
+ ld [wcf64], a
+
+Function92d4f: ; 92d4f
+ ld a, [wcf64]
+ cp $2
+ jr z, .asm_92d5b
+ cp $1
+ jr z, .asm_92d62
+ ret
+
+.asm_92d5b
+ call Function92f1d
+ call Function92c3a
+ ret
+
+.asm_92d62
+ ld hl, 0
+ add hl, bc
+ inc [hl]
+ ld hl, $5
+ add hl, bc
+ ld [hl], $8
+ ret
+; 92d6e
+
+Function92d6e: ; 92d6e
+ xor a
+ ld [wcf64], a
+ ld hl, 0
+ add hl, bc
+ dec [hl]
+ ld hl, $5
+ add hl, bc
+ ld [hl], $0
+ ret
+; 92d7e
+
+Function92d7e: ; 92d7e
+ call Function92f1d
+ ret c
+ ld a, SFX_STOP_SLOT
+ call Function9331e
+ call Function93316
+ ld hl, 0
+ add hl, bc
+ inc [hl]
+ ld hl, $5
+ add hl, bc
+ ld [hl], $0
+ push bc
+ ld de, $6000
+ ld a, $7
+ call Function3b2a
+ pop bc
+ xor a
+ ld [wcf64], a
+ ret
+; 92da4
+
+Function92da4: ; 92da4
+ ld a, [wcf64]
+ and a
+ ret z
+ ld hl, 0
+ add hl, bc
+ inc [hl]
+ ld a, $2
+ ld [wcf64], a
+
+Function92db3: ; 92db3
+ ld a, [wcf64]
+ cp $4
+ ret c
+ ld hl, 0
+ add hl, bc
+ inc [hl]
+ ld hl, $5
+ add hl, bc
+ ld [hl], $10
+ ld hl, $a
+ add hl, bc
+ ld [hl], $11
+
+Function92dca: ; 92dca
+ ld hl, $a
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_92dd4
+ dec [hl]
+ ret
+
+.asm_92dd4
+ call Function92f1d
+ jr nc, .asm_92de5
+ and a
+ jr nz, .asm_92de5
+ ld a, $5
+ ld [wcf64], a
+ call Function92c3a
+ ret
+
+.asm_92de5
+ ld hl, $5
+ add hl, bc
+ ld [hl], $0
+ ld hl, 0
+ add hl, bc
+rept 2
+ dec [hl]
+endr
+ ld a, $1
+ ld [wcf64], a
+ ret
+; 92df7
+
+Function92df7: ; 92df7
+ call Function92f1d
+ ret c
+ ld a, SFX_STOP_SLOT
+ call Function9331e
+ call Function93316
+ ld hl, 0
+ add hl, bc
+ inc [hl]
+ call Function92fc0
+ ld hl, $a
+ add hl, bc
+ ld [hl], a
+
+Function92e10: ; 92e10
+ ld hl, $a
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr nz, .asm_92e1f
+ call Function92f1d
+ call Function92c3a
+ ret
+
+.asm_92e1f
+ dec [hl]
+ ld hl, 0
+ add hl, bc
+ inc [hl]
+ ld hl, $b
+ add hl, bc
+ ld [hl], $20
+ ld hl, $5
+ add hl, bc
+ ld [hl], $0
+
+Function92e31: ; 92e31
+ ld hl, $b
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_92e3b
+ dec [hl]
+ ret
+
+.asm_92e3b
+ ld hl, 0
+ add hl, bc
+ dec [hl]
+ ld hl, $5
+ add hl, bc
+ ld [hl], $8
+ ret
+; 92e47
+
+Function92e47: ; 92e47
+ call Function92f1d
+ ret c
+ ld a, SFX_STOP_SLOT
+ call Function9331e
+ call Function93316
+ ld hl, $5
+ add hl, bc
+ ld [hl], $1
+ ld hl, 0
+ add hl, bc
+ inc [hl]
+ ld hl, $a
+ add hl, bc
+ ld [hl], $10
+
+Function92e64: ; 92e64
+ ld hl, $a
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_92e73
+ dec [hl]
+.asm_92e6d
+ ld a, SFX_GOT_SAFARI_BALLS
+ call Function9331e
+ ret
+
+.asm_92e73
+ ld a, [wc709]
+ and a
+ jr nz, .asm_92e88
+ call Function92f1d
+ jr nc, .asm_92e6d
+ and a
+ jr nz, .asm_92e6d
+ call Function92c3a
+ call WaitSFX
+ ret
+
+.asm_92e88
+ call Function92f1d
+ jr c, .asm_92e6d
+ call Function92c3a
+ call WaitSFX
+ ret
+; 92e94
+
+Function92e94: ; 92e94
+ xor a
+ ld [wc70b], a
+ ld [wc70c], a
+ call Function92a12
+ call Function92fb4
+ ld a, [wc70a]
+ and 3
+ ld e, a
+ ld d, 0
+ ld hl, Jumptable_92ebd
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, .asm_92eb6
+ push de
+ jp [hl]
+
+.asm_92eb6
+ ld a, [wc70b]
+ and a
+ ret z
+ scf
+ ret
+; 92ebd
+
+Jumptable_92ebd: ; 92ebd
+ dw Function92ed4
+ dw Function92ed1
+ dw Function92ecb
+ dw Function92ec5
+; 92ec5
+
+Function92ec5: ; 92ec5
+ call Function92ee0
+ call Function92ef6
+
+Function92ecb: ; 92ecb
+ call Function92ed5
+ call Function92f01
+
+Function92ed1: ; 92ed1
+ call Function92eeb
+
+Function92ed4: ; 92ed4
+ ret
+; 92ed5
+
+Function92ed5: ; 92ed5
+ ld hl, wc70e
+ ld a, [EnemyScreens]
+ cp [hl]
+ call z, Function92f0c
+ ret
+; 92ee0
+
+Function92ee0: ; 92ee0
+ ld hl, wEnemyGoesFirst
+ ld a, [wc700]
+ cp [hl]
+ call z, Function92f0c
+ ret
+; 92eeb
+
+Function92eeb: ; 92eeb
+ ld hl, wEnemyGoesFirst
+ ld a, [wc701]
+ cp [hl]
+ call z, Function92f0c
+ ret
+; 92ef6
+
+Function92ef6: ; 92ef6
+ ld hl, wEnemyGoesFirst
+ ld a, [wc702]
+ cp [hl]
+ call z, Function92f0c
+ ret
+; 92f01
+
+Function92f01: ; 92f01
+ ld hl, wc710
+ ld a, [wc702]
+ cp [hl]
+ call z, Function92f0c
+ ret
+; 92f0c
+
+Function92f0c: ; 92f0c
+ ld [wc717], a
+ and a
+ jr nz, .asm_92f17
+ ld a, $1
+ ld [wc70c], a
+
+.asm_92f17
+ ld a, $1
+ ld [wc70b], a
+ ret
+; 92f1d
+
+Function92f1d: ; 92f1d
+ ld a, $ff
+ ld [EffectFailed], a
+ call Function92a12
+ call Function92fb4
+ ld a, [wc70a]
+ and 3
+ ld e, a
+ ld d, 0
+ ld hl, Jumptable_92f48
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, .asm_92f3d
+ push de
+ jp [hl]
+
+.asm_92f3d
+ ld a, [wc70d]
+ cp $ff
+ jr nz, .asm_92f46
+ and a
+ ret
+
+.asm_92f46
+ scf
+ ret
+; 92f48
+
+Jumptable_92f48: ; 92f48
+ dw Function92f5f
+ dw Function92f5c
+ dw Function92f56
+ dw Function92f50
+; 92f50
+
+Function92f50: ; 92f50
+ call Function92f70
+ call Function92f90
+
+Function92f56: ; 92f56
+ call Function92f60
+ call Function92fa0
+
+Function92f5c: ; 92f5c
+ call Function92f80
+
+Function92f5f: ; 92f5f
+ ret
+; 92f60
+
+Function92f60: ; 92f60
+ ld hl, wc70e
+ ld a, [wc700]
+ cp [hl]
+ ret nz
+ ld hl, wc703
+ cp [hl]
+ call z, Function92fb0
+ ret
+; 92f70
+
+Function92f70: ; 92f70
+ ld hl, wc710
+ ld a, [wc700]
+ cp [hl]
+ ret nz
+ ld hl, wc704
+ cp [hl]
+ call z, Function92fb0
+ ret
+; 92f80
+
+Function92f80: ; 92f80
+ ld hl, wEnemyGoesFirst
+ ld a, [wc701]
+ cp [hl]
+ ret nz
+ ld hl, wc704
+ cp [hl]
+ call z, Function92fb0
+ ret
+; 92f90
+
+Function92f90: ; 92f90
+ ld hl, wc70e
+ ld a, [wc702]
+ cp [hl]
+ ret nz
+ ld hl, wc704
+ cp [hl]
+ call z, Function92fb0
+ ret
+; 92fa0
+
+Function92fa0: ; 92fa0
+ ld hl, wc710
+ ld a, [wc702]
+ cp [hl]
+ ret nz
+ ld hl, wc705
+ cp [hl]
+ call z, Function92fb0
+ ret
+; 92fb0
+
+Function92fb0: ; 92fb0
+ ld [wc70d], a
+ ret
+; 92fb4
+
+Function92fb4: ; 92fb4
+ ld de, wc70e
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ ld [de], a
+ ret
+; 92fc0
+
+Function92fc0: ; 92fc0
+ ld hl, $3
+ add hl, bc
+ ld a, [hl]
+ push af
+ push hl
+ call Function92fcf
+ pop hl
+ pop af
+ ld [hl], a
+ ld a, e
+ ret
+; 92fcf
+
+Function92fcf: ; 92fcf
+ ld a, [wc709]
+ and a
+ jr nz, .asm_92fe8
+ ld e, $0
+.asm_92fd7
+ ld hl, $3
+ add hl, bc
+ inc [hl]
+ inc e
+ push de
+ call Function92f1d
+ pop de
+ jr nc, .asm_92fd7
+ and a
+ jr nz, .asm_92fd7
+ ret
+
+.asm_92fe8
+ call Random
+ and $7
+ cp $4
+ jr c, .asm_92fe8
+ ld e, a
+.asm_92ff2
+ ld a, e
+ inc e
+ ld hl, $3
+ add hl, bc
+ add [hl]
+ ld [hl], a
+ push de
+ call Function92f1d
+ pop de
+ jr c, .asm_92ff2
+ ret
+; 93002
+
+Function93002: ; 93002 (24:7002)
+ ld a, [wc709]
+ and a
+ ret z
+ ld hl, Unknown_93023
+ ld a, [ScriptVar]
+ and a
+ jr z, .asm_93013
+ ld hl, Unknown_93031
+.asm_93013
+ call Random
+ ld c, a
+.asm_93017
+ ld a, [hli]
+ cp c
+ jr nc, .asm_9301e
+ inc hl
+ jr .asm_93017
+.asm_9301e
+ ld a, [hl]
+ ld [wc709], a
+ ret
+; 93023 (24:7023)
+
+Unknown_93023: ; 93023
+ db $01, $00
+ db $03, $04
+ db $0a, $14
+ db $14, $10
+ db $28, $0c
+ db $30, $08
+ db $ff, $ff
+; 93031
+
+Unknown_93031: ; 93031
+ db $02, $00
+ db $03, $04
+ db $08, $14
+ db $10, $10
+ db $1e, $0c
+ db $50, $08
+ db $ff, $ff
+; 9303f
+
+Function9303f: ; 9303f (24:703f)
+ ld b, $14
+ ld a, [wc70a]
+ dec a
+ jr z, asm_93066
+ dec a
+ jr z, asm_9305a
+ jr asm_9304e
+
+Function9304c: ; 9304c (24:704c)
+ ld b, $23
+asm_9304e: ; 9304e (24:704e)
+ hlcoord 3, 2
+ call Function93069
+ hlcoord 3, 10
+ call Function93069
+asm_9305a: ; 9305a (24:705a)
+ hlcoord 3, 4
+ call Function93069
+ hlcoord 3, 8
+ call Function93069
+asm_93066: ; 93066 (24:7066)
+ hlcoord 3, 6
+
+Function93069: ; 93069 (24:7069)
+ ld a, b
+ ld [hl], a
+ ld de, $d
+ add hl, de
+ ld [hl], a
+ ld de, $7
+ add hl, de
+ inc a
+ ld [hl], a
+ ld de, $d
+ add hl, de
+ ld [hl], a
+ ret
+
+Function9307c: ; 9307c (24:707c)
+ ld hl, UnknownText_0x930c7
+ call PrintText
+ ld hl, MenuDataHeader_0x930d6
+ call LoadMenuDataHeader
+ call InterpretMenu2
+ call WriteBackup
+ ret c
+ ld a, [MenuSelection2]
+ ld b, a
+ ld a, $4
+ sub b
+ ld [wc70a], a
+ ld hl, Coins
+ ld c, a
+ ld a, [hli]
+ and a
+ jr nz, .asm_930ad
+ ld a, [hl]
+ cp c
+ jr nc, .asm_930ad
+ ld hl, UnknownText_0x930d1
+ call PrintText
+ jr Function9307c
+.asm_930ad
+ ld hl, Coins + 1
+ ld a, [hl]
+ sub c
+ ld [hld], a
+ jr nc, .asm_930b6
+ dec [hl]
+.asm_930b6
+ call WaitSFX
+ ld de, SFX_PAY_DAY
+ call PlaySFX
+ ld hl, UnknownText_0x930cc
+ call PrintText
+ and a
+ ret
+; 930c7 (24:70c7)
+
+UnknownText_0x930c7: ; 0x930c7
+ ; Bet how many coins?
+ text_jump UnknownText_0x1c5049
+ db "@"
+; 0x930cc
+
+UnknownText_0x930cc: ; 0x930cc
+ ; Start!
+ text_jump UnknownText_0x1c505e
+ db "@"
+; 0x930d1
+
+UnknownText_0x930d1: ; 0x930d1
+ ; Not enough coins.
+ text_jump UnknownText_0x1c5066
+ db "@"
+; 0x930d6
+
+MenuDataHeader_0x930d6: ; 0x930d6
+ db $40 ; flags
+ db 10, 14 ; start coords
+ db 17, 19 ; end coords
+ dw MenuData2_0x930de
+ db 1 ; default option
+; 0x930de
+
+MenuData2_0x930de: ; 0x930de
+ db $80 ; flags
+ db 3 ; items
+ db " 3@"
+ db " 2@"
+ db " 1@"
+; 0x930e9
+
+Function930e9: ; 930e9 (24:70e9)
+ ld hl, Coins
+ ld a, [hli]
+ or [hl]
+ jr nz, .asm_930fd
+ ld hl, UnknownText_9311a
+ call PrintText
+ ld c, 60
+ call DelayFrames
+ jr .asm_93118
+.asm_930fd
+ ld hl, UnknownText_9311f
+ call PrintText
+ call LoadMenuTextBox
+ lb bc, 14, 12
+ call PlaceYesNoBox
+ ld a, [MenuSelection2]
+ dec a
+ call WriteBackup
+ and a
+ jr nz, .asm_93118
+ and a
+ ret
+.asm_93118
+ scf
+ ret
+; 9311a (24:711a)
+
+UnknownText_9311a: ; 9311a
+ text_jump UnknownText_0x1c5079
+ db "@"
+
+UnknownText_9311f: ; 9311f
+ text_jump UnknownText_0x1c5092
+ db "@"
+
+Function93124: ; 93124 (24:7124)
+ ld a, [EffectFailed]
+ cp $ff
+ jr z, .asm_93151
+ srl a
+ ld e, a
+ ld d, 0
+ ld hl, .data_93145
+ add hl, de
+ ld a, [hli]
+ ld [PlayerUsedMoves], a
+ ld e, a
+ ld a, [hl]
+ ld [wc711], a
+ ld d, a
+ callba MobileFn_105fe3
+ ret
+
+.data_93145
+ db $2c, $01
+ db $32, $00
+ db $06, $00
+ db $08, $00
+ db $0a, $00
+ db $0f, $00
+
+.asm_93151
+ ld hl, wc711
+ xor a
+ ld [hli], a
+ ld [hl], a
+ ret
+
+Function93158: ; 93158 (24:7158)
+ ld a, [EffectFailed]
+ cp $ff
+ jr nz, .asm_9316c
+ ld hl, UnknownText_0x931e0
+ call PrintText
+ callba MobileFn_105fd0
+ ret
+.asm_9316c
+ srl a
+ ld e, a
+ ld d, 0
+ ld hl, Unknown_93195
+rept 3
+ add hl, de
+endr
+ ld de, StringBuffer2
+ ld bc, $4
+ call CopyBytes
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, .asm_93188
+ push de
+ jp [hl]
+.asm_93188
+ ld hl, UnknownText_0x931b9
+ call PrintText
+ callba MobileFn_105f9f
+ ret
+; 93195 (24:7195)
+
+Unknown_93195: ; 93195
+ db "300@"
+ dw Function931e5
+ db "50@@"
+ dw Function9320b
+ db "6@@@"
+ dw Function93214
+ db "8@@@"
+ dw Function93214
+ db "10@@"
+ dw Function93214
+ db "15@@"
+ dw Function93214
+; 931b9
+
+UnknownText_0x931b9: ; 0x931b9
+ start_asm
+; 0x931ba
+
+Function931ba: ; 931ba
+ ld a, [EffectFailed]
+ add $25
+ ldcoord_a 2, 13
+ inc a
+ ldcoord_a 2, 14
+ inc a
+ ldcoord_a 3, 13
+ inc a
+ ldcoord_a 3, 14
+ hlcoord 18, 17
+ ld [hl], $ee
+ ld hl, UnknownText_0x931db
+rept 4
+ inc bc
+endr
+ ret
+; 931db
+
+UnknownText_0x931db: ; 0x931db
+ ; lined up! Won @ coins!
+ text_jump UnknownText_0x1c509f
+ db "@"
+; 0x931e0
+
+UnknownText_0x931e0: ; 0x931e0
+ ; Darn!
+ text_jump UnknownText_0x1c50bb
+ db "@"
+; 0x931e5
+
+Function931e5: ; 931e5
+ ld a, SFX_2ND_PLACE
+ call Function9331e
+ call WaitSFX
+ ld a, [wd002]
+ and a
+ jr nz, .asm_931ff
+ call Random
+ and $14
+ ret z
+ ld a, $ff
+ ld [wc709], a
+ ret
+
+.asm_931ff
+ call Random
+ and $1c
+ ret z
+ ld a, $ff
+ ld [wc709], a
+ ret
+; 9320b
+
+Function9320b: ; 9320b
+ ld a, SFX_3RD_PLACE
+ call Function9331e
+ call WaitSFX
+ ret
+; 93214
+
+Function93214: ; 93214
+ ld a, SFX_PRESENT
+ call Function9331e
+ call WaitSFX
+ ret
+; 9321d
+
+Function9321d: ; 9321d (24:721d)
+ ld hl, $b
+ add hl, bc
+ ld e, [hl]
+ ld d, 0
+ ld hl, Jumptable_9322d
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+Jumptable_9322d: ; 9322d (24:722d)
+ dw Function93233
+ dw Function93259
+ dw Function93289
+
+
+Function93233: ; 93233 (24:7233)
+ ld hl, $e
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr nz, .asm_93247
+ ld a, $2
+ ld [wcf64], a
+ ld hl, 0
+ add hl, bc
+ ld [hl], $0
+ ret
+.asm_93247
+ dec [hl]
+ ld hl, $b
+ add hl, bc
+ inc [hl]
+ ld hl, $c
+ add hl, bc
+ ld [hl], $30
+ ld hl, $6
+ add hl, bc
+ ld [hl], $0
+
+Function93259: ; 93259 (24:7259)
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ cp $20
+ jr c, .asm_93273
+ dec [hl]
+ ld e, a
+ ld d, $70
+ callba Functionce765
+ ld a, e
+ ld hl, $7
+ add hl, bc
+ ld [hl], a
+ ret
+.asm_93273
+ ld hl, $b
+ add hl, bc
+ inc [hl]
+ ld hl, $d
+ add hl, bc
+ ld [hl], $2
+ ld a, $1
+ ld [wcf64], a
+ ld a, SFX_PLACE_PUZZLE_PIECE_DOWN
+ call Function9331e
+ ret
+
+Function93289: ; 93289 (24:7289)
+ ld hl, $6
+ add hl, bc
+ ld a, [hl]
+rept 2
+ inc [hl]
+endr
+ cp $48
+ jr nc, .asm_932a3
+ and $3
+ ret nz
+ ld hl, $d
+ add hl, bc
+ ld a, [hl]
+ xor $ff
+ inc a
+ ld [hl], a
+ ld [hSCY], a
+ ret
+.asm_932a3
+ ld hl, $b
+ add hl, bc
+ xor a
+ ld [hl], a
+ ld [hSCY], a
+ ret
+
+Function932ac: ; 932ac (24:72ac)
+ ld hl, $b
+ add hl, bc
+ ld e, [hl]
+ ld d, 0
+ ld hl, Jumptable_932bc
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+Jumptable_932bc: ; 932bc (24:72bc)
+ dw Function932c2
+ dw Function932e0
+ dw Function932fc
+
+
+Function932c2: ; 932c2 (24:72c2)
+ ld hl, $4
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ cp $68
+ jr z, .asm_932d6
+ and $f
+ ret nz
+ ld de, SFX_JUMP_OVER_LEDGE
+ call PlaySFX
+ ret
+.asm_932d6
+ ld hl, $b
+ add hl, bc
+ inc [hl]
+ ld a, $1
+ ld [wcf64], a
+
+Function932e0: ; 932e0 (24:72e0)
+ ld a, [wcf64]
+ cp $2
+ jr z, .asm_932f1
+ cp $5
+ ret nz
+ ld hl, 0
+ add hl, bc
+ ld [hl], $0
+ ret
+.asm_932f1
+ ld hl, $b
+ add hl, bc
+ inc [hl]
+ ld hl, $c
+ add hl, bc
+ ld [hl], $8
+
+Function932fc: ; 932fc (24:72fc)
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_93306
+ dec [hl]
+ ret
+.asm_93306
+ ld hl, $b
+ add hl, bc
+ dec [hl]
+ push bc
+ ld de, $606c
+ ld a, $8
+ call Function3b2a
+ pop bc
+ ret
+; 93316 (24:7316)
+
+Function93316: ; 93316
+ push bc
+ ld c, 16
+ call DelayFrames
+ pop bc
+ ret
+; 9331e
+
+Function9331e: ; 9331e (24:731e)
+ push de
+ ld e, a
+ ld d, 0
+ call PlaySFX
+ pop de
+ ret
+; 93327 (24:7327)
+
+Unknown_93327: ; 93327
+ db $00, $08, $14, $0c, $10, $00, $08, $14, $0c, $10, $04, $08, $14, $0c, $10, $00, $08, $14
+Unknown_93339: ; 93339
+ db $00, $0c, $08, $10, $14, $04, $0c, $08, $10, $14, $04, $0c, $08, $10, $14, $00, $0c, $08
+Unknown_9334b: ; 9334b
+ db $00, $0c, $08, $10, $14, $0c, $08, $10, $14, $0c, $04, $08, $10, $14, $0c, $00, $0c, $08
+; 9335d
+
+SlotsTilemap: ; 9335d
+INCBIN "gfx/slots.tilemap"
+; 9344d
+
+Slots1LZ: ; 9344d
+INCBIN "gfx/slots_1.2bpp.lz"
+; 935cd
+
+Slots2LZ: ; 935cd
+INCBIN "gfx/slots_2.2bpp.lz"
+; 9382d
+
+Slots3LZ: ; 9382d
+INCBIN "gfx/slots_3.2bpp.lz"
+; 93a3d
diff --git a/engine/specials.asm b/engine/specials.asm
index ef53daedc..21d391faa 100644
--- a/engine/specials.asm
+++ b/engine/specials.asm
@@ -42,7 +42,7 @@ SpecialsPointers:: ; c029
; Map Events
add_special BugContestJudging
add_special CheckPartyFullAfterContest
- add_special CheckFirstMonFainted
+ add_special ContestDropOffMons
add_special ContestReturnMons
add_special Special_GiveParkBalls
add_special Special_CheckMagikarpLength
@@ -65,18 +65,18 @@ SpecialsPointers:: ; c029
add_special Special_SlotMachine
add_special Special_CardFlip
add_special Special_DummyNonfunctionalGameCornerGame
- add_special Special_WhiteBGMapBufferScreen
- add_special FadeBlackBGMap
+ add_special Special_ClearBGPalettesBufferScreen
+ add_special FadeOutPalettes
add_special Special_BattleTowerFade
add_special Special_FadeBlackQuickly
- add_special FadeInBGMap
+ add_special FadeInPalettes
add_special Special_FadeInQuickly
add_special Special_ReloadSpritesNoPalettes
- add_special WhiteBGMap
+ add_special ClearBGPalettes
add_special UpdateTimePals
add_special ClearTileMap
add_special UpdateSprites
- add_special Special_ReplaceKrisSprite
+ add_special ReplaceKrisSprite
add_special Special_GameCornerPrizeMonCheckDex
add_special SpecialSeenMon
add_special WaitSFX
@@ -124,7 +124,7 @@ SpecialsPointers:: ; c029
add_special ProfOaksPCBoot
add_special SpecialGameboyCheck
add_special SpecialTrainerHouse
- add_special Function16dc7
+ add_special PhotoStudio
add_special InitRoamMons
add_special Functionc48f
add_special Functionc49f
@@ -139,9 +139,9 @@ SpecialsPointers:: ; c029
add_special Function1700b0
add_special Function1700ba
add_special Function170114
- add_special Function170215
+ add_special BattleTowerBattle
add_special Function1704e1
- add_special Function17021d
+ add_special EmptySpecial_17021d
add_special Function_LoadOpponentTrainerAndPokemonsWithOTSprite
add_special Function11ba38
add_special SpecialCheckForBattleTowerRules
@@ -154,7 +154,7 @@ SpecialsPointers:: ; c029
add_special Function4925b
add_special SpecialOmanyteChamber
add_special Function11c1ab
- add_special Function170687
+ add_special BattleTowerAction
add_special Special_DisplayUnownWords
add_special Special_Menu_ChallengeExplanationCancel
add_special Function17d2b6
@@ -178,7 +178,7 @@ SpecialsPointers:: ; c029
add_special Function1037eb
add_special Function10383c
add_special Mobile_HealParty
- add_special Function14168
+ add_special RefreshSprites
add_special Function1037c2
add_special Function10630f
add_special Function103780
@@ -465,8 +465,8 @@ UnknownText_0xc3d6: ; 0xc3d6
db "@"
; 0xc3db
-Special_WhiteBGMapBufferScreen: ; c3db
- call WhiteBGMap
+Special_ClearBGPalettesBufferScreen: ; c3db
+ call ClearBGPalettes
call BufferScreen
ret
; c3e2
diff --git a/engine/sprites.asm b/engine/sprites.asm
new file mode 100755
index 000000000..517428007
--- /dev/null
+++ b/engine/sprites.asm
@@ -0,0 +1,1480 @@
+GetEmote2bpp: ; 1412a
+ ld a, $1
+ ld [rVBK], a
+ call Get2bpp
+ xor a
+ ld [rVBK], a
+ ret
+; 14135
+
+_ReplaceKrisSprite:: ; 14135
+ call GetPlayerSprite
+ ld a, [UsedSprites]
+ ld [hUsedSpriteIndex], a
+ ld a, [UsedSprites + 1]
+ ld [hUsedSpriteTile], a
+ call Function143c8
+ ret
+; 14146
+
+Function14146: ; 14146
+ ld hl, wSpriteFlags
+ ld a, [hl]
+ push af
+ res 7, [hl]
+ set 6, [hl]
+ call RunCallback_04
+ pop af
+ ld [wSpriteFlags], a
+ ret
+; 14157
+
+Function14157: ; 14157
+ ld hl, wSpriteFlags
+ ld a, [hl]
+ push af
+ set 7, [hl]
+ res 6, [hl]
+ call RunCallback_04
+ pop af
+ ld [wSpriteFlags], a
+ ret
+; 14168
+
+RefreshSprites:: ; 14168
+ call .Refresh
+ call RunCallback_04
+ ret
+; 1416f
+
+.Refresh: ; 1416f
+ xor a
+ ld bc, UsedSpritesEnd - UsedSprites
+ ld hl, UsedSprites
+ call ByteFill
+ call GetPlayerSprite
+ call AddMapSprites
+ call LoadAndSortSprites
+ ret
+; 14183
+
+GetPlayerSprite: ; 14183
+; Get Chris or Kris's sprite.
+ ld hl, .Chris
+ ld a, [wPlayerSpriteSetupFlags]
+ bit 2, a
+ jr nz, .go
+ ld a, [PlayerGender]
+ bit 0, a
+ jr z, .go
+ ld hl, .Kris
+
+.go
+ ld a, [PlayerState]
+ ld c, a
+.loop
+ ld a, [hli]
+ cp c
+ jr z, .good
+ inc hl
+ cp $ff
+ jr nz, .loop
+
+; Any player state not in the array defaults to Chris's sprite.
+ xor a ; ld a, PLAYER_NORMAL
+ ld [PlayerState], a
+ ld a, SPRITE_CHRIS
+ jr .finish
+
+.good
+ ld a, [hl]
+
+.finish
+ ld [UsedSprites + 0], a
+ ld [PlayerSprite], a
+ ld [PlayerObjectSprite], a
+ ret
+
+.Chris
+ db PLAYER_NORMAL, SPRITE_CHRIS
+ db PLAYER_BIKE, SPRITE_CHRIS_BIKE
+ db PLAYER_SURF, SPRITE_SURF
+ db PLAYER_SURF_PIKA, SPRITE_SURFING_PIKACHU
+ db $ff
+
+.Kris
+ db PLAYER_NORMAL, SPRITE_KRIS
+ db PLAYER_BIKE, SPRITE_KRIS_BIKE
+ db PLAYER_SURF, SPRITE_SURF
+ db PLAYER_SURF_PIKA, SPRITE_SURFING_PIKACHU
+ db $ff
+; 141c9
+
+
+AddMapSprites: ; 141c9
+ call GetMapPermission
+ call CheckOutdoorMap
+ jr z, .outdoor
+ call AddIndoorSprites
+ ret
+
+.outdoor
+ call AddOutdoorSprites
+ ret
+; 141d9
+
+
+AddIndoorSprites: ; 141d9
+ ld hl, Map1ObjectSprite
+ ld a, 1
+.loop
+ push af
+ ld a, [hl]
+ call AddSpriteGFX
+ ld de, OBJECT_LENGTH
+ add hl, de
+ pop af
+ inc a
+ cp NUM_OBJECTS
+ jr nz, .loop
+ ret
+; 141ee
+
+
+AddOutdoorSprites: ; 141ee
+ ld a, [MapGroup]
+ dec a
+ ld c, a
+ ld b, 0
+ ld hl, OutdoorSprites
+rept 2
+ add hl, bc
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld c, MAX_OUTDOOR_SPRITES
+.loop
+ push bc
+ ld a, [hli]
+ call AddSpriteGFX
+ pop bc
+ dec c
+ jr nz, .loop
+ ret
+; 14209
+
+
+RunCallback_04: ; 14209
+ ld a, $4
+ call RunMapCallback
+ call Function1439b
+ call Function14215
+ ret
+; 14215
+
+Function14215: ; 14215
+ ld a, [wSpriteFlags]
+ bit 6, a
+ ret nz
+ ld c, EMOTE_08
+ callba LoadEmote
+ call GetMapPermission
+ call CheckOutdoorMap
+ ld c, EMOTE_0B
+ jr z, .outdoor
+ ld c, EMOTE_0A
+
+.outdoor
+ callba LoadEmote
+ ret
+; 14236
+
+
+
+SafeGetSprite: ; 14236
+ push hl
+ call GetSprite
+ pop hl
+ ret
+; 1423c
+
+GetSprite: ; 1423c
+ call GetMonSprite
+ ret c
+
+ ld hl, SpriteHeaders ; address
+ dec a
+ ld c, a
+ ld b, 0
+ ld a, 6
+ call AddNTimes
+ ; load the address into de
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ; load the length into c
+ ld a, [hli]
+ swap a
+ ld c, a
+ ; load the sprite bank into both b and h
+ ld b, [hl]
+ ld a, [hli]
+ ; load the sprite type into l
+ ld l, [hl]
+ ld h, a
+ ret
+; 14259
+
+
+GetMonSprite: ; 14259
+; Return carry if a monster sprite was loaded.
+
+ cp SPRITE_POKEMON
+ jr c, .Normal
+ cp SPRITE_DAYCARE_MON_1
+ jr z, .wBreedMon1
+ cp SPRITE_DAYCARE_MON_2
+ jr z, .wBreedMon2
+ cp SPRITE_VARS
+ jr nc, .Variable
+ jr .Icon
+
+.Normal
+ and a
+ ret
+
+.Icon
+ sub SPRITE_POKEMON
+ ld e, a
+ ld d, 0
+ ld hl, SpriteMons
+ add hl, de
+ ld a, [hl]
+ jr .Mon
+
+.wBreedMon1
+ ld a, [wBreedMon1Species]
+ jr .Mon
+
+.wBreedMon2
+ ld a, [wBreedMon2Species]
+
+.Mon
+ ld e, a
+ and a
+ jr z, .NoBreedmon
+
+ callba Function8e82b
+
+ ld l, 1
+ ld h, 0
+ scf
+ ret
+
+.Variable
+ sub SPRITE_VARS
+ ld e, a
+ ld d, 0
+ ld hl, VariableSprites
+ add hl, de
+ ld a, [hl]
+ and a
+ jp nz, GetMonSprite
+
+.NoBreedmon
+ ld a, 1
+ ld l, 1
+ ld h, 0
+ and a
+ ret
+; 142a7
+
+
+_DoesSpriteHaveFacings:: ; 142a7
+; Checks to see whether we can apply a facing to a sprite.
+; Returns carry unless the sprite is a Pokemon or a Still Sprite.
+ cp SPRITE_POKEMON
+ jr nc, .only_down
+
+ push hl
+ push bc
+ ld hl, SpriteHeaders + SPRITEHEADER_TYPE ; type
+ dec a
+ ld c, a
+ ld b, 0
+ ld a, NUM_SPRITEHEADER_FIELDS
+ call AddNTimes
+ ld a, [hl]
+ pop bc
+ pop hl
+ cp STILL_SPRITE
+ jr nz, .only_down
+ scf
+ ret
+
+.only_down
+ and a
+ ret
+; 142c4
+
+
+_GetSpritePalette:: ; 142c4
+ ld a, c
+ call GetMonSprite
+ jr c, .is_pokemon
+
+ ld hl, SpriteHeaders + 5 ; palette
+ dec a
+ ld c, a
+ ld b, 0
+ ld a, 6
+ call AddNTimes
+ ld c, [hl]
+ ret
+
+.is_pokemon
+ xor a
+ ld c, a
+ ret
+; 142db
+
+
+LoadAndSortSprites: ; 142db
+ call LoadSpriteGFX
+ call SortUsedSprites
+ call ArrangeUsedSprites
+ ret
+; 142e5
+
+
+AddSpriteGFX: ; 142e5
+; Add any new sprite ids to a list of graphics to be loaded.
+; Return carry if the list is full.
+
+ push hl
+ push bc
+ ld b, a
+ ld hl, UsedSprites + 2
+ ld c, SPRITE_GFX_LIST_CAPACITY - 1
+.loop
+ ld a, [hl]
+ cp b
+ jr z, .exists
+ and a
+ jr z, .new
+rept 2
+ inc hl
+endr
+ dec c
+ jr nz, .loop
+
+ pop bc
+ pop hl
+ scf
+ ret
+
+.exists
+ pop bc
+ pop hl
+ and a
+ ret
+
+.new
+ ld [hl], b
+ pop bc
+ pop hl
+ and a
+ ret
+; 14306
+
+
+LoadSpriteGFX: ; 14306
+; Bug: b is not preserved, so
+; it's useless as a next count.
+
+ ld hl, UsedSprites
+ ld b, SPRITE_GFX_LIST_CAPACITY
+.loop
+ ld a, [hli]
+ and a
+ jr z, .done
+ push hl
+ call .LoadSprite
+ pop hl
+ ld [hli], a
+ dec b
+ jr nz, .loop
+
+.done
+ ret
+
+.LoadSprite
+ call GetSprite
+ ld a, l
+ ret
+; 1431e
+
+
+SortUsedSprites: ; 1431e
+; Bubble-sort sprites by type.
+
+; Run backwards through UsedSprites to find the last one.
+
+ ld c, SPRITE_GFX_LIST_CAPACITY
+ ld de, UsedSprites + (SPRITE_GFX_LIST_CAPACITY - 1) * 2
+.FindLastSprite
+ ld a, [de]
+ and a
+ jr nz, .FoundLastSprite
+rept 2
+ dec de
+endr
+ dec c
+ jr nz, .FindLastSprite
+.FoundLastSprite
+ dec c
+ jr z, .quit
+
+; If the length of the current sprite is
+; higher than a later one, swap them.
+
+ inc de
+ ld hl, UsedSprites + 1
+
+.CheckSprite
+ push bc
+ push de
+ push hl
+
+.CheckFollowing
+ ld a, [de]
+ cp [hl]
+ jr nc, .loop
+
+; Swap the two sprites.
+
+ ld b, a
+ ld a, [hl]
+ ld [hl], b
+ ld [de], a
+ dec de
+ dec hl
+ ld a, [de]
+ ld b, a
+ ld a, [hl]
+ ld [hl], b
+ ld [de], a
+ inc de
+ inc hl
+
+; Keep doing this until everything's in order.
+
+.loop
+rept 2
+ dec de
+endr
+ dec c
+ jr nz, .CheckFollowing
+
+ pop hl
+rept 2
+ inc hl
+endr
+ pop de
+ pop bc
+ dec c
+ jr nz, .CheckSprite
+
+.quit
+ ret
+; 14355
+
+
+ArrangeUsedSprites: ; 14355
+; Get the length of each sprite and space them out in VRAM.
+; Crystal introduces a second table in VRAM bank 0.
+
+ ld hl, UsedSprites
+ ld c, SPRITE_GFX_LIST_CAPACITY
+ ld b, 0
+.FirstTableLength
+; Keep going until the end of the list.
+ ld a, [hli]
+ and a
+ jr z, .quit
+
+ ld a, [hl]
+ call GetSpriteLength
+
+; Spill over into the second table after $80 tiles.
+ add b
+ cp $80
+ jr z, .loop
+ jr nc, .SecondTable
+
+.loop
+ ld [hl], b
+ inc hl
+ ld b, a
+
+; Assumes the next table will be reached before c hits 0.
+ dec c
+ jr nz, .FirstTableLength
+
+.SecondTable
+; The second tile table starts at tile $80.
+ ld b, $80
+ dec hl
+.SecondTableLength
+; Keep going until the end of the list.
+ ld a, [hli]
+ and a
+ jr z, .quit
+
+ ld a, [hl]
+ call GetSpriteLength
+
+; There are only two tables, so don't go any further than that.
+ add b
+ jr c, .quit
+
+ ld [hl], b
+ ld b, a
+ inc hl
+
+ dec c
+ jr nz, .SecondTableLength
+
+.quit
+ ret
+; 14386
+
+
+GetSpriteLength: ; 14386
+; Return the length of sprite type a in tiles.
+
+ cp WALKING_SPRITE
+ jr z, .AnyDirection
+ cp STANDING_SPRITE
+ jr z, .AnyDirection
+ cp STILL_SPRITE
+ jr z, .OneDirection
+
+ ld a, 12
+ ret
+
+.AnyDirection
+ ld a, 12
+ ret
+
+.OneDirection
+ ld a, 4
+ ret
+; 1439b
+
+
+Function1439b: ; 1439b
+ ld hl, UsedSprites
+ ld c, SPRITE_GFX_LIST_CAPACITY
+.loop
+ ld a, [wSpriteFlags]
+ res 5, a
+ ld [wSpriteFlags], a
+ ld a, [hli]
+ and a
+ jr z, .done
+ ld [hUsedSpriteIndex], a
+ ld a, [hli]
+ ld [hUsedSpriteTile], a
+ bit 7, a
+ jr z, .dont_set
+ ld a, [wSpriteFlags]
+ set 5, a
+ ld [wSpriteFlags], a
+
+.dont_set
+ push bc
+ push hl
+ call Function143c8
+ pop hl
+ pop bc
+ dec c
+ jr nz, .loop
+
+.done
+ ret
+; 143c8
+
+Function143c8: ; 143c8
+ ld a, [hUsedSpriteIndex]
+ call SafeGetSprite
+ ld a, [hUsedSpriteTile]
+ call .GetTileAddr
+ push hl
+ push de
+ push bc
+ ld a, [wSpriteFlags]
+ bit 7, a
+ jr nz, .skip
+ call .CopyToVram
+
+.skip
+ pop bc
+ ld l, c
+ ld h, $0
+rept 4
+ add hl, hl
+endr
+ pop de
+ add hl, de
+ ld d, h
+ ld e, l
+ pop hl
+ ld a, [wSpriteFlags]
+ bit 5, a
+ jr nz, .done
+ bit 6, a
+ jr nz, .done
+ ld a, [hUsedSpriteIndex]
+ call _DoesSpriteHaveFacings
+ jr c, .done
+ ld a, h
+ add $8
+ ld h, a
+ call .CopyToVram
+
+.done
+ ret
+; 14406
+
+.GetTileAddr: ; 14406
+; Return the address of tile (a) in (hl).
+ and $7f
+ ld l, a
+ ld h, 0
+rept 4
+ add hl, hl
+endr
+ ld a, l
+ add VTiles0 % $100
+ ld l, a
+ ld a, h
+ adc VTiles0 / $100
+ ld h, a
+ ret
+; 14418
+
+.CopyToVram: ; 14418
+ ld a, [rVBK]
+ push af
+ ld a, [wSpriteFlags]
+ bit 5, a
+ ld a, $1
+ jr z, .bankswitch
+ ld a, $0
+
+.bankswitch
+ ld [rVBK], a
+ call Get2bpp
+ pop af
+ ld [rVBK], a
+ ret
+; 1442f
+
+LoadEmote:: ; 1442f
+; Get the address of the pointer to emote c.
+ ld a, c
+ ld bc, 6
+ ld hl, EmotesPointers
+ call AddNTimes
+; Load the emote address into de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+; load the length of the emote (in tiles) into c
+ inc hl
+ ld c, [hl]
+ swap c
+; load the emote pointer bank into b
+ inc hl
+ ld b, [hl]
+; load the VRAM destination into hl
+ inc hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+; if the emote has a length of 0, do not proceed (error handling)
+ ld a, c
+ and a
+ ret z
+ call GetEmote2bpp
+ ret
+; 1444d
+
+emote_header: MACRO
+ dw \1
+ db \2 tiles, BANK(\1)
+ dw \3
+ENDM
+
+EmotesPointers: ; 144d
+; dw source address
+; db length, bank
+; dw dest address
+
+ emote_header ShockEmote, 4, VTiles1 tile $78
+ emote_header QuestionEmote, 4, VTiles1 tile $78
+ emote_header HappyEmote, 4, VTiles1 tile $78
+ emote_header SadEmote, 4, VTiles1 tile $78
+ emote_header HeartEmote, 4, VTiles1 tile $78
+ emote_header BoltEmote, 4, VTiles1 tile $78
+ emote_header SleepEmote, 4, VTiles1 tile $78
+ emote_header FishEmote, 4, VTiles1 tile $78
+ emote_header FishingRodGFX1, 1, VTiles1 tile $7c
+ emote_header FishingRodGFX2, 2, VTiles1 tile $7c
+ emote_header FishingRodGFX3, 2, VTiles1 tile $7e
+ emote_header FishingRodGFX4, 1, VTiles1 tile $7e
+; 14495
+
+
+SpriteMons: ; 14495
+ db UNOWN
+ db GEODUDE
+ db GROWLITHE
+ db WEEDLE
+ db SHELLDER
+ db ODDISH
+ db GENGAR
+ db ZUBAT
+ db MAGIKARP
+ db SQUIRTLE
+ db TOGEPI
+ db BUTTERFREE
+ db DIGLETT
+ db POLIWAG
+ db PIKACHU
+ db CLEFAIRY
+ db CHARMANDER
+ db JYNX
+ db STARMIE
+ db BULBASAUR
+ db JIGGLYPUFF
+ db GRIMER
+ db EKANS
+ db PARAS
+ db TENTACOOL
+ db TAUROS
+ db MACHOP
+ db VOLTORB
+ db LAPRAS
+ db RHYDON
+ db MOLTRES
+ db SNORLAX
+ db GYARADOS
+ db LUGIA
+ db HO_OH
+; 144b8
+
+
+OutdoorSprites: ; 144b8
+; Valid sprite IDs for each map group.
+
+ dw Group1Sprites
+ dw Group2Sprites
+ dw Group3Sprites
+ dw Group4Sprites
+ dw Group5Sprites
+ dw Group6Sprites
+ dw Group7Sprites
+ dw Group8Sprites
+ dw Group9Sprites
+ dw Group10Sprites
+ dw Group11Sprites
+ dw Group12Sprites
+ dw Group13Sprites
+ dw Group14Sprites
+ dw Group15Sprites
+ dw Group16Sprites
+ dw Group17Sprites
+ dw Group18Sprites
+ dw Group19Sprites
+ dw Group20Sprites
+ dw Group21Sprites
+ dw Group22Sprites
+ dw Group23Sprites
+ dw Group24Sprites
+ dw Group25Sprites
+ dw Group26Sprites
+; 144ec
+
+
+Group13Sprites: ; 144ec
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_TEACHER
+ db SPRITE_FISHER
+ db SPRITE_YOUNGSTER
+ db SPRITE_BLUE
+ db SPRITE_GRAMPS
+ db SPRITE_BUG_CATCHER
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_SWIMMER_GIRL
+ db SPRITE_SWIMMER_GUY
+ db SPRITE_POKE_BALL
+ db SPRITE_FRUIT_TREE
+; 14503
+
+Group23Sprites: ; 14503
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_TEACHER
+ db SPRITE_FISHER
+ db SPRITE_YOUNGSTER
+ db SPRITE_BLUE
+ db SPRITE_GRAMPS
+ db SPRITE_BUG_CATCHER
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_SWIMMER_GIRL
+ db SPRITE_SWIMMER_GUY
+ db SPRITE_POKE_BALL
+ db SPRITE_FRUIT_TREE
+; 1451a
+
+Group14Sprites: ; 1451a
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_TEACHER
+ db SPRITE_FISHER
+ db SPRITE_YOUNGSTER
+ db SPRITE_BLUE
+ db SPRITE_GRAMPS
+ db SPRITE_BUG_CATCHER
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_SWIMMER_GIRL
+ db SPRITE_SWIMMER_GUY
+ db SPRITE_POKE_BALL
+ db SPRITE_FRUIT_TREE
+; 14531
+
+Group6Sprites: ; 14531
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_TEACHER
+ db SPRITE_FISHER
+ db SPRITE_YOUNGSTER
+ db SPRITE_BLUE
+ db SPRITE_GRAMPS
+ db SPRITE_BUG_CATCHER
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_SWIMMER_GIRL
+ db SPRITE_SWIMMER_GUY
+ db SPRITE_POKE_BALL
+ db SPRITE_FRUIT_TREE
+; 14548
+
+Group7Sprites: ; 14548
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_COOLTRAINER_M
+ db SPRITE_SUPER_NERD
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_FISHER
+ db SPRITE_YOUNGSTER
+ db SPRITE_LASS
+ db SPRITE_POKEFAN_M
+ db SPRITE_ROCKET
+ db SPRITE_MISTY
+ db SPRITE_POKE_BALL
+ db SPRITE_SLOWPOKE
+; 1455f
+
+Group25Sprites: ; 1455f
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_COOLTRAINER_M
+ db SPRITE_SUPER_NERD
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_FISHER
+ db SPRITE_YOUNGSTER
+ db SPRITE_LASS
+ db SPRITE_POKEFAN_M
+ db SPRITE_ROCKET
+ db SPRITE_MISTY
+ db SPRITE_POKE_BALL
+ db SPRITE_SLOWPOKE
+; 14576
+
+Group21Sprites: ; 14576
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_FISHER
+ db SPRITE_POLIWAG
+ db SPRITE_TEACHER
+ db SPRITE_GRAMPS
+ db SPRITE_YOUNGSTER
+ db SPRITE_LASS
+ db SPRITE_BIKER
+ db SPRITE_SILVER
+ db SPRITE_BLUE
+ db SPRITE_POKE_BALL
+ db SPRITE_FRUIT_TREE
+; 1458d
+
+Group18Sprites: ; 1458d
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_POKEFAN_M
+ db SPRITE_MACHOP
+ db SPRITE_GRAMPS
+ db SPRITE_YOUNGSTER
+ db SPRITE_FISHER
+ db SPRITE_TEACHER
+ db SPRITE_SUPER_NERD
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_BIKER
+ db SPRITE_POKE_BALL
+ db SPRITE_FRUIT_TREE
+; 145a4
+
+Group12Sprites: ; 145a4
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_POKEFAN_M
+ db SPRITE_MACHOP
+ db SPRITE_GRAMPS
+ db SPRITE_YOUNGSTER
+ db SPRITE_FISHER
+ db SPRITE_TEACHER
+ db SPRITE_SUPER_NERD
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_BIKER
+ db SPRITE_POKE_BALL
+ db SPRITE_FRUIT_TREE
+; 145bb
+
+Group17Sprites: ; 145bb
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_POKEFAN_M
+ db SPRITE_MACHOP
+ db SPRITE_GRAMPS
+ db SPRITE_YOUNGSTER
+ db SPRITE_FISHER
+ db SPRITE_TEACHER
+ db SPRITE_SUPER_NERD
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_BIKER
+ db SPRITE_POKE_BALL
+ db SPRITE_FRUIT_TREE
+; 145d2
+
+Group16Sprites: ; 145d2
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_POKEFAN_M
+ db SPRITE_BUENA
+ db SPRITE_GRAMPS
+ db SPRITE_YOUNGSTER
+ db SPRITE_FISHER
+ db SPRITE_TEACHER
+ db SPRITE_SUPER_NERD
+ db SPRITE_MACHOP
+ db SPRITE_BIKER
+ db SPRITE_POKE_BALL
+ db SPRITE_BOULDER
+; 145e9
+
+Group24Sprites: ; 145e9
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_SILVER
+ db SPRITE_TEACHER
+ db SPRITE_FISHER
+ db SPRITE_COOLTRAINER_M
+ db SPRITE_YOUNGSTER
+ db SPRITE_MONSTER
+ db SPRITE_GRAMPS
+ db SPRITE_BUG_CATCHER
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_POKE_BALL
+ db SPRITE_FRUIT_TREE
+; 14600
+
+Group26Sprites: ; 14600
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_SILVER
+ db SPRITE_TEACHER
+ db SPRITE_FISHER
+ db SPRITE_COOLTRAINER_M
+ db SPRITE_YOUNGSTER
+ db SPRITE_MONSTER
+ db SPRITE_GRAMPS
+ db SPRITE_BUG_CATCHER
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_POKE_BALL
+ db SPRITE_FRUIT_TREE
+; 14617
+
+Group19Sprites: ; 14617
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_SILVER
+ db SPRITE_TEACHER
+ db SPRITE_FISHER
+ db SPRITE_COOLTRAINER_M
+ db SPRITE_YOUNGSTER
+ db SPRITE_MONSTER
+ db SPRITE_GRAMPS
+ db SPRITE_BUG_CATCHER
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_POKE_BALL
+ db SPRITE_FRUIT_TREE
+; 1462e
+
+Group10Sprites: ; 1462e
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_FISHER
+ db SPRITE_LASS
+ db SPRITE_OFFICER
+ db SPRITE_GRAMPS
+ db SPRITE_YOUNGSTER
+ db SPRITE_COOLTRAINER_M
+ db SPRITE_BUG_CATCHER
+ db SPRITE_SUPER_NERD
+ db SPRITE_WEIRD_TREE
+ db SPRITE_POKE_BALL
+ db SPRITE_FRUIT_TREE
+; 14645
+
+Group4Sprites: ; 14645
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_FISHER
+ db SPRITE_LASS
+ db SPRITE_OFFICER
+ db SPRITE_GRAMPS
+ db SPRITE_YOUNGSTER
+ db SPRITE_COOLTRAINER_M
+ db SPRITE_BUG_CATCHER
+ db SPRITE_SUPER_NERD
+ db SPRITE_WEIRD_TREE
+ db SPRITE_POKE_BALL
+ db SPRITE_FRUIT_TREE
+; 1465c
+
+Group8Sprites: ; 1465c
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_KURT_OUTSIDE
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_GRAMPS
+ db SPRITE_YOUNGSTER
+ db SPRITE_OFFICER
+ db SPRITE_POKEFAN_M
+ db SPRITE_BLACK_BELT
+ db SPRITE_TEACHER
+ db SPRITE_AZALEA_ROCKET
+ db SPRITE_LASS
+ db SPRITE_SILVER
+ db SPRITE_FRUIT_TREE
+ db SPRITE_SLOWPOKE
+; 14673
+
+Group11Sprites: ; 14673
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_POKE_BALL
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_GRAMPS
+ db SPRITE_YOUNGSTER
+ db SPRITE_OFFICER
+ db SPRITE_POKEFAN_M
+ db SPRITE_DAYCARE_MON_1
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_ROCKET
+ db SPRITE_LASS
+ db SPRITE_DAYCARE_MON_2
+ db SPRITE_FRUIT_TREE
+ db SPRITE_SLOWPOKE
+; 1468a
+
+Group22Sprites: ; 1468a
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_STANDING_YOUNGSTER
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_OLIVINE_RIVAL
+ db SPRITE_POKEFAN_M
+ db SPRITE_LASS
+ db SPRITE_BUENA
+ db SPRITE_SWIMMER_GIRL
+ db SPRITE_SAILOR
+ db SPRITE_POKEFAN_F
+ db SPRITE_SUPER_NERD
+ db SPRITE_TAUROS
+ db SPRITE_FRUIT_TREE
+ db SPRITE_ROCK
+; 146a1
+
+Group1Sprites: ; 146a1
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_STANDING_YOUNGSTER
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_OLIVINE_RIVAL
+ db SPRITE_POKEFAN_M
+ db SPRITE_LASS
+ db SPRITE_BUENA
+ db SPRITE_SWIMMER_GIRL
+ db SPRITE_SAILOR
+ db SPRITE_POKEFAN_F
+ db SPRITE_SUPER_NERD
+ db SPRITE_TAUROS
+ db SPRITE_FRUIT_TREE
+ db SPRITE_ROCK
+; 146b8
+
+Group9Sprites: ; 146b8
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_LANCE
+ db SPRITE_GRAMPS
+ db SPRITE_SUPER_NERD
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_FISHER
+ db SPRITE_COOLTRAINER_M
+ db SPRITE_LASS
+ db SPRITE_YOUNGSTER
+ db SPRITE_GYARADOS
+ db SPRITE_FRUIT_TREE
+ db SPRITE_POKE_BALL
+; 146cf
+
+Group2Sprites: ; 146cf
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_GRAMPS
+ db SPRITE_YOUNGSTER
+ db SPRITE_LASS
+ db SPRITE_SUPER_NERD
+ db SPRITE_COOLTRAINER_M
+ db SPRITE_POKEFAN_M
+ db SPRITE_BLACK_BELT
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_FISHER
+ db SPRITE_FRUIT_TREE
+ db SPRITE_POKE_BALL
+; 146e6
+
+Group5Sprites: ; 146e6
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_GRAMPS
+ db SPRITE_YOUNGSTER
+ db SPRITE_LASS
+ db SPRITE_SUPER_NERD
+ db SPRITE_COOLTRAINER_M
+ db SPRITE_POKEFAN_M
+ db SPRITE_BLACK_BELT
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_FISHER
+ db SPRITE_FRUIT_TREE
+ db SPRITE_POKE_BALL
+; 146fd
+
+Group3Sprites: ; 146fd
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_GAMEBOY_KID
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_LASS
+ db SPRITE_POKEFAN_F
+ db SPRITE_TEACHER
+ db SPRITE_YOUNGSTER
+ db SPRITE_GROWLITHE
+ db SPRITE_POKEFAN_M
+ db SPRITE_ROCKER
+ db SPRITE_FISHER
+ db SPRITE_SCIENTIST
+ db SPRITE_POKE_BALL
+ db SPRITE_BOULDER
+; 14714
+
+Group15Sprites: ; 14714
+ db SPRITE_SUICUNE
+ db SPRITE_SILVER_TROPHY
+ db SPRITE_FAMICOM
+ db SPRITE_POKEDEX
+ db SPRITE_WILL
+ db SPRITE_KAREN
+ db SPRITE_NURSE
+ db SPRITE_OLD_LINK_RECEPTIONIST
+ db SPRITE_BIG_LAPRAS
+ db SPRITE_BIG_ONIX
+ db SPRITE_SUDOWOODO
+ db SPRITE_BIG_SNORLAX
+ db SPRITE_SAILOR
+ db SPRITE_FISHING_GURU
+ db SPRITE_GENTLEMAN
+ db SPRITE_SUPER_NERD
+ db SPRITE_HO_OH
+ db SPRITE_TEACHER
+ db SPRITE_COOLTRAINER_F
+ db SPRITE_YOUNGSTER
+ db SPRITE_FAIRY
+ db SPRITE_POKE_BALL
+ db SPRITE_ROCK
+; 1472b
+
+Group20Sprites: ; 1472b
+ db SPRITE_OAK
+ db SPRITE_FISHER
+ db SPRITE_TEACHER
+ db SPRITE_TWIN
+ db SPRITE_POKEFAN_M
+ db SPRITE_GRAMPS
+ db SPRITE_FAIRY
+ db SPRITE_SILVER
+ db SPRITE_FISHING_GURU
+ db SPRITE_POKE_BALL
+ db SPRITE_POKEDEX
+; 14736
+
+
+SpriteHeaders: ; 14736
+INCLUDE "gfx/overworld/sprite_headers.asm"
+; 1499a
diff --git a/engine/startmenu.asm b/engine/startmenu.asm
new file mode 100755
index 000000000..1c7768850
--- /dev/null
+++ b/engine/startmenu.asm
@@ -0,0 +1,1970 @@
+StartMenu:: ; 125cd
+
+ call ResetTextRelatedRAM
+
+ ld de, SFX_MENU
+ call PlaySFX
+
+ callba Function6454
+
+ ld hl, StatusFlags2
+ bit 2, [hl] ; bug catching contest
+ ld hl, .MenuDataHeader
+ jr z, .GotMenuData
+ ld hl, .ContestMenuDataHeader
+.GotMenuData
+
+ call LoadMenuDataHeader
+ call .SetUpMenuItems
+ ld a, [wd0d2]
+ ld [wMenuCursorBuffer], a
+ call .DrawMenuAccount_
+ call MenuFunc_1e7f
+ call .DrawBugContestStatusBox
+ call Function2e31
+ call Function2e20
+ callba Function64bf
+ call .DrawBugContestStatus
+ call UpdateTimePals
+ jr .Select
+
+.Reopen
+ call UpdateSprites
+ call UpdateTimePals
+ call .SetUpMenuItems
+ ld a, [wd0d2]
+ ld [wMenuCursorBuffer], a
+
+.Select
+ call .GetInput
+ jr c, .Exit
+ call .DrawMenuAccount
+ ld a, [wMenuCursorBuffer]
+ ld [wd0d2], a
+ call PlayClickSFX
+ call Function1bee
+ call .OpenMenu
+
+; Menu items have different return functions.
+; For example, saving exits the menu.
+ ld hl, .MenuReturns
+ ld e, a
+ ld d, 0
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+.MenuReturns
+ dw .Reopen
+ dw .Exit
+ dw .ExitMenuCallFuncLoadMoveSprites
+ dw .ExitMenuRunScriptLoadMoveSprites
+ dw .ExitMenuRunScript
+ dw .ReturnEnd
+ dw .ReturnRedraw
+
+.Exit
+ ld a, [hOAMUpdate]
+ push af
+ ld a, 1
+ ld [hOAMUpdate], a
+ call LoadFontsExtra
+ pop af
+ ld [hOAMUpdate], a
+.ReturnEnd
+ call ExitMenu
+.ReturnEnd2
+ call LoadMoveSprites
+ call UpdateTimePals
+ ret
+
+.GetInput
+; Return carry on exit, and no-carry on selection.
+ xor a
+ ld [hBGMapMode], a
+ call .DrawMenuAccount
+ call SetUpMenu
+ ld a, $ff
+ ld [MenuSelection], a
+.loop
+ call .PrintMenuAccount
+ call Function1f1a
+ ld a, [wcf73]
+ cp B_BUTTON
+ jr z, .b
+ cp A_BUTTON
+ jr z, .a
+ jr .loop
+.a
+ call PlayClickSFX
+ and a
+ ret
+.b
+ scf
+ ret
+; 12691
+
+.ExitMenuRunScript ; 12691
+ call ExitMenu
+ ld a, HMENURETURN_SCRIPT
+ ld [hMenuReturn], a
+ ret
+; 12699
+
+.ExitMenuRunScriptLoadMoveSprites ; 12699
+ call ExitMenu
+ ld a, HMENURETURN_SCRIPT
+ ld [hMenuReturn], a
+ jr .ReturnEnd2
+; 126a2
+
+.ExitMenuCallFuncLoadMoveSprites ; 126a2
+ call ExitMenu
+ ld hl, wQueuedScriptAddr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wQueuedScriptBank]
+ rst FarCall
+ jr .ReturnEnd2
+; 126b1
+
+.ReturnRedraw ; 126b1
+ call .Clear
+ jp .Reopen
+; 126b7
+
+.Clear ; 126b7
+ call ClearBGPalettes
+ call Call_ExitMenu
+ call Function2bae
+ call .DrawMenuAccount_
+ call MenuFunc_1e7f
+ call .DrawBugContestStatus
+ call UpdateSprites
+ call Functiond90
+ call Function2b5c
+ ret
+; 126d3
+
+
+.MenuDataHeader
+ db $40 ; tile backup
+ db 0, 10 ; start coords
+ db 17, 19 ; end coords
+ dw .MenuData
+ db 1 ; default selection
+
+.ContestMenuDataHeader
+ db $40 ; tile backup
+ db 2, 10 ; start coords
+ db 17, 19 ; end coords
+ dw .MenuData
+ db 1 ; default selection
+
+.MenuData
+ db %10101000 ; x padding, wrap around, start can close
+ dn 0, 0 ; rows, columns
+ dw MenuItemsList
+ dw .MenuString
+ dw .Items
+
+.Items
+ dw StartMenu_Pokedex, .PokedexString, .PokedexDesc
+ dw StartMenu_Pokemon, .PartyString, .PartyDesc
+ dw StartMenu_Pack, .PackString, .PackDesc
+ dw StartMenu_Status, .StatusString, .StatusDesc
+ dw StartMenu_Save, .SaveString, .SaveDesc
+ dw StartMenu_Option, .OptionString, .OptionDesc
+ dw StartMenu_Exit, .ExitString, .ExitDesc
+ dw StartMenu_Pokegear, .PokegearString, .PokegearDesc
+ dw StartMenu_Quit, .QuitString, .QuitDesc
+
+.PokedexString db "#DEX@"
+.PartyString db "#MON@"
+.PackString db "PACK@"
+.StatusString db "<PLAYER>@"
+.SaveString db "SAVE@"
+.OptionString db "OPTION@"
+.ExitString db "EXIT@"
+.PokegearString db $24, "GEAR@"
+.QuitString db "QUIT@"
+
+.PokedexDesc db "#MON"
+ next "database@"
+
+.PartyDesc db "Party ", $4a
+ next "status@"
+
+.PackDesc db "Contains"
+ next "items@"
+
+.PokegearDesc db "Trainer's"
+ next "key device@"
+
+.StatusDesc db "Your own"
+ next "status@"
+
+.SaveDesc db "Save your"
+ next "progress@"
+
+.OptionDesc db "Change"
+ next "settings@"
+
+.ExitDesc db "Close this"
+ next "menu@"
+
+.QuitDesc db "Quit and"
+ next "be judged.@"
+
+
+.OpenMenu ; 127e5
+ ld a, [MenuSelection]
+ call .GetMenuAccountTextPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; 127ef
+
+.MenuString ; 127ef
+ push de
+ ld a, [MenuSelection]
+ call .GetMenuAccountTextPointer
+rept 2
+ inc hl
+endr
+ ld a, [hli]
+ ld d, [hl]
+ ld e, a
+ pop hl
+ call PlaceString
+ ret
+; 12800
+
+.MenuDesc ; 12800
+ push de
+ ld a, [MenuSelection]
+ cp $ff
+ jr z, .none
+ call .GetMenuAccountTextPointer
+rept 4
+ inc hl
+endr
+ ld a, [hli]
+ ld d, [hl]
+ ld e, a
+ pop hl
+ call PlaceString
+ ret
+.none
+ pop de
+ ret
+; 12819
+
+
+.GetMenuAccountTextPointer ; 12819
+ ld e, a
+ ld d, 0
+ ld hl, wcf97
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+rept 6
+ add hl, de
+endr
+ ret
+; 12829
+
+
+.SetUpMenuItems ; 12829
+ xor a
+ ld [wcf76], a
+ call .FillMenuList
+
+ ld hl, StatusFlags
+ bit 0, [hl]
+ jr z, .no_pokedex
+ ld a, 0 ; pokedex
+ call .AppendMenuList
+.no_pokedex
+
+ ld a, [PartyCount]
+ and a
+ jr z, .no_pokemon
+ ld a, 1 ; pokemon
+ call .AppendMenuList
+.no_pokemon
+
+ ld a, [wLinkMode]
+ and a
+ jr nz, .no_pack
+ ld hl, StatusFlags2
+ bit 2, [hl] ; bug catching contest
+ jr nz, .no_pack
+ ld a, 2 ; pack
+ call .AppendMenuList
+.no_pack
+
+ ld hl, wPokegearFlags
+ bit 7, [hl]
+ jr z, .no_pokegear
+ ld a, 7 ; pokegear
+ call .AppendMenuList
+.no_pokegear
+
+ ld a, 3 ; status
+ call .AppendMenuList
+
+ ld a, [wLinkMode]
+ and a
+ jr nz, .no_save
+ ld hl, StatusFlags2
+ bit 2, [hl] ; bug catching contest
+ ld a, 8 ; quit
+ jr nz, .write
+ ld a, 4 ; save
+.write
+ call .AppendMenuList
+.no_save
+
+ ld a, 5 ; option
+ call .AppendMenuList
+ ld a, 6 ; exit
+ call .AppendMenuList
+ ld a, c
+ ld [MenuItemsList], a
+ ret
+; 1288d
+
+
+.FillMenuList ; 1288d
+ xor a
+ ld hl, MenuItemsList
+ ld [hli], a
+ ld a, -1
+ ld bc, MenuItemsListEnd - (MenuItemsList + 1)
+ call ByteFill
+ ld de, MenuItemsList + 1
+ ld c, 0
+ ret
+; 128a0
+
+.AppendMenuList ; 128a0
+ ld [de], a
+ inc de
+ inc c
+ ret
+; 128a4
+
+.DrawMenuAccount_ ; 128a4
+ jp .DrawMenuAccount
+; 128a7
+
+.PrintMenuAccount ; 128a7
+ call .IsMenuAccountOn
+ ret z
+ call .DrawMenuAccount
+ decoord 0, 14
+ jp .MenuDesc
+; 128b4
+
+.DrawMenuAccount ; 128b4
+ call .IsMenuAccountOn
+ ret z
+ hlcoord 0, 13
+ lb bc, 5, 10
+ call ClearBox
+ hlcoord 0, 13
+ ld b, 3
+ ld c, 8
+ jp TextBoxPalette
+; 128cb
+
+.IsMenuAccountOn ; 128cb
+ ld a, [Options2]
+ and 1
+ ret
+; 128d1
+
+.DrawBugContestStatusBox ; 128d1
+ ld hl, StatusFlags2
+ bit 2, [hl] ; bug catching contest
+ ret z
+ callba Function24bdc
+ ret
+; 128de
+
+.DrawBugContestStatus ; 128de
+ ld hl, StatusFlags2
+ bit 2, [hl] ; bug catching contest
+ jr nz, .contest
+ ret
+.contest
+ callba Function24be7
+ ret
+; 128ed
+
+
+StartMenu_Exit: ; 128ed
+; Exit the menu.
+
+ ld a, 1
+ ret
+; 128f0
+
+
+StartMenu_Quit: ; 128f0
+; Retire from the bug catching contest.
+
+ ld hl, .EndTheContestText
+ call Function12cf5
+ jr c, .DontEndContest
+ ld a, BANK(BugCatchingContestReturnToGateScript)
+ ld hl, BugCatchingContestReturnToGateScript
+ call FarQueueScript
+ ld a, 4
+ ret
+
+.DontEndContest
+ ld a, 0
+ ret
+
+.EndTheContestText
+ text_jump UnknownText_0x1c1a6c
+ db "@"
+; 1290b
+
+
+StartMenu_Save: ; 1290b
+; Save the game.
+
+ call BufferScreen
+ callba Function14a1a
+ jr nc, .asm_12919
+ ld a, 0
+ ret
+.asm_12919
+ ld a, 1
+ ret
+; 1291c
+
+
+StartMenu_Option: ; 1291c
+; Game options.
+
+ call FadeToMenu
+ callba OptionsMenu
+ ld a, 6
+ ret
+; 12928
+
+
+StartMenu_Status: ; 12928
+; Player status.
+
+ call FadeToMenu
+ callba Function25105
+ call Function2b3c
+ ld a, 0
+ ret
+; 12937
+
+
+StartMenu_Pokedex: ; 12937
+
+ ld a, [PartyCount]
+ and a
+ jr z, .asm_12949
+
+ call FadeToMenu
+ callba Pokedex
+ call Function2b3c
+
+.asm_12949
+ ld a, 0
+ ret
+; 1294c
+
+
+StartMenu_Pokegear: ; 1294c
+
+ call FadeToMenu
+ callba Function90b8d
+ call Function2b3c
+ ld a, 0
+ ret
+; 1295b
+
+
+StartMenu_Pack: ; 1295b
+
+ call FadeToMenu
+ callba Pack
+ ld a, [wcf66]
+ and a
+ jr nz, .asm_12970
+ call Function2b3c
+ ld a, 0
+ ret
+.asm_12970
+ call Function2b4d
+ ld a, 4
+ ret
+; 12976
+
+
+StartMenu_Pokemon: ; 12976
+
+ ld a, [PartyCount]
+ and a
+ jr z, .return
+
+ call FadeToMenu
+
+.choosemenu
+ xor a
+ ld [PartyMenuActionText], a ; Choose a POKéMON.
+ call ClearBGPalettes
+
+.menu
+ callba Function5004f
+ callba Function50405
+ callba Function503e0
+
+.menunoreload
+ callba WritePartyMenuTilemap
+ callba PrintPartyMenuText
+ call WaitBGMap
+ call SetPalettes ; load regular palettes?
+ call DelayFrame
+ callba PartyMenuSelect
+ jr c, .return ; if cancelled or pressed B
+
+ call PokemonActionSubmenu
+ cp 3
+ jr z, .menu
+ cp 0
+ jr z, .choosemenu
+ cp 1
+ jr z, .menunoreload
+ cp 2
+ jr z, .quit
+
+.return
+ call Function2b3c
+ ld a, 0
+ ret
+
+.quit
+ ld a, b
+ push af
+ call Function2b4d
+ pop af
+ ret
+; 129d5
+
+Function129d5: ; 129d5
+ ld a, [NumItems]
+ and a
+ ret nz
+ ld a, [NumKeyItems]
+ and a
+ ret nz
+ ld a, [NumBalls]
+ and a
+ ret nz
+ ld hl, TMsHMs
+ ld b, NUM_TMS + NUM_HMS
+.asm_129e9
+ ld a, [hli]
+ and a
+ jr nz, .asm_129f2
+ dec b
+ jr nz, .asm_129e9
+ scf
+ ret
+.asm_129f2
+ and a
+ ret
+
+Function129f4: ; 129f4
+ push de
+ call PartyMonItemName
+ callba _CheckTossableItem
+ ld a, [wItemAttributeParamBuffer]
+ and a
+ jr nz, .asm_12a3f
+ ld hl, UnknownText_0x12a45
+ call MenuTextBox
+ callba Function24fbf
+ push af
+ call WriteBackup
+ call ExitMenu
+ pop af
+ jr c, .asm_12a42
+ ld hl, UnknownText_0x12a4a
+ call MenuTextBox
+ call YesNoBox
+ push af
+ call ExitMenu
+ pop af
+ jr c, .asm_12a42
+ pop hl
+ ld a, [wd107]
+ call TossItem
+ call PartyMonItemName
+ ld hl, UnknownText_0x12a4f
+ call MenuTextBox
+ call ExitMenu
+ and a
+ ret
+.asm_12a3f
+ call Function12a54
+.asm_12a42
+ pop hl
+ scf
+ ret
+; 12a45 (4:6a45)
+
+UnknownText_0x12a45: ; 0x12a45
+ ; Toss out how many @ (S)?
+ text_jump UnknownText_0x1c1a90
+ db "@"
+; 0x12a4a
+
+UnknownText_0x12a4a: ; 0x12a4a
+ ; Throw away @ @ (S)?
+ text_jump UnknownText_0x1c1aad
+ db "@"
+; 0x12a4f
+
+UnknownText_0x12a4f: ; 0x12a4f
+ ; Discarded @ (S).
+ text_jump UnknownText_0x1c1aca
+ db "@"
+; 0x12a54
+
+Function12a54: ; 12a54 (4:6a54)
+ ld hl, UnknownText_0x12a5b
+ call MenuTextBoxBackup
+ ret
+; 12a5b (4:6a5b)
+
+UnknownText_0x12a5b: ; 0x12a5b
+ ; That's too impor- tant to toss out!
+ text_jump UnknownText_0x1c1adf
+ db "@"
+; 0x12a60
+
+CantUseItem: ; 12a60
+ ld hl, CantUseItemText
+ call Function2012
+ ret
+; 12a67
+
+CantUseItemText: ; 12a67
+ text_jump UnknownText_0x1c1b03
+ db "@"
+; 12a6c
+
+
+PartyMonItemName: ; 12a6c
+ ld a, [CurItem]
+ ld [wd265], a
+ call GetItemName
+ call CopyName1
+ ret
+; 12a79
+
+
+CancelPokemonAction: ; 12a79
+ callba Function50405
+ callba Function8ea71
+ ld a, 1
+ ret
+; 12a88
+
+
+PokemonActionSubmenu: ; 12a88
+ hlcoord 1, 15
+ lb bc, 2, 18
+ call ClearBox
+ callba MonSubmenu
+ call GetCurNick
+ ld a, [MenuSelection]
+ ld hl, .Actions
+ ld de, 3
+ call IsInArray
+ jr nc, .nothing
+
+ inc hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+.nothing
+ ld a, 0
+ ret
+
+.Actions
+ dbw MONMENU_CUT, MonMenu_Cut ; Cut
+ dbw MONMENU_FLY, MonMenu_Fly ; Fly
+ dbw MONMENU_SURF, MonMenu_Surf ; Surf
+ dbw MONMENU_STRENGTH, MonMenu_Strength ; Strength
+ dbw MONMENU_FLASH, MonMenu_Flash ; Flash
+ dbw MONMENU_WHIRLPOOL, MonMenu_Whirlpool ; Whirlpool
+ dbw MONMENU_DIG, MonMenu_Dig ; Dig
+ dbw MONMENU_TELEPORT, MonMenu_Teleport ; Teleport
+ dbw MONMENU_SOFTBOILED, MonMenu_Softboiled_MilkDrink ; Softboiled
+ dbw MONMENU_MILKDRINK, MonMenu_Softboiled_MilkDrink ; MilkDrink
+ dbw MONMENU_HEADBUTT, MonMenu_Headbutt ; Headbutt
+ dbw MONMENU_WATERFALL, MonMenu_Waterfall ; Waterfall
+ dbw MONMENU_ROCKSMASH, MonMenu_RockSmash ; RockSmash
+ dbw MONMENU_SWEETSCENT, MonMenu_SweetScent ; SweetScent
+ dbw MONMENU_STATS, OpenPartyStats
+ dbw MONMENU_SWITCH, SwitchPartyMons
+ dbw MONMENU_ITEM, GiveTakePartyMonItem
+ dbw MONMENU_CANCEL, CancelPokemonAction
+ dbw MONMENU_MOVE, ManagePokemonMoves ; move
+ dbw MONMENU_MAIL, MonMailAction ; mail
+; 12aec
+
+
+SwitchPartyMons: ; 12aec
+
+; Don't try if there's nothing to switch!
+ ld a, [PartyCount]
+ cp 2
+ jr c, .DontSwitch
+
+ ld a, [CurPartyMon]
+ inc a
+ ld [wd0e3], a
+
+ callba Function8ea8c
+ callba Function5042d
+
+ ld a, 4
+ ld [PartyMenuActionText], a
+ callba WritePartyMenuTilemap
+ callba PrintPartyMenuText
+
+ hlcoord 0, 1
+ ld bc, 20 * 2
+ ld a, [wd0e3]
+ dec a
+ call AddNTimes
+ ld [hl], "▷"
+ call WaitBGMap
+ call SetPalettes
+ call DelayFrame
+
+ callba PartyMenuSelect
+ bit 1, b
+ jr c, .DontSwitch
+
+ callba _SwitchPartyMons
+
+ xor a
+ ld [PartyMenuActionText], a
+
+ callba Function5004f
+ callba Function50405
+ callba Function503e0
+
+ ld a, 1
+ ret
+
+.DontSwitch
+ xor a
+ ld [PartyMenuActionText], a
+ call CancelPokemonAction
+ ret
+; 12b60
+
+
+GiveTakePartyMonItem: ; 12b60
+
+; Eggs can't hold items!
+ ld a, [CurPartySpecies]
+ cp EGG
+ jr z, .asm_12ba6
+
+ ld hl, GiveTakeItemMenuData
+ call LoadMenuDataHeader
+ call InterpretMenu2
+ call ExitMenu
+ jr c, .asm_12ba6
+
+ call GetCurNick
+ ld hl, StringBuffer1
+ ld de, wd050
+ ld bc, $b
+ call CopyBytes
+ ld a, [MenuSelection2]
+ cp 1
+ jr nz, .asm_12ba0
+
+ call LoadStandardMenuDataHeader
+ call ClearPalettes
+ call Function12ba9
+ call ClearPalettes
+ call LoadFontsBattleExtra
+ call ExitMenu
+ ld a, 0
+ ret
+
+.asm_12ba0
+ call TakePartyItem
+ ld a, 3
+ ret
+
+.asm_12ba6
+ ld a, 3
+ ret
+; 12ba9
+
+
+Function12ba9: ; 12ba9
+
+ callba Function106a5
+
+.loop
+ callba Function106be
+
+ ld a, [wcf66]
+ and a
+ jr z, .quit
+
+ ld a, [wcf65]
+ cp 2
+ jr z, .next
+
+ call CheckTossableItem
+ ld a, [wItemAttributeParamBuffer]
+ and a
+ jr nz, .next
+
+ call Function12bd9
+ jr .quit
+
+.next
+ ld hl, CantBeHeldText
+ call MenuTextBoxBackup
+ jr .loop
+
+.quit
+ ret
+; 12bd9
+
+
+Function12bd9: ; 12bd9
+
+ call SpeechTextBox
+ call PartyMonItemName
+ call GetPartyItemLocation
+ ld a, [hl]
+ and a
+ jr z, .asm_12bf4
+
+ push hl
+ ld d, a
+ callba ItemIsMail
+ pop hl
+ jr c, .asm_12c01
+ ld a, [hl]
+ jr .asm_12c08
+
+.asm_12bf4
+ call Function12cea
+ ld hl, MadeHoldText
+ call MenuTextBoxBackup
+ call GivePartyItem
+ ret
+
+.asm_12c01
+ ld hl, PleaseRemoveMailText
+ call MenuTextBoxBackup
+ ret
+
+.asm_12c08
+ ld [wd265], a
+ call GetItemName
+ ld hl, SwitchAlreadyHoldingText
+ call Function12cf5
+ jr c, .asm_12c4b
+
+ call Function12cea
+ ld a, [wd265]
+ push af
+ ld a, [CurItem]
+ ld [wd265], a
+ pop af
+ ld [CurItem], a
+ call Function12cdf
+ jr nc, .asm_12c3c
+
+ ld hl, TookAndMadeHoldText
+ call MenuTextBoxBackup
+ ld a, [wd265]
+ ld [CurItem], a
+ call GivePartyItem
+ ret
+
+.asm_12c3c
+ ld a, [wd265]
+ ld [CurItem], a
+ call Function12cdf
+ ld hl, ItemStorageIsFullText
+ call MenuTextBoxBackup
+
+.asm_12c4b
+ ret
+; 12c4c
+
+
+GivePartyItem: ; 12c4c
+
+ call GetPartyItemLocation
+ ld a, [CurItem]
+ ld [hl], a
+ ld d, a
+ callba ItemIsMail
+ jr nc, .asm_12c5f
+ call Function12cfe
+
+.asm_12c5f
+ ret
+; 12c60
+
+
+TakePartyItem: ; 12c60
+
+ call SpeechTextBox
+ call GetPartyItemLocation
+ ld a, [hl]
+ and a
+ jr z, .asm_12c8c
+
+ ld [CurItem], a
+ call Function12cdf
+ jr nc, .asm_12c94
+
+ callba ItemIsMail
+ call GetPartyItemLocation
+ ld a, [hl]
+ ld [wd265], a
+ ld [hl], NO_ITEM
+ call GetItemName
+ ld hl, TookFromText
+ call MenuTextBoxBackup
+ jr .asm_12c9a
+
+.asm_12c8c
+ ld hl, IsntHoldingAnythingText
+ call MenuTextBoxBackup
+ jr .asm_12c9a
+
+.asm_12c94
+ ld hl, ItemStorageIsFullText
+ call MenuTextBoxBackup
+
+.asm_12c9a
+ ret
+; 12c9b
+
+
+GiveTakeItemMenuData: ; 12c9b
+ db %01010000
+ db 12, 12 ; start coords
+ db 17, 19 ; end coords
+ dw .Items
+ db 1 ; default option
+
+.Items
+ db %10000000 ; x padding
+ db 2 ; # items
+ db "GIVE@"
+ db "TAKE@"
+; 12caf
+
+
+TookAndMadeHoldText: ; 12caf
+ text_jump UnknownText_0x1c1b2c
+ db "@"
+; 12cb4
+
+MadeHoldText: ; 12cb4
+ text_jump UnknownText_0x1c1b57
+ db "@"
+; 12cb9
+
+PleaseRemoveMailText: ; 12cb9
+ text_jump UnknownText_0x1c1b6f
+ db "@"
+; 12cbe
+
+IsntHoldingAnythingText: ; 12cbe
+ text_jump UnknownText_0x1c1b8e
+ db "@"
+; 12cc3
+
+ItemStorageIsFullText: ; 12cc3
+ text_jump UnknownText_0x1c1baa
+ db "@"
+; 12cc8
+
+TookFromText: ; 12cc8
+ text_jump UnknownText_0x1c1bc4
+ db "@"
+; 12ccd
+
+SwitchAlreadyHoldingText: ; 12ccd
+ text_jump UnknownText_0x1c1bdc
+ db "@"
+; 12cd2
+
+CantBeHeldText: ; 12cd2
+ text_jump UnknownText_0x1c1c09
+ db "@"
+; 12cd7
+
+
+GetPartyItemLocation: ; 12cd7
+ push af
+ ld a, MON_ITEM
+ call GetPartyParamLocation
+ pop af
+ ret
+; 12cdf
+
+
+Function12cdf: ; 12cdf
+ ld a, $1
+ ld [wItemQuantityChangeBuffer], a
+ ld hl, NumItems
+ jp ReceiveItem
+; 12cea
+
+
+Function12cea: ; 12cea (4:6cea)
+ ld a, $1
+ ld [wItemQuantityChangeBuffer], a
+ ld hl, NumItems
+ jp TossItem
+
+Function12cf5: ; 12cf5
+ call MenuTextBox
+ call YesNoBox
+ jp ExitMenu
+; 12cfe
+
+
+Function12cfe: ; 12cfe (4:6cfe)
+ ld de, wd002
+ callba Function11e75
+ ld hl, PlayerName
+ ld de, wd023
+ ld bc, $a
+ call CopyBytes
+ ld hl, PlayerID
+ ld bc, $2
+ call CopyBytes
+ ld a, [CurPartySpecies]
+ ld [de], a
+ inc de
+ ld a, [CurItem]
+ ld [de], a
+ ld a, [CurPartyMon]
+ ld hl, sPartyScratch1
+ ld bc, SCRATCHMON_STRUCT_LENGTH
+ call AddNTimes
+ ld d, h
+ ld e, l
+ ld hl, wd002
+ ld bc, SCRATCHMON_STRUCT_LENGTH
+ ld a, BANK(sPartyScratch1)
+ call GetSRAMBank
+ call CopyBytes
+ call CloseSRAM
+ ret
+
+MonMailAction: ; 12d45
+; If in the time capsule or trade center,
+; selecting the mail only allows you to
+; read the mail.
+ ld a, [wLinkMode]
+ cp LINK_TIMECAPSULE
+ jr z, .read
+ cp LINK_TRADECENTER
+ jr z, .read
+
+; Show the READ/TAKE/QUIT menu.
+ ld hl, .MenuDataHeader
+ call LoadMenuDataHeader
+ call InterpretMenu2
+ call ExitMenu
+
+; Interpret the menu.
+ jp c, .done
+ ld a, [MenuSelection2]
+ cp $1
+ jr z, .read
+ cp $2
+ jr z, .take
+ jp .done
+
+.read
+ callba ReadPartyMonMail
+ ld a, $0
+ ret
+
+.take
+ ld hl, .sendmailtopctext
+ call Function12cf5
+ jr c, .RemoveMailToBag
+ ld a, [CurPartyMon]
+ ld b, a
+ callba Function4456e
+ jr c, .MailboxFull
+ ld hl, .sentmailtopctext
+ call MenuTextBoxBackup
+ jr .done
+
+.MailboxFull
+ ld hl, .mailboxfulltext
+ call MenuTextBoxBackup
+ jr .done
+
+.RemoveMailToBag
+ ld hl, .mailwilllosemessagetext
+ call Function12cf5
+ jr c, .done
+ call GetPartyItemLocation
+ ld a, [hl]
+ ld [CurItem], a
+ call Function12cdf
+ jr nc, .BagIsFull
+ call GetPartyItemLocation
+ ld [hl], $0
+ call GetCurNick
+ ld hl, .tookmailfrommontext
+ call MenuTextBoxBackup
+ jr .done
+
+.BagIsFull
+ ld hl, .bagfulltext
+ call MenuTextBoxBackup
+ jr .done
+
+.done
+ ld a, $3
+ ret
+; 12dc9
+
+
+.MenuDataHeader: ; 0x12dc9
+ db $40 ; flags
+ db 10, 12 ; start coords
+ db 17, 19 ; end coords
+ dw .MenuData2
+ db 1 ; default option
+; 0x12dd1
+
+.MenuData2: ; 0x12dd1
+ db $80 ; flags
+ db 3 ; items
+ db "READ@"
+ db "TAKE@"
+ db "QUIT@"
+; 0x12de2
+
+
+.mailwilllosemessagetext: ; 0x12de2
+; The MAIL will lose its message. OK?
+ text_jump UnknownText_0x1c1c22
+ db "@"
+; 0x12de7
+
+.tookmailfrommontext: ; 0x12de7
+; MAIL detached from <POKEMON>.
+ text_jump UnknownText_0x1c1c47
+ db "@"
+; 0x12dec
+
+.bagfulltext: ; 0x12dec
+; There's no space for removing MAIL.
+ text_jump UnknownText_0x1c1c62
+ db "@"
+; 0x12df1
+
+.sendmailtopctext: ; 0x12df1
+; Send the removed MAIL to your PC?
+ text_jump UnknownText_0x1c1c86
+ db "@"
+; 0x12df6
+
+.mailboxfulltext: ; 0x12df6
+; Your PC's MAILBOX is full.
+ text_jump UnknownText_0x1c1ca9
+ db "@"
+; 0x12dfb
+
+.sentmailtopctext: ; 0x12dfb
+; The MAIL was sent to your PC.
+ text_jump UnknownText_0x1c1cc4
+ db "@"
+; 0x12e00
+
+
+OpenPartyStats: ; 12e00
+ call LoadStandardMenuDataHeader
+ call ClearSprites
+; PartyMon
+ xor a
+ ld [MonType], a
+ call LowVolume
+ predef StatsScreenInit
+ call MaxVolume
+ call Call_ExitMenu
+ ld a, 0
+ ret
+; 12e1b
+
+
+MonMenu_Cut: ; 12e1b
+ callba CutFunction
+ ld a, [wd0ec]
+ cp $1
+ jr nz, .asm_12e2d
+ ld b, $4
+ ld a, $2
+ ret
+
+.asm_12e2d
+ ld a, $3
+ ret
+; 12e30
+
+
+MonMenu_Fly: ; 12e30
+ callba FlyFunction
+ ld a, [wd0ec]
+ cp $2
+ jr z, .asm_12e4c
+ cp $0
+ jr z, .asm_12e4f
+ callba MobileFn_1060b5
+ ld b, $4
+ ld a, $2
+ ret
+
+.asm_12e4c
+ ld a, $3
+ ret
+
+.asm_12e4f
+ ld a, $0
+ ret
+
+.asm_12e52
+ ld a, $1
+ ret
+; 12e55
+
+MonMenu_Flash: ; 12e55
+ callba Functionc8ac
+ ld a, [wd0ec]
+ cp $1
+ jr nz, .asm_12e67
+ ld b, $4
+ ld a, $2
+ ret
+
+.asm_12e67
+ ld a, $3
+ ret
+; 12e6a
+
+MonMenu_Strength: ; 12e6a
+ callba StrengthFunction
+ ld a, [wd0ec]
+ cp $1
+ jr nz, .asm_12e7c
+ ld b, $4
+ ld a, $2
+ ret
+
+.asm_12e7c
+ ld a, $3
+ ret
+; 12e7f
+
+MonMenu_Whirlpool: ; 12e7f
+ callba WhirlpoolFunction
+ ld a, [wd0ec]
+ cp $1
+ jr nz, .asm_12e91
+ ld b, $4
+ ld a, $2
+ ret
+
+.asm_12e91
+ ld a, $3
+ ret
+; 12e94
+
+MonMenu_Waterfall: ; 12e94
+ callba Functioncade
+ ld a, [wd0ec]
+ cp $1
+ jr nz, .asm_12ea6
+ ld b, $4
+ ld a, $2
+ ret
+
+.asm_12ea6
+ ld a, $3
+ ret
+; 12ea9
+
+MonMenu_Teleport: ; 12ea9
+ callba TeleportFunction
+ ld a, [wd0ec]
+ and a
+ jr z, .asm_12eba
+ ld b, $4
+ ld a, $2
+ ret
+
+.asm_12eba
+ ld a, $3
+ ret
+; 12ebd
+
+MonMenu_Surf: ; 12ebd
+ callba SurfFunction
+ ld a, [wd0ec]
+ and a
+ jr z, .asm_12ece
+ ld b, $4
+ ld a, $2
+ ret
+
+.asm_12ece
+ ld a, $3
+ ret
+; 12ed1
+
+MonMenu_Dig: ; 12ed1
+ callba DigFunction
+ ld a, [wd0ec]
+ cp $1
+ jr nz, .asm_12ee3
+ ld b, $4
+ ld a, $2
+ ret
+
+.asm_12ee3
+ ld a, $3
+ ret
+; 12ee6
+
+MonMenu_Softboiled_MilkDrink: ; 12ee6
+ call Function12f05
+ jr nc, .asm_12ef3
+ callba Functionf3df
+ jr .asm_12ef9
+
+.asm_12ef3
+ ld hl, UnknownText_0x12f00
+ call PrintText
+
+.asm_12ef9
+ xor a
+ ld [PartyMenuActionText], a
+ ld a, $3
+ ret
+; 12f00
+
+UnknownText_0x12f00: ; 0x12f00
+ ; Not enough HP!
+ text_jump UnknownText_0x1c1ce3
+ db "@"
+; 0x12f05
+
+Function12f05: ; 12f05
+ ld a, MON_MAXHP
+ call GetPartyParamLocation
+ ld a, [hli]
+ ld [hDividend + 0], a
+ ld a, [hl]
+ ld [hDividend + 1], a
+ ld a, $5
+ ld [hDivisor], a
+ ld b, $2
+ call Divide
+ ld a, MON_HP + 1
+ call GetPartyParamLocation
+ ld a, [hQuotient + 2]
+ sub [hl]
+ dec hl
+ ld a, [hQuotient + 1]
+ sbc [hl]
+ ret
+; 12f26
+
+MonMenu_Headbutt: ; 12f26
+ callba HeadbuttFunction
+ ld a, [wd0ec]
+ cp $1
+ jr nz, .asm_12f38
+ ld b, $4
+ ld a, $2
+ ret
+
+.asm_12f38
+ ld a, $3
+ ret
+; 12f3b
+
+MonMenu_RockSmash: ; 12f3b
+ callba RockSmashFunction
+ ld a, [wd0ec]
+ cp $1
+ jr nz, .asm_12f4d
+ ld b, $4
+ ld a, $2
+ ret
+
+.asm_12f4d
+ ld a, $3
+ ret
+; 12f50
+
+MonMenu_SweetScent: ; 12f50
+ callba SweetScentFromMenu
+ ld b, $4
+ ld a, $2
+ ret
+; 12f5b
+
+Function12f5b: ; 12f5b
+ ld hl, Options
+ ld a, [hl]
+ push af
+ set NO_TEXT_SCROLL, [hl]
+ call LoadFontsBattleExtra
+ call Function12f73
+ pop bc
+ ld a, b
+ ld [Options], a
+ push af
+ call ClearBGPalettes
+ pop af
+ ret
+; 12f73
+
+Function12f73: ; 12f73
+ call SetUpMoveScreenBG
+ ld de, Unknown_12fb2
+ call Function1bb1
+ call Function131ef
+ ld hl, wcfa5
+ set 6, [hl]
+ jr Function12f93
+
+Function12f86: ; 12f86
+ call Function1bd3
+ bit 1, a
+ jp nz, Function12f9f
+ bit 0, a
+ jp nz, Function12f9c
+
+Function12f93: ; 12f93
+ call PrepareToPlaceMoveData
+ call PlaceMoveData
+ jp Function12f86
+; 12f9c
+
+Function12f9c: ; 12f9c
+ and a
+ jr Function12fa0
+
+Function12f9f: ; 12f9f
+ scf
+
+Function12fa0: ; 12fa0
+ push af
+ xor a
+ ld [wd0e3], a
+ ld hl, wcfa5
+ res 6, [hl]
+ call ClearSprites
+ call ClearTileMap
+ pop af
+ ret
+; 12fb2
+
+Unknown_12fb2: ; 12fb2
+ db $03, $01, $03, $01, $40, $00, $20, $c3
+; 12fba
+
+ManagePokemonMoves: ; 12fba
+ ld a, [CurPartySpecies]
+ cp EGG
+ jr z, .egg
+ ld hl, Options
+ ld a, [hl]
+ push af
+ set NO_TEXT_SCROLL, [hl]
+ call MoveScreenLoop
+ pop af
+ ld [Options], a
+ call ClearBGPalettes
+
+.egg
+ ld a, $0
+ ret
+; 12fd5
+
+MoveScreenLoop: ; 12fd5
+ ld a, [CurPartyMon]
+ inc a
+ ld [wd0d8], a
+ call SetUpMoveScreenBG
+ call Function132d3
+ ld de, Unknown_13163
+ call Function1bb1
+.loop
+ call Function131ef
+ ld hl, wcfa5
+ set 6, [hl]
+ jr .skip_joy
+
+.joy_loop
+ call Function1bd3
+ bit 1, a
+ jp nz, .b_button
+ bit 0, a
+ jp nz, .a_button
+ bit 4, a
+ jp nz, .d_right
+ bit 5, a
+ jp nz, .d_left
+
+.skip_joy
+ call PrepareToPlaceMoveData
+ ld a, [wMoveSwapBuffer]
+ and a
+ jr nz, .moving_move
+ call PlaceMoveData
+ jp .joy_loop
+
+.moving_move
+ ld a, " "
+ hlcoord 1, 11
+ ld bc, 5
+ call ByteFill
+ hlcoord 1, 12
+ lb bc, 5, SCREEN_WIDTH - 2
+ call ClearBox
+ hlcoord 1, 12
+ ld de, String_1316b
+ call PlaceString
+ jp .joy_loop
+.b_button: ; 13038
+ call PlayClickSFX
+ call WaitSFX
+ ld a, [wMoveSwapBuffer]
+ and a
+ jp z, .exit
+
+ ld a, [wMoveSwapBuffer]
+ ld [MenuSelection2], a
+ xor a
+ ld [wMoveSwapBuffer], a
+ hlcoord 1, 2
+ lb bc, 8, SCREEN_WIDTH - 2
+ call ClearBox
+ jp .loop
+; 1305b
+
+.d_right: ; 1305b
+ ld a, [wMoveSwapBuffer]
+ and a
+ jp nz, .joy_loop
+
+ ld a, [CurPartyMon]
+ ld b, a
+ push bc
+ call .cycle_right
+ pop bc
+ ld a, [CurPartyMon]
+ cp b
+ jp z, .joy_loop
+ jp MoveScreenLoop
+
+.d_left: ; 13075
+ ld a, [wMoveSwapBuffer]
+ and a
+ jp nz, .joy_loop
+ ld a, [CurPartyMon]
+ ld b, a
+ push bc
+ call .cycle_left
+ pop bc
+ ld a, [CurPartyMon]
+ cp b
+ jp z, .joy_loop
+ jp MoveScreenLoop
+
+.cycle_right
+ ld a, [CurPartyMon]
+ inc a
+ ld [CurPartyMon], a
+ ld c, a
+ ld b, 0
+ ld hl, PartySpecies
+ add hl, bc
+ ld a, [hl]
+ cp -1
+ jr z, .cycle_left
+ cp EGG
+ ret nz
+ jr .cycle_right
+
+.cycle_left
+ ld a, [CurPartyMon]
+ and a
+ ret z
+.cycle_left_loop
+ ld a, [CurPartyMon]
+ dec a
+ ld [CurPartyMon], a
+ ld c, a
+ ld b, 0
+ ld hl, PartySpecies
+ add hl, bc
+ ld a, [hl]
+ cp EGG
+ ret nz
+ ld a, [CurPartyMon]
+ and a
+ jr z, .cycle_right
+ jr .cycle_left_loop
+; 130c6
+
+.a_button: ; 130c6
+ call PlayClickSFX
+ call WaitSFX
+ ld a, [wMoveSwapBuffer]
+ and a
+ jr nz, .place_move
+ ld a, [MenuSelection2]
+ ld [wMoveSwapBuffer], a
+ call Function1bee
+ jp .moving_move
+
+.place_move
+ ld hl, PartyMon1Moves
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld a, [CurPartyMon]
+ call AddNTimes
+ push hl
+ call .copy_move
+ pop hl
+ ld bc, $15
+ add hl, bc
+ call .copy_move
+ ld a, [wBattleMode]
+ jr z, .swap_moves
+ ld hl, BattleMonMoves
+ ld bc, $20
+ ld a, [CurPartyMon]
+ call AddNTimes
+ push hl
+ call .copy_move
+ pop hl
+ ld bc, 6
+ add hl, bc
+ call .copy_move
+
+.swap_moves
+ ld de, SFX_SWITCH_POKEMON
+ call PlaySFX
+ call WaitSFX
+ ld de, SFX_SWITCH_POKEMON
+ call PlaySFX
+ call WaitSFX
+ hlcoord 1, 2
+ lb bc, 8, 18
+ call ClearBox
+ hlcoord 10, 10
+ lb bc, 1, 9
+ call ClearBox
+ jp .loop
+; 1313a
+
+.copy_move: ; 1313a
+ push hl
+ ld a, [MenuSelection2]
+ dec a
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld d, h
+ ld e, l
+ pop hl
+ ld a, [wMoveSwapBuffer]
+ dec a
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld a, [de]
+ ld b, [hl]
+ ld [hl], a
+ ld a, b
+ ld [de], a
+ ret
+; 13154
+
+.exit: ; 13154
+ xor a
+ ld [wMoveSwapBuffer], a
+ ld hl, wcfa5
+ res 6, [hl]
+ call ClearSprites
+ jp ClearTileMap
+; 13163
+
+Unknown_13163: ; 13163
+ db $03, $01, $03, $01, $40, $00, $20, $f3
+; 1316b
+
+String_1316b: ; 1316b
+ db "Where?@"
+; 13172
+
+SetUpMoveScreenBG: ; 13172
+ call ClearBGPalettes
+ call ClearTileMap
+ call ClearSprites
+ xor a
+ ld [hBGMapMode], a
+ callba Functionfb571
+ callba InefficientlyClear121BytesAtwc300
+ ld a, [CurPartyMon]
+ ld e, a
+ ld d, $0
+ ld hl, PartySpecies
+ add hl, de
+ ld a, [hl]
+ ld [wd265], a
+ ld e, $2
+ callba Function8e83f
+ hlcoord 0, 1
+ ld b, 9
+ ld c, 18
+ call TextBox
+ hlcoord 0, 11
+ ld b, 5
+ ld c, 18
+ call TextBox
+ hlcoord 2, 0
+ lb bc, 2, 3
+ call ClearBox
+ xor a
+ ld [MonType], a
+ ld hl, PartyMonNicknames
+ ld a, [CurPartyMon]
+ call GetNick
+ hlcoord 5, 1
+ call PlaceString
+ push bc
+ callba CopyPkmnToTempMon
+ pop hl
+ call PrintLevel
+ ld hl, PlayerHPPal
+ call SetHPPal
+ ld b, $e
+ call GetSGBLayout
+ hlcoord 16, 0
+ lb bc, 1, 3
+ jp ClearBox
+; 131ef
+
+Function131ef: ; 131ef
+ xor a
+ ld [hBGMapMode], a
+ ld [wMoveSwapBuffer], a
+ ld [MonType], a
+ predef CopyPkmnToTempMon
+ ld hl, TempMonMoves
+ ld de, wListMoves_MoveIndicesBuffer
+ ld bc, NUM_MOVES
+ call CopyBytes
+ ld a, SCREEN_WIDTH * 2
+ ld [Buffer1], a
+ hlcoord 2, 3
+ predef ListMoves
+ hlcoord 10, 4
+ predef Function50c50
+ call WaitBGMap
+ call SetPalettes
+ ld a, [wd0eb]
+ inc a
+ ld [wcfa3], a
+ hlcoord 0, 11
+ ld b, 5
+ ld c, 18
+ jp TextBox
+; 13235
+
+PrepareToPlaceMoveData: ; 13235
+ ld hl, PartyMon1Moves
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld a, [CurPartyMon]
+ call AddNTimes
+ ld a, [MenuSelection2]
+ dec a
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld a, [hl]
+ ld [CurMove], a
+ hlcoord 1, 12
+ lb bc, 5, 18
+ jp ClearBox
+; 13256
+
+PlaceMoveData: ; 13256
+ xor a
+ ld [hBGMapMode], a
+ hlcoord 0, 10
+ ld de, String_132ba
+ call PlaceString
+ hlcoord 0, 11
+ ld de, String_132c2
+ call PlaceString
+ hlcoord 12, 12
+ ld de, String_132ca
+ call PlaceString
+ ld a, [CurMove]
+ ld b, a
+ hlcoord 2, 12
+ predef PrintMoveType
+ ld a, [CurMove]
+ dec a
+ ld hl, Moves + MOVE_POWER
+ ld bc, MOVE_LENGTH
+ call AddNTimes
+ ld a, BANK(Moves)
+ call GetFarByte
+ hlcoord 16, 12
+ cp 2
+ jr c, .no_power
+ ld [wd265], a
+ ld de, wd265
+ lb bc, 1, 3
+ call PrintNum
+ jr .description
+
+.no_power
+ ld de, String_132cf
+ call PlaceString
+
+.description
+ hlcoord 1, 14
+ predef PrintMoveDesc
+ ld a, $1
+ ld [hBGMapMode], a
+ ret
+; 132ba
+
+String_132ba: ; 132ba
+ db "┌─────┐@"
+; 132c2
+String_132c2: ; 132c2
+ db "│TYPE/└@"
+; 132ca
+String_132ca: ; 132ca
+ db "ATK/@"
+; 132cf
+String_132cf: ; 132cf
+ db "---@"
+; 132d3
+
+Function132d3: ; 132d3
+ call Function132da
+ call Function132fe
+ ret
+; 132da
+
+Function132da: ; 132da
+ ld a, [CurPartyMon]
+ and a
+ ret z
+ ld c, a
+ ld e, a
+ ld d, 0
+ ld hl, PartyCount
+ add hl, de
+.loop
+ ld a, [hl]
+ and a
+ jr z, .prev
+ cp EGG
+ jr z, .prev
+ cp NUM_POKEMON + 1
+ jr c, .legal
+
+.prev
+ dec hl
+ dec c
+ jr nz, .loop
+ ret
+
+.legal
+ hlcoord 16, 0
+ ld [hl], "◀"
+ ret
+; 132fe
+
+Function132fe: ; 132fe
+ ld a, [CurPartyMon]
+ inc a
+ ld c, a
+ ld a, [PartyCount]
+ cp c
+ ret z
+ ld e, c
+ ld d, 0
+ ld hl, PartySpecies
+ add hl, de
+.loop
+ ld a, [hl]
+ cp -1
+ ret z
+ and a
+ jr z, .next
+ cp EGG
+ jr z, .next
+ cp NUM_POKEMON + 1
+ jr c, .legal
+
+.next
+ inc hl
+ jr .loop
+
+.legal
+ hlcoord 18, 0
+ ld [hl], "▶"
+ ret
+; 13327
diff --git a/engine/std_scripts.asm b/engine/std_scripts.asm
index 5c0df0355..a886dbbf3 100644
--- a/engine/std_scripts.asm
+++ b/engine/std_scripts.asm
@@ -1,56 +1,56 @@
StdScripts::
- dbw BANK(PokeCenterNurseScript), PokeCenterNurseScript
- dbw BANK(DifficultBookshelfScript), DifficultBookshelfScript
- dbw BANK(PictureBookshelfScript), PictureBookshelfScript
- dbw BANK(MagazineBookshelfScript), MagazineBookshelfScript
- dbw BANK(TeamRocketOathScript), TeamRocketOathScript
- dbw BANK(IncenseBurnerScript), IncenseBurnerScript
- dbw BANK(MerchandiseShelfScript), MerchandiseShelfScript
- dbw BANK(TownMapScript), TownMapScript
- dbw BANK(WindowScript), WindowScript
- dbw BANK(TVScript), TVScript
- dbw BANK(HomepageScript), HomepageScript
- dbw BANK(Radio1Script), Radio1Script
- dbw BANK(Radio2Script), Radio2Script
- dbw BANK(TrashCanScript), TrashCanScript
- dbw BANK(StrengthBoulderScript), StrengthBoulderScript
- dbw BANK(SmashRockScript), SmashRockScript
- dbw BANK(PokeCenterSignScript), PokeCenterSignScript
- dbw BANK(MartSignScript), MartSignScript
- dbw BANK(GoldenrodRocketsScript), GoldenrodRocketsScript
- dbw BANK(RadioTowerRocketsScript), RadioTowerRocketsScript
- dbw BANK(ElevatorButtonScript), ElevatorButtonScript
- dbw BANK(DayToTextScript), DayToTextScript
- dbw BANK(BugContestResultsWarpScript), BugContestResultsWarpScript
- dbw BANK(BugContestResultsScript), BugContestResultsScript
- dbw BANK(InitializeEventsScript), InitializeEventsScript
- dbw BANK(AskNumber1MScript), AskNumber1MScript
- dbw BANK(AskNumber2MScript), AskNumber2MScript
- dbw BANK(RegisteredNumberMScript), RegisteredNumberMScript
- dbw BANK(NumberAcceptedMScript), NumberAcceptedMScript
- dbw BANK(NumberDeclinedMScript), NumberDeclinedMScript
- dbw BANK(PhoneFullMScript), PhoneFullMScript
- dbw BANK(RematchMScript), RematchMScript
- dbw BANK(GiftMScript), GiftMScript
- dbw BANK(PackFullMScript), PackFullMScript
- dbw BANK(RematchGiftMScript), RematchGiftMScript
- dbw BANK(AskNumber1FScript), AskNumber1FScript
- dbw BANK(AskNumber2FScript), AskNumber2FScript
- dbw BANK(RegisteredNumberFScript), RegisteredNumberFScript
- dbw BANK(NumberAcceptedFScript), NumberAcceptedFScript
- dbw BANK(NumberDeclinedFScript), NumberDeclinedFScript
- dbw BANK(PhoneFullFScript), PhoneFullFScript
- dbw BANK(RematchFScript), RematchFScript
- dbw BANK(GiftFScript), GiftFScript
- dbw BANK(PackFullFScript), PackFullFScript
- dbw BANK(RematchGiftFScript), RematchGiftFScript
- dbw BANK(GymStatue1Script), GymStatue1Script
- dbw BANK(GymStatue2Script), GymStatue2Script
- dbw BANK(ReceiveItemScript), ReceiveItemScript
- dbw BANK(ReceiveTogepiEggScript), ReceiveTogepiEggScript
- dbw BANK(PCScript), PCScript
- dbw BANK(GameCornerCoinVendorScript), GameCornerCoinVendorScript
- dbw BANK(HappinessCheckScript), HappinessCheckScript
+ dba PokeCenterNurseScript
+ dba DifficultBookshelfScript
+ dba PictureBookshelfScript
+ dba MagazineBookshelfScript
+ dba TeamRocketOathScript
+ dba IncenseBurnerScript
+ dba MerchandiseShelfScript
+ dba TownMapScript
+ dba WindowScript
+ dba TVScript
+ dba HomepageScript
+ dba Radio1Script
+ dba Radio2Script
+ dba TrashCanScript
+ dba StrengthBoulderScript
+ dba SmashRockScript
+ dba PokeCenterSignScript
+ dba MartSignScript
+ dba GoldenrodRocketsScript
+ dba RadioTowerRocketsScript
+ dba ElevatorButtonScript
+ dba DayToTextScript
+ dba BugContestResultsWarpScript
+ dba BugContestResultsScript
+ dba InitializeEventsScript
+ dba AskNumber1MScript
+ dba AskNumber2MScript
+ dba RegisteredNumberMScript
+ dba NumberAcceptedMScript
+ dba NumberDeclinedMScript
+ dba PhoneFullMScript
+ dba RematchMScript
+ dba GiftMScript
+ dba PackFullMScript
+ dba RematchGiftMScript
+ dba AskNumber1FScript
+ dba AskNumber2FScript
+ dba RegisteredNumberFScript
+ dba NumberAcceptedFScript
+ dba NumberDeclinedFScript
+ dba PhoneFullFScript
+ dba RematchFScript
+ dba GiftFScript
+ dba PackFullFScript
+ dba RematchGiftFScript
+ dba GymStatue1Script
+ dba GymStatue2Script
+ dba ReceiveItemScript
+ dba ReceiveTogepiEggScript
+ dba PCScript
+ dba GameCornerCoinVendorScript
+ dba HappinessCheckScript
PokeCenterNurseScript:
; EVENT_WELCOMED_TO_POKECOM_CENTER is never set
@@ -302,7 +302,7 @@ RadioTowerRocketsScript:
end
BugContestResultsWarpScript:
- special WhiteBGMap
+ special ClearBGPalettes
scall BugContestResults_CopyContestantsToResults
setevent EVENT_ROUTE_36_NATIONAL_PARK_GATE_OFFICER_CONTEST_DAY
clearevent EVENT_ROUTE_36_NATIONAL_PARK_GATE_OFFICER_NOT_CONTEST_DAY
@@ -328,7 +328,7 @@ BugContestResultsScript:
farwritetext ContestResults_ConsolationPrizeText
keeptextopen
waitbutton
- verbosegiveitem BERRY, 1
+ verbosegiveitem BERRY
iffalse BugContestResults_NoRoomForBerry
BugContestResults_DidNotWin
@@ -387,7 +387,7 @@ BugContestResults_FirstPlace ; 0xbc31e
itemtotext SUN_STONE, $1
farwritetext ContestResults_PlayerWonAPrizeText
closetext
- verbosegiveitem SUN_STONE, 1
+ verbosegiveitem SUN_STONE
iffalse BugContestResults_NoRoomForSunStone
jump BugContestResults_ReturnAfterWinnersPrize
; 0xbc332
@@ -396,7 +396,7 @@ BugContestResults_SecondPlace ; 0xbc332
itemtotext EVERSTONE, $1
farwritetext ContestResults_PlayerWonAPrizeText
closetext
- verbosegiveitem EVERSTONE, 1
+ verbosegiveitem EVERSTONE
iffalse BugContestResults_NoRoomForEverstone
jump BugContestResults_ReturnAfterWinnersPrize
; 0xbc343
@@ -405,7 +405,7 @@ BugContestResults_ThirdPlace ; 0xbc343
itemtotext GOLD_BERRY, $1
farwritetext ContestResults_PlayerWonAPrizeText
closetext
- verbosegiveitem GOLD_BERRY, 1
+ verbosegiveitem GOLD_BERRY
iffalse BugContestResults_NoRoomForGoldBerry
jump BugContestResults_ReturnAfterWinnersPrize
; 0xbc354
diff --git a/engine/timeofdaypals.asm b/engine/timeofdaypals.asm
index bdfcc8b05..6ebb2a421 100644
--- a/engine/timeofdaypals.asm
+++ b/engine/timeofdaypals.asm
@@ -39,7 +39,7 @@ _TimeOfDayPals:: ; 8c011
; save bg palette 8
- ld hl, Unkn1Pals + 8 * 7 ; Unkn1Pals + 7 pals
+ ld hl, wMapPals + 8 * 7 ; wMapPals + 7 pals
; save wram bank
ld a, [rSVBK]
@@ -70,7 +70,7 @@ _TimeOfDayPals:: ; 8c011
; restore bg palette 8
- ld hl, Unkn2Pals - 1 ; last byte in Unkn1Pals
+ ld hl, Unkn2Pals - 1 ; last byte in wMapPals
; save wram bank
ld a, [rSVBK]
@@ -116,7 +116,7 @@ _UpdateTimePals:: ; 8c070
ret
; 8c079
-FadeInBGMap:: ; 8c079
+FadeInPalettes:: ; 8c079
ld c, $12
call GetTimePalFade
ld b, $4
@@ -124,7 +124,7 @@ FadeInBGMap:: ; 8c079
ret
; 8c084
-FadeBlackBGMap:: ; 8c084
+FadeOutPalettes:: ; 8c084
call Function8c0c1
ld c, $9
call GetTimePalFade
@@ -172,12 +172,12 @@ Function8c0c1: ; 8c0c1
push af
ld a, $5
ld [rSVBK], a
- ld hl, Unkn1Pals
+ ld hl, wMapPals
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
- ld hl, Unkn1Pals + 8
+ ld hl, wMapPals + 8
ld c, $6
.asm_8c0d4
ld a, e
diff --git a/engine/title.asm b/engine/title.asm
index d29c90a23..0fbf8b42d 100644
--- a/engine/title.asm
+++ b/engine/title.asm
@@ -1,6 +1,6 @@
_TitleScreen: ; 10ed67
- call WhiteBGMap
+ call ClearBGPalettes
call ClearSprites
call ClearTileMap
@@ -144,7 +144,7 @@ _TitleScreen: ; 10ed67
; Update palette colors
ld hl, TitleScreenPalettes
- ld de, Unkn1Pals
+ ld de, wMapPals
ld bc, 4 * 32
call CopyBytes
@@ -220,7 +220,7 @@ _TitleScreen: ; 10ed67
ld [hBGMapMode], a
xor a
- ld [Unkn1Pals + 2], a
+ ld [wMapPals + 2], a
; Play starting sound effect
call SFXChannelsOff
@@ -231,7 +231,7 @@ _TitleScreen: ; 10ed67
; 10eea7
SuicuneFrameIterator: ; 10eea7
- ld hl, Unkn1Pals + 2
+ ld hl, wMapPals + 2
ld a, [hl]
ld c, a
inc [hl]
diff --git a/engine/tmhm.asm b/engine/tmhm.asm
new file mode 100755
index 000000000..b66131ac9
--- /dev/null
+++ b/engine/tmhm.asm
@@ -0,0 +1,113 @@
+CanLearnTMHMMove: ; 11639
+ ld a, [CurPartySpecies]
+ ld [CurSpecies], a
+ call GetBaseData
+ ld hl, BaseTMHM
+ push hl
+
+ ld a, [wd262]
+ ld b, a
+ ld c, 0
+ ld hl, TMHMMoves
+.loop
+ ld a, [hli]
+ and a
+ jr z, .end
+ cp b
+ jr z, .asm_11659
+ inc c
+ jr .loop
+
+.asm_11659
+ pop hl
+ ld b, CHECK_FLAG
+ push de
+ ld d, 0
+ predef FlagPredef
+ pop de
+ ret
+
+.end
+ pop hl
+ ld c, 0
+ ret
+; 1166a
+
+GetTMHMMove: ; 1166a
+ ld a, [wd265]
+ dec a
+ ld hl, TMHMMoves
+ ld b, 0
+ ld c, a
+ add hl, bc
+ ld a, [hl]
+ ld [wd265], a
+ ret
+; 1167a
+
+TMHMMoves: ; 1167a
+ db DYNAMICPUNCH
+ db HEADBUTT
+ db CURSE
+ db ROLLOUT
+ db ROAR
+ db TOXIC
+ db ZAP_CANNON
+ db ROCK_SMASH
+ db PSYCH_UP
+ db HIDDEN_POWER
+ db SUNNY_DAY
+ db SWEET_SCENT
+ db SNORE
+ db BLIZZARD
+ db HYPER_BEAM
+ db ICY_WIND
+ db PROTECT
+ db RAIN_DANCE
+ db GIGA_DRAIN
+ db ENDURE
+ db FRUSTRATION
+ db SOLARBEAM
+ db IRON_TAIL
+ db DRAGONBREATH
+ db THUNDER
+ db EARTHQUAKE
+ db RETURN
+ db DIG
+ db PSYCHIC_M
+ db SHADOW_BALL
+ db MUD_SLAP
+ db DOUBLE_TEAM
+ db ICE_PUNCH
+ db SWAGGER
+ db SLEEP_TALK
+ db SLUDGE_BOMB
+ db SANDSTORM
+ db FIRE_BLAST
+ db SWIFT
+ db DEFENSE_CURL
+ db THUNDERPUNCH
+ db DREAM_EATER
+ db DETECT
+ db REST
+ db ATTRACT
+ db THIEF
+ db STEEL_WING
+ db FIRE_PUNCH
+ db FURY_CUTTER
+ db NIGHTMARE
+ db CUT
+ db FLY
+ db SURF
+ db STRENGTH
+ db FLASH
+ db WHIRLPOOL
+ db WATERFALL
+
+; Move tutor
+ db FLAMETHROWER
+ db THUNDERBOLT
+ db ICE_BEAM
+
+ db 0 ; end
+; 116b7