summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
Diffstat (limited to 'engine')
-rwxr-xr-xengine/HoF_room_pc.asm333
-rw-r--r--engine/bank3c.asm521
-rw-r--r--engine/bank3f.asm2432
-rwxr-xr-xengine/evolution.asm10
-rwxr-xr-xengine/game_corner_slots2.asm4
-rwxr-xr-xengine/hidden_object_functions17.asm111
-rwxr-xr-xengine/hidden_object_functions18.asm74
-rwxr-xr-xengine/items/itemfinder.asm4
-rwxr-xr-xengine/items/items.asm4
-rw-r--r--engine/menu/bills_pc.asm2
-rwxr-xr-xengine/menu/party_menu.asm2
-rwxr-xr-xengine/menu/pokedex.asm526
-rw-r--r--engine/overworld/advance_player_sprite.asm2
-rwxr-xr-xengine/overworld/cable_club_npc.asm2
-rwxr-xr-xengine/overworld/hidden_items.asm17
-rwxr-xr-xengine/overworld/hidden_objects.asm26
-rw-r--r--engine/overworld/missable_objects.asm2
-rwxr-xr-xengine/overworld/pokecenter.asm8
-rwxr-xr-xengine/pikachu_pic_animation.asm3449
-rwxr-xr-xengine/printer.asm254
20 files changed, 5668 insertions, 2115 deletions
diff --git a/engine/HoF_room_pc.asm b/engine/HoF_room_pc.asm
index e00fc57d..51575a9d 100755
--- a/engine/HoF_room_pc.asm
+++ b/engine/HoF_room_pc.asm
@@ -1,173 +1,214 @@
-HallOfFamePC: ; 7405c (1d:405c)
- callba AnimateHallOfFame
+HallOfFamePC:
+ callab FallingStarEnd
call ClearScreen
ld c, 100
call DelayFrames
+
call DisableLCD
- ld hl, vFont
- ld bc, $800 / 2
- call ZeroMemory
- ld hl, vChars2 + $600
- ld bc, $200 / 2
- call ZeroMemory
- ld hl, vChars2 + $7e0
- ld bc, $10
- ld a, $ff
- call FillMemory
+ ld a, $a7
+ ld [rWX], a
+ xor a
+ ld [rSCX], a
+ ld [rSCY], a
+ ld [hSCX], a
+ ld [hSCY], a
+ ld [hWY], a
+ ld [rWY], a
+ call CreditsLoadFont
coord hl, 0, 0
call FillFourRowsWithBlack
coord hl, 0, 14
call FillFourRowsWithBlack
- ld a, $c0
+ ld a, %11000000
ld [rBGP], a
+ call UpdateGBCPal_BGP
call EnableLCD
- ld a, $ff
- call PlaySoundWaitForCurrent
+ call StopAllMusic
+ ld hl, vBGMap1
+ call CreditsCopyTileMapToVRAM
+ ld hl, vBGMap0
+ call CreditsCopyTileMapToVRAM
ld c, BANK(Music_Credits)
ld a, MUSIC_CREDITS
call PlayMusic
ld c, 128
call DelayFrames
xor a
- ld [wUnusedCD3D], a ; not read
+ ld [wHoFMonSpecies], a
ld [wNumCreditsMonsDisplayed], a
jp Credits
-FadeInCreditsText: ; 740ba (1d:40ba)
+FadeInCreditsText:
+ ld a, $1
+ ld [H_AUTOBGTRANSFERENABLED], a
ld hl, HoFGBPalettes
ld b, 4
-.asm_740bf
+.asm_f0f91
ld a, [hli]
ld [rBGP], a
+ call UpdateGBCPal_BGP
ld c, 5
call DelayFrames
dec b
- jr nz, .asm_740bf
+ jr nz, .asm_f0f91
ret
-DisplayCreditsMon: ; 740cb (1d:40cb)
- xor a
- ld [H_AUTOBGTRANSFERENABLED],a
- call SaveScreenTilesToBuffer1
- call FillMiddleOfScreenWithWhite
+HoFGBPalettes:
+ db %11000000
+ db %11010000
+ db %11100000
+ db %11110000
- ; display the next monster from CreditsMons
- ld hl,wNumCreditsMonsDisplayed
- ld c,[hl] ; how many monsters have we displayed so far?
- inc [hl]
- ld b,0
- ld hl,CreditsMons
- add hl,bc ; go that far in the list of monsters and get the next one
- ld a,[hl]
- ld [wcf91],a
- ld [wd0b5],a
- coord hl, 8, 6
- call GetMonHeader
- call LoadFrontSpriteByMonIndex
- ld hl,vBGMap0 + $c
+DisplayCreditsMon:
+ ld hl, vBGMap1
call CreditsCopyTileMapToVRAM
xor a
- ld [H_AUTOBGTRANSFERENABLED],a
- call LoadScreenTilesFromBuffer1
- ld hl,vBGMap0
+ ld [H_AUTOBGTRANSFERENABLED], a
+ ld hl, rLCDC
+ set 3, [hl]
+ call SaveScreenTilesToBuffer2
+ call FillMiddleOfScreenWithWhite
+ call GetNextCreditsMon
+ ld hl, vBGMap0 + 12
call CreditsCopyTileMapToVRAM
- ld a,$A7
- ld [rWX],a
- ld hl,vBGMap1
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call LoadScreenTilesFromBuffer2DisableBGTransfer
+ ld hl, vBGMap0
call CreditsCopyTileMapToVRAM
- call FillMiddleOfScreenWithWhite
- ld a,%11111100 ; make the mon a black silhouette
- ld [rBGP],a
-
-; scroll the mon left by one tile 7 times
- ld bc,7
-.scrollLoop1
+ ld a, %11111100
+ ld [rBGP], a
+ call UpdateGBCPal_BGP
+ ld hl, rLCDC
+ res 3, [hl]
+ ld a, 1
+ ld [H_AUTOBGTRANSFERENABLED], a
+ ld b, 0
+ ld c, 10
call ScrollCreditsMonLeft
- dec c
- jr nz,.scrollLoop1
-
-; scroll the mon left by one tile 20 times
-; This time, we have to move the window left too in order to hide the text that
-; is wrapping around to the right side of the screen.
- ld c,20
-.scrollLoop2
+ call FillLeftHalfOfScreenWithWhite
+ ld c, 10
call ScrollCreditsMonLeft
- ld a,[rWX]
- sub 8
- ld [rWX],a
- dec c
- jr nz,.scrollLoop2
-
+ call FillRightHalfOfScreenWithWhite
+ ld c, 8
+ call ScrollCreditsMonLeft
+ ld a, %11000000
+ ld [rBGP], a
+ call UpdateGBCPal_BGP
xor a
- ld [hWY],a
- ld a,%11000000
- ld [rBGP],a
+ ld [hSCX], a
ret
-INCLUDE "data/credit_mons.asm"
-
-ScrollCreditsMonLeft: ; 74140 (1d:4140)
- ld h, b
- ld l, $20
- call ScrollCreditsMonLeft_SetSCX
- ld h, $0
- ld l, $70
- call ScrollCreditsMonLeft_SetSCX
+ScrollCreditsMonLeft:
+.asm_f0fff
ld a, b
- add $8
+ ld [hSCX], a
+ add 8
ld b, a
+ call DelayFrame
+ dec c
+ jr nz, .asm_f0fff
ret
-ScrollCreditsMonLeft_SetSCX: ; 74152 (1d:4152)
- ld a, [rLY]
- cp l
- jr nz, ScrollCreditsMonLeft_SetSCX
- ld a, h
- ld [rSCX], a
-.loop
- ld a, [rLY]
- cp h
- jr z, .loop
+GetNextCreditsMon:
+ ld hl, wNumCreditsMonsDisplayed
+ ld c, [hl]
+ inc [hl]
+ ld b, 0
+ ld hl, CreditsMons
+ add hl, bc
+ ld a, [hl]
+ ld [wcf91], a
+ ld [wd0b5], a
+ coord hl, 8, 6
+ call GetMonHeader
+ call LoadFrontSpriteByMonIndex
ret
-HoFGBPalettes: ; 74160 (1d:4160)
- db %11000000
- db %11010000
- db %11100000
- db %11110000
+INCLUDE "data/credit_mons.asm"
-CreditsCopyTileMapToVRAM: ; 74164 (1d:4164)
+CreditsCopyTileMapToVRAM:
ld a, l
- ld [H_AUTOBGTRANSFERDEST], a
+ ld [$ffbc], a
ld a, h
- ld [H_AUTOBGTRANSFERDEST + 1], a
- ld a, 1
+ ld [$ffbd], a
+ ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a
jp Delay3
-ZeroMemory: ; 74171 (1d:4171)
-; zero bc bytes at hl
+CreditsLoadFont:
+ call LoadFontTilePatterns
+ ld hl, vChars1
+ ld bc, $40 * $10
+ call ZeroMemory
+
+ call LoadTextBoxTilePatterns
+ ld hl, vChars2 + $60 * $10
+ ld bc, $10 * $10
+ call ZeroMemory
+
+ ld hl, vChars2 + $7e * $10
+ ld bc, $1 * $10
+ ld a, $ff
+ call FillMemory
+ ret
+
+ZeroMemory:
+.asm_f1071
ld [hl], 0
inc hl
inc hl
dec bc
ld a, b
or c
- jr nz, ZeroMemory
+ jr nz, .asm_f1071
ret
-FillFourRowsWithBlack: ; 7417b (1d:417b)
- ld bc, SCREEN_WIDTH * 4
+FillFourRowsWithBlack:
+ ld bc, 4 * SCREEN_WIDTH
ld a, $7e
jp FillMemory
-FillMiddleOfScreenWithWhite: ; 74183 (1d:4183)
+FillMiddleOfScreenWithWhite:
coord hl, 0, 4
- ld bc, SCREEN_WIDTH * 10
+ ld bc, 10 * SCREEN_WIDTH
ld a, " "
jp FillMemory
-Credits: ; 7418e (1d:418e)
+FillLeftHalfOfScreenWithWhite:
+ coord hl, 0, 4
+ push bc
+ call FillHalfOfScreenWithWhite
+ pop bc
+ ret
+
+FillRightHalfOfScreenWithWhite:
+ coord hl, 10, 4
+ push bc
+ call FillHalfOfScreenWithWhite
+ pop bc
+ ret
+
+FillHalfOfScreenWithWhite:
+ ld b, 10
+ ld c, 10
+ ld a, " "
+.asm_f10a6
+ push bc
+ push hl
+.asm_f10a8
+ ld [hli], a
+ dec c
+ jr nz, .asm_f10a8
+ pop hl
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .asm_f10a6
+ ret
+
+Credits: ; Roll credits
ld de, CreditsOrder
push de
.nextCreditsScreen
@@ -192,58 +233,48 @@ Credits: ; 7418e (1d:418e)
jr z, .showCopyrightText
cp $fa
jr z, .showTheEnd
- push hl
- push hl
- ld hl, CreditsTextPointers
- add a
- ld c, a
- ld b, 0
- add hl, bc
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld a, [de]
- inc de
- ld c, a
- ld b, $ff
- pop hl
- add hl, bc
- call PlaceString
- pop hl
- ld bc, SCREEN_WIDTH * 2
- add hl, bc
+ call PlaceCreditsText
pop de
jr .nextCreditsCommand
+
+.showCopyrightText
+ callba LoadCopyrightTiles
+ pop de
+ jr .nextCreditsCommand
+
+
.fadeInTextAndShowMon
call FadeInCreditsText
- ld c, 90
+ ld c, 102
jr .next1
+
.showTextAndShowMon
- ld c, 110
+ ld c, 122
.next1
call DelayFrames
call DisplayCreditsMon
jr .nextCreditsScreen
+
.fadeInText
call FadeInCreditsText
- ld c, 120
+ ld c, 132
jr .next2
+
.showText
- ld c, 140
+ ld c, 152
.next2
call DelayFrames
jr .nextCreditsScreen
-.showCopyrightText
- push de
- callba LoadCopyrightTiles
- pop de
- pop de
- jr .nextCreditsCommand
+
.showTheEnd
- ld c, 16
+ call ShowTheEndGFX
+ pop de
+ ret
+
+ShowTheEndGFX:
+ ld c, 24
call DelayFrames
call FillMiddleOfScreenWithWhite
- pop de
ld de, TheEndGfx
ld hl, vChars2 + $600
lb bc, BANK(TheEndGfx), (TheEndGfxEnd - TheEndGfx) / $10
@@ -258,8 +289,31 @@ Credits: ; 7418e (1d:418e)
TheEndTextString: ; 74229 (1d:4229)
; "T H E E N D"
- db $60," ",$62," ",$64," ",$64," ",$66," ",$68,"@"
- db $61," ",$63," ",$65," ",$65," ",$67," ",$69,"@"
+ db $60, " ", $62, " ", $64, " ", $64, " ", $66, " ", $68, "@"
+ db $61, " ", $63, " ", $65, " ", $65, " ", $67, " ", $69, "@"
+
+PlaceCreditsText:
+ push hl
+ push hl
+ ld hl, CreditsTextPointers
+ ld c, a
+ ld b, 0
+ add hl, bc
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ pop hl
+ ld a, [de]
+ inc de
+ ld c, a
+ ld b, $ff
+ add hl, bc
+ call PlaceString
+ pop hl
+ ld bc, SCREEN_WIDTH * 2
+ add hl, bc
+ ret
INCLUDE "data/credits_order.asm"
@@ -268,3 +322,4 @@ INCLUDE "text/credits_text.asm"
TheEndGfx: ; 7473e (1d:473e) (7473f on blue)
INCBIN "gfx/theend.interleave.2bpp"
TheEndGfxEnd:
+
diff --git a/engine/bank3c.asm b/engine/bank3c.asm
index cadfe1cf..d176511c 100644
--- a/engine/bank3c.asm
+++ b/engine/bank3c.asm
@@ -14,10 +14,11 @@ PlayPikachuSoundClip:: ; f0000 (3c:4000)
ld c, $4
.loop
dec c
- jr z, .asm_f0019
+ jr z, .done_delay
call DelayFrame
jr .loop
-.asm_f0019
+
+.done_delay
di
push bc
push hl
@@ -90,74 +91,74 @@ PikachuCriesPointerTable: ; f008e (3c:408e)
; dw pointer to cry
; bank 21
- dbw BANK(PikachuCry1), PikachuCry1 ; 21:4000
- dbw BANK(PikachuCry2), PikachuCry2 ; 21:491a
- dbw BANK(PikachuCry3), PikachuCry3 ; 21:4fdc
- dbw BANK(PikachuCry4), PikachuCry4 ; 21:59ee
-
+ pikacry_def PikachuCry1 ; 21:4000
+ pikacry_def PikachuCry2 ; 21:491a
+ pikacry_def PikachuCry3 ; 21:4fdc
+ pikacry_def PikachuCry4 ; 21:59ee
+
; bank 22
- dbw BANK(PikachuCry5), PikachuCry5 ; 22:4000
- dbw BANK(PikachuCry6), PikachuCry6 ; 22:5042
- dbw BANK(PikachuCry7), PikachuCry7 ; 22:6254
-
+ pikacry_def PikachuCry5 ; 22:4000
+ pikacry_def PikachuCry6 ; 22:5042
+ pikacry_def PikachuCry7 ; 22:6254
+
; bank 23
- dbw BANK(PikachuCry8), PikachuCry8 ; 23:4000
- dbw BANK(PikachuCry9), PikachuCry9 ; 23:50ca
- dbw BANK(PikachuCry10), PikachuCry10 ; 23:5e0c
+ pikacry_def PikachuCry8 ; 23:4000
+ pikacry_def PikachuCry9 ; 23:50ca
+ pikacry_def PikachuCry10 ; 23:5e0c
; bank 24
- dbw BANK(PikachuCry11), PikachuCry11 ; 24:4000
- dbw BANK(PikachuCry12), PikachuCry12 ; 24:4722
- dbw BANK(PikachuCry13), PikachuCry13 ; 24:54a4
-
+ pikacry_def PikachuCry11 ; 24:4000
+ pikacry_def PikachuCry12 ; 24:4722
+ pikacry_def PikachuCry13 ; 24:54a4
+
; bank 25
- dbw BANK(PikachuCry14), PikachuCry14 ; 25:4000
- dbw BANK(PikachuCry15), PikachuCry15 ; 25:589a
-
+ pikacry_def PikachuCry14 ; 25:4000
+ pikacry_def PikachuCry15 ; 25:589a
+
; banks 31-34, in no particular order
- dbw BANK(PikachuCry16), PikachuCry16 ; 31:4000
- dbw BANK(PikachuCry17), PikachuCry17 ; 34:4000
- dbw BANK(PikachuCry18), PikachuCry18 ; 31:549a
- dbw BANK(PikachuCry19), PikachuCry19 ; 33:4000
- dbw BANK(PikachuCry20), PikachuCry20 ; 32:4000
- dbw BANK(PikachuCry21), PikachuCry21 ; 32:6002
- dbw BANK(PikachuCry22), PikachuCry22 ; 31:63a4
- dbw BANK(PikachuCry23), PikachuCry23 ; 34:4862
- dbw BANK(PikachuCry24), PikachuCry24 ; 33:5632
- dbw BANK(PikachuCry25), PikachuCry25 ; 34:573c
- dbw BANK(PikachuCry26), PikachuCry26 ; 33:725c
-
+ 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
- dbw BANK(PikachuCry27), PikachuCry27 ; 35:4000
- dbw BANK(PikachuCry28), PikachuCry28 ; 35:4b5a
- dbw BANK(PikachuCry29), PikachuCry29 ; 35:5da4
- dbw BANK(PikachuCry30), PikachuCry30 ; 35:69ce
- dbw BANK(PikachuCry31), PikachuCry31 ; 35:6e80
-
+ 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
- dbw BANK(PikachuCry32), PikachuCry32 ; 36:4000
- dbw BANK(PikachuCry33), PikachuCry33 ; 36:458a
- dbw BANK(PikachuCry34), PikachuCry34 ; 36:523c
-
+ pikacry_def PikachuCry32 ; 36:4000
+ pikacry_def PikachuCry33 ; 36:458a
+ pikacry_def PikachuCry34 ; 36:523c
+
; bank 37
- dbw BANK(PikachuCry35), PikachuCry35 ; 37:4000
- dbw BANK(PikachuCry36), PikachuCry36 ; 37:522a
+ pikacry_def PikachuCry35 ; 37:4000
+ pikacry_def PikachuCry36 ; 37:522a
; banks 36-38
- dbw BANK(PikachuCry37), PikachuCry37 ; 38:4000
- dbw BANK(PikachuCry38), PikachuCry38 ; 38:4dfa
- dbw BANK(PikachuCry39), PikachuCry39 ; 37:6e0c
- dbw BANK(PikachuCry40), PikachuCry40 ; 38:5a64
- dbw BANK(PikachuCry41), PikachuCry41 ; 36:6746
- dbw BANK(PikachuCry42), PikachuCry42 ; 38:6976
+ 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/overworld/advance_player_sprite.asm"
ResetStatusAndHalveMoneyOnBlackout:: ; f0274 (3c:4274)
; Reset player status on blackout.
xor a
- ld [wd435],a
+ ld [wd435], a
xor a ; gamefreak copypasting functions (double xor a)
ld [wBattleResult], a
ld [wWalkBikeSurfState], a
@@ -202,35 +203,56 @@ ResetStatusAndHalveMoneyOnBlackout:: ; f0274 (3c:4274)
ld a, %11111111
ld [wJoyIgnore], a
predef_jump HealParty
-
+
Func_f02da:: ; f02da (3c:42da)
- ld a,[wCurMap]
+ ld a, [wCurMap]
cp VERMILION_GYM ; ??? new thing about verm gym?
- jr z,.asm_f02ee
- ld c,a
- ld hl,Pointer_f02fa
+ jr z, .asm_f02ee
+ ld c, a
+ ld hl, Pointer_f02fa
.asm_f02e5
- ld a,[hli]
+ ld a, [hli]
cp c
- jr z,.asm_f02f4
- cp a,$ff
- jr nz,.asm_f02e5
+ jr z, .asm_f02f4
+ cp a, $ff
+ jr nz, .asm_f02e5
ret
.asm_f02ee
- ld hl,wd126
- set 6,[hl]
+ ld hl, wd126
+ set 6, [hl]
ret
.asm_f02f4
- ld hl,wd126
- set 5,[hl]
+ ld hl, wd126
+ set 5, [hl]
ret
Pointer_f02fa:: ; f02fa (3c:42fa)
- db $cf,$d0,$d1,$d2,$d3,$d4
- db $d5,$e9,$ea,$eb,$d6,$d7
- db $d8,$a5,$a6,$87,$c7,$ca
- db $c6,$6c,$c2,$71,$f5,$f6
- db $f7,$ff
+ db SILPH_CO_2F
+ db SILPH_CO_3F
+ db SILPH_CO_4F
+ db SILPH_CO_5F
+ db SILPH_CO_6F
+ db SILPH_CO_7F
+ db SILPH_CO_8F
+ db SILPH_CO_9F
+ db SILPH_CO_10F
+ db SILPH_CO_11F
+ db MANSION_2
+ db MANSION_3
+ db MANSION_4
+ db MANSION_1
+ db CINNABAR_GYM
+ db GAME_CORNER
+ db ROCKET_HIDEOUT_1
+ db ROCKET_HIDEOUT_4
+ db VICTORY_ROAD_3
+ db VICTORY_ROAD_1
+ db VICTORY_ROAD_2
+ db LANCES_ROOM
+ db LORELEIS_ROOM
+ db BRUNOS_ROOM
+ db AGATHAS_ROOM
+ db $ff
BeachHouse_GFX:: ; f0314 (3c:4314)
INCBIN "gfx/tilesets/beachhouse.2bpp"
@@ -240,42 +262,351 @@ BeachHouse_Block:: ; f0914 (3c:4914)
Func_f0a54:: ; f0a54 (3c:4a54)
ret
-
+
Func_f0a55:: ; f0a55 (3c:4a55)
- ld hl,Pointer_f0a76 ; 3c:4a76
+ ld hl, Pointer_f0a76 ; 3c:4a76
.loop
- ld a,[hli]
- cp a,$ff
+ ld a, [hli]
+ cp a, $ff
ret z
- ld b,a
- ld a,[wCurMap]
+ ld b, a
+ ld a, [wCurMap]
cp b
- jr z,.asm_f0a68
+ jr z, .asm_f0a68
inc hl
inc hl
inc hl
jr .loop
.asm_f0a68
- ld a,[hli]
- ld c,a
- ld b,$0
- ld a,[hli]
- ld h,[hl]
- ld l,a
- ld de,wMissableObjectList
+ ld a, [hli]
+ ld c, a
+ ld b, $0
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, wMissableObjectList
call CopyData
ret
Pointer_f0a76:: ; f0a76 (3c:4a76)
- db $27,$07,$7b,$4a,$ff
- db $01,$ec,$02,$ed,$03,$ee,$ff
-
- dr $f0a82,$f220e
-BeachHouse_h: ; f220e (3c:620e)
-;INCLUDE "data/mapHeaders/beach_house.asm"
- dr $f220e,$f24ae
-Func_f24ae: ; f24ae (3c:64ae)
- dr $f24ae,$f25f8
-CheckForHiddenObject:: ; f25f8 (3c:65f8)
- dr $f25f8,$f4000 \ No newline at end of file
+ db $27, $07, $7b, $4a, $ff
+ db $01, $ec, $02, $ed, $03, $ee, $ff
+
+Func_f0a82: ; f0a82
+ ld a, [wd472]
+ bit 7, a
+ ret z
+ ld a, [wWalkBikeSurfState]
+ and a
+ ret nz
+ push hl
+ push bc
+ callab GetPikachuFacingDirectionAndReturnToE
+ pop bc
+ pop hl
+ ld a, b
+ cp e
+ ret nz
+ push hl
+ ld a, [wUpdateSpritesEnabled]
+ push af
+ ld a, $ff
+ ld [wUpdateSpritesEnabled], a
+ callab LoadPikachuShadowIntoVRAM
+ pop af
+ ld [wUpdateSpritesEnabled], a
+ pop hl
+ call Func_159b ; homecall Func_fd2a1 - pikachu movement script?
+ callab Func_fcba1
+ ret
+
+Pic_f0abf: ; f0abf (3c:4abf)
+ dr $f0abf, $f0b64
+GFX_f0b64: ; f0b64 (3c:4b64)
+ dr $f0b64, $f0cf4
+Pic_f0cf4: ; f0cf4 (3c:4cf4)
+ dr $f0cf4, $f0d82
+GFX_f0d82: ; f0d82 (3c:4d82)
+ dr $f0d82, $f0f12
+
+Func_f0f12:
+ ld hl, NurseChanseyText
+ call PrintText
+ ld a, CHANSEY
+ call PlayCry
+ call WaitForSoundToFinish
+ ret
+
+NurseChanseyText:
+ TX_FAR _NurseChanseyText
+ db "@"
+
+INCLUDE "engine/HoF_room_pc.asm"
+INCLUDE "scripts/viridiancity2.asm"
+INCLUDE "scripts/vermilioncity2.asm"
+INCLUDE "scripts/celadoncity2.asm"
+INCLUDE "scripts/route1_2.asm"
+INCLUDE "scripts/route22_2.asm"
+INCLUDE "scripts/redshouse1f2.asm"
+INCLUDE "scripts/oakslab2.asm"
+INCLUDE "scripts/school2.asm"
+INCLUDE "scripts/museum1f2.asm"
+INCLUDE "scripts/pewterpokecenter2.asm"
+
+Func_f1e22:
+ ld hl, PikachuMovementData_f1e2b
+ ld b, SPRITE_FACING_RIGHT
+ call Func_f0a82
+ ret
+
+PikachuMovementData_f1e2b:
+ db $00
+ db $1d
+ db $1f
+ db $38
+ db $3f
+
+Func_f1e30
+ CheckEvent EVENT_GOT_TM18
+ jr nz, .asm_f1e54
+ ld hl, CeladonMart3Text_f1e5b
+ call PrintText
+ lb bc, TM_18, 1
+ call GiveItem
+ jr nc, .asm_f1e4f
+ SetEvent EVENT_GOT_TM18
+ ld hl, CeladonMart3Text_f1e60
+ jr .asm_f1e57
+
+.asm_f1e4f
+ ld hl, CeladonMart3Text_f1e6b
+ jr .asm_f1e57
+
+.asm_f1e54
+ ld hl, CeladonMart3Text_f1e66
+.asm_f1e57
+ call PrintText
+ ret
+
+CeladonMart3Text_f1e5b:
+ TX_FAR _TM18PreReceiveText
+ db "@"
+
+CeladonMart3Text_f1e60:
+ TX_FAR _ReceivedTM18Text
+ TX_SFX_ITEM
+ db "@"
+
+CeladonMart3Text_f1e66:
+ TX_FAR _TM18ExplanationText
+ db "@"
+
+CeladonMart3Text_f1e6b:
+ TX_FAR _TM18NoRoomText
+ db "@"
+
+Func_f1e70:
+ ld a, $1
+ ld [wDoNotWaitForButtonPressAfterDisplayingText], a
+ ld hl, CeladonMansion1Text_f1e96
+ call PrintText
+ callab IsStarterPikachuInOurParty
+ ret nc
+ ld hl, CeladonMansionText_f1e9c
+ call PrintText
+ ld a, $0
+ ld [wDoNotWaitForButtonPressAfterDisplayingText], a
+ call Func_f1ea2
+ call PrintText
+ ret
+
+CeladonMansion1Text_f1e96:
+ TX_FAR _CeladonMansion1Text2
+ TX_WAIT_BUTTON
+ db "@"
+
+CeladonMansionText_f1e9c:
+ TX_FAR _CeladonMansion1Text6
+ TX_BUTTON_SOUND
+ db "@"
+
+Func_f1ea2:
+ ld hl, PikachuHappinessThresholds_f1eb9
+.asm_f1ea5
+ ld a, [hli]
+ inc hl
+ and a
+ jr z, .asm_f1eb5
+ ld b, a
+ ld a, [wPikachuHappiness]
+ cp b
+ jr c, .asm_f1eb5
+ inc hl
+ inc hl
+ jr .asm_f1ea5
+
+.asm_f1eb5
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+PikachuHappinessThresholds_f1eb9
+ dw 51, CeladonMansion1Text_f1ed5
+ dw 101, CeladonMansion1Text_f1eda
+ dw 131, CeladonMansion1Text_f1edf
+ dw 161, CeladonMansion1Text_f1ee4
+ dw 201, CeladonMansion1Text_f1ee9
+ dw 255, CeladonMansion1Text_f1eee
+ dbbw 0, $ff, CeladonMansion1Text_f1eee
+
+CeladonMansion1Text_f1ed5:
+ TX_FAR _CeladonMansion1Text7
+ db "@"
+
+CeladonMansion1Text_f1eda:
+ TX_FAR _CeladonMansion1Text8
+ db "@"
+
+CeladonMansion1Text_f1edf:
+ TX_FAR _CeladonMansion1Text9
+ db "@"
+
+CeladonMansion1Text_f1ee4:
+ TX_FAR _CeladonMansion1Text10
+ db "@"
+
+CeladonMansion1Text_f1ee9:
+ TX_FAR _CeladonMansion1Text11
+ db "@"
+
+CeladonMansion1Text_f1eee:
+ TX_FAR _CeladonMansion1Text12
+ db "@"
+
+ dr $f1ef3, $f218c
+
+INCLUDE "scripts/mtmoonpokecenter2.asm"
+
+INCLUDE "data/mapHeaders/beach_house.asm"
+INCLUDE "scripts/beach_house.asm"
+BeachHouseBlockdata: ; f2388 (3c:6388)
+INCBIN "maps/beach_house.blk"
+INCLUDE "data/mapObjects/beach_house.asm"
+
+INCLUDE "scripts/beach_house2.asm"
+INCLUDE "scripts/billshouse2.asm"
+INCLUDE "scripts/viridianforest2.asm"
+INCLUDE "scripts/ssanne9_2.asm"
+INCLUDE "scripts/silphco11_2.asm"
+
+INCLUDE "engine/overworld/hidden_objects.asm"
+
+Func_f2cd0:
+ ld d, 0
+ ld hl, Jumptable_f2ce1
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call JumpToAddress
+ ld e, a
+ ld d, 0
+ ret
+
+Jumptable_f2ce1:
+ dw Func_f2ceb
+ dw Func_f2ceb
+ dw Func_f2cee
+ dw Func_f2cf4
+ dw Func_f2d06
+
+Func_f2ceb:
+ ld a, 0
+ ret
+
+Func_f2cee:
+ call Random
+ and $1
+ ret
+
+Func_f2cf4: ; should return to a, instead returns to b
+ call Random
+ swap a
+ cp $55
+ ld b, 0
+ ret c
+ cp $aa
+ ld b, 1
+ ret c
+ ld b, 2
+ ret
+
+Func_f2d06:
+ call Random
+ and $3
+ ret
+
+Func_f2d0c:
+ ld hl, GymTrashCans3a
+ ld a, [wGymTrashCanIndex]
+ ld c, a
+ ld b, 0
+ ld a, 9
+ call AddNTimes
+ call AddNTimes ; ????
+ ld a, [hli]
+ ld [hGymTrashCanRandNumMask], a
+ ld e, a
+ push hl
+ call Func_f2cd0
+ pop hl
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld [wSecondLockTrashCanIndex], a
+ ld a, [hl]
+ ld [wSecondLockTrashCanIndex + 1], a
+ ret
+
+GymTrashCans3a: ; 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.
+; The sampling occurs by taking a random number and seeing which
+; third of the range 0-255 the number falls in. However, it returns
+; that value to the wrong register, so the result is never used.
+; Instead of using an offset in [0,1,2], the offset is instead
+; in the full range 0-255. This results in truly random behavior.
+ db 4
+ db 1,3, 3,1, 1,-1, 3,-1
+ db 3
+ db 0,2, 2,4, 4,0, -1,-1
+ db 4
+ db 1,5, 5,1, 1,-1, 5,-1
+ db 3
+ db 0,4, 4,6, 6,0, -1,-1
+ db 4
+ db 1,3, 3,1, 5,5, 7,7
+ db 3
+ db 2,4, 4,8, 8,2, -1,-1
+ db 3
+ db 3,7, 7,9, 9,3, -1,-1
+ db 4
+ db 4,8, 6,10, 8,4, 10,6
+ db 3
+ db 5,7, 7,11, 11,5, -1,-1
+ db 3
+ db 6,10, 10,12, 12,6, -1,-1
+ db 4
+ db 7,9, 9,7, 11,13, 13,11
+ db 3
+ db 8,10, 10,14, 14,8, -1,-1
+ db 4
+ db 9,13, 13,9, 9,-1, 13,-1
+ db 3
+ db 10,12, 12,14, 14,10, -1,-1
+ db 4
+ db 11,13, 13,11, 11,-1, 13,-1
diff --git a/engine/bank3f.asm b/engine/bank3f.asm
index 92e6d857..c31fc986 100644
--- a/engine/bank3f.asm
+++ b/engine/bank3f.asm
@@ -4,50 +4,51 @@ INCLUDE "data/map_header_banks.asm"
Func_fc4dd:: ; fc4dd (3f:44dd)
; possibly to test if pika should be out?
- ld a,[wd430]
- bit 5,a
- jr nz,.asm_fc4f8 ; 3f:44f8
- ld a,[wd430]
- bit 7,a
- jr nz,.asm_fc4f8
+ ld a, [wPikachuOverworldStateFlags]
+ bit 5, a
+ jr nz, .hide ; 3f:44f8
+ ld a, [wPikachuOverworldStateFlags]
+ bit 7, a
+ jr nz, .hide
call IsStarterPikachuInOurParty
- jr nc,.asm_fc4f8
- ld a,[wWalkBikeSurfState]
+ jr nc, .hide
+ ld a, [wWalkBikeSurfState]
and a
- jr nz,.asm_fc4f8
+ jr nz, .hide
scf
ret
-.asm_fc4f8
+
+.hide
and a
ret
-
+
Func_fc4fa:: ; fc4fa (3f:44fa)
- ld hl,wd430
- bit 4,[hl]
- res 4,[hl]
- jr nz,.asm_fc515
- call Func_1542
+ ld hl, wPikachuOverworldStateFlags
+ bit 4, [hl]
+ res 4, [hl]
+ jr nz, .asm_fc515
+ call ResetPikachuAsleep
call Func_fc523
- ld a,$ff
- ld [wSpriteStateData1 + $f2],a
- call Func_fcb84
+ 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
+ ld [wd431], a
+ ld a, [wSpriteStateData1 + $9]
+ ld [wSpriteStateData1 + $f9], a
ret
-
+
Func_fc523:: ; fc523 (3f:4523)
- ld hl,wSpriteStateData1 + $f0
+ ld hl, wSpriteStateData1 + $f0
call Func_fc52c
- ld hl,wSpriteStateData2 + $f0
+ ld hl, wSpriteStateData2 + $f0
Func_fc52c:: ; fc52c (3f:4523)
- ld bc,$10
+ ld bc, $10
xor a
call FillMemory
ret
@@ -56,251 +57,274 @@ Func_fc534:: ; fc534 (3f:4534)
call Func_fc53f
call Func_fc5bc
xor a
- ld [wd431],a
+ ld [wd431], a
ret
-
+
Func_fc53f:: ; fc53f (3f:453f)
- ld bc,wSpriteStateData1 + $f0
- ld a,[wYCoord]
+ ld bc, wSpriteStateData1 + $f0
+ ld a, [wYCoord]
add $4
- ld e,a
- ld a,[wXCoord]
+ ld e, a
+ ld a, [wXCoord]
add $4
- ld d,a
- ld a,[wd431]
+ ld d, a
+ ld a, [wd431]
and a
- jr z,.asm_fc5aa
+ jr z, .asm_fc5aa
cp $1
- jr z,.asm_fc59e
+ jr z, .asm_fc59e
cp $2
- jr z,.asm_fc584
+ jr z, .asm_fc584
cp $3
- jr z,.asm_fc5aa
+ jr z, .asm_fc5aa
cp $4
- jr z,.asm_fc5a4
+ jr z, .asm_fc5a4
cp $5
- jr z,.asm_fc5a7
+ jr z, .asm_fc5a7
cp $6
- jr z,.asm_fc5a1
+ jr z, .asm_fc5a1
cp $7
- jr z,.asm_fc572
+ jr z, .asm_fc572
jr .asm_fc59e
-
+
.asm_fc572
- ld a,[wSpriteStateData1 + $9]
+ ld a, [wSpriteStateData1 + $9]
and a ; SPRITE_FACING_DOWN
- jr z,.asm_fc5a4
- cp SPRITE_FACING_UP
- jr z,.asm_fc5a7
+ jr z, .asm_fc5a4
+ cp SPRITE_FACING_UP
+ jr z, .asm_fc5a7
cp SPRITE_FACING_LEFT
- jr z,.asm_fc5a1
+ jr z, .asm_fc5a1
cp SPRITE_FACING_RIGHT
- jr z,.asm_fc59e
+ jr z, .asm_fc59e
.asm_fc584
- ld a,[wSpriteStateData1 + $9]
+ ld a, [wSpriteStateData1 + $9]
and a
- jr nz,.asm_fc58d
+ jr nz, .asm_fc58d
dec e
jr .asm_fc5aa
+
.asm_fc58d
cp SPRITE_FACING_UP
- jr nz,.asm_fc594
+ jr nz, .asm_fc594
inc e
jr .asm_fc5aa
+
.asm_fc594
cp SPRITE_FACING_LEFT
- jr nz,.asm_fc59b
+ 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
+ ld hl, $104
+ add hl, bc
+ ld [hl], e
inc hl
- ld [hl],d
+ ld [hl], d
inc hl
Func_fc4b2:: ; fc4b2 (3f:44b2)
- ld [hl],$fe
+ ld [hl], $fe
push hl
- ld hl,wd472
- set 5,[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]
+ ld a, $49
+ ld [wSpriteStateData1 + $f0], a
+ ld a, $ff
+ ld [wSpriteStateData1 + $f2], a
+ ld a, [wd431]
and a
- jr z,.asm_fc5e4
+ jr z, .asm_fc5e4
cp $1
- jr z,.asm_fc5e4
+ jr z, .asm_fc5e4
cp $3
- jr z,.asm_fc5eb
+ jr z, .asm_fc5eb
cp $4
- jr z,.asm_fc5e4
+ jr z, .asm_fc5e4
cp $6
- jr z,.asm_fc5e4
+ jr z, .asm_fc5e4
cp $7
- jr z,.asm_fc5f1
+ jr z, .asm_fc5f1
call Func_fccb2
ret
-
+
.asm_fc5e4
- ld a,[wSpriteStateData1 + $9]
- ld [wSpriteStateData1 + $f9],a
+ ld a, [wSpriteStateData1 + $9]
+ ld [wSpriteStateData1 + $f9], a
ret
+
.asm_fc5eb
- ld a,$0
- ld [wSpriteStateData1 + $f9],a
+ ld a, $0
+ ld [wSpriteStateData1 + $f9], a
ret
+
.asm_fc5f1
- ld a,[wSpriteStateData1 + $9]
+ ld a, [wSpriteStateData1 + $9]
xor $4
- ld [wSpriteStateData1 + $f9],a
+ ld [wSpriteStateData1 + $f9], a
ret
Func_fc5fa:: ; fc5fa (3f:45fa)
- ld a,[wCurMap]
+ ld a, [wCurMap]
cp OAKS_LAB
- jr z,.asm_fc63d
+ jr z, .asm_fc63d
cp ROUTE_22_GATE
- jr z,.asm_fc62d
+ jr z, .asm_fc62d
cp MT_MOON_2
- jr z,.asm_fc635
+ jr z, .asm_fc635
cp ROCK_TUNNEL_1
- jr z,.asm_fc645
- ld a,[wCurMap]
- ld hl,Pointer_fc64b
+ 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
+ jr c, .asm_fc639
+ ld a, [wCurMap]
+ ld hl, Pointer_fc653
call Func_1568
- jr nc,.asm_fc641
- ld a,[wSpriteStateData1 + $9]
+ jr nc, .asm_fc641
+ ld a, [wSpriteStateData1 + $9]
and a
- jr nz,.asm_fc641
- ld a,$3
+ jr nz, .asm_fc641
+ ld a, $3
jr .asm_fc647
-
+
.asm_fc62d
- ld a,[wSpriteStateData1 + $9]
+ ld a, [wSpriteStateData1 + $9]
and a
- jr z,.asm_fc645
+ jr z, .asm_fc645
jr .asm_fc641
+
.asm_fc635
- ld a,$3
+ ld a, $3
jr .asm_fc647
+
.asm_fc639
- ld a,$4
+ ld a, $4
jr .asm_fc647
+
.asm_fc63d
- ld a,$6
+ ld a, $6
jr .asm_fc647
+
.asm_fc641
- ld a,$1
+ ld a, $1
jr .asm_fc647
+
.asm_fc645
- ld a,$3
+ ld a, $3
.asm_fc647
- ld [wd431],a
+ ld [wd431], a
ret
Pointer_fc64b:: ; fc64b (3f:464b)
- db $c2,$4c,$4f,$ba,$be,$b8,$54,$ff
-
+ db $c2, $4c, $4f, $ba, $be, $b8, $54, $ff
+
Pointer_fc653:: ; fc653 (3f:4653)
- db $2f,$e6,$3e,$5e,$80,$31,$a4,$ff
+ db $2f, $e6, $3e, $5e, $80, $31, $a4, $ff
Func_fc65b:: ; fc65b (3f:465b)
- ld a,[wCurMap]
+ ld a, [wCurMap]
cp VIRIDIAN_FOREST_EXIT
- jr z,.asm_fc673
+ jr z, .asm_fc673
cp VIRIDIAN_FOREST_ENTRANCE
- jr z,.asm_fc67c
- ld a,[wCurMap]
- ld hl,Pointer_fc68e
+ jr z, .asm_fc67c
+ ld a, [wCurMap]
+ ld hl, Pointer_fc68e
call Func_1568
- jr c,.asm_fc688
+ jr c, .asm_fc688
jr .asm_fc684
+
.asm_fc673
- ld a,[wSpriteStateData1 + $9]
+ ld a, [wSpriteStateData1 + $9]
cp SPRITE_FACING_UP
- jr z,.asm_fc688
+ jr z, .asm_fc688
jr .asm_fc684
+
.asm_fc67c
- ld a,[wSpriteStateData1 + $9]
+ ld a, [wSpriteStateData1 + $9]
and a ; SPRITE_FACING_DOWN
- jr z,.asm_fc684
+ jr z, .asm_fc684
jr .asm_fc688
+
.asm_fc684
- ld a,$0
+ ld a, $0
jr .asm_fc68a
+
.asm_fc688
- ld a,$1
+ ld a, $1
.asm_fc68a
- ld [wd431],a
+ ld [wd431], a
ret
-
+
Pointer_fc68e:: ; fc68e (3f:468e)
- db $33,$dd,$df,$e0,$e1,$de,$ec,$7f,$a8,$a9,$aa,$ff
-
+ db $33, $dd, $df, $e0, $e1, $de, $ec, $7f, $a8, $a9, $aa, $ff
+
Func_fc69a:: ; fc69a (3f:469a)
- ld a,[wCurMap]
+ ld a, [wCurMap]
cp ROUTE_22_GATE
- jr z,.asm_fc6a7
+ jr z, .asm_fc6a7
cp ROUTE_2_GATE
- jr z,.asm_fc6b0
+ jr z, .asm_fc6b0
jr .asm_fc6bd
+
.asm_fc6a7
- ld a,[wSpriteStateData1 + $9]
+ ld a, [wSpriteStateData1 + $9]
cp SPRITE_FACING_UP
- jr z,.asm_fc6b9
+ jr z, .asm_fc6b9
jr .asm_fc6bd
+
.asm_fc6b0
- ld a,[wSpriteStateData1 + $9]
+ ld a, [wSpriteStateData1 + $9]
cp SPRITE_FACING_UP
- jr z,.asm_fc6b9
+ jr z, .asm_fc6b9
jr .asm_fc6bd
+
.asm_fc6b9
- ld a,$1
+ ld a, $1
jr .asm_fc6c1
+
.asm_fc6bd
- ld a,$3
+ ld a, $3
jr .asm_fc6c1
+
.asm_fc6c1
- ld [wd431],a
+ ld [wd431], a
ret
Func_fc6c5:: ; fc6c5 (3f:46c5)
push hl
- ld hl,wd430
- set 2,[hl]
+ ld hl, wPikachuOverworldStateFlags
+ set 2, [hl]
pop hl
ret
Func_fc6cd:: ; fc6cd (3f:46cd)
push hl
- ld hl,wd430
- res 2,[hl]
+ ld hl, wPikachuOverworldStateFlags
+ res 2, [hl]
pop hl
ret
@@ -312,32 +336,32 @@ Func_fc6d5:: ; fc6d5 (3f:46d5)
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 Func_154a
- jp nz,asm_fc76a
- ld a,[hl]
+ 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 CheckPikachuAsleep
+ jp nz, asm_fc76a
+ ld a, [hl]
and $7f
cp $a
- jr c,.asm_fc704
+ 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
+ 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
@@ -350,16 +374,16 @@ PointerTable_fc710: ; fc710 (3f:4710)
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]
+ jr nc, .asm_fc73b
+ ld a, [wSpriteStateData1 + $f1]
and a
- jr nz,.asm_fc739
+ jr nz, .asm_fc739
push bc
push hl
call Func_fc534
@@ -368,54 +392,57 @@ Func_fc727: ; fc727 (3f:4727)
.asm_fc739
scf
ret
+
.asm_fc73b
- ld hl,wSpriteStateData1 + $f2
- ld [hl],$ff
+ ld hl, wSpriteStateData1 + $f2
+ ld [hl], $ff
dec hl
- ld [hl],$0
+ 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 Func_154a
- jr nz,.asm_fc75f
- ld a,[wSpriteStateData1 + $9]
+ ld hl, $1
+ add hl, bc
+ res 7, [hl]
+ ld hl, wSpriteStateData2 - wSpriteStateData1
+ add hl, bc
+ ld [hl], a
+ call CheckPikachuAsleep
+ jr nz, .asm_fc75f
+ ld a, [wSpriteStateData1 + $9]
xor $4
- ld hl,$9
- add hl,bc
- ld [hl],a
+ 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
+ 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
+ ld hl, $7
+ add hl, bc
+ ld [hli], a
+ ld [hl], a
call Func_fca99
call Func_fc82e
- jr c,.asm_fc783
+ 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
+ ld hl, $1
+ add hl, bc
+ ld [hl], $1
+ ld hl, wSpriteStateData2 - wSpriteStateData1
+ add hl, bc
+ ld [hl], $0
call Func_fcba1
ret
@@ -424,562 +451,566 @@ Func_fc793: ; fc793 (3f:4793)
push bc
callab InitializeSpriteScreenPosition
pop bc
- ld hl,$2
- add hl,bc
- ld [hl],$ff
+ ld hl, $2
+ add hl, bc
+ ld [hl], $ff
dec hl
- ld [hl],$1
+ ld [hl], $1
ret
Func_fc7aa: ; fc7aa (3f:47aa)
call Func_fcc92
- jp c,Func_fc803
+ 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]
+ 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]
+ ld hl, $9
+ add hl, bc
+ ld [hl], a
+ ld a, [de]
inc de
- ld hl,$5
- add hl,bc
- ld [hl],a
+ ld hl, $5
+ add hl, bc
+ ld [hl], a
dec hl
dec hl
- ld a,[de]
- ld [hl],a
+ ld a, [de]
+ ld [hl], a
inc de
- ld a,[de]
- ld hl,$1
- add hl,bc
- ld [hl],a
+ ld a, [de]
+ ld hl, $1
+ add hl, bc
+ ld [hl], a
cp $4
- jp z,Func_fca0a
+ jp z, Func_fca0a
call Func_fcd17
- jp c,Func_fc9df
+ 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
-
+ 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
+ ld hl, wSpriteStateData2 - wSpriteStateData1
+ add hl, bc
dec [hl]
- jr nz,.asm_fc823
+ jr nz, .asm_fc823
push hl
call Func_fccee
pop hl
cp $5
- jr nc,Func_fc842
- ld [hl],$20
+ jr nc, Func_fc842
+ ld [hl], $20
call Random
and $c
- ld hl,$9
- add hl,bc
- ld [hl],a
+ 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
+ ld hl, $7
+ add hl, bc
+ ld [hli], a
+ ld [hl], a
call Func_fca99
ret
Func_fc82e: ; fc82e (3f:482e)
- ld a,[wWalkCounter]
+ 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
-
+ 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
+ ld hl, $0
push af
call Random
- ld a,[hRandomAdd]
+ 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
+ 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
+ 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
+ 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
+ ld a, [wd432]
+ ld e, a
+ ld a, [wd433]
+ ld d, a
call Func_fc82e
- jr c,Func_fc8c7
+ jr c, Func_fc8c7
call Func_fc6c5
- ld hl,$4
- add hl,bc
- ld a,[hl]
+ ld hl, $4
+ add hl, bc
+ ld a, [hl]
sub e
- ld e,a
+ ld e, a
inc hl
inc hl
- ld a,[hl]
+ ld a, [hl]
sub d
- ld d,a
- ld hl,wSpriteStateData2 - wSpriteStateData1
- add hl,bc
- ld a,[hl]
+ 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
+ ld l, a
+ ld a, $48
adc $0
- ld h,a
- ld a,[hli]
- ld [wd432],a
+ ld h, a
+ ld a, [hli]
+ ld [wd432], a
add e
- ld e,a
- ld a,[hl]
- ld [wd433],a
+ ld e, a
+ ld a, [hl]
+ ld [wd433], a
add d
- ld d,a
- ld hl,$4
- add hl,bc
- ld [hl],e
+ 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
+ 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]
+ ld hl, $4
+ add hl, bc
+ ld a, [hl]
sub e
- ld [hl],a
+ ld [hl], a
inc hl
inc hl
- ld a,[hl]
+ ld a, [hl]
sub d
- ld [hl],a
+ 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
-
+ 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
+ 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
+ jp c, Func_fc835
call Func_fc6c5
- ld hl,$7
- add hl,bc
- ld a,[hl]
+ ld hl, $7
+ add hl, bc
+ ld a, [hl]
inc a
cp $8
- ld [hl],a
- jr nz,.asm_fc91f
+ ld [hl], a
+ jr nz, .asm_fc91f
xor a
- ld [hli],a
- ld a,[hl]
+ ld [hli], a
+ ld a, [hl]
inc a
and %11
- ld [hl],a
+ ld [hl], a
.asm_fc91f
call Func_fca99
- ld hl,wSpriteStateData2 - wSpriteStateData1
- add hl,bc
+ 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
+ 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
+ jp c, Func_fc835
call Func_fc6c5
- ld hl,$7
- add hl,bc
- ld a,[hl]
+ ld hl, $7
+ add hl, bc
+ ld a, [hl]
inc a
cp $8
- ld [hl],a
- jr nz,.asm_fc951
+ ld [hl], a
+ jr nz, .asm_fc951
xor a
- ld [hli],a
- ld a,[hl]
+ ld [hli], a
+ ld a, [hl]
xor $1
- ld [hl],a
+ ld [hl], a
.asm_fc951
call Func_fca99
- ld hl,wSpriteStateData2 - wSpriteStateData1
- add hl,bc
+ 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
+ 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
+ jp c, Func_fc835
call Func_fc6c5
- ld hl,$7
- add hl,bc
- ld a,[hl]
+ ld hl, $7
+ add hl, bc
+ ld a, [hl]
inc a
cp $8
- ld [hl],a
- jr nz,.asm_fc988
+ ld [hl], a
+ jr nz, .asm_fc988
xor a
- ld [hl],a
- ld hl,$9
- add hl,bc
- ld a,[hl]
+ ld [hl], a
+ ld hl, $9
+ add hl, bc
+ ld a, [hl]
call Func_fc994
- ld [hl],a
+ ld [hl], a
.asm_fc988
call Func_fca99
- ld hl,wSpriteStateData2 - wSpriteStateData1
- add hl,bc
+ 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
+ ld hl, Pointer_fc9ac
+ ld d, a
.loop
- ld a,[hli]
+ ld a, [hli]
cp d
- jr nz,.loop
- ld a,[hl]
+ jr nz, .loop
+ ld a, [hl]
pop hl
ret
-
+
Func_fc9a0: ; fc9a0 (3f:49a0)
push hl
- ld hl,Pointer_fc9ac_End
- ld d,a
+ ld hl, Pointer_fc9ac_End
+ ld d, a
.loop
- ld a,[hld]
+ ld a, [hld]
cp d
- jr nz,.loop
- ld a,[hl]
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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
+ ld hl, $1
+ add hl, bc
+ ld [hl], $1
ret
-
+
Func_fca38: ; fca38 (3f:4a38)
- ld hl,$3
- add hl,bc
- ld e,[hl]
+ 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]
+ ld d, [hl]
+ ld hl, $104
+ add hl, bc
+ ld a, [hl]
add e
- ld [hli],a
- ld a,[hl]
+ ld [hli], a
+ ld a, [hl]
add d
- ld [hl],a
+ ld [hl], a
ret
-
+
Func_fca4b: ; fca4b (3f:4a4b)
- ld a,[wWalkBikeSurfState]
+ ld a, [wWalkBikeSurfState]
cp $1
- jr nz,Func_fca68
- ld a,[wd736]
- bit 6,a
- jr nz,Func_fca68
+ 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]
+ ld hl, $3
+ add hl, bc
+ ld a, [hli]
add a
add a
add [hl]
- ld [hli],a
- ld a,[hli]
+ ld [hli], a
+ ld a, [hli]
add a
add a
add [hl]
- ld [hl],a
+ ld [hl], a
ret
-
+
Func_fca68: ; fca68 (3f:4a68)
- ld hl,$3
- add hl,bc
- ld a,[hli]
+ ld hl, $3
+ add hl, bc
+ ld a, [hli]
add a
add [hl]
- ld [hli],a
- ld a,[hli]
+ ld [hli], a
+ ld a, [hli]
add a
add [hl]
- ld [hli],a
+ ld [hli], a
ret
-
+
Func_fca75: ; fca75 (3f:4a75)
- ld hl,$3
- add hl,bc
+ ld hl, $3
+ add hl, bc
xor a
- ld [hli],a
+ ld [hli], a
inc hl
- ld [hl],a
+ ld [hl], a
ret
-
+
Func_fca7e: ; fca7e (3f:4a7e)
call Func_fcdad
- ld d,$2
- jr nc,.asm_fca87
- ld d,$5
+ ld d, $2
+ jr nc, .asm_fca87
+ ld d, $5
.asm_fca87
- ld hl,$7
- add hl,bc
- ld a,[hl]
+ ld hl, $7
+ add hl, bc
+ ld a, [hl]
inc a
cp d
- jr nz,.asm_fca91
+ jr nz, .asm_fca91
xor a
.asm_fca91
- ld [hli],a
+ ld [hli], a
ret nz
- ld a,[hl]
+ ld a, [hl]
inc a
and $3
- ld [hl],a
+ ld [hl], a
ret
-
+
Func_fca99: ; fca99 (3f:4a99)
- ld a,[wd430]
- bit 3,a
- jr nz,.asm_fcad1
- ld hl,$10e
- add hl,bc
- ld a,[hl]
+ 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]
+ 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
+ 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
+ ld hl, $8
+ add hl, bc
+ ld a, d
or [hl]
- ld d,a
+ ld d, a
.asm_fcacb
- ld hl,$2
- add hl,bc
- ld [hl],d
+ ld hl, $2
+ add hl, bc
+ ld [hl], d
ret
+
.asm_fcad1
- ld hl,$2
- add hl,bc
- ld [hl],$ff
+ ld hl, $2
+ add hl, bc
+ ld [hl], $ff
ret
+
.asm_fcad8
- ld a,[wSpriteStateData1 + $2]
+ ld a, [wSpriteStateData1 + $2]
and $f
or d
- ld [wSpriteStateData1 + $f2],a
+ ld [wSpriteStateData1 + $f2], a
ret
-
+
Func_fcae2: ; fcae2 (3f:4ae2)
- ld hl,$104
- add hl,bc
- ld a,[wYCoord]
+ ld hl, $104
+ add hl, bc
+ ld a, [wYCoord]
add $4
cp [hl]
- jr nz,.asm_fcaff
+ jr nz, .asm_fcaff
inc hl
- ld a,[wXCoord]
+ ld a, [wXCoord]
add $4
cp [hl]
- jr nz,.asm_fcaff
- ld hl,$2
- add hl,bc
- ld [hl],$ff
+ jr nz, .asm_fcaff
+ ld hl, $2
+ add hl, bc
+ ld [hl], $ff
scf
ret
+
.asm_fcaff
and a
ret
@@ -988,49 +1019,53 @@ Func_fcb01: ; fcb01 (3f:4b01)
push bc
push de
push hl
- ld bc,wSpriteStateData1 + $f0
- ld a,[wXCoord]
+ ld bc, wSpriteStateData1 + $f0
+ ld a, [wXCoord]
add $4
- ld d,a
- ld a,[wYCoord]
+ ld d, a
+ ld a, [wYCoord]
add $4
- ld e,a
- ld hl,$104
- add hl,bc
- ld a,[hl]
+ ld e, a
+ ld hl, $104
+ add hl, bc
+ ld a, [hl]
sub e
and a
- jr z,.asm_fcb30
+ jr z, .asm_fcb30
cp $ff
- jr z,.asm_fcb26
+ jr z, .asm_fcb26
cp $1
- jr z,.asm_fcb26
+ jr z, .asm_fcb26
jr .asm_fcb48
+
.asm_fcb26
- ld hl,$105
- add hl,bc
- ld a,[hl]
+ ld hl, $105
+ add hl, bc
+ ld a, [hl]
sub d
- jr z,.asm_fcb43
+ jr z, .asm_fcb43
jr .asm_fcb48
+
.asm_fcb30
- ld hl,$105
- add hl,bc
- ld a,[hl]
+ ld hl, $105
+ add hl, bc
+ ld a, [hl]
sub d
cp $ff
- jr z,.asm_fcb43
+ jr z, .asm_fcb43
cp $1
- jr z,.asm_fcb43
+ jr z, .asm_fcb43
and a
- jr z,.asm_fcb43
+ jr z, .asm_fcb43
jr .asm_fcb48
+
.asm_fcb43
pop hl
pop de
pop bc
scf
ret
+
.asm_fcb48
pop hl
pop de
@@ -1038,258 +1073,281 @@ Func_fcb01: ; fcb01 (3f:4b01)
xor a
ret
-Func_fcb4d: ; fcb4d (3f:4b4d)
- call Func_fcb52
- ld e,a
+GetPikachuFacingDirectionAndReturnToE: ; fcb4d (3f:4b4d)
+ call GetPikachuFacingDirection
+ ld e, a
ret
-
-Func_fcb52: ; fcb52 (3f:4b52)
- ld bc,wSpriteStateData1 + $f0
- ld a,[wXCoord]
+
+GetPikachuFacingDirection: ; fcb52 (3f:4b52)
+ ld bc, wSpriteStateData1 + $f0
+ ld a, [wXCoord]
add $4
- ld d,a
- ld a,[wYCoord]
+ ld d, a
+ ld a, [wYCoord]
add $4
- ld e,a
- ld hl,$104
- add hl,bc
- ld a,[hl]
+ ld e, a
+ ld hl, wSpriteStateData2 - wSpriteStateData1 + 4
+ add hl, bc
+ ld a, [hl]
cp e
- jr z,Func_fcb71
- jr nc,.asm_fcb6e
- ld a,$4
+ jr z, .asm_fcb71
+ jr nc, .asm_fcb6e
+ ld a, SPRITE_FACING_UP
ret
+
.asm_fcb6e
- ld a,$0
+ ld a, SPRITE_FACING_DOWN
ret
-
-Func_fcb71: ; fcb71 (3f:4b71)
- ld hl,$105
- add hl,bc
- ld a,[hl]
+
+.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,$8
+ jr z, .asm_fcb81
+ jr nc, .asm_fcb7e
+ ld a, SPRITE_FACING_LEFT
ret
+
.asm_fcb7e
- ld a,$c
+ ld a, SPRITE_FACING_RIGHT
ret
+
.asm_fcb81
- ld a,$ff
+ ld a, $ff ; standing
ret
-Func_fcb84: ; fcb84 (3f:4b84)
+ClearPikachuFollowCommandBuffer: ; fcb84 (3f:4b84)
push bc
- ld hl,wd437
- ld [hl],$ff
+ ld hl, wPikachuFollowCommandBufferSize
+ ld [hl], $ff
inc hl
- ld bc,$10
+ ld bc, $10
xor a
call FillMemory
pop bc
ret
-
-Func_fcb94: ; fcb94 (3f:4b94)
- ld hl,wd437
+
+AppendPikachuFollowCommandToBuffer: ; fcb94 (3f:4b94)
+ ld hl, wPikachuFollowCommandBufferSize
inc [hl]
- ld e,[hl]
- ld d,0
- ld hl,wd438
- add hl,de
- ld [hl],a
+ ld e, [hl]
+ ld d, 0
+ ld hl, wPikachuFollowCommandBuffer
+ add hl, de
+ ld [hl], a
ret
-
+
Func_fcba1: ; fcba1 (3f:4ba1)
- call Func_fcb84
- call Func_fcbac
+ call ClearPikachuFollowCommandBuffer
+ call GetPikachuFollowCommand
ret c
- call Func_fcb94
- ret
-
-Func_fcbac: ; fcbac (3f:4bac)
- ld bc,wSpriteStateData1 + $f0
- ld hl,$104
- add hl,bc
- ld a,[wYCoord]
+ 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,.asm_fcbd7
- jr c,.asm_fcbca
- call Func_fcc01
- jr c,.asm_fcbc6
- ld a,$5
+ jr z, .checkXCoord
+ jr c, .pikaAbovePlayer
+ call CheckAbsoluteValueLessThan2
+ jr c, .return1
+ ld a, $5
and a
ret
-.asm_fcbc6
- ld a,$1
+
+.return1
+ ld a, $1
and a
ret
-.asm_fcbca
- call Func_fcc01
- jr c,.asm_fcbd3
- ld a,$6
+
+.pikaAbovePlayer
+ call CheckAbsoluteValueLessThan2
+ jr c, .return2
+ ld a, $6
and a
ret
-.asm_fcbd3
- ld a,$2
+
+.return2
+ ld a, $2
and a
ret
-.asm_fcbd7
- ld hl,$105
- add hl,bc
- ld a,[wXCoord]
+
+.checkXCoord
+ ld hl, wSpriteStateData2 - wSpriteStateData1 + 5
+ add hl, bc
+ ld a, [wXCoord]
add $4
sub [hl]
- jr z,.asm_fcbff
- jr c,.asm_fcbf2
- call Func_fcc01
- jr c,.asm_fcbee
- ld a,$8
+ jr z, .pikachuOnTopOfPlayer
+ jr c, .pikaToLeftOfPlayer
+ call CheckAbsoluteValueLessThan2
+ jr c, .return4
+ ld a, $8
and a
ret
-.asm_fcbee
- ld a,$4
+
+.return4
+ ld a, $4
and a
ret
-.asm_fcbf2
- call Func_fcc01
- jr c,.asm_fcbfb
- ld a,$7
+
+.pikaToLeftOfPlayer
+ call CheckAbsoluteValueLessThan2
+ jr c, .return3
+ ld a, $7
and a
ret
-.asm_fcbfb
- ld a,$3
+
+.return3
+ ld a, $3
and a
ret
-.asm_fcbff
+
+.pikachuOnTopOfPlayer
scf
ret
-
-Func_fcc01: ; fcc01 (3f:4c01)
- jr nc,.asm_fcc05
+
+CheckAbsoluteValueLessThan2: ; fcc01 (3f:4c01)
+ jr nc, .positive
cpl
inc a
-.asm_fcc05
+.positive
cp $2
ret
-
+
Func_fcc08:: ; fcc08 (3f:4c08)
call Func_fcc23
ret nc
- ld a,[wd736]
- bit 6,a
- jr nz,.asm_fcc1b
+ ld a, [wd736]
+ bit 6, a
+ jr nz, .asm_fcc1b
call Func_fcc42
ret c
- call Func_fcb94
+ call AppendPikachuFollowCommandToBuffer
ret
+
.asm_fcc1b
call Func_fcc64
ret c
- call Func_fcb94
+ call AppendPikachuFollowCommandToBuffer
ret
-
+
Func_fcc23: ; fcc23 (3f:4c28)
- ld a,[wd430]
- bit 5,a
- jr nz,.asm_fcc40
- ld a,[wd430]
- bit 7,a
- jr nz,.asm_fcc40
- ld a,[wd472]
- bit 7,a
- jr z,.asm_fcc40
- ld a,[wWalkBikeSurfState]
+ 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
+ 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
+ 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
+ ld a, $2
ret
+
.asm_fcc5b
- ld a,$1
+ ld a, $1
ret
+
.asm_fcc5e
- ld a,$3
+ ld a, $3
ret
+
.asm_fcc61
- ld a,$4
+ ld a, $4
ret
-
+
Func_fcc64: ; fcc64 (3f:4c64)
- ld hl,wd430
- bit 6,[hl]
- jr z,.asm_fcc6e
- res 6,[hl]
+ ld hl, wPikachuOverworldStateFlags
+ bit 6, [hl]
+ jr z, .asm_fcc6e
+ res 6, [hl]
ret
+
.asm_fcc6e
- set 6,[hl]
+ 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
+ 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
+ ld a, $6
ret
+
.asm_fcc89
- ld a,$5
+ ld a, $5
ret
+
.asm_fcc8c
- ld a,$7
+ ld a, $7
ret
+
.asm_fcc8f
- ld a,$8
+ ld a, $8
ret
Func_fcc92: ; fcc92 (3f:4c92)
- ld hl,wd437
- ld a,[hl]
+ ld hl, wPikachuFollowCommandBufferSize
+ ld a, [hl]
cp $ff
- jr z,.asm_fccb0
+ jr z, .asm_fccb0
and a
- jr z,.asm_fccb0
+ jr z, .asm_fccb0
dec [hl]
- ld e,a
- ld d,0
- ld hl,wd438
- add hl,de
+ ld e, a
+ ld d, 0
+ ld hl, wPikachuFollowCommandBuffer
+ add hl, de
inc e
- ld a,$ff
+ ld a, $ff
.asm_fcca8
- ld d,[hl]
- ldd [hl],a
- ld a,d
+ ld d, [hl]
+ ldd [hl], a
+ ld a, d
dec e
- jr nz,.asm_fcca8
+ jr nz, .asm_fcca8
and a
ret
+
.asm_fccb0
scf
ret
@@ -1297,384 +1355,399 @@ Func_fcc92: ; fcc92 (3f:4c92)
Func_fccb2:: ; fccb2 (3f:4cb2)
call Func_fcd01
and a
- jr z,.asm_fccbf
+ jr z, .asm_fccbf
dec a
and $3
add a
add a
jr .asm_fccea
+
.asm_fccbf
- ld a,[wYCoord]
+ ld a, [wYCoord]
add $4
- ld d,a
- ld a,[wXCoord]
+ ld d, a
+ ld a, [wXCoord]
add $4
- ld e,a
- ld a,[wSpriteStateData2 + $f4]
+ 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 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]
+ 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 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]
+ ld a, [wSpriteStateData1 + $9]
.asm_fccea
- ld [wSpriteStateData1 + $f9],a
+ ld [wSpriteStateData1 + $f9], a
ret
-
+
Func_fccee: ; fccee (3f:4cee)
- ld hl,wd437
- ld a,[hl]
+ ld hl, wPikachuFollowCommandBufferSize
+ ld a, [hl]
cp $ff
- jr z,.asm_fccff
- ld e,a
- ld d,0
- ld hl,wd438
- add hl,de
- ld a,[hl]
+ 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,wd437
- ld a,[hl]
+ ld hl, wPikachuFollowCommandBufferSize
+ ld a, [hl]
cp $ff
- jr z,.asm_fcd15
+ jr z, .asm_fcd15
and a
- jr z,.asm_fcd15
- ld e,a
- ld d,0
- ld hl,wd438
- add hl,de
- ld a,[hl]
+ 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,[wd437]
+ ld a, [wPikachuFollowCommandBufferSize]
cp $ff
ret z
cp $2
- jr nc,.asm_fcd23
+ jr nc, .asm_fcd23
and a
ret
+
.asm_fcd23
scf
ret
-
+
Func_fcd25: ; fcd25 (3f:4d25)
- ld h,wSpriteStateData2 / $100
- ld a,[H_CURRENTSPRITEOFFSET]
+ ld h, wSpriteStateData2 / $100
+ ld a, [H_CURRENTSPRITEOFFSET]
add $4
- ld l,a
- ld b,[hl]
- ld a,[wYCoord]
+ ld l, a
+ ld b, [hl]
+ ld a, [wYCoord]
cp b
- jr z,.asm_fcd3a
- jr nc,.asm_fcd63
+ jr z, .asm_fcd3a
+ jr nc, .asm_fcd63
add $8
cp b
- jr c,.asm_fcd63
+ jr c, .asm_fcd63
.asm_fcd3a
inc l
- ld b,[hl]
- ld a,[wXCoord]
+ ld b, [hl]
+ ld a, [wXCoord]
cp b
- jr z,.asm_fcd49
- jr nc,.asm_fcd63
+ jr z, .asm_fcd49
+ jr nc, .asm_fcd63
add $9
cp b
- jr c,.asm_fcd63
+ jr c, .asm_fcd63
.asm_fcd49
call Func_fcd83
- ld d,$60
- ld a,[hli]
- ld e,a
+ ld d, $60
+ ld a, [hli]
+ ld e, a
cp d
- jr nc,.asm_fcd63
- ld a,[hld]
+ jr nc, .asm_fcd63
+ ld a, [hld]
cp d
- jr nc,.asm_fcd63
- ld bc,-20
- add hl,bc
- ld a,[hli]
+ jr nc, .asm_fcd63
+ ld bc, -20
+ add hl, bc
+ ld a, [hli]
cp d
- jr nc,.asm_fcd63
- ld a,[hl]
+ jr nc, .asm_fcd63
+ ld a, [hl]
cp d
- jr c,.asm_fcd6f
+ jr c, .asm_fcd6f
.asm_fcd63
- ld h,wSpriteStateData1 / $100
- ld a,[H_CURRENTSPRITEOFFSET]
+ ld h, wSpriteStateData1 / $100
+ ld a, [H_CURRENTSPRITEOFFSET]
add $2
- ld l,a
- ld [hl],$ff
+ ld l, a
+ ld [hl], $ff
scf
jr .asm_fcd82
+
.asm_fcd6f
- ld h,wSpriteStateData2 / $100
- ld a,[H_CURRENTSPRITEOFFSET]
+ ld h, wSpriteStateData2 / $100
+ ld a, [H_CURRENTSPRITEOFFSET]
add $7
- ld l,a
- ld a,[wGrassTile]
+ ld l, a
+ ld a, [wGrassTile]
cp e
- ld a,$0
- jr nz,.asm_fcd80
- ld a,$80
+ ld a, $0
+ jr nz, .asm_fcd80
+ ld a, $80
.asm_fcd80
- ld [hl],a
+ ld [hl], a
and a
.asm_fcd82
ret
-
+
Func_fcd83: ; fcd83 (3f:4d83)
- ld h,wSpriteStateData1 / $100
- ld a,[H_CURRENTSPRITEOFFSET]
+ ld h, wSpriteStateData1 / $100
+ ld a, [H_CURRENTSPRITEOFFSET]
add $4
- ld l,a
- ld a,[hli]
+ ld l, a
+ ld a, [hli]
add $4
and $f0
srl a
- ld c,a
- ld b,$0
+ ld c, a
+ ld b, $0
inc l
- ld a,[hl]
+ ld a, [hl]
add $2
srl a
srl a
srl a
add SCREEN_WIDTH
- ld d,0
- ld e,a
- ld hl,wTileMap
+ ld d, 0
+ ld e, a
+ ld hl, wTileMap
rept 5
- add hl,bc
+ add hl, bc
endr
- add hl,de
+ add hl, de
ret
-
+
Func_fcdad: ; fcdad (3f:4dad)
push bc
push af
- ld a,[wPikachuHappiness]
+ ld a, [wPikachuHappiness]
cp $50
pop bc
- ld a,b
+ ld a, b
pop bc
ret
IsStarterPikachuInOurParty:: ; fcdb8 (3f:4db8)
- ld hl,wPartySpecies
- ld de,wPartyMon1OTID
- ld bc,wPartyMonOT
+ ld hl, wPartySpecies
+ ld de, wPartyMon1OTID
+ ld bc, wPartyMonOT
push hl
.loop
pop hl
- ld a,[hli]
+ ld a, [hli]
push hl
inc a
- jr z,.noPlayerPikachu
+ jr z, .noPlayerPikachu
cp PIKACHU + 1
- jr nz,.curMonNotPlayerPikachu
- ld h,d
- ld l,e
- ld a,[wPlayerID]
+ jr nz, .curMonNotPlayerPikachu
+ ld h, d
+ ld l, e
+ ld a, [wPlayerID]
cp [hl]
- jr nz,.curMonNotPlayerPikachu
+ jr nz, .curMonNotPlayerPikachu
inc hl
- ld a,[wPlayerID+1]
+ ld a, [wPlayerID+1]
cp [hl]
- jr nz,.curMonNotPlayerPikachu
+ jr nz, .curMonNotPlayerPikachu
push de
push bc
- ld hl,wPlayerName
- ld d,$6 ; possible player length - 1
+ ld hl, wPlayerName
+ ld d, $6 ; possible player length - 1
.nameCompareLoop
dec d
- jr z,.sameOT
- ld a,[bc]
+ jr z, .sameOT
+ ld a, [bc]
inc bc
cp [hl]
inc hl
- jr z,.nameCompareLoop
+ 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
+ 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]
+ 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?
+ 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
+ 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
+ ld hl, wPartyMon1
+ ld bc, wPartyMon2 - wPartyMon1
+ ld de, wPartyMonOT
asm_fce21: ; fce21 (3f:4e21)
- ld a,[wWhichPokemon]
+ ld a, [wWhichPokemon]
call AddNTimes
- ld a,[hl]
+ ld a, [hl]
cp PIKACHU
- jr nz,.notPlayerPikachu
- ld bc,wPartyMon1OTID - wPartyMon1
- add hl,bc
- ld a,[wPlayerID]
+ jr nz, .notPlayerPikachu
+ ld bc, wPartyMon1OTID - wPartyMon1
+ add hl, bc
+ ld a, [wPlayerID]
cp [hl]
- jr nz,.notPlayerPikachu
+ jr nz, .notPlayerPikachu
inc hl
- ld a,[wPlayerID+1]
+ ld a, [wPlayerID+1]
cp [hl]
- jr nz,.notPlayerPikachu
- ld h,d
- ld l,e
- ld a,[wWhichPokemon]
- ld bc,NAME_LENGTH
+ jr nz, .notPlayerPikachu
+ ld h, d
+ ld l, e
+ ld a, [wWhichPokemon]
+ ld bc, NAME_LENGTH
call AddNTimes
- ld de,wPlayerName
- ld b,$6
+ ld de, wPlayerName
+ ld b, $6
.loop
dec b
- jr z,.isPlayerPikachu
- ld a,[de]
+ jr z, .isPlayerPikachu
+ ld a, [de]
inc de
cp [hl]
inc hl
- jr z,.loop
+ 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
+ ld a, d
cp $80
- ld a,[wPikachuMood]
- jr c,.asm_fce6c
+ ld a, [wPikachuMood]
+ jr c, .asm_fce6c
cp d
- jr c,.asm_fce6e
+ jr c, .asm_fce6e
ret
+
.asm_fce6c
cp d
ret c
.asm_fce6e
- ld a,d
- ld [wPikachuMood],a
+ ld a, d
+ ld [wPikachuMood], a
ret
Func_fce73:: ; fce73 (3f:4e73)
; function to test if a pokemon is alive?
xor a
- ld [wWhichPokemon],a
- ld hl,wPartyCount
+ ld [wWhichPokemon], a
+ ld hl, wPartyCount
.loop
inc hl
- ld a,[hl]
+ ld a, [hl]
cp $ff
- jr z,.asm_fcea9
+ 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
+ jr nc, .asm_fce9e
+ ld a, [wWhichPokemon]
+ ld hl, wPartyMon1HP
+ ld bc, wPartyMon2 - wPartyMon1
call AddNTimes
- ld a,[hli]
+ ld a, [hli]
or [hl]
- ld d,a
+ ld d, a
inc hl
inc hl
- ld a,[hl]
+ ld a, [hl]
and a
- jr nz,.asm_fcea7
+ jr nz, .asm_fcea7
jr .asm_fcea9
+
.asm_fce9e
- ld a,[wWhichPokemon]
+ ld a, [wWhichPokemon]
inc a
- ld [wWhichPokemon],a
+ ld [wWhichPokemon], a
jr .loop
+
.asm_fcea7
scf
ret
+
.asm_fcea9
and a
ret
-Func_fceab:: ; fceab (3f:4eab)
- ld hl,wPartySpecies
- ld de,wPartyMon1Moves
- ld bc,wPartyMonOT
+IsSurfingPikachuInThePlayersParty:: ; fceab (3f:4eab)
+ ld hl, wPartySpecies
+ ld de, wPartyMon1Moves
+ ld bc, wPartyMonOT
push hl
.loop
pop hl
- ld a,[hli]
+ ld a, [hli]
push hl
inc a
- jr z,.noSurfingPlayerPikachu
+ jr z, .noSurfingPlayerPikachu
cp PIKACHU+1
- jr nz,.curMonNotSurfingPlayerPikachu
- ld h,d
- ld l,e
+ jr nz, .curMonNotSurfingPlayerPikachu
+ ld h, d
+ ld l, e
push hl
push bc
- ld b,NUM_MOVES
+ ld b, NUM_MOVES
.moveSearchLoop
- ld a,[hli]
+ ld a, [hli]
cp SURF
- jr z,.foundSurfingPikachu
+ jr z, .foundSurfingPikachu
dec b
- jr nz,.moveSearchLoop
+ jr nz, .moveSearchLoop
pop bc
pop hl
jr .curMonNotSurfingPlayerPikachu
+
.foundSurfingPikachu
pop bc
pop hl
@@ -1682,635 +1755,54 @@ Func_fceab:: ; fceab (3f:4eab)
inc hl
inc hl
inc hl
- ld a,[wPlayerID]
+ ld a, [wPlayerID]
cp [hl]
- jr nz,.curMonNotSurfingPlayerPikachu
+ jr nz, .curMonNotSurfingPlayerPikachu
inc hl
- ld a,[wPlayerID+1]
+ ld a, [wPlayerID+1]
cp [hl]
- jr nz,.curMonNotSurfingPlayerPikachu
+ jr nz, .curMonNotSurfingPlayerPikachu
push de
push bc
- ld hl,wPlayerName
- ld d,$6
+ ld hl, wPlayerName
+ ld d, $6
.nameCompareLoop
dec d
- jr z,.foundSurfingPlayerPikachu
- ld a,[bc]
+ jr z, .foundSurfingPlayerPikachu
+ ld a, [bc]
inc bc
cp [hl]
inc hl
- jr z,.nameCompareLoop
+ 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
+ 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
-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
+INCLUDE "engine/pikachu_pic_animation.asm"
-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, Jumptable_fcf54
- add hl, bc
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- call JumpToAddress
- jr .loop
-.done
- ret
-
-Jumptable_fcf54: ; fcf54 (3f:4f54)
- dw Func_fcf6a
- dw Func_fcf6b
- dw Func_fcf77
- dw Func_fcf8d
- dw Func_fcfb0
- dw Func_fd9d0
- dw Func_fcfc7
- dw Func_fcfbe
- dw Func_fcfe8
- dw Func_fcfe9
- dw Func_fcf6a
-
-Func_fcf6a: ; fcf6a (3f:4f6a)
- ret
-
-Func_fcf6b: ; 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
-
-Func_fcf77: ; fcf77 (3f:4f77)
- ld a, [de]
- inc de
- push de
- ld e, a
- nop
- call Func_fcf81
- pop de
- ret
-
-Func_fcf81: ; fcf81 (3f:4f81)
- cp $ff
- ret z
- callab PlayPikachuSoundClip
- ret
-
-Func_fcf8d: ; fcf8d (3f:4f8d)
- ld a, [wUpdateSpritesEnabled]
- push af
- ld a, $ff
- ld [wUpdateSpritesEnabled], a
- ld a, [de]
- inc de
- push de
- call Func_fcfa2
- pop de
- pop af
- ld [wUpdateSpritesEnabled], a
- ret
-
-Func_fcfa2: ; fcfa2 (3f:4fa2)
- ld [wWhichEmotionBubble], a
- ld a, $f
- ld [wEmotionBubbleSpriteIndex], a
- predef EmotionBubble
- ret
-
-Func_fcfb0: ; 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
-
-Func_fcfbe: ; fcfbe (3f:4fbe)
- ld a, [de]
- inc de
- push de
- ld c, a
- call DelayFrames
- pop de
- ret
-
-Func_fcfc7: ; 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 Func_fd8ab
- dw LoadFontTilePatterns
- dw Func_fd8f8
- dw WaitForTextScrollButtonPress
- dw Func_fd8d4
- dw Func_fd8e1
- dw Func_fd8ee
-
-Func_fcfe8: ; fcfe8 (3f:4fe8)
- ret
-
-Func_fcfe9: ; 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 Func_fd978
- 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 Func_154a
- ld a, $1e
- jr nz, .asm_fd0c9
- jr .asm_fd096
-.notFanClub
- ld a, [wCurMap]
- cp PEWTER_POKECENTER
- jr nz, .notPewterPokecenter
- call Func_154a
- 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
+Func_fe66e:
ret
-
-PikachuEmotion0_fd115: ; fd115 (3f:5115)
- db $ff
-
-PikachuEmotion2_fd116: ; fd116 (3f:5116)
- pikaemotion_dummy2
- pikaemotion_emotebubble SMILE_BUBBLE
- pikaemotion_pcm $22
- pikaemotion_5 $2
- db $ff
-
-PikachuEmotion10_fd11e: ; fd11e (3f:511e)
- pikaemotion_dummy2
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES
- pikaemotion_emotebubble HEART_BUBBLE
- pikaemotion_pcm $4
- pikaemotion_5 $a
- db $ff
-
-PikachuEmotion7_fd128: ; fd128 (3f:5128)
- pikaemotion_dummy2
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES
- pikaemotion_4 Pointer_fd224
- pikaemotion_pcm $0
- 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 $1c
- pikaemotion_5 $4
- db $ff
-
-PikachuEmotion1_fd141: ; fd141 (3f:5141)
- pikaemotion_dummy2
- pikaemotion_pcm $ff
- pikaemotion_5 $1
- db $ff
-
-PikachuEmotion8_fd147: ; fd147 (3f:5147)
- pikaemotion_dummy2
- pikaemotion_pcm $26
- pikaemotion_5 $8
- db $ff
-
-PikachuEmotion5_fd14d: ; fd14d (3f:514d)
- pikaemotion_dummy2
- pikaemotion_pcm $1e
- pikaemotion_5 $5
- db $ff
-
-PikachuEmotion6_fd153: ; fd153 (3f:5153)
- pikaemotion_dummy2
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES
- pikaemotion_pcm $ff
- pikaemotion_4 Pointer_fd21e
- pikaemotion_emotebubble SKULL_BUBBLE
- pikaemotion_5 $6
- db $ff
-
-PikachuEmotion3_fd160: ; fd160 (3f:5160)
- pikaemotion_dummy2
- pikaemotion_pcm $27
- pikaemotion_5 $3
- db $ff
-
-PikachuEmotion9_fd166: ; fd166 (3f:5166)
- pikaemotion_dummy2
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES
- pikaemotion_pcm $5
- pikaemotion_4 Pointer_fd218
- pikaemotion_emotebubble SKULL_BUBBLE
- pikaemotion_5 $9
- db $ff
-
-PikachuEmotion11_fd173: ; fd173 (3f:5173)
- pikaemotion_emotebubble ZZZ_BUBBLE
- pikaemotion_pcm $24
- pikaemotion_5 $b
- db $ff
-
-PikachuEmotion12_fd17a: ; fd17a (3f:517a)
- pikaemotion_dummy2
- pikaemotion_pcm $ff
- 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 $9
- pikaemotion_5 $e
- db $ff
-
-PikachuEmotion15_fd191: ; fd191 (3f:5191)
- pikaemotion_dummy2
- pikaemotion_pcm $21
- pikaemotion_5 $f
- db $ff
-
-PikachuEmotion16_fd197: ; fd197 (3f:5197)
- pikaemotion_dummy2
- pikaemotion_pcm $20
- pikaemotion_5 $10
- db $ff
-
-PikachuEmotion17_fd19d: ; fd19d (3f:519d)
- pikaemotion_dummy2
- pikaemotion_pcm $c
- pikaemotion_5 $11
- db $ff
-
-PikachuEmotion18_fd1a3: ; fd1a3 (3f:51a3)
- pikaemotion_dummy2
- pikaemotion_pcm $ff
- pikaemotion_5 $12
- db $ff
-
-PikachuEmotion19_fd1a9: ; fd1a9 (3f:51a9)
- pikaemotion_dummy2
- pikaemotion_emotebubble HEART_BUBBLE
- pikaemotion_pcm $20
- pikaemotion_5 $13
- db $ff
-
-PikachuEmotion20_fd1b1: ; fd1b1 (3f:51b1)
- pikaemotion_dummy2
- pikaemotion_emotebubble HEART_BUBBLE
- pikaemotion_pcm $4
- pikaemotion_5 $14
- db $ff
-
-PikachuEmotion21_fd1b9: ; fd1b9 (3f:51b9)
- pikaemotion_dummy2
- pikaemotion_emotebubble FISH_BUBBLE
- pikaemotion_pcm $ff
- pikaemotion_5 $15
- db $ff
-
-PikachuEmotion22_fd1c1: ; fd1c1 (3f:51c1)
- pikaemotion_dummy2
- pikaemotion_pcm $3
- pikaemotion_5 $16
- db $ff
-
-PikachuEmotion23_fd1c7: ; fd1c7 (3f:51c7)
- pikaemotion_dummy2
- pikaemotion_pcm $12
- pikaemotion_5 $17
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_SHOWMAPVIEW
- db $ff
-
-PikachuEmotion24_fd1cf: ; fd1cf (3f:51cf)
- pikaemotion_dummy2
- pikaemotion_emotebubble EXCLAMATION_BUBBLE
- pikaemotion_pcm $ff
- pikaemotion_5 $18
- db $ff
-
-PikachuEmotion25_fd1d7: ; fd1d7 (3f:51d7)
- pikaemotion_dummy2
- pikaemotion_emotebubble BOLT_BUBBLE
- pikaemotion_pcm $22
- pikaemotion_5 $19
- db $ff
-
-PikachuEmotion26_fd1df: ; fd1df (3f:51df)
- pikaemotion_dummy2
- pikaemotion_emotebubble ZZZ_BUBBLE
- pikaemotion_pcm $24
- pikaemotion_5 $1a
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_SHOWMAPVIEW
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_CHECKPEWTERCENTER
- db $ff
-
-PikachuEmotion27_fd1eb: ; fd1eb (3f:51eb)
- pikaemotion_dummy2
- pikaemotion_pcm $8
- pikaemotion_5 $1b
- db $ff
-
-PikachuEmotion28_fd1f1: ; fd1f1 (3f:51f1)
- pikaemotion_dummy2
- pikaemotion_pcm $e
- pikaemotion_5 $1c
- db $ff
-
-PikachuEmotion29_fd1f7: ; fd1f7 (3f:51f7)
- pikaemotion_pcm $4
- pikaemotion_5 $a
- db $ff
-
-PikachuEmotion30_fd1fc: ; fd1fc (3f:51fc)
- pikaemotion_9
- pikaemotion_emotebubble HEART_BUBBLE
- pikaemotion_pcm $4
- 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 $12
- pikaemotion_5 $17
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_SHOWMAPVIEW
- pikaemotion_subcmd PIKAEMOTION_SUBCMD_CHECKBILLSHOUSE
- db $ff
-
-PikachuEmotion32_fd213: ; fd213 (3f:5213)
- pikaemotion_pcm $19
- pikaemotion_5 $17
- db $ff
-
-Pointer_fd218: ; fd218 (3f:5218)
- dr $fd218,$fd21e
-Pointer_fd21e: ; fd21e (3f:521e)
- dr $fd21e,$fd224
-Pointer_fd224: ; fd224 (3f:5224)
- dr $fd224,$fd230
-Pointer_fd230: ; fd230 (3f:5230)
- dr $fd230,$fd252
-Func_fd252: ; fd252 (3f:5252)
- dr $fd252,$fd2a1
-Func_fd2a1:: ; fd2a1 (3f:52a1)
- dr $fd2a1,$fd8ab
-Func_fd8ab: ; fd8ab (3f:58ab)
- dr $fd8ab,$fd8d4
-Func_fd8d4: ; fd8d4 (3f:58d4)
- dr $fd8d4,$fd8e1
-Func_fd8e1: ; fd8e1 (3f:58e1)
- dr $fd8e1,$fd8ee
-Func_fd8ee: ; fd8ee (3f:58ee)
- dr $fd8ee,$fd8f8
-Func_fd8f8: ; fd8f8 (3f:58f8)
- dr $fd8f8,$fd978
-Func_fd978: ; fd978 (3f:5978)
- dr $fd978,$fd9d0
-Func_fd9d0: ; fd9d0 (3f:59d0)
- dr $fd9d0,$fe66f
OfficerJennySprite: INCBIN "gfx/sprites/officer_jenny.2bpp"
PikachuSprite: INCBIN "gfx/sprites/pikachu.2bpp"
@@ -2322,4 +1814,4 @@ Clefairy2Sprite: INCBIN "gfx/sprites/clefairy2.2bpp"
ChanseySprite: INCBIN "gfx/sprites/chansey.2bpp"
SurfingPikachuSprite: INCBIN "gfx/sprites/surfing_pikachu.2bpp"
JessieSprite: INCBIN "gfx/sprites/jessie.2bpp"
-JamesSprite: INCBIN "gfx/sprites/james.2bpp" \ No newline at end of file
+JamesSprite: INCBIN "gfx/sprites/james.2bpp"
diff --git a/engine/evolution.asm b/engine/evolution.asm
index c65cc293..780d78e7 100755
--- a/engine/evolution.asm
+++ b/engine/evolution.asm
@@ -1,4 +1,4 @@
-EvolveMon: ; 7bde9 (1e:7de9)
+EvolveMon: ; 5da70 (17:5a70)
push hl
push de
push bc
@@ -9,9 +9,7 @@ EvolveMon: ; 7bde9 (1e:7de9)
xor a
ld [wLowHealthAlarm], a
ld [wChannelSoundIDs + CH4], a
- dec a
- ld [wNewSoundID], a
- call PlaySound
+ call StopAllMusic
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a
ld a, SFX_TINK
@@ -67,9 +65,7 @@ EvolveMon: ; 7bde9 (1e:7de9)
ld a, [wEvoNewSpecies]
.done
ld [wWholeScreenPaletteMonSpecies], a
- ld a, $ff
- ld [wNewSoundID], a
- call PlaySound
+ call StopAllMusic
ld a, [wWholeScreenPaletteMonSpecies]
call PlayCry
ld c, 0
diff --git a/engine/game_corner_slots2.asm b/engine/game_corner_slots2.asm
index 1bcbefb1..3f7c3f71 100755
--- a/engine/game_corner_slots2.asm
+++ b/engine/game_corner_slots2.asm
@@ -6,13 +6,13 @@ AbleToPlaySlotsCheck: ; 2fdfd (b:7dfd)
predef GetQuantityOfItemInBag
ld a, b
and a
- ld b, GameCornerCoinCaseText_id ; - TextPredefs) / 2 + 1
+ ld b, (GameCornerCoinCaseText_id - TextPredefs) / 2 + 1
jr z, .printCoinCaseRequired
ld hl, wPlayerCoins
ld a, [hli]
or [hl]
jr nz, .done ; able to play
- ld b, GameCornerNoCoinsText_id ; - TextPredefs) / 2 + 1
+ ld b, (GameCornerNoCoinsText_id - TextPredefs) / 2 + 1
.printCoinCaseRequired
call EnableAutoTextBoxDrawing
ld a, b
diff --git a/engine/hidden_object_functions17.asm b/engine/hidden_object_functions17.asm
index 90b26578..8e5920d5 100755
--- a/engine/hidden_object_functions17.asm
+++ b/engine/hidden_object_functions17.asm
@@ -1,4 +1,4 @@
-PrintRedsNESText: ; 5db79 (17:5b79)
+PrintRedsNESText: ; 5dbae (17:5bae)
call EnableAutoTextBoxDrawing
tx_pre_jump RedBedroomSNESText
@@ -22,7 +22,10 @@ Route15GateLeftBinoculars: ; 5db8f (17:5b8f)
ld a, ARTICUNO
ld [wcf91], a
call PlayCry
- jp DisplayMonFrontSpriteInBox
+ call DisplayMonFrontSpriteInBox
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ ret
Route15UpstairsBinocularsText: ; 5dba8 (17:5ba8)
TX_FAR _Route15UpstairsBinocularsText
@@ -52,6 +55,30 @@ KabutopsFossilText: ; 5dbd4 (17:5bd4)
TX_FAR _KabutopsFossilText
db "@"
+FanClubPicture1: ; 5dbad (17:5c12)
+ ld a, RAPIDASH
+ ld [wcf91], a
+ call DisplayMonFrontSpriteInBox
+ call EnableAutoTextBoxDrawing
+ tx_pre FanClubPicture1Text
+ ret
+
+FanClubPicture1Text: ; 5dbbe (17:5bbe)
+ TX_FAR _FanClubPicture1Text
+ db "@"
+
+FanClubPicture2: ; 5dbad (17:5c28)
+ ld a, FEAROW
+ ld [wcf91], a
+ call DisplayMonFrontSpriteInBox
+ call EnableAutoTextBoxDrawing
+ tx_pre FanClubPicture2Text
+ ret
+
+FanClubPicture2Text: ; 5dc39 (17:5c39)
+ TX_FAR _FanClubPicture2Text
+ db "@"
+
DisplayMonFrontSpriteInBox: ; 5dbd9 (17:5bd9)
; Displays a pokemon's front sprite in a pop-up window.
; [wcf91] = pokemon interal id number
@@ -110,8 +137,7 @@ LinkCableHelp: ; 5dc29 (17:5c29)
ld hl, wd730
set 6, [hl]
coord hl, 0, 0
- ld b, $8
- ld c, $d
+ lb bc, $8, $d
call TextBoxBorder
coord hl, 2, 2
ld de, HowToLinkText
@@ -339,53 +365,17 @@ GymTrashScript: ; 5ddfc (17:5dfc)
.openFirstLock
; Next can is trying for the second switch.
SetEvent EVENT_1ST_LOCK_OPENED
-
- ld hl, GymTrashCans
- ld a, [wGymTrashCanIndex]
- ; * 5
- ld b, a
- add a
- add a
- add b
-
- ld d, 0
- ld e, a
- add hl, de
- ld a, [hli]
-
-; There is a bug in this code. It should calculate a value in the range [0, 3]
-; but if the mask and random number don't have any 1 bits in common, then
-; the result of the AND will be 0. When 1 is subtracted from that, the value
-; will become $ff. This will result in 255 being added to hl, which will cause
-; hl to point to one of the zero bytes that pad the end of the ROM bank.
-; Trash can 0 was intended to be able to have the second lock only when the
-; first lock was in trash can 1 or 3. However, due to this bug, trash can 0 can
-; have the second lock regardless of which trash can had the first lock.
-
- ld [hGymTrashCanRandNumMask], a
- push hl
- call Random
- swap a
- ld b, a
- ld a, [hGymTrashCanRandNumMask]
- and b
- dec a
- pop hl
-
- ld d, 0
- ld e, a
- add hl, de
- ld a, [hl]
- and $f
- ld [wSecondLockTrashCanIndex], a
-
+ callab Func_f2d0c
tx_pre_id VermilionGymTrashSuccesText1
jr .done
.trySecondLock
- ld a, [wSecondLockTrashCanIndex]
- ld b, a
ld a, [wGymTrashCanIndex]
+ ld b, a
+ ld a, [wSecondLockTrashCanIndex]
+ cp b
+ jr z, .openSecondLock
+ ld a, [wSecondLockTrashCanIndex + 1]
cp b
jr z, .openSecondLock
@@ -413,25 +403,26 @@ GymTrashScript: ; 5ddfc (17:5dfc)
GymTrashCans: ; 5de7d (17:5e7d)
; byte 0: mask for random number
; bytes 1-4: indices of the trash cans that can have the second lock
-; (but see the comment above explaining a bug regarding this)
; Note that the mask is simply the number of valid trash can indices that
-; follow. The remaining bytes are filled with 0 to pad the length of each entry
+; follow. The remaining bytes are filled with -1 to pad the length of each entry
; to 5 bytes.
- db 2, 1, 3, 0, 0 ; 0
- db 3, 0, 2, 4, 0 ; 1
- db 2, 1, 5, 0, 0 ; 2
- db 3, 0, 4, 6, 0 ; 3
+; This is functionally replaced with GymTrashCans3a but was never removed from source.
+
+ db 2, 1, 3, -1, -1 ; 0
+ db 3, 0, 2, 4, -1 ; 1
+ db 2, 1, 5, -1, -1 ; 2
+ db 3, 0, 4, 6, -1 ; 3
db 4, 1, 3, 5, 7 ; 4
- db 3, 2, 4, 8, 0 ; 5
- db 3, 3, 7, 9, 0 ; 6
+ db 3, 2, 4, 8, -1 ; 5
+ db 3, 3, 7, 9, -1 ; 6
db 4, 4, 6, 8, 10 ; 7
- db 3, 5, 7, 11, 0 ; 8
- db 3, 6, 10, 12, 0 ; 9
+ db 3, 5, 7, 11, -1 ; 8
+ db 3, 6, 10, 12, -1 ; 9
db 4, 7, 9, 11, 13 ; 10
- db 3, 8, 10, 14, 0 ; 11
- db 2, 9, 13, 0, 0 ; 12
- db 3, 10, 12, 14, 0 ; 13
- db 2, 11, 13, 0, 0 ; 14
+ db 3, 8, 10, 14, -1 ; 11
+ db 2, 9, 13, -1, -1 ; 12
+ db 3, 10, 12, 14, -1 ; 13
+ db 2, 11, 13, -1, -1 ; 14
; 5dec8
VermilionGymTrashSuccesText1: ; 5dec8 (17:5ec8)
diff --git a/engine/hidden_object_functions18.asm b/engine/hidden_object_functions18.asm
index ab66a818..443f8369 100755
--- a/engine/hidden_object_functions18.asm
+++ b/engine/hidden_object_functions18.asm
@@ -1,4 +1,4 @@
-GymStatues: ; 62419 (18:6419)
+GymStatues: ; 625e8 (18:65e8)
; if in a gym and have the corresponding badge, a = GymStatueText2_id and jp PrintPredefTextID
; if in a gym and don’t have the corresponding badge, a = GymStatueText1_id and jp PrintPredefTextID
; else ret
@@ -29,14 +29,14 @@ GymStatues: ; 62419 (18:6419)
jp PrintPredefTextID
.BadgeFlags: ; 62442 (18:6442)
- db PEWTER_GYM, %00000001
- db CERULEAN_GYM, %00000010
- db VERMILION_GYM,%00000100
- db CELADON_GYM, %00001000
- db FUCHSIA_GYM, %00010000
- db SAFFRON_GYM, %00100000
- db CINNABAR_GYM, %01000000
- db VIRIDIAN_GYM, %10000000
+ db PEWTER_GYM, %00000001
+ db CERULEAN_GYM, %00000010
+ db VERMILION_GYM, %00000100
+ db CELADON_GYM, %00001000
+ db FUCHSIA_GYM, %00010000
+ db SAFFRON_GYM, %00100000
+ db CINNABAR_GYM, %01000000
+ db VIRIDIAN_GYM, %10000000
db $ff
GymStatueText1: ; 62453 (18:6453)
@@ -72,30 +72,36 @@ PrintBenchGuyText: ; 6245d (18:645d)
; format: db map id, player sprite facing direction, text id of PredefTextIDPointerTable
BenchGuyTextPointers: ; 6247e (18:647e)
- db VIRIDIAN_POKECENTER, SPRITE_FACING_LEFT
- db (ViridianCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
- db PEWTER_POKECENTER, SPRITE_FACING_LEFT
- db (PewterCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
- db CERULEAN_POKECENTER, SPRITE_FACING_LEFT
- db (CeruleanCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
- db LAVENDER_POKECENTER, SPRITE_FACING_LEFT
- db (LavenderCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
- db VERMILION_POKECENTER, SPRITE_FACING_LEFT
- db (VermilionCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
- db CELADON_POKECENTER, SPRITE_FACING_LEFT
- db (CeladonCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
- db CELADON_HOTEL, SPRITE_FACING_LEFT
- db (CeladonCityHotelText_id - TextPredefs) / 2 + 1
- db FUCHSIA_POKECENTER, SPRITE_FACING_LEFT
- db (FuchsiaCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
- db CINNABAR_POKECENTER, SPRITE_FACING_LEFT
- db (CinnabarIslandPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
- db SAFFRON_POKECENTER, SPRITE_FACING_LEFT
- db (SaffronCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
- db MT_MOON_POKECENTER, SPRITE_FACING_LEFT
- db (MtMoonPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
- db ROCK_TUNNEL_POKECENTER,SPRITE_FACING_LEFT
- db (RockTunnelPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
+ db VIRIDIAN_POKECENTER, SPRITE_FACING_LEFT
+ db_tx_pre ViridianCityPokecenterBenchGuyText
+ db PEWTER_POKECENTER, SPRITE_FACING_LEFT
+ db_tx_pre PewterCityPokecenterBenchGuyText
+ db CERULEAN_POKECENTER, SPRITE_FACING_LEFT
+ db_tx_pre CeruleanCityPokecenterBenchGuyText
+ db LAVENDER_POKECENTER, SPRITE_FACING_LEFT
+ db_tx_pre LavenderCityPokecenterBenchGuyText
+ db VERMILION_POKECENTER, SPRITE_FACING_LEFT
+ db_tx_pre VermilionCityPokecenterBenchGuyText
+ db CELADON_POKECENTER, SPRITE_FACING_LEFT
+ db_tx_pre CeladonCityPokecenterBenchGuyText
+ db CELADON_HOTEL, SPRITE_FACING_LEFT
+ db_tx_pre CeladonCityHotelText
+ db FUCHSIA_POKECENTER, SPRITE_FACING_LEFT
+ db_tx_pre FuchsiaCityPokecenterBenchGuyText
+ db CINNABAR_POKECENTER, SPRITE_FACING_LEFT
+ db_tx_pre CinnabarIslandPokecenterBenchGuyText
+ db SAFFRON_POKECENTER, SPRITE_FACING_LEFT
+ db_tx_pre SaffronCityPokecenterBenchGuyText
+ db MT_MOON_POKECENTER, SPRITE_FACING_LEFT
+ db_tx_pre MtMoonPokecenterBenchGuyText
+ db ROCK_TUNNEL_POKECENTER, SPRITE_FACING_LEFT
+ db_tx_pre RockTunnelPokecenterBenchGuyText
+ db SAFARI_ZONE_REST_HOUSE_2,SPRITE_FACING_LEFT
+ db_tx_pre UnusedBenchGuyText1
+ db SAFARI_ZONE_REST_HOUSE_3,SPRITE_FACING_LEFT
+ db_tx_pre UnusedBenchGuyText2
+ db SAFARI_ZONE_REST_HOUSE_4,SPRITE_FACING_LEFT
+ db_tx_pre UnusedBenchGuyText3
db $FF
ViridianCityPokecenterBenchGuyText: ; 624a3 (18:64a3)
@@ -177,7 +183,7 @@ CeladonCityHotelText: ; 62502 (18:6502)
UnusedPredefText: ; 62508 (18:6508)
db "@"
-PrintBookcaseText: ; 6509 (18:6509)
+PrintBookcaseText: ; 626e1 (18:66e1)
call EnableAutoTextBoxDrawing
tx_pre_jump BookcaseText
diff --git a/engine/items/itemfinder.asm b/engine/items/itemfinder.asm
index d638b0b8..7b479462 100755
--- a/engine/items/itemfinder.asm
+++ b/engine/items/itemfinder.asm
@@ -1,4 +1,4 @@
-HiddenItemNear: ; 7481f (1d:481f)
+HiddenItemNear: ; 7405c (1d:405c)
ld hl, HiddenItemCoords
ld b, 0
.loop
@@ -43,7 +43,7 @@ HiddenItemNear: ; 7481f (1d:481f)
scf
ret
-Sub5ClampTo0: ; 7486b (1d:486b)
+Sub5ClampTo0: ; 740a8 (1d:40a8)
; subtract 5 but clamp to 0
sub 5
cp $f0
diff --git a/engine/items/items.asm b/engine/items/items.asm
index aa607911..eca9eaef 100755
--- a/engine/items/items.asm
+++ b/engine/items/items.asm
@@ -607,7 +607,7 @@ ItemUseSurfboard: ; d725 (3:5725)
call .makePlayerMoveForward
ld a,$3
ld [wd431], a
- ld hl,wd430
+ ld hl,wPikachuOverworldStateFlags
set 5,[hl]
ld hl,wd730
set 7,[hl]
@@ -1765,7 +1765,7 @@ ItemUsePokeflute: ; dfbd (3:5fbd)
.notRoute16
cp a,PEWTER_POKECENTER
jr nz,.noSnorlaxOrPikachuToWakeUp
- call Func_154a
+ call CheckPikachuAsleep
jr z,.noSnorlaxOrPikachuToWakeUp
callab Func_fcb01
jr nc,.noSnorlaxOrPikachuToWakeUp
diff --git a/engine/menu/bills_pc.asm b/engine/menu/bills_pc.asm
index ce9ca5a8..97a65517 100644
--- a/engine/menu/bills_pc.asm
+++ b/engine/menu/bills_pc.asm
@@ -227,7 +227,7 @@ BillsPCDeposit: ; 2156d (8:556d)
jp c, BillsPCMenu
callab IsThisPartymonStarterPikachu_Party
jr nc, .asm_215ad
- call Func_154a
+ call CheckPikachuAsleep
jr z, .asm_215ad
ld hl, SleepingPikachuText2
call PrintText
diff --git a/engine/menu/party_menu.asm b/engine/menu/party_menu.asm
index 3ec0029e..8683d3cb 100755
--- a/engine/menu/party_menu.asm
+++ b/engine/menu/party_menu.asm
@@ -53,7 +53,7 @@ RedrawPartyMenu_: ; 11886 (4:5886)
ld [wWhichPokemon],a
callab IsThisPartymonStarterPikachu_Party
jr nc, .regularMon
- call Func_154a
+ call CheckPikachuAsleep
jr z, .regularMon
ld a, $ff
ld [hPartyMonIndex], a
diff --git a/engine/menu/pokedex.asm b/engine/menu/pokedex.asm
index c481a20c..298816c1 100755
--- a/engine/menu/pokedex.asm
+++ b/engine/menu/pokedex.asm
@@ -2,54 +2,54 @@ ShowPokedexMenu: ; 40000 (10:4000)
call GBPalWhiteOut
call ClearScreen
call UpdateSprites
- ld a,[wListScrollOffset]
+ ld a, [wListScrollOffset]
push af
xor a
- ld [wCurrentMenuItem],a
- ld [wListScrollOffset],a
- ld [wLastMenuItem],a
+ ld [wCurrentMenuItem], a
+ ld [wListScrollOffset], a
+ ld [wLastMenuItem], a
inc a
- ld [wd11e],a
- ld [hJoy7],a
+ ld [wd11e], a
+ ld [hJoy7], a
.setUpGraphics
callab LoadPokedexTilePatterns
.asm_40025
ld b, SET_PAL_GENERIC
call RunPaletteCommand
.doPokemonListMenu
- ld hl,wTopMenuItemY
- ld a,3
- ld [hli],a ; top menu item Y
+ ld hl, wTopMenuItemY
+ ld a, 3
+ ld [hli], a ; top menu item Y
xor a
- ld [hli],a ; top menu item X
+ ld [hli], a ; top menu item X
inc a
- ld [wMenuWatchMovingOutOfBounds],a
+ ld [wMenuWatchMovingOutOfBounds], a
inc hl
inc hl
- ld a,6
- ld [hli],a ; max menu item ID
- ld [hl],D_LEFT | D_RIGHT | B_BUTTON | A_BUTTON
+ ld a, 6
+ ld [hli], a ; max menu item ID
+ ld [hl], D_LEFT | D_RIGHT | B_BUTTON | A_BUTTON
call HandlePokedexListMenu
- jr c,.goToSideMenu ; if the player chose a pokemon from the list
+ jr c, .goToSideMenu ; if the player chose a pokemon from the list
.exitPokedex
xor a
- ld [wMenuWatchMovingOutOfBounds],a
- ld [wCurrentMenuItem],a
- ld [wLastMenuItem],a
- ld [hJoy7],a
- ld [wWastedByteCD3A],a
- ld [wOverrideSimulatedJoypadStatesMask],a
+ ld [wMenuWatchMovingOutOfBounds], a
+ ld [wCurrentMenuItem], a
+ ld [wLastMenuItem], a
+ ld [hJoy7], a
+ ld [wWastedByteCD3A], a
+ ld [wOverrideSimulatedJoypadStatesMask], a
pop af
- ld [wListScrollOffset],a
+ ld [wListScrollOffset], a
call GBPalWhiteOutWithDelay3
call RunDefaultPaletteCommand
jp ReloadMapData
.goToSideMenu
call HandlePokedexSideMenu
dec b
- jr z,.exitPokedex ; if the player chose Quit
+ jr z, .exitPokedex ; if the player chose Quit
dec b
- jr z,.doPokemonListMenu ; if pokemon not seen or player pressed B button
+ jr z, .doPokemonListMenu ; if pokemon not seen or player pressed B button
dec b
jr z, .asm_40025
jp .setUpGraphics ; if pokemon data or area was shown
@@ -62,73 +62,73 @@ ShowPokedexMenu: ; 40000 (10:4000)
; 02: the pokemon has not been seen yet or the player pressed the B button
HandlePokedexSideMenu: ; 40070 (10:4070)
call PlaceUnfilledArrowMenuCursor
- ld a,[wCurrentMenuItem]
+ ld a, [wCurrentMenuItem]
push af
- ld b,a
- ld a,[wLastMenuItem]
+ ld b, a
+ ld a, [wLastMenuItem]
push af
- ld a,[wListScrollOffset]
+ ld a, [wListScrollOffset]
push af
add b
inc a
- ld [wd11e],a
- ld a,[wd11e]
+ ld [wd11e], a
+ ld a, [wd11e]
push af
- ld a,[wDexMaxSeenMon]
+ ld a, [wDexMaxSeenMon]
push af ; this doesn't need to be preserved
- ld hl,wPokedexSeen
+ ld hl, wPokedexSeen
call IsPokemonBitSet
- ld b,2
- jr z,.exitSideMenu
+ ld b, 2
+ jr z, .exitSideMenu
call PokedexToIndex
- ld hl,wTopMenuItemY
- ld a,8
- ld [hli],a ; top menu item Y
- ld a,15
- ld [hli],a ; top menu item X
+ ld hl, wTopMenuItemY
+ ld a, 8
+ ld [hli], a ; top menu item Y
+ ld a, 15
+ ld [hli], a ; top menu item X
xor a
- ld [hli],a ; current menu item ID
+ ld [hli], a ; current menu item ID
inc hl
- ld a,4
- ld [hli],a ; max menu item ID
+ ld a, 4
+ ld [hli], a ; max menu item ID
ld a, A_BUTTON | B_BUTTON
- ld [hli],a ; menu watched keys (A button and B button)
+ ld [hli], a ; menu watched keys (A button and B button)
xor a
- ld [hli],a ; old menu item ID
- ld [wMenuWatchMovingOutOfBounds],a
- ld [hJoy7],a
+ ld [hli], a ; old menu item ID
+ ld [wMenuWatchMovingOutOfBounds], a
+ ld [hJoy7], a
.handleMenuInput
call HandleMenuInput
- bit 1,a ; was the B button pressed?
- ld b,2
- jr nz,.buttonBPressed
- ld a,[wCurrentMenuItem]
+ bit 1, a ; was the B button pressed?
+ ld b, 2
+ jr nz, .buttonBPressed
+ ld a, [wCurrentMenuItem]
and a
- jr z,.choseData
+ jr z, .choseData
dec a
- jr z,.choseCry
+ jr z, .choseCry
dec a
- jr z,.choseArea
+ jr z, .choseArea
dec a
- jr z,.chosePrint
+ jr z, .chosePrint
.choseQuit
- ld b,1
+ ld b, 1
.exitSideMenu
pop af
- ld [wDexMaxSeenMon],a
+ ld [wDexMaxSeenMon], a
pop af
- ld [wd11e],a
+ ld [wd11e], a
pop af
- ld [wListScrollOffset],a
+ ld [wListScrollOffset], a
pop af
- ld [wLastMenuItem],a
+ ld [wLastMenuItem], a
pop af
- ld [wCurrentMenuItem],a
+ ld [wCurrentMenuItem], a
ld a, $1
ld [hJoy7], a
push bc
coord hl, 0, 3
- ld de,20
+ ld de, 20
lb bc, " ", 13
call DrawTileLine ; cover up the menu cursor in the pokemon list
pop bc
@@ -136,24 +136,24 @@ HandlePokedexSideMenu: ; 40070 (10:4070)
.buttonBPressed
push bc
coord hl, 15, 8
- ld de,20
+ ld de, 20
lb bc, " ", 9
call DrawTileLine ; cover up the menu cursor in the side menu
pop bc
jr .exitSideMenu
.choseData
call ShowPokedexDataInternal
- ld b,0
+ ld b, 0
jr .exitSideMenu
; play pokemon cry
.choseCry
- ld a,[wd11e]
+ ld a, [wd11e]
call GetCryData
call PlaySound
jr .handleMenuInput
.choseArea
predef LoadTownMap_Nest ; display pokemon areas
- ld b,0
+ ld b, 0
jr .exitSideMenu
.chosePrint
ld a, [hTilesetType]
@@ -179,63 +179,63 @@ HandlePokedexListMenu: ; 40140 (10:4140)
call Func_4027c
call GBPalNormal
call HandleMenuInput
- bit 1,a ; was the B button pressed?
- jp nz,.buttonBPressed
+ bit 1, a ; was the B button pressed?
+ jp nz, .buttonBPressed
bit 0, a ; was the A button pressed?
- jp nz,.buttonAPressed
+ jp nz, .buttonAPressed
.checkIfUpPressed
- bit 6,a ; was Up pressed?
- jr z,.checkIfDownPressed
+ bit 6, a ; was Up pressed?
+ jr z, .checkIfDownPressed
.upPressed ; scroll up one row
- ld a,[wListScrollOffset]
+ ld a, [wListScrollOffset]
and a
- jp z,.loop
+ jp z, .loop
dec a
- ld [wListScrollOffset],a
+ ld [wListScrollOffset], a
jp .loop
.checkIfDownPressed
- bit 7,a ; was Down pressed?
- jr z,.checkIfRightPressed
+ bit 7, a ; was Down pressed?
+ jr z, .checkIfRightPressed
.downPressed ; scroll down one row
- ld a,[wDexMaxSeenMon]
- cp a,7
- jp c,.loop ; can't if the list is shorter than 7
- sub a,7
- ld b,a
- ld a,[wListScrollOffset]
+ ld a, [wDexMaxSeenMon]
+ cp a, 7
+ jp c, .loop ; can't if the list is shorter than 7
+ sub a, 7
+ ld b, a
+ ld a, [wListScrollOffset]
cp b
- jp z,.loop
+ jp z, .loop
inc a
- ld [wListScrollOffset],a
+ ld [wListScrollOffset], a
jp .loop
.checkIfRightPressed
- bit 4,a ; was Right pressed?
- jr z,.checkIfLeftPressed
+ bit 4, a ; was Right pressed?
+ jr z, .checkIfLeftPressed
.rightPressed ; scroll down 7 rows
- ld a,[wDexMaxSeenMon]
- cp a,7
- jp c,.loop ; can't if the list is shorter than 7
- sub a,6
- ld b,a
- ld a,[wListScrollOffset]
- add a,7
- ld [wListScrollOffset],a
+ ld a, [wDexMaxSeenMon]
+ cp a, 7
+ jp c, .loop ; can't if the list is shorter than 7
+ sub a, 6
+ ld b, a
+ ld a, [wListScrollOffset]
+ add a, 7
+ ld [wListScrollOffset], a
cp b
- jp c,.loop
+ jp c, .loop
dec b
- ld a,b
- ld [wListScrollOffset],a
+ ld a, b
+ ld [wListScrollOffset], a
jp .loop
.checkIfLeftPressed ; scroll up 7 rows
- bit 5,a ; was Left pressed?
- jr z,.buttonAPressed
+ bit 5, a ; was Left pressed?
+ jr z, .buttonAPressed
.leftPressed
- ld a,[wListScrollOffset]
- sub a,7
- ld [wListScrollOffset],a
- jp nc,.loop
+ ld a, [wListScrollOffset]
+ sub a, 7
+ ld [wListScrollOffset], a
+ jp nc, .loop
xor a
- ld [wListScrollOffset],a
+ ld [wListScrollOffset], a
jp .loop
.buttonAPressed
scf
@@ -249,72 +249,72 @@ Func_401c2: ; 401c2 (10:41c2)
ld [H_AUTOBGTRANSFERENABLED], a
; draw the horizontal line separating the seen and owned amounts from the menu
coord hl, 15, 6
- ld a,$7a ; horizontal line tile
- ld [hli],a
- ld [hli],a
- ld [hli],a
- ld [hli],a
- ld [hli],a
+ ld a, $7a ; horizontal line tile
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
coord hl, 14, 0
- ld [hl],$71 ; vertical line tile
+ ld [hl], $71 ; vertical line tile
coord hl, 14, 1
call DrawPokedexVerticalLine
coord hl, 14, 9
call DrawPokedexVerticalLine
- ld hl,wPokedexSeen
- ld b,wPokedexSeenEnd - wPokedexSeen
+ ld hl, wPokedexSeen
+ ld b, wPokedexSeenEnd - wPokedexSeen
call CountSetBits
ld de, wNumSetBits
coord hl, 16, 2
lb bc, 1, 3
call PrintNumber ; print number of seen pokemon
- ld hl,wPokedexOwned
- ld b,wPokedexOwnedEnd - wPokedexOwned
+ ld hl, wPokedexOwned
+ ld b, wPokedexOwnedEnd - wPokedexOwned
call CountSetBits
ld de, wNumSetBits
coord hl, 16, 5
lb bc, 1, 3
call PrintNumber ; print number of owned pokemon
coord hl, 16, 1
- ld de,PokedexSeenText
+ ld de, PokedexSeenText
call PlaceString
coord hl, 16, 4
- ld de,PokedexOwnText
+ ld de, PokedexOwnText
call PlaceString
coord hl, 1, 1
- ld de,PokedexContentsText
+ ld de, PokedexContentsText
call PlaceString
coord hl, 16, 8
- ld de,PokedexMenuItemsText
+ ld de, PokedexMenuItemsText
call PlaceString
; find the highest pokedex number among the pokemon the player has seen
- ld hl,wPokedexSeenEnd - 1
- ld b,(wPokedexSeenEnd - wPokedexSeen) * 8 + 1
+ ld hl, wPokedexSeenEnd - 1
+ ld b, (wPokedexSeenEnd - wPokedexSeen) * 8 + 1
.maxSeenPokemonLoop
- ld a,[hld]
- ld c,8
+ ld a, [hld]
+ ld c, 8
.maxSeenPokemonInnerLoop
dec b
sla a
- jr c,.storeMaxSeenPokemon
+ jr c, .storeMaxSeenPokemon
dec c
- jr nz,.maxSeenPokemonInnerLoop
+ jr nz, .maxSeenPokemonInnerLoop
jr .maxSeenPokemonLoop
.storeMaxSeenPokemon
- ld a,b
- ld [wDexMaxSeenMon],a
+ ld a, b
+ ld [wDexMaxSeenMon], a
ret
DrawPokedexVerticalLine: ; 40243 (10:4243)
- ld c,9 ; height of line
- ld de,SCREEN_WIDTH ; width of screen
- ld a,$71 ; vertical line tile
+ ld c, 9 ; height of line
+ ld de, SCREEN_WIDTH ; width of screen
+ ld a, $71 ; vertical line tile
.loop
- ld [hl],a
- add hl,de
- xor a,1 ; toggle between vertical line tile and box tile
+ ld [hl], a
+ add hl, de
+ xor a, 1 ; toggle between vertical line tile and box tile
dec c
- jr nz,.loop
+ jr nz, .loop
ret
PokedexSeenText: ; 40252 (10:4252)
@@ -335,51 +335,51 @@ PokedexMenuItemsText: ; 40264 (10:4264)
Func_4027c: ; 4027c (10:427c)
xor a
- ld [H_AUTOBGTRANSFERENABLED],a
+ ld [H_AUTOBGTRANSFERENABLED], a
coord hl, 4, 2
lb bc, 14, 10
call ClearScreenArea
coord hl, 1, 3
- ld a,[wListScrollOffset]
- ld [wd11e],a
- ld d,7
- ld a,[wDexMaxSeenMon]
- cp a,7
- jr nc,.printPokemonLoop
- ld d,a
+ ld a, [wListScrollOffset]
+ ld [wd11e], a
+ ld d, 7
+ ld a, [wDexMaxSeenMon]
+ cp a, 7
+ jr nc, .printPokemonLoop
+ ld d, a
dec a
- ld [wMaxMenuItem],a
+ ld [wMaxMenuItem], a
; loop to print pokemon pokedex numbers and names
; if the player has owned the pokemon, it puts a pokeball beside the name
.printPokemonLoop
- ld a,[wd11e]
+ ld a, [wd11e]
inc a
- ld [wd11e],a
+ ld [wd11e], a
push af
push de
push hl
- ld de,-SCREEN_WIDTH
- add hl,de
- ld de,wd11e
+ ld de, -SCREEN_WIDTH
+ add hl, de
+ ld de, wd11e
lb bc, LEADING_ZEROES | 1, 3
call PrintNumber ; print the pokedex number
- ld de,SCREEN_WIDTH
- add hl,de
+ ld de, SCREEN_WIDTH
+ add hl, de
dec hl
push hl
- ld hl,wPokedexOwned
+ ld hl, wPokedexOwned
call IsPokemonBitSet
pop hl
- ld a," "
- jr z,.writeTile
- ld a,$72 ; pokeball tile
+ ld a, " "
+ jr z, .writeTile
+ ld a, $72 ; pokeball tile
.writeTile
- ld [hl],a ; put a pokeball next to pokemon that the player has owned
+ ld [hl], a ; put a pokeball next to pokemon that the player has owned
push hl
- ld hl,wPokedexSeen
+ ld hl, wPokedexSeen
call IsPokemonBitSet
- 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 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 "----------@"
@@ -391,15 +391,15 @@ Func_4027c: ; 4027c (10:427c)
inc hl
call PlaceString
pop hl
- ld bc,2 * 20
- add hl,bc
+ ld bc, 2 * 20
+ add hl, bc
pop de
pop af
- ld [wd11e],a
+ ld [wd11e], a
dec d
- jr nz,.printPokemonLoop
- ld a,01
- ld [H_AUTOBGTRANSFERENABLED],a
+ jr nz, .printPokemonLoop
+ ld a, 01
+ ld [H_AUTOBGTRANSFERENABLED], a
call Delay3
ret
@@ -408,12 +408,12 @@ Func_4027c: ; 4027c (10:427c)
; [wd11e] = pokedex number
; hl = address of bit field
IsPokemonBitSet: ; 40303 (10:4303)
- ld a,[wd11e]
+ ld a, [wd11e]
dec a
- ld c,a
- ld b,FLAG_TEST
+ ld c, a
+ ld b, FLAG_TEST
predef FlagActionPredef
- ld a,c
+ ld a, c
and a
ret
@@ -426,44 +426,44 @@ ShowPokedexData: ; 40312 (10:4312)
; function to display pokedex data from inside the pokedex
ShowPokedexDataInternal: ; 40323 (10:4323)
- ld hl,wd72c
- set 1,[hl]
- ld a,$33 ; 3/7 volume
- ld [rNR50],a
+ ld hl, wd72c
+ set 1, [hl]
+ ld a, $33 ; 3/7 volume
+ ld [rNR50], a
ld a, [hTilesetType]
push af
xor a
ld [hTilesetType], a
call GBPalWhiteOut ; zero all palettes
- ld a,[wd11e] ; pokemon ID
- ld [wcf91],a
+ ld a, [wd11e] ; pokemon ID
+ ld [wcf91], a
push af
ld b, SET_PAL_POKEDEX
call RunPaletteCommand
pop af
- ld [wd11e],a
+ ld [wd11e], a
call Func_4039c
call c, Func_404ae
.waitForButtonPress
call JoypadLowSensitivity
- ld a,[hJoy5]
- and a,A_BUTTON | B_BUTTON
- jr z,.waitForButtonPress
+ ld a, [hJoy5]
+ and a, A_BUTTON | B_BUTTON
+ jr z, .waitForButtonPress
pop af
- ld [hTilesetType],a
+ ld [hTilesetType], a
call GBPalWhiteOut
call ClearScreen
call RunDefaultPaletteCommand
call LoadTextBoxTilePatterns
call GBPalNormal
- ld hl,wd72c
- res 1,[hl]
- ld a,$77 ; max volume
- ld [rNR50],a
+ ld hl, wd72c
+ res 1, [hl]
+ ld a, $77 ; max volume
+ ld [rNR50], a
ret
HeightWeightText: ; 40370 (10:4370)
- db "HT ?",$60,"??",$61
+ db "HT ?", $60, "??", $61
next "WT ???lb@"
; XXX does anything point to this?
@@ -472,77 +472,77 @@ PokeText: ; 40385 (10:4385)
; horizontal line that divides the pokedex text description from the rest of the data
PokedexDataDividerLine: ; 40387 (10:4387)
- db $68,$69,$6B,$69,$6B
- db $69,$6B,$69,$6B,$6B
- db $6B,$6B,$69,$6B,$69
- db $6B,$69,$6B,$69,$6A
+ db $68, $69, $6B, $69, $6B
+ db $69, $6B, $69, $6B, $6B
+ db $6B, $6B, $69, $6B, $69
+ db $6B, $69, $6B, $69, $6A
db "@"
Func_4039c: ; 4039c (10:439c)
call ClearScreen
coord hl, 0, 0
- ld de,1
+ 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
+ ld de, 20
lb bc, $66, $10
call DrawTileLine ; draw left border
coord hl, 19, 1
- ld b,$67
+ ld b, $67
call DrawTileLine ; draw right border
- ld a,$63 ; upper left corner tile
+ ld a, $63 ; upper left corner tile
Coorda 0, 0
- ld a,$65 ; upper right corner tile
+ ld a, $65 ; upper right corner tile
Coorda 19, 0
- ld a,$6c ; lower left corner tile
+ ld a, $6c ; lower left corner tile
Coorda 0, 17
- ld a,$6e ; lower right corner tile
+ ld a, $6e ; lower right corner tile
Coorda 19, 17
coord hl, 0, 9
- ld de,PokedexDataDividerLine
+ ld de, PokedexDataDividerLine
call PlaceString ; draw horizontal divider line
coord hl, 9, 6
- ld de,HeightWeightText
+ ld de, HeightWeightText
call PlaceString
call GetMonName
coord hl, 9, 2
call PlaceString
- ld hl,PokedexEntryPointers
- ld a,[wd11e]
+ ld hl, PokedexEntryPointers
+ ld a, [wd11e]
dec a
- ld e,a
- ld d,0
- add hl,de
- add hl,de
- ld a,[hli]
- ld e,a
- ld d,[hl] ; de = address of pokedex entry
+ ld e, a
+ ld d, 0
+ add hl, de
+ add hl, de
+ 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
+ ld h, b
+ ld l, c
push de
- ld a,[wd11e]
+ ld a, [wd11e]
push af
call IndexToPokedex
coord hl, 2, 8
ld a, "№"
- ld [hli],a
- ld a,$f2
- ld [hli],a
- ld de,wd11e
+ ld [hli], a
+ ld a, $f2
+ ld [hli], a
+ ld de, wd11e
lb bc, LEADING_ZEROES | 1, 3
call PrintNumber ; print pokedex number
- ld hl,wPokedexOwned
+ ld hl, wPokedexOwned
call IsPokemonBitSet
pop af
- ld [wd11e],a
- ld a,[wcf91]
- ld [wd0b5],a
+ ld [wd11e], a
+ ld a, [wcf91]
+ ld [wd0b5], a
pop de
push af
push bc
@@ -553,65 +553,65 @@ Func_4039c: ; 4039c (10:439c)
call GetMonHeader ; load pokemon picture location
coord hl, 1, 1
call LoadFlippedFrontSpriteByMonIndex ; draw pokemon picture
- ld a,[wcf91]
+ ld a, [wcf91]
call PlayCry ; play pokemon cry
pop hl
pop de
pop bc
pop af
- ld a,c
+ 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
+ ld a, [de] ; reads feet, but a is overwritten without being used
coord hl, 12, 6
lb bc, 1, 2
call PrintNumber ; print feet (height)
- ld a,$60 ; feet symbol tile (one tick)
- ld [hl],a
+ ld a, $60 ; feet symbol tile (one tick)
+ ld [hl], a
inc de
inc de ; de = address of inches (height)
coord hl, 15, 6
lb bc, LEADING_ZEROES | 1, 2
call PrintNumber ; print inches (height)
- ld a,$61 ; inches symbol tile (two ticks)
- ld [hl],a
+ ld a, $61 ; inches symbol tile (two ticks)
+ ld [hl], a
; now print the weight (note that weight is stored in tenths of pounds internally)
inc de
inc de
inc de ; de = address of upper byte of weight
push de
; put weight in big-endian order at hDexWeight
- ld hl,hDexWeight
- ld a,[hl] ; save existing value of [hDexWeight]
+ ld hl, hDexWeight
+ ld a, [hl] ; save existing value of [hDexWeight]
push af
- ld a,[de] ; a = upper byte of weight
- ld [hli],a ; store upper byte of weight in [hDexWeight]
- ld a,[hl] ; save existing value of [hDexWeight + 1]
+ ld a, [de] ; a = upper byte of weight
+ ld [hli], a ; store upper byte of weight in [hDexWeight]
+ ld a, [hl] ; save existing value of [hDexWeight + 1]
push af
dec de
- ld a,[de] ; a = lower byte of weight
- ld [hl],a ; store lower byte of weight in [hDexWeight + 1]
- ld de,hDexWeight
+ ld a, [de] ; a = lower byte of weight
+ ld [hl], a ; store lower byte of weight in [hDexWeight + 1]
+ ld de, hDexWeight
coord hl, 11, 8
lb bc, 2, 5 ; 2 bytes, 5 digits
call PrintNumber ; print weight
coord hl, 14, 8
- ld a,[hDexWeight + 1]
- sub a,10
- ld a,[hDexWeight]
- sbc a,0
- jr nc,.next
- ld [hl],"0" ; if the weight is less than 10, put a 0 before the decimal point
+ ld a, [hDexWeight + 1]
+ sub a, 10
+ ld a, [hDexWeight]
+ sbc a, 0
+ jr nc, .next
+ ld [hl], "0" ; if the weight is less than 10, put a 0 before the decimal point
.next
inc hl
- ld a,[hli]
- ld [hld],a ; make space for the decimal point by moving the last digit forward one tile
- ld [hl],$f2 ; decimal point tile
+ ld a, [hli]
+ ld [hld], a ; make space for the decimal point by moving the last digit forward one tile
+ ld [hl], $f2 ; decimal point tile
pop af
- ld [hDexWeight + 1],a ; restore original value of [hDexWeight + 1]
+ ld [hDexWeight + 1], a ; restore original value of [hDexWeight + 1]
pop af
- ld [hDexWeight],a ; restore original value of [hDexWeight]
+ ld [hDexWeight], a ; restore original value of [hDexWeight]
pop hl
inc hl ; hl = address of pokedex description text
scf
@@ -620,11 +620,11 @@ Func_4039c: ; 4039c (10:439c)
Func_404ae: ; 404ae (10:44ae)
coord bc, 1, 11
Func_404b1: ; 404b1 (10:44b1)
- ld a,2
- ld [$fff9],a
+ ld a, 2
+ ld [$fff9], a
call TextCommandProcessor ; print pokedex description text
xor a
- ld [$fff9],a
+ ld [$fff9], a
ret
Func_404bc: ; 404bc (10:44bc)
@@ -667,10 +667,10 @@ DrawTileLine: ; 40501 (10:4501)
push bc
push de
.loop
- ld [hl],b
- add hl,de
+ ld [hl], b
+ add hl, de
dec c
- jr nz,.loop
+ jr nz, .loop
pop de
pop bc
ret
@@ -681,19 +681,19 @@ PokedexToIndex: ; 41086 (10:5086)
; converts the Pokédex number at wd11e to an index
push bc
push hl
- ld a,[wd11e]
- ld b,a
- ld c,0
- ld hl,PokedexOrder
+ ld a, [wd11e]
+ ld b, a
+ ld c, 0
+ ld hl, PokedexOrder
.loop ; go through the list until we find an entry with a matching dex number
inc c
- ld a,[hli]
+ ld a, [hli]
cp b
- jr nz,.loop
+ jr nz, .loop
- ld a,c
- ld [wd11e],a
+ ld a, c
+ ld [wd11e], a
pop hl
pop bc
ret
@@ -702,14 +702,14 @@ IndexToPokedex: ; 4109d (10:509d)
; converts the indexédex number at wd11e to a Pokédex number
push bc
push hl
- ld a,[wd11e]
+ ld a, [wd11e]
dec a
- ld hl,PokedexOrder
- ld b,0
- ld c,a
- add hl,bc
- ld a,[hl]
- ld [wd11e],a
+ ld hl, PokedexOrder
+ ld b, 0
+ ld c, a
+ add hl, bc
+ ld a, [hl]
+ ld [wd11e], a
pop hl
pop bc
ret
diff --git a/engine/overworld/advance_player_sprite.asm b/engine/overworld/advance_player_sprite.asm
index e02fb129..758dd558 100644
--- a/engine/overworld/advance_player_sprite.asm
+++ b/engine/overworld/advance_player_sprite.asm
@@ -7,7 +7,7 @@ _AdvancePlayerSprite:: ; f010c (3c:410c)
dec [hl]
jr nz,.afterUpdateMapCoords
; if it's the end of the animation, update the player's map coordinates
- ld hl, wd430
+ ld hl, wPikachuOverworldStateFlags
res 5, [hl]
ld a,[wYCoord]
add b
diff --git a/engine/overworld/cable_club_npc.asm b/engine/overworld/cable_club_npc.asm
index 8f279759..4170a936 100755
--- a/engine/overworld/cable_club_npc.asm
+++ b/engine/overworld/cable_club_npc.asm
@@ -1,7 +1,7 @@
CableClubNPC: ; 7035 (1:7035)
ld hl, CableClubNPCWelcomeText
call PrintText
- call Func_154a
+ call CheckPikachuAsleep
jr nz, .asm_7048
CheckEvent EVENT_GOT_POKEDEX
jp nz, .receivedPokedex
diff --git a/engine/overworld/hidden_items.asm b/engine/overworld/hidden_items.asm
index f7f81070..39bb385d 100755
--- a/engine/overworld/hidden_items.asm
+++ b/engine/overworld/hidden_items.asm
@@ -9,7 +9,7 @@ HiddenItems: ; 76688 (1d:6688)
predef FlagActionPredef
ld a, c
and a
- ret nz
+ jr nz, .asm_75fa5
call EnableAutoTextBoxDrawing
ld a, 1
ld [wDoNotWaitForButtonPressAfterDisplayingText], a
@@ -18,6 +18,11 @@ HiddenItems: ; 76688 (1d:6688)
call GetItemName
tx_pre_jump FoundHiddenItemText
+.asm_75fa5
+ ld a, $ff
+ ld [hItemAlreadyFound], a
+ ret
+
INCLUDE "data/hidden_item_coords.asm"
FoundHiddenItemText: ; 7675b (1d:675b)
@@ -54,7 +59,7 @@ HiddenCoins: ; 76799 (1d:6799)
predef GetQuantityOfItemInBag
ld a, b
and a
- ret z
+ jr z, .asm_760ce
ld hl, HiddenCoinCoords
call FindHiddenItemOrCoinsIndex
ld [wHiddenItemOrCoinsIndex], a
@@ -65,7 +70,7 @@ HiddenCoins: ; 76799 (1d:6799)
predef FlagActionPredef
ld a, c
and a
- ret nz
+ jr nz, .asm_760ce
xor a
ld [hUnusedCoinsByte], a
ld [hCoins], a
@@ -79,6 +84,12 @@ HiddenCoins: ; 76799 (1d:6799)
cp 40
jr z, .bcd20
jr .bcd100
+
+.asm_760ce
+ ld a, $ff
+ ld [hItemAlreadyFound], a
+ ret
+
.bcd10
ld a, $10
ld [hCoins + 1], a
diff --git a/engine/overworld/hidden_objects.asm b/engine/overworld/hidden_objects.asm
index 3774c482..cba2a221 100755
--- a/engine/overworld/hidden_objects.asm
+++ b/engine/overworld/hidden_objects.asm
@@ -1,27 +1,17 @@
-; if a hidden object was found, stores $00 in [$ffee], else stores $ff
-CheckForHiddenObject: ; 469a0 (11:69a0)
- ld hl, $ffeb
+; if a hidden object was found, stores $00 in [hDidntFindAnyHiddenObject], else stores $ff
+CheckForHiddenObject: ; f25f8 (3c:65f8)
+ ld hl, hItemAlreadyFound
xor a
ld [hli], a
ld [hli], a
ld [hli], a
ld [hl], a
- ld de, $0
ld hl, HiddenObjectMaps
-.hiddenMapLoop
- ld a, [hli]
- ld b, a
- cp $ff
- jr z, .noMatch
+ ld de, 3
ld a, [wCurMap]
- cp b
- jr z, .foundMatchingMap
- inc de
- inc de
- jr .hiddenMapLoop
-.foundMatchingMap
- ld hl, HiddenObjectPointers
- add hl, de
+ call IsInArray
+ jr nc, .noMatch
+ inc hl
ld a, [hli]
ld h, [hl]
ld l, a
@@ -65,7 +55,7 @@ CheckForHiddenObject: ; 469a0 (11:69a0)
ret
.noMatch
ld a, $ff
- ld [$ffee], a
+ ld [hDidntFindAnyHiddenObject], a
ret
; checks if the coordinates in front of the player's sprite match Y in b and X in c
diff --git a/engine/overworld/missable_objects.asm b/engine/overworld/missable_objects.asm
index f18a0823..65305d30 100644
--- a/engine/overworld/missable_objects.asm
+++ b/engine/overworld/missable_objects.asm
@@ -209,4 +209,4 @@ MissableObjectFlagAction: ; f062 (3:7062)
pop de
pop hl
ld c, a
- ret \ No newline at end of file
+ ret
diff --git a/engine/overworld/pokecenter.asm b/engine/overworld/pokecenter.asm
index 779d852c..3024ff7b 100755
--- a/engine/overworld/pokecenter.asm
+++ b/engine/overworld/pokecenter.asm
@@ -2,7 +2,7 @@ DisplayPokemonCenterDialogue_: ; 6d97 (1:6d97)
ld a, [wCurMap]
cp PEWTER_POKECENTER
jr nz, .regularCenter
- call Func_154a
+ call CheckPikachuAsleep
jr z, .regularCenter
ld hl, LooksContentText ; if pikachu is sleeping, don't heal
call PrintText
@@ -27,7 +27,7 @@ DisplayPokemonCenterDialogue_: ; 6d97 (1:6d97)
call SetLastBlackoutMap
callab IsStarterPikachuInOurParty
jr nc, .notHealingPlayerPikachu
- call Func_154a
+ call CheckPikachuAsleep
jr nz, .notHealingPlayerPikachu
call LoadCurrentMapView
call Delay3
@@ -38,7 +38,7 @@ DisplayPokemonCenterDialogue_: ; 6d97 (1:6d97)
call PrintText
ld c, 64
call DelayFrames
- call Func_154a
+ call CheckPikachuAsleep
jr nz, .playerPikachuNotOnScreen
call Func_152d
callab IsStarterPikachuInOurParty
@@ -58,7 +58,7 @@ DisplayPokemonCenterDialogue_: ; 6d97 (1:6d97)
ld [wLastMusicSoundID], a
ld [wNewSoundID], a
call PlaySound
- call Func_154a
+ call CheckPikachuAsleep
jr nz, .doNotReturnPikachu
callab IsStarterPikachuInOurParty
call c, Func_6eaa
diff --git a/engine/pikachu_pic_animation.asm b/engine/pikachu_pic_animation.asm
new file mode 100755
index 00000000..c16e3e5f
--- /dev/null
+++ b/engine/pikachu_pic_animation.asm
@@ -0,0 +1,3449 @@
+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 CheckPikachuAsleep
+ ld a, $1e
+ jr nz, .asm_fd0c9
+ jr .asm_fd096
+.notFanClub
+ ld a, [wCurMap]
+ cp PEWTER_POKECENTER
+ jr nz, .notPewterPokecenter
+ call CheckPikachuAsleep
+ 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
+ db $0c, $27, $02, $00 ; $1e
+ db $0d, $27, $02, $00 ; $1f
+ db $0e, $27, $02, $00 ; $20
+ 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
+ db $14, $0f, $06, $00 ; $36
+ db $15, $0f, $06, $00 ; $37
+ db $16, $0f, $06, $00 ; $38
+ 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 ResetPikachuAsleep
+ call Func_fcff2
+ ret
+
+PikachuFanClubCheck: ; fd8e1 (3f:58e1)
+ ld a, [wCurMap]
+ cp POKEMON_FAN_CLUB
+ ret nz
+ call ResetPikachuAsleep
+ call Func_fcff2
+ ret
+
+PikachuBillsHouseCheck: ; fd8ee (3f:58ee)
+ ld a, [wCurMap]
+ cp BILLS_HOUSE
+ ret nz
+ call ResetPikachuAsleep
+ 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]
+ ld d, a
+.asm_fd97f
+ ld a, [hli]
+ inc hl
+ cp d
+ jr c, .asm_fd97f
+ dec hl
+ ld e, [hl]
+ ld hl, PikaPicAnimationScriptPointerLookupTable
+ ld a, [wPikachuHappiness]
+ ld d, a
+ ld bc, 6
+.asm_fd990
+ ld a, [hl]
+ cp d
+ jr nc, .asm_fd997
+ add hl, bc
+ jr .asm_fd990
+
+.asm_fd997
+ ld d, 0
+ add hl, de
+ ld a, [hl]
+ ret
+
+PikachuMoodLookupTable:
+; First byte: mood threshold
+; Second byte: column index in PikaPicAnimationScriptPointerLookupTable
+ db $28, 1
+ db $7f, 2
+ db $80, 3
+ db $d2, 4
+ db $ff, 5
+
+PikaPicAnimationScriptPointerLookupTable:
+; First byte: happiness threshold
+; Remaining bytes: loaded based on Pikachu's mood
+ db $32, $0e, $0e, $06, $0d, $0d
+ db $64, $09, $09, $05, $0c, $0c
+ db $82, $03, $03, $01, $08, $08
+ db $a0, $03, $03, $04, $0f, $0f
+ db $c8, $11, $11, $07, $02, $02
+ db $fa, $11, $11, $10, $0a, $0a
+ db $ff, $11, $11, $13, $14, $14
+
+StarterPikachuEmotionCommand_5: ; fd9d0 (3f:59d0)
+ ld a, [H_AUTOBGTRANSFERENABLED]
+ push af
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ ld a, [de]
+ ld [wExpressionNumber2], a
+ inc de
+ push de
+ call Func_fd9e4
+ pop de
+ pop af
+ ld [H_AUTOBGTRANSFERENABLED], a
+ ret
+
+Func_fd9e4:
+ call Func_fda2c
+ callab Func_720e3
+ call Func_fd9ff
+ call LoadCurrentPikaPicAnimScriptPointer
+ call Func_fda9a
+ call Func_fda2c
+ call RunDefaultPaletteCommand
+ ret
+
+Func_fd9ff:
+ ld hl, wPikaPicAnimPointer
+ ld bc, $11
+ xor a
+ call FillMemory
+ ld hl, wPikaPicAnimObjectDataBufferSize
+ ld bc, $21
+ xor a
+ call FillMemory
+ call Func_fe15c
+ ld hl, $64
+ ld a, l
+ ld [wPikaPicAnimTimer], a
+ ld a, h
+ ld [wPikaPicAnimTimer + 1], a
+ ld a, $07
+ ld [wPikaSpriteY], a
+ ld a, $06
+ ld [wPikaPicTextboxStartY], a
+ ret
+
+Func_fda2c:
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ coord hl, 6, 5
+ lb bc, 5, 5
+ call TextBoxBorder
+ call Delay3
+ call UpdateSprites
+ ld a, $01
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call Delay3
+ ret
+
+LoadCurrentPikaPicAnimScriptPointer:
+ ld a, [wExpressionNumber2]
+ cp $1d
+ jr c, .valid
+ ld a, 0
+.valid
+ ld e, a
+ ld d, 0
+ ld hl, Pointers_fda5e
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call UpdatePikaPicAnimPointer
+ ret
+
+Pointers_fda5e:
+ dw Data_fe28a ; 00
+ dw Data_fe28a ; 01
+ dw Data_fe2a4 ; 02
+ dw Data_fe2be ; 03
+ dw Data_fe2d8 ; 04
+ dw Data_fe2f2 ; 05
+ dw Data_fe30c ; 06
+ dw Data_fe326 ; 07
+ dw Data_fe340 ; 08
+ dw Data_fe35a ; 09
+ dw Data_fe374 ; 0a
+ dw Data_fe390 ; 0b
+ dw Data_fe3aa ; 0c
+ dw Data_fe3c4 ; 0d
+ dw Data_fe3de ; 0e
+ dw Data_fe3f8 ; 0f
+ dw Data_fe412 ; 10
+ dw Data_fe42c ; 11
+ dw Data_fe446 ; 12
+ dw Data_fe460 ; 13
+ dw Data_fe47a ; 14
+ dw Data_fe494 ; 15
+ dw Data_fe4b4 ; 16
+ dw Data_fe4ce ; 17
+ dw Data_fe4e8 ; 18
+ dw Data_fe502 ; 19
+ dw Data_fe520 ; 1a
+ dw Data_fe53e ; 1b
+ dw Data_fe558 ; 1c
+ dw Data_fe28a ; 1d
+
+
+Func_fda9a:
+.loop
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call RunPikaPicAnimScript
+ call Func_fdad5
+ call Func_fdad6
+ call Func_fdad5
+ ld a, $01
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call PikaPicAnimTimerAndJoypad
+ and a
+ jr z, .loop
+ ret
+
+PikaPicAnimTimerAndJoypad:
+ call Delay3
+ call CheckPikaPicAnimTimer
+ and a
+ ret nz
+ call JoypadLowSensitivity
+ ld a, [hJoyPressed]
+ and A_BUTTON | B_BUTTON
+ ret
+
+CheckPikaPicAnimTimer:
+ ld hl, wPikaPicAnimTimer
+ dec [hl]
+ jr nz, .not_done_yet
+ inc hl
+ ld a, [hl]
+ and a
+ jr z, .timer_expired
+ dec [hl]
+.not_done_yet
+ xor a
+ ret
+
+.timer_expired
+ ld a, $01
+ ret
+
+Func_fdad5:
+ ret
+
+Func_fdad6:
+ ld bc, wPikaPicAnimObjectDataBuffer
+ ld a, 4
+.asm_fdadb
+ push af
+ push bc
+ ld hl, 0
+ add hl, bc
+ ld a, [hli]
+ and a
+ jr z, .asm_fdb26
+ ld a, [hli]
+ ld [wCurPikaPicAnimObject], a
+ ld a, [hli]
+ ld [wCurPikaPicAnimObject + 1], a
+ ld a, [hli]
+ ld [wCurPikaPicAnimObject + 2], a
+ ld a, [hli]
+ ld [wd456], a
+ ld a, [hli]
+ ld [wd457], a
+ ld a, [hli]
+ ld [wd458], a
+ ld a, [hli]
+ ld [wCurPikaPicAnimObject + 3], a
+ push bc
+ call Func_fdb7e
+ pop bc
+ ld hl, 1
+ add hl, bc
+ ld a, [wCurPikaPicAnimObject]
+ ld [hli], a
+ ld a, [wCurPikaPicAnimObject + 1]
+ ld [hli], a
+ ld a, [wCurPikaPicAnimObject + 2]
+ ld [hli], a
+ ld a, [wd456]
+ ld [hli], a
+ ld a, [wd457]
+ ld [hli], a
+ ld a, [wd458]
+ ld [hli], a
+ ld a, [wCurPikaPicAnimObject + 3]
+ ld [hl], a
+.asm_fdb26
+ pop bc
+ ld hl, 8
+ add hl, bc
+ ld b, h
+ ld c, l
+ pop af
+ dec a
+ jr nz, .asm_fdadb
+ ret
+
+PikaPicAnimCommand_object:
+ ld hl, wPikaPicAnimObjectDataBuffer
+ ld de, 8
+ ld c, 4
+.loop
+ ld a, [hl]
+ and a
+ jr z, .found
+ add hl, de
+ dec c
+ jr nz, .loop
+ scf
+ ret
+
+.found
+ ld a, [wPikaPicAnimObjectDataBufferSize]
+ inc a
+ ld [wPikaPicAnimObjectDataBufferSize], a
+ ld [hli], a
+ call GetPikaPicAnimByte
+ ld [hli], a
+ call GetPikaPicAnimByte
+ ld [hl], a
+ xor a
+ ld [hli], a
+ ld [hli], a
+ call GetPikaPicAnimByte
+ ld [hli], a
+ call GetPikaPicAnimByte
+ ld [hli], a
+ call GetPikaPicAnimByte
+ ld [hli], a
+ and a
+ ret
+
+PikaPicAnimCommand_deleteobject:
+ call GetPikaPicAnimByte
+ ld b, a
+ ld hl, wPikaPicAnimObjectDataBuffer
+ ld de, 8
+ ld c, 4
+.search
+ ld a, [hl]
+ cp b
+ jr z, .delete
+ add hl, de
+ dec c
+ jr nz, .search
+ scf
+ ret
+
+.delete
+ xor a
+ ld [hl], a
+ ret
+
+Func_fdb7e:
+.asm_fdb7e
+ ld a, [wCurPikaPicAnimObject]
+ cp $23
+ jr c, .asm_fdb87
+ ld a, $04
+.asm_fdb87
+ ld e, a
+ ld d, $00
+ ld hl, Pointers_fdbc9
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wCurPikaPicAnimObject + 1]
+ ld e, a
+ ld d, 0
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ cp $e0
+ jr z, .asm_fdba1
+ jr .asm_fdbaa
+
+.asm_fdba1
+ xor a
+ ld [wCurPikaPicAnimObject + 1], a
+ ld [wCurPikaPicAnimObject + 2], a
+ jr .asm_fdb7e
+
+.asm_fdbaa
+ push hl
+ call Func_fdd62
+ pop hl
+ ld a, [hl]
+ and a
+ jr z, .asm_fdbc8
+ ld a, [wCurPikaPicAnimObject + 2]
+ inc a
+ ld [wCurPikaPicAnimObject + 2], a
+ cp [hl]
+ jr nz, .asm_fdbc8
+ xor a
+ ld [wCurPikaPicAnimObject + 2], a
+ ld a, [wCurPikaPicAnimObject + 1]
+ inc a
+ ld [wCurPikaPicAnimObject + 1], a
+.asm_fdbc8
+ ret
+
+Pointers_fdbc9:
+ dw Data_fdc11
+ dw Data_fdc11
+ dw Data_fdc29
+ dw Data_fdc32
+ dw Data_fdc3b
+ dw Data_fdc3e
+ dw Data_fdc41
+ dw Data_fdc50
+ dw Data_fdc61
+ dw Data_fdc6e
+ dw Data_fdc77
+ dw Data_fdc84
+ dw Data_fdc8d
+ dw Data_fdc98
+ dw Data_fdca5
+ dw Data_fdcb2
+ dw Data_fdcb7
+ dw Data_fdcc2
+ dw Data_fdccb
+ dw Data_fdcd4
+ dw Data_fdcdf
+ dw Data_fdce8
+ dw Data_fdcf1
+ dw Data_fdcf6
+ dw Data_fdd01
+ dw Data_fdd0a
+ dw Data_fdd13
+ dw Data_fdd1c
+ dw Data_fdd27
+ dw Data_fdd2c
+ dw Data_fdd35
+ dw Data_fdd40
+ dw Data_fdd47
+ dw Data_fdd54
+ dw Data_fdd59
+ dw Data_fdc3b
+
+Data_fdc11:
+ db $01, $14
+ db $07, $02
+ db $01, $01
+ db $07, $02
+ db $01, $01
+ db $07, $08
+ db $e0
+Data_fdc1e:
+ db $02, $02
+ db $01, $01
+ db $02, $02
+ db $01, $01
+ db $02, $08
+ db $e0
+Data_fdc29:
+ db $00, $08
+ db $08, $08
+ db $00, $08
+ db $08, $08
+ db $e0
+Data_fdc32:
+ db $08, $08
+ db $00, $08
+ db $08, $08
+ db $00, $08
+ db $e0
+Data_fdc3b:
+ db $01, $00
+ db $e0
+Data_fdc3e:
+ db $09, $00
+ db $e0
+Data_fdc41:
+ db $00, $02
+ db $0e, $04
+ db $00, $08
+ db $0e, $04
+ db $00, $40
+ db $0e, $04
+ db $00, $40
+ db $e0
+Data_fdc50:
+ db $00, $04
+ db $0f, $04
+ db $00, $04
+ db $0f, $04
+ db $00, $08
+ db $0f, $04
+ db $00, $08
+ db $0f, $04
+ db $e0
+Data_fdc61:
+ db $10, $01
+ db $00, $01
+ db $10, $01
+ db $00, $40
+ db $10, $01
+ db $00, $40
+ db $e0
+Data_fdc6e:
+ db $00, $08
+ db $11, $08
+ db $00, $14
+ db $11, $08
+ db $e0
+Data_fdc77:
+ db $00, $02
+ db $12, $02
+ db $00, $02
+ db $12, $40
+ db $00, $03
+ db $12, $40
+ db $e0
+Data_fdc84:
+ db $00, $08
+ db $13, $40
+ db $00, $04
+ db $13, $40
+ db $e0
+Data_fdc8d:
+ db $14, $08
+ db $00, $02
+ db $14, $08
+ db $00, $02
+ db $14, $08
+ db $e0
+Data_fdc98:
+ db $15, $04
+ db $00, $08
+ db $15, $04
+ db $00, $40
+ db $15, $04
+ db $00, $40
+ db $e0
+Data_fdca5:
+ db $00, $02
+ db $16, $02
+ db $00, $02
+ db $16, $02
+ db $00, $14
+ db $16, $02
+ db $e0
+Data_fdcb2:
+ db $00, $08
+ db $17, $08
+ db $e0
+Data_fdcb7:
+ db $00, $08
+ db $17, $03
+ db $18, $05
+ db $17, $03
+ db $00, $05
+ db $e0
+Data_fdcc2:
+ db $00, $14
+ db $19, $08
+ db $00, $14
+ db $19, $08
+ db $e0
+Data_fdccb:
+ db $00, $0d
+ db $1a, $0c
+ db $00, $64
+ db $1a, $08
+ db $e0
+Data_fdcd4:
+ db $00, $05
+ db $1b, $05
+ db $00, $05
+ db $1b, $05
+ db $00, $64
+ db $e0
+Data_fdcdf:
+ db $00, $02
+ db $1c, $02
+ db $00, $02
+ db $1c, $02
+ db $e0
+Data_fdce8:
+ db $00, $05
+ db $1d, $05
+ db $00, $05
+ db $1d, $05
+ db $e0
+Data_fdcf1:
+ db $1e, $08
+ db $00, $64
+ db $e0
+Data_fdcf6:
+ db $00, $0a
+ db $1f, $03
+ db $00, $03
+ db $1f, $03
+ db $00, $64
+ db $e0
+Data_fdd01:
+ db $00, $03
+ db $20, $64
+ db $00, $08
+ db $20, $08
+ db $e0
+Data_fdd0a:
+ db $21, $06
+ db $00, $06
+ db $21, $06
+ db $00, $06
+ db $e0
+Data_fdd13:
+ db $00, $08
+ db $22, $0c
+ db $00, $08
+ db $22, $0c
+ db $e0
+Data_fdd1c:
+ db $00, $08
+ db $09, $02
+ db $0a, $01
+ db $0b, $01
+ db $0c, $64
+ db $e0
+Data_fdd27:
+ db $00, $08
+ db $24, $64
+ db $e0
+Data_fdd2c:
+ db $00, $10
+ db $25, $10
+ db $00, $10
+ db $25, $10
+ db $e0
+Data_fdd35:
+ db $00, $06
+ db $26, $06
+ db $00, $06
+ db $26, $06
+ db $00, $64
+ db $e0
+Data_fdd40:
+ db $00, $06
+ db $09, $06
+ db $0a, $64
+ db $e0
+Data_fdd47:
+ db $00, $14
+ db $09, $08
+ db $00, $14
+ db $09, $08
+ db $0a, $08
+ db $0b, $64
+ db $e0
+Data_fdd54:
+ db $00, $04
+ db $09, $64
+ db $e0
+Data_fdd59:
+ db $00, $0c
+ db $09, $0c
+ db $00, $0c
+ db $09, $64
+ db $e0
+
+Func_fdd62:
+ and a
+ ret z
+ ld e, a
+ ld d, 0
+ ld hl, Pointers_fddb8
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld a, [de]
+ ld c, a
+ inc de
+ ld a, [de]
+ ld b, a
+ inc de
+ push de
+ push bc
+ call Func_fdd98
+ pop bc
+ pop de
+.asm_fdd7c
+ push bc
+ push hl
+ ld a, [wd456]
+ ld c, a
+.asm_fdd82
+ ld a, [de]
+ inc de
+ cp $ff
+ jr z, .asm_fdd8a
+ add c
+ ld [hl], a
+.asm_fdd8a
+ inc hl
+ dec b
+ jr nz, .asm_fdd82
+ pop hl
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ dec c
+ jr nz, .asm_fdd7c
+ ret
+
+Func_fdd98:
+ push bc
+ ld a, [wd458]
+ ld b, a
+ ld a, [wPikaPicTextboxStartY]
+ add b
+ coord hl, 0, 0
+ ld bc, SCREEN_WIDTH
+ call AddNTimes
+ ld a, [wd457]
+ ld c, a
+ ld a, [wPikaSpriteY]
+ add c
+ ld c, a
+ ld b, 0
+ add hl, bc
+ pop bc
+ ret
+
+Pointers_fddb8:
+ dw Data_fde0e
+ dw Data_fde0f
+ dw Data_fde2a
+ dw Data_fde60
+ dw Data_fde63
+ dw Data_fde67
+ dw Data_fde6b
+ dw Data_fde45
+ dw Data_fde6b
+ dw Data_fdfaa
+ dw Data_fdfc5
+ dw Data_fdfe0
+ dw Data_fdffb
+ dw Data_fe016
+ dw Data_fde81
+ dw Data_fde9c
+ dw Data_fdeb7
+ dw Data_fded2
+ dw Data_fdeed
+ dw Data_fdf08
+ dw Data_fdf23
+ dw Data_fdf3e
+ dw Data_fdf59
+ dw Data_fdf74
+ dw Data_fdf8f
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfaa
+ dw Data_fdfc5
+ dw Data_fdfe0
+ dw Data_fde0f
+
+Data_fde0e:
+ db $ff ; unused
+
+Data_fde0f: ; fde0f
+ db 5, 5
+ db $00, $05, $0a, $0f, $14
+ db $01, $06, $0b, $10, $15
+ db $02, $07, $0c, $11, $16
+ db $03, $08, $0d, $12, $17
+ db $04, $09, $0e, $13, $18
+
+Data_fde2a: ; fde2a
+ db 5, 5
+ db $19, $1e, $23, $28, $2d
+ db $1a, $1f, $24, $29, $2e
+ db $1b, $20, $25, $2a, $2f
+ db $1c, $21, $26, $2b, $30
+ db $1d, $22, $27, $2c, $31
+
+Data_fde45: ; fde45
+ db 5, 5
+ db $ff, $ff, $ff, $ff, $ff
+ db $ff, $ff, $ff, $ff, $ff
+ db $ff, $20, $25, $ff, $ff
+ db $ff, $21, $26, $ff, $ff
+ db $ff, $ff, $ff, $ff, $ff
+
+Data_fde60: ; fde60
+ db 1, 1
+ db $00
+
+Data_fde63: ; fde63
+ db 2, 1
+ db $00
+ db $01
+
+Data_fde67: ; fde67
+ db 1, 2
+ db $00, $01
+
+Data_fde6b: ; fde6b
+ db 2, 2
+ db $00, $01
+ db $02, $03
+
+Data_fde71: ; fde71
+ db 3, 2
+ db $00, $01
+ db $02, $03
+ db $04, $05
+
+Data_fde79: ; fde79
+ db 2, 3
+ db $00, $01, $02
+ db $03, $04, $05
+
+Data_fde81: ; fde81
+ db 5, 5
+ db $ff, $ff, $ff, $ff, $ff
+ db $ff, $ff, $ff, $ff, $ff
+ db $00, $01, $02, $03, $04
+ db $ff, $ff, $ff, $ff, $ff
+ db $ff, $ff, $ff, $ff, $ff
+
+Data_fde9c: ; fde9c
+ db 5, 5
+ db $ff, $ff, $ff, $ff, $ff
+ db $ff, $ff, $ff, $ff, $ff
+ db $ff, $ff, $ff, $ff, $ff
+ db $00, $01, $02, $03, $04
+ db $05, $06, $07, $08, $09
+
+Data_fdeb7: ; fdeb7
+ db 5, 5
+ db $00, $01, $ff, $ff, $ff
+ db $02, $03, $ff, $ff, $ff
+ db $04, $05, $ff, $ff, $ff
+ db $ff, $ff, $ff, $ff, $ff
+ db $ff, $ff, $ff, $ff, $ff
+
+Data_fded2: ; fded2
+ db 5, 5
+ db $ff, $ff, $ff, $ff, $ff
+ db $00, $01, $02, $03, $04
+ db $05, $06, $07, $08, $09
+ db $0a, $0b, $0c, $0d, $0e
+ db $0f, $10, $11, $12, $13
+
+Data_fdeed: ; fdeed
+ db 5, 5
+ db $ff, $ff, $ff, $ff, $ff
+ db $ff, $ff, $ff, $00, $01
+ db $ff, $ff, $ff, $02, $03
+ db $ff, $ff, $ff, $ff, $ff
+ db $ff, $ff, $ff, $ff, $ff
+
+Data_fdf08: ; fdf08
+ db 5, 5
+ db $ff, $ff, $ff, $ff, $ff
+ db $ff, $ff, $ff, $ff, $ff
+ db $00, $01, $ff, $ff, $ff
+ db $02, $03, $ff, $ff, $ff
+ db $ff, $ff, $ff, $ff, $ff
+
+Data_fdf23: ; fdf23
+ db 5, 5
+ db $00, $01, $02, $03, $04
+ db $05, $06, $07, $08, $09
+ db $0a, $0b, $0c, $0d, $0e
+ db $0f, $10, $11, $12, $13
+ db $14, $15, $16, $17, $18
+
+Data_fdf3e: ; fdf3e
+ db 5, 5
+ db $ff, $ff, $ff, $ff, $ff
+ db $ff, $ff, $ff, $ff, $ff
+ db $00, $01, $02, $03, $04
+ db $05, $06, $07, $08, $09
+ db $ff, $ff, $ff, $ff, $ff
+
+Data_fdf59: ; fdf59
+ db 5, 5
+ db $ff, $ff, $ff, $ff, $ff
+ db $ff, $ff, $ff, $ff, $ff
+ db $00, $01, $ff, $ff, $ff
+ db $02, $03, $ff, $ff, $ff
+ db $04, $05, $ff, $ff, $ff
+
+Data_fdf74: ; fdf74
+ db 5, 5
+ db $00, $01, $02, $03, $04
+ db $05, $06, $07, $08, $09
+ db $0a, $0b, $0c, $0d, $0e
+ db $0f, $10, $11, $12, $13
+ db $14, $15, $16, $17, $18
+
+Data_fdf8f: ; fdf8f
+ db 5, 5
+ db $19, $1a, $1b, $1c, $1d
+ db $1e, $1f, $20, $21, $22
+ db $23, $24, $25, $26, $27
+ db $28, $29, $2a, $2b, $2c
+ db $2d, $2e, $2f, $30, $31
+
+Data_fdfaa: ; fdfaa
+ db 5, 5
+ db $00, $01, $02, $03, $04
+ db $05, $06, $07, $08, $09
+ db $0a, $0b, $0c, $0d, $0e
+ db $0f, $10, $11, $12, $13
+ db $14, $15, $16, $17, $18
+
+Data_fdfc5: ; fdfc5
+ db 5, 5
+ db $19, $1a, $1b, $1c, $1d
+ db $1e, $1f, $20, $21, $22
+ db $23, $24, $25, $26, $27
+ db $28, $29, $2a, $2b, $2c
+ db $2d, $2e, $2f, $30, $31
+
+Data_fdfe0: ; fdfe0
+ db 5, 5
+ db $32, $33, $34, $35, $36
+ db $37, $38, $39, $3a, $3b
+ db $3c, $3d, $3e, $3f, $40
+ db $41, $42, $43, $44, $45
+ db $46, $47, $48, $49, $4a
+
+Data_fdffb: ; fdffb
+ db 5, 5
+ db $4b, $4c, $4d, $4e, $4f
+ db $50, $51, $52, $53, $54
+ db $55, $56, $57, $58, $59
+ db $5a, $5b, $5c, $5d, $5e
+ db $5f, $60, $61, $62, $63
+
+Data_fe016: ; fe016
+ db 5, 5
+ db $64, $65, $66, $67, $68
+ db $69, $6a, $6b, $6c, $6d
+ db $6e, $6f, $70, $71, $72
+ db $73, $74, $75, $76, $77
+ db $78, $79, $7a, $7b, $7c
+
+LoadPikaPicAnimGFXHeader:
+ push hl
+ ld e, a
+ ld d, 0
+ ld hl, PikaPicAnimGFXHeaders
+ add hl, de
+ add hl, de
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ pop hl
+ ret
+
+RunPikaPicAnimScript:
+ call Func_fe066
+ ret c
+ xor a
+ ld [wPikaPicAnimPointerSetupFinished], a
+.loop
+ call GetPikaPicAnimByte
+ ld e, a
+ ld d, 0
+ ld hl, Jumptable_fe071
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call JumpToAddress
+ ld a, [wPikaPicAnimPointerSetupFinished]
+ and a
+ jr z, .loop
+ ret
+
+Func_fe066:
+ ld a, [wPikaPicAnimDelay]
+ and a
+ ret z
+ dec a
+ ld [wPikaPicAnimDelay], a
+ scf
+ ret
+
+Jumptable_fe071:
+ dw PikaPicAnimCommand_nop ; 00, 0 params
+ dw PikaPicAnimCommand_writebyte ; 01, 1 param
+ dw PikaPicAnimCommand_loadgfx ; 02, 1 param
+ dw PikaPicAnimCommand_object ; 03, 5 params
+ dw PikaPicAnimCommand_nop4 ; 04, 0 params
+ dw PikaPicAnimCommand_nop5 ; 05, 0 params
+ dw PikaPicAnimCommand_deleteobject ; 06, 1 param
+ dw PikaPicAnimCommand_nop7 ; 07, 0 params
+ dw PikaPicAnimCommand_nop8 ; 08, 0 params
+ dw PikaPicAnimCommand_jump ; 09, 1 dw param
+ dw PikaPicAnimCommand_setduration ; 0a, 1 dw param
+ dw PikaPicAnimCommand_cry ; 0b, 1 param
+ dw PikaPicAnimCommand_thunderbolt ; 0c, 0 params
+ dw PikaPicAnimCommand_waitbgmap ; 0d, 0 params (ret)
+ dw PikaPicAnimCommand_ret ; 0e, 0 params (ret)
+
+PikaPicAnimCommand_nop:
+ ret
+
+PikaPicAnimCommand_ret:
+ ld a, 1
+ ld [wPikaPicAnimTimer], a
+ xor a
+ ld [wPikaPicAnimTimer + 1], a
+ jr PikaPicAnimCommand_waitbgmap
+
+Func_fe09b:
+ ret
+
+PikaPicAnimCommand_setduration:
+ call GetPikaPicAnimByte
+ ld [wPikaPicAnimTimer], a
+ call GetPikaPicAnimByte
+ ld [wPikaPicAnimTimer + 1], a
+ ret
+
+PikaPicAnimCommand_waitbgmap:
+ ld a, $ff
+ ld [wPikaPicAnimPointerSetupFinished], a
+ ret
+
+PikaPicAnimCommand_writebyte:
+ call GetPikaPicAnimByte
+ ld [wPikaPicAnimDelay], a
+ ret
+
+PikaPicAnimCommand_nop4:
+PikaPicAnimCommand_nop5:
+PikaPicAnimCommand_nop7:
+PikaPicAnimCommand_nop8:
+ ret
+
+PikaPicAnimCommand_jump:
+ call GetPikaPicAnimByte
+ ld l, a
+ call GetPikaPicAnimByte
+ ld h, a
+ call UpdatePikaPicAnimPointer
+ ret
+
+GetPikaPicAnimByte:
+ push hl
+ ld hl, wPikaPicAnimPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [hli]
+ call UpdatePikaPicAnimPointer
+ pop hl
+ ret
+
+UpdatePikaPicAnimPointer:
+ push af
+ ld a, l
+ ld [wPikaPicAnimPointer], a
+ ld a, h
+ ld [wPikaPicAnimPointer + 1], a
+ pop af
+ ret
+
+PikaPicAnimCommand_loadgfx:
+ ld a, [wUpdateSpritesEnabled]
+ push af
+ ld a, $ff
+ ld [wUpdateSpritesEnabled], a
+ ld a, [H_AUTOBGTRANSFERENABLED]
+ push af
+ xor a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ ld a, [hTilesetType]
+ push af
+ xor a
+ ld [hTilesetType], a
+ call GetPikaPicAnimByte
+ ld [wPikaPicAnimCurGraphicID], a
+ ld a, [wPikaPicAnimCurGraphicID]
+ call LoadPikaPicAnimGFXHeader
+ ld a, c
+ cp a, $ff
+ jr z, .compressed
+ call RequestPikaPicAnimGFX
+ jr .asm_fe109
+
+.compressed
+ call DecompressRequestPikaPicAnimGFX
+.asm_fe109
+ pop af
+ ld [hTilesetType], a
+ pop af
+ ld [H_AUTOBGTRANSFERENABLED], a
+ pop af
+ ld [wUpdateSpritesEnabled], a
+ ret
+
+RequestPikaPicAnimGFX: ; fe114
+ push de
+ ld a, [wPikaPicAnimCurGraphicID]
+ ld d, a
+ ld e, c
+ call CheckIfThereIsRoomForPikaPicAnimGFX
+ pop de
+ jr c, .failed
+ call GetPikaPicVRAMAddressForNewGFX
+ call CopyVideoDataAlternate
+ and a
+.failed
+ ret
+
+DecompressRequestPikaPicAnimGFX: ; fe128
+ push de
+ ld a, [wPikaPicAnimCurGraphicID]
+ ld d, a
+ ld e, 5 * 5
+ call CheckIfThereIsRoomForPikaPicAnimGFX
+ pop de
+ jr c, .failed
+ ld a, b
+ call UncompressSpriteFromDE
+ ld a, BANK(S_SPRITEBUFFER1)
+ call SwitchSRAMBankAndLatchClockData
+ ld hl, S_SPRITEBUFFER1
+ ld de, S_SPRITEBUFFER0
+ ld bc, SPRITEBUFFERSIZE * 2
+ call CopyData
+ call PrepareRTCDataAndDisableSRAM
+ ld a, [wPikaPicAnimCurGraphicID]
+ call LookUpTileOffsetForCurrentPikaPicAnimGFX
+ call GetPikaPicVRAMAddressForNewGFX
+ ld d, h
+ ld e, l
+ call InterlaceMergeSpriteBuffers
+.failed
+ ret
+
+Func_fe15c:
+ ld hl, wNPCMovementDirections
+ ld bc, $11
+ xor a
+ call FillMemory
+ ret
+
+GetPikaPicVRAMAddressForNewGFX:
+ ld hl, vNPCSprites
+ push bc
+ ld b, a
+ and $f
+ swap a
+ ld c, a
+ ld a, b
+ and $f0
+ swap a
+ ld b, a
+ add hl, bc
+ pop bc
+ ret
+
+CheckIfThereIsRoomForPikaPicAnimGFX:
+ push bc
+ push hl
+ ld hl, wNPCMovementDirections + 1
+ ld c, 8
+.loop
+ ld a, [hl]
+ and a
+ jr z, .empty
+ cp d
+ jr z, .found
+ inc hl
+ inc hl
+ dec c
+ jr nz, .loop
+ scf
+ ret ; execute hl, then bc
+
+.found
+ inc hl
+ ld a, [hl]
+ ret ; execute hl, then bc
+
+.empty
+ ld [hl], d
+ inc hl
+ ld a, [wNPCMovementDirections]
+ add $80
+ ld [hl], a
+ ld a, [wNPCMovementDirections]
+ add e
+ ld [wNPCMovementDirections], a
+ cp $80
+ jr z, .asm_fe1a7
+ jr nc, .failed
+.asm_fe1a7
+ ld a, [hl]
+ and a
+ jr .pop_ret
+
+.failed
+ scf
+.pop_ret
+ pop hl
+ pop bc
+ ret
+
+LookUpTileOffsetForCurrentPikaPicAnimGFX:
+ push bc
+ push hl
+ ld b, a
+ ld hl, wNPCMovementDirections + 1
+ ld c, 8
+.loop
+ ld a, [hli]
+ cp b
+ jr z, .found
+ inc hl
+ dec c
+ jr nz, .loop
+ scf
+ jr .pop_ret
+
+.found
+ ld a, [hl]
+ and a
+.pop_ret
+ pop hl
+ pop bc
+ ret
+
+PikaPicAnimCommand_cry:
+ call GetPikaPicAnimByte
+ cp $ff
+ ret z
+ ld e, a
+ callab PlayPikachuSoundClip
+ ret
+
+PikaPicAnimCommand_thunderbolt:
+ ld a, $1
+ ld [wMuteAudioAndPauseMusic], a
+ call DelayFrame
+ ld a, [wAudioROMBank]
+ push af
+ ld a, BANK(SFX_Battle_2F)
+ ld [wAudioROMBank], a
+ ld [wAudioSavedROMBank], a
+ call PikaPicAnimLoadThunderboltAudio
+ call PlaySound
+ call PikaPicAnimThunderboltFlashScreen
+ call WaitForSoundToFinish
+ pop af
+ ld [wAudioROMBank], a
+ ld [wAudioSavedROMBank], a
+ xor a
+ ld [wMuteAudioAndPauseMusic], a
+ ret
+
+PikaPicAnimLoadThunderboltAudio:
+ ld hl, MoveSoundTable
+ ld e, THUNDERBOLT
+ ld d, 0
+ add hl, de
+ add hl, de
+ add hl, de
+ ld a, BANK(MoveSoundTable)
+ call GetFarByte
+ ld b, a
+ inc hl
+ ld a, BANK(MoveSoundTable)
+ call GetFarByte
+ inc hl
+ ld [wFrequencyModifier], a
+ ld a, BANK(MoveSoundTable)
+ call GetFarByte
+ ld [wTempoModifier], a
+ ld a, b
+ ret
+
+PikaPicAnimThunderboltFlashScreen:
+ ld hl, Data_fe242
+.loop
+ ld a, [hli]
+ cp $ff
+ ret z
+ ld c, a
+ ld b, [hl]
+ inc hl
+ push hl
+ call GetDMGBGPalForPikaThunderbolt
+ pop hl
+ jr .loop
+
+GetDMGBGPalForPikaThunderbolt:
+ ld a, b
+ ld [rBGP], a
+ call UpdateGBCPal_BGP
+ 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
diff --git a/engine/printer.asm b/engine/printer.asm
index 7e6ae637..95f70087 100755
--- a/engine/printer.asm
+++ b/engine/printer.asm
@@ -356,7 +356,7 @@ Func_e89e6:
ld b, a
ld a, [$caf4]
sub b
- ld hl, $c978
+ ld hl, wPrinterTileBuffer
ld de, $0028
.asm_e89f4
and a
@@ -432,7 +432,7 @@ Data_e8a58:
db $0f, $00, $00, $00, $0f, $00
Func_e8a5e: ; e8a5e (3a:4a5e)
- ld a, [$d49a]
+ ld a, [wUnknownSerialFlag_d49b]
ld e, a
ld d, 0
ld hl, Jumptable_e8a6d
@@ -1078,21 +1078,252 @@ Func_e8eca: ; e8eca (3a:4eca)
ret
Func_e8efc: ; e8efc (3a:4efc)
- dr $e8efc,$e8f09
+ coord hl, 0, 0
+ coord de, 0, 0, wPrinterTileBuffer
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ call CopyData
+ ret
+
Func_e8f09: ; e8f09 (3a:4f09)
- dr $e8f09,$e8f16
+ coord hl, 0, 0, wPrinterTileBuffer
+ coord de, 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ call CopyData
+ ret
+
Func_e8f16: ; e8f16 (3a:4f16)
- dr $e8f16,$e8f24
+ xor a
+ ld [hJoyLast], a
+ ld [hJoyReleased], a
+ ld [hJoyPressed], a
+ ld [hJoyHeld], a
+ ld [hJoy5], a
+ ld [hJoy6], a
+ ret
+
Func_e8f24: ; e8f24 (3a:4f24)
- dr $e8f24,$e8f3b
+ call Func_e8f42
+ ld a, [wAudioROMBank]
+ ld [wAudioSavedROMBank], a
+ ld a, BANK(Music_GBPrinter)
+ ld [wAudioROMBank], a
+ ld a, MUSIC_GB_PRINTER
+ ld [wNewSoundID], a
+ call PlaySound
+ ret
+
Func_e8f3b: ; e8f3b (3a:4f3b)
- dr $e8f3b,$e8f51
+ call Func_e8f42
+ call PlayDefaultMusic
+ ret
+
+Func_e8f42: ; e8f42 (3a:4f42)
+ ld a, $4
+ ld [wAudioFadeOutControl], a
+ call StopAllMusic
+.asm_e8f4a
+ ld a, [wAudioFadeOutControl]
+ and a
+ jr nz, .asm_e8f4a
+ ret
+
Func_e8f51: ; e8f51 (3a:4f51)
- dr $e8f51,$e8f82
+ ld a, [$c970]
+ cp $81
+ jr z, .asm_e8f62
+ ld a, [$c971]
+ cp $ff
+ jr z, .asm_e8f7c
+ xor a
+ jr .asm_e8f7e
+
+.asm_e8f62
+ ld a, [$c971]
+ and $e0
+ ret z
+ bit 7, a
+ jr nz, .asm_e8f78
+ 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
+ ret
+
Func_e8f82: ; e8f82 (3a:4f82)
- dr $e8f82,$e910a
+ dr $e8f82,$e8fb8
+
+String_e8fb8:
+ 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:
+ db "@"
+String_e8fdd:
+ db ""
+ next " CHECKING LINK...@"
+String_e8ff0:
+ db ""
+ next " TRANSMITTING...@"
+String_e9003:
+ db ""
+ next " PRINTING...@"
+String_e9014:
+ db " Printer Error 1"
+ next ""
+ next "Check the Game Boy"
+ next "Printer Manual.@"
+String_e9049:
+ db " Printer Error 2"
+ next ""
+ next "Check the Game Boy"
+ next "Printer Manual.@"
+String_e907e:
+ db " Printer Error 3"
+ next ""
+ next "Check the Game Boy"
+ next "Printer Manual.@"
+String_e90b3:
+ db " Printer Error 4"
+ next ""
+ next "Check the Game Boy"
+ next "Printer Manual.@"
+String_e90e8:
+ db "This is not the"
+ next "Game Boy Printer!@"
+
Func_e910a:
- dr $e910a,$e925d
+ call GBPalWhiteOutWithDelay3
+ call ClearScreen
+ ld de, SurfingPikachu2Graphics
+ ld hl, vChars2
+ lb bc, BANK(SurfingPikachu2Graphics), (SurfingPikachu2GraphicsEnd - SurfingPikachu2Graphics) / $10
+ call CopyVideoData
+ coord hl, 0, 0
+ call Func_e91a9
+ coord hl, 0, 17
+ call Func_e91a9
+ coord hl, 0, 0
+ call Func_e91b5
+ coord hl, 19, 0
+ call Func_e91b5
+ ld a, $04
+ coord hl, 0, 0
+ ld [hl], a
+ coord hl, 0, 17
+ ld [hl], a
+ coord hl, 19, 0
+ ld [hl], a
+ coord hl, 19, 17
+ ld [hl], a
+ ld de, Data_e91c4
+ coord hl, 10, 8
+ lb bc, 3, 8
+ call Func_e925d
+ ld de, Data_e91dc
+ coord hl, 2, 11
+ lb bc, 6, 16
+ call Func_e925d
+ ld de, String_e923c
+ coord hl, 3, 2
+ call PlaceString
+ ld de, String_e924b
+ coord hl, 9, 4
+ call PlaceString
+ ld de, String_e9256
+ coord hl, 12, 6
+ call PlaceString
+ ld de, wPlayerName
+ ld hl, wPlayerName
+ ld bc, 0
+.asm_e9182
+ ld a, [hli]
+ inc c
+ cp "@"
+ jr nz, .asm_e9182
+ ld a, 8
+ sub c
+ jr nc, .asm_e918e
+ xor a
+.asm_e918e
+ ld c, a
+ coord hl, 2, 4
+ add hl, bc
+ call PlaceString
+ call Func_e926f
+ ld b, 8
+ call RunPaletteCommand
+ ld a, $1
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call Delay3
+ call GBPalNormal
+ ret
+
+Func_e91a9:
+ ld c, SCREEN_WIDTH / 2
+.asm_e91ab
+ ld [hl], $00
+ inc hl
+ ld [hl], $01
+ inc hl
+ dec c
+ jr nz, .asm_e91ab
+ ret
+
+Func_e91b5:
+ ld c, SCREEN_HEIGHT / 2
+ ld de, SCREEN_WIDTH
+.asm_e91ba
+ ld [hl], $02
+ add hl, de
+ ld [hl], $03
+ add hl, de
+ dec c
+ jr nz, .asm_e91ba
+ ret
+Data_e91c4:
+ 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:
+ 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
+ db $40, $41, $42, $43, $44, $45, $46, $47, $48, $49, $4a, $4b, $40, $40, $40, $4f
+ 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:
+ db "Pikachu's Beach@"
+String_e924b:
+ db "'s Hi-Score@"
+String_e9256:
+ db "Points@"
Func_e925d:
.asm_e925d
@@ -1132,6 +1363,7 @@ Func_e927a:
ret
SurfingPikachu2Graphics: INCBIN "gfx/surfing_pikachu_2.2bpp"
+SurfingPikachu2GraphicsEnd:
Func_e988a:
xor a
@@ -1229,7 +1461,7 @@ Func_e994e:
ld a, [de]
cp $ff
jr z, .asm_e99a6
- ld [$d11d], a
+ ld [wd11e], a
push bc
push hl
push de