summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
Diffstat (limited to 'engine')
-rw-r--r--engine/bank3c.asm214
-rw-r--r--engine/bank3d.asm142
-rw-r--r--engine/bank3e.asm4499
-rw-r--r--engine/bank3f.asm1802
-rwxr-xr-xengine/battle/core.asm2
-rwxr-xr-xengine/battle/end_of_battle.asm2
-rwxr-xr-xengine/diploma_3a.asm6
-rwxr-xr-xengine/hidden_object_functions14.asm2
-rwxr-xr-xengine/hidden_object_functions17.asm2
-rwxr-xr-xengine/hidden_object_functions18.asm6
-rwxr-xr-xengine/hidden_object_functions3.asm2
-rwxr-xr-xengine/hidden_object_functions7.asm6
-rwxr-xr-xengine/items/items.asm2431
-rw-r--r--engine/menu/bills_pc.asm8
-rwxr-xr-xengine/menu/main_menu.asm2
-rw-r--r--engine/menu/options.asm4
-rwxr-xr-xengine/menu/pokedex.asm78
-rwxr-xr-xengine/oak_speech.asm10
-rwxr-xr-xengine/overworld/card_key.asm2
-rw-r--r--engine/overworld/check_player_state.asm4
-rwxr-xr-xengine/overworld/cut.asm2
-rw-r--r--engine/overworld/get_coords_tile_in_front_of_player.asm4
-rwxr-xr-xengine/overworld/hidden_objects.asm2
-rwxr-xr-xengine/overworld/ledges.asm2
-rw-r--r--engine/overworld/map_sprite_functions1.asm2
-rwxr-xr-xengine/overworld/map_sprites.asm125
-rw-r--r--engine/overworld/movement.asm4
-rwxr-xr-xengine/overworld/player_animations.asm6
-rwxr-xr-xengine/overworld/pokecenter.asm2
-rwxr-xr-xengine/overworld/ssanne.asm2
-rw-r--r--engine/overworld/step_functions.asm2
-rw-r--r--engine/overworld/try_pushing_boulder.asm2
-rwxr-xr-xengine/palettes.asm50
-rwxr-xr-xengine/pikachu_emotions.asm409
-rwxr-xr-xengine/pikachu_follow.asm1577
-rwxr-xr-xengine/pikachu_movement.asm1039
-rwxr-xr-xengine/pikachu_pcm.asm154
-rwxr-xr-xengine/pikachu_pic_animation.asm2204
-rwxr-xr-xengine/pikachu_status.asm258
-rw-r--r--[-rwxr-xr-x]engine/printer.asm1360
-rwxr-xr-xengine/printer/serial.asm622
-rwxr-xr-xengine/surfing_minigame.asm2826
-rwxr-xr-xengine/titlescreen.asm139
-rwxr-xr-xengine/titlescreen2.asm2
-rwxr-xr-xengine/unknown_ea3ea.asm504
-rwxr-xr-xengine/yellow_intro.asm1081
46 files changed, 10248 insertions, 11356 deletions
diff --git a/engine/bank3c.asm b/engine/bank3c.asm
index 2d9671f9..83e010ff 100644
--- a/engine/bank3c.asm
+++ b/engine/bank3c.asm
@@ -1,158 +1,4 @@
-PlayPikachuSoundClip:: ; f0000 (3c:4000)
- ld a, e
- ld e, a
- ld d, $0
- ld hl, PikachuCriesPointerTable
- add hl, de
- add hl, de
- add hl, de
- ld b, [hl] ; bank of pikachu cry data
- inc hl
- ld a, [hli] ; cry data pointer
- ld h, [hl]
- ld l, a
- ld c, $4
-.loop
- dec c
- jr z, .done_delay
- call DelayFrame
- jr .loop
-
-.done_delay
- di
- push bc
- push hl
- ld a, $80
- ld [rNR52], a
- ld a, $77
- ld [rNR50], a
- xor a
- ld [rNR30], a
- ld hl, $ff30 ; wave data
- ld de, wRedrawRowOrColumnSrcTiles
-.saveWaveDataLoop
- ld a, [hl]
- ld [de], a
- inc de
- ld a, $ff
- ld [hli], a
- ld a, l
- cp $40 ; end of wave data
- jr nz, .saveWaveDataLoop
- ld a, $80
- ld [rNR30], a
- ld a, [rNR51]
- or $44
- ld [rNR51], a
- ld a, $ff
- ld [rNR31], a
- ld a, $20
- ld [rNR32], a
- ld a, $ff
- ld [rNR33], a
- ld a, $87
- ld [rNR34], a
- pop hl
- pop bc
- call PlayPikachuPCM
- xor a
- ld [wc0f3], a
- ld [wc0f4], a
- ld a, $80
- ld [rNR52], a
- xor a
- ld [rNR30], a
- ld hl, $ff30
- ld de, wRedrawRowOrColumnSrcTiles
-.reloadWaveDataLoop
- ld a, [de]
- inc de
- ld [hli], a
- ld a, l
- cp $40 ; end of wave data
- jr nz, .reloadWaveDataLoop
- ld a, $80
- ld [rNR30], a
- ld a, [rNR51]
- and $bb
- ld [rNR51], a
- xor a
- ld [wChannelSoundIDs+CH4], a
- ld [wChannelSoundIDs+CH5], a
- ld [wChannelSoundIDs+CH6], a
- ld [wChannelSoundIDs+CH7], a
- ld a, [H_LOADEDROMBANK]
- ei
- ret
-
-PikachuCriesPointerTable: ; f008e (3c:408e)
-; format:
-; db bank
-; dw pointer to cry
-
-; bank 21
- pikacry_def PikachuCry1 ; 21:4000
- pikacry_def PikachuCry2 ; 21:491a
- pikacry_def PikachuCry3 ; 21:4fdc
- pikacry_def PikachuCry4 ; 21:59ee
-
-; bank 22
- pikacry_def PikachuCry5 ; 22:4000
- pikacry_def PikachuCry6 ; 22:5042
- pikacry_def PikachuCry7 ; 22:6254
-
-; bank 23
- pikacry_def PikachuCry8 ; 23:4000
- pikacry_def PikachuCry9 ; 23:50ca
- pikacry_def PikachuCry10 ; 23:5e0c
-
-; bank 24
- pikacry_def PikachuCry11 ; 24:4000
- pikacry_def PikachuCry12 ; 24:4722
- pikacry_def PikachuCry13 ; 24:54a4
-
-; bank 25
- pikacry_def PikachuCry14 ; 25:4000
- pikacry_def PikachuCry15 ; 25:589a
-
-; banks 31-34, in no particular order
-
- pikacry_def PikachuCry16 ; 31:4000
- pikacry_def PikachuCry17 ; 34:4000
- pikacry_def PikachuCry18 ; 31:549a
- pikacry_def PikachuCry19 ; 33:4000
- pikacry_def PikachuCry20 ; 32:4000
- pikacry_def PikachuCry21 ; 32:6002
- pikacry_def PikachuCry22 ; 31:63a4
- pikacry_def PikachuCry23 ; 34:4862
- pikacry_def PikachuCry24 ; 33:5632
- pikacry_def PikachuCry25 ; 34:573c
- pikacry_def PikachuCry26 ; 33:725c
-
-; bank 35
- pikacry_def PikachuCry27 ; 35:4000
- pikacry_def PikachuCry28 ; 35:4b5a
- pikacry_def PikachuCry29 ; 35:5da4
- pikacry_def PikachuCry30 ; 35:69ce
- pikacry_def PikachuCry31 ; 35:6e80
-
-; bank 36
- pikacry_def PikachuCry32 ; 36:4000
- pikacry_def PikachuCry33 ; 36:458a
- pikacry_def PikachuCry34 ; 36:523c
-
-; bank 37
- pikacry_def PikachuCry35 ; 37:4000
- pikacry_def PikachuCry36 ; 37:522a
-
-; banks 36-38
- pikacry_def PikachuCry37 ; 38:4000
- pikacry_def PikachuCry38 ; 38:4dfa
- pikacry_def PikachuCry39 ; 37:6e0c
- pikacry_def PikachuCry40 ; 38:5a64
- pikacry_def PikachuCry41 ; 36:6746
- pikacry_def PikachuCry42 ; 38:6976
-
+INCLUDE "engine/pikachu_pcm.asm"
INCLUDE "engine/overworld/advance_player_sprite.asm"
ResetStatusAndHalveMoneyOnBlackout:: ; f0274 (3c:4274)
@@ -169,30 +15,30 @@ ResetStatusAndHalveMoneyOnBlackout:: ; f0274 (3c:4274)
ld [wNPCMovementScriptPointerTableNum], a
ld [wFlags_0xcd60], a
- ld [$ff9f], a
- ld [$ff9f + 1], a
- ld [$ff9f + 2], a
+ ld [hMoney], a
+ ld [hMoney + 1], a
+ ld [hMoney + 2], a
call HasEnoughMoney
jr c, .lostmoney ; never happens
; Halve the player's money.
ld a, [wPlayerMoney]
- ld [$ff9f], a
+ ld [hMoney], a
ld a, [wPlayerMoney + 1]
- ld [$ff9f + 1], a
+ ld [hMoney + 1], a
ld a, [wPlayerMoney + 2]
- ld [$ff9f + 2], a
+ ld [hMoney + 2], a
xor a
- ld [$ffa2], a
- ld [$ffa3], a
+ ld [hDivideBCDDivisor], a
+ ld [hDivideBCDDivisor + 1], a
ld a, 2
- ld [$ffa4], a
+ ld [hDivideBCDDivisor + 2], a
predef DivideBCDPredef3
- ld a, [$ffa2]
+ ld a, [hDivideBCDQuotient]
ld [wPlayerMoney], a
- ld a, [$ffa2 + 1]
+ ld a, [hDivideBCDQuotient + 1]
ld [wPlayerMoney + 1], a
- ld a, [$ffa2 + 2]
+ ld a, [hDivideBCDQuotient + 2]
ld [wPlayerMoney + 2], a
.lostmoney
@@ -217,10 +63,12 @@ Func_f02da:: ; f02da (3c:42da)
cp a, $ff
jr nz, .asm_f02e5
ret
+
.asm_f02ee
ld hl, wd126
set 6, [hl]
ret
+
.asm_f02f4
ld hl, wd126
set 5, [hl]
@@ -264,6 +112,7 @@ Func_f0a54:: ; f0a54 (3c:4a54)
ret
Func_f0a55:: ; f0a55 (3c:4a55)
+; referenced in an unused function
ld hl, Pointer_f0a76 ; 3c:4a76
.loop
ld a, [hli]
@@ -281,7 +130,7 @@ Func_f0a55:: ; f0a55 (3c:4a55)
.asm_f0a68
ld a, [hli]
ld c, a
- ld b, $0
+ ld b, 0
ld a, [hli]
ld h, [hl]
ld l, a
@@ -290,10 +139,17 @@ Func_f0a55:: ; f0a55 (3c:4a55)
ret
Pointer_f0a76:: ; f0a76 (3c:4a76)
- db $27, $07, $7b, $4a, $ff
- db $01, $ec, $02, $ed, $03, $ee, $ff
+ dbbw BLUES_HOUSE, Pointer_f0a7bEnd - Pointer_f0a7b, Pointer_f0a7b
+ db $ff
+
+Pointer_f0a7b:
+ db 1, HS_DAISY_SITTING_COPY
+ db 2, HS_DAISY_WALKING_COPY
+ db 3, HS_TOWN_MAP_COPY
+ db $ff
+Pointer_f0a7bEnd:
-Func_f0a82: ; f0a82
+TryApplyPikachuMovementData: ; f0a82
ld a, [wd472]
bit 7, a
ret z
@@ -317,8 +173,8 @@ Func_f0a82: ; f0a82
pop af
ld [wUpdateSpritesEnabled], a
pop hl
- call Func_159b ; homecall Func_fd2a1 - pikachu movement script?
- callab Func_fcba1
+ call ApplyPikachuMovementData
+ callab RefreshPikachuFollow
ret
Pic_f0abf: ; f0abf (3c:4abf)
@@ -357,7 +213,7 @@ INCLUDE "scripts/pewterpokecenter2.asm"
Func_f1e22:
ld hl, PikachuMovementData_f1e2b
ld b, SPRITE_FACING_RIGHT
- call Func_f0a82
+ call TryApplyPikachuMovementData
ret
PikachuMovementData_f1e2b:
@@ -374,7 +230,7 @@ INCLUDE "scripts/celadonmansion3_2.asm"
Func_f1f23:
ld hl, PikachuMovementData_f1f2c
ld b, SPRITE_FACING_DOWN
- call Func_f0a82
+ call TryApplyPikachuMovementData
ret
PikachuMovementData_f1f2c:
@@ -436,10 +292,10 @@ Func_f2cee:
Func_f2cf4: ; should return to a, instead returns to b
call Random
swap a
- cp $55
+ cp 1 * $ff / 3
ld b, 0
ret c
- cp $aa
+ cp 2 * $ff / 3
ld b, 1
ret c
ld b, 2
@@ -451,7 +307,7 @@ Func_f2d06:
ret
Func_f2d0c:
- ld hl, GymTrashCans3a
+ ld hl, GymTrashCans3c
ld a, [wGymTrashCanIndex]
ld c, a
ld b, 0
@@ -472,7 +328,7 @@ Func_f2d0c:
ld [wSecondLockTrashCanIndex + 1], a
ret
-GymTrashCans3a: ; f2d31 (3c:6d31)
+GymTrashCans3c: ; f2d31 (3c:6d31)
; First byte: number of trashcan entries
; Following four byte pairs: indices for the second trash can.
; BUG: Rows that have 3 trashcan entries are sampled incorrectly.
diff --git a/engine/bank3d.asm b/engine/bank3d.asm
index f86bcf21..bf84e096 100644
--- a/engine/bank3d.asm
+++ b/engine/bank3d.asm
@@ -3,49 +3,49 @@ INCLUDE "engine/battle/link_battle_versus_text.asm"
INCLUDE "engine/battle/unused_stats_functions.asm"
INCLUDE "engine/battle/scroll_draw_trainer_pic.asm"
-Func_f429f:: ; f429f (3d:429f)
+StarterPikachuBattleEntranceAnimation: ; f429f (3d:429f)
coord hl, 0, 5
- ld c, $0
-.asm_f42a4
+ ld c, 0
+.loop1
inc c
ld a, c
- cp $9
+ cp 9
ret z
- ld d, $5b
+ ld d, 7 * 13
push bc
push hl
-.asm_f42ad
- call Func_f42c2
+.loop2
+ call .PlaceColumn
dec hl
ld a, d
- sub $7
+ sub 7
ld d, a
dec c
- jr nz, .asm_f42ad
- ld c, $2
+ jr nz, .loop2
+ ld c, 2
call DelayFrames
pop hl
pop bc
inc hl
- jr .asm_f42a4
+ jr .loop1
-Func_f42c2:: ; f42c2 (3d:f42c2)
+.PlaceColumn: ; f42c2 (3d:f42c2)
push hl
push de
push bc
- ld e, $7
-.loop
+ ld e, 7
+.loop3
ld a, d
- cp $31
- jr nc, .asm_f42ce
+ cp 7 * 7
+ jr nc, .okay
ld a, $7f
-.asm_f42ce
+.okay
ld [hl], a
- ld bc, $14
+ ld bc, SCREEN_WIDTH
add hl, bc
inc d
dec e
- jr nz, .loop
+ jr nz, .loop3
pop bc
pop de
pop hl
@@ -172,56 +172,56 @@ PikachuMoods: ; f43a6 (3d:43a6)
db $6c ; Unknown (d = 10)
db $00 ; Unknown (d = 11)
-RedPicBack:: INCBIN "pic/trainer/redb.pic"
-OldManPic:: INCBIN "pic/trainer/oldman.pic"
-ProfOakPicBack:: INCBIN "pic/ytrainer/prof.oakb.pic"
+RedPicBack: INCBIN "pic/trainer/redb.pic"
+OldManPic: INCBIN "pic/trainer/oldman.pic"
+ProfOakPicBack: INCBIN "pic/ytrainer/prof.oakb.pic"
-Func_f453f:: ; f453f (3d:453f)
+LoadYellowTitleScreenGFX: ; f453f (3d:453f)
ld hl, PokemonLogoGraphics
ld de, vChars2
- ld bc, $730
+ ld bc, 115 * $10
ld a, BANK(PokemonLogoGraphics) ; redundant because this function is in bank3d
call FarCopyData
- ld hl, YellowLogoGraphics+$230
- ld de, vChars0+$fd0
- ld bc, $30
+ ld hl, YellowLogoGraphics + 35 * $10
+ ld de, vChars0 + 253 * $10
+ ld bc, 3 * $10
ld a, BANK(YellowLogoGraphics)
call FarCopyData
- ld hl, YellowLogoGraphics+$260
+ ld hl, YellowLogoGraphics + 38 * $10
ld de, vChars1
- ld bc, $400
+ ld bc, 64 * $10
ld a, BANK(YellowLogoGraphics)
call FarCopyData
- ld hl, YellowLogoGraphics+$660
- ld de, vChars0+$f00
- ld bc, $c0
+ ld hl, YellowLogoGraphics + 102 * $10
+ ld de, vChars0 + 240 * $10
+ ld bc, 12 * $10
ld a, BANK(YellowLogoGraphics)
call FarCopyData
ret
-Func_f4578:: ; f4578 (3d:4578)
+TitleScreen_PlacePokemonLogo: ; f4578 (3d:4578)
coord hl, 2, 1
- ld de, Pointer_f45f9
- ld bc, 7 << 8 | 16 ; 16x7 (xy)
- call CopyScreenArea
+ ld de, TitleScreenPokemonLogoTilemap
+ lb bc, 7, 16
+ call Bank3D_CopyBox
ret
-Func_f4585:: ; f4585 (3d:4585)
+TitleScreen_PlacePikaSpeechBubble: ; f4585 (3d:4585)
coord hl, 6, 4
- ld de, Pointer_f4673
- ld bc, 4 << 8 | 7 ; 7x4 (xy)
- call CopyScreenArea
+ ld de, TitleScreenPikaBubbleTilemap
+ lb bc, 4, 7
+ call Bank3D_CopyBox
coord hl, 9, 8
ld [hl], $64
inc hl
ld [hl], $65
ret
-Func_f459a:: ; f459a (3d:459a)
+TitleScreen_PlacePikachu: ; f459a (3d:459a)
coord hl, 4, 8
- ld de, Pointer_f468f
- ld bc, 9 << 8 | 12 ; 12x9 (xy)
- call CopyScreenArea
+ ld de, TitleScreenPikachuTilemap
+ lb bc, 9, 12
+ call Bank3D_CopyBox
coord hl, 16, 10
ld [hl], $96
coord hl, 16, 11
@@ -230,13 +230,13 @@ Func_f459a:: ; f459a (3d:459a)
ld [hl], $a7
coord hl, 16, 13
ld [hl], $b1
- ld hl, Pointer_f45c7
+ ld hl, TitleScreenPikachuEyesOAMData
ld de, wOAMBuffer
ld bc, $20
call CopyData
ret
-Pointer_f45c7: ; f45c7 (3d:45c7)
+TitleScreenPikachuEyesOAMData: ; f45c7 (3d:45c7)
db $60, $40, $f1, $22
db $60, $48, $f0, $22
db $68, $40, $f3, $22
@@ -246,25 +246,26 @@ Pointer_f45c7: ; f45c7 (3d:45c7)
db $68, $60, $f2, $02
db $68, $68, $f3, $02
-CopyScreenArea:: ; f45e7 (3d:45e7)
+Bank3D_CopyBox: ; f45e7 (3d:45e7)
; copy cxb (xy) screen area from de to hl
+.row
push bc
push hl
-.loop
+.col
ld a, [de]
inc de
ld [hli], a
dec c
- jr nz, .loop
+ jr nz, .col
pop hl
- ld bc, $14
+ ld bc, SCREEN_WIDTH
add hl, bc
pop bc
dec b
- jr nz, CopyScreenArea
+ jr nz, .row
ret
-Pointer_f45f9: ; f45f9 (3d:45f9)
+TitleScreenPokemonLogoTilemap: ; f45f9 (3d:45f9)
; 16x7 (xy)
db $f4, $f4, $f4, $f4, $f4, $f4, $49, $f4, $72, $30, $f4, $f4, $f4, $f4, $f4, $f4
db $fd, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0a, $0b, $f4, $0d, $0e, $0f
@@ -274,17 +275,18 @@ Pointer_f45f9: ; f45f9 (3d:45f9)
db $f4, $41, $42, $43, $44, $45, $46, $47, $48, $f4, $4a, $4b, $4c, $4d, $4e, $4f
db $f4, $6a, $6b, $6c, $6d, $f4, $f4, $f4, $f4, $f4, $f4, $6e, $6f, $70, $71, $f4
-Pointer_f4669:: ; f4669 (3d:4669)
+Pointer_f4669: ; f4669 (3d:4669)
+; Unreferenced
db $47, $48, $49, $4a, $4b, $4c, $4d, $4e, $4f, $5f
-Pointer_f4673:: ; f4673 (3d:4673)
+TitleScreenPikaBubbleTilemap: ; f4673 (3d:4673)
; 7x4 (xy)
db $24, $25, $66, $67, $68, $69, $2a
db $50, $51, $52, $53, $54, $55, $56
db $57, $58, $59, $5a, $5b, $5c, $5d
db $6d, $5e, $5f, $60, $61, $62, $63
-Pointer_f468f:: ; f468f (3d:468f)
+TitleScreenPikachuTilemap: ; f468f (3d:468f)
; 12x9 (xy)
db $80, $81, $82, $83, $00, $00, $00, $00, $84, $85, $86, $87
db $88, $89, $8a, $8b, $8c, $8d, $8d, $8e, $8f, $8a, $90, $91
@@ -298,15 +300,17 @@ Pointer_f468f:: ; f468f (3d:468f)
; f46f9 (3d:46f9)
PokemonLogoGraphics: INCBIN "gfx/pokemon_logo.2bpp"
+PokemonLogoGraphicsEnd:
YellowLogoGraphics: INCBIN "gfx/yellow_titlescreen.2bpp"
+YellowLogoGraphicsEnd:
INCLUDE "engine/menu/link_menu.asm"
-HandleMenuInputDouble:: ; f5a40 (3d:5a40)
+HandleMenuInputDouble: ; f5a40 (3d:5a40)
xor a
ld [wPartyMenuAnimMonEnabled], a
-HandleMenuInputPokemonSelectionDouble:: ; f5a44 (3d:5a44)
+HandleMenuInputPokemonSelectionDouble: ; f5a44 (3d:5a44)
ld a, [H_DOWNARROWBLINKCNT1]
push af
ld a, [H_DOWNARROWBLINKCNT2]
@@ -318,7 +322,7 @@ HandleMenuInputPokemonSelectionDouble:: ; f5a44 (3d:5a44)
.loop1
xor a
ld [wAnimCounter], a ; counter for pokemon shaking animation
- call Func_f5ab0
+ call .UpdateCursorTile
call JoypadLowSensitivity
ld a, [hJoy5]
and a ; was a key pressed?
@@ -376,7 +380,7 @@ HandleMenuInputPokemonSelectionDouble:: ; f5a44 (3d:5a44)
ld a, [hJoy5]
ret
-Func_f5ab0:: ; f5ab0 (3d:5ab0)
+.UpdateCursorTile: ; f5ab0 (3d:5ab0)
ld a, [wTopMenuItemY]
and a
jr z, .asm_f5ac0
@@ -427,12 +431,12 @@ Func_f5ab0:: ; f5ab0 (3d:5ab0)
ld a, l
ld [wMenuCursorLocation], a
ld a, h
- ld [wMenuCursorLocation+1], a
+ ld [wMenuCursorLocation + 1], a
ld a, [wCurrentMenuItem]
ld [wLastMenuItem], a
ret
-PrintStrengthTxt:: ; f5b06 (3d:5b06)
+PrintStrengthTxt: ; f5b06 (3d:5b06)
ld hl, wd728
set 0, [hl]
ld hl, Text_f5b17
@@ -440,7 +444,7 @@ PrintStrengthTxt:: ; f5b06 (3d:5b06)
ld hl, Text_f5b28
jp PrintText
-Text_f5b17:: ; f5b17 (3d:5b17)
+Text_f5b17: ; f5b17 (3d:5b17)
TX_FAR _UsedStrengthText ; 2d:417e
TX_ASM
ld a, [wcf91]
@@ -448,11 +452,11 @@ Text_f5b17:: ; f5b17 (3d:5b17)
call Delay3
jp TextScriptEnd
-Text_f5b28:: ; f5b28 (3d:5b28)
+Text_f5b28: ; f5b28 (3d:5b28)
TX_FAR _CanMoveBouldersText ; 2d:4193
db "@"
-CheckForForcedBikeSurf:: ; f5b2d (3d:5b2d)
+CheckForForcedBikeSurf: ; f5b2d (3d:5b2d)
ld hl, wd728
set 1, [hl]
ld a, [wd732]
@@ -476,19 +480,19 @@ CheckForForcedBikeSurf:: ; f5b2d (3d:5b2d)
ld hl, CyclingIsFunText
jp PrintText
-CoordsData_f5b64:: ; f5b64 (3d:5b64)
+CoordsData_f5b64: ; f5b64 (3d:5b64)
db 11, 07
db $ff
-CurrentTooFastText:: ; f5b67 (3d:5b67)
+CurrentTooFastText: ; f5b67 (3d:5b67)
TX_FAR _CurrentTooFastText ; 2d:41ab
db "@"
-CyclingIsFunText:: ; f5b6c (3d:5b6c)
+CyclingIsFunText: ; f5b6c (3d:5b6c)
TX_FAR _CyclingIsFunText ; 2d:41ca
db "@"
-AddItemToInventory_:: ; f5b70 (3d:5b70)
+AddItemToInventory_: ; f5b70 (3d:5b70)
ld a, [wItemQuantity] ; a = item quantity
push af
push bc
@@ -640,7 +644,7 @@ BlankLeaderNames: INCBIN "gfx/blank_leader_names.2bpp"
CircleTile: INCBIN "gfx/circle_tile.2bpp"
BadgeNumbersTileGraphics: INCBIN "gfx/badge_numbers.2bpp"
-ReadSuperRodData:: ; f5ea4 (3d:5ea4)
+ReadSuperRodData: ; f5ea4 (3d:5ea4)
ld a, [wCurMap]
ld c, a
ld hl, FishingSlots
diff --git a/engine/bank3e.asm b/engine/bank3e.asm
index f5b3c765..32f5ebfd 100644
--- a/engine/bank3e.asm
+++ b/engine/bank3e.asm
@@ -1,4498 +1,5 @@
-SurfingPikachuMinigame:
- call SurfingPikachuMinigame_BlankPals
- call DelayFrame
- call DelayFrame
- call DelayFrame
- ld a, [hTilesetType]
- push af
- xor a
- ld [hTilesetType], a
- ld a, [wUpdateSpritesEnabled]
- push af
- ld a, $ff
- ld [wUpdateSpritesEnabled], a
- ld a, [rIE]
- push af
- xor a
- ld [rIF], a
- ld a, $f
- ld [rIE], a
- ld a, $8
- ld [rSTAT], a
- ld a, [H_AUTOBGTRANSFERDEST + 1]
- push af
- ld a, $98
- ld [H_AUTOBGTRANSFERDEST + 1], a
- call Func_f8fb3
- call Func_f807a
- xor a
- ld [rBGP], a
- ld [rOBP0], a
- ld [rOBP1], a
- call UpdateGBCPal_BGP
- call UpdateGBCPal_OBP0
- call UpdateGBCPal_OBP1
- call ClearObjectAnimationBuffers
- call ClearSprites
- xor a
- ld [hLCDCPointer], a
- ld [hSCX], a
- ld [hSCY], a
- ld a, $90
- ld [hWY], a
- call DelayFrame
- pop af
- ld [H_AUTOBGTRANSFERDEST + 1], a
- xor a
- ld [rIF], a
- pop af
- ld [rIE], a
- xor a
- ld [rSTAT], a
- call RunDefaultPaletteCommand
- call Func_0f16
- call PlayDefaultMusic
- call GBPalNormal
- pop af
- ld [wUpdateSpritesEnabled], a
- pop af
- ld [hTilesetType], a
- ret
-
-Func_f807a:
- call Func_f8116
- call DelayFrame
- ld b, $e
- call RunPaletteCommand
-.loop
- ld a, [wc5d1]
- bit 7, a
- ret nz
- call Func_f923f
- call Func_f80ac
- ret nz
- call Func_f8282
- ld a, $3c
- ld [wCurrentAnimatedObjectOAMBufferOffset], a
- call RunObjectAnimations
- call Func_f8848
- call Func_f80a8
- call Func_f80c4
- jr .loop
-
-Func_f80a8:
- call DelayFrame
- ret
-
-Func_f80ac:
- ld hl, wPreventBlackout
- bit 1, [hl]
- ret z
- ld a, [hJoyPressed]
- and $4
- ret
-
-Func_f80b7:
- ld a, [hJoyPressed]
- and $8
- ret z
- ld hl, wc5e2
- ld a, [hl]
- xor $1
- ld [hl], a
- ret
-
-Func_f80c4:
- ld a, [wc634]
- and a
- ret z
- ld hl, wChannelNoteDelayCounters
- ld a, $1
- cp [hl]
- ret nz
- inc hl
- cp [hl]
- ret nz
- inc hl
- cp [hl]
- ret nz
- ld a, [wc5e3]
- ld e, a
- ld a, [wc5e3 + 1]
- and $3
- ld d, a
- sla e
- rl d
- ld e, d
- ld d, $0
- ld hl, Unkn_f80f5
- add hl, de
- add hl, de
- ld a, [hli]
- ld [wMusicTempo + 1], a
- ld a, [hl]
- ld [wMusicTempo], a
- ret
-
-Unkn_f80f5:
- dw $75
- dw $6d
- dw $65
- dw $5d
- dw $55
-
-Func_f80ff:
- ld hl, wChannelNoteDelayCounters
- ld a, $1
- cp [hl]
- ret nz
- inc hl
- cp [hl]
- ret nz
- inc hl
- cp [hl]
- ret nz
- ld a, $75
- ld [wMusicTempo + 1], a
- xor a
- ld [wMusicTempo], a
- ret
-
-Func_f8116:
- call Func_f9279
- call ClearSprites
- call DisableLCD
- ld hl, wSerialEnemyMonsPatchList
- ld bc, $67
- xor a
- call FillMemory
- ld hl, wc700
- ld bc, $200
- xor a
- call FillMemory
- xor a
- ld [H_AUTOBGTRANSFERENABLED], a
- call ClearObjectAnimationBuffers
-
- ld hl, SurfingPikachu1Graphics
- ld de, $9000
- ld bc, $500
- ld a, BANK(SurfingPikachu1Graphics)
- call FarCopyData
-
- ld hl, SurfingPikachu1Graphics + $410
- ld de, $8000
- ld bc, $1000
- ld a, BANK(SurfingPikachu1Graphics)
- call FarCopyData
-
- ld a, Unkn_f93d3 % $100
- ld [wAnimatedObjectSpawnStateDataPointer], a
- ld a, Unkn_f93d3 / $100
- ld [wAnimatedObjectSpawnStateDataPointer + 1], a
- ld a, Jumptable_f93fa % $100
- ld [wAnimatedObjectJumptablePointer], a
- ld a, Jumptable_f93fa / $100
- ld [wAnimatedObjectJumptablePointer + 1], a
- ld a, Unkn_f9507 % $100
- ld [wAnimatedObjectOAMDataPointer], a
- ld a, Unkn_f9507 / $100
- ld [wAnimatedObjectOAMDataPointer + 1], a
- ld a, Unkn_f9405 % $100
- ld [wAnimatedObjectFramesDataPointer], a
- ld a, Unkn_f9405 / $100
- ld [wAnimatedObjectFramesDataPointer + 1], a
- ld hl, vBGMap0
- ld bc, $800
- ld a, $0
- call FillMemory
- ld hl, $98c0
- ld bc, $180
- ld a, $b
- call FillMemory
- ld a, $1
- lb de, $74, $58
- call SpawnAnimatedObject
- ld a, $74
- ld [wc5ea], a
- call Func_f9223
- xor a
- ld [hSCX], a
- ld [hSCY], a
- ld a, $7e
- ld [hWY], a
- ld a, $42
- ld [hLCDCPointer], a
- ld a, $40
- ld [wc5e3], a
- xor a
- ld [wc5e3 + 1], a
- xor a
- ld [wc5d6], a
- ld a, $60
- ld [wc5d7], a
- ld hl, wc61a
- ld bc, $14
- ld a, $74
- call FillMemory
- call Func_f81ff
- call Func_f8256
- ld a, $e3
- ld [rLCDC], a
- call Func_f81e9
- ld a, $e4
- ld [rOBP0], a
- ld a, $e0
- ld [rOBP1], a
- call UpdateGBCPal_OBP0
- call UpdateGBCPal_OBP1
- ret
-
-Func_f81e9:
- ld a, [wOnSGB]
- and a
- jr nz, .asm_f81f7
- ld a, $d0
- ld [rBGP], a
- call UpdateGBCPal_BGP
- ret
-
-.asm_f81f7
- ld a, $e4
- ld [rBGP], a
- call UpdateGBCPal_BGP
- ret
-
-Func_f81ff:
- ld hl, wSpriteDataEnd
- ld de, Unkn_f8249
- ld b, $97
- ld c, $80
- ld a, $4
- call Func_f8233
- ld de, Unkn_f8248
- ld b, $96
- ld c, $50
- ld a, $1
- call Func_f8233
- ld de, Unkn_f824d
- ld b, $14
- ld c, $20
- ld a, $5
- call Func_f8233
- ld de, Unkn_f8252
- ld b, $20
- ld c, $80
- ld a, $4
- call Func_f8233
- ret
-
-Func_f8233:
-.asm_f8233
- push af
- ld [hl], b
- inc hl
- ld [hl], c
- inc hl
- ld a, [de]
- ld [hl], a
- inc hl
- ld [hl], $0
- inc hl
- ld a, c
- add $8
- ld c, a
- inc de
- pop af
- dec a
- jr nz, .asm_f8233
- ret
-
-Unkn_f8248:
- db $fe
-
-Unkn_f8249:
- db $d0
- db $d0
- db $d0
- db $d0
-
-Unkn_f824d:
- db $ec
- db $ed
- db $ed
- db $ee
- db $ef
-
-Unkn_f8252:
- db $ec
- db $ed
- db $ee
- db $ef
-
-Func_f8256:
- ld de, $9c21
- ld hl, Unkn_f8279
- ld c, $9
-.asm_f825e
- ld a, [hli]
- ld [de], a
- inc de
- dec c
- jr nz, .asm_f825e
- ld hl, $9c01
- ld [hl], $15
- ld hl, $9c02
- ld [hl], $16
- ld hl, $9c2c
- ld [hl], $1b
- ld hl, $9c2d
- ld [hl], $1c
- ret
-
-Unkn_f8279:
- db $17
- db $18
- db $19
- db $19
- db $19
- db $19
- db $19
- db $19
- db $19
-
-Func_f8282:
- ld a, [wc5d1]
- ld e, a
- ld d, $0
- ld hl, Jumptable_f8291
- add hl, de
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jp [hl]
-
-Jumptable_f8291:
- dw Func_f82ab
- dw Func_f82bd
- dw Func_f8324
- dw Func_f835c
- dw Func_f838c
- dw Func_f8399
- dw Func_f83aa
- dw Func_f83bb
- dw Func_f83cc
- dw Func_f83e3
- dw Func_f8406
- dw Func_f840f
- dw Func_f841d
-
-Func_f82ab:
- ld a, $2
- lb de, $48, $e0
- call SpawnAnimatedObject
- ld hl, wc5d1
- inc [hl]
- ld a, $1
- ld [wc634], a
- ret
-
-Func_f82bd:
- ld a, [wc5e5]
- cp $18
- jr nc, .asm_f82e8
- ld hl, wc5d6
- ld a, [hli]
- or [hl]
- and a
- jr z, .asm_f82f6
- call Random
- ld [wc5d5], a
- call Func_f9210
- call Func_f88ae
- call Func_f886b
- call Func_f8cb0
- call Func_f844c
- call Func_f88e4
- call Func_f88fd
- ret
-
-.asm_f82e8
- ld hl, wc5d1
- inc [hl]
- xor a
- ld [wc634], a
- ld a, $c0
- ld [wc632], a
- ret
-
-.asm_f82f6
- ld a, $1
-Func_f82f8:
- ld [wc630], a
- ld a, $c
- ld [wc5d1], a
-Func_f8300:
- ld a, $80
- ld [wc631], a
- ld a, $b
- lb de, $88, $58
- call SpawnAnimatedObject
- ld hl, $7
- add hl, bc
- ld [hl], $80
- ld hl, $b
- add hl, bc
- ld [hl], $80
- ld hl, $c
- add hl, bc
- ld [hl], $30
- xor a
- ld [wc634], a
- ret
-
-Func_f8324:
- call Func_f8440
- jr c, .asm_f833d
- xor a
- ld [wc5d5], a
- call Func_f9210
- call Func_f88ae
- call Func_f886b
- call Func_f8c97
- call Func_f80ff
- ret
-
-.asm_f833d
- ld hl, wc5d1
- inc [hl]
- ld a, $90
- ld [hSCX], a
- ld a, $72
- ld [wc5d3], a
- ld a, $4
- ld [wc5d2], a
- xor a
- ld [hLCDCPointer], a
- ld [wc617], a
- ld [wc618], a
- ld [wc619], a
- ret
-
-Func_f835c:
- ld a, [hSCX]
- and a
- jr z, .asm_f837b
- call Func_f9210
- call Func_f88ae
- call Func_f886b
- ld a, [hSCX]
- dec a
- dec a
- dec a
- dec a
- ld [hSCX], a
- ld a, $e0
- ld [wc62e], a
- call Func_f8cc7
- ret
-
-.asm_f837b
- xor a
- ld [wc5e3], a
- ld [wc5e3 + 1], a
- ld hl, wc5d1
- inc [hl]
- ld a, $5
- ld [wc5d2], a
- ret
-
-Func_f838c:
- call Func_f891e
- ld a, $20
- ld [wc632], a
- ld hl, wc5d1
- inc [hl]
- ret
-
-Func_f8399:
- call Func_f8440
- ret nc
- call Func_f8a92
- ld a, $40
- ld [wc632], a
- ld hl, wc5d1
- inc [hl]
- ret
-
-Func_f83aa:
- call Func_f8440
- ret nc
- call Func_f8ae4
- ld a, $40
- ld [wc632], a
- ld hl, wc5d1
- inc [hl]
- ret
-
-Func_f83bb:
- call Func_f8440
- ret nc
- call Func_f8b7a
- ld a, $40
- ld [wc632], a
- ld hl, wc5d1
- inc [hl]
- ret
-
-Func_f83cc:
- call Func_f8440
- ret nc
- call Func_f8aa9
- push af
- call Func_f8b5d
- pop af
- ret nc
- ld a, $40
- ld [wc632], a
- ld hl, wc5d1
- inc [hl]
- ret
-
-Func_f83e3:
- call Func_f8440
- ret nc
- call Func_f8afb
- push af
- call Func_f8b5d
- pop af
- ret nc
- ld a, $80
- ld [wc632], a
- ld hl, wc5d1
- inc [hl]
- call Func_f8b92
- ret nc
- call Func_f8a7c
-Func_f83ff:
- ld a, $6
- ld [wc5d2], a
- ret
-
-Func_f8406:
- call Func_f8440
-Func_f8408:
- ret nc
- ld hl, wc5d1
- inc [hl]
- ret
-
-Func_f840f:
- call Func_f9210
- ld a, [hJoyPressed]
- and $1
- ret z
- ld hl, wc5d1
- set 7, [hl]
- ret
-
-Func_f841d:
- call Func_f9210
- call Func_f88ae
- call Func_f886b
- call Func_f8cb0
- call Func_f80ff
- ld hl, wc631
- ld a, [hl]
- and a
- jr z, .asm_f8435
- dec [hl]
- ret
-
-.asm_f8435
- ld a, [hJoyPressed]
- and $1
- ret z
- ld hl, wc5d1
- set 7, [hl]
- ret
-
-Func_f8440:
- ld hl, wc632
- ld a, [hl]
- and a
- jr z, .asm_f844a
- dec [hl]
- and a
- ret
-
-.asm_f844a
- scf
- ret
-
-Func_f844c:
- ld a, [wc5e6]
- ld h, a
- ld a, [wc5e7]
- ld l, a
- ld a, [wc5e3]
- ld e, a
- ld a, [wc5e3 + 1]
- ld d, a
- add hl, de
- ld a, h
- ld [wc5e6], a
- ld a, l
- ld [wc5e7], a
- ret nc
- ld hl, wc5e5
- inc [hl]
- ld hl, wOAMBuffer + 4 * 4 + 1
- dec [hl]
- dec [hl]
- ret
-
-Func_f8470
- ld a, [wc5d2]
- ld e, a
- ld d, $0
- ld hl, Jumptable_f847f
- add hl, de
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jp [hl]
-
-Jumptable_f847f:
- dw Func_f848d
- dw Func_f84e2
- dw Func_f8516
- dw Func_f8545
- dw Func_f8561
- dw Func_f856d
- dw Func_f8579
-
-Func_f848d:
- ld a, [wc630]
- and a
- jr nz, .asm_f84d2
- call Func_f87b5
- ld a, [wc5ea]
- ld hl, $5
- add hl, bc
- ld [hl], a
- call Func_f871e
- jr c, .asm_f84aa
- call Func_f8742
- call Func_f86b8
- ret
-
-.asm_f84aa
- call Func_f8742
- ld a, $1
- ld [wc5d2], a
- xor a
- ld hl, $c
- add hl, bc
- ld [hl], a
- ld hl, $d
- add hl, bc
- ld [hl], a
- ld hl, $e
- add hl, bc
- ld [hl], a
- ld [wc5d9], a
- ld [wc62f], a
- xor a
- ld [wChannelSoundIDs + CH7], a
- ld a, $91
- call PlaySound
- ret
-
-.asm_f84d2
- xor a
- ld [wc5e3], a
- ld [wc5e3 + 1], a
- ld a, $4
- ld [wc5d2], a
- call Func_f8742
- ret
-
-Func_f84e2:
- call Func_f8598
- call Func_f928c
- ret nc
- call Func_f8606
- jr c, .asm_f84fd
- call Func_f8bed
- ld hl, $c
- add hl, bc
- ld [hl], $0
- ld a, $2
- ld [wc5d2], a
- ret
-
-.asm_f84fd
- ld a, $3
- ld [wc5d2], a
- ld a, $60
- ld [wc5e1], a
- ld a, $10
- call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters
- xor a
- ld [wChannelSoundIDs + CH7], a
- ld a, $93
- call PlaySound
- ret
-
-Func_f8516:
- ld hl, $c
- add hl, bc
- ld a, [hl]
- cp $20
- jr nc, .asm_f8539
- inc [hl]
- inc [hl]
- inc [hl]
- inc [hl]
- ld d, $4
- call Func_f9362
- ld hl, $7
- add hl, bc
- ld [hl], a
- call Func_f87b5
- ld a, [wc5ea]
- ld hl, $5
- add hl, bc
- ld [hl], a
- ret
-
-.asm_f8539
- ld hl, $7
- add hl, bc
- ld [hl], $0
- ld a, $0
- ld [wc5d2], a
- ret
-
-Func_f8545:
- ld hl, wc5e1
- ld a, [hl]
- and a
- jr z, .asm_f8556
- dec [hl]
- ld a, [wc5ea]
- ld hl, $5
- add hl, bc
- ld [hl], a
- ret
-
-.asm_f8556
- ld a, $0
- ld [wc5d2], a
- ld a, $4
- call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters
- ret
-
-Func_f8561:
- ld a, [wc5ea]
- ld hl, $5
- add hl, bc
- ld [hl], a
- call Func_f8742
- ret
-
-Func_f856d:
- ld a, $f
- call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters
- ld hl, $c
- add hl, bc
- ld [hl], $0
- ret
-
-Func_f8579:
- ld hl, $c
- add hl, bc
- ld a, [hl]
- inc [hl]
- inc [hl]
- and $3f
- cp $20
- jr c, .asm_f8591
- ld d, $10
- call Func_f9362
- ld hl, $7
- add hl, bc
- ld [hl], a
- ret
-
-.asm_f8591
- ld hl, $7
- add hl, bc
- ld [hl], $0
- ret
-
-Func_f8598:
- ld de, hJoy5
- ld a, [de]
- and $20
- jr nz, .asm_f85a6
- ld a, [de]
- and $10
- jr nz, .asm_f85cc
- ret
-
-.asm_f85a6
- ld hl, $e
- add hl, bc
- ld [hl], $0
- ld hl, $d
- add hl, bc
- ld a, [hl]
- inc [hl]
- cp $b
- jr c, .asm_f85be
- call Func_f85f2
- ld hl, wc62f
- set 0, [hl]
-.asm_f85be
- ld hl, $1
- add hl, bc
- ld a, [hl]
- cp $e
- jr nc, .asm_f85c9
- inc [hl]
- ret
-
-.asm_f85c9
- ld [hl], $1
- ret
-
-.asm_f85cc
- ld hl, $d
- add hl, bc
- ld [hl], $0
- ld hl, $e
- add hl, bc
- ld a, [hl]
- inc [hl]
- cp $d
- jr c, .asm_f85e4
- call Func_f85f2
- ld hl, wc62f
- set 1, [hl]
-.asm_f85e4
- ld hl, $1
- add hl, bc
- ld a, [hl]
- cp $1
- jr z, .asm_f85ef
- dec [hl]
- ret
-
-.asm_f85ef
- ld [hl], $e
- ret
-
-Func_f85f2:
- call Func_f8bdf
- xor a
- ld hl, $d
- add hl, bc
- ld [hl], a
- ld hl, $e
- add hl, bc
- ld [hl], a
- ld a, $92
- call PlaySound
- ret
-
-Func_f8606:
- ld hl, $1
- add hl, bc
- ld a, [wc5ef]
- cp $6
- jr z, .asm_f863d
- cp $14
- jr z, .asm_f867b
- cp $12
- jr z, .asm_f867b
- cp $7
- jr z, .asm_f865c
- ld a, [hl]
- cp $1
- jp z, .asm_f86ad
- cp $2
- jr z, .asm_f869a
- cp $3
- jr z, .asm_f869f
- cp $4
- jr z, .asm_f86a2
- cp $5
- jr z, .asm_f869f
- cp $6
- jr z, .asm_f869a
- cp $7
- jr z, .asm_f86ad
- jr .asm_f86ad
-
-.asm_f863d
- ld a, [hl]
- cp $1
- jr z, .asm_f86ad
- cp $2
- jr z, .asm_f86ad
- cp $3
- jr z, .asm_f86ad
- cp $4
- jr z, .asm_f869a
- cp $5
- jr z, .asm_f869f
- cp $6
- jr z, .asm_f86a2
- cp $7
- jr z, .asm_f869f
- jr .asm_f86ad
-
-.asm_f865c
- ld a, [hl]
- cp $1
- jr z, .asm_f869f
- cp $2
- jr z, .asm_f86a2
- cp $3
- jr z, .asm_f869f
- cp $4
- jr z, .asm_f869a
- cp $5
- jr z, .asm_f86ad
- cp $6
- jr z, .asm_f86ad
- cp $7
- jr z, .asm_f86ad
- jr .asm_f86ad
-
-.asm_f867b
- ld a, [hl]
- cp $1
- jr z, .asm_f86ad
- cp $2
- jr z, .asm_f869a
- cp $3
- jr z, .asm_f869f
- cp $4
- jr z, .asm_f86a2
- cp $5
- jr z, .asm_f86a2
- cp $6
- jr z, .asm_f869f
- cp $7
- jr z, .asm_f869a
- jr .asm_f86ad
-
-.asm_f869a
- call Func_f86f7
- jr .asm_f86a2
-
-.asm_f869f
- call Func_f86d0
-.asm_f86a2
- xor a
- ld [wChannelSoundIDs + CH7], a
- ld a, $95
- call PlaySound
- and a
- ret
-
-.asm_f86ad
- ld a, $40
- ld [wc5e3], a
- xor a
- ld [wc5e3 + 1], a
- scf
- ret
-
-Func_f86b8:
- ld a, [wc5e3 + 1]
- cp $2
- ret nc
- ld h, a
- ld a, [wc5e3]
- ld l, a
- ld de, $2
- add hl, de
- ld a, h
- ld [wc5e3 + 1], a
- ld a, l
- ld [wc5e3], a
- ret
-
-Func_f86d0:
- ld a, [wc5e3 + 1]
- and a
- jr nz, .asm_f86e2
- ld a, [wc5e3]
- cp $40
- jr nc, .asm_f86e2
- xor a
- ld [wc5e3], a
- ret
-
-.asm_f86e2
- ld a, [wc5e3 + 1]
- ld h, a
- ld a, [wc5e3]
- ld l, a
- ld de, $ffc0
- add hl, de
- ld a, h
- ld [wc5e3 + 1], a
- ld a, l
- ld [wc5e3], a
- ret
-
-Func_f86f7:
- ld a, [wc5e3 + 1]
- and a
- jr nz, .asm_f8709
- ld a, [wc5e3]
- cp $80
- jr nc, .asm_f8709
- xor a
- ld [wc5e3], a
- ret
-
-.asm_f8709
- ld a, [wc5e3 + 1]
- ld h, a
- ld a, [wc5e3]
- ld l, a
- ld de, $ff80
- add hl, de
- ld a, h
- ld [wc5e3 + 1], a
- ld a, l
- ld [wc5e3], a
- ret
-
-Func_f871e:
- ld a, [hSCX]
- and $7
- cp $3
- jr c, .asm_f8740
- cp $5
- jr nc, .asm_f8740
- ld a, [wc5ef]
- cp $14
- jr nz, .asm_f8740
- call Func_f87a8
- cp $a
- jr c, .asm_f8740
- ld [wc5ec], a
- call Func_f9284
- scf
- ret
-
-.asm_f8740
- and a
- ret
-
-Func_f8742:
- ld a, [hSCX]
- and $7
- cp $3
- ret c
- cp $5
- ret nc
- ld a, [wc5ef]
- cp $6
- jr z, .asm_f8766
- cp $14
- jr z, .asm_f8766
- cp $7
- jr z, .asm_f876a
- call Func_f8778
- ld a, $4
- ld hl, $1
- add hl, bc
- ld [hl], a
- ret
-
-.asm_f8766
- ld a, $6
- jr .asm_f876c
-
-.asm_f876a
- ld a, $2
-.asm_f876c
- ld e, a
- ld a, [wc5de]
- dec a
- add e
- ld hl, $1
- add hl, bc
- ld [hl], a
- ret
-
-Func_f8778:
- ld hl, wc5e0
- ld a, [hl]
- inc [hl]
- and $7
- ret nz
- ld a, [wc5df]
- and a
- jr z, .asm_f8796
- ld a, [wc5de]
- and a
- jr z, .asm_f8791
- dec a
- ld [wc5de], a
- ret
-
-.asm_f8791
- xor a
- ld [wc5df], a
- ret
-
-.asm_f8796
- ld a, [wc5de]
- cp $2
- jr z, .asm_f87a2
- inc a
- ld [wc5de], a
- ret
-
-.asm_f87a2
- ld a, $1
- ld [wc5df], a
- ret
-
-Func_f87a8:
- ld a, [wc5e3]
- ld l, a
- ld a, [wc5e3 + 1]
- ld h, a
- add hl, hl
- add hl, hl
- add hl, hl
- ld a, h
- ret
-
-Func_f87b5:
- ld hl, wc5eb
- ld a, [hl]
- inc [hl]
- and $3
- ret nz
- call Func_f87ce
- ld d, a
- ld hl, $4
- add hl, bc
- ld e, [hl]
- ld a, $a
- push bc
- call SpawnAnimatedObject
- pop bc
- ret
-
-Func_f87ce:
- ld a, [hSCX]
- and $8
- jr nz, .asm_f87d9
- ld hl, wc622
- jr .asm_f87dc
-
-.asm_f87d9
- ld hl, wc623
-.asm_f87dc
- ld a, [wc5f0]
- cp $6
- jr z, .asm_f87ed
- cp $14
- jr z, .asm_f87ed
- cp $7
- jr z, .asm_f87f5
- ld a, [hl]
- ret
-
-.asm_f87ed
- ld a, [hSCX]
- and $7
- ld e, a
- ld a, [hl]
- sub e
- ret
-
-.asm_f87f5
- ld a, [hSCX]
- and $7
- add [hl]
- ret
-
-Func_f87fb:
- ld hl, $4
- add hl, bc
- ld a, [hl]
- cp $58
- ret z
- add $4
- ld [hl], a
- ret
-
-Func_f8807:
- call MaskCurrentAnimatedObjectStruct
- ret
-
-Func_f880b:
- ld hl, $b
- add hl, bc
- ld a, [hl]
- and a
- ret z
- dec [hl]
- dec [hl]
- ld d, a
- ld hl, $c
- add hl, bc
- ld a, [hl]
- inc [hl]
- call Func_f9362
- cp $80
- jr nc, .asm_f8825
- xor $ff
- inc a
-.asm_f8825
- ld hl, $7
- add hl, bc
- ld [hl], a
- ret
-
-Func_f882b:
- ld hl, $b
- add hl, bc
- ld a, [hl]
- inc [hl]
- and $1
- ret z
- ld hl, $4
- add hl, bc
- ld a, [hl]
- cp $c0
- jr z, .asm_f883f
- inc [hl]
- ret
-
-.asm_f883f
- ld a, $1
- ld [wc633], a
- call MaskCurrentAnimatedObjectStruct
- ret
-
-Func_f8848:
- ld a, [wc635]
- ld e, a
- ld d, $0
- ld a, [wc5e3]
- ld l, a
- ld a, [wc5e3 + 1]
- ld h, a
- add hl, de
- ld a, l
- ld [wc635], a
- ld d, h
- ld hl, wOAMBuffer + 5 * 4 + 1
- ld e, $9
-.asm_f8861
- ld a, [hl]
- add d
- ld [hli], a
- inc hl
- inc hl
- inc hl
- dec e
- jr nz, .asm_f8861
- ret
-
-Func_f886b:
- ld a, [wc5ef]
- ld a, [hSCX]
- add $48
- ld e, a
- srl e
- srl e
- srl e
- ld d, $0
- ld hl, vBGMap0
- add hl, de
- ld a, [wc5ea]
- srl a
- srl a
- srl a
- ld c, a
-.asm_f8889
- ld a, c
- and a
- jr z, .asm_f889a
- dec c
- ld de, $20
- add hl, de
- ld a, h
- and $3
- or $98
- ld h, a
- jr .asm_f8889
-
-.asm_f889a
- ld de, wc5ef
- ld a, e
- ld [H_VBCOPYDEST], a
- ld a, d
- ld [H_VBCOPYDEST + 1], a
- ld a, l
- ld [H_VBCOPYSRC], a
- ld a, h
- ld [H_VBCOPYSRC + 1], a
- ld a, $1
- ld [H_VBCOPYSIZE], a
- ret
-
-Func_f88ae:
- ld a, [hSCX]
- and $8
- jr nz, .asm_f88b9
- ld hl, wc621
- jr .asm_f88bc
-
-.asm_f88b9
- ld hl, wc622
-.asm_f88bc
- ld a, [wc5ef]
- cp $6
- jr z, .asm_f88d0
- cp $14
- jr z, .asm_f88d0
- cp $7
- jr z, .asm_f88db
- ld a, [hl]
- ld [wc5ea], a
- ret
-
-.asm_f88d0
- ld a, [hSCX]
- and $7
- ld e, a
- ld a, [hl]
- sub e
- ld [wc5ea], a
- ret
-
-.asm_f88db
- ld a, [hSCX]
- and $7
- add [hl]
- ld [wc5ea], a
- ret
-
-Func_f88e4:
- ld hl, wc5d6
- ld e, $99
- call Func_f88f0
- ret nc
- inc hl
- ld e, $99
-Func_f88f0:
- ld a, [hl]
- and a
- jr z, .asm_f88fa
- sub $1
- daa
- ld [hl], a
- and a
- ret
-
-.asm_f88fa
- ld [hl], e
- scf
- ret
-
-Func_f88fd:
- ld de, wc5d7
- ld hl, wOAMBuffer + 0 * 4 + 2
- ld a, [de]
- call Func_f890b
- ld hl, wOAMBuffer + 2 * 4 + 2
- ld a, [de]
-Func_f890b:
- ld c, a
- swap a
- and $f
- add $d0
- ld [hli], a
- inc hl
- inc hl
- inc hl
- ld a, c
- and $f
- add $d0
- ld [hl], a
- dec de
- ret
-
-Func_f891e:
- ld hl, wTileMap
- ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
- xor a
- call FillMemory
- ld hl, Tilemap_f8946
- coord de, 0, 6
- ld bc, Tilemap_f8946End - Tilemap_f8946
- call CopyData
- call Func_f8a0e
- ld hl, wOAMBuffer + 5 * 4 + 1
- ld bc, $24
- xor a
- call FillMemory
- ld a, $1
- ld [H_AUTOBGTRANSFERENABLED], a
- ret
-
-Tilemap_f8946:
-INCBIN "gfx/unknown_f8946.map"
-Tilemap_f8946End:
-
-Func_f8a0e:
- coord hl, 1, 1
- lb de, $3b, $3c
- ld a, $40
- call Func_f8a72
- coord hl, 1, 2
- lb de, $3f, $3f
- ld a, $ff
- call Func_f8a72
- coord hl, 1, 3
- lb de, $3f, $3f
- ld a, $ff
- call Func_f8a72
- coord hl, 1, 4
- lb de, $3f, $3f
- ld a, $ff
- call Func_f8a72
- coord hl, 1, 5
- lb de, $3f, $3f
- ld a, $ff
- call Func_f8a72
- coord hl, 1, 6
- lb de, $3f, $3f
- ld a, $ff
- call Func_f8a72
- coord hl, 1, 7
- lb de, $3f, $3f
- ld a, $ff
- call Func_f8a72
- coord hl, 1, 8
- lb de, $3f, $3f
- ld a, $ff
- call Func_f8a72
- coord hl, 1, 9
- lb de, $3d, $3e
- ld a, $40
- call Func_f8a72
- ret
-
-Func_f8a72:
- ld [hl], d
- inc hl
- ld c, $10
-.asm_f8a76
- ld [hli], a
- dec c
- jr nz, .asm_f8a76
- ld [hl], e
- ret
-
-Func_f8a7c:
- ld hl, Tilemap_f8a89
- coord de, 6, 8
- ld bc, $9
- call CopyData
- ret
-
-Tilemap_f8a89:
- db $20,$2e,$2f,$30,$31,$2c,$32,$23,$33
-
-Func_f8a92:
- ld hl, Tilemap_f8aa2
- coord de, 2, 2
- ld bc, $7
- call CopyData
- call Func_f8aca
- ret
-
-Tilemap_f8aa2:
- db $20,$21,$ff,$22,$23,$24,$25
-
-Func_f8aa9:
- ld c, $63
-.asm_f8aab
- push bc
- ld hl, wc5d6
- ld a, [hli]
- or [hl]
- and a
- jr z, .asm_f8ac7
- call Func_f88e4
- ld e, $1
-.asm_f8ab9
- call Func_f8b42
- pop bc
- dec c
- jr nz, .asm_f8aab
-.asm_f8abf
- ld a, $90
- call PlaySound
-.asm_f8ac5
- and a
- ret
-
-.asm_f8ac7
- pop bc
- scf
- ret
-
-Func_f8aca:
- coord hl, 10, 2
- ld de, wc5d7
- ld a, [de]
- call Func_f9350
- inc hl
- ld a, [de]
- call Func_f9350
- inc hl
- inc hl
- ld [hl], $21
- inc hl
- ld [hl], $25
- inc hl
- ld [hl], $26
- ret
-
-Func_f8ae4:
- ld hl, Tilemap_f8af4
- coord de, 2, 4
- ld bc, $7
- call CopyData
- call Func_f8b25
- ret
-
-Tilemap_f8af4:
- db $27,$28,$29,$2a,$23,$26,$26
-
-Func_f8afb:
- ld c, $63
-.asm_f8afd
- push bc
- ld hl, wc5da
- ld a, [hli]
- ld e, a
- or [hl]
- jr z, .asm_f8b22
- ld d, [hl]
- ld a, e
- sub $1
- daa
- ld e, a
- ld a, d
- sbc $0
- daa
- ld [hld], a
- ld [hl], e
- ld e, $1
- call Func_f8b42
- pop bc
- dec c
- jr nz, .asm_f8afd
- ld a, $90
- call PlaySound
-.asm_f8b20
- and a
- ret
-
-.asm_f8b22
- pop bc
- scf
- ret
-
-Func_f8b25:
- ld a, [wc5db]
- coord hl, 10, 4
- call Func_f9350
- ld a, [wc5da]
- coord hl, 12, 4
- call Func_f9350
- inc hl
- inc hl
- ld [hl], $21
- inc hl
- ld [hl], $25
- inc hl
- ld [hl], $26
- ret
-
-Func_f8b42:
- ld a, [wc5dc]
- add e
- daa
- ld [wc5dc], a
- ld a, [wc5dd]
- adc $0
- daa
- ld [wc5dd], a
- ret nc
- ld a, $99
- ld [wc5dc], a
- ld [wc5dd], a
- ret
-
-Func_f8b5d:
- ld a, [wc5dd]
- coord hl, 10, 6
- call Func_f9350
- ld a, [wc5dc]
- coord hl, 12, 6
- call Func_f9350
- inc hl
- inc hl
- ld [hl], $21
- inc hl
- ld [hl], $25
- inc hl
- ld [hl], $26
- ret
-
-Func_f8b7a:
- ld hl, Tilemap_f8b8d
- coord de, 2, 6
- ld bc, $5
- call CopyData
- call Func_f8b25
- call Func_f8b5d
- ret
-
-Tilemap_f8b8d:
- db $2b,$2c,$25,$28,$2d
-
-Func_f8b92:
- ld hl, wd496
- ld a, [wc5dd]
- cp [hl]
- jr c, .asm_f8ba6
- jr nz, .asm_f8bb0
- dec hl
- ld a, [wc5dc]
- cp [hl]
- jr c, .asm_f8ba6
- jr nz, .asm_f8bb0
-.asm_f8ba6
- call WaitForSoundToFinish
- ld e, $1b
- call Func_f8bcb
- and a
- ret
-
-.asm_f8bb0
- ld a, [wc5dc]
- ld [wd495], a
- ld a, [wc5dd]
- ld [wd496], a
- call WaitForSoundToFinish
- ld e, $21
- call Func_f8bcb
- ld a, $96
- call PlaySound
- scf
- ret
-
-Func_f8bcb: ; f8bcb (3e:4bcb)
- push de
- callab IsSurfingPikachuInThePlayersParty
- pop de
- ret nc
- callab PlayPikachuSoundClip
- ret
-
-Func_f8bdf:
- ld a, [wc5d9]
- inc a
- cp $4
- jr c, .asm_f8be9
- ld a, $3
-.asm_f8be9
- ld [wc5d9], a
- ret
-
-Func_f8bed:
- ld a, [wc5d9]
- and a
- ret z
- ld a, [wc62f]
- and $3
- cp $3
- jr z, .asm_f8c2b
- ld a, [wc5d9]
- ld d, a
- ld e, $1
- ld a, $0
-.asm_f8c03
- add e
- sla e
- dec d
- jr nz, .asm_f8c03
-.asm_f8c09
- push af
- ld e, $50
- call Func_f8c7c
- pop af
- dec a
- jr nz, .asm_f8c09
- ld hl, $5
- add hl, bc
- ld a, [hl]
- sub $10
- ld d, a
- ld hl, $4
- add hl, bc
- ld e, [hl]
- ld a, [wc5d9]
- add $3
- push bc
- call SpawnAnimatedObject
- pop bc
- ret
-
-.asm_f8c2b
- ld a, [wc5d9]
- cp $3
- jr c, .asm_f8c53
- ld a, $a
-.asm_f8c34
- push af
- ld e, $50
- call Func_f8c7c
- pop af
- dec a
- jr nz, .asm_f8c34
- ld hl, $5
- add hl, bc
- ld a, [hl]
- sub $10
- ld d, a
- ld hl, $4
- add hl, bc
- ld e, [hl]
- ld a, $9
- push bc
- call SpawnAnimatedObject
- pop bc
- ret
-
-.asm_f8c53
- ld e, $50
- call Func_f8c7c
- ld e, $50
- call Func_f8c7c
- ld e, $50
- call Func_f8c7c
- ld e, $30
- call Func_f8c7c
- ld hl, $5
- add hl, bc
- ld a, [hl]
- sub $10
- ld d, a
- ld hl, $4
- add hl, bc
- ld e, [hl]
- ld a, $8
- push bc
- call SpawnAnimatedObject
- pop bc
- ret
-
-Func_f8c7c:
- ld a, [wc5da]
- add e
- daa
- ld [wc5da], a
- ld a, [wc5db]
- adc $0
- daa
- ld [wc5db], a
- ret nc
- ld a, $99
- ld [wc5da], a
- ld [wc5db], a
- ret
-
-Func_f8c97:
- ld a, $a0
- ld [wc62e], a
- ld a, [hSCX]
- ld h, a
- ld a, [wc617]
- ld l, a
- ld de, $900
- add hl, de
- ld a, l
- ld [wc617], a
- ld a, h
- ld [hSCX], a
- jr Func_f8cc7
-
-Func_f8cb0:
- ld a, $a0
- ld [wc62e], a
- ld a, [hSCX]
- ld h, a
- ld a, [wc617]
- ld l, a
- ld de, $180
- add hl, de
- ld a, l
- ld [wc617], a
- ld a, h
- ld [hSCX], a
-Func_f8cc7:
- ld hl, wc618
- ld a, [hSCX]
- cp [hl]
- ret z
- ld [hl], a
- and $f0
- ld hl, wc619
- cp [hl]
- ret z
- ld [hl], a
- call Func_f8d44
- ld a, b
- ld [wc5e8], a
- ld a, c
- ld [wc5e9], a
- push de
- ld hl, wc61a
- ld de, wc61c
- ld c, $12
-.asm_f8ceb
- ld a, [de]
- inc de
- ld [hli], a
- dec c
- jr nz, .asm_f8ceb
- ld a, [wc5e8]
- ld [hli], a
- ld a, [wc5e9]
- ld [hl], a
- pop de
- ld hl, wRedrawRowOrColumnSrcTiles
- ld c, $8
-.asm_f8cff
- ld a, [de]
- call Func_f8d28
- inc de
- dec c
- jr nz, .asm_f8cff
- ld a, [wc62e]
- ld e, a
- ld a, [hSCX]
- add e
- and $f0
- srl a
- srl a
- srl a
- ld e, a
- ld d, $0
- ld hl, vBGMap0
- add hl, de
- ld a, l
- ld [hRedrawRowOrColumnDest], a
- ld a, h
- ld [hRedrawRowOrColumnDest + 1], a
- ld a, $1
- ld [hRedrawRowOrColumnMode], a
- ret
-
-Func_f8d28:
- push de
- push hl
- ld l, a
- ld h, $0
- ld de, Unkn_f96e5
- add hl, hl
- add hl, hl
- add hl, de
- ld e, l
- ld d, h
- pop hl
- ld a, [de]
- inc de
- ld [hli], a
- ld a, [de]
- inc de
- ld [hli], a
- ld a, [de]
- inc de
- ld [hli], a
- ld a, [de]
- inc de
- ld [hli], a
- pop de
- ret
-
-Func_f8d44:
- ld a, [wc5d3]
- ld e, a
- ld d, $0
- ld hl, Jumptable_f8d53
- add hl, de
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jp [hl]
-
-Jumptable_f8d53:
- dw Func_f8e4b
- dw Func_f8f28
- dw Func_f8f31
- dw Func_f8f3a
- dw Func_f8f43
- dw Func_f8e7d
- dw Func_f8f4c
- dw Func_f8f55
- dw Func_f8f5e
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8f94
- dw Func_f8ec5
- dw Func_f8ece
- dw Func_f8ed7
- dw Func_f8ee0
- dw Func_f8ee9
- dw Func_f8ef2
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8f94
- dw Func_f8efb
- dw Func_f8f04
- dw Func_f8f0d
- dw Func_f8f16
- dw Func_f8f1f
- dw Func_f8efb
- dw Func_f8f04
- dw Func_f8f0d
- dw Func_f8f16
- dw Func_f8f1f
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8f94
- dw Func_f8f28
- dw Func_f8f31
- dw Func_f8f3a
- dw Func_f8f43
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8f94
- dw Func_f8f4c
- dw Func_f8f55
- dw Func_f8f5e
- dw Func_f8f4c
- dw Func_f8f55
- dw Func_f8f5e
- dw Func_f8f4c
- dw Func_f8f55
- dw Func_f8f5e
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8f94
- dw Func_f8f67
- dw Func_f8f70
- dw Func_f8efb
- dw Func_f8f04
- dw Func_f8f0d
- dw Func_f8f16
- dw Func_f8f1f
- dw Func_f8f67
- dw Func_f8f70
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8f94
- dw Func_f8ec5
- dw Func_f8ece
- dw Func_f8ed7
- dw Func_f8ee0
- dw Func_f8ee9
- dw Func_f8ef2
- dw Func_f8e7d
- dw Func_f8f67
- dw Func_f8f70
- dw Func_f8f67
- dw Func_f8f70
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8f94
- dw Func_f8efb
- dw Func_f8f04
- dw Func_f8f0d
- dw Func_f8f16
- dw Func_f8f1f
- dw Func_f8f28
- dw Func_f8f31
- dw Func_f8f3a
- dw Func_f8f43
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8e7d
- dw Func_f8f94
- dw Func_f8e86
- dw Func_f8e8f
- dw Func_f8e98
- dw Func_f8ea1
- dw Func_f8eaa
- dw Func_f8eb3
- dw Func_f8ebc
- dw Func_f8f9d
- dw Func_f8e7d
- dw Func_f8f79
- dw Func_f8f82
- dw Func_f8f82
- dw Func_f8f82
- dw Func_f8f82
- dw Func_f8f82
- dw Func_f8f82
- dw Func_f8f82
- dw Func_f8f8b
-
-Func_f8e4b:
- ld a, [wc5e5]
- cp $16
- jr c, .asm_f8e5a
- jr z, .asm_f8e56
- jr nc, .asm_f8e6e
-.asm_f8e56
- ld a, $6a
- jr .asm_f8e6b
-
-.asm_f8e5a
- ld a, [wc5d5]
- and a
- jr z, .asm_f8e6e
- dec a
- and $7
- ld e, a
- ld d, $0
- ld hl, Unkn_f8e75
- add hl, de
- ld a, [hl]
-.asm_f8e6b
- ld [wc5d3], a
-.asm_f8e6e
- lb bc, $74, $74
- ld de, Unkn_f973d
- ret
-
-Unkn_f8e75:
- db $01,$0e,$1a,$29,$32,$40,$4d,$5c
-
-Func_f8e7d:
- lb bc, $74, $74
- ld de, Unkn_f973d
- jp Func_f8fa9
-
-Func_f8e86:
- lb bc, $74, $6c
- ld de, Unkn_f9745
- jp Func_f8fa9
-
-Func_f8e8f:
- lb bc, $64, $5c
- ld de, Unkn_f974d
- jp Func_f8fa9
-
-Func_f8e98:
- lb bc, $54, $4c
- ld de, Unkn_f9755
- jp Func_f8fa9
-
-Func_f8ea1:
- lb bc, $44, $44
- ld de, Unkn_f975d
- jp Func_f8fa9
-
-Func_f8eaa:
- lb bc, $44, $4c
- ld de, Unkn_f9765
- jp Func_f8fa9
-
-Func_f8eb3:
- lb bc, $54, $5c
- ld de, Unkn_f976d
- jp Func_f8fa9
-
-Func_f8ebc:
- lb bc, $64, $6c
- ld de, Unkn_f9775
- jp Func_f8fa9
-
-Func_f8ec5:
- lb bc, $74, $6c
- ld de, Unkn_f977d
- jp Func_f8fa9
-
-Func_f8ece:
- lb bc, $64, $5c
- ld de, Unkn_f9785
- jp Func_f8fa9
-
-Func_f8ed7:
- lb bc, $54, $4c
- ld de, Unkn_f978d
- jp Func_f8fa9
-
-Func_f8ee0:
- lb bc, $4c, $4c
- ld de, Unkn_f9795
- jp Func_f8fa9
-
-Func_f8ee9:
- lb bc, $54, $5c
- ld de, Unkn_f979d
- jp Func_f8fa9
-
-Func_f8ef2:
- lb bc, $64, $6c
- ld de, Unkn_f97a5
- jp Func_f8fa9
-
-Func_f8efb:
- lb bc, $74, $6c
- ld de, Unkn_f97ad
- jp Func_f8fa9
-
-Func_f8f04:
- lb bc, $64, $5c
- ld de, Unkn_f97b5
- jp Func_f8fa9
-
-Func_f8f0d:
- lb bc, $54, $54
- ld de, Unkn_f97bd
- jp Func_f8fa9
-
-Func_f8f16:
- lb bc, $54, $5c
- ld de, Unkn_f97c5
- jp Func_f8fa9
-
-Func_f8f1f:
- lb bc, $64, $6c
- ld de, Unkn_f97cd
- jp Func_f8fa9
-
-Func_f8f28:
- lb bc, $74, $6c
- ld de, Unkn_f97d5
- jp Func_f8fa9
-
-Func_f8f31:
- lb bc, $64, $5c
- ld de, Unkn_f97dd
- jp Func_f8fa9
-
-Func_f8f3a:
- lb bc, $5c, $5c
- ld de, Unkn_f97e5
- jp Func_f8fa9
-
-Func_f8f43:
- lb bc, $64, $6c
- ld de, Unkn_f97ed
- jp Func_f8fa9
-
-Func_f8f4c:
- lb bc, $74, $6c
- ld de, Unkn_f97f5
- jp Func_f8fa9
-
-Func_f8f55:
- lb bc, $64, $64
- ld de, Unkn_f97fd
- jp Func_f8fa9
-
-Func_f8f5e:
- lb bc, $64, $6c
- ld de, Unkn_f9805
- jp Func_f8fa9
-
-Func_f8f67:
- lb bc, $74, $6c
- ld de, Unkn_f980d
- jp Func_f8fa9
-
-Func_f8f70:
- lb bc, $6c, $6c
- ld de, Unkn_f9815
- jp Func_f8fa9
-
-Func_f8f79:
- lb bc, $74, $74
- ld de, Unkn_f981d
- jp Func_f8fa9
-
-Func_f8f82:
- lb bc, $74, $74
- ld de, Unkn_f9825
- jp Func_f8fa9
-
-Func_f8f8b:
- lb bc, $74, $74
- ld de, Unkn_f9825
- jp Func_f8fae
-
-Func_f8f94:
- lb bc, $74, $74
- ld de, Unkn_f973d
- jp Func_f8fae
-
-Func_f8f9d:
- lb bc, $74, $74
- ld de, Unkn_f973d
- ret
-
-Func_f8fa4:
- inc a
- ld [wc5d3], a
- ret
-
-Func_f8fa9:
- ld hl, wc5d3
- inc [hl]
- ret
-
-Func_f8fae:
- xor a
- ld [wc5d3], a
- ret
-
-Func_f8fb3:
- call Func_f9279
- call ClearSprites
- call DisableLCD
- xor a
- ld [H_AUTOBGTRANSFERENABLED], a
- call ClearObjectAnimationBuffers
- ld hl, $6324
- ld de, $8800
- ld bc, $900
- ld a, $20
- call FarCopyData
- ld a, Unkn_f93d3 % $100
- ld [wAnimatedObjectSpawnStateDataPointer], a
- ld a, Unkn_f93d3 / $100
- ld [wAnimatedObjectSpawnStateDataPointer + 1], a
- ld a, Jumptable_f93fa % $100
- ld [wAnimatedObjectJumptablePointer], a
- ld a, Jumptable_f93fa / $100
- ld [wAnimatedObjectJumptablePointer + 1], a
- ld a, Unkn_f9507 % $100
- ld [wAnimatedObjectOAMDataPointer], a
- ld a, Unkn_f9507 / $100
- ld [wAnimatedObjectOAMDataPointer + 1], a
- ld a, Unkn_f9405 % $100
- ld [wAnimatedObjectFramesDataPointer], a
- ld a, Unkn_f9405 / $100
- ld [wAnimatedObjectFramesDataPointer + 1], a
- ld a, $c
- lb de, $74, $58
- call SpawnAnimatedObject
- call Func_f9053
- xor a
- ld [hSCX], a
- ld [hSCY], a
- ld a, $90
- ld [hWY], a
- ld b, $f
- call RunPaletteCommand
- ld a, $e3
- ld [rLCDC], a
- ld a, $1
- ld [H_AUTOBGTRANSFERENABLED], a
- call DelayFrame
- call DelayFrame
- call DelayFrame
- call Func_f81e9
- ld a, $e4
- ld [rOBP0], a
- ld a, $e0
- ld [rOBP1], a
- call UpdateGBCPal_OBP0
- call UpdateGBCPal_OBP1
- call DelayFrame
- ld a, $99
- ld c, $20
- call PlayMusic
- xor a
- ld [wc633], a
-.asm_f9041
- ld a, [wc633]
- and a
- ret nz
- ld a, $0
- ld [wCurrentAnimatedObjectOAMBufferOffset], a
- call RunObjectAnimations
- call DelayFrame
- jr .asm_f9041
-
-Func_f9053:
- ld hl, wTileMap
- ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
- ld a, $ff
- call FillMemory
- ld hl, Tilemap_f90bc
- coord de, 0, 6
- ld bc, 12 * SCREEN_WIDTH
- call CopyData
- ld de, Tilemap_f91c8
- coord hl, 4, 0
- lb bc, 6, 12
- call .CopyBox
- coord hl, 3, 7
- lb bc, 3, 15
- call .FillBoxWithFF
- ld hl, Tilemap_f91ac
- coord de, 3, 7
- ld bc, 15
- call CopyData
- ld hl, Tilemap_f91bb
- coord de, 4, 9
- ld bc, 13
- call CopyData
- ret
-
-.CopyBox:
-.copy_row
- push bc
- push hl
-.copy_col
- ld a, [de]
- inc de
- ld [hli], a
- dec c
- jr nz, .copy_col
- ld bc, SCREEN_WIDTH
- pop hl
- add hl, bc
- pop bc
- dec b
- jr nz, .copy_row
- ret
-
-.FillBoxWithFF:
-.fill_row
- push bc
- push hl
-.fill_col
- ld [hl], $ff
- inc hl
- dec c
- jr nz, .fill_col
- pop hl
- ld bc, SCREEN_WIDTH
- add hl, bc
- pop bc
- dec b
- jr nz, .fill_row
- ret
-
-Tilemap_f90bc: INCBIN "gfx/unknown_f90bc.map"
-Tilemap_f91ac: INCBIN "gfx/unknown_f91ac.map"
-Tilemap_f91bb: INCBIN "gfx/unknown_f91bb.map"
-Tilemap_f91c8: INCBIN "gfx/unknown_f91c8.map"
-
-Func_f9210:
- ld hl, wc710
- ld de, wc710 + 1
- ld c, $80
- ld a, [hl]
- push af
-.asm_f921a
- ld a, [de]
- inc de
- ld [hli], a
- dec c
- jr nz, .asm_f921a
- pop af
- ld [hl], a
- ret
-
-Func_f9223:
- ld hl, wc700
- ld bc, $100
- ld de, $0
-.asm_f922c
- ld a, e
- and $1f
- ld e, a
- push hl
- ld hl, Unkn_f96c5
- add hl, de
- ld a, [hl]
- pop hl
- ld [hli], a
- inc e
- dec bc
- ld a, c
- or b
- jr nz, .asm_f922c
- ret
-
-Func_f923f:
- call Joypad
- ld a, [H_FRAMECOUNTER]
- and a
- jr nz, .asm_f9250
- ld a, [hJoyHeld]
- ld [hJoy5], a
- ld a, $2
- ld [H_FRAMECOUNTER], a
- ret
-
-.asm_f9250
- xor a
- ld [hJoy5], a
- ret
-
-SurfingPikachuMinigame_BlankPals:
- xor a
- ld [rBGP], a
- ld [rOBP0], a
- ld [rOBP1], a
- call UpdateGBCPal_BGP
- call UpdateGBCPal_OBP0
- call UpdateGBCPal_OBP1
- ret
-
-SurfingPikachuMinigame_NormalPals:
- ld a, $e4
- ld [rBGP], a
- ld [rOBP0], a
- ld a, $e0
- ld [rOBP1], a
- call UpdateGBCPal_BGP
- call UpdateGBCPal_OBP0
- call UpdateGBCPal_OBP1
- ret
-
-Func_f9279:
- ld hl, wTileMap
- ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
- xor a
- call FillMemory
- ret
-
-Func_f9284:
- xor a
- ld [wc5ed], a
- ld [wc5ee], a
- ret
-
-Func_f928c:
- ld a, [wc5ed]
- and a
- jr nz, .asm_f92e4
- ld a, [wc5ec]
- ld d, a
- ld a, [wc5ee]
- or d
- jr z, .asm_f92dd
- ld a, [wc5ee]
- ld e, a
- ld hl, $ff80
- add hl, de
- ld a, l
- ld [wc5ee], a
- ld a, h
- ld [wc5ec], a
- ld e, a
- ld d, $0
- call Func_f9340
- ld e, l
- ld d, h
- ld a, $4
- call Func_f9340
- ld a, l
- xor $ff
- inc a
- ld l, a
- ld a, h
- xor $ff
- ld h, a
- push hl
- ld hl, $5
- add hl, bc
- ld d, [hl]
- ld hl, $c
- add hl, bc
- ld e, [hl]
- pop hl
- add hl, de
- ld e, l
- ld d, h
- ld hl, $5
- add hl, bc
- ld [hl], d
- ld hl, $c
- add hl, bc
- ld [hl], e
- and a
- ret
-
-.asm_f92dd
- ld a, $1
- ld [wc5ed], a
- and a
- ret
-
-.asm_f92e4
- ld a, [wc5ea]
- ld e, a
- ld hl, $5
- add hl, bc
- ld a, [hl]
- cp $90
- jr nc, .asm_f92f4
- cp e
- jr nc, .asm_f9330
-.asm_f92f4
- ld a, [wc5ec]
- ld d, a
- ld a, [wc5ee]
- ld e, a
- ld hl, $80
- add hl, de
- ld a, l
- ld [wc5ee], a
- ld a, h
- ld [wc5ec], a
- ld e, a
- ld d, $0
- call Func_f9340
- ld e, l
- ld d, h
- ld a, $4
- call Func_f9340
- push hl
- ld hl, $5
- add hl, bc
- ld d, [hl]
- ld hl, $c
- add hl, bc
- ld e, [hl]
- pop hl
- add hl, de
- ld e, l
- ld d, h
- ld hl, $5
- add hl, bc
- ld [hl], d
- ld hl, $c
- add hl, bc
- ld [hl], e
- and a
- ret
-
-.asm_f9330
- ld hl, $5
- add hl, bc
- ld a, [wc5ea]
- ld [hl], a
- ld hl, $c
- add hl, bc
- ld [hl], $0
- scf
- ret
-
-Func_f9340:
- ld hl, $0
-.asm_f9343
- srl a
- jr nc, .asm_f9348
- add hl, de
-.asm_f9348
- sla e
- rl d
- and a
- jr nz, .asm_f9343
- ret
-
-Func_f9350:
- ld c, a
- swap a
- and $f
- add $d0
- ld [hli], a
- ld a, c
- and $f
- add $d0
- ld [hl], a
- dec de
- ret
-
-Func_f9360: ; cosine
- add $10
-Func_f9362: ; sine
- and $3f
- cp $20
- jr nc, .asm_f936d
- call Func_f9377
- ld a, h
- ret
-
-.asm_f936d
- and $1f
- call Func_f9377
- ld a, h
- xor $ff
- inc a
- ret
-
-Func_f9377:
- ld e, a
- ld a, d
- ld d, $0
- ld hl, Unkn_f9393
- add hl, de
- add hl, de
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld hl, $0
-.asm_f9386
- srl a
- jr nc, .asm_f938b
- add hl, de
-.asm_f938b
- sla e
- rl d
- and a
- jr nz, .asm_f9386
- ret
-
-Unkn_f9393:
- sine_wave $100
-
-Unkn_f93d3:
- db $00, $00, $00
- db $04, $01, $00
- db $11, $02, $00
- db $12, $02, $00
- db $15, $00, $00
- db $16, $00, $00
- db $17, $00, $00
- db $18, $00, $00
- db $19, $00, $00
- db $1a, $00, $00
- db $14, $00, $00
- db $13, $03, $00
- db $1b, $04, $00
-
-Jumptable_f93fa:
- dw Func_f9404
- dw Func_f8470
- dw Func_f87fb
- dw Func_f880b
- dw Func_f882b
-
-Func_f9404:
- ret
-
-Unkn_f9405:
- dw Unkn_f943d
- dw Unkn_f9440
- dw Unkn_f9445
- dw Unkn_f944a
- dw Unkn_f944f
- dw Unkn_f9454
- dw Unkn_f9459
- dw Unkn_f945e
- dw Unkn_f9463
- dw Unkn_f9468
- dw Unkn_f946d
- dw Unkn_f9472
- dw Unkn_f9477
- dw Unkn_f947c
- dw Unkn_f9481
- dw Unkn_f9486
- dw Unkn_f948b
- dw Unkn_f9494
- dw Unkn_f9499
- dw Unkn_f949e
- dw Unkn_f94fb
- dw Unkn_f94a1
- dw Unkn_f94b0
- dw Unkn_f94bf
- dw Unkn_f94ce
- dw Unkn_f94dd
- dw Unkn_f94ec
- dw Unkn_f94fe
-
-Unkn_f943d:
- frame $00, 32
- endanim
-
-Unkn_f9440:
- frame $01, 8
- frame $02, 8
- dorestart
-
-Unkn_f9445:
- frame $03, 8
- frame $04, 8
- dorestart
-
-Unkn_f944a:
- frame $05, 8
- frame $06, 8
- dorestart
-
-Unkn_f944f:
- frame $07, 8
- frame $08, 8
- dorestart
-
-Unkn_f9454:
- frame $09, 8
- frame $0a, 8
- dorestart
-
-Unkn_f9459:
- frame $0b, 8
- frame $0c, 8
- dorestart
-
-Unkn_f945e:
- frame $0d, 8
- frame $0e, 8
- dorestart
-
-Unkn_f9463:
- frame $01, 8, OAM_HFLIP, OAM_VFLIP
- frame $02, 8, OAM_HFLIP, OAM_VFLIP
- dorestart
-
-Unkn_f9468:
- frame $03, 8, OAM_HFLIP, OAM_VFLIP
- frame $04, 8, OAM_HFLIP, OAM_VFLIP
- dorestart
-
-Unkn_f946d:
- frame $05, 8, OAM_HFLIP, OAM_VFLIP
- frame $06, 8, OAM_HFLIP, OAM_VFLIP
- dorestart
-
-Unkn_f9472:
- frame $07, 8, OAM_HFLIP, OAM_VFLIP
- frame $08, 8, OAM_HFLIP, OAM_VFLIP
- dorestart
-
-Unkn_f9477:
- frame $09, 8, OAM_HFLIP, OAM_VFLIP
- frame $0a, 8, OAM_HFLIP, OAM_VFLIP
- dorestart
-
-Unkn_f947c:
- frame $0b, 8, OAM_HFLIP, OAM_VFLIP
- frame $0c, 8, OAM_HFLIP, OAM_VFLIP
- dorestart
-
-Unkn_f9481:
- frame $0d, 8, OAM_HFLIP, OAM_VFLIP
- frame $0e, 8, OAM_HFLIP, OAM_VFLIP
- dorestart
-
-Unkn_f9486:
- frame $11, 7
- frame $12, 7
- dorestart
-
-Unkn_f948b:
- frame $13, 2
- frame $14, 2
- dorepeat 8
- frame $15, 2
- endanim
-
-Unkn_f9494:
- frame $16, 32
- frame $16, 32
- delanim
-
-Unkn_f9499:
- frame $17, 32
- frame $17, 32
- delanim
-
-Unkn_f949e:
- frame $18, 32
- endanim
-
-Unkn_f94a1:
- frame $1a, 4
- dorepeat 1
- frame $1a, 3
- dorepeat 1
- frame $1a, 2
- dorepeat 1
- frame $1a, 1
- delanim
-
-Unkn_f94b0:
- frame $1b, 4
- dorepeat 1
- frame $1b, 3
- dorepeat 1
- frame $1b, 2
- dorepeat 1
- frame $1b, 1
- delanim
-
-Unkn_f94bf:
- frame $1c, 4
- dorepeat 1
- frame $1c, 3
- dorepeat 1
- frame $1c, 2
- dorepeat 1
- frame $1c, 1
- delanim
-
-Unkn_f94ce:
- frame $1d, 4
- dorepeat 1
- frame $1d, 3
- dorepeat 1
- frame $1d, 2
- dorepeat 1
- frame $1d, 1
- delanim
-
-Unkn_f94dd:
- frame $1e, 4
- dorepeat 1
- frame $1e, 3
- dorepeat 1
- frame $1e, 2
- dorepeat 1
- frame $1e, 1
- delanim
-
-Unkn_f94ec:
- frame $1f, 4
- dorepeat 1
- frame $1f, 3
- dorepeat 1
- frame $1f, 2
- dorepeat 1
- frame $1f, 1
- delanim
-
-Unkn_f94fb:
- frame $19, 1
- delanim
-
-Unkn_f94fe:
- frame $20, 7
- frame $21, 7
- frame $22, 7
- frame $23, 7
- dorestart
-
-Unkn_f9507:
- dbw $00, Unkn_f9573
- dbw $00, Unkn_f9578
- dbw $36, Unkn_f9578
- dbw $03, Unkn_f9578
- dbw $39, Unkn_f9578
- dbw $06, Unkn_f9578
- dbw $3c, Unkn_f9578
- dbw $09, Unkn_f9578
- dbw $60, Unkn_f9578
- dbw $0c, Unkn_f9578
- dbw $63, Unkn_f9578
- dbw $30, Unkn_f9578
- dbw $66, Unkn_f9578
- dbw $33, Unkn_f9578
- dbw $69, Unkn_f9578
- dbw $6c, Unkn_f9578
- dbw $9c, Unkn_f9578
- dbw $a0, Unkn_f9578
- dbw $a3, Unkn_f9578
- dbw $a7, Unkn_f95db
- dbw $a8, Unkn_f95f4
- dbw $98, Unkn_f9625
- dbw $e0, Unkn_f959d
- dbw $e6, Unkn_f959d
- dbw $ca, Unkn_f959d
- dbw $a7, Unkn_f95ce
- dbw $00, Unkn_f9632
- dbw $00, Unkn_f963f
- dbw $00, Unkn_f9650
- dbw $00, Unkn_f9661
- dbw $00, Unkn_f9672
- dbw $00, Unkn_f9683
- dbw $80, Unkn_f9694
- dbw $84, Unkn_f9694
- dbw $88, Unkn_f9694
- dbw $8c, Unkn_f9694
-
-Unkn_f9573:
- db 1
- db $fc, $fc, $00, $00
-
-Unkn_f9578:
- db 9
- db $f4, $f4, $00, $00
- db $f4, $fc, $01, $00
- db $f4, $04, $02, $00
- db $fc, $f4, $10, $00
- db $fc, $fc, $11, $00
- db $fc, $04, $12, $00
- db $04, $f4, $20, $00
- db $04, $fc, $21, $00
- db $04, $04, $22, $00
-
-Unkn_f959d:
- db 12
- db $f8, $e8, $00, $00
- db $f8, $f0, $01, $00
- db $f8, $f8, $02, $00
- db $f8, $00, $03, $00
- db $f8, $08, $04, $00
- db $f8, $10, $05, $00
- db $00, $e8, $10, $00
- db $00, $f0, $11, $00
- db $00, $f8, $12, $00
- db $00, $00, $13, $00
- db $00, $08, $14, $00
- db $00, $10, $15, $00
-
-Unkn_f95ce:
- db 3
- db $fc, $0b, $00, $10
- db $04, $03, $0f, $10
- db $04, $0b, $10, $10
-
-Unkn_f95db:
- db 6
- db $fc, $f0, $00, $30
- db $fc, $08, $00, $10
- db $04, $f0, $10, $30
- db $04, $f8, $0f, $30
- db $04, $00, $0f, $10
- db $04, $08, $10, $10
-
-Unkn_f95f4:
- db 12
- db $f4, $f0, $00, $10
- db $f4, $f8, $01, $10
- db $f4, $00, $01, $30
- db $f4, $08, $00, $30
- db $fc, $f0, $10, $10
- db $fc, $f8, $11, $10
- db $fc, $00, $11, $30
- db $fc, $08, $10, $30
- db $04, $f0, $20, $10
- db $04, $f8, $21, $10
- db $04, $00, $21, $30
- db $04, $08, $20, $30
-
-Unkn_f9625:
- db 3
- db $04, $f4, $00, $00
- db $04, $fc, $01, $00
- db $04, $04, $02, $00
-
-Unkn_f9632:
- db 3
- db $fc, $f4, $bf, $00
- db $fc, $fc, $d5, $00
- db $fc, $04, $d0, $00
-
-Unkn_f963f:
- db 4
- db $fc, $f0, $bf, $00
- db $fc, $f8, $d1, $00
- db $fc, $00, $d5, $00
- db $fc, $08, $d0, $00
-
-Unkn_f9650:
- db 4
- db $fc, $f0, $bf, $00
- db $fc, $f8, $d3, $00
- db $fc, $00, $d5, $00
- db $fc, $08, $d0, $00
-
-Unkn_f9661:
- db 4
- db $fc, $f0, $bf, $00
- db $fc, $f8, $d7, $00
- db $fc, $00, $d5, $00
- db $fc, $08, $d0, $00
-
-Unkn_f9672:
- db 4
- db $fc, $f0, $bf, $00
- db $fc, $f8, $d1, $00
- db $fc, $00, $d8, $00
- db $fc, $08, $d0, $00
-
-Unkn_f9683:
- db 4
- db $fc, $f0, $bf, $00
- db $fc, $f8, $d5, $00
- db $fc, $00, $d0, $00
- db $fc, $08, $d0, $00
-
-Unkn_f9694:
- db 12
- db $f4, $f0, $03, $20
- db $f4, $f8, $02, $20
- db $f4, $00, $01, $20
- db $f4, $08, $00, $20
- db $fc, $f0, $13, $20
- db $fc, $f8, $12, $20
- db $fc, $00, $11, $20
- db $fc, $08, $10, $20
- db $04, $f0, $23, $20
- db $04, $f8, $22, $20
- db $04, $00, $21, $20
- db $04, $08, $20, $20
-
-Unkn_f96c5:
- db 0, 0, 0, 1, 1, 1, 1, 2
- db 2, 2, 1, 1, 1, 1, 0, 0
- db 0, 0, 0, -1, -1, -1, -1, -2
- db -2, -2, -1, -1, -1, -1, 0, 0
-
-Unkn_f96e5:
- db $00, $00, $00, $00
- db $0b, $0b, $0b, $0b
- db $0b, $02, $02, $06
- db $03, $0b, $07, $03
- db $06, $06, $06, $06
- db $07, $07, $07, $07
- db $06, $04, $04, $08
- db $05, $07, $08, $05
- db $0b, $0b, $11, $12
- db $0b, $0b, $13, $03
- db $14, $12, $04, $08
- db $13, $07, $08, $05
- db $06, $14, $06, $14
- db $13, $07, $13, $07
- db $08, $08, $08, $08
- db $14, $12, $14, $12
- db $0b, $11, $02, $14
- db $06, $14, $06, $14
- db $0c, $0c, $0d, $0d
- db $0d, $0d, $0d, $0d
- db $0e, $0f, $10, $0b
- db $12, $13, $12, $13
-
-Unkn_f973d:
- db $00, $00, $00, $01, $01, $01, $01, $01
-Unkn_f9745:
- db $00, $00, $00, $01, $01, $02, $04, $06
-Unkn_f974d:
- db $00, $00, $00, $01, $02, $04, $06, $0e
-Unkn_f9755:
- db $00, $00, $00, $10, $11, $06, $0e, $0e
-Unkn_f975d:
- db $00, $00, $00, $15, $15, $0e, $0e, $0e
-Unkn_f9765:
- db $00, $00, $00, $03, $05, $07, $0e, $0e
-Unkn_f976d:
- db $00, $00, $00, $01, $03, $05, $07, $0e
-Unkn_f9775:
- db $00, $00, $00, $01, $01, $03, $05, $07
-Unkn_f977d:
- db $00, $00, $00, $01, $01, $02, $04, $06
-Unkn_f9785:
- db $00, $00, $00, $01, $02, $04, $06, $0e
-Unkn_f978d:
- db $00, $00, $00, $08, $0f, $0a, $0e, $0e
-Unkn_f9795:
- db $00, $00, $00, $09, $0d, $0b, $0e, $0e
-Unkn_f979d:
- db $00, $00, $00, $01, $03, $05, $07, $0e
-Unkn_f97a5:
- db $00, $00, $00, $01, $01, $03, $05, $07
-Unkn_f97ad:
- db $00, $00, $00, $01, $01, $02, $04, $06
-Unkn_f97b5:
- db $00, $00, $00, $01, $10, $11, $06, $0e
-Unkn_f97bd:
- db $00, $00, $00, $01, $15, $15, $0e, $0e
-Unkn_f97c5:
- db $00, $00, $00, $01, $03, $05, $07, $0e
-Unkn_f97cd:
- db $00, $00, $00, $01, $01, $03, $05, $07
-Unkn_f97d5:
- db $00, $00, $00, $01, $01, $02, $04, $06
-Unkn_f97dd:
- db $00, $00, $00, $01, $08, $0f, $0a, $0e
-Unkn_f97e5:
- db $00, $00, $00, $01, $09, $0d, $0b, $0e
-Unkn_f97ed:
- db $00, $00, $00, $01, $01, $03, $05, $07
-Unkn_f97f5:
- db $00, $00, $00, $01, $01, $10, $11, $06
-Unkn_f97fd:
- db $00, $00, $00, $01, $01, $15, $15, $0e
-Unkn_f9805:
- db $00, $00, $00, $01, $01, $03, $05, $07
-Unkn_f980d:
- db $00, $00, $00, $01, $01, $08, $0f, $0a
-Unkn_f9815:
- db $00, $00, $00, $01, $01, $09, $0d, $0b
-Unkn_f981d:
- db $00, $00, $00, $14, $14, $14, $14, $14
-Unkn_f9825:
- db $00, $00, $00, $12, $13, $13, $13, $13
-
-PlayIntroScene:
- ld a, [rIE]
- push af
- xor a
- ld [rIF], a
- ld a, $f
- ld [rIE], a
- ld a, $8
- ld [rSTAT], a
- call Func_f9f0d
- call DelayFrame
-.asm_f9841
- ld a, [wc634]
- bit 7, a
- jr nz, .asm_f986e
- call JoypadLowSensitivity
- ld a, [hJoyPressed]
- and $b
- jr nz, .asm_f986e
- call Func_f98fc
- ld a, $0
- ld [wCurrentAnimatedObjectOAMBufferOffset], a
- call RunObjectAnimations
- ld a, [wc634]
- cp $7
- call z, Func_f98a2
- cp $b
- call z, Func_f98cb
- call DelayFrame
- jr .asm_f9841
-
-.asm_f986e
- call Func_f9fc9
- xor a
- ld [hLCDCPointer], a
- call DelayFrame
- xor a
- ld [rIF], a
- pop af
- ld [rIE], a
- ld a, $90
- ld [hWY], a
- call ClearObjectAnimationBuffers
- ld hl, wTileMap
- ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
- xor a
- call Func_f9fb3
- call Func_f9fbe
- ld a, $1
- ld [H_AUTOBGTRANSFERENABLED], a
- call DelayFrame
- call DelayFrame
- call DelayFrame
- xor a
- ld [H_AUTOBGTRANSFERENABLED], a
- ret
-
-Func_f98a2:
- ld a, [wOAMBuffer + 8 * 4 + 3]
- or $1
- ld [wOAMBuffer + 8 * 4 + 3], a
- ld a, [wOAMBuffer + 14 * 4 + 3]
- or $1
- ld [wOAMBuffer + 14 * 4 + 3], a
- ld a, [wOAMBuffer + 16 * 4 + 3]
- or $1
- ld [wOAMBuffer + 16 * 4 + 3], a
-Func_f98b8:
- ld a, [wOAMBuffer + 18 * 4 + 3]
- or $1
- ld [wOAMBuffer + 18 * 4 + 3], a
- ld a, [wOAMBuffer + 19 * 4 + 3]
- or $1
- ld [wOAMBuffer + 19 * 4 + 3], a
- ret
-
-Func_f98cb:
- ld a, [wOAMBuffer + 18 * 4 + 3]
- or $1
- ld [wOAMBuffer + 18 * 4 + 3], a
- ld a, [wOAMBuffer + 19 * 4 + 3]
- or $1
- ld [wOAMBuffer + 19 * 4 + 3], a
- ld a, [wOAMBuffer + 20 * 4 + 3]
- or $1
- ld [wOAMBuffer + 20 * 4 + 3], a
- ld a, [wOAMBuffer + 25 * 4 + 3]
- or $1
- ld [wOAMBuffer + 25 * 4 + 3], a
- ld a, [wOAMBuffer + 26 * 4 + 3]
- or $1
- ld [wOAMBuffer + 26 * 4 + 3], a
- ld a, [wOAMBuffer + 28 * 4 + 3]
- or $1
- ld [wOAMBuffer + 28 * 4 + 3], a
- ret
-
-Func_f98fc:
- ld a, [wc634]
- ld hl, Jumptable_f9906
- call Func_fa06e
- jp [hl]
-
-Jumptable_f9906:
- dw Func_f992f
- dw Func_f995f
- dw Func_f996a
- dw Func_f9a08
- dw Func_f9a1e
- dw Func_f9a60
- dw Func_f9a6b
- dw Func_f9ab1
- dw Func_f9ad8
- dw Func_f9af9
- dw Func_f9b04
- dw Func_f9bf6
- dw Func_f9cac
- dw Func_f9d12
- dw Func_f9d22
- dw Func_f9d8f
- dw Func_f9dbf
- dw Func_f9e12
-
-Func_f992a:
- ld hl, wc634
- inc [hl]
- ret
-
-Func_f992f:
- xor a
- ld [hLCDCPointer], a
- lb de, $58, $58
- ld a, $1
- call Func_f9e1d
- xor a
- ld [hSCX], a
- ld [hSCY], a
- ld a, $90
- ld [hWY], a
- ld a, $e4
- ld [rBGP], a
- ld [rOBP0], a
- ld a, $c4
- ld [rOBP1], a
- call UpdateGBCPal_BGP
- call UpdateGBCPal_OBP0
- call UpdateGBCPal_OBP1
- ld a, $82
- ld [wc635], a
- call Func_f992a
- ret
-
-Func_f995f:
- call Func_f9e41
- ret nc
- call Func_f9e29
- call Func_f992a
- ret
-
-Func_f996a:
- call Func_f9e80
- ld c, $8
- call UpdateMusicCTimes
- xor a
- ld [hLCDCPointer], a
- ld hl, vBGMap0
- ld bc, $400
- xor a
- call Func_f9fb3
- call Func_f9996
- lb de, $58, $b8 ; overloaded
- ld a, $4 ; overloaded
- call Func_f99d2
- ld a, $1
- call Func_f9e9a
- call Func_f9e35
- call Func_f992a
- ret
-
-Func_f9996:
- ld hl, $98d4
- ld de, $20
- ld b, $6
- ld a, $90
-.asm_f99a0
- ld c, $6
- push af
- push hl
-.asm_f99a4
- ld [hli], a
- inc a
- dec c
- jr nz, .asm_f99a4
- pop hl
- add hl, de
- pop af
- add $10
- dec b
- jr nz, .asm_f99a0
- ld a, [hGBC]
- and a
- jr z, .asm_f99d1
- ld hl, $98d4
- ld de, $20
- ld b, $6
- ld a, $1
- ld [rVBK], a
-.asm_f99c2
- ld c, $6
- push hl
-.asm_f99c5
- ld [hli], a
- dec c
- jr nz, .asm_f99c5
- pop hl
- add hl, de
- dec b
- jr nz, .asm_f99c2
- xor a
- ld [rVBK], a
-.asm_f99d1
- ret
-
-Func_f99d2:
- ld hl, Unkn_f99f0
- ld a, $8
-.asm_f99d7
- push af
- ld e, [hl]
- inc hl
- ld d, [hl]
- inc hl
- ld a, [hli]
- push hl
- push af
- ld a, $8
- call SpawnAnimatedObject
- pop af
- ld hl, $b
- add hl, bc
- ld [hl], a
- pop hl
- pop af
- dec a
- jr nz, .asm_f99d7
- ret
-
-Unkn_f99f0:
- db $d0, $20, $02
- db $f0, $30, $04
- db $d0, $40, $06
- db $c0, $50, $08
- db $e0, $60, $08
- db $c0, $70, $06
- db $e0, $80, $04
- db $f0, $90, $02
-
-Func_f9a08:
- call Func_f9e41
- jr c, .asm_f9a17
- ld a, [hSCX]
- cp $68
- ret z
- add $4
- ld [hSCX], a
- ret
-
-.asm_f9a17
- call MaskAllAnimatedObjectStructs
- call Func_f992a
- ret
-
-Func_f9a1e:
- call Func_f9e80
- ld c, $5
- call UpdateMusicCTimes
- ld a, [hGBC]
- and a
- jr z, .asm_f9a47
- ld hl, $98d4
- ld de, $20
- ld b, $6
- ld a, $1
- ld [rVBK], a
- xor a
-.asm_f9a38
- ld c, $6
- push hl
-.asm_f9a3b
- ld [hli], a
- dec c
- jr nz, .asm_f9a3b
- pop hl
- add hl, de
- dec b
- jr nz, .asm_f9a38
- xor a
- ld [rVBK], a
-.asm_f9a47
- xor a
- ld [hLCDCPointer], a
- call Func_f9e5f
- lb de, $58, $58
- ld a, $2
- call Func_f9e1d
- xor a
- call Func_f9e9a
- call Func_f9e35
- call Func_f992a
- ret
-
-Func_f9a60:
- call Func_f9e41
- ret nc
- call Func_f9e29
- call Func_f992a
- ret
-
-Func_f9a6b:
- call Func_f9e80
- ld c, $5
- call UpdateMusicCTimes
- ld a, $42
- ld [hLCDCPointer], a
- call Func_f9ec4
- ld hl, vBGMap0
- ld bc, $60
- xor a
- call Func_f9fb3
- ld hl, $9860
- ld c, $10
- ld a, $20
-.asm_f9a8b
- ld [hli], a
- inc a
- ld [hli], a
- dec a
- dec c
- jr nz, .asm_f9a8b
- ld hl, $9880
- ld bc, $300
- ld a, $10
- call Func_f9fb3
- lb de, $40, $f8
- ld a, $5
- call Func_f9e1d
- ld a, $1
- call Func_f9e9a
- call Func_f9e3b
- call Func_f992a
- ret
-
-Func_f9ab1:
- call Func_f9e41
- jr c, .asm_f9ad1
- ld hl, hSCX
- inc [hl]
- inc [hl]
- ld hl, wc800
- ld de, wc800 + 1
- ld a, [hl]
- push af
- ld c, $ff
-.asm_f9ac5
- ld a, [de]
- inc de
- ld [hli], a
- dec c
- jr nz, .asm_f9ac5
- pop af
- ld [hl], a
- call Func_f9ef8
- ret
-
-.asm_f9ad1
- call Func_f9e29
- call Func_f992a
- ret
-
-Func_f9ad8:
- call Func_f9e80
- ld c, $5
- call UpdateMusicCTimes
- xor a
- ld [hLCDCPointer], a
- call Func_f9e5f
- lb de, $58, $58
- ld a, $3
- call Func_f9e1d
- xor a
- call Func_f9e9a
- call Func_f9e35
- call Func_f992a
- ret
-
-Func_f9af9:
- call Func_f9e41
- ret nc
- call Func_f9e29
- call Func_f992a
- ret
-
-Func_f9b04:
- call Func_f9e80
- ld c, $5
- call UpdateMusicCTimes
- xor a
- ld [hLCDCPointer], a
- ld hl, vBGMap0
- ld bc, $400
- xor a
- call Func_f9fb3
- ld hl, vBGMap0
- ld bc, $100
- ld a, $2
- call Func_f9fb3
- ld hl, $9900
- ld de, Unkn_f9b6e
- lb bc, 6, 20
- call .FillBGMapBox
- ld hl, $988c
- ld de, Unkn_f9be6
- lb bc, 3, 4
- call .FillBGMapBox
- ld hl, $98e3
- ld de, Unkn_f9bf2
- lb bc, 2, 2
- call .FillBGMapBox
- lb de, $98, $58
- ld a, $6
- call Func_f9e1d
- ld a, $1
- call Func_f9e9a
- call Func_f9e35
- call Func_f992a
- ret
-
-.FillBGMapBox:
-.fill_row
- push bc
- push hl
-.fill_col
- ld a, [de]
- inc de
- ld [hli], a
- dec c
- jr nz, .fill_col
- pop hl
- ld bc, $20
- add hl, bc
- pop bc
- dec b
- jr nz, .fill_row
- ret
-
-Unkn_f9b6e: INCBIN "gfx/unknown_f9b6e.map"
-Unkn_f9be6: INCBIN "gfx/unknown_f9be6.map"
-Unkn_f9bf2: INCBIN "gfx/unknown_f9bf2.map"
-
-Func_f9bf6:
- call Func_f9e41
- jr c, .asm_f9c25
- ld a, [wc635]
- and $7
- ret nz
- ld a, [wc635]
- and $8
- sla a
- sla a
- sla a
- ld e, a
- ld d, $0
- ld hl, GFX_f9c2c
- add hl, de
- ld a, l
- ld [H_VBCOPYSRC], a
- ld a, h
- ld [H_VBCOPYSRC + 1], a
- xor a
- ld [H_VBCOPYDEST], a
- ld a, $96
- ld [H_VBCOPYDEST + 1], a
- ld a, $4
- ld [H_VBCOPYSIZE], a
- ret
-
-.asm_f9c25
- call Func_f9e29
- call Func_f992a
- ret
-
-GFX_f9c2c: INCBIN "gfx/unknown_f9c2c.2bpp"
-GFX_f9c6c: INCBIN "gfx/unknown_f9c6c.2bpp" ; indirectly referenced
-
-Func_f9cac:
- call Func_f9e80
- ld c, $5
- call UpdateMusicCTimes
- xor a
- ld [hLCDCPointer], a
- ld hl, vBGMap0
- ld bc, $80
- ld a, $1
- call Func_f9fb3
- ld hl, $9880
- ld bc, $140
- xor a
- call Func_f9fb3
- ld hl, $99c0
- ld bc, $80
- ld a, $1
- call Func_f9fb3
- ld hl, $98c5
- ld de, $20
- ld a, $4
- ld b, $8
-.asm_f9ce1
- ld c, $c
- push hl
-.asm_f9ce4
- ld [hli], a
- inc a
- dec c
- jr nz, .asm_f9ce4
- pop hl
- add hl, de
- add $4
- dec b
- jr nz, .asm_f9ce1
- ld hl, $98c4
- ld [hl], $3
- ld hl, $98e4
- ld [hl], $74
- ld hl, $99a5
- ld [hl], $0
- lb de, $60, $58
- ld a, $9
- call Func_f9e1d
- xor a
- call Func_f9e9a
- call Func_f9e35
- call Func_f992a
- ret
-
-Func_f9d12:
- call Func_f9e41
- ret nc
- lb de, $68, $58
- ld a, $a
- call SpawnAnimatedObject
- call Func_f992a
- ret
-
-Func_f9d22:
- ld de, Unkn_f9dd6
- call Func_f9e4d
- jr c, .asm_f9d3c
- ld [rBGP], a
- ld [rOBP0], a
- and $f0
- ld [rOBP1], a
- call UpdateGBCPal_BGP
- call UpdateGBCPal_OBP0
- call UpdateGBCPal_OBP1
- ret
-
-.asm_f9d3c
- call MaskAllAnimatedObjectStructs
- call Func_f9fbe
- ld hl, wTileMap
- ld bc, $50
- ld a, $1
- call Func_f9fb3
- coord hl, 0, 4
- ld bc, CopyVideoDataAlternate
- xor a
- call Func_f9fb3
- coord hl, 0, 14
- ld bc, $50
- ld a, $1
- call Func_f9fb3
- ld a, $1
- ld [H_AUTOBGTRANSFERENABLED], a
- call DelayFrame
- call DelayFrame
- call DelayFrame
- xor a
- ld [H_AUTOBGTRANSFERENABLED], a
- ld a, $e4
- ld [rOBP0], a
- ld [rBGP], a
- call UpdateGBCPal_BGP
- call UpdateGBCPal_OBP0
- lb de, $58, $58
- ld a, $7
- call Func_f9e1d
- call Func_f992a
- ld a, $28
- ld [wc635], a
- ret
-
-Func_f9d8f:
- call Func_f9e41
- jr c, .asm_f9dad
- ld a, [wc635]
- and $3
- ret nz
- ld a, [rOBP0]
- xor $ff
- ld [rOBP0], a
- ld a, [rBGP]
- xor $3
- ld [rBGP], a
- call UpdateGBCPal_BGP
- call UpdateGBCPal_OBP0
- ret
-
-.asm_f9dad
- xor a
- ld [hLCDCPointer], a
- ld a, $e4
- ld [rBGP], a
- ld [rOBP0], a
- call UpdateGBCPal_BGP
- call UpdateGBCPal_OBP0
- call Func_f992a
-Func_f9dbf:
- ld de, Unkn_f9e0a
- call Func_f9e4d
- jr c, .asm_f9dd2
- ld [rOBP0], a
- ld [rBGP], a
- call UpdateGBCPal_BGP
- call UpdateGBCPal_OBP0
- ret
-
-.asm_f9dd2
- call Func_f992a
- ret
-
-Unkn_f9dd6:
- db $e4, $c0, $c0, $e4
- db $e4, $c0, $c0, $e4
- db $e4, $c0, $c0, $e4
- db $e4, $c0, $c0, $e4
- db $e4, $c0, $c0, $e4
- db $e4, $c0, $c0, $e4
- db $e4, $c0, $c0, $e4
- db $e4, $c0, $c0, $e4
- db $e4, $c0, $c0, $e4
- db $e4, $c0, $c0, $e4
- db $e4, $c0, $c0, $e4
- db $e4, $c0, $c0, $e4
- db $e4, $c0, $c0, $ff
-
-Unkn_f9e0a:
- db $e4, $90, $90, $40
- db $40, $00, $00, $ff
-
-Func_f9e12:
- ld c, 64
- call DelayFrames
- ld hl, wc634
- set 7, [hl]
- ret
-
-Func_f9e1d:
- call SpawnAnimatedObject
- ld a, c
- ld [wc636], a
- ld a, b
- ld [wc636 + 1], a
- ret
-
-Func_f9e29:
- ld a, [wc636]
- ld c, a
- ld a, [wc636 + 1]
- ld b, a
- call MaskCurrentAnimatedObjectStruct
- ret
-
-Func_f9e35:
- ld a, $80
- ld [wc635], a
- ret
-
-Func_f9e3b:
- ld a, $58
- ld [wc635], a
- ret
-
-Func_f9e41:
- ld hl, wc635
- ld a, [hl]
- and a
- jr z, .asm_f9e4b
- dec [hl]
- and a
- ret
-
-.asm_f9e4b
- scf
- ret
-
-Func_f9e4d:
- ld hl, wc635
- ld a, [hl]
- inc [hl]
- ld l, a
- ld h, $0
- add hl, de
- ld a, [hl]
- cp $ff
- jr z, .asm_f9e5d
- and a
- ret
-
-.asm_f9e5d
- scf
- ret
-
-Func_f9e5f:
- ld hl, vBGMap0
- ld bc, $80
- ld a, $1
- call Func_f9fb3
- ld hl, $9880
- ld bc, $140
- xor a
- call Func_f9fb3
- ld hl, $99c0
- ld bc, $80
- ld a, $1
- call Func_f9fb3
- ret
-
-Func_f9e80:
- xor a
- ld [rBGP], a
- ld [rOBP0], a
- ld [rOBP1], a
- call UpdateGBCPal_BGP
- call UpdateGBCPal_OBP0
- call UpdateGBCPal_OBP1
- call DelayFrame
- call DelayFrame
- call DisableLCD
- ret
-
-Func_f9e9a:
- ld e, a
- callab Func_720ad
- xor a
- ld [hSCX], a
- ld [hSCY], a
- ld a, $90
- ld [hWY], a
- ld a, $e3
- ld [rLCDC], a
- ld a, $e4
- ld [rBGP], a
- ld [rOBP0], a
- ld a, $e0
- ld [rOBP1], a
- call UpdateGBCPal_BGP
- call UpdateGBCPal_OBP0
- call UpdateGBCPal_OBP1
- ret
-
-Func_f9ec4:
- ld de, wc800
- ld a, $8
-.asm_f9ec9
- push af
- ld hl, Unkn_f9ed8
- ld bc, $20
- call Func_f9faa
- pop af
- dec a
- jr nz, .asm_f9ec9
- ret
-
-Unkn_f9ed8:
- db 0, 0, 1, 2, 2, 3, 3, 3
- db 4, 3, 3, 3, 2, 2, 1, 0
- db 0, 0, -1, -2, -2, -3, -3, -3
- db -4, -3, -3, -3, -2, -2, -1, 0
-
-Func_f9ef8:
- ld a, $10
- ld [H_VBCOPYSRC], a
- ld a, $c8
- ld [H_VBCOPYSRC + 1], a
- ld a, $10
- ld [H_VBCOPYDEST], a
- ld a, $c7
- ld [H_VBCOPYDEST + 1], a
- ld a, $7
- ld [H_VBCOPYSIZE], a
- ret
-
-Func_f9f0d:
- xor a
- ld [H_AUTOBGTRANSFERENABLED], a
- ld [hSCX], a
- ld [hSCY], a
- ld [H_AUTOBGTRANSFERDEST], a
- ld a, $98
- ld [H_AUTOBGTRANSFERDEST + 1], a
- call Func_f9f9e
- ld hl, wTileMap
- ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
- ld a, $1
- call Func_f9fb3
- coord hl, 0, 4
- ld bc, CopyVideoDataAlternate
- xor a
- call Func_f9fb3
- ld a, $1
- ld [H_AUTOBGTRANSFERENABLED], a
- call DelayFrame
- call DelayFrame
- call DelayFrame
- xor a
- ld [H_AUTOBGTRANSFERENABLED], a
- ld de, $6b5a
- ld hl, $8000
- ld bc, $3eff
- call CopyVideoData
- ld de, $635a
- ld hl, $9000
- ld bc, $3e80
- call CopyVideoData
- call ClearObjectAnimationBuffers
- call Func_f9f75
- ld b, $8
- call RunPaletteCommand
- xor a
- ld hl, wc634
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hl], a
- ld a, MUSIC_INTRO_BATTLE
- ld c, BANK(Music_IntroBattle)
- call PlayMusic
- ret
-
-Func_f9f75:
- ld a, Unkn_f9fda % $100
- ld [wAnimatedObjectSpawnStateDataPointer], a
- ld a, Unkn_f9fda / $100
- ld [wAnimatedObjectSpawnStateDataPointer + 1], a
- ld a, Jumptable_f9ffb % $100
- ld [wAnimatedObjectJumptablePointer], a
- ld a, Jumptable_f9ffb / $100
- ld [wAnimatedObjectJumptablePointer + 1], a
- ld a, Unkn_fa13d % $100
- ld [wAnimatedObjectOAMDataPointer], a
- ld a, Unkn_fa13d / $100
- ld [wAnimatedObjectOAMDataPointer + 1], a
- ld a, Unkn_fa0ea % $100
- ld [wAnimatedObjectFramesDataPointer], a
- ld a, Unkn_fa0ea / $100
- ld [wAnimatedObjectFramesDataPointer + 1], a
- ret
-
-Func_f9f9e:
- ld hl, wTileMap
- ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
- ld a, $7f
- call Func_f9fb3
- ret
-
-Func_f9faa:
- ld a, [hli]
- ld [de], a
- inc de
- dec bc
- ld a, c
- or b
- jr nz, Func_f9faa
- ret
-
-Func_f9fb3:
- push de
- ld e, a
-.asm_f9fb5
- ld a, e
- ld [hli], a
- dec bc
- ld a, c
- or b
- jr nz, .asm_f9fb5
- pop de
- ret
-
-Func_f9fbe:
- ld hl, wSpriteDataEnd
- ld bc, $a0
- xor a
- call Func_f9fb3
- ret
-
-Func_f9fc9:
- xor a
- ld [rBGP], a
- ld [rOBP0], a
- ld [rOBP1], a
- call UpdateGBCPal_BGP
- call UpdateGBCPal_OBP0
- call UpdateGBCPal_OBP1
- ret
-
-Unkn_f9fda:
- db $00, $00, $00
- db $01, $01, $00
- db $02, $01, $00
- db $03, $01, $00
- db $04, $02, $00
- db $05, $03, $00
- db $06, $04, $00
- db $07, $01, $00
- db $08, $05, $00
- db $09, $01, $00
- db $0a, $01, $00
-
-Jumptable_f9ffb:
- dw Func_fa007
- dw Func_fa007
- dw Func_fa008
- dw Func_fa014
- dw Func_fa02b
- dw Func_fa062
-
-Func_fa007:
- ret
-
-Func_fa008:
- ld hl, $4
- add hl, bc
- ld a, [hl]
- cp $58
- ret z
- sub $4
- ld [hl], a
- ret
-
-Func_fa014:
- ld hl, $4
- add hl, bc
- ld a, [hl]
- cp $58
- jr z, .asm_fa020
- add $4
- ld [hl], a
-.asm_fa020
- ld hl, $5
- add hl, bc
- cp $58
- ret z
- add $1
- ld [hl], a
- ret
-
-Func_fa02b:
- ld hl, $b
- add hl, bc
- ld e, [hl]
- ld d, $0
- ld hl, Jumptable_fa03b
- add hl, de
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jp [hl]
-
-Jumptable_fa03b:
- dw Func_fa03f
- dw Func_fa051
-
-Func_fa03f:
- ld hl, $5
- add hl, bc
- ld a, [hl]
- cp $58
- jr z, .asm_fa04c
- sub $2
- ld [hl], a
- ret
-
-.asm_fa04c
- ld hl, $b
- add hl, bc
- inc [hl]
-Func_fa051:
- ld hl, $c
- add hl, bc
- ld a, [hl]
- inc [hl]
- ld d, $8
- call Func_fa079
- ld hl, $7
- add hl, bc
- ld [hl], a
- ret
-
-Func_fa062:
- ld hl, $b
- add hl, bc
- ld a, [hl]
- ld hl, $4
- add hl, bc
- add [hl]
- ld [hl], a
- ret
-
-Func_fa06e:
- ld e, a
- ld d, $0
- add hl, de
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ret
-
-Func_fa077: ; cosine
- add $10
-Func_fa079:
- and $3f
- cp $20
- jr nc, .asm_fa084
- call Func_fa08e
- ld a, h
- ret
-
-.asm_fa084
- and $1f
- call Func_fa08e
- ld a, h
- xor $ff
- inc a
- ret
-
-Func_fa08e:
- ld e, a
- ld a, d
- ld d, $0
- ld hl, Unkn_fa0aa
- add hl, de
- add hl, de
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld hl, $0
-.asm_fa09d
- srl a
- jr nc, .asm_fa0a2
- add hl, de
-.asm_fa0a2
- sla e
- rl d
- and a
- jr nz, .asm_fa09d
- ret
-
-Unkn_fa0aa:
- sine_wave $100
-
-Unkn_fa0ea:
- dw Unkn_fa100
- dw Unkn_fa103
- dw Unkn_fa10a
- dw Unkn_fa111
- dw Unkn_fa118
- dw Unkn_fa11b
- dw Unkn_fa11e
- dw Unkn_fa121
- dw Unkn_fa124
- dw Unkn_fa127
- dw Unkn_fa138
-
-Unkn_fa100:
- frame $00, 32
- endanim
-
-Unkn_fa103:
- frame $01, 4
- frame $02, 4
- frame $03, 4
- dorestart
-
-Unkn_fa10a:
- frame $04, 4
- frame $05, 4
- frame $06, 4
- dorestart
-
-Unkn_fa111:
- frame $07, 4
- frame $08, 4
- frame $09, 4
- dorestart
-
-Unkn_fa118:
- frame $0a, 32
- endanim
-
-Unkn_fa11b:
- frame $0b, 32
- endanim
-
-Unkn_fa11e:
- frame $0c, 32
- endanim
-
-Unkn_fa121:
- frame $0d, 32
- endanim
-
-Unkn_fa124:
- frame $0e, 32
- endanim
-
-Unkn_fa127:
- frame $0f, 31
- frame $11, 2
- frame $0f, 2
- frame $11, 2
- frame $0f, 31
- frame $11, 2
- frame $0f, 23
- frame $10, 32
- endanim
-
-Unkn_fa138:
- frame $12, 4
- frame $13, 4
- dorestart
-
-Unkn_fa13d:
- dbw $00, Unkn_fa179
- dbw $96, Unkn_fa17e
- dbw $98, Unkn_fa17e
- dbw $9a, Unkn_fa17e
- dbw $0c, Unkn_fa18f
- dbw $0e, Unkn_fa18f
- dbw $3c, Unkn_fa18f
- dbw $60, Unkn_fa1b0
- dbw $70, Unkn_fa1b0
- dbw $80, Unkn_fa1b0
- dbw $90, Unkn_fa201
- dbw $00, Unkn_fa201
- dbw $06, Unkn_fa201
- dbw $c6, Unkn_fa292
- dbw $6d, Unkn_fa2f7
- dbw $f0, Unkn_fa308
- dbw $f4, Unkn_fa308
- dbw $f8, Unkn_fa308
- dbw $9c, Unkn_fa329
- dbw $ec, Unkn_fa329
-
-Unkn_fa179:
- db 1
- db $fc, $fc, $00, $00
-Unkn_fa17e:
- db 4
- db $f8, $f8, $00, $00
- db $f8, $00, $01, $00
- db $00, $f8, $10, $00
- db $00, $00, $11, $00
-
-Unkn_fa18f:
- db 8
- db $f0, $f8, $00, $00
- db $f0, $00, $01, $00
- db $f8, $f8, $10, $00
- db $f8, $00, $11, $00
- db $00, $f8, $20, $00
- db $00, $00, $20, $20
- db $08, $f8, $21, $00
- db $08, $00, $21, $20
-
-Unkn_fa1b0:
- db 20
- db $e8, $f8, $00, $00
- db $e8, $00, $01, $00
- db $f0, $f8, $02, $00
- db $f0, $00, $03, $00
- db $f8, $f0, $04, $00
- db $f8, $f8, $05, $00
- db $f8, $00, $06, $00
- db $f8, $08, $04, $20
- db $00, $f0, $07, $00
- db $00, $f8, $08, $00
- db $00, $00, $08, $20
- db $00, $08, $07, $20
- db $08, $f0, $09, $00
- db $08, $f8, $0a, $00
- db $08, $00, $0a, $20
- db $08, $08, $09, $20
- db $10, $f0, $0b, $00
- db $10, $f8, $0c, $00
- db $10, $00, $0c, $20
- db $10, $08, $0b, $20
-
-Unkn_fa201:
- db 36
- db $e8, $e8, $00, $00
- db $e8, $f0, $01, $00
- db $e8, $f8, $02, $00
- db $e8, $00, $03, $00
- db $e8, $08, $04, $00
- db $e8, $10, $05, $00
- db $f0, $e8, $10, $00
- db $f0, $f0, $11, $00
- db $f0, $f8, $12, $00
- db $f0, $00, $13, $00
- db $f0, $08, $14, $00
- db $f0, $10, $15, $00
- db $f8, $e8, $20, $00
- db $f8, $f0, $21, $00
- db $f8, $f8, $22, $00
- db $f8, $00, $23, $00
- db $f8, $08, $24, $00
- db $f8, $10, $25, $00
- db $00, $e8, $30, $00
- db $00, $f0, $31, $00
- db $00, $f8, $32, $00
- db $00, $00, $33, $00
- db $00, $08, $34, $00
- db $00, $10, $35, $00
- db $08, $e8, $40, $00
- db $08, $f0, $41, $00
- db $08, $f8, $42, $00
- db $08, $00, $43, $00
- db $08, $08, $44, $00
- db $08, $10, $45, $00
- db $10, $e8, $50, $00
- db $10, $f0, $51, $00
- db $10, $f8, $52, $00
- db $10, $00, $53, $00
- db $10, $08, $54, $00
- db $10, $10, $55, $00
-
-Unkn_fa292:
- db 25
- db $ec, $f0, $00, $00
- db $ec, $f8, $01, $00
- db $ec, $00, $02, $00
- db $ec, $08, $03, $00
- db $ec, $10, $04, $00
- db $f4, $f0, $05, $00
- db $f4, $f8, $06, $00
- db $f4, $00, $07, $00
- db $f4, $08, $08, $00
- db $f4, $10, $09, $00
- db $fc, $f0, $10, $00
- db $fc, $f8, $11, $00
- db $fc, $00, $12, $00
- db $fc, $08, $13, $00
- db $fc, $10, $14, $00
- db $04, $f0, $15, $00
- db $04, $f8, $16, $00
- db $04, $00, $17, $00
- db $04, $08, $18, $00
- db $04, $10, $19, $00
- db $0c, $f0, $20, $00
- db $0c, $f8, $21, $00
- db $0c, $00, $22, $00
- db $0c, $08, $23, $00
- db $0c, $10, $24, $00
-
-Unkn_fa2f7:
- db 4
- db $fc, $f0, $00, $00
- db $fc, $f8, $01, $00
- db $fc, $00, $01, $20
- db $fc, $08, $00, $20
-
-Unkn_fa308:
- db 8
- db $f8, $e8, $00, $10
- db $f8, $f0, $01, $10
- db $00, $e8, $02, $10
- db $00, $f0, $03, $10
- db $f8, $08, $01, $30
- db $f8, $10, $00, $30
- db $00, $08, $03, $30
- db $00, $10, $02, $30
-
-Unkn_fa329:
- db 12
- db $f8, $d8, $00, $10
- db $f8, $e0, $01, $10
- db $f8, $e8, $02, $10
- db $00, $d8, $10, $10
- db $00, $e0, $11, $10
- db $00, $e8, $12, $10
- db $f8, $10, $02, $30
- db $f8, $18, $01, $30
- db $f8, $20, $00, $30
- db $00, $10, $12, $30
- db $00, $18, $11, $30
- db $00, $20, $10, $30
-
+INCLUDE "engine/surfing_minigame.asm"
+INCLUDE "engine/yellow_intro.asm"
+INCLUDE "data/animated_objects_3e_2.asm"
YellowIntroGraphics: INCBIN "gfx/yellow_intro.2bpp"
-
INCLUDE "engine/animated_objects_3e.asm"
diff --git a/engine/bank3f.asm b/engine/bank3f.asm
index 85674ec4..23eadbb1 100644
--- a/engine/bank3f.asm
+++ b/engine/bank3f.asm
@@ -1,1804 +1,10 @@
INCLUDE "data/map_songs.asm"
INCLUDE "data/map_header_pointers.asm"
INCLUDE "data/map_header_banks.asm"
-
-Func_fc4dd:: ; fc4dd (3f:44dd)
-; possibly to test if pika should be out?
- ld a, [wPikachuOverworldStateFlags]
- bit 5, a
- jr nz, .hide ; 3f:44f8
- ld a, [wPikachuOverworldStateFlags]
- bit 7, a
- jr nz, .hide
- call IsStarterPikachuInOurParty
- jr nc, .hide
- ld a, [wWalkBikeSurfState]
- and a
- jr nz, .hide
- scf
- ret
-
-.hide
- and a
- ret
-
-Func_fc4fa:: ; fc4fa (3f:44fa)
- ld hl, wPikachuOverworldStateFlags
- bit 4, [hl]
- res 4, [hl]
- jr nz, .asm_fc515
- call EnablePikachuFollowingPlayer
- call Func_fc523
- ld a, $ff
- ld [wSpriteStateData1 + $f2], a
- call ClearPikachuFollowCommandBuffer
- call Func_fc5bc
- ret
-
-.asm_fc515
- call Func_fc53f
- xor a
- ld [wd431], a
- ld a, [wSpriteStateData1 + $9]
- ld [wSpriteStateData1 + $f9], a
- ret
-
-Func_fc523:: ; fc523 (3f:4523)
- ld hl, wSpriteStateData1 + $f0
- call Func_fc52c
- ld hl, wSpriteStateData2 + $f0
-Func_fc52c:: ; fc52c (3f:4523)
- ld bc, $10
- xor a
- call FillMemory
- ret
-
-Func_fc534:: ; fc534 (3f:4534)
- call Func_fc53f
- call Func_fc5bc
- xor a
- ld [wd431], a
- ret
-
-Func_fc53f:: ; fc53f (3f:453f)
- ld bc, wSpriteStateData1 + $f0
- ld a, [wYCoord]
- add $4
- ld e, a
- ld a, [wXCoord]
- add $4
- ld d, a
- ld a, [wd431]
- and a
- jr z, .asm_fc5aa
- cp $1
- jr z, .asm_fc59e
- cp $2
- jr z, .asm_fc584
- cp $3
- jr z, .asm_fc5aa
- cp $4
- jr z, .asm_fc5a4
- cp $5
- jr z, .asm_fc5a7
- cp $6
- jr z, .asm_fc5a1
- cp $7
- jr z, .asm_fc572
- jr .asm_fc59e
-
-.asm_fc572
- ld a, [wSpriteStateData1 + $9]
- and a ; SPRITE_FACING_DOWN
- jr z, .asm_fc5a4
- cp SPRITE_FACING_UP
- jr z, .asm_fc5a7
- cp SPRITE_FACING_LEFT
- jr z, .asm_fc5a1
- cp SPRITE_FACING_RIGHT
- jr z, .asm_fc59e
-.asm_fc584
- ld a, [wSpriteStateData1 + $9]
- and a
- jr nz, .asm_fc58d
- dec e
- jr .asm_fc5aa
-
-.asm_fc58d
- cp SPRITE_FACING_UP
- jr nz, .asm_fc594
- inc e
- jr .asm_fc5aa
-
-.asm_fc594
- cp SPRITE_FACING_LEFT
- jr nz, .asm_fc59b
- inc d
- jr .asm_fc5aa
-
-.asm_fc59b
- dec d
- jr .asm_fc5aa
-
-.asm_fc59e
- inc d
- jr .asm_fc5aa
-
-.asm_fc5a1
- dec d
- jr .asm_fc5aa
-
-.asm_fc5a4
- inc e
- jr .asm_fc5aa
-
-.asm_fc5a7
- dec e
- jr .asm_fc5aa ; useless jr
-.asm_fc5aa
- ld hl, $104
- add hl, bc
- ld [hl], e
- inc hl
- ld [hl], d
- inc hl
-Func_fc4b2:: ; fc4b2 (3f:44b2)
- ld [hl], $fe
- push hl
- ld hl, wd472
- set 5, [hl]
- pop hl
- ret
-
-Func_fc5bc:: ; fc5bc (3f:45bc)
- ld a, $49
- ld [wSpriteStateData1 + $f0], a
- ld a, $ff
- ld [wSpriteStateData1 + $f2], a
- ld a, [wd431]
- and a
- jr z, .asm_fc5e4
- cp $1
- jr z, .asm_fc5e4
- cp $3
- jr z, .asm_fc5eb
- cp $4
- jr z, .asm_fc5e4
- cp $6
- jr z, .asm_fc5e4
- cp $7
- jr z, .asm_fc5f1
- call Func_fccb2
- ret
-
-.asm_fc5e4
- ld a, [wSpriteStateData1 + $9]
- ld [wSpriteStateData1 + $f9], a
- ret
-
-.asm_fc5eb
- ld a, $0
- ld [wSpriteStateData1 + $f9], a
- ret
-
-.asm_fc5f1
- ld a, [wSpriteStateData1 + $9]
- xor $4
- ld [wSpriteStateData1 + $f9], a
- ret
-
-Func_fc5fa:: ; fc5fa (3f:45fa)
- ld a, [wCurMap]
- cp OAKS_LAB
- jr z, .asm_fc63d
- cp ROUTE_22_GATE
- jr z, .asm_fc62d
- cp MT_MOON_2
- jr z, .asm_fc635
- cp ROCK_TUNNEL_1
- jr z, .asm_fc645
- ld a, [wCurMap]
- ld hl, Pointer_fc64b
- call Func_1568 ; similar to IsInArray, but not the same
- jr c, .asm_fc639
- ld a, [wCurMap]
- ld hl, Pointer_fc653
- call Func_1568
- jr nc, .asm_fc641
- ld a, [wSpriteStateData1 + $9]
- and a
- jr nz, .asm_fc641
- ld a, $3
- jr .asm_fc647
-
-.asm_fc62d
- ld a, [wSpriteStateData1 + $9]
- and a
- jr z, .asm_fc645
- jr .asm_fc641
-
-.asm_fc635
- ld a, $3
- jr .asm_fc647
-
-.asm_fc639
- ld a, $4
- jr .asm_fc647
-
-.asm_fc63d
- ld a, $6
- jr .asm_fc647
-
-.asm_fc641
- ld a, $1
- jr .asm_fc647
-
-.asm_fc645
- ld a, $3
-.asm_fc647
- ld [wd431], a
- ret
-
-Pointer_fc64b:: ; fc64b (3f:464b)
- db $c2, $4c, $4f, $ba, $be, $b8, $54, $ff
-
-Pointer_fc653:: ; fc653 (3f:4653)
- db $2f, $e6, $3e, $5e, $80, $31, $a4, $ff
-
-Func_fc65b:: ; fc65b (3f:465b)
- ld a, [wCurMap]
- cp VIRIDIAN_FOREST_EXIT
- jr z, .asm_fc673
- cp VIRIDIAN_FOREST_ENTRANCE
- jr z, .asm_fc67c
- ld a, [wCurMap]
- ld hl, Pointer_fc68e
- call Func_1568
- jr c, .asm_fc688
- jr .asm_fc684
-
-.asm_fc673
- ld a, [wSpriteStateData1 + $9]
- cp SPRITE_FACING_UP
- jr z, .asm_fc688
- jr .asm_fc684
-
-.asm_fc67c
- ld a, [wSpriteStateData1 + $9]
- and a ; SPRITE_FACING_DOWN
- jr z, .asm_fc684
- jr .asm_fc688
-
-.asm_fc684
- ld a, $0
- jr .asm_fc68a
-
-.asm_fc688
- ld a, $1
-.asm_fc68a
- ld [wd431], a
- ret
-
-Pointer_fc68e:: ; fc68e (3f:468e)
- db $33, $dd, $df, $e0, $e1, $de, $ec, $7f, $a8, $a9, $aa, $ff
-
-Func_fc69a:: ; fc69a (3f:469a)
- ld a, [wCurMap]
- cp ROUTE_22_GATE
- jr z, .asm_fc6a7
- cp ROUTE_2_GATE
- jr z, .asm_fc6b0
- jr .asm_fc6bd
-
-.asm_fc6a7
- ld a, [wSpriteStateData1 + $9]
- cp SPRITE_FACING_UP
- jr z, .asm_fc6b9
- jr .asm_fc6bd
-
-.asm_fc6b0
- ld a, [wSpriteStateData1 + $9]
- cp SPRITE_FACING_UP
- jr z, .asm_fc6b9
- jr .asm_fc6bd
-
-.asm_fc6b9
- ld a, $1
- jr .asm_fc6c1
-
-.asm_fc6bd
- ld a, $3
- jr .asm_fc6c1
-
-.asm_fc6c1
- ld [wd431], a
- ret
-
-Func_fc6c5:: ; fc6c5 (3f:46c5)
- push hl
- ld hl, wPikachuOverworldStateFlags
- set 2, [hl]
- pop hl
- ret
-
-Func_fc6cd:: ; fc6cd (3f:46cd)
- push hl
- ld hl, wPikachuOverworldStateFlags
- res 2, [hl]
- pop hl
- ret
-
-Func_fc6d5:: ; fc6d5 (3f:46d5)
- call Func_fc6cd
- call Func_fc727
- ret nc
- push bc
- call Func_fcd25
- pop bc
- ret c
- ld bc, wSpriteStateData1 + $f0
- ld hl, $1
- add hl, bc
- bit 7, [hl]
- jp nz, asm_fc745
- ld a, [wFontLoaded]
- bit 0, a
- jp nz, asm_fc76a
- call CheckPikachuFollowingPlayer
- jp nz, asm_fc76a
- ld a, [hl]
- and $7f
- cp $a
- jr c, .asm_fc704
- xor a
-.asm_fc704
- add a
- ld e, a
- ld d, 0
- ld hl, PointerTable_fc710
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jp hl
-
-PointerTable_fc710: ; fc710 (3f:4710)
- dw Func_fc793
- dw Func_fc7aa
- dw Func_fc803
- dw asm_fc9c3
- dw asm_fca1c
- dw asm_fc9ee
- dw asm_fc87f
- dw asm_fc904
- dw asm_fc937
- dw asm_fc969
- dw Func_fc726
-
-Func_fc726: ; fc726 (3f:4726)
- ret
-
-Func_fc727: ; fc727 (3f:4727)
- call Func_fc4dd
- jr nc, .asm_fc73b
- ld a, [wSpriteStateData1 + $f1]
- and a
- jr nz, .asm_fc739
- push bc
- push hl
- call Func_fc534
- pop hl
- pop bc
-.asm_fc739
- scf
- ret
-
-.asm_fc73b
- ld hl, wSpriteStateData1 + $f2
- ld [hl], $ff
- dec hl
- ld [hl], $0
- xor a
- ret
-
-asm_fc745: ; fc745 (3f:4745)
- ld hl, $1
- add hl, bc
- res 7, [hl]
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- ld [hl], a
- call CheckPikachuFollowingPlayer
- jr nz, .asm_fc75f
- ld a, [wSpriteStateData1 + $9]
- xor $4
- ld hl, $9
- add hl, bc
- ld [hl], a
-.asm_fc75f
- xor a
- ld hl, $7
- add hl, bc
- ld [hli], a
- ld [hl], a
- call Func_fca99
- ret
-
-asm_fc76a: ; fc76a (3f:476a)
- xor a
- ld hl, $7
- add hl, bc
- ld [hli], a
- ld [hl], a
- call Func_fca99
- call Func_fc82e
- jr c, .asm_fc783
- push bc
- callab InitializeSpriteScreenPosition
- pop bc
-.asm_fc783
- ld hl, $1
- add hl, bc
- ld [hl], $1
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- ld [hl], $0
- call Func_fcba1
- ret
-
-Func_fc793: ; fc793 (3f:4793)
- call Func_fcba1
- push bc
- callab InitializeSpriteScreenPosition
- pop bc
- ld hl, $2
- add hl, bc
- ld [hl], $ff
- dec hl
- ld [hl], $1
- ret
-
-Func_fc7aa: ; fc7aa (3f:47aa)
- call Func_fcc92
- jp c, Func_fc803
- dec a
- ld l, a
- ld h, $0
- add hl, hl
- add hl, hl
- ld de, Pointer_fc7e3
- add hl, de
- ld d, h
- ld e, l
- ld a, [de]
- inc de
- ld hl, $9
- add hl, bc
- ld [hl], a
- ld a, [de]
- inc de
- ld hl, $5
- add hl, bc
- ld [hl], a
- dec hl
- dec hl
- ld a, [de]
- ld [hl], a
- inc de
- ld a, [de]
- ld hl, $1
- add hl, bc
- ld [hl], a
- cp $4
- jp z, Func_fca0a
- call Func_fcd17
- jp c, Func_fc9df
- jp Func_fc9b4
-
-Pointer_fc7e3: ; fc7e3 (3f:47e3)
- db $0, $0
- db $1, $3
- db $4, $0
- db $ff, $3
- db $8, $ff
- db $0, $3
- db $c, $1
- db $0, $3
- db $0, $0
- db $1, $4
- db $4, $0
- db $ff, $4
- db $8, $ff
- db $0, $4
- db $c, $1
- db $0, $4
-
-Func_fc803: ; fc803 (3f:4803)
- call Func_fcae2
- ret c
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- dec [hl]
- jr nz, .asm_fc823
- push hl
- call Func_fccee
- pop hl
- cp $5
- jr nc, Func_fc842
- ld [hl], $20
- call Random
- and $c
- ld hl, $9
- add hl, bc
- ld [hl], a
-.asm_fc823
- xor a
- ld hl, $7
- add hl, bc
- ld [hli], a
- ld [hl], a
- call Func_fca99
- ret
-
-Func_fc82e: ; fc82e (3f:482e)
- ld a, [wWalkCounter]
- and a
- ret z
- scf
- ret
-
-Func_fc835: ; fc835 (3f:4835)
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- ld [hl], $10
- ld hl, $1
- add hl, bc
- ld [hl], $1
- ret
-
-Func_fc842: ; fc842 (3f:4842)
- ld hl, $0
- push af
- call Random
- ld a, [hRandomAdd]
- and %11
- ld e, a
- ld d, $0
- ld hl, PointerTable_fc85a
- add hl, de
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- pop af
- jp hl
-
-PointerTable_fc85a: ; fc85a (3f:485a)
- dw Func_fc862
- dw Func_fc8f8
- dw Func_fc92b
- dw Func_fc95d
-
-Func_fc862: ; fc862 (3f:4862)
- dec a
- add a
- add a
- and $c
- ld hl, $9
- add hl, bc
- ld [hl], a
- ld hl, $1
- add hl, bc
- ld [hl], $6
- xor a
- ld [wd432], a
- ld [wd433], a
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- ld [hl], $11
-asm_fc87f: ; fc87f (3f:487f)
- ld a, [wd432]
- ld e, a
- ld a, [wd433]
- ld d, a
- call Func_fc82e
- jr c, Func_fc8c7
- call Func_fc6c5
- ld hl, $4
- add hl, bc
- ld a, [hl]
- sub e
- ld e, a
- inc hl
- inc hl
- ld a, [hl]
- sub d
- ld d, a
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- ld a, [hl]
- dec a
- add a
- add $d6
- ld l, a
- ld a, $48
- adc $0
- ld h, a
- ld a, [hli]
- ld [wd432], a
- add e
- ld e, a
- ld a, [hl]
- ld [wd433], a
- add d
- ld d, a
- ld hl, $4
- add hl, bc
- ld [hl], e
- inc hl
- inc hl
- ld [hl], d
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- dec [hl]
- ret nz
- jp Func_fc835
-
-Func_fc8c7: ; fc8c7 (3f:48c7)
- ld hl, $4
- add hl, bc
- ld a, [hl]
- sub e
- ld [hl], a
- inc hl
- inc hl
- ld a, [hl]
- sub d
- ld [hl], a
- jp Func_fc835
-
-Pointer_fc8d6: ; fc8d6 (3f:48d6)
- db $0, $0, $fe, $1, $fc
- db $2, $fe, $3, $0, $4
- db $fe, $3, $fc, $2, $fe
- db $1, $0, $0, $fe, $ff
- db $fc, $fe, $fe, $fd, $0
- db $fc, $fe, $fd, $fc, $fe
- db $fe, $ff, $00, $00
-
-Func_fc8f8: ; fc8f8 (3f:48f8)
- ld hl, $1
- add hl, bc
- ld [hl], $7
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- ld [hl], $30
-asm_fc904: ; fc904 (3f:4904)
- call Func_fc82e
- jp c, Func_fc835
- call Func_fc6c5
- ld hl, $7
- add hl, bc
- ld a, [hl]
- inc a
- cp $8
- ld [hl], a
- jr nz, .asm_fc91f
- xor a
- ld [hli], a
- ld a, [hl]
- inc a
- and %11
- ld [hl], a
-.asm_fc91f
- call Func_fca99
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- dec [hl]
- ret nz
- jp Func_fc835
-
-Func_fc92b: ; fc92b (3f:492b)
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- ld [hl], $20
- ld hl, $1
- add hl, bc
- ld [hl], $8
-asm_fc937: ; fc937 (3f:4937)
- call Func_fc82e
- jp c, Func_fc835
- call Func_fc6c5
- ld hl, $7
- add hl, bc
- ld a, [hl]
- inc a
- cp $8
- ld [hl], a
- jr nz, .asm_fc951
- xor a
- ld [hli], a
- ld a, [hl]
- xor $1
- ld [hl], a
-.asm_fc951
- call Func_fca99
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- dec [hl]
- ret nz
- jp Func_fc835
-
-Func_fc95d: ; fc95d (3f:495d)
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- ld [hl], $20
- ld hl, $1
- add hl, bc
- ld [hl], $9
-asm_fc969: ; fc969 (3f:4969)
- call Func_fc82e
- jp c, Func_fc835
- call Func_fc6c5
- ld hl, $7
- add hl, bc
- ld a, [hl]
- inc a
- cp $8
- ld [hl], a
- jr nz, .asm_fc988
- xor a
- ld [hl], a
- ld hl, $9
- add hl, bc
- ld a, [hl]
- call Func_fc994
- ld [hl], a
-.asm_fc988
- call Func_fca99
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- dec [hl]
- ret nz
- jp Func_fc835
-
-Func_fc994: ; fc994 (3f:4994)
- push hl
- ld hl, Pointer_fc9ac
- ld d, a
-.loop
- ld a, [hli]
- cp d
- jr nz, .loop
- ld a, [hl]
- pop hl
- ret
-
-Func_fc9a0: ; fc9a0 (3f:49a0)
- push hl
- ld hl, Pointer_fc9ac_End
- ld d, a
-.loop
- ld a, [hld]
- cp d
- jr nz, .loop
- ld a, [hl]
- pop hl
- ret
-
-Pointer_fc9ac: ; fc9ac (3f:49ac)
- db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT, SPRITE_FACING_UP, SPRITE_FACING_RIGHT
- db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT, SPRITE_FACING_UP, SPRITE_FACING_RIGHT
-Pointer_fc9ac_End:
-Func_fc9b4: ; fc9b4 (3f:49b4)
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- ld [hl], $8
- ld hl, $1
- add hl, bc
- ld [hl], $3
- call Func_fca38
-asm_fc9c3: ; fc9c3 (3f:49c3)
- call Func_fca4b
- call Func_fca7e
- call Func_fca99
- ld hl, $100
- add hl, bc
- dec [hl]
- ret nz
- call Func_fca75
- call Func_fccb2
- ld hl, $1
- add hl, bc
- ld [hl], $1
- ret
-
-Func_fc9df: ; fc9df (3f:49df)
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- ld [hl], $4
- ld hl, $1
- add hl, bc
- ld [hl], $5
- call Func_fca38
-asm_fc9ee: ; fc9ee (3f:49ee)
- call asm_fca59
- call Func_fca7e
- call Func_fca99
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- dec [hl]
- ret nz
- call Func_fca75
- call Func_fccb2
- ld hl, $1
- add hl, bc
- ld [hl], $1
- ret
-
-Func_fca0a: ; fca0a (3f:4a0a)
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- ld [hl], $8
- ld hl, $1
- add hl, bc
- ld [hl], $4
- call Func_fca38
- call Func_fca38
-asm_fca1c: ; fca1c (3f:4a1c)
- call asm_fca59
- call Func_fca7e
- call Func_fca99
- ld hl, wSpriteStateData2 - wSpriteStateData1
- add hl, bc
- dec [hl]
- ret nz
- call Func_fca75
- call Func_fccb2
- ld hl, $1
- add hl, bc
- ld [hl], $1
- ret
-
-Func_fca38: ; fca38 (3f:4a38)
- ld hl, $3
- add hl, bc
- ld e, [hl]
- inc hl
- inc hl
- ld d, [hl]
- ld hl, $104
- add hl, bc
- ld a, [hl]
- add e
- ld [hli], a
- ld a, [hl]
- add d
- ld [hl], a
- ret
-
-Func_fca4b: ; fca4b (3f:4a4b)
- ld a, [wWalkBikeSurfState]
- cp $1
- jr nz, Func_fca68
- ld a, [wd736]
- bit 6, a
- jr nz, Func_fca68
-asm_fca59: ; fca59 (3f:4a59)
- ld hl, $3
- add hl, bc
- ld a, [hli]
- add a
- add a
- add [hl]
- ld [hli], a
- ld a, [hli]
- add a
- add a
- add [hl]
- ld [hl], a
- ret
-
-Func_fca68: ; fca68 (3f:4a68)
- ld hl, $3
- add hl, bc
- ld a, [hli]
- add a
- add [hl]
- ld [hli], a
- ld a, [hli]
- add a
- add [hl]
- ld [hli], a
- ret
-
-Func_fca75: ; fca75 (3f:4a75)
- ld hl, $3
- add hl, bc
- xor a
- ld [hli], a
- inc hl
- ld [hl], a
- ret
-
-Func_fca7e: ; fca7e (3f:4a7e)
- call Func_fcdad
- ld d, $2
- jr nc, .asm_fca87
- ld d, $5
-.asm_fca87
- ld hl, $7
- add hl, bc
- ld a, [hl]
- inc a
- cp d
- jr nz, .asm_fca91
- xor a
-.asm_fca91
- ld [hli], a
- ret nz
- ld a, [hl]
- inc a
- and $3
- ld [hl], a
- ret
-
-Func_fca99: ; fca99 (3f:4a99)
- ld a, [wPikachuOverworldStateFlags]
- bit 3, a
- jr nz, .asm_fcad1
- ld hl, $10e
- add hl, bc
- ld a, [hl]
- dec a
- swap a
- ld d, a
- ld a, [wd736]
- bit 7, a
- jr nz, .asm_fcad8
- ld hl, $9
- add hl, bc
- ld a, [hl]
- or d
- ld d, a
- ld a, [wFontLoaded]
- bit 0, a
- jr z, .asm_fcac4
- call Func_fcae2
- ret c
- jr .asm_fcacb
-
-.asm_fcac4
- ld hl, $8
- add hl, bc
- ld a, d
- or [hl]
- ld d, a
-.asm_fcacb
- ld hl, $2
- add hl, bc
- ld [hl], d
- ret
-
-.asm_fcad1
- ld hl, $2
- add hl, bc
- ld [hl], $ff
- ret
-
-.asm_fcad8
- ld a, [wSpriteStateData1 + $2]
- and $f
- or d
- ld [wSpriteStateData1 + $f2], a
- ret
-
-Func_fcae2: ; fcae2 (3f:4ae2)
- ld hl, $104
- add hl, bc
- ld a, [wYCoord]
- add $4
- cp [hl]
- jr nz, .asm_fcaff
- inc hl
- ld a, [wXCoord]
- add $4
- cp [hl]
- jr nz, .asm_fcaff
- ld hl, $2
- add hl, bc
- ld [hl], $ff
- scf
- ret
-
-.asm_fcaff
- and a
- ret
-
-Func_fcb01: ; fcb01 (3f:4b01)
- push bc
- push de
- push hl
- ld bc, wSpriteStateData1 + $f0
- ld a, [wXCoord]
- add $4
- ld d, a
- ld a, [wYCoord]
- add $4
- ld e, a
- ld hl, $104
- add hl, bc
- ld a, [hl]
- sub e
- and a
- jr z, .asm_fcb30
- cp $ff
- jr z, .asm_fcb26
- cp $1
- jr z, .asm_fcb26
- jr .asm_fcb48
-
-.asm_fcb26
- ld hl, $105
- add hl, bc
- ld a, [hl]
- sub d
- jr z, .asm_fcb43
- jr .asm_fcb48
-
-.asm_fcb30
- ld hl, $105
- add hl, bc
- ld a, [hl]
- sub d
- cp $ff
- jr z, .asm_fcb43
- cp $1
- jr z, .asm_fcb43
- and a
- jr z, .asm_fcb43
- jr .asm_fcb48
-
-.asm_fcb43
- pop hl
- pop de
- pop bc
- scf
- ret
-
-.asm_fcb48
- pop hl
- pop de
- pop bc
- xor a
- ret
-
-GetPikachuFacingDirectionAndReturnToE: ; fcb4d (3f:4b4d)
- call GetPikachuFacingDirection
- ld e, a
- ret
-
-GetPikachuFacingDirection: ; fcb52 (3f:4b52)
- ld bc, wSpriteStateData1 + $f0
- ld a, [wXCoord]
- add $4
- ld d, a
- ld a, [wYCoord]
- add $4
- ld e, a
- ld hl, wSpriteStateData2 - wSpriteStateData1 + 4
- add hl, bc
- ld a, [hl]
- cp e
- jr z, .asm_fcb71
- jr nc, .asm_fcb6e
- ld a, SPRITE_FACING_UP
- ret
-
-.asm_fcb6e
- ld a, SPRITE_FACING_DOWN
- ret
-
-.asm_fcb71
- ld hl, wSpriteStateData2 - wSpriteStateData1 + 5
- add hl, bc
- ld a, [hl]
- cp d
- jr z, .asm_fcb81
- jr nc, .asm_fcb7e
- ld a, SPRITE_FACING_LEFT
- ret
-
-.asm_fcb7e
- ld a, SPRITE_FACING_RIGHT
- ret
-
-.asm_fcb81
- ld a, $ff ; standing
- ret
-
-ClearPikachuFollowCommandBuffer: ; fcb84 (3f:4b84)
- push bc
- ld hl, wPikachuFollowCommandBufferSize
- ld [hl], $ff
- inc hl
- ld bc, $10
- xor a
- call FillMemory
- pop bc
- ret
-
-AppendPikachuFollowCommandToBuffer: ; fcb94 (3f:4b94)
- ld hl, wPikachuFollowCommandBufferSize
- inc [hl]
- ld e, [hl]
- ld d, 0
- ld hl, wPikachuFollowCommandBuffer
- add hl, de
- ld [hl], a
- ret
-
-Func_fcba1: ; fcba1 (3f:4ba1)
- call ClearPikachuFollowCommandBuffer
- call GetPikachuFollowCommand
- ret c
- call AppendPikachuFollowCommandToBuffer
- ret
-
-GetPikachuFollowCommand: ; fcbac (3f:4bac)
- ld bc, wSpriteStateData1 + $f0
- ld hl, wSpriteStateData2 - wSpriteStateData1 + 4
- add hl, bc
- ld a, [wYCoord]
- add $4
- sub [hl]
- jr z, .checkXCoord
- jr c, .pikaAbovePlayer
- call CheckAbsoluteValueLessThan2
- jr c, .return1
- ld a, $5
- and a
- ret
-
-.return1
- ld a, $1
- and a
- ret
-
-.pikaAbovePlayer
- call CheckAbsoluteValueLessThan2
- jr c, .return2
- ld a, $6
- and a
- ret
-
-.return2
- ld a, $2
- and a
- ret
-
-.checkXCoord
- ld hl, wSpriteStateData2 - wSpriteStateData1 + 5
- add hl, bc
- ld a, [wXCoord]
- add $4
- sub [hl]
- jr z, .pikachuOnTopOfPlayer
- jr c, .pikaToLeftOfPlayer
- call CheckAbsoluteValueLessThan2
- jr c, .return4
- ld a, $8
- and a
- ret
-
-.return4
- ld a, $4
- and a
- ret
-
-.pikaToLeftOfPlayer
- call CheckAbsoluteValueLessThan2
- jr c, .return3
- ld a, $7
- and a
- ret
-
-.return3
- ld a, $3
- and a
- ret
-
-.pikachuOnTopOfPlayer
- scf
- ret
-
-CheckAbsoluteValueLessThan2: ; fcc01 (3f:4c01)
- jr nc, .positive
- cpl
- inc a
-.positive
- cp $2
- ret
-
-Func_fcc08:: ; fcc08 (3f:4c08)
- call Func_fcc23
- ret nc
- ld a, [wd736]
- bit 6, a
- jr nz, .asm_fcc1b
- call Func_fcc42
- ret c
- call AppendPikachuFollowCommandToBuffer
- ret
-
-.asm_fcc1b
- call Func_fcc64
- ret c
- call AppendPikachuFollowCommandToBuffer
- ret
-
-Func_fcc23: ; fcc23 (3f:4c28)
- ld a, [wPikachuOverworldStateFlags]
- bit 5, a
- jr nz, .asm_fcc40
- ld a, [wPikachuOverworldStateFlags]
- bit 7, a
- jr nz, .asm_fcc40
- ld a, [wd472]
- bit 7, a
- jr z, .asm_fcc40
- ld a, [wWalkBikeSurfState]
- and a
- jr nz, .asm_fcc40
- scf
- ret
-
-.asm_fcc40
- and a
- ret
-
-Func_fcc42: ; fcc42 (3f:4c42)
- xor a
- ld a, [wPlayerDirection]
- bit 3, a
- jr nz, .asm_fcc58
- bit 2, a
- jr nz, .asm_fcc5b
- bit 1, a
- jr nz, .asm_fcc5e
- bit 0, a
- jr nz, .asm_fcc61
- scf
- ret
-
-.asm_fcc58
- ld a, $2
- ret
-
-.asm_fcc5b
- ld a, $1
- ret
-
-.asm_fcc5e
- ld a, $3
- ret
-
-.asm_fcc61
- ld a, $4
- ret
-
-Func_fcc64: ; fcc64 (3f:4c64)
- ld hl, wPikachuOverworldStateFlags
- bit 6, [hl]
- jr z, .asm_fcc6e
- res 6, [hl]
- ret
-
-.asm_fcc6e
- set 6, [hl]
- xor a
- ld a, [wPlayerDirection]
- bit 3, a
- jr nz, .asm_fcc86
- bit 2, a
- jr nz, .asm_fcc89
- bit 1, a
- jr nz, .asm_fcc8c
- bit 0, a
- jr nz, .asm_fcc8f
- scf
- ret
-
-.asm_fcc86
- ld a, $6
- ret
-
-.asm_fcc89
- ld a, $5
- ret
-
-.asm_fcc8c
- ld a, $7
- ret
-
-.asm_fcc8f
- ld a, $8
- ret
-
-Func_fcc92: ; fcc92 (3f:4c92)
- ld hl, wPikachuFollowCommandBufferSize
- ld a, [hl]
- cp $ff
- jr z, .asm_fccb0
- and a
- jr z, .asm_fccb0
- dec [hl]
- ld e, a
- ld d, 0
- ld hl, wPikachuFollowCommandBuffer
- add hl, de
- inc e
- ld a, $ff
-.asm_fcca8
- ld d, [hl]
- ldd [hl], a
- ld a, d
- dec e
- jr nz, .asm_fcca8
- and a
- ret
-
-.asm_fccb0
- scf
- ret
-
-Func_fccb2:: ; fccb2 (3f:4cb2)
- call Func_fcd01
- and a
- jr z, .asm_fccbf
- dec a
- and $3
- add a
- add a
- jr .asm_fccea
-
-.asm_fccbf
- ld a, [wYCoord]
- add $4
- ld d, a
- ld a, [wXCoord]
- add $4
- ld e, a
- ld a, [wSpriteStateData2 + $f4]
- cp d
- jr z, .asm_fccd9
- ld a, SPRITE_FACING_DOWN
- jr c, .asm_fccea
- ld a, SPRITE_FACING_UP
- jr .asm_fccea
-
-.asm_fccd9
- ld a, [wSpriteStateData2 + $f5]
- cp e
- jr z, .asm_fcce7
- ld a, SPRITE_FACING_RIGHT
- jr c, .asm_fccea
- ld a, SPRITE_FACING_LEFT
- jr .asm_fccea
-
-.asm_fcce7
- ld a, [wSpriteStateData1 + $9]
-.asm_fccea
- ld [wSpriteStateData1 + $f9], a
- ret
-
-Func_fccee: ; fccee (3f:4cee)
- ld hl, wPikachuFollowCommandBufferSize
- ld a, [hl]
- cp $ff
- jr z, .asm_fccff
- ld e, a
- ld d, 0
- ld hl, wPikachuFollowCommandBuffer
- add hl, de
- ld a, [hl]
- ret
-
-.asm_fccff
- xor a
- ret
-
-Func_fcd01: ; fcd01 (3f:4d01)
- ld hl, wPikachuFollowCommandBufferSize
- ld a, [hl]
- cp $ff
- jr z, .asm_fcd15
- and a
- jr z, .asm_fcd15
- ld e, a
- ld d, 0
- ld hl, wPikachuFollowCommandBuffer
- add hl, de
- ld a, [hl]
- ret
-
-.asm_fcd15
- xor a
- ret
-
-Func_fcd17: ; fcd17 (3f:4d17)
- ld a, [wPikachuFollowCommandBufferSize]
- cp $ff
- ret z
- cp $2
- jr nc, .asm_fcd23
- and a
- ret
-
-.asm_fcd23
- scf
- ret
-
-Func_fcd25: ; fcd25 (3f:4d25)
- ld h, wSpriteStateData2 / $100
- ld a, [H_CURRENTSPRITEOFFSET]
- add $4
- ld l, a
- ld b, [hl]
- ld a, [wYCoord]
- cp b
- jr z, .asm_fcd3a
- jr nc, .asm_fcd63
- add $8
- cp b
- jr c, .asm_fcd63
-.asm_fcd3a
- inc l
- ld b, [hl]
- ld a, [wXCoord]
- cp b
- jr z, .asm_fcd49
- jr nc, .asm_fcd63
- add $9
- cp b
- jr c, .asm_fcd63
-.asm_fcd49
- call Func_fcd83
- ld d, $60
- ld a, [hli]
- ld e, a
- cp d
- jr nc, .asm_fcd63
- ld a, [hld]
- cp d
- jr nc, .asm_fcd63
- ld bc, -20
- add hl, bc
- ld a, [hli]
- cp d
- jr nc, .asm_fcd63
- ld a, [hl]
- cp d
- jr c, .asm_fcd6f
-.asm_fcd63
- ld h, wSpriteStateData1 / $100
- ld a, [H_CURRENTSPRITEOFFSET]
- add $2
- ld l, a
- ld [hl], $ff
- scf
- jr .asm_fcd82
-
-.asm_fcd6f
- ld h, wSpriteStateData2 / $100
- ld a, [H_CURRENTSPRITEOFFSET]
- add $7
- ld l, a
- ld a, [wGrassTile]
- cp e
- ld a, $0
- jr nz, .asm_fcd80
- ld a, $80
-.asm_fcd80
- ld [hl], a
- and a
-.asm_fcd82
- ret
-
-Func_fcd83: ; fcd83 (3f:4d83)
- ld h, wSpriteStateData1 / $100
- ld a, [H_CURRENTSPRITEOFFSET]
- add $4
- ld l, a
- ld a, [hli]
- add $4
- and $f0
- srl a
- ld c, a
- ld b, $0
- inc l
- ld a, [hl]
- add $2
- srl a
- srl a
- srl a
- add SCREEN_WIDTH
- ld d, 0
- ld e, a
- ld hl, wTileMap
- rept 5
- add hl, bc
- endr
- add hl, de
- ret
-
-Func_fcdad: ; fcdad (3f:4dad)
- push bc
- push af
- ld a, [wPikachuHappiness]
- cp $50
- pop bc
- ld a, b
- pop bc
- ret
-
-IsStarterPikachuInOurParty:: ; fcdb8 (3f:4db8)
- ld hl, wPartySpecies
- ld de, wPartyMon1OTID
- ld bc, wPartyMonOT
- push hl
-.loop
- pop hl
- ld a, [hli]
- push hl
- inc a
- jr z, .noPlayerPikachu
- cp PIKACHU + 1
- jr nz, .curMonNotPlayerPikachu
- ld h, d
- ld l, e
- ld a, [wPlayerID]
- cp [hl]
- jr nz, .curMonNotPlayerPikachu
- inc hl
- ld a, [wPlayerID+1]
- cp [hl]
- jr nz, .curMonNotPlayerPikachu
- push de
- push bc
- ld hl, wPlayerName
- ld d, $6 ; possible player length - 1
-.nameCompareLoop
- dec d
- jr z, .sameOT
- ld a, [bc]
- inc bc
- cp [hl]
- inc hl
- jr z, .nameCompareLoop
- pop bc
- pop de
-.curMonNotPlayerPikachu
- ld hl, wPartyMon2 - wPartyMon1
- add hl, de
- ld d, h
- ld e, l
- ld hl, NAME_LENGTH
- add hl, bc
- ld b, h
- ld c, l
- jr .loop
-
-.sameOT
- pop bc
- pop de
- ld h, d
- ld l, e
- ld bc, -NAME_LENGTH
- add hl, bc
- ld a, [hli]
- or [hl]
- jr z, .noPlayerPikachu ; XXX how is this determined?
- pop hl
- scf
- ret
-
-.noPlayerPikachu
- pop hl
- and a
- ret
-
-IsThisPartymonStarterPikachu_Box:: ; fce0d (3f:4e0d)
- ld hl, wBoxMon1
- ld bc, wBoxMon2 - wBoxMon1
- ld de, wBoxMonOT
- jr asm_fce21
-
-IsThisPartymonStarterPikachu_Party:: ; fce18 (3f:4e18)
-IsThisPartymonStarterPikachu::
- ld hl, wPartyMon1
- ld bc, wPartyMon2 - wPartyMon1
- ld de, wPartyMonOT
-asm_fce21: ; fce21 (3f:4e21)
- ld a, [wWhichPokemon]
- call AddNTimes
- ld a, [hl]
- cp PIKACHU
- jr nz, .notPlayerPikachu
- ld bc, wPartyMon1OTID - wPartyMon1
- add hl, bc
- ld a, [wPlayerID]
- cp [hl]
- jr nz, .notPlayerPikachu
- inc hl
- ld a, [wPlayerID+1]
- cp [hl]
- jr nz, .notPlayerPikachu
- ld h, d
- ld l, e
- ld a, [wWhichPokemon]
- ld bc, NAME_LENGTH
- call AddNTimes
- ld de, wPlayerName
- ld b, $6
-.loop
- dec b
- jr z, .isPlayerPikachu
- ld a, [de]
- inc de
- cp [hl]
- inc hl
- jr z, .loop
-.notPlayerPikachu
- and a
- ret
-
-.isPlayerPikachu
- scf
- ret
-
-Func_fce5a:: ; fce5a (3f:4e5a)
- push de
- call IsStarterPikachuInOurParty
- pop de
- ret nc
- ld a, d
- cp $80
- ld a, [wPikachuMood]
- jr c, .asm_fce6c
- cp d
- jr c, .asm_fce6e
- ret
-
-.asm_fce6c
- cp d
- ret c
-.asm_fce6e
- ld a, d
- ld [wPikachuMood], a
- ret
-
-Func_fce73:: ; fce73 (3f:4e73)
-; function to test if Pikachu is alive?
- xor a
- ld [wWhichPokemon], a
- ld hl, wPartyCount
-.loop
- inc hl
- ld a, [hl]
- cp $ff
- jr z, .asm_fcea9
- push hl
- call IsThisPartymonStarterPikachu_Party
- pop hl
- jr nc, .asm_fce9e
- ld a, [wWhichPokemon]
- ld hl, wPartyMon1HP
- ld bc, wPartyMon2 - wPartyMon1
- call AddNTimes
- ld a, [hli]
- or [hl]
- ld d, a
- inc hl
- inc hl
- ld a, [hl]
- and a
- jr nz, .asm_fcea7
- jr .asm_fcea9
-
-.asm_fce9e
- ld a, [wWhichPokemon]
- inc a
- ld [wWhichPokemon], a
- jr .loop
-
-.asm_fcea7
- scf
- ret
-
-.asm_fcea9
- and a
- ret
-
-IsSurfingPikachuInThePlayersParty:: ; fceab (3f:4eab)
- ld hl, wPartySpecies
- ld de, wPartyMon1Moves
- ld bc, wPartyMonOT
- push hl
-.loop
- pop hl
- ld a, [hli]
- push hl
- inc a
- jr z, .noSurfingPlayerPikachu
- cp PIKACHU+1
- jr nz, .curMonNotSurfingPlayerPikachu
- ld h, d
- ld l, e
- push hl
- push bc
- ld b, NUM_MOVES
-.moveSearchLoop
- ld a, [hli]
- cp SURF
- jr z, .foundSurfingPikachu
- dec b
- jr nz, .moveSearchLoop
- pop bc
- pop hl
- jr .curMonNotSurfingPlayerPikachu
-
-.foundSurfingPikachu
- pop bc
- pop hl
- inc hl
- inc hl
- inc hl
- inc hl
- ld a, [wPlayerID]
- cp [hl]
- jr nz, .curMonNotSurfingPlayerPikachu
- inc hl
- ld a, [wPlayerID+1]
- cp [hl]
- jr nz, .curMonNotSurfingPlayerPikachu
- push de
- push bc
- ld hl, wPlayerName
- ld d, $6
-.nameCompareLoop
- dec d
- jr z, .foundSurfingPlayerPikachu
- ld a, [bc]
- inc bc
- cp [hl]
- inc hl
- jr z, .nameCompareLoop
- pop bc
- pop de
-.curMonNotSurfingPlayerPikachu
- ld hl, wPartyMon2 - wPartyMon1
- add hl, de
- ld d, h
- ld e, l
- ld hl, NAME_LENGTH
- add hl, bc
- ld b, h
- ld c, l
- jr .loop
-
-.foundSurfingPlayerPikachu
- pop bc
- pop de
- pop hl
- scf
- ret
-
-.noSurfingPlayerPikachu
- pop hl
- and a
- ret
-
+INCLUDE "engine/pikachu_follow.asm"
+INCLUDE "engine/pikachu_status.asm"
+INCLUDE "engine/pikachu_emotions.asm"
+INCLUDE "engine/pikachu_movement.asm"
INCLUDE "engine/pikachu_pic_animation.asm"
Func_fe66e:
diff --git a/engine/battle/core.asm b/engine/battle/core.asm
index 7a3eab32..565525ea 100755
--- a/engine/battle/core.asm
+++ b/engine/battle/core.asm
@@ -1898,7 +1898,7 @@ SendOutMon: ; 3ccfb (f:4cfb)
ld [H_WHOSETURN], a
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a
- callab Func_f429f
+ callab StarterPikachuBattleEntranceAnimation
callab IsPlayerPikachuAsleepInParty
ld e, $24
jr c, .asm_3cd81
diff --git a/engine/battle/end_of_battle.asm b/engine/battle/end_of_battle.asm
index 53a68b64..f4c99e3d 100755
--- a/engine/battle/end_of_battle.asm
+++ b/engine/battle/end_of_battle.asm
@@ -46,7 +46,7 @@ EndOfBattle: ; 13765 (4:7765)
ld [wForceEvolution], a
predef EvolutionAfterBattle
ld d, $82
- callab Func_fce5a
+ callab UpdatePikachuMoodAfterBattle
.resetVariables
xor a
ld [wLowHealthAlarm], a ;disable low health alarm
diff --git a/engine/diploma_3a.asm b/engine/diploma_3a.asm
index c8a7e740..520d9f96 100755
--- a/engine/diploma_3a.asm
+++ b/engine/diploma_3a.asm
@@ -82,11 +82,11 @@ Func_e9ad3:
ld de, Tilemap_e9b3e
coord hl, 6, 2
lb bc, 10, 12
- call Func_e925d
+ call Diploma_Surfing_CopyBox
ld de, Tilemap_e9bb6
coord hl, 5, 13
lb bc, 1, 11
- call Func_e925d
+ call Diploma_Surfing_CopyBox
ld de, String_e9bd5
coord hl, 2, 15
call PlaceString
@@ -105,7 +105,7 @@ Func_e9ad3:
ld de, TileMap_e9bc1
coord hl, 2, 0
lb bc, 4, 5
- call Func_e925d
+ call Diploma_Surfing_CopyBox
ret
Tilemap_e9b3e:
diff --git a/engine/hidden_object_functions14.asm b/engine/hidden_object_functions14.asm
index 0724f962..e69e802c 100755
--- a/engine/hidden_object_functions14.asm
+++ b/engine/hidden_object_functions14.asm
@@ -89,7 +89,7 @@ FightingDojoText: ; 5298a (14:698a)
db "@"
PrintIndigoPlateauHQText: ; 5298f (14:698f)
- ld a, [wSpriteStateData1 + 9]
+ ld a, [wPlayerFacingDirection]
cp SPRITE_FACING_UP
ret nz
call EnableAutoTextBoxDrawing
diff --git a/engine/hidden_object_functions17.asm b/engine/hidden_object_functions17.asm
index 8e5920d5..31f9befc 100755
--- a/engine/hidden_object_functions17.asm
+++ b/engine/hidden_object_functions17.asm
@@ -14,7 +14,7 @@ RedBedroomPCText: ; 5db8e (17:5b8e)
db $fc ; FuncTX_ItemStoragePC
Route15GateLeftBinoculars: ; 5db8f (17:5b8f)
- ld a, [wSpriteStateData1 + 9]
+ ld a, [wPlayerFacingDirection]
cp SPRITE_FACING_UP
ret nz
call EnableAutoTextBoxDrawing
diff --git a/engine/hidden_object_functions18.asm b/engine/hidden_object_functions18.asm
index 443f8369..cdba142b 100755
--- a/engine/hidden_object_functions18.asm
+++ b/engine/hidden_object_functions18.asm
@@ -3,7 +3,7 @@ GymStatues: ; 625e8 (18:65e8)
; if in a gym and don’t have the corresponding badge, a = GymStatueText1_id and jp PrintPredefTextID
; else ret
call EnableAutoTextBoxDrawing
- ld a, [wSpriteStateData1 + 9]
+ ld a, [wPlayerFacingDirection]
cp SPRITE_FACING_UP
ret nz
ld hl, .BadgeFlags
@@ -64,7 +64,7 @@ PrintBenchGuyText: ; 6245d (18:645d)
.match
ld a, [hli]
ld b, a
- ld a, [wSpriteStateData1 + 9]
+ ld a, [wPlayerFacingDirection]
cp b
jr nz, .loop ; player isn't facing left at the bench guy
ld a, [hl]
@@ -192,7 +192,7 @@ BookcaseText: ; 62511 (18:6511)
db "@"
OpenPokemonCenterPC: ; 62516 (18:6516)
- ld a, [wSpriteStateData1 + 9]
+ ld a, [wPlayerFacingDirection]
cp SPRITE_FACING_UP ; check to see if player is facing up
ret nz
call EnableAutoTextBoxDrawing
diff --git a/engine/hidden_object_functions3.asm b/engine/hidden_object_functions3.asm
index e43ae451..78da8274 100755
--- a/engine/hidden_object_functions3.asm
+++ b/engine/hidden_object_functions3.asm
@@ -1,6 +1,6 @@
; prints text for bookshelves in buildings without sign events
PrintBookshelfText: ; f9de (3:79de)
- ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
+ ld a, [wPlayerFacingDirection] ; player's sprite facing direction
cp SPRITE_FACING_UP
jr nz, .noMatch
; facing up
diff --git a/engine/hidden_object_functions7.asm b/engine/hidden_object_functions7.asm
index 7ccfbf01..6e232664 100755
--- a/engine/hidden_object_functions7.asm
+++ b/engine/hidden_object_functions7.asm
@@ -115,7 +115,7 @@ GameOverText: ; 1e3aa (7:63aa)
db "@"
PrintCinnabarQuiz: ; 1e3af (7:63af)
- ld a, [wSpriteStateData1 + 9]
+ ld a, [wPlayerFacingDirection]
cp SPRITE_FACING_UP
ret nz
call EnableAutoTextBoxDrawing
@@ -366,7 +366,7 @@ MagazinesText: ; 1e544 (7:6544)
BillsHousePC: ; 1e549 (7:6549)
call EnableAutoTextBoxDrawing
- ld a, [wSpriteStateData1 + 9]
+ ld a, [wPlayerFacingDirection]
cp SPRITE_FACING_UP
ret nz
CheckEvent EVENT_LEFT_BILLS_HOUSE_AFTER_HELPING
@@ -497,7 +497,7 @@ BillsHousePokemonListText2: ; 1e67f (7:667f)
db "@"
DisplayOakLabEmailText: ; 1e684 (7:6684)
- ld a, [wSpriteStateData1 + 9]
+ ld a, [wPlayerFacingDirection]
cp SPRITE_FACING_UP
ret nz
call EnableAutoTextBoxDrawing
diff --git a/engine/items/items.asm b/engine/items/items.asm
index 31426795..cffcb5b3 100755
--- a/engine/items/items.asm
+++ b/engine/items/items.asm
@@ -1,18 +1,18 @@
UseItem_: ; d2ed (3:52ed)
- ld a,1
- ld [wActionResultOrTookBattleTurn],a ; initialise to success value
- ld a,[wcf91] ;contains item_ID
- cp a,HM_01
- jp nc,ItemUseTMHM
- ld hl,ItemUsePtrTable
+ ld a, 1
+ ld [wActionResultOrTookBattleTurn], a ; initialise to success value
+ ld a, [wcf91] ;contains item_ID
+ cp a, HM_01
+ jp nc, ItemUseTMHM
+ ld hl, ItemUsePtrTable
dec a
add a
- ld c,a
- ld b,0
- add hl,bc
- ld a,[hli]
- ld h,[hl]
- ld l,a
+ ld c, a
+ ld b, 0
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
jp [hl]
ItemUsePtrTable: ; d307 (3:5307)
@@ -101,135 +101,137 @@ ItemUsePtrTable: ; d307 (3:5307)
dw ItemUsePPRestore ; MAX_ELIXER
ItemUseBall: ; d3ad (3:53ad)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jp z,ItemUseNotTime ; not in battle
+ jp z, ItemUseNotTime ; not in battle
dec a
- jp nz,ThrowBallAtTrainerMon
- ld a,[wBattleType]
+ jp nz, ThrowBallAtTrainerMon
+ ld a, [wBattleType]
cp $1
- jr z,.UseBall
+ jr z, .UseBall
cp $4 ; pikachu battle?
- jr z,.UseBall
- ld a,[wPartyCount] ;is Party full?
- cp a,PARTY_LENGTH
- jr nz,.UseBall
- ld a,[wNumInBox] ;is Box full?
- cp a,MONS_PER_BOX
- jp z,BoxFullCannotThrowBall
+ jr z, .UseBall
+ ld a, [wPartyCount] ;is Party full?
+ cp a, PARTY_LENGTH
+ jr nz, .UseBall
+ ld a, [wNumInBox] ;is Box full?
+ cp a, MONS_PER_BOX
+ jp z, BoxFullCannotThrowBall
.UseBall
;ok, you can use a ball
xor a
- ld [wCapturedMonSpecies],a
- ld a,[wBattleType]
- cp a,2 ;SafariBattle
- jr nz,.skipSafariZoneCode
+ ld [wCapturedMonSpecies], a
+ ld a, [wBattleType]
+ cp a, 2 ;SafariBattle
+ jr nz, .skipSafariZoneCode
.safariZone
; remove a Safari Ball from inventory
- ld hl,wNumSafariBalls
+ ld hl, wNumSafariBalls
dec [hl]
.skipSafariZoneCode
call RunDefaultPaletteCommand
- ld a,$43
- ld [wd11e],a
+ ld a, $43
+ ld [wd11e], a
call LoadScreenTilesFromBuffer1 ;restore screenBuffer from Backup
- ld hl,ItemUseText00
+ ld hl, ItemUseText00
call PrintText
callab IsGhostBattle
- ld b,$10
- jp z,.next12
- ld a,[wBattleType]
+ ld b, $10
+ jp z, .next12
+ ld a, [wBattleType]
cp $1
- jr z,.oldManBattle
+ jr z, .oldManBattle
cp $4
- jr z,.oldManBattle ; pikachu battle technically old man battle
+ jr z, .oldManBattle ; pikachu battle technically old man battle
jr .notOldManBattle
+
.oldManBattle
- ld hl,wGrassRate
- ld de,wPlayerName
- ld bc,NAME_LENGTH
+ ld hl, wGrassRate
+ ld de, wPlayerName
+ ld bc, NAME_LENGTH
call CopyData ; save the player's name in the Wild Monster data
ld a, [wBattleType]
cp $1
- jp nz,.BallSuccess
- ld a,$1
+ jp nz, .BallSuccess
+ ld a, $1
ld [wCapturedMonSpecies], a
ld a, [wd74c]
bit 7, a
ld b, $63
- jp nz,.next12
+ jp nz, .next12
jp .BallSuccess
+
.notOldManBattle
- ld a,[wCurMap]
- cp a,POKEMONTOWER_6
- jr nz,.loop
- ld a,[wEnemyMonSpecies2]
- cp a,MAROWAK
- ld b,$10
- jp z,.next12
+ ld a, [wCurMap]
+ cp a, POKEMONTOWER_6
+ jr nz, .loop
+ ld a, [wEnemyMonSpecies2]
+ cp a, MAROWAK
+ ld b, $10
+ jp z, .next12
; if not fighting ghost Marowak, loop until a random number in the current
; pokeball's allowed range is found
.loop
call Random
- ld b,a
- ld hl,wcf91
+ ld b, a
+ ld hl, wcf91
.asm_d54a
- ld a,[hl]
- cp a,MASTER_BALL
- jp z,.BallSuccess
- cp a,POKE_BALL
- jr z,.checkForAilments
- ld a,200
+ ld a, [hl]
+ cp a, MASTER_BALL
+ jp z, .BallSuccess
+ cp a, POKE_BALL
+ jr z, .checkForAilments
+ ld a, 200
cp b
- jr c,.loop ;get only numbers <= 200 for Great Ball
- ld a,[hl]
- cp a,GREAT_BALL
- jr z,.checkForAilments
- ld a,150 ;get only numbers <= 150 for Ultra Ball
+ jr c, .loop ;get only numbers <= 200 for Great Ball
+ ld a, [hl]
+ cp a, GREAT_BALL
+ jr z, .checkForAilments
+ ld a, 150 ;get only numbers <= 150 for Ultra Ball
cp b
- jr c,.loop
+ jr c, .loop
.checkForAilments
; pokemon can be caught more easily with any (primary) status ailment
; Frozen/Asleep pokemon are relatively even easier to catch
; for Frozen/Asleep pokemon, any random number from 0-24 ensures a catch.
; for the others, a random number from 0-11 ensures a catch.
- ld a,[wEnemyMonStatus] ;status ailments
+ ld a, [wEnemyMonStatus] ;status ailments
and a
- jr z,.noAilments
+ jr z, .noAilments
and a, 1 << FRZ | SLP ;is frozen and/or asleep?
- ld c,12
- jr z,.notFrozenOrAsleep
- ld c,25
+ ld c, 12
+ jr z, .notFrozenOrAsleep
+ ld c, 25
.notFrozenOrAsleep
- ld a,b
+ ld a, b
sub c
- jp c,.BallSuccess
- ld b,a
+ jp c, .BallSuccess
+ ld b, a
.noAilments
push bc ;save RANDOM number
xor a
- ld [H_MULTIPLICAND],a
- ld hl,wEnemyMonMaxHP
- ld a,[hli]
- ld [H_MULTIPLICAND + 1],a
- ld a,[hl]
- ld [H_MULTIPLICAND + 2],a
- ld a,255
- ld [H_MULTIPLIER],a
+ ld [H_MULTIPLICAND], a
+ ld hl, wEnemyMonMaxHP
+ ld a, [hli]
+ ld [H_MULTIPLICAND + 1], a
+ ld a, [hl]
+ ld [H_MULTIPLICAND + 2], a
+ ld a, 255
+ ld [H_MULTIPLIER], a
call Multiply ; MaxHP * 255
- ld a,[wcf91]
+ ld a, [wcf91]
cp GREAT_BALL
- ld a,12 ;any other BallFactor
- jr nz,.next7
- ld a,8
+ ld a, 12 ;any other BallFactor
+ jr nz, .next7
+ ld a, 8
.next7
- ld [H_DIVISOR],a
- ld b,4 ; number of bytes in dividend
+ ld [H_DIVISOR], a
+ ld b, 4 ; number of bytes in dividend
call Divide
- ld hl,wEnemyMonHP
- ld a,[hli]
- ld b,a
- ld a,[hl]
+ ld hl, wEnemyMonHP
+ ld a, [hli]
+ ld b, a
+ ld a, [hl]
; explanation: we have a 16-bit value equal to [b << 8 | a].
; This number is divided by 4. The result is 8 bit (reg. a).
@@ -239,242 +241,247 @@ ItemUseBall: ; d3ad (3:53ad)
srl b
rr a ; a = current HP / 4
and a
- jr nz,.next8
+ jr nz, .next8
inc a
.next8
- ld [H_DIVISOR],a
- ld b,4
+ ld [H_DIVISOR], a
+ ld b, 4
call Divide ; ((MaxHP * 255) / BallFactor) / (CurHP / 4)
- ld a,[H_QUOTIENT + 2]
+ ld a, [H_QUOTIENT + 2]
and a
- jr z,.next9
- ld a,255
- ld [H_QUOTIENT + 3],a
+ jr z, .next9
+ ld a, 255
+ ld [H_QUOTIENT + 3], a
.next9
pop bc
- ld a,[wEnemyMonCatchRate] ;enemy: Catch Rate
+ ld a, [wEnemyMonCatchRate] ;enemy: Catch Rate
cp b
- jr c,.next10
- ld a,[H_QUOTIENT + 2]
+ jr c, .next10
+ ld a, [H_QUOTIENT + 2]
and a
- jr nz,.BallSuccess ; if ((MaxHP * 255) / BallFactor) / (CurHP / 4) > 0x255, automatic success
+ jr nz, .BallSuccess ; if ((MaxHP * 255) / BallFactor) / (CurHP / 4) > 0x255, automatic success
call Random
- ld b,a
- ld a,[H_QUOTIENT + 3]
+ ld b, a
+ ld a, [H_QUOTIENT + 3]
cp b
- jr c,.next10
+ jr c, .next10
.BallSuccess
jr .BallSuccess2
+
.next10
- ld a,[H_QUOTIENT + 3]
- ld [wd11e],a
+ ld a, [H_QUOTIENT + 3]
+ ld [wd11e], a
xor a
- ld [H_MULTIPLICAND],a
- ld [H_MULTIPLICAND + 1],a
- ld a,[wEnemyMonCatchRate] ;enemy: Catch Rate
- ld [H_MULTIPLICAND + 2],a
- ld a,100
- ld [H_MULTIPLIER],a
+ ld [H_MULTIPLICAND], a
+ ld [H_MULTIPLICAND + 1], a
+ ld a, [wEnemyMonCatchRate] ;enemy: Catch Rate
+ ld [H_MULTIPLICAND + 2], a
+ ld a, 100
+ ld [H_MULTIPLIER], a
call Multiply ; CatchRate * 100
- ld a,[wcf91]
- ld b,255
+ ld a, [wcf91]
+ ld b, 255
cp POKE_BALL
- jr z,.next11
- ld b,200
+ jr z, .next11
+ ld b, 200
cp GREAT_BALL
- jr z,.next11
- ld b,150
+ jr z, .next11
+ ld b, 150
cp ULTRA_BALL
- jr z,.next11
+ jr z, .next11
.next11
- ld a,b
- ld [H_DIVISOR],a
- ld b,4
+ ld a, b
+ ld [H_DIVISOR], a
+ ld b, 4
call Divide
- ld a,[H_QUOTIENT + 2]
+ ld a, [H_QUOTIENT + 2]
and a
- ld b,$63
- jr nz,.next12
- ld a,[wd11e]
- ld [H_MULTIPLIER],a
+ ld b, $63
+ jr nz, .next12
+ ld a, [wd11e]
+ ld [H_MULTIPLIER], a
call Multiply
- ld a,255
- ld [H_DIVISOR],a
- ld b,4
+ ld a, 255
+ ld [H_DIVISOR], a
+ ld b, 4
call Divide
- ld a,[wEnemyMonStatus] ;status ailments
+ ld a, [wEnemyMonStatus] ;status ailments
and a
- jr z,.next13
+ jr z, .next13
and 1 << FRZ | SLP
- ld b,5
- jr z,.next14
- ld b,10
+ ld b, 5
+ jr z, .next14
+ ld b, 10
.next14
- ld a,[H_QUOTIENT + 3]
+ ld a, [H_QUOTIENT + 3]
add b
- ld [H_QUOTIENT + 3],a
+ ld [H_QUOTIENT + 3], a
.next13
- ld a,[H_QUOTIENT + 3]
- cp a,10
- ld b,$20
- jr c,.next12
- cp a,30
- ld b,$61
- jr c,.next12
- cp a,70
- ld b,$62
- jr c,.next12
- ld b,$63
+ ld a, [H_QUOTIENT + 3]
+ cp a, 10
+ ld b, $20
+ jr c, .next12
+ cp a, 30
+ ld b, $61
+ jr c, .next12
+ cp a, 70
+ ld b, $62
+ jr c, .next12
+ ld b, $63
.next12
- ld a,b
- ld [wPokeBallAnimData],a
+ ld a, b
+ ld [wPokeBallAnimData], a
.BallSuccess2
- ld c,20
+ ld c, 20
call DelayFrames
- ld a,TOSS_ANIM
- ld [wAnimationID],a
+ ld a, TOSS_ANIM
+ ld [wAnimationID], a
xor a
- ld [H_WHOSETURN],a
- ld [wAnimationType],a
- ld [wDamageMultipliers],a
- ld a,[wWhichPokemon]
+ ld [H_WHOSETURN], a
+ ld [wAnimationType], a
+ ld [wDamageMultipliers], a
+ ld a, [wWhichPokemon]
push af
- ld a,[wcf91]
+ ld a, [wcf91]
push af
predef MoveAnimation
pop af
- ld [wcf91],a
+ ld [wcf91], a
pop af
- ld [wWhichPokemon],a
- ld a,[wPokeBallAnimData]
- cp a,$10
- ld hl,ItemUseBallText00
- jp z,.printText0
- cp a,$20
- ld hl,ItemUseBallText01
- jp z,.printText0
- cp a,$61
- ld hl,ItemUseBallText02
- jp z,.printText0
- cp a,$62
- ld hl,ItemUseBallText03
- jp z,.printText0
- cp a,$63
- ld hl,ItemUseBallText04
- jp z,.printText0
- ld hl,wEnemyMonHP ;current HP
- ld a,[hli]
+ ld [wWhichPokemon], a
+ ld a, [wPokeBallAnimData]
+ cp a, $10
+ ld hl, ItemUseBallText00
+ jp z, .printText0
+ cp a, $20
+ ld hl, ItemUseBallText01
+ jp z, .printText0
+ cp a, $61
+ ld hl, ItemUseBallText02
+ jp z, .printText0
+ cp a, $62
+ ld hl, ItemUseBallText03
+ jp z, .printText0
+ cp a, $63
+ ld hl, ItemUseBallText04
+ jp z, .printText0
+ ld hl, wEnemyMonHP ;current HP
+ ld a, [hli]
push af
- ld a,[hli]
+ ld a, [hli]
push af ;backup currentHP...
inc hl
- ld a,[hl]
+ ld a, [hl]
push af ;...and status ailments
push hl
- ld hl,wEnemyBattleStatus3
- bit Transformed,[hl]
- jr z,.next15
- ld a,$4c
- ld [wEnemyMonSpecies2],a
+ ld hl, wEnemyBattleStatus3
+ bit Transformed, [hl]
+ jr z, .next15
+ ld a, $4c
+ ld [wEnemyMonSpecies2], a
jr .next16
+
.next15
- set Transformed,[hl]
- ld hl,wTransformedEnemyMonOriginalDVs
- ld a,[wEnemyMonDVs]
- ld [hli],a
- ld a,[wEnemyMonDVs + 1]
- ld [hl],a
+ set Transformed, [hl]
+ ld hl, wTransformedEnemyMonOriginalDVs
+ ld a, [wEnemyMonDVs]
+ ld [hli], a
+ ld a, [wEnemyMonDVs + 1]
+ ld [hl], a
.next16
- ld a,[wcf91]
+ ld a, [wcf91]
push af
- ld a,[wEnemyMonSpecies2]
- ld [wcf91],a
- ld a,[wEnemyMonLevel]
- ld [wCurEnemyLVL],a
+ ld a, [wEnemyMonSpecies2]
+ ld [wcf91], a
+ ld a, [wEnemyMonLevel]
+ ld [wCurEnemyLVL], a
callab LoadEnemyMonData
pop af
- ld [wcf91],a
+ ld [wcf91], a
pop hl
pop af
- ld [hld],a
+ ld [hld], a
dec hl
pop af
- ld [hld],a
+ ld [hld], a
pop af
- ld [hl],a
- ld a,[wEnemyMonSpecies] ;enemy
- ld [wCapturedMonSpecies],a
- ld [wcf91],a
- ld [wd11e],a
- ld a,[wBattleType]
+ ld [hl], a
+ ld a, [wEnemyMonSpecies] ;enemy
+ ld [wCapturedMonSpecies], a
+ ld [wcf91], a
+ ld [wd11e], a
+ ld a, [wBattleType]
cp $1
- jp z,.printText1 ; just barely out of reach for a relative jump
+ jp z, .printText1 ; just barely out of reach for a relative jump
cp $4
- jr z,.printText1
- ld hl,ItemUseBallText05
+ jr z, .printText1
+ ld hl, ItemUseBallText05
call PrintText
predef IndexToPokedex
- ld a,[wd11e]
+ ld a, [wd11e]
dec a
- ld c,a
- ld b,FLAG_TEST
- ld hl,wPokedexOwned
+ ld c, a
+ ld b, FLAG_TEST
+ ld hl, wPokedexOwned
predef FlagActionPredef
- ld a,c
+ ld a, c
push af
- ld a,[wd11e]
+ ld a, [wd11e]
dec a
- ld c,a
- ld b,FLAG_SET
+ ld c, a
+ ld b, FLAG_SET
predef FlagActionPredef
pop af
and a
- jr nz,.checkParty
- ld hl,ItemUseBallText06
+ jr nz, .checkParty
+ ld hl, ItemUseBallText06
call PrintText
call ClearSprites
- ld a,[wEnemyMonSpecies] ;caught mon_ID
- ld [wd11e],a
+ ld a, [wEnemyMonSpecies] ;caught mon_ID
+ ld [wd11e], a
predef ShowPokedexData
.checkParty
ld a, $1
ld [wd49c], a
ld a, $85
ld [wPikachuMood], a
- ld a,[wPartyCount]
+ ld a, [wPartyCount]
cp PARTY_LENGTH ;is party full?
- jr z,.sendToBox
+ jr z, .sendToBox
xor a ; PLAYER_PARTY_DATA
- ld [wMonDataLocation],a
+ ld [wMonDataLocation], a
call ClearSprites
ld hl, .emptyString
call PrintText
call AddPartyMon ;add mon to Party
jr .End
+
.sendToBox
call ClearSprites
call SendNewMonToBox
- ld hl,ItemUseBallText07
+ ld hl, ItemUseBallText07
ld a, [wd7f1]
bit 0, a
- jr nz,.sendToBox2
- ld hl,ItemUseBallText08
+ jr nz, .sendToBox2
+ ld hl, ItemUseBallText08
.sendToBox2
call PrintText
jr .End
+
.printText1
- ld hl,ItemUseBallText05
+ ld hl, ItemUseBallText05
.printText0
call PrintText
call ClearSprites
.End
- ld a,[wBattleType]
+ ld a, [wBattleType]
and a
ret nz
- ld hl,wNumBagItems
+ ld hl, wNumBagItems
inc a
- ld [wItemQuantity],a
+ ld [wItemQuantity], a
jp RemoveItemFromInventory
+
.emptyString
db "@"
@@ -503,7 +510,7 @@ ItemUseBallText05: ; d6b0 (3:56b0)
;"All right! {MonName} was caught!"
;play sound
TX_FAR _ItemUseBallText05
- db $12,$06
+ db $12, $06
db "@"
ItemUseBallText07: ; d6b7 (3:59b7)
;"X was transferred to Bill's PC"
@@ -518,46 +525,47 @@ ItemUseBallText06: ; d6c1 (3:56c1)
;"New DEX data will be added..."
;play sound
TX_FAR _ItemUseBallText06
- db $13,$06
+ db $13, $06
db "@"
ItemUseTownMap: ; d6c8 (3:56c8)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jp nz,ItemUseNotTime
+ jp nz, ItemUseNotTime
jpba DisplayTownMap
ItemUseBicycle: ; d6d7 (3:56d7)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jp nz,ItemUseNotTime
- ld a,[wWalkBikeSurfState]
- ld [wWalkBikeSurfStateCopy],a
- cp a,2 ; is the player surfing?
- jp z,ItemUseNotTime
+ jp nz, ItemUseNotTime
+ ld a, [wWalkBikeSurfState]
+ ld [wWalkBikeSurfStateCopy], a
+ cp a, 2 ; is the player surfing?
+ jp z, ItemUseNotTime
dec a ; is player already bicycling?
- jr nz,.tryToGetOnBike
+ jr nz, .tryToGetOnBike
.getOffBike
call ItemUseReloadOverworldData
xor a
- ld [wWalkBikeSurfState],a ; change player state to walking
+ ld [wWalkBikeSurfState], a ; change player state to walking
ld a, $00
- ld [wd431], a
+ ld [wPikachuSpawnState], a
call PlayDefaultMusic ; play walking music
- ld hl,GotOffBicycleText
+ ld hl, GotOffBicycleText
jp PrintText
+
.tryToGetOnBike
call IsBikeRidingAllowed
- jp nc,NoCyclingAllowedHere
+ jp nc, NoCyclingAllowedHere
call ItemUseReloadOverworldData
xor a ; no keys pressed
- ld [hJoyHeld],a ; current joypad state
+ ld [hJoyHeld], a ; current joypad state
ld a, $1
- ld [wWalkBikeSurfState],a ; change player state to bicycling
+ ld [wWalkBikeSurfState], a ; change player state to bicycling
call PlayDefaultMusic ; play bike riding music
xor a
- ld [wWalkBikeSurfState],a
- ld hl,GotOnBicycleText
+ ld [wWalkBikeSurfState], a
+ ld hl, GotOnBicycleText
call PrintText
ld a, $1
ld [wWalkBikeSurfState], a
@@ -565,79 +573,82 @@ ItemUseBicycle: ; d6d7 (3:56d7)
; used for Surf out-of-battle effect
ItemUseSurfboard: ; d725 (3:5725)
- ld a,[wWalkBikeSurfState]
- ld [wWalkBikeSurfStateCopy],a
- cp a,2 ; is the player already surfing?
- jr z,.tryToStopSurfing
+ ld a, [wWalkBikeSurfState]
+ ld [wWalkBikeSurfStateCopy], a
+ cp a, 2 ; is the player already surfing?
+ jr z, .tryToStopSurfing
.tryToSurf
call IsNextTileShoreOrWater
- jp nc,SurfingAttemptFailed
- ld hl,TilePairCollisionsWater
+ jp nc, SurfingAttemptFailed
+ ld hl, TilePairCollisionsWater
call CheckForTilePairCollisions
- jp c,SurfingAttemptFailed
+ jp c, SurfingAttemptFailed
.surf
call .makePlayerMoveForward
- ld hl,wd730
- set 7,[hl]
- ld a,2
- ld [wWalkBikeSurfState],a ; change player state to surfing
+ ld hl, wd730
+ set 7, [hl]
+ ld a, 2
+ ld [wWalkBikeSurfState], a ; change player state to surfing
call PlayDefaultMusic ; play surfing music
- ld hl,SurfingGotOnText
+ ld hl, SurfingGotOnText
jp PrintText
+
.tryToStopSurfing
xor a
- ld [hSpriteIndexOrTextID],a
- ld d,16 ; talking range in pixels (normal range)
+ ld [hSpriteIndexOrTextID], a
+ ld d, 16 ; talking range in pixels (normal range)
call IsSpriteInFrontOfPlayer2
- res 7,[hl]
- ld a,[hSpriteIndexOrTextID]
+ res 7, [hl]
+ ld a, [hSpriteIndexOrTextID]
and a ; is there a sprite in the way?
- jr nz,.cannotStopSurfing
- ld hl,TilePairCollisionsWater
+ jr nz, .cannotStopSurfing
+ ld hl, TilePairCollisionsWater
call CheckForTilePairCollisions
- jr c,.cannotStopSurfing
- ld a,[wTileInFrontOfPlayer]
- ld c,a
+ jr c, .cannotStopSurfing
+ ld a, [wTileInFrontOfPlayer]
+ ld c, a
call IsTilePassable
- jr nc,.stopSurfing
+ jr nc, .stopSurfing
.cannotStopSurfing
- ld hl,SurfingNoPlaceToGetOffText
+ ld hl, SurfingNoPlaceToGetOffText
jp PrintText
+
.stopSurfing
call .makePlayerMoveForward
- ld a,$3
- ld [wd431], a
- ld hl,wPikachuOverworldStateFlags
- set 5,[hl]
- ld hl,wd730
- set 7,[hl]
+ ld a, $3
+ ld [wPikachuSpawnState], a
+ ld hl, wPikachuOverworldStateFlags
+ set 5, [hl]
+ ld hl, wd730
+ set 7, [hl]
xor a
- ld [wWalkBikeSurfState],a ; change player state to walking
+ ld [wWalkBikeSurfState], a ; change player state to walking
dec a
- ld [wJoyIgnore],a
+ ld [wJoyIgnore], a
call PlayDefaultMusic ; play walking music
call GBPalWhiteOutWithDelay3
jp LoadWalkingPlayerSpriteGraphics
+
; uses a simulated button press to make the player move forward
.makePlayerMoveForward
- ld a,[wPlayerDirection] ; direction the player is going
- bit PLAYER_DIR_BIT_UP,a
- ld b,D_UP
- jr nz,.storeSimulatedButtonPress
- bit PLAYER_DIR_BIT_DOWN,a
- ld b,D_DOWN
- jr nz,.storeSimulatedButtonPress
- bit PLAYER_DIR_BIT_LEFT,a
- ld b,D_LEFT
- jr nz,.storeSimulatedButtonPress
- ld b,D_RIGHT
+ ld a, [wPlayerDirection] ; direction the player is going
+ bit PLAYER_DIR_BIT_UP, a
+ ld b, D_UP
+ jr nz, .storeSimulatedButtonPress
+ bit PLAYER_DIR_BIT_DOWN, a
+ ld b, D_DOWN
+ jr nz, .storeSimulatedButtonPress
+ bit PLAYER_DIR_BIT_LEFT, a
+ ld b, D_LEFT
+ jr nz, .storeSimulatedButtonPress
+ ld b, D_RIGHT
.storeSimulatedButtonPress
- ld a,b
- ld [wSimulatedJoypadStatesEnd],a
+ ld a, b
+ ld [wSimulatedJoypadStatesEnd], a
xor a
- ld [wWastedByteCD39],a
+ ld [wWastedByteCD39], a
inc a
- ld [wSimulatedJoypadStatesIndex],a
+ ld [wSimulatedJoypadStatesIndex], a
ret
SurfingGotOnText: ; d7c1 (3:57c1)
@@ -652,25 +663,25 @@ ItemUsePokedex: ; d7cb (3:57cb)
predef_jump ShowPokedexMenu
ItemUseEvoStone: ; d7d0 (3:57d0)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jp nz,ItemUseNotTime
- ld a,[wWhichPokemon]
+ jp nz, ItemUseNotTime
+ ld a, [wWhichPokemon]
push af
- ld a,[wcf91]
- ld [wEvoStoneItemID],a
+ ld a, [wcf91]
+ ld [wEvoStoneItemID], a
push af
- ld a,EVO_STONE_PARTY_MENU
- ld [wPartyMenuTypeOrMessageID],a
- ld a,$ff
- ld [wUpdateSpritesEnabled],a
+ ld a, EVO_STONE_PARTY_MENU
+ ld [wPartyMenuTypeOrMessageID], a
+ ld a, $ff
+ ld [wUpdateSpritesEnabled], a
call DisplayPartyMenu
ld a, [wcf91]
ld [wLoadedMon], a
pop bc
- jr c,.canceledItemUse
- ld a,b
- ld [wcf91],a
+ jr c, .canceledItemUse
+ ld a, b
+ ld [wcf91], a
call Func_d85d
jr nc, .noEffect
callab IsThisPartymonStarterPikachu_Party
@@ -687,24 +698,26 @@ ItemUseEvoStone: ; d7d0 (3:57d0)
ld a, $82
ld [wPikachuMood], a
jr .canceledItemUse
+
.notPlayerPikachu
- ld a,SFX_HEAL_AILMENT
+ ld a, SFX_HEAL_AILMENT
call PlaySoundWaitForCurrent
call WaitForSoundToFinish
- ld a,$01
- ld [wForceEvolution],a
+ ld a, $01
+ ld [wForceEvolution], a
callab TryEvolvingMon ; try to evolve pokemon
pop af
- ld [wWhichPokemon],a
- ld hl,wNumBagItems
- ld a,1 ; remove 1 stone
- ld [wItemQuantity],a
+ ld [wWhichPokemon], a
+ ld hl, wNumBagItems
+ ld a, 1 ; remove 1 stone
+ ld [wItemQuantity], a
jp RemoveItemFromInventory
+
.noEffect
call ItemUseNoEffect
.canceledItemUse
xor a
- ld [wActionResultOrTookBattleTurn],a ; item not used
+ ld [wActionResultOrTookBattleTurn], a ; item not used
pop af
ret
@@ -748,6 +761,7 @@ Func_d85d: ; d85d (3:585d)
jr nz, .loop
scf
ret
+
.cannotEvolveWithUsedStone
and a
ret
@@ -757,42 +771,43 @@ RefusingText: ; d8a2 (3:58a2)
db "@"
ItemUseVitamin: ; d8a7 (3:58a7)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jp nz,ItemUseNotTime
+ jp nz, ItemUseNotTime
ItemUseMedicine: ; d8ae (3:58ae)
- ld a,[wPartyCount]
+ ld a, [wPartyCount]
and a
- jp z,Func_e4bf
- ld a,[wWhichPokemon]
+ jp z, Func_e4bf
+ ld a, [wWhichPokemon]
push af
- ld a,[wcf91]
+ ld a, [wcf91]
push af
- ld a,USE_ITEM_PARTY_MENU
- ld [wPartyMenuTypeOrMessageID],a
- ld a,$ff
- ld [wUpdateSpritesEnabled],a
- ld a,[wPseudoItemID]
+ ld a, USE_ITEM_PARTY_MENU
+ ld [wPartyMenuTypeOrMessageID], a
+ ld a, $ff
+ ld [wUpdateSpritesEnabled], a
+ ld a, [wPseudoItemID]
and a ; using Softboiled?
- jr z,.notUsingSoftboiled
+ jr z, .notUsingSoftboiled
; if using softboiled
call GoBackToPartyMenu
jr .getPartyMonDataAddress
+
.notUsingSoftboiled
call DisplayPartyMenu
.getPartyMonDataAddress
- jp c,.canceledItemUse
- ld hl,wPartyMons
- ld bc,wPartyMon2 - wPartyMon1
- ld a,[wWhichPokemon]
+ jp c, .canceledItemUse
+ ld hl, wPartyMons
+ ld bc, wPartyMon2 - wPartyMon1
+ ld a, [wWhichPokemon]
call AddNTimes
- ld a,[wWhichPokemon]
- ld [wUsedItemOnWhichPokemon],a
- ld d,a
- ld a,[wcf91]
- ld e,a
- ld [wd0b5],a
+ ld a, [wWhichPokemon]
+ ld [wUsedItemOnWhichPokemon], a
+ ld d, a
+ ld a, [wcf91]
+ ld e, a
+ ld [wd0b5], a
pop af
push af
cp $28
@@ -804,90 +819,92 @@ ItemUseMedicine: ; d8ae (3:58ae)
pop hl
.asm_d906
pop af
- ld [wcf91],a
+ ld [wcf91], a
pop af
- ld [wWhichPokemon],a
- ld a,[wPseudoItemID]
+ ld [wWhichPokemon], a
+ ld a, [wPseudoItemID]
and a ; using Softboiled?
- jr z,.checkItemType
+ jr z, .checkItemType
; if using softboiled
- ld a,[wWhichPokemon]
+ ld a, [wWhichPokemon]
cp d ; is the pokemon trying to use softboiled on itself?
- jr z,ItemUseMedicine ; if so, force another choice
+ jr z, ItemUseMedicine ; if so, force another choice
.checkItemType
- ld a,[wcf91]
- cp a,REVIVE
- jr nc,.healHP ; if it's a Revive or Max Revive
- cp a,FULL_HEAL
- jr z,.cureStatusAilment ; if it's a Full Heal
- cp a,HP_UP
- jp nc,.useVitamin ; if it's a vitamin or Rare Candy
- cp a,FULL_RESTORE
- jr nc,.healHP ; if it's a Full Restore or one of the potions
+ ld a, [wcf91]
+ cp a, REVIVE
+ jr nc, .healHP ; if it's a Revive or Max Revive
+ cp a, FULL_HEAL
+ jr z, .cureStatusAilment ; if it's a Full Heal
+ cp a, HP_UP
+ jp nc, .useVitamin ; if it's a vitamin or Rare Candy
+ cp a, FULL_RESTORE
+ jr nc, .healHP ; if it's a Full Restore or one of the potions
; fall through if it's one of the status-specifc healing items
.cureStatusAilment
- ld bc,4
- add hl,bc ; hl now points to status
- ld a,[wcf91]
+ ld bc, 4
+ add hl, bc ; hl now points to status
+ ld a, [wcf91]
lb bc, ANTIDOTE_MSG, 1 << PSN
- cp a,ANTIDOTE
- jr z,.checkMonStatus
+ cp a, ANTIDOTE
+ jr z, .checkMonStatus
lb bc, BURN_HEAL_MSG, 1 << BRN
- cp a,BURN_HEAL
- jr z,.checkMonStatus
+ cp a, BURN_HEAL
+ jr z, .checkMonStatus
lb bc, ICE_HEAL_MSG, 1 << FRZ
- cp a,ICE_HEAL
- jr z,.checkMonStatus
+ cp a, ICE_HEAL
+ jr z, .checkMonStatus
lb bc, AWAKENING_MSG, SLP
- cp a,AWAKENING
- jr z,.checkMonStatus
+ cp a, AWAKENING
+ jr z, .checkMonStatus
lb bc, PARALYZ_HEAL_MSG, 1 << PAR
- cp a,PARLYZ_HEAL
- jr z,.checkMonStatus
+ cp a, PARLYZ_HEAL
+ jr z, .checkMonStatus
lb bc, FULL_HEAL_MSG, $ff ; Full Heal
.checkMonStatus
- ld a,[hl] ; pokemon's status
+ ld a, [hl] ; pokemon's status
and c ; does the pokemon have a status ailment the item can cure?
- jp z,.healingItemNoEffect
+ jp z, .healingItemNoEffect
; if the pokemon has a status the item can heal
xor a
- ld [hl],a ; remove the status ailment in the party data
- ld a,b
- ld [wPartyMenuTypeOrMessageID],a ; the message to display for the item used
- ld a,[wPlayerMonNumber]
+ ld [hl], a ; remove the status ailment in the party data
+ ld a, b
+ ld [wPartyMenuTypeOrMessageID], a ; the message to display for the item used
+ ld a, [wPlayerMonNumber]
cp d ; is pokemon the item was used on active in battle?
- jp nz,.doneHealing
+ jp nz, .doneHealing
; if it is active in battle
xor a
- ld [wBattleMonStatus],a ; remove the status ailment in the in-battle pokemon data
+ ld [wBattleMonStatus], a ; remove the status ailment in the in-battle pokemon data
push hl
- ld hl,wPlayerBattleStatus3
- res BadlyPoisoned,[hl] ; heal Toxic status
+ ld hl, wPlayerBattleStatus3
+ res BadlyPoisoned, [hl] ; heal Toxic status
pop hl
- ld bc,30
- add hl,bc ; hl now points to party stats
- ld de,wBattleMonMaxHP
- ld bc,10
+ ld bc, 30
+ add hl, bc ; hl now points to party stats
+ ld de, wBattleMonMaxHP
+ ld bc, 10
call CopyData ; copy party stats to in-battle stat data
predef DoubleOrHalveSelectedStats
jp .doneHealing
+
.healHP
inc hl ; hl = address of current HP
- ld a,[hli]
- ld b,a
- ld [wHPBarOldHP+1],a
- ld a,[hl]
- ld c,a
- ld [wHPBarOldHP],a ; current HP stored at wHPBarOldHP (2 bytes, big-endian)
+ ld a, [hli]
+ ld b, a
+ ld [wHPBarOldHP+1], a
+ ld a, [hl]
+ ld c, a
+ ld [wHPBarOldHP], a ; current HP stored at wHPBarOldHP (2 bytes, big-endian)
or b
- jr nz,.notFainted
+ jr nz, .notFainted
.fainted
- ld a,[wcf91]
- cp a,REVIVE
- jr z,.updateInBattleFaintedData
- cp a,MAX_REVIVE
- jr z,.updateInBattleFaintedData
+ ld a, [wcf91]
+ cp a, REVIVE
+ jr z, .updateInBattleFaintedData
+ cp a, MAX_REVIVE
+ jr z, .updateInBattleFaintedData
jp .healingItemNoEffect
+
.updateInBattleFaintedData
ld a, [wWhichPokemon]
push af
@@ -903,486 +920,499 @@ ItemUseMedicine: ; d8ae (3:58ae)
pop af
ld [wWhichPokemon], a
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jr z,.compareCurrentHPToMaxHP
+ jr z, .compareCurrentHPToMaxHP
push hl
push de
push bc
- ld a,[wUsedItemOnWhichPokemon]
- ld c,a
- ld hl,wPartyFoughtCurrentEnemyFlags
- ld b,FLAG_TEST
+ ld a, [wUsedItemOnWhichPokemon]
+ ld c, a
+ ld hl, wPartyFoughtCurrentEnemyFlags
+ ld b, FLAG_TEST
predef FlagActionPredef
- ld a,c
+ ld a, c
and a
- jr z,.next
- ld a,[wUsedItemOnWhichPokemon]
- ld c,a
- ld hl,wPartyGainExpFlags
- ld b,FLAG_SET
+ jr z, .next
+ ld a, [wUsedItemOnWhichPokemon]
+ ld c, a
+ ld hl, wPartyGainExpFlags
+ ld b, FLAG_SET
predef FlagActionPredef
.next
pop bc
pop de
pop hl
jr .compareCurrentHPToMaxHP
+
.notFainted
- ld a,[wcf91]
- cp a,REVIVE
- jp z,.healingItemNoEffect
- cp a,MAX_REVIVE
- jp z,.healingItemNoEffect
+ ld a, [wcf91]
+ cp a, REVIVE
+ jp z, .healingItemNoEffect
+ cp a, MAX_REVIVE
+ jp z, .healingItemNoEffect
.compareCurrentHPToMaxHP
push hl
push bc
- ld bc,32
- add hl,bc ; hl now points to max HP
+ ld bc, 32
+ add hl, bc ; hl now points to max HP
pop bc
- ld a,[hli]
+ ld a, [hli]
cp b
- jr nz,.skipComparingLSB ; no need to compare the LSB's if the MSB's don't match
- ld a,[hl]
+ jr nz, .skipComparingLSB ; no need to compare the LSB's if the MSB's don't match
+ ld a, [hl]
cp c
.skipComparingLSB
pop hl
- jr nz,.notFullHP
+ jr nz, .notFullHP
.fullHP ; if the pokemon's current HP equals its max HP
- ld a,[wcf91]
- cp a,FULL_RESTORE
- jp nz,.healingItemNoEffect
+ ld a, [wcf91]
+ cp a, FULL_RESTORE
+ jp nz, .healingItemNoEffect
inc hl
inc hl
- ld a,[hld] ; status ailment
+ ld a, [hld] ; status ailment
and a ; does the pokemon have a status ailment?
- jp z,.healingItemNoEffect
- ld a,FULL_HEAL
- ld [wcf91],a
+ jp z, .healingItemNoEffect
+ ld a, FULL_HEAL
+ ld [wcf91], a
dec hl
dec hl
dec hl
jp .cureStatusAilment
+
.notFullHP ; if the pokemon's current HP doesn't equal its max HP
xor a
- ld [wLowHealthAlarm],a ;disable low health alarm
- ld [wChannelSoundIDs + CH4],a
+ ld [wLowHealthAlarm], a ;disable low health alarm
+ ld [wChannelSoundIDs + CH4], a
push hl
push de
- ld bc,32
- add hl,bc ; hl now points to max HP
- ld a,[hli]
- ld [wHPBarMaxHP+1],a
- ld a,[hl]
- ld [wHPBarMaxHP],a ; max HP stored at wHPBarMaxHP (2 bytes, big-endian)
- ld a,[wPseudoItemID]
+ ld bc, 32
+ add hl, bc ; hl now points to max HP
+ ld a, [hli]
+ ld [wHPBarMaxHP+1], a
+ ld a, [hl]
+ ld [wHPBarMaxHP], a ; max HP stored at wHPBarMaxHP (2 bytes, big-endian)
+ ld a, [wPseudoItemID]
and a ; using Softboiled?
- jp z,.notUsingSoftboiled2
+ jp z, .notUsingSoftboiled2
; if using softboiled
- ld hl,wHPBarMaxHP
- ld a,[hli]
+ ld hl, wHPBarMaxHP
+ ld a, [hli]
push af
- ld a,[hli]
+ ld a, [hli]
push af
- ld a,[hli]
+ ld a, [hli]
push af
- ld a,[hl]
+ ld a, [hl]
push af
- ld hl,wPartyMon1MaxHP
- ld a,[wWhichPokemon]
- ld bc,wPartyMon2 - wPartyMon1
+ ld hl, wPartyMon1MaxHP
+ ld a, [wWhichPokemon]
+ ld bc, wPartyMon2 - wPartyMon1
call AddNTimes
- ld a,[hli]
- ld [wHPBarMaxHP + 1],a
- ld [H_DIVIDEND],a
- ld a,[hl]
- ld [wHPBarMaxHP],a
- ld [H_DIVIDEND + 1],a
- ld a,5
- ld [H_DIVISOR],a
- ld b,2 ; number of bytes
+ ld a, [hli]
+ ld [wHPBarMaxHP + 1], a
+ ld [H_DIVIDEND], a
+ ld a, [hl]
+ ld [wHPBarMaxHP], a
+ ld [H_DIVIDEND + 1], a
+ ld a, 5
+ ld [H_DIVISOR], a
+ ld b, 2 ; number of bytes
call Divide ; get 1/5 of max HP of pokemon that used Softboiled
- ld bc,wPartyMon1HP - wPartyMon1MaxHP
- add hl,bc ; hl now points to LSB of current HP of pokemon that used Softboiled
+ ld bc, wPartyMon1HP - wPartyMon1MaxHP
+ add hl, bc ; hl now points to LSB of current HP of pokemon that used Softboiled
; subtract 1/5 of max HP from current HP of pokemon that used Softboiled
- ld a,[H_QUOTIENT + 3]
+ ld a, [H_QUOTIENT + 3]
push af
- ld b,a
- ld a,[hl]
- ld [wHPBarOldHP],a
+ ld b, a
+ ld a, [hl]
+ ld [wHPBarOldHP], a
sub b
- ld [hld],a
- ld [wHPBarNewHP],a
- ld a,[H_QUOTIENT + 2]
- ld b,a
- ld a,[hl]
- ld [wHPBarOldHP+1],a
+ ld [hld], a
+ ld [wHPBarNewHP], a
+ ld a, [H_QUOTIENT + 2]
+ ld b, a
+ ld a, [hl]
+ ld [wHPBarOldHP+1], a
sbc b
- ld [hl],a
- ld [wHPBarNewHP+1],a
+ ld [hl], a
+ ld [wHPBarNewHP+1], a
coord hl, 4, 1
- ld a,[wWhichPokemon]
- ld bc,2 * SCREEN_WIDTH
+ ld a, [wWhichPokemon]
+ ld bc, 2 * SCREEN_WIDTH
call AddNTimes ; calculate coordinates of HP bar of pokemon that used Softboiled
- ld a,SFX_HEAL_HP
+ ld a, SFX_HEAL_HP
call PlaySoundWaitForCurrent
- ld a,[hFlags_0xFFFA]
- set 0,a
- ld [hFlags_0xFFFA],a
- ld a,$02
- ld [wHPBarType],a
+ ld a, [hFlags_0xFFFA]
+ set 0, a
+ ld [hFlags_0xFFFA], a
+ ld a, $02
+ ld [wHPBarType], a
predef UpdateHPBar2 ; animate HP bar decrease of pokemon that used Softboiled
- ld a,[hFlags_0xFFFA]
- res 0,a
- ld [hFlags_0xFFFA],a
+ ld a, [hFlags_0xFFFA]
+ res 0, a
+ ld [hFlags_0xFFFA], a
pop af
- ld b,a ; store heal amount (1/5 of max HP)
- ld hl,wHPBarOldHP + 1
+ ld b, a ; store heal amount (1/5 of max HP)
+ ld hl, wHPBarOldHP + 1
pop af
- ld [hld],a
+ ld [hld], a
pop af
- ld [hld],a
+ ld [hld], a
pop af
- ld [hld],a
+ ld [hld], a
pop af
- ld [hl],a
+ ld [hl], a
jr .addHealAmount
+
.notUsingSoftboiled2
- ld a,[wcf91]
- cp a,SODA_POP
- ld b,60 ; Soda Pop heal amount
- jr z,.addHealAmount
- ld b,80 ; Lemonade heal amount
- jr nc,.addHealAmount
- cp a,FRESH_WATER
- ld b,50 ; Fresh Water heal amount
- jr z,.addHealAmount
- cp a,SUPER_POTION
- ld b,200 ; Hyper Potion heal amount
- jr c,.addHealAmount
- ld b,50 ; Super Potion heal amount
- jr z,.addHealAmount
- ld b,20 ; Potion heal amount
+ ld a, [wcf91]
+ cp a, SODA_POP
+ ld b, 60 ; Soda Pop heal amount
+ jr z, .addHealAmount
+ ld b, 80 ; Lemonade heal amount
+ jr nc, .addHealAmount
+ cp a, FRESH_WATER
+ ld b, 50 ; Fresh Water heal amount
+ jr z, .addHealAmount
+ cp a, SUPER_POTION
+ ld b, 200 ; Hyper Potion heal amount
+ jr c, .addHealAmount
+ ld b, 50 ; Super Potion heal amount
+ jr z, .addHealAmount
+ ld b, 20 ; Potion heal amount
.addHealAmount
pop de
pop hl
- ld a,[hl]
+ ld a, [hl]
add b
- ld [hld],a
- ld [wHPBarNewHP],a
- ld a,[hl]
- ld [wHPBarNewHP+1],a
- jr nc,.noCarry
+ ld [hld], a
+ ld [wHPBarNewHP], a
+ ld a, [hl]
+ ld [wHPBarNewHP+1], a
+ jr nc, .noCarry
inc [hl]
- ld a,[hl]
- ld [wHPBarNewHP + 1],a
+ ld a, [hl]
+ ld [wHPBarNewHP + 1], a
.noCarry
push de
inc hl
- ld d,h
- ld e,l ; de now points to current HP
- ld hl,33
- add hl,de ; hl now points to max HP
- ld a,[wcf91]
- cp a,REVIVE
- jr z,.setCurrentHPToHalfMaxHP
- ld a,[hld]
- ld b,a
- ld a,[de]
+ ld d, h
+ ld e, l ; de now points to current HP
+ ld hl, 33
+ add hl, de ; hl now points to max HP
+ ld a, [wcf91]
+ cp a, REVIVE
+ jr z, .setCurrentHPToHalfMaxHP
+ ld a, [hld]
+ ld b, a
+ ld a, [de]
sub b
dec de
- ld b,[hl]
- ld a,[de]
+ ld b, [hl]
+ ld a, [de]
sbc b
- jr nc,.setCurrentHPToMaxHp ; if current HP exceeds max HP after healing
- ld a,[wcf91]
- cp a,HYPER_POTION
- jr c,.setCurrentHPToMaxHp ; if using a Full Restore or Max Potion
- cp a,MAX_REVIVE
- jr z,.setCurrentHPToMaxHp ; if using a Max Revive
+ jr nc, .setCurrentHPToMaxHp ; if current HP exceeds max HP after healing
+ ld a, [wcf91]
+ cp a, HYPER_POTION
+ jr c, .setCurrentHPToMaxHp ; if using a Full Restore or Max Potion
+ cp a, MAX_REVIVE
+ jr z, .setCurrentHPToMaxHp ; if using a Max Revive
jr .updateInBattleData
+
.setCurrentHPToHalfMaxHP
dec hl
dec de
- ld a,[hli]
+ ld a, [hli]
srl a
- ld [de],a
- ld [wHPBarNewHP+1],a
- ld a,[hl]
+ ld [de], a
+ ld [wHPBarNewHP+1], a
+ ld a, [hl]
rr a
inc de
- ld [de],a
- ld [wHPBarNewHP],a
+ ld [de], a
+ ld [wHPBarNewHP], a
dec de
jr .doneHealingPartyHP
+
.setCurrentHPToMaxHp
- ld a,[hli]
- ld [de],a
- ld [wHPBarNewHP+1],a
+ ld a, [hli]
+ ld [de], a
+ ld [wHPBarNewHP+1], a
inc de
- ld a,[hl]
- ld [de],a
- ld [wHPBarNewHP],a
+ ld a, [hl]
+ ld [de], a
+ ld [wHPBarNewHP], a
dec de
.doneHealingPartyHP ; done updating the pokemon's current HP in the party data structure
- ld a,[wcf91]
- cp a,FULL_RESTORE
- jr nz,.updateInBattleData
- ld bc,-31
- add hl,bc
+ ld a, [wcf91]
+ cp a, FULL_RESTORE
+ jr nz, .updateInBattleData
+ ld bc, -31
+ add hl, bc
xor a
- ld [hl],a ; remove the status ailment in the party data
+ ld [hl], a ; remove the status ailment in the party data
.updateInBattleData
- ld h,d
- ld l,e
+ ld h, d
+ ld l, e
pop de
- ld a,[wPlayerMonNumber]
+ ld a, [wPlayerMonNumber]
cp d ; is pokemon the item was used on active in battle?
- jr nz,.calculateHPBarCoords
+ jr nz, .calculateHPBarCoords
; copy party HP to in-battle HP
- ld a,[hli]
- ld [wBattleMonHP],a
- ld a,[hld]
- ld [wBattleMonHP + 1],a
- ld a,[wcf91]
- cp a,FULL_RESTORE
- jr nz,.calculateHPBarCoords
+ ld a, [hli]
+ ld [wBattleMonHP], a
+ ld a, [hld]
+ ld [wBattleMonHP + 1], a
+ ld a, [wcf91]
+ cp a, FULL_RESTORE
+ jr nz, .calculateHPBarCoords
xor a
- ld [wBattleMonStatus],a ; remove the status ailment in the in-battle pokemon data
+ ld [wBattleMonStatus], a ; remove the status ailment in the in-battle pokemon data
.calculateHPBarCoords
- ld hl,wOAMBuffer + $90
- ld bc,2 * 20
+ ld hl, wOAMBuffer + $90
+ ld bc, 2 * 20
inc d
.calculateHPBarCoordsLoop
- add hl,bc
+ add hl, bc
dec d
- jr nz,.calculateHPBarCoordsLoop
+ jr nz, .calculateHPBarCoordsLoop
jr .doneHealing
+
.healingItemNoEffect
call ItemUseNoEffect
jp .done
+
.doneHealing
- ld a,[wPseudoItemID]
+ ld a, [wPseudoItemID]
and a ; using Softboiled?
- jr nz,.skipRemovingItem ; no item to remove if using Softboiled
+ jr nz, .skipRemovingItem ; no item to remove if using Softboiled
push hl
call RemoveUsedItem
pop hl
.skipRemovingItem
- ld a,[wcf91]
- cp a,FULL_RESTORE
- jr c,.playStatusAilmentCuringSound
- cp a,FULL_HEAL
- jr z,.playStatusAilmentCuringSound
- ld a,SFX_HEAL_HP
+ ld a, [wcf91]
+ cp a, FULL_RESTORE
+ jr c, .playStatusAilmentCuringSound
+ cp a, FULL_HEAL
+ jr z, .playStatusAilmentCuringSound
+ ld a, SFX_HEAL_HP
call PlaySoundWaitForCurrent
- ld a,[hFlags_0xFFFA]
- set 0,a
- ld [hFlags_0xFFFA],a
- ld a,$02
- ld [wHPBarType],a
+ ld a, [hFlags_0xFFFA]
+ set 0, a
+ ld [hFlags_0xFFFA], a
+ ld a, $02
+ ld [wHPBarType], a
predef UpdateHPBar2 ; animate the HP bar lengthening
- ld a,[hFlags_0xFFFA]
- res 0,a
- ld [hFlags_0xFFFA],a
- ld a,REVIVE_MSG
- ld [wPartyMenuTypeOrMessageID],a
- ld a,[wcf91]
- cp a,REVIVE
- jr z,.showHealingItemMessage
- cp a,MAX_REVIVE
- jr z,.showHealingItemMessage
- ld a,POTION_MSG
- ld [wPartyMenuTypeOrMessageID],a
+ ld a, [hFlags_0xFFFA]
+ res 0, a
+ ld [hFlags_0xFFFA], a
+ ld a, REVIVE_MSG
+ ld [wPartyMenuTypeOrMessageID], a
+ ld a, [wcf91]
+ cp a, REVIVE
+ jr z, .showHealingItemMessage
+ cp a, MAX_REVIVE
+ jr z, .showHealingItemMessage
+ ld a, POTION_MSG
+ ld [wPartyMenuTypeOrMessageID], a
jr .showHealingItemMessage
+
.playStatusAilmentCuringSound
- ld a,SFX_HEAL_AILMENT
+ ld a, SFX_HEAL_AILMENT
call PlaySoundWaitForCurrent
.showHealingItemMessage
xor a
- ld [H_AUTOBGTRANSFERENABLED],a
+ ld [H_AUTOBGTRANSFERENABLED], a
call ClearScreen
dec a
- ld [wUpdateSpritesEnabled],a
+ ld [wUpdateSpritesEnabled], a
call RedrawPartyMenu ; redraws the party menu and displays the message
- ld a,1
- ld [H_AUTOBGTRANSFERENABLED],a
- ld c,50
+ ld a, 1
+ ld [H_AUTOBGTRANSFERENABLED], a
+ ld c, 50
call DelayFrames
call WaitForTextScrollButtonPress
jr .done
+
.canceledItemUse
xor a
- ld [wActionResultOrTookBattleTurn],a ; item use failed
+ ld [wActionResultOrTookBattleTurn], a ; item use failed
pop af
pop af
.done
- ld a,[wPseudoItemID]
+ ld a, [wPseudoItemID]
and a ; using Softboiled?
ret nz ; if so, return
call GBPalWhiteOut
- call z,RunDefaultPaletteCommand
- ld a,[wIsInBattle]
+ call z, RunDefaultPaletteCommand
+ ld a, [wIsInBattle]
and a
ret nz
jp ReloadMapData
+
.useVitamin
push hl
- ld a,[hl]
- ld [wd0b5],a
- ld [wd11e],a
- ld bc,33
- add hl,bc ; hl now points to level
- ld a,[hl] ; a = level
- ld [wCurEnemyLVL],a ; store level
+ ld a, [hl]
+ ld [wd0b5], a
+ ld [wd11e], a
+ ld bc, 33
+ add hl, bc ; hl now points to level
+ ld a, [hl] ; a = level
+ ld [wCurEnemyLVL], a ; store level
call GetMonHeader
push de
- ld a,d
- ld hl,wPartyMonNicks
+ ld a, d
+ ld hl, wPartyMonNicks
call GetPartyMonName
pop de
pop hl
- ld a,[wcf91]
- cp a,RARE_CANDY
- jp z,.useRareCandy
+ ld a, [wcf91]
+ cp a, RARE_CANDY
+ jp z, .useRareCandy
push hl
- sub a,HP_UP
+ sub a, HP_UP
add a
- ld bc,17
- add hl,bc
+ ld bc, 17
+ add hl, bc
add l
- ld l,a
- jr nc,.noCarry2
+ ld l, a
+ jr nc, .noCarry2
inc h
.noCarry2
- ld a,10
- ld b,a
- ld a,[hl] ; a = MSB of stat experience of the appropriate stat
- cp a,100 ; is there already at least 25600 (256 * 100) stat experience?
- jr nc,.vitaminNoEffect ; if so, vitamins can't add any more
+ ld a, 10
+ ld b, a
+ ld a, [hl] ; a = MSB of stat experience of the appropriate stat
+ cp a, 100 ; is there already at least 25600 (256 * 100) stat experience?
+ jr nc, .vitaminNoEffect ; if so, vitamins can't add any more
add b ; add 2560 (256 * 10) stat experience
- jr nc,.noCarry3 ; a carry should be impossible here, so this will always jump
- ld a,255
+ jr nc, .noCarry3 ; a carry should be impossible here, so this will always jump
+ ld a, 255
.noCarry3
- ld [hl],a
+ ld [hl], a
pop hl
call .recalculateStats
- ld hl,VitaminText
- ld a,[wcf91]
- sub a,HP_UP - 1
- ld c,a
+ ld hl, VitaminText
+ ld a, [wcf91]
+ sub a, HP_UP - 1
+ ld c, a
.statNameLoop ; loop to get the address of the name of the stat the vitamin increases
dec c
- jr z,.gotStatName
+ jr z, .gotStatName
.statNameInnerLoop
- ld a,[hli]
- ld b,a
- ld a,$50
+ ld a, [hli]
+ ld b, a
+ ld a, $50
cp b
- jr nz,.statNameInnerLoop
+ jr nz, .statNameInnerLoop
jr .statNameLoop
+
.gotStatName
- ld de,wcf4b
- ld bc,10
+ ld de, wcf4b
+ ld bc, 10
call CopyData ; copy the stat's name to wcf4b
- ld a,SFX_HEAL_AILMENT
+ ld a, SFX_HEAL_AILMENT
call PlaySound
- ld hl,VitaminStatRoseText
+ ld hl, VitaminStatRoseText
call PrintText
jp RemoveUsedItem
+
.vitaminNoEffect
pop hl
- ld hl,VitaminNoEffectText
+ ld hl, VitaminNoEffectText
call PrintText
jp GBPalWhiteOut
+
.recalculateStats
- ld bc,34
- add hl,bc
- ld d,h
- ld e,l ; de now points to stats
- ld bc,-18
- add hl,bc ; hl now points to byte 3 of experience
- ld b,1
+ ld bc, 34
+ add hl, bc
+ ld d, h
+ ld e, l ; de now points to stats
+ ld bc, -18
+ add hl, bc ; hl now points to byte 3 of experience
+ ld b, 1
jp CalcStats ; recalculate stats
.useRareCandy
push hl
- ld bc,33
- add hl,bc ; hl now points to level
- ld a,[hl] ; a = level
+ ld bc, 33
+ add hl, bc ; hl now points to level
+ ld a, [hl] ; a = level
cp a, MAX_LEVEL
- jr z,.vitaminNoEffect ; can't raise level above 100
+ jr z, .vitaminNoEffect ; can't raise level above 100
inc a
- ld [hl],a ; store incremented level
- ld [wCurEnemyLVL],a
+ ld [hl], a ; store incremented level
+ ld [wCurEnemyLVL], a
push hl
push de
- ld d,a
+ ld d, a
callab CalcExperience ; calculate experience for next level and store it at $ff96
pop de
pop hl
- ld bc,-19
- add hl,bc ; hl now points to experience
+ ld bc, -19
+ add hl, bc ; hl now points to experience
; update experience to minimum for new level
- ld a,[hExperience]
- ld [hli],a
- ld a,[hExperience + 1]
- ld [hli],a
- ld a,[hExperience + 2]
- ld [hl],a
+ ld a, [hExperience]
+ ld [hli], a
+ ld a, [hExperience + 1]
+ ld [hli], a
+ ld a, [hExperience + 2]
+ ld [hl], a
pop hl
- ld a,[wWhichPokemon]
+ ld a, [wWhichPokemon]
push af
- ld a,[wcf91]
+ ld a, [wcf91]
push af
push de
push hl
- ld bc,34
- add hl,bc ; hl now points to MSB of max HP
- ld a,[hli]
- ld b,a
- ld c,[hl]
+ ld bc, 34
+ add hl, bc ; hl now points to MSB of max HP
+ ld a, [hli]
+ ld b, a
+ ld c, [hl]
pop hl
push bc
push hl
call .recalculateStats
pop hl
- ld bc,35 ; hl now points to LSB of max HP
- add hl,bc
+ ld bc, 35 ; hl now points to LSB of max HP
+ add hl, bc
pop bc
- ld a,[hld]
+ ld a, [hld]
sub c
- ld c,a
- ld a,[hl]
+ ld c, a
+ ld a, [hl]
sbc b
- ld b,a ; bc = the amount of max HP gained from leveling up
+ ld b, a ; bc = the amount of max HP gained from leveling up
; add the amount gained to the current HP
- ld de,-32
- add hl,de ; hl now points to MSB of current HP
- ld a,[hl]
+ ld de, -32
+ add hl, de ; hl now points to MSB of current HP
+ ld a, [hl]
add c
- ld [hld],a
- ld a,[hl]
+ ld [hld], a
+ ld a, [hl]
adc b
- ld [hl],a
- ld a,RARE_CANDY_MSG
- ld [wPartyMenuTypeOrMessageID],a
+ ld [hl], a
+ ld a, RARE_CANDY_MSG
+ ld [wPartyMenuTypeOrMessageID], a
call RedrawPartyMenu
pop de
- ld a,d
- ld [wWhichPokemon],a
- ld a,e
- ld [wd11e],a
+ ld a, d
+ ld [wWhichPokemon], a
+ ld a, e
+ ld [wd11e], a
xor a ; PLAYER_PARTY_DATA
- ld [wMonDataLocation],a
+ ld [wMonDataLocation], a
call LoadMonData
- ld d,$01
+ ld d, $01
callab PrintStatsBox ; display new stats text box
call WaitForTextScrollButtonPress ; wait for button press
xor a ; PLAYER_PARTY_DATA
- ld [wMonDataLocation],a
+ ld [wMonDataLocation], a
predef LearnMoveFromLevelUp ; learn level up move, if any
xor a
- ld [wForceEvolution],a
+ ld [wForceEvolution], a
callabd_ModifyPikachuHappiness PIKAHAPPY_LEVELUP
ld a, [wWhichPokemon]
push af
@@ -1390,15 +1420,15 @@ ItemUseMedicine: ; d8ae (3:58ae)
ld [wWhichPokemon], a
callab Func_2fd6a ; evolve pokemon, if appropriate
pop af
- ld [wWhichPokemon],a
+ ld [wWhichPokemon], a
callab TryEvolvingMon
- ld a,$01
- ld [wUpdateSpritesEnabled],a
+ ld a, $01
+ ld [wUpdateSpritesEnabled], a
pop af
- ld [wcf91],a
+ ld [wcf91], a
pop af
- ld [wWhichPokemon],a
+ ld [wWhichPokemon], a
jp RemoveUsedItem
VitaminStatRoseText: ; dd44 (3:5d44)
@@ -1417,50 +1447,50 @@ VitaminText: ; dd4e (3:5d4e)
db "SPECIAL@"
ItemUseBait: ; dd72 (3:5d72)
- ld hl,ThrewBaitText
+ ld hl, ThrewBaitText
call PrintText
- ld hl,wEnemyMonCatchRate ; catch rate
+ ld hl, wEnemyMonCatchRate ; catch rate
srl [hl] ; halve catch rate
- ld a,BAIT_ANIM
- ld hl,wSafariBaitFactor ; bait factor
- ld de,wSafariEscapeFactor ; escape factor
+ ld a, BAIT_ANIM
+ ld hl, wSafariBaitFactor ; bait factor
+ ld de, wSafariEscapeFactor ; escape factor
jr BaitRockCommon
ItemUseRock: ; dd87 (3:5d87)
- ld hl,ThrewRockText
+ ld hl, ThrewRockText
call PrintText
- ld hl,wEnemyMonCatchRate ; catch rate
- ld a,[hl]
+ ld hl, wEnemyMonCatchRate ; catch rate
+ ld a, [hl]
add a ; double catch rate
- jr nc,.noCarry
- ld a,$ff
+ jr nc, .noCarry
+ ld a, $ff
.noCarry
- ld [hl],a
- ld a,ROCK_ANIM
- ld hl,wSafariEscapeFactor ; escape factor
- ld de,wSafariBaitFactor ; bait factor
+ ld [hl], a
+ ld a, ROCK_ANIM
+ ld hl, wSafariEscapeFactor ; escape factor
+ ld de, wSafariBaitFactor ; bait factor
BaitRockCommon: ; dd9f (3:5d9f)
- ld [wAnimationID],a
+ ld [wAnimationID], a
xor a
- ld [wAnimationType],a
- ld [H_WHOSETURN],a
- ld [de],a ; zero escape factor (for bait), zero bait factor (for rock)
+ ld [wAnimationType], a
+ ld [H_WHOSETURN], a
+ ld [de], a ; zero escape factor (for bait), zero bait factor (for rock)
.randomLoop ; loop until a random number less than 5 is generated
call Random
- and a,7
- cp a,5
- jr nc,.randomLoop
+ and a, 7
+ cp a, 5
+ jr nc, .randomLoop
inc a ; increment the random number, giving a range from 1 to 5 inclusive
- ld b,a
- ld a,[hl]
+ ld b, a
+ ld a, [hl]
add b ; increase bait factor (for bait), increase escape factor (for rock)
- jr nc,.noCarry
- ld a,$ff
+ jr nc, .noCarry
+ ld a, $ff
.noCarry
- ld [hl],a
+ ld [hl], a
predef MoveAnimation ; do animation
- ld c,70
+ ld c, 70
jp DelayFrames
ThrewBaitText: ; ddc6 (3:5dc6)
@@ -1473,46 +1503,47 @@ ThrewRockText: ; ddca (3:5dca)
; also used for Dig out-of-battle effect
ItemUseEscapeRope: ; ddcf (3:5dcf)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jr nz,.notUsable
- ld a,[wCurMap]
- cp a,AGATHAS_ROOM
- jr z,.notUsable
- cp a,BILLS_HOUSE
- jr z,.notUsable
- cp a,POKEMON_FAN_CLUB
- jr z,.notUsable
- ld a,[wCurMapTileset]
- ld b,a
- ld hl,EscapeRopeTilesets
+ jr nz, .notUsable
+ ld a, [wCurMap]
+ cp a, AGATHAS_ROOM
+ jr z, .notUsable
+ cp a, BILLS_HOUSE
+ jr z, .notUsable
+ cp a, POKEMON_FAN_CLUB
+ jr z, .notUsable
+ ld a, [wCurMapTileset]
+ ld b, a
+ ld hl, EscapeRopeTilesets
.loop
- ld a,[hli]
- cp a,$ff
- jr z,.notUsable
+ ld a, [hli]
+ cp a, $ff
+ jr z, .notUsable
cp b
- jr nz,.loop
- ld hl,wd732
- set 3,[hl]
- set 6,[hl]
+ jr nz, .loop
+ ld hl, wd732
+ set 3, [hl]
+ set 6, [hl]
call Func_1510
- ld hl,wd72e
- res 4,[hl]
- ld hl,wd790
- res 7,[hl]
+ ld hl, wd72e
+ res 4, [hl]
+ ld hl, wd790
+ res 7, [hl]
xor a
- ld [wNumSafariBalls],a
- ld [wSafariZoneEntranceCurScript],a
+ ld [wNumSafariBalls], a
+ ld [wSafariZoneEntranceCurScript], a
inc a
- ld [wEscapedFromBattle],a
- ld [wActionResultOrTookBattleTurn],a ; item used
- ld a,[wPseudoItemID]
+ ld [wEscapedFromBattle], a
+ ld [wActionResultOrTookBattleTurn], a ; item used
+ ld a, [wPseudoItemID]
and a ; using Dig?
ret nz ; if so, return
call ItemUseReloadOverworldData
- ld c,30
+ ld c, 30
call DelayFrames
jp RemoveUsedItem
+
.notUsable
jp ItemUseNotTime
@@ -1521,23 +1552,23 @@ EscapeRopeTilesets: ; de28 (3:5e28)
db $ff ; terminator
ItemUseRepel: ; de2e (3:5e2e)
- ld b,100
+ ld b, 100
ItemUseRepelCommon: ; e005 (3:6005)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jp nz,ItemUseNotTime
- ld a,b
- ld [wRepelRemainingSteps],a
+ jp nz, ItemUseNotTime
+ ld a, b
+ ld [wRepelRemainingSteps], a
jp PrintItemUseTextAndRemoveItem
; handles X Accuracy item
ItemUseXAccuracy: ; de3e (3:5e3e)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jp z,ItemUseNotTime
- ld hl,wPlayerBattleStatus2
- set UsingXAccuracy,[hl] ; X Accuracy bit
+ jp z, ItemUseNotTime
+ ld hl, wPlayerBattleStatus2
+ set UsingXAccuracy, [hl] ; X Accuracy bit
callabd_ModifyPikachuHappiness PIKAHAPPY_USEDXITEM
jp PrintItemUseTextAndRemoveItem
@@ -1545,40 +1576,43 @@ ItemUseXAccuracy: ; de3e (3:5e3e)
; The Card Key is handled in a different way.
ItemUseCardKey: ; de57 (3:de57)
xor a
- ld [wUnusedD71F],a
+ ld [wUnusedD71F], a
call GetTileAndCoordsInFrontOfPlayer
- ld a,[GetTileAndCoordsInFrontOfPlayer] ; $4586
- cp a,$18
- jr nz,.next0
- ld hl,CardKeyTable1
+ ld a, [GetTileAndCoordsInFrontOfPlayer] ; $4586
+ cp a, $18
+ jr nz, .next0
+ ld hl, CardKeyTable1
jr .next1
+
.next0
- cp a,$24
- jr nz,.next2
- ld hl,CardKeyTable2
+ cp a, $24
+ jr nz, .next2
+ ld hl, CardKeyTable2
jr .next1
+
.next2
- cp a,$5e
- jp nz,ItemUseNotTime
- ld hl,CardKeyTable3
+ cp a, $5e
+ jp nz, ItemUseNotTime
+ ld hl, CardKeyTable3
.next1
- ld a,[wCurMap]
- ld b,a
+ ld a, [wCurMap]
+ ld b, a
.loop
- ld a,[hli]
- cp a,$ff
- jp z,ItemUseNotTime
+ ld a, [hli]
+ cp a, $ff
+ jp z, ItemUseNotTime
cp b
- jr nz,.nextEntry1
- ld a,[hli]
+ jr nz, .nextEntry1
+ ld a, [hli]
cp d
- jr nz,.nextEntry2
- ld a,[hli]
+ jr nz, .nextEntry2
+ ld a, [hli]
cp e
- jr nz,.nextEntry3
- ld a,[hl]
- ld [wUnusedD71F],a
+ jr nz, .nextEntry3
+ ld a, [hl]
+ ld [wUnusedD71F], a
jr .done
+
.nextEntry1
inc hl
.nextEntry2
@@ -1586,11 +1620,12 @@ ItemUseCardKey: ; de57 (3:de57)
.nextEntry3
inc hl
jr .loop
+
.done
- ld hl,ItemUseText00
+ ld hl, ItemUseText00
call PrintText
- ld hl,wd728
- set 7,[hl]
+ ld hl, wd728
+ set 7, [hl]
ret
; These tables are probably supposed to be door locations in Silph Co.,
@@ -1604,48 +1639,48 @@ ItemUseCardKey: ; de57 (3:de57)
; 03: ID?
CardKeyTable1: ; dea7 (3:5ea7)
- db SILPH_CO_2F,$04,$04,$00
- db SILPH_CO_2F,$04,$05,$01
- db SILPH_CO_4F,$0C,$04,$02
- db SILPH_CO_4F,$0C,$05,$03
- db SILPH_CO_7F,$06,$0A,$04
- db SILPH_CO_7F,$06,$0B,$05
- db SILPH_CO_9F,$04,$12,$06
- db SILPH_CO_9F,$04,$13,$07
- db SILPH_CO_10F,$08,$0A,$08
- db SILPH_CO_10F,$08,$0B,$09
+ db SILPH_CO_2F, $04, $04, $00
+ db SILPH_CO_2F, $04, $05, $01
+ db SILPH_CO_4F, $0C, $04, $02
+ db SILPH_CO_4F, $0C, $05, $03
+ db SILPH_CO_7F, $06, $0A, $04
+ db SILPH_CO_7F, $06, $0B, $05
+ db SILPH_CO_9F, $04, $12, $06
+ db SILPH_CO_9F, $04, $13, $07
+ db SILPH_CO_10F, $08, $0A, $08
+ db SILPH_CO_10F, $08, $0B, $09
db $ff
CardKeyTable2: ; ded0 (3:5ed0)
- db SILPH_CO_3F,$08,$09,$0A
- db SILPH_CO_3F,$09,$09,$0B
- db SILPH_CO_5F,$04,$07,$0C
- db SILPH_CO_5F,$05,$07,$0D
- db SILPH_CO_6F,$0C,$05,$0E
- db SILPH_CO_6F,$0D,$05,$0F
- db SILPH_CO_8F,$08,$07,$10
- db SILPH_CO_8F,$09,$07,$11
- db SILPH_CO_9F,$08,$03,$12
- db SILPH_CO_9F,$09,$03,$13
+ db SILPH_CO_3F, $08, $09, $0A
+ db SILPH_CO_3F, $09, $09, $0B
+ db SILPH_CO_5F, $04, $07, $0C
+ db SILPH_CO_5F, $05, $07, $0D
+ db SILPH_CO_6F, $0C, $05, $0E
+ db SILPH_CO_6F, $0D, $05, $0F
+ db SILPH_CO_8F, $08, $07, $10
+ db SILPH_CO_8F, $09, $07, $11
+ db SILPH_CO_9F, $08, $03, $12
+ db SILPH_CO_9F, $09, $03, $13
db $ff
CardKeyTable3: ; def9 (3:5ef9)
- db SILPH_CO_11F,$08,$09,$14
- db SILPH_CO_11F,$09,$09,$15
+ db SILPH_CO_11F, $08, $09, $14
+ db SILPH_CO_11F, $09, $09, $15
db $ff
ItemUsePokedoll: ; df02 (3:5f02)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
dec a
- jp nz,ItemUseNotTime
- ld a,$01
- ld [wEscapedFromBattle],a
+ jp nz, ItemUseNotTime
+ ld a, $01
+ ld [wEscapedFromBattle], a
jp PrintItemUseTextAndRemoveItem
ItemUseGuardSpec: ; df11 (3:5f11)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jp z,ItemUseNotTime
+ jp z, ItemUseNotTime
ld a, [wWhichPokemon]
push af
@@ -1655,22 +1690,22 @@ ItemUseGuardSpec: ; df11 (3:5f11)
pop af
ld [wWhichPokemon], a
- ld hl,wPlayerBattleStatus2
- set ProtectedByMist,[hl] ; Mist bit
+ ld hl, wPlayerBattleStatus2
+ set ProtectedByMist, [hl] ; Mist bit
jp PrintItemUseTextAndRemoveItem
ItemUseSuperRepel: ; df38 (3:5f38)
- ld b,200
+ ld b, 200
jp ItemUseRepelCommon
ItemUseMaxRepel: ; df3d (3:5f3d)
- ld b,250
+ ld b, 250
jp ItemUseRepelCommon
ItemUseDireHit: ; df42 (3:5f42)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jp z,ItemUseNotTime
+ jp z, ItemUseNotTime
ld a, [wWhichPokemon]
push af
@@ -1680,35 +1715,36 @@ ItemUseDireHit: ; df42 (3:5f42)
pop af
ld [wWhichPokemon], a
- ld hl,wPlayerBattleStatus2
- set GettingPumped,[hl] ; Focus Energy bit
+ ld hl, wPlayerBattleStatus2
+ set GettingPumped, [hl] ; Focus Energy bit
jp PrintItemUseTextAndRemoveItem
ItemUseXStat: ; df69 (3:df69)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jr nz,.inBattle
+ jr nz, .inBattle
call ItemUseNotTime
- ld a,2
- ld [wActionResultOrTookBattleTurn],a ; item not used
+ ld a, 2
+ ld [wActionResultOrTookBattleTurn], a ; item not used
ret
+
.inBattle
- ld hl,wPlayerMoveNum
- ld a,[hli]
+ ld hl, wPlayerMoveNum
+ ld a, [hli]
push af ; save [wPlayerMoveNum]
- ld a,[hl]
+ ld a, [hl]
push af ; save [wPlayerMoveEffect]
push hl
- ld a,[wcf91]
- sub a,X_ATTACK - ATTACK_UP1_EFFECT
- ld [hl],a ; store player move effect
+ ld a, [wcf91]
+ sub a, X_ATTACK - ATTACK_UP1_EFFECT
+ ld [hl], a ; store player move effect
call PrintItemUseTextAndRemoveItem
- ld a,XSTATITEM_ANIM ; X stat item animation ID
- ld [wPlayerMoveNum],a
+ ld a, XSTATITEM_ANIM ; X stat item animation ID
+ ld [wPlayerMoveNum], a
call LoadScreenTilesFromBuffer1 ; restore saved screen
call Delay3
xor a
- ld [H_WHOSETURN],a ; set turn to player's turn
+ ld [H_WHOSETURN], a ; set turn to player's turn
callba StatModifierUpEffect ; do stat increase move
ld a, [wWhichPokemon]
@@ -1721,110 +1757,114 @@ ItemUseXStat: ; df69 (3:df69)
pop hl
pop af
- ld [hld],a ; restore [wPlayerMoveEffect]
+ ld [hld], a ; restore [wPlayerMoveEffect]
pop af
- ld [hl],a ; restore [wPlayerMoveNum]
+ ld [hl], a ; restore [wPlayerMoveNum]
ret
ItemUsePokeflute: ; dfbd (3:5fbd)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jr nz,.inBattle
+ jr nz, .inBattle
; if not in battle
call ItemUseReloadOverworldData
- ld a,[wCurMap]
- cp a,ROUTE_12
- jr nz,.notRoute12
+ ld a, [wCurMap]
+ cp a, ROUTE_12
+ jr nz, .notRoute12
ld a, [wd7d8]
bit 7, a
- jr nz,.noSnorlaxOrPikachuToWakeUp
+ jr nz, .noSnorlaxOrPikachuToWakeUp
; if the player hasn't beaten Route 12 Snorlax
- ld hl,Route12SnorlaxFluteCoords
+ ld hl, Route12SnorlaxFluteCoords
call ArePlayerCoordsInArray
- jr nc,.noSnorlaxOrPikachuToWakeUp
- ld hl,PlayedFluteHadEffectText
+ jr nc, .noSnorlaxOrPikachuToWakeUp
+ ld hl, PlayedFluteHadEffectText
call PrintText
ld hl, wd7d8
set 6, [hl]
ret
+
.notRoute12
- cp a,ROUTE_16
- jr nz,.notRoute16
+ cp a, ROUTE_16
+ jr nz, .notRoute16
ld a, [wd7e0]
bit 1, a
- jr nz,.noSnorlaxOrPikachuToWakeUp
+ jr nz, .noSnorlaxOrPikachuToWakeUp
; if the player hasn't beaten Route 16 Snorlax
- ld hl,Route16SnorlaxFluteCoords
+ ld hl, Route16SnorlaxFluteCoords
call ArePlayerCoordsInArray
- jr nc,.noSnorlaxOrPikachuToWakeUp
- ld hl,PlayedFluteHadEffectText
+ jr nc, .noSnorlaxOrPikachuToWakeUp
+ ld hl, PlayedFluteHadEffectText
call PrintText
ld hl, wd7e0
set 0, [hl]
ret
+
.notRoute16
- cp a,PEWTER_POKECENTER
- jr nz,.noSnorlaxOrPikachuToWakeUp
+ cp a, PEWTER_POKECENTER
+ jr nz, .noSnorlaxOrPikachuToWakeUp
call CheckPikachuFollowingPlayer
- jr z,.noSnorlaxOrPikachuToWakeUp
- callab Func_fcb01
- jr nc,.noSnorlaxOrPikachuToWakeUp
+ jr z, .noSnorlaxOrPikachuToWakeUp
+ callab IsPikachuRightNextToPlayer
+ jr nc, .noSnorlaxOrPikachuToWakeUp
ld hl, PlayedFluteHadEffectText
call PrintText
call ItemUseReloadOverworldData
ld e, $1a
callab Func_fd001
ret
+
.noSnorlaxOrPikachuToWakeUp
- ld hl,PlayedFluteNoEffectText
+ ld hl, PlayedFluteNoEffectText
jp PrintText
+
.inBattle
xor a
- ld [wWereAnyMonsAsleep],a
- ld b,~SLP & $ff
- ld hl,wPartyMon1Status
+ ld [wWereAnyMonsAsleep], a
+ ld b, $ff ^ SLP
+ ld hl, wPartyMon1Status
call WakeUpEntireParty
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
dec a ; is it a trainer battle?
- jr z,.skipWakingUpEnemyParty
+ jr z, .skipWakingUpEnemyParty
; if it's a trainer battle
- ld hl,wEnemyMon1Status
+ ld hl, wEnemyMon1Status
call WakeUpEntireParty
.skipWakingUpEnemyParty
- ld hl,wBattleMonStatus
- ld a,[hl]
+ ld hl, wBattleMonStatus
+ ld a, [hl]
and b ; remove Sleep status
- ld [hl],a
- ld hl,wEnemyMonStatus
- ld a,[hl]
- ld c,a
+ ld [hl], a
+ ld hl, wEnemyMonStatus
+ ld a, [hl]
+ ld c, a
and b ; remove Sleep status
- ld [hl],a
- ld a,c
- and a,SLP
- jr z,.asm_e063
- ld a,$1
- ld [wWereAnyMonsAsleep],a
+ ld [hl], a
+ ld a, c
+ and a, SLP
+ jr z, .asm_e063
+ ld a, $1
+ ld [wWereAnyMonsAsleep], a
.asm_e063
call LoadScreenTilesFromBuffer2 ; restore saved screen
- ld a,[wWereAnyMonsAsleep]
+ ld a, [wWereAnyMonsAsleep]
and a ; were any pokemon asleep before playing the flute?
- ld hl,PlayedFluteNoEffectText
- jp z,PrintText ; if no pokemon were asleep
+ ld hl, PlayedFluteNoEffectText
+ jp z, PrintText ; if no pokemon were asleep
; if some pokemon were asleep
- ld hl,PlayedFluteHadEffectText
+ ld hl, PlayedFluteHadEffectText
call PrintText
- ld a,[wLowHealthAlarm]
- and a,$80
- jr nz,.skipMusic
+ ld a, [wLowHealthAlarm]
+ and a, $80
+ jr nz, .skipMusic
call WaitForSoundToFinish ; wait for sound to end
callba Music_PokeFluteInBattle ; play in-battle pokeflute music
.musicWaitLoop ; wait for music to finish playing
- ld a,[wChannelSoundIDs + CH6]
+ ld a, [wChannelSoundIDs + CH6]
and a ; music off?
- jr nz,.musicWaitLoop
+ jr nz, .musicWaitLoop
.skipMusic
- ld hl,FluteWokeUpText
+ ld hl, FluteWokeUpText
jp PrintText
; wakes up all party pokemon
@@ -1835,40 +1875,40 @@ ItemUsePokeflute: ; dfbd (3:5fbd)
; OUTPUT:
; [wWereAnyMonsAsleep]: set to 1 if any pokemon were asleep
WakeUpEntireParty: ; e094 (3:6094)
- ld de,44
- ld c,6
+ ld de, 44
+ ld c, 6
.loop
- ld a,[hl]
+ ld a, [hl]
push af
- and a,SLP ; is pokemon asleep?
- jr z,.notAsleep
- ld a,1
- ld [wWereAnyMonsAsleep],a ; indicate that a pokemon had to be woken up
+ and a, SLP ; is pokemon asleep?
+ jr z, .notAsleep
+ ld a, 1
+ ld [wWereAnyMonsAsleep], a ; indicate that a pokemon had to be woken up
.notAsleep
pop af
and b ; remove Sleep status
- ld [hl],a
- add hl,de
+ ld [hl], a
+ add hl, de
dec c
- jr nz,.loop
+ jr nz, .loop
ret
; Format:
; 00: Y
; 01: X
Route12SnorlaxFluteCoords: ; e0ac (3:60ac)
- db 62,9 ; one space West of Snorlax
- db 61,10 ; one space North of Snorlax
- db 63,10 ; one space South of Snorlax
- db 62,11 ; one space East of Snorlax
+ db 62, 9 ; one space West of Snorlax
+ db 61, 10 ; one space North of Snorlax
+ db 63, 10 ; one space South of Snorlax
+ db 62, 11 ; one space East of Snorlax
db $ff ; terminator
; Format:
; 00: Y
; 01: X
Route16SnorlaxFluteCoords: ; e0b5 (3:60b5)
- db 10,27 ; one space East of Snorlax
- db 10,25 ; one space West of Snorlax
+ db 10, 27 ; one space East of Snorlax
+ db 10, 25 ; one space West of Snorlax
db $ff ; terminator
PlayedFluteNoEffectText: ; e0ba (3:60ba)
@@ -1883,27 +1923,27 @@ PlayedFluteHadEffectText: ; e0c4 (3:60c4)
TX_FAR _PlayedFluteHadEffectText
db $06
TX_ASM
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jr nz,.done
+ jr nz, .done
; play out-of-battle pokeflute music
call StopAllMusic ; turn off music
ld a, SFX_POKEFLUTE
ld c, BANK(SFX_Pokeflute)
call PlayMusic
.musicWaitLoop ; wait for music to finish playing
- ld a,[wChannelSoundIDs + CH2]
+ ld a, [wChannelSoundIDs + CH2]
cp a, SFX_POKEFLUTE
- jr z,.musicWaitLoop
+ jr z, .musicWaitLoop
call PlayDefaultMusic ; start playing normal music again
.done
jp TextScriptEnd ; end text
ItemUseCoinCase: ; e0e7 (3:60e7)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jp nz,ItemUseNotTime
- ld hl,CoinCaseNumCoinsText
+ jp nz, ItemUseNotTime
+ ld hl, CoinCaseNumCoinsText
jp PrintText
CoinCaseNumCoinsText: ; e0f1 (3:60f1)
@@ -1919,7 +1959,7 @@ ItemUseOldRod: ; e0f9 (3:60f9)
ItemUseGoodRod: ; e106 (3:6106)
call FishingInit
- jp c,ItemUseNotTime
+ jp c, ItemUseNotTime
.RandomLoop
call Random
srl a
@@ -1928,17 +1968,17 @@ ItemUseGoodRod: ; e106 (3:6106)
cp 2
jr nc, .RandomLoop
; choose which monster appears
- ld hl,GoodRodMons
+ ld hl, GoodRodMons
add a
- ld c,a
- ld b,0
- add hl,bc
- ld b,[hl]
+ ld c, a
+ ld b, 0
+ add hl, bc
+ ld b, [hl]
inc hl
- ld c,[hl]
+ ld c, [hl]
and a
.SetBite
- ld a,0
+ ld a, 0
rla
xor 1
jr RodResponse
@@ -1993,30 +2033,32 @@ DoNotGenerateFishingEncounter: ; e16e (3:616e)
; checks if fishing is possible and if so, runs initialization code common to all rods
; unsets carry if fishing is possible, sets carry if not
FishingInit: ; e182 (3:6182)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jr z,.notInBattle
+ jr z, .notInBattle
scf ; can't fish during battle
ret
+
.notInBattle
call IsNextTileShoreOrWater
- jr nc,.cannotFish
- ld a,[wWalkBikeSurfState]
- cp a,2 ; Surfing?
- jr z,.cannotFish
+ jr nc, .cannotFish
+ ld a, [wWalkBikeSurfState]
+ cp a, 2 ; Surfing?
+ jr z, .cannotFish
call ItemUseReloadOverworldData
- ld hl,ItemUseText00
+ ld hl, ItemUseText00
call PrintText
- ld a,SFX_HEAL_AILMENT
+ ld a, SFX_HEAL_AILMENT
call PlaySound
ld a, $2
ld [wd49c], a
ld a, $81
ld [wPikachuMood], a
- ld c,80
+ ld c, 80
call DelayFrames
and a
ret
+
.cannotFish
scf ; can't fish when surfing
ret
@@ -2025,22 +2067,22 @@ ItemUseOaksParcel: ; e1b7 (3:61b7)
jp ItemUseNotYoursToUse
ItemUseItemfinder: ; e1ba (3:61ba)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jp nz,ItemUseNotTime
+ jp nz, ItemUseNotTime
call ItemUseReloadOverworldData
callba HiddenItemNear ; check for hidden items
- ld hl,ItemfinderFoundNothingText
- jr nc,.printText ; if no hidden items
- ld c,4
+ ld hl, ItemfinderFoundNothingText
+ jr nc, .printText ; if no hidden items
+ ld c, 4
.loop
- ld a,SFX_HEALING_MACHINE
+ ld a, SFX_HEALING_MACHINE
call PlaySoundWaitForCurrent
- ld a,SFX_PURCHASE
+ ld a, SFX_PURCHASE
call PlaySoundWaitForCurrent
dec c
- jr nz,.loop
- ld hl,ItemfinderFoundItemText
+ jr nz, .loop
+ ld hl, ItemfinderFoundItemText
.printText
jp PrintText
@@ -2053,23 +2095,24 @@ ItemfinderFoundNothingText: ; e1eb (3:61eb)
db "@"
ItemUsePPUp: ; e1f0 (3:61f0)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jp nz,ItemUseNotTime
+ jp nz, ItemUseNotTime
ItemUsePPRestore: ; e1f7 (3:61f7)
- ld a,[wWhichPokemon]
+ ld a, [wWhichPokemon]
push af
- ld a,[wcf91]
- ld [wPPRestoreItem],a
+ ld a, [wcf91]
+ ld [wPPRestoreItem], a
.chooseMon
xor a
- ld [wUpdateSpritesEnabled],a
- ld a,USE_ITEM_PARTY_MENU
- ld [wPartyMenuTypeOrMessageID],a
+ ld [wUpdateSpritesEnabled], a
+ ld a, USE_ITEM_PARTY_MENU
+ ld [wPartyMenuTypeOrMessageID], a
call DisplayPartyMenu
- jr nc,.chooseMove
+ jr nc, .chooseMove
jp .itemNotUsed
+
.chooseMove
ld a, [wIsInBattle]
and a
@@ -2084,121 +2127,127 @@ ItemUsePPRestore: ; e1f7 (3:61f7)
jr z, .usePPItem
call ItemUseNotTime
jp .itemNotUsed
+
.usePPItem
- ld a,[wPPRestoreItem]
- cp a,ELIXER
- jp nc,.useElixir ; if Elixir or Max Elixir
- ld a,$02
- ld [wMoveMenuType],a
- ld hl,RaisePPWhichTechniqueText
- ld a,[wPPRestoreItem]
- cp a,ETHER ; is it a PP Up?
- jr c,.printWhichTechniqueMessage ; if so, print the raise PP message
- ld hl,RestorePPWhichTechniqueText ; otherwise, print the restore PP message
+ ld a, [wPPRestoreItem]
+ cp a, ELIXER
+ jp nc, .useElixir ; if Elixir or Max Elixir
+ ld a, $02
+ ld [wMoveMenuType], a
+ ld hl, RaisePPWhichTechniqueText
+ ld a, [wPPRestoreItem]
+ cp a, ETHER ; is it a PP Up?
+ jr c, .printWhichTechniqueMessage ; if so, print the raise PP message
+ ld hl, RestorePPWhichTechniqueText ; otherwise, print the restore PP message
.printWhichTechniqueMessage
call PrintText
xor a
- ld [wPlayerMoveListIndex],a
+ ld [wPlayerMoveListIndex], a
callab MoveSelectionMenu ; move selection menu
- ld a,0
- ld [wPlayerMoveListIndex],a
- jr nz,.chooseMon
- ld hl,wPartyMon1Moves
+ ld a, 0
+ ld [wPlayerMoveListIndex], a
+ jr nz, .chooseMon
+ ld hl, wPartyMon1Moves
ld bc, wPartyMon2 - wPartyMon1
call GetSelectedMoveOffset
push hl
- ld a,[hl]
- ld [wd11e],a
+ ld a, [hl]
+ ld [wd11e], a
call GetMoveName
call CopyStringToCF4B ; copy name to wcf4b
pop hl
- ld a,[wPPRestoreItem]
- cp a,ETHER
- jr nc,.useEther ; if Ether or Max Ether
+ ld a, [wPPRestoreItem]
+ cp a, ETHER
+ jr nc, .useEther ; if Ether or Max Ether
.usePPUp
- ld bc,21
- add hl,bc
- ld a,[hl] ; move PP
- cp a,3 << 6 ; have 3 PP Ups already been used?
- jr c,.PPNotMaxedOut
- ld hl,PPMaxedOutText
+ ld bc, 21
+ add hl, bc
+ ld a, [hl] ; move PP
+ cp a, 3 << 6 ; have 3 PP Ups already been used?
+ jr c, .PPNotMaxedOut
+ ld hl, PPMaxedOutText
call PrintText
jr .chooseMove
+
.PPNotMaxedOut
- ld a,[hl]
- add a,1 << 6 ; increase PP Up count by 1
- ld [hl],a
- ld a,1 ; 1 PP Up used
- ld [wd11e],a
+ ld a, [hl]
+ add a, 1 << 6 ; increase PP Up count by 1
+ ld [hl], a
+ ld a, 1 ; 1 PP Up used
+ ld [wd11e], a
call RestoreBonusPP ; add the bonus PP to current PP
ld a, SFX_HEAL_AILMENT
call PlaySound
- ld hl,PPIncreasedText
+ ld hl, PPIncreasedText
call PrintText
.done
pop af
- ld [wWhichPokemon],a
+ ld [wWhichPokemon], a
call GBPalWhiteOut
call RunDefaultPaletteCommand
jp RemoveUsedItem
+
.afterRestoringPP ; after using a (Max) Ether/Elixir
- ld a,[wWhichPokemon]
- ld b,a
- ld a,[wPlayerMonNumber]
+ ld a, [wWhichPokemon]
+ ld b, a
+ ld a, [wPlayerMonNumber]
cp b ; is the pokemon whose PP was restored active in battle?
- jr nz,.skipUpdatingInBattleData
- ld hl,wPartyMon1PP
+ jr nz, .skipUpdatingInBattleData
+ ld hl, wPartyMon1PP
ld bc, wPartyMon2 - wPartyMon1
call AddNTimes
- ld de,wBattleMonPP
- ld bc,4
+ ld de, wBattleMonPP
+ ld bc, 4
call CopyData ; copy party data to in-battle data
.skipUpdatingInBattleData
- ld a,SFX_HEAL_AILMENT
+ ld a, SFX_HEAL_AILMENT
call PlaySound
- ld hl,PPRestoredText
+ ld hl, PPRestoredText
call PrintText
jr .done
+
.useEther
call .restorePP
- jr nz,.afterRestoringPP
+ jr nz, .afterRestoringPP
jp .noEffect
+
; unsets zero flag if PP was restored, sets zero flag if not
; however, this is bugged for Max Ethers and Max Elixirs (see below)
.restorePP
xor a ; PLAYER_PARTY_DATA
- ld [wMonDataLocation],a
+ ld [wMonDataLocation], a
call GetMaxPP
- ld hl,wPartyMon1Moves
+ ld hl, wPartyMon1Moves
ld bc, wPartyMon2 - wPartyMon1
call GetSelectedMoveOffset
ld bc, wPartyMon1PP - wPartyMon1Moves
- add hl,bc ; hl now points to move's PP
- ld a,[wMaxPP]
- ld b,a
- ld a,[wPPRestoreItem]
- cp a,MAX_ETHER
- jr z,.fullyRestorePP
- ld a,[hl] ; move PP
- and a,%00111111 ; lower 6 bit bits store current PP
+ add hl, bc ; hl now points to move's PP
+ ld a, [wMaxPP]
+ ld b, a
+ ld a, [wPPRestoreItem]
+ cp a, MAX_ETHER
+ jr z, .fullyRestorePP
+ ld a, [hl] ; move PP
+ and a, %00111111 ; lower 6 bit bits store current PP
cp b ; does current PP equal max PP?
ret z ; if so, return
- add a,10 ; increase current PP by 10
+ add a, 10 ; increase current PP by 10
; b holds the max PP amount and b will hold the new PP amount.
; So, if the new amount meets or exceeds the max amount,
; cap the amount to the max amount by leaving b unchanged.
; Otherwise, store the new amount in b.
cp b ; does the new amount meet or exceed the maximum?
- jr nc,.storeNewAmount
- ld b,a
+ jr nc, .storeNewAmount
+ ld b, a
.storeNewAmount
- ld a,[hl] ; move PP
- and a,%11000000 ; PP Up counter bits
+ ld a, [hl] ; move PP
+ and a, %11000000 ; PP Up counter bits
add b
- ld [hl],a
+ ld [hl], a
ret
+
.fullyRestorePP
- ld a,[hl] ; move PP
+ ld a, [hl] ; move PP
; Note that this code has a bug. It doesn't mask out the upper two bits, which
; are used to count how many PP Ups have been used on the move. So, Max Ethers
; and Max Elixirs will not be detected as having no effect on a move with full
@@ -2206,39 +2255,40 @@ ItemUsePPRestore: ; e1f7 (3:61f7)
cp b ; does current PP equal max PP?
ret z
jr .storeNewAmount
+
.useElixir
; decrement the item ID so that ELIXER becomes ETHER and MAX_ELIXER becomes MAX_ETHER
- ld hl,wPPRestoreItem
+ ld hl, wPPRestoreItem
dec [hl]
dec [hl]
xor a
- ld hl,wCurrentMenuItem
- ld [hli],a
- ld [hl],a ; zero the counter for number of moves that had their PP restored
- ld b,4
+ ld hl, wCurrentMenuItem
+ ld [hli], a
+ ld [hl], a ; zero the counter for number of moves that had their PP restored
+ ld b, 4
; loop through each move and restore PP
.elixirLoop
push bc
- ld hl,wPartyMon1Moves
+ ld hl, wPartyMon1Moves
ld bc, wPartyMon2 - wPartyMon1
call GetSelectedMoveOffset
- ld a,[hl]
+ ld a, [hl]
and a ; does the current slot have a move?
- jr z,.nextMove
+ jr z, .nextMove
call .restorePP
- jr z,.nextMove
+ jr z, .nextMove
; if some PP was restored
- ld hl,wTileBehindCursor ; counter for number of moves that had their PP restored
+ ld hl, wTileBehindCursor ; counter for number of moves that had their PP restored
inc [hl]
.nextMove
- ld hl,wCurrentMenuItem
+ ld hl, wCurrentMenuItem
inc [hl]
pop bc
dec b
- jr nz,.elixirLoop
- ld a,[wTileBehindCursor]
+ jr nz, .elixirLoop
+ ld a, [wTileBehindCursor]
and a ; did any moves have their PP restored?
- jp nz,.afterRestoringPP
+ jp nz, .afterRestoringPP
.noEffect
call ItemUseNoEffect
.itemNotUsed
@@ -2246,7 +2296,7 @@ ItemUsePPRestore: ; e1f7 (3:61f7)
call RunDefaultPaletteCommand
pop af
xor a
- ld [wActionResultOrTookBattleTurn],a ; item use failed
+ ld [wActionResultOrTookBattleTurn], a ; item use failed
ret
RaisePPWhichTechniqueText: ; e358 (3:6358)
@@ -2274,63 +2324,64 @@ UnusableItem: ; e371 (3:6371)
jp ItemUseNotTime
ItemUseTMHM: ; e374 (3:6374)
- ld a,[wIsInBattle]
+ ld a, [wIsInBattle]
and a
- jp nz,ItemUseNotTime
- ld a,[wcf91]
- sub a,TM_01
+ jp nz, ItemUseNotTime
+ ld a, [wcf91]
+ sub a, TM_01
push af
- jr nc,.skipAdding
- add a,55 ; if item is an HM, add 55
+ jr nc, .skipAdding
+ add a, 55 ; if item is an HM, add 55
.skipAdding
inc a
- ld [wd11e],a
+ ld [wd11e], a
predef TMToMove ; get move ID from TM/HM ID
- ld a,[wd11e]
- ld [wMoveNum],a
+ ld a, [wd11e]
+ ld [wMoveNum], a
call GetMoveName
call CopyStringToCF4B ; copy name to wcf4b
pop af
- ld hl,BootedUpTMText
- jr nc,.printBootedUpMachineText
- ld hl,BootedUpHMText
+ ld hl, BootedUpTMText
+ jr nc, .printBootedUpMachineText
+ ld hl, BootedUpHMText
.printBootedUpMachineText
call PrintText
- ld hl,TeachMachineMoveText
+ ld hl, TeachMachineMoveText
call PrintText
coord hl, 14, 7
lb bc, 8, 15
- ld a,TWO_OPTION_MENU
- ld [wTextBoxID],a
+ ld a, TWO_OPTION_MENU
+ ld [wTextBoxID], a
call DisplayTextBoxID ; yes/no menu
- ld a,[wCurrentMenuItem]
+ ld a, [wCurrentMenuItem]
and a
- jr z,.useMachine
- ld a,2
- ld [wActionResultOrTookBattleTurn],a ; item not used
+ jr z, .useMachine
+ ld a, 2
+ ld [wActionResultOrTookBattleTurn], a ; item not used
ret
+
.useMachine
- ld a,[wWhichPokemon]
+ ld a, [wWhichPokemon]
push af
- ld a,[wcf91]
+ ld a, [wcf91]
push af
.chooseMon
- ld hl,wcf4b
- ld de,wTempMoveNameBuffer
- ld bc,14
+ ld hl, wcf4b
+ ld de, wTempMoveNameBuffer
+ ld bc, 14
call CopyData ; save the move name because DisplayPartyMenu will overwrite it
- ld a,$ff
- ld [wUpdateSpritesEnabled],a
- ld a,TMHM_PARTY_MENU
- ld [wPartyMenuTypeOrMessageID],a
+ ld a, $ff
+ ld [wUpdateSpritesEnabled], a
+ ld a, TMHM_PARTY_MENU
+ ld [wPartyMenuTypeOrMessageID], a
call DisplayPartyMenu
push af
- ld hl,wTempMoveNameBuffer
- ld de,wcf4b
- ld bc,14
+ ld hl, wTempMoveNameBuffer
+ ld de, wcf4b
+ ld bc, 14
call CopyData
pop af
- jr nc,.checkIfAbleToLearnMove
+ jr nc, .checkIfAbleToLearnMove
; if the player canceled teaching the move
pop af
pop af
@@ -2341,45 +2392,46 @@ ItemUseTMHM: ; e374 (3:6374)
.checkIfAbleToLearnMove
predef CanLearnTM ; check if the pokemon can learn the move
push bc
- ld a,[wWhichPokemon]
- ld hl,wPartyMonNicks
+ ld a, [wWhichPokemon]
+ ld hl, wPartyMonNicks
call GetPartyMonName
pop bc
- ld a,c
+ ld a, c
and a ; can the pokemon learn the move?
- jr nz,.checkIfAlreadyLearnedMove
+ jr nz, .checkIfAlreadyLearnedMove
; if the pokemon can't learn the move
- ld a,SFX_DENIED
+ ld a, SFX_DENIED
call PlaySoundWaitForCurrent
- ld hl,MonCannotLearnMachineMoveText
+ ld hl, MonCannotLearnMachineMoveText
call PrintText
jr .chooseMon
+
.checkIfAlreadyLearnedMove
callab CheckIfMoveIsKnown ; check if the pokemon already knows the move
- jr c,.chooseMon
+ jr c, .chooseMon
predef LearnMove ; teach move
ld a, [wWhichPokemon]
ld d, a
pop af
- ld [wcf91],a
+ ld [wcf91], a
pop af
- ld [wWhichPokemon],a
- ld a,b
+ ld [wWhichPokemon], a
+ ld a, b
and a
ret z
- ld a,[wWhichPokemon]
+ ld a, [wWhichPokemon]
push af
- ld a,d
- ld [wWhichPokemon],a
+ ld a, d
+ ld [wWhichPokemon], a
callabd_ModifyPikachuHappiness PIKAHAPPY_USEDTMHM
callab IsThisPartymonStarterPikachu_Party
- jr nc,.notTeachingThunderboltOrThunderToPikachu
- ld a,[wcf91]
- cp a,TM_24 ; are we teaching thunderbolt to the player pikachu?
- jr z,.teachingThunderboltOrThunderToPlayerPikachu
- cp a,TM_25 ; are we teaching thunder then?
- jr nz,.notTeachingThunderboltOrThunderToPikachu
+ jr nc, .notTeachingThunderboltOrThunderToPikachu
+ ld a, [wcf91]
+ cp a, TM_24 ; are we teaching thunderbolt to the player pikachu?
+ jr z, .teachingThunderboltOrThunderToPlayerPikachu
+ cp a, TM_25 ; are we teaching thunder then?
+ jr nz, .notTeachingThunderboltOrThunderToPikachu
.teachingThunderboltOrThunderToPlayerPikachu
ld a, $5
ld [wd49c], a
@@ -2389,7 +2441,7 @@ ItemUseTMHM: ; e374 (3:6374)
pop af
ld [wWhichPokemon], a
- ld a,[wcf91]
+ ld a, [wcf91]
call IsItemHM
ret c
jp RemoveUsedItem
@@ -2411,28 +2463,28 @@ MonCannotLearnMachineMoveText: ; e492 (3:6492)
db "@"
PrintItemUseTextAndRemoveItem: ; e497 (3:6497)
- ld hl,ItemUseText00
+ ld hl, ItemUseText00
call PrintText
- ld a,SFX_HEAL_AILMENT
+ ld a, SFX_HEAL_AILMENT
call PlaySound
call WaitForTextScrollButtonPress ; wait for button press
RemoveUsedItem: ; e4a5 (3:64a5)
- ld hl,wNumBagItems
- ld a,1 ; one item
- ld [wItemQuantity],a
+ ld hl, wNumBagItems
+ ld a, 1 ; one item
+ ld [wItemQuantity], a
jp RemoveItemFromInventory
ItemUseNoEffect: ; e4b0 (3:64b0)
- ld hl,ItemUseNoEffectText
+ ld hl, ItemUseNoEffectText
jr ItemUseFailed
ItemUseNotTime: ; e4b5 (3:64b5)
- ld hl,ItemUseNotTimeText
+ ld hl, ItemUseNotTimeText
jr ItemUseFailed
ItemUseNotYoursToUse: ; e4ba (3:64ba)
- ld hl,ItemUseNotYoursToUseText
+ ld hl, ItemUseNotYoursToUseText
jr ItemUseFailed
Func_e4bf: ; e4bf (3:64bf)
@@ -2445,29 +2497,29 @@ ThrowBallAtTrainerMon: ; e4ca (3:64ca)
call RunDefaultPaletteCommand
call LoadScreenTilesFromBuffer1 ; restore saved screen
call Delay3
- ld a,TOSS_ANIM
- ld [wAnimationID],a
+ ld a, TOSS_ANIM
+ ld [wAnimationID], a
predef MoveAnimation ; do animation
- ld hl,ThrowBallAtTrainerMonText1
+ ld hl, ThrowBallAtTrainerMonText1
call PrintText
- ld hl,ThrowBallAtTrainerMonText2
+ ld hl, ThrowBallAtTrainerMonText2
call PrintText
jr RemoveUsedItem
NoCyclingAllowedHere: ; e4eb (3:64eb)
- ld hl,NoCyclingAllowedHereText
+ ld hl, NoCyclingAllowedHereText
jr ItemUseFailed
BoxFullCannotThrowBall: ; e4f0 (3:64f0)
- ld hl,BoxFullCannotThrowBallText
+ ld hl, BoxFullCannotThrowBallText
jr ItemUseFailed
SurfingAttemptFailed: ; e4f5 (3:64f5)
- ld hl,NoSurfingHereText
+ ld hl, NoSurfingHereText
ItemUseFailed: ; e4f8 (3:64f8)
xor a
- ld [wActionResultOrTookBattleTurn],a ; item use failed
+ ld [wActionResultOrTookBattleTurn], a ; item use failed
jp PrintText
ItemUseNotTimeText: ; e4ff (3:64ff)
@@ -2530,37 +2582,37 @@ GotOffBicycleText: ; e540 (3:6540)
; [wWhichPokemon] = index of pokemon in party
; [wCurrentMenuItem] = index of move (when using a PP Up)
RestoreBonusPP: ; e54a (3:654a)
- ld hl,wPartyMon1Moves
+ ld hl, wPartyMon1Moves
ld bc, wPartyMon2 - wPartyMon1
- ld a,[wWhichPokemon]
+ ld a, [wWhichPokemon]
call AddNTimes
push hl
- ld de,wNormalMaxPPList - 1
+ ld de, wNormalMaxPPList - 1
predef LoadMovePPs ; loads the normal max PP of each of the pokemon's moves to wNormalMaxPPList
pop hl
ld c, wPartyMon1PP - wPartyMon1Moves
- ld b,0
- add hl,bc ; hl now points to move 1 PP
- ld de,wNormalMaxPPList
- ld b,0 ; initialize move counter to zero
+ ld b, 0
+ add hl, bc ; hl now points to move 1 PP
+ ld de, wNormalMaxPPList
+ ld b, 0 ; initialize move counter to zero
; loop through the pokemon's moves
.loop
inc b
- ld a,b
- cp a,5 ; reached the end of the pokemon's moves?
+ ld a, b
+ cp a, 5 ; reached the end of the pokemon's moves?
ret z ; if so, return
- ld a,[wUsingPPUp]
+ ld a, [wUsingPPUp]
dec a ; using a PP Up?
- jr nz,.skipMenuItemIDCheck
+ jr nz, .skipMenuItemIDCheck
; if using a PP Up, check if this is the move it's being used on
- ld a,[wCurrentMenuItem]
+ ld a, [wCurrentMenuItem]
inc a
cp b
- jr nz,.nextMove
+ jr nz, .nextMove
.skipMenuItemIDCheck
- ld a,[hl]
- and a,%11000000 ; have any PP Ups been used?
- call nz,AddBonusPP ; if so, add bonus PP
+ ld a, [hl]
+ and a, %11000000 ; have any PP Ups been used?
+ call nz, AddBonusPP ; if so, add bonus PP
.nextMove
inc hl
inc de
@@ -2573,38 +2625,38 @@ RestoreBonusPP: ; e54a (3:654a)
; [hl] = move PP
AddBonusPP: ; e586 (3:6586)
push bc
- ld a,[de] ; normal max PP of move
- ld [H_DIVIDEND + 3],a
+ ld a, [de] ; normal max PP of move
+ ld [H_DIVIDEND + 3], a
xor a
- ld [H_DIVIDEND],a
- ld [H_DIVIDEND + 1],a
- ld [H_DIVIDEND + 2],a
- ld a,5
- ld [H_DIVISOR],a
- ld b,4
+ ld [H_DIVIDEND], a
+ ld [H_DIVIDEND + 1], a
+ ld [H_DIVIDEND + 2], a
+ ld a, 5
+ ld [H_DIVISOR], a
+ ld b, 4
call Divide
- ld a,[hl] ; move PP
- ld b,a
+ ld a, [hl] ; move PP
+ ld b, a
swap a
- and a,%1111
+ and a, %1111
srl a
srl a
- ld c,a ; c = number of PP Ups used
+ ld c, a ; c = number of PP Ups used
.loop
- ld a,[H_QUOTIENT + 3]
- cp a,8 ; is the amount greater than or equal to 8?
- jr c,.addAmount
- ld a,7 ; cap the amount at 7
+ ld a, [H_QUOTIENT + 3]
+ cp a, 8 ; is the amount greater than or equal to 8?
+ jr c, .addAmount
+ ld a, 7 ; cap the amount at 7
.addAmount
add b
- ld b,a
- ld a,[wUsingPPUp]
+ ld b, a
+ ld a, [wUsingPPUp]
dec a ; is the player using a PP Up right now?
- jr z,.done ; if so, only add the bonus once
+ jr z, .done ; if so, only add the bonus once
dec c
- jr nz,.loop
+ jr nz, .loop
.done
- ld [hl],b
+ ld [hl], b
pop bc
ret
@@ -2621,74 +2673,75 @@ AddBonusPP: ; e586 (3:6586)
; OUTPUT:
; [wMaxPP] = max PP
GetMaxPP: ; e5bb (3:65bb)
- ld a,[wMonDataLocation]
+ ld a, [wMonDataLocation]
and a
- ld hl,wPartyMon1Moves
- ld bc,wPartyMon2 - wPartyMon1
- jr z,.sourceWithMultipleMon
- ld hl,wEnemyMon1Moves
+ ld hl, wPartyMon1Moves
+ ld bc, wPartyMon2 - wPartyMon1
+ jr z, .sourceWithMultipleMon
+ ld hl, wEnemyMon1Moves
dec a
- jr z,.sourceWithMultipleMon
- ld hl,wBoxMon1Moves
- ld bc,wBoxMon2 - wBoxMon1
+ jr z, .sourceWithMultipleMon
+ ld hl, wBoxMon1Moves
+ ld bc, wBoxMon2 - wBoxMon1
dec a
- jr z,.sourceWithMultipleMon
- ld hl,wDayCareMonMoves
+ jr z, .sourceWithMultipleMon
+ ld hl, wDayCareMonMoves
dec a
- jr z,.sourceWithOneMon
- ld hl,wBattleMonMoves ; player's in-battle pokemon
+ jr z, .sourceWithOneMon
+ ld hl, wBattleMonMoves ; player's in-battle pokemon
.sourceWithOneMon
call GetSelectedMoveOffset2
jr .next
+
.sourceWithMultipleMon
call GetSelectedMoveOffset
.next
- ld a,[hl]
+ ld a, [hl]
dec a
push hl
- ld hl,Moves
- ld bc,MoveEnd - Moves
+ ld hl, Moves
+ ld bc, MoveEnd - Moves
call AddNTimes
- ld de,wcd6d
- ld a,BANK(Moves)
+ ld de, wcd6d
+ ld a, BANK(Moves)
call FarCopyData
- ld de,wcd6d + 5 ; PP is byte 5 of move data
- ld a,[de]
- ld b,a ; b = normal max PP
+ ld de, wcd6d + 5 ; PP is byte 5 of move data
+ ld a, [de]
+ ld b, a ; b = normal max PP
pop hl
push bc
- ld bc,wPartyMon1PP - wPartyMon1Moves ; PP offset if not player's in-battle pokemon data
- ld a,[wMonDataLocation]
- cp a,4 ; player's in-battle pokemon?
- jr nz,.addPPOffset
- ld bc,wBattleMonPP - wBattleMonMoves ; PP offset if player's in-battle pokemon data
+ ld bc, wPartyMon1PP - wPartyMon1Moves ; PP offset if not player's in-battle pokemon data
+ ld a, [wMonDataLocation]
+ cp a, 4 ; player's in-battle pokemon?
+ jr nz, .addPPOffset
+ ld bc, wBattleMonPP - wBattleMonMoves ; PP offset if player's in-battle pokemon data
.addPPOffset
- add hl,bc
- ld a,[hl] ; a = current PP
- and a,%11000000 ; get PP Up count
+ add hl, bc
+ ld a, [hl] ; a = current PP
+ and a, %11000000 ; get PP Up count
pop bc
or b ; place normal max PP in 6 lower bits of a
- ld h,d
- ld l,e
+ ld h, d
+ ld l, e
inc hl ; hl = wcd73
- ld [hl],a
+ ld [hl], a
xor a ; add the bonus for the existing PP Up count
- ld [wUsingPPUp],a
+ ld [wUsingPPUp], a
call AddBonusPP ; add bonus PP from PP Ups
- ld a,[hl]
- and a,%00111111 ; mask out the PP Up count
- ld [wMaxPP],a ; store max PP
+ ld a, [hl]
+ and a, %00111111 ; mask out the PP Up count
+ ld [wMaxPP], a ; store max PP
ret
GetSelectedMoveOffset: ; e627 (3:6627)
- ld a,[wWhichPokemon]
+ ld a, [wWhichPokemon]
call AddNTimes
GetSelectedMoveOffset2: ; e62d (3:662d)
- ld a,[wCurrentMenuItem]
- ld c,a
- ld b,0
- add hl,bc
+ ld a, [wCurrentMenuItem]
+ ld c, a
+ ld b, 0
+ add hl, bc
ret
; confirms the item toss and then tosses the item
@@ -2701,49 +2754,50 @@ GetSelectedMoveOffset2: ; e62d (3:662d)
; clears carry flag if the item is tossed, sets carry flag if not
TossItem_: ; e635 (3:6635)
push hl
- ld a,[wcf91]
+ ld a, [wcf91]
call IsItemHM
pop hl
- jr c,.tooImportantToToss
+ jr c, .tooImportantToToss
push hl
call IsKeyItem_
- ld a,[wIsKeyItem]
+ ld a, [wIsKeyItem]
pop hl
and a
- jr nz,.tooImportantToToss
+ jr nz, .tooImportantToToss
push hl
- ld a,[wcf91]
- ld [wd11e],a
+ ld a, [wcf91]
+ ld [wd11e], a
call GetItemName
call CopyStringToCF4B ; copy name to wcf4b
- ld hl,IsItOKToTossItemText
+ ld hl, IsItOKToTossItemText
call PrintText
coord hl, 14, 7
lb bc, 8, 15
- ld a,TWO_OPTION_MENU
- ld [wTextBoxID],a
+ ld a, TWO_OPTION_MENU
+ ld [wTextBoxID], a
call DisplayTextBoxID ; yes/no menu
- ld a,[wMenuExitMethod]
- cp a,CHOSE_SECOND_ITEM
+ ld a, [wMenuExitMethod]
+ cp a, CHOSE_SECOND_ITEM
pop hl
scf
ret z ; return if the player chose No
; if the player chose Yes
push hl
- ld a,[wWhichPokemon]
+ ld a, [wWhichPokemon]
call RemoveItemFromInventory
- ld a,[wcf91]
- ld [wd11e],a
+ ld a, [wcf91]
+ ld [wd11e], a
call GetItemName
call CopyStringToCF4B ; copy name to wcf4b
- ld hl,ThrewAwayItemText
+ ld hl, ThrewAwayItemText
call PrintText
pop hl
and a
ret
+
.tooImportantToToss
push hl
- ld hl,TooImportantToTossText
+ ld hl, TooImportantToTossText
call PrintText
pop hl
scf
@@ -2769,32 +2823,32 @@ TooImportantToTossText: ; e6a3 (3:66a3)
; 00: item is not key item
; 01: item is key item
IsKeyItem_: ; e6a8 (3:66a8)
- ld a,$01
- ld [wIsKeyItem],a
- ld a,[wcf91]
- cp a,HM_01 ; is the item an HM or TM?
- jr nc,.checkIfItemIsHM
+ ld a, $01
+ ld [wIsKeyItem], a
+ ld a, [wcf91]
+ cp a, HM_01 ; is the item an HM or TM?
+ jr nc, .checkIfItemIsHM
; if the item is not an HM or TM
push af
- ld hl,KeyItemBitfield
- ld de,wBuffer
- ld bc,15 ; only 11 bytes are actually used
+ ld hl, KeyItemBitfield
+ ld de, wBuffer
+ ld bc, 15 ; only 11 bytes are actually used
call CopyData
pop af
dec a
- ld c,a
- ld hl,wBuffer
- ld b,FLAG_TEST
+ ld c, a
+ ld hl, wBuffer
+ ld b, FLAG_TEST
predef FlagActionPredef
- ld a,c
+ ld a, c
and a
ret nz
.checkIfItemIsHM
- ld a,[wcf91]
+ ld a, [wcf91]
call IsItemHM
ret c
xor a
- ld [wIsKeyItem],a
+ ld [wIsKeyItem], a
ret
INCLUDE "data/key_items.asm"
@@ -2977,10 +3031,10 @@ SendNewMonToBox: ; e6e8 (3:66e8)
IsNextTileShoreOrWater: ; e808 (3:6808)
ld a, [wCurMapTileset]
ld hl, WaterTilesets
- ld de,1
+ ld de, 1
call IsInArray ; does the current map allow surfing?
ret nc ; if not, return
- ld hl,WaterTile
+ ld hl, WaterTile
ld a, [wCurMapTileset]
cp SHIP_PORT ; Vermilion Dock tileset
jr z, .skipShoreTiles ; if it's the Vermilion Dock tileset
@@ -2988,10 +3042,10 @@ IsNextTileShoreOrWater: ; e808 (3:6808)
jr z, .skipShoreTiles
cp DOJO ; usual eastern shore tile
jr z, .skipShoreTiles
- ld hl,ShoreTiles
+ ld hl, ShoreTiles
.skipShoreTiles
- ld a,[wTileInFrontOfPlayer]
- ld de,$1
+ ld a, [wTileInFrontOfPlayer]
+ ld de, $1
call IsInArray
ret
@@ -3039,6 +3093,7 @@ FindWildLocationsOfMon: ; e848 (3:6848)
inc hl
inc c
jr .loop
+
.done
ld a, $ff ; list terminator
ld [de], a
diff --git a/engine/menu/bills_pc.asm b/engine/menu/bills_pc.asm
index 43d4d6ef..e104f693 100644
--- a/engine/menu/bills_pc.asm
+++ b/engine/menu/bills_pc.asm
@@ -204,7 +204,7 @@ ExitBillsPC: ; 2153e (8:553e)
ret
BillsPCPrintBox: ; 21562 (8:5562)
- callab Func_e8d35
+ callab PrintPCBox
jp BillsPCMenu
BillsPCDeposit: ; 2156d (8:556d)
@@ -553,7 +553,7 @@ CableClubLeftGameboy:: ; 21867 (8:5867)
ld a, [hSerialConnectionStatus]
cp USING_EXTERNAL_CLOCK
ret z
- ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
+ ld a, [wPlayerFacingDirection] ; player's sprite facing direction
cp SPRITE_FACING_RIGHT
ret nz
ld a, [wCurMap]
@@ -570,7 +570,7 @@ CableClubRightGameboy:: ; 21887 (8:5887)
ld a, [hSerialConnectionStatus]
cp USING_INTERNAL_CLOCK
ret z
- ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
+ ld a, [wPlayerFacingDirection] ; player's sprite facing direction
cp SPRITE_FACING_LEFT
ret nz
ld a, [wCurMap]
@@ -587,7 +587,7 @@ JustAMomentText:: ; 218a7 (8:58a7)
TX_FAR _JustAMomentText
db "@"
- ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
+ ld a, [wPlayerFacingDirection] ; player's sprite facing direction
cp SPRITE_FACING_UP
ret nz
call EnableAutoTextBoxDrawing
diff --git a/engine/menu/main_menu.asm b/engine/menu/main_menu.asm
index 94504ffb..fb3fb6b9 100755
--- a/engine/menu/main_menu.asm
+++ b/engine/menu/main_menu.asm
@@ -128,7 +128,7 @@ InitOptions: ; 5bff (1:5bff)
ld a,3 ; medium speed
ld [wOptions],a
ld a,64 ; audio?
- ld [wd498], a
+ ld [wPrinterSettings], a
ret
Func_5cc1: ; 5cc1 (1:5cc1)
diff --git a/engine/menu/options.asm b/engine/menu/options.asm
index ff629839..86a55bd2 100644
--- a/engine/menu/options.asm
+++ b/engine/menu/options.asm
@@ -272,7 +272,7 @@ OptionsMenu_GBPrinterBrightness: ; 41e0c (10:5e0c)
ld a, d
.asm_41e2e
ld b, a
- ld [wd498], a
+ ld [wPrinterSettings], a
.asm_41e32
ld b, $0
ld hl, GBPrinterOptionStringsPointerTable
@@ -305,7 +305,7 @@ DarkestPrintText: ; 41e72 (10:5e72)
db "DARKEST @"
Func_41e7b: ; 41e7b (10:5e7b)
- ld a, [wd498]
+ ld a, [wPrinterSettings]
and a
jr z, .asm_41e93
cp $20
diff --git a/engine/menu/pokedex.asm b/engine/menu/pokedex.asm
index 68339dff..7715500b 100755
--- a/engine/menu/pokedex.asm
+++ b/engine/menu/pokedex.asm
@@ -13,7 +13,7 @@ ShowPokedexMenu: ; 40000 (10:4000)
ld [hJoy7], a
.setUpGraphics
callab LoadPokedexTilePatterns
-.asm_40025
+.loop
ld b, SET_PAL_GENERIC
call RunPaletteCommand
.doPokemonListMenu
@@ -44,6 +44,7 @@ ShowPokedexMenu: ; 40000 (10:4000)
call GBPalWhiteOutWithDelay3
call RunDefaultPaletteCommand
jp ReloadMapData
+
.goToSideMenu
call HandlePokedexSideMenu
dec b
@@ -51,7 +52,7 @@ ShowPokedexMenu: ; 40000 (10:4000)
dec b
jr z, .doPokemonListMenu ; if pokemon not seen or player pressed B button
dec b
- jr z, .asm_40025
+ jr z, .loop
jp .setUpGraphics ; if pokemon data or area was shown
; handles the menu on the lower right in the pokedex screen
@@ -133,6 +134,7 @@ HandlePokedexSideMenu: ; 40070 (10:4070)
call DrawTileLine ; cover up the menu cursor in the pokemon list
pop bc
ret
+
.buttonBPressed
push bc
coord hl, 15, 8
@@ -141,20 +143,24 @@ HandlePokedexSideMenu: ; 40070 (10:4070)
call DrawTileLine ; cover up the menu cursor in the side menu
pop bc
jr .exitSideMenu
+
.choseData
call ShowPokedexDataInternal
ld b, 0
jr .exitSideMenu
+
; play pokemon cry
.choseCry
ld a, [wd11e]
call GetCryData
call PlaySound
jr .handleMenuInput
+
.choseArea
predef LoadTownMap_Nest ; display pokemon areas
ld b, 0
jr .exitSideMenu
+
.chosePrint
ld a, [hTilesetType]
push af
@@ -162,7 +168,7 @@ HandlePokedexSideMenu: ; 40070 (10:4070)
ld [hTilesetType], a
ld a, [wd11e]
ld [wcf91], a
- callab Func_e8b74
+ callab PrintPokedexEntry
xor a
ld [H_AUTOBGTRANSFERENABLED], a
call ClearScreen
@@ -174,17 +180,17 @@ HandlePokedexSideMenu: ; 40070 (10:4070)
; handles the list of pokemon on the left of the pokedex screen
; sets carry flag if player presses A, unsets carry flag if player presses B
HandlePokedexListMenu: ; 40140 (10:4140)
- call Func_401c2
+ call Pokedex_DrawInterface
.loop
- call Func_4027c
+ call Pokedex_PlacePokemonList
call GBPalNormal
call HandleMenuInput
- bit 1, a ; was the B button pressed?
+ bit BIT_B_BUTTON, a ; was the B button pressed?
jp nz, .buttonBPressed
- bit 0, a ; was the A button pressed?
+ bit BIT_A_BUTTON, a ; was the A button pressed?
jp nz, .buttonAPressed
.checkIfUpPressed
- bit 6, a ; was Up pressed?
+ bit BIT_D_UP, a ; was Up pressed?
jr z, .checkIfDownPressed
.upPressed ; scroll up one row
ld a, [wListScrollOffset]
@@ -193,8 +199,9 @@ HandlePokedexListMenu: ; 40140 (10:4140)
dec a
ld [wListScrollOffset], a
jp .loop
+
.checkIfDownPressed
- bit 7, a ; was Down pressed?
+ bit BIT_D_DOWN, a ; was Down pressed?
jr z, .checkIfRightPressed
.downPressed ; scroll down one row
ld a, [wDexMaxSeenMon]
@@ -208,8 +215,9 @@ HandlePokedexListMenu: ; 40140 (10:4140)
inc a
ld [wListScrollOffset], a
jp .loop
+
.checkIfRightPressed
- bit 4, a ; was Right pressed?
+ bit BIT_D_RIGHT, a ; was Right pressed?
jr z, .checkIfLeftPressed
.rightPressed ; scroll down 7 rows
ld a, [wDexMaxSeenMon]
@@ -226,8 +234,9 @@ HandlePokedexListMenu: ; 40140 (10:4140)
ld a, b
ld [wListScrollOffset], a
jp .loop
+
.checkIfLeftPressed ; scroll up 7 rows
- bit 5, a ; was Left pressed?
+ bit BIT_D_LEFT, a ; was Left pressed?
jr z, .buttonAPressed
.leftPressed
ld a, [wListScrollOffset]
@@ -237,14 +246,16 @@ HandlePokedexListMenu: ; 40140 (10:4140)
xor a
ld [wListScrollOffset], a
jp .loop
+
.buttonAPressed
scf
ret
+
.buttonBPressed
and a
ret
-Func_401c2: ; 401c2 (10:41c2)
+Pokedex_DrawInterface: ; 401c2 (10:41c2)
xor a
ld [H_AUTOBGTRANSFERENABLED], a
; draw the horizontal line separating the seen and owned amounts from the menu
@@ -300,6 +311,7 @@ Func_401c2: ; 401c2 (10:41c2)
dec c
jr nz, .maxSeenPokemonInnerLoop
jr .maxSeenPokemonLoop
+
.storeMaxSeenPokemon
ld a, b
ld [wDexMaxSeenMon], a
@@ -333,7 +345,7 @@ PokedexMenuItemsText: ; 40264 (10:4264)
next "PRNT"
next "QUIT@"
-Func_4027c: ; 4027c (10:427c)
+Pokedex_PlacePokemonList: ; 4027c (10:427c)
xor a
ld [H_AUTOBGTRANSFERENABLED], a
coord hl, 4, 2
@@ -381,6 +393,7 @@ Func_4027c: ; 4027c (10:427c)
jr nz, .getPokemonName ; if the player has seen the pokemon
ld de, .dashedLine ; print a dashed line in place of the name if the player hasn't seen the pokemon
jr .skipGettingName
+
.dashedLine ; for unseen pokemon in the list
db "----------@"
.getPokemonName
@@ -442,8 +455,8 @@ ShowPokedexDataInternal: ; 40323 (10:4323)
call RunPaletteCommand
pop af
ld [wd11e], a
- call Func_4039c
- call c, Func_404ae
+ call DrawDexEntryOnScreen
+ call c, Pokedex_PrintFlavorTextAtRow11
.waitForButtonPress
call JoypadLowSensitivity
ld a, [hJoy5]
@@ -478,22 +491,27 @@ PokedexDataDividerLine: ; 40387 (10:4387)
db $6B, $69, $6B, $69, $6A
db "@"
-Func_4039c: ; 4039c (10:439c)
+DrawDexEntryOnScreen: ; 4039c (10:439c)
call ClearScreen
+
coord hl, 0, 0
ld de, 1
lb bc, $64, SCREEN_WIDTH
call DrawTileLine ; draw top border
+
coord hl, 0, 17
ld b, $6f
call DrawTileLine ; draw bottom border
+
coord hl, 0, 1
ld de, 20
lb bc, $66, $10
call DrawTileLine ; draw left border
+
coord hl, 19, 1
ld b, $67
call DrawTileLine ; draw right border
+
ld a, $63 ; upper left corner tile
Coorda 0, 0
ld a, $65 ; upper right corner tile
@@ -501,16 +519,21 @@ Func_4039c: ; 4039c (10:439c)
ld a, $6c ; lower left corner tile
Coorda 0, 17
ld a, $6e ; lower right corner tile
+
Coorda 19, 17
coord hl, 0, 9
+
ld de, PokedexDataDividerLine
call PlaceString ; draw horizontal divider line
+
coord hl, 9, 6
ld de, HeightWeightText
call PlaceString
+
call GetMonName
coord hl, 9, 2
call PlaceString
+
ld hl, PokedexEntryPointers
ld a, [wd11e]
dec a
@@ -521,14 +544,17 @@ Func_4039c: ; 4039c (10:439c)
ld a, [hli]
ld e, a
ld d, [hl] ; de = address of pokedex entry
+
coord hl, 9, 4
call PlaceString ; print species name
+
ld h, b
ld l, c
push de
ld a, [wd11e]
push af
call IndexToPokedex
+
coord hl, 2, 8
ld a, "№"
ld [hli], a
@@ -537,6 +563,7 @@ Func_4039c: ; 4039c (10:439c)
ld de, wd11e
lb bc, LEADING_ZEROES | 1, 3
call PrintNumber ; print pokedex number
+
ld hl, wPokedexOwned
call IsPokemonBitSet
pop af
@@ -544,10 +571,12 @@ Func_4039c: ; 4039c (10:439c)
ld a, [wcf91]
ld [wd0b5], a
pop de
+
push af
push bc
push de
push hl
+
call Delay3
call GBPalNormal
call GetMonHeader ; load pokemon picture location
@@ -555,13 +584,16 @@ Func_4039c: ; 4039c (10:439c)
call LoadFlippedFrontSpriteByMonIndex ; draw pokemon picture
ld a, [wcf91]
call PlayCry ; play pokemon cry
+
pop hl
pop de
pop bc
pop af
+
ld a, c
and a
ret z ; if the pokemon has not been owned, don't print the height, weight, or description
+
inc de ; de = address of feet (height)
ld a, [de] ; reads feet, but a is overwritten without being used
coord hl, 12, 6
@@ -617,9 +649,9 @@ Func_4039c: ; 4039c (10:439c)
scf
ret
-Func_404ae: ; 404ae (10:44ae)
+Pokedex_PrintFlavorTextAtRow11: ; 404ae (10:44ae)
coord bc, 1, 11
-Func_404b1: ; 404b1 (10:44b1)
+Pokedex_PrintFlavorTextAtBC: ; 404b1 (10:44b1)
ld a, 2
ld [$fff9], a
call TextCommandProcessor ; print pokedex description text
@@ -627,7 +659,7 @@ Func_404b1: ; 404b1 (10:44b1)
ld [$fff9], a
ret
-Func_404bc: ; 404bc (10:44bc)
+Pokedex_PrepareDexEntryForPrinting: ; 404bc (10:44bc)
coord hl, 0, 0
ld de, SCREEN_WIDTH
lb bc, $66, $d
@@ -643,15 +675,15 @@ Func_404bc: ; 404bc (10:44bc)
Coorda 0, 13
ld a, $6e
Coorda 19, 13
- ld a, [wOverworldMap+$40d]
+ ld a, [wPrinterPokedexEntryTextPointer]
ld l, a
- ld a, [wOverworldMap+$40e]
+ ld a, [wPrinterPokedexEntryTextPointer + 1]
ld h, a
coord bc, 1, 1
ld a, [hFlags_0xFFFA]
set 3, a
ld [hFlags_0xFFFA], a
- call Func_404b1
+ call Pokedex_PrintFlavorTextAtBC
ld a, [hFlags_0xFFFA]
res 3, a
ld [hFlags_0xFFFA], a
@@ -714,4 +746,4 @@ IndexToPokedex: ; 4109d (10:509d)
pop bc
ret
-INCLUDE "data/pokedex_order.asm" \ No newline at end of file
+INCLUDE "data/pokedex_order.asm"
diff --git a/engine/oak_speech.asm b/engine/oak_speech.asm
index eeeb32c8..925ff913 100755
--- a/engine/oak_speech.asm
+++ b/engine/oak_speech.asm
@@ -5,7 +5,7 @@ SetDefaultNames: ; 5e27 (1:5e27)
push af
ld a, [wd732]
push af
- ld a, [wd498]
+ ld a, [wPrinterSettings]
push af
ld hl, wPlayerName
ld bc, wBoxDataEnd - wPlayerName
@@ -16,11 +16,11 @@ SetDefaultNames: ; 5e27 (1:5e27)
xor a
call FillMemory
xor a
- ld [wd495], a
- ld [wd496], a
- ld [wd497], a
+ ld [wSurfingMinigameHiScore], a
+ ld [wSurfingMinigameHiScore + 1], a
+ ld [wSurfingMinigameHiScore + 2], a
pop af
- ld [wd498], a
+ ld [wPrinterSettings], a
pop af
ld [wd732], a
pop af
diff --git a/engine/overworld/card_key.asm b/engine/overworld/card_key.asm
index 48b2380d..62d1d4fb 100755
--- a/engine/overworld/card_key.asm
+++ b/engine/overworld/card_key.asm
@@ -89,7 +89,7 @@ GetCoordsInFrontOfPlayer: ; 5265f (14:665f)
ld d, a
ld a, [wXCoord]
ld e, a
- ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
+ ld a, [wPlayerFacingDirection] ; player's sprite facing direction
and a
jr nz, .notFacingDown
; facing down
diff --git a/engine/overworld/check_player_state.asm b/engine/overworld/check_player_state.asm
index a89b3d48..5dd91c4c 100644
--- a/engine/overworld/check_player_state.asm
+++ b/engine/overworld/check_player_state.asm
@@ -90,7 +90,7 @@ IsPlayerFacingEdgeOfMap: ; c148 (3:4148)
push hl
push de
push bc
- ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction
+ ld a, [wPlayerFacingDirection] ; player sprite's facing direction
srl a
ld c, a
ld b, $0
@@ -160,7 +160,7 @@ IsWarpTileInFrontOfPlayer: ; c197 (3:4197)
ld a, [wCurMap]
cp SS_ANNE_5
jr z, .ssAnne5
- ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction
+ ld a, [wPlayerFacingDirection] ; player sprite's facing direction
srl a
ld c, a
ld b, 0
diff --git a/engine/overworld/cut.asm b/engine/overworld/cut.asm
index 3978cb9c..488bc4de 100755
--- a/engine/overworld/cut.asm
+++ b/engine/overworld/cut.asm
@@ -188,7 +188,7 @@ ReplaceTreeTileBlock: ; ef1f (3:6f1f)
ld h, [hl]
ld l, a
add hl, bc
- ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction
+ ld a, [wPlayerFacingDirection] ; player sprite's facing direction
and a
jr z, .down
cp SPRITE_FACING_UP
diff --git a/engine/overworld/get_coords_tile_in_front_of_player.asm b/engine/overworld/get_coords_tile_in_front_of_player.asm
index 494708de..1003570b 100644
--- a/engine/overworld/get_coords_tile_in_front_of_player.asm
+++ b/engine/overworld/get_coords_tile_in_front_of_player.asm
@@ -6,7 +6,7 @@ _GetTileAndCoordsInFrontOfPlayer: ; c2d4 (3:42d4)
ld d, a
ld a, [wXCoord]
ld e, a
- ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
+ ld a, [wPlayerFacingDirection] ; player's sprite facing direction
and a ; cp SPRITE_FACING_DOWN
jr nz, .notFacingDown
; facing down
@@ -45,7 +45,7 @@ GetTileTwoStepsInFrontOfPlayer: ; c309 (3:4309)
ld a, [hli]
ld d, a
ld e, [hl]
- ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
+ ld a, [wPlayerFacingDirection] ; player's sprite facing direction
and a ; cp SPRITE_FACING_DOWN
jr nz, .notFacingDown
; facing down
diff --git a/engine/overworld/hidden_objects.asm b/engine/overworld/hidden_objects.asm
index cba2a221..6e515b5a 100755
--- a/engine/overworld/hidden_objects.asm
+++ b/engine/overworld/hidden_objects.asm
@@ -61,7 +61,7 @@ CheckForHiddenObject: ; f25f8 (3c:65f8)
; checks if the coordinates in front of the player's sprite match Y in b and X in c
; [hCoordsInFrontOfPlayerMatch] = $00 if they match, $ff if they don't match
CheckIfCoordsInFrontOfPlayerMatch: ; 46a01 (11:6a01)
- ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
+ ld a, [wPlayerFacingDirection] ; player's sprite facing direction
cp SPRITE_FACING_UP
jr z, .facingUp
cp SPRITE_FACING_LEFT
diff --git a/engine/overworld/ledges.asm b/engine/overworld/ledges.asm
index a6ebd9be..5d95cb18 100755
--- a/engine/overworld/ledges.asm
+++ b/engine/overworld/ledges.asm
@@ -6,7 +6,7 @@ HandleLedges: ; 1a7f4 (6:67f4)
and a ; OVERWORLD
ret nz
predef GetTileAndCoordsInFrontOfPlayer
- ld a, [wSpriteStateData1 + 9]
+ ld a, [wPlayerFacingDirection]
ld b, a
aCoord 8, 9
ld c, a
diff --git a/engine/overworld/map_sprite_functions1.asm b/engine/overworld/map_sprite_functions1.asm
index a8412a4e..722fc14e 100644
--- a/engine/overworld/map_sprite_functions1.asm
+++ b/engine/overworld/map_sprite_functions1.asm
@@ -28,7 +28,7 @@ _UpdateSprites: ; 4bb7 (1:4bb7)
and a
jp z, UpdatePlayerSprite
cp $f0 ; pikachu
- jp z, Func_1552
+ jp z, SpawnPikachu
ld a, [hl]
UpdateNonPlayerSprite: ; 4be3 (1:4be3)
diff --git a/engine/overworld/map_sprites.asm b/engine/overworld/map_sprites.asm
index 1f13ddd2..10f0362e 100755
--- a/engine/overworld/map_sprites.asm
+++ b/engine/overworld/map_sprites.asm
@@ -20,26 +20,26 @@ _InitMapSprites: ; 1401b (5:401b)
; Loads sprite set for outside maps (cities and routes) and sets VRAM slots.
; sets carry if the map is a city or route, unsets carry if not
InitOutsideMapSprites: ; 14029 (5:4029)
- ld a,[wCurMap]
- cp a,REDS_HOUSE_1F ; is the map a city or a route (map ID less than $25)?
+ ld a, [wCurMap]
+ cp a, REDS_HOUSE_1F ; is the map a city or a route (map ID less than $25)?
ret nc ; if not, return
call GetSplitMapSpriteSetID
; if so, choose the appropriate one
- ld b,a ; b = spriteSetID
- ld a,[wFontLoaded]
- bit 0,a ; reloading upper half of tile patterns after displaying text?
- jr nz,.loadSpriteSet ; if so, forcibly reload the sprite set
- ld a,[wSpriteSetID]
+ ld b, a ; b = spriteSetID
+ ld a, [wFontLoaded]
+ bit 0, a ; reloading upper half of tile patterns after displaying text?
+ jr nz, .loadSpriteSet ; if so, forcibly reload the sprite set
+ ld a, [wSpriteSetID]
cp b ; has the sprite set ID changed?
- jr z,.skipLoadingSpriteSet ; if not, don't load it again
+ jr z, .skipLoadingSpriteSet ; if not, don't load it again
.loadSpriteSet
- ld a,b
- ld [wSpriteSetID],a
+ ld a, b
+ ld [wSpriteSetID], a
dec a
- ld c,a
- ld b,0
+ ld c, a
+ ld b, 0
ld a, (wSpriteSetID - wSpriteSet)
- ld hl,SpriteSets
+ ld hl, SpriteSets
call AddNTimes ; get sprite set offset
ld de, wSpriteSet
ld bc, (wSpriteSetID - wSpriteSet)
@@ -64,8 +64,8 @@ LoadSpriteSetFromMapHeader: ; 14061 (5:4061)
call FillMemory
ld a, SPRITE_PIKACHU ; load Pikachu separately
ld [wSpriteSet], a
- ld hl,wSpriteStateData1 + $10
- ld a,$0e
+ ld hl, wSprite01SpriteStateData1
+ ld a, 14
.storeVRAMSlotsLoop
push af
ld a, [hl] ; $C1X0 (picture ID) (zero if sprite slot is not used)
@@ -79,13 +79,14 @@ LoadSpriteSetFromMapHeader: ; 14061 (5:4061)
ld b, 2
call CheckIfPictureIDAlreadyLoaded
jr .continue
+
.isFourTileSprite
; loop through the space reserved for regular picture IDs
ld de, wSpriteSet
ld b, 9
call CheckIfPictureIDAlreadyLoaded
.continue
- ld de, $10
+ ld de, wSprite02SpriteStateData1 - wSprite01SpriteStateData1
add hl, de
pop af
dec a
@@ -96,6 +97,7 @@ CheckIfPictureIDAlreadyLoaded: ; 1409b (5:409b)
; Check if the current picture ID has already had its tile patterns loaded.
; This done by looping through the previous sprite slots and seeing if any of
; their picture ID's match that of the current sprite slot.
+.loop
ld a, [de]
and a ; is sprite set slot not taken up yet?
jr z, .spriteSlotNotTaken ; if so, load it as it signifies we've reached
@@ -106,7 +108,8 @@ CheckIfPictureIDAlreadyLoaded: ; 1409b (5:409b)
dec b ; have we reached the end of the sprite set?
jr z, .spriteNotAlreadyLoaded ; if so, we're done here
inc de
- jr CheckIfPictureIDAlreadyLoaded
+ jr .loop
+
.spriteSlotNotTaken
ld a, c
ld [de], a
@@ -127,6 +130,7 @@ CheckForFourTileSprite: ; 140ac (5:40ac)
; regular sprite
and a
ret
+
.notYellowSprite
scf
ret
@@ -140,6 +144,7 @@ LoadMapSpriteTilePatterns: ; 140b7 (5:40b7)
call LoadStillTilePattern
call LoadWalkingTilePattern
jr .continue
+
.fourTileSprite
call LoadStillTilePattern
.continue
@@ -202,7 +207,7 @@ GetSpriteVRAMAddress: ; 14018 (5:4108)
SpriteVRAMAddresses: ; 14118 (5:4118)
; Equivalent to multiplying $C0 (number of bytes in 12 tiles) times the VRAM
; slot and adding the result to $8000 (the VRAM base address).
- dw vChars0 + $c0
+ dw vChars0 + $0c0
dw vChars0 + $180
dw vChars0 + $240
dw vChars0 + $300
@@ -211,8 +216,8 @@ SpriteVRAMAddresses: ; 14118 (5:4118)
dw vChars0 + $540
dw vChars0 + $600
dw vChars0 + $6c0
- dw vChars0 + $780
- dw vChars0 + $7c0
+ dw vChars0 + $780 ; 4-tile sprites
+ dw vChars0 + $7c0 ; 4-tile sprites
ReadSpriteSheetData: ; 1412e (5:412e)
ld a, [hVRAMSlot]
@@ -246,12 +251,11 @@ ReadSpriteSheetData: ; 1412e (5:412e)
Func_14150: ; 14150 (5:4150)
ld a, $1
- ld [wSpriteStateData2 + $e], a ; vram slot for player
+ ld [wPlayerSpriteImageBaseOffset], a ; vram slot for player
ld a, $2
- ld [wSpriteStateData2 + $fe], a ; vram slot for Pikachu
-
+ ld [wPikachuSpriteImageBaseOffset], a ; vram slot for Pikachu
ld a, $e
- ld hl, wSpriteStateData1 + $10
+ ld hl, wSprite01SpriteStateData1
.loop
ld [hVRAMSlot], a ; store current sprite set slot as a counter
ld a, [hl] ; $c1x0 (picture ID)
@@ -259,12 +263,12 @@ Func_14150: ; 14150 (5:4150)
jr z, .spriteUnused
call Func_14179
push hl
- ld de, (wSpriteStateData2 + $e) - (wSpriteStateData1) ; $10e
+ ld de, (wPlayerSpriteImageBaseOffset) - (wSpriteStateData1) ; $10e
add hl, de ; get $c2xe (sprite image base offset)
ld [hl], a ; write offset
pop hl
.spriteUnused
- ld de, $10
+ ld de, wSprite02SpriteStateData1 - wSprite01SpriteStateData1
add hl, de
ld a, [hVRAMSlot]
dec a
@@ -297,67 +301,68 @@ Func_14179: ; 14179 (5:4179)
GetSplitMapSpriteSetID: ; 14193 (5:4193)
ld e, a
ld d, 0
- ld hl,MapSpriteSets
+ ld hl, MapSpriteSets
add hl, de
- ld a,[hl] ; a = spriteSetID
- cp a,$f0 ; does the map have 2 sprite sets?
+ ld a, [hl] ; a = spriteSetID
+ cp a, $f0 ; does the map have 2 sprite sets?
ret c
; Chooses the correct sprite set ID depending on the player's position within
; the map for maps with two sprite sets.
- cp a,$f8
- jr z,.route20
- ld hl,SplitMapSpriteSets
- and a,$0f
+ cp a, $f8
+ jr z, .route20
+ ld hl, SplitMapSpriteSets
+ and a, $0f
dec a
add a
add a
add l
- ld l,a
- jr nc,.noCarry
+ ld l, a
+ jr nc, .noCarry
inc h
.noCarry
- ld a,[hli] ; determines whether the map is split East/West or North/South
- cp a,$01
- ld a,[hli] ; position of dividing line
- ld b,a
- jr z,.eastWestDivide
+ ld a, [hli] ; determines whether the map is split East/West or North/South
+ cp a, $01
+ ld a, [hli] ; position of dividing line
+ ld b, a
+ jr z, .eastWestDivide
.northSouthDivide
- ld a,[wYCoord]
+ ld a, [wYCoord]
jr .compareCoord
+
.eastWestDivide
- ld a,[wXCoord]
+ ld a, [wXCoord]
.compareCoord
cp b
- jr c,.loadSpriteSetID
+ jr c, .loadSpriteSetID
; if in the East side or South side
inc hl
.loadSpriteSetID
- ld a,[hl]
+ ld a, [hl]
ret
; Uses sprite set $01 for West side and $0A for East side.
; Route 20 is a special case because the two map sections have a more complex
; shape instead of the map simply being split horizontally or vertically.
.route20
- ld hl,wXCoord
- ld a,[hl]
- cp a,$2b
- ld a,$01
+ ld hl, wXCoord
+ ld a, [hl]
+ cp a, $2b
+ ld a, $01
ret c
- ld a,[hl]
- cp a,$3e
- ld a,$0a
+ ld a, [hl]
+ cp a, $3e
+ ld a, $0a
ret nc
- ld a,[hl]
- cp a,$37
- ld b,$08
- jr nc,.next
- ld b,$0d
+ ld a, [hl]
+ cp a, $37
+ ld b, $08
+ jr nc, .next
+ ld b, $0d
.next
- ld a,[wYCoord]
+ ld a, [wYCoord]
cp b
- ld a,$0a
+ ld a, $0a
ret c
- ld a,$01
+ ld a, $01
ret
-INCLUDE "data/sprite_sets.asm" \ No newline at end of file
+INCLUDE "data/sprite_sets.asm"
diff --git a/engine/overworld/movement.asm b/engine/overworld/movement.asm
index 9ca03ff4..5f929ce3 100644
--- a/engine/overworld/movement.asm
+++ b/engine/overworld/movement.asm
@@ -53,7 +53,7 @@ UpdatePlayerSprite: ; 4da5 (1:4da5)
ld a, SPRITE_FACING_RIGHT
jr .next
.next
- ld [wSpriteStateData1 + 9], a ; facing direction
+ ld [wPlayerFacingDirection], a ; facing direction
ld a, [wFontLoaded]
bit 0, a
jr z, .moving
@@ -89,7 +89,7 @@ UpdatePlayerSprite: ; 4da5 (1:4da5)
Func_4e32: ; 4e32 (1:4e32)
ld a, [wSpriteStateData1 + 8]
ld b, a
- ld a, [wSpriteStateData1 + 9]
+ ld a, [wPlayerFacingDirection]
add b
ld [wSpriteStateData1 + 2], a
ret
diff --git a/engine/overworld/player_animations.asm b/engine/overworld/player_animations.asm
index a78dba35..bea43308 100755
--- a/engine/overworld/player_animations.asm
+++ b/engine/overworld/player_animations.asm
@@ -35,7 +35,7 @@ EnterMapAnim: ; 70567 (1c:4567)
ld hl, wFacingDirectionList
call PlayerSpinInPlace
ld a, $1
- ld [wd431], a
+ ld [wPikachuSpawnState], a
.restoreDefaultMusic
call PlayDefaultMusic
.done
@@ -46,7 +46,7 @@ EnterMapAnim: ; 70567 (1c:4567)
call DelayFrames
call PlayerSpinWhileMovingDown
ld a, $0
- ld [wd431], a
+ ld [wPikachuSpawnState], a
jr .done
.flyAnimation
pop hl
@@ -63,7 +63,7 @@ EnterMapAnim: ; 70567 (1c:4567)
call DoFlyAnimation
call LoadPlayerSpriteGraphics
ld a, $1
- ld [wd431], a
+ ld [wPikachuSpawnState], a
jr .restoreDefaultMusic
FlyAnimationEnterScreenCoords: ; 705ed (1c:45ed)
diff --git a/engine/overworld/pokecenter.asm b/engine/overworld/pokecenter.asm
index bf47bf60..65dfcd87 100755
--- a/engine/overworld/pokecenter.asm
+++ b/engine/overworld/pokecenter.asm
@@ -63,7 +63,7 @@ DisplayPokemonCenterDialogue_: ; 6d97 (1:6d97)
callab IsStarterPikachuInOurParty
call c, Func_6eaa
ld a, $5
- ld [wd431], a
+ ld [wPikachuSpawnState], a
call Func_1525
.doNotReturnPikachu
lb bc, 1, 0
diff --git a/engine/overworld/ssanne.asm b/engine/overworld/ssanne.asm
index ece4446d..d0d957be 100755
--- a/engine/overworld/ssanne.asm
+++ b/engine/overworld/ssanne.asm
@@ -32,7 +32,7 @@ AnimateBoulderDust: ; 7a0fb (1e:60fb)
jp LoadPlayerSpriteGraphics
GetMoveBoulderDustFunctionPointer: ; 7913f (1e:613f)
- ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
+ ld a, [wPlayerFacingDirection] ; player's sprite facing direction
ld hl, MoveBoulderDustFunctionPointerTable
ld c, a
ld b, $0
diff --git a/engine/overworld/step_functions.asm b/engine/overworld/step_functions.asm
index 5b9c7e2b..bc1a74aa 100644
--- a/engine/overworld/step_functions.asm
+++ b/engine/overworld/step_functions.asm
@@ -2,7 +2,7 @@ ApplyOutOfBattlePoisonDamage: ; c3de (3:43de)
ld a, [wd730]
add a
jp c, .noBlackOut ; no black out if joypad states are being simulated
- ld a, [wPreventBlackout]
+ ld a, [wd492]
bit 7, a
jp nz, .noBlackOut
ld a, [wd72e]
diff --git a/engine/overworld/try_pushing_boulder.asm b/engine/overworld/try_pushing_boulder.asm
index 89e83ff9..b7e04092 100644
--- a/engine/overworld/try_pushing_boulder.asm
+++ b/engine/overworld/try_pushing_boulder.asm
@@ -38,7 +38,7 @@ Func_f0a7: ; f0a7 (3:70a7)
jp nz, ResetBoulderPushFlags
ld a, [hJoyHeld]
ld b, a
- ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
+ ld a, [wPlayerFacingDirection] ; player's sprite facing direction
cp SPRITE_FACING_UP
jr z, .pushBoulderUp
cp SPRITE_FACING_LEFT
diff --git a/engine/palettes.asm b/engine/palettes.asm
index f5a3ed49..636e5e97 100755
--- a/engine/palettes.asm
+++ b/engine/palettes.asm
@@ -164,9 +164,9 @@ SetPal_Overworld: ; 71fa5 (1c:5fa5)
cp BRUNOS_ROOM
jr z, .caveOrBruno
cp TRADE_CENTER
- jr z, .asm_71ffd
+ jr z, .trade_center_colosseum
cp COLOSSEUM
- jr z, .asm_71ffd
+ jr z, .trade_center_colosseum
.normalDungeonOrBuilding
ld a, [wLastMap] ; town or route that current dungeon or building is located
.townOrRoute
@@ -181,17 +181,21 @@ SetPal_Overworld: ; 71fa5 (1c:5fa5)
ld a, SET_PAL_OVERWORLD
ld [wDefaultPaletteCommand], a
ret
+
.PokemonTowerOrAgatha
ld a, PAL_GREYMON - 1
jr .town
+
.caveOrBruno
ld a, PAL_CAVE - 1
jr .town
+
.Lorelei
xor a
jr .town
-.asm_71ffd
- ld a, $18
+
+.trade_center_colosseum
+ ld a, PAL_GREYMON - 1
jr .town
; used when a Pokemon is the only thing on the screen
@@ -313,17 +317,17 @@ DeterminePaletteIDOutOfBattle: ; 72094 (1c:6094)
ld a, [hl]
ret
-Func_720ad:: ; 720ad (1c:60ad)
+YellowIntroPaletteAction:: ; 720ad (1c:60ad)
ld a, e
and a
- jr nz, Func_720bd
+ jr nz, .asm_720bd
ld hl, PalPacket_Generic
ld a, [hGBC]
and a
jp z, SendSGBPacket
jp InitGBCPalettes
-Func_720bd:: ; 720bd (1c:60bd)
+.asm_720bd
ld hl, UnknownPalPacket_72811
ld a, [hGBC]
and a
@@ -343,12 +347,12 @@ Func_720bd:: ; 720bd (1c:60bd)
call TransferCurBGPData
ret
-Func_720e3:: ; 720e3 (1c:60e3)
+LoadOverworldPikachuFrontpicPalettes:: ; 720e3 (1c:60e3)
ld hl, PalPacket_Empty
ld de, wPalPacket
ld bc, $10
call CopyData
- call Func_7213b
+ call GetPal_Pikachu
ld hl, wPartyMenuBlkPacket
ld [hl], a
ld hl, wPartyMenuBlkPacket + 2
@@ -357,12 +361,13 @@ Func_720e3:: ; 720e3 (1c:60e3)
ld hl, wPalPacket
ld a, [hGBC]
and a
- jr nz, .asm_72109
+ jr nz, .cgb_1
call SendSGBPacket
- jr .asm_7210c
-.asm_72109
+ jr .okay_1
+
+.cgb_1
call InitGBCPalettes
-.asm_7210c
+.okay_1
ld hl, BlkPacket_WholeScreen
ld de, wPalPacket
ld bc, $10
@@ -381,15 +386,16 @@ Func_720e3:: ; 720e3 (1c:60e3)
ld hl, wPalPacket
ld a, [hGBC]
and a
- jr nz, .asm_72137
+ jr nz, .cgb_2
call SendSGBPacket
- jr .asm_7213a
-.asm_72137
+ jr .okay_2
+
+.cgb_2
call InitGBCPalettes
-.asm_7213a
+.okay_2
ret
-Func_7213b:: ; 7213b (1c:613b)
+GetPal_Pikachu:: ; 7213b (1c:613b)
; similar to SetPal_Overworld
ld a, [wCurMapTileset]
cp CEMETERY
@@ -420,17 +426,21 @@ Func_7213b:: ; 7213b (1c:613b)
.town
inc a ; a town's pallete ID is its map ID + 1
ret
+
.PokemonTowerOrAgatha
ld a, PAL_GREYMON - 1
jr .town
+
.caveOrBruno
ld a, PAL_CAVE - 1
jr .town
+
.Lorelei
- xor a
+ xor a ; PAL_PALLET - 1
jr .town
+
.battleOrTradeCenter
- ld a, $18
+ ld a, PAL_GREYMON - 1
jr .town
InitPartyMenuBlkPacket: ; 7217f (1c:617f)
diff --git a/engine/pikachu_emotions.asm b/engine/pikachu_emotions.asm
new file mode 100755
index 00000000..9040e612
--- /dev/null
+++ b/engine/pikachu_emotions.asm
@@ -0,0 +1,409 @@
+IsPlayerTalkingToPikachu:: ; fcf0c (3f:4f0c)
+ ld a, [wd436]
+ and a
+ ret z
+ ld a, [hSpriteIndexOrTextID]
+ cp $f
+ ret nz
+ call InitializePikachuTextID
+ xor a
+ ld [hSpriteIndexOrTextID], a
+ ld [wd436], a
+ ret
+
+InitializePikachuTextID: ; fcf20 (3f:4f20)
+ ld a, $d4 ; display
+ ld [hSpriteIndexOrTextID], a
+ xor a
+ ld [wPlayerMovingDirection], a
+ ld a, $1
+ ld [wAutoTextBoxDrawingControl], a
+ call DisplayTextID
+ xor a
+ ld [wAutoTextBoxDrawingControl], a
+ ret
+
+DoStarterPikachuEmotions: ; fcf35 (3f:4f35)
+ ld e, a
+ ld d, $0
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+.loop
+ ld a, [de]
+ inc de
+ cp $ff
+ jr z, .done
+ ld c, a
+ ld b, $0
+ ld hl, StarterPikachuEmotionsJumptable
+ add hl, bc
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call JumpToAddress
+ jr .loop
+.done
+ ret
+
+StarterPikachuEmotionsJumptable: ; fcf54 (3f:4f54)
+ dw StarterPikachuEmotionCommand_nop ; 0
+ dw StarterPikachuEmotionCommand_text ; 1
+ dw StarterPikachuEmotionCommand_pcm ; 2
+ dw StarterPikachuEmotionCommand_emote ; 3
+ dw StarterPikachuEmotionCommand_movement ; 4
+ dw StarterPikachuEmotionCommand_pikapic ; 5
+ dw StarterPikachuEmotionCommand_subcmd ; 6
+ dw StarterPikachuEmotionCommand_delay ; 7
+ dw StarterPikachuEmotionCommand_nop2 ; 8
+ dw StarterPikachuEmotionCommand_9 ; 9
+ dw StarterPikachuEmotionCommand_nop3 ; a
+
+StarterPikachuEmotionCommand_nop: ; fcf6a (3f:4f6a)
+StarterPikachuEmotionCommand_nop3: ; fcf6a (3f:4f6a)
+ ret
+
+StarterPikachuEmotionCommand_text: ; fcf6b (3f:4f6b)
+ ld a, [de]
+ ld l, a
+ inc de
+ ld a, [de]
+ ld h, a
+ inc de
+ push de
+ call PrintText
+ pop de
+ ret
+
+StarterPikachuEmotionCommand_pcm: ; fcf77 (3f:4f77)
+ ld a, [de]
+ inc de
+ push de
+ ld e, a
+ nop
+ call PlayPikachuSoundClip_
+ pop de
+ ret
+
+PlayPikachuSoundClip_: ; fcf81 (3f:4f81)
+ cp $ff
+ ret z
+ callab PlayPikachuSoundClip
+ ret
+
+StarterPikachuEmotionCommand_emote: ; fcf8d (3f:4f8d)
+ ld a, [wUpdateSpritesEnabled]
+ push af
+ ld a, $ff
+ ld [wUpdateSpritesEnabled], a
+ ld a, [de]
+ inc de
+ push de
+ call ShowPikachuEmoteBubble
+ pop de
+ pop af
+ ld [wUpdateSpritesEnabled], a
+ ret
+
+ShowPikachuEmoteBubble: ; fcfa2 (3f:4fa2)
+ ld [wWhichEmotionBubble], a
+ ld a, $f
+ ld [wEmotionBubbleSpriteIndex], a
+ predef EmotionBubble
+ ret
+
+StarterPikachuEmotionCommand_movement: ; fcfb0 (3f:4fb0)
+ ld a, [de]
+ inc de
+ ld l, a
+ ld a, [de]
+ inc de
+ ld h, a
+ push de
+ ld b, BANK(DoStarterPikachuEmotions)
+ call ApplyPikachuMovementData_
+ pop de
+ ret
+
+StarterPikachuEmotionCommand_delay: ; fcfbe (3f:4fbe)
+ ld a, [de]
+ inc de
+ push de
+ ld c, a
+ call DelayFrames
+ pop de
+ ret
+
+StarterPikachuEmotionCommand_subcmd: ; fcfc7 (3f:4fc7)
+ ld a, [de]
+ inc de
+ push de
+ ld e, a
+ ld d, $0
+ ld hl, Jumptable_fcfda
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call JumpToAddress
+ pop de
+ ret
+
+Jumptable_fcfda:
+ dw LoadPikachuSpriteIntoVRAM
+ dw LoadFontTilePatterns
+ dw Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3
+ dw WaitForTextScrollButtonPress
+ dw PikachuPewterPokecenterCheck
+ dw PikachuFanClubCheck
+ dw PikachuBillsHouseCheck
+
+StarterPikachuEmotionCommand_nop2: ; fcfe8 (3f:4fe8)
+ ret
+
+StarterPikachuEmotionCommand_9: ; fcfe9 (3f:4fe9)
+ push de
+ call StarterPikachuEmotionCommand_turnawayfromplayer
+ call UpdateSprites
+ pop de
+ ret
+
+StarterPikachuEmotionCommand_turnawayfromplayer: ; fcff2 (3f:4ff2)
+ ld a, [wPlayerFacingDirection]
+ xor $4
+ ld [wPikachuFacingDirection], a
+ ret
+
+DeletedFunction_fcffb: ; fcffb (3f:4ffb)
+; Inexplicably empty.
+ rept 5
+ nop
+ endr
+ ret
+
+Func_fd001:: ; fd001 (3f:5001)
+ ld a, e
+ jr load_expression
+
+Func_fd004:: ; fd004 (3f:5004)
+ call MapSpecificPikachuExpression
+ jr c, load_expression
+ call GetPikaPicAnimationScriptIndex
+ call DeletedFunction_fcffb
+load_expression: ; fd00f (3f:500f)
+ ld [wExpressionNumber], a
+ ld hl, PikachuEmotionTable
+ call DoStarterPikachuEmotions
+ ret
+
+PikachuEmotionTable: ; fd019 (3f:4019)
+ dw PikachuEmotion0_fd115
+ dw PikachuEmotion1_fd141
+ dw PikachuEmotion2_fd116
+ dw PikachuEmotion3_fd160
+ dw PikachuEmotion4_fd136
+ dw PikachuEmotion5_fd14d
+ dw PikachuEmotion6_fd153
+ dw PikachuEmotion7_fd128
+ dw PikachuEmotion8_fd147
+ dw PikachuEmotion9_fd166
+ dw PikachuEmotion10_fd11e
+ dw PikachuEmotion11_fd173
+ dw PikachuEmotion12_fd17a
+ dw PikachuEmotion13_fd180
+ dw PikachuEmotion14_fd189
+ dw PikachuEmotion15_fd191
+ dw PikachuEmotion16_fd197
+ dw PikachuEmotion17_fd19d
+ dw PikachuEmotion18_fd1a3
+ dw PikachuEmotion19_fd1a9
+ dw PikachuEmotion20_fd1b1
+ dw PikachuEmotion21_fd1b9 ; used a fishing rod
+ dw PikachuEmotion22_fd1c1
+ dw PikachuEmotion23_fd1c7
+ dw PikachuEmotion24_fd1cf
+ dw PikachuEmotion25_fd1d7
+ dw PikachuEmotion26_fd1df ; wake up pikachu in pewter pokemon center
+ dw PikachuEmotion27_fd1eb
+ dw PikachuEmotion28_fd1f1
+ dw PikachuEmotion29_fd1f7
+ dw PikachuEmotion30_fd1fc
+ dw PikachuEmotion31_fd20a
+ dw PikachuEmotion32_fd213
+ dw PikachuEmotion33_fd05d
+
+PikachuEmotion33_fd05d: ; fd05d (3f:505d)
+ db $ff
+
+MapSpecificPikachuExpression: ; fd05e (3f:505e)
+ ld a, [wCurMap]
+ cp POKEMON_FAN_CLUB
+ jr nz, .notFanClub
+ ld hl, wd492
+ bit 7, [hl]
+ ld a, $1d
+ jr z, .set_carry
+ call CheckPikachuFollowingPlayer
+ ld a, $1e
+ jr nz, .set_carry
+ jr .check_pikachu_status
+
+.notFanClub
+ ld a, [wCurMap]
+ cp PEWTER_POKECENTER
+ jr nz, .notPewterPokecenter
+ call CheckPikachuFollowingPlayer
+ ld a, $1a
+ jr nz, .set_carry
+ jr .check_pikachu_status
+
+.notPewterPokecenter
+ callab Func_f24ae
+ ld a, e
+ cp $ff
+ jr nz, .set_carry
+ jr .check_pikachu_status ; useless
+
+.check_pikachu_status
+ call IsPlayerPikachuAsleepInParty
+ ld a, $b
+ jr c, .set_carry
+ callab CheckPikachuFaintedOrStatused ; same bank
+ ld a, $1c
+ jr c, .set_carry
+ ld a, [wCurMap]
+ cp POKEMONTOWER_1
+ jr c, .notInLavenderTower
+ cp POKEMONTOWER_7 + 1
+ ld a, $16
+ jr c, .set_carry
+.notInLavenderTower
+ ld a, [wd49c]
+ and a
+ jr z, .no_carry
+ dec a
+ ld c, a
+ ld b, $0
+ ld hl, Pointer_fd0cb
+ add hl, bc
+ ld a, [hl]
+ jr .set_carry
+
+.no_carry
+ and a
+ ret
+
+.set_carry
+ scf
+ ret
+
+Pointer_fd0cb:
+ db $12, $15, $17, $18, $19
+
+IsPlayerPikachuAsleepInParty:: ; fd0d0 (3f:50d0)
+ xor a
+ ld [wWhichPokemon], a
+.loop
+ ld a, [wWhichPokemon]
+ ld c, a
+ ld b, $0
+ ld hl, wPartySpecies
+ add hl, bc
+ ld a, [hl]
+ cp $ff
+ jr z, .done
+ cp PIKACHU
+ jr nz, .curMonNotStarterPikachu
+ callab IsThisPartymonStarterPikachu
+ jr nc, .curMonNotStarterPikachu
+ ld a, [wWhichPokemon]
+ ld hl, wPartyMon1Status
+ ld bc, wPartyMon2 - wPartyMon1
+ call AddNTimes
+ ld a, [hl]
+ and SLP
+ jr z, .done
+ jr .curMonSleepingPikachu
+.curMonNotStarterPikachu
+ ld a, [wWhichPokemon]
+ cp PARTY_LENGTH - 1
+ jr z, .done
+ inc a
+ ld [wWhichPokemon], a
+ jr .loop
+.curMonSleepingPikachu
+ scf
+ ret
+.done
+ and a
+ ret
+
+INCLUDE "data/pikachu_emotions.asm"
+
+Func_fd252: ; fd252 (3f:5252)
+ ld a, $40
+ ld [h_0xFFFC], a
+ call LoadPikachuSpriteIntoVRAM
+ call Func_fd266
+ and a
+ jr z, .asm_fd262
+ call ApplyPikachuMovementData
+.asm_fd262
+ xor a
+ ld [h_0xFFFC], a
+ ret
+
+Func_fd266:
+ ld a, [wSpriteStateData2 + 15 * 16 + 4]
+ ld e, a
+ ld a, [wSpriteStateData2 + 15 * 16 + 5]
+ ld d, a
+ ld a, [wYCoord]
+ add 4
+ cp e
+ jr z, .asm_fd280
+ jr nc, .asm_fd27e
+ ld hl, Data_fd294
+ ld a, 1
+ ret
+
+.asm_fd27e
+ xor a
+ ret
+
+.asm_fd280
+ ld a, [wXCoord]
+ add 4
+ cp d
+ jr c, .asm_fd28e
+ ld hl, Data_fd299
+ ld a, 2
+ ret
+
+.asm_fd28e
+ ld hl, Data_fd29d
+ ld a, 3
+ ret
+
+Data_fd294:
+ db $00
+ db $36
+ db $2b
+ db $34
+ db $3f
+
+Data_fd299:
+ db $00
+ db $36
+ db $34
+ db $3f
+
+Data_fd29d:
+ db $00
+ db $36
+ db $33
+ db $3f
diff --git a/engine/pikachu_follow.asm b/engine/pikachu_follow.asm
new file mode 100755
index 00000000..a715b0a3
--- /dev/null
+++ b/engine/pikachu_follow.asm
@@ -0,0 +1,1577 @@
+Func_fc4dd:: ; fc4dd (3f:44dd)
+; possibly to test if pika should be out?
+ ld a, [wPikachuOverworldStateFlags]
+ bit 5, a
+ jr nz, .hide ; 3f:44f8
+ ld a, [wPikachuOverworldStateFlags]
+ bit 7, a
+ jr nz, .hide
+ call IsStarterPikachuInOurParty
+ jr nc, .hide
+ ld a, [wWalkBikeSurfState]
+ and a
+ jr nz, .hide
+ scf
+ ret
+
+.hide
+ and a
+ ret
+
+Func_fc4fa:: ; fc4fa (3f:44fa)
+ ld hl, wPikachuOverworldStateFlags
+ bit 4, [hl]
+ res 4, [hl]
+ jr nz, .normal_spawn_state
+ call EnablePikachuFollowingPlayer
+ call ClearPikachuSpriteStateData
+ ld a, $ff
+ ld [wPikachuSpriteImageIdx], a
+ call ClearPikachuFollowCommandBuffer
+ call CalculatePikachuFacingDirection
+ ret
+
+.normal_spawn_state
+ call CalculatePikachuPlacementCoords
+ xor a
+ ld [wPikachuSpawnState], a
+ ld a, [wPlayerFacingDirection]
+ ld [wPikachuFacingDirection], a
+ ret
+
+ClearPikachuSpriteStateData:: ; fc523 (3f:4523)
+ ld hl, wPikachuPictureID
+ call .clear
+ ld hl, wPikachuSpriteStateData2
+.clear
+ ld bc, $10
+ xor a
+ call FillMemory
+ ret
+
+Func_fc534:: ; fc534 (3f:4534)
+ call CalculatePikachuPlacementCoords
+ call CalculatePikachuFacingDirection
+ xor a
+ ld [wPikachuSpawnState], a
+ ret
+
+CalculatePikachuPlacementCoords:: ; fc53f (3f:453f)
+ ld bc, wPikachuPictureID
+ ld a, [wYCoord]
+ add $4
+ ld e, a
+ ld a, [wXCoord]
+ add $4
+ ld d, a
+ ld a, [wPikachuSpawnState]
+ and a
+ jr z, .load_coords
+ cp $1
+ jr z, .right_of_player
+ cp $2
+ jr z, .check_player_facing2
+ cp $3
+ jr z, .load_coords
+ cp $4
+ jr z, .below_player
+ cp $5
+ jr z, .above_player
+ cp $6
+ jr z, .left_of_player
+ cp $7
+ jr z, .check_player_facing
+ jr .right_of_player
+
+.check_player_facing
+ ld a, [wPlayerFacingDirection]
+ and a ; SPRITE_FACING_DOWN
+ jr z, .below_player
+ cp SPRITE_FACING_UP
+ jr z, .above_player
+ cp SPRITE_FACING_LEFT
+ jr z, .left_of_player
+ cp SPRITE_FACING_RIGHT
+ jr z, .right_of_player
+.check_player_facing2
+ ld a, [wPlayerFacingDirection]
+ and a
+ jr nz, .check_up
+ dec e
+ jr .load_coords
+
+.check_up
+ cp SPRITE_FACING_UP
+ jr nz, .check_left
+ inc e
+ jr .load_coords
+
+.check_left
+ cp SPRITE_FACING_LEFT
+ jr nz, .left_of_player_2
+ inc d
+ jr .load_coords
+
+.left_of_player_2
+ dec d
+ jr .load_coords
+
+.right_of_player
+ inc d
+ jr .load_coords
+
+.left_of_player
+ dec d
+ jr .load_coords
+
+.below_player
+ inc e
+ jr .load_coords
+
+.above_player
+ dec e
+ jr .load_coords ; useless jr
+.load_coords
+ ld hl, wPlayerMapY - wPlayerSpriteStateData1
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ inc hl
+ ld [hl], $fe
+ push hl
+ ld hl, wd472
+ set 5, [hl]
+ pop hl
+ ret
+
+CalculatePikachuFacingDirection:: ; fc5bc (3f:45bc)
+ ld a, $49
+ ld [wPikachuPictureID], a
+ ld a, $ff
+ ld [wPikachuSpriteImageIdx], a
+ ld a, [wPikachuSpawnState]
+ and a
+ jr z, .copy_player_facing
+ cp $1
+ jr z, .copy_player_facing
+ cp $3
+ jr z, .force_facing_down
+ cp $4
+ jr z, .copy_player_facing
+ cp $6
+ jr z, .copy_player_facing
+ cp $7
+ jr z, .face_the_other_way
+ call ComputePikachuFacingDirection
+ ret
+
+.copy_player_facing
+ ld a, [wPlayerFacingDirection]
+ ld [wPikachuFacingDirection], a
+ ret
+
+.force_facing_down
+ ld a, SPRITE_FACING_DOWN
+ ld [wPikachuFacingDirection], a
+ ret
+
+.face_the_other_way
+ ld a, [wPlayerFacingDirection]
+ xor $4
+ ld [wPikachuFacingDirection], a
+ ret
+
+CalculatePikachuSpawnState1:: ; fc5fa (3f:45fa)
+ ld a, [wCurMap]
+ cp OAKS_LAB
+ jr z, .oaks_lab
+ cp ROUTE_22_GATE
+ jr z, .route_22_gate
+ cp MT_MOON_2
+ jr z, .mt_moon_2
+ cp ROCK_TUNNEL_1
+ jr z, .rock_tunnel_1
+ ld a, [wCurMap]
+ ld hl, Pointer_fc64b
+ call Pikachu_IsInArray ; similar to IsInArray, but not the same
+ jr c, .map_list_1
+ ld a, [wCurMap]
+ ld hl, Pointer_fc653
+ call Pikachu_IsInArray
+ jr nc, .not_map_list_2
+ ld a, [wPlayerFacingDirection]
+ and a
+ jr nz, .not_map_list_2
+ ld a, $3
+ jr .load
+
+.route_22_gate
+ ld a, [wPlayerFacingDirection]
+ and a
+ jr z, .rock_tunnel_1
+ jr .not_map_list_2
+
+.mt_moon_2
+ ld a, $3
+ jr .load
+
+.map_list_1
+ ld a, $4
+ jr .load
+
+.oaks_lab
+ ld a, $6
+ jr .load
+
+.not_map_list_2
+ ld a, $1
+ jr .load
+
+.rock_tunnel_1
+ ld a, $3
+.load
+ ld [wPikachuSpawnState], a
+ ret
+
+Pointer_fc64b:: ; fc64b (3f:464b)
+ db VICTORY_ROAD_2
+ db ROUTE_7_GATE
+ db ROUTE_8_GATE
+ db ROUTE_16_GATE_1F
+ db ROUTE_18_GATE_1F
+ db ROUTE_15_GATE_1F
+ db ROUTE_11_GATE_1F
+ db $ff
+
+Pointer_fc653:: ; fc653 (3f:4653)
+ db VIRIDIAN_FOREST_EXIT
+ db CERULEAN_HOUSE_2
+ db TRASHED_HOUSE
+ db VERMILION_DOCK
+ db CELADON_MANSION_1
+ db ROUTE_2_GATE
+ db FUCHSIA_HOUSE_3
+ db $ff
+
+CalculatePikachuSpawnState2:: ; fc65b (3f:465b)
+ ld a, [wCurMap]
+ cp VIRIDIAN_FOREST_EXIT
+ jr z, .viridian_forest_exit
+ cp VIRIDIAN_FOREST_ENTRANCE
+ jr z, .viridian_forest_entrance
+ ld a, [wCurMap]
+ ld hl, Pointer_fc68e
+ call Pikachu_IsInArray
+ jr c, .in_array
+ jr .not_in_array
+
+.viridian_forest_exit
+ ld a, [wPlayerFacingDirection]
+ cp SPRITE_FACING_UP
+ jr z, .in_array
+ jr .not_in_array
+
+.viridian_forest_entrance
+ ld a, [wPlayerFacingDirection]
+ and a ; SPRITE_FACING_DOWN
+ jr z, .not_in_array
+ jr .in_array
+
+.not_in_array
+ ld a, $0
+ jr .load_spawn_state
+
+.in_array
+ ld a, $1
+.load_spawn_state
+ ld [wPikachuSpawnState], a
+ ret
+
+Pointer_fc68e:: ; fc68e (3f:468e)
+ db VIRIDIAN_FOREST
+ db SAFARI_ZONE_REST_HOUSE_1
+ db SAFARI_ZONE_REST_HOUSE_2
+ db SAFARI_ZONE_REST_HOUSE_3
+ db SAFARI_ZONE_REST_HOUSE_4
+ db SAFARI_ZONE_SECRET_HOUSE
+ db SILPH_CO_ELEVATOR
+ db CELADON_MART_ELEVATOR
+ db CINNABAR_LAB_2
+ db CINNABAR_LAB_3
+ db CINNABAR_LAB_4
+ db $ff
+
+CalculatePikachuSpawnState3:: ; fc69a (3f:469a)
+ ld a, [wCurMap]
+ cp ROUTE_22_GATE
+ jr z, .asm_fc6a7
+ cp ROUTE_2_GATE
+ jr z, .asm_fc6b0
+ jr .asm_fc6bd
+
+.asm_fc6a7
+ ld a, [wPlayerFacingDirection]
+ cp SPRITE_FACING_UP
+ jr z, .asm_fc6b9
+ jr .asm_fc6bd
+
+.asm_fc6b0
+ ld a, [wPlayerFacingDirection]
+ cp SPRITE_FACING_UP
+ jr z, .asm_fc6b9
+ jr .asm_fc6bd
+
+.asm_fc6b9
+ ld a, $1
+ jr .asm_fc6c1
+
+.asm_fc6bd
+ ld a, $3
+ jr .asm_fc6c1
+
+.asm_fc6c1
+ ld [wPikachuSpawnState], a
+ ret
+
+SetPikachuOverworldStateFlag2:: ; fc6c5 (3f:46c5)
+ push hl
+ ld hl, wPikachuOverworldStateFlags
+ set 2, [hl]
+ pop hl
+ ret
+
+ResetPikachuOverworldStateFlag2:: ; fc6cd (3f:46cd)
+ push hl
+ ld hl, wPikachuOverworldStateFlags
+ res 2, [hl]
+ pop hl
+ ret
+
+SpawnPikachu_:: ; fc6d5 (3f:46d5)
+ call ResetPikachuOverworldStateFlag2
+ call Func_fc727
+ ret nc
+
+ push bc
+ call WillPikachuSpawnOnTheScreen
+ pop bc
+ ret c
+
+ ld bc, wPikachuPictureID
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ bit 7, [hl]
+ jp nz, asm_fc745
+ ld a, [wFontLoaded]
+ bit 0, a
+ jp nz, asm_fc76a
+ call CheckPikachuFollowingPlayer
+ jp nz, asm_fc76a
+ ld a, [hl]
+ and $7f
+ cp $a
+ jr c, .valid
+ xor a
+.valid
+ add a
+ ld e, a
+ ld d, 0
+ ld hl, PointerTable_fc710
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+PointerTable_fc710: ; fc710 (3f:4710)
+ dw Func_fc793
+ dw Func_fc7aa
+ dw Func_fc803
+ dw asm_fc9c3
+ dw asm_fca1c
+ dw asm_fc9ee
+ dw asm_fc87f
+ dw asm_fc904
+ dw asm_fc937
+ dw asm_fc969
+ dw Func_fc726
+
+Func_fc726: ; fc726 (3f:4726)
+ ret
+
+Func_fc727: ; fc727 (3f:4727)
+ call Func_fc4dd
+ jr nc, .dont_spawn
+ ld a, [wPikachuMovementStatus]
+ and a
+ jr nz, .already_spawned
+ push bc
+ push hl
+ call Func_fc534
+ pop hl
+ pop bc
+.already_spawned
+ scf
+ ret
+
+.dont_spawn
+ ld hl, wPikachuSpriteImageIdx
+ ld [hl], $ff
+ dec hl
+ ld [hl], $0
+ xor a
+ ret
+
+asm_fc745: ; fc745 (3f:4745)
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ res 7, [hl]
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], a
+ call CheckPikachuFollowingPlayer
+ jr nz, .asm_fc75f
+ ld a, [wPlayerFacingDirection]
+ xor $4
+ ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], a
+.asm_fc75f
+ xor a
+ ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hli], a
+ ld [hl], a
+ call UpdatePikachuWalkingSprite
+ ret
+
+asm_fc76a: ; fc76a (3f:476a)
+ xor a
+ ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hli], a
+ ld [hl], a
+ call UpdatePikachuWalkingSprite
+ call Func_fc82e
+ jr c, .asm_fc783
+ push bc
+ callab InitializeSpriteScreenPosition
+ pop bc
+.asm_fc783
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $1
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $0
+ call RefreshPikachuFollow
+ ret
+
+Func_fc793: ; fc793 (3f:4793)
+ call RefreshPikachuFollow
+ push bc
+ callab InitializeSpriteScreenPosition
+ pop bc
+ ld hl, wSprite01SpriteImageIdx - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $ff
+ dec hl
+ ld [hl], $1
+ ret
+
+Func_fc7aa: ; fc7aa (3f:47aa)
+ call Func_fcc92
+ jp c, Func_fc803
+ dec a
+ ld l, a
+ ld h, $0
+ add hl, hl
+ add hl, hl
+ ld de, Pointer_fc7e3
+ add hl, de
+ ld d, h
+ ld e, l
+ ld a, [de]
+ inc de
+ ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], a
+ ld a, [de]
+ inc de
+ ld hl, wSprite01XStepVector - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], a
+ dec hl
+ dec hl
+ ld a, [de]
+ ld [hl], a
+ inc de
+ ld a, [de]
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], a
+ cp $4
+ jp z, Func_fca0a
+ call AreThereAtLeastTwoStepsInPikachuFollowCommandBuffer
+ jp c, FastPikachuFollow
+ jp NormalPikachuFollow
+
+Pointer_fc7e3: ; fc7e3 (3f:47e3)
+ db 0, 0
+ db 1, 3
+ db 4, 0
+ db -1, 3
+ db 8, -1
+ db 0, 3
+ db 12, 1
+ db 0, 3
+ db 0, 0
+ db 1, 4
+ db 4, 0
+ db -1, 4
+ db 8, -1
+ db 0, 4
+ db 12, 1
+ db 0, 4
+
+Func_fc803: ; fc803 (3f:4803)
+ call Func_fcae2
+ ret c
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ dec [hl]
+ jr nz, .asm_fc823
+ push hl
+ call GetPikachuFollowCommand
+ pop hl
+ cp $5
+ jr nc, Func_fc842
+ ld [hl], $20
+ call Random
+ and $c
+ ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], a
+.asm_fc823
+ xor a
+ ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hli], a
+ ld [hl], a
+ call UpdatePikachuWalkingSprite
+ ret
+
+Func_fc82e: ; fc82e (3f:482e)
+ ld a, [wWalkCounter]
+ and a
+ ret z
+ scf
+ ret
+
+Func_fc835: ; fc835 (3f:4835)
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $10
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $1
+ ret
+
+Func_fc842: ; fc842 (3f:4842)
+ ld hl, $0
+ push af
+ call Random
+ ld a, [hRandomAdd]
+ and %11
+ ld e, a
+ ld d, $0
+ ld hl, PointerTable_fc85a
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop af
+ jp hl
+
+PointerTable_fc85a: ; fc85a (3f:485a)
+ dw Func_fc862
+ dw Func_fc8f8
+ dw Func_fc92b
+ dw Func_fc95d
+
+Func_fc862: ; fc862 (3f:4862)
+ dec a
+ add a
+ add a
+ and $c
+ ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], a
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $6
+ xor a
+ ld [wd432], a
+ ld [wd433], a
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $11
+asm_fc87f: ; fc87f (3f:487f)
+ ld a, [wd432]
+ ld e, a
+ ld a, [wd433]
+ ld d, a
+ call Func_fc82e
+ jr c, Func_fc8c7
+ call SetPikachuOverworldStateFlag2
+ ld hl, wSprite01YPixels - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ sub e
+ ld e, a
+ inc hl
+ inc hl
+ ld a, [hl]
+ sub d
+ ld d, a
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ dec a
+ add a
+ add Pointer_fc8d6 % $100
+ ld l, a
+ ld a, Pointer_fc8d6 / $100
+ adc $0
+ ld h, a
+ ld a, [hli]
+ ld [wd432], a
+ add e
+ ld e, a
+ ld a, [hl]
+ ld [wd433], a
+ add d
+ ld d, a
+ ld hl, wSprite01YPixels - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], e
+ inc hl
+ inc hl
+ ld [hl], d
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ dec [hl]
+ ret nz
+ jp Func_fc835
+
+Func_fc8c7: ; fc8c7 (3f:48c7)
+ ld hl, wSprite01YPixels - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ sub e
+ ld [hl], a
+ inc hl
+ inc hl
+ ld a, [hl]
+ sub d
+ ld [hl], a
+ jp Func_fc835
+
+Pointer_fc8d6: ; fc8d6 (3f:48d6)
+ db 0, 0
+ db -2, 1
+ db -4, 2
+ db -2, 3
+ db 0, 4
+ db -2, 3
+ db -4, 2
+ db -2, 1
+ db 0, 0
+ db -2, -1
+ db -4, -2
+ db -2, -3
+ db 0, -4
+ db -2, -3
+ db -4, -2
+ db -2, -1
+ db 0, 0
+
+Func_fc8f8: ; fc8f8 (3f:48f8)
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $7
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $30
+asm_fc904: ; fc904 (3f:4904)
+ call Func_fc82e
+ jp c, Func_fc835
+ call SetPikachuOverworldStateFlag2
+ ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ inc a
+ cp $8
+ ld [hl], a
+ jr nz, .asm_fc91f
+ xor a
+ ld [hli], a
+ ld a, [hl]
+ inc a
+ and %11
+ ld [hl], a
+.asm_fc91f
+ call UpdatePikachuWalkingSprite
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ dec [hl]
+ ret nz
+ jp Func_fc835
+
+Func_fc92b: ; fc92b (3f:492b)
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $20
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $8
+asm_fc937: ; fc937 (3f:4937)
+ call Func_fc82e
+ jp c, Func_fc835
+ call SetPikachuOverworldStateFlag2
+ ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ inc a
+ cp $8
+ ld [hl], a
+ jr nz, .asm_fc951
+ xor a
+ ld [hli], a
+ ld a, [hl]
+ xor $1
+ ld [hl], a
+.asm_fc951
+ call UpdatePikachuWalkingSprite
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ dec [hl]
+ ret nz
+ jp Func_fc835
+
+Func_fc95d: ; fc95d (3f:495d)
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $20
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $9
+asm_fc969: ; fc969 (3f:4969)
+ call Func_fc82e
+ jp c, Func_fc835
+ call SetPikachuOverworldStateFlag2
+ ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ inc a
+ cp $8
+ ld [hl], a
+ jr nz, .asm_fc988
+ xor a
+ ld [hl], a
+ ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ call Func_fc994
+ ld [hl], a
+.asm_fc988
+ call UpdatePikachuWalkingSprite
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ dec [hl]
+ ret nz
+ jp Func_fc835
+
+Func_fc994: ; fc994 (3f:4994)
+ push hl
+ ld hl, Pointer_fc9ac
+ ld d, a
+.loop
+ ld a, [hli]
+ cp d
+ jr nz, .loop
+ ld a, [hl]
+ pop hl
+ ret
+
+Func_fc9a0: ; fc9a0 (3f:49a0)
+ push hl
+ ld hl, Pointer_fc9ac_End
+ ld d, a
+.loop
+ ld a, [hld]
+ cp d
+ jr nz, .loop
+ ld a, [hl]
+ pop hl
+ ret
+
+Pointer_fc9ac: ; fc9ac (3f:49ac)
+ db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT, SPRITE_FACING_UP, SPRITE_FACING_RIGHT
+ db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT, SPRITE_FACING_UP, SPRITE_FACING_RIGHT
+Pointer_fc9ac_End:
+
+NormalPikachuFollow: ; fc9b4 (3f:49b4)
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $8
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $3
+ call AddPikachuStepVector
+asm_fc9c3: ; fc9c3 (3f:49c3)
+ call TryDoubleAddPikachuStepVectorToScreenPixelCoords
+ call GetPikachuWalkingAnimationSpeed
+ call UpdatePikachuWalkingSprite
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ dec [hl]
+ ret nz
+ call ResetPikachuStepVector
+ call ComputePikachuFacingDirection
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $1
+ ret
+
+FastPikachuFollow: ; fc9df (3f:49df)
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $4
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $5
+ call AddPikachuStepVector
+asm_fc9ee: ; fc9ee (3f:49ee)
+ call DoubleAddPikachuStepVectorToScreenPixelCoords
+ call GetPikachuWalkingAnimationSpeed
+ call UpdatePikachuWalkingSprite
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ dec [hl]
+ ret nz
+ call ResetPikachuStepVector
+ call ComputePikachuFacingDirection
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $1
+ ret
+
+Func_fca0a: ; fca0a (3f:4a0a)
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $8
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $4
+ call AddPikachuStepVector
+ call AddPikachuStepVector
+asm_fca1c: ; fca1c (3f:4a1c)
+ call DoubleAddPikachuStepVectorToScreenPixelCoords
+ call GetPikachuWalkingAnimationSpeed
+ call UpdatePikachuWalkingSprite
+ ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1
+ add hl, bc
+ dec [hl]
+ ret nz
+ call ResetPikachuStepVector
+ call ComputePikachuFacingDirection
+ ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $1
+ ret
+
+AddPikachuStepVector: ; fca38 (3f:4a38)
+ ld hl, wSprite01YStepVector - wSprite01SpriteStateData1
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ inc hl
+ ld d, [hl]
+ ld hl, wSprite01MapY - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ add e
+ ld [hli], a
+ ld a, [hl]
+ add d
+ ld [hl], a
+ ret
+
+TryDoubleAddPikachuStepVectorToScreenPixelCoords: ; fca4b (3f:4a4b)
+ ld a, [wWalkBikeSurfState]
+ cp $1 ; biking
+ jr nz, AddPikachuStepVectorToScreenPixelCoords
+ ld a, [wd736]
+ bit 6, a
+ jr nz, AddPikachuStepVectorToScreenPixelCoords
+DoubleAddPikachuStepVectorToScreenPixelCoords: ; fca59 (3f:4a59)
+ ld hl, wSprite01YStepVector - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [hli]
+ add a
+ add a
+ add [hl]
+ ld [hli], a
+ ld a, [hli]
+ add a
+ add a
+ add [hl]
+ ld [hl], a
+ ret
+
+AddPikachuStepVectorToScreenPixelCoords: ; fca68 (3f:4a68)
+ ld hl, wSprite01YStepVector - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [hli]
+ add a
+ add [hl]
+ ld [hli], a
+ ld a, [hli]
+ add a
+ add [hl]
+ ld [hli], a
+ ret
+
+ResetPikachuStepVector: ; fca75 (3f:4a75)
+ ld hl, wSprite01YStepVector - wSprite01SpriteStateData1
+ add hl, bc
+ xor a
+ ld [hli], a
+ inc hl
+ ld [hl], a
+ ret
+
+GetPikachuWalkingAnimationSpeed: ; fca7e (3f:4a7e)
+ call ComparePikachuHappinessTo80
+ ld d, $2
+ jr nc, .happy
+ ld d, $5
+.happy
+ ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ inc a
+ cp d
+ jr nz, .dont_reset
+ xor a
+.dont_reset
+ ld [hli], a
+ ret nz
+ ld a, [hl]
+ inc a
+ and $3
+ ld [hl], a
+ ret
+
+UpdatePikachuWalkingSprite: ; fca99 (3f:4a99)
+ ld a, [wPikachuOverworldStateFlags]
+ bit 3, a
+ jr nz, .uninitialized
+ ld hl, wSprite01SpriteImageBaseOffset - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ dec a
+ swap a
+ ld d, a
+ ld a, [wd736]
+ bit 7, a
+ jr nz, .copy_player
+ ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ or d
+ ld d, a
+ ld a, [wFontLoaded]
+ bit 0, a
+ jr z, .normal_get_sprite_index
+ call Func_fcae2
+ ret c
+ jr .load_sprite_index
+
+.normal_get_sprite_index
+ ld hl, wSprite01AnimFrameCounter - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, d
+ or [hl]
+ ld d, a
+.load_sprite_index
+ ld hl, wSprite01SpriteImageIdx - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], d
+ ret
+
+.uninitialized
+ ld hl, wSprite01SpriteImageIdx - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $ff
+ ret
+
+.copy_player
+ ld a, [wPlayerSpriteImageIdx]
+ and $f
+ or d
+ ld [wPikachuSpriteImageIdx], a
+ ret
+
+Func_fcae2: ; fcae2 (3f:4ae2)
+ ld hl, wSprite01MapY - wSprite01SpriteStateData1
+ add hl, bc
+ ld a, [wYCoord]
+ add $4
+ cp [hl]
+ jr nz, .on_screen
+ inc hl
+ ld a, [wXCoord]
+ add $4
+ cp [hl]
+ jr nz, .on_screen
+ ld hl, wSprite01SpriteImageIdx - wSprite01SpriteStateData1
+ add hl, bc
+ ld [hl], $ff
+ scf
+ ret
+
+.on_screen
+ and a
+ ret
+
+IsPikachuRightNextToPlayer: ; fcb01 (3f:4b01)
+ push bc
+ push de
+ push hl
+ ld bc, wPikachuPictureID
+ ld a, [wXCoord]
+ add $4
+ ld d, a
+ ld a, [wYCoord]
+ add $4
+ ld e, a
+ ld hl, wPlayerMapY - wPlayerSpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ sub e
+ and a
+ jr z, .equal
+ cp $ff
+ jr z, .one_away
+ cp $1
+ jr z, .one_away
+ jr .bad
+
+.one_away
+ ld hl, wPlayerMapX - wPlayerSpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ sub d
+ jr z, .good
+ jr .bad
+
+.equal
+ ld hl, wPlayerMapX - wPlayerSpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ sub d
+ cp $ff
+ jr z, .good
+ cp $1
+ jr z, .good
+ and a
+ jr z, .good
+ jr .bad
+
+.good
+ pop hl
+ pop de
+ pop bc
+ scf
+ ret
+
+.bad
+ pop hl
+ pop de
+ pop bc
+ xor a
+ ret
+
+GetPikachuFacingDirectionAndReturnToE: ; fcb4d (3f:4b4d)
+ call GetPikachuFacingDirection
+ ld e, a
+ ret
+
+GetPikachuFacingDirection: ; fcb52 (3f:4b52)
+ ld bc, wPikachuPictureID
+ ld a, [wXCoord]
+ add $4
+ ld d, a
+ ld a, [wYCoord]
+ add $4
+ ld e, a
+ ld hl, wPlayerMapY - wPlayerSpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jr z, .asm_fcb71
+ jr nc, .asm_fcb6e
+ ld a, SPRITE_FACING_UP
+ ret
+
+.asm_fcb6e
+ ld a, SPRITE_FACING_DOWN
+ ret
+
+.asm_fcb71
+ ld hl, wPlayerMapX - wPlayerSpriteStateData1
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr z, .asm_fcb81
+ jr nc, .asm_fcb7e
+ ld a, SPRITE_FACING_LEFT
+ ret
+
+.asm_fcb7e
+ ld a, SPRITE_FACING_RIGHT
+ ret
+
+.asm_fcb81
+ ld a, $ff ; standing
+ ret
+
+ClearPikachuFollowCommandBuffer: ; fcb84 (3f:4b84)
+ push bc
+ ld hl, wPikachuFollowCommandBufferSize
+ ld [hl], $ff
+ inc hl
+ ld bc, $10
+ xor a
+ call FillMemory
+ pop bc
+ ret
+
+AppendPikachuFollowCommandToBuffer: ; fcb94 (3f:4b94)
+ ld hl, wPikachuFollowCommandBufferSize
+ inc [hl]
+ ld e, [hl]
+ ld d, 0
+ ld hl, wPikachuFollowCommandBuffer
+ add hl, de
+ ld [hl], a
+ ret
+
+RefreshPikachuFollow: ; fcba1 (3f:4ba1)
+ call ClearPikachuFollowCommandBuffer
+ call ComputePikachuFollowCommand
+ ret c
+ call AppendPikachuFollowCommandToBuffer
+ ret
+
+ComputePikachuFollowCommand: ; fcbac (3f:4bac)
+ ld bc, wPikachuPictureID
+ ld hl, wPlayerMapY - wPlayerSpriteStateData1
+ add hl, bc
+ ld a, [wYCoord]
+ add $4
+ sub [hl]
+ jr z, .checkXCoord
+ jr c, .pikaAbovePlayer
+ call CheckAbsoluteValueLessThan2
+ jr c, .return1
+ ld a, $5
+ and a
+ ret
+
+.return1
+ ld a, $1
+ and a
+ ret
+
+.pikaAbovePlayer
+ call CheckAbsoluteValueLessThan2
+ jr c, .return2
+ ld a, $6
+ and a
+ ret
+
+.return2
+ ld a, $2
+ and a
+ ret
+
+.checkXCoord
+ ld hl, wPlayerMapX - wPlayerSpriteStateData1
+ add hl, bc
+ ld a, [wXCoord]
+ add $4
+ sub [hl]
+ jr z, .pikachuOnTopOfPlayer
+ jr c, .pikaToLeftOfPlayer
+ call CheckAbsoluteValueLessThan2
+ jr c, .return4
+ ld a, $8
+ and a
+ ret
+
+.return4
+ ld a, $4
+ and a
+ ret
+
+.pikaToLeftOfPlayer
+ call CheckAbsoluteValueLessThan2
+ jr c, .return3
+ ld a, $7
+ and a
+ ret
+
+.return3
+ ld a, $3
+ and a
+ ret
+
+.pikachuOnTopOfPlayer
+ scf
+ ret
+
+CheckAbsoluteValueLessThan2: ; fcc01 (3f:4c01)
+ jr nc, .positive
+ cpl
+ inc a
+.positive
+ cp $2
+ ret
+
+Func_fcc08:: ; fcc08 (3f:4c08)
+ call Func_fcc23
+ ret nc
+ ld a, [wd736]
+ bit 6, a
+ jr nz, .asm_fcc1b
+ call Func_fcc42
+ ret c
+ call AppendPikachuFollowCommandToBuffer
+ ret
+
+.asm_fcc1b
+ call Func_fcc64
+ ret c
+ call AppendPikachuFollowCommandToBuffer
+ ret
+
+Func_fcc23: ; fcc23 (3f:4c28)
+ ld a, [wPikachuOverworldStateFlags]
+ bit 5, a
+ jr nz, .asm_fcc40
+ ld a, [wPikachuOverworldStateFlags]
+ bit 7, a
+ jr nz, .asm_fcc40
+ ld a, [wd472]
+ bit 7, a
+ jr z, .asm_fcc40
+ ld a, [wWalkBikeSurfState]
+ and a
+ jr nz, .asm_fcc40
+ scf
+ ret
+
+.asm_fcc40
+ and a
+ ret
+
+Func_fcc42: ; fcc42 (3f:4c42)
+ xor a
+ ld a, [wPlayerDirection]
+ bit 3, a
+ jr nz, .asm_fcc58
+ bit 2, a
+ jr nz, .asm_fcc5b
+ bit 1, a
+ jr nz, .asm_fcc5e
+ bit 0, a
+ jr nz, .asm_fcc61
+ scf
+ ret
+
+.asm_fcc58
+ ld a, $2
+ ret
+
+.asm_fcc5b
+ ld a, $1
+ ret
+
+.asm_fcc5e
+ ld a, $3
+ ret
+
+.asm_fcc61
+ ld a, $4
+ ret
+
+Func_fcc64: ; fcc64 (3f:4c64)
+ ld hl, wPikachuOverworldStateFlags
+ bit 6, [hl]
+ jr z, .asm_fcc6e
+ res 6, [hl]
+ ret
+
+.asm_fcc6e
+ set 6, [hl]
+ xor a
+ ld a, [wPlayerDirection]
+ bit 3, a
+ jr nz, .asm_fcc86
+ bit 2, a
+ jr nz, .asm_fcc89
+ bit 1, a
+ jr nz, .asm_fcc8c
+ bit 0, a
+ jr nz, .asm_fcc8f
+ scf
+ ret
+
+.asm_fcc86
+ ld a, $6
+ ret
+
+.asm_fcc89
+ ld a, $5
+ ret
+
+.asm_fcc8c
+ ld a, $7
+ ret
+
+.asm_fcc8f
+ ld a, $8
+ ret
+
+Func_fcc92: ; fcc92 (3f:4c92)
+ ld hl, wPikachuFollowCommandBufferSize
+ ld a, [hl]
+ cp $ff
+ jr z, .asm_fccb0
+ and a
+ jr z, .asm_fccb0
+ dec [hl]
+ ld e, a
+ ld d, 0
+ ld hl, wPikachuFollowCommandBuffer
+ add hl, de
+ inc e
+ ld a, $ff
+.asm_fcca8
+ ld d, [hl]
+ ldd [hl], a
+ ld a, d
+ dec e
+ jr nz, .asm_fcca8
+ and a
+ ret
+
+.asm_fccb0
+ scf
+ ret
+
+ComputePikachuFacingDirection:: ; fccb2 (3f:4cb2)
+ call GetPikachuFollowCommandIfBufferSizeNonzero
+ and a
+ jr z, .check_y
+ dec a
+ and $3
+ add a
+ add a
+ jr .load
+
+.check_y
+ ld a, [wYCoord]
+ add $4
+ ld d, a
+ ld a, [wXCoord]
+ add $4
+ ld e, a
+ ld a, [wPikachuMapY]
+ cp d
+ jr z, .check_x
+ ld a, SPRITE_FACING_DOWN
+ jr c, .load
+ ld a, SPRITE_FACING_UP
+ jr .load
+
+.check_x
+ ld a, [wPikachuMapX]
+ cp e
+ jr z, .copy_from_player
+ ld a, SPRITE_FACING_RIGHT
+ jr c, .load
+ ld a, SPRITE_FACING_LEFT
+ jr .load
+
+.copy_from_player
+ ld a, [wPlayerFacingDirection]
+.load
+ ld [wPikachuFacingDirection], a
+ ret
+
+GetPikachuFollowCommand: ; fccee (3f:4cee)
+ ld hl, wPikachuFollowCommandBufferSize
+ ld a, [hl]
+ cp $ff
+ jr z, .asm_fccff
+ ld e, a
+ ld d, 0
+ ld hl, wPikachuFollowCommandBuffer
+ add hl, de
+ ld a, [hl]
+ ret
+
+.asm_fccff
+ xor a
+ ret
+
+GetPikachuFollowCommandIfBufferSizeNonzero: ; fcd01 (3f:4d01)
+ ld hl, wPikachuFollowCommandBufferSize
+ ld a, [hl]
+ cp $ff
+ jr z, .default
+ and a
+ jr z, .default
+ ld e, a
+ ld d, 0
+ ld hl, wPikachuFollowCommandBuffer
+ add hl, de
+ ld a, [hl]
+ ret
+
+.default
+ xor a
+ ret
+
+AreThereAtLeastTwoStepsInPikachuFollowCommandBuffer: ; fcd17 (3f:4d17)
+ ld a, [wPikachuFollowCommandBufferSize]
+ cp $ff
+ ret z
+ cp $2
+ jr nc, .set_carry
+ and a
+ ret
+
+.set_carry
+ scf
+ ret
+
+WillPikachuSpawnOnTheScreen: ; fcd25 (3f:4d25)
+ ld h, wSpriteStateData2 / $100
+ ld a, [H_CURRENTSPRITEOFFSET] ; If we're here, this can only be $f0
+ add wPikachuMapY - wPikachuSpriteStateData2
+ ld l, a
+ ld b, [hl]
+ ld a, [wYCoord]
+ cp b
+ jr z, .same_y
+ jr nc, .not_on_screen
+ add (SCREEN_HEIGHT / 2) - 1
+ cp b
+ jr c, .not_on_screen
+.same_y
+ inc l
+ ld b, [hl]
+ ld a, [wXCoord]
+ cp b
+ jr z, .same_x
+ jr nc, .not_on_screen
+ add (SCREEN_WIDTH / 2) - 1
+ cp b
+ jr c, .not_on_screen
+.same_x
+ call .GetNPCCurrentTile
+ ld d, $60
+ ld a, [hli]
+ ld e, a
+ cp d
+ jr nc, .not_on_screen
+ ld a, [hld]
+ cp d
+ jr nc, .not_on_screen
+ ld bc, -20
+ add hl, bc
+ ld a, [hli]
+ cp d
+ jr nc, .not_on_screen
+ ld a, [hl]
+ cp d
+ jr c, .on_screen
+.not_on_screen
+ ld h, wSpriteStateData1 / $100
+ ld a, [H_CURRENTSPRITEOFFSET]
+ add wPikachuSpriteImageIdx - wPikachuSpriteStateData1
+ ld l, a
+ ld [hl], $ff
+ scf
+ jr .return
+
+.on_screen
+ ld h, wSpriteStateData2 / $100
+ ld a, [H_CURRENTSPRITEOFFSET]
+ add wPikachuGrassPriority - wPikachuSpriteStateData2
+ ld l, a
+ ld a, [wGrassTile]
+ cp e
+ ld a, $0
+ jr nz, .priority
+ ld a, $80
+.priority
+ ld [hl], a
+ and a
+.return
+ ret
+
+.GetNPCCurrentTile: ; fcd83 (3f:4d83)
+ ld h, wSpriteStateData1 / $100
+ ld a, [H_CURRENTSPRITEOFFSET]
+ add wPikachuYPixels - wPikachuSpriteStateData1
+ ld l, a
+ ld a, [hli]
+ add $4
+ and $f0
+ srl a
+ ld c, a
+ ld b, $0
+ inc l
+ ld a, [hl]
+ add $2
+ srl a
+ srl a
+ srl a
+ add SCREEN_WIDTH
+ ld d, 0
+ ld e, a
+ ld hl, wTileMap
+ rept 5
+ add hl, bc
+ endr
+ add hl, de
+ ret
+
+ComparePikachuHappinessTo80: ; fcdad (3f:4dad)
+; preserves a and bc
+ push bc
+ push af
+ ld a, [wPikachuHappiness]
+ cp 80
+ pop bc
+ ld a, b
+ pop bc
+ ret
diff --git a/engine/pikachu_movement.asm b/engine/pikachu_movement.asm
new file mode 100755
index 00000000..fbb71ffd
--- /dev/null
+++ b/engine/pikachu_movement.asm
@@ -0,0 +1,1039 @@
+ApplyPikachuMovementData_:: ; fd2a1 (3f:52a1)
+ ld a, b
+ ld [wPikachuMovementScriptBank], a
+ ld a, l
+ ld [wPikachuMovementScriptAddress], a
+ ld a, h
+ ld [wPikachuMovementScriptAddress + 1], a
+ call PikachuSwapSpriteStateData
+.loop
+ call LoadPikachuMovementCommandData
+ jr nc, .done
+ call ExecutePikachuMovementCommand
+ jr .loop
+
+.done
+ call PikachuSwapSpriteStateData
+ call DelayFrame
+ ret
+
+PikachuSwapSpriteStateData:
+ ld a, [wUpdateSpritesEnabled]
+ push af
+ ld a, $ff
+ ld [wUpdateSpritesEnabled], a
+ push hl
+ push de
+ push bc
+
+ ld hl, wSpriteStateData1
+ ld de, wPikachuSpriteStateData1
+ ld c, $10
+ call SwapBytes3f
+
+ ld hl, wSpriteStateData2
+ ld de, wPikachuSpriteStateData2
+ ld c, $10
+ call SwapBytes3f
+
+ pop bc
+ pop de
+ pop hl
+ pop af
+ ld [wUpdateSpritesEnabled], a
+ ret
+
+SwapBytes3f:
+.loop
+ ld b, [hl]
+ ld a, [de]
+ ld [hli], a
+ ld a, b
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .loop
+ ret
+
+LoadPikachuMovementCommandData:
+ call GetPikachuMovementScriptByte
+ cp $3f
+ ret z
+ ld c, a
+ ld b, 0
+ ld hl, Data_fd3b0
+ add hl, bc
+ add hl, bc
+ add hl, bc
+ add hl, bc
+ ld a, [hli]
+ ld [wPikaPicAnimPointer + 1], a
+ ld a, [hli]
+ cp $80
+ jr nz, .no_param
+ call GetPikachuMovementScriptByte
+.no_param
+ ld [wPikaPicAnimPointer], a
+ ld a, [hli]
+ ld [wPikaPicAnimCurGraphicID], a
+ ld a, [hli]
+ cp $80
+ jr nz, .no_param2
+ call GetPikachuMovementScriptByte
+.no_param2
+ ld [wPikaPicAnimPointerSetupFinished], a
+ xor a
+ ld [wPikaPicAnimTimer], a
+ scf
+ ret
+
+ExecutePikachuMovementCommand:
+ xor a
+ ld [wd44d], a
+ ld [wd457], a
+ ld [wd458], a
+ ld a, [wPlayerGrassPriority]
+ push af
+.loop
+ ld bc, wSpriteStateData1
+ ld a, [wPikaPicAnimPointer + 1]
+ ld hl, Jumptable_fd4ac
+ call .JumpTable
+ ld a, [wPikaPicAnimCurGraphicID]
+ ld hl, Jumptable_fd65c
+ call .JumpTable
+ call Func_fd36e
+ call Func_fd39d
+ call DelayFrame
+ call DelayFrame
+ ld hl, wd44d
+ bit 7, [hl]
+ jr z, .loop
+ pop af
+ ld [wPlayerGrassPriority], a
+ scf
+ ret
+
+.JumpTable:
+ ld e, a
+ ld d, 0
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+Func_fd36e:
+ ld hl, 2
+ add hl, bc
+ ld a, [wPikaPicAnimTimer + 1]
+ ld [hl], a
+ ld a, [wPikaSpriteY]
+ ld d, a
+ ld a, [wd456]
+ add d
+ ld hl, 4
+ add hl, bc
+ ld [hl], a
+ ld a, [wPikaPicAnimDelay]
+ ld d, a
+ ld a, [wPikaPicTextboxStartY]
+ add d
+ ld hl, 6
+ add hl, bc
+ ld [hl], a
+ ld hl, wd44d
+ bit 6, [hl]
+ ret z
+ ld hl, wPlayerGrassPriority - wSpriteStateData1
+ add hl, bc
+ ld [hl], 0
+ ret
+
+Func_fd39d:
+ ld hl, wd44d
+ bit 6, [hl]
+ res 6, [hl]
+ ld hl, wd736
+ res 6, [hl]
+ ret z
+ set 6, [hl]
+ call Func_fd7f3
+ ret
+
+Data_fd3b0:
+ db $01, $00, $00, $00 ; $00
+ db $03, $80, $01, $00 ; $01
+ db $04, $80, $01, $00 ; $02
+ db $05, $80, $01, $00 ; $03
+ db $06, $80, $01, $00 ; $04
+ db $07, $80, $01, $00 ; $05
+ db $08, $80, $01, $00 ; $06
+ db $09, $80, $01, $00 ; $07
+ db $0a, $80, $01, $00 ; $08
+ db $03, $80, $06, $00 ; $09
+ db $04, $80, $06, $00 ; $0a
+ db $05, $80, $06, $00 ; $0b
+ db $06, $80, $06, $00 ; $0c
+ db $07, $80, $06, $00 ; $0d
+ db $08, $80, $06, $00 ; $0e
+ db $09, $80, $06, $00 ; $0f
+ db $0a, $80, $06, $00 ; $10
+ db $03, $80, $03, $80 ; $11
+ db $04, $80, $03, $80 ; $12
+ db $05, $80, $03, $80 ; $13
+ db $06, $80, $03, $80 ; $14
+ db $07, $80, $03, $80 ; $15
+ db $08, $80, $03, $80 ; $16
+ db $09, $80, $03, $80 ; $17
+ db $0a, $80, $03, $80 ; $18
+ db $03, $80, $07, $80 ; $19
+ db $04, $80, $07, $80 ; $1a
+ db $05, $80, $07, $80 ; $1b
+ db $06, $80, $07, $80 ; $1c
+ db $0b, $27, $02, $00 ; $1d step down
+ db $0c, $27, $02, $00 ; $1e step up
+ db $0d, $27, $02, $00 ; $1f step left
+ db $0e, $27, $02, $00 ; $20 step right
+ db $0f, $27, $02, $00 ; $21
+ db $10, $27, $02, $00 ; $22
+ db $11, $27, $02, $00 ; $23
+ db $12, $27, $02, $00 ; $24
+ db $0b, $0f, $02, $00 ; $25
+ db $0c, $0f, $02, $00 ; $26
+ db $0d, $0f, $02, $00 ; $27
+ db $0e, $0f, $02, $00 ; $28
+ db $0f, $0f, $02, $00 ; $29
+ db $10, $0f, $02, $00 ; $2a
+ db $11, $0f, $02, $00 ; $2b
+ db $12, $0f, $02, $00 ; $2c
+ db $0b, $0f, $08, $17 ; $2d
+ db $0c, $0f, $08, $17 ; $2e
+ db $0d, $0f, $08, $17 ; $2f
+ db $0e, $0f, $08, $17 ; $30
+ db $0f, $0f, $08, $17 ; $31
+ db $10, $0f, $08, $17 ; $32
+ db $11, $0f, $08, $17 ; $33
+ db $12, $0f, $08, $17 ; $34
+ db $13, $0f, $06, $00 ; $35 look down
+ db $14, $0f, $06, $00 ; $36 look up
+ db $15, $0f, $06, $00 ; $37 look left
+ db $16, $0f, $06, $00 ; $38 look right
+ db $02, $80, $04, $00 ; $39
+ db $02, $80, $05, $00 ; $3a
+ db $02, $80, $03, $80 ; $3b
+ db $02, $80, $07, $80 ; $3c
+ db $02, $80, $09, $80 ; $3d
+ db $02, $80, $06, $00 ; $3e
+
+Jumptable_fd4ac:
+ dw Func_fd4e5
+ dw Func_fd4e9
+ dw Func_fd504
+ dw Func_fd50c
+ dw Func_fd511
+ dw Func_fd518
+ dw Func_fd52c
+ dw Func_fd540
+ dw Func_fd553
+ dw Func_fd566
+ dw Func_fd579
+ dw Func_fd5b1
+ dw Func_fd5b5
+ dw Func_fd5b9
+ dw Func_fd5bd
+ dw Func_fd5c1
+ dw Func_fd5c5
+ dw Func_fd5c9
+ dw Func_fd5cd
+ dw Func_fd5ea
+ dw Func_fd5ee
+ dw Func_fd5f2
+ dw Func_fd5f6
+ dw Func_fd4e5
+
+Func_fd4dc:
+ ld a, [wd44d]
+ set 7, a
+ ld [wd44d], a
+ ret
+
+Func_fd4e5:
+ call Func_fd4dc
+ ret
+
+Func_fd4e9:
+ ld hl, 4
+ add hl, bc
+ ld a, [hl]
+ ld [wPikaSpriteY], a
+ ld hl, 6
+ add hl, bc
+ ld a, [hl]
+ ld [wPikaPicAnimDelay], a
+ xor a
+ ld [wd456], a
+ ld [wPikaPicTextboxStartY], a
+ call Func_fd4dc
+ ret
+
+Func_fd504:
+ call Func_fd775
+ ret nz
+ call Func_fd4dc
+ ret
+
+Func_fd50c:
+ call GetObjectFacing
+ jr asm_fd58c
+
+Func_fd511:
+ call GetObjectFacing
+ xor %100
+ jr asm_fd58c
+
+Func_fd518:
+ call GetObjectFacing
+ ld hl, Data_fd523
+ call Func_fd5a0
+ jr asm_fd58c
+
+Data_fd523:
+ db SPRITE_FACING_DOWN, SPRITE_FACING_RIGHT
+ db SPRITE_FACING_UP, SPRITE_FACING_LEFT
+ db SPRITE_FACING_LEFT, SPRITE_FACING_DOWN
+ db SPRITE_FACING_RIGHT, SPRITE_FACING_UP
+ db $ff
+
+Func_fd52c:
+ call GetObjectFacing
+ ld hl, Data_fd537
+ call Func_fd5a0
+ jr asm_fd58c
+
+Data_fd537:
+ db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT
+ db SPRITE_FACING_UP, SPRITE_FACING_RIGHT
+ db SPRITE_FACING_LEFT, SPRITE_FACING_UP
+ db SPRITE_FACING_RIGHT, SPRITE_FACING_DOWN
+ db $ff
+
+Func_fd540:
+ call GetObjectFacing
+ ld hl, Data_fd54b
+ call Func_fd5a0
+ jr asm_fd58c
+
+Data_fd54b:
+ db SPRITE_FACING_DOWN, SPRITE_FACING_UP | $10
+ db SPRITE_FACING_UP, SPRITE_FACING_LEFT | $10
+ db SPRITE_FACING_LEFT, SPRITE_FACING_DOWN | $10
+ db SPRITE_FACING_RIGHT, SPRITE_FACING_RIGHT | $10
+
+Func_fd553:
+ call GetObjectFacing
+ ld hl, Data_fd55e
+ call Func_fd5a0
+ jr asm_fd58c
+
+Data_fd55e:
+ db SPRITE_FACING_DOWN, SPRITE_FACING_DOWN | $10
+ db SPRITE_FACING_UP, SPRITE_FACING_RIGHT | $10
+ db SPRITE_FACING_LEFT, SPRITE_FACING_LEFT | $10
+ db SPRITE_FACING_RIGHT, SPRITE_FACING_UP | $10
+
+Func_fd566:
+ call GetObjectFacing
+ ld hl, Data_fd571
+ call Func_fd5a0
+ jr asm_fd58c
+
+Data_fd571:
+ db SPRITE_FACING_DOWN, SPRITE_FACING_RIGHT | $10
+ db SPRITE_FACING_UP, SPRITE_FACING_DOWN | $10
+ db SPRITE_FACING_LEFT, SPRITE_FACING_UP | $10
+ db SPRITE_FACING_RIGHT, SPRITE_FACING_LEFT | $10
+
+Func_fd579:
+ call GetObjectFacing
+ ld hl, Data_fd584
+ call Func_fd5a0
+ jr asm_fd58c
+
+Data_fd584:
+ db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT | $10
+ db SPRITE_FACING_UP, SPRITE_FACING_UP | $10
+ db SPRITE_FACING_LEFT, SPRITE_FACING_RIGHT | $10
+ db SPRITE_FACING_RIGHT, SPRITE_FACING_DOWN | $10
+
+asm_fd58c
+ rrca
+ rrca
+ and $7
+ ld e, a
+ call Func_fd784
+ ld d, a
+ call UpdatePikachuPosition
+ call Func_fd775
+ ret nz
+ call Func_fd4dc
+ ret
+
+Func_fd5a0:
+ push de
+ ld d, a
+.asm_fd5a2
+ ld a, [hli]
+ cp d
+ jr z, .asm_fd5ad
+ inc hl
+ cp $ff
+ jr nz, .asm_fd5a2
+ pop de
+ ret
+
+.asm_fd5ad
+ ld a, [hl]
+ pop de
+ scf
+ ret
+
+Func_fd5b1:
+ ld a, SPRITE_FACING_DOWN >> 2
+ jr asm_fd5d1
+
+Func_fd5b5:
+ ld a, SPRITE_FACING_UP >> 2
+ jr asm_fd5d1
+
+Func_fd5b9:
+ ld a, SPRITE_FACING_LEFT >> 2
+ jr asm_fd5d1
+
+Func_fd5bd:
+ ld a, SPRITE_FACING_RIGHT >> 2
+ jr asm_fd5d1
+
+Func_fd5c1:
+ ld e, 4
+ jr asm_fd5d5
+
+Func_fd5c5:
+ ld e, 5
+ jr asm_fd5d5
+
+Func_fd5c9:
+ ld e, 6
+ jr asm_fd5d5
+
+Func_fd5cd:
+ ld e, 7
+ jr asm_fd5d5
+
+asm_fd5d1
+ ld e, a
+ call SetObjectFacing
+asm_fd5d5
+ call Func_fd784
+ ld d, a
+ push de
+ call UpdatePikachuPosition
+ pop de
+ call Func_fd775
+ ret nz
+ ld a, e
+ call Func_fd7cb
+ call Func_fd4dc
+ ret
+
+Func_fd5ea:
+ ld a, SPRITE_FACING_DOWN >> 2
+ jr asm_fd5fa
+
+Func_fd5ee:
+ ld a, SPRITE_FACING_UP >> 2
+ jr asm_fd5fa
+
+Func_fd5f2:
+ ld a, SPRITE_FACING_LEFT >> 2
+ jr asm_fd5fa
+
+Func_fd5f6:
+ ld a, SPRITE_FACING_RIGHT >> 2
+ jr asm_fd5fa
+
+asm_fd5fa
+ call SetObjectFacing
+ call Func_fd4dc
+ ret
+
+UpdatePikachuPosition:
+ push de
+ ld d, 0
+ ld hl, Jumptable_fd60f
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop de
+ ld a, d
+ jp [hl]
+
+Jumptable_fd60f:
+ dw MovePikachuSpriteDown
+ dw MovePikachuSpriteUp
+ dw MovePikachuSpriteLeft
+ dw MovePikachuSpriteRight
+ dw MovePikachuSpriteDownLeft
+ dw MovePikachuSpriteDownRight
+ dw MovePikachuSpriteUpLeft
+ dw MovePikachuSpriteUpRight
+
+MovePikachuSpriteDown:
+ ld d, 0
+ ld e, a
+ jr asm_fd64d
+
+MovePikachuSpriteUp:
+ ld d, 0
+ cpl
+ inc a
+ ld e, a
+ jr asm_fd64d
+
+MovePikachuSpriteLeft:
+ cpl
+ inc a
+ ld d, a
+ ld e, 0
+ jr asm_fd64d
+
+MovePikachuSpriteRight:
+ ld d, a
+ ld e, 0
+ jr asm_fd64d
+
+MovePikachuSpriteDownLeft:
+ ld e, a
+ cpl
+ inc a
+ ld d, a
+ jr asm_fd64d
+
+MovePikachuSpriteDownRight:
+ ld e, a
+ ld d, a
+ jr asm_fd64d
+
+MovePikachuSpriteUpLeft:
+ cpl
+ inc a
+ ld e, a
+ ld d, a
+ jr asm_fd64d
+
+MovePikachuSpriteUpRight:
+ ld d, a
+ cpl
+ inc a
+ ld e, a
+ jr asm_fd64d
+
+asm_fd64d
+ ld a, [wPikaPicAnimDelay]
+ add d
+ ld [wPikaPicAnimDelay], a
+ ld a, [wPikaSpriteY]
+ add e
+ ld [wPikaSpriteY], a
+ ret
+
+Jumptable_fd65c:
+ dw Func_fd678
+ dw Func_fd6a3
+ dw Func_fd698
+ dw Func_fd6f4
+ dw Func_fd6ff
+ dw Func_fd718
+ dw Func_fd68c
+ dw Func_fd6c6
+ dw Func_fd6c0
+ dw Func_fd6e2
+ dw Func_fd68b
+
+Func_fd672:
+ ld hl, wd44d
+ set 6, [hl]
+ ret
+
+Func_fd678:
+ ld hl, 7
+ add hl, bc
+ xor a
+ ld [hli], a
+ ld [hl], a
+ call Func_fd74a
+ ld d, a
+ call GetObjectFacing
+ or d
+ ld [wPikaPicAnimTimer + 1], a
+ ret
+
+Func_fd68b:
+ ret
+
+Func_fd68c:
+ call Func_fd74a
+ ld d, a
+ call Func_fd755
+ or d
+ ld [wPikaPicAnimTimer + 1], a
+ ret
+
+Func_fd698:
+ call Func_fd74a
+ ld d, a
+ call GetObjectFacing
+ or d
+ ld d, a
+ jr asm_fd6ac
+
+Func_fd6a3:
+ call Func_fd74a
+ ld d, a
+ call Func_fd755
+ or d
+ ld d, a
+asm_fd6ac
+ ld hl, 8
+ add hl, bc
+ call Func_fd78e
+ jr nz, .asm_fd6b6
+ inc [hl]
+.asm_fd6b6
+ ld a, [hl]
+ rrca
+ rrca
+ and 3
+ or d
+ ld [wPikaPicAnimTimer + 1], a
+ ret
+
+Func_fd6c0:
+ call GetObjectFacing
+ ld d, a
+ jr asm_fd6ca
+
+Func_fd6c6:
+ call Func_fd755
+ ld d, a
+asm_fd6ca
+ call Func_fd74a
+ or d
+ ld d, a
+ call Func_fd736
+ or d
+ ld [wPikaPicAnimTimer + 1], a
+ call Func_fd79d
+ ld [wd456], a
+ and a
+ ret z
+ call Func_fd672
+ ret
+
+Func_fd6e2:
+ call GetObjectFacing
+ ld d, a
+ call Func_fd74a
+ or d
+ ld [wPikaPicAnimTimer + 1], a
+ call Func_fd79d
+ ld [wd456], a
+ ret
+
+Func_fd6f4:
+ ld a, [wPikaPicAnimPointerSetupFinished]
+ and $40
+ cp $40
+ jr z, Func_fd6ff
+ jr Func_fd718
+
+Func_fd6ff:
+ call Func_fd755
+ ld d, a
+ call Func_fd78e
+ jr nz, .asm_fd710
+ ld hl, Data_fd731
+.asm_fd70b
+ ld a, [hli]
+ cp d
+ jr nz, .asm_fd70b
+ ld d, [hl]
+.asm_fd710
+ call Func_fd74a
+ or d
+ ld [wPikaPicAnimTimer + 1], a
+ ret
+
+Func_fd718:
+ call Func_fd755
+ ld d, a
+ call Func_fd78e
+ jr nz, .asm_fd529
+ ld hl, Data_fd731End
+.asm_fd524
+ ld a, [hld]
+ cp d
+ jr nz, .asm_fd524
+ ld d, [hl]
+.asm_fd529
+ call Func_fd74a
+ or d
+ ld [wPikaPicAnimTimer + 1], a
+ ret
+
+Data_fd731:
+ db SPRITE_FACING_DOWN
+ db SPRITE_FACING_LEFT
+ db SPRITE_FACING_UP
+ db SPRITE_FACING_RIGHT
+ db SPRITE_FACING_DOWN
+Data_fd731End:
+
+Func_fd736:
+ push hl
+ ld hl, 7
+ add hl, bc
+ ld a, [hl]
+ inc a
+ and $3
+ ld [hli], a
+ jr nz, .asm_fd747
+ ld a, [hl]
+ inc a
+ and $3
+ ld [hl], a
+.asm_fd747
+ ld a, [hl]
+ pop hl
+ ret
+
+Func_fd74a:
+ push hl
+ ld hl, wSpriteStateData2 - wSpriteStateData1 + 14
+ add hl, bc
+ ld a, [hl]
+ dec a
+ swap a
+ pop hl
+ ret
+
+Func_fd755:
+ push hl
+ ld hl, 2
+ add hl, bc
+ ld a, [hl]
+ and $c
+ pop hl
+ ret
+
+GetObjectFacing:
+ push hl
+ ld hl, 9
+ add hl, bc
+ ld a, [hl]
+ and $c
+ pop hl
+ ret
+
+SetObjectFacing:
+ push hl
+ ld hl, 9
+ add hl, bc
+ add a
+ add a
+ and $c
+ ld [hl], a
+ pop hl
+ ret
+
+Func_fd775:
+ ld hl, wd457
+ inc [hl]
+ ld a, [wPikaPicAnimPointer]
+ and $1f
+ inc a
+ cp [hl]
+ ret nz
+ ld [hl], 0
+ ret
+
+Func_fd784:
+ ld a, [wPikaPicAnimPointer]
+ swap a
+ rrca
+ and $3
+ inc a
+ ret
+
+Func_fd78e:
+ ld hl, wd458
+ inc [hl]
+ ld a, [wPikaPicAnimPointerSetupFinished]
+ and $f
+ inc a
+ cp [hl]
+ ret nz
+ ld [hl], 0
+ ret
+
+Func_fd79d:
+ call Func_fd7b2
+ ld a, [wd458]
+ add e
+ ld [wd458], a
+ add $20
+ ld e, a
+ push hl
+ push bc
+ call Sine_e
+ pop bc
+ pop hl
+ ret
+
+Func_fd7b2:
+ ld a, [wPikaPicAnimPointerSetupFinished]
+ and $f
+ inc a
+ ld d, a
+ ld a, [wPikaPicAnimPointerSetupFinished]
+ swap a
+ and $7
+ ld e, a
+ ld a, 1
+ jr z, .asm_fd7c9
+.asm_fd7c5
+ add a
+ dec e
+ jr nz, .asm_fd7c5
+.asm_fd7c9
+ ld e, a
+ ret
+
+Func_fd7cb:
+ push bc
+ ld c, a
+ ld b, 0
+ ld hl, Data_fd7e3
+ add hl, bc
+ add hl, bc
+ ld d, [hl]
+ inc hl
+ ld e, [hl]
+ pop bc
+ ld hl, wSpriteStateData2 - wSpriteStateData1 + 4
+ add hl, bc
+ ld a, [hl]
+ add e
+ ld [hli], a
+ ld a, [hl]
+ add d
+ ld [hl], a
+ ret
+
+Data_fd7e3:
+ db 0, 1
+ db 0, -1
+ db -1, 0
+ db 1, 0
+ db -1, 1
+ db 1, 1
+ db -1, -1
+ db 1, -1
+
+Func_fd7f3:
+ push bc
+ push de
+ push hl
+
+ ld bc, wOAMBuffer + 4 * 36
+ ld a, [wPikaSpriteY]
+ ld e, a
+ ld a, [wPikaPicAnimDelay]
+ ld d, a
+ ld hl, Data_fd80b
+ call Func_fd814
+
+ pop hl
+ pop de
+ pop bc
+ ret
+
+Data_fd80b:
+ db $02
+ db $0c, $00, $ff, 0
+ db $0c, $08, $ff, 1 << OAM_X_FLIP
+
+Func_fd814:
+ ld a, e
+ add $10
+ ld e, a
+ ld a, d
+ add $8
+ ld d, a
+ ld a, [hli]
+.asm_fd81d
+ push af
+ ld a, [hli]
+ add e
+ ld [bc], a
+ inc bc
+ ld a, [hli]
+ add d
+ ld [bc], a
+ inc bc
+ ld a, [hli]
+ ld [bc], a
+ inc bc
+ ld a, [hli]
+ ld [bc], a
+ inc bc
+ pop af
+ dec a
+ jr nz, .asm_fd81d
+ ret
+
+LoadPikachuShadowIntoVRAM:
+ ld hl, vNPCSprites2 + $7f * $10
+ ld de, LedgeHoppingShadowGFX_3F
+ lb bc, BANK(LedgeHoppingShadowGFX_3F), (LedgeHoppingShadowGFX_3FEnd - LedgeHoppingShadowGFX_3F) / 8
+ jp CopyVideoDataDoubleAlternate
+
+LedgeHoppingShadowGFX_3F:
+INCBIN "gfx/ledge_hopping_shadow.1bpp"
+LedgeHoppingShadowGFX_3FEnd:
+
+LoadPikachuBallIconIntoVRAM:
+ ld hl, vNPCSprites2 + $7e * $10
+ ld de, GFX_fd86b
+ lb bc, BANK(GFX_fd86b), 1
+ jp CopyVideoDataDoubleAlternate
+
+Func_fd851:
+ ld hl, vNPCSprites + $c * $10
+ ld a, 3
+.asm_fd856
+ push af
+ push hl
+ ld de, GFX_fd86b
+ lb bc, BANK(GFX_fd86b), 4
+ call CopyVideoDataAlternate
+ pop hl
+ ld de, 4 * $10
+ add hl, de
+ pop af
+ dec a
+ jr nz, .asm_fd856
+ ret
+
+GFX_fd86b:
+INCBIN "gfx/unknown_fd86b.2bpp"
+
+LoadPikachuSpriteIntoVRAM: ; fd8ab (3f:58ab)
+ ld de, PikachuSprite
+ lb bc, BANK(PikachuSprite), (SandshrewSprite - PikachuSprite) / 32
+ ld hl, vNPCSprites + $c * $10
+ push bc
+ call CopyVideoDataAlternate
+ ld de, PikachuSprite + $c * $10
+ ld hl, vNPCSprites2 + $c * $10
+ ld a, [h_0xFFFC]
+ and a
+ jr z, .load
+ ld de, PikachuSprite + $c * $10
+ ld hl, vNPCSprites2 + $4c * $10
+.load
+ pop bc
+ call CopyVideoDataAlternate
+ call LoadPikachuShadowIntoVRAM
+ call LoadPikachuBallIconIntoVRAM
+ ret
+
+PikachuPewterPokecenterCheck: ; fd8d4 (3f:58d4)
+ ld a, [wCurMap]
+ cp PEWTER_POKECENTER
+ ret nz
+ call EnablePikachuFollowingPlayer
+ call StarterPikachuEmotionCommand_turnawayfromplayer
+ ret
+
+PikachuFanClubCheck: ; fd8e1 (3f:58e1)
+ ld a, [wCurMap]
+ cp POKEMON_FAN_CLUB
+ ret nz
+ call EnablePikachuFollowingPlayer
+ call StarterPikachuEmotionCommand_turnawayfromplayer
+ ret
+
+PikachuBillsHouseCheck: ; fd8ee (3f:58ee)
+ ld a, [wCurMap]
+ cp BILLS_HOUSE
+ ret nz
+ call EnablePikachuFollowingPlayer
+ ret
+
+Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3: ; fd8f8 (3f:58f8)
+ call LoadCurrentMapView
+ call UpdateSprites
+ call Delay3
+ ret
+
+Cosine_e: ; cosine?
+ ld a, e
+ add $10
+ jr asm_fd908
+
+Sine_e: ; sine?
+ ld a, e
+asm_fd908
+ and $3f
+ cp $20
+ jr nc, .asm_fd913
+ call GetSine
+ ld a, h
+ ret
+
+.asm_fd913
+ and $1f
+ call GetSine
+ ld a, h
+ cpl
+ inc a
+ ret
+
+GetSine:
+ ld e, a
+ ld a, d
+ ld d, 0
+ ld hl, SineWave_3f
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, 0
+.asm_fd92b
+ srl a
+ jr nc, .asm_fd930
+ add hl, de
+.asm_fd930
+ sla e
+ rl d
+ and a
+ jr nz, .asm_fd92b
+ ret
+
+SineWave_3f:
+ sine_wave $100
diff --git a/engine/pikachu_pcm.asm b/engine/pikachu_pcm.asm
new file mode 100755
index 00000000..e0238468
--- /dev/null
+++ b/engine/pikachu_pcm.asm
@@ -0,0 +1,154 @@
+PlayPikachuSoundClip:: ; f0000 (3c:4000)
+ ld a, e
+ ld e, a
+ ld d, $0
+ ld hl, PikachuCriesPointerTable
+ add hl, de
+ add hl, de
+ add hl, de
+ ld b, [hl] ; bank of pikachu cry data
+ inc hl
+ ld a, [hli] ; cry data pointer
+ ld h, [hl]
+ ld l, a
+ ld c, $4
+.loop
+ dec c
+ jr z, .done_delay
+ call DelayFrame
+ jr .loop
+
+.done_delay
+ di
+ push bc
+ push hl
+ ld a, $80
+ ld [rNR52], a
+ ld a, $77
+ ld [rNR50], a
+ xor a
+ ld [rNR30], a
+ ld hl, $ff30 ; wave data
+ ld de, wRedrawRowOrColumnSrcTiles
+.saveWaveDataLoop
+ ld a, [hl]
+ ld [de], a
+ inc de
+ ld a, $ff
+ ld [hli], a
+ ld a, l
+ cp $40 ; end of wave data
+ jr nz, .saveWaveDataLoop
+ ld a, $80
+ ld [rNR30], a
+ ld a, [rNR51]
+ or $44
+ ld [rNR51], a
+ ld a, $ff
+ ld [rNR31], a
+ ld a, $20
+ ld [rNR32], a
+ ld a, $ff
+ ld [rNR33], a
+ ld a, $87
+ ld [rNR34], a
+ pop hl
+ pop bc
+ call PlayPikachuPCM
+ xor a
+ ld [wc0f3], a
+ ld [wc0f4], a
+ ld a, $80
+ ld [rNR52], a
+ xor a
+ ld [rNR30], a
+ ld hl, $ff30
+ ld de, wRedrawRowOrColumnSrcTiles
+.reloadWaveDataLoop
+ ld a, [de]
+ inc de
+ ld [hli], a
+ ld a, l
+ cp $40 ; end of wave data
+ jr nz, .reloadWaveDataLoop
+ ld a, $80
+ ld [rNR30], a
+ ld a, [rNR51]
+ and $bb
+ ld [rNR51], a
+ xor a
+ ld [wChannelSoundIDs+CH4], a
+ ld [wChannelSoundIDs+CH5], a
+ ld [wChannelSoundIDs+CH6], a
+ ld [wChannelSoundIDs+CH7], a
+ ld a, [H_LOADEDROMBANK]
+ ei
+ ret
+
+PikachuCriesPointerTable: ; f008e (3c:408e)
+; format:
+; db bank
+; dw pointer to cry
+
+; bank 21
+ pikacry_def PikachuCry1 ; 21:4000
+ pikacry_def PikachuCry2 ; 21:491a
+ pikacry_def PikachuCry3 ; 21:4fdc
+ pikacry_def PikachuCry4 ; 21:59ee
+
+; bank 22
+ pikacry_def PikachuCry5 ; 22:4000
+ pikacry_def PikachuCry6 ; 22:5042
+ pikacry_def PikachuCry7 ; 22:6254
+
+; bank 23
+ pikacry_def PikachuCry8 ; 23:4000
+ pikacry_def PikachuCry9 ; 23:50ca
+ pikacry_def PikachuCry10 ; 23:5e0c
+
+; bank 24
+ pikacry_def PikachuCry11 ; 24:4000
+ pikacry_def PikachuCry12 ; 24:4722
+ pikacry_def PikachuCry13 ; 24:54a4
+
+; bank 25
+ pikacry_def PikachuCry14 ; 25:4000
+ pikacry_def PikachuCry15 ; 25:589a
+
+; banks 31-34, in no particular order
+
+ pikacry_def PikachuCry16 ; 31:4000
+ pikacry_def PikachuCry17 ; 34:4000
+ pikacry_def PikachuCry18 ; 31:549a
+ pikacry_def PikachuCry19 ; 33:4000
+ pikacry_def PikachuCry20 ; 32:4000
+ pikacry_def PikachuCry21 ; 32:6002
+ pikacry_def PikachuCry22 ; 31:63a4
+ pikacry_def PikachuCry23 ; 34:4862
+ pikacry_def PikachuCry24 ; 33:5632
+ pikacry_def PikachuCry25 ; 34:573c
+ pikacry_def PikachuCry26 ; 33:725c
+
+; bank 35
+ pikacry_def PikachuCry27 ; 35:4000
+ pikacry_def PikachuCry28 ; 35:4b5a
+ pikacry_def PikachuCry29 ; 35:5da4
+ pikacry_def PikachuCry30 ; 35:69ce
+ pikacry_def PikachuCry31 ; 35:6e80
+
+; bank 36
+ pikacry_def PikachuCry32 ; 36:4000
+ pikacry_def PikachuCry33 ; 36:458a
+ pikacry_def PikachuCry34 ; 36:523c
+
+; bank 37
+ pikacry_def PikachuCry35 ; 37:4000
+ pikacry_def PikachuCry36 ; 37:522a
+
+; banks 36-38
+ pikacry_def PikachuCry37 ; 38:4000
+ pikacry_def PikachuCry38 ; 38:4dfa
+ pikacry_def PikachuCry39 ; 37:6e0c
+ pikacry_def PikachuCry40 ; 38:5a64
+ pikacry_def PikachuCry41 ; 36:6746
+ pikacry_def PikachuCry42 ; 38:6976
diff --git a/engine/pikachu_pic_animation.asm b/engine/pikachu_pic_animation.asm
index 6d588fdb..1ec102f1 100755
--- a/engine/pikachu_pic_animation.asm
+++ b/engine/pikachu_pic_animation.asm
@@ -1,1714 +1,3 @@
-IsPlayerTalkingToPikachu:: ; fcf0c (3f:4f0c)
- ld a, [wd436]
- and a
- ret z
- ld a, [hSpriteIndexOrTextID]
- cp $f
- ret nz
- call InitializePikachuTextID
- xor a
- ld [hSpriteIndexOrTextID], a
- ld [wd436], a
- ret
-
-InitializePikachuTextID: ; fcf20 (3f:4f20)
- ld a, $d4 ; display
- ld [hSpriteIndexOrTextID], a
- xor a
- ld [wPlayerMovingDirection], a
- ld a, $1
- ld [wAutoTextBoxDrawingControl], a
- call DisplayTextID
- xor a
- ld [wAutoTextBoxDrawingControl], a
- ret
-
-DoStarterPikachuEmotions: ; fcf35 (3f:4f35)
- ld e, a
- ld d, $0
- add hl, de
- add hl, de
- ld e, [hl]
- inc hl
- ld d, [hl]
-.loop
- ld a, [de]
- inc de
- cp $ff
- jr z, .done
- ld c, a
- ld b, $0
- ld hl, StarterPikachuEmotionsJumptable
- add hl, bc
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- call JumpToAddress
- jr .loop
-.done
- ret
-
-StarterPikachuEmotionsJumptable: ; fcf54 (3f:4f54)
- dw StarterPikachuEmotionCommand_nop ; 0
- dw StarterPikachuEmotionCommand_text ; 1
- dw StarterPikachuEmotionCommand_pcm ; 2
- dw StarterPikachuEmotionCommand_emote ; 3
- dw StarterPikachuEmotionCommand_4 ; 4
- dw StarterPikachuEmotionCommand_5 ; 5
- dw StarterPikachuEmotionCommand_subcmd ; 6
- dw StarterPikachuEmotionCommand_delay ; 7
- dw StarterPikachuEmotionCommand_nop2 ; 8
- dw StarterPikachuEmotionCommand_9 ; 9
- dw StarterPikachuEmotionCommand_nop3 ; a
-
-StarterPikachuEmotionCommand_nop: ; fcf6a (3f:4f6a)
-StarterPikachuEmotionCommand_nop3: ; fcf6a (3f:4f6a)
- ret
-
-StarterPikachuEmotionCommand_text: ; fcf6b (3f:4f6b)
- ld a, [de]
- ld l, a
- inc de
- ld a, [de]
- ld h, a
- inc de
- push de
- call PrintText
- pop de
- ret
-
-StarterPikachuEmotionCommand_pcm: ; fcf77 (3f:4f77)
- ld a, [de]
- inc de
- push de
- ld e, a
- nop
- call PlayPikachuSoundClip_
- pop de
- ret
-
-PlayPikachuSoundClip_: ; fcf81 (3f:4f81)
- cp $ff
- ret z
- callab PlayPikachuSoundClip
- ret
-
-StarterPikachuEmotionCommand_emote: ; fcf8d (3f:4f8d)
- ld a, [wUpdateSpritesEnabled]
- push af
- ld a, $ff
- ld [wUpdateSpritesEnabled], a
- ld a, [de]
- inc de
- push de
- call ShowPikachuEmoteBubble
- pop de
- pop af
- ld [wUpdateSpritesEnabled], a
- ret
-
-ShowPikachuEmoteBubble: ; fcfa2 (3f:4fa2)
- ld [wWhichEmotionBubble], a
- ld a, $f
- ld [wEmotionBubbleSpriteIndex], a
- predef EmotionBubble
- ret
-
-StarterPikachuEmotionCommand_4: ; fcfb0 (3f:4fb0)
- ld a, [de]
- inc de
- ld l, a
- ld a, [de]
- inc de
- ld h, a
- push de
- ld b, $3f
- call Func_fd2a1
- pop de
- ret
-
-StarterPikachuEmotionCommand_delay: ; fcfbe (3f:4fbe)
- ld a, [de]
- inc de
- push de
- ld c, a
- call DelayFrames
- pop de
- ret
-
-StarterPikachuEmotionCommand_subcmd: ; fcfc7 (3f:4fc7)
- ld a, [de]
- inc de
- push de
- ld e, a
- ld d, $0
- ld hl, Jumptable_fcfda
- add hl, de
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- call JumpToAddress
- pop de
- ret
-
-Jumptable_fcfda:
- dw LoadPikachuSpriteIntoVRAM
- dw LoadFontTilePatterns
- dw Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3
- dw WaitForTextScrollButtonPress
- dw PikachuPewterPokecenterCheck
- dw PikachuFanClubCheck
- dw PikachuBillsHouseCheck
-
-StarterPikachuEmotionCommand_nop2: ; fcfe8 (3f:4fe8)
- ret
-
-StarterPikachuEmotionCommand_9: ; fcfe9 (3f:4fe9)
- push de
- call Func_fcff2
- call UpdateSprites
- pop de
- ret
-
-Func_fcff2: ; fcff2 (3f:4ff2)
- ld a, [wSpriteStateData1 + $9]
- xor $4
- ld [wSpriteStateData1 + $f9], a
- ret
-
-Func_fcffb: ; fcffb (3f:4ffb)
-; Inexplicably empty.
- rept 5
- nop
- endr
- ret
-
-Func_fd001:: ; fd001 (3f:5001)
- ld a, e
- jr asm_fd00f
-
-Func_fd004:: ; fd004 (3f:5004)
- call Func_fd05e
- jr c, asm_fd00f
- call GetPikaPicAnimationScriptIndex
- call Func_fcffb
-asm_fd00f: ; fd00f (3f:500f)
- ld [wExpressionNumber], a
- ld hl, PikachuEmotionTable
- call DoStarterPikachuEmotions
- ret
-
-PikachuEmotionTable: ; fd019 (3f:4019)
- dw PikachuEmotion0_fd115
- dw PikachuEmotion1_fd141
- dw PikachuEmotion2_fd116
- dw PikachuEmotion3_fd160
- dw PikachuEmotion4_fd136
- dw PikachuEmotion5_fd14d
- dw PikachuEmotion6_fd153
- dw PikachuEmotion7_fd128
- dw PikachuEmotion8_fd147
- dw PikachuEmotion9_fd166
- dw PikachuEmotion10_fd11e
- dw PikachuEmotion11_fd173
- dw PikachuEmotion12_fd17a
- dw PikachuEmotion13_fd180
- dw PikachuEmotion14_fd189
- dw PikachuEmotion15_fd191
- dw PikachuEmotion16_fd197
- dw PikachuEmotion17_fd19d
- dw PikachuEmotion18_fd1a3
- dw PikachuEmotion19_fd1a9
- dw PikachuEmotion20_fd1b1
- dw PikachuEmotion21_fd1b9
- dw PikachuEmotion22_fd1c1
- dw PikachuEmotion23_fd1c7
- dw PikachuEmotion24_fd1cf
- dw PikachuEmotion25_fd1d7
- dw PikachuEmotion26_fd1df
- dw PikachuEmotion27_fd1eb
- dw PikachuEmotion28_fd1f1
- dw PikachuEmotion29_fd1f7
- dw PikachuEmotion30_fd1fc
- dw PikachuEmotion31_fd20a
- dw PikachuEmotion32_fd213
- dw PikachuEmotion33_fd05d
-
-PikachuEmotion33_fd05d: ; fd05d (3f:505d)
- db $ff
-
-Func_fd05e: ; fd05e (3f:505e)
- ld a, [wCurMap]
- cp POKEMON_FAN_CLUB
- jr nz, .notFanClub
- ld hl, wPreventBlackout
- bit 7, [hl]
- ld a, $1d
- jr z, .asm_fd0c9
- call CheckPikachuFollowingPlayer
- ld a, $1e
- jr nz, .asm_fd0c9
- jr .asm_fd096
-.notFanClub
- ld a, [wCurMap]
- cp PEWTER_POKECENTER
- jr nz, .notPewterPokecenter
- call CheckPikachuFollowingPlayer
- ld a, $1a
- jr nz, .asm_fd0c9
- jr .asm_fd096
-.notPewterPokecenter
- callab Func_f24ae
- ld a, e
- cp $ff
- jr nz, .asm_fd0c9
- jr .asm_fd096
-.asm_fd096
- call IsPlayerPikachuAsleepInParty
- ld a, $b
- jr c, .asm_fd0c9
- callab Func_fce73 ; same bank
- ld a, $1c
- jr c, .asm_fd0c9
- ld a, [wCurMap]
- cp POKEMONTOWER_1
- jr c, .notInLavenderTower
- cp POKEMONTOWER_7 + 1
- ld a, $16
- jr c, .asm_fd0c9
-.notInLavenderTower
- ld a, [wd49c]
- and a
- jr z, .asm_fd0c7
- dec a
- ld c, a
- ld b, $0
- ld hl, Pointer_fd0cb
- add hl, bc
- ld a, [hl]
- jr .asm_fd0c9
-.asm_fd0c7
- and a
- ret
-.asm_fd0c9
- scf
- ret
-
-Pointer_fd0cb:
- db $12, $15, $17, $18, $19
-
-IsPlayerPikachuAsleepInParty:: ; fd0d0 (3f:50d0)
- xor a
- ld [wWhichPokemon], a
-.loop
- ld a, [wWhichPokemon]
- ld c, a
- ld b, $0
- ld hl, wPartySpecies
- add hl, bc
- ld a, [hl]
- cp $ff
- jr z, .done
- cp PIKACHU
- jr nz, .curMonNotStarterPikachu
- callab IsThisPartymonStarterPikachu
- jr nc, .curMonNotStarterPikachu
- ld a, [wWhichPokemon]
- ld hl, wPartyMon1Status
- ld bc, wPartyMon2 - wPartyMon1
- call AddNTimes
- ld a, [hl]
- and SLP
- jr z, .done
- jr .curMonSleepingPikachu
-.curMonNotStarterPikachu
- ld a, [wWhichPokemon]
- cp PARTY_LENGTH - 1
- jr z, .done
- inc a
- ld [wWhichPokemon], a
- jr .loop
-.curMonSleepingPikachu
- scf
- ret
-.done
- and a
- ret
-
-PikachuEmotion0_fd115: ; fd115 (3f:5115)
- db $ff
-
-PikachuEmotion2_fd116: ; fd116 (3f:5116)
- pikaemotion_dummy2
- pikaemotion_emotebubble SMILE_BUBBLE
- pikaemotion_pcm PikachuCry35
- pikaemotion_5 $2
- db $ff
-
-PikachuEmotion10_fd11e: ; fd11e (3f:511e)
- pikaemotion_dummy2
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES
- pikaemotion_emotebubble HEART_BUBBLE
- pikaemotion_pcm PikachuCry5
- pikaemotion_5 $a
- db $ff
-
-PikachuEmotion7_fd128: ; fd128 (3f:5128)
- pikaemotion_dummy2
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES
- pikaemotion_4 Pointer_fd224
- pikaemotion_pcm PikachuCry1
- pikaemotion_4 Pointer_fd224
- pikaemotion_5 $7
- db $ff
-
-PikachuEmotion4_fd136: ; fd136 (3f:5136)
- pikaemotion_dummy2
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES
- pikaemotion_4 Pointer_fd230
- pikaemotion_pcm PikachuCry29
- pikaemotion_5 $4
- db $ff
-
-PikachuEmotion1_fd141: ; fd141 (3f:5141)
- pikaemotion_dummy2
- pikaemotion_pcm
- pikaemotion_5 $1
- db $ff
-
-PikachuEmotion8_fd147: ; fd147 (3f:5147)
- pikaemotion_dummy2
- pikaemotion_pcm PikachuCry39
- pikaemotion_5 $8
- db $ff
-
-PikachuEmotion5_fd14d: ; fd14d (3f:514d)
- pikaemotion_dummy2
- pikaemotion_pcm PikachuCry31
- pikaemotion_5 $5
- db $ff
-
-PikachuEmotion6_fd153: ; fd153 (3f:5153)
- pikaemotion_dummy2
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES
- pikaemotion_pcm
- pikaemotion_4 Pointer_fd21e
- pikaemotion_emotebubble SKULL_BUBBLE
- pikaemotion_5 $6
- db $ff
-
-PikachuEmotion3_fd160: ; fd160 (3f:5160)
- pikaemotion_dummy2
- pikaemotion_pcm PikachuCry40
- pikaemotion_5 $3
- db $ff
-
-PikachuEmotion9_fd166: ; fd166 (3f:5166)
- pikaemotion_dummy2
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES
- pikaemotion_pcm PikachuCry6
- pikaemotion_4 Pointer_fd218
- pikaemotion_emotebubble SKULL_BUBBLE
- pikaemotion_5 $9
- db $ff
-
-PikachuEmotion11_fd173: ; fd173 (3f:5173)
- pikaemotion_emotebubble ZZZ_BUBBLE
- pikaemotion_pcm PikachuCry37
- pikaemotion_5 $b
- db $ff
-
-PikachuEmotion12_fd17a: ; fd17a (3f:517a)
- pikaemotion_dummy2
- pikaemotion_pcm
- pikaemotion_5 $c
- db $ff
-
-PikachuEmotion13_fd180: ; fd180 (3f:5180)
- pikaemotion_dummy2
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES
- pikaemotion_4 Pointer_fd21e
- pikaemotion_5 $d
- db $ff
-
-PikachuEmotion14_fd189: ; fd189 (3f:5189)
- pikaemotion_dummy2
- pikaemotion_emotebubble BOLT_BUBBLE
- pikaemotion_pcm PikachuCry10
- pikaemotion_5 $e
- db $ff
-
-PikachuEmotion15_fd191: ; fd191 (3f:5191)
- pikaemotion_dummy2
- pikaemotion_pcm PikachuCry34
- pikaemotion_5 $f
- db $ff
-
-PikachuEmotion16_fd197: ; fd197 (3f:5197)
- pikaemotion_dummy2
- pikaemotion_pcm PikachuCry33
- pikaemotion_5 $10
- db $ff
-
-PikachuEmotion17_fd19d: ; fd19d (3f:519d)
- pikaemotion_dummy2
- pikaemotion_pcm PikachuCry13
- pikaemotion_5 $11
- db $ff
-
-PikachuEmotion18_fd1a3: ; fd1a3 (3f:51a3)
- pikaemotion_dummy2
- pikaemotion_pcm
- pikaemotion_5 $12
- db $ff
-
-PikachuEmotion19_fd1a9: ; fd1a9 (3f:51a9)
- pikaemotion_dummy2
- pikaemotion_emotebubble HEART_BUBBLE
- pikaemotion_pcm PikachuCry33
- pikaemotion_5 $13
- db $ff
-
-PikachuEmotion20_fd1b1: ; fd1b1 (3f:51b1)
- pikaemotion_dummy2
- pikaemotion_emotebubble HEART_BUBBLE
- pikaemotion_pcm PikachuCry5
- pikaemotion_5 $14
- db $ff
-
-PikachuEmotion21_fd1b9: ; fd1b9 (3f:51b9)
- pikaemotion_dummy2
- pikaemotion_emotebubble FISH_BUBBLE
- pikaemotion_pcm
- pikaemotion_5 $15
- db $ff
-
-PikachuEmotion22_fd1c1: ; fd1c1 (3f:51c1)
- pikaemotion_dummy2
- pikaemotion_pcm PikachuCry4
- pikaemotion_5 $16
- db $ff
-
-PikachuEmotion23_fd1c7: ; fd1c7 (3f:51c7)
- pikaemotion_dummy2
- pikaemotion_pcm PikachuCry19
- pikaemotion_5 $17
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_SHOWMAPVIEW
- db $ff
-
-PikachuEmotion24_fd1cf: ; fd1cf (3f:51cf)
- pikaemotion_dummy2
- pikaemotion_emotebubble EXCLAMATION_BUBBLE
- pikaemotion_pcm
- pikaemotion_5 $18
- db $ff
-
-PikachuEmotion25_fd1d7: ; fd1d7 (3f:51d7)
- pikaemotion_dummy2
- pikaemotion_emotebubble BOLT_BUBBLE
- pikaemotion_pcm PikachuCry35
- pikaemotion_5 $19
- db $ff
-
-PikachuEmotion26_fd1df: ; fd1df (3f:51df)
- pikaemotion_dummy2
- pikaemotion_emotebubble ZZZ_BUBBLE
- pikaemotion_pcm PikachuCry37
- pikaemotion_5 $1a
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_SHOWMAPVIEW
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_CHECKPEWTERCENTER
- db $ff
-
-PikachuEmotion27_fd1eb: ; fd1eb (3f:51eb)
- pikaemotion_dummy2
- pikaemotion_pcm PikachuCry9
- pikaemotion_5 $1b
- db $ff
-
-PikachuEmotion28_fd1f1: ; fd1f1 (3f:51f1)
- pikaemotion_dummy2
- pikaemotion_pcm PikachuCry15
- pikaemotion_5 $1c
- db $ff
-
-PikachuEmotion29_fd1f7: ; fd1f7 (3f:51f7)
- pikaemotion_pcm PikachuCry5
- pikaemotion_5 $a
- db $ff
-
-PikachuEmotion30_fd1fc: ; fd1fc (3f:51fc)
- pikaemotion_9
- pikaemotion_emotebubble HEART_BUBBLE
- pikaemotion_pcm PikachuCry5
- pikaemotion_5 $14
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_SHOWMAPVIEW
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADFONT
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_CHECKLAVENDERTOWER
- db $ff
-
-PikachuEmotion31_fd20a: ; fd20a (3f:520a)
- pikaemotion_pcm PikachuCry19
- pikaemotion_5 $17
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_SHOWMAPVIEW
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_CHECKBILLSHOUSE
- db $ff
-
-PikachuEmotion32_fd213: ; fd213 (3f:5213)
- pikaemotion_pcm PikachuCry26
- pikaemotion_5 $17
- db $ff
-
-Pointer_fd218: ; fd218 (3f:5218)
-
- db $00
- db $39, $01
- db $3e, $1e
- db $3f
-
-Pointer_fd21e: ; fd21e (3f:521e)
- db $00
- db $39, $00
- db $3e, $1e
- db $3f
-
-Pointer_fd224: ; fd224 (3f:5224)
- db $00
- db $3c, $07, $2f
- db $3c, $07, $2f
- db $3f
-
-Pointer_fd22c: ; fd22c (3f:522c)
- db $3b, $1f, $03
- db $3f
-
-Pointer_fd230: ; fd230 (3f:5230)
- db $00
- db $3c, $0f, $1f
- db $3c, $0f, $1f
- db $3f
-
-Pointer_fd238: ; fd238 (3f:5238)
- db $00
- db $05, $07
- db $39, $00
- db $05, $07
- db $06, $07
- db $39, $00
- db $06, $07
- db $08, $07
- db $39, $00
- db $08, $07
- db $07, $07
- db $39, $00
- db $07, $07
- db $3f
-
-Func_fd252: ; fd252 (3f:5252)
- ld a, $40
- ld [h_0xFFFC], a
- call LoadPikachuSpriteIntoVRAM
- call Func_fd266
- and a
- jr z, .asm_fd262
- call Func_159b
-.asm_fd262
- xor a
- ld [h_0xFFFC], a
- ret
-
-Func_fd266:
- ld a, [wSpriteStateData2 + 15 * 16 + 4]
- ld e, a
- ld a, [wSpriteStateData2 + 15 * 16 + 5]
- ld d, a
- ld a, [wYCoord]
- add 4
- cp e
- jr z, .asm_fd280
- jr nc, .asm_fd27e
- ld hl, Data_fd294
- ld a, 1
- ret
-
-.asm_fd27e
- xor a
- ret
-
-.asm_fd280
- ld a, [wXCoord]
- add 4
- cp d
- jr c, .asm_fd28e
- ld hl, Data_fd299
- ld a, 2
- ret
-
-.asm_fd28e
- ld hl, Data_fd29d
- ld a, 3
- ret
-
-Data_fd294:
- db $00
- db $36
- db $2b
- db $34
- db $3f
-
-Data_fd299:
- db $00
- db $36
- db $34
- db $3f
-
-Data_fd29d:
- db $00
- db $36
- db $33
- db $3f
-
-Func_fd2a1:: ; fd2a1 (3f:52a1)
- ld a, b
- ld [wd44a], a
- ld a, l
- ld [wd44b], a
- ld a, h
- ld [wd44b + 1], a
- call PikachuSwapSpriteStateData
-.loop
- call Func_fd2f5
- jr nc, .done
- call Func_fd329
- jr .loop
-
-.done
- call PikachuSwapSpriteStateData
- call DelayFrame
- ret
-
-PikachuSwapSpriteStateData:
- ld a, [wUpdateSpritesEnabled]
- push af
- ld a, $ff
- ld [wUpdateSpritesEnabled], a
- push hl
- push de
- push bc
-
- ld hl, wSpriteStateData1
- ld de, wSpriteStateData1 + $f0
- ld c, $10
- call SwapBytes3f
-
- ld hl, wSpriteStateData2
- ld de, wSpriteStateData2 + $f0
- ld c, $10
- call SwapBytes3f
-
- pop bc
- pop de
- pop hl
- pop af
- ld [wUpdateSpritesEnabled], a
- ret
-
-SwapBytes3f:
-.loop
- ld b, [hl]
- ld a, [de]
- ld [hli], a
- ld a, b
- ld [de], a
- inc de
- dec c
- jr nz, .loop
- ret
-
-Func_fd2f5:
- call Func_157c
- cp $3f
- ret z
- ld c, a
- ld b, 0
- ld hl, Data_fd3b0
- add hl, bc
- add hl, bc
- add hl, bc
- add hl, bc
- ld a, [hli]
- ld [wPikaPicAnimPointer + 1], a
- ld a, [hli]
- cp $80
- jr nz, .asm_fd311
- call Func_157c
-.asm_fd311
- ld [wPikaPicAnimPointer], a
- ld a, [hli]
- ld [wPikaPicAnimCurGraphicID], a
- ld a, [hli]
- cp $80
- jr nz, .asm_fd320
- call Func_157c
-.asm_fd320
- ld [wPikaPicAnimPointerSetupFinished], a
- xor a
- ld [wPikaPicAnimTimer], a
- scf
- ret
-
-Func_fd329:
- xor a
- ld [$d44c], a
- ld [wd457], a
- ld [wd458], a
- ld a, [wSpriteStateData2 + 7]
- push af
-.asm_fd337
- ld bc, wSpriteStateData1
- ld a, [wPikaPicAnimPointer + 1]
- ld hl, Jumptable_fd4ac
- call Func_fd365
- ld a, [wPikaPicAnimCurGraphicID]
- ld hl, Jumptable_fd65c
- call Func_fd365
- call Func_fd36e
- call Func_fd39d
- call DelayFrame
- call DelayFrame
- ld hl, $d44c
- bit 7, [hl]
- jr z, .asm_fd337
- pop af
- ld [wSpriteStateData2 + 7], a
- scf
- ret
-
-Func_fd365:
- ld e, a
- ld d, 0
- add hl, de
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jp [hl]
-
-Func_fd36e:
- ld hl, 2
- add hl, bc
- ld a, [wPikaPicAnimTimer + 1]
- ld [hl], a
- ld a, [wPikaSpriteY]
- ld d, a
- ld a, [wd456]
- add d
- ld hl, 4
- add hl, bc
- ld [hl], a
- ld a, [wPikaPicAnimDelay]
- ld d, a
- ld a, [wPikaPicTextboxStartY]
- add d
- ld hl, 6
- add hl, bc
- ld [hl], a
- ld hl, $d44c
- bit 6, [hl]
- ret z
- ld hl, wSpriteStateData2 + 7 - wSpriteStateData1
- add hl, bc
- ld [hl], 0
- ret
-
-Func_fd39d:
- ld hl, $d44c
- bit 6, [hl]
- res 6, [hl]
- ld hl, wd736
- res 6, [hl]
- ret z
- set 6, [hl]
- call Func_fd7f3
- ret
-
-Data_fd3b0:
- db $01, $00, $00, $00 ; $00
- db $03, $80, $01, $00 ; $01
- db $04, $80, $01, $00 ; $02
- db $05, $80, $01, $00 ; $03
- db $06, $80, $01, $00 ; $04
- db $07, $80, $01, $00 ; $05
- db $08, $80, $01, $00 ; $06
- db $09, $80, $01, $00 ; $07
- db $0a, $80, $01, $00 ; $08
- db $03, $80, $06, $00 ; $09
- db $04, $80, $06, $00 ; $0a
- db $05, $80, $06, $00 ; $0b
- db $06, $80, $06, $00 ; $0c
- db $07, $80, $06, $00 ; $0d
- db $08, $80, $06, $00 ; $0e
- db $09, $80, $06, $00 ; $0f
- db $0a, $80, $06, $00 ; $10
- db $03, $80, $03, $80 ; $11
- db $04, $80, $03, $80 ; $12
- db $05, $80, $03, $80 ; $13
- db $06, $80, $03, $80 ; $14
- db $07, $80, $03, $80 ; $15
- db $08, $80, $03, $80 ; $16
- db $09, $80, $03, $80 ; $17
- db $0a, $80, $03, $80 ; $18
- db $03, $80, $07, $80 ; $19
- db $04, $80, $07, $80 ; $1a
- db $05, $80, $07, $80 ; $1b
- db $06, $80, $07, $80 ; $1c
- db $0b, $27, $02, $00 ; $1d step down
- db $0c, $27, $02, $00 ; $1e step up
- db $0d, $27, $02, $00 ; $1f step left
- db $0e, $27, $02, $00 ; $20 step right
- db $0f, $27, $02, $00 ; $21
- db $10, $27, $02, $00 ; $22
- db $11, $27, $02, $00 ; $23
- db $12, $27, $02, $00 ; $24
- db $0b, $0f, $02, $00 ; $25
- db $0c, $0f, $02, $00 ; $26
- db $0d, $0f, $02, $00 ; $27
- db $0e, $0f, $02, $00 ; $28
- db $0f, $0f, $02, $00 ; $29
- db $10, $0f, $02, $00 ; $2a
- db $11, $0f, $02, $00 ; $2b
- db $12, $0f, $02, $00 ; $2c
- db $0b, $0f, $08, $17 ; $2d
- db $0c, $0f, $08, $17 ; $2e
- db $0d, $0f, $08, $17 ; $2f
- db $0e, $0f, $08, $17 ; $30
- db $0f, $0f, $08, $17 ; $31
- db $10, $0f, $08, $17 ; $32
- db $11, $0f, $08, $17 ; $33
- db $12, $0f, $08, $17 ; $34
- db $13, $0f, $06, $00 ; $35 look down
- db $14, $0f, $06, $00 ; $36 look up
- db $15, $0f, $06, $00 ; $37 look left
- db $16, $0f, $06, $00 ; $38 look right
- db $02, $80, $04, $00 ; $39
- db $02, $80, $05, $00 ; $3a
- db $02, $80, $03, $80 ; $3b
- db $02, $80, $07, $80 ; $3c
- db $02, $80, $09, $80 ; $3d
- db $02, $80, $06, $00 ; $3e
-
-Jumptable_fd4ac:
- dw Func_fd4e5
- dw Func_fd4e9
- dw Func_fd504
- dw Func_fd50c
- dw Func_fd511
- dw Func_fd518
- dw Func_fd52c
- dw Func_fd540
- dw Func_fd553
- dw Func_fd566
- dw Func_fd579
- dw Func_fd5b1
- dw Func_fd5b5
- dw Func_fd5b9
- dw Func_fd5bd
- dw Func_fd5c1
- dw Func_fd5c5
- dw Func_fd5c9
- dw Func_fd5cd
- dw Func_fd5ea
- dw Func_fd5ee
- dw Func_fd5f2
- dw Func_fd5f6
- dw Func_fd4e5
-
-Func_fd4dc:
- ld a, [$d44c]
- set 7, a
- ld [$d44c], a
- ret
-
-Func_fd4e5:
- call Func_fd4dc
- ret
-
-Func_fd4e9:
- ld hl, 4
- add hl, bc
- ld a, [hl]
- ld [wPikaSpriteY], a
- ld hl, 6
- add hl, bc
- ld a, [hl]
- ld [wPikaPicAnimDelay], a
- xor a
- ld [wd456], a
- ld [wPikaPicTextboxStartY], a
- call Func_fd4dc
- ret
-
-Func_fd504:
- call Func_fd775
- ret nz
- call Func_fd4dc
- ret
-
-Func_fd50c:
- call GetObjectFacing
- jr asm_fd58c
-
-Func_fd511:
- call GetObjectFacing
- xor %100
- jr asm_fd58c
-
-Func_fd518:
- call GetObjectFacing
- ld hl, Data_fd523
- call Func_fd5a0
- jr asm_fd58c
-
-Data_fd523:
- db SPRITE_FACING_DOWN, SPRITE_FACING_RIGHT
- db SPRITE_FACING_UP, SPRITE_FACING_LEFT
- db SPRITE_FACING_LEFT, SPRITE_FACING_DOWN
- db SPRITE_FACING_RIGHT, SPRITE_FACING_UP
- db $ff
-
-Func_fd52c:
- call GetObjectFacing
- ld hl, Data_fd537
- call Func_fd5a0
- jr asm_fd58c
-
-Data_fd537:
- db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT
- db SPRITE_FACING_UP, SPRITE_FACING_RIGHT
- db SPRITE_FACING_LEFT, SPRITE_FACING_UP
- db SPRITE_FACING_RIGHT, SPRITE_FACING_DOWN
- db $ff
-
-Func_fd540:
- call GetObjectFacing
- ld hl, Data_fd54b
- call Func_fd5a0
- jr asm_fd58c
-
-Data_fd54b:
- db SPRITE_FACING_DOWN, SPRITE_FACING_UP | $10
- db SPRITE_FACING_UP, SPRITE_FACING_LEFT | $10
- db SPRITE_FACING_LEFT, SPRITE_FACING_DOWN | $10
- db SPRITE_FACING_RIGHT, SPRITE_FACING_RIGHT | $10
-
-Func_fd553:
- call GetObjectFacing
- ld hl, Data_fd55e
- call Func_fd5a0
- jr asm_fd58c
-
-Data_fd55e:
- db SPRITE_FACING_DOWN, SPRITE_FACING_DOWN | $10
- db SPRITE_FACING_UP, SPRITE_FACING_RIGHT | $10
- db SPRITE_FACING_LEFT, SPRITE_FACING_LEFT | $10
- db SPRITE_FACING_RIGHT, SPRITE_FACING_UP | $10
-
-Func_fd566:
- call GetObjectFacing
- ld hl, Data_fd571
- call Func_fd5a0
- jr asm_fd58c
-
-Data_fd571:
- db SPRITE_FACING_DOWN, SPRITE_FACING_RIGHT | $10
- db SPRITE_FACING_UP, SPRITE_FACING_DOWN | $10
- db SPRITE_FACING_LEFT, SPRITE_FACING_UP | $10
- db SPRITE_FACING_RIGHT, SPRITE_FACING_LEFT | $10
-
-Func_fd579:
- call GetObjectFacing
- ld hl, Data_fd584
- call Func_fd5a0
- jr asm_fd58c
-
-Data_fd584:
- db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT | $10
- db SPRITE_FACING_UP, SPRITE_FACING_UP | $10
- db SPRITE_FACING_LEFT, SPRITE_FACING_RIGHT | $10
- db SPRITE_FACING_RIGHT, SPRITE_FACING_DOWN | $10
-
-asm_fd58c
- rrca
- rrca
- and $7
- ld e, a
- call Func_fd784
- ld d, a
- call UpdatePikachuPosition
- call Func_fd775
- ret nz
- call Func_fd4dc
- ret
-
-Func_fd5a0:
- push de
- ld d, a
-.asm_fd5a2
- ld a, [hli]
- cp d
- jr z, .asm_fd5ad
- inc hl
- cp $ff
- jr nz, .asm_fd5a2
- pop de
- ret
-
-.asm_fd5ad
- ld a, [hl]
- pop de
- scf
- ret
-
-Func_fd5b1:
- ld a, SPRITE_FACING_DOWN >> 2
- jr asm_fd5d1
-
-Func_fd5b5:
- ld a, SPRITE_FACING_UP >> 2
- jr asm_fd5d1
-
-Func_fd5b9:
- ld a, SPRITE_FACING_LEFT >> 2
- jr asm_fd5d1
-
-Func_fd5bd:
- ld a, SPRITE_FACING_RIGHT >> 2
- jr asm_fd5d1
-
-Func_fd5c1:
- ld e, 4
- jr asm_fd5d5
-
-Func_fd5c5:
- ld e, 5
- jr asm_fd5d5
-
-Func_fd5c9:
- ld e, 6
- jr asm_fd5d5
-
-Func_fd5cd:
- ld e, 7
- jr asm_fd5d5
-
-asm_fd5d1
- ld e, a
- call SetObjectFacing
-asm_fd5d5
- call Func_fd784
- ld d, a
- push de
- call UpdatePikachuPosition
- pop de
- call Func_fd775
- ret nz
- ld a, e
- call Func_fd7cb
- call Func_fd4dc
- ret
-
-Func_fd5ea:
- ld a, SPRITE_FACING_DOWN >> 2
- jr asm_fd5fa
-
-Func_fd5ee:
- ld a, SPRITE_FACING_UP >> 2
- jr asm_fd5fa
-
-Func_fd5f2:
- ld a, SPRITE_FACING_LEFT >> 2
- jr asm_fd5fa
-
-Func_fd5f6:
- ld a, SPRITE_FACING_RIGHT >> 2
- jr asm_fd5fa
-
-asm_fd5fa
- call SetObjectFacing
- call Func_fd4dc
- ret
-
-UpdatePikachuPosition:
- push de
- ld d, 0
- ld hl, Jumptable_fd60f
- add hl, de
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- pop de
- ld a, d
- jp [hl]
-
-Jumptable_fd60f:
- dw MovePikachuSpriteDown
- dw MovePikachuSpriteUp
- dw MovePikachuSpriteLeft
- dw MovePikachuSpriteRight
- dw MovePikachuSpriteDownLeft
- dw MovePikachuSpriteDownRight
- dw MovePikachuSpriteUpLeft
- dw MovePikachuSpriteUpRight
-
-MovePikachuSpriteDown:
- ld d, 0
- ld e, a
- jr asm_fd64d
-
-MovePikachuSpriteUp:
- ld d, 0
- cpl
- inc a
- ld e, a
- jr asm_fd64d
-
-MovePikachuSpriteLeft:
- cpl
- inc a
- ld d, a
- ld e, 0
- jr asm_fd64d
-
-MovePikachuSpriteRight:
- ld d, a
- ld e, 0
- jr asm_fd64d
-
-MovePikachuSpriteDownLeft:
- ld e, a
- cpl
- inc a
- ld d, a
- jr asm_fd64d
-
-MovePikachuSpriteDownRight:
- ld e, a
- ld d, a
- jr asm_fd64d
-
-MovePikachuSpriteUpLeft:
- cpl
- inc a
- ld e, a
- ld d, a
- jr asm_fd64d
-
-MovePikachuSpriteUpRight:
- ld d, a
- cpl
- inc a
- ld e, a
- jr asm_fd64d
-
-asm_fd64d
- ld a, [wPikaPicAnimDelay]
- add d
- ld [wPikaPicAnimDelay], a
- ld a, [wPikaSpriteY]
- add e
- ld [wPikaSpriteY], a
- ret
-
-Jumptable_fd65c:
- dw Func_fd678
- dw Func_fd6a3
- dw Func_fd698
- dw Func_fd6f4
- dw Func_fd6ff
- dw Func_fd718
- dw Func_fd68c
- dw Func_fd6c6
- dw Func_fd6c0
- dw Func_fd6e2
- dw Func_fd68b
-
-Func_fd672:
- ld hl, $d44c
- set 6, [hl]
- ret
-
-Func_fd678:
- ld hl, 7
- add hl, bc
- xor a
- ld [hli], a
- ld [hl], a
- call Func_fd74a
- ld d, a
- call GetObjectFacing
- or d
- ld [wPikaPicAnimTimer + 1], a
- ret
-
-Func_fd68b:
- ret
-
-Func_fd68c:
- call Func_fd74a
- ld d, a
- call Func_fd755
- or d
- ld [wPikaPicAnimTimer + 1], a
- ret
-
-Func_fd698:
- call Func_fd74a
- ld d, a
- call GetObjectFacing
- or d
- ld d, a
- jr asm_fd6ac
-
-Func_fd6a3:
- call Func_fd74a
- ld d, a
- call Func_fd755
- or d
- ld d, a
-asm_fd6ac
- ld hl, 8
- add hl, bc
- call Func_fd78e
- jr nz, .asm_fd6b6
- inc [hl]
-.asm_fd6b6
- ld a, [hl]
- rrca
- rrca
- and 3
- or d
- ld [wPikaPicAnimTimer + 1], a
- ret
-
-Func_fd6c0:
- call GetObjectFacing
- ld d, a
- jr asm_fd6ca
-
-Func_fd6c6:
- call Func_fd755
- ld d, a
-asm_fd6ca
- call Func_fd74a
- or d
- ld d, a
- call Func_fd736
- or d
- ld [wPikaPicAnimTimer + 1], a
- call Func_fd79d
- ld [wd456], a
- and a
- ret z
- call Func_fd672
- ret
-
-Func_fd6e2:
- call GetObjectFacing
- ld d, a
- call Func_fd74a
- or d
- ld [wPikaPicAnimTimer + 1], a
- call Func_fd79d
- ld [wd456], a
- ret
-
-Func_fd6f4:
- ld a, [wPikaPicAnimPointerSetupFinished]
- and $40
- cp $40
- jr z, Func_fd6ff
- jr Func_fd718
-
-Func_fd6ff:
- call Func_fd755
- ld d, a
- call Func_fd78e
- jr nz, .asm_fd710
- ld hl, Data_fd731
-.asm_fd70b
- ld a, [hli]
- cp d
- jr nz, .asm_fd70b
- ld d, [hl]
-.asm_fd710
- call Func_fd74a
- or d
- ld [wPikaPicAnimTimer + 1], a
- ret
-
-Func_fd718:
- call Func_fd755
- ld d, a
- call Func_fd78e
- jr nz, .asm_fd529
- ld hl, Data_fd731End
-.asm_fd524
- ld a, [hld]
- cp d
- jr nz, .asm_fd524
- ld d, [hl]
-.asm_fd529
- call Func_fd74a
- or d
- ld [wPikaPicAnimTimer + 1], a
- ret
-
-Data_fd731:
- db SPRITE_FACING_DOWN
- db SPRITE_FACING_LEFT
- db SPRITE_FACING_UP
- db SPRITE_FACING_RIGHT
- db SPRITE_FACING_DOWN
-Data_fd731End:
-
-Func_fd736:
- push hl
- ld hl, 7
- add hl, bc
- ld a, [hl]
- inc a
- and $3
- ld [hli], a
- jr nz, .asm_fd747
- ld a, [hl]
- inc a
- and $3
- ld [hl], a
-.asm_fd747
- ld a, [hl]
- pop hl
- ret
-
-Func_fd74a:
- push hl
- ld hl, wSpriteStateData2 - wSpriteStateData1 + 14
- add hl, bc
- ld a, [hl]
- dec a
- swap a
- pop hl
- ret
-
-Func_fd755:
- push hl
- ld hl, 2
- add hl, bc
- ld a, [hl]
- and $c
- pop hl
- ret
-
-GetObjectFacing:
- push hl
- ld hl, 9
- add hl, bc
- ld a, [hl]
- and $c
- pop hl
- ret
-
-SetObjectFacing:
- push hl
- ld hl, 9
- add hl, bc
- add a
- add a
- and $c
- ld [hl], a
- pop hl
- ret
-
-Func_fd775:
- ld hl, wd457
- inc [hl]
- ld a, [wPikaPicAnimPointer]
- and $1f
- inc a
- cp [hl]
- ret nz
- ld [hl], 0
- ret
-
-Func_fd784:
- ld a, [wPikaPicAnimPointer]
- swap a
- rrca
- and $3
- inc a
- ret
-
-Func_fd78e:
- ld hl, wd458
- inc [hl]
- ld a, [wPikaPicAnimPointerSetupFinished]
- and $f
- inc a
- cp [hl]
- ret nz
- ld [hl], 0
- ret
-
-Func_fd79d:
- call Func_fd7b2
- ld a, [wd458]
- add e
- ld [wd458], a
- add $20
- ld e, a
- push hl
- push bc
- call Sine_e
- pop bc
- pop hl
- ret
-
-Func_fd7b2:
- ld a, [wPikaPicAnimPointerSetupFinished]
- and $f
- inc a
- ld d, a
- ld a, [wPikaPicAnimPointerSetupFinished]
- swap a
- and $7
- ld e, a
- ld a, 1
- jr z, .asm_fd7c9
-.asm_fd7c5
- add a
- dec e
- jr nz, .asm_fd7c5
-.asm_fd7c9
- ld e, a
- ret
-
-Func_fd7cb:
- push bc
- ld c, a
- ld b, 0
- ld hl, Data_fd7e3
- add hl, bc
- add hl, bc
- ld d, [hl]
- inc hl
- ld e, [hl]
- pop bc
- ld hl, wSpriteStateData2 - wSpriteStateData1 + 4
- add hl, bc
- ld a, [hl]
- add e
- ld [hli], a
- ld a, [hl]
- add d
- ld [hl], a
- ret
-
-Data_fd7e3:
- db 0, 1
- db 0, -1
- db -1, 0
- db 1, 0
- db -1, 1
- db 1, 1
- db -1, -1
- db 1, -1
-
-Func_fd7f3:
- push bc
- push de
- push hl
-
- ld bc, wOAMBuffer + 4 * 36
- ld a, [wPikaSpriteY]
- ld e, a
- ld a, [wPikaPicAnimDelay]
- ld d, a
- ld hl, Data_fd80b
- call Func_fd814
-
- pop hl
- pop de
- pop bc
- ret
-
-Data_fd80b:
- db $02
- db $0c, $00, $ff, 0
- db $0c, $08, $ff, 1 << OAM_X_FLIP
-
-Func_fd814:
- ld a, e
- add $10
- ld e, a
- ld a, d
- add $8
- ld d, a
- ld a, [hli]
-.asm_fd81d
- push af
- ld a, [hli]
- add e
- ld [bc], a
- inc bc
- ld a, [hli]
- add d
- ld [bc], a
- inc bc
- ld a, [hli]
- ld [bc], a
- inc bc
- ld a, [hli]
- ld [bc], a
- inc bc
- pop af
- dec a
- jr nz, .asm_fd81d
- ret
-
-LoadPikachuShadowIntoVRAM:
- ld hl, vNPCSprites2 + $7f * $10
- ld de, LedgeHoppingShadowGFX_3F
- lb bc, BANK(LedgeHoppingShadowGFX_3F), (LedgeHoppingShadowGFX_3FEnd - LedgeHoppingShadowGFX_3F) / 8
- jp CopyVideoDataDoubleAlternate
-
-LedgeHoppingShadowGFX_3F:
-INCBIN "gfx/ledge_hopping_shadow.1bpp"
-LedgeHoppingShadowGFX_3FEnd:
-
-LoadPikachuBallIconIntoVRAM:
- ld hl, vNPCSprites2 + $7e * $10
- ld de, GFX_fd86b
- lb bc, BANK(GFX_fd86b), 1
- jp CopyVideoDataDoubleAlternate
-
-Func_fd851:
- ld hl, vNPCSprites + $c * $10
- ld a, 3
-.asm_fd856
- push af
- push hl
- ld de, GFX_fd86b
- lb bc, BANK(GFX_fd86b), 4
- call CopyVideoDataAlternate
- pop hl
- ld de, 4 * $10
- add hl, de
- pop af
- dec a
- jr nz, .asm_fd856
- ret
-
-GFX_fd86b:
-INCBIN "gfx/unknown_fd86b.2bpp"
-
-LoadPikachuSpriteIntoVRAM: ; fd8ab (3f:58ab)
- ld de, PikachuSprite
- lb bc, BANK(PikachuSprite), (SandshrewSprite - PikachuSprite) / 32
- ld hl, vNPCSprites + $c * $10
- push bc
- call CopyVideoDataAlternate
- ld de, PikachuSprite + $c * $10
- ld hl, vNPCSprites2 + $c * $10
- ld a, [h_0xFFFC]
- and a
- jr z, .load
- ld de, PikachuSprite + $c * $10
- ld hl, vNPCSprites2 + $4c * $10
-.load
- pop bc
- call CopyVideoDataAlternate
- call LoadPikachuShadowIntoVRAM
- call LoadPikachuBallIconIntoVRAM
- ret
-
-PikachuPewterPokecenterCheck: ; fd8d4 (3f:58d4)
- ld a, [wCurMap]
- cp PEWTER_POKECENTER
- ret nz
- call EnablePikachuFollowingPlayer
- call Func_fcff2
- ret
-
-PikachuFanClubCheck: ; fd8e1 (3f:58e1)
- ld a, [wCurMap]
- cp POKEMON_FAN_CLUB
- ret nz
- call EnablePikachuFollowingPlayer
- call Func_fcff2
- ret
-
-PikachuBillsHouseCheck: ; fd8ee (3f:58ee)
- ld a, [wCurMap]
- cp BILLS_HOUSE
- ret nz
- call EnablePikachuFollowingPlayer
- ret
-
-Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3: ; fd8f8 (3f:58f8)
- call LoadCurrentMapView
- call UpdateSprites
- call Delay3
- ret
-
-Cosine_e: ; cosine?
- ld a, e
- add $10
- jr asm_fd908
-
-Sine_e: ; sine?
- ld a, e
-asm_fd908
- and $3f
- cp $20
- jr nc, .asm_fd913
- call GetSine
- ld a, h
- ret
-
-.asm_fd913
- and $1f
- call GetSine
- ld a, h
- cpl
- inc a
- ret
-
-GetSine:
- ld e, a
- ld a, d
- ld d, 0
- ld hl, SineWave_3f
- add hl, de
- add hl, de
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld hl, 0
-.asm_fd92b
- srl a
- jr nc, .asm_fd930
- add hl, de
-.asm_fd930
- sla e
- rl d
- and a
- jr nz, .asm_fd92b
- ret
-
-SineWave_3f:
- sine_wave $100
-
GetPikaPicAnimationScriptIndex: ; fd978 (3f:5978)
ld hl, PikachuMoodLookupTable
ld a, [wPikachuMood]
@@ -1757,7 +46,7 @@ PikaPicAnimationScriptPointerLookupTable:
db $fa, $11, $11, $10, $0a, $0a
db $ff, $11, $11, $13, $14, $14
-StarterPikachuEmotionCommand_5: ; fd9d0 (3f:59d0)
+StarterPikachuEmotionCommand_pikapic: ; fd9d0 (3f:59d0)
ld a, [H_AUTOBGTRANSFERENABLED]
push af
xor a
@@ -1773,26 +62,26 @@ StarterPikachuEmotionCommand_5: ; fd9d0 (3f:59d0)
ret
Func_fd9e4:
- call Func_fda2c
- callab Func_720e3
- call Func_fd9ff
+ call PlacePikapicTextBoxBorder
+ callab LoadOverworldPikachuFrontpicPalettes
+ call ResetPikaPicAnimBuffer
call LoadCurrentPikaPicAnimScriptPointer
call Func_fda9a
- call Func_fda2c
+ call PlacePikapicTextBoxBorder
call RunDefaultPaletteCommand
ret
-Func_fd9ff:
- ld hl, wPikaPicAnimPointer
- ld bc, $11
+ResetPikaPicAnimBuffer:
+ ld hl, wCurPikaMovementData
+ ld bc, wCurPikaMovementDataEnd - wCurPikaMovementData
xor a
call FillMemory
ld hl, wPikaPicAnimObjectDataBufferSize
- ld bc, $21
+ ld bc, wPikaPicAnimObjectDataBufferEnd - wPikaPicAnimObjectDataBufferSize
xor a
call FillMemory
- call Func_fe15c
- ld hl, $64
+ call ClearPikaPicUsedGFXBuffer
+ ld hl, 100
ld a, l
ld [wPikaPicAnimTimer], a
ld a, h
@@ -1803,7 +92,7 @@ Func_fd9ff:
ld [wPikaPicTextboxStartY], a
ret
-Func_fda2c:
+PlacePikapicTextBoxBorder:
xor a
ld [H_AUTOBGTRANSFERENABLED], a
coord hl, 6, 5
@@ -2832,9 +1121,9 @@ DecompressRequestPikaPicAnimGFX: ; fe128
.failed
ret
-Func_fe15c:
- ld hl, wNPCMovementDirections
- ld bc, $11
+ClearPikaPicUsedGFXBuffer:
+ ld hl, wPikaPicUsedGFXCount
+ ld bc, wPikaPicUsedGFXEnd - wPikaPicUsedGFXCount
xor a
call FillMemory
ret
@@ -2857,7 +1146,7 @@ GetPikaPicVRAMAddressForNewGFX:
CheckIfThereIsRoomForPikaPicAnimGFX:
push bc
push hl
- ld hl, wNPCMovementDirections + 1
+ ld hl, wPikaPicUsedGFX
ld c, 8
.loop
ld a, [hl]
@@ -2880,12 +1169,12 @@ CheckIfThereIsRoomForPikaPicAnimGFX:
.empty
ld [hl], d
inc hl
- ld a, [wNPCMovementDirections]
+ ld a, [wPikaPicUsedGFXCount]
add $80
ld [hl], a
- ld a, [wNPCMovementDirections]
+ ld a, [wPikaPicUsedGFXCount]
add e
- ld [wNPCMovementDirections], a
+ ld [wPikaPicUsedGFXCount], a
cp $80
jr z, .asm_fe1a7
jr nc, .failed
@@ -2905,7 +1194,7 @@ LookUpTileOffsetForCurrentPikaPicAnimGFX:
push bc
push hl
ld b, a
- ld hl, wNPCMovementDirections + 1
+ ld hl, wPikaPicUsedGFX
ld c, 8
.loop
ld a, [hli]
@@ -2995,455 +1284,4 @@ GetDMGBGPalForPikaThunderbolt:
call DelayFrames
ret
-Data_fe242:
- db 4, %11000000
- db 4, %11100100
- db 4, %11000000
- db 4, %11100100
- db 4, %11000000
- db 4, %11100100
- db 4, %11000000
- db 4, %11100100
- db 4, %11000000
- db 4, %11100100
- db 4, %11000000
- db 4, %11100100
- db 4, %11000000
- db 4, %11100100
- db 4, %11000000
- db 4, %11100100
- db 4, %11000000
- db 4, %11100100
- db 4, %11000000
- db 4, %11100100
- db $ff
-
-Data_fe26b: ; fe26b (3f:626b)
- pikapic_loadgfx Pic_e4000
- pikapic_loadgfx Pic_e49d1
- pikapic_loadgfx PikachuSprite
- pikapic_object $1, $80, $0, $0
- pikapic_object $2, $b2, $5, $5
- pikapic_object $3, $b6, $5, $5
- pikapic_waitbgmap
- pikapic_cry
-Data_fe286: ; fe286 (3f:6286)
- pikapic_waitbgmap
- pikapic_jump Data_fe286
-
-Data_fe28a: ; fe28a (3f:628a)
- pikapic_setduration 40
- pikapic_loadgfx Pic_e4000
- pikapic_loadgfx GFX_e40cc
- pikapic_object $4, $80, $0, $0
- pikapic_object $6, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry PikachuCry3
-Data_fe2a0: ; fe2a0 (3f:62a0)
- pikapic_waitbgmap
- pikapic_jump Data_fe2a0
-
-Data_fe2a4: ; fe2a4 (3f:62a4)
- pikapic_setduration 44
- pikapic_loadgfx Pic_e411c
- pikapic_loadgfx GFX_e41d2
- pikapic_object $4, $80, $0, $0
- pikapic_object $7, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe2ba: ; fe2ba (3f:62ba)
- pikapic_waitbgmap
- pikapic_jump Data_fe2ba
-
-Data_fe2be: ; fe2be (3f:62be)
- pikapic_setduration 80
- pikapic_loadgfx Pic_e4272
- pikapic_loadgfx GFX_e4323
- pikapic_object $4, $80, $0, $0
- pikapic_object $8, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe2d4: ; fe2d4 (3f:62d4)
- pikapic_waitbgmap
- pikapic_jump Data_fe2d4
-
-Data_fe2d8: ; fe2d8 (3f:62d8)
- pikapic_setduration 70
- pikapic_loadgfx Pic_e4383
- pikapic_loadgfx GFX_e444b
- pikapic_object $4, $80, $0, $0
- pikapic_object $9, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe2ee: ; fe2ee (3f:62ee)
- pikapic_waitbgmap
- pikapic_jump Data_fe2ee
-
-Data_fe2f2: ; fe2f2 (3f:62f2)
- pikapic_setduration 32
- pikapic_loadgfx Pic_e458b
- pikapic_loadgfx GFX_e463b
- pikapic_object $4, $80, $0, $0
- pikapic_object $a, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe308: ; fe308 (3f:6308)
- pikapic_waitbgmap
- pikapic_jump Data_fe308
-
-Data_fe30c: ; fe30c (3f:630c)
- pikapic_setduration 50
- pikapic_loadgfx Pic_e467b
- pikapic_loadgfx GFX_e472e
- pikapic_object $4, $80, $0, $0
- pikapic_object $b, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry PikachuCry38
-Data_fe322: ; fe322 (3f:6322)
- pikapic_waitbgmap
- pikapic_jump Data_fe322
-
-Data_fe326: ; fe326 (3f:6326)
- pikapic_setduration 58
- pikapic_loadgfx Pic_e476e
- pikapic_loadgfx GFX_e4841
- pikapic_object $4, $80, $0, $0
- pikapic_object $c, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe33c: ; fe33c (3f:633c)
- pikapic_waitbgmap
- pikapic_jump Data_fe33c
-
-Data_fe340: ; fe340 (3f:6340)
- pikapic_setduration 44
- pikapic_loadgfx Pic_e49d1
- pikapic_loadgfx GFX_e4a99
- pikapic_object $4, $80, $0, $0
- pikapic_object $d, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe356: ; fe356 (3f:6356)
- pikapic_waitbgmap
- pikapic_jump Data_fe356
-
-Data_fe35a: ; fe35a (3f:635a)
- pikapic_setduration 56
- pikapic_loadgfx Pic_e4b39
- pikapic_loadgfx GFX_e4bde
- pikapic_object $4, $80, $0, $0
- pikapic_object $e, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe370: ; fe370 (3f:6370)
- pikapic_waitbgmap
- pikapic_jump Data_fe370
-
-Data_fe374: ; fe374 (3f:6374)
- pikapic_setduration 56
- pikapic_loadgfx Pic_e4c3e
- pikapic_loadgfx GFX_e4ce0
- pikapic_loadgfx GFX_e4e70
- pikapic_object $4, $80, $0, $0
- pikapic_object $10, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe38c: ; fe38c (3f:638c)
- pikapic_waitbgmap
- pikapic_jump Data_fe38c
-
-Data_fe390: ; fe390 (3f:6390)
- pikapic_setduration 100
- pikapic_loadgfx Pic_e5000
- pikapic_loadgfx GFX_e50af
- pikapic_object $4, $80, $0, $0
- pikapic_object $11, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe3a6: ; fe3a6 (3f:63a6)
- pikapic_waitbgmap
- pikapic_jump Data_fe3a6
-
-Data_fe3aa: ; fe3aa (3f:63aa)
- pikapic_setduration 50
- pikapic_loadgfx Pic_e523f
- pikapic_loadgfx GFX_e52fe
- pikapic_object $4, $80, $0, $0
- pikapic_object $12, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry PikachuCry25
-Data_fe3c0: ; fe3c0 (3f:63c0)
- pikapic_waitbgmap
- pikapic_jump Data_fe3c0
-
-Data_fe3c4: ; fe3c4 (3f:63c4)
- pikapic_setduration 50
- pikapic_loadgfx Pic_e548e
- pikapic_loadgfx GFX_e5541
- pikapic_object $4, $80, $0, $0
- pikapic_object $13, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe3da: ; fe3da (3f:63da)
- pikapic_waitbgmap
- pikapic_jump Data_fe3da
-
-Data_fe3de: ; fe3de (3f:63de)
- pikapic_setduration 40
- pikapic_loadgfx Pic_e56d1
- pikapic_loadgfx GFX_e5794
- pikapic_object $4, $80, $0, $0
- pikapic_object $14, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe3f4: ; fe3f4 (3f:63f4)
- pikapic_waitbgmap
- pikapic_jump Data_fe3f4
-
-Data_fe3f8: ; fe3f8 (3f:63f8)
- pikapic_setduration 50
- pikapic_loadgfx Pic_e5924
- pikapic_loadgfx GFX_e59ed
- pikapic_object $4, $80, $0, $0
- pikapic_object $15, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe40e: ; fe40e (3f:640e)
- pikapic_waitbgmap
- pikapic_jump Data_fe40e
-
-Data_fe412: ; fe412 (3f:6412)
- pikapic_setduration 32
- pikapic_loadgfx Pic_e5b7d
- pikapic_loadgfx GFX_e5c4d
- pikapic_object $4, $80, $0, $0
- pikapic_object $16, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe428: ; fe428 (3f:6428)
- pikapic_waitbgmap
- pikapic_jump Data_fe428
-
-Data_fe42c: ; fe42c (3f:642c)
- pikapic_setduration 100
- pikapic_loadgfx Pic_e5ddd
- pikapic_loadgfx GFX_e5e90
- pikapic_object $4, $80, $0, $0
- pikapic_object $17, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe442: ; fe442 (3f:6442)
- pikapic_waitbgmap
- pikapic_jump Data_fe442
-
-Data_fe446: ; fe446 (3f:6446)
- pikapic_setduration 32
- pikapic_loadgfx GFX_e6020
- pikapic_loadgfx GFX_e61b0
- pikapic_object $5, $80, $0, $0
- pikapic_object $18, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry PikachuCry18
-Data_fe45c: ; fe45c (3f:645c)
- pikapic_waitbgmap
- pikapic_jump Data_fe45c
-
-Data_fe460: ; fe460 (3f:6460)
- pikapic_setduration 44
- pikapic_loadgfx Pic_e6340
- pikapic_loadgfx GFX_e63f7
- pikapic_object $4, $80, $0, $0
- pikapic_object $19, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe476: ; fe476 (3f:6476)
- pikapic_waitbgmap
- pikapic_jump Data_fe476
-
-Data_fe47a: ; fe47a (3f:647a)
- pikapic_setduration 50
- pikapic_loadgfx Pic_e6587
- pikapic_loadgfx GFX_e6646
- pikapic_object $4, $80, $0, $0
- pikapic_object $1a, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe490: ; fe490 (3f:6490)
- pikapic_waitbgmap
- pikapic_jump Data_fe490
-
-Data_fe494: ; fe494 (3f:6494)
- pikapic_setduration 40
- pikapic_loadgfx Pic_e67d6
- pikapic_loadgfx GFX_e682f
- pikapic_loadgfx GFX_e69bf
- pikapic_loadgfx GFX_e6b4f
- pikapic_loadgfx GFX_e6cdf
- pikapic_object $4, $80, $0, $0
- pikapic_object $1b, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry PikachuCry20
-Data_fe4b0: ; fe4b0 (3f:64b0)
- pikapic_waitbgmap
- pikapic_jump Data_fe4b0
-
-Data_fe4b4: ; fe4b4 (3f:64b4)
- pikapic_setduration 40
- pikapic_loadgfx GFX_e6e6f
- pikapic_loadgfx GFX_e6fff
- pikapic_object $5, $80, $0, $0
- pikapic_object $1c, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe4ca: ; fe4ca (3f:64ca)
- pikapic_waitbgmap
- pikapic_jump Data_fe4ca
-
-Data_fe4ce: ; fe4ce (3f:64ce)
- pikapic_setduration 70
- pikapic_loadgfx GFX_e718f
- pikapic_loadgfx GFX_e731f
- pikapic_object $5, $80, $0, $0
- pikapic_object $1d, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe4e4: ; fe4e4 (3f:64e4)
- pikapic_waitbgmap
- pikapic_jump Data_fe4e4
-
-Data_fe4e8: ; fe4e8 (3f:64e8)
- pikapic_setduration 60
- pikapic_loadgfx GFX_e74af
- pikapic_loadgfx GFX_e763f
- pikapic_object $5, $80, $0, $0
- pikapic_object $1e, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe4fe: ; fe4fe (3f:64fe)
- pikapic_waitbgmap
- pikapic_jump Data_fe4fe
-
-Data_fe502: ; fe502 (3f:6502)
- pikapic_setduration 50
- pikapic_loadgfx Pic_e77cf
- pikapic_loadgfx GFX_e7863
- pikapic_loadgfx GFX_e79f3
- pikapic_object $4, $80, $0, $0
- pikapic_object $1f, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
- pikapic_writebyte 13
- pikapic_waitbgmap
- pikapic_thunderbolt
- pikapic_ret
-
-Data_fe51f: ; fe51f (3f:651f)
- pikapic_waitbgmap
-Data_fe520: ; fe520 (3f:6520)
- pikapic_setduration 100
- pikapic_loadgfx Pic_e5000
- pikapic_loadgfx GFX_e50af
- pikapic_loadgfx GFX_e7b83
- pikapic_loadgfx GFX_e7d13
- pikapic_object $4, $80, $0, $0
- pikapic_object $20, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe53a: ; fe53a (3f:653a)
- pikapic_waitbgmap
- pikapic_jump Data_fe53a
-
-Data_fe53e: ; fe53e (3f:653e)
- pikapic_setduration 30
- pikapic_loadgfx Pic_f0abf
- pikapic_loadgfx GFX_f0b64
- pikapic_object $4, $80, $0, $0
- pikapic_object $21, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe554: ; fe554 (3f:6554)
- pikapic_waitbgmap
- pikapic_jump Data_fe554
-
-Data_fe558: ; fe558 (3f:6558)
- pikapic_setduration 64
- pikapic_loadgfx Pic_f0cf4
- pikapic_loadgfx GFX_f0d82
- pikapic_object $4, $80, $0, $0
- pikapic_object $22, $99, $0, $0
- pikapic_waitbgmap
- pikapic_cry
-Data_fe56e: ; fe56e (3f:656e)
- pikapic_waitbgmap
- pikapic_jump Data_fe56e
-
-PikaPicAnimGFXHeaders:
-pikapicanimgfx: MACRO
-\2_id::
- db \1
- dba \2
- endm
-
- dbbw $01, $39, $0000
- pikapicanimgfx -1, Pic_e4000 ; 01
- pikapicanimgfx 5, GFX_e40cc ; 02
- pikapicanimgfx -1, Pic_e411c ; 03
- pikapicanimgfx 10, GFX_e41d2 ; 04
- pikapicanimgfx -1, Pic_e4272 ; 05
- pikapicanimgfx 6, GFX_e4323 ; 06
- pikapicanimgfx -1, Pic_e4383 ; 07
- pikapicanimgfx 20, GFX_e444b ; 08
- pikapicanimgfx -1, Pic_e458b ; 09
- pikapicanimgfx 4, GFX_e463b ; 0a
- pikapicanimgfx -1, Pic_e467b ; 0b
- pikapicanimgfx 4, GFX_e472e ; 0c
- pikapicanimgfx -1, Pic_e476e ; 0d
- pikapicanimgfx 25, GFX_e4841 ; 0e
- pikapicanimgfx -1, Pic_e49d1 ; 0f
- pikapicanimgfx 10, GFX_e4a99 ; 00
- pikapicanimgfx -1, Pic_e4b39 ; 11
- pikapicanimgfx 6, GFX_e4bde ; 12
- pikapicanimgfx -1, Pic_e4c3e ; 13
- pikapicanimgfx 25, GFX_e4ce0 ; 14
- pikapicanimgfx 25, GFX_e4e70 ; 15
- pikapicanimgfx -1, Pic_e5000 ; 16
- pikapicanimgfx 25, GFX_e50af ; 17
- pikapicanimgfx -1, Pic_e523f ; 18
- pikapicanimgfx 25, GFX_e52fe ; 19
- pikapicanimgfx -1, Pic_e548e ; 1a
- pikapicanimgfx 25, GFX_e5541 ; 1b
- pikapicanimgfx -1, Pic_e56d1 ; 1c
- pikapicanimgfx 25, GFX_e5794 ; 1d
- pikapicanimgfx -1, Pic_e5924 ; 1e
- pikapicanimgfx 25, GFX_e59ed ; 1f
- pikapicanimgfx -1, Pic_e5b7d ; 20
- pikapicanimgfx 25, GFX_e5c4d ; 21
- pikapicanimgfx -1, Pic_e5ddd ; 22
- pikapicanimgfx 25, GFX_e5e90 ; 23
- pikapicanimgfx 25, GFX_e6020 ; 24
- pikapicanimgfx 25, GFX_e61b0 ; 25
- pikapicanimgfx -1, Pic_e6340 ; 26
- pikapicanimgfx 25, GFX_e63f7 ; 27
- pikapicanimgfx -1, Pic_e6587 ; 28
- pikapicanimgfx 25, GFX_e6646 ; 29
- pikapicanimgfx -1, Pic_e67d6 ; 2a
- pikapicanimgfx 25, GFX_e682f ; 2b
- pikapicanimgfx 25, GFX_e69bf ; 2c
- pikapicanimgfx 25, GFX_e6b4f ; 2d
- pikapicanimgfx 25, GFX_e6cdf ; 2e
- pikapicanimgfx 25, GFX_e6e6f ; 2f
- pikapicanimgfx 25, GFX_e6fff ; 30
- pikapicanimgfx 25, GFX_e718f ; 31
- pikapicanimgfx 25, GFX_e731f ; 32
- pikapicanimgfx 25, GFX_e74af ; 33
- pikapicanimgfx 25, GFX_e763f ; 34
- pikapicanimgfx -1, Pic_e77cf ; 35
- pikapicanimgfx 25, GFX_e7863 ; 36
- pikapicanimgfx 25, GFX_e79f3 ; 37
- pikapicanimgfx 25, GFX_e7b83 ; 38
- pikapicanimgfx 25, GFX_e7d13 ; 39
- pikapicanimgfx -1, Pic_f0abf ; 3a
- pikapicanimgfx 25, GFX_f0b64 ; 3b
- pikapicanimgfx -1, Pic_f0cf4 ; 3c
- pikapicanimgfx 25, GFX_f0d82 ; 3d
- pikapicanimgfx 24, PikachuSprite ; 3e
+INCLUDE "data/pikachu_pic_animation.asm"
diff --git a/engine/pikachu_status.asm b/engine/pikachu_status.asm
new file mode 100755
index 00000000..17330645
--- /dev/null
+++ b/engine/pikachu_status.asm
@@ -0,0 +1,258 @@
+IsStarterPikachuInOurParty:: ; fcdb8 (3f:4db8)
+ ld hl, wPartySpecies
+ ld de, wPartyMon1OTID
+ ld bc, wPartyMonOT
+ push hl
+.loop
+ pop hl
+ ld a, [hli]
+ push hl
+ inc a
+ jr z, .noPlayerPikachu
+ cp PIKACHU + 1
+ jr nz, .curMonNotPlayerPikachu
+ ld h, d
+ ld l, e
+ ld a, [wPlayerID]
+ cp [hl]
+ jr nz, .curMonNotPlayerPikachu
+ inc hl
+ ld a, [wPlayerID+1]
+ cp [hl]
+ jr nz, .curMonNotPlayerPikachu
+ push de
+ push bc
+ ld hl, wPlayerName
+ ld d, $6 ; possible player length - 1
+.nameCompareLoop
+ dec d
+ jr z, .sameOT
+ ld a, [bc]
+ inc bc
+ cp [hl]
+ inc hl
+ jr z, .nameCompareLoop
+ pop bc
+ pop de
+.curMonNotPlayerPikachu
+ ld hl, wPartyMon2 - wPartyMon1
+ add hl, de
+ ld d, h
+ ld e, l
+ ld hl, NAME_LENGTH
+ add hl, bc
+ ld b, h
+ ld c, l
+ jr .loop
+
+.sameOT
+ pop bc
+ pop de
+ ld h, d
+ ld l, e
+ ld bc, -NAME_LENGTH
+ add hl, bc
+ ld a, [hli]
+ or [hl]
+ jr z, .noPlayerPikachu ; XXX how is this determined?
+ pop hl
+ scf
+ ret
+
+.noPlayerPikachu
+ pop hl
+ and a
+ ret
+
+IsThisPartymonStarterPikachu_Box:: ; fce0d (3f:4e0d)
+ ld hl, wBoxMon1
+ ld bc, wBoxMon2 - wBoxMon1
+ ld de, wBoxMonOT
+ jr asm_fce21
+
+IsThisPartymonStarterPikachu_Party:: ; fce18 (3f:4e18)
+IsThisPartymonStarterPikachu::
+ ld hl, wPartyMon1
+ ld bc, wPartyMon2 - wPartyMon1
+ ld de, wPartyMonOT
+asm_fce21: ; fce21 (3f:4e21)
+ ld a, [wWhichPokemon]
+ call AddNTimes
+ ld a, [hl]
+ cp PIKACHU
+ jr nz, .notPlayerPikachu
+ ld bc, wPartyMon1OTID - wPartyMon1
+ add hl, bc
+ ld a, [wPlayerID]
+ cp [hl]
+ jr nz, .notPlayerPikachu
+ inc hl
+ ld a, [wPlayerID+1]
+ cp [hl]
+ jr nz, .notPlayerPikachu
+ ld h, d
+ ld l, e
+ ld a, [wWhichPokemon]
+ ld bc, NAME_LENGTH
+ call AddNTimes
+ ld de, wPlayerName
+ ld b, $6
+.loop
+ dec b
+ jr z, .isPlayerPikachu
+ ld a, [de]
+ inc de
+ cp [hl]
+ inc hl
+ jr z, .loop
+.notPlayerPikachu
+ and a
+ ret
+
+.isPlayerPikachu
+ scf
+ ret
+
+UpdatePikachuMoodAfterBattle:: ; fce5a (3f:4e5a)
+; because d is always $82 at this function, it serves to
+; ensure Pikachu's mood is at least 130 after battle
+ push de
+ call IsStarterPikachuInOurParty
+ pop de
+ ret nc
+ ld a, d
+ cp 128
+ ld a, [wPikachuMood]
+ jr c, .d_less_than_128 ; we never jump
+ cp d
+ jr c, .load_d_into_mood
+ ret
+
+.d_less_than_128
+ cp d
+ ret c
+.load_d_into_mood
+ ld a, d
+ ld [wPikachuMood], a
+ ret
+
+CheckPikachuFaintedOrStatused:: ; fce73 (3f:4e73)
+; function to test if Pikachu is alive?
+ xor a
+ ld [wWhichPokemon], a
+ ld hl, wPartyCount
+.loop
+ inc hl
+ ld a, [hl]
+ cp $ff
+ jr z, .dead_or_not_in_party
+ push hl
+ call IsThisPartymonStarterPikachu_Party
+ pop hl
+ jr nc, .next
+ ld a, [wWhichPokemon]
+ ld hl, wPartyMon1HP
+ ld bc, wPartyMon2 - wPartyMon1
+ call AddNTimes
+ ld a, [hli]
+ or [hl]
+ ld d, a
+ inc hl
+ inc hl
+ ld a, [hl] ; status
+ and a
+ jr nz, .alive
+ jr .dead_or_not_in_party
+
+.next
+ ld a, [wWhichPokemon]
+ inc a
+ ld [wWhichPokemon], a
+ jr .loop
+
+.alive
+ scf
+ ret
+
+.dead_or_not_in_party
+ and a
+ ret
+
+IsSurfingPikachuInThePlayersParty:: ; fceab (3f:4eab)
+ ld hl, wPartySpecies
+ ld de, wPartyMon1Moves
+ ld bc, wPartyMonOT
+ push hl
+.loop
+ pop hl
+ ld a, [hli]
+ push hl
+ inc a
+ jr z, .noSurfingPlayerPikachu
+ cp PIKACHU+1
+ jr nz, .curMonNotSurfingPlayerPikachu
+ ld h, d
+ ld l, e
+ push hl
+ push bc
+ ld b, NUM_MOVES
+.moveSearchLoop
+ ld a, [hli]
+ cp SURF
+ jr z, .foundSurfingPikachu
+ dec b
+ jr nz, .moveSearchLoop
+ pop bc
+ pop hl
+ jr .curMonNotSurfingPlayerPikachu
+
+.foundSurfingPikachu
+ pop bc
+ pop hl
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ ld a, [wPlayerID]
+ cp [hl]
+ jr nz, .curMonNotSurfingPlayerPikachu
+ inc hl
+ ld a, [wPlayerID+1]
+ cp [hl]
+ jr nz, .curMonNotSurfingPlayerPikachu
+ push de
+ push bc
+ ld hl, wPlayerName
+ ld d, $6
+.nameCompareLoop
+ dec d
+ jr z, .foundSurfingPlayerPikachu
+ ld a, [bc]
+ inc bc
+ cp [hl]
+ inc hl
+ jr z, .nameCompareLoop
+ pop bc
+ pop de
+.curMonNotSurfingPlayerPikachu
+ ld hl, wPartyMon2 - wPartyMon1
+ add hl, de
+ ld d, h
+ ld e, l
+ ld hl, NAME_LENGTH
+ add hl, bc
+ ld b, h
+ ld c, l
+ jr .loop
+
+.foundSurfingPlayerPikachu
+ pop bc
+ pop de
+ pop hl
+ scf
+ ret
+
+.noSurfingPlayerPikachu
+ pop hl
+ and a
+ ret
diff --git a/engine/printer.asm b/engine/printer.asm
index 08523bfd..d4cc8192 100755..100644
--- a/engine/printer.asm
+++ b/engine/printer.asm
@@ -1,831 +1,232 @@
-Func_e8783: ; e8783 (3a:4783)
- ld a, 9
-Func_e8785:
- push af
- ld hl, wOverworldMap
- lb bc, 4, 13
- xor a
- call Func_e8a2e
- xor a
- ld [rSB], a
- ld [rSC], a
- ld [wUnknownSerialFlag_d49b], a
- ld hl, wUnknownSerialFlag_d49a
- set 0, [hl]
- ld a, [wd498]
- ld [$cae3], a
- pop af
- ld [$caf4], a
- ret
-
-; e87a8
-Func_e87a8: ; e87a8 (3a:47a8)
- ld a, [wOverworldMap]
- ld e, a
- ld d, 0
- ld hl, Jumptable_e87b7
- add hl, de
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jp [hl]
-
-Jumptable_e87b7:
- dw Func_e87fd
- dw Func_e88c9
- dw Func_e88a6
- dw Func_e881f
- dw Func_e8906
- dw Func_e88b4
- dw Func_e884b
- dw Func_e8906
- dw Func_e88a6
- dw Func_e8864
- dw Func_e8906
- dw Func_e88a6
- dw Func_e8927
- dw Func_e87e9
- dw Func_e87f3
- dw Func_e88a6
- dw Func_e8889
- dw Func_e87f7
- dw Func_e8936
- dw Func_e8939
-
-Func_e87df:
- ld hl, wOverworldMap
- inc [hl]
- ret
-
-Func_e87e4:
- ld hl, wOverworldMap
- dec [hl]
- ret
-
-Func_e87e9:
- xor a
- ld [$c971], a
- ld hl, wOverworldMap
- set 7, [hl]
- ret
-
-Func_e87f3:
- call Func_e87df
- ret
-
-Func_e87f7:
- ld a, $01
- ld [wOverworldMap], a
- ret
-
-Func_e87fd:
- call Func_e8981
- ld hl, Data_e8a3a
- call Func_e8968
- xor a
- ld [$c976], a
- ld [$c977], a
- ld a, [$caf4]
- ld [$c6e9], a
- call Func_e87df
- call Func_e8949
- ld a, $01
- ld [$cae0], a
- ret
-
-Func_e881f:
- call Func_e8981
- ld hl, $c6e9
- ld a, [hl]
- and a
- jr z, Func_e884b
- ld hl, Data_e8a46
- call Func_e8968
- call Func_e89e6
- ld a, $80
- ld [$c976], a
- ld a, $02
- ld [$c977], a
- call Func_e899f
- call Func_e87df
- call Func_e8949
- ld a, $02
- ld [$cae0], a
- ret
-
-Func_e884b:
- ld a, $06
- ld [wOverworldMap], a
- ld hl, Data_e8a4c
- call Func_e8968
- xor a
- ld [$c976], a
- ld [$c977], a
- call Func_e87df
- call Func_e8949
- ret
-
-Func_e8864:
- call Func_e8981
- ld hl, Data_e8a40
- call Func_e8968
- call Func_e89cf
- ld a, $04
- ld [$c976], a
- ld a, $00
- ld [$c977], a
- call Func_e899f
- call Func_e87df
- call Func_e8949
- ld a, $03
- ld [$cae0], a
- ret
-
-Func_e8889:
- call Func_e8981
- ld hl, Data_e8a3a
- call Func_e8968
- xor a
- ld [$c976], a
- ld [$c977], a
- ld a, [$caf4]
- ld [$c6e9], a
- call Func_e87df
- call Func_e8949
- ret
-
-Func_e88a6:
- ld hl, $c973
- inc [hl]
- ld a, [hl]
- cp a, $06
- ret c
- xor a
- ld [hl], a
- call Func_e87df
- ret
-
-Func_e88b4:
- ld hl, $c973
- inc [hl]
- ld a, [hl]
- cp a, $06
- ret c
- xor a
- ld [hl], a
- ld hl, $c6e9
- dec [hl]
- call Func_e87e4
- call Func_e87e4
- ret
-
-Func_e88c9:
- ld a, [wUnknownSerialFlag_d49b]
- and a
- ret nz
- ld a, [$c970]
- cp a, $ff
- jr nz, .asm_e88dc
- ld a, [$c971]
- cp a, $ff
- jr z, .asm_e88f8
-.asm_e88dc
- ld a, [$c970]
- cp a, $81
- jr nz, .asm_e88f8
- ld a, [$c971]
- cp a, $00
- jr nz, .asm_e88f8
- ld hl, wUnknownSerialFlag_d49a
- set 1, [hl]
- ld a, $05
- ld [$c972], a
- call Func_e87df
- ret
-
-.asm_e88f8
- ld a, $ff
- ld [$c970], a
- ld [$c971], a
- ld a, $0e
- ld [wOverworldMap], a
- ret
-
-Func_e8906:
- ld a, [wUnknownSerialFlag_d49b]
- and a
- ret nz
- ld a, [$c971]
- and a, $f0
- jr nz, .asm_e8921
- ld a, [$c971]
- and a, $01
- jr nz, .asm_e891d
- call Func_e87df
- ret
-
-.asm_e891d
- call Func_e87e4
- ret
-
-.asm_e8921
- ld a, $12
- ld [wOverworldMap], a
- ret
-
-Func_e8927:
- ld a, [wUnknownSerialFlag_d49b]
- and a
- ret nz
- ld a, [$c971]
- and a, $f3
- ret nz
- call Func_e87df
- ret
-
-Func_e8936:
- call Func_e87df
-Func_e8939:
- ld a, [wUnknownSerialFlag_d49b]
- and a
- ret nz
- ld a, [$c971]
- and a, $f0
- ret nz
- xor a
- ld [wOverworldMap], a
- ret
-
-Func_e8949:
-.asm_e8949
- ld a, [wUnknownSerialFlag_d49b]
- and a
- jr nz, .asm_e8949
- xor a
- ld [$c974], a
- ld [$c975], a
- ld a, $01
- ld [wUnknownSerialFlag_d49b], a
- ld a, $88
- ld [rSB], a
- ld a, $01
- ld [rSC], a
- ld a, $81
- ld [rSC], a
- ret
-
-Func_e8968:
- ld a, [hli]
- ld [$c6ea], a
- ld a, [hli]
- ld [$c6eb], a
- ld a, [hli]
- ld [$c6ec], a
- ld a, [hli]
- ld [$c6ed], a
- ld a, [hli]
- ld [$c6ee], a
- ld a, [hl]
- ld [$c6ef], a
- ret
-
-Func_e8981:
- xor a
- ld hl, $c6ea
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hl], a
- ld hl, $c6ee
- ld [hli], a
- ld [hl], a
- xor a
- ld [$c976], a
- ld [$c977], a
- ld hl, $c6f0
- ld bc, $0280
- call Func_e8a2e
- ret
-
-Func_e899f:
- ld hl, $0000
- ld bc, $0004
- ld de, $c6ea
- call Func_e89c2
- ld a, [$c976]
- ld c, a
- ld a, [$c977]
- ld b, a
- ld de, $c6f0
- call Func_e89c2
- ld a, l
- ld [$c6ee], a
- ld a, h
- ld [$c6ef], a
- ret
-
-Func_e89c2:
-.asm_e89c2
- ld a, [de]
- inc de
- add l
- jr nc, .asm_e89c8
- inc h
-.asm_e89c8
- ld l, a
- dec bc
- ld a, c
- or b
- jr nz, .asm_e89c2
- ret
-
-Func_e89cf:
- ld a, $01
- ld [$c6f0], a
- ld a, [$cae2]
- ld [$c6f1], a
- ld a, $e4
- ld [$c6f2], a
- ld a, [$cae3]
- ld [$c6f3], a
- ret
-
-Func_e89e6:
- ld a, [$c6e9]
- ld b, a
- ld a, [$caf4]
- sub b
- ld hl, wPrinterTileBuffer
- ld de, $0028
-.asm_e89f4
- and a
- jr z, .asm_e89fb
- add hl, de
- dec a
- jr .asm_e89f4
-
-.asm_e89fb
- ld e, l
- ld d, h
- ld hl, $c6f0
- ld c, $28
-.asm_e8a02
- ld a, [de]
- inc de
- push bc
- push de
- push hl
- swap a
- ld d, a
- and a, $f0
- ld e, a
- ld a, d
- and a, $0f
- ld d, a
- and a, $08
- ld a, d
- jr nz, .asm_e8a1a
- or a, $90
- jr .asm_e8a1c
-
-.asm_e8a1a
- or a, $80
-.asm_e8a1c
- ld d, a
- ld bc, $3a01
- call CopyVideoData
- pop hl
- ld de, $0010
- add hl, de
- pop de
- pop bc
- dec c
- jr nz, .asm_e8a02
- ret
-
-Func_e8a2e: ; e8a2e (3a:4a2e)
- push de
- ld e, a
-.asm_e8a30
- ld [hl], e
- inc hl
- dec bc
- ld a, c
- or b
- jr nz, .asm_e8a30
- ld a, e
- pop de
- ret
-
-Data_e8a3a:
- db $01, $00, $00, $00, $01, $00
-Data_e8a40:
- db $02, $00, $04, $00, $00, $00
-Data_e8a46:
- db $04, $00, $80, $02, $00, $00
-Data_e8a4c:
- db $04, $00, $00, $00, $04, $00
-Data_e8a52:
- db $08, $00, $00, $00, $08, $00
-Data_e8a58:
- db $0f, $00, $00, $00, $0f, $00
-
-Func_e8a5e: ; e8a5e (3a:4a5e)
- ld a, [wUnknownSerialFlag_d49b]
- ld e, a
- ld d, 0
- ld hl, Jumptable_e8a6d
- add hl, de
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jp [hl]
-
-Jumptable_e8a6d:
- dw Func_e8ab2
- dw Func_e8ab3
- dw Func_e8abc
- dw Func_e8ac6
- dw Func_e8ad0
- dw Func_e8ada
- dw Func_e8ae4
- dw Func_e8b0f
- dw Func_e8b19
- dw Func_e8b23
- dw Func_e8b2c
- dw Func_e8b3a
- dw Func_e8ab3
- dw Func_e8b44
- dw Func_e8b4d
- dw Func_e8b4d
- dw Func_e8b4d
- dw Func_e8b44
- dw Func_e8b4d
- dw Func_e8b23
- dw Func_e8b2c
- dw Func_e8b6a
- dw Func_e8ab3
- dw Func_e8b56
- dw Func_e8b4d
- dw Func_e8b4d
- dw Func_e8b4d
- dw Func_e8b56
- dw Func_e8b4d
- dw Func_e8b23
- dw Func_e8b2c
- dw Func_e8b3a
-
-Func_e8aad:
- ld hl, wUnknownSerialFlag_d49b
- inc [hl]
- ret
-
-Func_e8ab2:
- ret
-
-Func_e8ab3:
- ld a, $33
- call Func_e8b5f
- call Func_e8aad
- ret
-
-Func_e8abc:
- ld a, [$c6ea]
- call Func_e8b5f
- call Func_e8aad
- ret
-
-Func_e8ac6:
- ld a, [$c6eb]
- call Func_e8b5f
- call Func_e8aad
- ret
-
-Func_e8ad0:
- ld a, [$c6ec]
- call Func_e8b5f
- call Func_e8aad
- ret
-
-Func_e8ada:
- ld a, [$c6ed]
- call Func_e8b5f
- call Func_e8aad
- ret
-
-Func_e8ae4:
- ld hl, $c976
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld a, e
- or d
- jr z, .asm_e8b0c
- dec de
- ld [hl], d
- dec hl
- ld [hl], e
- ld a, [$c974]
- ld e, a
- ld a, [$c975]
- ld d, a
- ld hl, $c6f0
- add hl, de
- inc de
- ld a, e
- ld [$c974], a
- ld a, d
- ld [$c975], a
- ld a, [hl]
- call Func_e8b5f
- ret
-
-.asm_e8b0c
- call Func_e8aad
-Func_e8b0f:
- ld a, [$c6ee]
- call Func_e8b5f
- call Func_e8aad
- ret
-
-Func_e8b19:
- ld a, [$c6ef]
- call Func_e8b5f
- call Func_e8aad
- ret
-
-Func_e8b23:
- ld a, $00
- call Func_e8b5f
- call Func_e8aad
- ret
-
-Func_e8b2c:
- ld a, [rSB]
- ld [$c970], a
- ld a, $00
- call Func_e8b5f
- call Func_e8aad
- ret
-
-Func_e8b3a:
- ld a, [rSB]
- ld [$c971], a
- xor a
- ld [wUnknownSerialFlag_d49b], a
- ret
-
-Func_e8b44:
- ld a, $0f
- call Func_e8b5f
- call Func_e8aad
- ret
-
-Func_e8b4d:
- ld a, $00
- call Func_e8b5f
- call Func_e8aad
- ret
-
-Func_e8b56:
- ld a, $08
- call Func_e8b5f
- call Func_e8aad
- ret
-
-Func_e8b5f:
- ld [rSB], a
- ld a, $01
- ld [rSC], a
- ld a, $81
- ld [rSC], a
- ret
-
-Func_e8b6a:
- ld a, [rSB]
- ld [$c971], a
- xor a
- ld [wUnknownSerialFlag_d49b], a
- ret
-
-Func_e8b74: ; e8b74 (3a:4b74)
- ld a, [$cfca]
+ const_def
+ const PRINTER_STATUS_BLANK
+ const PRINTER_STATUS_CHECKING_LINK
+ const PRINTER_STATUS_TRANSMITTING
+ const PRINTER_STATUS_PRINTING
+ const PRINTER_ERROR_1
+ const PRINTER_ERROR_2
+ const PRINTER_ERROR_3
+ const PRINTER_ERROR_4
+ const PRINTER_ERROR_WRONG_DEVICE
+
+INCLUDE "engine/printer/serial.asm"
+
+PrintPokedexEntry: ; e8b74 (3a:4b74)
+ ld a, [wUpdateSpritesEnabled]
push af
xor a
- ld [$cfca], a
- ld [$ffdb], a
- call Func_e8f24
+ ld [wUpdateSpritesEnabled], a
+ ld [hCanceledPrinting], a
+ call Printer_PlayPrinterMusic
ld a, [rIE]
push af
xor a
ld [rIF], a
- ld a, $09
+ ld a, $9
ld [rIE], a
xor a
- ld [$ffba], a
- call Func_e8c30
- call Func_e8785
- ld a, [$caf9]
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call Printer_GetDexEntryRegisters
+ call Printer_StartTransmission
+ ld a, [wPrinterPokedexMonIsOwned]
and a
- jr z, .asm_e8b9e
- ld a, $10
- jr .asm_e8ba0
-
-.asm_e8b9e
- ld a, $13
-.asm_e8ba0
- ld [$cae2], a
- call Func_e8efc
+ jr z, .not_caught
+ ld a, 16
+ jr .got_size
+
+.not_caught
+ ld a, 19
+.got_size
+ ld [wcae2], a
+ call Printer_CopyTileMapToPrinterTileBuffer
call ClearScreen
- callab Func_401c2
- callab Func_4027c
- ld a, $01
- ld [$ffba], a
- call Func_e8c0c
- jr c, .asm_e8bf4
- ld a, [$caf9]
+ callab Pokedex_DrawInterface
+ callab Pokedex_PlacePokemonList
+ ld a, $1
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call .TryPrintPage
+ jr c, .finish_printing
+ ld a, [wPrinterPokedexMonIsOwned]
and a
- jr z, .asm_e8bf4
+ jr z, .finish_printing
xor a
- ld [wUnknownSerialFlag_d49a], a
- ld [wUnknownSerialFlag_d49b], a
- ld c, $0c
+ ld [wPrinterConnectionOpen], a
+ ld [wPrinterOpcode], a
+ ld c, $c
call DelayFrames
call SaveScreenTilesToBuffer1
xor a
- ld [$ffba], a
- call Func_e8c50
- ld a, $07
- call Func_e8785
- ld a, $03
- ld [$cae2], a
- call Func_e8efc
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call Printer_PrepareDexEntryForPrinting
+ ld a, $7
+ call Printer_StartTransmission
+ ld a, $3
+ ld [wcae2], a
+ call Printer_CopyTileMapToPrinterTileBuffer
call LoadScreenTilesFromBuffer1
- ld a, $01
- ld [$ffba], a
- call Func_e8c0c
-.asm_e8bf4
+ ld a, $1
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call .TryPrintPage
+.finish_printing
xor a
- ld [wUnknownSerialFlag_d49a], a
- ld [wUnknownSerialFlag_d49b], a
+ ld [wPrinterConnectionOpen], a
+ ld [wPrinterOpcode], a
xor a
ld [rIF], a
pop af
ld [rIE], a
- call Func_0f3d
- call Func_e8f3b
+ call ReloadMapAfterPrinter
+ call Printer_PlayMapMusic
pop af
- ld [$cfca], a
+ ld [wUpdateSpritesEnabled], a
ret
-Func_e8c0c:
- call Func_e8f16
-.asm_e8c0f
+.TryPrintPage:
+ call Printer_ResetJoypadHRAM
+.print_loop
call JoypadLowSensitivity
- call Func_e8eca
- jr c, .asm_e8c2e
- ld a, [$c6e8]
+ call Printer_CheckPressingB
+ jr c, .pressed_b
+ ld a, [wPrinterSendState]
bit 7, a
- jr nz, .asm_e8c2c
- call Func_e87a8
- call Func_e8f51
- call Func_e8f82
+ jr nz, .completed
+ call PrinterTransmissionJumptable
+ call GBPrinter_CheckForErrors
+ call GBPrinter_UpdateStatusMessage
call DelayFrame
- jr .asm_e8c0f
+ jr .print_loop
-.asm_e8c2c
+.completed
and a
ret
-.asm_e8c2e
+.pressed_b
scf
ret
-Func_e8c30:
- callab Func_4039c
+Printer_GetDexEntryRegisters:
+ callab DrawDexEntryOnScreen
ld a, l
- ld [$caf5], a
+ ld [wPrinterPokedexEntryTextPointer], a
ld a, h
- ld [$caf6], a
- ld a, $00
- rla
- ld [$caf9], a
+ ld [wPrinterPokedexEntryTextPointer + 1], a
+ ld a, $0
+ rla ; copy carry flag state to bit 0
+ ld [wPrinterPokedexMonIsOwned], a
and a
- jr z, .asm_e8c4d
- ld a, $05
- jr .asm_e8c4f
+ jr z, .not_caught
+ ld a, $5
+ jr .got_num_rows
-.asm_e8c4d
- ld a, $09
-.asm_e8c4f
+.not_caught
+ ld a, $9
+.got_num_rows
ret
-Func_e8c50:
+Printer_PrepareDexEntryForPrinting:
call ClearScreen
- callab Func_404bc
+ callab Pokedex_PrepareDexEntryForPrinting
ret
-Func_e8c5c:
+PrintSurfingMinigameHighScore:
xor a
- ld [$ffdb], a
- call Func_e8f24
- call Func_e910a
+ ld [hCanceledPrinting], a
+ call Printer_PlayPrinterMusic
+ call Printer_PrepareSurfingMinigameHighScoreTileMap
ld a, [rIE]
push af
xor a
ld [rIF], a
- ld a, $09
+ ld a, $9
ld [rIE], a
- call Func_e8783
+ call StartTransmission_Send9Rows
ld a, $13
- ld [$cae2], a
- call Func_e8efc
- call Func_e8f16
-.asm_e8c7d
+ ld [wcae2], a
+ call Printer_CopyTileMapToPrinterTileBuffer
+ call Printer_ResetJoypadHRAM
+.loop
call JoypadLowSensitivity
- call Func_e8eca
- jr c, .asm_e8c9a
- ld a, [$c6e8]
+ call Printer_CheckPressingB
+ jr c, .quit
+ ld a, [wPrinterSendState]
bit 7, a
- jr nz, .asm_e8c9a
- call Func_e87a8
- call Func_e8f51
- call Func_e8f82
+ jr nz, .quit
+ call PrinterTransmissionJumptable
+ call GBPrinter_CheckForErrors
+ call GBPrinter_UpdateStatusMessage
call DelayFrame
- jr .asm_e8c7d
+ jr .loop
-.asm_e8c9a
+.quit
xor a
- ld [wUnknownSerialFlag_d49a], a
- ld [wUnknownSerialFlag_d49b], a
- call Func_e8f09
+ ld [wPrinterConnectionOpen], a
+ ld [wPrinterOpcode], a
+ call Printer_CopyTileMapFromPrinterTileBuffer
xor a
ld [rIF], a
pop af
ld [rIE], a
- call Func_0f3d
- call Func_e8f3b
+ call ReloadMapAfterPrinter
+ call Printer_PlayMapMusic
ret
-Func_e8cb1:
+PrintDiploma:
xor a
- ld [$ffdb], a
- call Func_e8f24
+ ld [hCanceledPrinting], a
+ call Printer_PlayPrinterMusic
call _DisplayDiploma
ld a, [rIE]
push af
xor a
ld [rIF], a
- ld a, $09
+ ld a, $9
ld [rIE], a
- call Func_e8783
+ call StartTransmission_Send9Rows
ld a, $10
- ld [$cae2], a
- call Func_e8efc
+ ld [wcae2], a
+ call Printer_CopyTileMapToPrinterTileBuffer
call Func_e8d11
jr c, .asm_e8cfa
xor a
- ld [wUnknownSerialFlag_d49a], a
- ld [wUnknownSerialFlag_d49b], a
- ld c, $0c
+ ld [wPrinterConnectionOpen], a
+ ld [wPrinterOpcode], a
+ ld c, $c
call DelayFrames
call SaveScreenTilesToBuffer1
xor a
- ld [$ffba], a
+ ld [H_AUTOBGTRANSFERENABLED], a
call Func_e9ad3
- call Func_e8783
- ld a, $03
- ld [$cae2], a
- call Func_e8efc
+ call StartTransmission_Send9Rows
+ ld a, $3
+ ld [wcae2], a
+ call Printer_CopyTileMapToPrinterTileBuffer
call LoadScreenTilesFromBuffer1
call Func_e8d11
.asm_e8cfa
xor a
- ld [wUnknownSerialFlag_d49a], a
- ld [wUnknownSerialFlag_d49b], a
- call Func_e8f09
+ ld [wPrinterConnectionOpen], a
+ ld [wPrinterOpcode], a
+ call Printer_CopyTileMapFromPrinterTileBuffer
xor a
ld [rIF], a
pop af
ld [rIE], a
- call Func_0f3d
- call Func_e8f3b
+ call ReloadMapAfterPrinter
+ call Printer_PlayMapMusic
ret
Func_e8d11:
- call Func_e8f16
+ call Printer_ResetJoypadHRAM
.asm_e8d14
call JoypadLowSensitivity
- call Func_e8eca
+ call Printer_CheckPressingB
jr c, .asm_e8d33
- ld a, [$c6e8]
+ ld a, [wPrinterSendState]
bit 7, a
jr nz, .asm_e8d31
- call Func_e87a8
- call Func_e8f51
- call Func_e8f82
+ call PrinterTransmissionJumptable
+ call GBPrinter_CheckForErrors
+ call GBPrinter_UpdateStatusMessage
call DelayFrame
jr .asm_e8d14
@@ -837,9 +238,7 @@ Func_e8d11:
scf
ret
-
-
-Func_e8d35:: ; e8d35 (3a:4e79)
+PrintPCBox:: ; e8d35 (3a:4e79)
ld a, [wBoxDataStart]
and a
jp z, Func_e8df4
@@ -847,79 +246,79 @@ Func_e8d35:: ; e8d35 (3a:4e79)
push af
xor a
ld [wUpdateSpritesEnabled], a
- ld [hItemCounter], a
- call Func_e8f24
+ ld [hCanceledPrinting], a
+ call Printer_PlayPrinterMusic
ld a, [rIE]
push af
xor a
ld [rIF], a
- ld a, $09
+ ld a, $9
ld [rIE], a
call SaveScreenTilesToBuffer1
xor a
ld [H_AUTOBGTRANSFERENABLED], a
- call Func_e988a
- call Func_e8783
+ call PrintPCBox_DrawPage1
+ call StartTransmission_Send9Rows
ld a, $10
- ld [$cae2], a
- call Func_e8efc
+ ld [wcae2], a
+ call Printer_CopyTileMapToPrinterTileBuffer
call LoadScreenTilesFromBuffer1
call Func_e8dfb
jr c, .asm_e8ddc
xor a
- ld [wUnknownSerialFlag_d49a], a
- ld [wUnknownSerialFlag_d49b], a
+ ld [wPrinterConnectionOpen], a
+ ld [wPrinterOpcode], a
ld c, 12
call DelayFrames
xor a
ld [H_AUTOBGTRANSFERENABLED], a
- call Func_e98ec
- call Func_e8783
- ld a, $00
- ld [$cae2], a
- call Func_e8efc
+ call PrintPCBox_DrawPage2
+ call StartTransmission_Send9Rows
+ ld a, $0
+ ld [wcae2], a
+ call Printer_CopyTileMapToPrinterTileBuffer
call LoadScreenTilesFromBuffer1
call Func_e8dfb
jr c, .asm_e8ddc
xor a
- ld [wUnknownSerialFlag_d49a], a
- ld [wUnknownSerialFlag_d49b], a
+ ld [wPrinterConnectionOpen], a
+ ld [wPrinterOpcode], a
ld c, 12
call DelayFrames
xor a
ld [H_AUTOBGTRANSFERENABLED], a
- call Func_e9907
- call Func_e8783
- ld a, $00
- ld [$cae2], a
- call Func_e8efc
+ call PrintPCBox_DrawPage3
+ call StartTransmission_Send9Rows
+ ld a, $0
+ ld [wcae2], a
+ call Printer_CopyTileMapToPrinterTileBuffer
call LoadScreenTilesFromBuffer1
call Func_e8dfb
jr c, .asm_e8ddc
xor a
- ld [wUnknownSerialFlag_d49a], a
- ld [wUnknownSerialFlag_d49b], a
+ ld [wPrinterConnectionOpen], a
+ ld [wPrinterOpcode], a
ld c, 12
call DelayFrames
xor a
ld [H_AUTOBGTRANSFERENABLED], a
- call Func_e9922
- call Func_e8783
- ld a, $03
- ld [$cae2], a
- call Func_e8efc
+ call PrintPCBox_DrawPage4
+ call StartTransmission_Send9Rows
+ ld a, $3
+ ld [wcae2], a
+ call Printer_CopyTileMapToPrinterTileBuffer
call LoadScreenTilesFromBuffer1
call Func_e8dfb
.asm_e8ddc
xor a
- ld [wUnknownSerialFlag_d49a], a
- ld [wUnknownSerialFlag_d49b], a
+ ld [wPrinterConnectionOpen], a
+ ld [wPrinterOpcode], a
xor a
ld [rIF], a
pop af
ld [rIE], a
- call Func_0f3d
- call Func_e8f3b
+ call ReloadMapAfterPrinter
+ call Printer_PlayMapMusic
pop af
ld [wUpdateSpritesEnabled], a
ret
@@ -930,17 +329,17 @@ Func_e8df4: ; e8df4
ret
Func_e8dfb: ; e8dfb
- call Func_e8f16
+ call Printer_ResetJoypadHRAM
.asm_e8dfe
call JoypadLowSensitivity
- call Func_e8eca
+ call Printer_CheckPressingB
jr c, .asm_e8e1d
- ld a, [wOverworldMap]
+ ld a, [wPrinterSendState]
bit 7, a
jr nz, .asm_e8e1b
- call Func_e87a8
- call Func_e8f51
- call Func_e8f82
+ call PrinterTransmissionJumptable
+ call GBPrinter_CheckForErrors
+ call GBPrinter_UpdateStatusMessage
call DelayFrame
jr .asm_e8dfe
@@ -956,46 +355,46 @@ String_e8e1f: ; e8e1f
TX_FAR _NoPokemonText
db "@"
-Func_e8e24: ; e8e24
+PrintFanClubPortrait: ; e8e24
xor a
- ld [hItemCounter], a
- call Func_e8f24
+ ld [hCanceledPrinting], a
+ call Printer_PlayPrinterMusic
call Func_ea3ea
ld a, [rIE]
push af
xor a
ld [rIF], a
- ld a, $09
+ ld a, $9
ld [rIE], a
- call Func_e8783
+ call StartTransmission_Send9Rows
ld a, $13
- ld [$cae2], a
- call Func_e8efc
- call Func_e8f16
+ ld [wcae2], a
+ call Printer_CopyTileMapToPrinterTileBuffer
+ call Printer_ResetJoypadHRAM
.asm_e8e45
call JoypadLowSensitivity
- call Func_e8eca
+ call Printer_CheckPressingB
jr c, .asm_e8e62
- ld a, [wOverworldMap]
+ ld a, [wPrinterSendState]
bit 7, a
jr nz, .asm_e8e62
- call Func_e87a8
- call Func_e8f51
- call Func_e8f82
+ call PrinterTransmissionJumptable
+ call GBPrinter_CheckForErrors
+ call GBPrinter_UpdateStatusMessage
call DelayFrame
jr .asm_e8e45
.asm_e8e62
xor a
- ld [wUnknownSerialFlag_d49a], a
- ld [wUnknownSerialFlag_d49b], a
- call Func_e8f09
+ ld [wPrinterConnectionOpen], a
+ ld [wPrinterOpcode], a
+ call Printer_CopyTileMapFromPrinterTileBuffer
xor a
ld [rIF], a
pop af
ld [rIE], a
- call Func_0f3d
- call Func_e8f3b
+ call ReloadMapAfterPrinter
+ call Printer_PlayMapMusic
ret
Func_e8e79: ; e8e79 (3a:4e79)
@@ -1008,30 +407,30 @@ Func_e8e79: ; e8e79 (3a:4e79)
push af
xor a
ld [rIF], a
- ld a, $09
+ ld a, $9
ld [rIE], a
- call Func_e8783
+ call StartTransmission_Send9Rows
ld a, $13
- ld [$cae2], a
+ ld [wcae2], a
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a
- call Func_e8efc
+ call Printer_CopyTileMapToPrinterTileBuffer
call Func_ea573
-.asm_e8e9c
- ld a, [wOverworldMap]
+.loop
+ ld a, [wPrinterSendState]
bit 7, a
- jr nz, .asm_e8eae
+ jr nz, .quit
call Func_ea5d1
call Func_ea5b7
call DelayFrame
- jr .asm_e8e9c
+ jr .loop
-.asm_e8eae
+.quit
xor a
- ld [wUnknownSerialFlag_d49a], a
- ld [wUnknownSerialFlag_d49b], a
+ ld [wPrinterConnectionOpen], a
+ ld [wPrinterOpcode], a
ld hl, wOAMBuffer + 32 * 4
- ld bc, $0020
+ ld bc, 8 * 4
xor a
call FillMemory
xor a
@@ -1044,54 +443,54 @@ Func_e8e79: ; e8e79 (3a:4e79)
pop af
ret
-Func_e8eca: ; e8eca (3a:4eca)
+Printer_CheckPressingB: ; e8eca (3a:4eca)
ld a, [hJoyHeld]
and B_BUTTON
- jr nz, .asm_e8ed2
+ jr nz, .quit
and a
ret
-.asm_e8ed2
- ld a, [wOverworldMap]
- cp $0c
- jr nz, .asm_e8ef6
-.asm_e8ed9
- ld a, [wUnknownSerialFlag_d49b]
+.quit
+ ld a, [wPrinterSendState]
+ cp $c
+ jr nz, .already_done
+.wait_current_task
+ ld a, [wPrinterOpcode]
and a
- jr nz, .asm_e8ed9
+ jr nz, .wait_current_task
ld a, $16
- ld [wUnknownSerialFlag_d49b], a
+ ld [wPrinterOpcode], a
ld a, $88
ld [rSB], a
- ld a, $01
+ ld a, $1
ld [rSC], a
ld a, $81
ld [rSC], a
-.asm_e8ef0
- ld a, [wUnknownSerialFlag_d49b]
+.wait_send_cancel
+ ld a, [wPrinterOpcode]
and a
- jr nz, .asm_e8ef0
-.asm_e8ef6
- ld a, $01
- ld [hItemCounter], a
+ jr nz, .wait_send_cancel
+.already_done
+ ld a, $1
+ ld [hCanceledPrinting], a
scf
ret
-Func_e8efc: ; e8efc (3a:4efc)
+Printer_CopyTileMapToPrinterTileBuffer: ; e8efc (3a:4efc)
coord hl, 0, 0
coord de, 0, 0, wPrinterTileBuffer
ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
call CopyData
ret
-Func_e8f09: ; e8f09 (3a:4f09)
+Printer_CopyTileMapFromPrinterTileBuffer: ; e8f09 (3a:4f09)
coord hl, 0, 0, wPrinterTileBuffer
coord de, 0, 0
ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
call CopyData
ret
-Func_e8f16: ; e8f16 (3a:4f16)
+Printer_ResetJoypadHRAM: ; e8f16 (3a:4f16)
xor a
ld [hJoyLast], a
ld [hJoyReleased], a
@@ -1101,8 +500,8 @@ Func_e8f16: ; e8f16 (3a:4f16)
ld [hJoy6], a
ret
-Func_e8f24: ; e8f24 (3a:4f24)
- call Func_e8f42
+Printer_PlayPrinterMusic: ; e8f24 (3a:4f24)
+ call Printer_FadeOutMusicAndWait
ld a, [wAudioROMBank]
ld [wAudioSavedROMBank], a
ld a, BANK(Music_GBPrinter)
@@ -1112,58 +511,59 @@ Func_e8f24: ; e8f24 (3a:4f24)
call PlaySound
ret
-Func_e8f3b: ; e8f3b (3a:4f3b)
- call Func_e8f42
+Printer_PlayMapMusic: ; e8f3b (3a:4f3b)
+ call Printer_FadeOutMusicAndWait
call PlayDefaultMusic
ret
-Func_e8f42: ; e8f42 (3a:4f42)
+Printer_FadeOutMusicAndWait: ; e8f42 (3a:4f42)
ld a, $4
ld [wAudioFadeOutControl], a
call StopAllMusic
-.asm_e8f4a
+.wait_music_stop
ld a, [wAudioFadeOutControl]
and a
- jr nz, .asm_e8f4a
+ jr nz, .wait_music_stop
ret
-Func_e8f51: ; e8f51 (3a:4f51)
- ld a, [$c970]
+GBPrinter_CheckForErrors: ; e8f51 (3a:4f51)
+ ld a, [wPrinterHandshake]
cp $81
- jr z, .asm_e8f62
- ld a, [$c971]
+ jr z, .check_other_errors
+ ld a, [wPrinterStatusFlags]
cp $ff
- jr z, .asm_e8f7c
+ jr z, .error2
xor a
- jr .asm_e8f7e
+ jr .load_status
-.asm_e8f62
- ld a, [$c971]
- and $e0
+.check_other_errors
+ ld a, [wPrinterStatusFlags]
+ and %11100000
ret z
bit 7, a
- jr nz, .asm_e8f78
+ jr nz, .error1
bit 6, a
- jr nz, .asm_e8f74
- ld a, 6
- jr .asm_e8f7e
-
-.asm_e8f74
- ld a, 7
- jr .asm_e8f7e
-
-.asm_e8f78
- ld a, 4
- jr .asm_e8f7e
-
-.asm_e8f7c
- ld a, 5
-.asm_e8f7e
- ld [wcae0], a
+ jr nz, .error4
+ ; error 3
+ ld a, PRINTER_ERROR_3
+ jr .load_status
+
+.error4
+ ld a, PRINTER_ERROR_4
+ jr .load_status
+
+.error1
+ ld a, PRINTER_ERROR_1
+ jr .load_status
+
+.error2
+ ld a, PRINTER_ERROR_2
+.load_status
+ ld [wPrinterStatusIndicator], a
ret
-Func_e8f82:
- ld a, [wcae0]
+GBPrinter_UpdateStatusMessage:
+ ld a, [wPrinterStatusIndicator]
and a
ret z
push af
@@ -1175,7 +575,7 @@ Func_e8f82:
pop af
ld e, a
ld d, $0
- ld hl, Table_e8fca
+ ld hl, .PrinterStatusMessages
add hl, de
add hl, de
ld e, [hl]
@@ -1184,64 +584,64 @@ Func_e8f82:
coord hl, 1, 7
call PlaceString
coord hl, 2, 15
- ld de, String_e8fb8
+ ld de, .PressBToCancel
call PlaceString
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a
xor a
- ld [wcae0], a
+ ld [wPrinterStatusIndicator], a
ret
-String_e8fb8:
+.PressBToCancel:
db "Press B to Cancel@"
-Table_e8fca:
- dw String_e8fdc
- dw String_e8fdd
- dw String_e8ff0
- dw String_e9003
- dw String_e9014
- dw String_e9049
- dw String_e907e
- dw String_e90b3
- dw String_e90e8
-
-String_e8fdc:
+.PrinterStatusMessages:
+ dw .Blank
+ dw .CheckingLink
+ dw .Transmitting
+ dw .Printing
+ dw .Error1
+ dw .Error2
+ dw .Error3
+ dw .Error4
+ dw .WrongDevice
+
+.Blank:
db "@"
-String_e8fdd:
+.CheckingLink:
db ""
next " CHECKING LINK...@"
-String_e8ff0:
+.Transmitting:
db ""
next " TRANSMITTING...@"
-String_e9003:
+.Printing:
db ""
next " PRINTING...@"
-String_e9014:
+.Error1:
db " Printer Error 1"
next ""
next "Check the Game Boy"
next "Printer Manual.@"
-String_e9049:
+.Error2:
db " Printer Error 2"
next ""
next "Check the Game Boy"
next "Printer Manual.@"
-String_e907e:
+.Error3:
db " Printer Error 3"
next ""
next "Check the Game Boy"
next "Printer Manual.@"
-String_e90b3:
+.Error4:
db " Printer Error 4"
next ""
next "Check the Game Boy"
next "Printer Manual.@"
-String_e90e8:
+.WrongDevice:
db "This is not the"
next "Game Boy Printer!@"
-Func_e910a:
+Printer_PrepareSurfingMinigameHighScoreTileMap:
call GBPalWhiteOutWithDelay3
call ClearScreen
ld de, SurfingPikachu2Graphics
@@ -1249,14 +649,14 @@ Func_e910a:
lb bc, BANK(SurfingPikachu2Graphics), (SurfingPikachu2GraphicsEnd - SurfingPikachu2Graphics) / $10
call CopyVideoData
coord hl, 0, 0
- call Func_e91a9
+ call .PlaceRowAlternatingTiles
coord hl, 0, 17
- call Func_e91a9
+ call .PlaceRowAlternatingTiles
coord hl, 0, 0
- call Func_e91b5
+ call .PlaceColumnAlternatingTiles
coord hl, 19, 0
- call Func_e91b5
- ld a, $04
+ call .PlaceColumnAlternatingTiles
+ ld a, $4
coord hl, 0, 0
ld [hl], a
coord hl, 0, 17
@@ -1265,41 +665,41 @@ Func_e910a:
ld [hl], a
coord hl, 19, 17
ld [hl], a
- ld de, Data_e91c4
+ ld de, .Tilemap1
coord hl, 10, 8
lb bc, 3, 8
- call Func_e925d
- ld de, Data_e91dc
+ call Diploma_Surfing_CopyBox
+ ld de, .Tilemap2
coord hl, 2, 11
lb bc, 6, 16
- call Func_e925d
- ld de, String_e923c
+ call Diploma_Surfing_CopyBox
+ ld de, .PikachusBeachString
coord hl, 3, 2
call PlaceString
- ld de, String_e924b
+ ld de, .HiScoreString
coord hl, 9, 4
call PlaceString
- ld de, String_e9256
+ ld de, .PointsString
coord hl, 12, 6
call PlaceString
ld de, wPlayerName
ld hl, wPlayerName
ld bc, 0
-.asm_e9182
+.find_end_of_name
ld a, [hli]
inc c
cp "@"
- jr nz, .asm_e9182
+ jr nz, .find_end_of_name
ld a, 8
sub c
- jr nc, .asm_e918e
+ jr nc, .got_name_length
xor a
-.asm_e918e
+.got_name_length
ld c, a
coord hl, 2, 4
add hl, bc
call PlaceString
- call Func_e926f
+ call CopySurfingMinigameScore
ld b, 8
call RunPaletteCommand
ld a, $1
@@ -1308,35 +708,35 @@ Func_e910a:
call GBPalNormal
ret
-Func_e91a9:
+.PlaceRowAlternatingTiles:
ld c, SCREEN_WIDTH / 2
-.asm_e91ab
- ld [hl], $00
+.row_loop
+ ld [hl], $0
inc hl
- ld [hl], $01
+ ld [hl], $1
inc hl
dec c
- jr nz, .asm_e91ab
+ jr nz, .row_loop
ret
-Func_e91b5:
+.PlaceColumnAlternatingTiles:
ld c, SCREEN_HEIGHT / 2
ld de, SCREEN_WIDTH
-.asm_e91ba
- ld [hl], $02
+.col_loop
+ ld [hl], $2
add hl, de
- ld [hl], $03
+ ld [hl], $3
add hl, de
dec c
- jr nz, .asm_e91ba
+ jr nz, .col_loop
ret
-Data_e91c4:
+
+.Tilemap1:
db $7f, $7f, $10, $11, $12, $13, $14, $15
db $0f, $3c, $3d, $3e, $20, $21, $30, $31
db $4c, $4d, $4e, $50, $34, $1a, $51, $2d
-
-Data_e91dc:
+.Tilemap2:
db $7f, $7f, $7f, $7f, $7f, $7f, $16, $17, $18, $19, $7f, $1b, $1c, $1d, $1e, $1f
db $7f, $7f, $22, $23, $24, $25, $26, $27, $28, $29, $2a, $2b, $2c, $7f, $2e, $2f
db $7f, $7f, $32, $33, $33, $35, $36, $37, $38, $39, $3a, $3b, $7f, $7f, $7f, $3f
@@ -1344,39 +744,38 @@ Data_e91dc:
db $52, $52, $52, $53, $54, $55, $56, $57, $58, $59, $5a, $5b, $5c, $5d, $5d, $5e
db $7f, $7f, $7f, $05, $06, $07, $08, $09, $0a, $0b, $0c, $0d, $0e, $7f, $7f, $7f
-
-String_e923c:
+.PikachusBeachString:
db "Pikachu's Beach@"
-String_e924b:
+.HiScoreString:
db "'s Hi-Score@"
-String_e9256:
+.PointsString:
db "Points@"
-Func_e925d:
-.asm_e925d
+Diploma_Surfing_CopyBox:
+.y
push bc
push hl
-.asm_e925f
+.x
ld a, [de]
inc de
ld [hli], a
dec c
- jr nz, .asm_e925f
+ jr nz, .x
pop hl
ld bc, SCREEN_WIDTH
add hl, bc
pop bc
dec b
- jr nz, .asm_e925d
+ jr nz, .y
ret
-Func_e926f:
- ld de, wd496
+CopySurfingMinigameScore:
+ ld de, wSurfingMinigameHiScore + 1
coord hl, 7, 6
ld a, [de]
- call Func_e927a
+ call .BCDConvertScore
ld a, [de]
-Func_e927a:
+.BCDConvertScore:
ld c, a
swap a
and $f
@@ -1392,80 +791,79 @@ Func_e927a:
SurfingPikachu2Graphics: INCBIN "gfx/surfing_pikachu_2.2bpp"
SurfingPikachu2GraphicsEnd:
-Func_e988a:
+PrintPCBox_DrawPage1:
xor a
ld [wBoxNumString], a
call ClearScreen
- call Func_e99de
+ call PrintPCBox_PlaceHorizontalLines
coord hl, 0, 0
ld bc, 11 * SCREEN_WIDTH
ld a, " "
call FillMemory
- call Func_e99b9
- call Func_e99a7
+ call PrintPCBox_DrawLeftAndRightBorders
+ call PrintPCBox_DrawTopBorder
coord hl, 4, 4
- ld de, String_e98db
+ ld de, .PokemonListString
call PlaceString
coord hl, 7, 6
- ld de, String_e98e8
+ ld de, .BoxString
call PlaceString
coord hl, 11, 6
ld a, [wCurrentBoxNum]
and $7f
cp 9
- jr c, .asm_e98cc
+ jr c, .less_than_9
sub 9
ld [hl], "1"
inc hl
add "0"
- jr .asm_e98ce
+ jr .placed_box_number
-.asm_e98cc
+.less_than_9
add "1"
-.asm_e98ce
+.placed_box_number
ld [hl], a
coord hl, 4, 9
ld de, wBoxSpecies
- ld c, $03
- call Func_e994e
+ ld c, $3
+ call PrintPCBox_PlaceBoxMonInfo
ret
+.PokemonListString: db "POKéMON LIST@"
+.BoxString: db "BOX@"
-String_e98db: db "POKéMON LIST@"
-String_e98e8: db "BOX@"
-
-Func_e98ec:
+PrintPCBox_DrawPage2:
call ClearScreen
- call Func_e99de
- call Func_e99b9
+ call PrintPCBox_PlaceHorizontalLines
+ call PrintPCBox_DrawLeftAndRightBorders
ld a, [wBoxDataStart]
cp 4
ret c
coord hl, 4, 0
ld de, wBoxSpecies + 3
ld c, 6
- call Func_e994e
+ call PrintPCBox_PlaceBoxMonInfo
ret
-Func_e9907:
+PrintPCBox_DrawPage3:
call ClearScreen
- call Func_e99de
- call Func_e99b9
+ call PrintPCBox_PlaceHorizontalLines
+ call PrintPCBox_DrawLeftAndRightBorders
ld a, [wBoxDataStart]
cp 10
ret c
coord hl, 4, 0
ld de, wBoxSpecies + 9
ld c, 6
- call Func_e994e
+ call PrintPCBox_PlaceBoxMonInfo
ret
-Func_e9922:
+PrintPCBox_DrawPage4:
call ClearScreen
- call Func_e99de
- call Func_e99b9
+ call PrintPCBox_PlaceHorizontalLines
+ call PrintPCBox_DrawLeftAndRightBorders
coord hl, 0, 15
- call Func_e99cf
+ call PrintPCBox_DrawBottomBorderAtHL
coord hl, 0, 16
ld bc, 2 * SCREEN_WIDTH
ld a, " "
@@ -1476,18 +874,18 @@ Func_e9922:
coord hl, 4, 0
ld de, wBoxSpecies + 15
ld c, 5
- call Func_e994e
+ call PrintPCBox_PlaceBoxMonInfo
ret
-Func_e994e:
-.asm_e994e
+PrintPCBox_PlaceBoxMonInfo:
+.loop
ld a, c
and a
- jr z, .asm_e99a6
+ jr z, .done
dec c
ld a, [de]
cp $ff
- jr z, .asm_e99a6
+ jr z, .done
ld [wd11e], a
push bc
push hl
@@ -1529,73 +927,73 @@ Func_e994e:
add hl, bc
pop bc
inc de
- jr .asm_e994e
+ jr .loop
-.asm_e99a6
+.done
ret
-Func_e99a7:
+PrintPCBox_DrawTopBorder:
coord hl, 0, 0
ld a, $79
ld [hli], a
ld a, $7a
ld c, SCREEN_WIDTH - 2
-.asm_e99b1
+.loop
ld [hli], a
dec c
- jr nz, .asm_e99b1
+ jr nz, .loop
ld a, $7b
ld [hl], a
ret
-Func_e99b9:
+PrintPCBox_DrawLeftAndRightBorders:
coord hl, 0, 0
ld de, SCREEN_WIDTH - 1
ld c, SCREEN_HEIGHT
-.asm_e99c1
+.loop
ld a, $7c
ld [hl], a
add hl, de
ld a, $7c
ld [hli], a
dec c
- jr nz, .asm_e99c1
+ jr nz, .loop
ret
-Func_e99cc:
+PrintPCBox_DrawBottomBorder:
coord hl, 0, 17
-Func_e99cf:
+PrintPCBox_DrawBottomBorderAtHL:
ld a, $7d
ld [hli], a
ld a, $7a
ld c, SCREEN_WIDTH - 2
-.asm_e99b1
+.loop
ld [hli], a
dec c
- jr nz, .asm_e99b1
+ jr nz, .loop
ld a, $7e
ld [hl], a
ret
-Func_e99de:
+PrintPCBox_PlaceHorizontalLines:
coord hl, 4, 0
ld c, 6
- call Func_e99eb
+ call .PlaceHorizontalLine
coord hl, 6, 1
ld c, 6
-Func_e99eb:
-.asm_e99eb
+.PlaceHorizontalLine:
+.loop
push bc
push hl
- ld de, String_e99fd
+ ld de, .HorizontalLineString
call PlaceString
pop hl
ld bc, 3 * SCREEN_WIDTH
add hl, bc
pop bc
dec c
- jr nz, .asm_e99eb
+ jr nz, .loop
ret
-String_e99fd:
+.HorizontalLineString:
db "----------@"
diff --git a/engine/printer/serial.asm b/engine/printer/serial.asm
new file mode 100755
index 00000000..54d31a15
--- /dev/null
+++ b/engine/printer/serial.asm
@@ -0,0 +1,622 @@
+StartTransmission_Send9Rows: ; e8783 (3a:4783)
+ ld a, 9
+Printer_StartTransmission:
+ push af
+ ld hl, wPrinterData
+ ld bc, wPrinterDataEnd - wPrinterData
+ xor a
+ call Printer_FillMemory
+ xor a
+ ld [rSB], a
+ ld [rSC], a
+ ld [wPrinterOpcode], a
+ ld hl, wPrinterConnectionOpen
+ set 0, [hl]
+ ld a, [wPrinterSettings]
+ ld [wPrinterSettingsTempCopy], a
+ pop af
+ ld [wPrinterQueueLength], a
+ ret
+
+; e87a8
+PrinterTransmissionJumptable: ; e87a8 (3a:47a8)
+ ld a, [wPrinterSendState]
+ ld e, a
+ ld d, 0
+ ld hl, .Jumptable
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+.Jumptable:
+ dw Printer_InitSerial ; 00
+ dw Printer_CheckConnectionStatus ; 01
+ dw Printer_WaitSerial ; 02
+ dw Printer_StartTransmittingTilemap ; 03
+ dw Printer_TransmissionLoop ; 04
+ dw Printer_WaitSerialAndLoopBack2 ; 05
+ dw Printer_EndTilemapTransmission ; 06
+ dw Printer_TransmissionLoop ; 07
+ dw Printer_WaitSerial ; 08
+
+ dw Printer_SignalSendHeader ; 09
+ dw Printer_TransmissionLoop ; 0a
+ dw Printer_WaitSerial ; 0b
+ dw Printer_WaitUntilFinished ; 0c
+ dw Printer_Quit ; 0d
+
+ dw Printer_Next_ ; 0e
+ dw Printer_WaitSerial ; 0f
+ dw Printer_SignalLoopBack ; 10
+ dw Printer_LoopBack ; 11
+ dw Printer_WaitLoopBack ; 12
+ dw Printer_WaitLoopBack_ ; 13
+
+Printer_Next:
+ ld hl, wPrinterSendState
+ inc [hl]
+ ret
+
+Printer_Back:
+ ld hl, wPrinterSendState
+ dec [hl]
+ ret
+
+Printer_Quit:
+ xor a
+ ld [wPrinterStatusFlags], a
+ ld hl, wPrinterSendState
+ set 7, [hl]
+ ret
+
+Printer_Next_:
+ call Printer_Next
+ ret
+
+Printer_LoopBack:
+ ld a, $1
+ ld [wPrinterSendState], a
+ ret
+
+Printer_InitSerial:
+ call ResetPrinterData
+ ld hl, PrinterDataPacket1
+ call CopyPrinterDataHeader
+ xor a
+ ld [wPrinterDataSize], a
+ ld [wPrinterDataSize + 1], a
+ ld a, [wPrinterQueueLength]
+ ld [wPrinterRowIndex], a
+ call Printer_Next
+ call Printer_PrepareToSend
+ ld a, PRINTER_STATUS_CHECKING_LINK
+ ld [wPrinterStatusIndicator], a
+ ret
+
+Printer_StartTransmittingTilemap:
+ call ResetPrinterData
+ ld hl, wPrinterRowIndex
+ ld a, [hl]
+ and a
+ jr z, Printer_EndTilemapTransmission
+ ld hl, PrinterDataPacket3
+ call CopyPrinterDataHeader
+ call Printer_Convert2RowsTo2bpp
+ ld a, (wPrinterSendDataSourceEnd - wPrinterSendDataSource) % $100
+ ld [wPrinterDataSize], a
+ ld a, (wPrinterSendDataSourceEnd - wPrinterSendDataSource) / $100
+ ld [wPrinterDataSize + 1], a
+ call ComputePrinterChecksum
+ call Printer_Next
+ call Printer_PrepareToSend
+ ld a, PRINTER_STATUS_TRANSMITTING
+ ld [wPrinterStatusIndicator], a
+ ret
+
+Printer_EndTilemapTransmission:
+ ld a, $6
+ ld [wPrinterSendState], a
+ ld hl, PrinterDataPacket4
+ call CopyPrinterDataHeader
+ xor a
+ ld [wPrinterDataSize], a
+ ld [wPrinterDataSize + 1], a
+ call Printer_Next
+ call Printer_PrepareToSend
+ ret
+
+Printer_SignalSendHeader:
+ call ResetPrinterData
+ ld hl, PrinterDataPacket2
+ call CopyPrinterDataHeader
+ call Printer_StageHeaderForSend
+ ld a, $4
+ ld [wPrinterDataSize], a
+ ld a, $0
+ ld [wPrinterDataSize + 1], a
+ call ComputePrinterChecksum
+ call Printer_Next
+ call Printer_PrepareToSend
+ ld a, PRINTER_STATUS_PRINTING
+ ld [wPrinterStatusIndicator], a
+ ret
+
+Printer_SignalLoopBack:
+ call ResetPrinterData
+ ld hl, PrinterDataPacket1
+ call CopyPrinterDataHeader
+ xor a
+ ld [wPrinterDataSize], a
+ ld [wPrinterDataSize + 1], a
+ ld a, [wPrinterQueueLength]
+ ld [wPrinterRowIndex], a
+ call Printer_Next
+ call Printer_PrepareToSend
+ ret
+
+Printer_WaitSerial:
+ ld hl, wPrinterSerialFrameDelay
+ inc [hl]
+ ld a, [hl]
+ cp $6
+ ret c
+ xor a
+ ld [hl], a
+ call Printer_Next
+ ret
+
+Printer_WaitSerialAndLoopBack2:
+ ld hl, wPrinterSerialFrameDelay
+ inc [hl]
+ ld a, [hl]
+ cp $6
+ ret c
+ xor a
+ ld [hl], a
+ ld hl, wPrinterRowIndex
+ dec [hl]
+ call Printer_Back
+ call Printer_Back
+ ret
+
+Printer_CheckConnectionStatus:
+ ld a, [wPrinterOpcode]
+ and a
+ ret nz
+ ld a, [wPrinterHandshake]
+ cp $ff
+ jr nz, .asm_e88dc
+ ld a, [wPrinterStatusFlags]
+ cp $ff
+ jr z, .asm_e88f8
+.asm_e88dc
+ ld a, [wPrinterHandshake]
+ cp $81
+ jr nz, .asm_e88f8
+ ld a, [wPrinterStatusFlags]
+ cp $0
+ jr nz, .asm_e88f8
+ ld hl, wPrinterConnectionOpen
+ set 1, [hl]
+ ld a, $5
+ ld [wHandshakeFrameDelay], a
+ call Printer_Next
+ ret
+
+.asm_e88f8
+ ld a, $ff
+ ld [wPrinterHandshake], a
+ ld [wPrinterStatusFlags], a
+ ld a, $e
+ ld [wPrinterSendState], a
+ ret
+
+Printer_TransmissionLoop:
+ ld a, [wPrinterOpcode]
+ and a
+ ret nz
+ ld a, [wPrinterStatusFlags]
+ and $f0
+ jr nz, .asm_e8921
+ ld a, [wPrinterStatusFlags]
+ and $1
+ jr nz, .asm_e891d
+ call Printer_Next
+ ret
+
+.asm_e891d
+ call Printer_Back
+ ret
+
+.asm_e8921
+ ld a, $12
+ ld [wPrinterSendState], a
+ ret
+
+Printer_WaitUntilFinished:
+ ld a, [wPrinterOpcode]
+ and a
+ ret nz
+ ld a, [wPrinterStatusFlags]
+ and $f3
+ ret nz
+ call Printer_Next
+ ret
+
+Printer_WaitLoopBack:
+ call Printer_Next
+Printer_WaitLoopBack_:
+ ld a, [wPrinterOpcode]
+ and a
+ ret nz
+ ld a, [wPrinterStatusFlags]
+ and $f0
+ ret nz
+ xor a
+ ld [wPrinterSendState], a
+ ret
+
+Printer_PrepareToSend:
+.wait_printer_operation
+ ld a, [wPrinterOpcode]
+ and a
+ jr nz, .wait_printer_operation
+ xor a
+ ld [wPrinterSendByteOffset], a
+ ld [wPrinterSendByteOffset + 1], a
+ ld a, $1
+ ld [wPrinterOpcode], a
+ ld a, $88
+ ld [rSB], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ ret
+
+CopyPrinterDataHeader:
+ ld a, [hli]
+ ld [wPrinterDataHeader], a
+ ld a, [hli]
+ ld [wPrinterDataHeader + 1], a
+ ld a, [hli]
+ ld [wPrinterDataHeader + 2], a
+ ld a, [hli]
+ ld [wPrinterDataHeader + 3], a
+ ld a, [hli]
+ ld [wPrinterChecksum], a
+ ld a, [hl]
+ ld [wPrinterChecksum + 1], a
+ ret
+
+ResetPrinterData:
+ xor a
+ ld hl, wPrinterDataHeader
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ld hl, wPrinterChecksum
+ ld [hli], a
+ ld [hl], a
+ xor a
+ ld [wPrinterDataSize], a
+ ld [wPrinterDataSize + 1], a
+ ld hl, wPrinterSendDataSource
+ ld bc, wPrinterSendDataSourceEnd - wPrinterSendDataSource
+ call Printer_FillMemory
+ ret
+
+ComputePrinterChecksum:
+ ld hl, $0
+ ld bc, $4
+ ld de, wPrinterDataHeader
+ call .AddToChecksum
+ ld a, [wPrinterDataSize]
+ ld c, a
+ ld a, [wPrinterDataSize + 1]
+ ld b, a
+ ld de, wPrinterSendDataSource
+ call .AddToChecksum
+ ld a, l
+ ld [wPrinterChecksum], a
+ ld a, h
+ ld [wPrinterChecksum + 1], a
+ ret
+
+.AddToChecksum:
+.loop
+ ld a, [de]
+ inc de
+ add l
+ jr nc, .no_carry
+ inc h
+.no_carry
+ ld l, a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+ ret
+
+Printer_StageHeaderForSend:
+ ld a, $1
+ ld [wPrinterSendDataSource], a
+ ld a, [wcae2]
+ ld [wPrinterSendDataSource + 1], a
+ ld a, %11100100
+ ld [wPrinterSendDataSource + 2], a
+ ld a, [wPrinterSettingsTempCopy]
+ ld [wPrinterSendDataSource + 3], a
+ ret
+
+Printer_Convert2RowsTo2bpp:
+ ld a, [wPrinterRowIndex]
+ ld b, a
+ ld a, [wPrinterQueueLength]
+ sub b
+ ld hl, wPrinterTileBuffer
+ ld de, 2 * SCREEN_WIDTH
+.get_row
+ and a
+ jr z, .got_row
+ add hl, de
+ dec a
+ jr .get_row
+
+.got_row
+ ld e, l
+ ld d, h
+ ld hl, wPrinterSendDataSource
+ ld c, 2 * SCREEN_WIDTH
+.loop
+ ld a, [de]
+ inc de
+ push bc
+ push de
+ push hl
+ swap a
+ ld d, a
+ and $f0
+ ld e, a
+ ld a, d
+ and $f
+ ld d, a
+ and $8
+ ld a, d
+ jr nz, .vchars1
+ or $90
+ jr .got_addr
+
+.vchars1
+ or $80
+.got_addr
+ ld d, a
+ lb bc, BANK(Printer_Convert2RowsTo2bpp), 1
+ call CopyVideoData
+ pop hl
+ ld de, $10
+ add hl, de
+ pop de
+ pop bc
+ dec c
+ jr nz, .loop
+ ret
+
+Printer_FillMemory: ; e8a2e (3a:4a2e)
+ push de
+ ld e, a
+.loop
+ ld [hl], e
+ inc hl
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+ ld a, e
+ pop de
+ ret
+
+PrinterDataPacket1:
+ db 1, 0, $00, 0
+ dw 1
+PrinterDataPacket2:
+ db 2, 0, $04, 0
+ dw 0
+PrinterDataPacket3:
+ db 4, 0, $80, 2
+ dw 0
+PrinterDataPacket4:
+ db 4, 0, $00, 0
+ dw 4
+PrinterDataPacket5: ; unused
+ db 8, 0, $00, 0
+ dw 8
+PrinterDataPacket6: ; unused
+ db 15, 0, $00, 0
+ dw 15
+
+PrinterSerial_: ; e8a5e (3a:4a5e)
+ ld a, [wPrinterOpcode]
+ ld e, a
+ ld d, 0
+ ld hl, .Jumptable
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+.Jumptable:
+ dw .Nop
+
+ dw .SignalTransmissionStart
+ dw .SendHeaderByte1
+ dw .SendHeaderByte2
+ dw .SendHeaderByte3
+ dw .SendHeaderByte4
+ dw .DataByte
+ dw .SendChecksumLo
+ dw .SendChecksumHi
+ dw .SignalTransmissionEnd
+ dw .Receive1
+ dw .Receive2
+
+ dw .SignalTransmissionStart
+ dw .Send_0F
+ dw .Send_00
+ dw .Send_00
+ dw .Send_00
+ dw .Send_0F
+ dw .Send_00
+ dw .SignalTransmissionEnd
+ dw .Receive1
+ dw .Receive2_
+
+ dw .SignalTransmissionStart
+ dw .SignalQuit
+ dw .Send_00
+ dw .Send_00
+ dw .Send_00
+ dw .SignalQuit
+ dw .Send_00
+ dw .SignalTransmissionEnd
+ dw .Receive1
+ dw .Receive2
+
+.NextInstruction:
+ ld hl, wPrinterOpcode
+ inc [hl]
+ ret
+
+.Nop:
+ ret
+
+.SignalTransmissionStart:
+ ld a, $33
+ call .SendByte
+ call .NextInstruction
+ ret
+
+.SendHeaderByte1:
+ ld a, [wPrinterDataHeader]
+ call .SendByte
+ call .NextInstruction
+ ret
+
+.SendHeaderByte2:
+ ld a, [wPrinterDataHeader + 1]
+ call .SendByte
+ call .NextInstruction
+ ret
+
+.SendHeaderByte3:
+ ld a, [wPrinterDataHeader + 2]
+ call .SendByte
+ call .NextInstruction
+ ret
+
+.SendHeaderByte4:
+ ld a, [wPrinterDataHeader + 3]
+ call .SendByte
+ call .NextInstruction
+ ret
+
+.DataByte:
+ ld hl, wPrinterDataSize
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld a, e
+ or d
+ jr z, .sent_last_byte
+ dec de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ ld a, [wPrinterSendByteOffset]
+ ld e, a
+ ld a, [wPrinterSendByteOffset + 1]
+ ld d, a
+ ld hl, wPrinterSendDataSource
+ add hl, de
+ inc de
+ ld a, e
+ ld [wPrinterSendByteOffset], a
+ ld a, d
+ ld [wPrinterSendByteOffset + 1], a
+ ld a, [hl]
+ call .SendByte
+ ret
+
+.sent_last_byte
+ call .NextInstruction
+.SendChecksumLo:
+ ld a, [wPrinterChecksum]
+ call .SendByte
+ call .NextInstruction
+ ret
+
+.SendChecksumHi:
+ ld a, [wPrinterChecksum + 1]
+ call .SendByte
+ call .NextInstruction
+ ret
+
+.SignalTransmissionEnd:
+ ld a, $0
+ call .SendByte
+ call .NextInstruction
+ ret
+
+.Receive1:
+ ld a, [rSB]
+ ld [wPrinterHandshake], a
+ ld a, $0
+ call .SendByte
+ call .NextInstruction
+ ret
+
+.Receive2:
+ ld a, [rSB]
+ ld [wPrinterStatusFlags], a
+ xor a
+ ld [wPrinterOpcode], a
+ ret
+
+.Send_0F:
+ ld a, $f
+ call .SendByte
+ call .NextInstruction
+ ret
+
+.Send_00:
+ ld a, $0
+ call .SendByte
+ call .NextInstruction
+ ret
+
+.SignalQuit:
+ ld a, $8
+ call .SendByte
+ call .NextInstruction
+ ret
+
+.SendByte:
+ ld [rSB], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ ret
+
+.Receive2_:
+ ld a, [rSB]
+ ld [wPrinterStatusFlags], a
+ xor a
+ ld [wPrinterOpcode], a
+ ret
diff --git a/engine/surfing_minigame.asm b/engine/surfing_minigame.asm
new file mode 100755
index 00000000..f70e8119
--- /dev/null
+++ b/engine/surfing_minigame.asm
@@ -0,0 +1,2826 @@
+SurfingPikachuMinigame:
+ call SurfingPikachuMinigame_BlankPals
+ call DelayFrame
+ call DelayFrame
+ call DelayFrame
+ ld a, [hTilesetType]
+ push af
+ xor a
+ ld [hTilesetType], a
+ ld a, [wUpdateSpritesEnabled]
+ push af
+ ld a, $ff
+ ld [wUpdateSpritesEnabled], a
+ ld a, [rIE]
+ push af
+ xor a
+ ld [rIF], a
+ ld a, $f
+ ld [rIE], a
+ ld a, $8
+ ld [rSTAT], a
+ ld a, [H_AUTOBGTRANSFERDEST + 1]
+ push af
+ ld a, $98
+ ld [H_AUTOBGTRANSFERDEST + 1], a
+ call Func_f8fb3
+ call Func_f807a
+ xor a
+ ld [rBGP], a
+ ld [rOBP0], a
+ ld [rOBP1], a
+ call UpdateGBCPal_BGP
+ call UpdateGBCPal_OBP0
+ call UpdateGBCPal_OBP1
+ call ClearObjectAnimationBuffers
+ call ClearSprites
+ xor a
+ ld [hLCDCPointer], a
+ ld [hSCX], a
+ ld [hSCY], a
+ ld a, $90
+ ld [hWY], a
+ call DelayFrame
+ pop af
+ ld [H_AUTOBGTRANSFERDEST + 1], a
+ xor a
+ ld [rIF], a
+ pop af
+ ld [rIE], a
+ xor a
+ ld [rSTAT], a
+ call RunDefaultPaletteCommand
+ call ReloadMapAfterSurfingMinigame
+ call PlayDefaultMusic
+ call GBPalNormal
+ pop af
+ ld [wUpdateSpritesEnabled], a
+ pop af
+ ld [hTilesetType], a
+ ret
+
+Func_f807a:
+ call Func_f8116
+ call DelayFrame
+ ld b, $e
+ call RunPaletteCommand
+.loop
+ ld a, [wc5d1]
+ bit 7, a
+ ret nz
+ call Func_f923f
+ call Func_f80ac
+ ret nz
+ call Func_f8282
+ ld a, $3c
+ ld [wCurrentAnimatedObjectOAMBufferOffset], a
+ call RunObjectAnimations
+ call Func_f8848
+ call Func_f80a8
+ call Func_f80c4
+ jr .loop
+
+Func_f80a8:
+ call DelayFrame
+ ret
+
+Func_f80ac:
+ ld hl, wd492
+ bit 1, [hl]
+ ret z
+ ld a, [hJoyPressed]
+ and $4
+ ret
+
+Func_f80b7:
+ ld a, [hJoyPressed]
+ and $8
+ ret z
+ ld hl, wc5e2
+ ld a, [hl]
+ xor $1
+ ld [hl], a
+ ret
+
+Func_f80c4:
+ ld a, [wc634]
+ and a
+ ret z
+ ld hl, wChannelNoteDelayCounters
+ ld a, $1
+ cp [hl]
+ ret nz
+ inc hl
+ cp [hl]
+ ret nz
+ inc hl
+ cp [hl]
+ ret nz
+ ld a, [wc5e3]
+ ld e, a
+ ld a, [wc5e3 + 1]
+ and $3
+ ld d, a
+ sla e
+ rl d
+ ld e, d
+ ld d, $0
+ ld hl, Unkn_f80f5
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld [wMusicTempo + 1], a
+ ld a, [hl]
+ ld [wMusicTempo], a
+ ret
+
+Unkn_f80f5:
+ dw $75
+ dw $6d
+ dw $65
+ dw $5d
+ dw $55
+
+Func_f80ff:
+ ld hl, wChannelNoteDelayCounters
+ ld a, $1
+ cp [hl]
+ ret nz
+ inc hl
+ cp [hl]
+ ret nz
+ inc hl
+ cp [hl]
+ ret nz
+ ld a, $75
+ ld [wMusicTempo + 1], a
+ xor a
+ ld [wMusicTempo], a
+ ret
+
+Func_f8116:
+ call Func_f9279
+ call ClearSprites
+ call DisableLCD
+ ld hl, wSerialEnemyMonsPatchList
+ ld bc, $67
+ xor a
+ call FillMemory
+ ld hl, wc700
+ ld bc, $200
+ xor a
+ call FillMemory
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call ClearObjectAnimationBuffers
+
+ ld hl, SurfingPikachu1Graphics
+ ld de, $9000
+ ld bc, $500
+ ld a, BANK(SurfingPikachu1Graphics)
+ call FarCopyData
+
+ ld hl, SurfingPikachu1Graphics + $410
+ ld de, $8000
+ ld bc, $1000
+ ld a, BANK(SurfingPikachu1Graphics)
+ call FarCopyData
+
+ ld a, Unkn_f93d3 % $100
+ ld [wAnimatedObjectSpawnStateDataPointer], a
+ ld a, Unkn_f93d3 / $100
+ ld [wAnimatedObjectSpawnStateDataPointer + 1], a
+ ld a, Jumptable_f93fa % $100
+ ld [wAnimatedObjectJumptablePointer], a
+ ld a, Jumptable_f93fa / $100
+ ld [wAnimatedObjectJumptablePointer + 1], a
+ ld a, Unkn_f9507 % $100
+ ld [wAnimatedObjectOAMDataPointer], a
+ ld a, Unkn_f9507 / $100
+ ld [wAnimatedObjectOAMDataPointer + 1], a
+ ld a, Unkn_f9405 % $100
+ ld [wAnimatedObjectFramesDataPointer], a
+ ld a, Unkn_f9405 / $100
+ ld [wAnimatedObjectFramesDataPointer + 1], a
+ ld hl, vBGMap0
+ ld bc, $800
+ ld a, $0
+ call FillMemory
+ ld hl, $98c0
+ ld bc, $180
+ ld a, $b
+ call FillMemory
+ ld a, $1
+ lb de, $74, $58
+ call SpawnAnimatedObject
+ ld a, $74
+ ld [wc5ea], a
+ call Func_f9223
+ xor a
+ ld [hSCX], a
+ ld [hSCY], a
+ ld a, $7e
+ ld [hWY], a
+ ld a, $42
+ ld [hLCDCPointer], a
+ ld a, $40
+ ld [wc5e3], a
+ xor a
+ ld [wc5e3 + 1], a
+ xor a
+ ld [wc5d6], a
+ ld a, $60
+ ld [wc5d7], a
+ ld hl, wc61a
+ ld bc, $14
+ ld a, $74
+ call FillMemory
+ call Func_f81ff
+ call Func_f8256
+ ld a, $e3
+ ld [rLCDC], a
+ call Func_f81e9
+ ld a, $e4
+ ld [rOBP0], a
+ ld a, $e0
+ ld [rOBP1], a
+ call UpdateGBCPal_OBP0
+ call UpdateGBCPal_OBP1
+ ret
+
+Func_f81e9:
+ ld a, [wOnSGB]
+ and a
+ jr nz, .asm_f81f7
+ ld a, $d0
+ ld [rBGP], a
+ call UpdateGBCPal_BGP
+ ret
+
+.asm_f81f7
+ ld a, $e4
+ ld [rBGP], a
+ call UpdateGBCPal_BGP
+ ret
+
+Func_f81ff:
+ ld hl, wSpriteDataEnd
+ ld de, Unkn_f8249
+ ld b, $97
+ ld c, $80
+ ld a, $4
+ call Func_f8233
+ ld de, Unkn_f8248
+ ld b, $96
+ ld c, $50
+ ld a, $1
+ call Func_f8233
+ ld de, Unkn_f824d
+ ld b, $14
+ ld c, $20
+ ld a, $5
+ call Func_f8233
+ ld de, Unkn_f8252
+ ld b, $20
+ ld c, $80
+ ld a, $4
+ call Func_f8233
+ ret
+
+Func_f8233:
+.asm_f8233
+ push af
+ ld [hl], b
+ inc hl
+ ld [hl], c
+ inc hl
+ ld a, [de]
+ ld [hl], a
+ inc hl
+ ld [hl], $0
+ inc hl
+ ld a, c
+ add $8
+ ld c, a
+ inc de
+ pop af
+ dec a
+ jr nz, .asm_f8233
+ ret
+
+Unkn_f8248:
+ db $fe
+
+Unkn_f8249:
+ db $d0
+ db $d0
+ db $d0
+ db $d0
+
+Unkn_f824d:
+ db $ec
+ db $ed
+ db $ed
+ db $ee
+ db $ef
+
+Unkn_f8252:
+ db $ec
+ db $ed
+ db $ee
+ db $ef
+
+Func_f8256:
+ ld de, $9c21
+ ld hl, Unkn_f8279
+ ld c, $9
+.asm_f825e
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .asm_f825e
+ ld hl, $9c01
+ ld [hl], $15
+ ld hl, $9c02
+ ld [hl], $16
+ ld hl, $9c2c
+ ld [hl], $1b
+ ld hl, $9c2d
+ ld [hl], $1c
+ ret
+
+Unkn_f8279:
+ db $17
+ db $18
+ db $19
+ db $19
+ db $19
+ db $19
+ db $19
+ db $19
+ db $19
+
+Func_f8282:
+ ld a, [wc5d1]
+ ld e, a
+ ld d, $0
+ ld hl, Jumptable_f8291
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+Jumptable_f8291:
+ dw Func_f82ab
+ dw Func_f82bd
+ dw Func_f8324
+ dw Func_f835c
+ dw Func_f838c
+ dw Func_f8399
+ dw Func_f83aa
+ dw Func_f83bb
+ dw Func_f83cc
+ dw Func_f83e3
+ dw Func_f8406
+ dw Func_f840f
+ dw Func_f841d
+
+Func_f82ab:
+ ld a, $2
+ lb de, $48, $e0
+ call SpawnAnimatedObject
+ ld hl, wc5d1
+ inc [hl]
+ ld a, $1
+ ld [wc634], a
+ ret
+
+Func_f82bd:
+ ld a, [wc5e5]
+ cp $18
+ jr nc, .asm_f82e8
+ ld hl, wc5d6
+ ld a, [hli]
+ or [hl]
+ and a
+ jr z, .asm_f82f6
+ call Random
+ ld [wc5d5], a
+ call Func_f9210
+ call Func_f88ae
+ call Func_f886b
+ call Func_f8cb0
+ call Func_f844c
+ call Func_f88e4
+ call Func_f88fd
+ ret
+
+.asm_f82e8
+ ld hl, wc5d1
+ inc [hl]
+ xor a
+ ld [wc634], a
+ ld a, $c0
+ ld [wc632], a
+ ret
+
+.asm_f82f6
+ ld a, $1
+Func_f82f8:
+ ld [wc630], a
+ ld a, $c
+ ld [wc5d1], a
+Func_f8300:
+ ld a, $80
+ ld [wc631], a
+ ld a, $b
+ lb de, $88, $58
+ call SpawnAnimatedObject
+ ld hl, $7
+ add hl, bc
+ ld [hl], $80
+ ld hl, $b
+ add hl, bc
+ ld [hl], $80
+ ld hl, $c
+ add hl, bc
+ ld [hl], $30
+ xor a
+ ld [wc634], a
+ ret
+
+Func_f8324:
+ call Func_f8440
+ jr c, .asm_f833d
+ xor a
+ ld [wc5d5], a
+ call Func_f9210
+ call Func_f88ae
+ call Func_f886b
+ call Func_f8c97
+ call Func_f80ff
+ ret
+
+.asm_f833d
+ ld hl, wc5d1
+ inc [hl]
+ ld a, $90
+ ld [hSCX], a
+ ld a, $72
+ ld [wc5d3], a
+ ld a, $4
+ ld [wc5d2], a
+ xor a
+ ld [hLCDCPointer], a
+ ld [wc617], a
+ ld [wc618], a
+ ld [wc619], a
+ ret
+
+Func_f835c:
+ ld a, [hSCX]
+ and a
+ jr z, .asm_f837b
+ call Func_f9210
+ call Func_f88ae
+ call Func_f886b
+ ld a, [hSCX]
+ dec a
+ dec a
+ dec a
+ dec a
+ ld [hSCX], a
+ ld a, $e0
+ ld [wc62e], a
+ call Func_f8cc7
+ ret
+
+.asm_f837b
+ xor a
+ ld [wc5e3], a
+ ld [wc5e3 + 1], a
+ ld hl, wc5d1
+ inc [hl]
+ ld a, $5
+ ld [wc5d2], a
+ ret
+
+Func_f838c:
+ call Func_f891e
+ ld a, $20
+ ld [wc632], a
+ ld hl, wc5d1
+ inc [hl]
+ ret
+
+Func_f8399:
+ call Func_f8440
+ ret nc
+ call Func_f8a92
+ ld a, $40
+ ld [wc632], a
+ ld hl, wc5d1
+ inc [hl]
+ ret
+
+Func_f83aa:
+ call Func_f8440
+ ret nc
+ call Func_f8ae4
+ ld a, $40
+ ld [wc632], a
+ ld hl, wc5d1
+ inc [hl]
+ ret
+
+Func_f83bb:
+ call Func_f8440
+ ret nc
+ call Func_f8b7a
+ ld a, $40
+ ld [wc632], a
+ ld hl, wc5d1
+ inc [hl]
+ ret
+
+Func_f83cc:
+ call Func_f8440
+ ret nc
+ call Func_f8aa9
+ push af
+ call Func_f8b5d
+ pop af
+ ret nc
+ ld a, $40
+ ld [wc632], a
+ ld hl, wc5d1
+ inc [hl]
+ ret
+
+Func_f83e3:
+ call Func_f8440
+ ret nc
+ call Func_f8afb
+ push af
+ call Func_f8b5d
+ pop af
+ ret nc
+ ld a, $80
+ ld [wc632], a
+ ld hl, wc5d1
+ inc [hl]
+ call Func_f8b92
+ ret nc
+ call Func_f8a7c
+Func_f83ff:
+ ld a, $6
+ ld [wc5d2], a
+ ret
+
+Func_f8406:
+ call Func_f8440
+Func_f8408:
+ ret nc
+ ld hl, wc5d1
+ inc [hl]
+ ret
+
+Func_f840f:
+ call Func_f9210
+ ld a, [hJoyPressed]
+ and $1
+ ret z
+ ld hl, wc5d1
+ set 7, [hl]
+ ret
+
+Func_f841d:
+ call Func_f9210
+ call Func_f88ae
+ call Func_f886b
+ call Func_f8cb0
+ call Func_f80ff
+ ld hl, wc631
+ ld a, [hl]
+ and a
+ jr z, .asm_f8435
+ dec [hl]
+ ret
+
+.asm_f8435
+ ld a, [hJoyPressed]
+ and $1
+ ret z
+ ld hl, wc5d1
+ set 7, [hl]
+ ret
+
+Func_f8440:
+ ld hl, wc632
+ ld a, [hl]
+ and a
+ jr z, .asm_f844a
+ dec [hl]
+ and a
+ ret
+
+.asm_f844a
+ scf
+ ret
+
+Func_f844c:
+ ld a, [wc5e6]
+ ld h, a
+ ld a, [wc5e7]
+ ld l, a
+ ld a, [wc5e3]
+ ld e, a
+ ld a, [wc5e3 + 1]
+ ld d, a
+ add hl, de
+ ld a, h
+ ld [wc5e6], a
+ ld a, l
+ ld [wc5e7], a
+ ret nc
+ ld hl, wc5e5
+ inc [hl]
+ ld hl, wOAMBuffer + 4 * 4 + 1
+ dec [hl]
+ dec [hl]
+ ret
+
+Func_f8470
+ ld a, [wc5d2]
+ ld e, a
+ ld d, $0
+ ld hl, Jumptable_f847f
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+Jumptable_f847f:
+ dw Func_f848d
+ dw Func_f84e2
+ dw Func_f8516
+ dw Func_f8545
+ dw Func_f8561
+ dw Func_f856d
+ dw Func_f8579
+
+Func_f848d:
+ ld a, [wc630]
+ and a
+ jr nz, .asm_f84d2
+ call Func_f87b5
+ ld a, [wc5ea]
+ ld hl, $5
+ add hl, bc
+ ld [hl], a
+ call Func_f871e
+ jr c, .asm_f84aa
+ call Func_f8742
+ call Func_f86b8
+ ret
+
+.asm_f84aa
+ call Func_f8742
+ ld a, $1
+ ld [wc5d2], a
+ xor a
+ ld hl, $c
+ add hl, bc
+ ld [hl], a
+ ld hl, $d
+ add hl, bc
+ ld [hl], a
+ ld hl, $e
+ add hl, bc
+ ld [hl], a
+ ld [wc5d9], a
+ ld [wc62f], a
+ xor a
+ ld [wChannelSoundIDs + CH7], a
+ ld a, SFX_UNKNOWN_801B3_4
+ call PlaySound
+ ret
+
+.asm_f84d2
+ xor a
+ ld [wc5e3], a
+ ld [wc5e3 + 1], a
+ ld a, $4
+ ld [wc5d2], a
+ call Func_f8742
+ ret
+
+Func_f84e2:
+ call Func_f8598
+ call Func_f928c
+ ret nc
+ call Func_f8606
+ jr c, .asm_f84fd
+ call Func_f8bed
+ ld hl, $c
+ add hl, bc
+ ld [hl], $0
+ ld a, $2
+ ld [wc5d2], a
+ ret
+
+.asm_f84fd
+ ld a, $3
+ ld [wc5d2], a
+ ld a, $60
+ ld [wc5e1], a
+ ld a, $10
+ call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters
+ xor a
+ ld [wChannelSoundIDs + CH7], a
+ ld a, SFX_UNKNOWN_801B9_4
+ call PlaySound
+ ret
+
+Func_f8516:
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ cp $20
+ jr nc, .asm_f8539
+ inc [hl]
+ inc [hl]
+ inc [hl]
+ inc [hl]
+ ld d, $4
+ call Func_f9362
+ ld hl, $7
+ add hl, bc
+ ld [hl], a
+ call Func_f87b5
+ ld a, [wc5ea]
+ ld hl, $5
+ add hl, bc
+ ld [hl], a
+ ret
+
+.asm_f8539
+ ld hl, $7
+ add hl, bc
+ ld [hl], $0
+ ld a, $0
+ ld [wc5d2], a
+ ret
+
+Func_f8545:
+ ld hl, wc5e1
+ ld a, [hl]
+ and a
+ jr z, .asm_f8556
+ dec [hl]
+ ld a, [wc5ea]
+ ld hl, $5
+ add hl, bc
+ ld [hl], a
+ ret
+
+.asm_f8556
+ ld a, $0
+ ld [wc5d2], a
+ ld a, $4
+ call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters
+ ret
+
+Func_f8561:
+ ld a, [wc5ea]
+ ld hl, $5
+ add hl, bc
+ ld [hl], a
+ call Func_f8742
+ ret
+
+Func_f856d:
+ ld a, $f
+ call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters
+ ld hl, $c
+ add hl, bc
+ ld [hl], $0
+ ret
+
+Func_f8579:
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ inc [hl]
+ and $3f
+ cp $20
+ jr c, .asm_f8591
+ ld d, $10
+ call Func_f9362
+ ld hl, $7
+ add hl, bc
+ ld [hl], a
+ ret
+
+.asm_f8591
+ ld hl, $7
+ add hl, bc
+ ld [hl], $0
+ ret
+
+Func_f8598:
+ ld de, hJoy5
+ ld a, [de]
+ and $20
+ jr nz, .asm_f85a6
+ ld a, [de]
+ and $10
+ jr nz, .asm_f85cc
+ ret
+
+.asm_f85a6
+ ld hl, $e
+ add hl, bc
+ ld [hl], $0
+ ld hl, $d
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ cp $b
+ jr c, .asm_f85be
+ call Func_f85f2
+ ld hl, wc62f
+ set 0, [hl]
+.asm_f85be
+ ld hl, $1
+ add hl, bc
+ ld a, [hl]
+ cp $e
+ jr nc, .asm_f85c9
+ inc [hl]
+ ret
+
+.asm_f85c9
+ ld [hl], $1
+ ret
+
+.asm_f85cc
+ ld hl, $d
+ add hl, bc
+ ld [hl], $0
+ ld hl, $e
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ cp $d
+ jr c, .asm_f85e4
+ call Func_f85f2
+ ld hl, wc62f
+ set 1, [hl]
+.asm_f85e4
+ ld hl, $1
+ add hl, bc
+ ld a, [hl]
+ cp $1
+ jr z, .asm_f85ef
+ dec [hl]
+ ret
+
+.asm_f85ef
+ ld [hl], $e
+ ret
+
+Func_f85f2:
+ call Func_f8bdf
+ xor a
+ ld hl, $d
+ add hl, bc
+ ld [hl], a
+ ld hl, $e
+ add hl, bc
+ ld [hl], a
+ ld a, SFX_UNKNOWN_801B6_4
+ call PlaySound
+ ret
+
+Func_f8606:
+ ld hl, $1
+ add hl, bc
+ ld a, [wc5ef]
+ cp $6
+ jr z, .asm_f863d
+ cp $14
+ jr z, .asm_f867b
+ cp $12
+ jr z, .asm_f867b
+ cp $7
+ jr z, .asm_f865c
+ ld a, [hl]
+ cp $1
+ jp z, .asm_f86ad
+ cp $2
+ jr z, .asm_f869a
+ cp $3
+ jr z, .asm_f869f
+ cp $4
+ jr z, .asm_f86a2
+ cp $5
+ jr z, .asm_f869f
+ cp $6
+ jr z, .asm_f869a
+ cp $7
+ jr z, .asm_f86ad
+ jr .asm_f86ad
+
+.asm_f863d
+ ld a, [hl]
+ cp $1
+ jr z, .asm_f86ad
+ cp $2
+ jr z, .asm_f86ad
+ cp $3
+ jr z, .asm_f86ad
+ cp $4
+ jr z, .asm_f869a
+ cp $5
+ jr z, .asm_f869f
+ cp $6
+ jr z, .asm_f86a2
+ cp $7
+ jr z, .asm_f869f
+ jr .asm_f86ad
+
+.asm_f865c
+ ld a, [hl]
+ cp $1
+ jr z, .asm_f869f
+ cp $2
+ jr z, .asm_f86a2
+ cp $3
+ jr z, .asm_f869f
+ cp $4
+ jr z, .asm_f869a
+ cp $5
+ jr z, .asm_f86ad
+ cp $6
+ jr z, .asm_f86ad
+ cp $7
+ jr z, .asm_f86ad
+ jr .asm_f86ad
+
+.asm_f867b
+ ld a, [hl]
+ cp $1
+ jr z, .asm_f86ad
+ cp $2
+ jr z, .asm_f869a
+ cp $3
+ jr z, .asm_f869f
+ cp $4
+ jr z, .asm_f86a2
+ cp $5
+ jr z, .asm_f86a2
+ cp $6
+ jr z, .asm_f869f
+ cp $7
+ jr z, .asm_f869a
+ jr .asm_f86ad
+
+.asm_f869a
+ call Func_f86f7
+ jr .asm_f86a2
+
+.asm_f869f
+ call Func_f86d0
+.asm_f86a2
+ xor a
+ ld [wChannelSoundIDs + CH7], a
+ ld a, SFX_UNKNOWN_801BF_4
+ call PlaySound
+ and a
+ ret
+
+.asm_f86ad
+ ld a, $40
+ ld [wc5e3], a
+ xor a
+ ld [wc5e3 + 1], a
+ scf
+ ret
+
+Func_f86b8:
+ ld a, [wc5e3 + 1]
+ cp $2
+ ret nc
+ ld h, a
+ ld a, [wc5e3]
+ ld l, a
+ ld de, $2
+ add hl, de
+ ld a, h
+ ld [wc5e3 + 1], a
+ ld a, l
+ ld [wc5e3], a
+ ret
+
+Func_f86d0:
+ ld a, [wc5e3 + 1]
+ and a
+ jr nz, .asm_f86e2
+ ld a, [wc5e3]
+ cp $40
+ jr nc, .asm_f86e2
+ xor a
+ ld [wc5e3], a
+ ret
+
+.asm_f86e2
+ ld a, [wc5e3 + 1]
+ ld h, a
+ ld a, [wc5e3]
+ ld l, a
+ ld de, $ffc0
+ add hl, de
+ ld a, h
+ ld [wc5e3 + 1], a
+ ld a, l
+ ld [wc5e3], a
+ ret
+
+Func_f86f7:
+ ld a, [wc5e3 + 1]
+ and a
+ jr nz, .asm_f8709
+ ld a, [wc5e3]
+ cp $80
+ jr nc, .asm_f8709
+ xor a
+ ld [wc5e3], a
+ ret
+
+.asm_f8709
+ ld a, [wc5e3 + 1]
+ ld h, a
+ ld a, [wc5e3]
+ ld l, a
+ ld de, $ff80
+ add hl, de
+ ld a, h
+ ld [wc5e3 + 1], a
+ ld a, l
+ ld [wc5e3], a
+ ret
+
+Func_f871e:
+ ld a, [hSCX]
+ and $7
+ cp $3
+ jr c, .asm_f8740
+ cp $5
+ jr nc, .asm_f8740
+ ld a, [wc5ef]
+ cp $14
+ jr nz, .asm_f8740
+ call Func_f87a8
+ cp $a
+ jr c, .asm_f8740
+ ld [wc5ec], a
+ call Func_f9284
+ scf
+ ret
+
+.asm_f8740
+ and a
+ ret
+
+Func_f8742:
+ ld a, [hSCX]
+ and $7
+ cp $3
+ ret c
+ cp $5
+ ret nc
+ ld a, [wc5ef]
+ cp $6
+ jr z, .asm_f8766
+ cp $14
+ jr z, .asm_f8766
+ cp $7
+ jr z, .asm_f876a
+ call Func_f8778
+ ld a, $4
+ ld hl, $1
+ add hl, bc
+ ld [hl], a
+ ret
+
+.asm_f8766
+ ld a, $6
+ jr .asm_f876c
+
+.asm_f876a
+ ld a, $2
+.asm_f876c
+ ld e, a
+ ld a, [wc5de]
+ dec a
+ add e
+ ld hl, $1
+ add hl, bc
+ ld [hl], a
+ ret
+
+Func_f8778:
+ ld hl, wc5e0
+ ld a, [hl]
+ inc [hl]
+ and $7
+ ret nz
+ ld a, [wc5df]
+ and a
+ jr z, .asm_f8796
+ ld a, [wc5de]
+ and a
+ jr z, .asm_f8791
+ dec a
+ ld [wc5de], a
+ ret
+
+.asm_f8791
+ xor a
+ ld [wc5df], a
+ ret
+
+.asm_f8796
+ ld a, [wc5de]
+ cp $2
+ jr z, .asm_f87a2
+ inc a
+ ld [wc5de], a
+ ret
+
+.asm_f87a2
+ ld a, $1
+ ld [wc5df], a
+ ret
+
+Func_f87a8:
+ ld a, [wc5e3]
+ ld l, a
+ ld a, [wc5e3 + 1]
+ ld h, a
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ ld a, h
+ ret
+
+Func_f87b5:
+ ld hl, wc5eb
+ ld a, [hl]
+ inc [hl]
+ and $3
+ ret nz
+ call Func_f87ce
+ ld d, a
+ ld hl, $4
+ add hl, bc
+ ld e, [hl]
+ ld a, $a
+ push bc
+ call SpawnAnimatedObject
+ pop bc
+ ret
+
+Func_f87ce:
+ ld a, [hSCX]
+ and $8
+ jr nz, .asm_f87d9
+ ld hl, wc622
+ jr .asm_f87dc
+
+.asm_f87d9
+ ld hl, wc623
+.asm_f87dc
+ ld a, [wc5f0]
+ cp $6
+ jr z, .asm_f87ed
+ cp $14
+ jr z, .asm_f87ed
+ cp $7
+ jr z, .asm_f87f5
+ ld a, [hl]
+ ret
+
+.asm_f87ed
+ ld a, [hSCX]
+ and $7
+ ld e, a
+ ld a, [hl]
+ sub e
+ ret
+
+.asm_f87f5
+ ld a, [hSCX]
+ and $7
+ add [hl]
+ ret
+
+Func_f87fb:
+ ld hl, $4
+ add hl, bc
+ ld a, [hl]
+ cp $58
+ ret z
+ add $4
+ ld [hl], a
+ ret
+
+Func_f8807:
+ call MaskCurrentAnimatedObjectStruct
+ ret
+
+Func_f880b:
+ ld hl, $b
+ add hl, bc
+ ld a, [hl]
+ and a
+ ret z
+ dec [hl]
+ dec [hl]
+ ld d, a
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ call Func_f9362
+ cp $80
+ jr nc, .asm_f8825
+ xor $ff
+ inc a
+.asm_f8825
+ ld hl, $7
+ add hl, bc
+ ld [hl], a
+ ret
+
+Func_f882b:
+ ld hl, $b
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ and $1
+ ret z
+ ld hl, $4
+ add hl, bc
+ ld a, [hl]
+ cp $c0
+ jr z, .asm_f883f
+ inc [hl]
+ ret
+
+.asm_f883f
+ ld a, $1
+ ld [wc633], a
+ call MaskCurrentAnimatedObjectStruct
+ ret
+
+Func_f8848:
+ ld a, [wc635]
+ ld e, a
+ ld d, $0
+ ld a, [wc5e3]
+ ld l, a
+ ld a, [wc5e3 + 1]
+ ld h, a
+ add hl, de
+ ld a, l
+ ld [wc635], a
+ ld d, h
+ ld hl, wOAMBuffer + 5 * 4 + 1
+ ld e, $9
+.asm_f8861
+ ld a, [hl]
+ add d
+ ld [hli], a
+ inc hl
+ inc hl
+ inc hl
+ dec e
+ jr nz, .asm_f8861
+ ret
+
+Func_f886b:
+ ld a, [wc5ef]
+ ld a, [hSCX]
+ add $48
+ ld e, a
+ srl e
+ srl e
+ srl e
+ ld d, $0
+ ld hl, vBGMap0
+ add hl, de
+ ld a, [wc5ea]
+ srl a
+ srl a
+ srl a
+ ld c, a
+.asm_f8889
+ ld a, c
+ and a
+ jr z, .asm_f889a
+ dec c
+ ld de, $20
+ add hl, de
+ ld a, h
+ and $3
+ or $98
+ ld h, a
+ jr .asm_f8889
+
+.asm_f889a
+ ld de, wc5ef
+ ld a, e
+ ld [H_VBCOPYDEST], a
+ ld a, d
+ ld [H_VBCOPYDEST + 1], a
+ ld a, l
+ ld [H_VBCOPYSRC], a
+ ld a, h
+ ld [H_VBCOPYSRC + 1], a
+ ld a, $1
+ ld [H_VBCOPYSIZE], a
+ ret
+
+Func_f88ae:
+ ld a, [hSCX]
+ and $8
+ jr nz, .asm_f88b9
+ ld hl, wc621
+ jr .asm_f88bc
+
+.asm_f88b9
+ ld hl, wc622
+.asm_f88bc
+ ld a, [wc5ef]
+ cp $6
+ jr z, .asm_f88d0
+ cp $14
+ jr z, .asm_f88d0
+ cp $7
+ jr z, .asm_f88db
+ ld a, [hl]
+ ld [wc5ea], a
+ ret
+
+.asm_f88d0
+ ld a, [hSCX]
+ and $7
+ ld e, a
+ ld a, [hl]
+ sub e
+ ld [wc5ea], a
+ ret
+
+.asm_f88db
+ ld a, [hSCX]
+ and $7
+ add [hl]
+ ld [wc5ea], a
+ ret
+
+Func_f88e4:
+ ld hl, wc5d6
+ ld e, $99
+ call Func_f88f0
+ ret nc
+ inc hl
+ ld e, $99
+Func_f88f0:
+ ld a, [hl]
+ and a
+ jr z, .asm_f88fa
+ sub $1
+ daa
+ ld [hl], a
+ and a
+ ret
+
+.asm_f88fa
+ ld [hl], e
+ scf
+ ret
+
+Func_f88fd:
+ ld de, wc5d7
+ ld hl, wOAMBuffer + 0 * 4 + 2
+ ld a, [de]
+ call Func_f890b
+ ld hl, wOAMBuffer + 2 * 4 + 2
+ ld a, [de]
+Func_f890b:
+ ld c, a
+ swap a
+ and $f
+ add $d0
+ ld [hli], a
+ inc hl
+ inc hl
+ inc hl
+ ld a, c
+ and $f
+ add $d0
+ ld [hl], a
+ dec de
+ ret
+
+Func_f891e:
+ ld hl, wTileMap
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ xor a
+ call FillMemory
+ ld hl, Tilemap_f8946
+ coord de, 0, 6
+ ld bc, Tilemap_f8946End - Tilemap_f8946
+ call CopyData
+ call Func_f8a0e
+ ld hl, wOAMBuffer + 5 * 4 + 1
+ ld bc, $24
+ xor a
+ call FillMemory
+ ld a, $1
+ ld [H_AUTOBGTRANSFERENABLED], a
+ ret
+
+Tilemap_f8946:
+INCBIN "gfx/unknown_f8946.map"
+Tilemap_f8946End:
+
+Func_f8a0e:
+ coord hl, 1, 1
+ lb de, $3b, $3c
+ ld a, $40
+ call Func_f8a72
+ coord hl, 1, 2
+ lb de, $3f, $3f
+ ld a, $ff
+ call Func_f8a72
+ coord hl, 1, 3
+ lb de, $3f, $3f
+ ld a, $ff
+ call Func_f8a72
+ coord hl, 1, 4
+ lb de, $3f, $3f
+ ld a, $ff
+ call Func_f8a72
+ coord hl, 1, 5
+ lb de, $3f, $3f
+ ld a, $ff
+ call Func_f8a72
+ coord hl, 1, 6
+ lb de, $3f, $3f
+ ld a, $ff
+ call Func_f8a72
+ coord hl, 1, 7
+ lb de, $3f, $3f
+ ld a, $ff
+ call Func_f8a72
+ coord hl, 1, 8
+ lb de, $3f, $3f
+ ld a, $ff
+ call Func_f8a72
+ coord hl, 1, 9
+ lb de, $3d, $3e
+ ld a, $40
+ call Func_f8a72
+ ret
+
+Func_f8a72:
+ ld [hl], d
+ inc hl
+ ld c, $10
+.asm_f8a76
+ ld [hli], a
+ dec c
+ jr nz, .asm_f8a76
+ ld [hl], e
+ ret
+
+Func_f8a7c:
+ ld hl, Tilemap_f8a89
+ coord de, 6, 8
+ ld bc, $9
+ call CopyData
+ ret
+
+Tilemap_f8a89:
+ db $20,$2e,$2f,$30,$31,$2c,$32,$23,$33
+
+Func_f8a92:
+ ld hl, Tilemap_f8aa2
+ coord de, 2, 2
+ ld bc, $7
+ call CopyData
+ call Func_f8aca
+ ret
+
+Tilemap_f8aa2:
+ db $20,$21,$ff,$22,$23,$24,$25
+
+Func_f8aa9:
+ ld c, $63
+.asm_f8aab
+ push bc
+ ld hl, wc5d6
+ ld a, [hli]
+ or [hl]
+ and a
+ jr z, .asm_f8ac7
+ call Func_f88e4
+ ld e, $1
+.asm_f8ab9
+ call Func_f8b42
+ pop bc
+ dec c
+ jr nz, .asm_f8aab
+.asm_f8abf
+ ld a, SFX_UNKNOWN_801B0_4
+ call PlaySound
+.asm_f8ac5
+ and a
+ ret
+
+.asm_f8ac7
+ pop bc
+ scf
+ ret
+
+Func_f8aca:
+ coord hl, 10, 2
+ ld de, wc5d7
+ ld a, [de]
+ call Func_f9350
+ inc hl
+ ld a, [de]
+ call Func_f9350
+ inc hl
+ inc hl
+ ld [hl], $21
+ inc hl
+ ld [hl], $25
+ inc hl
+ ld [hl], $26
+ ret
+
+Func_f8ae4:
+ ld hl, Tilemap_f8af4
+ coord de, 2, 4
+ ld bc, $7
+ call CopyData
+ call Func_f8b25
+ ret
+
+Tilemap_f8af4:
+ db $27,$28,$29,$2a,$23,$26,$26
+
+Func_f8afb:
+ ld c, $63
+.asm_f8afd
+ push bc
+ ld hl, wc5da
+ ld a, [hli]
+ ld e, a
+ or [hl]
+ jr z, .asm_f8b22
+ ld d, [hl]
+ ld a, e
+ sub $1
+ daa
+ ld e, a
+ ld a, d
+ sbc $0
+ daa
+ ld [hld], a
+ ld [hl], e
+ ld e, $1
+ call Func_f8b42
+ pop bc
+ dec c
+ jr nz, .asm_f8afd
+ ld a, SFX_UNKNOWN_801B0_4
+ call PlaySound
+.asm_f8b20
+ and a
+ ret
+
+.asm_f8b22
+ pop bc
+ scf
+ ret
+
+Func_f8b25:
+ ld a, [wc5db]
+ coord hl, 10, 4
+ call Func_f9350
+ ld a, [wc5da]
+ coord hl, 12, 4
+ call Func_f9350
+ inc hl
+ inc hl
+ ld [hl], $21
+ inc hl
+ ld [hl], $25
+ inc hl
+ ld [hl], $26
+ ret
+
+Func_f8b42:
+ ld a, [wc5dc]
+ add e
+ daa
+ ld [wc5dc], a
+ ld a, [wc5dd]
+ adc $0
+ daa
+ ld [wc5dd], a
+ ret nc
+ ld a, $99
+ ld [wc5dc], a
+ ld [wc5dd], a
+ ret
+
+Func_f8b5d:
+ ld a, [wc5dd]
+ coord hl, 10, 6
+ call Func_f9350
+ ld a, [wc5dc]
+ coord hl, 12, 6
+ call Func_f9350
+ inc hl
+ inc hl
+ ld [hl], $21
+ inc hl
+ ld [hl], $25
+ inc hl
+ ld [hl], $26
+ ret
+
+Func_f8b7a:
+ ld hl, Tilemap_f8b8d
+ coord de, 2, 6
+ ld bc, $5
+ call CopyData
+ call Func_f8b25
+ call Func_f8b5d
+ ret
+
+Tilemap_f8b8d:
+ db $2b,$2c,$25,$28,$2d
+
+Func_f8b92:
+ ld hl, wSurfingMinigameHiScore + 1
+ ld a, [wc5dd]
+ cp [hl]
+ jr c, .asm_f8ba6
+ jr nz, .asm_f8bb0
+ dec hl
+ ld a, [wc5dc]
+ cp [hl]
+ jr c, .asm_f8ba6
+ jr nz, .asm_f8bb0
+.asm_f8ba6
+ call WaitForSoundToFinish
+ ldpikacry e, PikachuCry28
+ call SurfingMinigame_PlayPikaCryIfSurfingPikaInParty
+ and a
+ ret
+
+.asm_f8bb0
+ ld a, [wc5dc]
+ ld [wSurfingMinigameHiScore], a
+ ld a, [wc5dd]
+ ld [wSurfingMinigameHiScore + 1], a
+ call WaitForSoundToFinish
+ ldpikacry e, PikachuCry34
+ call SurfingMinigame_PlayPikaCryIfSurfingPikaInParty
+ ld a, SFX_GET_ITEM2_4_2
+ call PlaySound
+ scf
+ ret
+
+SurfingMinigame_PlayPikaCryIfSurfingPikaInParty: ; f8bcb (3e:4bcb)
+ push de
+ callab IsSurfingPikachuInThePlayersParty
+ pop de
+ ret nc
+ callab PlayPikachuSoundClip
+ ret
+
+Func_f8bdf:
+ ld a, [wc5d9]
+ inc a
+ cp $4
+ jr c, .asm_f8be9
+ ld a, $3
+.asm_f8be9
+ ld [wc5d9], a
+ ret
+
+Func_f8bed:
+ ld a, [wc5d9]
+ and a
+ ret z
+ ld a, [wc62f]
+ and $3
+ cp $3
+ jr z, .asm_f8c2b
+ ld a, [wc5d9]
+ ld d, a
+ ld e, $1
+ ld a, $0
+.asm_f8c03
+ add e
+ sla e
+ dec d
+ jr nz, .asm_f8c03
+.asm_f8c09
+ push af
+ ld e, $50
+ call Func_f8c7c
+ pop af
+ dec a
+ jr nz, .asm_f8c09
+ ld hl, $5
+ add hl, bc
+ ld a, [hl]
+ sub $10
+ ld d, a
+ ld hl, $4
+ add hl, bc
+ ld e, [hl]
+ ld a, [wc5d9]
+ add $3
+ push bc
+ call SpawnAnimatedObject
+ pop bc
+ ret
+
+.asm_f8c2b
+ ld a, [wc5d9]
+ cp $3
+ jr c, .asm_f8c53
+ ld a, $a
+.asm_f8c34
+ push af
+ ld e, $50
+ call Func_f8c7c
+ pop af
+ dec a
+ jr nz, .asm_f8c34
+ ld hl, $5
+ add hl, bc
+ ld a, [hl]
+ sub $10
+ ld d, a
+ ld hl, $4
+ add hl, bc
+ ld e, [hl]
+ ld a, $9
+ push bc
+ call SpawnAnimatedObject
+ pop bc
+ ret
+
+.asm_f8c53
+ ld e, $50
+ call Func_f8c7c
+ ld e, $50
+ call Func_f8c7c
+ ld e, $50
+ call Func_f8c7c
+ ld e, $30
+ call Func_f8c7c
+ ld hl, $5
+ add hl, bc
+ ld a, [hl]
+ sub $10
+ ld d, a
+ ld hl, $4
+ add hl, bc
+ ld e, [hl]
+ ld a, $8
+ push bc
+ call SpawnAnimatedObject
+ pop bc
+ ret
+
+Func_f8c7c:
+ ld a, [wc5da]
+ add e
+ daa
+ ld [wc5da], a
+ ld a, [wc5db]
+ adc $0
+ daa
+ ld [wc5db], a
+ ret nc
+ ld a, $99
+ ld [wc5da], a
+ ld [wc5db], a
+ ret
+
+Func_f8c97:
+ ld a, $a0
+ ld [wc62e], a
+ ld a, [hSCX]
+ ld h, a
+ ld a, [wc617]
+ ld l, a
+ ld de, $900
+ add hl, de
+ ld a, l
+ ld [wc617], a
+ ld a, h
+ ld [hSCX], a
+ jr Func_f8cc7
+
+Func_f8cb0:
+ ld a, $a0
+ ld [wc62e], a
+ ld a, [hSCX]
+ ld h, a
+ ld a, [wc617]
+ ld l, a
+ ld de, $180
+ add hl, de
+ ld a, l
+ ld [wc617], a
+ ld a, h
+ ld [hSCX], a
+Func_f8cc7:
+ ld hl, wc618
+ ld a, [hSCX]
+ cp [hl]
+ ret z
+ ld [hl], a
+ and $f0
+ ld hl, wc619
+ cp [hl]
+ ret z
+ ld [hl], a
+ call Func_f8d44
+ ld a, b
+ ld [wc5e8], a
+ ld a, c
+ ld [wc5e9], a
+ push de
+ ld hl, wc61a
+ ld de, wc61c
+ ld c, $12
+.asm_f8ceb
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .asm_f8ceb
+ ld a, [wc5e8]
+ ld [hli], a
+ ld a, [wc5e9]
+ ld [hl], a
+ pop de
+ ld hl, wRedrawRowOrColumnSrcTiles
+ ld c, $8
+.asm_f8cff
+ ld a, [de]
+ call Func_f8d28
+ inc de
+ dec c
+ jr nz, .asm_f8cff
+ ld a, [wc62e]
+ ld e, a
+ ld a, [hSCX]
+ add e
+ and $f0
+ srl a
+ srl a
+ srl a
+ ld e, a
+ ld d, $0
+ ld hl, vBGMap0
+ add hl, de
+ ld a, l
+ ld [hRedrawRowOrColumnDest], a
+ ld a, h
+ ld [hRedrawRowOrColumnDest + 1], a
+ ld a, $1
+ ld [hRedrawRowOrColumnMode], a
+ ret
+
+Func_f8d28:
+ push de
+ push hl
+ ld l, a
+ ld h, $0
+ ld de, Unkn_f96e5
+ add hl, hl
+ add hl, hl
+ add hl, de
+ ld e, l
+ ld d, h
+ pop hl
+ ld a, [de]
+ inc de
+ ld [hli], a
+ ld a, [de]
+ inc de
+ ld [hli], a
+ ld a, [de]
+ inc de
+ ld [hli], a
+ ld a, [de]
+ inc de
+ ld [hli], a
+ pop de
+ ret
+
+Func_f8d44:
+ ld a, [wc5d3]
+ ld e, a
+ ld d, $0
+ ld hl, Jumptable_f8d53
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+Jumptable_f8d53:
+ dw Func_f8e4b
+ dw Func_f8f28
+ dw Func_f8f31
+ dw Func_f8f3a
+ dw Func_f8f43
+ dw Func_f8e7d
+ dw Func_f8f4c
+ dw Func_f8f55
+ dw Func_f8f5e
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8f94
+ dw Func_f8ec5
+ dw Func_f8ece
+ dw Func_f8ed7
+ dw Func_f8ee0
+ dw Func_f8ee9
+ dw Func_f8ef2
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8f94
+ dw Func_f8efb
+ dw Func_f8f04
+ dw Func_f8f0d
+ dw Func_f8f16
+ dw Func_f8f1f
+ dw Func_f8efb
+ dw Func_f8f04
+ dw Func_f8f0d
+ dw Func_f8f16
+ dw Func_f8f1f
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8f94
+ dw Func_f8f28
+ dw Func_f8f31
+ dw Func_f8f3a
+ dw Func_f8f43
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8f94
+ dw Func_f8f4c
+ dw Func_f8f55
+ dw Func_f8f5e
+ dw Func_f8f4c
+ dw Func_f8f55
+ dw Func_f8f5e
+ dw Func_f8f4c
+ dw Func_f8f55
+ dw Func_f8f5e
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8f94
+ dw Func_f8f67
+ dw Func_f8f70
+ dw Func_f8efb
+ dw Func_f8f04
+ dw Func_f8f0d
+ dw Func_f8f16
+ dw Func_f8f1f
+ dw Func_f8f67
+ dw Func_f8f70
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8f94
+ dw Func_f8ec5
+ dw Func_f8ece
+ dw Func_f8ed7
+ dw Func_f8ee0
+ dw Func_f8ee9
+ dw Func_f8ef2
+ dw Func_f8e7d
+ dw Func_f8f67
+ dw Func_f8f70
+ dw Func_f8f67
+ dw Func_f8f70
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8f94
+ dw Func_f8efb
+ dw Func_f8f04
+ dw Func_f8f0d
+ dw Func_f8f16
+ dw Func_f8f1f
+ dw Func_f8f28
+ dw Func_f8f31
+ dw Func_f8f3a
+ dw Func_f8f43
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8e7d
+ dw Func_f8f94
+ dw Func_f8e86
+ dw Func_f8e8f
+ dw Func_f8e98
+ dw Func_f8ea1
+ dw Func_f8eaa
+ dw Func_f8eb3
+ dw Func_f8ebc
+ dw Func_f8f9d
+ dw Func_f8e7d
+ dw Func_f8f79
+ dw Func_f8f82
+ dw Func_f8f82
+ dw Func_f8f82
+ dw Func_f8f82
+ dw Func_f8f82
+ dw Func_f8f82
+ dw Func_f8f82
+ dw Func_f8f8b
+
+Func_f8e4b:
+ ld a, [wc5e5]
+ cp $16
+ jr c, .asm_f8e5a
+ jr z, .asm_f8e56
+ jr nc, .asm_f8e6e
+.asm_f8e56
+ ld a, $6a
+ jr .asm_f8e6b
+
+.asm_f8e5a
+ ld a, [wc5d5]
+ and a
+ jr z, .asm_f8e6e
+ dec a
+ and $7
+ ld e, a
+ ld d, $0
+ ld hl, Unkn_f8e75
+ add hl, de
+ ld a, [hl]
+.asm_f8e6b
+ ld [wc5d3], a
+.asm_f8e6e
+ lb bc, $74, $74
+ ld de, Unkn_f973d
+ ret
+
+Unkn_f8e75:
+ db $01,$0e,$1a,$29,$32,$40,$4d,$5c
+
+Func_f8e7d:
+ lb bc, $74, $74
+ ld de, Unkn_f973d
+ jp Func_f8fa9
+
+Func_f8e86:
+ lb bc, $74, $6c
+ ld de, Unkn_f9745
+ jp Func_f8fa9
+
+Func_f8e8f:
+ lb bc, $64, $5c
+ ld de, Unkn_f974d
+ jp Func_f8fa9
+
+Func_f8e98:
+ lb bc, $54, $4c
+ ld de, Unkn_f9755
+ jp Func_f8fa9
+
+Func_f8ea1:
+ lb bc, $44, $44
+ ld de, Unkn_f975d
+ jp Func_f8fa9
+
+Func_f8eaa:
+ lb bc, $44, $4c
+ ld de, Unkn_f9765
+ jp Func_f8fa9
+
+Func_f8eb3:
+ lb bc, $54, $5c
+ ld de, Unkn_f976d
+ jp Func_f8fa9
+
+Func_f8ebc:
+ lb bc, $64, $6c
+ ld de, Unkn_f9775
+ jp Func_f8fa9
+
+Func_f8ec5:
+ lb bc, $74, $6c
+ ld de, Unkn_f977d
+ jp Func_f8fa9
+
+Func_f8ece:
+ lb bc, $64, $5c
+ ld de, Unkn_f9785
+ jp Func_f8fa9
+
+Func_f8ed7:
+ lb bc, $54, $4c
+ ld de, Unkn_f978d
+ jp Func_f8fa9
+
+Func_f8ee0:
+ lb bc, $4c, $4c
+ ld de, Unkn_f9795
+ jp Func_f8fa9
+
+Func_f8ee9:
+ lb bc, $54, $5c
+ ld de, Unkn_f979d
+ jp Func_f8fa9
+
+Func_f8ef2:
+ lb bc, $64, $6c
+ ld de, Unkn_f97a5
+ jp Func_f8fa9
+
+Func_f8efb:
+ lb bc, $74, $6c
+ ld de, Unkn_f97ad
+ jp Func_f8fa9
+
+Func_f8f04:
+ lb bc, $64, $5c
+ ld de, Unkn_f97b5
+ jp Func_f8fa9
+
+Func_f8f0d:
+ lb bc, $54, $54
+ ld de, Unkn_f97bd
+ jp Func_f8fa9
+
+Func_f8f16:
+ lb bc, $54, $5c
+ ld de, Unkn_f97c5
+ jp Func_f8fa9
+
+Func_f8f1f:
+ lb bc, $64, $6c
+ ld de, Unkn_f97cd
+ jp Func_f8fa9
+
+Func_f8f28:
+ lb bc, $74, $6c
+ ld de, Unkn_f97d5
+ jp Func_f8fa9
+
+Func_f8f31:
+ lb bc, $64, $5c
+ ld de, Unkn_f97dd
+ jp Func_f8fa9
+
+Func_f8f3a:
+ lb bc, $5c, $5c
+ ld de, Unkn_f97e5
+ jp Func_f8fa9
+
+Func_f8f43:
+ lb bc, $64, $6c
+ ld de, Unkn_f97ed
+ jp Func_f8fa9
+
+Func_f8f4c:
+ lb bc, $74, $6c
+ ld de, Unkn_f97f5
+ jp Func_f8fa9
+
+Func_f8f55:
+ lb bc, $64, $64
+ ld de, Unkn_f97fd
+ jp Func_f8fa9
+
+Func_f8f5e:
+ lb bc, $64, $6c
+ ld de, Unkn_f9805
+ jp Func_f8fa9
+
+Func_f8f67:
+ lb bc, $74, $6c
+ ld de, Unkn_f980d
+ jp Func_f8fa9
+
+Func_f8f70:
+ lb bc, $6c, $6c
+ ld de, Unkn_f9815
+ jp Func_f8fa9
+
+Func_f8f79:
+ lb bc, $74, $74
+ ld de, Unkn_f981d
+ jp Func_f8fa9
+
+Func_f8f82:
+ lb bc, $74, $74
+ ld de, Unkn_f9825
+ jp Func_f8fa9
+
+Func_f8f8b:
+ lb bc, $74, $74
+ ld de, Unkn_f9825
+ jp Func_f8fae
+
+Func_f8f94:
+ lb bc, $74, $74
+ ld de, Unkn_f973d
+ jp Func_f8fae
+
+Func_f8f9d:
+ lb bc, $74, $74
+ ld de, Unkn_f973d
+ ret
+
+Func_f8fa4:
+ inc a
+ ld [wc5d3], a
+ ret
+
+Func_f8fa9:
+ ld hl, wc5d3
+ inc [hl]
+ ret
+
+Func_f8fae:
+ xor a
+ ld [wc5d3], a
+ ret
+
+Func_f8fb3:
+ call Func_f9279
+ call ClearSprites
+ call DisableLCD
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call ClearObjectAnimationBuffers
+ ld hl, $6324
+ ld de, $8800
+ ld bc, $900
+ ld a, $20
+ call FarCopyData
+ ld a, Unkn_f93d3 % $100
+ ld [wAnimatedObjectSpawnStateDataPointer], a
+ ld a, Unkn_f93d3 / $100
+ ld [wAnimatedObjectSpawnStateDataPointer + 1], a
+ ld a, Jumptable_f93fa % $100
+ ld [wAnimatedObjectJumptablePointer], a
+ ld a, Jumptable_f93fa / $100
+ ld [wAnimatedObjectJumptablePointer + 1], a
+ ld a, Unkn_f9507 % $100
+ ld [wAnimatedObjectOAMDataPointer], a
+ ld a, Unkn_f9507 / $100
+ ld [wAnimatedObjectOAMDataPointer + 1], a
+ ld a, Unkn_f9405 % $100
+ ld [wAnimatedObjectFramesDataPointer], a
+ ld a, Unkn_f9405 / $100
+ ld [wAnimatedObjectFramesDataPointer + 1], a
+ ld a, $c
+ lb de, $74, $58
+ call SpawnAnimatedObject
+ call Func_f9053
+ xor a
+ ld [hSCX], a
+ ld [hSCY], a
+ ld a, $90
+ ld [hWY], a
+ ld b, $f
+ call RunPaletteCommand
+ ld a, $e3
+ ld [rLCDC], a
+ ld a, $1
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call DelayFrame
+ call DelayFrame
+ call DelayFrame
+ call Func_f81e9
+ ld a, $e4
+ ld [rOBP0], a
+ ld a, $e0
+ ld [rOBP1], a
+ call UpdateGBCPal_OBP0
+ call UpdateGBCPal_OBP1
+ call DelayFrame
+ ld a, MUSIC_SURFING_PIKACHU
+ ld c, BANK(Music_SurfingPikachu)
+ call PlayMusic
+ xor a
+ ld [wc633], a
+.loop
+ ld a, [wc633]
+ and a
+ ret nz
+ ld a, $0
+ ld [wCurrentAnimatedObjectOAMBufferOffset], a
+ call RunObjectAnimations
+ call DelayFrame
+ jr .loop
+
+Func_f9053:
+ ld hl, wTileMap
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, $ff
+ call FillMemory
+ ld hl, Tilemap_f90bc
+ coord de, 0, 6
+ ld bc, 12 * SCREEN_WIDTH
+ call CopyData
+ ld de, Tilemap_f91c8
+ coord hl, 4, 0
+ lb bc, 6, 12
+ call .CopyBox
+ coord hl, 3, 7
+ lb bc, 3, 15
+ call .FillBoxWithFF
+ ld hl, Tilemap_f91ac
+ coord de, 3, 7
+ ld bc, 15
+ call CopyData
+ ld hl, Tilemap_f91bb
+ coord de, 4, 9
+ ld bc, 13
+ call CopyData
+ ret
+
+.CopyBox:
+.copy_row
+ push bc
+ push hl
+.copy_col
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .copy_col
+ ld bc, SCREEN_WIDTH
+ pop hl
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .copy_row
+ ret
+
+.FillBoxWithFF:
+.fill_row
+ push bc
+ push hl
+.fill_col
+ ld [hl], $ff
+ inc hl
+ dec c
+ jr nz, .fill_col
+ pop hl
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .fill_row
+ ret
+
+Tilemap_f90bc: INCBIN "gfx/unknown_f90bc.map"
+Tilemap_f91ac: INCBIN "gfx/unknown_f91ac.map"
+Tilemap_f91bb: INCBIN "gfx/unknown_f91bb.map"
+Tilemap_f91c8: INCBIN "gfx/unknown_f91c8.map"
+
+Func_f9210:
+ ld hl, wc710
+ ld de, wc710 + 1
+ ld c, $80
+ ld a, [hl]
+ push af
+.asm_f921a
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .asm_f921a
+ pop af
+ ld [hl], a
+ ret
+
+Func_f9223:
+ ld hl, wc700
+ ld bc, $100
+ ld de, $0
+.asm_f922c
+ ld a, e
+ and $1f
+ ld e, a
+ push hl
+ ld hl, Unkn_f96c5
+ add hl, de
+ ld a, [hl]
+ pop hl
+ ld [hli], a
+ inc e
+ dec bc
+ ld a, c
+ or b
+ jr nz, .asm_f922c
+ ret
+
+Func_f923f:
+ call Joypad
+ ld a, [H_FRAMECOUNTER]
+ and a
+ jr nz, .asm_f9250
+ ld a, [hJoyHeld]
+ ld [hJoy5], a
+ ld a, $2
+ ld [H_FRAMECOUNTER], a
+ ret
+
+.asm_f9250
+ xor a
+ ld [hJoy5], a
+ ret
+
+SurfingPikachuMinigame_BlankPals:
+ xor a
+ ld [rBGP], a
+ ld [rOBP0], a
+ ld [rOBP1], a
+ call UpdateGBCPal_BGP
+ call UpdateGBCPal_OBP0
+ call UpdateGBCPal_OBP1
+ ret
+
+SurfingPikachuMinigame_NormalPals:
+ ld a, $e4
+ ld [rBGP], a
+ ld [rOBP0], a
+ ld a, $e0
+ ld [rOBP1], a
+ call UpdateGBCPal_BGP
+ call UpdateGBCPal_OBP0
+ call UpdateGBCPal_OBP1
+ ret
+
+Func_f9279:
+ ld hl, wTileMap
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ xor a
+ call FillMemory
+ ret
+
+Func_f9284:
+ xor a
+ ld [wc5ed], a
+ ld [wc5ee], a
+ ret
+
+Func_f928c:
+ ld a, [wc5ed]
+ and a
+ jr nz, .asm_f92e4
+ ld a, [wc5ec]
+ ld d, a
+ ld a, [wc5ee]
+ or d
+ jr z, .asm_f92dd
+ ld a, [wc5ee]
+ ld e, a
+ ld hl, $ff80
+ add hl, de
+ ld a, l
+ ld [wc5ee], a
+ ld a, h
+ ld [wc5ec], a
+ ld e, a
+ ld d, $0
+ call Func_f9340
+ ld e, l
+ ld d, h
+ ld a, $4
+ call Func_f9340
+ ld a, l
+ xor $ff
+ inc a
+ ld l, a
+ ld a, h
+ xor $ff
+ ld h, a
+ push hl
+ ld hl, $5
+ add hl, bc
+ ld d, [hl]
+ ld hl, $c
+ add hl, bc
+ ld e, [hl]
+ pop hl
+ add hl, de
+ ld e, l
+ ld d, h
+ ld hl, $5
+ add hl, bc
+ ld [hl], d
+ ld hl, $c
+ add hl, bc
+ ld [hl], e
+ and a
+ ret
+
+.asm_f92dd
+ ld a, $1
+ ld [wc5ed], a
+ and a
+ ret
+
+.asm_f92e4
+ ld a, [wc5ea]
+ ld e, a
+ ld hl, $5
+ add hl, bc
+ ld a, [hl]
+ cp $90
+ jr nc, .asm_f92f4
+ cp e
+ jr nc, .asm_f9330
+.asm_f92f4
+ ld a, [wc5ec]
+ ld d, a
+ ld a, [wc5ee]
+ ld e, a
+ ld hl, $80
+ add hl, de
+ ld a, l
+ ld [wc5ee], a
+ ld a, h
+ ld [wc5ec], a
+ ld e, a
+ ld d, $0
+ call Func_f9340
+ ld e, l
+ ld d, h
+ ld a, $4
+ call Func_f9340
+ push hl
+ ld hl, $5
+ add hl, bc
+ ld d, [hl]
+ ld hl, $c
+ add hl, bc
+ ld e, [hl]
+ pop hl
+ add hl, de
+ ld e, l
+ ld d, h
+ ld hl, $5
+ add hl, bc
+ ld [hl], d
+ ld hl, $c
+ add hl, bc
+ ld [hl], e
+ and a
+ ret
+
+.asm_f9330
+ ld hl, $5
+ add hl, bc
+ ld a, [wc5ea]
+ ld [hl], a
+ ld hl, $c
+ add hl, bc
+ ld [hl], $0
+ scf
+ ret
+
+Func_f9340:
+ ld hl, $0
+.asm_f9343
+ srl a
+ jr nc, .asm_f9348
+ add hl, de
+.asm_f9348
+ sla e
+ rl d
+ and a
+ jr nz, .asm_f9343
+ ret
+
+Func_f9350:
+ ld c, a
+ swap a
+ and $f
+ add $d0
+ ld [hli], a
+ ld a, c
+ and $f
+ add $d0
+ ld [hl], a
+ dec de
+ ret
+
+Func_f9360: ; cosine
+ add $10
+Func_f9362: ; sine
+ and $3f
+ cp $20
+ jr nc, .asm_f936d
+ call Func_f9377
+ ld a, h
+ ret
+
+.asm_f936d
+ and $1f
+ call Func_f9377
+ ld a, h
+ xor $ff
+ inc a
+ ret
+
+Func_f9377:
+ ld e, a
+ ld a, d
+ ld d, $0
+ ld hl, Unkn_f9393
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $0
+.asm_f9386
+ srl a
+ jr nc, .asm_f938b
+ add hl, de
+.asm_f938b
+ sla e
+ rl d
+ and a
+ jr nz, .asm_f9386
+ ret
+
+Unkn_f9393:
+ sine_wave $100
+
+Unkn_f93d3:
+ db $00, $00, $00
+ db $04, $01, $00
+ db $11, $02, $00
+ db $12, $02, $00
+ db $15, $00, $00
+ db $16, $00, $00
+ db $17, $00, $00
+ db $18, $00, $00
+ db $19, $00, $00
+ db $1a, $00, $00
+ db $14, $00, $00
+ db $13, $03, $00
+ db $1b, $04, $00
+
+Jumptable_f93fa:
+ dw Func_f9404
+ dw Func_f8470
+ dw Func_f87fb
+ dw Func_f880b
+ dw Func_f882b
+
+Func_f9404:
+ ret
+
+INCLUDE "data/animated_objects_3e_1.asm"
+
+Unkn_f96c5:
+; a sine wave with amplitude 2
+ db 0, 0, 0, 1, 1, 1, 1, 2
+ db 2, 2, 1, 1, 1, 1, 0, 0
+ db 0, 0, 0, -1, -1, -1, -1, -2
+ db -2, -2, -1, -1, -1, -1, 0, 0
+
+Unkn_f96e5:
+ db $00, $00, $00, $00
+ db $0b, $0b, $0b, $0b
+ db $0b, $02, $02, $06
+ db $03, $0b, $07, $03
+ db $06, $06, $06, $06
+ db $07, $07, $07, $07
+ db $06, $04, $04, $08
+ db $05, $07, $08, $05
+ db $0b, $0b, $11, $12
+ db $0b, $0b, $13, $03
+ db $14, $12, $04, $08
+ db $13, $07, $08, $05
+ db $06, $14, $06, $14
+ db $13, $07, $13, $07
+ db $08, $08, $08, $08
+ db $14, $12, $14, $12
+ db $0b, $11, $02, $14
+ db $06, $14, $06, $14
+ db $0c, $0c, $0d, $0d
+ db $0d, $0d, $0d, $0d
+ db $0e, $0f, $10, $0b
+ db $12, $13, $12, $13
+
+Unkn_f973d:
+ db $00, $00, $00, $01, $01, $01, $01, $01
+Unkn_f9745:
+ db $00, $00, $00, $01, $01, $02, $04, $06
+Unkn_f974d:
+ db $00, $00, $00, $01, $02, $04, $06, $0e
+Unkn_f9755:
+ db $00, $00, $00, $10, $11, $06, $0e, $0e
+Unkn_f975d:
+ db $00, $00, $00, $15, $15, $0e, $0e, $0e
+Unkn_f9765:
+ db $00, $00, $00, $03, $05, $07, $0e, $0e
+Unkn_f976d:
+ db $00, $00, $00, $01, $03, $05, $07, $0e
+Unkn_f9775:
+ db $00, $00, $00, $01, $01, $03, $05, $07
+Unkn_f977d:
+ db $00, $00, $00, $01, $01, $02, $04, $06
+Unkn_f9785:
+ db $00, $00, $00, $01, $02, $04, $06, $0e
+Unkn_f978d:
+ db $00, $00, $00, $08, $0f, $0a, $0e, $0e
+Unkn_f9795:
+ db $00, $00, $00, $09, $0d, $0b, $0e, $0e
+Unkn_f979d:
+ db $00, $00, $00, $01, $03, $05, $07, $0e
+Unkn_f97a5:
+ db $00, $00, $00, $01, $01, $03, $05, $07
+Unkn_f97ad:
+ db $00, $00, $00, $01, $01, $02, $04, $06
+Unkn_f97b5:
+ db $00, $00, $00, $01, $10, $11, $06, $0e
+Unkn_f97bd:
+ db $00, $00, $00, $01, $15, $15, $0e, $0e
+Unkn_f97c5:
+ db $00, $00, $00, $01, $03, $05, $07, $0e
+Unkn_f97cd:
+ db $00, $00, $00, $01, $01, $03, $05, $07
+Unkn_f97d5:
+ db $00, $00, $00, $01, $01, $02, $04, $06
+Unkn_f97dd:
+ db $00, $00, $00, $01, $08, $0f, $0a, $0e
+Unkn_f97e5:
+ db $00, $00, $00, $01, $09, $0d, $0b, $0e
+Unkn_f97ed:
+ db $00, $00, $00, $01, $01, $03, $05, $07
+Unkn_f97f5:
+ db $00, $00, $00, $01, $01, $10, $11, $06
+Unkn_f97fd:
+ db $00, $00, $00, $01, $01, $15, $15, $0e
+Unkn_f9805:
+ db $00, $00, $00, $01, $01, $03, $05, $07
+Unkn_f980d:
+ db $00, $00, $00, $01, $01, $08, $0f, $0a
+Unkn_f9815:
+ db $00, $00, $00, $01, $01, $09, $0d, $0b
+Unkn_f981d:
+ db $00, $00, $00, $14, $14, $14, $14, $14
+Unkn_f9825:
+ db $00, $00, $00, $12, $13, $13, $13, $13
diff --git a/engine/titlescreen.asm b/engine/titlescreen.asm
index b9abc1eb..c10e0315 100755
--- a/engine/titlescreen.asm
+++ b/engine/titlescreen.asm
@@ -42,22 +42,22 @@ DisplayTitleScreen: ; 4171 (1:4171)
ld a, BANK(NineTile)
call FarCopyData
ld hl, GamefreakLogoGraphics ; 4:4d78
- ld de, vTitleLogo + $650
- ld bc, $90
+ ld de, vTitleLogo + 101 * $10
+ ld bc, 9 * $10
ld a, BANK(GamefreakLogoGraphics)
call FarCopyData
- callab Func_f453f
+ callab LoadYellowTitleScreenGFX
ld hl, vBGMap0
ld bc, (vBGMap1 + $400) - vBGMap0
ld a, " "
call FillMemory
- callab Func_f4578
- call Func_4418
+ callab TitleScreen_PlacePokemonLogo
+ call FillSpriteBuffer0WithAA
call .WriteCopyrightTiles
call SaveScreenTilesToBuffer2
call LoadScreenTilesFromBuffer2
call EnableLCD
- callab Func_f459a
+ callab TitleScreen_PlacePikachu
ld a, $9b
call TitleScreenCopyTileMapToVRAM
call SaveScreenTilesToBuffer1
@@ -136,7 +136,7 @@ DisplayTitleScreen: ; 4171 (1:4171)
call PlaySound
; scroll game version in from the right
- callab Func_f4585
+ callab TitleScreen_PlacePikaSpeechBubble
ld a, SCREEN_HEIGHT_PIXELS
ld [hWY], a
call Delay3
@@ -147,15 +147,15 @@ DisplayTitleScreen: ; 4171 (1:4171)
ld a, MUSIC_TITLE_SCREEN
ld [wNewSoundID], a
call PlaySound
-.asm_428f
+.loop
xor a
ld [wUnusedCC5B], a
- ld [wTitleMonSpecies], a
- ld [wTitleMonSpecies+1], a
- ld [wTitleMonSpecies+2], a
- ld [wTitleMonSpecies+3], a
+ ld [wTitleScreenScene], a
+ ld [wTitleScreenScene + 1], a
+ ld [wTitleScreenScene + 2], a
+ ld [wTitleScreenScene + 3], a
ld a, $f
- ld [wTitleMonSpecies+4], a
+ ld [wTitleScreenScene + 4], a
.titleScreenLoop
call IncrementResetCounter
jp c, .doTitlescreenReset
@@ -163,12 +163,13 @@ DisplayTitleScreen: ; 4171 (1:4171)
call JoypadLowSensitivity
ld a, [hJoyHeld]
cp D_UP | SELECT | B_BUTTON
- jr z, .asm_42bf
+ jr z, .go_to_main_menu
and A_BUTTON | START
- jr nz, .asm_42bf
- call Func_4390
+ jr nz, .go_to_main_menu
+ call DoTitleScreenFunction
jr .titleScreenLoop
-.asm_42bf
+
+.go_to_main_menu
ld e, $a
call TitleScreen_PlayPikachuPCM
call GBPalWhiteOutWithDelay3
@@ -190,24 +191,28 @@ DisplayTitleScreen: ; 4171 (1:4171)
cp D_UP | SELECT | B_BUTTON
jp z, .doClearSaveDialogue
jp MainMenu
+
.asm_42f0 ; 42f0 (1:42f0)
+; unreferenced
callab Func_e8e79
- jp .asm_428f
+ jp .loop
.asm_42fb ; 42fb (1:42fb)
- ld a, [wTitleMonSpecies+4]
+; unreferenced
+ ld a, [wTitleScreenScene + 4]
inc a
cp $2a
jr c, .asm_4305
ld a, $f
.asm_4305
- ld [wTitleMonSpecies+4], a
+ ld [wTitleScreenScene + 4], a
ld e, a
callab PlayPikachuSoundClip
xor a
- ld [wTitleMonSpecies+2], a
- ld [wTitleMonSpecies+3], a
+ ld [wTitleScreenScene + 2], a
+ ld [wTitleScreenScene + 3], a
jp .titleScreenLoop
+
.doTitlescreenReset ; 431b (1:431b)
ld [wAudioFadeOutControl], a
call StopAllMusic
@@ -249,49 +254,52 @@ CopyrightTextString: ; 4355 (1:4355)
TitleScreen_PlayPikachuPCM: ; 4387 (1:4387)
callab PlayPikachuSoundClip
ret
-
-Func_4390: ; 4390 (1:4390)
- call Func_43de
- ld a, [wTitleMonSpecies]
+
+DoTitleScreenFunction: ; 4390 (1:4390)
+ call .CheckTimer
+ ld a, [wTitleScreenScene]
ld e, a
ld d, 0
- ld hl, PointerTable_43a2
+ ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
- jp hl
-
-PointerTable_43a2: ; 43a2 (1:43a2)
- dw Func_43be
- dw Func_43c3
- dw Func_43d9
- dw Func_43d9
- dw Func_43c7
- dw Func_43d9
- dw Func_43d9
- dw Func_43c3
- dw Func_43d9
- dw Func_43d9
- dw Func_43bf
- dw Func_43ba
+ jp [hl]
-Func_43ba: ; 43ba (1:43ba)
+
+.Jumptable: ; 43a2 (1:43a2)
+ dw .Nop
+ dw .BlinkHalf
+ dw .BlinkWait
+ dw .BlinkWait
+ dw .BlinkClosed
+ dw .BlinkWait
+ dw .BlinkWait
+ dw .BlinkHalf
+ dw .BlinkWait
+ dw .BlinkWait
+ dw .BlinkOpen
+ dw .GoBackToStart
+
+.GoBackToStart: ; 43ba (1:43ba)
xor a
- ld [wTitleMonSpecies], a
-Func_43be
+ ld [wTitleScreenScene], a
+.Nop
ret
-
-Func_43bf: ; 43bf (1:43bf)
+
+.BlinkOpen: ; 43bf (1:43bf)
ld e, 0
- jr asm_43c9
-Func_43c3: ; 43c3 (1:43c3)
+ jr .LoadBlinkFrame
+
+.BlinkHalf: ; 43c3 (1:43c3)
ld e, 4
- jr asm_43c9
-Func_43c7: ; 43c7 (1:43c7)
+ jr .LoadBlinkFrame
+
+.BlinkClosed: ; 43c7 (1:43c7)
ld e, 8
-asm_43c9: ; 43c9 (1:43c9)
+.LoadBlinkFrame: ; 43c9 (1:43c9)
ld hl, wOAMBuffer + 2
ld c, 8
.loop
@@ -304,24 +312,24 @@ asm_43c9: ; 43c9 (1:43c9)
inc hl
dec c
jr nz, .loop
-Func_43d9: ; 43d9 (1:43d9)
- ld hl, wTitleMonSpecies
+.BlinkWait: ; 43d9 (1:43d9)
+ ld hl, wTitleScreenScene
inc [hl]
ret
-
-Func_43de: ; 43de (1:43de)
- ld hl, wTitleMonSpecies + 1
+
+.CheckTimer: ; 43de (1:43de)
+ ld hl, wTitleScreenTimer
ld a, [hl]
inc [hl]
and a
- jr z, .asm_43ed
+ jr z, .restart
cp $80
- jr z, .asm_43ed
+ jr z, .restart
cp $90
ret nz
-.asm_43ed
+.restart
ld a, $1
- ld [wTitleMonSpecies], a
+ ld [wTitleScreenScene], a
ret
; copy text of fixed length NAME_LENGTH (like player name, rival name, mon names, ...)
@@ -333,7 +341,7 @@ NintenText: db "NINTEN@"
SonyText: db "SONY@"
IncrementResetCounter: ; 4405 (1:4405)
- ld hl, wTitleMonSpecies + 2
+ ld hl, wTitleScreenScene + 2
ld e, [hl]
inc hl
ld d, [hl]
@@ -346,16 +354,17 @@ IncrementResetCounter: ; 4405 (1:4405)
ld [hl], e
and a
ret
+
.doReset
scf
ret
-Func_4418: ; 4418 (1:4418)
+FillSpriteBuffer0WithAA: ; 4418 (1:4418)
xor a
call SwitchSRAMBankAndLatchClockData
- ld hl, $a000
+ ld hl, S_SPRITEBUFFER0
ld bc, $20
ld a, $aa
call FillMemory
call PrepareRTCDataAndDisableSRAM
- ret \ No newline at end of file
+ ret
diff --git a/engine/titlescreen2.asm b/engine/titlescreen2.asm
index dec37da2..cf4506bc 100755
--- a/engine/titlescreen2.asm
+++ b/engine/titlescreen2.asm
@@ -91,7 +91,7 @@ TitleBallYTable: ; 374fa (d:74fa)
TitleScreenAnimateBallIfStarterOut: ; 37506 (d:7506)
; Animate the TitleBall if a starter just got scrolled out.
- ld a, [wTitleMonSpecies]
+ ld a, [wTitleScreenScene]
cp STARTER1
jr z, .ok
cp STARTER2
diff --git a/engine/unknown_ea3ea.asm b/engine/unknown_ea3ea.asm
index c00785b4..9962649d 100755
--- a/engine/unknown_ea3ea.asm
+++ b/engine/unknown_ea3ea.asm
@@ -19,11 +19,11 @@ Func_ea3ea: ; ea3ea (3a:63ea)
call LoadMonData
ld hl, wTileMap
- lb bc, $10, $12
+ lb bc, 16, 18
call TextBoxBorder
coord hl, 0, 12
- lb bc, $04, $12
+ lb bc, 4, 18
call TextBoxBorder
coord hl, 3, 10
@@ -46,7 +46,7 @@ Func_ea3ea: ; ea3ea (3a:63ea)
ld [wPokeBallAnimData], a
ld [wd0b5], a
ld hl, wPartyMonNicks
- call Func_ea511
+ call .GetNamePointer
coord hl, 8, 2
call PlaceString
@@ -65,16 +65,16 @@ Func_ea3ea: ; ea3ea (3a:63ea)
call PrintNumber
coord hl, 8, 4
- ld de, String_ea52f
+ ld de, .OT
call PlaceString
ld hl, wPartyMonOT
- call Func_ea511
+ call .GetNamePointer
coord hl, 9, 5
call PlaceString
coord hl, 9, 6
- ld de, String_ea533
+ ld de, .IDNo
call PlaceString
coord hl, 13, 6
@@ -83,7 +83,7 @@ Func_ea3ea: ; ea3ea (3a:63ea)
call PrintNumber
coord hl, 9, 8
- ld de, String_ea537
+ ld de, .Stats
ld a, [hFlags_0xFFFA]
set 2, a
ld [hFlags_0xFFFA], a
@@ -115,24 +115,24 @@ Func_ea3ea: ; ea3ea (3a:63ea)
coord hl, 1, 13
ld a, [wLoadedMonMoves]
- call Func_ea51d
+ call .PlaceMoveName
coord hl, 1, 14
ld a, [wLoadedMonMoves + 1]
- call Func_ea51d
+ call .PlaceMoveName
coord hl, 1, 15
ld a, [wLoadedMonMoves + 2]
- call Func_ea51d
+ call .PlaceMoveName
coord hl, 1, 16
ld a, [wLoadedMonMoves + 3]
- call Func_ea51d
+ call .PlaceMoveName
- ld b, $04 ; SET_PAL_STATUS_SCREEN
+ ld b, $4 ; SET_PAL_STATUS_SCREEN
call RunPaletteCommand
- ld a, $01
+ ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a
call Delay3
call GBPalNormal
@@ -140,7 +140,7 @@ Func_ea3ea: ; ea3ea (3a:63ea)
call LoadFlippedFrontSpriteByMonIndex
ret
-Func_ea511: ; ea511 (3a:6511)
+.GetNamePointer: ; ea511 (3a:6511)
ld bc, NAME_LENGTH
ld a, [wWhichPokemon]
call AddNTimes
@@ -148,36 +148,36 @@ Func_ea511: ; ea511 (3a:6511)
ld d, h
ret
-Func_ea51d: ; ea51d (3a:651d)
+.PlaceMoveName: ; ea51d (3a:651d)
and a
- jr z, .asm_e6528
+ jr z, .no_move
ld [wPokeBallAnimData], a
call GetMoveName
- jr .asm_ea52b
+ jr .place_string
-.asm_e6528
- ld de, String_ea554
-.asm_ea52b
+.no_move
+ ld de, .Blank
+.place_string
call PlaceString
ret
; ea52f
-String_ea52f:
+.OT:
db "OT/@"
; ea533
-String_ea533:
+.IDNo:
db $73, "№/@"
; ea537
-String_ea537:
+.Stats:
db "ATTACK"
next "DEFENSE"
next "SPEED"
next "SPECIAL@"
; ea554
-String_ea554: ; ea554 (3a:6554)
+.Blank: ; ea554 (3a:6554)
db "--------------@"
GFX_ea563: ; ea563 (3a:6563)
@@ -195,8 +195,8 @@ Func_ea573: ; ea573 (3a:6573)
call CopyVideoData
ld hl, wOAMBuffer + 32 * 4
- ld a, $08
- ld c, $08
+ ld a, $8
+ ld c, $8
.loop
ld [hl], $10
inc hl
@@ -204,9 +204,9 @@ Func_ea573: ; ea573 (3a:6573)
inc hl
ld [hl], $fe
inc hl
- ld [hl], $00
+ ld [hl], $0
inc hl
- add $08
+ add $8
dec c
jr nz, .loop
ret
@@ -218,7 +218,7 @@ GFX_ea597End:
Func_ea5b7: ; ea5b7 (3a:65b7)
ld hl, wOAMBuffer + 32 * 4 + 2
ld de, 4
- ld a, [$c971]
+ ld a, [wPrinterStatusFlags]
ld c, 8
.asm_ea5c2
sla a
@@ -235,7 +235,7 @@ Func_ea5b7: ; ea5b7 (3a:65b7)
ret
Func_ea5d1: ; ea5d1 (3a:65d1)
- ld a, [wOverworldMap]
+ ld a, [wPrinterSendState]
ld e, a
ld d, 0
ld hl, Jumptable_ea5e0
@@ -269,19 +269,19 @@ Jumptable_ea5e0:
Func_ea606: ; ea606 (3a:6606)
- ld hl, wOverworldMap
+ ld hl, wPrinterSendState
inc [hl]
ret
Func_ea60b: ; ea60b (3a:660b)
- ld hl, wOverworldMap
+ ld hl, wPrinterSendState
dec [hl]
ret
Func_ea610: ; ea610 (3a:6610)
xor a
- ld [$c971], a
- ld hl, wOverworldMap
+ ld [wPrinterStatusFlags], a
+ ld hl, wPrinterSendState
set 7, [hl]
ret
@@ -291,7 +291,7 @@ Func_ea61a: ; ea61a (3a:661a)
Func_ea61e: ; ea61e (3a:661e)
xor a
- ld [wOverworldMap], a
+ ld [wPrinterSendState], a
ret
Func_ea623: ; ea623 (3a:6623)
@@ -299,19 +299,19 @@ Func_ea623: ; ea623 (3a:6623)
ld hl, Data_ea9de
call Func_ea76b
xor a
- ld [$c976], a
- ld [$c977], a
- ld a, [$caf4]
- ld [$c6e9], a
+ ld [wPrinterDataSize], a
+ ld [wPrinterDataSize + 1], a
+ ld a, [wPrinterQueueLength]
+ ld [wPrinterRowIndex], a
call Func_ea606
call Func_ea74c
- ld a, $01
- ld [$cae0], a
+ ld a, $1
+ ld [wPrinterStatusIndicator], a
ret
Func_ea645: ; ea645 (3a:6645)
call Func_ea784
- ld hl, $c6e9
+ ld hl, wPrinterRowIndex
ld a, [hl]
and a
jr z, Func_ea671
@@ -319,24 +319,24 @@ Func_ea645: ; ea645 (3a:6645)
call Func_ea76b
call Func_ea7e9
ld a, $80
- ld [$c976], a
- ld a, $02
- ld [$c977], a
+ ld [wPrinterDataSize], a
+ ld a, $2
+ ld [wPrinterDataSize + 1], a
call Func_ea7a2
call Func_ea606
call Func_ea74c
- ld a, $02
- ld [$cae0], a
+ ld a, $2
+ ld [wPrinterStatusIndicator], a
ret
Func_ea671: ; ea671 (3a:6671)
- ld a, $06
- ld [wOverworldMap], a
+ ld a, $6
+ ld [wPrinterSendState], a
ld hl, Data_ea9f0
call Func_ea76b
xor a
- ld [$c976], a
- ld [$c977], a
+ ld [wPrinterDataSize], a
+ ld [wPrinterDataSize + 1], a
call Func_ea606
call Func_ea74c
ret
@@ -346,22 +346,22 @@ Func_ea68a: ; ea68a (3a:668a)
ld hl, Data_ea9e4
call Func_ea76b
call Func_ea7d2
- ld a, $04
- ld [$c976], a
- ld a, $00
- ld [$c977], a
+ ld a, $4
+ ld [wPrinterDataSize], a
+ ld a, $0
+ ld [wPrinterDataSize + 1], a
call Func_ea7a2
call Func_ea606
call Func_ea74c
- ld a, $03
- ld [$cae0], a
+ ld a, $3
+ ld [wPrinterStatusIndicator], a
ret
Func_ea6af: ; ea6af (3a:66af)
- ld hl, $c973
+ ld hl, wPrinterSerialFrameDelay
inc [hl]
ld a, [hl]
- cp a, $06
+ cp a, $6
ret c
xor a
ld [hl], a
@@ -369,14 +369,14 @@ Func_ea6af: ; ea6af (3a:66af)
ret
Func_ea6bd: ; ea6bd (3a:66bd)
- ld hl, $c973
+ ld hl, wPrinterSerialFrameDelay
inc [hl]
ld a, [hl]
cp 6
ret c
xor a
ld [hl], a
- ld hl, $c6e9
+ ld hl, wPrinterRowIndex
dec [hl]
call Func_ea60b
call Func_ea60b
@@ -385,37 +385,37 @@ Func_ea6bd: ; ea6bd (3a:66bd)
Func_ea6d2: ; ea6d2 (3a:66d2)
call Func_ea742
ret c
- ld a, [$c970]
+ ld a, [wPrinterHandshake]
cp a, $ff
jr nz, .asm_ea6e4
- ld a, [$c971]
+ ld a, [wPrinterStatusFlags]
cp a, $ff
jr z, .asm_ea6fb
.asm_ea6e4
- ld a, [$c970]
+ ld a, [wPrinterHandshake]
cp a, $81
jr nz, .asm_ea6fb
- ld a, [$c971]
- cp a, $00
+ ld a, [wPrinterStatusFlags]
+ cp a, $0
jr nz, .asm_ea6fb
- ld hl, wUnknownSerialFlag_d49a
+ ld hl, wPrinterConnectionOpen
set 1, [hl]
call Func_ea606
ret
.asm_ea6fb
- ld a, $0e
- ld [wOverworldMap], a
+ ld a, $e
+ ld [wPrinterSendState], a
ret
Func_ea701: ; ea701 (3a:6701)
call Func_ea742
ret c
- ld a, [$c971]
+ ld a, [wPrinterStatusFlags]
and $f0
jr nz, .asm_ea71b
- ld a, [$c971]
- and $01
+ ld a, [wPrinterStatusFlags]
+ and $1
jr nz, .asm_ea717
call Func_ea606
ret
@@ -426,13 +426,13 @@ Func_ea701: ; ea701 (3a:6701)
.asm_ea71b
ld a, $11
- ld [wOverworldMap], a
+ ld [wPrinterSendState], a
ret
Func_ea721: ; ea721 (3a:6721)
call Func_ea742
ret c
- ld a, [$c971]
+ ld a, [wPrinterStatusFlags]
and $f3
ret nz
call Func_ea606
@@ -441,18 +441,18 @@ Func_ea721: ; ea721 (3a:6721)
Func_ea72f: ; ea72f (3a:672f)
call Func_ea606
Func_ea732: ; ea732 (3a:6732)
- ld a, [wUnknownSerialFlag_d49b]
+ ld a, [wPrinterOpcode]
and a
ret nz
- ld a, [$c971]
+ ld a, [wPrinterStatusFlags]
and $f0
ret nz
xor a
- ld [wOverworldMap], a
+ ld [wPrinterSendState], a
ret
Func_ea742: ; ea742 (3a:6742)
- ld a, [wUnknownSerialFlag_d49b]
+ ld a, [wPrinterOpcode]
and a
jr nz, .asm_ea74a
and a
@@ -464,17 +464,17 @@ Func_ea742: ; ea742 (3a:6742)
Func_ea74c: ; ea74c (3a:674c)
.asm_ea74c
- ld a, [wUnknownSerialFlag_d49b]
+ ld a, [wPrinterOpcode]
and a
jr nz, .asm_ea74c
- ld a, $01
- ld [wUnknownSerialFlag_d49b], a
+ ld a, $1
+ ld [wPrinterOpcode], a
xor a
- ld [$c974], a
- ld [$c975], a
+ ld [wPrinterSendByteOffset], a
+ ld [wPrinterSendByteOffset + 1], a
ld a, $88
ld [rSB], a
- ld a, $01
+ ld a, $1
ld [rSC], a
ld a, $81
ld [rSC], a
@@ -482,52 +482,52 @@ Func_ea74c: ; ea74c (3a:674c)
Func_ea76b: ; ea76b (3a:676b)
ld a, [hli]
- ld [$c6ea], a
+ ld [wPrinterDataHeader], a
ld a, [hli]
- ld [$c6eb], a
+ ld [wPrinterDataHeader + 1], a
ld a, [hli]
- ld [$c6ec], a
+ ld [wPrinterDataHeader + 2], a
ld a, [hli]
- ld [$c6ed], a
+ ld [wPrinterDataHeader + 3], a
ld a, [hli]
- ld [$c6ee], a
+ ld [wPrinterDataHeader + 4], a
ld a, [hl]
- ld [$c6ef], a
+ ld [wPrinterDataHeader + 5], a
ret
Func_ea784: ; ea784 (3a:6784)
xor a
- ld hl, $c6ea
+ ld hl, wPrinterDataHeader
ld [hli], a
ld [hli], a
ld [hli], a
ld [hl], a
- ld hl, $c6ee
+ ld hl, wPrinterDataHeader + 4
ld [hli], a
ld [hl], a
xor a
- ld [$c976], a
- ld [$c977], a
- ld hl, $c6f0
+ ld [wPrinterDataSize], a
+ ld [wPrinterDataSize + 1], a
+ ld hl, wPrinterSendDataSource
ld bc, $280
call FillMemory
ret
Func_ea7a2: ; ea7a2 (3a:67a2)
- ld hl, $0000
- ld bc, $0004
- ld de, $c6ea
+ ld hl, $0
+ ld bc, $4
+ ld de, wPrinterDataHeader
call Func_ea7c5
- ld a, [$c976]
+ ld a, [wPrinterDataSize]
ld c, a
- ld a, [$c977]
+ ld a, [wPrinterDataSize + 1]
ld b, a
- ld de, $c6f0
+ ld de, wPrinterSendDataSource
call Func_ea7c5
ld a, l
- ld [$c6ee], a
+ ld [wPrinterDataHeader + 4], a
ld a, h
- ld [$c6ef], a
+ ld [wPrinterDataHeader + 5], a
ret
Func_ea7c5: ; ea7c5 (3a:67c5)
@@ -546,36 +546,36 @@ Func_ea7c5: ; ea7c5 (3a:67c5)
ret
Func_ea7d2: ; ea7d2 (3a:67d2)
- ld a, $01
- ld [$c6f0], a
- ld a, [$cae2]
- ld [$c6f1], a
+ ld a, $1
+ ld [wPrinterSendDataSource], a
+ ld a, [wcae2]
+ ld [wPrinterStatusReceived], a
ld a, $e4
- ld [$c6f2], a
- ld a, [$cae3]
- ld [$c6f3], a
+ ld [wc6f2], a
+ ld a, [wPrinterSettingsTempCopy]
+ ld [wc6f3], a
ret
Func_ea7e9: ; ea7e9 (3a:67e9)
- ld a, [$c6e9]
+ ld a, [wPrinterRowIndex]
ld b, a
- ld a, [$caf4]
+ ld a, [wPrinterQueueLength]
sub b
- ld hl, $c978
- ld de, $0028
-.asm_ea7f7
+ ld hl, wPrinterTileBuffer
+ ld de, $28
+.get_start_addr
and a
- jr z, .asm_ea7fe
+ jr z, .start_working
add hl, de
dec a
- jr .asm_ea7f7
+ jr .get_start_addr
-.asm_ea7fe
+.start_working
ld e, l
ld d, h
- ld hl, $c6f0
+ ld hl, wPrinterSendDataSource
ld c, $28
-.asm_ea805
+.prep_loop
ld a, [de]
inc de
push bc
@@ -586,47 +586,47 @@ Func_ea7e9: ; ea7e9 (3a:67e9)
and $f0
ld e, a
ld a, d
- and $0f
+ and $f
ld d, a
- and $08
+ and $8
ld a, d
- jr nz, .asm_ea81d
+ jr nz, .vtiles1
or $90
- jr .asm_ea81f
+ jr .got_vram_address
-.asm_ea81d
+.vtiles1
or $80
-.asm_ea81f
+.got_vram_address
ld d, a
- lb bc, $3a, $01
+ lb bc, BANK(Func_ea7e9), $1
call CopyVideoData
pop hl
- ld de, $0010
+ ld de, $10
add hl, de
pop de
pop bc
dec c
- jr nz, .asm_ea805
- call Func_ea834
+ jr nz, .prep_loop
+ call .UnnecessaryCall
ret
-Func_ea834: ; ea834 (3a:6834)
- ld hl, $cbdc
- ld bc, $0020
+.UnnecessaryCall: ; ea834 (3a:6834)
+ ld hl, wcbdc
+ ld bc, $20
xor a
call FillMemory
- ld hl, $c300
+ ld hl, wOAMBuffer
ld c, $28
-.asm_ea843
+.master_loop
push bc
push hl
- call Func_ea860
- jr nc, .asm_ea856
- call Func_ea886
- call Func_ea8a1
- call Func_ea902
- call Func_ea999
-.asm_ea856
+ call .AreWePrintingThisSegment
+ jr nc, .skip_segment
+ call .GetVRAMAddress
+ call .GetOAMFlags
+ call .ApplyObjectPalettes
+ call .PlaceObject
+.skip_segment
pop hl
inc hl
inc hl
@@ -634,44 +634,44 @@ Func_ea834: ; ea834 (3a:6834)
inc hl
pop bc
dec c
- jr nz, .asm_ea843
+ jr nz, .master_loop
ret
-Func_ea860: ; ea860 (3a:6860)
- ld a, [$c6e9]
+.AreWePrintingThisSegment: ; ea860 (3a:6860)
+ ld a, [wPrinterRowIndex]
ld b, a
- ld a, [$caf4]
+ ld a, [wPrinterQueueLength]
sub b
ld c, a
ld b, $10
-.asm_ea86b
+.add_n_times
ld a, c
and a
- jr z, .asm_ea876
+ jr z, .check
ld a, b
add $10
ld b, a
dec c
- jr .asm_ea86b
+ jr .add_n_times
-.asm_ea876
+.check
ld a, b
ld e, a
add $10
ld d, a
ld a, [hl]
cp e
- jr c, .asm_ea884
+ jr c, .not_printing
cp d
- jr nc, .asm_ea884
+ jr nc, .not_printing
scf
ret
-.asm_ea884
+.not_printing
and a
ret
-Func_ea886: ; ea886 (3a:6886)
+.GetVRAMAddress: ; ea886 (3a:6886)
push hl
inc hl
inc hl
@@ -681,81 +681,81 @@ Func_ea886: ; ea886 (3a:6886)
and $f0
ld e, a
ld a, d
- and $0f
+ and $f
or $80
ld d, a
- ld hl, $cbdc
- lb bc, $3a, $01
+ ld hl, wcbdc
+ lb bc, BANK(.GetVRAMAddress), $1
call CopyVideoData
pop hl
ret
-Func_ea8a1: ; ea8a1 (3a:68a1)
+.GetOAMFlags: ; ea8a1 (3a:68a1)
push hl
inc hl
inc hl
inc hl
ld a, [hl]
- call Func_ea8ab
+ call .DoBitOperation
pop hl
ret
-Func_ea8ab: ; ea8ab (3a:68ab)
+.DoBitOperation: ; ea8ab (3a:68ab)
and $60
swap a
ld e, a
ld d, 0
- ld hl, Jumptable_ea8ba
+ ld hl, .Jumptable
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp [hl]
-Jumptable_ea8ba: ; ea8ba (3a:68ba)
- dw Func_ea8c2
- dw Func_ea8c3
- dw Func_ea8c7
- dw Func_ea8cb
+.Jumptable: ; ea8ba (3a:68ba)
+ dw .nop
+ dw .one
+ dw .two
+ dw .both
-Func_ea8c2: ; ea8c2 (3a:68c2)
+.nop: ; ea8c2 (3a:68c2)
ret
-Func_ea8c3: ; ea8c3 (3a:68c3)
- call Func_ea8d2
+.one: ; ea8c3 (3a:68c3)
+ call .Invert
ret
-Func_ea8c7: ; ea8c7 (3a:68c7)
- call Func_ea8e8
+.two: ; ea8c7 (3a:68c7)
+ call .Swap
ret
-Func_ea8cb: ; ea8cb (3a:68cb)
- call Func_ea8d2
- call Func_ea8e8
+.both: ; ea8cb (3a:68cb)
+ call .Invert
+ call .Swap
ret
-Func_ea8d2: ; ea8d2 (3a:68d2)
- ld hl, $cbdc
+.Invert: ; ea8d2 (3a:68d2)
+ ld hl, wcbdc
ld c, 16
-.asm_ea8d7
+.byte_loop
ld d, [hl]
ld a, 0
ld b, 8
-.asm_ea8dc
+.bit_loop
sla d
rr a
dec b
- jr nz, .asm_ea8dc
+ jr nz, .bit_loop
ld [hli], a
dec c
- jr nz, .asm_ea8d7
+ jr nz, .byte_loop
ret
-Func_ea8e8: ; ea8e8 (3a:68e8)
- ld hl, $cbdc
- ld de, $cbea
- ld c, $04
-.asm_ea8f0
+.Swap: ; ea8e8 (3a:68e8)
+ ld hl, wcbdc
+ ld de, wcbea
+ ld c, $4
+.swap_loop
ld b, [hl]
ld a, [de]
ld [hli], a
@@ -771,19 +771,19 @@ Func_ea8e8: ; ea8e8 (3a:68e8)
dec de
dec de
dec c
- jr nz, .asm_ea8f0
+ jr nz, .swap_loop
ret
-Func_ea902: ; ea902 (3a:6902)
+.ApplyObjectPalettes: ; ea902 (3a:6902)
push hl
- ld hl, $cbdc
- ld de, $cbec
- ld a, $08
-.asm_ea90b
+ ld hl, wcbdc
+ ld de, wcbec
+ ld a, 8
+.loop1
push af
- ld bc, $0000
- ld a, $08
-.asm_ea911
+ ld bc, $0
+ ld a, 8
+.loop2
push af
xor a
rlc [hl]
@@ -794,12 +794,12 @@ Func_ea902: ; ea902 (3a:6902)
dec hl
push hl
push de
- call Func_ea936
+ call .ExpandPalettesToBC
pop de
pop hl
pop af
dec a
- jr nz, .asm_ea911
+ jr nz, .loop2
inc hl
inc hl
ld a, b
@@ -810,19 +810,19 @@ Func_ea902: ; ea902 (3a:6902)
inc de
pop af
dec a
- jr nz, .asm_ea90b
+ jr nz, .loop1
pop hl
ret
-Func_ea936 ; ea936 (3a:6936)
- call Func_ea93d
- call Func_ea96d
+.ExpandPalettesToBC: ; ea936 (3a:6936)
+ call .GetPaletteFunction
+ call .ApplyPaletteFunction
ret
-Func_ea93d: ; ea93d (3a:693d)
+.GetPaletteFunction: ; ea93d (3a:693d)
ld e, a
ld d, 0
- ld hl, Jumptable_ea949
+ ld hl, .PalJumptable
add hl, de
add hl, de
ld a, [hli]
@@ -830,41 +830,41 @@ Func_ea93d: ; ea93d (3a:693d)
ld l, a
jp [hl]
-Jumptable_ea949: ; ea949 (3a:6949)
- dw Func_ea951
- dw Func_ea95f
- dw Func_ea956
- dw Func_ea966
+.PalJumptable: ; ea949 (3a:6949)
+ dw .Pal0
+ dw .Pal1
+ dw .Pal2
+ dw .Pal3
-Func_ea951: ; ea951 (3a:6951)
+.Pal0: ; ea951 (3a:6951)
ld a, [rOBP0]
- and $03
+ and $3
ret
-Func_ea956: ; ea956 (3a:6956)
+.Pal2: ; ea956 (3a:6956)
ld a, [rOBP0]
- and $0c
+ and $c
srl a
srl a
ret
-Func_ea95f: ; ea95f (3a:695f)
+.Pal1: ; ea95f (3a:695f)
ld a, [rOBP0]
and $30
swap a
ret
-Func_ea966: ; ea966 (3a:6966)
+.Pal3: ; ea966 (3a:6966)
ld a, [rOBP0]
and $c0
rlca
rlca
ret
-Func_ea96d: ; ea96d (3a:696d)
+.ApplyPaletteFunction: ; ea96d (3a:696d)
ld e, a
ld d, 0
- ld hl, Jumptable_ea979
+ ld hl, .PalFunJumptable
add hl, de
add hl, de
ld a, [hli]
@@ -872,62 +872,62 @@ Func_ea96d: ; ea96d (3a:696d)
ld l, a
jp [hl]
-Jumptable_ea979: ; ea979 (3a:6979)
- dw Func_ea981
- dw Func_ea986
- dw Func_ea98c
- dw Func_ea992
+.PalFunJumptable: ; ea979 (3a:6979)
+ dw .zero_zero
+ dw .one_zero
+ dw .zero_one
+ dw .one_one
-Func_ea981: ; ea981 (3a:6981)
+.zero_zero: ; ea981 (3a:6981)
sla b
sla c
ret
-Func_ea986: ; ea986 (3a:6986)
+.one_zero: ; ea986 (3a:6986)
scf
rl b
sla c
ret
-Func_ea98c: ; ea98c (3a:698c)
+.zero_one: ; ea98c (3a:698c)
sla b
scf
rl c
ret
-Func_ea992: ; ea992 (3a:6992)
+.one_one: ; ea992 (3a:6992)
scf
rl b
scf
rl c
ret
-Func_ea999: ; ea999 (3a:6999)
+.PlaceObject: ; ea999 (3a:6999)
push hl
ld a, [hli]
ld c, [hl]
- and $08
- jr nz, .asm_ea9a5
- ld hl, $c6f0
- jr .asm_ea9a8
-
-.asm_ea9a5
- ld hl, $c830
-.asm_ea9a8
- ld b, $00
+ and $8
+ jr nz, .use_wc830
+ ld hl, wPrinterSendDataSource
+ jr .got_data_source
+
+.use_wc830
+ ld hl, wc830
+.got_data_source
+ ld b, $0
ld a, c
- and $f8
- sub $08
+ and %11111000
+ sub $8
ld c, a
sla c
rl b
add hl, bc
ld e, l
ld d, h
- ld hl, $cbec
- ld c, $08
-.asm_ea9bc
- call Func_ea9d0
+ ld hl, wcbec
+ ld c, $8
+.coord_copy_loop
+ call .GetBitMask
ld a, [de]
and b
or [hl]
@@ -941,14 +941,14 @@ Func_ea999: ; ea999 (3a:6999)
inc hl
inc de
dec c
- jr nz, .asm_ea9bc
+ jr nz, .coord_copy_loop
pop hl
ret
-Func_ea9d0: ; ea9d0 (3a:69d0)
+.GetBitMask: ; ea9d0 (3a:69d0)
push hl
push de
- ld de, $fff0
+ ld de, -$10
add hl, de
ld a, [hli]
or [hl]
@@ -959,14 +959,20 @@ Func_ea9d0: ; ea9d0 (3a:69d0)
ret
Data_ea9de: ; ea9de
- db $01, $00, $00, $00, $01, $00
+ db 1, 0, $00, 0
+ dw 1
Data_ea9e4: ; ea9e4
- db $02, $00, $04, $00, $00, $00
+ db 2, 0, $04, 0
+ dw 0
Data_ea9ea: ; ea9ea
- db $04, $00, $80, $02, $00, $00
+ db 4, 0, $80, 2
+ dw 0
Data_ea9f0: ; ea9f0
- db $04, $00, $00, $00, $04, $00
+ db 4, 0, $00, 0
+ dw 4
Data_ea9f6: ; ea9f6
- db $08, $00, $00, $00, $08, $00
+ db 8, 0, $00, 0
+ dw 8
Data_ea9fc: ; ea9fc
- db $0f, $00, $00, $00, $0f, $00
+ db 15, 0, $00, 0
+ dw 15
diff --git a/engine/yellow_intro.asm b/engine/yellow_intro.asm
new file mode 100755
index 00000000..5aad4d33
--- /dev/null
+++ b/engine/yellow_intro.asm
@@ -0,0 +1,1081 @@
+PlayIntroScene:
+ ld a, [rIE]
+ push af
+ xor a
+ ld [rIF], a
+ ld a, $f
+ ld [rIE], a
+ ld a, $8
+ ld [rSTAT], a
+ call InitYellowIntroGFXAndMusic
+ call DelayFrame
+.loop
+ ld a, [wYellowIntroCurrentScene]
+ bit 7, a
+ jr nz, .go_to_title_screen
+ call JoypadLowSensitivity
+ ld a, [hJoyPressed]
+ and A_BUTTON | B_BUTTON | START
+ jr nz, .go_to_title_screen
+ call Func_f98fc
+ ld a, $0
+ ld [wCurrentAnimatedObjectOAMBufferOffset], a
+ call RunObjectAnimations
+ ld a, [wYellowIntroCurrentScene]
+ cp $7
+ call z, Func_f98a2
+ cp $b
+ call z, Func_f98cb
+ call DelayFrame
+ jr .loop
+
+.go_to_title_screen
+ call YellowIntro_BlankPalettes
+ xor a
+ ld [hLCDCPointer], a
+ call DelayFrame
+ xor a
+ ld [rIF], a
+ pop af
+ ld [rIE], a
+ ld a, $90
+ ld [hWY], a
+ call ClearObjectAnimationBuffers
+ ld hl, wTileMap
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ xor a
+ call Bank3E_FillMemory
+ call YellowIntro_BlankOAMBuffer
+ ld a, $1
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call DelayFrame
+ call DelayFrame
+ call DelayFrame
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ ret
+
+Func_f98a2:
+ ld a, [wOAMBuffer + 8 * 4 + 3]
+ or $1
+ ld [wOAMBuffer + 8 * 4 + 3], a
+ ld a, [wOAMBuffer + 14 * 4 + 3]
+ or $1
+ ld [wOAMBuffer + 14 * 4 + 3], a
+ ld a, [wOAMBuffer + 16 * 4 + 3]
+ or $1
+ ld [wOAMBuffer + 16 * 4 + 3], a
+ ld a, [wOAMBuffer + 18 * 4 + 3]
+ or $1
+ ld [wOAMBuffer + 18 * 4 + 3], a
+ ld a, [wOAMBuffer + 19 * 4 + 3]
+ or $1
+ ld [wOAMBuffer + 19 * 4 + 3], a
+ ret
+
+Func_f98cb:
+ ld a, [wOAMBuffer + 18 * 4 + 3]
+ or $1
+ ld [wOAMBuffer + 18 * 4 + 3], a
+ ld a, [wOAMBuffer + 19 * 4 + 3]
+ or $1
+ ld [wOAMBuffer + 19 * 4 + 3], a
+ ld a, [wOAMBuffer + 20 * 4 + 3]
+ or $1
+ ld [wOAMBuffer + 20 * 4 + 3], a
+ ld a, [wOAMBuffer + 25 * 4 + 3]
+ or $1
+ ld [wOAMBuffer + 25 * 4 + 3], a
+ ld a, [wOAMBuffer + 26 * 4 + 3]
+ or $1
+ ld [wOAMBuffer + 26 * 4 + 3], a
+ ld a, [wOAMBuffer + 28 * 4 + 3]
+ or $1
+ ld [wOAMBuffer + 28 * 4 + 3], a
+ ret
+
+Func_f98fc:
+ ld a, [wYellowIntroCurrentScene]
+ ld hl, Jumptable_f9906
+ call Func_fa06e
+ jp [hl]
+
+Jumptable_f9906:
+ dw YellowIntroScene0 ; running pika 1
+ dw YellowIntroScene1 ; wait last
+ dw YellowIntroScene2 ; pikachu kick
+ dw YellowIntroScene3 ; wait last
+ dw YellowIntroScene4 ; running pika 2
+ dw YellowIntroScene5 ; wait last
+ dw YellowIntroScene6 ; surfing pika
+ dw YellowIntroScene7 ; wait last
+ dw YellowIntroScene8 ; running pika 3
+ dw YellowIntroScene9 ; wait last
+ dw YellowIntroScene10 ; flying pika
+ dw YellowIntroScene11 ; wait last
+ dw YellowIntroScene12 ; pika close up
+ dw YellowIntroScene13 ; wait last
+ dw YellowIntroScene14 ; pika thunderbolt
+ dw YellowIntroScene15 ; wait last
+ dw YellowIntroScene16 ; fade to white
+ dw YellowIntroScene17 ; wait and quit
+
+YellowIntro_NextScene:
+ ld hl, wYellowIntroCurrentScene
+ inc [hl]
+ ret
+
+YellowIntroScene0:
+ xor a
+ ld [hLCDCPointer], a
+ lb de, $58, $58
+ ld a, $1
+ call YellowIntro_SpawnAnimatedObjectAndSavePointer
+ xor a
+ ld [hSCX], a
+ ld [hSCY], a
+ ld a, $90
+ ld [hWY], a
+ ld a, $e4
+ ld [rBGP], a
+ ld [rOBP0], a
+ ld a, $c4
+ ld [rOBP1], a
+ call UpdateGBCPal_BGP
+ call UpdateGBCPal_OBP0
+ call UpdateGBCPal_OBP1
+ ld a, 130
+ ld [wYellowIntroSceneTimer], a
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroScene1:
+ call YellowIntro_CheckFrameTimerDecrement
+ ret nc
+ call YellowIntro_MaskCurrentAnimatedObjectStruct
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroScene2:
+ call YellowIntro_BlankPalsDelay2AndDisableLCD
+ ld c, $8
+ call UpdateMusicCTimes
+ xor a
+ ld [hLCDCPointer], a
+ ld hl, vBGMap0
+ ld bc, $400
+ xor a
+ call Bank3E_FillMemory
+ call YellowIntroScene2_PlaceGraphic
+ lb de, $58, $b8 ; overloaded
+ ld a, $4 ; overloaded
+ call LoadYellowIntroFlyingSpeedBars
+ ld a, $1
+ call Func_f9e9a
+ call YellowIntro_SetTimerFor128Frames
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroScene2_PlaceGraphic:
+ ld hl, $98d4 ; (20, 6)
+ ld de, $20
+ ld b, $6
+ ld a, $90
+.row
+ ld c, $6
+ push af
+ push hl
+.col
+ ld [hli], a
+ inc a
+ dec c
+ jr nz, .col
+ pop hl
+ add hl, de
+ pop af
+ add $10
+ dec b
+ jr nz, .row
+ ld a, [hGBC]
+ and a
+ jr z, .dmg_sgb
+ ; We can actually set palettes!
+ ld hl, $98d4 ; (20, 6)
+ ld de, $20
+ ld b, $6
+ ld a, $1
+ ld [rVBK], a
+.attr_row
+ ld c, $6
+ push hl
+.attr_col
+ ld [hli], a
+ dec c
+ jr nz, .attr_col
+ pop hl
+ add hl, de
+ dec b
+ jr nz, .attr_row
+ xor a
+ ld [rVBK], a
+.dmg_sgb
+ ret
+
+LoadYellowIntroFlyingSpeedBars:
+ ld hl, YellowIntroFlyingSpeedBarData
+ ld a, $8
+.loop
+; Spawn object $8 at indicated coordinates with indicated speeds
+ push af
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc hl
+ ld a, [hli]
+ push hl
+ push af
+ ld a, $8
+ call SpawnAnimatedObject
+ pop af
+ ld hl, $b
+ add hl, bc
+ ld [hl], a
+ pop hl
+ pop af
+ dec a
+ jr nz, .loop
+ ret
+
+YellowIntroFlyingSpeedBarData:
+ ; y, x, speed
+ db $d0, $20, $02
+ db $f0, $30, $04
+ db $d0, $40, $06
+ db $c0, $50, $08
+ db $e0, $60, $08
+ db $c0, $70, $06
+ db $e0, $80, $04
+ db $f0, $90, $02
+
+YellowIntroScene3:
+ call YellowIntro_CheckFrameTimerDecrement
+ jr c, .expired
+ ld a, [hSCX]
+ cp $68
+ ret z
+ add $4
+ ld [hSCX], a
+ ret
+
+.expired
+ call MaskAllAnimatedObjectStructs
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroScene4:
+ call YellowIntro_BlankPalsDelay2AndDisableLCD
+ ld c, $5
+ call UpdateMusicCTimes
+ ld a, [hGBC]
+ and a
+ jr z, .dmg_sgb
+ ; We can actually set palettes!
+ ld hl, $98d4
+ ld de, $20
+ ld b, $6
+ ld a, $1
+ ld [rVBK], a
+ xor a
+.attr_row
+ ld c, $6
+ push hl
+.attr_col
+ ld [hli], a
+ dec c
+ jr nz, .attr_col
+ pop hl
+ add hl, de
+ dec b
+ jr nz, .attr_row
+ xor a
+ ld [rVBK], a
+.dmg_sgb
+ xor a
+ ld [hLCDCPointer], a
+ call Func_f9e5f
+ lb de, $58, $58
+ ld a, $2
+ call YellowIntro_SpawnAnimatedObjectAndSavePointer
+ xor a
+ call Func_f9e9a
+ call YellowIntro_SetTimerFor128Frames
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroScene5:
+ call YellowIntro_CheckFrameTimerDecrement
+ ret nc
+ call YellowIntro_MaskCurrentAnimatedObjectStruct
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroScene6:
+ call YellowIntro_BlankPalsDelay2AndDisableLCD
+ ld c, $5
+ call UpdateMusicCTimes
+ ld a, $42
+ ld [hLCDCPointer], a
+ call YellowIntro_Copy8BitSineWave
+ ld hl, vBGMap0
+ ld bc, $60
+ xor a
+ call Bank3E_FillMemory
+ ld hl, $9860
+ ld c, $10
+ ld a, $20
+.asm_f9a8b
+ ld [hli], a
+ inc a
+ ld [hli], a
+ dec a
+ dec c
+ jr nz, .asm_f9a8b
+ ld hl, $9880
+ ld bc, $300
+ ld a, $10
+ call Bank3E_FillMemory
+ lb de, $40, $f8
+ ld a, $5
+ call YellowIntro_SpawnAnimatedObjectAndSavePointer
+ ld a, $1
+ call Func_f9e9a
+ call YellowIntro_SetTimerFor88Frames
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroScene7:
+ call YellowIntro_CheckFrameTimerDecrement
+ jr c, .expired
+ ld hl, hSCX
+ inc [hl]
+ inc [hl]
+ ld hl, wYellowIntroSurfingPikaSineWaveBuffer
+ ld de, wYellowIntroSurfingPikaSineWaveBuffer + 1
+ ld a, [hl]
+ push af
+ ld c, $ff
+.shift_loop
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .shift_loop
+ pop af
+ ld [hl], a
+ call Request7TileTransferFromC810ToC710
+ ret
+
+.expired
+ call YellowIntro_MaskCurrentAnimatedObjectStruct
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroScene8:
+ call YellowIntro_BlankPalsDelay2AndDisableLCD
+ ld c, $5
+ call UpdateMusicCTimes
+ xor a
+ ld [hLCDCPointer], a
+ call Func_f9e5f
+ lb de, $58, $58
+ ld a, $3
+ call YellowIntro_SpawnAnimatedObjectAndSavePointer
+ xor a
+ call Func_f9e9a
+ call YellowIntro_SetTimerFor128Frames
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroScene9:
+ call YellowIntro_CheckFrameTimerDecrement
+ ret nc
+ call YellowIntro_MaskCurrentAnimatedObjectStruct
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroScene10:
+ call YellowIntro_BlankPalsDelay2AndDisableLCD
+ ld c, $5
+ call UpdateMusicCTimes
+ xor a
+ ld [hLCDCPointer], a
+ ld hl, vBGMap0
+ ld bc, $400
+ xor a
+ call Bank3E_FillMemory
+ ld hl, vBGMap0
+ ld bc, $100
+ ld a, $2
+ call Bank3E_FillMemory
+ ld hl, $9900
+ ld de, Unkn_f9b6e
+ lb bc, 6, 20
+ call .FillBGMapBox
+ ld hl, $988c
+ ld de, Unkn_f9be6
+ lb bc, 3, 4
+ call .FillBGMapBox
+ ld hl, $98e3
+ ld de, Unkn_f9bf2
+ lb bc, 2, 2
+ call .FillBGMapBox
+ lb de, $98, $58
+ ld a, $6
+ call YellowIntro_SpawnAnimatedObjectAndSavePointer
+ ld a, $1
+ call Func_f9e9a
+ call YellowIntro_SetTimerFor128Frames
+ call YellowIntro_NextScene
+ ret
+
+.FillBGMapBox:
+.fill_row
+ push bc
+ push hl
+.fill_col
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .fill_col
+ pop hl
+ ld bc, $20
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .fill_row
+ ret
+
+Unkn_f9b6e: INCBIN "gfx/unknown_f9b6e.map"
+Unkn_f9be6: INCBIN "gfx/unknown_f9be6.map"
+Unkn_f9bf2: INCBIN "gfx/unknown_f9bf2.map"
+
+YellowIntroScene11:
+ call YellowIntro_CheckFrameTimerDecrement
+ jr c, .expired
+ ld a, [wYellowIntroSceneTimer]
+ and $7
+ ret nz
+ ld a, [wYellowIntroSceneTimer]
+ and $8
+ sla a
+ sla a
+ sla a
+ ld e, a
+ ld d, $0
+ ld hl, YellowIntroCloudGFX1
+ add hl, de
+ ld a, l
+ ld [H_VBCOPYSRC], a
+ ld a, h
+ ld [H_VBCOPYSRC + 1], a
+ xor a
+ ld [H_VBCOPYDEST], a
+ ld a, $96
+ ld [H_VBCOPYDEST + 1], a
+ ld a, $4
+ ld [H_VBCOPYSIZE], a
+ ret
+
+.expired
+ call YellowIntro_MaskCurrentAnimatedObjectStruct
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroCloudGFX1: INCBIN "gfx/unknown_f9c2c.2bpp"
+YellowIntroCloudGFX2: INCBIN "gfx/unknown_f9c6c.2bpp" ; indirectly referenced
+
+YellowIntroScene12:
+ call YellowIntro_BlankPalsDelay2AndDisableLCD
+ ld c, $5
+ call UpdateMusicCTimes
+ xor a
+ ld [hLCDCPointer], a
+ ld hl, vBGMap0
+ ld bc, $80
+ ld a, $1
+ call Bank3E_FillMemory
+ ld hl, $9880
+ ld bc, $140
+ xor a
+ call Bank3E_FillMemory
+ ld hl, $99c0
+ ld bc, $80
+ ld a, $1
+ call Bank3E_FillMemory
+
+ ; paste 8x12 graphic into vBGMap0 at (5, 6) starting at tile 4, skipping 4 vtiles at the end of each row
+ ld hl, $98c5
+ ld de, $20
+ ld a, $4
+ ld b, 8
+.row
+ ld c, 12
+ push hl
+.col
+ ld [hli], a
+ inc a
+ dec c
+ jr nz, .col
+ pop hl
+ add hl, de
+ add $4
+ dec b
+ jr nz, .row
+
+ ld hl, $98c4 ; (4, 6)
+ ld [hl], $3
+ ld hl, $98e4 ; (4, 7)
+ ld [hl], $74
+ ld hl, $99a5 ; (5, 5)
+ ld [hl], $0
+ lb de, $60, $58
+ ld a, $9
+ call YellowIntro_SpawnAnimatedObjectAndSavePointer
+ xor a
+ call Func_f9e9a
+ call YellowIntro_SetTimerFor128Frames
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroScene13:
+ call YellowIntro_CheckFrameTimerDecrement
+ ret nc
+ lb de, $68, $58
+ ld a, $a
+ call SpawnAnimatedObject
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroScene14:
+ ld de, YellowIntroPalSequence_f9dd6
+ call YellowIntro_LoadDMGPalAndIncrementCounter
+ jr c, .expired
+ ld [rBGP], a
+ ld [rOBP0], a
+ and $f0
+ ld [rOBP1], a
+ call UpdateGBCPal_BGP
+ call UpdateGBCPal_OBP0
+ call UpdateGBCPal_OBP1
+ ret
+
+.expired
+ call MaskAllAnimatedObjectStructs
+ call YellowIntro_BlankOAMBuffer
+ ld hl, wTileMap
+ ld bc, $50
+ ld a, $1
+ call Bank3E_FillMemory
+ coord hl, 0, 4
+ ld bc, CopyVideoDataAlternate
+ xor a
+ call Bank3E_FillMemory
+ coord hl, 0, 14
+ ld bc, $50
+ ld a, $1
+ call Bank3E_FillMemory
+ ld a, $1
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call DelayFrame
+ call DelayFrame
+ call DelayFrame
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ ld a, $e4
+ ld [rOBP0], a
+ ld [rBGP], a
+ call UpdateGBCPal_BGP
+ call UpdateGBCPal_OBP0
+ lb de, $58, $58
+ ld a, $7
+ call YellowIntro_SpawnAnimatedObjectAndSavePointer
+ call YellowIntro_NextScene
+ ld a, $28
+ ld [wYellowIntroSceneTimer], a
+ ret
+
+YellowIntroScene15:
+ call YellowIntro_CheckFrameTimerDecrement
+ jr c, .expired
+ ld a, [wYellowIntroSceneTimer]
+ and $3
+ ret nz
+ ld a, [rOBP0]
+ xor $ff
+ ld [rOBP0], a
+ ld a, [rBGP]
+ xor $3
+ ld [rBGP], a
+ call UpdateGBCPal_BGP
+ call UpdateGBCPal_OBP0
+ ret
+
+.expired
+ xor a
+ ld [hLCDCPointer], a
+ ld a, $e4
+ ld [rBGP], a
+ ld [rOBP0], a
+ call UpdateGBCPal_BGP
+ call UpdateGBCPal_OBP0
+ call YellowIntro_NextScene
+YellowIntroScene16:
+ ld de, YellowIntroPalSequence_f9e0a
+ call YellowIntro_LoadDMGPalAndIncrementCounter
+ jr c, .expired
+ ld [rOBP0], a
+ ld [rBGP], a
+ call UpdateGBCPal_BGP
+ call UpdateGBCPal_OBP0
+ ret
+
+.expired
+ call YellowIntro_NextScene
+ ret
+
+YellowIntroPalSequence_f9dd6:
+ db $e4, $c0, $c0, $e4
+ db $e4, $c0, $c0, $e4
+ db $e4, $c0, $c0, $e4
+ db $e4, $c0, $c0, $e4
+ db $e4, $c0, $c0, $e4
+ db $e4, $c0, $c0, $e4
+ db $e4, $c0, $c0, $e4
+ db $e4, $c0, $c0, $e4
+ db $e4, $c0, $c0, $e4
+ db $e4, $c0, $c0, $e4
+ db $e4, $c0, $c0, $e4
+ db $e4, $c0, $c0, $e4
+ db $e4, $c0, $c0, $ff
+
+YellowIntroPalSequence_f9e0a:
+ db $e4, $90, $90, $40
+ db $40, $00, $00, $ff
+
+YellowIntroScene17:
+ ld c, 64
+ call DelayFrames
+ ld hl, wYellowIntroCurrentScene
+ set 7, [hl]
+ ret
+
+YellowIntro_SpawnAnimatedObjectAndSavePointer:
+ call SpawnAnimatedObject
+ ld a, c
+ ld [wYellowIntroAnimatedObjectStructPointer], a
+ ld a, b
+ ld [wYellowIntroAnimatedObjectStructPointer + 1], a
+ ret
+
+YellowIntro_MaskCurrentAnimatedObjectStruct:
+ ld a, [wYellowIntroAnimatedObjectStructPointer]
+ ld c, a
+ ld a, [wYellowIntroAnimatedObjectStructPointer + 1]
+ ld b, a
+ call MaskCurrentAnimatedObjectStruct
+ ret
+
+YellowIntro_SetTimerFor128Frames:
+ ld a, 128
+ ld [wYellowIntroSceneTimer], a
+ ret
+
+YellowIntro_SetTimerFor88Frames:
+ ld a, 88
+ ld [wYellowIntroSceneTimer], a
+ ret
+
+YellowIntro_CheckFrameTimerDecrement:
+ ld hl, wYellowIntroSceneTimer
+ ld a, [hl]
+ and a
+ jr z, .asm_f9e4b
+ dec [hl]
+ and a
+ ret
+
+.asm_f9e4b
+ scf
+ ret
+
+YellowIntro_LoadDMGPalAndIncrementCounter:
+ ld hl, wYellowIntroSceneTimer
+ ld a, [hl]
+ inc [hl]
+ ld l, a
+ ld h, $0
+ add hl, de
+ ld a, [hl]
+ cp $ff
+ jr z, .asm_f9e5d
+ and a
+ ret
+
+.asm_f9e5d
+ scf
+ ret
+
+Func_f9e5f:
+ ld hl, vBGMap0
+ ld bc, $80
+ ld a, $1
+ call Bank3E_FillMemory
+ ld hl, $9880
+ ld bc, $140
+ xor a
+ call Bank3E_FillMemory
+ ld hl, $99c0
+ ld bc, $80
+ ld a, $1
+ call Bank3E_FillMemory
+ ret
+
+YellowIntro_BlankPalsDelay2AndDisableLCD:
+ xor a
+ ld [rBGP], a
+ ld [rOBP0], a
+ ld [rOBP1], a
+ call UpdateGBCPal_BGP
+ call UpdateGBCPal_OBP0
+ call UpdateGBCPal_OBP1
+ call DelayFrame
+ call DelayFrame
+ call DisableLCD
+ ret
+
+Func_f9e9a:
+ ld e, a
+ callab YellowIntroPaletteAction
+ xor a
+ ld [hSCX], a
+ ld [hSCY], a
+ ld a, $90
+ ld [hWY], a
+ ld a, $e3
+ ld [rLCDC], a
+ ld a, $e4
+ ld [rBGP], a
+ ld [rOBP0], a
+ ld a, $e0
+ ld [rOBP1], a
+ call UpdateGBCPal_BGP
+ call UpdateGBCPal_OBP0
+ call UpdateGBCPal_OBP1
+ ret
+
+YellowIntro_Copy8BitSineWave:
+ ; Copy this sine wave into wYellowIntroSurfingPikaSineWaveBuffer 8 times (end just before wc900)
+ ld de, wYellowIntroSurfingPikaSineWaveBuffer
+ ld a, $8
+.loop
+ push af
+ ld hl, .SineWave
+ ld bc, .SineWaveEnd - .SineWave
+ call Bank3E_CopyData
+ pop af
+ dec a
+ jr nz, .loop
+ ret
+
+.SineWave:
+; a sine wave with amplitude 4
+ db 0, 0, 1, 2, 2, 3, 3, 3
+ db 4, 3, 3, 3, 2, 2, 1, 0
+ db 0, 0, -1, -2, -2, -3, -3, -3
+ db -4, -3, -3, -3, -2, -2, -1, 0
+.SineWaveEnd:
+
+Request7TileTransferFromC810ToC710:
+ ld a, wc810 % $100
+ ld [H_VBCOPYSRC], a
+ ld a, wc810 / $100
+ ld [H_VBCOPYSRC + 1], a
+ ld a, wc710 % $100
+ ld [H_VBCOPYDEST], a
+ ld a, wc710 / $100
+ ld [H_VBCOPYDEST + 1], a
+ ld a, $7
+ ld [H_VBCOPYSIZE], a
+ ret
+
+InitYellowIntroGFXAndMusic:
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ ld [hSCX], a
+ ld [hSCY], a
+ ld [H_AUTOBGTRANSFERDEST], a
+ ld a, $98
+ ld [H_AUTOBGTRANSFERDEST + 1], a
+ call YellowIntro_BlankTileMap
+ ld hl, wTileMap
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, $1
+ call Bank3E_FillMemory
+ coord hl, 0, 4
+ ld bc, CopyVideoDataAlternate
+ xor a
+ call Bank3E_FillMemory
+ ld a, $1
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call DelayFrame
+ call DelayFrame
+ call DelayFrame
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ ld de, $6b5a
+ ld hl, $8000
+ ld bc, $3eff
+ call CopyVideoData
+ ld de, $635a
+ ld hl, $9000
+ ld bc, $3e80
+ call CopyVideoData
+ call ClearObjectAnimationBuffers
+ call LoadYellowIntroObjectAnimationDataPointers
+ ld b, $8
+ call RunPaletteCommand
+ xor a
+ ld hl, wYellowIntroCurrentScene
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ld a, MUSIC_INTRO_BATTLE
+ ld c, BANK(Music_IntroBattle)
+ call PlayMusic
+ ret
+
+LoadYellowIntroObjectAnimationDataPointers:
+ ld a, YellowIntro_AnimatedObjectSpawnStateData % $100
+ ld [wAnimatedObjectSpawnStateDataPointer], a
+ ld a, YellowIntro_AnimatedObjectSpawnStateData / $100
+ ld [wAnimatedObjectSpawnStateDataPointer + 1], a
+ ld a, YellowIntro_AnimatedObjectJumptable % $100
+ ld [wAnimatedObjectJumptablePointer], a
+ ld a, YellowIntro_AnimatedObjectJumptable / $100
+ ld [wAnimatedObjectJumptablePointer + 1], a
+ ld a, YellowIntro_AnimatedObjectOAMData % $100
+ ld [wAnimatedObjectOAMDataPointer], a
+ ld a, YellowIntro_AnimatedObjectOAMData / $100
+ ld [wAnimatedObjectOAMDataPointer + 1], a
+ ld a, YellowIntro_AnimatedObjectFramesData % $100
+ ld [wAnimatedObjectFramesDataPointer], a
+ ld a, YellowIntro_AnimatedObjectFramesData / $100
+ ld [wAnimatedObjectFramesDataPointer + 1], a
+ ret
+
+YellowIntro_BlankTileMap:
+ ld hl, wTileMap
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, $7f
+ call Bank3E_FillMemory
+ ret
+
+Bank3E_CopyData:
+.loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+ ret
+
+Bank3E_FillMemory:
+ push de
+ ld e, a
+.loop
+ ld a, e
+ ld [hli], a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+ pop de
+ ret
+
+YellowIntro_BlankOAMBuffer:
+ ld hl, wOAMBuffer
+ ld bc, wOAMBufferEnd - wOAMBuffer
+ xor a
+ call Bank3E_FillMemory
+ ret
+
+YellowIntro_BlankPalettes:
+ xor a
+ ld [rBGP], a
+ ld [rOBP0], a
+ ld [rOBP1], a
+ call UpdateGBCPal_BGP
+ call UpdateGBCPal_OBP0
+ call UpdateGBCPal_OBP1
+ ret
+
+YellowIntro_AnimatedObjectSpawnStateData:
+ db $00, $00, $00
+ db $01, $01, $00
+ db $02, $01, $00
+ db $03, $01, $00
+ db $04, $02, $00
+ db $05, $03, $00
+ db $06, $04, $00
+ db $07, $01, $00
+ db $08, $05, $00
+ db $09, $01, $00
+ db $0a, $01, $00
+
+YellowIntro_AnimatedObjectJumptable:
+ dw Func_fa007
+ dw Func_fa007
+ dw Func_fa008
+ dw Func_fa014
+ dw Func_fa02b
+ dw Func_fa062
+
+Func_fa007:
+ ret
+
+Func_fa008:
+ ld hl, $4
+ add hl, bc
+ ld a, [hl]
+ cp $58
+ ret z
+ sub $4
+ ld [hl], a
+ ret
+
+Func_fa014:
+ ld hl, $4
+ add hl, bc
+ ld a, [hl]
+ cp $58
+ jr z, .asm_fa020
+ add $4
+ ld [hl], a
+.asm_fa020
+ ld hl, $5
+ add hl, bc
+ cp $58
+ ret z
+ add $1
+ ld [hl], a
+ ret
+
+Func_fa02b:
+ ld hl, $b
+ add hl, bc
+ ld e, [hl]
+ ld d, $0
+ ld hl, Jumptable_fa03b
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+Jumptable_fa03b:
+ dw Func_fa03f
+ dw Func_fa051
+
+Func_fa03f:
+ ld hl, $5
+ add hl, bc
+ ld a, [hl]
+ cp $58
+ jr z, .asm_fa04c
+ sub $2
+ ld [hl], a
+ ret
+
+.asm_fa04c
+ ld hl, $b
+ add hl, bc
+ inc [hl]
+Func_fa051:
+ ld hl, $c
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ ld d, $8
+ call Func_fa079
+ ld hl, $7
+ add hl, bc
+ ld [hl], a
+ ret
+
+Func_fa062:
+ ld hl, $b
+ add hl, bc
+ ld a, [hl]
+ ld hl, $4
+ add hl, bc
+ add [hl]
+ ld [hl], a
+ ret
+
+Func_fa06e:
+ ld e, a
+ ld d, $0
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+Func_fa077: ; cosine
+ add $10
+Func_fa079:
+ and $3f
+ cp $20
+ jr nc, .asm_fa084
+ call Func_fa08e
+ ld a, h
+ ret
+
+.asm_fa084
+ and $1f
+ call Func_fa08e
+ ld a, h
+ xor $ff
+ inc a
+ ret
+
+Func_fa08e:
+ ld e, a
+ ld a, d
+ ld d, $0
+ ld hl, Unkn_fa0aa
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $0
+.asm_fa09d
+ srl a
+ jr nc, .asm_fa0a2
+ add hl, de
+.asm_fa0a2
+ sla e
+ rl d
+ and a
+ jr nz, .asm_fa09d
+ ret
+
+Unkn_fa0aa:
+ sine_wave $100