diff options
Diffstat (limited to 'engine')
46 files changed, 10248 insertions, 11356 deletions
diff --git a/engine/bank3c.asm b/engine/bank3c.asm index 2d9671f9..83e010ff 100644 --- a/engine/bank3c.asm +++ b/engine/bank3c.asm @@ -1,158 +1,4 @@ -PlayPikachuSoundClip:: ; f0000 (3c:4000) - ld a, e - ld e, a - ld d, $0 - ld hl, PikachuCriesPointerTable - add hl, de - add hl, de - add hl, de - ld b, [hl] ; bank of pikachu cry data - inc hl - ld a, [hli] ; cry data pointer - ld h, [hl] - ld l, a - ld c, $4 -.loop - dec c - jr z, .done_delay - call DelayFrame - jr .loop - -.done_delay - di - push bc - push hl - ld a, $80 - ld [rNR52], a - ld a, $77 - ld [rNR50], a - xor a - ld [rNR30], a - ld hl, $ff30 ; wave data - ld de, wRedrawRowOrColumnSrcTiles -.saveWaveDataLoop - ld a, [hl] - ld [de], a - inc de - ld a, $ff - ld [hli], a - ld a, l - cp $40 ; end of wave data - jr nz, .saveWaveDataLoop - ld a, $80 - ld [rNR30], a - ld a, [rNR51] - or $44 - ld [rNR51], a - ld a, $ff - ld [rNR31], a - ld a, $20 - ld [rNR32], a - ld a, $ff - ld [rNR33], a - ld a, $87 - ld [rNR34], a - pop hl - pop bc - call PlayPikachuPCM - xor a - ld [wc0f3], a - ld [wc0f4], a - ld a, $80 - ld [rNR52], a - xor a - ld [rNR30], a - ld hl, $ff30 - ld de, wRedrawRowOrColumnSrcTiles -.reloadWaveDataLoop - ld a, [de] - inc de - ld [hli], a - ld a, l - cp $40 ; end of wave data - jr nz, .reloadWaveDataLoop - ld a, $80 - ld [rNR30], a - ld a, [rNR51] - and $bb - ld [rNR51], a - xor a - ld [wChannelSoundIDs+CH4], a - ld [wChannelSoundIDs+CH5], a - ld [wChannelSoundIDs+CH6], a - ld [wChannelSoundIDs+CH7], a - ld a, [H_LOADEDROMBANK] - ei - ret - -PikachuCriesPointerTable: ; f008e (3c:408e) -; format: -; db bank -; dw pointer to cry - -; bank 21 - pikacry_def PikachuCry1 ; 21:4000 - pikacry_def PikachuCry2 ; 21:491a - pikacry_def PikachuCry3 ; 21:4fdc - pikacry_def PikachuCry4 ; 21:59ee - -; bank 22 - pikacry_def PikachuCry5 ; 22:4000 - pikacry_def PikachuCry6 ; 22:5042 - pikacry_def PikachuCry7 ; 22:6254 - -; bank 23 - pikacry_def PikachuCry8 ; 23:4000 - pikacry_def PikachuCry9 ; 23:50ca - pikacry_def PikachuCry10 ; 23:5e0c - -; bank 24 - pikacry_def PikachuCry11 ; 24:4000 - pikacry_def PikachuCry12 ; 24:4722 - pikacry_def PikachuCry13 ; 24:54a4 - -; bank 25 - pikacry_def PikachuCry14 ; 25:4000 - pikacry_def PikachuCry15 ; 25:589a - -; banks 31-34, in no particular order - - pikacry_def PikachuCry16 ; 31:4000 - pikacry_def PikachuCry17 ; 34:4000 - pikacry_def PikachuCry18 ; 31:549a - pikacry_def PikachuCry19 ; 33:4000 - pikacry_def PikachuCry20 ; 32:4000 - pikacry_def PikachuCry21 ; 32:6002 - pikacry_def PikachuCry22 ; 31:63a4 - pikacry_def PikachuCry23 ; 34:4862 - pikacry_def PikachuCry24 ; 33:5632 - pikacry_def PikachuCry25 ; 34:573c - pikacry_def PikachuCry26 ; 33:725c - -; bank 35 - pikacry_def PikachuCry27 ; 35:4000 - pikacry_def PikachuCry28 ; 35:4b5a - pikacry_def PikachuCry29 ; 35:5da4 - pikacry_def PikachuCry30 ; 35:69ce - pikacry_def PikachuCry31 ; 35:6e80 - -; bank 36 - pikacry_def PikachuCry32 ; 36:4000 - pikacry_def PikachuCry33 ; 36:458a - pikacry_def PikachuCry34 ; 36:523c - -; bank 37 - pikacry_def PikachuCry35 ; 37:4000 - pikacry_def PikachuCry36 ; 37:522a - -; banks 36-38 - pikacry_def PikachuCry37 ; 38:4000 - pikacry_def PikachuCry38 ; 38:4dfa - pikacry_def PikachuCry39 ; 37:6e0c - pikacry_def PikachuCry40 ; 38:5a64 - pikacry_def PikachuCry41 ; 36:6746 - pikacry_def PikachuCry42 ; 38:6976 - +INCLUDE "engine/pikachu_pcm.asm" INCLUDE "engine/overworld/advance_player_sprite.asm" ResetStatusAndHalveMoneyOnBlackout:: ; f0274 (3c:4274) @@ -169,30 +15,30 @@ ResetStatusAndHalveMoneyOnBlackout:: ; f0274 (3c:4274) ld [wNPCMovementScriptPointerTableNum], a ld [wFlags_0xcd60], a - ld [$ff9f], a - ld [$ff9f + 1], a - ld [$ff9f + 2], a + ld [hMoney], a + ld [hMoney + 1], a + ld [hMoney + 2], a call HasEnoughMoney jr c, .lostmoney ; never happens ; Halve the player's money. ld a, [wPlayerMoney] - ld [$ff9f], a + ld [hMoney], a ld a, [wPlayerMoney + 1] - ld [$ff9f + 1], a + ld [hMoney + 1], a ld a, [wPlayerMoney + 2] - ld [$ff9f + 2], a + ld [hMoney + 2], a xor a - ld [$ffa2], a - ld [$ffa3], a + ld [hDivideBCDDivisor], a + ld [hDivideBCDDivisor + 1], a ld a, 2 - ld [$ffa4], a + ld [hDivideBCDDivisor + 2], a predef DivideBCDPredef3 - ld a, [$ffa2] + ld a, [hDivideBCDQuotient] ld [wPlayerMoney], a - ld a, [$ffa2 + 1] + ld a, [hDivideBCDQuotient + 1] ld [wPlayerMoney + 1], a - ld a, [$ffa2 + 2] + ld a, [hDivideBCDQuotient + 2] ld [wPlayerMoney + 2], a .lostmoney @@ -217,10 +63,12 @@ Func_f02da:: ; f02da (3c:42da) cp a, $ff jr nz, .asm_f02e5 ret + .asm_f02ee ld hl, wd126 set 6, [hl] ret + .asm_f02f4 ld hl, wd126 set 5, [hl] @@ -264,6 +112,7 @@ Func_f0a54:: ; f0a54 (3c:4a54) ret Func_f0a55:: ; f0a55 (3c:4a55) +; referenced in an unused function ld hl, Pointer_f0a76 ; 3c:4a76 .loop ld a, [hli] @@ -281,7 +130,7 @@ Func_f0a55:: ; f0a55 (3c:4a55) .asm_f0a68 ld a, [hli] ld c, a - ld b, $0 + ld b, 0 ld a, [hli] ld h, [hl] ld l, a @@ -290,10 +139,17 @@ Func_f0a55:: ; f0a55 (3c:4a55) ret Pointer_f0a76:: ; f0a76 (3c:4a76) - db $27, $07, $7b, $4a, $ff - db $01, $ec, $02, $ed, $03, $ee, $ff + dbbw BLUES_HOUSE, Pointer_f0a7bEnd - Pointer_f0a7b, Pointer_f0a7b + db $ff + +Pointer_f0a7b: + db 1, HS_DAISY_SITTING_COPY + db 2, HS_DAISY_WALKING_COPY + db 3, HS_TOWN_MAP_COPY + db $ff +Pointer_f0a7bEnd: -Func_f0a82: ; f0a82 +TryApplyPikachuMovementData: ; f0a82 ld a, [wd472] bit 7, a ret z @@ -317,8 +173,8 @@ Func_f0a82: ; f0a82 pop af ld [wUpdateSpritesEnabled], a pop hl - call Func_159b ; homecall Func_fd2a1 - pikachu movement script? - callab Func_fcba1 + call ApplyPikachuMovementData + callab RefreshPikachuFollow ret Pic_f0abf: ; f0abf (3c:4abf) @@ -357,7 +213,7 @@ INCLUDE "scripts/pewterpokecenter2.asm" Func_f1e22: ld hl, PikachuMovementData_f1e2b ld b, SPRITE_FACING_RIGHT - call Func_f0a82 + call TryApplyPikachuMovementData ret PikachuMovementData_f1e2b: @@ -374,7 +230,7 @@ INCLUDE "scripts/celadonmansion3_2.asm" Func_f1f23: ld hl, PikachuMovementData_f1f2c ld b, SPRITE_FACING_DOWN - call Func_f0a82 + call TryApplyPikachuMovementData ret PikachuMovementData_f1f2c: @@ -436,10 +292,10 @@ Func_f2cee: Func_f2cf4: ; should return to a, instead returns to b call Random swap a - cp $55 + cp 1 * $ff / 3 ld b, 0 ret c - cp $aa + cp 2 * $ff / 3 ld b, 1 ret c ld b, 2 @@ -451,7 +307,7 @@ Func_f2d06: ret Func_f2d0c: - ld hl, GymTrashCans3a + ld hl, GymTrashCans3c ld a, [wGymTrashCanIndex] ld c, a ld b, 0 @@ -472,7 +328,7 @@ Func_f2d0c: ld [wSecondLockTrashCanIndex + 1], a ret -GymTrashCans3a: ; f2d31 (3c:6d31) +GymTrashCans3c: ; f2d31 (3c:6d31) ; First byte: number of trashcan entries ; Following four byte pairs: indices for the second trash can. ; BUG: Rows that have 3 trashcan entries are sampled incorrectly. diff --git a/engine/bank3d.asm b/engine/bank3d.asm index f86bcf21..bf84e096 100644 --- a/engine/bank3d.asm +++ b/engine/bank3d.asm @@ -3,49 +3,49 @@ INCLUDE "engine/battle/link_battle_versus_text.asm" INCLUDE "engine/battle/unused_stats_functions.asm" INCLUDE "engine/battle/scroll_draw_trainer_pic.asm" -Func_f429f:: ; f429f (3d:429f) +StarterPikachuBattleEntranceAnimation: ; f429f (3d:429f) coord hl, 0, 5 - ld c, $0 -.asm_f42a4 + ld c, 0 +.loop1 inc c ld a, c - cp $9 + cp 9 ret z - ld d, $5b + ld d, 7 * 13 push bc push hl -.asm_f42ad - call Func_f42c2 +.loop2 + call .PlaceColumn dec hl ld a, d - sub $7 + sub 7 ld d, a dec c - jr nz, .asm_f42ad - ld c, $2 + jr nz, .loop2 + ld c, 2 call DelayFrames pop hl pop bc inc hl - jr .asm_f42a4 + jr .loop1 -Func_f42c2:: ; f42c2 (3d:f42c2) +.PlaceColumn: ; f42c2 (3d:f42c2) push hl push de push bc - ld e, $7 -.loop + ld e, 7 +.loop3 ld a, d - cp $31 - jr nc, .asm_f42ce + cp 7 * 7 + jr nc, .okay ld a, $7f -.asm_f42ce +.okay ld [hl], a - ld bc, $14 + ld bc, SCREEN_WIDTH add hl, bc inc d dec e - jr nz, .loop + jr nz, .loop3 pop bc pop de pop hl @@ -172,56 +172,56 @@ PikachuMoods: ; f43a6 (3d:43a6) db $6c ; Unknown (d = 10) db $00 ; Unknown (d = 11) -RedPicBack:: INCBIN "pic/trainer/redb.pic" -OldManPic:: INCBIN "pic/trainer/oldman.pic" -ProfOakPicBack:: INCBIN "pic/ytrainer/prof.oakb.pic" +RedPicBack: INCBIN "pic/trainer/redb.pic" +OldManPic: INCBIN "pic/trainer/oldman.pic" +ProfOakPicBack: INCBIN "pic/ytrainer/prof.oakb.pic" -Func_f453f:: ; f453f (3d:453f) +LoadYellowTitleScreenGFX: ; f453f (3d:453f) ld hl, PokemonLogoGraphics ld de, vChars2 - ld bc, $730 + ld bc, 115 * $10 ld a, BANK(PokemonLogoGraphics) ; redundant because this function is in bank3d call FarCopyData - ld hl, YellowLogoGraphics+$230 - ld de, vChars0+$fd0 - ld bc, $30 + ld hl, YellowLogoGraphics + 35 * $10 + ld de, vChars0 + 253 * $10 + ld bc, 3 * $10 ld a, BANK(YellowLogoGraphics) call FarCopyData - ld hl, YellowLogoGraphics+$260 + ld hl, YellowLogoGraphics + 38 * $10 ld de, vChars1 - ld bc, $400 + ld bc, 64 * $10 ld a, BANK(YellowLogoGraphics) call FarCopyData - ld hl, YellowLogoGraphics+$660 - ld de, vChars0+$f00 - ld bc, $c0 + ld hl, YellowLogoGraphics + 102 * $10 + ld de, vChars0 + 240 * $10 + ld bc, 12 * $10 ld a, BANK(YellowLogoGraphics) call FarCopyData ret -Func_f4578:: ; f4578 (3d:4578) +TitleScreen_PlacePokemonLogo: ; f4578 (3d:4578) coord hl, 2, 1 - ld de, Pointer_f45f9 - ld bc, 7 << 8 | 16 ; 16x7 (xy) - call CopyScreenArea + ld de, TitleScreenPokemonLogoTilemap + lb bc, 7, 16 + call Bank3D_CopyBox ret -Func_f4585:: ; f4585 (3d:4585) +TitleScreen_PlacePikaSpeechBubble: ; f4585 (3d:4585) coord hl, 6, 4 - ld de, Pointer_f4673 - ld bc, 4 << 8 | 7 ; 7x4 (xy) - call CopyScreenArea + ld de, TitleScreenPikaBubbleTilemap + lb bc, 4, 7 + call Bank3D_CopyBox coord hl, 9, 8 ld [hl], $64 inc hl ld [hl], $65 ret -Func_f459a:: ; f459a (3d:459a) +TitleScreen_PlacePikachu: ; f459a (3d:459a) coord hl, 4, 8 - ld de, Pointer_f468f - ld bc, 9 << 8 | 12 ; 12x9 (xy) - call CopyScreenArea + ld de, TitleScreenPikachuTilemap + lb bc, 9, 12 + call Bank3D_CopyBox coord hl, 16, 10 ld [hl], $96 coord hl, 16, 11 @@ -230,13 +230,13 @@ Func_f459a:: ; f459a (3d:459a) ld [hl], $a7 coord hl, 16, 13 ld [hl], $b1 - ld hl, Pointer_f45c7 + ld hl, TitleScreenPikachuEyesOAMData ld de, wOAMBuffer ld bc, $20 call CopyData ret -Pointer_f45c7: ; f45c7 (3d:45c7) +TitleScreenPikachuEyesOAMData: ; f45c7 (3d:45c7) db $60, $40, $f1, $22 db $60, $48, $f0, $22 db $68, $40, $f3, $22 @@ -246,25 +246,26 @@ Pointer_f45c7: ; f45c7 (3d:45c7) db $68, $60, $f2, $02 db $68, $68, $f3, $02 -CopyScreenArea:: ; f45e7 (3d:45e7) +Bank3D_CopyBox: ; f45e7 (3d:45e7) ; copy cxb (xy) screen area from de to hl +.row push bc push hl -.loop +.col ld a, [de] inc de ld [hli], a dec c - jr nz, .loop + jr nz, .col pop hl - ld bc, $14 + ld bc, SCREEN_WIDTH add hl, bc pop bc dec b - jr nz, CopyScreenArea + jr nz, .row ret -Pointer_f45f9: ; f45f9 (3d:45f9) +TitleScreenPokemonLogoTilemap: ; f45f9 (3d:45f9) ; 16x7 (xy) db $f4, $f4, $f4, $f4, $f4, $f4, $49, $f4, $72, $30, $f4, $f4, $f4, $f4, $f4, $f4 db $fd, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0a, $0b, $f4, $0d, $0e, $0f @@ -274,17 +275,18 @@ Pointer_f45f9: ; f45f9 (3d:45f9) db $f4, $41, $42, $43, $44, $45, $46, $47, $48, $f4, $4a, $4b, $4c, $4d, $4e, $4f db $f4, $6a, $6b, $6c, $6d, $f4, $f4, $f4, $f4, $f4, $f4, $6e, $6f, $70, $71, $f4 -Pointer_f4669:: ; f4669 (3d:4669) +Pointer_f4669: ; f4669 (3d:4669) +; Unreferenced db $47, $48, $49, $4a, $4b, $4c, $4d, $4e, $4f, $5f -Pointer_f4673:: ; f4673 (3d:4673) +TitleScreenPikaBubbleTilemap: ; f4673 (3d:4673) ; 7x4 (xy) db $24, $25, $66, $67, $68, $69, $2a db $50, $51, $52, $53, $54, $55, $56 db $57, $58, $59, $5a, $5b, $5c, $5d db $6d, $5e, $5f, $60, $61, $62, $63 -Pointer_f468f:: ; f468f (3d:468f) +TitleScreenPikachuTilemap: ; f468f (3d:468f) ; 12x9 (xy) db $80, $81, $82, $83, $00, $00, $00, $00, $84, $85, $86, $87 db $88, $89, $8a, $8b, $8c, $8d, $8d, $8e, $8f, $8a, $90, $91 @@ -298,15 +300,17 @@ Pointer_f468f:: ; f468f (3d:468f) ; f46f9 (3d:46f9) PokemonLogoGraphics: INCBIN "gfx/pokemon_logo.2bpp" +PokemonLogoGraphicsEnd: YellowLogoGraphics: INCBIN "gfx/yellow_titlescreen.2bpp" +YellowLogoGraphicsEnd: INCLUDE "engine/menu/link_menu.asm" -HandleMenuInputDouble:: ; f5a40 (3d:5a40) +HandleMenuInputDouble: ; f5a40 (3d:5a40) xor a ld [wPartyMenuAnimMonEnabled], a -HandleMenuInputPokemonSelectionDouble:: ; f5a44 (3d:5a44) +HandleMenuInputPokemonSelectionDouble: ; f5a44 (3d:5a44) ld a, [H_DOWNARROWBLINKCNT1] push af ld a, [H_DOWNARROWBLINKCNT2] @@ -318,7 +322,7 @@ HandleMenuInputPokemonSelectionDouble:: ; f5a44 (3d:5a44) .loop1 xor a ld [wAnimCounter], a ; counter for pokemon shaking animation - call Func_f5ab0 + call .UpdateCursorTile call JoypadLowSensitivity ld a, [hJoy5] and a ; was a key pressed? @@ -376,7 +380,7 @@ HandleMenuInputPokemonSelectionDouble:: ; f5a44 (3d:5a44) ld a, [hJoy5] ret -Func_f5ab0:: ; f5ab0 (3d:5ab0) +.UpdateCursorTile: ; f5ab0 (3d:5ab0) ld a, [wTopMenuItemY] and a jr z, .asm_f5ac0 @@ -427,12 +431,12 @@ Func_f5ab0:: ; f5ab0 (3d:5ab0) ld a, l ld [wMenuCursorLocation], a ld a, h - ld [wMenuCursorLocation+1], a + ld [wMenuCursorLocation + 1], a ld a, [wCurrentMenuItem] ld [wLastMenuItem], a ret -PrintStrengthTxt:: ; f5b06 (3d:5b06) +PrintStrengthTxt: ; f5b06 (3d:5b06) ld hl, wd728 set 0, [hl] ld hl, Text_f5b17 @@ -440,7 +444,7 @@ PrintStrengthTxt:: ; f5b06 (3d:5b06) ld hl, Text_f5b28 jp PrintText -Text_f5b17:: ; f5b17 (3d:5b17) +Text_f5b17: ; f5b17 (3d:5b17) TX_FAR _UsedStrengthText ; 2d:417e TX_ASM ld a, [wcf91] @@ -448,11 +452,11 @@ Text_f5b17:: ; f5b17 (3d:5b17) call Delay3 jp TextScriptEnd -Text_f5b28:: ; f5b28 (3d:5b28) +Text_f5b28: ; f5b28 (3d:5b28) TX_FAR _CanMoveBouldersText ; 2d:4193 db "@" -CheckForForcedBikeSurf:: ; f5b2d (3d:5b2d) +CheckForForcedBikeSurf: ; f5b2d (3d:5b2d) ld hl, wd728 set 1, [hl] ld a, [wd732] @@ -476,19 +480,19 @@ CheckForForcedBikeSurf:: ; f5b2d (3d:5b2d) ld hl, CyclingIsFunText jp PrintText -CoordsData_f5b64:: ; f5b64 (3d:5b64) +CoordsData_f5b64: ; f5b64 (3d:5b64) db 11, 07 db $ff -CurrentTooFastText:: ; f5b67 (3d:5b67) +CurrentTooFastText: ; f5b67 (3d:5b67) TX_FAR _CurrentTooFastText ; 2d:41ab db "@" -CyclingIsFunText:: ; f5b6c (3d:5b6c) +CyclingIsFunText: ; f5b6c (3d:5b6c) TX_FAR _CyclingIsFunText ; 2d:41ca db "@" -AddItemToInventory_:: ; f5b70 (3d:5b70) +AddItemToInventory_: ; f5b70 (3d:5b70) ld a, [wItemQuantity] ; a = item quantity push af push bc @@ -640,7 +644,7 @@ BlankLeaderNames: INCBIN "gfx/blank_leader_names.2bpp" CircleTile: INCBIN "gfx/circle_tile.2bpp" BadgeNumbersTileGraphics: INCBIN "gfx/badge_numbers.2bpp" -ReadSuperRodData:: ; f5ea4 (3d:5ea4) +ReadSuperRodData: ; f5ea4 (3d:5ea4) ld a, [wCurMap] ld c, a ld hl, FishingSlots diff --git a/engine/bank3e.asm b/engine/bank3e.asm index f5b3c765..32f5ebfd 100644 --- a/engine/bank3e.asm +++ b/engine/bank3e.asm @@ -1,4498 +1,5 @@ -SurfingPikachuMinigame: - call SurfingPikachuMinigame_BlankPals - call DelayFrame - call DelayFrame - call DelayFrame - ld a, [hTilesetType] - push af - xor a - ld [hTilesetType], a - ld a, [wUpdateSpritesEnabled] - push af - ld a, $ff - ld [wUpdateSpritesEnabled], a - ld a, [rIE] - push af - xor a - ld [rIF], a - ld a, $f - ld [rIE], a - ld a, $8 - ld [rSTAT], a - ld a, [H_AUTOBGTRANSFERDEST + 1] - push af - ld a, $98 - ld [H_AUTOBGTRANSFERDEST + 1], a - call Func_f8fb3 - call Func_f807a - xor a - ld [rBGP], a - ld [rOBP0], a - ld [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - call ClearObjectAnimationBuffers - call ClearSprites - xor a - ld [hLCDCPointer], a - ld [hSCX], a - ld [hSCY], a - ld a, $90 - ld [hWY], a - call DelayFrame - pop af - ld [H_AUTOBGTRANSFERDEST + 1], a - xor a - ld [rIF], a - pop af - ld [rIE], a - xor a - ld [rSTAT], a - call RunDefaultPaletteCommand - call Func_0f16 - call PlayDefaultMusic - call GBPalNormal - pop af - ld [wUpdateSpritesEnabled], a - pop af - ld [hTilesetType], a - ret - -Func_f807a: - call Func_f8116 - call DelayFrame - ld b, $e - call RunPaletteCommand -.loop - ld a, [wc5d1] - bit 7, a - ret nz - call Func_f923f - call Func_f80ac - ret nz - call Func_f8282 - ld a, $3c - ld [wCurrentAnimatedObjectOAMBufferOffset], a - call RunObjectAnimations - call Func_f8848 - call Func_f80a8 - call Func_f80c4 - jr .loop - -Func_f80a8: - call DelayFrame - ret - -Func_f80ac: - ld hl, wPreventBlackout - bit 1, [hl] - ret z - ld a, [hJoyPressed] - and $4 - ret - -Func_f80b7: - ld a, [hJoyPressed] - and $8 - ret z - ld hl, wc5e2 - ld a, [hl] - xor $1 - ld [hl], a - ret - -Func_f80c4: - ld a, [wc634] - and a - ret z - ld hl, wChannelNoteDelayCounters - ld a, $1 - cp [hl] - ret nz - inc hl - cp [hl] - ret nz - inc hl - cp [hl] - ret nz - ld a, [wc5e3] - ld e, a - ld a, [wc5e3 + 1] - and $3 - ld d, a - sla e - rl d - ld e, d - ld d, $0 - ld hl, Unkn_f80f5 - add hl, de - add hl, de - ld a, [hli] - ld [wMusicTempo + 1], a - ld a, [hl] - ld [wMusicTempo], a - ret - -Unkn_f80f5: - dw $75 - dw $6d - dw $65 - dw $5d - dw $55 - -Func_f80ff: - ld hl, wChannelNoteDelayCounters - ld a, $1 - cp [hl] - ret nz - inc hl - cp [hl] - ret nz - inc hl - cp [hl] - ret nz - ld a, $75 - ld [wMusicTempo + 1], a - xor a - ld [wMusicTempo], a - ret - -Func_f8116: - call Func_f9279 - call ClearSprites - call DisableLCD - ld hl, wSerialEnemyMonsPatchList - ld bc, $67 - xor a - call FillMemory - ld hl, wc700 - ld bc, $200 - xor a - call FillMemory - xor a - ld [H_AUTOBGTRANSFERENABLED], a - call ClearObjectAnimationBuffers - - ld hl, SurfingPikachu1Graphics - ld de, $9000 - ld bc, $500 - ld a, BANK(SurfingPikachu1Graphics) - call FarCopyData - - ld hl, SurfingPikachu1Graphics + $410 - ld de, $8000 - ld bc, $1000 - ld a, BANK(SurfingPikachu1Graphics) - call FarCopyData - - ld a, Unkn_f93d3 % $100 - ld [wAnimatedObjectSpawnStateDataPointer], a - ld a, Unkn_f93d3 / $100 - ld [wAnimatedObjectSpawnStateDataPointer + 1], a - ld a, Jumptable_f93fa % $100 - ld [wAnimatedObjectJumptablePointer], a - ld a, Jumptable_f93fa / $100 - ld [wAnimatedObjectJumptablePointer + 1], a - ld a, Unkn_f9507 % $100 - ld [wAnimatedObjectOAMDataPointer], a - ld a, Unkn_f9507 / $100 - ld [wAnimatedObjectOAMDataPointer + 1], a - ld a, Unkn_f9405 % $100 - ld [wAnimatedObjectFramesDataPointer], a - ld a, Unkn_f9405 / $100 - ld [wAnimatedObjectFramesDataPointer + 1], a - ld hl, vBGMap0 - ld bc, $800 - ld a, $0 - call FillMemory - ld hl, $98c0 - ld bc, $180 - ld a, $b - call FillMemory - ld a, $1 - lb de, $74, $58 - call SpawnAnimatedObject - ld a, $74 - ld [wc5ea], a - call Func_f9223 - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7e - ld [hWY], a - ld a, $42 - ld [hLCDCPointer], a - ld a, $40 - ld [wc5e3], a - xor a - ld [wc5e3 + 1], a - xor a - ld [wc5d6], a - ld a, $60 - ld [wc5d7], a - ld hl, wc61a - ld bc, $14 - ld a, $74 - call FillMemory - call Func_f81ff - call Func_f8256 - ld a, $e3 - ld [rLCDC], a - call Func_f81e9 - ld a, $e4 - ld [rOBP0], a - ld a, $e0 - ld [rOBP1], a - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret - -Func_f81e9: - ld a, [wOnSGB] - and a - jr nz, .asm_f81f7 - ld a, $d0 - ld [rBGP], a - call UpdateGBCPal_BGP - ret - -.asm_f81f7 - ld a, $e4 - ld [rBGP], a - call UpdateGBCPal_BGP - ret - -Func_f81ff: - ld hl, wSpriteDataEnd - ld de, Unkn_f8249 - ld b, $97 - ld c, $80 - ld a, $4 - call Func_f8233 - ld de, Unkn_f8248 - ld b, $96 - ld c, $50 - ld a, $1 - call Func_f8233 - ld de, Unkn_f824d - ld b, $14 - ld c, $20 - ld a, $5 - call Func_f8233 - ld de, Unkn_f8252 - ld b, $20 - ld c, $80 - ld a, $4 - call Func_f8233 - ret - -Func_f8233: -.asm_f8233 - push af - ld [hl], b - inc hl - ld [hl], c - inc hl - ld a, [de] - ld [hl], a - inc hl - ld [hl], $0 - inc hl - ld a, c - add $8 - ld c, a - inc de - pop af - dec a - jr nz, .asm_f8233 - ret - -Unkn_f8248: - db $fe - -Unkn_f8249: - db $d0 - db $d0 - db $d0 - db $d0 - -Unkn_f824d: - db $ec - db $ed - db $ed - db $ee - db $ef - -Unkn_f8252: - db $ec - db $ed - db $ee - db $ef - -Func_f8256: - ld de, $9c21 - ld hl, Unkn_f8279 - ld c, $9 -.asm_f825e - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .asm_f825e - ld hl, $9c01 - ld [hl], $15 - ld hl, $9c02 - ld [hl], $16 - ld hl, $9c2c - ld [hl], $1b - ld hl, $9c2d - ld [hl], $1c - ret - -Unkn_f8279: - db $17 - db $18 - db $19 - db $19 - db $19 - db $19 - db $19 - db $19 - db $19 - -Func_f8282: - ld a, [wc5d1] - ld e, a - ld d, $0 - ld hl, Jumptable_f8291 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp [hl] - -Jumptable_f8291: - dw Func_f82ab - dw Func_f82bd - dw Func_f8324 - dw Func_f835c - dw Func_f838c - dw Func_f8399 - dw Func_f83aa - dw Func_f83bb - dw Func_f83cc - dw Func_f83e3 - dw Func_f8406 - dw Func_f840f - dw Func_f841d - -Func_f82ab: - ld a, $2 - lb de, $48, $e0 - call SpawnAnimatedObject - ld hl, wc5d1 - inc [hl] - ld a, $1 - ld [wc634], a - ret - -Func_f82bd: - ld a, [wc5e5] - cp $18 - jr nc, .asm_f82e8 - ld hl, wc5d6 - ld a, [hli] - or [hl] - and a - jr z, .asm_f82f6 - call Random - ld [wc5d5], a - call Func_f9210 - call Func_f88ae - call Func_f886b - call Func_f8cb0 - call Func_f844c - call Func_f88e4 - call Func_f88fd - ret - -.asm_f82e8 - ld hl, wc5d1 - inc [hl] - xor a - ld [wc634], a - ld a, $c0 - ld [wc632], a - ret - -.asm_f82f6 - ld a, $1 -Func_f82f8: - ld [wc630], a - ld a, $c - ld [wc5d1], a -Func_f8300: - ld a, $80 - ld [wc631], a - ld a, $b - lb de, $88, $58 - call SpawnAnimatedObject - ld hl, $7 - add hl, bc - ld [hl], $80 - ld hl, $b - add hl, bc - ld [hl], $80 - ld hl, $c - add hl, bc - ld [hl], $30 - xor a - ld [wc634], a - ret - -Func_f8324: - call Func_f8440 - jr c, .asm_f833d - xor a - ld [wc5d5], a - call Func_f9210 - call Func_f88ae - call Func_f886b - call Func_f8c97 - call Func_f80ff - ret - -.asm_f833d - ld hl, wc5d1 - inc [hl] - ld a, $90 - ld [hSCX], a - ld a, $72 - ld [wc5d3], a - ld a, $4 - ld [wc5d2], a - xor a - ld [hLCDCPointer], a - ld [wc617], a - ld [wc618], a - ld [wc619], a - ret - -Func_f835c: - ld a, [hSCX] - and a - jr z, .asm_f837b - call Func_f9210 - call Func_f88ae - call Func_f886b - ld a, [hSCX] - dec a - dec a - dec a - dec a - ld [hSCX], a - ld a, $e0 - ld [wc62e], a - call Func_f8cc7 - ret - -.asm_f837b - xor a - ld [wc5e3], a - ld [wc5e3 + 1], a - ld hl, wc5d1 - inc [hl] - ld a, $5 - ld [wc5d2], a - ret - -Func_f838c: - call Func_f891e - ld a, $20 - ld [wc632], a - ld hl, wc5d1 - inc [hl] - ret - -Func_f8399: - call Func_f8440 - ret nc - call Func_f8a92 - ld a, $40 - ld [wc632], a - ld hl, wc5d1 - inc [hl] - ret - -Func_f83aa: - call Func_f8440 - ret nc - call Func_f8ae4 - ld a, $40 - ld [wc632], a - ld hl, wc5d1 - inc [hl] - ret - -Func_f83bb: - call Func_f8440 - ret nc - call Func_f8b7a - ld a, $40 - ld [wc632], a - ld hl, wc5d1 - inc [hl] - ret - -Func_f83cc: - call Func_f8440 - ret nc - call Func_f8aa9 - push af - call Func_f8b5d - pop af - ret nc - ld a, $40 - ld [wc632], a - ld hl, wc5d1 - inc [hl] - ret - -Func_f83e3: - call Func_f8440 - ret nc - call Func_f8afb - push af - call Func_f8b5d - pop af - ret nc - ld a, $80 - ld [wc632], a - ld hl, wc5d1 - inc [hl] - call Func_f8b92 - ret nc - call Func_f8a7c -Func_f83ff: - ld a, $6 - ld [wc5d2], a - ret - -Func_f8406: - call Func_f8440 -Func_f8408: - ret nc - ld hl, wc5d1 - inc [hl] - ret - -Func_f840f: - call Func_f9210 - ld a, [hJoyPressed] - and $1 - ret z - ld hl, wc5d1 - set 7, [hl] - ret - -Func_f841d: - call Func_f9210 - call Func_f88ae - call Func_f886b - call Func_f8cb0 - call Func_f80ff - ld hl, wc631 - ld a, [hl] - and a - jr z, .asm_f8435 - dec [hl] - ret - -.asm_f8435 - ld a, [hJoyPressed] - and $1 - ret z - ld hl, wc5d1 - set 7, [hl] - ret - -Func_f8440: - ld hl, wc632 - ld a, [hl] - and a - jr z, .asm_f844a - dec [hl] - and a - ret - -.asm_f844a - scf - ret - -Func_f844c: - ld a, [wc5e6] - ld h, a - ld a, [wc5e7] - ld l, a - ld a, [wc5e3] - ld e, a - ld a, [wc5e3 + 1] - ld d, a - add hl, de - ld a, h - ld [wc5e6], a - ld a, l - ld [wc5e7], a - ret nc - ld hl, wc5e5 - inc [hl] - ld hl, wOAMBuffer + 4 * 4 + 1 - dec [hl] - dec [hl] - ret - -Func_f8470 - ld a, [wc5d2] - ld e, a - ld d, $0 - ld hl, Jumptable_f847f - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp [hl] - -Jumptable_f847f: - dw Func_f848d - dw Func_f84e2 - dw Func_f8516 - dw Func_f8545 - dw Func_f8561 - dw Func_f856d - dw Func_f8579 - -Func_f848d: - ld a, [wc630] - and a - jr nz, .asm_f84d2 - call Func_f87b5 - ld a, [wc5ea] - ld hl, $5 - add hl, bc - ld [hl], a - call Func_f871e - jr c, .asm_f84aa - call Func_f8742 - call Func_f86b8 - ret - -.asm_f84aa - call Func_f8742 - ld a, $1 - ld [wc5d2], a - xor a - ld hl, $c - add hl, bc - ld [hl], a - ld hl, $d - add hl, bc - ld [hl], a - ld hl, $e - add hl, bc - ld [hl], a - ld [wc5d9], a - ld [wc62f], a - xor a - ld [wChannelSoundIDs + CH7], a - ld a, $91 - call PlaySound - ret - -.asm_f84d2 - xor a - ld [wc5e3], a - ld [wc5e3 + 1], a - ld a, $4 - ld [wc5d2], a - call Func_f8742 - ret - -Func_f84e2: - call Func_f8598 - call Func_f928c - ret nc - call Func_f8606 - jr c, .asm_f84fd - call Func_f8bed - ld hl, $c - add hl, bc - ld [hl], $0 - ld a, $2 - ld [wc5d2], a - ret - -.asm_f84fd - ld a, $3 - ld [wc5d2], a - ld a, $60 - ld [wc5e1], a - ld a, $10 - call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters - xor a - ld [wChannelSoundIDs + CH7], a - ld a, $93 - call PlaySound - ret - -Func_f8516: - ld hl, $c - add hl, bc - ld a, [hl] - cp $20 - jr nc, .asm_f8539 - inc [hl] - inc [hl] - inc [hl] - inc [hl] - ld d, $4 - call Func_f9362 - ld hl, $7 - add hl, bc - ld [hl], a - call Func_f87b5 - ld a, [wc5ea] - ld hl, $5 - add hl, bc - ld [hl], a - ret - -.asm_f8539 - ld hl, $7 - add hl, bc - ld [hl], $0 - ld a, $0 - ld [wc5d2], a - ret - -Func_f8545: - ld hl, wc5e1 - ld a, [hl] - and a - jr z, .asm_f8556 - dec [hl] - ld a, [wc5ea] - ld hl, $5 - add hl, bc - ld [hl], a - ret - -.asm_f8556 - ld a, $0 - ld [wc5d2], a - ld a, $4 - call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters - ret - -Func_f8561: - ld a, [wc5ea] - ld hl, $5 - add hl, bc - ld [hl], a - call Func_f8742 - ret - -Func_f856d: - ld a, $f - call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters - ld hl, $c - add hl, bc - ld [hl], $0 - ret - -Func_f8579: - ld hl, $c - add hl, bc - ld a, [hl] - inc [hl] - inc [hl] - and $3f - cp $20 - jr c, .asm_f8591 - ld d, $10 - call Func_f9362 - ld hl, $7 - add hl, bc - ld [hl], a - ret - -.asm_f8591 - ld hl, $7 - add hl, bc - ld [hl], $0 - ret - -Func_f8598: - ld de, hJoy5 - ld a, [de] - and $20 - jr nz, .asm_f85a6 - ld a, [de] - and $10 - jr nz, .asm_f85cc - ret - -.asm_f85a6 - ld hl, $e - add hl, bc - ld [hl], $0 - ld hl, $d - add hl, bc - ld a, [hl] - inc [hl] - cp $b - jr c, .asm_f85be - call Func_f85f2 - ld hl, wc62f - set 0, [hl] -.asm_f85be - ld hl, $1 - add hl, bc - ld a, [hl] - cp $e - jr nc, .asm_f85c9 - inc [hl] - ret - -.asm_f85c9 - ld [hl], $1 - ret - -.asm_f85cc - ld hl, $d - add hl, bc - ld [hl], $0 - ld hl, $e - add hl, bc - ld a, [hl] - inc [hl] - cp $d - jr c, .asm_f85e4 - call Func_f85f2 - ld hl, wc62f - set 1, [hl] -.asm_f85e4 - ld hl, $1 - add hl, bc - ld a, [hl] - cp $1 - jr z, .asm_f85ef - dec [hl] - ret - -.asm_f85ef - ld [hl], $e - ret - -Func_f85f2: - call Func_f8bdf - xor a - ld hl, $d - add hl, bc - ld [hl], a - ld hl, $e - add hl, bc - ld [hl], a - ld a, $92 - call PlaySound - ret - -Func_f8606: - ld hl, $1 - add hl, bc - ld a, [wc5ef] - cp $6 - jr z, .asm_f863d - cp $14 - jr z, .asm_f867b - cp $12 - jr z, .asm_f867b - cp $7 - jr z, .asm_f865c - ld a, [hl] - cp $1 - jp z, .asm_f86ad - cp $2 - jr z, .asm_f869a - cp $3 - jr z, .asm_f869f - cp $4 - jr z, .asm_f86a2 - cp $5 - jr z, .asm_f869f - cp $6 - jr z, .asm_f869a - cp $7 - jr z, .asm_f86ad - jr .asm_f86ad - -.asm_f863d - ld a, [hl] - cp $1 - jr z, .asm_f86ad - cp $2 - jr z, .asm_f86ad - cp $3 - jr z, .asm_f86ad - cp $4 - jr z, .asm_f869a - cp $5 - jr z, .asm_f869f - cp $6 - jr z, .asm_f86a2 - cp $7 - jr z, .asm_f869f - jr .asm_f86ad - -.asm_f865c - ld a, [hl] - cp $1 - jr z, .asm_f869f - cp $2 - jr z, .asm_f86a2 - cp $3 - jr z, .asm_f869f - cp $4 - jr z, .asm_f869a - cp $5 - jr z, .asm_f86ad - cp $6 - jr z, .asm_f86ad - cp $7 - jr z, .asm_f86ad - jr .asm_f86ad - -.asm_f867b - ld a, [hl] - cp $1 - jr z, .asm_f86ad - cp $2 - jr z, .asm_f869a - cp $3 - jr z, .asm_f869f - cp $4 - jr z, .asm_f86a2 - cp $5 - jr z, .asm_f86a2 - cp $6 - jr z, .asm_f869f - cp $7 - jr z, .asm_f869a - jr .asm_f86ad - -.asm_f869a - call Func_f86f7 - jr .asm_f86a2 - -.asm_f869f - call Func_f86d0 -.asm_f86a2 - xor a - ld [wChannelSoundIDs + CH7], a - ld a, $95 - call PlaySound - and a - ret - -.asm_f86ad - ld a, $40 - ld [wc5e3], a - xor a - ld [wc5e3 + 1], a - scf - ret - -Func_f86b8: - ld a, [wc5e3 + 1] - cp $2 - ret nc - ld h, a - ld a, [wc5e3] - ld l, a - ld de, $2 - add hl, de - ld a, h - ld [wc5e3 + 1], a - ld a, l - ld [wc5e3], a - ret - -Func_f86d0: - ld a, [wc5e3 + 1] - and a - jr nz, .asm_f86e2 - ld a, [wc5e3] - cp $40 - jr nc, .asm_f86e2 - xor a - ld [wc5e3], a - ret - -.asm_f86e2 - ld a, [wc5e3 + 1] - ld h, a - ld a, [wc5e3] - ld l, a - ld de, $ffc0 - add hl, de - ld a, h - ld [wc5e3 + 1], a - ld a, l - ld [wc5e3], a - ret - -Func_f86f7: - ld a, [wc5e3 + 1] - and a - jr nz, .asm_f8709 - ld a, [wc5e3] - cp $80 - jr nc, .asm_f8709 - xor a - ld [wc5e3], a - ret - -.asm_f8709 - ld a, [wc5e3 + 1] - ld h, a - ld a, [wc5e3] - ld l, a - ld de, $ff80 - add hl, de - ld a, h - ld [wc5e3 + 1], a - ld a, l - ld [wc5e3], a - ret - -Func_f871e: - ld a, [hSCX] - and $7 - cp $3 - jr c, .asm_f8740 - cp $5 - jr nc, .asm_f8740 - ld a, [wc5ef] - cp $14 - jr nz, .asm_f8740 - call Func_f87a8 - cp $a - jr c, .asm_f8740 - ld [wc5ec], a - call Func_f9284 - scf - ret - -.asm_f8740 - and a - ret - -Func_f8742: - ld a, [hSCX] - and $7 - cp $3 - ret c - cp $5 - ret nc - ld a, [wc5ef] - cp $6 - jr z, .asm_f8766 - cp $14 - jr z, .asm_f8766 - cp $7 - jr z, .asm_f876a - call Func_f8778 - ld a, $4 - ld hl, $1 - add hl, bc - ld [hl], a - ret - -.asm_f8766 - ld a, $6 - jr .asm_f876c - -.asm_f876a - ld a, $2 -.asm_f876c - ld e, a - ld a, [wc5de] - dec a - add e - ld hl, $1 - add hl, bc - ld [hl], a - ret - -Func_f8778: - ld hl, wc5e0 - ld a, [hl] - inc [hl] - and $7 - ret nz - ld a, [wc5df] - and a - jr z, .asm_f8796 - ld a, [wc5de] - and a - jr z, .asm_f8791 - dec a - ld [wc5de], a - ret - -.asm_f8791 - xor a - ld [wc5df], a - ret - -.asm_f8796 - ld a, [wc5de] - cp $2 - jr z, .asm_f87a2 - inc a - ld [wc5de], a - ret - -.asm_f87a2 - ld a, $1 - ld [wc5df], a - ret - -Func_f87a8: - ld a, [wc5e3] - ld l, a - ld a, [wc5e3 + 1] - ld h, a - add hl, hl - add hl, hl - add hl, hl - ld a, h - ret - -Func_f87b5: - ld hl, wc5eb - ld a, [hl] - inc [hl] - and $3 - ret nz - call Func_f87ce - ld d, a - ld hl, $4 - add hl, bc - ld e, [hl] - ld a, $a - push bc - call SpawnAnimatedObject - pop bc - ret - -Func_f87ce: - ld a, [hSCX] - and $8 - jr nz, .asm_f87d9 - ld hl, wc622 - jr .asm_f87dc - -.asm_f87d9 - ld hl, wc623 -.asm_f87dc - ld a, [wc5f0] - cp $6 - jr z, .asm_f87ed - cp $14 - jr z, .asm_f87ed - cp $7 - jr z, .asm_f87f5 - ld a, [hl] - ret - -.asm_f87ed - ld a, [hSCX] - and $7 - ld e, a - ld a, [hl] - sub e - ret - -.asm_f87f5 - ld a, [hSCX] - and $7 - add [hl] - ret - -Func_f87fb: - ld hl, $4 - add hl, bc - ld a, [hl] - cp $58 - ret z - add $4 - ld [hl], a - ret - -Func_f8807: - call MaskCurrentAnimatedObjectStruct - ret - -Func_f880b: - ld hl, $b - add hl, bc - ld a, [hl] - and a - ret z - dec [hl] - dec [hl] - ld d, a - ld hl, $c - add hl, bc - ld a, [hl] - inc [hl] - call Func_f9362 - cp $80 - jr nc, .asm_f8825 - xor $ff - inc a -.asm_f8825 - ld hl, $7 - add hl, bc - ld [hl], a - ret - -Func_f882b: - ld hl, $b - add hl, bc - ld a, [hl] - inc [hl] - and $1 - ret z - ld hl, $4 - add hl, bc - ld a, [hl] - cp $c0 - jr z, .asm_f883f - inc [hl] - ret - -.asm_f883f - ld a, $1 - ld [wc633], a - call MaskCurrentAnimatedObjectStruct - ret - -Func_f8848: - ld a, [wc635] - ld e, a - ld d, $0 - ld a, [wc5e3] - ld l, a - ld a, [wc5e3 + 1] - ld h, a - add hl, de - ld a, l - ld [wc635], a - ld d, h - ld hl, wOAMBuffer + 5 * 4 + 1 - ld e, $9 -.asm_f8861 - ld a, [hl] - add d - ld [hli], a - inc hl - inc hl - inc hl - dec e - jr nz, .asm_f8861 - ret - -Func_f886b: - ld a, [wc5ef] - ld a, [hSCX] - add $48 - ld e, a - srl e - srl e - srl e - ld d, $0 - ld hl, vBGMap0 - add hl, de - ld a, [wc5ea] - srl a - srl a - srl a - ld c, a -.asm_f8889 - ld a, c - and a - jr z, .asm_f889a - dec c - ld de, $20 - add hl, de - ld a, h - and $3 - or $98 - ld h, a - jr .asm_f8889 - -.asm_f889a - ld de, wc5ef - ld a, e - ld [H_VBCOPYDEST], a - ld a, d - ld [H_VBCOPYDEST + 1], a - ld a, l - ld [H_VBCOPYSRC], a - ld a, h - ld [H_VBCOPYSRC + 1], a - ld a, $1 - ld [H_VBCOPYSIZE], a - ret - -Func_f88ae: - ld a, [hSCX] - and $8 - jr nz, .asm_f88b9 - ld hl, wc621 - jr .asm_f88bc - -.asm_f88b9 - ld hl, wc622 -.asm_f88bc - ld a, [wc5ef] - cp $6 - jr z, .asm_f88d0 - cp $14 - jr z, .asm_f88d0 - cp $7 - jr z, .asm_f88db - ld a, [hl] - ld [wc5ea], a - ret - -.asm_f88d0 - ld a, [hSCX] - and $7 - ld e, a - ld a, [hl] - sub e - ld [wc5ea], a - ret - -.asm_f88db - ld a, [hSCX] - and $7 - add [hl] - ld [wc5ea], a - ret - -Func_f88e4: - ld hl, wc5d6 - ld e, $99 - call Func_f88f0 - ret nc - inc hl - ld e, $99 -Func_f88f0: - ld a, [hl] - and a - jr z, .asm_f88fa - sub $1 - daa - ld [hl], a - and a - ret - -.asm_f88fa - ld [hl], e - scf - ret - -Func_f88fd: - ld de, wc5d7 - ld hl, wOAMBuffer + 0 * 4 + 2 - ld a, [de] - call Func_f890b - ld hl, wOAMBuffer + 2 * 4 + 2 - ld a, [de] -Func_f890b: - ld c, a - swap a - and $f - add $d0 - ld [hli], a - inc hl - inc hl - inc hl - ld a, c - and $f - add $d0 - ld [hl], a - dec de - ret - -Func_f891e: - ld hl, wTileMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call FillMemory - ld hl, Tilemap_f8946 - coord de, 0, 6 - ld bc, Tilemap_f8946End - Tilemap_f8946 - call CopyData - call Func_f8a0e - ld hl, wOAMBuffer + 5 * 4 + 1 - ld bc, $24 - xor a - call FillMemory - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a - ret - -Tilemap_f8946: -INCBIN "gfx/unknown_f8946.map" -Tilemap_f8946End: - -Func_f8a0e: - coord hl, 1, 1 - lb de, $3b, $3c - ld a, $40 - call Func_f8a72 - coord hl, 1, 2 - lb de, $3f, $3f - ld a, $ff - call Func_f8a72 - coord hl, 1, 3 - lb de, $3f, $3f - ld a, $ff - call Func_f8a72 - coord hl, 1, 4 - lb de, $3f, $3f - ld a, $ff - call Func_f8a72 - coord hl, 1, 5 - lb de, $3f, $3f - ld a, $ff - call Func_f8a72 - coord hl, 1, 6 - lb de, $3f, $3f - ld a, $ff - call Func_f8a72 - coord hl, 1, 7 - lb de, $3f, $3f - ld a, $ff - call Func_f8a72 - coord hl, 1, 8 - lb de, $3f, $3f - ld a, $ff - call Func_f8a72 - coord hl, 1, 9 - lb de, $3d, $3e - ld a, $40 - call Func_f8a72 - ret - -Func_f8a72: - ld [hl], d - inc hl - ld c, $10 -.asm_f8a76 - ld [hli], a - dec c - jr nz, .asm_f8a76 - ld [hl], e - ret - -Func_f8a7c: - ld hl, Tilemap_f8a89 - coord de, 6, 8 - ld bc, $9 - call CopyData - ret - -Tilemap_f8a89: - db $20,$2e,$2f,$30,$31,$2c,$32,$23,$33 - -Func_f8a92: - ld hl, Tilemap_f8aa2 - coord de, 2, 2 - ld bc, $7 - call CopyData - call Func_f8aca - ret - -Tilemap_f8aa2: - db $20,$21,$ff,$22,$23,$24,$25 - -Func_f8aa9: - ld c, $63 -.asm_f8aab - push bc - ld hl, wc5d6 - ld a, [hli] - or [hl] - and a - jr z, .asm_f8ac7 - call Func_f88e4 - ld e, $1 -.asm_f8ab9 - call Func_f8b42 - pop bc - dec c - jr nz, .asm_f8aab -.asm_f8abf - ld a, $90 - call PlaySound -.asm_f8ac5 - and a - ret - -.asm_f8ac7 - pop bc - scf - ret - -Func_f8aca: - coord hl, 10, 2 - ld de, wc5d7 - ld a, [de] - call Func_f9350 - inc hl - ld a, [de] - call Func_f9350 - inc hl - inc hl - ld [hl], $21 - inc hl - ld [hl], $25 - inc hl - ld [hl], $26 - ret - -Func_f8ae4: - ld hl, Tilemap_f8af4 - coord de, 2, 4 - ld bc, $7 - call CopyData - call Func_f8b25 - ret - -Tilemap_f8af4: - db $27,$28,$29,$2a,$23,$26,$26 - -Func_f8afb: - ld c, $63 -.asm_f8afd - push bc - ld hl, wc5da - ld a, [hli] - ld e, a - or [hl] - jr z, .asm_f8b22 - ld d, [hl] - ld a, e - sub $1 - daa - ld e, a - ld a, d - sbc $0 - daa - ld [hld], a - ld [hl], e - ld e, $1 - call Func_f8b42 - pop bc - dec c - jr nz, .asm_f8afd - ld a, $90 - call PlaySound -.asm_f8b20 - and a - ret - -.asm_f8b22 - pop bc - scf - ret - -Func_f8b25: - ld a, [wc5db] - coord hl, 10, 4 - call Func_f9350 - ld a, [wc5da] - coord hl, 12, 4 - call Func_f9350 - inc hl - inc hl - ld [hl], $21 - inc hl - ld [hl], $25 - inc hl - ld [hl], $26 - ret - -Func_f8b42: - ld a, [wc5dc] - add e - daa - ld [wc5dc], a - ld a, [wc5dd] - adc $0 - daa - ld [wc5dd], a - ret nc - ld a, $99 - ld [wc5dc], a - ld [wc5dd], a - ret - -Func_f8b5d: - ld a, [wc5dd] - coord hl, 10, 6 - call Func_f9350 - ld a, [wc5dc] - coord hl, 12, 6 - call Func_f9350 - inc hl - inc hl - ld [hl], $21 - inc hl - ld [hl], $25 - inc hl - ld [hl], $26 - ret - -Func_f8b7a: - ld hl, Tilemap_f8b8d - coord de, 2, 6 - ld bc, $5 - call CopyData - call Func_f8b25 - call Func_f8b5d - ret - -Tilemap_f8b8d: - db $2b,$2c,$25,$28,$2d - -Func_f8b92: - ld hl, wd496 - ld a, [wc5dd] - cp [hl] - jr c, .asm_f8ba6 - jr nz, .asm_f8bb0 - dec hl - ld a, [wc5dc] - cp [hl] - jr c, .asm_f8ba6 - jr nz, .asm_f8bb0 -.asm_f8ba6 - call WaitForSoundToFinish - ld e, $1b - call Func_f8bcb - and a - ret - -.asm_f8bb0 - ld a, [wc5dc] - ld [wd495], a - ld a, [wc5dd] - ld [wd496], a - call WaitForSoundToFinish - ld e, $21 - call Func_f8bcb - ld a, $96 - call PlaySound - scf - ret - -Func_f8bcb: ; f8bcb (3e:4bcb) - push de - callab IsSurfingPikachuInThePlayersParty - pop de - ret nc - callab PlayPikachuSoundClip - ret - -Func_f8bdf: - ld a, [wc5d9] - inc a - cp $4 - jr c, .asm_f8be9 - ld a, $3 -.asm_f8be9 - ld [wc5d9], a - ret - -Func_f8bed: - ld a, [wc5d9] - and a - ret z - ld a, [wc62f] - and $3 - cp $3 - jr z, .asm_f8c2b - ld a, [wc5d9] - ld d, a - ld e, $1 - ld a, $0 -.asm_f8c03 - add e - sla e - dec d - jr nz, .asm_f8c03 -.asm_f8c09 - push af - ld e, $50 - call Func_f8c7c - pop af - dec a - jr nz, .asm_f8c09 - ld hl, $5 - add hl, bc - ld a, [hl] - sub $10 - ld d, a - ld hl, $4 - add hl, bc - ld e, [hl] - ld a, [wc5d9] - add $3 - push bc - call SpawnAnimatedObject - pop bc - ret - -.asm_f8c2b - ld a, [wc5d9] - cp $3 - jr c, .asm_f8c53 - ld a, $a -.asm_f8c34 - push af - ld e, $50 - call Func_f8c7c - pop af - dec a - jr nz, .asm_f8c34 - ld hl, $5 - add hl, bc - ld a, [hl] - sub $10 - ld d, a - ld hl, $4 - add hl, bc - ld e, [hl] - ld a, $9 - push bc - call SpawnAnimatedObject - pop bc - ret - -.asm_f8c53 - ld e, $50 - call Func_f8c7c - ld e, $50 - call Func_f8c7c - ld e, $50 - call Func_f8c7c - ld e, $30 - call Func_f8c7c - ld hl, $5 - add hl, bc - ld a, [hl] - sub $10 - ld d, a - ld hl, $4 - add hl, bc - ld e, [hl] - ld a, $8 - push bc - call SpawnAnimatedObject - pop bc - ret - -Func_f8c7c: - ld a, [wc5da] - add e - daa - ld [wc5da], a - ld a, [wc5db] - adc $0 - daa - ld [wc5db], a - ret nc - ld a, $99 - ld [wc5da], a - ld [wc5db], a - ret - -Func_f8c97: - ld a, $a0 - ld [wc62e], a - ld a, [hSCX] - ld h, a - ld a, [wc617] - ld l, a - ld de, $900 - add hl, de - ld a, l - ld [wc617], a - ld a, h - ld [hSCX], a - jr Func_f8cc7 - -Func_f8cb0: - ld a, $a0 - ld [wc62e], a - ld a, [hSCX] - ld h, a - ld a, [wc617] - ld l, a - ld de, $180 - add hl, de - ld a, l - ld [wc617], a - ld a, h - ld [hSCX], a -Func_f8cc7: - ld hl, wc618 - ld a, [hSCX] - cp [hl] - ret z - ld [hl], a - and $f0 - ld hl, wc619 - cp [hl] - ret z - ld [hl], a - call Func_f8d44 - ld a, b - ld [wc5e8], a - ld a, c - ld [wc5e9], a - push de - ld hl, wc61a - ld de, wc61c - ld c, $12 -.asm_f8ceb - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .asm_f8ceb - ld a, [wc5e8] - ld [hli], a - ld a, [wc5e9] - ld [hl], a - pop de - ld hl, wRedrawRowOrColumnSrcTiles - ld c, $8 -.asm_f8cff - ld a, [de] - call Func_f8d28 - inc de - dec c - jr nz, .asm_f8cff - ld a, [wc62e] - ld e, a - ld a, [hSCX] - add e - and $f0 - srl a - srl a - srl a - ld e, a - ld d, $0 - ld hl, vBGMap0 - add hl, de - ld a, l - ld [hRedrawRowOrColumnDest], a - ld a, h - ld [hRedrawRowOrColumnDest + 1], a - ld a, $1 - ld [hRedrawRowOrColumnMode], a - ret - -Func_f8d28: - push de - push hl - ld l, a - ld h, $0 - ld de, Unkn_f96e5 - add hl, hl - add hl, hl - add hl, de - ld e, l - ld d, h - pop hl - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - pop de - ret - -Func_f8d44: - ld a, [wc5d3] - ld e, a - ld d, $0 - ld hl, Jumptable_f8d53 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp [hl] - -Jumptable_f8d53: - dw Func_f8e4b - dw Func_f8f28 - dw Func_f8f31 - dw Func_f8f3a - dw Func_f8f43 - dw Func_f8e7d - dw Func_f8f4c - dw Func_f8f55 - dw Func_f8f5e - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8f94 - dw Func_f8ec5 - dw Func_f8ece - dw Func_f8ed7 - dw Func_f8ee0 - dw Func_f8ee9 - dw Func_f8ef2 - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8f94 - dw Func_f8efb - dw Func_f8f04 - dw Func_f8f0d - dw Func_f8f16 - dw Func_f8f1f - dw Func_f8efb - dw Func_f8f04 - dw Func_f8f0d - dw Func_f8f16 - dw Func_f8f1f - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8f94 - dw Func_f8f28 - dw Func_f8f31 - dw Func_f8f3a - dw Func_f8f43 - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8f94 - dw Func_f8f4c - dw Func_f8f55 - dw Func_f8f5e - dw Func_f8f4c - dw Func_f8f55 - dw Func_f8f5e - dw Func_f8f4c - dw Func_f8f55 - dw Func_f8f5e - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8f94 - dw Func_f8f67 - dw Func_f8f70 - dw Func_f8efb - dw Func_f8f04 - dw Func_f8f0d - dw Func_f8f16 - dw Func_f8f1f - dw Func_f8f67 - dw Func_f8f70 - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8f94 - dw Func_f8ec5 - dw Func_f8ece - dw Func_f8ed7 - dw Func_f8ee0 - dw Func_f8ee9 - dw Func_f8ef2 - dw Func_f8e7d - dw Func_f8f67 - dw Func_f8f70 - dw Func_f8f67 - dw Func_f8f70 - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8f94 - dw Func_f8efb - dw Func_f8f04 - dw Func_f8f0d - dw Func_f8f16 - dw Func_f8f1f - dw Func_f8f28 - dw Func_f8f31 - dw Func_f8f3a - dw Func_f8f43 - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8e7d - dw Func_f8f94 - dw Func_f8e86 - dw Func_f8e8f - dw Func_f8e98 - dw Func_f8ea1 - dw Func_f8eaa - dw Func_f8eb3 - dw Func_f8ebc - dw Func_f8f9d - dw Func_f8e7d - dw Func_f8f79 - dw Func_f8f82 - dw Func_f8f82 - dw Func_f8f82 - dw Func_f8f82 - dw Func_f8f82 - dw Func_f8f82 - dw Func_f8f82 - dw Func_f8f8b - -Func_f8e4b: - ld a, [wc5e5] - cp $16 - jr c, .asm_f8e5a - jr z, .asm_f8e56 - jr nc, .asm_f8e6e -.asm_f8e56 - ld a, $6a - jr .asm_f8e6b - -.asm_f8e5a - ld a, [wc5d5] - and a - jr z, .asm_f8e6e - dec a - and $7 - ld e, a - ld d, $0 - ld hl, Unkn_f8e75 - add hl, de - ld a, [hl] -.asm_f8e6b - ld [wc5d3], a -.asm_f8e6e - lb bc, $74, $74 - ld de, Unkn_f973d - ret - -Unkn_f8e75: - db $01,$0e,$1a,$29,$32,$40,$4d,$5c - -Func_f8e7d: - lb bc, $74, $74 - ld de, Unkn_f973d - jp Func_f8fa9 - -Func_f8e86: - lb bc, $74, $6c - ld de, Unkn_f9745 - jp Func_f8fa9 - -Func_f8e8f: - lb bc, $64, $5c - ld de, Unkn_f974d - jp Func_f8fa9 - -Func_f8e98: - lb bc, $54, $4c - ld de, Unkn_f9755 - jp Func_f8fa9 - -Func_f8ea1: - lb bc, $44, $44 - ld de, Unkn_f975d - jp Func_f8fa9 - -Func_f8eaa: - lb bc, $44, $4c - ld de, Unkn_f9765 - jp Func_f8fa9 - -Func_f8eb3: - lb bc, $54, $5c - ld de, Unkn_f976d - jp Func_f8fa9 - -Func_f8ebc: - lb bc, $64, $6c - ld de, Unkn_f9775 - jp Func_f8fa9 - -Func_f8ec5: - lb bc, $74, $6c - ld de, Unkn_f977d - jp Func_f8fa9 - -Func_f8ece: - lb bc, $64, $5c - ld de, Unkn_f9785 - jp Func_f8fa9 - -Func_f8ed7: - lb bc, $54, $4c - ld de, Unkn_f978d - jp Func_f8fa9 - -Func_f8ee0: - lb bc, $4c, $4c - ld de, Unkn_f9795 - jp Func_f8fa9 - -Func_f8ee9: - lb bc, $54, $5c - ld de, Unkn_f979d - jp Func_f8fa9 - -Func_f8ef2: - lb bc, $64, $6c - ld de, Unkn_f97a5 - jp Func_f8fa9 - -Func_f8efb: - lb bc, $74, $6c - ld de, Unkn_f97ad - jp Func_f8fa9 - -Func_f8f04: - lb bc, $64, $5c - ld de, Unkn_f97b5 - jp Func_f8fa9 - -Func_f8f0d: - lb bc, $54, $54 - ld de, Unkn_f97bd - jp Func_f8fa9 - -Func_f8f16: - lb bc, $54, $5c - ld de, Unkn_f97c5 - jp Func_f8fa9 - -Func_f8f1f: - lb bc, $64, $6c - ld de, Unkn_f97cd - jp Func_f8fa9 - -Func_f8f28: - lb bc, $74, $6c - ld de, Unkn_f97d5 - jp Func_f8fa9 - -Func_f8f31: - lb bc, $64, $5c - ld de, Unkn_f97dd - jp Func_f8fa9 - -Func_f8f3a: - lb bc, $5c, $5c - ld de, Unkn_f97e5 - jp Func_f8fa9 - -Func_f8f43: - lb bc, $64, $6c - ld de, Unkn_f97ed - jp Func_f8fa9 - -Func_f8f4c: - lb bc, $74, $6c - ld de, Unkn_f97f5 - jp Func_f8fa9 - -Func_f8f55: - lb bc, $64, $64 - ld de, Unkn_f97fd - jp Func_f8fa9 - -Func_f8f5e: - lb bc, $64, $6c - ld de, Unkn_f9805 - jp Func_f8fa9 - -Func_f8f67: - lb bc, $74, $6c - ld de, Unkn_f980d - jp Func_f8fa9 - -Func_f8f70: - lb bc, $6c, $6c - ld de, Unkn_f9815 - jp Func_f8fa9 - -Func_f8f79: - lb bc, $74, $74 - ld de, Unkn_f981d - jp Func_f8fa9 - -Func_f8f82: - lb bc, $74, $74 - ld de, Unkn_f9825 - jp Func_f8fa9 - -Func_f8f8b: - lb bc, $74, $74 - ld de, Unkn_f9825 - jp Func_f8fae - -Func_f8f94: - lb bc, $74, $74 - ld de, Unkn_f973d - jp Func_f8fae - -Func_f8f9d: - lb bc, $74, $74 - ld de, Unkn_f973d - ret - -Func_f8fa4: - inc a - ld [wc5d3], a - ret - -Func_f8fa9: - ld hl, wc5d3 - inc [hl] - ret - -Func_f8fae: - xor a - ld [wc5d3], a - ret - -Func_f8fb3: - call Func_f9279 - call ClearSprites - call DisableLCD - xor a - ld [H_AUTOBGTRANSFERENABLED], a - call ClearObjectAnimationBuffers - ld hl, $6324 - ld de, $8800 - ld bc, $900 - ld a, $20 - call FarCopyData - ld a, Unkn_f93d3 % $100 - ld [wAnimatedObjectSpawnStateDataPointer], a - ld a, Unkn_f93d3 / $100 - ld [wAnimatedObjectSpawnStateDataPointer + 1], a - ld a, Jumptable_f93fa % $100 - ld [wAnimatedObjectJumptablePointer], a - ld a, Jumptable_f93fa / $100 - ld [wAnimatedObjectJumptablePointer + 1], a - ld a, Unkn_f9507 % $100 - ld [wAnimatedObjectOAMDataPointer], a - ld a, Unkn_f9507 / $100 - ld [wAnimatedObjectOAMDataPointer + 1], a - ld a, Unkn_f9405 % $100 - ld [wAnimatedObjectFramesDataPointer], a - ld a, Unkn_f9405 / $100 - ld [wAnimatedObjectFramesDataPointer + 1], a - ld a, $c - lb de, $74, $58 - call SpawnAnimatedObject - call Func_f9053 - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $90 - ld [hWY], a - ld b, $f - call RunPaletteCommand - ld a, $e3 - ld [rLCDC], a - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a - call DelayFrame - call DelayFrame - call DelayFrame - call Func_f81e9 - ld a, $e4 - ld [rOBP0], a - ld a, $e0 - ld [rOBP1], a - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - call DelayFrame - ld a, $99 - ld c, $20 - call PlayMusic - xor a - ld [wc633], a -.asm_f9041 - ld a, [wc633] - and a - ret nz - ld a, $0 - ld [wCurrentAnimatedObjectOAMBufferOffset], a - call RunObjectAnimations - call DelayFrame - jr .asm_f9041 - -Func_f9053: - ld hl, wTileMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, $ff - call FillMemory - ld hl, Tilemap_f90bc - coord de, 0, 6 - ld bc, 12 * SCREEN_WIDTH - call CopyData - ld de, Tilemap_f91c8 - coord hl, 4, 0 - lb bc, 6, 12 - call .CopyBox - coord hl, 3, 7 - lb bc, 3, 15 - call .FillBoxWithFF - ld hl, Tilemap_f91ac - coord de, 3, 7 - ld bc, 15 - call CopyData - ld hl, Tilemap_f91bb - coord de, 4, 9 - ld bc, 13 - call CopyData - ret - -.CopyBox: -.copy_row - push bc - push hl -.copy_col - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .copy_col - ld bc, SCREEN_WIDTH - pop hl - add hl, bc - pop bc - dec b - jr nz, .copy_row - ret - -.FillBoxWithFF: -.fill_row - push bc - push hl -.fill_col - ld [hl], $ff - inc hl - dec c - jr nz, .fill_col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .fill_row - ret - -Tilemap_f90bc: INCBIN "gfx/unknown_f90bc.map" -Tilemap_f91ac: INCBIN "gfx/unknown_f91ac.map" -Tilemap_f91bb: INCBIN "gfx/unknown_f91bb.map" -Tilemap_f91c8: INCBIN "gfx/unknown_f91c8.map" - -Func_f9210: - ld hl, wc710 - ld de, wc710 + 1 - ld c, $80 - ld a, [hl] - push af -.asm_f921a - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .asm_f921a - pop af - ld [hl], a - ret - -Func_f9223: - ld hl, wc700 - ld bc, $100 - ld de, $0 -.asm_f922c - ld a, e - and $1f - ld e, a - push hl - ld hl, Unkn_f96c5 - add hl, de - ld a, [hl] - pop hl - ld [hli], a - inc e - dec bc - ld a, c - or b - jr nz, .asm_f922c - ret - -Func_f923f: - call Joypad - ld a, [H_FRAMECOUNTER] - and a - jr nz, .asm_f9250 - ld a, [hJoyHeld] - ld [hJoy5], a - ld a, $2 - ld [H_FRAMECOUNTER], a - ret - -.asm_f9250 - xor a - ld [hJoy5], a - ret - -SurfingPikachuMinigame_BlankPals: - xor a - ld [rBGP], a - ld [rOBP0], a - ld [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret - -SurfingPikachuMinigame_NormalPals: - ld a, $e4 - ld [rBGP], a - ld [rOBP0], a - ld a, $e0 - ld [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret - -Func_f9279: - ld hl, wTileMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call FillMemory - ret - -Func_f9284: - xor a - ld [wc5ed], a - ld [wc5ee], a - ret - -Func_f928c: - ld a, [wc5ed] - and a - jr nz, .asm_f92e4 - ld a, [wc5ec] - ld d, a - ld a, [wc5ee] - or d - jr z, .asm_f92dd - ld a, [wc5ee] - ld e, a - ld hl, $ff80 - add hl, de - ld a, l - ld [wc5ee], a - ld a, h - ld [wc5ec], a - ld e, a - ld d, $0 - call Func_f9340 - ld e, l - ld d, h - ld a, $4 - call Func_f9340 - ld a, l - xor $ff - inc a - ld l, a - ld a, h - xor $ff - ld h, a - push hl - ld hl, $5 - add hl, bc - ld d, [hl] - ld hl, $c - add hl, bc - ld e, [hl] - pop hl - add hl, de - ld e, l - ld d, h - ld hl, $5 - add hl, bc - ld [hl], d - ld hl, $c - add hl, bc - ld [hl], e - and a - ret - -.asm_f92dd - ld a, $1 - ld [wc5ed], a - and a - ret - -.asm_f92e4 - ld a, [wc5ea] - ld e, a - ld hl, $5 - add hl, bc - ld a, [hl] - cp $90 - jr nc, .asm_f92f4 - cp e - jr nc, .asm_f9330 -.asm_f92f4 - ld a, [wc5ec] - ld d, a - ld a, [wc5ee] - ld e, a - ld hl, $80 - add hl, de - ld a, l - ld [wc5ee], a - ld a, h - ld [wc5ec], a - ld e, a - ld d, $0 - call Func_f9340 - ld e, l - ld d, h - ld a, $4 - call Func_f9340 - push hl - ld hl, $5 - add hl, bc - ld d, [hl] - ld hl, $c - add hl, bc - ld e, [hl] - pop hl - add hl, de - ld e, l - ld d, h - ld hl, $5 - add hl, bc - ld [hl], d - ld hl, $c - add hl, bc - ld [hl], e - and a - ret - -.asm_f9330 - ld hl, $5 - add hl, bc - ld a, [wc5ea] - ld [hl], a - ld hl, $c - add hl, bc - ld [hl], $0 - scf - ret - -Func_f9340: - ld hl, $0 -.asm_f9343 - srl a - jr nc, .asm_f9348 - add hl, de -.asm_f9348 - sla e - rl d - and a - jr nz, .asm_f9343 - ret - -Func_f9350: - ld c, a - swap a - and $f - add $d0 - ld [hli], a - ld a, c - and $f - add $d0 - ld [hl], a - dec de - ret - -Func_f9360: ; cosine - add $10 -Func_f9362: ; sine - and $3f - cp $20 - jr nc, .asm_f936d - call Func_f9377 - ld a, h - ret - -.asm_f936d - and $1f - call Func_f9377 - ld a, h - xor $ff - inc a - ret - -Func_f9377: - ld e, a - ld a, d - ld d, $0 - ld hl, Unkn_f9393 - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld hl, $0 -.asm_f9386 - srl a - jr nc, .asm_f938b - add hl, de -.asm_f938b - sla e - rl d - and a - jr nz, .asm_f9386 - ret - -Unkn_f9393: - sine_wave $100 - -Unkn_f93d3: - db $00, $00, $00 - db $04, $01, $00 - db $11, $02, $00 - db $12, $02, $00 - db $15, $00, $00 - db $16, $00, $00 - db $17, $00, $00 - db $18, $00, $00 - db $19, $00, $00 - db $1a, $00, $00 - db $14, $00, $00 - db $13, $03, $00 - db $1b, $04, $00 - -Jumptable_f93fa: - dw Func_f9404 - dw Func_f8470 - dw Func_f87fb - dw Func_f880b - dw Func_f882b - -Func_f9404: - ret - -Unkn_f9405: - dw Unkn_f943d - dw Unkn_f9440 - dw Unkn_f9445 - dw Unkn_f944a - dw Unkn_f944f - dw Unkn_f9454 - dw Unkn_f9459 - dw Unkn_f945e - dw Unkn_f9463 - dw Unkn_f9468 - dw Unkn_f946d - dw Unkn_f9472 - dw Unkn_f9477 - dw Unkn_f947c - dw Unkn_f9481 - dw Unkn_f9486 - dw Unkn_f948b - dw Unkn_f9494 - dw Unkn_f9499 - dw Unkn_f949e - dw Unkn_f94fb - dw Unkn_f94a1 - dw Unkn_f94b0 - dw Unkn_f94bf - dw Unkn_f94ce - dw Unkn_f94dd - dw Unkn_f94ec - dw Unkn_f94fe - -Unkn_f943d: - frame $00, 32 - endanim - -Unkn_f9440: - frame $01, 8 - frame $02, 8 - dorestart - -Unkn_f9445: - frame $03, 8 - frame $04, 8 - dorestart - -Unkn_f944a: - frame $05, 8 - frame $06, 8 - dorestart - -Unkn_f944f: - frame $07, 8 - frame $08, 8 - dorestart - -Unkn_f9454: - frame $09, 8 - frame $0a, 8 - dorestart - -Unkn_f9459: - frame $0b, 8 - frame $0c, 8 - dorestart - -Unkn_f945e: - frame $0d, 8 - frame $0e, 8 - dorestart - -Unkn_f9463: - frame $01, 8, OAM_HFLIP, OAM_VFLIP - frame $02, 8, OAM_HFLIP, OAM_VFLIP - dorestart - -Unkn_f9468: - frame $03, 8, OAM_HFLIP, OAM_VFLIP - frame $04, 8, OAM_HFLIP, OAM_VFLIP - dorestart - -Unkn_f946d: - frame $05, 8, OAM_HFLIP, OAM_VFLIP - frame $06, 8, OAM_HFLIP, OAM_VFLIP - dorestart - -Unkn_f9472: - frame $07, 8, OAM_HFLIP, OAM_VFLIP - frame $08, 8, OAM_HFLIP, OAM_VFLIP - dorestart - -Unkn_f9477: - frame $09, 8, OAM_HFLIP, OAM_VFLIP - frame $0a, 8, OAM_HFLIP, OAM_VFLIP - dorestart - -Unkn_f947c: - frame $0b, 8, OAM_HFLIP, OAM_VFLIP - frame $0c, 8, OAM_HFLIP, OAM_VFLIP - dorestart - -Unkn_f9481: - frame $0d, 8, OAM_HFLIP, OAM_VFLIP - frame $0e, 8, OAM_HFLIP, OAM_VFLIP - dorestart - -Unkn_f9486: - frame $11, 7 - frame $12, 7 - dorestart - -Unkn_f948b: - frame $13, 2 - frame $14, 2 - dorepeat 8 - frame $15, 2 - endanim - -Unkn_f9494: - frame $16, 32 - frame $16, 32 - delanim - -Unkn_f9499: - frame $17, 32 - frame $17, 32 - delanim - -Unkn_f949e: - frame $18, 32 - endanim - -Unkn_f94a1: - frame $1a, 4 - dorepeat 1 - frame $1a, 3 - dorepeat 1 - frame $1a, 2 - dorepeat 1 - frame $1a, 1 - delanim - -Unkn_f94b0: - frame $1b, 4 - dorepeat 1 - frame $1b, 3 - dorepeat 1 - frame $1b, 2 - dorepeat 1 - frame $1b, 1 - delanim - -Unkn_f94bf: - frame $1c, 4 - dorepeat 1 - frame $1c, 3 - dorepeat 1 - frame $1c, 2 - dorepeat 1 - frame $1c, 1 - delanim - -Unkn_f94ce: - frame $1d, 4 - dorepeat 1 - frame $1d, 3 - dorepeat 1 - frame $1d, 2 - dorepeat 1 - frame $1d, 1 - delanim - -Unkn_f94dd: - frame $1e, 4 - dorepeat 1 - frame $1e, 3 - dorepeat 1 - frame $1e, 2 - dorepeat 1 - frame $1e, 1 - delanim - -Unkn_f94ec: - frame $1f, 4 - dorepeat 1 - frame $1f, 3 - dorepeat 1 - frame $1f, 2 - dorepeat 1 - frame $1f, 1 - delanim - -Unkn_f94fb: - frame $19, 1 - delanim - -Unkn_f94fe: - frame $20, 7 - frame $21, 7 - frame $22, 7 - frame $23, 7 - dorestart - -Unkn_f9507: - dbw $00, Unkn_f9573 - dbw $00, Unkn_f9578 - dbw $36, Unkn_f9578 - dbw $03, Unkn_f9578 - dbw $39, Unkn_f9578 - dbw $06, Unkn_f9578 - dbw $3c, Unkn_f9578 - dbw $09, Unkn_f9578 - dbw $60, Unkn_f9578 - dbw $0c, Unkn_f9578 - dbw $63, Unkn_f9578 - dbw $30, Unkn_f9578 - dbw $66, Unkn_f9578 - dbw $33, Unkn_f9578 - dbw $69, Unkn_f9578 - dbw $6c, Unkn_f9578 - dbw $9c, Unkn_f9578 - dbw $a0, Unkn_f9578 - dbw $a3, Unkn_f9578 - dbw $a7, Unkn_f95db - dbw $a8, Unkn_f95f4 - dbw $98, Unkn_f9625 - dbw $e0, Unkn_f959d - dbw $e6, Unkn_f959d - dbw $ca, Unkn_f959d - dbw $a7, Unkn_f95ce - dbw $00, Unkn_f9632 - dbw $00, Unkn_f963f - dbw $00, Unkn_f9650 - dbw $00, Unkn_f9661 - dbw $00, Unkn_f9672 - dbw $00, Unkn_f9683 - dbw $80, Unkn_f9694 - dbw $84, Unkn_f9694 - dbw $88, Unkn_f9694 - dbw $8c, Unkn_f9694 - -Unkn_f9573: - db 1 - db $fc, $fc, $00, $00 - -Unkn_f9578: - db 9 - db $f4, $f4, $00, $00 - db $f4, $fc, $01, $00 - db $f4, $04, $02, $00 - db $fc, $f4, $10, $00 - db $fc, $fc, $11, $00 - db $fc, $04, $12, $00 - db $04, $f4, $20, $00 - db $04, $fc, $21, $00 - db $04, $04, $22, $00 - -Unkn_f959d: - db 12 - db $f8, $e8, $00, $00 - db $f8, $f0, $01, $00 - db $f8, $f8, $02, $00 - db $f8, $00, $03, $00 - db $f8, $08, $04, $00 - db $f8, $10, $05, $00 - db $00, $e8, $10, $00 - db $00, $f0, $11, $00 - db $00, $f8, $12, $00 - db $00, $00, $13, $00 - db $00, $08, $14, $00 - db $00, $10, $15, $00 - -Unkn_f95ce: - db 3 - db $fc, $0b, $00, $10 - db $04, $03, $0f, $10 - db $04, $0b, $10, $10 - -Unkn_f95db: - db 6 - db $fc, $f0, $00, $30 - db $fc, $08, $00, $10 - db $04, $f0, $10, $30 - db $04, $f8, $0f, $30 - db $04, $00, $0f, $10 - db $04, $08, $10, $10 - -Unkn_f95f4: - db 12 - db $f4, $f0, $00, $10 - db $f4, $f8, $01, $10 - db $f4, $00, $01, $30 - db $f4, $08, $00, $30 - db $fc, $f0, $10, $10 - db $fc, $f8, $11, $10 - db $fc, $00, $11, $30 - db $fc, $08, $10, $30 - db $04, $f0, $20, $10 - db $04, $f8, $21, $10 - db $04, $00, $21, $30 - db $04, $08, $20, $30 - -Unkn_f9625: - db 3 - db $04, $f4, $00, $00 - db $04, $fc, $01, $00 - db $04, $04, $02, $00 - -Unkn_f9632: - db 3 - db $fc, $f4, $bf, $00 - db $fc, $fc, $d5, $00 - db $fc, $04, $d0, $00 - -Unkn_f963f: - db 4 - db $fc, $f0, $bf, $00 - db $fc, $f8, $d1, $00 - db $fc, $00, $d5, $00 - db $fc, $08, $d0, $00 - -Unkn_f9650: - db 4 - db $fc, $f0, $bf, $00 - db $fc, $f8, $d3, $00 - db $fc, $00, $d5, $00 - db $fc, $08, $d0, $00 - -Unkn_f9661: - db 4 - db $fc, $f0, $bf, $00 - db $fc, $f8, $d7, $00 - db $fc, $00, $d5, $00 - db $fc, $08, $d0, $00 - -Unkn_f9672: - db 4 - db $fc, $f0, $bf, $00 - db $fc, $f8, $d1, $00 - db $fc, $00, $d8, $00 - db $fc, $08, $d0, $00 - -Unkn_f9683: - db 4 - db $fc, $f0, $bf, $00 - db $fc, $f8, $d5, $00 - db $fc, $00, $d0, $00 - db $fc, $08, $d0, $00 - -Unkn_f9694: - db 12 - db $f4, $f0, $03, $20 - db $f4, $f8, $02, $20 - db $f4, $00, $01, $20 - db $f4, $08, $00, $20 - db $fc, $f0, $13, $20 - db $fc, $f8, $12, $20 - db $fc, $00, $11, $20 - db $fc, $08, $10, $20 - db $04, $f0, $23, $20 - db $04, $f8, $22, $20 - db $04, $00, $21, $20 - db $04, $08, $20, $20 - -Unkn_f96c5: - db 0, 0, 0, 1, 1, 1, 1, 2 - db 2, 2, 1, 1, 1, 1, 0, 0 - db 0, 0, 0, -1, -1, -1, -1, -2 - db -2, -2, -1, -1, -1, -1, 0, 0 - -Unkn_f96e5: - db $00, $00, $00, $00 - db $0b, $0b, $0b, $0b - db $0b, $02, $02, $06 - db $03, $0b, $07, $03 - db $06, $06, $06, $06 - db $07, $07, $07, $07 - db $06, $04, $04, $08 - db $05, $07, $08, $05 - db $0b, $0b, $11, $12 - db $0b, $0b, $13, $03 - db $14, $12, $04, $08 - db $13, $07, $08, $05 - db $06, $14, $06, $14 - db $13, $07, $13, $07 - db $08, $08, $08, $08 - db $14, $12, $14, $12 - db $0b, $11, $02, $14 - db $06, $14, $06, $14 - db $0c, $0c, $0d, $0d - db $0d, $0d, $0d, $0d - db $0e, $0f, $10, $0b - db $12, $13, $12, $13 - -Unkn_f973d: - db $00, $00, $00, $01, $01, $01, $01, $01 -Unkn_f9745: - db $00, $00, $00, $01, $01, $02, $04, $06 -Unkn_f974d: - db $00, $00, $00, $01, $02, $04, $06, $0e -Unkn_f9755: - db $00, $00, $00, $10, $11, $06, $0e, $0e -Unkn_f975d: - db $00, $00, $00, $15, $15, $0e, $0e, $0e -Unkn_f9765: - db $00, $00, $00, $03, $05, $07, $0e, $0e -Unkn_f976d: - db $00, $00, $00, $01, $03, $05, $07, $0e -Unkn_f9775: - db $00, $00, $00, $01, $01, $03, $05, $07 -Unkn_f977d: - db $00, $00, $00, $01, $01, $02, $04, $06 -Unkn_f9785: - db $00, $00, $00, $01, $02, $04, $06, $0e -Unkn_f978d: - db $00, $00, $00, $08, $0f, $0a, $0e, $0e -Unkn_f9795: - db $00, $00, $00, $09, $0d, $0b, $0e, $0e -Unkn_f979d: - db $00, $00, $00, $01, $03, $05, $07, $0e -Unkn_f97a5: - db $00, $00, $00, $01, $01, $03, $05, $07 -Unkn_f97ad: - db $00, $00, $00, $01, $01, $02, $04, $06 -Unkn_f97b5: - db $00, $00, $00, $01, $10, $11, $06, $0e -Unkn_f97bd: - db $00, $00, $00, $01, $15, $15, $0e, $0e -Unkn_f97c5: - db $00, $00, $00, $01, $03, $05, $07, $0e -Unkn_f97cd: - db $00, $00, $00, $01, $01, $03, $05, $07 -Unkn_f97d5: - db $00, $00, $00, $01, $01, $02, $04, $06 -Unkn_f97dd: - db $00, $00, $00, $01, $08, $0f, $0a, $0e -Unkn_f97e5: - db $00, $00, $00, $01, $09, $0d, $0b, $0e -Unkn_f97ed: - db $00, $00, $00, $01, $01, $03, $05, $07 -Unkn_f97f5: - db $00, $00, $00, $01, $01, $10, $11, $06 -Unkn_f97fd: - db $00, $00, $00, $01, $01, $15, $15, $0e -Unkn_f9805: - db $00, $00, $00, $01, $01, $03, $05, $07 -Unkn_f980d: - db $00, $00, $00, $01, $01, $08, $0f, $0a -Unkn_f9815: - db $00, $00, $00, $01, $01, $09, $0d, $0b -Unkn_f981d: - db $00, $00, $00, $14, $14, $14, $14, $14 -Unkn_f9825: - db $00, $00, $00, $12, $13, $13, $13, $13 - -PlayIntroScene: - ld a, [rIE] - push af - xor a - ld [rIF], a - ld a, $f - ld [rIE], a - ld a, $8 - ld [rSTAT], a - call Func_f9f0d - call DelayFrame -.asm_f9841 - ld a, [wc634] - bit 7, a - jr nz, .asm_f986e - call JoypadLowSensitivity - ld a, [hJoyPressed] - and $b - jr nz, .asm_f986e - call Func_f98fc - ld a, $0 - ld [wCurrentAnimatedObjectOAMBufferOffset], a - call RunObjectAnimations - ld a, [wc634] - cp $7 - call z, Func_f98a2 - cp $b - call z, Func_f98cb - call DelayFrame - jr .asm_f9841 - -.asm_f986e - call Func_f9fc9 - xor a - ld [hLCDCPointer], a - call DelayFrame - xor a - ld [rIF], a - pop af - ld [rIE], a - ld a, $90 - ld [hWY], a - call ClearObjectAnimationBuffers - ld hl, wTileMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call Func_f9fb3 - call Func_f9fbe - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a - call DelayFrame - call DelayFrame - call DelayFrame - xor a - ld [H_AUTOBGTRANSFERENABLED], a - ret - -Func_f98a2: - ld a, [wOAMBuffer + 8 * 4 + 3] - or $1 - ld [wOAMBuffer + 8 * 4 + 3], a - ld a, [wOAMBuffer + 14 * 4 + 3] - or $1 - ld [wOAMBuffer + 14 * 4 + 3], a - ld a, [wOAMBuffer + 16 * 4 + 3] - or $1 - ld [wOAMBuffer + 16 * 4 + 3], a -Func_f98b8: - ld a, [wOAMBuffer + 18 * 4 + 3] - or $1 - ld [wOAMBuffer + 18 * 4 + 3], a - ld a, [wOAMBuffer + 19 * 4 + 3] - or $1 - ld [wOAMBuffer + 19 * 4 + 3], a - ret - -Func_f98cb: - ld a, [wOAMBuffer + 18 * 4 + 3] - or $1 - ld [wOAMBuffer + 18 * 4 + 3], a - ld a, [wOAMBuffer + 19 * 4 + 3] - or $1 - ld [wOAMBuffer + 19 * 4 + 3], a - ld a, [wOAMBuffer + 20 * 4 + 3] - or $1 - ld [wOAMBuffer + 20 * 4 + 3], a - ld a, [wOAMBuffer + 25 * 4 + 3] - or $1 - ld [wOAMBuffer + 25 * 4 + 3], a - ld a, [wOAMBuffer + 26 * 4 + 3] - or $1 - ld [wOAMBuffer + 26 * 4 + 3], a - ld a, [wOAMBuffer + 28 * 4 + 3] - or $1 - ld [wOAMBuffer + 28 * 4 + 3], a - ret - -Func_f98fc: - ld a, [wc634] - ld hl, Jumptable_f9906 - call Func_fa06e - jp [hl] - -Jumptable_f9906: - dw Func_f992f - dw Func_f995f - dw Func_f996a - dw Func_f9a08 - dw Func_f9a1e - dw Func_f9a60 - dw Func_f9a6b - dw Func_f9ab1 - dw Func_f9ad8 - dw Func_f9af9 - dw Func_f9b04 - dw Func_f9bf6 - dw Func_f9cac - dw Func_f9d12 - dw Func_f9d22 - dw Func_f9d8f - dw Func_f9dbf - dw Func_f9e12 - -Func_f992a: - ld hl, wc634 - inc [hl] - ret - -Func_f992f: - xor a - ld [hLCDCPointer], a - lb de, $58, $58 - ld a, $1 - call Func_f9e1d - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $90 - ld [hWY], a - ld a, $e4 - ld [rBGP], a - ld [rOBP0], a - ld a, $c4 - ld [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ld a, $82 - ld [wc635], a - call Func_f992a - ret - -Func_f995f: - call Func_f9e41 - ret nc - call Func_f9e29 - call Func_f992a - ret - -Func_f996a: - call Func_f9e80 - ld c, $8 - call UpdateMusicCTimes - xor a - ld [hLCDCPointer], a - ld hl, vBGMap0 - ld bc, $400 - xor a - call Func_f9fb3 - call Func_f9996 - lb de, $58, $b8 ; overloaded - ld a, $4 ; overloaded - call Func_f99d2 - ld a, $1 - call Func_f9e9a - call Func_f9e35 - call Func_f992a - ret - -Func_f9996: - ld hl, $98d4 - ld de, $20 - ld b, $6 - ld a, $90 -.asm_f99a0 - ld c, $6 - push af - push hl -.asm_f99a4 - ld [hli], a - inc a - dec c - jr nz, .asm_f99a4 - pop hl - add hl, de - pop af - add $10 - dec b - jr nz, .asm_f99a0 - ld a, [hGBC] - and a - jr z, .asm_f99d1 - ld hl, $98d4 - ld de, $20 - ld b, $6 - ld a, $1 - ld [rVBK], a -.asm_f99c2 - ld c, $6 - push hl -.asm_f99c5 - ld [hli], a - dec c - jr nz, .asm_f99c5 - pop hl - add hl, de - dec b - jr nz, .asm_f99c2 - xor a - ld [rVBK], a -.asm_f99d1 - ret - -Func_f99d2: - ld hl, Unkn_f99f0 - ld a, $8 -.asm_f99d7 - push af - ld e, [hl] - inc hl - ld d, [hl] - inc hl - ld a, [hli] - push hl - push af - ld a, $8 - call SpawnAnimatedObject - pop af - ld hl, $b - add hl, bc - ld [hl], a - pop hl - pop af - dec a - jr nz, .asm_f99d7 - ret - -Unkn_f99f0: - db $d0, $20, $02 - db $f0, $30, $04 - db $d0, $40, $06 - db $c0, $50, $08 - db $e0, $60, $08 - db $c0, $70, $06 - db $e0, $80, $04 - db $f0, $90, $02 - -Func_f9a08: - call Func_f9e41 - jr c, .asm_f9a17 - ld a, [hSCX] - cp $68 - ret z - add $4 - ld [hSCX], a - ret - -.asm_f9a17 - call MaskAllAnimatedObjectStructs - call Func_f992a - ret - -Func_f9a1e: - call Func_f9e80 - ld c, $5 - call UpdateMusicCTimes - ld a, [hGBC] - and a - jr z, .asm_f9a47 - ld hl, $98d4 - ld de, $20 - ld b, $6 - ld a, $1 - ld [rVBK], a - xor a -.asm_f9a38 - ld c, $6 - push hl -.asm_f9a3b - ld [hli], a - dec c - jr nz, .asm_f9a3b - pop hl - add hl, de - dec b - jr nz, .asm_f9a38 - xor a - ld [rVBK], a -.asm_f9a47 - xor a - ld [hLCDCPointer], a - call Func_f9e5f - lb de, $58, $58 - ld a, $2 - call Func_f9e1d - xor a - call Func_f9e9a - call Func_f9e35 - call Func_f992a - ret - -Func_f9a60: - call Func_f9e41 - ret nc - call Func_f9e29 - call Func_f992a - ret - -Func_f9a6b: - call Func_f9e80 - ld c, $5 - call UpdateMusicCTimes - ld a, $42 - ld [hLCDCPointer], a - call Func_f9ec4 - ld hl, vBGMap0 - ld bc, $60 - xor a - call Func_f9fb3 - ld hl, $9860 - ld c, $10 - ld a, $20 -.asm_f9a8b - ld [hli], a - inc a - ld [hli], a - dec a - dec c - jr nz, .asm_f9a8b - ld hl, $9880 - ld bc, $300 - ld a, $10 - call Func_f9fb3 - lb de, $40, $f8 - ld a, $5 - call Func_f9e1d - ld a, $1 - call Func_f9e9a - call Func_f9e3b - call Func_f992a - ret - -Func_f9ab1: - call Func_f9e41 - jr c, .asm_f9ad1 - ld hl, hSCX - inc [hl] - inc [hl] - ld hl, wc800 - ld de, wc800 + 1 - ld a, [hl] - push af - ld c, $ff -.asm_f9ac5 - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .asm_f9ac5 - pop af - ld [hl], a - call Func_f9ef8 - ret - -.asm_f9ad1 - call Func_f9e29 - call Func_f992a - ret - -Func_f9ad8: - call Func_f9e80 - ld c, $5 - call UpdateMusicCTimes - xor a - ld [hLCDCPointer], a - call Func_f9e5f - lb de, $58, $58 - ld a, $3 - call Func_f9e1d - xor a - call Func_f9e9a - call Func_f9e35 - call Func_f992a - ret - -Func_f9af9: - call Func_f9e41 - ret nc - call Func_f9e29 - call Func_f992a - ret - -Func_f9b04: - call Func_f9e80 - ld c, $5 - call UpdateMusicCTimes - xor a - ld [hLCDCPointer], a - ld hl, vBGMap0 - ld bc, $400 - xor a - call Func_f9fb3 - ld hl, vBGMap0 - ld bc, $100 - ld a, $2 - call Func_f9fb3 - ld hl, $9900 - ld de, Unkn_f9b6e - lb bc, 6, 20 - call .FillBGMapBox - ld hl, $988c - ld de, Unkn_f9be6 - lb bc, 3, 4 - call .FillBGMapBox - ld hl, $98e3 - ld de, Unkn_f9bf2 - lb bc, 2, 2 - call .FillBGMapBox - lb de, $98, $58 - ld a, $6 - call Func_f9e1d - ld a, $1 - call Func_f9e9a - call Func_f9e35 - call Func_f992a - ret - -.FillBGMapBox: -.fill_row - push bc - push hl -.fill_col - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .fill_col - pop hl - ld bc, $20 - add hl, bc - pop bc - dec b - jr nz, .fill_row - ret - -Unkn_f9b6e: INCBIN "gfx/unknown_f9b6e.map" -Unkn_f9be6: INCBIN "gfx/unknown_f9be6.map" -Unkn_f9bf2: INCBIN "gfx/unknown_f9bf2.map" - -Func_f9bf6: - call Func_f9e41 - jr c, .asm_f9c25 - ld a, [wc635] - and $7 - ret nz - ld a, [wc635] - and $8 - sla a - sla a - sla a - ld e, a - ld d, $0 - ld hl, GFX_f9c2c - add hl, de - ld a, l - ld [H_VBCOPYSRC], a - ld a, h - ld [H_VBCOPYSRC + 1], a - xor a - ld [H_VBCOPYDEST], a - ld a, $96 - ld [H_VBCOPYDEST + 1], a - ld a, $4 - ld [H_VBCOPYSIZE], a - ret - -.asm_f9c25 - call Func_f9e29 - call Func_f992a - ret - -GFX_f9c2c: INCBIN "gfx/unknown_f9c2c.2bpp" -GFX_f9c6c: INCBIN "gfx/unknown_f9c6c.2bpp" ; indirectly referenced - -Func_f9cac: - call Func_f9e80 - ld c, $5 - call UpdateMusicCTimes - xor a - ld [hLCDCPointer], a - ld hl, vBGMap0 - ld bc, $80 - ld a, $1 - call Func_f9fb3 - ld hl, $9880 - ld bc, $140 - xor a - call Func_f9fb3 - ld hl, $99c0 - ld bc, $80 - ld a, $1 - call Func_f9fb3 - ld hl, $98c5 - ld de, $20 - ld a, $4 - ld b, $8 -.asm_f9ce1 - ld c, $c - push hl -.asm_f9ce4 - ld [hli], a - inc a - dec c - jr nz, .asm_f9ce4 - pop hl - add hl, de - add $4 - dec b - jr nz, .asm_f9ce1 - ld hl, $98c4 - ld [hl], $3 - ld hl, $98e4 - ld [hl], $74 - ld hl, $99a5 - ld [hl], $0 - lb de, $60, $58 - ld a, $9 - call Func_f9e1d - xor a - call Func_f9e9a - call Func_f9e35 - call Func_f992a - ret - -Func_f9d12: - call Func_f9e41 - ret nc - lb de, $68, $58 - ld a, $a - call SpawnAnimatedObject - call Func_f992a - ret - -Func_f9d22: - ld de, Unkn_f9dd6 - call Func_f9e4d - jr c, .asm_f9d3c - ld [rBGP], a - ld [rOBP0], a - and $f0 - ld [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret - -.asm_f9d3c - call MaskAllAnimatedObjectStructs - call Func_f9fbe - ld hl, wTileMap - ld bc, $50 - ld a, $1 - call Func_f9fb3 - coord hl, 0, 4 - ld bc, CopyVideoDataAlternate - xor a - call Func_f9fb3 - coord hl, 0, 14 - ld bc, $50 - ld a, $1 - call Func_f9fb3 - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a - call DelayFrame - call DelayFrame - call DelayFrame - xor a - ld [H_AUTOBGTRANSFERENABLED], a - ld a, $e4 - ld [rOBP0], a - ld [rBGP], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - lb de, $58, $58 - ld a, $7 - call Func_f9e1d - call Func_f992a - ld a, $28 - ld [wc635], a - ret - -Func_f9d8f: - call Func_f9e41 - jr c, .asm_f9dad - ld a, [wc635] - and $3 - ret nz - ld a, [rOBP0] - xor $ff - ld [rOBP0], a - ld a, [rBGP] - xor $3 - ld [rBGP], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - ret - -.asm_f9dad - xor a - ld [hLCDCPointer], a - ld a, $e4 - ld [rBGP], a - ld [rOBP0], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call Func_f992a -Func_f9dbf: - ld de, Unkn_f9e0a - call Func_f9e4d - jr c, .asm_f9dd2 - ld [rOBP0], a - ld [rBGP], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - ret - -.asm_f9dd2 - call Func_f992a - ret - -Unkn_f9dd6: - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $ff - -Unkn_f9e0a: - db $e4, $90, $90, $40 - db $40, $00, $00, $ff - -Func_f9e12: - ld c, 64 - call DelayFrames - ld hl, wc634 - set 7, [hl] - ret - -Func_f9e1d: - call SpawnAnimatedObject - ld a, c - ld [wc636], a - ld a, b - ld [wc636 + 1], a - ret - -Func_f9e29: - ld a, [wc636] - ld c, a - ld a, [wc636 + 1] - ld b, a - call MaskCurrentAnimatedObjectStruct - ret - -Func_f9e35: - ld a, $80 - ld [wc635], a - ret - -Func_f9e3b: - ld a, $58 - ld [wc635], a - ret - -Func_f9e41: - ld hl, wc635 - ld a, [hl] - and a - jr z, .asm_f9e4b - dec [hl] - and a - ret - -.asm_f9e4b - scf - ret - -Func_f9e4d: - ld hl, wc635 - ld a, [hl] - inc [hl] - ld l, a - ld h, $0 - add hl, de - ld a, [hl] - cp $ff - jr z, .asm_f9e5d - and a - ret - -.asm_f9e5d - scf - ret - -Func_f9e5f: - ld hl, vBGMap0 - ld bc, $80 - ld a, $1 - call Func_f9fb3 - ld hl, $9880 - ld bc, $140 - xor a - call Func_f9fb3 - ld hl, $99c0 - ld bc, $80 - ld a, $1 - call Func_f9fb3 - ret - -Func_f9e80: - xor a - ld [rBGP], a - ld [rOBP0], a - ld [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - call DelayFrame - call DelayFrame - call DisableLCD - ret - -Func_f9e9a: - ld e, a - callab Func_720ad - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $90 - ld [hWY], a - ld a, $e3 - ld [rLCDC], a - ld a, $e4 - ld [rBGP], a - ld [rOBP0], a - ld a, $e0 - ld [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret - -Func_f9ec4: - ld de, wc800 - ld a, $8 -.asm_f9ec9 - push af - ld hl, Unkn_f9ed8 - ld bc, $20 - call Func_f9faa - pop af - dec a - jr nz, .asm_f9ec9 - ret - -Unkn_f9ed8: - db 0, 0, 1, 2, 2, 3, 3, 3 - db 4, 3, 3, 3, 2, 2, 1, 0 - db 0, 0, -1, -2, -2, -3, -3, -3 - db -4, -3, -3, -3, -2, -2, -1, 0 - -Func_f9ef8: - ld a, $10 - ld [H_VBCOPYSRC], a - ld a, $c8 - ld [H_VBCOPYSRC + 1], a - ld a, $10 - ld [H_VBCOPYDEST], a - ld a, $c7 - ld [H_VBCOPYDEST + 1], a - ld a, $7 - ld [H_VBCOPYSIZE], a - ret - -Func_f9f0d: - xor a - ld [H_AUTOBGTRANSFERENABLED], a - ld [hSCX], a - ld [hSCY], a - ld [H_AUTOBGTRANSFERDEST], a - ld a, $98 - ld [H_AUTOBGTRANSFERDEST + 1], a - call Func_f9f9e - ld hl, wTileMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, $1 - call Func_f9fb3 - coord hl, 0, 4 - ld bc, CopyVideoDataAlternate - xor a - call Func_f9fb3 - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a - call DelayFrame - call DelayFrame - call DelayFrame - xor a - ld [H_AUTOBGTRANSFERENABLED], a - ld de, $6b5a - ld hl, $8000 - ld bc, $3eff - call CopyVideoData - ld de, $635a - ld hl, $9000 - ld bc, $3e80 - call CopyVideoData - call ClearObjectAnimationBuffers - call Func_f9f75 - ld b, $8 - call RunPaletteCommand - xor a - ld hl, wc634 - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld a, MUSIC_INTRO_BATTLE - ld c, BANK(Music_IntroBattle) - call PlayMusic - ret - -Func_f9f75: - ld a, Unkn_f9fda % $100 - ld [wAnimatedObjectSpawnStateDataPointer], a - ld a, Unkn_f9fda / $100 - ld [wAnimatedObjectSpawnStateDataPointer + 1], a - ld a, Jumptable_f9ffb % $100 - ld [wAnimatedObjectJumptablePointer], a - ld a, Jumptable_f9ffb / $100 - ld [wAnimatedObjectJumptablePointer + 1], a - ld a, Unkn_fa13d % $100 - ld [wAnimatedObjectOAMDataPointer], a - ld a, Unkn_fa13d / $100 - ld [wAnimatedObjectOAMDataPointer + 1], a - ld a, Unkn_fa0ea % $100 - ld [wAnimatedObjectFramesDataPointer], a - ld a, Unkn_fa0ea / $100 - ld [wAnimatedObjectFramesDataPointer + 1], a - ret - -Func_f9f9e: - ld hl, wTileMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, $7f - call Func_f9fb3 - ret - -Func_f9faa: - ld a, [hli] - ld [de], a - inc de - dec bc - ld a, c - or b - jr nz, Func_f9faa - ret - -Func_f9fb3: - push de - ld e, a -.asm_f9fb5 - ld a, e - ld [hli], a - dec bc - ld a, c - or b - jr nz, .asm_f9fb5 - pop de - ret - -Func_f9fbe: - ld hl, wSpriteDataEnd - ld bc, $a0 - xor a - call Func_f9fb3 - ret - -Func_f9fc9: - xor a - ld [rBGP], a - ld [rOBP0], a - ld [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret - -Unkn_f9fda: - db $00, $00, $00 - db $01, $01, $00 - db $02, $01, $00 - db $03, $01, $00 - db $04, $02, $00 - db $05, $03, $00 - db $06, $04, $00 - db $07, $01, $00 - db $08, $05, $00 - db $09, $01, $00 - db $0a, $01, $00 - -Jumptable_f9ffb: - dw Func_fa007 - dw Func_fa007 - dw Func_fa008 - dw Func_fa014 - dw Func_fa02b - dw Func_fa062 - -Func_fa007: - ret - -Func_fa008: - ld hl, $4 - add hl, bc - ld a, [hl] - cp $58 - ret z - sub $4 - ld [hl], a - ret - -Func_fa014: - ld hl, $4 - add hl, bc - ld a, [hl] - cp $58 - jr z, .asm_fa020 - add $4 - ld [hl], a -.asm_fa020 - ld hl, $5 - add hl, bc - cp $58 - ret z - add $1 - ld [hl], a - ret - -Func_fa02b: - ld hl, $b - add hl, bc - ld e, [hl] - ld d, $0 - ld hl, Jumptable_fa03b - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp [hl] - -Jumptable_fa03b: - dw Func_fa03f - dw Func_fa051 - -Func_fa03f: - ld hl, $5 - add hl, bc - ld a, [hl] - cp $58 - jr z, .asm_fa04c - sub $2 - ld [hl], a - ret - -.asm_fa04c - ld hl, $b - add hl, bc - inc [hl] -Func_fa051: - ld hl, $c - add hl, bc - ld a, [hl] - inc [hl] - ld d, $8 - call Func_fa079 - ld hl, $7 - add hl, bc - ld [hl], a - ret - -Func_fa062: - ld hl, $b - add hl, bc - ld a, [hl] - ld hl, $4 - add hl, bc - add [hl] - ld [hl], a - ret - -Func_fa06e: - ld e, a - ld d, $0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ret - -Func_fa077: ; cosine - add $10 -Func_fa079: - and $3f - cp $20 - jr nc, .asm_fa084 - call Func_fa08e - ld a, h - ret - -.asm_fa084 - and $1f - call Func_fa08e - ld a, h - xor $ff - inc a - ret - -Func_fa08e: - ld e, a - ld a, d - ld d, $0 - ld hl, Unkn_fa0aa - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld hl, $0 -.asm_fa09d - srl a - jr nc, .asm_fa0a2 - add hl, de -.asm_fa0a2 - sla e - rl d - and a - jr nz, .asm_fa09d - ret - -Unkn_fa0aa: - sine_wave $100 - -Unkn_fa0ea: - dw Unkn_fa100 - dw Unkn_fa103 - dw Unkn_fa10a - dw Unkn_fa111 - dw Unkn_fa118 - dw Unkn_fa11b - dw Unkn_fa11e - dw Unkn_fa121 - dw Unkn_fa124 - dw Unkn_fa127 - dw Unkn_fa138 - -Unkn_fa100: - frame $00, 32 - endanim - -Unkn_fa103: - frame $01, 4 - frame $02, 4 - frame $03, 4 - dorestart - -Unkn_fa10a: - frame $04, 4 - frame $05, 4 - frame $06, 4 - dorestart - -Unkn_fa111: - frame $07, 4 - frame $08, 4 - frame $09, 4 - dorestart - -Unkn_fa118: - frame $0a, 32 - endanim - -Unkn_fa11b: - frame $0b, 32 - endanim - -Unkn_fa11e: - frame $0c, 32 - endanim - -Unkn_fa121: - frame $0d, 32 - endanim - -Unkn_fa124: - frame $0e, 32 - endanim - -Unkn_fa127: - frame $0f, 31 - frame $11, 2 - frame $0f, 2 - frame $11, 2 - frame $0f, 31 - frame $11, 2 - frame $0f, 23 - frame $10, 32 - endanim - -Unkn_fa138: - frame $12, 4 - frame $13, 4 - dorestart - -Unkn_fa13d: - dbw $00, Unkn_fa179 - dbw $96, Unkn_fa17e - dbw $98, Unkn_fa17e - dbw $9a, Unkn_fa17e - dbw $0c, Unkn_fa18f - dbw $0e, Unkn_fa18f - dbw $3c, Unkn_fa18f - dbw $60, Unkn_fa1b0 - dbw $70, Unkn_fa1b0 - dbw $80, Unkn_fa1b0 - dbw $90, Unkn_fa201 - dbw $00, Unkn_fa201 - dbw $06, Unkn_fa201 - dbw $c6, Unkn_fa292 - dbw $6d, Unkn_fa2f7 - dbw $f0, Unkn_fa308 - dbw $f4, Unkn_fa308 - dbw $f8, Unkn_fa308 - dbw $9c, Unkn_fa329 - dbw $ec, Unkn_fa329 - -Unkn_fa179: - db 1 - db $fc, $fc, $00, $00 -Unkn_fa17e: - db 4 - db $f8, $f8, $00, $00 - db $f8, $00, $01, $00 - db $00, $f8, $10, $00 - db $00, $00, $11, $00 - -Unkn_fa18f: - db 8 - db $f0, $f8, $00, $00 - db $f0, $00, $01, $00 - db $f8, $f8, $10, $00 - db $f8, $00, $11, $00 - db $00, $f8, $20, $00 - db $00, $00, $20, $20 - db $08, $f8, $21, $00 - db $08, $00, $21, $20 - -Unkn_fa1b0: - db 20 - db $e8, $f8, $00, $00 - db $e8, $00, $01, $00 - db $f0, $f8, $02, $00 - db $f0, $00, $03, $00 - db $f8, $f0, $04, $00 - db $f8, $f8, $05, $00 - db $f8, $00, $06, $00 - db $f8, $08, $04, $20 - db $00, $f0, $07, $00 - db $00, $f8, $08, $00 - db $00, $00, $08, $20 - db $00, $08, $07, $20 - db $08, $f0, $09, $00 - db $08, $f8, $0a, $00 - db $08, $00, $0a, $20 - db $08, $08, $09, $20 - db $10, $f0, $0b, $00 - db $10, $f8, $0c, $00 - db $10, $00, $0c, $20 - db $10, $08, $0b, $20 - -Unkn_fa201: - db 36 - db $e8, $e8, $00, $00 - db $e8, $f0, $01, $00 - db $e8, $f8, $02, $00 - db $e8, $00, $03, $00 - db $e8, $08, $04, $00 - db $e8, $10, $05, $00 - db $f0, $e8, $10, $00 - db $f0, $f0, $11, $00 - db $f0, $f8, $12, $00 - db $f0, $00, $13, $00 - db $f0, $08, $14, $00 - db $f0, $10, $15, $00 - db $f8, $e8, $20, $00 - db $f8, $f0, $21, $00 - db $f8, $f8, $22, $00 - db $f8, $00, $23, $00 - db $f8, $08, $24, $00 - db $f8, $10, $25, $00 - db $00, $e8, $30, $00 - db $00, $f0, $31, $00 - db $00, $f8, $32, $00 - db $00, $00, $33, $00 - db $00, $08, $34, $00 - db $00, $10, $35, $00 - db $08, $e8, $40, $00 - db $08, $f0, $41, $00 - db $08, $f8, $42, $00 - db $08, $00, $43, $00 - db $08, $08, $44, $00 - db $08, $10, $45, $00 - db $10, $e8, $50, $00 - db $10, $f0, $51, $00 - db $10, $f8, $52, $00 - db $10, $00, $53, $00 - db $10, $08, $54, $00 - db $10, $10, $55, $00 - -Unkn_fa292: - db 25 - db $ec, $f0, $00, $00 - db $ec, $f8, $01, $00 - db $ec, $00, $02, $00 - db $ec, $08, $03, $00 - db $ec, $10, $04, $00 - db $f4, $f0, $05, $00 - db $f4, $f8, $06, $00 - db $f4, $00, $07, $00 - db $f4, $08, $08, $00 - db $f4, $10, $09, $00 - db $fc, $f0, $10, $00 - db $fc, $f8, $11, $00 - db $fc, $00, $12, $00 - db $fc, $08, $13, $00 - db $fc, $10, $14, $00 - db $04, $f0, $15, $00 - db $04, $f8, $16, $00 - db $04, $00, $17, $00 - db $04, $08, $18, $00 - db $04, $10, $19, $00 - db $0c, $f0, $20, $00 - db $0c, $f8, $21, $00 - db $0c, $00, $22, $00 - db $0c, $08, $23, $00 - db $0c, $10, $24, $00 - -Unkn_fa2f7: - db 4 - db $fc, $f0, $00, $00 - db $fc, $f8, $01, $00 - db $fc, $00, $01, $20 - db $fc, $08, $00, $20 - -Unkn_fa308: - db 8 - db $f8, $e8, $00, $10 - db $f8, $f0, $01, $10 - db $00, $e8, $02, $10 - db $00, $f0, $03, $10 - db $f8, $08, $01, $30 - db $f8, $10, $00, $30 - db $00, $08, $03, $30 - db $00, $10, $02, $30 - -Unkn_fa329: - db 12 - db $f8, $d8, $00, $10 - db $f8, $e0, $01, $10 - db $f8, $e8, $02, $10 - db $00, $d8, $10, $10 - db $00, $e0, $11, $10 - db $00, $e8, $12, $10 - db $f8, $10, $02, $30 - db $f8, $18, $01, $30 - db $f8, $20, $00, $30 - db $00, $10, $12, $30 - db $00, $18, $11, $30 - db $00, $20, $10, $30 - +INCLUDE "engine/surfing_minigame.asm" +INCLUDE "engine/yellow_intro.asm" +INCLUDE "data/animated_objects_3e_2.asm" YellowIntroGraphics: INCBIN "gfx/yellow_intro.2bpp" - INCLUDE "engine/animated_objects_3e.asm" diff --git a/engine/bank3f.asm b/engine/bank3f.asm index 85674ec4..23eadbb1 100644 --- a/engine/bank3f.asm +++ b/engine/bank3f.asm @@ -1,1804 +1,10 @@ INCLUDE "data/map_songs.asm" INCLUDE "data/map_header_pointers.asm" INCLUDE "data/map_header_banks.asm" - -Func_fc4dd:: ; fc4dd (3f:44dd) -; possibly to test if pika should be out? - ld a, [wPikachuOverworldStateFlags] - bit 5, a - jr nz, .hide ; 3f:44f8 - ld a, [wPikachuOverworldStateFlags] - bit 7, a - jr nz, .hide - call IsStarterPikachuInOurParty - jr nc, .hide - ld a, [wWalkBikeSurfState] - and a - jr nz, .hide - scf - ret - -.hide - and a - ret - -Func_fc4fa:: ; fc4fa (3f:44fa) - ld hl, wPikachuOverworldStateFlags - bit 4, [hl] - res 4, [hl] - jr nz, .asm_fc515 - call EnablePikachuFollowingPlayer - call Func_fc523 - ld a, $ff - ld [wSpriteStateData1 + $f2], a - call ClearPikachuFollowCommandBuffer - call Func_fc5bc - ret - -.asm_fc515 - call Func_fc53f - xor a - ld [wd431], a - ld a, [wSpriteStateData1 + $9] - ld [wSpriteStateData1 + $f9], a - ret - -Func_fc523:: ; fc523 (3f:4523) - ld hl, wSpriteStateData1 + $f0 - call Func_fc52c - ld hl, wSpriteStateData2 + $f0 -Func_fc52c:: ; fc52c (3f:4523) - ld bc, $10 - xor a - call FillMemory - ret - -Func_fc534:: ; fc534 (3f:4534) - call Func_fc53f - call Func_fc5bc - xor a - ld [wd431], a - ret - -Func_fc53f:: ; fc53f (3f:453f) - ld bc, wSpriteStateData1 + $f0 - ld a, [wYCoord] - add $4 - ld e, a - ld a, [wXCoord] - add $4 - ld d, a - ld a, [wd431] - and a - jr z, .asm_fc5aa - cp $1 - jr z, .asm_fc59e - cp $2 - jr z, .asm_fc584 - cp $3 - jr z, .asm_fc5aa - cp $4 - jr z, .asm_fc5a4 - cp $5 - jr z, .asm_fc5a7 - cp $6 - jr z, .asm_fc5a1 - cp $7 - jr z, .asm_fc572 - jr .asm_fc59e - -.asm_fc572 - ld a, [wSpriteStateData1 + $9] - and a ; SPRITE_FACING_DOWN - jr z, .asm_fc5a4 - cp SPRITE_FACING_UP - jr z, .asm_fc5a7 - cp SPRITE_FACING_LEFT - jr z, .asm_fc5a1 - cp SPRITE_FACING_RIGHT - jr z, .asm_fc59e -.asm_fc584 - ld a, [wSpriteStateData1 + $9] - and a - jr nz, .asm_fc58d - dec e - jr .asm_fc5aa - -.asm_fc58d - cp SPRITE_FACING_UP - jr nz, .asm_fc594 - inc e - jr .asm_fc5aa - -.asm_fc594 - cp SPRITE_FACING_LEFT - jr nz, .asm_fc59b - inc d - jr .asm_fc5aa - -.asm_fc59b - dec d - jr .asm_fc5aa - -.asm_fc59e - inc d - jr .asm_fc5aa - -.asm_fc5a1 - dec d - jr .asm_fc5aa - -.asm_fc5a4 - inc e - jr .asm_fc5aa - -.asm_fc5a7 - dec e - jr .asm_fc5aa ; useless jr -.asm_fc5aa - ld hl, $104 - add hl, bc - ld [hl], e - inc hl - ld [hl], d - inc hl -Func_fc4b2:: ; fc4b2 (3f:44b2) - ld [hl], $fe - push hl - ld hl, wd472 - set 5, [hl] - pop hl - ret - -Func_fc5bc:: ; fc5bc (3f:45bc) - ld a, $49 - ld [wSpriteStateData1 + $f0], a - ld a, $ff - ld [wSpriteStateData1 + $f2], a - ld a, [wd431] - and a - jr z, .asm_fc5e4 - cp $1 - jr z, .asm_fc5e4 - cp $3 - jr z, .asm_fc5eb - cp $4 - jr z, .asm_fc5e4 - cp $6 - jr z, .asm_fc5e4 - cp $7 - jr z, .asm_fc5f1 - call Func_fccb2 - ret - -.asm_fc5e4 - ld a, [wSpriteStateData1 + $9] - ld [wSpriteStateData1 + $f9], a - ret - -.asm_fc5eb - ld a, $0 - ld [wSpriteStateData1 + $f9], a - ret - -.asm_fc5f1 - ld a, [wSpriteStateData1 + $9] - xor $4 - ld [wSpriteStateData1 + $f9], a - ret - -Func_fc5fa:: ; fc5fa (3f:45fa) - ld a, [wCurMap] - cp OAKS_LAB - jr z, .asm_fc63d - cp ROUTE_22_GATE - jr z, .asm_fc62d - cp MT_MOON_2 - jr z, .asm_fc635 - cp ROCK_TUNNEL_1 - jr z, .asm_fc645 - ld a, [wCurMap] - ld hl, Pointer_fc64b - call Func_1568 ; similar to IsInArray, but not the same - jr c, .asm_fc639 - ld a, [wCurMap] - ld hl, Pointer_fc653 - call Func_1568 - jr nc, .asm_fc641 - ld a, [wSpriteStateData1 + $9] - and a - jr nz, .asm_fc641 - ld a, $3 - jr .asm_fc647 - -.asm_fc62d - ld a, [wSpriteStateData1 + $9] - and a - jr z, .asm_fc645 - jr .asm_fc641 - -.asm_fc635 - ld a, $3 - jr .asm_fc647 - -.asm_fc639 - ld a, $4 - jr .asm_fc647 - -.asm_fc63d - ld a, $6 - jr .asm_fc647 - -.asm_fc641 - ld a, $1 - jr .asm_fc647 - -.asm_fc645 - ld a, $3 -.asm_fc647 - ld [wd431], a - ret - -Pointer_fc64b:: ; fc64b (3f:464b) - db $c2, $4c, $4f, $ba, $be, $b8, $54, $ff - -Pointer_fc653:: ; fc653 (3f:4653) - db $2f, $e6, $3e, $5e, $80, $31, $a4, $ff - -Func_fc65b:: ; fc65b (3f:465b) - ld a, [wCurMap] - cp VIRIDIAN_FOREST_EXIT - jr z, .asm_fc673 - cp VIRIDIAN_FOREST_ENTRANCE - jr z, .asm_fc67c - ld a, [wCurMap] - ld hl, Pointer_fc68e - call Func_1568 - jr c, .asm_fc688 - jr .asm_fc684 - -.asm_fc673 - ld a, [wSpriteStateData1 + $9] - cp SPRITE_FACING_UP - jr z, .asm_fc688 - jr .asm_fc684 - -.asm_fc67c - ld a, [wSpriteStateData1 + $9] - and a ; SPRITE_FACING_DOWN - jr z, .asm_fc684 - jr .asm_fc688 - -.asm_fc684 - ld a, $0 - jr .asm_fc68a - -.asm_fc688 - ld a, $1 -.asm_fc68a - ld [wd431], a - ret - -Pointer_fc68e:: ; fc68e (3f:468e) - db $33, $dd, $df, $e0, $e1, $de, $ec, $7f, $a8, $a9, $aa, $ff - -Func_fc69a:: ; fc69a (3f:469a) - ld a, [wCurMap] - cp ROUTE_22_GATE - jr z, .asm_fc6a7 - cp ROUTE_2_GATE - jr z, .asm_fc6b0 - jr .asm_fc6bd - -.asm_fc6a7 - ld a, [wSpriteStateData1 + $9] - cp SPRITE_FACING_UP - jr z, .asm_fc6b9 - jr .asm_fc6bd - -.asm_fc6b0 - ld a, [wSpriteStateData1 + $9] - cp SPRITE_FACING_UP - jr z, .asm_fc6b9 - jr .asm_fc6bd - -.asm_fc6b9 - ld a, $1 - jr .asm_fc6c1 - -.asm_fc6bd - ld a, $3 - jr .asm_fc6c1 - -.asm_fc6c1 - ld [wd431], a - ret - -Func_fc6c5:: ; fc6c5 (3f:46c5) - push hl - ld hl, wPikachuOverworldStateFlags - set 2, [hl] - pop hl - ret - -Func_fc6cd:: ; fc6cd (3f:46cd) - push hl - ld hl, wPikachuOverworldStateFlags - res 2, [hl] - pop hl - ret - -Func_fc6d5:: ; fc6d5 (3f:46d5) - call Func_fc6cd - call Func_fc727 - ret nc - push bc - call Func_fcd25 - pop bc - ret c - ld bc, wSpriteStateData1 + $f0 - ld hl, $1 - add hl, bc - bit 7, [hl] - jp nz, asm_fc745 - ld a, [wFontLoaded] - bit 0, a - jp nz, asm_fc76a - call CheckPikachuFollowingPlayer - jp nz, asm_fc76a - ld a, [hl] - and $7f - cp $a - jr c, .asm_fc704 - xor a -.asm_fc704 - add a - ld e, a - ld d, 0 - ld hl, PointerTable_fc710 - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -PointerTable_fc710: ; fc710 (3f:4710) - dw Func_fc793 - dw Func_fc7aa - dw Func_fc803 - dw asm_fc9c3 - dw asm_fca1c - dw asm_fc9ee - dw asm_fc87f - dw asm_fc904 - dw asm_fc937 - dw asm_fc969 - dw Func_fc726 - -Func_fc726: ; fc726 (3f:4726) - ret - -Func_fc727: ; fc727 (3f:4727) - call Func_fc4dd - jr nc, .asm_fc73b - ld a, [wSpriteStateData1 + $f1] - and a - jr nz, .asm_fc739 - push bc - push hl - call Func_fc534 - pop hl - pop bc -.asm_fc739 - scf - ret - -.asm_fc73b - ld hl, wSpriteStateData1 + $f2 - ld [hl], $ff - dec hl - ld [hl], $0 - xor a - ret - -asm_fc745: ; fc745 (3f:4745) - ld hl, $1 - add hl, bc - res 7, [hl] - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - ld [hl], a - call CheckPikachuFollowingPlayer - jr nz, .asm_fc75f - ld a, [wSpriteStateData1 + $9] - xor $4 - ld hl, $9 - add hl, bc - ld [hl], a -.asm_fc75f - xor a - ld hl, $7 - add hl, bc - ld [hli], a - ld [hl], a - call Func_fca99 - ret - -asm_fc76a: ; fc76a (3f:476a) - xor a - ld hl, $7 - add hl, bc - ld [hli], a - ld [hl], a - call Func_fca99 - call Func_fc82e - jr c, .asm_fc783 - push bc - callab InitializeSpriteScreenPosition - pop bc -.asm_fc783 - ld hl, $1 - add hl, bc - ld [hl], $1 - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - ld [hl], $0 - call Func_fcba1 - ret - -Func_fc793: ; fc793 (3f:4793) - call Func_fcba1 - push bc - callab InitializeSpriteScreenPosition - pop bc - ld hl, $2 - add hl, bc - ld [hl], $ff - dec hl - ld [hl], $1 - ret - -Func_fc7aa: ; fc7aa (3f:47aa) - call Func_fcc92 - jp c, Func_fc803 - dec a - ld l, a - ld h, $0 - add hl, hl - add hl, hl - ld de, Pointer_fc7e3 - add hl, de - ld d, h - ld e, l - ld a, [de] - inc de - ld hl, $9 - add hl, bc - ld [hl], a - ld a, [de] - inc de - ld hl, $5 - add hl, bc - ld [hl], a - dec hl - dec hl - ld a, [de] - ld [hl], a - inc de - ld a, [de] - ld hl, $1 - add hl, bc - ld [hl], a - cp $4 - jp z, Func_fca0a - call Func_fcd17 - jp c, Func_fc9df - jp Func_fc9b4 - -Pointer_fc7e3: ; fc7e3 (3f:47e3) - db $0, $0 - db $1, $3 - db $4, $0 - db $ff, $3 - db $8, $ff - db $0, $3 - db $c, $1 - db $0, $3 - db $0, $0 - db $1, $4 - db $4, $0 - db $ff, $4 - db $8, $ff - db $0, $4 - db $c, $1 - db $0, $4 - -Func_fc803: ; fc803 (3f:4803) - call Func_fcae2 - ret c - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - dec [hl] - jr nz, .asm_fc823 - push hl - call Func_fccee - pop hl - cp $5 - jr nc, Func_fc842 - ld [hl], $20 - call Random - and $c - ld hl, $9 - add hl, bc - ld [hl], a -.asm_fc823 - xor a - ld hl, $7 - add hl, bc - ld [hli], a - ld [hl], a - call Func_fca99 - ret - -Func_fc82e: ; fc82e (3f:482e) - ld a, [wWalkCounter] - and a - ret z - scf - ret - -Func_fc835: ; fc835 (3f:4835) - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - ld [hl], $10 - ld hl, $1 - add hl, bc - ld [hl], $1 - ret - -Func_fc842: ; fc842 (3f:4842) - ld hl, $0 - push af - call Random - ld a, [hRandomAdd] - and %11 - ld e, a - ld d, $0 - ld hl, PointerTable_fc85a - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - pop af - jp hl - -PointerTable_fc85a: ; fc85a (3f:485a) - dw Func_fc862 - dw Func_fc8f8 - dw Func_fc92b - dw Func_fc95d - -Func_fc862: ; fc862 (3f:4862) - dec a - add a - add a - and $c - ld hl, $9 - add hl, bc - ld [hl], a - ld hl, $1 - add hl, bc - ld [hl], $6 - xor a - ld [wd432], a - ld [wd433], a - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - ld [hl], $11 -asm_fc87f: ; fc87f (3f:487f) - ld a, [wd432] - ld e, a - ld a, [wd433] - ld d, a - call Func_fc82e - jr c, Func_fc8c7 - call Func_fc6c5 - ld hl, $4 - add hl, bc - ld a, [hl] - sub e - ld e, a - inc hl - inc hl - ld a, [hl] - sub d - ld d, a - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - ld a, [hl] - dec a - add a - add $d6 - ld l, a - ld a, $48 - adc $0 - ld h, a - ld a, [hli] - ld [wd432], a - add e - ld e, a - ld a, [hl] - ld [wd433], a - add d - ld d, a - ld hl, $4 - add hl, bc - ld [hl], e - inc hl - inc hl - ld [hl], d - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - dec [hl] - ret nz - jp Func_fc835 - -Func_fc8c7: ; fc8c7 (3f:48c7) - ld hl, $4 - add hl, bc - ld a, [hl] - sub e - ld [hl], a - inc hl - inc hl - ld a, [hl] - sub d - ld [hl], a - jp Func_fc835 - -Pointer_fc8d6: ; fc8d6 (3f:48d6) - db $0, $0, $fe, $1, $fc - db $2, $fe, $3, $0, $4 - db $fe, $3, $fc, $2, $fe - db $1, $0, $0, $fe, $ff - db $fc, $fe, $fe, $fd, $0 - db $fc, $fe, $fd, $fc, $fe - db $fe, $ff, $00, $00 - -Func_fc8f8: ; fc8f8 (3f:48f8) - ld hl, $1 - add hl, bc - ld [hl], $7 - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - ld [hl], $30 -asm_fc904: ; fc904 (3f:4904) - call Func_fc82e - jp c, Func_fc835 - call Func_fc6c5 - ld hl, $7 - add hl, bc - ld a, [hl] - inc a - cp $8 - ld [hl], a - jr nz, .asm_fc91f - xor a - ld [hli], a - ld a, [hl] - inc a - and %11 - ld [hl], a -.asm_fc91f - call Func_fca99 - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - dec [hl] - ret nz - jp Func_fc835 - -Func_fc92b: ; fc92b (3f:492b) - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - ld [hl], $20 - ld hl, $1 - add hl, bc - ld [hl], $8 -asm_fc937: ; fc937 (3f:4937) - call Func_fc82e - jp c, Func_fc835 - call Func_fc6c5 - ld hl, $7 - add hl, bc - ld a, [hl] - inc a - cp $8 - ld [hl], a - jr nz, .asm_fc951 - xor a - ld [hli], a - ld a, [hl] - xor $1 - ld [hl], a -.asm_fc951 - call Func_fca99 - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - dec [hl] - ret nz - jp Func_fc835 - -Func_fc95d: ; fc95d (3f:495d) - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - ld [hl], $20 - ld hl, $1 - add hl, bc - ld [hl], $9 -asm_fc969: ; fc969 (3f:4969) - call Func_fc82e - jp c, Func_fc835 - call Func_fc6c5 - ld hl, $7 - add hl, bc - ld a, [hl] - inc a - cp $8 - ld [hl], a - jr nz, .asm_fc988 - xor a - ld [hl], a - ld hl, $9 - add hl, bc - ld a, [hl] - call Func_fc994 - ld [hl], a -.asm_fc988 - call Func_fca99 - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - dec [hl] - ret nz - jp Func_fc835 - -Func_fc994: ; fc994 (3f:4994) - push hl - ld hl, Pointer_fc9ac - ld d, a -.loop - ld a, [hli] - cp d - jr nz, .loop - ld a, [hl] - pop hl - ret - -Func_fc9a0: ; fc9a0 (3f:49a0) - push hl - ld hl, Pointer_fc9ac_End - ld d, a -.loop - ld a, [hld] - cp d - jr nz, .loop - ld a, [hl] - pop hl - ret - -Pointer_fc9ac: ; fc9ac (3f:49ac) - db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT, SPRITE_FACING_UP, SPRITE_FACING_RIGHT - db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT, SPRITE_FACING_UP, SPRITE_FACING_RIGHT -Pointer_fc9ac_End: -Func_fc9b4: ; fc9b4 (3f:49b4) - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - ld [hl], $8 - ld hl, $1 - add hl, bc - ld [hl], $3 - call Func_fca38 -asm_fc9c3: ; fc9c3 (3f:49c3) - call Func_fca4b - call Func_fca7e - call Func_fca99 - ld hl, $100 - add hl, bc - dec [hl] - ret nz - call Func_fca75 - call Func_fccb2 - ld hl, $1 - add hl, bc - ld [hl], $1 - ret - -Func_fc9df: ; fc9df (3f:49df) - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - ld [hl], $4 - ld hl, $1 - add hl, bc - ld [hl], $5 - call Func_fca38 -asm_fc9ee: ; fc9ee (3f:49ee) - call asm_fca59 - call Func_fca7e - call Func_fca99 - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - dec [hl] - ret nz - call Func_fca75 - call Func_fccb2 - ld hl, $1 - add hl, bc - ld [hl], $1 - ret - -Func_fca0a: ; fca0a (3f:4a0a) - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - ld [hl], $8 - ld hl, $1 - add hl, bc - ld [hl], $4 - call Func_fca38 - call Func_fca38 -asm_fca1c: ; fca1c (3f:4a1c) - call asm_fca59 - call Func_fca7e - call Func_fca99 - ld hl, wSpriteStateData2 - wSpriteStateData1 - add hl, bc - dec [hl] - ret nz - call Func_fca75 - call Func_fccb2 - ld hl, $1 - add hl, bc - ld [hl], $1 - ret - -Func_fca38: ; fca38 (3f:4a38) - ld hl, $3 - add hl, bc - ld e, [hl] - inc hl - inc hl - ld d, [hl] - ld hl, $104 - add hl, bc - ld a, [hl] - add e - ld [hli], a - ld a, [hl] - add d - ld [hl], a - ret - -Func_fca4b: ; fca4b (3f:4a4b) - ld a, [wWalkBikeSurfState] - cp $1 - jr nz, Func_fca68 - ld a, [wd736] - bit 6, a - jr nz, Func_fca68 -asm_fca59: ; fca59 (3f:4a59) - ld hl, $3 - add hl, bc - ld a, [hli] - add a - add a - add [hl] - ld [hli], a - ld a, [hli] - add a - add a - add [hl] - ld [hl], a - ret - -Func_fca68: ; fca68 (3f:4a68) - ld hl, $3 - add hl, bc - ld a, [hli] - add a - add [hl] - ld [hli], a - ld a, [hli] - add a - add [hl] - ld [hli], a - ret - -Func_fca75: ; fca75 (3f:4a75) - ld hl, $3 - add hl, bc - xor a - ld [hli], a - inc hl - ld [hl], a - ret - -Func_fca7e: ; fca7e (3f:4a7e) - call Func_fcdad - ld d, $2 - jr nc, .asm_fca87 - ld d, $5 -.asm_fca87 - ld hl, $7 - add hl, bc - ld a, [hl] - inc a - cp d - jr nz, .asm_fca91 - xor a -.asm_fca91 - ld [hli], a - ret nz - ld a, [hl] - inc a - and $3 - ld [hl], a - ret - -Func_fca99: ; fca99 (3f:4a99) - ld a, [wPikachuOverworldStateFlags] - bit 3, a - jr nz, .asm_fcad1 - ld hl, $10e - add hl, bc - ld a, [hl] - dec a - swap a - ld d, a - ld a, [wd736] - bit 7, a - jr nz, .asm_fcad8 - ld hl, $9 - add hl, bc - ld a, [hl] - or d - ld d, a - ld a, [wFontLoaded] - bit 0, a - jr z, .asm_fcac4 - call Func_fcae2 - ret c - jr .asm_fcacb - -.asm_fcac4 - ld hl, $8 - add hl, bc - ld a, d - or [hl] - ld d, a -.asm_fcacb - ld hl, $2 - add hl, bc - ld [hl], d - ret - -.asm_fcad1 - ld hl, $2 - add hl, bc - ld [hl], $ff - ret - -.asm_fcad8 - ld a, [wSpriteStateData1 + $2] - and $f - or d - ld [wSpriteStateData1 + $f2], a - ret - -Func_fcae2: ; fcae2 (3f:4ae2) - ld hl, $104 - add hl, bc - ld a, [wYCoord] - add $4 - cp [hl] - jr nz, .asm_fcaff - inc hl - ld a, [wXCoord] - add $4 - cp [hl] - jr nz, .asm_fcaff - ld hl, $2 - add hl, bc - ld [hl], $ff - scf - ret - -.asm_fcaff - and a - ret - -Func_fcb01: ; fcb01 (3f:4b01) - push bc - push de - push hl - ld bc, wSpriteStateData1 + $f0 - ld a, [wXCoord] - add $4 - ld d, a - ld a, [wYCoord] - add $4 - ld e, a - ld hl, $104 - add hl, bc - ld a, [hl] - sub e - and a - jr z, .asm_fcb30 - cp $ff - jr z, .asm_fcb26 - cp $1 - jr z, .asm_fcb26 - jr .asm_fcb48 - -.asm_fcb26 - ld hl, $105 - add hl, bc - ld a, [hl] - sub d - jr z, .asm_fcb43 - jr .asm_fcb48 - -.asm_fcb30 - ld hl, $105 - add hl, bc - ld a, [hl] - sub d - cp $ff - jr z, .asm_fcb43 - cp $1 - jr z, .asm_fcb43 - and a - jr z, .asm_fcb43 - jr .asm_fcb48 - -.asm_fcb43 - pop hl - pop de - pop bc - scf - ret - -.asm_fcb48 - pop hl - pop de - pop bc - xor a - ret - -GetPikachuFacingDirectionAndReturnToE: ; fcb4d (3f:4b4d) - call GetPikachuFacingDirection - ld e, a - ret - -GetPikachuFacingDirection: ; fcb52 (3f:4b52) - ld bc, wSpriteStateData1 + $f0 - ld a, [wXCoord] - add $4 - ld d, a - ld a, [wYCoord] - add $4 - ld e, a - ld hl, wSpriteStateData2 - wSpriteStateData1 + 4 - add hl, bc - ld a, [hl] - cp e - jr z, .asm_fcb71 - jr nc, .asm_fcb6e - ld a, SPRITE_FACING_UP - ret - -.asm_fcb6e - ld a, SPRITE_FACING_DOWN - ret - -.asm_fcb71 - ld hl, wSpriteStateData2 - wSpriteStateData1 + 5 - add hl, bc - ld a, [hl] - cp d - jr z, .asm_fcb81 - jr nc, .asm_fcb7e - ld a, SPRITE_FACING_LEFT - ret - -.asm_fcb7e - ld a, SPRITE_FACING_RIGHT - ret - -.asm_fcb81 - ld a, $ff ; standing - ret - -ClearPikachuFollowCommandBuffer: ; fcb84 (3f:4b84) - push bc - ld hl, wPikachuFollowCommandBufferSize - ld [hl], $ff - inc hl - ld bc, $10 - xor a - call FillMemory - pop bc - ret - -AppendPikachuFollowCommandToBuffer: ; fcb94 (3f:4b94) - ld hl, wPikachuFollowCommandBufferSize - inc [hl] - ld e, [hl] - ld d, 0 - ld hl, wPikachuFollowCommandBuffer - add hl, de - ld [hl], a - ret - -Func_fcba1: ; fcba1 (3f:4ba1) - call ClearPikachuFollowCommandBuffer - call GetPikachuFollowCommand - ret c - call AppendPikachuFollowCommandToBuffer - ret - -GetPikachuFollowCommand: ; fcbac (3f:4bac) - ld bc, wSpriteStateData1 + $f0 - ld hl, wSpriteStateData2 - wSpriteStateData1 + 4 - add hl, bc - ld a, [wYCoord] - add $4 - sub [hl] - jr z, .checkXCoord - jr c, .pikaAbovePlayer - call CheckAbsoluteValueLessThan2 - jr c, .return1 - ld a, $5 - and a - ret - -.return1 - ld a, $1 - and a - ret - -.pikaAbovePlayer - call CheckAbsoluteValueLessThan2 - jr c, .return2 - ld a, $6 - and a - ret - -.return2 - ld a, $2 - and a - ret - -.checkXCoord - ld hl, wSpriteStateData2 - wSpriteStateData1 + 5 - add hl, bc - ld a, [wXCoord] - add $4 - sub [hl] - jr z, .pikachuOnTopOfPlayer - jr c, .pikaToLeftOfPlayer - call CheckAbsoluteValueLessThan2 - jr c, .return4 - ld a, $8 - and a - ret - -.return4 - ld a, $4 - and a - ret - -.pikaToLeftOfPlayer - call CheckAbsoluteValueLessThan2 - jr c, .return3 - ld a, $7 - and a - ret - -.return3 - ld a, $3 - and a - ret - -.pikachuOnTopOfPlayer - scf - ret - -CheckAbsoluteValueLessThan2: ; fcc01 (3f:4c01) - jr nc, .positive - cpl - inc a -.positive - cp $2 - ret - -Func_fcc08:: ; fcc08 (3f:4c08) - call Func_fcc23 - ret nc - ld a, [wd736] - bit 6, a - jr nz, .asm_fcc1b - call Func_fcc42 - ret c - call AppendPikachuFollowCommandToBuffer - ret - -.asm_fcc1b - call Func_fcc64 - ret c - call AppendPikachuFollowCommandToBuffer - ret - -Func_fcc23: ; fcc23 (3f:4c28) - ld a, [wPikachuOverworldStateFlags] - bit 5, a - jr nz, .asm_fcc40 - ld a, [wPikachuOverworldStateFlags] - bit 7, a - jr nz, .asm_fcc40 - ld a, [wd472] - bit 7, a - jr z, .asm_fcc40 - ld a, [wWalkBikeSurfState] - and a - jr nz, .asm_fcc40 - scf - ret - -.asm_fcc40 - and a - ret - -Func_fcc42: ; fcc42 (3f:4c42) - xor a - ld a, [wPlayerDirection] - bit 3, a - jr nz, .asm_fcc58 - bit 2, a - jr nz, .asm_fcc5b - bit 1, a - jr nz, .asm_fcc5e - bit 0, a - jr nz, .asm_fcc61 - scf - ret - -.asm_fcc58 - ld a, $2 - ret - -.asm_fcc5b - ld a, $1 - ret - -.asm_fcc5e - ld a, $3 - ret - -.asm_fcc61 - ld a, $4 - ret - -Func_fcc64: ; fcc64 (3f:4c64) - ld hl, wPikachuOverworldStateFlags - bit 6, [hl] - jr z, .asm_fcc6e - res 6, [hl] - ret - -.asm_fcc6e - set 6, [hl] - xor a - ld a, [wPlayerDirection] - bit 3, a - jr nz, .asm_fcc86 - bit 2, a - jr nz, .asm_fcc89 - bit 1, a - jr nz, .asm_fcc8c - bit 0, a - jr nz, .asm_fcc8f - scf - ret - -.asm_fcc86 - ld a, $6 - ret - -.asm_fcc89 - ld a, $5 - ret - -.asm_fcc8c - ld a, $7 - ret - -.asm_fcc8f - ld a, $8 - ret - -Func_fcc92: ; fcc92 (3f:4c92) - ld hl, wPikachuFollowCommandBufferSize - ld a, [hl] - cp $ff - jr z, .asm_fccb0 - and a - jr z, .asm_fccb0 - dec [hl] - ld e, a - ld d, 0 - ld hl, wPikachuFollowCommandBuffer - add hl, de - inc e - ld a, $ff -.asm_fcca8 - ld d, [hl] - ldd [hl], a - ld a, d - dec e - jr nz, .asm_fcca8 - and a - ret - -.asm_fccb0 - scf - ret - -Func_fccb2:: ; fccb2 (3f:4cb2) - call Func_fcd01 - and a - jr z, .asm_fccbf - dec a - and $3 - add a - add a - jr .asm_fccea - -.asm_fccbf - ld a, [wYCoord] - add $4 - ld d, a - ld a, [wXCoord] - add $4 - ld e, a - ld a, [wSpriteStateData2 + $f4] - cp d - jr z, .asm_fccd9 - ld a, SPRITE_FACING_DOWN - jr c, .asm_fccea - ld a, SPRITE_FACING_UP - jr .asm_fccea - -.asm_fccd9 - ld a, [wSpriteStateData2 + $f5] - cp e - jr z, .asm_fcce7 - ld a, SPRITE_FACING_RIGHT - jr c, .asm_fccea - ld a, SPRITE_FACING_LEFT - jr .asm_fccea - -.asm_fcce7 - ld a, [wSpriteStateData1 + $9] -.asm_fccea - ld [wSpriteStateData1 + $f9], a - ret - -Func_fccee: ; fccee (3f:4cee) - ld hl, wPikachuFollowCommandBufferSize - ld a, [hl] - cp $ff - jr z, .asm_fccff - ld e, a - ld d, 0 - ld hl, wPikachuFollowCommandBuffer - add hl, de - ld a, [hl] - ret - -.asm_fccff - xor a - ret - -Func_fcd01: ; fcd01 (3f:4d01) - ld hl, wPikachuFollowCommandBufferSize - ld a, [hl] - cp $ff - jr z, .asm_fcd15 - and a - jr z, .asm_fcd15 - ld e, a - ld d, 0 - ld hl, wPikachuFollowCommandBuffer - add hl, de - ld a, [hl] - ret - -.asm_fcd15 - xor a - ret - -Func_fcd17: ; fcd17 (3f:4d17) - ld a, [wPikachuFollowCommandBufferSize] - cp $ff - ret z - cp $2 - jr nc, .asm_fcd23 - and a - ret - -.asm_fcd23 - scf - ret - -Func_fcd25: ; fcd25 (3f:4d25) - ld h, wSpriteStateData2 / $100 - ld a, [H_CURRENTSPRITEOFFSET] - add $4 - ld l, a - ld b, [hl] - ld a, [wYCoord] - cp b - jr z, .asm_fcd3a - jr nc, .asm_fcd63 - add $8 - cp b - jr c, .asm_fcd63 -.asm_fcd3a - inc l - ld b, [hl] - ld a, [wXCoord] - cp b - jr z, .asm_fcd49 - jr nc, .asm_fcd63 - add $9 - cp b - jr c, .asm_fcd63 -.asm_fcd49 - call Func_fcd83 - ld d, $60 - ld a, [hli] - ld e, a - cp d - jr nc, .asm_fcd63 - ld a, [hld] - cp d - jr nc, .asm_fcd63 - ld bc, -20 - add hl, bc - ld a, [hli] - cp d - jr nc, .asm_fcd63 - ld a, [hl] - cp d - jr c, .asm_fcd6f -.asm_fcd63 - ld h, wSpriteStateData1 / $100 - ld a, [H_CURRENTSPRITEOFFSET] - add $2 - ld l, a - ld [hl], $ff - scf - jr .asm_fcd82 - -.asm_fcd6f - ld h, wSpriteStateData2 / $100 - ld a, [H_CURRENTSPRITEOFFSET] - add $7 - ld l, a - ld a, [wGrassTile] - cp e - ld a, $0 - jr nz, .asm_fcd80 - ld a, $80 -.asm_fcd80 - ld [hl], a - and a -.asm_fcd82 - ret - -Func_fcd83: ; fcd83 (3f:4d83) - ld h, wSpriteStateData1 / $100 - ld a, [H_CURRENTSPRITEOFFSET] - add $4 - ld l, a - ld a, [hli] - add $4 - and $f0 - srl a - ld c, a - ld b, $0 - inc l - ld a, [hl] - add $2 - srl a - srl a - srl a - add SCREEN_WIDTH - ld d, 0 - ld e, a - ld hl, wTileMap - rept 5 - add hl, bc - endr - add hl, de - ret - -Func_fcdad: ; fcdad (3f:4dad) - push bc - push af - ld a, [wPikachuHappiness] - cp $50 - pop bc - ld a, b - pop bc - ret - -IsStarterPikachuInOurParty:: ; fcdb8 (3f:4db8) - ld hl, wPartySpecies - ld de, wPartyMon1OTID - ld bc, wPartyMonOT - push hl -.loop - pop hl - ld a, [hli] - push hl - inc a - jr z, .noPlayerPikachu - cp PIKACHU + 1 - jr nz, .curMonNotPlayerPikachu - ld h, d - ld l, e - ld a, [wPlayerID] - cp [hl] - jr nz, .curMonNotPlayerPikachu - inc hl - ld a, [wPlayerID+1] - cp [hl] - jr nz, .curMonNotPlayerPikachu - push de - push bc - ld hl, wPlayerName - ld d, $6 ; possible player length - 1 -.nameCompareLoop - dec d - jr z, .sameOT - ld a, [bc] - inc bc - cp [hl] - inc hl - jr z, .nameCompareLoop - pop bc - pop de -.curMonNotPlayerPikachu - ld hl, wPartyMon2 - wPartyMon1 - add hl, de - ld d, h - ld e, l - ld hl, NAME_LENGTH - add hl, bc - ld b, h - ld c, l - jr .loop - -.sameOT - pop bc - pop de - ld h, d - ld l, e - ld bc, -NAME_LENGTH - add hl, bc - ld a, [hli] - or [hl] - jr z, .noPlayerPikachu ; XXX how is this determined? - pop hl - scf - ret - -.noPlayerPikachu - pop hl - and a - ret - -IsThisPartymonStarterPikachu_Box:: ; fce0d (3f:4e0d) - ld hl, wBoxMon1 - ld bc, wBoxMon2 - wBoxMon1 - ld de, wBoxMonOT - jr asm_fce21 - -IsThisPartymonStarterPikachu_Party:: ; fce18 (3f:4e18) -IsThisPartymonStarterPikachu:: - ld hl, wPartyMon1 - ld bc, wPartyMon2 - wPartyMon1 - ld de, wPartyMonOT -asm_fce21: ; fce21 (3f:4e21) - ld a, [wWhichPokemon] - call AddNTimes - ld a, [hl] - cp PIKACHU - jr nz, .notPlayerPikachu - ld bc, wPartyMon1OTID - wPartyMon1 - add hl, bc - ld a, [wPlayerID] - cp [hl] - jr nz, .notPlayerPikachu - inc hl - ld a, [wPlayerID+1] - cp [hl] - jr nz, .notPlayerPikachu - ld h, d - ld l, e - ld a, [wWhichPokemon] - ld bc, NAME_LENGTH - call AddNTimes - ld de, wPlayerName - ld b, $6 -.loop - dec b - jr z, .isPlayerPikachu - ld a, [de] - inc de - cp [hl] - inc hl - jr z, .loop -.notPlayerPikachu - and a - ret - -.isPlayerPikachu - scf - ret - -Func_fce5a:: ; fce5a (3f:4e5a) - push de - call IsStarterPikachuInOurParty - pop de - ret nc - ld a, d - cp $80 - ld a, [wPikachuMood] - jr c, .asm_fce6c - cp d - jr c, .asm_fce6e - ret - -.asm_fce6c - cp d - ret c -.asm_fce6e - ld a, d - ld [wPikachuMood], a - ret - -Func_fce73:: ; fce73 (3f:4e73) -; function to test if Pikachu is alive? - xor a - ld [wWhichPokemon], a - ld hl, wPartyCount -.loop - inc hl - ld a, [hl] - cp $ff - jr z, .asm_fcea9 - push hl - call IsThisPartymonStarterPikachu_Party - pop hl - jr nc, .asm_fce9e - ld a, [wWhichPokemon] - ld hl, wPartyMon1HP - ld bc, wPartyMon2 - wPartyMon1 - call AddNTimes - ld a, [hli] - or [hl] - ld d, a - inc hl - inc hl - ld a, [hl] - and a - jr nz, .asm_fcea7 - jr .asm_fcea9 - -.asm_fce9e - ld a, [wWhichPokemon] - inc a - ld [wWhichPokemon], a - jr .loop - -.asm_fcea7 - scf - ret - -.asm_fcea9 - and a - ret - -IsSurfingPikachuInThePlayersParty:: ; fceab (3f:4eab) - ld hl, wPartySpecies - ld de, wPartyMon1Moves - ld bc, wPartyMonOT - push hl -.loop - pop hl - ld a, [hli] - push hl - inc a - jr z, .noSurfingPlayerPikachu - cp PIKACHU+1 - jr nz, .curMonNotSurfingPlayerPikachu - ld h, d - ld l, e - push hl - push bc - ld b, NUM_MOVES -.moveSearchLoop - ld a, [hli] - cp SURF - jr z, .foundSurfingPikachu - dec b - jr nz, .moveSearchLoop - pop bc - pop hl - jr .curMonNotSurfingPlayerPikachu - -.foundSurfingPikachu - pop bc - pop hl - inc hl - inc hl - inc hl - inc hl - ld a, [wPlayerID] - cp [hl] - jr nz, .curMonNotSurfingPlayerPikachu - inc hl - ld a, [wPlayerID+1] - cp [hl] - jr nz, .curMonNotSurfingPlayerPikachu - push de - push bc - ld hl, wPlayerName - ld d, $6 -.nameCompareLoop - dec d - jr z, .foundSurfingPlayerPikachu - ld a, [bc] - inc bc - cp [hl] - inc hl - jr z, .nameCompareLoop - pop bc - pop de -.curMonNotSurfingPlayerPikachu - ld hl, wPartyMon2 - wPartyMon1 - add hl, de - ld d, h - ld e, l - ld hl, NAME_LENGTH - add hl, bc - ld b, h - ld c, l - jr .loop - -.foundSurfingPlayerPikachu - pop bc - pop de - pop hl - scf - ret - -.noSurfingPlayerPikachu - pop hl - and a - ret - +INCLUDE "engine/pikachu_follow.asm" +INCLUDE "engine/pikachu_status.asm" +INCLUDE "engine/pikachu_emotions.asm" +INCLUDE "engine/pikachu_movement.asm" INCLUDE "engine/pikachu_pic_animation.asm" Func_fe66e: diff --git a/engine/battle/core.asm b/engine/battle/core.asm index 7a3eab32..565525ea 100755 --- a/engine/battle/core.asm +++ b/engine/battle/core.asm @@ -1898,7 +1898,7 @@ SendOutMon: ; 3ccfb (f:4cfb) ld [H_WHOSETURN], a ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a - callab Func_f429f + callab StarterPikachuBattleEntranceAnimation callab IsPlayerPikachuAsleepInParty ld e, $24 jr c, .asm_3cd81 diff --git a/engine/battle/end_of_battle.asm b/engine/battle/end_of_battle.asm index 53a68b64..f4c99e3d 100755 --- a/engine/battle/end_of_battle.asm +++ b/engine/battle/end_of_battle.asm @@ -46,7 +46,7 @@ EndOfBattle: ; 13765 (4:7765) ld [wForceEvolution], a predef EvolutionAfterBattle ld d, $82 - callab Func_fce5a + callab UpdatePikachuMoodAfterBattle .resetVariables xor a ld [wLowHealthAlarm], a ;disable low health alarm diff --git a/engine/diploma_3a.asm b/engine/diploma_3a.asm index c8a7e740..520d9f96 100755 --- a/engine/diploma_3a.asm +++ b/engine/diploma_3a.asm @@ -82,11 +82,11 @@ Func_e9ad3: ld de, Tilemap_e9b3e coord hl, 6, 2 lb bc, 10, 12 - call Func_e925d + call Diploma_Surfing_CopyBox ld de, Tilemap_e9bb6 coord hl, 5, 13 lb bc, 1, 11 - call Func_e925d + call Diploma_Surfing_CopyBox ld de, String_e9bd5 coord hl, 2, 15 call PlaceString @@ -105,7 +105,7 @@ Func_e9ad3: ld de, TileMap_e9bc1 coord hl, 2, 0 lb bc, 4, 5 - call Func_e925d + call Diploma_Surfing_CopyBox ret Tilemap_e9b3e: diff --git a/engine/hidden_object_functions14.asm b/engine/hidden_object_functions14.asm index 0724f962..e69e802c 100755 --- a/engine/hidden_object_functions14.asm +++ b/engine/hidden_object_functions14.asm @@ -89,7 +89,7 @@ FightingDojoText: ; 5298a (14:698a) db "@" PrintIndigoPlateauHQText: ; 5298f (14:698f) - ld a, [wSpriteStateData1 + 9] + ld a, [wPlayerFacingDirection] cp SPRITE_FACING_UP ret nz call EnableAutoTextBoxDrawing diff --git a/engine/hidden_object_functions17.asm b/engine/hidden_object_functions17.asm index 8e5920d5..31f9befc 100755 --- a/engine/hidden_object_functions17.asm +++ b/engine/hidden_object_functions17.asm @@ -14,7 +14,7 @@ RedBedroomPCText: ; 5db8e (17:5b8e) db $fc ; FuncTX_ItemStoragePC Route15GateLeftBinoculars: ; 5db8f (17:5b8f) - ld a, [wSpriteStateData1 + 9] + ld a, [wPlayerFacingDirection] cp SPRITE_FACING_UP ret nz call EnableAutoTextBoxDrawing diff --git a/engine/hidden_object_functions18.asm b/engine/hidden_object_functions18.asm index 443f8369..cdba142b 100755 --- a/engine/hidden_object_functions18.asm +++ b/engine/hidden_object_functions18.asm @@ -3,7 +3,7 @@ GymStatues: ; 625e8 (18:65e8) ; if in a gym and don’t have the corresponding badge, a = GymStatueText1_id and jp PrintPredefTextID ; else ret call EnableAutoTextBoxDrawing - ld a, [wSpriteStateData1 + 9] + ld a, [wPlayerFacingDirection] cp SPRITE_FACING_UP ret nz ld hl, .BadgeFlags @@ -64,7 +64,7 @@ PrintBenchGuyText: ; 6245d (18:645d) .match ld a, [hli] ld b, a - ld a, [wSpriteStateData1 + 9] + ld a, [wPlayerFacingDirection] cp b jr nz, .loop ; player isn't facing left at the bench guy ld a, [hl] @@ -192,7 +192,7 @@ BookcaseText: ; 62511 (18:6511) db "@" OpenPokemonCenterPC: ; 62516 (18:6516) - ld a, [wSpriteStateData1 + 9] + ld a, [wPlayerFacingDirection] cp SPRITE_FACING_UP ; check to see if player is facing up ret nz call EnableAutoTextBoxDrawing diff --git a/engine/hidden_object_functions3.asm b/engine/hidden_object_functions3.asm index e43ae451..78da8274 100755 --- a/engine/hidden_object_functions3.asm +++ b/engine/hidden_object_functions3.asm @@ -1,6 +1,6 @@ ; prints text for bookshelves in buildings without sign events PrintBookshelfText: ; f9de (3:79de) - ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction + ld a, [wPlayerFacingDirection] ; player's sprite facing direction cp SPRITE_FACING_UP jr nz, .noMatch ; facing up diff --git a/engine/hidden_object_functions7.asm b/engine/hidden_object_functions7.asm index 7ccfbf01..6e232664 100755 --- a/engine/hidden_object_functions7.asm +++ b/engine/hidden_object_functions7.asm @@ -115,7 +115,7 @@ GameOverText: ; 1e3aa (7:63aa) db "@" PrintCinnabarQuiz: ; 1e3af (7:63af) - ld a, [wSpriteStateData1 + 9] + ld a, [wPlayerFacingDirection] cp SPRITE_FACING_UP ret nz call EnableAutoTextBoxDrawing @@ -366,7 +366,7 @@ MagazinesText: ; 1e544 (7:6544) BillsHousePC: ; 1e549 (7:6549) call EnableAutoTextBoxDrawing - ld a, [wSpriteStateData1 + 9] + ld a, [wPlayerFacingDirection] cp SPRITE_FACING_UP ret nz CheckEvent EVENT_LEFT_BILLS_HOUSE_AFTER_HELPING @@ -497,7 +497,7 @@ BillsHousePokemonListText2: ; 1e67f (7:667f) db "@" DisplayOakLabEmailText: ; 1e684 (7:6684) - ld a, [wSpriteStateData1 + 9] + ld a, [wPlayerFacingDirection] cp SPRITE_FACING_UP ret nz call EnableAutoTextBoxDrawing diff --git a/engine/items/items.asm b/engine/items/items.asm index 31426795..cffcb5b3 100755 --- a/engine/items/items.asm +++ b/engine/items/items.asm @@ -1,18 +1,18 @@ UseItem_: ; d2ed (3:52ed) - ld a,1 - ld [wActionResultOrTookBattleTurn],a ; initialise to success value - ld a,[wcf91] ;contains item_ID - cp a,HM_01 - jp nc,ItemUseTMHM - ld hl,ItemUsePtrTable + ld a, 1 + ld [wActionResultOrTookBattleTurn], a ; initialise to success value + ld a, [wcf91] ;contains item_ID + cp a, HM_01 + jp nc, ItemUseTMHM + ld hl, ItemUsePtrTable dec a add a - ld c,a - ld b,0 - add hl,bc - ld a,[hli] - ld h,[hl] - ld l,a + ld c, a + ld b, 0 + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a jp [hl] ItemUsePtrTable: ; d307 (3:5307) @@ -101,135 +101,137 @@ ItemUsePtrTable: ; d307 (3:5307) dw ItemUsePPRestore ; MAX_ELIXER ItemUseBall: ; d3ad (3:53ad) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jp z,ItemUseNotTime ; not in battle + jp z, ItemUseNotTime ; not in battle dec a - jp nz,ThrowBallAtTrainerMon - ld a,[wBattleType] + jp nz, ThrowBallAtTrainerMon + ld a, [wBattleType] cp $1 - jr z,.UseBall + jr z, .UseBall cp $4 ; pikachu battle? - jr z,.UseBall - ld a,[wPartyCount] ;is Party full? - cp a,PARTY_LENGTH - jr nz,.UseBall - ld a,[wNumInBox] ;is Box full? - cp a,MONS_PER_BOX - jp z,BoxFullCannotThrowBall + jr z, .UseBall + ld a, [wPartyCount] ;is Party full? + cp a, PARTY_LENGTH + jr nz, .UseBall + ld a, [wNumInBox] ;is Box full? + cp a, MONS_PER_BOX + jp z, BoxFullCannotThrowBall .UseBall ;ok, you can use a ball xor a - ld [wCapturedMonSpecies],a - ld a,[wBattleType] - cp a,2 ;SafariBattle - jr nz,.skipSafariZoneCode + ld [wCapturedMonSpecies], a + ld a, [wBattleType] + cp a, 2 ;SafariBattle + jr nz, .skipSafariZoneCode .safariZone ; remove a Safari Ball from inventory - ld hl,wNumSafariBalls + ld hl, wNumSafariBalls dec [hl] .skipSafariZoneCode call RunDefaultPaletteCommand - ld a,$43 - ld [wd11e],a + ld a, $43 + ld [wd11e], a call LoadScreenTilesFromBuffer1 ;restore screenBuffer from Backup - ld hl,ItemUseText00 + ld hl, ItemUseText00 call PrintText callab IsGhostBattle - ld b,$10 - jp z,.next12 - ld a,[wBattleType] + ld b, $10 + jp z, .next12 + ld a, [wBattleType] cp $1 - jr z,.oldManBattle + jr z, .oldManBattle cp $4 - jr z,.oldManBattle ; pikachu battle technically old man battle + jr z, .oldManBattle ; pikachu battle technically old man battle jr .notOldManBattle + .oldManBattle - ld hl,wGrassRate - ld de,wPlayerName - ld bc,NAME_LENGTH + ld hl, wGrassRate + ld de, wPlayerName + ld bc, NAME_LENGTH call CopyData ; save the player's name in the Wild Monster data ld a, [wBattleType] cp $1 - jp nz,.BallSuccess - ld a,$1 + jp nz, .BallSuccess + ld a, $1 ld [wCapturedMonSpecies], a ld a, [wd74c] bit 7, a ld b, $63 - jp nz,.next12 + jp nz, .next12 jp .BallSuccess + .notOldManBattle - ld a,[wCurMap] - cp a,POKEMONTOWER_6 - jr nz,.loop - ld a,[wEnemyMonSpecies2] - cp a,MAROWAK - ld b,$10 - jp z,.next12 + ld a, [wCurMap] + cp a, POKEMONTOWER_6 + jr nz, .loop + ld a, [wEnemyMonSpecies2] + cp a, MAROWAK + ld b, $10 + jp z, .next12 ; if not fighting ghost Marowak, loop until a random number in the current ; pokeball's allowed range is found .loop call Random - ld b,a - ld hl,wcf91 + ld b, a + ld hl, wcf91 .asm_d54a - ld a,[hl] - cp a,MASTER_BALL - jp z,.BallSuccess - cp a,POKE_BALL - jr z,.checkForAilments - ld a,200 + ld a, [hl] + cp a, MASTER_BALL + jp z, .BallSuccess + cp a, POKE_BALL + jr z, .checkForAilments + ld a, 200 cp b - jr c,.loop ;get only numbers <= 200 for Great Ball - ld a,[hl] - cp a,GREAT_BALL - jr z,.checkForAilments - ld a,150 ;get only numbers <= 150 for Ultra Ball + jr c, .loop ;get only numbers <= 200 for Great Ball + ld a, [hl] + cp a, GREAT_BALL + jr z, .checkForAilments + ld a, 150 ;get only numbers <= 150 for Ultra Ball cp b - jr c,.loop + jr c, .loop .checkForAilments ; pokemon can be caught more easily with any (primary) status ailment ; Frozen/Asleep pokemon are relatively even easier to catch ; for Frozen/Asleep pokemon, any random number from 0-24 ensures a catch. ; for the others, a random number from 0-11 ensures a catch. - ld a,[wEnemyMonStatus] ;status ailments + ld a, [wEnemyMonStatus] ;status ailments and a - jr z,.noAilments + jr z, .noAilments and a, 1 << FRZ | SLP ;is frozen and/or asleep? - ld c,12 - jr z,.notFrozenOrAsleep - ld c,25 + ld c, 12 + jr z, .notFrozenOrAsleep + ld c, 25 .notFrozenOrAsleep - ld a,b + ld a, b sub c - jp c,.BallSuccess - ld b,a + jp c, .BallSuccess + ld b, a .noAilments push bc ;save RANDOM number xor a - ld [H_MULTIPLICAND],a - ld hl,wEnemyMonMaxHP - ld a,[hli] - ld [H_MULTIPLICAND + 1],a - ld a,[hl] - ld [H_MULTIPLICAND + 2],a - ld a,255 - ld [H_MULTIPLIER],a + ld [H_MULTIPLICAND], a + ld hl, wEnemyMonMaxHP + ld a, [hli] + ld [H_MULTIPLICAND + 1], a + ld a, [hl] + ld [H_MULTIPLICAND + 2], a + ld a, 255 + ld [H_MULTIPLIER], a call Multiply ; MaxHP * 255 - ld a,[wcf91] + ld a, [wcf91] cp GREAT_BALL - ld a,12 ;any other BallFactor - jr nz,.next7 - ld a,8 + ld a, 12 ;any other BallFactor + jr nz, .next7 + ld a, 8 .next7 - ld [H_DIVISOR],a - ld b,4 ; number of bytes in dividend + ld [H_DIVISOR], a + ld b, 4 ; number of bytes in dividend call Divide - ld hl,wEnemyMonHP - ld a,[hli] - ld b,a - ld a,[hl] + ld hl, wEnemyMonHP + ld a, [hli] + ld b, a + ld a, [hl] ; explanation: we have a 16-bit value equal to [b << 8 | a]. ; This number is divided by 4. The result is 8 bit (reg. a). @@ -239,242 +241,247 @@ ItemUseBall: ; d3ad (3:53ad) srl b rr a ; a = current HP / 4 and a - jr nz,.next8 + jr nz, .next8 inc a .next8 - ld [H_DIVISOR],a - ld b,4 + ld [H_DIVISOR], a + ld b, 4 call Divide ; ((MaxHP * 255) / BallFactor) / (CurHP / 4) - ld a,[H_QUOTIENT + 2] + ld a, [H_QUOTIENT + 2] and a - jr z,.next9 - ld a,255 - ld [H_QUOTIENT + 3],a + jr z, .next9 + ld a, 255 + ld [H_QUOTIENT + 3], a .next9 pop bc - ld a,[wEnemyMonCatchRate] ;enemy: Catch Rate + ld a, [wEnemyMonCatchRate] ;enemy: Catch Rate cp b - jr c,.next10 - ld a,[H_QUOTIENT + 2] + jr c, .next10 + ld a, [H_QUOTIENT + 2] and a - jr nz,.BallSuccess ; if ((MaxHP * 255) / BallFactor) / (CurHP / 4) > 0x255, automatic success + jr nz, .BallSuccess ; if ((MaxHP * 255) / BallFactor) / (CurHP / 4) > 0x255, automatic success call Random - ld b,a - ld a,[H_QUOTIENT + 3] + ld b, a + ld a, [H_QUOTIENT + 3] cp b - jr c,.next10 + jr c, .next10 .BallSuccess jr .BallSuccess2 + .next10 - ld a,[H_QUOTIENT + 3] - ld [wd11e],a + ld a, [H_QUOTIENT + 3] + ld [wd11e], a xor a - ld [H_MULTIPLICAND],a - ld [H_MULTIPLICAND + 1],a - ld a,[wEnemyMonCatchRate] ;enemy: Catch Rate - ld [H_MULTIPLICAND + 2],a - ld a,100 - ld [H_MULTIPLIER],a + ld [H_MULTIPLICAND], a + ld [H_MULTIPLICAND + 1], a + ld a, [wEnemyMonCatchRate] ;enemy: Catch Rate + ld [H_MULTIPLICAND + 2], a + ld a, 100 + ld [H_MULTIPLIER], a call Multiply ; CatchRate * 100 - ld a,[wcf91] - ld b,255 + ld a, [wcf91] + ld b, 255 cp POKE_BALL - jr z,.next11 - ld b,200 + jr z, .next11 + ld b, 200 cp GREAT_BALL - jr z,.next11 - ld b,150 + jr z, .next11 + ld b, 150 cp ULTRA_BALL - jr z,.next11 + jr z, .next11 .next11 - ld a,b - ld [H_DIVISOR],a - ld b,4 + ld a, b + ld [H_DIVISOR], a + ld b, 4 call Divide - ld a,[H_QUOTIENT + 2] + ld a, [H_QUOTIENT + 2] and a - ld b,$63 - jr nz,.next12 - ld a,[wd11e] - ld [H_MULTIPLIER],a + ld b, $63 + jr nz, .next12 + ld a, [wd11e] + ld [H_MULTIPLIER], a call Multiply - ld a,255 - ld [H_DIVISOR],a - ld b,4 + ld a, 255 + ld [H_DIVISOR], a + ld b, 4 call Divide - ld a,[wEnemyMonStatus] ;status ailments + ld a, [wEnemyMonStatus] ;status ailments and a - jr z,.next13 + jr z, .next13 and 1 << FRZ | SLP - ld b,5 - jr z,.next14 - ld b,10 + ld b, 5 + jr z, .next14 + ld b, 10 .next14 - ld a,[H_QUOTIENT + 3] + ld a, [H_QUOTIENT + 3] add b - ld [H_QUOTIENT + 3],a + ld [H_QUOTIENT + 3], a .next13 - ld a,[H_QUOTIENT + 3] - cp a,10 - ld b,$20 - jr c,.next12 - cp a,30 - ld b,$61 - jr c,.next12 - cp a,70 - ld b,$62 - jr c,.next12 - ld b,$63 + ld a, [H_QUOTIENT + 3] + cp a, 10 + ld b, $20 + jr c, .next12 + cp a, 30 + ld b, $61 + jr c, .next12 + cp a, 70 + ld b, $62 + jr c, .next12 + ld b, $63 .next12 - ld a,b - ld [wPokeBallAnimData],a + ld a, b + ld [wPokeBallAnimData], a .BallSuccess2 - ld c,20 + ld c, 20 call DelayFrames - ld a,TOSS_ANIM - ld [wAnimationID],a + ld a, TOSS_ANIM + ld [wAnimationID], a xor a - ld [H_WHOSETURN],a - ld [wAnimationType],a - ld [wDamageMultipliers],a - ld a,[wWhichPokemon] + ld [H_WHOSETURN], a + ld [wAnimationType], a + ld [wDamageMultipliers], a + ld a, [wWhichPokemon] push af - ld a,[wcf91] + ld a, [wcf91] push af predef MoveAnimation pop af - ld [wcf91],a + ld [wcf91], a pop af - ld [wWhichPokemon],a - ld a,[wPokeBallAnimData] - cp a,$10 - ld hl,ItemUseBallText00 - jp z,.printText0 - cp a,$20 - ld hl,ItemUseBallText01 - jp z,.printText0 - cp a,$61 - ld hl,ItemUseBallText02 - jp z,.printText0 - cp a,$62 - ld hl,ItemUseBallText03 - jp z,.printText0 - cp a,$63 - ld hl,ItemUseBallText04 - jp z,.printText0 - ld hl,wEnemyMonHP ;current HP - ld a,[hli] + ld [wWhichPokemon], a + ld a, [wPokeBallAnimData] + cp a, $10 + ld hl, ItemUseBallText00 + jp z, .printText0 + cp a, $20 + ld hl, ItemUseBallText01 + jp z, .printText0 + cp a, $61 + ld hl, ItemUseBallText02 + jp z, .printText0 + cp a, $62 + ld hl, ItemUseBallText03 + jp z, .printText0 + cp a, $63 + ld hl, ItemUseBallText04 + jp z, .printText0 + ld hl, wEnemyMonHP ;current HP + ld a, [hli] push af - ld a,[hli] + ld a, [hli] push af ;backup currentHP... inc hl - ld a,[hl] + ld a, [hl] push af ;...and status ailments push hl - ld hl,wEnemyBattleStatus3 - bit Transformed,[hl] - jr z,.next15 - ld a,$4c - ld [wEnemyMonSpecies2],a + ld hl, wEnemyBattleStatus3 + bit Transformed, [hl] + jr z, .next15 + ld a, $4c + ld [wEnemyMonSpecies2], a jr .next16 + .next15 - set Transformed,[hl] - ld hl,wTransformedEnemyMonOriginalDVs - ld a,[wEnemyMonDVs] - ld [hli],a - ld a,[wEnemyMonDVs + 1] - ld [hl],a + set Transformed, [hl] + ld hl, wTransformedEnemyMonOriginalDVs + ld a, [wEnemyMonDVs] + ld [hli], a + ld a, [wEnemyMonDVs + 1] + ld [hl], a .next16 - ld a,[wcf91] + ld a, [wcf91] push af - ld a,[wEnemyMonSpecies2] - ld [wcf91],a - ld a,[wEnemyMonLevel] - ld [wCurEnemyLVL],a + ld a, [wEnemyMonSpecies2] + ld [wcf91], a + ld a, [wEnemyMonLevel] + ld [wCurEnemyLVL], a callab LoadEnemyMonData pop af - ld [wcf91],a + ld [wcf91], a pop hl pop af - ld [hld],a + ld [hld], a dec hl pop af - ld [hld],a + ld [hld], a pop af - ld [hl],a - ld a,[wEnemyMonSpecies] ;enemy - ld [wCapturedMonSpecies],a - ld [wcf91],a - ld [wd11e],a - ld a,[wBattleType] + ld [hl], a + ld a, [wEnemyMonSpecies] ;enemy + ld [wCapturedMonSpecies], a + ld [wcf91], a + ld [wd11e], a + ld a, [wBattleType] cp $1 - jp z,.printText1 ; just barely out of reach for a relative jump + jp z, .printText1 ; just barely out of reach for a relative jump cp $4 - jr z,.printText1 - ld hl,ItemUseBallText05 + jr z, .printText1 + ld hl, ItemUseBallText05 call PrintText predef IndexToPokedex - ld a,[wd11e] + ld a, [wd11e] dec a - ld c,a - ld b,FLAG_TEST - ld hl,wPokedexOwned + ld c, a + ld b, FLAG_TEST + ld hl, wPokedexOwned predef FlagActionPredef - ld a,c + ld a, c push af - ld a,[wd11e] + ld a, [wd11e] dec a - ld c,a - ld b,FLAG_SET + ld c, a + ld b, FLAG_SET predef FlagActionPredef pop af and a - jr nz,.checkParty - ld hl,ItemUseBallText06 + jr nz, .checkParty + ld hl, ItemUseBallText06 call PrintText call ClearSprites - ld a,[wEnemyMonSpecies] ;caught mon_ID - ld [wd11e],a + ld a, [wEnemyMonSpecies] ;caught mon_ID + ld [wd11e], a predef ShowPokedexData .checkParty ld a, $1 ld [wd49c], a ld a, $85 ld [wPikachuMood], a - ld a,[wPartyCount] + ld a, [wPartyCount] cp PARTY_LENGTH ;is party full? - jr z,.sendToBox + jr z, .sendToBox xor a ; PLAYER_PARTY_DATA - ld [wMonDataLocation],a + ld [wMonDataLocation], a call ClearSprites ld hl, .emptyString call PrintText call AddPartyMon ;add mon to Party jr .End + .sendToBox call ClearSprites call SendNewMonToBox - ld hl,ItemUseBallText07 + ld hl, ItemUseBallText07 ld a, [wd7f1] bit 0, a - jr nz,.sendToBox2 - ld hl,ItemUseBallText08 + jr nz, .sendToBox2 + ld hl, ItemUseBallText08 .sendToBox2 call PrintText jr .End + .printText1 - ld hl,ItemUseBallText05 + ld hl, ItemUseBallText05 .printText0 call PrintText call ClearSprites .End - ld a,[wBattleType] + ld a, [wBattleType] and a ret nz - ld hl,wNumBagItems + ld hl, wNumBagItems inc a - ld [wItemQuantity],a + ld [wItemQuantity], a jp RemoveItemFromInventory + .emptyString db "@" @@ -503,7 +510,7 @@ ItemUseBallText05: ; d6b0 (3:56b0) ;"All right! {MonName} was caught!" ;play sound TX_FAR _ItemUseBallText05 - db $12,$06 + db $12, $06 db "@" ItemUseBallText07: ; d6b7 (3:59b7) ;"X was transferred to Bill's PC" @@ -518,46 +525,47 @@ ItemUseBallText06: ; d6c1 (3:56c1) ;"New DEX data will be added..." ;play sound TX_FAR _ItemUseBallText06 - db $13,$06 + db $13, $06 db "@" ItemUseTownMap: ; d6c8 (3:56c8) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jp nz,ItemUseNotTime + jp nz, ItemUseNotTime jpba DisplayTownMap ItemUseBicycle: ; d6d7 (3:56d7) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jp nz,ItemUseNotTime - ld a,[wWalkBikeSurfState] - ld [wWalkBikeSurfStateCopy],a - cp a,2 ; is the player surfing? - jp z,ItemUseNotTime + jp nz, ItemUseNotTime + ld a, [wWalkBikeSurfState] + ld [wWalkBikeSurfStateCopy], a + cp a, 2 ; is the player surfing? + jp z, ItemUseNotTime dec a ; is player already bicycling? - jr nz,.tryToGetOnBike + jr nz, .tryToGetOnBike .getOffBike call ItemUseReloadOverworldData xor a - ld [wWalkBikeSurfState],a ; change player state to walking + ld [wWalkBikeSurfState], a ; change player state to walking ld a, $00 - ld [wd431], a + ld [wPikachuSpawnState], a call PlayDefaultMusic ; play walking music - ld hl,GotOffBicycleText + ld hl, GotOffBicycleText jp PrintText + .tryToGetOnBike call IsBikeRidingAllowed - jp nc,NoCyclingAllowedHere + jp nc, NoCyclingAllowedHere call ItemUseReloadOverworldData xor a ; no keys pressed - ld [hJoyHeld],a ; current joypad state + ld [hJoyHeld], a ; current joypad state ld a, $1 - ld [wWalkBikeSurfState],a ; change player state to bicycling + ld [wWalkBikeSurfState], a ; change player state to bicycling call PlayDefaultMusic ; play bike riding music xor a - ld [wWalkBikeSurfState],a - ld hl,GotOnBicycleText + ld [wWalkBikeSurfState], a + ld hl, GotOnBicycleText call PrintText ld a, $1 ld [wWalkBikeSurfState], a @@ -565,79 +573,82 @@ ItemUseBicycle: ; d6d7 (3:56d7) ; used for Surf out-of-battle effect ItemUseSurfboard: ; d725 (3:5725) - ld a,[wWalkBikeSurfState] - ld [wWalkBikeSurfStateCopy],a - cp a,2 ; is the player already surfing? - jr z,.tryToStopSurfing + ld a, [wWalkBikeSurfState] + ld [wWalkBikeSurfStateCopy], a + cp a, 2 ; is the player already surfing? + jr z, .tryToStopSurfing .tryToSurf call IsNextTileShoreOrWater - jp nc,SurfingAttemptFailed - ld hl,TilePairCollisionsWater + jp nc, SurfingAttemptFailed + ld hl, TilePairCollisionsWater call CheckForTilePairCollisions - jp c,SurfingAttemptFailed + jp c, SurfingAttemptFailed .surf call .makePlayerMoveForward - ld hl,wd730 - set 7,[hl] - ld a,2 - ld [wWalkBikeSurfState],a ; change player state to surfing + ld hl, wd730 + set 7, [hl] + ld a, 2 + ld [wWalkBikeSurfState], a ; change player state to surfing call PlayDefaultMusic ; play surfing music - ld hl,SurfingGotOnText + ld hl, SurfingGotOnText jp PrintText + .tryToStopSurfing xor a - ld [hSpriteIndexOrTextID],a - ld d,16 ; talking range in pixels (normal range) + ld [hSpriteIndexOrTextID], a + ld d, 16 ; talking range in pixels (normal range) call IsSpriteInFrontOfPlayer2 - res 7,[hl] - ld a,[hSpriteIndexOrTextID] + res 7, [hl] + ld a, [hSpriteIndexOrTextID] and a ; is there a sprite in the way? - jr nz,.cannotStopSurfing - ld hl,TilePairCollisionsWater + jr nz, .cannotStopSurfing + ld hl, TilePairCollisionsWater call CheckForTilePairCollisions - jr c,.cannotStopSurfing - ld a,[wTileInFrontOfPlayer] - ld c,a + jr c, .cannotStopSurfing + ld a, [wTileInFrontOfPlayer] + ld c, a call IsTilePassable - jr nc,.stopSurfing + jr nc, .stopSurfing .cannotStopSurfing - ld hl,SurfingNoPlaceToGetOffText + ld hl, SurfingNoPlaceToGetOffText jp PrintText + .stopSurfing call .makePlayerMoveForward - ld a,$3 - ld [wd431], a - ld hl,wPikachuOverworldStateFlags - set 5,[hl] - ld hl,wd730 - set 7,[hl] + ld a, $3 + ld [wPikachuSpawnState], a + ld hl, wPikachuOverworldStateFlags + set 5, [hl] + ld hl, wd730 + set 7, [hl] xor a - ld [wWalkBikeSurfState],a ; change player state to walking + ld [wWalkBikeSurfState], a ; change player state to walking dec a - ld [wJoyIgnore],a + ld [wJoyIgnore], a call PlayDefaultMusic ; play walking music call GBPalWhiteOutWithDelay3 jp LoadWalkingPlayerSpriteGraphics + ; uses a simulated button press to make the player move forward .makePlayerMoveForward - ld a,[wPlayerDirection] ; direction the player is going - bit PLAYER_DIR_BIT_UP,a - ld b,D_UP - jr nz,.storeSimulatedButtonPress - bit PLAYER_DIR_BIT_DOWN,a - ld b,D_DOWN - jr nz,.storeSimulatedButtonPress - bit PLAYER_DIR_BIT_LEFT,a - ld b,D_LEFT - jr nz,.storeSimulatedButtonPress - ld b,D_RIGHT + ld a, [wPlayerDirection] ; direction the player is going + bit PLAYER_DIR_BIT_UP, a + ld b, D_UP + jr nz, .storeSimulatedButtonPress + bit PLAYER_DIR_BIT_DOWN, a + ld b, D_DOWN + jr nz, .storeSimulatedButtonPress + bit PLAYER_DIR_BIT_LEFT, a + ld b, D_LEFT + jr nz, .storeSimulatedButtonPress + ld b, D_RIGHT .storeSimulatedButtonPress - ld a,b - ld [wSimulatedJoypadStatesEnd],a + ld a, b + ld [wSimulatedJoypadStatesEnd], a xor a - ld [wWastedByteCD39],a + ld [wWastedByteCD39], a inc a - ld [wSimulatedJoypadStatesIndex],a + ld [wSimulatedJoypadStatesIndex], a ret SurfingGotOnText: ; d7c1 (3:57c1) @@ -652,25 +663,25 @@ ItemUsePokedex: ; d7cb (3:57cb) predef_jump ShowPokedexMenu ItemUseEvoStone: ; d7d0 (3:57d0) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jp nz,ItemUseNotTime - ld a,[wWhichPokemon] + jp nz, ItemUseNotTime + ld a, [wWhichPokemon] push af - ld a,[wcf91] - ld [wEvoStoneItemID],a + ld a, [wcf91] + ld [wEvoStoneItemID], a push af - ld a,EVO_STONE_PARTY_MENU - ld [wPartyMenuTypeOrMessageID],a - ld a,$ff - ld [wUpdateSpritesEnabled],a + ld a, EVO_STONE_PARTY_MENU + ld [wPartyMenuTypeOrMessageID], a + ld a, $ff + ld [wUpdateSpritesEnabled], a call DisplayPartyMenu ld a, [wcf91] ld [wLoadedMon], a pop bc - jr c,.canceledItemUse - ld a,b - ld [wcf91],a + jr c, .canceledItemUse + ld a, b + ld [wcf91], a call Func_d85d jr nc, .noEffect callab IsThisPartymonStarterPikachu_Party @@ -687,24 +698,26 @@ ItemUseEvoStone: ; d7d0 (3:57d0) ld a, $82 ld [wPikachuMood], a jr .canceledItemUse + .notPlayerPikachu - ld a,SFX_HEAL_AILMENT + ld a, SFX_HEAL_AILMENT call PlaySoundWaitForCurrent call WaitForSoundToFinish - ld a,$01 - ld [wForceEvolution],a + ld a, $01 + ld [wForceEvolution], a callab TryEvolvingMon ; try to evolve pokemon pop af - ld [wWhichPokemon],a - ld hl,wNumBagItems - ld a,1 ; remove 1 stone - ld [wItemQuantity],a + ld [wWhichPokemon], a + ld hl, wNumBagItems + ld a, 1 ; remove 1 stone + ld [wItemQuantity], a jp RemoveItemFromInventory + .noEffect call ItemUseNoEffect .canceledItemUse xor a - ld [wActionResultOrTookBattleTurn],a ; item not used + ld [wActionResultOrTookBattleTurn], a ; item not used pop af ret @@ -748,6 +761,7 @@ Func_d85d: ; d85d (3:585d) jr nz, .loop scf ret + .cannotEvolveWithUsedStone and a ret @@ -757,42 +771,43 @@ RefusingText: ; d8a2 (3:58a2) db "@" ItemUseVitamin: ; d8a7 (3:58a7) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jp nz,ItemUseNotTime + jp nz, ItemUseNotTime ItemUseMedicine: ; d8ae (3:58ae) - ld a,[wPartyCount] + ld a, [wPartyCount] and a - jp z,Func_e4bf - ld a,[wWhichPokemon] + jp z, Func_e4bf + ld a, [wWhichPokemon] push af - ld a,[wcf91] + ld a, [wcf91] push af - ld a,USE_ITEM_PARTY_MENU - ld [wPartyMenuTypeOrMessageID],a - ld a,$ff - ld [wUpdateSpritesEnabled],a - ld a,[wPseudoItemID] + ld a, USE_ITEM_PARTY_MENU + ld [wPartyMenuTypeOrMessageID], a + ld a, $ff + ld [wUpdateSpritesEnabled], a + ld a, [wPseudoItemID] and a ; using Softboiled? - jr z,.notUsingSoftboiled + jr z, .notUsingSoftboiled ; if using softboiled call GoBackToPartyMenu jr .getPartyMonDataAddress + .notUsingSoftboiled call DisplayPartyMenu .getPartyMonDataAddress - jp c,.canceledItemUse - ld hl,wPartyMons - ld bc,wPartyMon2 - wPartyMon1 - ld a,[wWhichPokemon] + jp c, .canceledItemUse + ld hl, wPartyMons + ld bc, wPartyMon2 - wPartyMon1 + ld a, [wWhichPokemon] call AddNTimes - ld a,[wWhichPokemon] - ld [wUsedItemOnWhichPokemon],a - ld d,a - ld a,[wcf91] - ld e,a - ld [wd0b5],a + ld a, [wWhichPokemon] + ld [wUsedItemOnWhichPokemon], a + ld d, a + ld a, [wcf91] + ld e, a + ld [wd0b5], a pop af push af cp $28 @@ -804,90 +819,92 @@ ItemUseMedicine: ; d8ae (3:58ae) pop hl .asm_d906 pop af - ld [wcf91],a + ld [wcf91], a pop af - ld [wWhichPokemon],a - ld a,[wPseudoItemID] + ld [wWhichPokemon], a + ld a, [wPseudoItemID] and a ; using Softboiled? - jr z,.checkItemType + jr z, .checkItemType ; if using softboiled - ld a,[wWhichPokemon] + ld a, [wWhichPokemon] cp d ; is the pokemon trying to use softboiled on itself? - jr z,ItemUseMedicine ; if so, force another choice + jr z, ItemUseMedicine ; if so, force another choice .checkItemType - ld a,[wcf91] - cp a,REVIVE - jr nc,.healHP ; if it's a Revive or Max Revive - cp a,FULL_HEAL - jr z,.cureStatusAilment ; if it's a Full Heal - cp a,HP_UP - jp nc,.useVitamin ; if it's a vitamin or Rare Candy - cp a,FULL_RESTORE - jr nc,.healHP ; if it's a Full Restore or one of the potions + ld a, [wcf91] + cp a, REVIVE + jr nc, .healHP ; if it's a Revive or Max Revive + cp a, FULL_HEAL + jr z, .cureStatusAilment ; if it's a Full Heal + cp a, HP_UP + jp nc, .useVitamin ; if it's a vitamin or Rare Candy + cp a, FULL_RESTORE + jr nc, .healHP ; if it's a Full Restore or one of the potions ; fall through if it's one of the status-specifc healing items .cureStatusAilment - ld bc,4 - add hl,bc ; hl now points to status - ld a,[wcf91] + ld bc, 4 + add hl, bc ; hl now points to status + ld a, [wcf91] lb bc, ANTIDOTE_MSG, 1 << PSN - cp a,ANTIDOTE - jr z,.checkMonStatus + cp a, ANTIDOTE + jr z, .checkMonStatus lb bc, BURN_HEAL_MSG, 1 << BRN - cp a,BURN_HEAL - jr z,.checkMonStatus + cp a, BURN_HEAL + jr z, .checkMonStatus lb bc, ICE_HEAL_MSG, 1 << FRZ - cp a,ICE_HEAL - jr z,.checkMonStatus + cp a, ICE_HEAL + jr z, .checkMonStatus lb bc, AWAKENING_MSG, SLP - cp a,AWAKENING - jr z,.checkMonStatus + cp a, AWAKENING + jr z, .checkMonStatus lb bc, PARALYZ_HEAL_MSG, 1 << PAR - cp a,PARLYZ_HEAL - jr z,.checkMonStatus + cp a, PARLYZ_HEAL + jr z, .checkMonStatus lb bc, FULL_HEAL_MSG, $ff ; Full Heal .checkMonStatus - ld a,[hl] ; pokemon's status + ld a, [hl] ; pokemon's status and c ; does the pokemon have a status ailment the item can cure? - jp z,.healingItemNoEffect + jp z, .healingItemNoEffect ; if the pokemon has a status the item can heal xor a - ld [hl],a ; remove the status ailment in the party data - ld a,b - ld [wPartyMenuTypeOrMessageID],a ; the message to display for the item used - ld a,[wPlayerMonNumber] + ld [hl], a ; remove the status ailment in the party data + ld a, b + ld [wPartyMenuTypeOrMessageID], a ; the message to display for the item used + ld a, [wPlayerMonNumber] cp d ; is pokemon the item was used on active in battle? - jp nz,.doneHealing + jp nz, .doneHealing ; if it is active in battle xor a - ld [wBattleMonStatus],a ; remove the status ailment in the in-battle pokemon data + ld [wBattleMonStatus], a ; remove the status ailment in the in-battle pokemon data push hl - ld hl,wPlayerBattleStatus3 - res BadlyPoisoned,[hl] ; heal Toxic status + ld hl, wPlayerBattleStatus3 + res BadlyPoisoned, [hl] ; heal Toxic status pop hl - ld bc,30 - add hl,bc ; hl now points to party stats - ld de,wBattleMonMaxHP - ld bc,10 + ld bc, 30 + add hl, bc ; hl now points to party stats + ld de, wBattleMonMaxHP + ld bc, 10 call CopyData ; copy party stats to in-battle stat data predef DoubleOrHalveSelectedStats jp .doneHealing + .healHP inc hl ; hl = address of current HP - ld a,[hli] - ld b,a - ld [wHPBarOldHP+1],a - ld a,[hl] - ld c,a - ld [wHPBarOldHP],a ; current HP stored at wHPBarOldHP (2 bytes, big-endian) + ld a, [hli] + ld b, a + ld [wHPBarOldHP+1], a + ld a, [hl] + ld c, a + ld [wHPBarOldHP], a ; current HP stored at wHPBarOldHP (2 bytes, big-endian) or b - jr nz,.notFainted + jr nz, .notFainted .fainted - ld a,[wcf91] - cp a,REVIVE - jr z,.updateInBattleFaintedData - cp a,MAX_REVIVE - jr z,.updateInBattleFaintedData + ld a, [wcf91] + cp a, REVIVE + jr z, .updateInBattleFaintedData + cp a, MAX_REVIVE + jr z, .updateInBattleFaintedData jp .healingItemNoEffect + .updateInBattleFaintedData ld a, [wWhichPokemon] push af @@ -903,486 +920,499 @@ ItemUseMedicine: ; d8ae (3:58ae) pop af ld [wWhichPokemon], a - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jr z,.compareCurrentHPToMaxHP + jr z, .compareCurrentHPToMaxHP push hl push de push bc - ld a,[wUsedItemOnWhichPokemon] - ld c,a - ld hl,wPartyFoughtCurrentEnemyFlags - ld b,FLAG_TEST + ld a, [wUsedItemOnWhichPokemon] + ld c, a + ld hl, wPartyFoughtCurrentEnemyFlags + ld b, FLAG_TEST predef FlagActionPredef - ld a,c + ld a, c and a - jr z,.next - ld a,[wUsedItemOnWhichPokemon] - ld c,a - ld hl,wPartyGainExpFlags - ld b,FLAG_SET + jr z, .next + ld a, [wUsedItemOnWhichPokemon] + ld c, a + ld hl, wPartyGainExpFlags + ld b, FLAG_SET predef FlagActionPredef .next pop bc pop de pop hl jr .compareCurrentHPToMaxHP + .notFainted - ld a,[wcf91] - cp a,REVIVE - jp z,.healingItemNoEffect - cp a,MAX_REVIVE - jp z,.healingItemNoEffect + ld a, [wcf91] + cp a, REVIVE + jp z, .healingItemNoEffect + cp a, MAX_REVIVE + jp z, .healingItemNoEffect .compareCurrentHPToMaxHP push hl push bc - ld bc,32 - add hl,bc ; hl now points to max HP + ld bc, 32 + add hl, bc ; hl now points to max HP pop bc - ld a,[hli] + ld a, [hli] cp b - jr nz,.skipComparingLSB ; no need to compare the LSB's if the MSB's don't match - ld a,[hl] + jr nz, .skipComparingLSB ; no need to compare the LSB's if the MSB's don't match + ld a, [hl] cp c .skipComparingLSB pop hl - jr nz,.notFullHP + jr nz, .notFullHP .fullHP ; if the pokemon's current HP equals its max HP - ld a,[wcf91] - cp a,FULL_RESTORE - jp nz,.healingItemNoEffect + ld a, [wcf91] + cp a, FULL_RESTORE + jp nz, .healingItemNoEffect inc hl inc hl - ld a,[hld] ; status ailment + ld a, [hld] ; status ailment and a ; does the pokemon have a status ailment? - jp z,.healingItemNoEffect - ld a,FULL_HEAL - ld [wcf91],a + jp z, .healingItemNoEffect + ld a, FULL_HEAL + ld [wcf91], a dec hl dec hl dec hl jp .cureStatusAilment + .notFullHP ; if the pokemon's current HP doesn't equal its max HP xor a - ld [wLowHealthAlarm],a ;disable low health alarm - ld [wChannelSoundIDs + CH4],a + ld [wLowHealthAlarm], a ;disable low health alarm + ld [wChannelSoundIDs + CH4], a push hl push de - ld bc,32 - add hl,bc ; hl now points to max HP - ld a,[hli] - ld [wHPBarMaxHP+1],a - ld a,[hl] - ld [wHPBarMaxHP],a ; max HP stored at wHPBarMaxHP (2 bytes, big-endian) - ld a,[wPseudoItemID] + ld bc, 32 + add hl, bc ; hl now points to max HP + ld a, [hli] + ld [wHPBarMaxHP+1], a + ld a, [hl] + ld [wHPBarMaxHP], a ; max HP stored at wHPBarMaxHP (2 bytes, big-endian) + ld a, [wPseudoItemID] and a ; using Softboiled? - jp z,.notUsingSoftboiled2 + jp z, .notUsingSoftboiled2 ; if using softboiled - ld hl,wHPBarMaxHP - ld a,[hli] + ld hl, wHPBarMaxHP + ld a, [hli] push af - ld a,[hli] + ld a, [hli] push af - ld a,[hli] + ld a, [hli] push af - ld a,[hl] + ld a, [hl] push af - ld hl,wPartyMon1MaxHP - ld a,[wWhichPokemon] - ld bc,wPartyMon2 - wPartyMon1 + ld hl, wPartyMon1MaxHP + ld a, [wWhichPokemon] + ld bc, wPartyMon2 - wPartyMon1 call AddNTimes - ld a,[hli] - ld [wHPBarMaxHP + 1],a - ld [H_DIVIDEND],a - ld a,[hl] - ld [wHPBarMaxHP],a - ld [H_DIVIDEND + 1],a - ld a,5 - ld [H_DIVISOR],a - ld b,2 ; number of bytes + ld a, [hli] + ld [wHPBarMaxHP + 1], a + ld [H_DIVIDEND], a + ld a, [hl] + ld [wHPBarMaxHP], a + ld [H_DIVIDEND + 1], a + ld a, 5 + ld [H_DIVISOR], a + ld b, 2 ; number of bytes call Divide ; get 1/5 of max HP of pokemon that used Softboiled - ld bc,wPartyMon1HP - wPartyMon1MaxHP - add hl,bc ; hl now points to LSB of current HP of pokemon that used Softboiled + ld bc, wPartyMon1HP - wPartyMon1MaxHP + add hl, bc ; hl now points to LSB of current HP of pokemon that used Softboiled ; subtract 1/5 of max HP from current HP of pokemon that used Softboiled - ld a,[H_QUOTIENT + 3] + ld a, [H_QUOTIENT + 3] push af - ld b,a - ld a,[hl] - ld [wHPBarOldHP],a + ld b, a + ld a, [hl] + ld [wHPBarOldHP], a sub b - ld [hld],a - ld [wHPBarNewHP],a - ld a,[H_QUOTIENT + 2] - ld b,a - ld a,[hl] - ld [wHPBarOldHP+1],a + ld [hld], a + ld [wHPBarNewHP], a + ld a, [H_QUOTIENT + 2] + ld b, a + ld a, [hl] + ld [wHPBarOldHP+1], a sbc b - ld [hl],a - ld [wHPBarNewHP+1],a + ld [hl], a + ld [wHPBarNewHP+1], a coord hl, 4, 1 - ld a,[wWhichPokemon] - ld bc,2 * SCREEN_WIDTH + ld a, [wWhichPokemon] + ld bc, 2 * SCREEN_WIDTH call AddNTimes ; calculate coordinates of HP bar of pokemon that used Softboiled - ld a,SFX_HEAL_HP + ld a, SFX_HEAL_HP call PlaySoundWaitForCurrent - ld a,[hFlags_0xFFFA] - set 0,a - ld [hFlags_0xFFFA],a - ld a,$02 - ld [wHPBarType],a + ld a, [hFlags_0xFFFA] + set 0, a + ld [hFlags_0xFFFA], a + ld a, $02 + ld [wHPBarType], a predef UpdateHPBar2 ; animate HP bar decrease of pokemon that used Softboiled - ld a,[hFlags_0xFFFA] - res 0,a - ld [hFlags_0xFFFA],a + ld a, [hFlags_0xFFFA] + res 0, a + ld [hFlags_0xFFFA], a pop af - ld b,a ; store heal amount (1/5 of max HP) - ld hl,wHPBarOldHP + 1 + ld b, a ; store heal amount (1/5 of max HP) + ld hl, wHPBarOldHP + 1 pop af - ld [hld],a + ld [hld], a pop af - ld [hld],a + ld [hld], a pop af - ld [hld],a + ld [hld], a pop af - ld [hl],a + ld [hl], a jr .addHealAmount + .notUsingSoftboiled2 - ld a,[wcf91] - cp a,SODA_POP - ld b,60 ; Soda Pop heal amount - jr z,.addHealAmount - ld b,80 ; Lemonade heal amount - jr nc,.addHealAmount - cp a,FRESH_WATER - ld b,50 ; Fresh Water heal amount - jr z,.addHealAmount - cp a,SUPER_POTION - ld b,200 ; Hyper Potion heal amount - jr c,.addHealAmount - ld b,50 ; Super Potion heal amount - jr z,.addHealAmount - ld b,20 ; Potion heal amount + ld a, [wcf91] + cp a, SODA_POP + ld b, 60 ; Soda Pop heal amount + jr z, .addHealAmount + ld b, 80 ; Lemonade heal amount + jr nc, .addHealAmount + cp a, FRESH_WATER + ld b, 50 ; Fresh Water heal amount + jr z, .addHealAmount + cp a, SUPER_POTION + ld b, 200 ; Hyper Potion heal amount + jr c, .addHealAmount + ld b, 50 ; Super Potion heal amount + jr z, .addHealAmount + ld b, 20 ; Potion heal amount .addHealAmount pop de pop hl - ld a,[hl] + ld a, [hl] add b - ld [hld],a - ld [wHPBarNewHP],a - ld a,[hl] - ld [wHPBarNewHP+1],a - jr nc,.noCarry + ld [hld], a + ld [wHPBarNewHP], a + ld a, [hl] + ld [wHPBarNewHP+1], a + jr nc, .noCarry inc [hl] - ld a,[hl] - ld [wHPBarNewHP + 1],a + ld a, [hl] + ld [wHPBarNewHP + 1], a .noCarry push de inc hl - ld d,h - ld e,l ; de now points to current HP - ld hl,33 - add hl,de ; hl now points to max HP - ld a,[wcf91] - cp a,REVIVE - jr z,.setCurrentHPToHalfMaxHP - ld a,[hld] - ld b,a - ld a,[de] + ld d, h + ld e, l ; de now points to current HP + ld hl, 33 + add hl, de ; hl now points to max HP + ld a, [wcf91] + cp a, REVIVE + jr z, .setCurrentHPToHalfMaxHP + ld a, [hld] + ld b, a + ld a, [de] sub b dec de - ld b,[hl] - ld a,[de] + ld b, [hl] + ld a, [de] sbc b - jr nc,.setCurrentHPToMaxHp ; if current HP exceeds max HP after healing - ld a,[wcf91] - cp a,HYPER_POTION - jr c,.setCurrentHPToMaxHp ; if using a Full Restore or Max Potion - cp a,MAX_REVIVE - jr z,.setCurrentHPToMaxHp ; if using a Max Revive + jr nc, .setCurrentHPToMaxHp ; if current HP exceeds max HP after healing + ld a, [wcf91] + cp a, HYPER_POTION + jr c, .setCurrentHPToMaxHp ; if using a Full Restore or Max Potion + cp a, MAX_REVIVE + jr z, .setCurrentHPToMaxHp ; if using a Max Revive jr .updateInBattleData + .setCurrentHPToHalfMaxHP dec hl dec de - ld a,[hli] + ld a, [hli] srl a - ld [de],a - ld [wHPBarNewHP+1],a - ld a,[hl] + ld [de], a + ld [wHPBarNewHP+1], a + ld a, [hl] rr a inc de - ld [de],a - ld [wHPBarNewHP],a + ld [de], a + ld [wHPBarNewHP], a dec de jr .doneHealingPartyHP + .setCurrentHPToMaxHp - ld a,[hli] - ld [de],a - ld [wHPBarNewHP+1],a + ld a, [hli] + ld [de], a + ld [wHPBarNewHP+1], a inc de - ld a,[hl] - ld [de],a - ld [wHPBarNewHP],a + ld a, [hl] + ld [de], a + ld [wHPBarNewHP], a dec de .doneHealingPartyHP ; done updating the pokemon's current HP in the party data structure - ld a,[wcf91] - cp a,FULL_RESTORE - jr nz,.updateInBattleData - ld bc,-31 - add hl,bc + ld a, [wcf91] + cp a, FULL_RESTORE + jr nz, .updateInBattleData + ld bc, -31 + add hl, bc xor a - ld [hl],a ; remove the status ailment in the party data + ld [hl], a ; remove the status ailment in the party data .updateInBattleData - ld h,d - ld l,e + ld h, d + ld l, e pop de - ld a,[wPlayerMonNumber] + ld a, [wPlayerMonNumber] cp d ; is pokemon the item was used on active in battle? - jr nz,.calculateHPBarCoords + jr nz, .calculateHPBarCoords ; copy party HP to in-battle HP - ld a,[hli] - ld [wBattleMonHP],a - ld a,[hld] - ld [wBattleMonHP + 1],a - ld a,[wcf91] - cp a,FULL_RESTORE - jr nz,.calculateHPBarCoords + ld a, [hli] + ld [wBattleMonHP], a + ld a, [hld] + ld [wBattleMonHP + 1], a + ld a, [wcf91] + cp a, FULL_RESTORE + jr nz, .calculateHPBarCoords xor a - ld [wBattleMonStatus],a ; remove the status ailment in the in-battle pokemon data + ld [wBattleMonStatus], a ; remove the status ailment in the in-battle pokemon data .calculateHPBarCoords - ld hl,wOAMBuffer + $90 - ld bc,2 * 20 + ld hl, wOAMBuffer + $90 + ld bc, 2 * 20 inc d .calculateHPBarCoordsLoop - add hl,bc + add hl, bc dec d - jr nz,.calculateHPBarCoordsLoop + jr nz, .calculateHPBarCoordsLoop jr .doneHealing + .healingItemNoEffect call ItemUseNoEffect jp .done + .doneHealing - ld a,[wPseudoItemID] + ld a, [wPseudoItemID] and a ; using Softboiled? - jr nz,.skipRemovingItem ; no item to remove if using Softboiled + jr nz, .skipRemovingItem ; no item to remove if using Softboiled push hl call RemoveUsedItem pop hl .skipRemovingItem - ld a,[wcf91] - cp a,FULL_RESTORE - jr c,.playStatusAilmentCuringSound - cp a,FULL_HEAL - jr z,.playStatusAilmentCuringSound - ld a,SFX_HEAL_HP + ld a, [wcf91] + cp a, FULL_RESTORE + jr c, .playStatusAilmentCuringSound + cp a, FULL_HEAL + jr z, .playStatusAilmentCuringSound + ld a, SFX_HEAL_HP call PlaySoundWaitForCurrent - ld a,[hFlags_0xFFFA] - set 0,a - ld [hFlags_0xFFFA],a - ld a,$02 - ld [wHPBarType],a + ld a, [hFlags_0xFFFA] + set 0, a + ld [hFlags_0xFFFA], a + ld a, $02 + ld [wHPBarType], a predef UpdateHPBar2 ; animate the HP bar lengthening - ld a,[hFlags_0xFFFA] - res 0,a - ld [hFlags_0xFFFA],a - ld a,REVIVE_MSG - ld [wPartyMenuTypeOrMessageID],a - ld a,[wcf91] - cp a,REVIVE - jr z,.showHealingItemMessage - cp a,MAX_REVIVE - jr z,.showHealingItemMessage - ld a,POTION_MSG - ld [wPartyMenuTypeOrMessageID],a + ld a, [hFlags_0xFFFA] + res 0, a + ld [hFlags_0xFFFA], a + ld a, REVIVE_MSG + ld [wPartyMenuTypeOrMessageID], a + ld a, [wcf91] + cp a, REVIVE + jr z, .showHealingItemMessage + cp a, MAX_REVIVE + jr z, .showHealingItemMessage + ld a, POTION_MSG + ld [wPartyMenuTypeOrMessageID], a jr .showHealingItemMessage + .playStatusAilmentCuringSound - ld a,SFX_HEAL_AILMENT + ld a, SFX_HEAL_AILMENT call PlaySoundWaitForCurrent .showHealingItemMessage xor a - ld [H_AUTOBGTRANSFERENABLED],a + ld [H_AUTOBGTRANSFERENABLED], a call ClearScreen dec a - ld [wUpdateSpritesEnabled],a + ld [wUpdateSpritesEnabled], a call RedrawPartyMenu ; redraws the party menu and displays the message - ld a,1 - ld [H_AUTOBGTRANSFERENABLED],a - ld c,50 + ld a, 1 + ld [H_AUTOBGTRANSFERENABLED], a + ld c, 50 call DelayFrames call WaitForTextScrollButtonPress jr .done + .canceledItemUse xor a - ld [wActionResultOrTookBattleTurn],a ; item use failed + ld [wActionResultOrTookBattleTurn], a ; item use failed pop af pop af .done - ld a,[wPseudoItemID] + ld a, [wPseudoItemID] and a ; using Softboiled? ret nz ; if so, return call GBPalWhiteOut - call z,RunDefaultPaletteCommand - ld a,[wIsInBattle] + call z, RunDefaultPaletteCommand + ld a, [wIsInBattle] and a ret nz jp ReloadMapData + .useVitamin push hl - ld a,[hl] - ld [wd0b5],a - ld [wd11e],a - ld bc,33 - add hl,bc ; hl now points to level - ld a,[hl] ; a = level - ld [wCurEnemyLVL],a ; store level + ld a, [hl] + ld [wd0b5], a + ld [wd11e], a + ld bc, 33 + add hl, bc ; hl now points to level + ld a, [hl] ; a = level + ld [wCurEnemyLVL], a ; store level call GetMonHeader push de - ld a,d - ld hl,wPartyMonNicks + ld a, d + ld hl, wPartyMonNicks call GetPartyMonName pop de pop hl - ld a,[wcf91] - cp a,RARE_CANDY - jp z,.useRareCandy + ld a, [wcf91] + cp a, RARE_CANDY + jp z, .useRareCandy push hl - sub a,HP_UP + sub a, HP_UP add a - ld bc,17 - add hl,bc + ld bc, 17 + add hl, bc add l - ld l,a - jr nc,.noCarry2 + ld l, a + jr nc, .noCarry2 inc h .noCarry2 - ld a,10 - ld b,a - ld a,[hl] ; a = MSB of stat experience of the appropriate stat - cp a,100 ; is there already at least 25600 (256 * 100) stat experience? - jr nc,.vitaminNoEffect ; if so, vitamins can't add any more + ld a, 10 + ld b, a + ld a, [hl] ; a = MSB of stat experience of the appropriate stat + cp a, 100 ; is there already at least 25600 (256 * 100) stat experience? + jr nc, .vitaminNoEffect ; if so, vitamins can't add any more add b ; add 2560 (256 * 10) stat experience - jr nc,.noCarry3 ; a carry should be impossible here, so this will always jump - ld a,255 + jr nc, .noCarry3 ; a carry should be impossible here, so this will always jump + ld a, 255 .noCarry3 - ld [hl],a + ld [hl], a pop hl call .recalculateStats - ld hl,VitaminText - ld a,[wcf91] - sub a,HP_UP - 1 - ld c,a + ld hl, VitaminText + ld a, [wcf91] + sub a, HP_UP - 1 + ld c, a .statNameLoop ; loop to get the address of the name of the stat the vitamin increases dec c - jr z,.gotStatName + jr z, .gotStatName .statNameInnerLoop - ld a,[hli] - ld b,a - ld a,$50 + ld a, [hli] + ld b, a + ld a, $50 cp b - jr nz,.statNameInnerLoop + jr nz, .statNameInnerLoop jr .statNameLoop + .gotStatName - ld de,wcf4b - ld bc,10 + ld de, wcf4b + ld bc, 10 call CopyData ; copy the stat's name to wcf4b - ld a,SFX_HEAL_AILMENT + ld a, SFX_HEAL_AILMENT call PlaySound - ld hl,VitaminStatRoseText + ld hl, VitaminStatRoseText call PrintText jp RemoveUsedItem + .vitaminNoEffect pop hl - ld hl,VitaminNoEffectText + ld hl, VitaminNoEffectText call PrintText jp GBPalWhiteOut + .recalculateStats - ld bc,34 - add hl,bc - ld d,h - ld e,l ; de now points to stats - ld bc,-18 - add hl,bc ; hl now points to byte 3 of experience - ld b,1 + ld bc, 34 + add hl, bc + ld d, h + ld e, l ; de now points to stats + ld bc, -18 + add hl, bc ; hl now points to byte 3 of experience + ld b, 1 jp CalcStats ; recalculate stats .useRareCandy push hl - ld bc,33 - add hl,bc ; hl now points to level - ld a,[hl] ; a = level + ld bc, 33 + add hl, bc ; hl now points to level + ld a, [hl] ; a = level cp a, MAX_LEVEL - jr z,.vitaminNoEffect ; can't raise level above 100 + jr z, .vitaminNoEffect ; can't raise level above 100 inc a - ld [hl],a ; store incremented level - ld [wCurEnemyLVL],a + ld [hl], a ; store incremented level + ld [wCurEnemyLVL], a push hl push de - ld d,a + ld d, a callab CalcExperience ; calculate experience for next level and store it at $ff96 pop de pop hl - ld bc,-19 - add hl,bc ; hl now points to experience + ld bc, -19 + add hl, bc ; hl now points to experience ; update experience to minimum for new level - ld a,[hExperience] - ld [hli],a - ld a,[hExperience + 1] - ld [hli],a - ld a,[hExperience + 2] - ld [hl],a + ld a, [hExperience] + ld [hli], a + ld a, [hExperience + 1] + ld [hli], a + ld a, [hExperience + 2] + ld [hl], a pop hl - ld a,[wWhichPokemon] + ld a, [wWhichPokemon] push af - ld a,[wcf91] + ld a, [wcf91] push af push de push hl - ld bc,34 - add hl,bc ; hl now points to MSB of max HP - ld a,[hli] - ld b,a - ld c,[hl] + ld bc, 34 + add hl, bc ; hl now points to MSB of max HP + ld a, [hli] + ld b, a + ld c, [hl] pop hl push bc push hl call .recalculateStats pop hl - ld bc,35 ; hl now points to LSB of max HP - add hl,bc + ld bc, 35 ; hl now points to LSB of max HP + add hl, bc pop bc - ld a,[hld] + ld a, [hld] sub c - ld c,a - ld a,[hl] + ld c, a + ld a, [hl] sbc b - ld b,a ; bc = the amount of max HP gained from leveling up + ld b, a ; bc = the amount of max HP gained from leveling up ; add the amount gained to the current HP - ld de,-32 - add hl,de ; hl now points to MSB of current HP - ld a,[hl] + ld de, -32 + add hl, de ; hl now points to MSB of current HP + ld a, [hl] add c - ld [hld],a - ld a,[hl] + ld [hld], a + ld a, [hl] adc b - ld [hl],a - ld a,RARE_CANDY_MSG - ld [wPartyMenuTypeOrMessageID],a + ld [hl], a + ld a, RARE_CANDY_MSG + ld [wPartyMenuTypeOrMessageID], a call RedrawPartyMenu pop de - ld a,d - ld [wWhichPokemon],a - ld a,e - ld [wd11e],a + ld a, d + ld [wWhichPokemon], a + ld a, e + ld [wd11e], a xor a ; PLAYER_PARTY_DATA - ld [wMonDataLocation],a + ld [wMonDataLocation], a call LoadMonData - ld d,$01 + ld d, $01 callab PrintStatsBox ; display new stats text box call WaitForTextScrollButtonPress ; wait for button press xor a ; PLAYER_PARTY_DATA - ld [wMonDataLocation],a + ld [wMonDataLocation], a predef LearnMoveFromLevelUp ; learn level up move, if any xor a - ld [wForceEvolution],a + ld [wForceEvolution], a callabd_ModifyPikachuHappiness PIKAHAPPY_LEVELUP ld a, [wWhichPokemon] push af @@ -1390,15 +1420,15 @@ ItemUseMedicine: ; d8ae (3:58ae) ld [wWhichPokemon], a callab Func_2fd6a ; evolve pokemon, if appropriate pop af - ld [wWhichPokemon],a + ld [wWhichPokemon], a callab TryEvolvingMon - ld a,$01 - ld [wUpdateSpritesEnabled],a + ld a, $01 + ld [wUpdateSpritesEnabled], a pop af - ld [wcf91],a + ld [wcf91], a pop af - ld [wWhichPokemon],a + ld [wWhichPokemon], a jp RemoveUsedItem VitaminStatRoseText: ; dd44 (3:5d44) @@ -1417,50 +1447,50 @@ VitaminText: ; dd4e (3:5d4e) db "SPECIAL@" ItemUseBait: ; dd72 (3:5d72) - ld hl,ThrewBaitText + ld hl, ThrewBaitText call PrintText - ld hl,wEnemyMonCatchRate ; catch rate + ld hl, wEnemyMonCatchRate ; catch rate srl [hl] ; halve catch rate - ld a,BAIT_ANIM - ld hl,wSafariBaitFactor ; bait factor - ld de,wSafariEscapeFactor ; escape factor + ld a, BAIT_ANIM + ld hl, wSafariBaitFactor ; bait factor + ld de, wSafariEscapeFactor ; escape factor jr BaitRockCommon ItemUseRock: ; dd87 (3:5d87) - ld hl,ThrewRockText + ld hl, ThrewRockText call PrintText - ld hl,wEnemyMonCatchRate ; catch rate - ld a,[hl] + ld hl, wEnemyMonCatchRate ; catch rate + ld a, [hl] add a ; double catch rate - jr nc,.noCarry - ld a,$ff + jr nc, .noCarry + ld a, $ff .noCarry - ld [hl],a - ld a,ROCK_ANIM - ld hl,wSafariEscapeFactor ; escape factor - ld de,wSafariBaitFactor ; bait factor + ld [hl], a + ld a, ROCK_ANIM + ld hl, wSafariEscapeFactor ; escape factor + ld de, wSafariBaitFactor ; bait factor BaitRockCommon: ; dd9f (3:5d9f) - ld [wAnimationID],a + ld [wAnimationID], a xor a - ld [wAnimationType],a - ld [H_WHOSETURN],a - ld [de],a ; zero escape factor (for bait), zero bait factor (for rock) + ld [wAnimationType], a + ld [H_WHOSETURN], a + ld [de], a ; zero escape factor (for bait), zero bait factor (for rock) .randomLoop ; loop until a random number less than 5 is generated call Random - and a,7 - cp a,5 - jr nc,.randomLoop + and a, 7 + cp a, 5 + jr nc, .randomLoop inc a ; increment the random number, giving a range from 1 to 5 inclusive - ld b,a - ld a,[hl] + ld b, a + ld a, [hl] add b ; increase bait factor (for bait), increase escape factor (for rock) - jr nc,.noCarry - ld a,$ff + jr nc, .noCarry + ld a, $ff .noCarry - ld [hl],a + ld [hl], a predef MoveAnimation ; do animation - ld c,70 + ld c, 70 jp DelayFrames ThrewBaitText: ; ddc6 (3:5dc6) @@ -1473,46 +1503,47 @@ ThrewRockText: ; ddca (3:5dca) ; also used for Dig out-of-battle effect ItemUseEscapeRope: ; ddcf (3:5dcf) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jr nz,.notUsable - ld a,[wCurMap] - cp a,AGATHAS_ROOM - jr z,.notUsable - cp a,BILLS_HOUSE - jr z,.notUsable - cp a,POKEMON_FAN_CLUB - jr z,.notUsable - ld a,[wCurMapTileset] - ld b,a - ld hl,EscapeRopeTilesets + jr nz, .notUsable + ld a, [wCurMap] + cp a, AGATHAS_ROOM + jr z, .notUsable + cp a, BILLS_HOUSE + jr z, .notUsable + cp a, POKEMON_FAN_CLUB + jr z, .notUsable + ld a, [wCurMapTileset] + ld b, a + ld hl, EscapeRopeTilesets .loop - ld a,[hli] - cp a,$ff - jr z,.notUsable + ld a, [hli] + cp a, $ff + jr z, .notUsable cp b - jr nz,.loop - ld hl,wd732 - set 3,[hl] - set 6,[hl] + jr nz, .loop + ld hl, wd732 + set 3, [hl] + set 6, [hl] call Func_1510 - ld hl,wd72e - res 4,[hl] - ld hl,wd790 - res 7,[hl] + ld hl, wd72e + res 4, [hl] + ld hl, wd790 + res 7, [hl] xor a - ld [wNumSafariBalls],a - ld [wSafariZoneEntranceCurScript],a + ld [wNumSafariBalls], a + ld [wSafariZoneEntranceCurScript], a inc a - ld [wEscapedFromBattle],a - ld [wActionResultOrTookBattleTurn],a ; item used - ld a,[wPseudoItemID] + ld [wEscapedFromBattle], a + ld [wActionResultOrTookBattleTurn], a ; item used + ld a, [wPseudoItemID] and a ; using Dig? ret nz ; if so, return call ItemUseReloadOverworldData - ld c,30 + ld c, 30 call DelayFrames jp RemoveUsedItem + .notUsable jp ItemUseNotTime @@ -1521,23 +1552,23 @@ EscapeRopeTilesets: ; de28 (3:5e28) db $ff ; terminator ItemUseRepel: ; de2e (3:5e2e) - ld b,100 + ld b, 100 ItemUseRepelCommon: ; e005 (3:6005) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jp nz,ItemUseNotTime - ld a,b - ld [wRepelRemainingSteps],a + jp nz, ItemUseNotTime + ld a, b + ld [wRepelRemainingSteps], a jp PrintItemUseTextAndRemoveItem ; handles X Accuracy item ItemUseXAccuracy: ; de3e (3:5e3e) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jp z,ItemUseNotTime - ld hl,wPlayerBattleStatus2 - set UsingXAccuracy,[hl] ; X Accuracy bit + jp z, ItemUseNotTime + ld hl, wPlayerBattleStatus2 + set UsingXAccuracy, [hl] ; X Accuracy bit callabd_ModifyPikachuHappiness PIKAHAPPY_USEDXITEM jp PrintItemUseTextAndRemoveItem @@ -1545,40 +1576,43 @@ ItemUseXAccuracy: ; de3e (3:5e3e) ; The Card Key is handled in a different way. ItemUseCardKey: ; de57 (3:de57) xor a - ld [wUnusedD71F],a + ld [wUnusedD71F], a call GetTileAndCoordsInFrontOfPlayer - ld a,[GetTileAndCoordsInFrontOfPlayer] ; $4586 - cp a,$18 - jr nz,.next0 - ld hl,CardKeyTable1 + ld a, [GetTileAndCoordsInFrontOfPlayer] ; $4586 + cp a, $18 + jr nz, .next0 + ld hl, CardKeyTable1 jr .next1 + .next0 - cp a,$24 - jr nz,.next2 - ld hl,CardKeyTable2 + cp a, $24 + jr nz, .next2 + ld hl, CardKeyTable2 jr .next1 + .next2 - cp a,$5e - jp nz,ItemUseNotTime - ld hl,CardKeyTable3 + cp a, $5e + jp nz, ItemUseNotTime + ld hl, CardKeyTable3 .next1 - ld a,[wCurMap] - ld b,a + ld a, [wCurMap] + ld b, a .loop - ld a,[hli] - cp a,$ff - jp z,ItemUseNotTime + ld a, [hli] + cp a, $ff + jp z, ItemUseNotTime cp b - jr nz,.nextEntry1 - ld a,[hli] + jr nz, .nextEntry1 + ld a, [hli] cp d - jr nz,.nextEntry2 - ld a,[hli] + jr nz, .nextEntry2 + ld a, [hli] cp e - jr nz,.nextEntry3 - ld a,[hl] - ld [wUnusedD71F],a + jr nz, .nextEntry3 + ld a, [hl] + ld [wUnusedD71F], a jr .done + .nextEntry1 inc hl .nextEntry2 @@ -1586,11 +1620,12 @@ ItemUseCardKey: ; de57 (3:de57) .nextEntry3 inc hl jr .loop + .done - ld hl,ItemUseText00 + ld hl, ItemUseText00 call PrintText - ld hl,wd728 - set 7,[hl] + ld hl, wd728 + set 7, [hl] ret ; These tables are probably supposed to be door locations in Silph Co., @@ -1604,48 +1639,48 @@ ItemUseCardKey: ; de57 (3:de57) ; 03: ID? CardKeyTable1: ; dea7 (3:5ea7) - db SILPH_CO_2F,$04,$04,$00 - db SILPH_CO_2F,$04,$05,$01 - db SILPH_CO_4F,$0C,$04,$02 - db SILPH_CO_4F,$0C,$05,$03 - db SILPH_CO_7F,$06,$0A,$04 - db SILPH_CO_7F,$06,$0B,$05 - db SILPH_CO_9F,$04,$12,$06 - db SILPH_CO_9F,$04,$13,$07 - db SILPH_CO_10F,$08,$0A,$08 - db SILPH_CO_10F,$08,$0B,$09 + db SILPH_CO_2F, $04, $04, $00 + db SILPH_CO_2F, $04, $05, $01 + db SILPH_CO_4F, $0C, $04, $02 + db SILPH_CO_4F, $0C, $05, $03 + db SILPH_CO_7F, $06, $0A, $04 + db SILPH_CO_7F, $06, $0B, $05 + db SILPH_CO_9F, $04, $12, $06 + db SILPH_CO_9F, $04, $13, $07 + db SILPH_CO_10F, $08, $0A, $08 + db SILPH_CO_10F, $08, $0B, $09 db $ff CardKeyTable2: ; ded0 (3:5ed0) - db SILPH_CO_3F,$08,$09,$0A - db SILPH_CO_3F,$09,$09,$0B - db SILPH_CO_5F,$04,$07,$0C - db SILPH_CO_5F,$05,$07,$0D - db SILPH_CO_6F,$0C,$05,$0E - db SILPH_CO_6F,$0D,$05,$0F - db SILPH_CO_8F,$08,$07,$10 - db SILPH_CO_8F,$09,$07,$11 - db SILPH_CO_9F,$08,$03,$12 - db SILPH_CO_9F,$09,$03,$13 + db SILPH_CO_3F, $08, $09, $0A + db SILPH_CO_3F, $09, $09, $0B + db SILPH_CO_5F, $04, $07, $0C + db SILPH_CO_5F, $05, $07, $0D + db SILPH_CO_6F, $0C, $05, $0E + db SILPH_CO_6F, $0D, $05, $0F + db SILPH_CO_8F, $08, $07, $10 + db SILPH_CO_8F, $09, $07, $11 + db SILPH_CO_9F, $08, $03, $12 + db SILPH_CO_9F, $09, $03, $13 db $ff CardKeyTable3: ; def9 (3:5ef9) - db SILPH_CO_11F,$08,$09,$14 - db SILPH_CO_11F,$09,$09,$15 + db SILPH_CO_11F, $08, $09, $14 + db SILPH_CO_11F, $09, $09, $15 db $ff ItemUsePokedoll: ; df02 (3:5f02) - ld a,[wIsInBattle] + ld a, [wIsInBattle] dec a - jp nz,ItemUseNotTime - ld a,$01 - ld [wEscapedFromBattle],a + jp nz, ItemUseNotTime + ld a, $01 + ld [wEscapedFromBattle], a jp PrintItemUseTextAndRemoveItem ItemUseGuardSpec: ; df11 (3:5f11) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jp z,ItemUseNotTime + jp z, ItemUseNotTime ld a, [wWhichPokemon] push af @@ -1655,22 +1690,22 @@ ItemUseGuardSpec: ; df11 (3:5f11) pop af ld [wWhichPokemon], a - ld hl,wPlayerBattleStatus2 - set ProtectedByMist,[hl] ; Mist bit + ld hl, wPlayerBattleStatus2 + set ProtectedByMist, [hl] ; Mist bit jp PrintItemUseTextAndRemoveItem ItemUseSuperRepel: ; df38 (3:5f38) - ld b,200 + ld b, 200 jp ItemUseRepelCommon ItemUseMaxRepel: ; df3d (3:5f3d) - ld b,250 + ld b, 250 jp ItemUseRepelCommon ItemUseDireHit: ; df42 (3:5f42) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jp z,ItemUseNotTime + jp z, ItemUseNotTime ld a, [wWhichPokemon] push af @@ -1680,35 +1715,36 @@ ItemUseDireHit: ; df42 (3:5f42) pop af ld [wWhichPokemon], a - ld hl,wPlayerBattleStatus2 - set GettingPumped,[hl] ; Focus Energy bit + ld hl, wPlayerBattleStatus2 + set GettingPumped, [hl] ; Focus Energy bit jp PrintItemUseTextAndRemoveItem ItemUseXStat: ; df69 (3:df69) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jr nz,.inBattle + jr nz, .inBattle call ItemUseNotTime - ld a,2 - ld [wActionResultOrTookBattleTurn],a ; item not used + ld a, 2 + ld [wActionResultOrTookBattleTurn], a ; item not used ret + .inBattle - ld hl,wPlayerMoveNum - ld a,[hli] + ld hl, wPlayerMoveNum + ld a, [hli] push af ; save [wPlayerMoveNum] - ld a,[hl] + ld a, [hl] push af ; save [wPlayerMoveEffect] push hl - ld a,[wcf91] - sub a,X_ATTACK - ATTACK_UP1_EFFECT - ld [hl],a ; store player move effect + ld a, [wcf91] + sub a, X_ATTACK - ATTACK_UP1_EFFECT + ld [hl], a ; store player move effect call PrintItemUseTextAndRemoveItem - ld a,XSTATITEM_ANIM ; X stat item animation ID - ld [wPlayerMoveNum],a + ld a, XSTATITEM_ANIM ; X stat item animation ID + ld [wPlayerMoveNum], a call LoadScreenTilesFromBuffer1 ; restore saved screen call Delay3 xor a - ld [H_WHOSETURN],a ; set turn to player's turn + ld [H_WHOSETURN], a ; set turn to player's turn callba StatModifierUpEffect ; do stat increase move ld a, [wWhichPokemon] @@ -1721,110 +1757,114 @@ ItemUseXStat: ; df69 (3:df69) pop hl pop af - ld [hld],a ; restore [wPlayerMoveEffect] + ld [hld], a ; restore [wPlayerMoveEffect] pop af - ld [hl],a ; restore [wPlayerMoveNum] + ld [hl], a ; restore [wPlayerMoveNum] ret ItemUsePokeflute: ; dfbd (3:5fbd) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jr nz,.inBattle + jr nz, .inBattle ; if not in battle call ItemUseReloadOverworldData - ld a,[wCurMap] - cp a,ROUTE_12 - jr nz,.notRoute12 + ld a, [wCurMap] + cp a, ROUTE_12 + jr nz, .notRoute12 ld a, [wd7d8] bit 7, a - jr nz,.noSnorlaxOrPikachuToWakeUp + jr nz, .noSnorlaxOrPikachuToWakeUp ; if the player hasn't beaten Route 12 Snorlax - ld hl,Route12SnorlaxFluteCoords + ld hl, Route12SnorlaxFluteCoords call ArePlayerCoordsInArray - jr nc,.noSnorlaxOrPikachuToWakeUp - ld hl,PlayedFluteHadEffectText + jr nc, .noSnorlaxOrPikachuToWakeUp + ld hl, PlayedFluteHadEffectText call PrintText ld hl, wd7d8 set 6, [hl] ret + .notRoute12 - cp a,ROUTE_16 - jr nz,.notRoute16 + cp a, ROUTE_16 + jr nz, .notRoute16 ld a, [wd7e0] bit 1, a - jr nz,.noSnorlaxOrPikachuToWakeUp + jr nz, .noSnorlaxOrPikachuToWakeUp ; if the player hasn't beaten Route 16 Snorlax - ld hl,Route16SnorlaxFluteCoords + ld hl, Route16SnorlaxFluteCoords call ArePlayerCoordsInArray - jr nc,.noSnorlaxOrPikachuToWakeUp - ld hl,PlayedFluteHadEffectText + jr nc, .noSnorlaxOrPikachuToWakeUp + ld hl, PlayedFluteHadEffectText call PrintText ld hl, wd7e0 set 0, [hl] ret + .notRoute16 - cp a,PEWTER_POKECENTER - jr nz,.noSnorlaxOrPikachuToWakeUp + cp a, PEWTER_POKECENTER + jr nz, .noSnorlaxOrPikachuToWakeUp call CheckPikachuFollowingPlayer - jr z,.noSnorlaxOrPikachuToWakeUp - callab Func_fcb01 - jr nc,.noSnorlaxOrPikachuToWakeUp + jr z, .noSnorlaxOrPikachuToWakeUp + callab IsPikachuRightNextToPlayer + jr nc, .noSnorlaxOrPikachuToWakeUp ld hl, PlayedFluteHadEffectText call PrintText call ItemUseReloadOverworldData ld e, $1a callab Func_fd001 ret + .noSnorlaxOrPikachuToWakeUp - ld hl,PlayedFluteNoEffectText + ld hl, PlayedFluteNoEffectText jp PrintText + .inBattle xor a - ld [wWereAnyMonsAsleep],a - ld b,~SLP & $ff - ld hl,wPartyMon1Status + ld [wWereAnyMonsAsleep], a + ld b, $ff ^ SLP + ld hl, wPartyMon1Status call WakeUpEntireParty - ld a,[wIsInBattle] + ld a, [wIsInBattle] dec a ; is it a trainer battle? - jr z,.skipWakingUpEnemyParty + jr z, .skipWakingUpEnemyParty ; if it's a trainer battle - ld hl,wEnemyMon1Status + ld hl, wEnemyMon1Status call WakeUpEntireParty .skipWakingUpEnemyParty - ld hl,wBattleMonStatus - ld a,[hl] + ld hl, wBattleMonStatus + ld a, [hl] and b ; remove Sleep status - ld [hl],a - ld hl,wEnemyMonStatus - ld a,[hl] - ld c,a + ld [hl], a + ld hl, wEnemyMonStatus + ld a, [hl] + ld c, a and b ; remove Sleep status - ld [hl],a - ld a,c - and a,SLP - jr z,.asm_e063 - ld a,$1 - ld [wWereAnyMonsAsleep],a + ld [hl], a + ld a, c + and a, SLP + jr z, .asm_e063 + ld a, $1 + ld [wWereAnyMonsAsleep], a .asm_e063 call LoadScreenTilesFromBuffer2 ; restore saved screen - ld a,[wWereAnyMonsAsleep] + ld a, [wWereAnyMonsAsleep] and a ; were any pokemon asleep before playing the flute? - ld hl,PlayedFluteNoEffectText - jp z,PrintText ; if no pokemon were asleep + ld hl, PlayedFluteNoEffectText + jp z, PrintText ; if no pokemon were asleep ; if some pokemon were asleep - ld hl,PlayedFluteHadEffectText + ld hl, PlayedFluteHadEffectText call PrintText - ld a,[wLowHealthAlarm] - and a,$80 - jr nz,.skipMusic + ld a, [wLowHealthAlarm] + and a, $80 + jr nz, .skipMusic call WaitForSoundToFinish ; wait for sound to end callba Music_PokeFluteInBattle ; play in-battle pokeflute music .musicWaitLoop ; wait for music to finish playing - ld a,[wChannelSoundIDs + CH6] + ld a, [wChannelSoundIDs + CH6] and a ; music off? - jr nz,.musicWaitLoop + jr nz, .musicWaitLoop .skipMusic - ld hl,FluteWokeUpText + ld hl, FluteWokeUpText jp PrintText ; wakes up all party pokemon @@ -1835,40 +1875,40 @@ ItemUsePokeflute: ; dfbd (3:5fbd) ; OUTPUT: ; [wWereAnyMonsAsleep]: set to 1 if any pokemon were asleep WakeUpEntireParty: ; e094 (3:6094) - ld de,44 - ld c,6 + ld de, 44 + ld c, 6 .loop - ld a,[hl] + ld a, [hl] push af - and a,SLP ; is pokemon asleep? - jr z,.notAsleep - ld a,1 - ld [wWereAnyMonsAsleep],a ; indicate that a pokemon had to be woken up + and a, SLP ; is pokemon asleep? + jr z, .notAsleep + ld a, 1 + ld [wWereAnyMonsAsleep], a ; indicate that a pokemon had to be woken up .notAsleep pop af and b ; remove Sleep status - ld [hl],a - add hl,de + ld [hl], a + add hl, de dec c - jr nz,.loop + jr nz, .loop ret ; Format: ; 00: Y ; 01: X Route12SnorlaxFluteCoords: ; e0ac (3:60ac) - db 62,9 ; one space West of Snorlax - db 61,10 ; one space North of Snorlax - db 63,10 ; one space South of Snorlax - db 62,11 ; one space East of Snorlax + db 62, 9 ; one space West of Snorlax + db 61, 10 ; one space North of Snorlax + db 63, 10 ; one space South of Snorlax + db 62, 11 ; one space East of Snorlax db $ff ; terminator ; Format: ; 00: Y ; 01: X Route16SnorlaxFluteCoords: ; e0b5 (3:60b5) - db 10,27 ; one space East of Snorlax - db 10,25 ; one space West of Snorlax + db 10, 27 ; one space East of Snorlax + db 10, 25 ; one space West of Snorlax db $ff ; terminator PlayedFluteNoEffectText: ; e0ba (3:60ba) @@ -1883,27 +1923,27 @@ PlayedFluteHadEffectText: ; e0c4 (3:60c4) TX_FAR _PlayedFluteHadEffectText db $06 TX_ASM - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jr nz,.done + jr nz, .done ; play out-of-battle pokeflute music call StopAllMusic ; turn off music ld a, SFX_POKEFLUTE ld c, BANK(SFX_Pokeflute) call PlayMusic .musicWaitLoop ; wait for music to finish playing - ld a,[wChannelSoundIDs + CH2] + ld a, [wChannelSoundIDs + CH2] cp a, SFX_POKEFLUTE - jr z,.musicWaitLoop + jr z, .musicWaitLoop call PlayDefaultMusic ; start playing normal music again .done jp TextScriptEnd ; end text ItemUseCoinCase: ; e0e7 (3:60e7) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jp nz,ItemUseNotTime - ld hl,CoinCaseNumCoinsText + jp nz, ItemUseNotTime + ld hl, CoinCaseNumCoinsText jp PrintText CoinCaseNumCoinsText: ; e0f1 (3:60f1) @@ -1919,7 +1959,7 @@ ItemUseOldRod: ; e0f9 (3:60f9) ItemUseGoodRod: ; e106 (3:6106) call FishingInit - jp c,ItemUseNotTime + jp c, ItemUseNotTime .RandomLoop call Random srl a @@ -1928,17 +1968,17 @@ ItemUseGoodRod: ; e106 (3:6106) cp 2 jr nc, .RandomLoop ; choose which monster appears - ld hl,GoodRodMons + ld hl, GoodRodMons add a - ld c,a - ld b,0 - add hl,bc - ld b,[hl] + ld c, a + ld b, 0 + add hl, bc + ld b, [hl] inc hl - ld c,[hl] + ld c, [hl] and a .SetBite - ld a,0 + ld a, 0 rla xor 1 jr RodResponse @@ -1993,30 +2033,32 @@ DoNotGenerateFishingEncounter: ; e16e (3:616e) ; checks if fishing is possible and if so, runs initialization code common to all rods ; unsets carry if fishing is possible, sets carry if not FishingInit: ; e182 (3:6182) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jr z,.notInBattle + jr z, .notInBattle scf ; can't fish during battle ret + .notInBattle call IsNextTileShoreOrWater - jr nc,.cannotFish - ld a,[wWalkBikeSurfState] - cp a,2 ; Surfing? - jr z,.cannotFish + jr nc, .cannotFish + ld a, [wWalkBikeSurfState] + cp a, 2 ; Surfing? + jr z, .cannotFish call ItemUseReloadOverworldData - ld hl,ItemUseText00 + ld hl, ItemUseText00 call PrintText - ld a,SFX_HEAL_AILMENT + ld a, SFX_HEAL_AILMENT call PlaySound ld a, $2 ld [wd49c], a ld a, $81 ld [wPikachuMood], a - ld c,80 + ld c, 80 call DelayFrames and a ret + .cannotFish scf ; can't fish when surfing ret @@ -2025,22 +2067,22 @@ ItemUseOaksParcel: ; e1b7 (3:61b7) jp ItemUseNotYoursToUse ItemUseItemfinder: ; e1ba (3:61ba) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jp nz,ItemUseNotTime + jp nz, ItemUseNotTime call ItemUseReloadOverworldData callba HiddenItemNear ; check for hidden items - ld hl,ItemfinderFoundNothingText - jr nc,.printText ; if no hidden items - ld c,4 + ld hl, ItemfinderFoundNothingText + jr nc, .printText ; if no hidden items + ld c, 4 .loop - ld a,SFX_HEALING_MACHINE + ld a, SFX_HEALING_MACHINE call PlaySoundWaitForCurrent - ld a,SFX_PURCHASE + ld a, SFX_PURCHASE call PlaySoundWaitForCurrent dec c - jr nz,.loop - ld hl,ItemfinderFoundItemText + jr nz, .loop + ld hl, ItemfinderFoundItemText .printText jp PrintText @@ -2053,23 +2095,24 @@ ItemfinderFoundNothingText: ; e1eb (3:61eb) db "@" ItemUsePPUp: ; e1f0 (3:61f0) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jp nz,ItemUseNotTime + jp nz, ItemUseNotTime ItemUsePPRestore: ; e1f7 (3:61f7) - ld a,[wWhichPokemon] + ld a, [wWhichPokemon] push af - ld a,[wcf91] - ld [wPPRestoreItem],a + ld a, [wcf91] + ld [wPPRestoreItem], a .chooseMon xor a - ld [wUpdateSpritesEnabled],a - ld a,USE_ITEM_PARTY_MENU - ld [wPartyMenuTypeOrMessageID],a + ld [wUpdateSpritesEnabled], a + ld a, USE_ITEM_PARTY_MENU + ld [wPartyMenuTypeOrMessageID], a call DisplayPartyMenu - jr nc,.chooseMove + jr nc, .chooseMove jp .itemNotUsed + .chooseMove ld a, [wIsInBattle] and a @@ -2084,121 +2127,127 @@ ItemUsePPRestore: ; e1f7 (3:61f7) jr z, .usePPItem call ItemUseNotTime jp .itemNotUsed + .usePPItem - ld a,[wPPRestoreItem] - cp a,ELIXER - jp nc,.useElixir ; if Elixir or Max Elixir - ld a,$02 - ld [wMoveMenuType],a - ld hl,RaisePPWhichTechniqueText - ld a,[wPPRestoreItem] - cp a,ETHER ; is it a PP Up? - jr c,.printWhichTechniqueMessage ; if so, print the raise PP message - ld hl,RestorePPWhichTechniqueText ; otherwise, print the restore PP message + ld a, [wPPRestoreItem] + cp a, ELIXER + jp nc, .useElixir ; if Elixir or Max Elixir + ld a, $02 + ld [wMoveMenuType], a + ld hl, RaisePPWhichTechniqueText + ld a, [wPPRestoreItem] + cp a, ETHER ; is it a PP Up? + jr c, .printWhichTechniqueMessage ; if so, print the raise PP message + ld hl, RestorePPWhichTechniqueText ; otherwise, print the restore PP message .printWhichTechniqueMessage call PrintText xor a - ld [wPlayerMoveListIndex],a + ld [wPlayerMoveListIndex], a callab MoveSelectionMenu ; move selection menu - ld a,0 - ld [wPlayerMoveListIndex],a - jr nz,.chooseMon - ld hl,wPartyMon1Moves + ld a, 0 + ld [wPlayerMoveListIndex], a + jr nz, .chooseMon + ld hl, wPartyMon1Moves ld bc, wPartyMon2 - wPartyMon1 call GetSelectedMoveOffset push hl - ld a,[hl] - ld [wd11e],a + ld a, [hl] + ld [wd11e], a call GetMoveName call CopyStringToCF4B ; copy name to wcf4b pop hl - ld a,[wPPRestoreItem] - cp a,ETHER - jr nc,.useEther ; if Ether or Max Ether + ld a, [wPPRestoreItem] + cp a, ETHER + jr nc, .useEther ; if Ether or Max Ether .usePPUp - ld bc,21 - add hl,bc - ld a,[hl] ; move PP - cp a,3 << 6 ; have 3 PP Ups already been used? - jr c,.PPNotMaxedOut - ld hl,PPMaxedOutText + ld bc, 21 + add hl, bc + ld a, [hl] ; move PP + cp a, 3 << 6 ; have 3 PP Ups already been used? + jr c, .PPNotMaxedOut + ld hl, PPMaxedOutText call PrintText jr .chooseMove + .PPNotMaxedOut - ld a,[hl] - add a,1 << 6 ; increase PP Up count by 1 - ld [hl],a - ld a,1 ; 1 PP Up used - ld [wd11e],a + ld a, [hl] + add a, 1 << 6 ; increase PP Up count by 1 + ld [hl], a + ld a, 1 ; 1 PP Up used + ld [wd11e], a call RestoreBonusPP ; add the bonus PP to current PP ld a, SFX_HEAL_AILMENT call PlaySound - ld hl,PPIncreasedText + ld hl, PPIncreasedText call PrintText .done pop af - ld [wWhichPokemon],a + ld [wWhichPokemon], a call GBPalWhiteOut call RunDefaultPaletteCommand jp RemoveUsedItem + .afterRestoringPP ; after using a (Max) Ether/Elixir - ld a,[wWhichPokemon] - ld b,a - ld a,[wPlayerMonNumber] + ld a, [wWhichPokemon] + ld b, a + ld a, [wPlayerMonNumber] cp b ; is the pokemon whose PP was restored active in battle? - jr nz,.skipUpdatingInBattleData - ld hl,wPartyMon1PP + jr nz, .skipUpdatingInBattleData + ld hl, wPartyMon1PP ld bc, wPartyMon2 - wPartyMon1 call AddNTimes - ld de,wBattleMonPP - ld bc,4 + ld de, wBattleMonPP + ld bc, 4 call CopyData ; copy party data to in-battle data .skipUpdatingInBattleData - ld a,SFX_HEAL_AILMENT + ld a, SFX_HEAL_AILMENT call PlaySound - ld hl,PPRestoredText + ld hl, PPRestoredText call PrintText jr .done + .useEther call .restorePP - jr nz,.afterRestoringPP + jr nz, .afterRestoringPP jp .noEffect + ; unsets zero flag if PP was restored, sets zero flag if not ; however, this is bugged for Max Ethers and Max Elixirs (see below) .restorePP xor a ; PLAYER_PARTY_DATA - ld [wMonDataLocation],a + ld [wMonDataLocation], a call GetMaxPP - ld hl,wPartyMon1Moves + ld hl, wPartyMon1Moves ld bc, wPartyMon2 - wPartyMon1 call GetSelectedMoveOffset ld bc, wPartyMon1PP - wPartyMon1Moves - add hl,bc ; hl now points to move's PP - ld a,[wMaxPP] - ld b,a - ld a,[wPPRestoreItem] - cp a,MAX_ETHER - jr z,.fullyRestorePP - ld a,[hl] ; move PP - and a,%00111111 ; lower 6 bit bits store current PP + add hl, bc ; hl now points to move's PP + ld a, [wMaxPP] + ld b, a + ld a, [wPPRestoreItem] + cp a, MAX_ETHER + jr z, .fullyRestorePP + ld a, [hl] ; move PP + and a, %00111111 ; lower 6 bit bits store current PP cp b ; does current PP equal max PP? ret z ; if so, return - add a,10 ; increase current PP by 10 + add a, 10 ; increase current PP by 10 ; b holds the max PP amount and b will hold the new PP amount. ; So, if the new amount meets or exceeds the max amount, ; cap the amount to the max amount by leaving b unchanged. ; Otherwise, store the new amount in b. cp b ; does the new amount meet or exceed the maximum? - jr nc,.storeNewAmount - ld b,a + jr nc, .storeNewAmount + ld b, a .storeNewAmount - ld a,[hl] ; move PP - and a,%11000000 ; PP Up counter bits + ld a, [hl] ; move PP + and a, %11000000 ; PP Up counter bits add b - ld [hl],a + ld [hl], a ret + .fullyRestorePP - ld a,[hl] ; move PP + ld a, [hl] ; move PP ; Note that this code has a bug. It doesn't mask out the upper two bits, which ; are used to count how many PP Ups have been used on the move. So, Max Ethers ; and Max Elixirs will not be detected as having no effect on a move with full @@ -2206,39 +2255,40 @@ ItemUsePPRestore: ; e1f7 (3:61f7) cp b ; does current PP equal max PP? ret z jr .storeNewAmount + .useElixir ; decrement the item ID so that ELIXER becomes ETHER and MAX_ELIXER becomes MAX_ETHER - ld hl,wPPRestoreItem + ld hl, wPPRestoreItem dec [hl] dec [hl] xor a - ld hl,wCurrentMenuItem - ld [hli],a - ld [hl],a ; zero the counter for number of moves that had their PP restored - ld b,4 + ld hl, wCurrentMenuItem + ld [hli], a + ld [hl], a ; zero the counter for number of moves that had their PP restored + ld b, 4 ; loop through each move and restore PP .elixirLoop push bc - ld hl,wPartyMon1Moves + ld hl, wPartyMon1Moves ld bc, wPartyMon2 - wPartyMon1 call GetSelectedMoveOffset - ld a,[hl] + ld a, [hl] and a ; does the current slot have a move? - jr z,.nextMove + jr z, .nextMove call .restorePP - jr z,.nextMove + jr z, .nextMove ; if some PP was restored - ld hl,wTileBehindCursor ; counter for number of moves that had their PP restored + ld hl, wTileBehindCursor ; counter for number of moves that had their PP restored inc [hl] .nextMove - ld hl,wCurrentMenuItem + ld hl, wCurrentMenuItem inc [hl] pop bc dec b - jr nz,.elixirLoop - ld a,[wTileBehindCursor] + jr nz, .elixirLoop + ld a, [wTileBehindCursor] and a ; did any moves have their PP restored? - jp nz,.afterRestoringPP + jp nz, .afterRestoringPP .noEffect call ItemUseNoEffect .itemNotUsed @@ -2246,7 +2296,7 @@ ItemUsePPRestore: ; e1f7 (3:61f7) call RunDefaultPaletteCommand pop af xor a - ld [wActionResultOrTookBattleTurn],a ; item use failed + ld [wActionResultOrTookBattleTurn], a ; item use failed ret RaisePPWhichTechniqueText: ; e358 (3:6358) @@ -2274,63 +2324,64 @@ UnusableItem: ; e371 (3:6371) jp ItemUseNotTime ItemUseTMHM: ; e374 (3:6374) - ld a,[wIsInBattle] + ld a, [wIsInBattle] and a - jp nz,ItemUseNotTime - ld a,[wcf91] - sub a,TM_01 + jp nz, ItemUseNotTime + ld a, [wcf91] + sub a, TM_01 push af - jr nc,.skipAdding - add a,55 ; if item is an HM, add 55 + jr nc, .skipAdding + add a, 55 ; if item is an HM, add 55 .skipAdding inc a - ld [wd11e],a + ld [wd11e], a predef TMToMove ; get move ID from TM/HM ID - ld a,[wd11e] - ld [wMoveNum],a + ld a, [wd11e] + ld [wMoveNum], a call GetMoveName call CopyStringToCF4B ; copy name to wcf4b pop af - ld hl,BootedUpTMText - jr nc,.printBootedUpMachineText - ld hl,BootedUpHMText + ld hl, BootedUpTMText + jr nc, .printBootedUpMachineText + ld hl, BootedUpHMText .printBootedUpMachineText call PrintText - ld hl,TeachMachineMoveText + ld hl, TeachMachineMoveText call PrintText coord hl, 14, 7 lb bc, 8, 15 - ld a,TWO_OPTION_MENU - ld [wTextBoxID],a + ld a, TWO_OPTION_MENU + ld [wTextBoxID], a call DisplayTextBoxID ; yes/no menu - ld a,[wCurrentMenuItem] + ld a, [wCurrentMenuItem] and a - jr z,.useMachine - ld a,2 - ld [wActionResultOrTookBattleTurn],a ; item not used + jr z, .useMachine + ld a, 2 + ld [wActionResultOrTookBattleTurn], a ; item not used ret + .useMachine - ld a,[wWhichPokemon] + ld a, [wWhichPokemon] push af - ld a,[wcf91] + ld a, [wcf91] push af .chooseMon - ld hl,wcf4b - ld de,wTempMoveNameBuffer - ld bc,14 + ld hl, wcf4b + ld de, wTempMoveNameBuffer + ld bc, 14 call CopyData ; save the move name because DisplayPartyMenu will overwrite it - ld a,$ff - ld [wUpdateSpritesEnabled],a - ld a,TMHM_PARTY_MENU - ld [wPartyMenuTypeOrMessageID],a + ld a, $ff + ld [wUpdateSpritesEnabled], a + ld a, TMHM_PARTY_MENU + ld [wPartyMenuTypeOrMessageID], a call DisplayPartyMenu push af - ld hl,wTempMoveNameBuffer - ld de,wcf4b - ld bc,14 + ld hl, wTempMoveNameBuffer + ld de, wcf4b + ld bc, 14 call CopyData pop af - jr nc,.checkIfAbleToLearnMove + jr nc, .checkIfAbleToLearnMove ; if the player canceled teaching the move pop af pop af @@ -2341,45 +2392,46 @@ ItemUseTMHM: ; e374 (3:6374) .checkIfAbleToLearnMove predef CanLearnTM ; check if the pokemon can learn the move push bc - ld a,[wWhichPokemon] - ld hl,wPartyMonNicks + ld a, [wWhichPokemon] + ld hl, wPartyMonNicks call GetPartyMonName pop bc - ld a,c + ld a, c and a ; can the pokemon learn the move? - jr nz,.checkIfAlreadyLearnedMove + jr nz, .checkIfAlreadyLearnedMove ; if the pokemon can't learn the move - ld a,SFX_DENIED + ld a, SFX_DENIED call PlaySoundWaitForCurrent - ld hl,MonCannotLearnMachineMoveText + ld hl, MonCannotLearnMachineMoveText call PrintText jr .chooseMon + .checkIfAlreadyLearnedMove callab CheckIfMoveIsKnown ; check if the pokemon already knows the move - jr c,.chooseMon + jr c, .chooseMon predef LearnMove ; teach move ld a, [wWhichPokemon] ld d, a pop af - ld [wcf91],a + ld [wcf91], a pop af - ld [wWhichPokemon],a - ld a,b + ld [wWhichPokemon], a + ld a, b and a ret z - ld a,[wWhichPokemon] + ld a, [wWhichPokemon] push af - ld a,d - ld [wWhichPokemon],a + ld a, d + ld [wWhichPokemon], a callabd_ModifyPikachuHappiness PIKAHAPPY_USEDTMHM callab IsThisPartymonStarterPikachu_Party - jr nc,.notTeachingThunderboltOrThunderToPikachu - ld a,[wcf91] - cp a,TM_24 ; are we teaching thunderbolt to the player pikachu? - jr z,.teachingThunderboltOrThunderToPlayerPikachu - cp a,TM_25 ; are we teaching thunder then? - jr nz,.notTeachingThunderboltOrThunderToPikachu + jr nc, .notTeachingThunderboltOrThunderToPikachu + ld a, [wcf91] + cp a, TM_24 ; are we teaching thunderbolt to the player pikachu? + jr z, .teachingThunderboltOrThunderToPlayerPikachu + cp a, TM_25 ; are we teaching thunder then? + jr nz, .notTeachingThunderboltOrThunderToPikachu .teachingThunderboltOrThunderToPlayerPikachu ld a, $5 ld [wd49c], a @@ -2389,7 +2441,7 @@ ItemUseTMHM: ; e374 (3:6374) pop af ld [wWhichPokemon], a - ld a,[wcf91] + ld a, [wcf91] call IsItemHM ret c jp RemoveUsedItem @@ -2411,28 +2463,28 @@ MonCannotLearnMachineMoveText: ; e492 (3:6492) db "@" PrintItemUseTextAndRemoveItem: ; e497 (3:6497) - ld hl,ItemUseText00 + ld hl, ItemUseText00 call PrintText - ld a,SFX_HEAL_AILMENT + ld a, SFX_HEAL_AILMENT call PlaySound call WaitForTextScrollButtonPress ; wait for button press RemoveUsedItem: ; e4a5 (3:64a5) - ld hl,wNumBagItems - ld a,1 ; one item - ld [wItemQuantity],a + ld hl, wNumBagItems + ld a, 1 ; one item + ld [wItemQuantity], a jp RemoveItemFromInventory ItemUseNoEffect: ; e4b0 (3:64b0) - ld hl,ItemUseNoEffectText + ld hl, ItemUseNoEffectText jr ItemUseFailed ItemUseNotTime: ; e4b5 (3:64b5) - ld hl,ItemUseNotTimeText + ld hl, ItemUseNotTimeText jr ItemUseFailed ItemUseNotYoursToUse: ; e4ba (3:64ba) - ld hl,ItemUseNotYoursToUseText + ld hl, ItemUseNotYoursToUseText jr ItemUseFailed Func_e4bf: ; e4bf (3:64bf) @@ -2445,29 +2497,29 @@ ThrowBallAtTrainerMon: ; e4ca (3:64ca) call RunDefaultPaletteCommand call LoadScreenTilesFromBuffer1 ; restore saved screen call Delay3 - ld a,TOSS_ANIM - ld [wAnimationID],a + ld a, TOSS_ANIM + ld [wAnimationID], a predef MoveAnimation ; do animation - ld hl,ThrowBallAtTrainerMonText1 + ld hl, ThrowBallAtTrainerMonText1 call PrintText - ld hl,ThrowBallAtTrainerMonText2 + ld hl, ThrowBallAtTrainerMonText2 call PrintText jr RemoveUsedItem NoCyclingAllowedHere: ; e4eb (3:64eb) - ld hl,NoCyclingAllowedHereText + ld hl, NoCyclingAllowedHereText jr ItemUseFailed BoxFullCannotThrowBall: ; e4f0 (3:64f0) - ld hl,BoxFullCannotThrowBallText + ld hl, BoxFullCannotThrowBallText jr ItemUseFailed SurfingAttemptFailed: ; e4f5 (3:64f5) - ld hl,NoSurfingHereText + ld hl, NoSurfingHereText ItemUseFailed: ; e4f8 (3:64f8) xor a - ld [wActionResultOrTookBattleTurn],a ; item use failed + ld [wActionResultOrTookBattleTurn], a ; item use failed jp PrintText ItemUseNotTimeText: ; e4ff (3:64ff) @@ -2530,37 +2582,37 @@ GotOffBicycleText: ; e540 (3:6540) ; [wWhichPokemon] = index of pokemon in party ; [wCurrentMenuItem] = index of move (when using a PP Up) RestoreBonusPP: ; e54a (3:654a) - ld hl,wPartyMon1Moves + ld hl, wPartyMon1Moves ld bc, wPartyMon2 - wPartyMon1 - ld a,[wWhichPokemon] + ld a, [wWhichPokemon] call AddNTimes push hl - ld de,wNormalMaxPPList - 1 + ld de, wNormalMaxPPList - 1 predef LoadMovePPs ; loads the normal max PP of each of the pokemon's moves to wNormalMaxPPList pop hl ld c, wPartyMon1PP - wPartyMon1Moves - ld b,0 - add hl,bc ; hl now points to move 1 PP - ld de,wNormalMaxPPList - ld b,0 ; initialize move counter to zero + ld b, 0 + add hl, bc ; hl now points to move 1 PP + ld de, wNormalMaxPPList + ld b, 0 ; initialize move counter to zero ; loop through the pokemon's moves .loop inc b - ld a,b - cp a,5 ; reached the end of the pokemon's moves? + ld a, b + cp a, 5 ; reached the end of the pokemon's moves? ret z ; if so, return - ld a,[wUsingPPUp] + ld a, [wUsingPPUp] dec a ; using a PP Up? - jr nz,.skipMenuItemIDCheck + jr nz, .skipMenuItemIDCheck ; if using a PP Up, check if this is the move it's being used on - ld a,[wCurrentMenuItem] + ld a, [wCurrentMenuItem] inc a cp b - jr nz,.nextMove + jr nz, .nextMove .skipMenuItemIDCheck - ld a,[hl] - and a,%11000000 ; have any PP Ups been used? - call nz,AddBonusPP ; if so, add bonus PP + ld a, [hl] + and a, %11000000 ; have any PP Ups been used? + call nz, AddBonusPP ; if so, add bonus PP .nextMove inc hl inc de @@ -2573,38 +2625,38 @@ RestoreBonusPP: ; e54a (3:654a) ; [hl] = move PP AddBonusPP: ; e586 (3:6586) push bc - ld a,[de] ; normal max PP of move - ld [H_DIVIDEND + 3],a + ld a, [de] ; normal max PP of move + ld [H_DIVIDEND + 3], a xor a - ld [H_DIVIDEND],a - ld [H_DIVIDEND + 1],a - ld [H_DIVIDEND + 2],a - ld a,5 - ld [H_DIVISOR],a - ld b,4 + ld [H_DIVIDEND], a + ld [H_DIVIDEND + 1], a + ld [H_DIVIDEND + 2], a + ld a, 5 + ld [H_DIVISOR], a + ld b, 4 call Divide - ld a,[hl] ; move PP - ld b,a + ld a, [hl] ; move PP + ld b, a swap a - and a,%1111 + and a, %1111 srl a srl a - ld c,a ; c = number of PP Ups used + ld c, a ; c = number of PP Ups used .loop - ld a,[H_QUOTIENT + 3] - cp a,8 ; is the amount greater than or equal to 8? - jr c,.addAmount - ld a,7 ; cap the amount at 7 + ld a, [H_QUOTIENT + 3] + cp a, 8 ; is the amount greater than or equal to 8? + jr c, .addAmount + ld a, 7 ; cap the amount at 7 .addAmount add b - ld b,a - ld a,[wUsingPPUp] + ld b, a + ld a, [wUsingPPUp] dec a ; is the player using a PP Up right now? - jr z,.done ; if so, only add the bonus once + jr z, .done ; if so, only add the bonus once dec c - jr nz,.loop + jr nz, .loop .done - ld [hl],b + ld [hl], b pop bc ret @@ -2621,74 +2673,75 @@ AddBonusPP: ; e586 (3:6586) ; OUTPUT: ; [wMaxPP] = max PP GetMaxPP: ; e5bb (3:65bb) - ld a,[wMonDataLocation] + ld a, [wMonDataLocation] and a - ld hl,wPartyMon1Moves - ld bc,wPartyMon2 - wPartyMon1 - jr z,.sourceWithMultipleMon - ld hl,wEnemyMon1Moves + ld hl, wPartyMon1Moves + ld bc, wPartyMon2 - wPartyMon1 + jr z, .sourceWithMultipleMon + ld hl, wEnemyMon1Moves dec a - jr z,.sourceWithMultipleMon - ld hl,wBoxMon1Moves - ld bc,wBoxMon2 - wBoxMon1 + jr z, .sourceWithMultipleMon + ld hl, wBoxMon1Moves + ld bc, wBoxMon2 - wBoxMon1 dec a - jr z,.sourceWithMultipleMon - ld hl,wDayCareMonMoves + jr z, .sourceWithMultipleMon + ld hl, wDayCareMonMoves dec a - jr z,.sourceWithOneMon - ld hl,wBattleMonMoves ; player's in-battle pokemon + jr z, .sourceWithOneMon + ld hl, wBattleMonMoves ; player's in-battle pokemon .sourceWithOneMon call GetSelectedMoveOffset2 jr .next + .sourceWithMultipleMon call GetSelectedMoveOffset .next - ld a,[hl] + ld a, [hl] dec a push hl - ld hl,Moves - ld bc,MoveEnd - Moves + ld hl, Moves + ld bc, MoveEnd - Moves call AddNTimes - ld de,wcd6d - ld a,BANK(Moves) + ld de, wcd6d + ld a, BANK(Moves) call FarCopyData - ld de,wcd6d + 5 ; PP is byte 5 of move data - ld a,[de] - ld b,a ; b = normal max PP + ld de, wcd6d + 5 ; PP is byte 5 of move data + ld a, [de] + ld b, a ; b = normal max PP pop hl push bc - ld bc,wPartyMon1PP - wPartyMon1Moves ; PP offset if not player's in-battle pokemon data - ld a,[wMonDataLocation] - cp a,4 ; player's in-battle pokemon? - jr nz,.addPPOffset - ld bc,wBattleMonPP - wBattleMonMoves ; PP offset if player's in-battle pokemon data + ld bc, wPartyMon1PP - wPartyMon1Moves ; PP offset if not player's in-battle pokemon data + ld a, [wMonDataLocation] + cp a, 4 ; player's in-battle pokemon? + jr nz, .addPPOffset + ld bc, wBattleMonPP - wBattleMonMoves ; PP offset if player's in-battle pokemon data .addPPOffset - add hl,bc - ld a,[hl] ; a = current PP - and a,%11000000 ; get PP Up count + add hl, bc + ld a, [hl] ; a = current PP + and a, %11000000 ; get PP Up count pop bc or b ; place normal max PP in 6 lower bits of a - ld h,d - ld l,e + ld h, d + ld l, e inc hl ; hl = wcd73 - ld [hl],a + ld [hl], a xor a ; add the bonus for the existing PP Up count - ld [wUsingPPUp],a + ld [wUsingPPUp], a call AddBonusPP ; add bonus PP from PP Ups - ld a,[hl] - and a,%00111111 ; mask out the PP Up count - ld [wMaxPP],a ; store max PP + ld a, [hl] + and a, %00111111 ; mask out the PP Up count + ld [wMaxPP], a ; store max PP ret GetSelectedMoveOffset: ; e627 (3:6627) - ld a,[wWhichPokemon] + ld a, [wWhichPokemon] call AddNTimes GetSelectedMoveOffset2: ; e62d (3:662d) - ld a,[wCurrentMenuItem] - ld c,a - ld b,0 - add hl,bc + ld a, [wCurrentMenuItem] + ld c, a + ld b, 0 + add hl, bc ret ; confirms the item toss and then tosses the item @@ -2701,49 +2754,50 @@ GetSelectedMoveOffset2: ; e62d (3:662d) ; clears carry flag if the item is tossed, sets carry flag if not TossItem_: ; e635 (3:6635) push hl - ld a,[wcf91] + ld a, [wcf91] call IsItemHM pop hl - jr c,.tooImportantToToss + jr c, .tooImportantToToss push hl call IsKeyItem_ - ld a,[wIsKeyItem] + ld a, [wIsKeyItem] pop hl and a - jr nz,.tooImportantToToss + jr nz, .tooImportantToToss push hl - ld a,[wcf91] - ld [wd11e],a + ld a, [wcf91] + ld [wd11e], a call GetItemName call CopyStringToCF4B ; copy name to wcf4b - ld hl,IsItOKToTossItemText + ld hl, IsItOKToTossItemText call PrintText coord hl, 14, 7 lb bc, 8, 15 - ld a,TWO_OPTION_MENU - ld [wTextBoxID],a + ld a, TWO_OPTION_MENU + ld [wTextBoxID], a call DisplayTextBoxID ; yes/no menu - ld a,[wMenuExitMethod] - cp a,CHOSE_SECOND_ITEM + ld a, [wMenuExitMethod] + cp a, CHOSE_SECOND_ITEM pop hl scf ret z ; return if the player chose No ; if the player chose Yes push hl - ld a,[wWhichPokemon] + ld a, [wWhichPokemon] call RemoveItemFromInventory - ld a,[wcf91] - ld [wd11e],a + ld a, [wcf91] + ld [wd11e], a call GetItemName call CopyStringToCF4B ; copy name to wcf4b - ld hl,ThrewAwayItemText + ld hl, ThrewAwayItemText call PrintText pop hl and a ret + .tooImportantToToss push hl - ld hl,TooImportantToTossText + ld hl, TooImportantToTossText call PrintText pop hl scf @@ -2769,32 +2823,32 @@ TooImportantToTossText: ; e6a3 (3:66a3) ; 00: item is not key item ; 01: item is key item IsKeyItem_: ; e6a8 (3:66a8) - ld a,$01 - ld [wIsKeyItem],a - ld a,[wcf91] - cp a,HM_01 ; is the item an HM or TM? - jr nc,.checkIfItemIsHM + ld a, $01 + ld [wIsKeyItem], a + ld a, [wcf91] + cp a, HM_01 ; is the item an HM or TM? + jr nc, .checkIfItemIsHM ; if the item is not an HM or TM push af - ld hl,KeyItemBitfield - ld de,wBuffer - ld bc,15 ; only 11 bytes are actually used + ld hl, KeyItemBitfield + ld de, wBuffer + ld bc, 15 ; only 11 bytes are actually used call CopyData pop af dec a - ld c,a - ld hl,wBuffer - ld b,FLAG_TEST + ld c, a + ld hl, wBuffer + ld b, FLAG_TEST predef FlagActionPredef - ld a,c + ld a, c and a ret nz .checkIfItemIsHM - ld a,[wcf91] + ld a, [wcf91] call IsItemHM ret c xor a - ld [wIsKeyItem],a + ld [wIsKeyItem], a ret INCLUDE "data/key_items.asm" @@ -2977,10 +3031,10 @@ SendNewMonToBox: ; e6e8 (3:66e8) IsNextTileShoreOrWater: ; e808 (3:6808) ld a, [wCurMapTileset] ld hl, WaterTilesets - ld de,1 + ld de, 1 call IsInArray ; does the current map allow surfing? ret nc ; if not, return - ld hl,WaterTile + ld hl, WaterTile ld a, [wCurMapTileset] cp SHIP_PORT ; Vermilion Dock tileset jr z, .skipShoreTiles ; if it's the Vermilion Dock tileset @@ -2988,10 +3042,10 @@ IsNextTileShoreOrWater: ; e808 (3:6808) jr z, .skipShoreTiles cp DOJO ; usual eastern shore tile jr z, .skipShoreTiles - ld hl,ShoreTiles + ld hl, ShoreTiles .skipShoreTiles - ld a,[wTileInFrontOfPlayer] - ld de,$1 + ld a, [wTileInFrontOfPlayer] + ld de, $1 call IsInArray ret @@ -3039,6 +3093,7 @@ FindWildLocationsOfMon: ; e848 (3:6848) inc hl inc c jr .loop + .done ld a, $ff ; list terminator ld [de], a diff --git a/engine/menu/bills_pc.asm b/engine/menu/bills_pc.asm index 43d4d6ef..e104f693 100644 --- a/engine/menu/bills_pc.asm +++ b/engine/menu/bills_pc.asm @@ -204,7 +204,7 @@ ExitBillsPC: ; 2153e (8:553e) ret BillsPCPrintBox: ; 21562 (8:5562) - callab Func_e8d35 + callab PrintPCBox jp BillsPCMenu BillsPCDeposit: ; 2156d (8:556d) @@ -553,7 +553,7 @@ CableClubLeftGameboy:: ; 21867 (8:5867) ld a, [hSerialConnectionStatus] cp USING_EXTERNAL_CLOCK ret z - ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction + ld a, [wPlayerFacingDirection] ; player's sprite facing direction cp SPRITE_FACING_RIGHT ret nz ld a, [wCurMap] @@ -570,7 +570,7 @@ CableClubRightGameboy:: ; 21887 (8:5887) ld a, [hSerialConnectionStatus] cp USING_INTERNAL_CLOCK ret z - ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction + ld a, [wPlayerFacingDirection] ; player's sprite facing direction cp SPRITE_FACING_LEFT ret nz ld a, [wCurMap] @@ -587,7 +587,7 @@ JustAMomentText:: ; 218a7 (8:58a7) TX_FAR _JustAMomentText db "@" - ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction + ld a, [wPlayerFacingDirection] ; player's sprite facing direction cp SPRITE_FACING_UP ret nz call EnableAutoTextBoxDrawing diff --git a/engine/menu/main_menu.asm b/engine/menu/main_menu.asm index 94504ffb..fb3fb6b9 100755 --- a/engine/menu/main_menu.asm +++ b/engine/menu/main_menu.asm @@ -128,7 +128,7 @@ InitOptions: ; 5bff (1:5bff) ld a,3 ; medium speed ld [wOptions],a ld a,64 ; audio? - ld [wd498], a + ld [wPrinterSettings], a ret Func_5cc1: ; 5cc1 (1:5cc1) diff --git a/engine/menu/options.asm b/engine/menu/options.asm index ff629839..86a55bd2 100644 --- a/engine/menu/options.asm +++ b/engine/menu/options.asm @@ -272,7 +272,7 @@ OptionsMenu_GBPrinterBrightness: ; 41e0c (10:5e0c) ld a, d .asm_41e2e ld b, a - ld [wd498], a + ld [wPrinterSettings], a .asm_41e32 ld b, $0 ld hl, GBPrinterOptionStringsPointerTable @@ -305,7 +305,7 @@ DarkestPrintText: ; 41e72 (10:5e72) db "DARKEST @" Func_41e7b: ; 41e7b (10:5e7b) - ld a, [wd498] + ld a, [wPrinterSettings] and a jr z, .asm_41e93 cp $20 diff --git a/engine/menu/pokedex.asm b/engine/menu/pokedex.asm index 68339dff..7715500b 100755 --- a/engine/menu/pokedex.asm +++ b/engine/menu/pokedex.asm @@ -13,7 +13,7 @@ ShowPokedexMenu: ; 40000 (10:4000) ld [hJoy7], a .setUpGraphics callab LoadPokedexTilePatterns -.asm_40025 +.loop ld b, SET_PAL_GENERIC call RunPaletteCommand .doPokemonListMenu @@ -44,6 +44,7 @@ ShowPokedexMenu: ; 40000 (10:4000) call GBPalWhiteOutWithDelay3 call RunDefaultPaletteCommand jp ReloadMapData + .goToSideMenu call HandlePokedexSideMenu dec b @@ -51,7 +52,7 @@ ShowPokedexMenu: ; 40000 (10:4000) dec b jr z, .doPokemonListMenu ; if pokemon not seen or player pressed B button dec b - jr z, .asm_40025 + jr z, .loop jp .setUpGraphics ; if pokemon data or area was shown ; handles the menu on the lower right in the pokedex screen @@ -133,6 +134,7 @@ HandlePokedexSideMenu: ; 40070 (10:4070) call DrawTileLine ; cover up the menu cursor in the pokemon list pop bc ret + .buttonBPressed push bc coord hl, 15, 8 @@ -141,20 +143,24 @@ HandlePokedexSideMenu: ; 40070 (10:4070) call DrawTileLine ; cover up the menu cursor in the side menu pop bc jr .exitSideMenu + .choseData call ShowPokedexDataInternal ld b, 0 jr .exitSideMenu + ; play pokemon cry .choseCry ld a, [wd11e] call GetCryData call PlaySound jr .handleMenuInput + .choseArea predef LoadTownMap_Nest ; display pokemon areas ld b, 0 jr .exitSideMenu + .chosePrint ld a, [hTilesetType] push af @@ -162,7 +168,7 @@ HandlePokedexSideMenu: ; 40070 (10:4070) ld [hTilesetType], a ld a, [wd11e] ld [wcf91], a - callab Func_e8b74 + callab PrintPokedexEntry xor a ld [H_AUTOBGTRANSFERENABLED], a call ClearScreen @@ -174,17 +180,17 @@ HandlePokedexSideMenu: ; 40070 (10:4070) ; handles the list of pokemon on the left of the pokedex screen ; sets carry flag if player presses A, unsets carry flag if player presses B HandlePokedexListMenu: ; 40140 (10:4140) - call Func_401c2 + call Pokedex_DrawInterface .loop - call Func_4027c + call Pokedex_PlacePokemonList call GBPalNormal call HandleMenuInput - bit 1, a ; was the B button pressed? + bit BIT_B_BUTTON, a ; was the B button pressed? jp nz, .buttonBPressed - bit 0, a ; was the A button pressed? + bit BIT_A_BUTTON, a ; was the A button pressed? jp nz, .buttonAPressed .checkIfUpPressed - bit 6, a ; was Up pressed? + bit BIT_D_UP, a ; was Up pressed? jr z, .checkIfDownPressed .upPressed ; scroll up one row ld a, [wListScrollOffset] @@ -193,8 +199,9 @@ HandlePokedexListMenu: ; 40140 (10:4140) dec a ld [wListScrollOffset], a jp .loop + .checkIfDownPressed - bit 7, a ; was Down pressed? + bit BIT_D_DOWN, a ; was Down pressed? jr z, .checkIfRightPressed .downPressed ; scroll down one row ld a, [wDexMaxSeenMon] @@ -208,8 +215,9 @@ HandlePokedexListMenu: ; 40140 (10:4140) inc a ld [wListScrollOffset], a jp .loop + .checkIfRightPressed - bit 4, a ; was Right pressed? + bit BIT_D_RIGHT, a ; was Right pressed? jr z, .checkIfLeftPressed .rightPressed ; scroll down 7 rows ld a, [wDexMaxSeenMon] @@ -226,8 +234,9 @@ HandlePokedexListMenu: ; 40140 (10:4140) ld a, b ld [wListScrollOffset], a jp .loop + .checkIfLeftPressed ; scroll up 7 rows - bit 5, a ; was Left pressed? + bit BIT_D_LEFT, a ; was Left pressed? jr z, .buttonAPressed .leftPressed ld a, [wListScrollOffset] @@ -237,14 +246,16 @@ HandlePokedexListMenu: ; 40140 (10:4140) xor a ld [wListScrollOffset], a jp .loop + .buttonAPressed scf ret + .buttonBPressed and a ret -Func_401c2: ; 401c2 (10:41c2) +Pokedex_DrawInterface: ; 401c2 (10:41c2) xor a ld [H_AUTOBGTRANSFERENABLED], a ; draw the horizontal line separating the seen and owned amounts from the menu @@ -300,6 +311,7 @@ Func_401c2: ; 401c2 (10:41c2) dec c jr nz, .maxSeenPokemonInnerLoop jr .maxSeenPokemonLoop + .storeMaxSeenPokemon ld a, b ld [wDexMaxSeenMon], a @@ -333,7 +345,7 @@ PokedexMenuItemsText: ; 40264 (10:4264) next "PRNT" next "QUIT@" -Func_4027c: ; 4027c (10:427c) +Pokedex_PlacePokemonList: ; 4027c (10:427c) xor a ld [H_AUTOBGTRANSFERENABLED], a coord hl, 4, 2 @@ -381,6 +393,7 @@ Func_4027c: ; 4027c (10:427c) jr nz, .getPokemonName ; if the player has seen the pokemon ld de, .dashedLine ; print a dashed line in place of the name if the player hasn't seen the pokemon jr .skipGettingName + .dashedLine ; for unseen pokemon in the list db "----------@" .getPokemonName @@ -442,8 +455,8 @@ ShowPokedexDataInternal: ; 40323 (10:4323) call RunPaletteCommand pop af ld [wd11e], a - call Func_4039c - call c, Func_404ae + call DrawDexEntryOnScreen + call c, Pokedex_PrintFlavorTextAtRow11 .waitForButtonPress call JoypadLowSensitivity ld a, [hJoy5] @@ -478,22 +491,27 @@ PokedexDataDividerLine: ; 40387 (10:4387) db $6B, $69, $6B, $69, $6A db "@" -Func_4039c: ; 4039c (10:439c) +DrawDexEntryOnScreen: ; 4039c (10:439c) call ClearScreen + coord hl, 0, 0 ld de, 1 lb bc, $64, SCREEN_WIDTH call DrawTileLine ; draw top border + coord hl, 0, 17 ld b, $6f call DrawTileLine ; draw bottom border + coord hl, 0, 1 ld de, 20 lb bc, $66, $10 call DrawTileLine ; draw left border + coord hl, 19, 1 ld b, $67 call DrawTileLine ; draw right border + ld a, $63 ; upper left corner tile Coorda 0, 0 ld a, $65 ; upper right corner tile @@ -501,16 +519,21 @@ Func_4039c: ; 4039c (10:439c) ld a, $6c ; lower left corner tile Coorda 0, 17 ld a, $6e ; lower right corner tile + Coorda 19, 17 coord hl, 0, 9 + ld de, PokedexDataDividerLine call PlaceString ; draw horizontal divider line + coord hl, 9, 6 ld de, HeightWeightText call PlaceString + call GetMonName coord hl, 9, 2 call PlaceString + ld hl, PokedexEntryPointers ld a, [wd11e] dec a @@ -521,14 +544,17 @@ Func_4039c: ; 4039c (10:439c) ld a, [hli] ld e, a ld d, [hl] ; de = address of pokedex entry + coord hl, 9, 4 call PlaceString ; print species name + ld h, b ld l, c push de ld a, [wd11e] push af call IndexToPokedex + coord hl, 2, 8 ld a, "№" ld [hli], a @@ -537,6 +563,7 @@ Func_4039c: ; 4039c (10:439c) ld de, wd11e lb bc, LEADING_ZEROES | 1, 3 call PrintNumber ; print pokedex number + ld hl, wPokedexOwned call IsPokemonBitSet pop af @@ -544,10 +571,12 @@ Func_4039c: ; 4039c (10:439c) ld a, [wcf91] ld [wd0b5], a pop de + push af push bc push de push hl + call Delay3 call GBPalNormal call GetMonHeader ; load pokemon picture location @@ -555,13 +584,16 @@ Func_4039c: ; 4039c (10:439c) call LoadFlippedFrontSpriteByMonIndex ; draw pokemon picture ld a, [wcf91] call PlayCry ; play pokemon cry + pop hl pop de pop bc pop af + ld a, c and a ret z ; if the pokemon has not been owned, don't print the height, weight, or description + inc de ; de = address of feet (height) ld a, [de] ; reads feet, but a is overwritten without being used coord hl, 12, 6 @@ -617,9 +649,9 @@ Func_4039c: ; 4039c (10:439c) scf ret -Func_404ae: ; 404ae (10:44ae) +Pokedex_PrintFlavorTextAtRow11: ; 404ae (10:44ae) coord bc, 1, 11 -Func_404b1: ; 404b1 (10:44b1) +Pokedex_PrintFlavorTextAtBC: ; 404b1 (10:44b1) ld a, 2 ld [$fff9], a call TextCommandProcessor ; print pokedex description text @@ -627,7 +659,7 @@ Func_404b1: ; 404b1 (10:44b1) ld [$fff9], a ret -Func_404bc: ; 404bc (10:44bc) +Pokedex_PrepareDexEntryForPrinting: ; 404bc (10:44bc) coord hl, 0, 0 ld de, SCREEN_WIDTH lb bc, $66, $d @@ -643,15 +675,15 @@ Func_404bc: ; 404bc (10:44bc) Coorda 0, 13 ld a, $6e Coorda 19, 13 - ld a, [wOverworldMap+$40d] + ld a, [wPrinterPokedexEntryTextPointer] ld l, a - ld a, [wOverworldMap+$40e] + ld a, [wPrinterPokedexEntryTextPointer + 1] ld h, a coord bc, 1, 1 ld a, [hFlags_0xFFFA] set 3, a ld [hFlags_0xFFFA], a - call Func_404b1 + call Pokedex_PrintFlavorTextAtBC ld a, [hFlags_0xFFFA] res 3, a ld [hFlags_0xFFFA], a @@ -714,4 +746,4 @@ IndexToPokedex: ; 4109d (10:509d) pop bc ret -INCLUDE "data/pokedex_order.asm"
\ No newline at end of file +INCLUDE "data/pokedex_order.asm" diff --git a/engine/oak_speech.asm b/engine/oak_speech.asm index eeeb32c8..925ff913 100755 --- a/engine/oak_speech.asm +++ b/engine/oak_speech.asm @@ -5,7 +5,7 @@ SetDefaultNames: ; 5e27 (1:5e27) push af ld a, [wd732] push af - ld a, [wd498] + ld a, [wPrinterSettings] push af ld hl, wPlayerName ld bc, wBoxDataEnd - wPlayerName @@ -16,11 +16,11 @@ SetDefaultNames: ; 5e27 (1:5e27) xor a call FillMemory xor a - ld [wd495], a - ld [wd496], a - ld [wd497], a + ld [wSurfingMinigameHiScore], a + ld [wSurfingMinigameHiScore + 1], a + ld [wSurfingMinigameHiScore + 2], a pop af - ld [wd498], a + ld [wPrinterSettings], a pop af ld [wd732], a pop af diff --git a/engine/overworld/card_key.asm b/engine/overworld/card_key.asm index 48b2380d..62d1d4fb 100755 --- a/engine/overworld/card_key.asm +++ b/engine/overworld/card_key.asm @@ -89,7 +89,7 @@ GetCoordsInFrontOfPlayer: ; 5265f (14:665f) ld d, a ld a, [wXCoord] ld e, a - ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction + ld a, [wPlayerFacingDirection] ; player's sprite facing direction and a jr nz, .notFacingDown ; facing down diff --git a/engine/overworld/check_player_state.asm b/engine/overworld/check_player_state.asm index a89b3d48..5dd91c4c 100644 --- a/engine/overworld/check_player_state.asm +++ b/engine/overworld/check_player_state.asm @@ -90,7 +90,7 @@ IsPlayerFacingEdgeOfMap: ; c148 (3:4148) push hl push de push bc - ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction + ld a, [wPlayerFacingDirection] ; player sprite's facing direction srl a ld c, a ld b, $0 @@ -160,7 +160,7 @@ IsWarpTileInFrontOfPlayer: ; c197 (3:4197) ld a, [wCurMap] cp SS_ANNE_5 jr z, .ssAnne5 - ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction + ld a, [wPlayerFacingDirection] ; player sprite's facing direction srl a ld c, a ld b, 0 diff --git a/engine/overworld/cut.asm b/engine/overworld/cut.asm index 3978cb9c..488bc4de 100755 --- a/engine/overworld/cut.asm +++ b/engine/overworld/cut.asm @@ -188,7 +188,7 @@ ReplaceTreeTileBlock: ; ef1f (3:6f1f) ld h, [hl] ld l, a add hl, bc - ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction + ld a, [wPlayerFacingDirection] ; player sprite's facing direction and a jr z, .down cp SPRITE_FACING_UP diff --git a/engine/overworld/get_coords_tile_in_front_of_player.asm b/engine/overworld/get_coords_tile_in_front_of_player.asm index 494708de..1003570b 100644 --- a/engine/overworld/get_coords_tile_in_front_of_player.asm +++ b/engine/overworld/get_coords_tile_in_front_of_player.asm @@ -6,7 +6,7 @@ _GetTileAndCoordsInFrontOfPlayer: ; c2d4 (3:42d4) ld d, a ld a, [wXCoord] ld e, a - ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction + ld a, [wPlayerFacingDirection] ; player's sprite facing direction and a ; cp SPRITE_FACING_DOWN jr nz, .notFacingDown ; facing down @@ -45,7 +45,7 @@ GetTileTwoStepsInFrontOfPlayer: ; c309 (3:4309) ld a, [hli] ld d, a ld e, [hl] - ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction + ld a, [wPlayerFacingDirection] ; player's sprite facing direction and a ; cp SPRITE_FACING_DOWN jr nz, .notFacingDown ; facing down diff --git a/engine/overworld/hidden_objects.asm b/engine/overworld/hidden_objects.asm index cba2a221..6e515b5a 100755 --- a/engine/overworld/hidden_objects.asm +++ b/engine/overworld/hidden_objects.asm @@ -61,7 +61,7 @@ CheckForHiddenObject: ; f25f8 (3c:65f8) ; checks if the coordinates in front of the player's sprite match Y in b and X in c ; [hCoordsInFrontOfPlayerMatch] = $00 if they match, $ff if they don't match CheckIfCoordsInFrontOfPlayerMatch: ; 46a01 (11:6a01) - ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction + ld a, [wPlayerFacingDirection] ; player's sprite facing direction cp SPRITE_FACING_UP jr z, .facingUp cp SPRITE_FACING_LEFT diff --git a/engine/overworld/ledges.asm b/engine/overworld/ledges.asm index a6ebd9be..5d95cb18 100755 --- a/engine/overworld/ledges.asm +++ b/engine/overworld/ledges.asm @@ -6,7 +6,7 @@ HandleLedges: ; 1a7f4 (6:67f4) and a ; OVERWORLD ret nz predef GetTileAndCoordsInFrontOfPlayer - ld a, [wSpriteStateData1 + 9] + ld a, [wPlayerFacingDirection] ld b, a aCoord 8, 9 ld c, a diff --git a/engine/overworld/map_sprite_functions1.asm b/engine/overworld/map_sprite_functions1.asm index a8412a4e..722fc14e 100644 --- a/engine/overworld/map_sprite_functions1.asm +++ b/engine/overworld/map_sprite_functions1.asm @@ -28,7 +28,7 @@ _UpdateSprites: ; 4bb7 (1:4bb7) and a jp z, UpdatePlayerSprite cp $f0 ; pikachu - jp z, Func_1552 + jp z, SpawnPikachu ld a, [hl] UpdateNonPlayerSprite: ; 4be3 (1:4be3) diff --git a/engine/overworld/map_sprites.asm b/engine/overworld/map_sprites.asm index 1f13ddd2..10f0362e 100755 --- a/engine/overworld/map_sprites.asm +++ b/engine/overworld/map_sprites.asm @@ -20,26 +20,26 @@ _InitMapSprites: ; 1401b (5:401b) ; Loads sprite set for outside maps (cities and routes) and sets VRAM slots. ; sets carry if the map is a city or route, unsets carry if not InitOutsideMapSprites: ; 14029 (5:4029) - ld a,[wCurMap] - cp a,REDS_HOUSE_1F ; is the map a city or a route (map ID less than $25)? + ld a, [wCurMap] + cp a, REDS_HOUSE_1F ; is the map a city or a route (map ID less than $25)? ret nc ; if not, return call GetSplitMapSpriteSetID ; if so, choose the appropriate one - ld b,a ; b = spriteSetID - ld a,[wFontLoaded] - bit 0,a ; reloading upper half of tile patterns after displaying text? - jr nz,.loadSpriteSet ; if so, forcibly reload the sprite set - ld a,[wSpriteSetID] + ld b, a ; b = spriteSetID + ld a, [wFontLoaded] + bit 0, a ; reloading upper half of tile patterns after displaying text? + jr nz, .loadSpriteSet ; if so, forcibly reload the sprite set + ld a, [wSpriteSetID] cp b ; has the sprite set ID changed? - jr z,.skipLoadingSpriteSet ; if not, don't load it again + jr z, .skipLoadingSpriteSet ; if not, don't load it again .loadSpriteSet - ld a,b - ld [wSpriteSetID],a + ld a, b + ld [wSpriteSetID], a dec a - ld c,a - ld b,0 + ld c, a + ld b, 0 ld a, (wSpriteSetID - wSpriteSet) - ld hl,SpriteSets + ld hl, SpriteSets call AddNTimes ; get sprite set offset ld de, wSpriteSet ld bc, (wSpriteSetID - wSpriteSet) @@ -64,8 +64,8 @@ LoadSpriteSetFromMapHeader: ; 14061 (5:4061) call FillMemory ld a, SPRITE_PIKACHU ; load Pikachu separately ld [wSpriteSet], a - ld hl,wSpriteStateData1 + $10 - ld a,$0e + ld hl, wSprite01SpriteStateData1 + ld a, 14 .storeVRAMSlotsLoop push af ld a, [hl] ; $C1X0 (picture ID) (zero if sprite slot is not used) @@ -79,13 +79,14 @@ LoadSpriteSetFromMapHeader: ; 14061 (5:4061) ld b, 2 call CheckIfPictureIDAlreadyLoaded jr .continue + .isFourTileSprite ; loop through the space reserved for regular picture IDs ld de, wSpriteSet ld b, 9 call CheckIfPictureIDAlreadyLoaded .continue - ld de, $10 + ld de, wSprite02SpriteStateData1 - wSprite01SpriteStateData1 add hl, de pop af dec a @@ -96,6 +97,7 @@ CheckIfPictureIDAlreadyLoaded: ; 1409b (5:409b) ; Check if the current picture ID has already had its tile patterns loaded. ; This done by looping through the previous sprite slots and seeing if any of ; their picture ID's match that of the current sprite slot. +.loop ld a, [de] and a ; is sprite set slot not taken up yet? jr z, .spriteSlotNotTaken ; if so, load it as it signifies we've reached @@ -106,7 +108,8 @@ CheckIfPictureIDAlreadyLoaded: ; 1409b (5:409b) dec b ; have we reached the end of the sprite set? jr z, .spriteNotAlreadyLoaded ; if so, we're done here inc de - jr CheckIfPictureIDAlreadyLoaded + jr .loop + .spriteSlotNotTaken ld a, c ld [de], a @@ -127,6 +130,7 @@ CheckForFourTileSprite: ; 140ac (5:40ac) ; regular sprite and a ret + .notYellowSprite scf ret @@ -140,6 +144,7 @@ LoadMapSpriteTilePatterns: ; 140b7 (5:40b7) call LoadStillTilePattern call LoadWalkingTilePattern jr .continue + .fourTileSprite call LoadStillTilePattern .continue @@ -202,7 +207,7 @@ GetSpriteVRAMAddress: ; 14018 (5:4108) SpriteVRAMAddresses: ; 14118 (5:4118) ; Equivalent to multiplying $C0 (number of bytes in 12 tiles) times the VRAM ; slot and adding the result to $8000 (the VRAM base address). - dw vChars0 + $c0 + dw vChars0 + $0c0 dw vChars0 + $180 dw vChars0 + $240 dw vChars0 + $300 @@ -211,8 +216,8 @@ SpriteVRAMAddresses: ; 14118 (5:4118) dw vChars0 + $540 dw vChars0 + $600 dw vChars0 + $6c0 - dw vChars0 + $780 - dw vChars0 + $7c0 + dw vChars0 + $780 ; 4-tile sprites + dw vChars0 + $7c0 ; 4-tile sprites ReadSpriteSheetData: ; 1412e (5:412e) ld a, [hVRAMSlot] @@ -246,12 +251,11 @@ ReadSpriteSheetData: ; 1412e (5:412e) Func_14150: ; 14150 (5:4150) ld a, $1 - ld [wSpriteStateData2 + $e], a ; vram slot for player + ld [wPlayerSpriteImageBaseOffset], a ; vram slot for player ld a, $2 - ld [wSpriteStateData2 + $fe], a ; vram slot for Pikachu - + ld [wPikachuSpriteImageBaseOffset], a ; vram slot for Pikachu ld a, $e - ld hl, wSpriteStateData1 + $10 + ld hl, wSprite01SpriteStateData1 .loop ld [hVRAMSlot], a ; store current sprite set slot as a counter ld a, [hl] ; $c1x0 (picture ID) @@ -259,12 +263,12 @@ Func_14150: ; 14150 (5:4150) jr z, .spriteUnused call Func_14179 push hl - ld de, (wSpriteStateData2 + $e) - (wSpriteStateData1) ; $10e + ld de, (wPlayerSpriteImageBaseOffset) - (wSpriteStateData1) ; $10e add hl, de ; get $c2xe (sprite image base offset) ld [hl], a ; write offset pop hl .spriteUnused - ld de, $10 + ld de, wSprite02SpriteStateData1 - wSprite01SpriteStateData1 add hl, de ld a, [hVRAMSlot] dec a @@ -297,67 +301,68 @@ Func_14179: ; 14179 (5:4179) GetSplitMapSpriteSetID: ; 14193 (5:4193) ld e, a ld d, 0 - ld hl,MapSpriteSets + ld hl, MapSpriteSets add hl, de - ld a,[hl] ; a = spriteSetID - cp a,$f0 ; does the map have 2 sprite sets? + ld a, [hl] ; a = spriteSetID + cp a, $f0 ; does the map have 2 sprite sets? ret c ; Chooses the correct sprite set ID depending on the player's position within ; the map for maps with two sprite sets. - cp a,$f8 - jr z,.route20 - ld hl,SplitMapSpriteSets - and a,$0f + cp a, $f8 + jr z, .route20 + ld hl, SplitMapSpriteSets + and a, $0f dec a add a add a add l - ld l,a - jr nc,.noCarry + ld l, a + jr nc, .noCarry inc h .noCarry - ld a,[hli] ; determines whether the map is split East/West or North/South - cp a,$01 - ld a,[hli] ; position of dividing line - ld b,a - jr z,.eastWestDivide + ld a, [hli] ; determines whether the map is split East/West or North/South + cp a, $01 + ld a, [hli] ; position of dividing line + ld b, a + jr z, .eastWestDivide .northSouthDivide - ld a,[wYCoord] + ld a, [wYCoord] jr .compareCoord + .eastWestDivide - ld a,[wXCoord] + ld a, [wXCoord] .compareCoord cp b - jr c,.loadSpriteSetID + jr c, .loadSpriteSetID ; if in the East side or South side inc hl .loadSpriteSetID - ld a,[hl] + ld a, [hl] ret ; Uses sprite set $01 for West side and $0A for East side. ; Route 20 is a special case because the two map sections have a more complex ; shape instead of the map simply being split horizontally or vertically. .route20 - ld hl,wXCoord - ld a,[hl] - cp a,$2b - ld a,$01 + ld hl, wXCoord + ld a, [hl] + cp a, $2b + ld a, $01 ret c - ld a,[hl] - cp a,$3e - ld a,$0a + ld a, [hl] + cp a, $3e + ld a, $0a ret nc - ld a,[hl] - cp a,$37 - ld b,$08 - jr nc,.next - ld b,$0d + ld a, [hl] + cp a, $37 + ld b, $08 + jr nc, .next + ld b, $0d .next - ld a,[wYCoord] + ld a, [wYCoord] cp b - ld a,$0a + ld a, $0a ret c - ld a,$01 + ld a, $01 ret -INCLUDE "data/sprite_sets.asm"
\ No newline at end of file +INCLUDE "data/sprite_sets.asm" diff --git a/engine/overworld/movement.asm b/engine/overworld/movement.asm index 9ca03ff4..5f929ce3 100644 --- a/engine/overworld/movement.asm +++ b/engine/overworld/movement.asm @@ -53,7 +53,7 @@ UpdatePlayerSprite: ; 4da5 (1:4da5) ld a, SPRITE_FACING_RIGHT jr .next .next - ld [wSpriteStateData1 + 9], a ; facing direction + ld [wPlayerFacingDirection], a ; facing direction ld a, [wFontLoaded] bit 0, a jr z, .moving @@ -89,7 +89,7 @@ UpdatePlayerSprite: ; 4da5 (1:4da5) Func_4e32: ; 4e32 (1:4e32) ld a, [wSpriteStateData1 + 8] ld b, a - ld a, [wSpriteStateData1 + 9] + ld a, [wPlayerFacingDirection] add b ld [wSpriteStateData1 + 2], a ret diff --git a/engine/overworld/player_animations.asm b/engine/overworld/player_animations.asm index a78dba35..bea43308 100755 --- a/engine/overworld/player_animations.asm +++ b/engine/overworld/player_animations.asm @@ -35,7 +35,7 @@ EnterMapAnim: ; 70567 (1c:4567) ld hl, wFacingDirectionList call PlayerSpinInPlace ld a, $1 - ld [wd431], a + ld [wPikachuSpawnState], a .restoreDefaultMusic call PlayDefaultMusic .done @@ -46,7 +46,7 @@ EnterMapAnim: ; 70567 (1c:4567) call DelayFrames call PlayerSpinWhileMovingDown ld a, $0 - ld [wd431], a + ld [wPikachuSpawnState], a jr .done .flyAnimation pop hl @@ -63,7 +63,7 @@ EnterMapAnim: ; 70567 (1c:4567) call DoFlyAnimation call LoadPlayerSpriteGraphics ld a, $1 - ld [wd431], a + ld [wPikachuSpawnState], a jr .restoreDefaultMusic FlyAnimationEnterScreenCoords: ; 705ed (1c:45ed) diff --git a/engine/overworld/pokecenter.asm b/engine/overworld/pokecenter.asm index bf47bf60..65dfcd87 100755 --- a/engine/overworld/pokecenter.asm +++ b/engine/overworld/pokecenter.asm @@ -63,7 +63,7 @@ DisplayPokemonCenterDialogue_: ; 6d97 (1:6d97) callab IsStarterPikachuInOurParty call c, Func_6eaa ld a, $5 - ld [wd431], a + ld [wPikachuSpawnState], a call Func_1525 .doNotReturnPikachu lb bc, 1, 0 diff --git a/engine/overworld/ssanne.asm b/engine/overworld/ssanne.asm index ece4446d..d0d957be 100755 --- a/engine/overworld/ssanne.asm +++ b/engine/overworld/ssanne.asm @@ -32,7 +32,7 @@ AnimateBoulderDust: ; 7a0fb (1e:60fb) jp LoadPlayerSpriteGraphics GetMoveBoulderDustFunctionPointer: ; 7913f (1e:613f) - ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction + ld a, [wPlayerFacingDirection] ; player's sprite facing direction ld hl, MoveBoulderDustFunctionPointerTable ld c, a ld b, $0 diff --git a/engine/overworld/step_functions.asm b/engine/overworld/step_functions.asm index 5b9c7e2b..bc1a74aa 100644 --- a/engine/overworld/step_functions.asm +++ b/engine/overworld/step_functions.asm @@ -2,7 +2,7 @@ ApplyOutOfBattlePoisonDamage: ; c3de (3:43de) ld a, [wd730] add a jp c, .noBlackOut ; no black out if joypad states are being simulated - ld a, [wPreventBlackout] + ld a, [wd492] bit 7, a jp nz, .noBlackOut ld a, [wd72e] diff --git a/engine/overworld/try_pushing_boulder.asm b/engine/overworld/try_pushing_boulder.asm index 89e83ff9..b7e04092 100644 --- a/engine/overworld/try_pushing_boulder.asm +++ b/engine/overworld/try_pushing_boulder.asm @@ -38,7 +38,7 @@ Func_f0a7: ; f0a7 (3:70a7) jp nz, ResetBoulderPushFlags ld a, [hJoyHeld] ld b, a - ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction + ld a, [wPlayerFacingDirection] ; player's sprite facing direction cp SPRITE_FACING_UP jr z, .pushBoulderUp cp SPRITE_FACING_LEFT diff --git a/engine/palettes.asm b/engine/palettes.asm index f5a3ed49..636e5e97 100755 --- a/engine/palettes.asm +++ b/engine/palettes.asm @@ -164,9 +164,9 @@ SetPal_Overworld: ; 71fa5 (1c:5fa5) cp BRUNOS_ROOM jr z, .caveOrBruno cp TRADE_CENTER - jr z, .asm_71ffd + jr z, .trade_center_colosseum cp COLOSSEUM - jr z, .asm_71ffd + jr z, .trade_center_colosseum .normalDungeonOrBuilding ld a, [wLastMap] ; town or route that current dungeon or building is located .townOrRoute @@ -181,17 +181,21 @@ SetPal_Overworld: ; 71fa5 (1c:5fa5) ld a, SET_PAL_OVERWORLD ld [wDefaultPaletteCommand], a ret + .PokemonTowerOrAgatha ld a, PAL_GREYMON - 1 jr .town + .caveOrBruno ld a, PAL_CAVE - 1 jr .town + .Lorelei xor a jr .town -.asm_71ffd - ld a, $18 + +.trade_center_colosseum + ld a, PAL_GREYMON - 1 jr .town ; used when a Pokemon is the only thing on the screen @@ -313,17 +317,17 @@ DeterminePaletteIDOutOfBattle: ; 72094 (1c:6094) ld a, [hl] ret -Func_720ad:: ; 720ad (1c:60ad) +YellowIntroPaletteAction:: ; 720ad (1c:60ad) ld a, e and a - jr nz, Func_720bd + jr nz, .asm_720bd ld hl, PalPacket_Generic ld a, [hGBC] and a jp z, SendSGBPacket jp InitGBCPalettes -Func_720bd:: ; 720bd (1c:60bd) +.asm_720bd ld hl, UnknownPalPacket_72811 ld a, [hGBC] and a @@ -343,12 +347,12 @@ Func_720bd:: ; 720bd (1c:60bd) call TransferCurBGPData ret -Func_720e3:: ; 720e3 (1c:60e3) +LoadOverworldPikachuFrontpicPalettes:: ; 720e3 (1c:60e3) ld hl, PalPacket_Empty ld de, wPalPacket ld bc, $10 call CopyData - call Func_7213b + call GetPal_Pikachu ld hl, wPartyMenuBlkPacket ld [hl], a ld hl, wPartyMenuBlkPacket + 2 @@ -357,12 +361,13 @@ Func_720e3:: ; 720e3 (1c:60e3) ld hl, wPalPacket ld a, [hGBC] and a - jr nz, .asm_72109 + jr nz, .cgb_1 call SendSGBPacket - jr .asm_7210c -.asm_72109 + jr .okay_1 + +.cgb_1 call InitGBCPalettes -.asm_7210c +.okay_1 ld hl, BlkPacket_WholeScreen ld de, wPalPacket ld bc, $10 @@ -381,15 +386,16 @@ Func_720e3:: ; 720e3 (1c:60e3) ld hl, wPalPacket ld a, [hGBC] and a - jr nz, .asm_72137 + jr nz, .cgb_2 call SendSGBPacket - jr .asm_7213a -.asm_72137 + jr .okay_2 + +.cgb_2 call InitGBCPalettes -.asm_7213a +.okay_2 ret -Func_7213b:: ; 7213b (1c:613b) +GetPal_Pikachu:: ; 7213b (1c:613b) ; similar to SetPal_Overworld ld a, [wCurMapTileset] cp CEMETERY @@ -420,17 +426,21 @@ Func_7213b:: ; 7213b (1c:613b) .town inc a ; a town's pallete ID is its map ID + 1 ret + .PokemonTowerOrAgatha ld a, PAL_GREYMON - 1 jr .town + .caveOrBruno ld a, PAL_CAVE - 1 jr .town + .Lorelei - xor a + xor a ; PAL_PALLET - 1 jr .town + .battleOrTradeCenter - ld a, $18 + ld a, PAL_GREYMON - 1 jr .town InitPartyMenuBlkPacket: ; 7217f (1c:617f) diff --git a/engine/pikachu_emotions.asm b/engine/pikachu_emotions.asm new file mode 100755 index 00000000..9040e612 --- /dev/null +++ b/engine/pikachu_emotions.asm @@ -0,0 +1,409 @@ +IsPlayerTalkingToPikachu:: ; fcf0c (3f:4f0c) + ld a, [wd436] + and a + ret z + ld a, [hSpriteIndexOrTextID] + cp $f + ret nz + call InitializePikachuTextID + xor a + ld [hSpriteIndexOrTextID], a + ld [wd436], a + ret + +InitializePikachuTextID: ; fcf20 (3f:4f20) + ld a, $d4 ; display + ld [hSpriteIndexOrTextID], a + xor a + ld [wPlayerMovingDirection], a + ld a, $1 + ld [wAutoTextBoxDrawingControl], a + call DisplayTextID + xor a + ld [wAutoTextBoxDrawingControl], a + ret + +DoStarterPikachuEmotions: ; fcf35 (3f:4f35) + ld e, a + ld d, $0 + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] +.loop + ld a, [de] + inc de + cp $ff + jr z, .done + ld c, a + ld b, $0 + ld hl, StarterPikachuEmotionsJumptable + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + call JumpToAddress + jr .loop +.done + ret + +StarterPikachuEmotionsJumptable: ; fcf54 (3f:4f54) + dw StarterPikachuEmotionCommand_nop ; 0 + dw StarterPikachuEmotionCommand_text ; 1 + dw StarterPikachuEmotionCommand_pcm ; 2 + dw StarterPikachuEmotionCommand_emote ; 3 + dw StarterPikachuEmotionCommand_movement ; 4 + dw StarterPikachuEmotionCommand_pikapic ; 5 + dw StarterPikachuEmotionCommand_subcmd ; 6 + dw StarterPikachuEmotionCommand_delay ; 7 + dw StarterPikachuEmotionCommand_nop2 ; 8 + dw StarterPikachuEmotionCommand_9 ; 9 + dw StarterPikachuEmotionCommand_nop3 ; a + +StarterPikachuEmotionCommand_nop: ; fcf6a (3f:4f6a) +StarterPikachuEmotionCommand_nop3: ; fcf6a (3f:4f6a) + ret + +StarterPikachuEmotionCommand_text: ; fcf6b (3f:4f6b) + ld a, [de] + ld l, a + inc de + ld a, [de] + ld h, a + inc de + push de + call PrintText + pop de + ret + +StarterPikachuEmotionCommand_pcm: ; fcf77 (3f:4f77) + ld a, [de] + inc de + push de + ld e, a + nop + call PlayPikachuSoundClip_ + pop de + ret + +PlayPikachuSoundClip_: ; fcf81 (3f:4f81) + cp $ff + ret z + callab PlayPikachuSoundClip + ret + +StarterPikachuEmotionCommand_emote: ; fcf8d (3f:4f8d) + ld a, [wUpdateSpritesEnabled] + push af + ld a, $ff + ld [wUpdateSpritesEnabled], a + ld a, [de] + inc de + push de + call ShowPikachuEmoteBubble + pop de + pop af + ld [wUpdateSpritesEnabled], a + ret + +ShowPikachuEmoteBubble: ; fcfa2 (3f:4fa2) + ld [wWhichEmotionBubble], a + ld a, $f + ld [wEmotionBubbleSpriteIndex], a + predef EmotionBubble + ret + +StarterPikachuEmotionCommand_movement: ; fcfb0 (3f:4fb0) + ld a, [de] + inc de + ld l, a + ld a, [de] + inc de + ld h, a + push de + ld b, BANK(DoStarterPikachuEmotions) + call ApplyPikachuMovementData_ + pop de + ret + +StarterPikachuEmotionCommand_delay: ; fcfbe (3f:4fbe) + ld a, [de] + inc de + push de + ld c, a + call DelayFrames + pop de + ret + +StarterPikachuEmotionCommand_subcmd: ; fcfc7 (3f:4fc7) + ld a, [de] + inc de + push de + ld e, a + ld d, $0 + ld hl, Jumptable_fcfda + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + call JumpToAddress + pop de + ret + +Jumptable_fcfda: + dw LoadPikachuSpriteIntoVRAM + dw LoadFontTilePatterns + dw Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3 + dw WaitForTextScrollButtonPress + dw PikachuPewterPokecenterCheck + dw PikachuFanClubCheck + dw PikachuBillsHouseCheck + +StarterPikachuEmotionCommand_nop2: ; fcfe8 (3f:4fe8) + ret + +StarterPikachuEmotionCommand_9: ; fcfe9 (3f:4fe9) + push de + call StarterPikachuEmotionCommand_turnawayfromplayer + call UpdateSprites + pop de + ret + +StarterPikachuEmotionCommand_turnawayfromplayer: ; fcff2 (3f:4ff2) + ld a, [wPlayerFacingDirection] + xor $4 + ld [wPikachuFacingDirection], a + ret + +DeletedFunction_fcffb: ; fcffb (3f:4ffb) +; Inexplicably empty. + rept 5 + nop + endr + ret + +Func_fd001:: ; fd001 (3f:5001) + ld a, e + jr load_expression + +Func_fd004:: ; fd004 (3f:5004) + call MapSpecificPikachuExpression + jr c, load_expression + call GetPikaPicAnimationScriptIndex + call DeletedFunction_fcffb +load_expression: ; fd00f (3f:500f) + ld [wExpressionNumber], a + ld hl, PikachuEmotionTable + call DoStarterPikachuEmotions + ret + +PikachuEmotionTable: ; fd019 (3f:4019) + dw PikachuEmotion0_fd115 + dw PikachuEmotion1_fd141 + dw PikachuEmotion2_fd116 + dw PikachuEmotion3_fd160 + dw PikachuEmotion4_fd136 + dw PikachuEmotion5_fd14d + dw PikachuEmotion6_fd153 + dw PikachuEmotion7_fd128 + dw PikachuEmotion8_fd147 + dw PikachuEmotion9_fd166 + dw PikachuEmotion10_fd11e + dw PikachuEmotion11_fd173 + dw PikachuEmotion12_fd17a + dw PikachuEmotion13_fd180 + dw PikachuEmotion14_fd189 + dw PikachuEmotion15_fd191 + dw PikachuEmotion16_fd197 + dw PikachuEmotion17_fd19d + dw PikachuEmotion18_fd1a3 + dw PikachuEmotion19_fd1a9 + dw PikachuEmotion20_fd1b1 + dw PikachuEmotion21_fd1b9 ; used a fishing rod + dw PikachuEmotion22_fd1c1 + dw PikachuEmotion23_fd1c7 + dw PikachuEmotion24_fd1cf + dw PikachuEmotion25_fd1d7 + dw PikachuEmotion26_fd1df ; wake up pikachu in pewter pokemon center + dw PikachuEmotion27_fd1eb + dw PikachuEmotion28_fd1f1 + dw PikachuEmotion29_fd1f7 + dw PikachuEmotion30_fd1fc + dw PikachuEmotion31_fd20a + dw PikachuEmotion32_fd213 + dw PikachuEmotion33_fd05d + +PikachuEmotion33_fd05d: ; fd05d (3f:505d) + db $ff + +MapSpecificPikachuExpression: ; fd05e (3f:505e) + ld a, [wCurMap] + cp POKEMON_FAN_CLUB + jr nz, .notFanClub + ld hl, wd492 + bit 7, [hl] + ld a, $1d + jr z, .set_carry + call CheckPikachuFollowingPlayer + ld a, $1e + jr nz, .set_carry + jr .check_pikachu_status + +.notFanClub + ld a, [wCurMap] + cp PEWTER_POKECENTER + jr nz, .notPewterPokecenter + call CheckPikachuFollowingPlayer + ld a, $1a + jr nz, .set_carry + jr .check_pikachu_status + +.notPewterPokecenter + callab Func_f24ae + ld a, e + cp $ff + jr nz, .set_carry + jr .check_pikachu_status ; useless + +.check_pikachu_status + call IsPlayerPikachuAsleepInParty + ld a, $b + jr c, .set_carry + callab CheckPikachuFaintedOrStatused ; same bank + ld a, $1c + jr c, .set_carry + ld a, [wCurMap] + cp POKEMONTOWER_1 + jr c, .notInLavenderTower + cp POKEMONTOWER_7 + 1 + ld a, $16 + jr c, .set_carry +.notInLavenderTower + ld a, [wd49c] + and a + jr z, .no_carry + dec a + ld c, a + ld b, $0 + ld hl, Pointer_fd0cb + add hl, bc + ld a, [hl] + jr .set_carry + +.no_carry + and a + ret + +.set_carry + scf + ret + +Pointer_fd0cb: + db $12, $15, $17, $18, $19 + +IsPlayerPikachuAsleepInParty:: ; fd0d0 (3f:50d0) + xor a + ld [wWhichPokemon], a +.loop + ld a, [wWhichPokemon] + ld c, a + ld b, $0 + ld hl, wPartySpecies + add hl, bc + ld a, [hl] + cp $ff + jr z, .done + cp PIKACHU + jr nz, .curMonNotStarterPikachu + callab IsThisPartymonStarterPikachu + jr nc, .curMonNotStarterPikachu + ld a, [wWhichPokemon] + ld hl, wPartyMon1Status + ld bc, wPartyMon2 - wPartyMon1 + call AddNTimes + ld a, [hl] + and SLP + jr z, .done + jr .curMonSleepingPikachu +.curMonNotStarterPikachu + ld a, [wWhichPokemon] + cp PARTY_LENGTH - 1 + jr z, .done + inc a + ld [wWhichPokemon], a + jr .loop +.curMonSleepingPikachu + scf + ret +.done + and a + ret + +INCLUDE "data/pikachu_emotions.asm" + +Func_fd252: ; fd252 (3f:5252) + ld a, $40 + ld [h_0xFFFC], a + call LoadPikachuSpriteIntoVRAM + call Func_fd266 + and a + jr z, .asm_fd262 + call ApplyPikachuMovementData +.asm_fd262 + xor a + ld [h_0xFFFC], a + ret + +Func_fd266: + ld a, [wSpriteStateData2 + 15 * 16 + 4] + ld e, a + ld a, [wSpriteStateData2 + 15 * 16 + 5] + ld d, a + ld a, [wYCoord] + add 4 + cp e + jr z, .asm_fd280 + jr nc, .asm_fd27e + ld hl, Data_fd294 + ld a, 1 + ret + +.asm_fd27e + xor a + ret + +.asm_fd280 + ld a, [wXCoord] + add 4 + cp d + jr c, .asm_fd28e + ld hl, Data_fd299 + ld a, 2 + ret + +.asm_fd28e + ld hl, Data_fd29d + ld a, 3 + ret + +Data_fd294: + db $00 + db $36 + db $2b + db $34 + db $3f + +Data_fd299: + db $00 + db $36 + db $34 + db $3f + +Data_fd29d: + db $00 + db $36 + db $33 + db $3f diff --git a/engine/pikachu_follow.asm b/engine/pikachu_follow.asm new file mode 100755 index 00000000..a715b0a3 --- /dev/null +++ b/engine/pikachu_follow.asm @@ -0,0 +1,1577 @@ +Func_fc4dd:: ; fc4dd (3f:44dd) +; possibly to test if pika should be out? + ld a, [wPikachuOverworldStateFlags] + bit 5, a + jr nz, .hide ; 3f:44f8 + ld a, [wPikachuOverworldStateFlags] + bit 7, a + jr nz, .hide + call IsStarterPikachuInOurParty + jr nc, .hide + ld a, [wWalkBikeSurfState] + and a + jr nz, .hide + scf + ret + +.hide + and a + ret + +Func_fc4fa:: ; fc4fa (3f:44fa) + ld hl, wPikachuOverworldStateFlags + bit 4, [hl] + res 4, [hl] + jr nz, .normal_spawn_state + call EnablePikachuFollowingPlayer + call ClearPikachuSpriteStateData + ld a, $ff + ld [wPikachuSpriteImageIdx], a + call ClearPikachuFollowCommandBuffer + call CalculatePikachuFacingDirection + ret + +.normal_spawn_state + call CalculatePikachuPlacementCoords + xor a + ld [wPikachuSpawnState], a + ld a, [wPlayerFacingDirection] + ld [wPikachuFacingDirection], a + ret + +ClearPikachuSpriteStateData:: ; fc523 (3f:4523) + ld hl, wPikachuPictureID + call .clear + ld hl, wPikachuSpriteStateData2 +.clear + ld bc, $10 + xor a + call FillMemory + ret + +Func_fc534:: ; fc534 (3f:4534) + call CalculatePikachuPlacementCoords + call CalculatePikachuFacingDirection + xor a + ld [wPikachuSpawnState], a + ret + +CalculatePikachuPlacementCoords:: ; fc53f (3f:453f) + ld bc, wPikachuPictureID + ld a, [wYCoord] + add $4 + ld e, a + ld a, [wXCoord] + add $4 + ld d, a + ld a, [wPikachuSpawnState] + and a + jr z, .load_coords + cp $1 + jr z, .right_of_player + cp $2 + jr z, .check_player_facing2 + cp $3 + jr z, .load_coords + cp $4 + jr z, .below_player + cp $5 + jr z, .above_player + cp $6 + jr z, .left_of_player + cp $7 + jr z, .check_player_facing + jr .right_of_player + +.check_player_facing + ld a, [wPlayerFacingDirection] + and a ; SPRITE_FACING_DOWN + jr z, .below_player + cp SPRITE_FACING_UP + jr z, .above_player + cp SPRITE_FACING_LEFT + jr z, .left_of_player + cp SPRITE_FACING_RIGHT + jr z, .right_of_player +.check_player_facing2 + ld a, [wPlayerFacingDirection] + and a + jr nz, .check_up + dec e + jr .load_coords + +.check_up + cp SPRITE_FACING_UP + jr nz, .check_left + inc e + jr .load_coords + +.check_left + cp SPRITE_FACING_LEFT + jr nz, .left_of_player_2 + inc d + jr .load_coords + +.left_of_player_2 + dec d + jr .load_coords + +.right_of_player + inc d + jr .load_coords + +.left_of_player + dec d + jr .load_coords + +.below_player + inc e + jr .load_coords + +.above_player + dec e + jr .load_coords ; useless jr +.load_coords + ld hl, wPlayerMapY - wPlayerSpriteStateData1 + add hl, bc + ld [hl], e + inc hl + ld [hl], d + inc hl + ld [hl], $fe + push hl + ld hl, wd472 + set 5, [hl] + pop hl + ret + +CalculatePikachuFacingDirection:: ; fc5bc (3f:45bc) + ld a, $49 + ld [wPikachuPictureID], a + ld a, $ff + ld [wPikachuSpriteImageIdx], a + ld a, [wPikachuSpawnState] + and a + jr z, .copy_player_facing + cp $1 + jr z, .copy_player_facing + cp $3 + jr z, .force_facing_down + cp $4 + jr z, .copy_player_facing + cp $6 + jr z, .copy_player_facing + cp $7 + jr z, .face_the_other_way + call ComputePikachuFacingDirection + ret + +.copy_player_facing + ld a, [wPlayerFacingDirection] + ld [wPikachuFacingDirection], a + ret + +.force_facing_down + ld a, SPRITE_FACING_DOWN + ld [wPikachuFacingDirection], a + ret + +.face_the_other_way + ld a, [wPlayerFacingDirection] + xor $4 + ld [wPikachuFacingDirection], a + ret + +CalculatePikachuSpawnState1:: ; fc5fa (3f:45fa) + ld a, [wCurMap] + cp OAKS_LAB + jr z, .oaks_lab + cp ROUTE_22_GATE + jr z, .route_22_gate + cp MT_MOON_2 + jr z, .mt_moon_2 + cp ROCK_TUNNEL_1 + jr z, .rock_tunnel_1 + ld a, [wCurMap] + ld hl, Pointer_fc64b + call Pikachu_IsInArray ; similar to IsInArray, but not the same + jr c, .map_list_1 + ld a, [wCurMap] + ld hl, Pointer_fc653 + call Pikachu_IsInArray + jr nc, .not_map_list_2 + ld a, [wPlayerFacingDirection] + and a + jr nz, .not_map_list_2 + ld a, $3 + jr .load + +.route_22_gate + ld a, [wPlayerFacingDirection] + and a + jr z, .rock_tunnel_1 + jr .not_map_list_2 + +.mt_moon_2 + ld a, $3 + jr .load + +.map_list_1 + ld a, $4 + jr .load + +.oaks_lab + ld a, $6 + jr .load + +.not_map_list_2 + ld a, $1 + jr .load + +.rock_tunnel_1 + ld a, $3 +.load + ld [wPikachuSpawnState], a + ret + +Pointer_fc64b:: ; fc64b (3f:464b) + db VICTORY_ROAD_2 + db ROUTE_7_GATE + db ROUTE_8_GATE + db ROUTE_16_GATE_1F + db ROUTE_18_GATE_1F + db ROUTE_15_GATE_1F + db ROUTE_11_GATE_1F + db $ff + +Pointer_fc653:: ; fc653 (3f:4653) + db VIRIDIAN_FOREST_EXIT + db CERULEAN_HOUSE_2 + db TRASHED_HOUSE + db VERMILION_DOCK + db CELADON_MANSION_1 + db ROUTE_2_GATE + db FUCHSIA_HOUSE_3 + db $ff + +CalculatePikachuSpawnState2:: ; fc65b (3f:465b) + ld a, [wCurMap] + cp VIRIDIAN_FOREST_EXIT + jr z, .viridian_forest_exit + cp VIRIDIAN_FOREST_ENTRANCE + jr z, .viridian_forest_entrance + ld a, [wCurMap] + ld hl, Pointer_fc68e + call Pikachu_IsInArray + jr c, .in_array + jr .not_in_array + +.viridian_forest_exit + ld a, [wPlayerFacingDirection] + cp SPRITE_FACING_UP + jr z, .in_array + jr .not_in_array + +.viridian_forest_entrance + ld a, [wPlayerFacingDirection] + and a ; SPRITE_FACING_DOWN + jr z, .not_in_array + jr .in_array + +.not_in_array + ld a, $0 + jr .load_spawn_state + +.in_array + ld a, $1 +.load_spawn_state + ld [wPikachuSpawnState], a + ret + +Pointer_fc68e:: ; fc68e (3f:468e) + db VIRIDIAN_FOREST + db SAFARI_ZONE_REST_HOUSE_1 + db SAFARI_ZONE_REST_HOUSE_2 + db SAFARI_ZONE_REST_HOUSE_3 + db SAFARI_ZONE_REST_HOUSE_4 + db SAFARI_ZONE_SECRET_HOUSE + db SILPH_CO_ELEVATOR + db CELADON_MART_ELEVATOR + db CINNABAR_LAB_2 + db CINNABAR_LAB_3 + db CINNABAR_LAB_4 + db $ff + +CalculatePikachuSpawnState3:: ; fc69a (3f:469a) + ld a, [wCurMap] + cp ROUTE_22_GATE + jr z, .asm_fc6a7 + cp ROUTE_2_GATE + jr z, .asm_fc6b0 + jr .asm_fc6bd + +.asm_fc6a7 + ld a, [wPlayerFacingDirection] + cp SPRITE_FACING_UP + jr z, .asm_fc6b9 + jr .asm_fc6bd + +.asm_fc6b0 + ld a, [wPlayerFacingDirection] + cp SPRITE_FACING_UP + jr z, .asm_fc6b9 + jr .asm_fc6bd + +.asm_fc6b9 + ld a, $1 + jr .asm_fc6c1 + +.asm_fc6bd + ld a, $3 + jr .asm_fc6c1 + +.asm_fc6c1 + ld [wPikachuSpawnState], a + ret + +SetPikachuOverworldStateFlag2:: ; fc6c5 (3f:46c5) + push hl + ld hl, wPikachuOverworldStateFlags + set 2, [hl] + pop hl + ret + +ResetPikachuOverworldStateFlag2:: ; fc6cd (3f:46cd) + push hl + ld hl, wPikachuOverworldStateFlags + res 2, [hl] + pop hl + ret + +SpawnPikachu_:: ; fc6d5 (3f:46d5) + call ResetPikachuOverworldStateFlag2 + call Func_fc727 + ret nc + + push bc + call WillPikachuSpawnOnTheScreen + pop bc + ret c + + ld bc, wPikachuPictureID + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + bit 7, [hl] + jp nz, asm_fc745 + ld a, [wFontLoaded] + bit 0, a + jp nz, asm_fc76a + call CheckPikachuFollowingPlayer + jp nz, asm_fc76a + ld a, [hl] + and $7f + cp $a + jr c, .valid + xor a +.valid + add a + ld e, a + ld d, 0 + ld hl, PointerTable_fc710 + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +PointerTable_fc710: ; fc710 (3f:4710) + dw Func_fc793 + dw Func_fc7aa + dw Func_fc803 + dw asm_fc9c3 + dw asm_fca1c + dw asm_fc9ee + dw asm_fc87f + dw asm_fc904 + dw asm_fc937 + dw asm_fc969 + dw Func_fc726 + +Func_fc726: ; fc726 (3f:4726) + ret + +Func_fc727: ; fc727 (3f:4727) + call Func_fc4dd + jr nc, .dont_spawn + ld a, [wPikachuMovementStatus] + and a + jr nz, .already_spawned + push bc + push hl + call Func_fc534 + pop hl + pop bc +.already_spawned + scf + ret + +.dont_spawn + ld hl, wPikachuSpriteImageIdx + ld [hl], $ff + dec hl + ld [hl], $0 + xor a + ret + +asm_fc745: ; fc745 (3f:4745) + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + res 7, [hl] + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + ld [hl], a + call CheckPikachuFollowingPlayer + jr nz, .asm_fc75f + ld a, [wPlayerFacingDirection] + xor $4 + ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1 + add hl, bc + ld [hl], a +.asm_fc75f + xor a + ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 + add hl, bc + ld [hli], a + ld [hl], a + call UpdatePikachuWalkingSprite + ret + +asm_fc76a: ; fc76a (3f:476a) + xor a + ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 + add hl, bc + ld [hli], a + ld [hl], a + call UpdatePikachuWalkingSprite + call Func_fc82e + jr c, .asm_fc783 + push bc + callab InitializeSpriteScreenPosition + pop bc +.asm_fc783 + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $1 + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $0 + call RefreshPikachuFollow + ret + +Func_fc793: ; fc793 (3f:4793) + call RefreshPikachuFollow + push bc + callab InitializeSpriteScreenPosition + pop bc + ld hl, wSprite01SpriteImageIdx - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $ff + dec hl + ld [hl], $1 + ret + +Func_fc7aa: ; fc7aa (3f:47aa) + call Func_fcc92 + jp c, Func_fc803 + dec a + ld l, a + ld h, $0 + add hl, hl + add hl, hl + ld de, Pointer_fc7e3 + add hl, de + ld d, h + ld e, l + ld a, [de] + inc de + ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1 + add hl, bc + ld [hl], a + ld a, [de] + inc de + ld hl, wSprite01XStepVector - wSprite01SpriteStateData1 + add hl, bc + ld [hl], a + dec hl + dec hl + ld a, [de] + ld [hl], a + inc de + ld a, [de] + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + ld [hl], a + cp $4 + jp z, Func_fca0a + call AreThereAtLeastTwoStepsInPikachuFollowCommandBuffer + jp c, FastPikachuFollow + jp NormalPikachuFollow + +Pointer_fc7e3: ; fc7e3 (3f:47e3) + db 0, 0 + db 1, 3 + db 4, 0 + db -1, 3 + db 8, -1 + db 0, 3 + db 12, 1 + db 0, 3 + db 0, 0 + db 1, 4 + db 4, 0 + db -1, 4 + db 8, -1 + db 0, 4 + db 12, 1 + db 0, 4 + +Func_fc803: ; fc803 (3f:4803) + call Func_fcae2 + ret c + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + dec [hl] + jr nz, .asm_fc823 + push hl + call GetPikachuFollowCommand + pop hl + cp $5 + jr nc, Func_fc842 + ld [hl], $20 + call Random + and $c + ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1 + add hl, bc + ld [hl], a +.asm_fc823 + xor a + ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 + add hl, bc + ld [hli], a + ld [hl], a + call UpdatePikachuWalkingSprite + ret + +Func_fc82e: ; fc82e (3f:482e) + ld a, [wWalkCounter] + and a + ret z + scf + ret + +Func_fc835: ; fc835 (3f:4835) + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $10 + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $1 + ret + +Func_fc842: ; fc842 (3f:4842) + ld hl, $0 + push af + call Random + ld a, [hRandomAdd] + and %11 + ld e, a + ld d, $0 + ld hl, PointerTable_fc85a + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + pop af + jp hl + +PointerTable_fc85a: ; fc85a (3f:485a) + dw Func_fc862 + dw Func_fc8f8 + dw Func_fc92b + dw Func_fc95d + +Func_fc862: ; fc862 (3f:4862) + dec a + add a + add a + and $c + ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1 + add hl, bc + ld [hl], a + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $6 + xor a + ld [wd432], a + ld [wd433], a + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $11 +asm_fc87f: ; fc87f (3f:487f) + ld a, [wd432] + ld e, a + ld a, [wd433] + ld d, a + call Func_fc82e + jr c, Func_fc8c7 + call SetPikachuOverworldStateFlag2 + ld hl, wSprite01YPixels - wSprite01SpriteStateData1 + add hl, bc + ld a, [hl] + sub e + ld e, a + inc hl + inc hl + ld a, [hl] + sub d + ld d, a + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + ld a, [hl] + dec a + add a + add Pointer_fc8d6 % $100 + ld l, a + ld a, Pointer_fc8d6 / $100 + adc $0 + ld h, a + ld a, [hli] + ld [wd432], a + add e + ld e, a + ld a, [hl] + ld [wd433], a + add d + ld d, a + ld hl, wSprite01YPixels - wSprite01SpriteStateData1 + add hl, bc + ld [hl], e + inc hl + inc hl + ld [hl], d + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + dec [hl] + ret nz + jp Func_fc835 + +Func_fc8c7: ; fc8c7 (3f:48c7) + ld hl, wSprite01YPixels - wSprite01SpriteStateData1 + add hl, bc + ld a, [hl] + sub e + ld [hl], a + inc hl + inc hl + ld a, [hl] + sub d + ld [hl], a + jp Func_fc835 + +Pointer_fc8d6: ; fc8d6 (3f:48d6) + db 0, 0 + db -2, 1 + db -4, 2 + db -2, 3 + db 0, 4 + db -2, 3 + db -4, 2 + db -2, 1 + db 0, 0 + db -2, -1 + db -4, -2 + db -2, -3 + db 0, -4 + db -2, -3 + db -4, -2 + db -2, -1 + db 0, 0 + +Func_fc8f8: ; fc8f8 (3f:48f8) + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $7 + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $30 +asm_fc904: ; fc904 (3f:4904) + call Func_fc82e + jp c, Func_fc835 + call SetPikachuOverworldStateFlag2 + ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 + add hl, bc + ld a, [hl] + inc a + cp $8 + ld [hl], a + jr nz, .asm_fc91f + xor a + ld [hli], a + ld a, [hl] + inc a + and %11 + ld [hl], a +.asm_fc91f + call UpdatePikachuWalkingSprite + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + dec [hl] + ret nz + jp Func_fc835 + +Func_fc92b: ; fc92b (3f:492b) + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $20 + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $8 +asm_fc937: ; fc937 (3f:4937) + call Func_fc82e + jp c, Func_fc835 + call SetPikachuOverworldStateFlag2 + ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 + add hl, bc + ld a, [hl] + inc a + cp $8 + ld [hl], a + jr nz, .asm_fc951 + xor a + ld [hli], a + ld a, [hl] + xor $1 + ld [hl], a +.asm_fc951 + call UpdatePikachuWalkingSprite + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + dec [hl] + ret nz + jp Func_fc835 + +Func_fc95d: ; fc95d (3f:495d) + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $20 + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $9 +asm_fc969: ; fc969 (3f:4969) + call Func_fc82e + jp c, Func_fc835 + call SetPikachuOverworldStateFlag2 + ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 + add hl, bc + ld a, [hl] + inc a + cp $8 + ld [hl], a + jr nz, .asm_fc988 + xor a + ld [hl], a + ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1 + add hl, bc + ld a, [hl] + call Func_fc994 + ld [hl], a +.asm_fc988 + call UpdatePikachuWalkingSprite + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + dec [hl] + ret nz + jp Func_fc835 + +Func_fc994: ; fc994 (3f:4994) + push hl + ld hl, Pointer_fc9ac + ld d, a +.loop + ld a, [hli] + cp d + jr nz, .loop + ld a, [hl] + pop hl + ret + +Func_fc9a0: ; fc9a0 (3f:49a0) + push hl + ld hl, Pointer_fc9ac_End + ld d, a +.loop + ld a, [hld] + cp d + jr nz, .loop + ld a, [hl] + pop hl + ret + +Pointer_fc9ac: ; fc9ac (3f:49ac) + db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT, SPRITE_FACING_UP, SPRITE_FACING_RIGHT + db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT, SPRITE_FACING_UP, SPRITE_FACING_RIGHT +Pointer_fc9ac_End: + +NormalPikachuFollow: ; fc9b4 (3f:49b4) + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $8 + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $3 + call AddPikachuStepVector +asm_fc9c3: ; fc9c3 (3f:49c3) + call TryDoubleAddPikachuStepVectorToScreenPixelCoords + call GetPikachuWalkingAnimationSpeed + call UpdatePikachuWalkingSprite + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + dec [hl] + ret nz + call ResetPikachuStepVector + call ComputePikachuFacingDirection + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $1 + ret + +FastPikachuFollow: ; fc9df (3f:49df) + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $4 + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $5 + call AddPikachuStepVector +asm_fc9ee: ; fc9ee (3f:49ee) + call DoubleAddPikachuStepVectorToScreenPixelCoords + call GetPikachuWalkingAnimationSpeed + call UpdatePikachuWalkingSprite + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + dec [hl] + ret nz + call ResetPikachuStepVector + call ComputePikachuFacingDirection + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $1 + ret + +Func_fca0a: ; fca0a (3f:4a0a) + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $8 + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $4 + call AddPikachuStepVector + call AddPikachuStepVector +asm_fca1c: ; fca1c (3f:4a1c) + call DoubleAddPikachuStepVectorToScreenPixelCoords + call GetPikachuWalkingAnimationSpeed + call UpdatePikachuWalkingSprite + ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 + add hl, bc + dec [hl] + ret nz + call ResetPikachuStepVector + call ComputePikachuFacingDirection + ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $1 + ret + +AddPikachuStepVector: ; fca38 (3f:4a38) + ld hl, wSprite01YStepVector - wSprite01SpriteStateData1 + add hl, bc + ld e, [hl] + inc hl + inc hl + ld d, [hl] + ld hl, wSprite01MapY - wSprite01SpriteStateData1 + add hl, bc + ld a, [hl] + add e + ld [hli], a + ld a, [hl] + add d + ld [hl], a + ret + +TryDoubleAddPikachuStepVectorToScreenPixelCoords: ; fca4b (3f:4a4b) + ld a, [wWalkBikeSurfState] + cp $1 ; biking + jr nz, AddPikachuStepVectorToScreenPixelCoords + ld a, [wd736] + bit 6, a + jr nz, AddPikachuStepVectorToScreenPixelCoords +DoubleAddPikachuStepVectorToScreenPixelCoords: ; fca59 (3f:4a59) + ld hl, wSprite01YStepVector - wSprite01SpriteStateData1 + add hl, bc + ld a, [hli] + add a + add a + add [hl] + ld [hli], a + ld a, [hli] + add a + add a + add [hl] + ld [hl], a + ret + +AddPikachuStepVectorToScreenPixelCoords: ; fca68 (3f:4a68) + ld hl, wSprite01YStepVector - wSprite01SpriteStateData1 + add hl, bc + ld a, [hli] + add a + add [hl] + ld [hli], a + ld a, [hli] + add a + add [hl] + ld [hli], a + ret + +ResetPikachuStepVector: ; fca75 (3f:4a75) + ld hl, wSprite01YStepVector - wSprite01SpriteStateData1 + add hl, bc + xor a + ld [hli], a + inc hl + ld [hl], a + ret + +GetPikachuWalkingAnimationSpeed: ; fca7e (3f:4a7e) + call ComparePikachuHappinessTo80 + ld d, $2 + jr nc, .happy + ld d, $5 +.happy + ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 + add hl, bc + ld a, [hl] + inc a + cp d + jr nz, .dont_reset + xor a +.dont_reset + ld [hli], a + ret nz + ld a, [hl] + inc a + and $3 + ld [hl], a + ret + +UpdatePikachuWalkingSprite: ; fca99 (3f:4a99) + ld a, [wPikachuOverworldStateFlags] + bit 3, a + jr nz, .uninitialized + ld hl, wSprite01SpriteImageBaseOffset - wSprite01SpriteStateData1 + add hl, bc + ld a, [hl] + dec a + swap a + ld d, a + ld a, [wd736] + bit 7, a + jr nz, .copy_player + ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1 + add hl, bc + ld a, [hl] + or d + ld d, a + ld a, [wFontLoaded] + bit 0, a + jr z, .normal_get_sprite_index + call Func_fcae2 + ret c + jr .load_sprite_index + +.normal_get_sprite_index + ld hl, wSprite01AnimFrameCounter - wSprite01SpriteStateData1 + add hl, bc + ld a, d + or [hl] + ld d, a +.load_sprite_index + ld hl, wSprite01SpriteImageIdx - wSprite01SpriteStateData1 + add hl, bc + ld [hl], d + ret + +.uninitialized + ld hl, wSprite01SpriteImageIdx - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $ff + ret + +.copy_player + ld a, [wPlayerSpriteImageIdx] + and $f + or d + ld [wPikachuSpriteImageIdx], a + ret + +Func_fcae2: ; fcae2 (3f:4ae2) + ld hl, wSprite01MapY - wSprite01SpriteStateData1 + add hl, bc + ld a, [wYCoord] + add $4 + cp [hl] + jr nz, .on_screen + inc hl + ld a, [wXCoord] + add $4 + cp [hl] + jr nz, .on_screen + ld hl, wSprite01SpriteImageIdx - wSprite01SpriteStateData1 + add hl, bc + ld [hl], $ff + scf + ret + +.on_screen + and a + ret + +IsPikachuRightNextToPlayer: ; fcb01 (3f:4b01) + push bc + push de + push hl + ld bc, wPikachuPictureID + ld a, [wXCoord] + add $4 + ld d, a + ld a, [wYCoord] + add $4 + ld e, a + ld hl, wPlayerMapY - wPlayerSpriteStateData1 + add hl, bc + ld a, [hl] + sub e + and a + jr z, .equal + cp $ff + jr z, .one_away + cp $1 + jr z, .one_away + jr .bad + +.one_away + ld hl, wPlayerMapX - wPlayerSpriteStateData1 + add hl, bc + ld a, [hl] + sub d + jr z, .good + jr .bad + +.equal + ld hl, wPlayerMapX - wPlayerSpriteStateData1 + add hl, bc + ld a, [hl] + sub d + cp $ff + jr z, .good + cp $1 + jr z, .good + and a + jr z, .good + jr .bad + +.good + pop hl + pop de + pop bc + scf + ret + +.bad + pop hl + pop de + pop bc + xor a + ret + +GetPikachuFacingDirectionAndReturnToE: ; fcb4d (3f:4b4d) + call GetPikachuFacingDirection + ld e, a + ret + +GetPikachuFacingDirection: ; fcb52 (3f:4b52) + ld bc, wPikachuPictureID + ld a, [wXCoord] + add $4 + ld d, a + ld a, [wYCoord] + add $4 + ld e, a + ld hl, wPlayerMapY - wPlayerSpriteStateData1 + add hl, bc + ld a, [hl] + cp e + jr z, .asm_fcb71 + jr nc, .asm_fcb6e + ld a, SPRITE_FACING_UP + ret + +.asm_fcb6e + ld a, SPRITE_FACING_DOWN + ret + +.asm_fcb71 + ld hl, wPlayerMapX - wPlayerSpriteStateData1 + add hl, bc + ld a, [hl] + cp d + jr z, .asm_fcb81 + jr nc, .asm_fcb7e + ld a, SPRITE_FACING_LEFT + ret + +.asm_fcb7e + ld a, SPRITE_FACING_RIGHT + ret + +.asm_fcb81 + ld a, $ff ; standing + ret + +ClearPikachuFollowCommandBuffer: ; fcb84 (3f:4b84) + push bc + ld hl, wPikachuFollowCommandBufferSize + ld [hl], $ff + inc hl + ld bc, $10 + xor a + call FillMemory + pop bc + ret + +AppendPikachuFollowCommandToBuffer: ; fcb94 (3f:4b94) + ld hl, wPikachuFollowCommandBufferSize + inc [hl] + ld e, [hl] + ld d, 0 + ld hl, wPikachuFollowCommandBuffer + add hl, de + ld [hl], a + ret + +RefreshPikachuFollow: ; fcba1 (3f:4ba1) + call ClearPikachuFollowCommandBuffer + call ComputePikachuFollowCommand + ret c + call AppendPikachuFollowCommandToBuffer + ret + +ComputePikachuFollowCommand: ; fcbac (3f:4bac) + ld bc, wPikachuPictureID + ld hl, wPlayerMapY - wPlayerSpriteStateData1 + add hl, bc + ld a, [wYCoord] + add $4 + sub [hl] + jr z, .checkXCoord + jr c, .pikaAbovePlayer + call CheckAbsoluteValueLessThan2 + jr c, .return1 + ld a, $5 + and a + ret + +.return1 + ld a, $1 + and a + ret + +.pikaAbovePlayer + call CheckAbsoluteValueLessThan2 + jr c, .return2 + ld a, $6 + and a + ret + +.return2 + ld a, $2 + and a + ret + +.checkXCoord + ld hl, wPlayerMapX - wPlayerSpriteStateData1 + add hl, bc + ld a, [wXCoord] + add $4 + sub [hl] + jr z, .pikachuOnTopOfPlayer + jr c, .pikaToLeftOfPlayer + call CheckAbsoluteValueLessThan2 + jr c, .return4 + ld a, $8 + and a + ret + +.return4 + ld a, $4 + and a + ret + +.pikaToLeftOfPlayer + call CheckAbsoluteValueLessThan2 + jr c, .return3 + ld a, $7 + and a + ret + +.return3 + ld a, $3 + and a + ret + +.pikachuOnTopOfPlayer + scf + ret + +CheckAbsoluteValueLessThan2: ; fcc01 (3f:4c01) + jr nc, .positive + cpl + inc a +.positive + cp $2 + ret + +Func_fcc08:: ; fcc08 (3f:4c08) + call Func_fcc23 + ret nc + ld a, [wd736] + bit 6, a + jr nz, .asm_fcc1b + call Func_fcc42 + ret c + call AppendPikachuFollowCommandToBuffer + ret + +.asm_fcc1b + call Func_fcc64 + ret c + call AppendPikachuFollowCommandToBuffer + ret + +Func_fcc23: ; fcc23 (3f:4c28) + ld a, [wPikachuOverworldStateFlags] + bit 5, a + jr nz, .asm_fcc40 + ld a, [wPikachuOverworldStateFlags] + bit 7, a + jr nz, .asm_fcc40 + ld a, [wd472] + bit 7, a + jr z, .asm_fcc40 + ld a, [wWalkBikeSurfState] + and a + jr nz, .asm_fcc40 + scf + ret + +.asm_fcc40 + and a + ret + +Func_fcc42: ; fcc42 (3f:4c42) + xor a + ld a, [wPlayerDirection] + bit 3, a + jr nz, .asm_fcc58 + bit 2, a + jr nz, .asm_fcc5b + bit 1, a + jr nz, .asm_fcc5e + bit 0, a + jr nz, .asm_fcc61 + scf + ret + +.asm_fcc58 + ld a, $2 + ret + +.asm_fcc5b + ld a, $1 + ret + +.asm_fcc5e + ld a, $3 + ret + +.asm_fcc61 + ld a, $4 + ret + +Func_fcc64: ; fcc64 (3f:4c64) + ld hl, wPikachuOverworldStateFlags + bit 6, [hl] + jr z, .asm_fcc6e + res 6, [hl] + ret + +.asm_fcc6e + set 6, [hl] + xor a + ld a, [wPlayerDirection] + bit 3, a + jr nz, .asm_fcc86 + bit 2, a + jr nz, .asm_fcc89 + bit 1, a + jr nz, .asm_fcc8c + bit 0, a + jr nz, .asm_fcc8f + scf + ret + +.asm_fcc86 + ld a, $6 + ret + +.asm_fcc89 + ld a, $5 + ret + +.asm_fcc8c + ld a, $7 + ret + +.asm_fcc8f + ld a, $8 + ret + +Func_fcc92: ; fcc92 (3f:4c92) + ld hl, wPikachuFollowCommandBufferSize + ld a, [hl] + cp $ff + jr z, .asm_fccb0 + and a + jr z, .asm_fccb0 + dec [hl] + ld e, a + ld d, 0 + ld hl, wPikachuFollowCommandBuffer + add hl, de + inc e + ld a, $ff +.asm_fcca8 + ld d, [hl] + ldd [hl], a + ld a, d + dec e + jr nz, .asm_fcca8 + and a + ret + +.asm_fccb0 + scf + ret + +ComputePikachuFacingDirection:: ; fccb2 (3f:4cb2) + call GetPikachuFollowCommandIfBufferSizeNonzero + and a + jr z, .check_y + dec a + and $3 + add a + add a + jr .load + +.check_y + ld a, [wYCoord] + add $4 + ld d, a + ld a, [wXCoord] + add $4 + ld e, a + ld a, [wPikachuMapY] + cp d + jr z, .check_x + ld a, SPRITE_FACING_DOWN + jr c, .load + ld a, SPRITE_FACING_UP + jr .load + +.check_x + ld a, [wPikachuMapX] + cp e + jr z, .copy_from_player + ld a, SPRITE_FACING_RIGHT + jr c, .load + ld a, SPRITE_FACING_LEFT + jr .load + +.copy_from_player + ld a, [wPlayerFacingDirection] +.load + ld [wPikachuFacingDirection], a + ret + +GetPikachuFollowCommand: ; fccee (3f:4cee) + ld hl, wPikachuFollowCommandBufferSize + ld a, [hl] + cp $ff + jr z, .asm_fccff + ld e, a + ld d, 0 + ld hl, wPikachuFollowCommandBuffer + add hl, de + ld a, [hl] + ret + +.asm_fccff + xor a + ret + +GetPikachuFollowCommandIfBufferSizeNonzero: ; fcd01 (3f:4d01) + ld hl, wPikachuFollowCommandBufferSize + ld a, [hl] + cp $ff + jr z, .default + and a + jr z, .default + ld e, a + ld d, 0 + ld hl, wPikachuFollowCommandBuffer + add hl, de + ld a, [hl] + ret + +.default + xor a + ret + +AreThereAtLeastTwoStepsInPikachuFollowCommandBuffer: ; fcd17 (3f:4d17) + ld a, [wPikachuFollowCommandBufferSize] + cp $ff + ret z + cp $2 + jr nc, .set_carry + and a + ret + +.set_carry + scf + ret + +WillPikachuSpawnOnTheScreen: ; fcd25 (3f:4d25) + ld h, wSpriteStateData2 / $100 + ld a, [H_CURRENTSPRITEOFFSET] ; If we're here, this can only be $f0 + add wPikachuMapY - wPikachuSpriteStateData2 + ld l, a + ld b, [hl] + ld a, [wYCoord] + cp b + jr z, .same_y + jr nc, .not_on_screen + add (SCREEN_HEIGHT / 2) - 1 + cp b + jr c, .not_on_screen +.same_y + inc l + ld b, [hl] + ld a, [wXCoord] + cp b + jr z, .same_x + jr nc, .not_on_screen + add (SCREEN_WIDTH / 2) - 1 + cp b + jr c, .not_on_screen +.same_x + call .GetNPCCurrentTile + ld d, $60 + ld a, [hli] + ld e, a + cp d + jr nc, .not_on_screen + ld a, [hld] + cp d + jr nc, .not_on_screen + ld bc, -20 + add hl, bc + ld a, [hli] + cp d + jr nc, .not_on_screen + ld a, [hl] + cp d + jr c, .on_screen +.not_on_screen + ld h, wSpriteStateData1 / $100 + ld a, [H_CURRENTSPRITEOFFSET] + add wPikachuSpriteImageIdx - wPikachuSpriteStateData1 + ld l, a + ld [hl], $ff + scf + jr .return + +.on_screen + ld h, wSpriteStateData2 / $100 + ld a, [H_CURRENTSPRITEOFFSET] + add wPikachuGrassPriority - wPikachuSpriteStateData2 + ld l, a + ld a, [wGrassTile] + cp e + ld a, $0 + jr nz, .priority + ld a, $80 +.priority + ld [hl], a + and a +.return + ret + +.GetNPCCurrentTile: ; fcd83 (3f:4d83) + ld h, wSpriteStateData1 / $100 + ld a, [H_CURRENTSPRITEOFFSET] + add wPikachuYPixels - wPikachuSpriteStateData1 + ld l, a + ld a, [hli] + add $4 + and $f0 + srl a + ld c, a + ld b, $0 + inc l + ld a, [hl] + add $2 + srl a + srl a + srl a + add SCREEN_WIDTH + ld d, 0 + ld e, a + ld hl, wTileMap + rept 5 + add hl, bc + endr + add hl, de + ret + +ComparePikachuHappinessTo80: ; fcdad (3f:4dad) +; preserves a and bc + push bc + push af + ld a, [wPikachuHappiness] + cp 80 + pop bc + ld a, b + pop bc + ret diff --git a/engine/pikachu_movement.asm b/engine/pikachu_movement.asm new file mode 100755 index 00000000..fbb71ffd --- /dev/null +++ b/engine/pikachu_movement.asm @@ -0,0 +1,1039 @@ +ApplyPikachuMovementData_:: ; fd2a1 (3f:52a1) + ld a, b + ld [wPikachuMovementScriptBank], a + ld a, l + ld [wPikachuMovementScriptAddress], a + ld a, h + ld [wPikachuMovementScriptAddress + 1], a + call PikachuSwapSpriteStateData +.loop + call LoadPikachuMovementCommandData + jr nc, .done + call ExecutePikachuMovementCommand + jr .loop + +.done + call PikachuSwapSpriteStateData + call DelayFrame + ret + +PikachuSwapSpriteStateData: + ld a, [wUpdateSpritesEnabled] + push af + ld a, $ff + ld [wUpdateSpritesEnabled], a + push hl + push de + push bc + + ld hl, wSpriteStateData1 + ld de, wPikachuSpriteStateData1 + ld c, $10 + call SwapBytes3f + + ld hl, wSpriteStateData2 + ld de, wPikachuSpriteStateData2 + ld c, $10 + call SwapBytes3f + + pop bc + pop de + pop hl + pop af + ld [wUpdateSpritesEnabled], a + ret + +SwapBytes3f: +.loop + ld b, [hl] + ld a, [de] + ld [hli], a + ld a, b + ld [de], a + inc de + dec c + jr nz, .loop + ret + +LoadPikachuMovementCommandData: + call GetPikachuMovementScriptByte + cp $3f + ret z + ld c, a + ld b, 0 + ld hl, Data_fd3b0 + add hl, bc + add hl, bc + add hl, bc + add hl, bc + ld a, [hli] + ld [wPikaPicAnimPointer + 1], a + ld a, [hli] + cp $80 + jr nz, .no_param + call GetPikachuMovementScriptByte +.no_param + ld [wPikaPicAnimPointer], a + ld a, [hli] + ld [wPikaPicAnimCurGraphicID], a + ld a, [hli] + cp $80 + jr nz, .no_param2 + call GetPikachuMovementScriptByte +.no_param2 + ld [wPikaPicAnimPointerSetupFinished], a + xor a + ld [wPikaPicAnimTimer], a + scf + ret + +ExecutePikachuMovementCommand: + xor a + ld [wd44d], a + ld [wd457], a + ld [wd458], a + ld a, [wPlayerGrassPriority] + push af +.loop + ld bc, wSpriteStateData1 + ld a, [wPikaPicAnimPointer + 1] + ld hl, Jumptable_fd4ac + call .JumpTable + ld a, [wPikaPicAnimCurGraphicID] + ld hl, Jumptable_fd65c + call .JumpTable + call Func_fd36e + call Func_fd39d + call DelayFrame + call DelayFrame + ld hl, wd44d + bit 7, [hl] + jr z, .loop + pop af + ld [wPlayerGrassPriority], a + scf + ret + +.JumpTable: + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp [hl] + +Func_fd36e: + ld hl, 2 + add hl, bc + ld a, [wPikaPicAnimTimer + 1] + ld [hl], a + ld a, [wPikaSpriteY] + ld d, a + ld a, [wd456] + add d + ld hl, 4 + add hl, bc + ld [hl], a + ld a, [wPikaPicAnimDelay] + ld d, a + ld a, [wPikaPicTextboxStartY] + add d + ld hl, 6 + add hl, bc + ld [hl], a + ld hl, wd44d + bit 6, [hl] + ret z + ld hl, wPlayerGrassPriority - wSpriteStateData1 + add hl, bc + ld [hl], 0 + ret + +Func_fd39d: + ld hl, wd44d + bit 6, [hl] + res 6, [hl] + ld hl, wd736 + res 6, [hl] + ret z + set 6, [hl] + call Func_fd7f3 + ret + +Data_fd3b0: + db $01, $00, $00, $00 ; $00 + db $03, $80, $01, $00 ; $01 + db $04, $80, $01, $00 ; $02 + db $05, $80, $01, $00 ; $03 + db $06, $80, $01, $00 ; $04 + db $07, $80, $01, $00 ; $05 + db $08, $80, $01, $00 ; $06 + db $09, $80, $01, $00 ; $07 + db $0a, $80, $01, $00 ; $08 + db $03, $80, $06, $00 ; $09 + db $04, $80, $06, $00 ; $0a + db $05, $80, $06, $00 ; $0b + db $06, $80, $06, $00 ; $0c + db $07, $80, $06, $00 ; $0d + db $08, $80, $06, $00 ; $0e + db $09, $80, $06, $00 ; $0f + db $0a, $80, $06, $00 ; $10 + db $03, $80, $03, $80 ; $11 + db $04, $80, $03, $80 ; $12 + db $05, $80, $03, $80 ; $13 + db $06, $80, $03, $80 ; $14 + db $07, $80, $03, $80 ; $15 + db $08, $80, $03, $80 ; $16 + db $09, $80, $03, $80 ; $17 + db $0a, $80, $03, $80 ; $18 + db $03, $80, $07, $80 ; $19 + db $04, $80, $07, $80 ; $1a + db $05, $80, $07, $80 ; $1b + db $06, $80, $07, $80 ; $1c + db $0b, $27, $02, $00 ; $1d step down + db $0c, $27, $02, $00 ; $1e step up + db $0d, $27, $02, $00 ; $1f step left + db $0e, $27, $02, $00 ; $20 step right + db $0f, $27, $02, $00 ; $21 + db $10, $27, $02, $00 ; $22 + db $11, $27, $02, $00 ; $23 + db $12, $27, $02, $00 ; $24 + db $0b, $0f, $02, $00 ; $25 + db $0c, $0f, $02, $00 ; $26 + db $0d, $0f, $02, $00 ; $27 + db $0e, $0f, $02, $00 ; $28 + db $0f, $0f, $02, $00 ; $29 + db $10, $0f, $02, $00 ; $2a + db $11, $0f, $02, $00 ; $2b + db $12, $0f, $02, $00 ; $2c + db $0b, $0f, $08, $17 ; $2d + db $0c, $0f, $08, $17 ; $2e + db $0d, $0f, $08, $17 ; $2f + db $0e, $0f, $08, $17 ; $30 + db $0f, $0f, $08, $17 ; $31 + db $10, $0f, $08, $17 ; $32 + db $11, $0f, $08, $17 ; $33 + db $12, $0f, $08, $17 ; $34 + db $13, $0f, $06, $00 ; $35 look down + db $14, $0f, $06, $00 ; $36 look up + db $15, $0f, $06, $00 ; $37 look left + db $16, $0f, $06, $00 ; $38 look right + db $02, $80, $04, $00 ; $39 + db $02, $80, $05, $00 ; $3a + db $02, $80, $03, $80 ; $3b + db $02, $80, $07, $80 ; $3c + db $02, $80, $09, $80 ; $3d + db $02, $80, $06, $00 ; $3e + +Jumptable_fd4ac: + dw Func_fd4e5 + dw Func_fd4e9 + dw Func_fd504 + dw Func_fd50c + dw Func_fd511 + dw Func_fd518 + dw Func_fd52c + dw Func_fd540 + dw Func_fd553 + dw Func_fd566 + dw Func_fd579 + dw Func_fd5b1 + dw Func_fd5b5 + dw Func_fd5b9 + dw Func_fd5bd + dw Func_fd5c1 + dw Func_fd5c5 + dw Func_fd5c9 + dw Func_fd5cd + dw Func_fd5ea + dw Func_fd5ee + dw Func_fd5f2 + dw Func_fd5f6 + dw Func_fd4e5 + +Func_fd4dc: + ld a, [wd44d] + set 7, a + ld [wd44d], a + ret + +Func_fd4e5: + call Func_fd4dc + ret + +Func_fd4e9: + ld hl, 4 + add hl, bc + ld a, [hl] + ld [wPikaSpriteY], a + ld hl, 6 + add hl, bc + ld a, [hl] + ld [wPikaPicAnimDelay], a + xor a + ld [wd456], a + ld [wPikaPicTextboxStartY], a + call Func_fd4dc + ret + +Func_fd504: + call Func_fd775 + ret nz + call Func_fd4dc + ret + +Func_fd50c: + call GetObjectFacing + jr asm_fd58c + +Func_fd511: + call GetObjectFacing + xor %100 + jr asm_fd58c + +Func_fd518: + call GetObjectFacing + ld hl, Data_fd523 + call Func_fd5a0 + jr asm_fd58c + +Data_fd523: + db SPRITE_FACING_DOWN, SPRITE_FACING_RIGHT + db SPRITE_FACING_UP, SPRITE_FACING_LEFT + db SPRITE_FACING_LEFT, SPRITE_FACING_DOWN + db SPRITE_FACING_RIGHT, SPRITE_FACING_UP + db $ff + +Func_fd52c: + call GetObjectFacing + ld hl, Data_fd537 + call Func_fd5a0 + jr asm_fd58c + +Data_fd537: + db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT + db SPRITE_FACING_UP, SPRITE_FACING_RIGHT + db SPRITE_FACING_LEFT, SPRITE_FACING_UP + db SPRITE_FACING_RIGHT, SPRITE_FACING_DOWN + db $ff + +Func_fd540: + call GetObjectFacing + ld hl, Data_fd54b + call Func_fd5a0 + jr asm_fd58c + +Data_fd54b: + db SPRITE_FACING_DOWN, SPRITE_FACING_UP | $10 + db SPRITE_FACING_UP, SPRITE_FACING_LEFT | $10 + db SPRITE_FACING_LEFT, SPRITE_FACING_DOWN | $10 + db SPRITE_FACING_RIGHT, SPRITE_FACING_RIGHT | $10 + +Func_fd553: + call GetObjectFacing + ld hl, Data_fd55e + call Func_fd5a0 + jr asm_fd58c + +Data_fd55e: + db SPRITE_FACING_DOWN, SPRITE_FACING_DOWN | $10 + db SPRITE_FACING_UP, SPRITE_FACING_RIGHT | $10 + db SPRITE_FACING_LEFT, SPRITE_FACING_LEFT | $10 + db SPRITE_FACING_RIGHT, SPRITE_FACING_UP | $10 + +Func_fd566: + call GetObjectFacing + ld hl, Data_fd571 + call Func_fd5a0 + jr asm_fd58c + +Data_fd571: + db SPRITE_FACING_DOWN, SPRITE_FACING_RIGHT | $10 + db SPRITE_FACING_UP, SPRITE_FACING_DOWN | $10 + db SPRITE_FACING_LEFT, SPRITE_FACING_UP | $10 + db SPRITE_FACING_RIGHT, SPRITE_FACING_LEFT | $10 + +Func_fd579: + call GetObjectFacing + ld hl, Data_fd584 + call Func_fd5a0 + jr asm_fd58c + +Data_fd584: + db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT | $10 + db SPRITE_FACING_UP, SPRITE_FACING_UP | $10 + db SPRITE_FACING_LEFT, SPRITE_FACING_RIGHT | $10 + db SPRITE_FACING_RIGHT, SPRITE_FACING_DOWN | $10 + +asm_fd58c + rrca + rrca + and $7 + ld e, a + call Func_fd784 + ld d, a + call UpdatePikachuPosition + call Func_fd775 + ret nz + call Func_fd4dc + ret + +Func_fd5a0: + push de + ld d, a +.asm_fd5a2 + ld a, [hli] + cp d + jr z, .asm_fd5ad + inc hl + cp $ff + jr nz, .asm_fd5a2 + pop de + ret + +.asm_fd5ad + ld a, [hl] + pop de + scf + ret + +Func_fd5b1: + ld a, SPRITE_FACING_DOWN >> 2 + jr asm_fd5d1 + +Func_fd5b5: + ld a, SPRITE_FACING_UP >> 2 + jr asm_fd5d1 + +Func_fd5b9: + ld a, SPRITE_FACING_LEFT >> 2 + jr asm_fd5d1 + +Func_fd5bd: + ld a, SPRITE_FACING_RIGHT >> 2 + jr asm_fd5d1 + +Func_fd5c1: + ld e, 4 + jr asm_fd5d5 + +Func_fd5c5: + ld e, 5 + jr asm_fd5d5 + +Func_fd5c9: + ld e, 6 + jr asm_fd5d5 + +Func_fd5cd: + ld e, 7 + jr asm_fd5d5 + +asm_fd5d1 + ld e, a + call SetObjectFacing +asm_fd5d5 + call Func_fd784 + ld d, a + push de + call UpdatePikachuPosition + pop de + call Func_fd775 + ret nz + ld a, e + call Func_fd7cb + call Func_fd4dc + ret + +Func_fd5ea: + ld a, SPRITE_FACING_DOWN >> 2 + jr asm_fd5fa + +Func_fd5ee: + ld a, SPRITE_FACING_UP >> 2 + jr asm_fd5fa + +Func_fd5f2: + ld a, SPRITE_FACING_LEFT >> 2 + jr asm_fd5fa + +Func_fd5f6: + ld a, SPRITE_FACING_RIGHT >> 2 + jr asm_fd5fa + +asm_fd5fa + call SetObjectFacing + call Func_fd4dc + ret + +UpdatePikachuPosition: + push de + ld d, 0 + ld hl, Jumptable_fd60f + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + pop de + ld a, d + jp [hl] + +Jumptable_fd60f: + dw MovePikachuSpriteDown + dw MovePikachuSpriteUp + dw MovePikachuSpriteLeft + dw MovePikachuSpriteRight + dw MovePikachuSpriteDownLeft + dw MovePikachuSpriteDownRight + dw MovePikachuSpriteUpLeft + dw MovePikachuSpriteUpRight + +MovePikachuSpriteDown: + ld d, 0 + ld e, a + jr asm_fd64d + +MovePikachuSpriteUp: + ld d, 0 + cpl + inc a + ld e, a + jr asm_fd64d + +MovePikachuSpriteLeft: + cpl + inc a + ld d, a + ld e, 0 + jr asm_fd64d + +MovePikachuSpriteRight: + ld d, a + ld e, 0 + jr asm_fd64d + +MovePikachuSpriteDownLeft: + ld e, a + cpl + inc a + ld d, a + jr asm_fd64d + +MovePikachuSpriteDownRight: + ld e, a + ld d, a + jr asm_fd64d + +MovePikachuSpriteUpLeft: + cpl + inc a + ld e, a + ld d, a + jr asm_fd64d + +MovePikachuSpriteUpRight: + ld d, a + cpl + inc a + ld e, a + jr asm_fd64d + +asm_fd64d + ld a, [wPikaPicAnimDelay] + add d + ld [wPikaPicAnimDelay], a + ld a, [wPikaSpriteY] + add e + ld [wPikaSpriteY], a + ret + +Jumptable_fd65c: + dw Func_fd678 + dw Func_fd6a3 + dw Func_fd698 + dw Func_fd6f4 + dw Func_fd6ff + dw Func_fd718 + dw Func_fd68c + dw Func_fd6c6 + dw Func_fd6c0 + dw Func_fd6e2 + dw Func_fd68b + +Func_fd672: + ld hl, wd44d + set 6, [hl] + ret + +Func_fd678: + ld hl, 7 + add hl, bc + xor a + ld [hli], a + ld [hl], a + call Func_fd74a + ld d, a + call GetObjectFacing + or d + ld [wPikaPicAnimTimer + 1], a + ret + +Func_fd68b: + ret + +Func_fd68c: + call Func_fd74a + ld d, a + call Func_fd755 + or d + ld [wPikaPicAnimTimer + 1], a + ret + +Func_fd698: + call Func_fd74a + ld d, a + call GetObjectFacing + or d + ld d, a + jr asm_fd6ac + +Func_fd6a3: + call Func_fd74a + ld d, a + call Func_fd755 + or d + ld d, a +asm_fd6ac + ld hl, 8 + add hl, bc + call Func_fd78e + jr nz, .asm_fd6b6 + inc [hl] +.asm_fd6b6 + ld a, [hl] + rrca + rrca + and 3 + or d + ld [wPikaPicAnimTimer + 1], a + ret + +Func_fd6c0: + call GetObjectFacing + ld d, a + jr asm_fd6ca + +Func_fd6c6: + call Func_fd755 + ld d, a +asm_fd6ca + call Func_fd74a + or d + ld d, a + call Func_fd736 + or d + ld [wPikaPicAnimTimer + 1], a + call Func_fd79d + ld [wd456], a + and a + ret z + call Func_fd672 + ret + +Func_fd6e2: + call GetObjectFacing + ld d, a + call Func_fd74a + or d + ld [wPikaPicAnimTimer + 1], a + call Func_fd79d + ld [wd456], a + ret + +Func_fd6f4: + ld a, [wPikaPicAnimPointerSetupFinished] + and $40 + cp $40 + jr z, Func_fd6ff + jr Func_fd718 + +Func_fd6ff: + call Func_fd755 + ld d, a + call Func_fd78e + jr nz, .asm_fd710 + ld hl, Data_fd731 +.asm_fd70b + ld a, [hli] + cp d + jr nz, .asm_fd70b + ld d, [hl] +.asm_fd710 + call Func_fd74a + or d + ld [wPikaPicAnimTimer + 1], a + ret + +Func_fd718: + call Func_fd755 + ld d, a + call Func_fd78e + jr nz, .asm_fd529 + ld hl, Data_fd731End +.asm_fd524 + ld a, [hld] + cp d + jr nz, .asm_fd524 + ld d, [hl] +.asm_fd529 + call Func_fd74a + or d + ld [wPikaPicAnimTimer + 1], a + ret + +Data_fd731: + db SPRITE_FACING_DOWN + db SPRITE_FACING_LEFT + db SPRITE_FACING_UP + db SPRITE_FACING_RIGHT + db SPRITE_FACING_DOWN +Data_fd731End: + +Func_fd736: + push hl + ld hl, 7 + add hl, bc + ld a, [hl] + inc a + and $3 + ld [hli], a + jr nz, .asm_fd747 + ld a, [hl] + inc a + and $3 + ld [hl], a +.asm_fd747 + ld a, [hl] + pop hl + ret + +Func_fd74a: + push hl + ld hl, wSpriteStateData2 - wSpriteStateData1 + 14 + add hl, bc + ld a, [hl] + dec a + swap a + pop hl + ret + +Func_fd755: + push hl + ld hl, 2 + add hl, bc + ld a, [hl] + and $c + pop hl + ret + +GetObjectFacing: + push hl + ld hl, 9 + add hl, bc + ld a, [hl] + and $c + pop hl + ret + +SetObjectFacing: + push hl + ld hl, 9 + add hl, bc + add a + add a + and $c + ld [hl], a + pop hl + ret + +Func_fd775: + ld hl, wd457 + inc [hl] + ld a, [wPikaPicAnimPointer] + and $1f + inc a + cp [hl] + ret nz + ld [hl], 0 + ret + +Func_fd784: + ld a, [wPikaPicAnimPointer] + swap a + rrca + and $3 + inc a + ret + +Func_fd78e: + ld hl, wd458 + inc [hl] + ld a, [wPikaPicAnimPointerSetupFinished] + and $f + inc a + cp [hl] + ret nz + ld [hl], 0 + ret + +Func_fd79d: + call Func_fd7b2 + ld a, [wd458] + add e + ld [wd458], a + add $20 + ld e, a + push hl + push bc + call Sine_e + pop bc + pop hl + ret + +Func_fd7b2: + ld a, [wPikaPicAnimPointerSetupFinished] + and $f + inc a + ld d, a + ld a, [wPikaPicAnimPointerSetupFinished] + swap a + and $7 + ld e, a + ld a, 1 + jr z, .asm_fd7c9 +.asm_fd7c5 + add a + dec e + jr nz, .asm_fd7c5 +.asm_fd7c9 + ld e, a + ret + +Func_fd7cb: + push bc + ld c, a + ld b, 0 + ld hl, Data_fd7e3 + add hl, bc + add hl, bc + ld d, [hl] + inc hl + ld e, [hl] + pop bc + ld hl, wSpriteStateData2 - wSpriteStateData1 + 4 + add hl, bc + ld a, [hl] + add e + ld [hli], a + ld a, [hl] + add d + ld [hl], a + ret + +Data_fd7e3: + db 0, 1 + db 0, -1 + db -1, 0 + db 1, 0 + db -1, 1 + db 1, 1 + db -1, -1 + db 1, -1 + +Func_fd7f3: + push bc + push de + push hl + + ld bc, wOAMBuffer + 4 * 36 + ld a, [wPikaSpriteY] + ld e, a + ld a, [wPikaPicAnimDelay] + ld d, a + ld hl, Data_fd80b + call Func_fd814 + + pop hl + pop de + pop bc + ret + +Data_fd80b: + db $02 + db $0c, $00, $ff, 0 + db $0c, $08, $ff, 1 << OAM_X_FLIP + +Func_fd814: + ld a, e + add $10 + ld e, a + ld a, d + add $8 + ld d, a + ld a, [hli] +.asm_fd81d + push af + ld a, [hli] + add e + ld [bc], a + inc bc + ld a, [hli] + add d + ld [bc], a + inc bc + ld a, [hli] + ld [bc], a + inc bc + ld a, [hli] + ld [bc], a + inc bc + pop af + dec a + jr nz, .asm_fd81d + ret + +LoadPikachuShadowIntoVRAM: + ld hl, vNPCSprites2 + $7f * $10 + ld de, LedgeHoppingShadowGFX_3F + lb bc, BANK(LedgeHoppingShadowGFX_3F), (LedgeHoppingShadowGFX_3FEnd - LedgeHoppingShadowGFX_3F) / 8 + jp CopyVideoDataDoubleAlternate + +LedgeHoppingShadowGFX_3F: +INCBIN "gfx/ledge_hopping_shadow.1bpp" +LedgeHoppingShadowGFX_3FEnd: + +LoadPikachuBallIconIntoVRAM: + ld hl, vNPCSprites2 + $7e * $10 + ld de, GFX_fd86b + lb bc, BANK(GFX_fd86b), 1 + jp CopyVideoDataDoubleAlternate + +Func_fd851: + ld hl, vNPCSprites + $c * $10 + ld a, 3 +.asm_fd856 + push af + push hl + ld de, GFX_fd86b + lb bc, BANK(GFX_fd86b), 4 + call CopyVideoDataAlternate + pop hl + ld de, 4 * $10 + add hl, de + pop af + dec a + jr nz, .asm_fd856 + ret + +GFX_fd86b: +INCBIN "gfx/unknown_fd86b.2bpp" + +LoadPikachuSpriteIntoVRAM: ; fd8ab (3f:58ab) + ld de, PikachuSprite + lb bc, BANK(PikachuSprite), (SandshrewSprite - PikachuSprite) / 32 + ld hl, vNPCSprites + $c * $10 + push bc + call CopyVideoDataAlternate + ld de, PikachuSprite + $c * $10 + ld hl, vNPCSprites2 + $c * $10 + ld a, [h_0xFFFC] + and a + jr z, .load + ld de, PikachuSprite + $c * $10 + ld hl, vNPCSprites2 + $4c * $10 +.load + pop bc + call CopyVideoDataAlternate + call LoadPikachuShadowIntoVRAM + call LoadPikachuBallIconIntoVRAM + ret + +PikachuPewterPokecenterCheck: ; fd8d4 (3f:58d4) + ld a, [wCurMap] + cp PEWTER_POKECENTER + ret nz + call EnablePikachuFollowingPlayer + call StarterPikachuEmotionCommand_turnawayfromplayer + ret + +PikachuFanClubCheck: ; fd8e1 (3f:58e1) + ld a, [wCurMap] + cp POKEMON_FAN_CLUB + ret nz + call EnablePikachuFollowingPlayer + call StarterPikachuEmotionCommand_turnawayfromplayer + ret + +PikachuBillsHouseCheck: ; fd8ee (3f:58ee) + ld a, [wCurMap] + cp BILLS_HOUSE + ret nz + call EnablePikachuFollowingPlayer + ret + +Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3: ; fd8f8 (3f:58f8) + call LoadCurrentMapView + call UpdateSprites + call Delay3 + ret + +Cosine_e: ; cosine? + ld a, e + add $10 + jr asm_fd908 + +Sine_e: ; sine? + ld a, e +asm_fd908 + and $3f + cp $20 + jr nc, .asm_fd913 + call GetSine + ld a, h + ret + +.asm_fd913 + and $1f + call GetSine + ld a, h + cpl + inc a + ret + +GetSine: + ld e, a + ld a, d + ld d, 0 + ld hl, SineWave_3f + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, 0 +.asm_fd92b + srl a + jr nc, .asm_fd930 + add hl, de +.asm_fd930 + sla e + rl d + and a + jr nz, .asm_fd92b + ret + +SineWave_3f: + sine_wave $100 diff --git a/engine/pikachu_pcm.asm b/engine/pikachu_pcm.asm new file mode 100755 index 00000000..e0238468 --- /dev/null +++ b/engine/pikachu_pcm.asm @@ -0,0 +1,154 @@ +PlayPikachuSoundClip:: ; f0000 (3c:4000) + ld a, e + ld e, a + ld d, $0 + ld hl, PikachuCriesPointerTable + add hl, de + add hl, de + add hl, de + ld b, [hl] ; bank of pikachu cry data + inc hl + ld a, [hli] ; cry data pointer + ld h, [hl] + ld l, a + ld c, $4 +.loop + dec c + jr z, .done_delay + call DelayFrame + jr .loop + +.done_delay + di + push bc + push hl + ld a, $80 + ld [rNR52], a + ld a, $77 + ld [rNR50], a + xor a + ld [rNR30], a + ld hl, $ff30 ; wave data + ld de, wRedrawRowOrColumnSrcTiles +.saveWaveDataLoop + ld a, [hl] + ld [de], a + inc de + ld a, $ff + ld [hli], a + ld a, l + cp $40 ; end of wave data + jr nz, .saveWaveDataLoop + ld a, $80 + ld [rNR30], a + ld a, [rNR51] + or $44 + ld [rNR51], a + ld a, $ff + ld [rNR31], a + ld a, $20 + ld [rNR32], a + ld a, $ff + ld [rNR33], a + ld a, $87 + ld [rNR34], a + pop hl + pop bc + call PlayPikachuPCM + xor a + ld [wc0f3], a + ld [wc0f4], a + ld a, $80 + ld [rNR52], a + xor a + ld [rNR30], a + ld hl, $ff30 + ld de, wRedrawRowOrColumnSrcTiles +.reloadWaveDataLoop + ld a, [de] + inc de + ld [hli], a + ld a, l + cp $40 ; end of wave data + jr nz, .reloadWaveDataLoop + ld a, $80 + ld [rNR30], a + ld a, [rNR51] + and $bb + ld [rNR51], a + xor a + ld [wChannelSoundIDs+CH4], a + ld [wChannelSoundIDs+CH5], a + ld [wChannelSoundIDs+CH6], a + ld [wChannelSoundIDs+CH7], a + ld a, [H_LOADEDROMBANK] + ei + ret + +PikachuCriesPointerTable: ; f008e (3c:408e) +; format: +; db bank +; dw pointer to cry + +; bank 21 + pikacry_def PikachuCry1 ; 21:4000 + pikacry_def PikachuCry2 ; 21:491a + pikacry_def PikachuCry3 ; 21:4fdc + pikacry_def PikachuCry4 ; 21:59ee + +; bank 22 + pikacry_def PikachuCry5 ; 22:4000 + pikacry_def PikachuCry6 ; 22:5042 + pikacry_def PikachuCry7 ; 22:6254 + +; bank 23 + pikacry_def PikachuCry8 ; 23:4000 + pikacry_def PikachuCry9 ; 23:50ca + pikacry_def PikachuCry10 ; 23:5e0c + +; bank 24 + pikacry_def PikachuCry11 ; 24:4000 + pikacry_def PikachuCry12 ; 24:4722 + pikacry_def PikachuCry13 ; 24:54a4 + +; bank 25 + pikacry_def PikachuCry14 ; 25:4000 + pikacry_def PikachuCry15 ; 25:589a + +; banks 31-34, in no particular order + + pikacry_def PikachuCry16 ; 31:4000 + pikacry_def PikachuCry17 ; 34:4000 + pikacry_def PikachuCry18 ; 31:549a + pikacry_def PikachuCry19 ; 33:4000 + pikacry_def PikachuCry20 ; 32:4000 + pikacry_def PikachuCry21 ; 32:6002 + pikacry_def PikachuCry22 ; 31:63a4 + pikacry_def PikachuCry23 ; 34:4862 + pikacry_def PikachuCry24 ; 33:5632 + pikacry_def PikachuCry25 ; 34:573c + pikacry_def PikachuCry26 ; 33:725c + +; bank 35 + pikacry_def PikachuCry27 ; 35:4000 + pikacry_def PikachuCry28 ; 35:4b5a + pikacry_def PikachuCry29 ; 35:5da4 + pikacry_def PikachuCry30 ; 35:69ce + pikacry_def PikachuCry31 ; 35:6e80 + +; bank 36 + pikacry_def PikachuCry32 ; 36:4000 + pikacry_def PikachuCry33 ; 36:458a + pikacry_def PikachuCry34 ; 36:523c + +; bank 37 + pikacry_def PikachuCry35 ; 37:4000 + pikacry_def PikachuCry36 ; 37:522a + +; banks 36-38 + pikacry_def PikachuCry37 ; 38:4000 + pikacry_def PikachuCry38 ; 38:4dfa + pikacry_def PikachuCry39 ; 37:6e0c + pikacry_def PikachuCry40 ; 38:5a64 + pikacry_def PikachuCry41 ; 36:6746 + pikacry_def PikachuCry42 ; 38:6976 diff --git a/engine/pikachu_pic_animation.asm b/engine/pikachu_pic_animation.asm index 6d588fdb..1ec102f1 100755 --- a/engine/pikachu_pic_animation.asm +++ b/engine/pikachu_pic_animation.asm @@ -1,1714 +1,3 @@ -IsPlayerTalkingToPikachu:: ; fcf0c (3f:4f0c) - ld a, [wd436] - and a - ret z - ld a, [hSpriteIndexOrTextID] - cp $f - ret nz - call InitializePikachuTextID - xor a - ld [hSpriteIndexOrTextID], a - ld [wd436], a - ret - -InitializePikachuTextID: ; fcf20 (3f:4f20) - ld a, $d4 ; display - ld [hSpriteIndexOrTextID], a - xor a - ld [wPlayerMovingDirection], a - ld a, $1 - ld [wAutoTextBoxDrawingControl], a - call DisplayTextID - xor a - ld [wAutoTextBoxDrawingControl], a - ret - -DoStarterPikachuEmotions: ; fcf35 (3f:4f35) - ld e, a - ld d, $0 - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] -.loop - ld a, [de] - inc de - cp $ff - jr z, .done - ld c, a - ld b, $0 - ld hl, StarterPikachuEmotionsJumptable - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - call JumpToAddress - jr .loop -.done - ret - -StarterPikachuEmotionsJumptable: ; fcf54 (3f:4f54) - dw StarterPikachuEmotionCommand_nop ; 0 - dw StarterPikachuEmotionCommand_text ; 1 - dw StarterPikachuEmotionCommand_pcm ; 2 - dw StarterPikachuEmotionCommand_emote ; 3 - dw StarterPikachuEmotionCommand_4 ; 4 - dw StarterPikachuEmotionCommand_5 ; 5 - dw StarterPikachuEmotionCommand_subcmd ; 6 - dw StarterPikachuEmotionCommand_delay ; 7 - dw StarterPikachuEmotionCommand_nop2 ; 8 - dw StarterPikachuEmotionCommand_9 ; 9 - dw StarterPikachuEmotionCommand_nop3 ; a - -StarterPikachuEmotionCommand_nop: ; fcf6a (3f:4f6a) -StarterPikachuEmotionCommand_nop3: ; fcf6a (3f:4f6a) - ret - -StarterPikachuEmotionCommand_text: ; fcf6b (3f:4f6b) - ld a, [de] - ld l, a - inc de - ld a, [de] - ld h, a - inc de - push de - call PrintText - pop de - ret - -StarterPikachuEmotionCommand_pcm: ; fcf77 (3f:4f77) - ld a, [de] - inc de - push de - ld e, a - nop - call PlayPikachuSoundClip_ - pop de - ret - -PlayPikachuSoundClip_: ; fcf81 (3f:4f81) - cp $ff - ret z - callab PlayPikachuSoundClip - ret - -StarterPikachuEmotionCommand_emote: ; fcf8d (3f:4f8d) - ld a, [wUpdateSpritesEnabled] - push af - ld a, $ff - ld [wUpdateSpritesEnabled], a - ld a, [de] - inc de - push de - call ShowPikachuEmoteBubble - pop de - pop af - ld [wUpdateSpritesEnabled], a - ret - -ShowPikachuEmoteBubble: ; fcfa2 (3f:4fa2) - ld [wWhichEmotionBubble], a - ld a, $f - ld [wEmotionBubbleSpriteIndex], a - predef EmotionBubble - ret - -StarterPikachuEmotionCommand_4: ; fcfb0 (3f:4fb0) - ld a, [de] - inc de - ld l, a - ld a, [de] - inc de - ld h, a - push de - ld b, $3f - call Func_fd2a1 - pop de - ret - -StarterPikachuEmotionCommand_delay: ; fcfbe (3f:4fbe) - ld a, [de] - inc de - push de - ld c, a - call DelayFrames - pop de - ret - -StarterPikachuEmotionCommand_subcmd: ; fcfc7 (3f:4fc7) - ld a, [de] - inc de - push de - ld e, a - ld d, $0 - ld hl, Jumptable_fcfda - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - call JumpToAddress - pop de - ret - -Jumptable_fcfda: - dw LoadPikachuSpriteIntoVRAM - dw LoadFontTilePatterns - dw Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3 - dw WaitForTextScrollButtonPress - dw PikachuPewterPokecenterCheck - dw PikachuFanClubCheck - dw PikachuBillsHouseCheck - -StarterPikachuEmotionCommand_nop2: ; fcfe8 (3f:4fe8) - ret - -StarterPikachuEmotionCommand_9: ; fcfe9 (3f:4fe9) - push de - call Func_fcff2 - call UpdateSprites - pop de - ret - -Func_fcff2: ; fcff2 (3f:4ff2) - ld a, [wSpriteStateData1 + $9] - xor $4 - ld [wSpriteStateData1 + $f9], a - ret - -Func_fcffb: ; fcffb (3f:4ffb) -; Inexplicably empty. - rept 5 - nop - endr - ret - -Func_fd001:: ; fd001 (3f:5001) - ld a, e - jr asm_fd00f - -Func_fd004:: ; fd004 (3f:5004) - call Func_fd05e - jr c, asm_fd00f - call GetPikaPicAnimationScriptIndex - call Func_fcffb -asm_fd00f: ; fd00f (3f:500f) - ld [wExpressionNumber], a - ld hl, PikachuEmotionTable - call DoStarterPikachuEmotions - ret - -PikachuEmotionTable: ; fd019 (3f:4019) - dw PikachuEmotion0_fd115 - dw PikachuEmotion1_fd141 - dw PikachuEmotion2_fd116 - dw PikachuEmotion3_fd160 - dw PikachuEmotion4_fd136 - dw PikachuEmotion5_fd14d - dw PikachuEmotion6_fd153 - dw PikachuEmotion7_fd128 - dw PikachuEmotion8_fd147 - dw PikachuEmotion9_fd166 - dw PikachuEmotion10_fd11e - dw PikachuEmotion11_fd173 - dw PikachuEmotion12_fd17a - dw PikachuEmotion13_fd180 - dw PikachuEmotion14_fd189 - dw PikachuEmotion15_fd191 - dw PikachuEmotion16_fd197 - dw PikachuEmotion17_fd19d - dw PikachuEmotion18_fd1a3 - dw PikachuEmotion19_fd1a9 - dw PikachuEmotion20_fd1b1 - dw PikachuEmotion21_fd1b9 - dw PikachuEmotion22_fd1c1 - dw PikachuEmotion23_fd1c7 - dw PikachuEmotion24_fd1cf - dw PikachuEmotion25_fd1d7 - dw PikachuEmotion26_fd1df - dw PikachuEmotion27_fd1eb - dw PikachuEmotion28_fd1f1 - dw PikachuEmotion29_fd1f7 - dw PikachuEmotion30_fd1fc - dw PikachuEmotion31_fd20a - dw PikachuEmotion32_fd213 - dw PikachuEmotion33_fd05d - -PikachuEmotion33_fd05d: ; fd05d (3f:505d) - db $ff - -Func_fd05e: ; fd05e (3f:505e) - ld a, [wCurMap] - cp POKEMON_FAN_CLUB - jr nz, .notFanClub - ld hl, wPreventBlackout - bit 7, [hl] - ld a, $1d - jr z, .asm_fd0c9 - call CheckPikachuFollowingPlayer - ld a, $1e - jr nz, .asm_fd0c9 - jr .asm_fd096 -.notFanClub - ld a, [wCurMap] - cp PEWTER_POKECENTER - jr nz, .notPewterPokecenter - call CheckPikachuFollowingPlayer - ld a, $1a - jr nz, .asm_fd0c9 - jr .asm_fd096 -.notPewterPokecenter - callab Func_f24ae - ld a, e - cp $ff - jr nz, .asm_fd0c9 - jr .asm_fd096 -.asm_fd096 - call IsPlayerPikachuAsleepInParty - ld a, $b - jr c, .asm_fd0c9 - callab Func_fce73 ; same bank - ld a, $1c - jr c, .asm_fd0c9 - ld a, [wCurMap] - cp POKEMONTOWER_1 - jr c, .notInLavenderTower - cp POKEMONTOWER_7 + 1 - ld a, $16 - jr c, .asm_fd0c9 -.notInLavenderTower - ld a, [wd49c] - and a - jr z, .asm_fd0c7 - dec a - ld c, a - ld b, $0 - ld hl, Pointer_fd0cb - add hl, bc - ld a, [hl] - jr .asm_fd0c9 -.asm_fd0c7 - and a - ret -.asm_fd0c9 - scf - ret - -Pointer_fd0cb: - db $12, $15, $17, $18, $19 - -IsPlayerPikachuAsleepInParty:: ; fd0d0 (3f:50d0) - xor a - ld [wWhichPokemon], a -.loop - ld a, [wWhichPokemon] - ld c, a - ld b, $0 - ld hl, wPartySpecies - add hl, bc - ld a, [hl] - cp $ff - jr z, .done - cp PIKACHU - jr nz, .curMonNotStarterPikachu - callab IsThisPartymonStarterPikachu - jr nc, .curMonNotStarterPikachu - ld a, [wWhichPokemon] - ld hl, wPartyMon1Status - ld bc, wPartyMon2 - wPartyMon1 - call AddNTimes - ld a, [hl] - and SLP - jr z, .done - jr .curMonSleepingPikachu -.curMonNotStarterPikachu - ld a, [wWhichPokemon] - cp PARTY_LENGTH - 1 - jr z, .done - inc a - ld [wWhichPokemon], a - jr .loop -.curMonSleepingPikachu - scf - ret -.done - and a - ret - -PikachuEmotion0_fd115: ; fd115 (3f:5115) - db $ff - -PikachuEmotion2_fd116: ; fd116 (3f:5116) - pikaemotion_dummy2 - pikaemotion_emotebubble SMILE_BUBBLE - pikaemotion_pcm PikachuCry35 - pikaemotion_5 $2 - db $ff - -PikachuEmotion10_fd11e: ; fd11e (3f:511e) - pikaemotion_dummy2 - pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES - pikaemotion_emotebubble HEART_BUBBLE - pikaemotion_pcm PikachuCry5 - pikaemotion_5 $a - db $ff - -PikachuEmotion7_fd128: ; fd128 (3f:5128) - pikaemotion_dummy2 - pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES - pikaemotion_4 Pointer_fd224 - pikaemotion_pcm PikachuCry1 - pikaemotion_4 Pointer_fd224 - pikaemotion_5 $7 - db $ff - -PikachuEmotion4_fd136: ; fd136 (3f:5136) - pikaemotion_dummy2 - pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES - pikaemotion_4 Pointer_fd230 - pikaemotion_pcm PikachuCry29 - pikaemotion_5 $4 - db $ff - -PikachuEmotion1_fd141: ; fd141 (3f:5141) - pikaemotion_dummy2 - pikaemotion_pcm - pikaemotion_5 $1 - db $ff - -PikachuEmotion8_fd147: ; fd147 (3f:5147) - pikaemotion_dummy2 - pikaemotion_pcm PikachuCry39 - pikaemotion_5 $8 - db $ff - -PikachuEmotion5_fd14d: ; fd14d (3f:514d) - pikaemotion_dummy2 - pikaemotion_pcm PikachuCry31 - pikaemotion_5 $5 - db $ff - -PikachuEmotion6_fd153: ; fd153 (3f:5153) - pikaemotion_dummy2 - pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES - pikaemotion_pcm - pikaemotion_4 Pointer_fd21e - pikaemotion_emotebubble SKULL_BUBBLE - pikaemotion_5 $6 - db $ff - -PikachuEmotion3_fd160: ; fd160 (3f:5160) - pikaemotion_dummy2 - pikaemotion_pcm PikachuCry40 - pikaemotion_5 $3 - db $ff - -PikachuEmotion9_fd166: ; fd166 (3f:5166) - pikaemotion_dummy2 - pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES - pikaemotion_pcm PikachuCry6 - pikaemotion_4 Pointer_fd218 - pikaemotion_emotebubble SKULL_BUBBLE - pikaemotion_5 $9 - db $ff - -PikachuEmotion11_fd173: ; fd173 (3f:5173) - pikaemotion_emotebubble ZZZ_BUBBLE - pikaemotion_pcm PikachuCry37 - pikaemotion_5 $b - db $ff - -PikachuEmotion12_fd17a: ; fd17a (3f:517a) - pikaemotion_dummy2 - pikaemotion_pcm - pikaemotion_5 $c - db $ff - -PikachuEmotion13_fd180: ; fd180 (3f:5180) - pikaemotion_dummy2 - pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADEXTRAPIKASPRITES - pikaemotion_4 Pointer_fd21e - pikaemotion_5 $d - db $ff - -PikachuEmotion14_fd189: ; fd189 (3f:5189) - pikaemotion_dummy2 - pikaemotion_emotebubble BOLT_BUBBLE - pikaemotion_pcm PikachuCry10 - pikaemotion_5 $e - db $ff - -PikachuEmotion15_fd191: ; fd191 (3f:5191) - pikaemotion_dummy2 - pikaemotion_pcm PikachuCry34 - pikaemotion_5 $f - db $ff - -PikachuEmotion16_fd197: ; fd197 (3f:5197) - pikaemotion_dummy2 - pikaemotion_pcm PikachuCry33 - pikaemotion_5 $10 - db $ff - -PikachuEmotion17_fd19d: ; fd19d (3f:519d) - pikaemotion_dummy2 - pikaemotion_pcm PikachuCry13 - pikaemotion_5 $11 - db $ff - -PikachuEmotion18_fd1a3: ; fd1a3 (3f:51a3) - pikaemotion_dummy2 - pikaemotion_pcm - pikaemotion_5 $12 - db $ff - -PikachuEmotion19_fd1a9: ; fd1a9 (3f:51a9) - pikaemotion_dummy2 - pikaemotion_emotebubble HEART_BUBBLE - pikaemotion_pcm PikachuCry33 - pikaemotion_5 $13 - db $ff - -PikachuEmotion20_fd1b1: ; fd1b1 (3f:51b1) - pikaemotion_dummy2 - pikaemotion_emotebubble HEART_BUBBLE - pikaemotion_pcm PikachuCry5 - pikaemotion_5 $14 - db $ff - -PikachuEmotion21_fd1b9: ; fd1b9 (3f:51b9) - pikaemotion_dummy2 - pikaemotion_emotebubble FISH_BUBBLE - pikaemotion_pcm - pikaemotion_5 $15 - db $ff - -PikachuEmotion22_fd1c1: ; fd1c1 (3f:51c1) - pikaemotion_dummy2 - pikaemotion_pcm PikachuCry4 - pikaemotion_5 $16 - db $ff - -PikachuEmotion23_fd1c7: ; fd1c7 (3f:51c7) - pikaemotion_dummy2 - pikaemotion_pcm PikachuCry19 - pikaemotion_5 $17 - pikaemotion_subcmd PIKAEMOTION_SUBCMD_SHOWMAPVIEW - db $ff - -PikachuEmotion24_fd1cf: ; fd1cf (3f:51cf) - pikaemotion_dummy2 - pikaemotion_emotebubble EXCLAMATION_BUBBLE - pikaemotion_pcm - pikaemotion_5 $18 - db $ff - -PikachuEmotion25_fd1d7: ; fd1d7 (3f:51d7) - pikaemotion_dummy2 - pikaemotion_emotebubble BOLT_BUBBLE - pikaemotion_pcm PikachuCry35 - pikaemotion_5 $19 - db $ff - -PikachuEmotion26_fd1df: ; fd1df (3f:51df) - pikaemotion_dummy2 - pikaemotion_emotebubble ZZZ_BUBBLE - pikaemotion_pcm PikachuCry37 - pikaemotion_5 $1a - pikaemotion_subcmd PIKAEMOTION_SUBCMD_SHOWMAPVIEW - pikaemotion_subcmd PIKAEMOTION_SUBCMD_CHECKPEWTERCENTER - db $ff - -PikachuEmotion27_fd1eb: ; fd1eb (3f:51eb) - pikaemotion_dummy2 - pikaemotion_pcm PikachuCry9 - pikaemotion_5 $1b - db $ff - -PikachuEmotion28_fd1f1: ; fd1f1 (3f:51f1) - pikaemotion_dummy2 - pikaemotion_pcm PikachuCry15 - pikaemotion_5 $1c - db $ff - -PikachuEmotion29_fd1f7: ; fd1f7 (3f:51f7) - pikaemotion_pcm PikachuCry5 - pikaemotion_5 $a - db $ff - -PikachuEmotion30_fd1fc: ; fd1fc (3f:51fc) - pikaemotion_9 - pikaemotion_emotebubble HEART_BUBBLE - pikaemotion_pcm PikachuCry5 - pikaemotion_5 $14 - pikaemotion_subcmd PIKAEMOTION_SUBCMD_SHOWMAPVIEW - pikaemotion_subcmd PIKAEMOTION_SUBCMD_LOADFONT - pikaemotion_subcmd PIKAEMOTION_SUBCMD_CHECKLAVENDERTOWER - db $ff - -PikachuEmotion31_fd20a: ; fd20a (3f:520a) - pikaemotion_pcm PikachuCry19 - pikaemotion_5 $17 - pikaemotion_subcmd PIKAEMOTION_SUBCMD_SHOWMAPVIEW - pikaemotion_subcmd PIKAEMOTION_SUBCMD_CHECKBILLSHOUSE - db $ff - -PikachuEmotion32_fd213: ; fd213 (3f:5213) - pikaemotion_pcm PikachuCry26 - pikaemotion_5 $17 - db $ff - -Pointer_fd218: ; fd218 (3f:5218) - - db $00 - db $39, $01 - db $3e, $1e - db $3f - -Pointer_fd21e: ; fd21e (3f:521e) - db $00 - db $39, $00 - db $3e, $1e - db $3f - -Pointer_fd224: ; fd224 (3f:5224) - db $00 - db $3c, $07, $2f - db $3c, $07, $2f - db $3f - -Pointer_fd22c: ; fd22c (3f:522c) - db $3b, $1f, $03 - db $3f - -Pointer_fd230: ; fd230 (3f:5230) - db $00 - db $3c, $0f, $1f - db $3c, $0f, $1f - db $3f - -Pointer_fd238: ; fd238 (3f:5238) - db $00 - db $05, $07 - db $39, $00 - db $05, $07 - db $06, $07 - db $39, $00 - db $06, $07 - db $08, $07 - db $39, $00 - db $08, $07 - db $07, $07 - db $39, $00 - db $07, $07 - db $3f - -Func_fd252: ; fd252 (3f:5252) - ld a, $40 - ld [h_0xFFFC], a - call LoadPikachuSpriteIntoVRAM - call Func_fd266 - and a - jr z, .asm_fd262 - call Func_159b -.asm_fd262 - xor a - ld [h_0xFFFC], a - ret - -Func_fd266: - ld a, [wSpriteStateData2 + 15 * 16 + 4] - ld e, a - ld a, [wSpriteStateData2 + 15 * 16 + 5] - ld d, a - ld a, [wYCoord] - add 4 - cp e - jr z, .asm_fd280 - jr nc, .asm_fd27e - ld hl, Data_fd294 - ld a, 1 - ret - -.asm_fd27e - xor a - ret - -.asm_fd280 - ld a, [wXCoord] - add 4 - cp d - jr c, .asm_fd28e - ld hl, Data_fd299 - ld a, 2 - ret - -.asm_fd28e - ld hl, Data_fd29d - ld a, 3 - ret - -Data_fd294: - db $00 - db $36 - db $2b - db $34 - db $3f - -Data_fd299: - db $00 - db $36 - db $34 - db $3f - -Data_fd29d: - db $00 - db $36 - db $33 - db $3f - -Func_fd2a1:: ; fd2a1 (3f:52a1) - ld a, b - ld [wd44a], a - ld a, l - ld [wd44b], a - ld a, h - ld [wd44b + 1], a - call PikachuSwapSpriteStateData -.loop - call Func_fd2f5 - jr nc, .done - call Func_fd329 - jr .loop - -.done - call PikachuSwapSpriteStateData - call DelayFrame - ret - -PikachuSwapSpriteStateData: - ld a, [wUpdateSpritesEnabled] - push af - ld a, $ff - ld [wUpdateSpritesEnabled], a - push hl - push de - push bc - - ld hl, wSpriteStateData1 - ld de, wSpriteStateData1 + $f0 - ld c, $10 - call SwapBytes3f - - ld hl, wSpriteStateData2 - ld de, wSpriteStateData2 + $f0 - ld c, $10 - call SwapBytes3f - - pop bc - pop de - pop hl - pop af - ld [wUpdateSpritesEnabled], a - ret - -SwapBytes3f: -.loop - ld b, [hl] - ld a, [de] - ld [hli], a - ld a, b - ld [de], a - inc de - dec c - jr nz, .loop - ret - -Func_fd2f5: - call Func_157c - cp $3f - ret z - ld c, a - ld b, 0 - ld hl, Data_fd3b0 - add hl, bc - add hl, bc - add hl, bc - add hl, bc - ld a, [hli] - ld [wPikaPicAnimPointer + 1], a - ld a, [hli] - cp $80 - jr nz, .asm_fd311 - call Func_157c -.asm_fd311 - ld [wPikaPicAnimPointer], a - ld a, [hli] - ld [wPikaPicAnimCurGraphicID], a - ld a, [hli] - cp $80 - jr nz, .asm_fd320 - call Func_157c -.asm_fd320 - ld [wPikaPicAnimPointerSetupFinished], a - xor a - ld [wPikaPicAnimTimer], a - scf - ret - -Func_fd329: - xor a - ld [$d44c], a - ld [wd457], a - ld [wd458], a - ld a, [wSpriteStateData2 + 7] - push af -.asm_fd337 - ld bc, wSpriteStateData1 - ld a, [wPikaPicAnimPointer + 1] - ld hl, Jumptable_fd4ac - call Func_fd365 - ld a, [wPikaPicAnimCurGraphicID] - ld hl, Jumptable_fd65c - call Func_fd365 - call Func_fd36e - call Func_fd39d - call DelayFrame - call DelayFrame - ld hl, $d44c - bit 7, [hl] - jr z, .asm_fd337 - pop af - ld [wSpriteStateData2 + 7], a - scf - ret - -Func_fd365: - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp [hl] - -Func_fd36e: - ld hl, 2 - add hl, bc - ld a, [wPikaPicAnimTimer + 1] - ld [hl], a - ld a, [wPikaSpriteY] - ld d, a - ld a, [wd456] - add d - ld hl, 4 - add hl, bc - ld [hl], a - ld a, [wPikaPicAnimDelay] - ld d, a - ld a, [wPikaPicTextboxStartY] - add d - ld hl, 6 - add hl, bc - ld [hl], a - ld hl, $d44c - bit 6, [hl] - ret z - ld hl, wSpriteStateData2 + 7 - wSpriteStateData1 - add hl, bc - ld [hl], 0 - ret - -Func_fd39d: - ld hl, $d44c - bit 6, [hl] - res 6, [hl] - ld hl, wd736 - res 6, [hl] - ret z - set 6, [hl] - call Func_fd7f3 - ret - -Data_fd3b0: - db $01, $00, $00, $00 ; $00 - db $03, $80, $01, $00 ; $01 - db $04, $80, $01, $00 ; $02 - db $05, $80, $01, $00 ; $03 - db $06, $80, $01, $00 ; $04 - db $07, $80, $01, $00 ; $05 - db $08, $80, $01, $00 ; $06 - db $09, $80, $01, $00 ; $07 - db $0a, $80, $01, $00 ; $08 - db $03, $80, $06, $00 ; $09 - db $04, $80, $06, $00 ; $0a - db $05, $80, $06, $00 ; $0b - db $06, $80, $06, $00 ; $0c - db $07, $80, $06, $00 ; $0d - db $08, $80, $06, $00 ; $0e - db $09, $80, $06, $00 ; $0f - db $0a, $80, $06, $00 ; $10 - db $03, $80, $03, $80 ; $11 - db $04, $80, $03, $80 ; $12 - db $05, $80, $03, $80 ; $13 - db $06, $80, $03, $80 ; $14 - db $07, $80, $03, $80 ; $15 - db $08, $80, $03, $80 ; $16 - db $09, $80, $03, $80 ; $17 - db $0a, $80, $03, $80 ; $18 - db $03, $80, $07, $80 ; $19 - db $04, $80, $07, $80 ; $1a - db $05, $80, $07, $80 ; $1b - db $06, $80, $07, $80 ; $1c - db $0b, $27, $02, $00 ; $1d step down - db $0c, $27, $02, $00 ; $1e step up - db $0d, $27, $02, $00 ; $1f step left - db $0e, $27, $02, $00 ; $20 step right - db $0f, $27, $02, $00 ; $21 - db $10, $27, $02, $00 ; $22 - db $11, $27, $02, $00 ; $23 - db $12, $27, $02, $00 ; $24 - db $0b, $0f, $02, $00 ; $25 - db $0c, $0f, $02, $00 ; $26 - db $0d, $0f, $02, $00 ; $27 - db $0e, $0f, $02, $00 ; $28 - db $0f, $0f, $02, $00 ; $29 - db $10, $0f, $02, $00 ; $2a - db $11, $0f, $02, $00 ; $2b - db $12, $0f, $02, $00 ; $2c - db $0b, $0f, $08, $17 ; $2d - db $0c, $0f, $08, $17 ; $2e - db $0d, $0f, $08, $17 ; $2f - db $0e, $0f, $08, $17 ; $30 - db $0f, $0f, $08, $17 ; $31 - db $10, $0f, $08, $17 ; $32 - db $11, $0f, $08, $17 ; $33 - db $12, $0f, $08, $17 ; $34 - db $13, $0f, $06, $00 ; $35 look down - db $14, $0f, $06, $00 ; $36 look up - db $15, $0f, $06, $00 ; $37 look left - db $16, $0f, $06, $00 ; $38 look right - db $02, $80, $04, $00 ; $39 - db $02, $80, $05, $00 ; $3a - db $02, $80, $03, $80 ; $3b - db $02, $80, $07, $80 ; $3c - db $02, $80, $09, $80 ; $3d - db $02, $80, $06, $00 ; $3e - -Jumptable_fd4ac: - dw Func_fd4e5 - dw Func_fd4e9 - dw Func_fd504 - dw Func_fd50c - dw Func_fd511 - dw Func_fd518 - dw Func_fd52c - dw Func_fd540 - dw Func_fd553 - dw Func_fd566 - dw Func_fd579 - dw Func_fd5b1 - dw Func_fd5b5 - dw Func_fd5b9 - dw Func_fd5bd - dw Func_fd5c1 - dw Func_fd5c5 - dw Func_fd5c9 - dw Func_fd5cd - dw Func_fd5ea - dw Func_fd5ee - dw Func_fd5f2 - dw Func_fd5f6 - dw Func_fd4e5 - -Func_fd4dc: - ld a, [$d44c] - set 7, a - ld [$d44c], a - ret - -Func_fd4e5: - call Func_fd4dc - ret - -Func_fd4e9: - ld hl, 4 - add hl, bc - ld a, [hl] - ld [wPikaSpriteY], a - ld hl, 6 - add hl, bc - ld a, [hl] - ld [wPikaPicAnimDelay], a - xor a - ld [wd456], a - ld [wPikaPicTextboxStartY], a - call Func_fd4dc - ret - -Func_fd504: - call Func_fd775 - ret nz - call Func_fd4dc - ret - -Func_fd50c: - call GetObjectFacing - jr asm_fd58c - -Func_fd511: - call GetObjectFacing - xor %100 - jr asm_fd58c - -Func_fd518: - call GetObjectFacing - ld hl, Data_fd523 - call Func_fd5a0 - jr asm_fd58c - -Data_fd523: - db SPRITE_FACING_DOWN, SPRITE_FACING_RIGHT - db SPRITE_FACING_UP, SPRITE_FACING_LEFT - db SPRITE_FACING_LEFT, SPRITE_FACING_DOWN - db SPRITE_FACING_RIGHT, SPRITE_FACING_UP - db $ff - -Func_fd52c: - call GetObjectFacing - ld hl, Data_fd537 - call Func_fd5a0 - jr asm_fd58c - -Data_fd537: - db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT - db SPRITE_FACING_UP, SPRITE_FACING_RIGHT - db SPRITE_FACING_LEFT, SPRITE_FACING_UP - db SPRITE_FACING_RIGHT, SPRITE_FACING_DOWN - db $ff - -Func_fd540: - call GetObjectFacing - ld hl, Data_fd54b - call Func_fd5a0 - jr asm_fd58c - -Data_fd54b: - db SPRITE_FACING_DOWN, SPRITE_FACING_UP | $10 - db SPRITE_FACING_UP, SPRITE_FACING_LEFT | $10 - db SPRITE_FACING_LEFT, SPRITE_FACING_DOWN | $10 - db SPRITE_FACING_RIGHT, SPRITE_FACING_RIGHT | $10 - -Func_fd553: - call GetObjectFacing - ld hl, Data_fd55e - call Func_fd5a0 - jr asm_fd58c - -Data_fd55e: - db SPRITE_FACING_DOWN, SPRITE_FACING_DOWN | $10 - db SPRITE_FACING_UP, SPRITE_FACING_RIGHT | $10 - db SPRITE_FACING_LEFT, SPRITE_FACING_LEFT | $10 - db SPRITE_FACING_RIGHT, SPRITE_FACING_UP | $10 - -Func_fd566: - call GetObjectFacing - ld hl, Data_fd571 - call Func_fd5a0 - jr asm_fd58c - -Data_fd571: - db SPRITE_FACING_DOWN, SPRITE_FACING_RIGHT | $10 - db SPRITE_FACING_UP, SPRITE_FACING_DOWN | $10 - db SPRITE_FACING_LEFT, SPRITE_FACING_UP | $10 - db SPRITE_FACING_RIGHT, SPRITE_FACING_LEFT | $10 - -Func_fd579: - call GetObjectFacing - ld hl, Data_fd584 - call Func_fd5a0 - jr asm_fd58c - -Data_fd584: - db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT | $10 - db SPRITE_FACING_UP, SPRITE_FACING_UP | $10 - db SPRITE_FACING_LEFT, SPRITE_FACING_RIGHT | $10 - db SPRITE_FACING_RIGHT, SPRITE_FACING_DOWN | $10 - -asm_fd58c - rrca - rrca - and $7 - ld e, a - call Func_fd784 - ld d, a - call UpdatePikachuPosition - call Func_fd775 - ret nz - call Func_fd4dc - ret - -Func_fd5a0: - push de - ld d, a -.asm_fd5a2 - ld a, [hli] - cp d - jr z, .asm_fd5ad - inc hl - cp $ff - jr nz, .asm_fd5a2 - pop de - ret - -.asm_fd5ad - ld a, [hl] - pop de - scf - ret - -Func_fd5b1: - ld a, SPRITE_FACING_DOWN >> 2 - jr asm_fd5d1 - -Func_fd5b5: - ld a, SPRITE_FACING_UP >> 2 - jr asm_fd5d1 - -Func_fd5b9: - ld a, SPRITE_FACING_LEFT >> 2 - jr asm_fd5d1 - -Func_fd5bd: - ld a, SPRITE_FACING_RIGHT >> 2 - jr asm_fd5d1 - -Func_fd5c1: - ld e, 4 - jr asm_fd5d5 - -Func_fd5c5: - ld e, 5 - jr asm_fd5d5 - -Func_fd5c9: - ld e, 6 - jr asm_fd5d5 - -Func_fd5cd: - ld e, 7 - jr asm_fd5d5 - -asm_fd5d1 - ld e, a - call SetObjectFacing -asm_fd5d5 - call Func_fd784 - ld d, a - push de - call UpdatePikachuPosition - pop de - call Func_fd775 - ret nz - ld a, e - call Func_fd7cb - call Func_fd4dc - ret - -Func_fd5ea: - ld a, SPRITE_FACING_DOWN >> 2 - jr asm_fd5fa - -Func_fd5ee: - ld a, SPRITE_FACING_UP >> 2 - jr asm_fd5fa - -Func_fd5f2: - ld a, SPRITE_FACING_LEFT >> 2 - jr asm_fd5fa - -Func_fd5f6: - ld a, SPRITE_FACING_RIGHT >> 2 - jr asm_fd5fa - -asm_fd5fa - call SetObjectFacing - call Func_fd4dc - ret - -UpdatePikachuPosition: - push de - ld d, 0 - ld hl, Jumptable_fd60f - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - pop de - ld a, d - jp [hl] - -Jumptable_fd60f: - dw MovePikachuSpriteDown - dw MovePikachuSpriteUp - dw MovePikachuSpriteLeft - dw MovePikachuSpriteRight - dw MovePikachuSpriteDownLeft - dw MovePikachuSpriteDownRight - dw MovePikachuSpriteUpLeft - dw MovePikachuSpriteUpRight - -MovePikachuSpriteDown: - ld d, 0 - ld e, a - jr asm_fd64d - -MovePikachuSpriteUp: - ld d, 0 - cpl - inc a - ld e, a - jr asm_fd64d - -MovePikachuSpriteLeft: - cpl - inc a - ld d, a - ld e, 0 - jr asm_fd64d - -MovePikachuSpriteRight: - ld d, a - ld e, 0 - jr asm_fd64d - -MovePikachuSpriteDownLeft: - ld e, a - cpl - inc a - ld d, a - jr asm_fd64d - -MovePikachuSpriteDownRight: - ld e, a - ld d, a - jr asm_fd64d - -MovePikachuSpriteUpLeft: - cpl - inc a - ld e, a - ld d, a - jr asm_fd64d - -MovePikachuSpriteUpRight: - ld d, a - cpl - inc a - ld e, a - jr asm_fd64d - -asm_fd64d - ld a, [wPikaPicAnimDelay] - add d - ld [wPikaPicAnimDelay], a - ld a, [wPikaSpriteY] - add e - ld [wPikaSpriteY], a - ret - -Jumptable_fd65c: - dw Func_fd678 - dw Func_fd6a3 - dw Func_fd698 - dw Func_fd6f4 - dw Func_fd6ff - dw Func_fd718 - dw Func_fd68c - dw Func_fd6c6 - dw Func_fd6c0 - dw Func_fd6e2 - dw Func_fd68b - -Func_fd672: - ld hl, $d44c - set 6, [hl] - ret - -Func_fd678: - ld hl, 7 - add hl, bc - xor a - ld [hli], a - ld [hl], a - call Func_fd74a - ld d, a - call GetObjectFacing - or d - ld [wPikaPicAnimTimer + 1], a - ret - -Func_fd68b: - ret - -Func_fd68c: - call Func_fd74a - ld d, a - call Func_fd755 - or d - ld [wPikaPicAnimTimer + 1], a - ret - -Func_fd698: - call Func_fd74a - ld d, a - call GetObjectFacing - or d - ld d, a - jr asm_fd6ac - -Func_fd6a3: - call Func_fd74a - ld d, a - call Func_fd755 - or d - ld d, a -asm_fd6ac - ld hl, 8 - add hl, bc - call Func_fd78e - jr nz, .asm_fd6b6 - inc [hl] -.asm_fd6b6 - ld a, [hl] - rrca - rrca - and 3 - or d - ld [wPikaPicAnimTimer + 1], a - ret - -Func_fd6c0: - call GetObjectFacing - ld d, a - jr asm_fd6ca - -Func_fd6c6: - call Func_fd755 - ld d, a -asm_fd6ca - call Func_fd74a - or d - ld d, a - call Func_fd736 - or d - ld [wPikaPicAnimTimer + 1], a - call Func_fd79d - ld [wd456], a - and a - ret z - call Func_fd672 - ret - -Func_fd6e2: - call GetObjectFacing - ld d, a - call Func_fd74a - or d - ld [wPikaPicAnimTimer + 1], a - call Func_fd79d - ld [wd456], a - ret - -Func_fd6f4: - ld a, [wPikaPicAnimPointerSetupFinished] - and $40 - cp $40 - jr z, Func_fd6ff - jr Func_fd718 - -Func_fd6ff: - call Func_fd755 - ld d, a - call Func_fd78e - jr nz, .asm_fd710 - ld hl, Data_fd731 -.asm_fd70b - ld a, [hli] - cp d - jr nz, .asm_fd70b - ld d, [hl] -.asm_fd710 - call Func_fd74a - or d - ld [wPikaPicAnimTimer + 1], a - ret - -Func_fd718: - call Func_fd755 - ld d, a - call Func_fd78e - jr nz, .asm_fd529 - ld hl, Data_fd731End -.asm_fd524 - ld a, [hld] - cp d - jr nz, .asm_fd524 - ld d, [hl] -.asm_fd529 - call Func_fd74a - or d - ld [wPikaPicAnimTimer + 1], a - ret - -Data_fd731: - db SPRITE_FACING_DOWN - db SPRITE_FACING_LEFT - db SPRITE_FACING_UP - db SPRITE_FACING_RIGHT - db SPRITE_FACING_DOWN -Data_fd731End: - -Func_fd736: - push hl - ld hl, 7 - add hl, bc - ld a, [hl] - inc a - and $3 - ld [hli], a - jr nz, .asm_fd747 - ld a, [hl] - inc a - and $3 - ld [hl], a -.asm_fd747 - ld a, [hl] - pop hl - ret - -Func_fd74a: - push hl - ld hl, wSpriteStateData2 - wSpriteStateData1 + 14 - add hl, bc - ld a, [hl] - dec a - swap a - pop hl - ret - -Func_fd755: - push hl - ld hl, 2 - add hl, bc - ld a, [hl] - and $c - pop hl - ret - -GetObjectFacing: - push hl - ld hl, 9 - add hl, bc - ld a, [hl] - and $c - pop hl - ret - -SetObjectFacing: - push hl - ld hl, 9 - add hl, bc - add a - add a - and $c - ld [hl], a - pop hl - ret - -Func_fd775: - ld hl, wd457 - inc [hl] - ld a, [wPikaPicAnimPointer] - and $1f - inc a - cp [hl] - ret nz - ld [hl], 0 - ret - -Func_fd784: - ld a, [wPikaPicAnimPointer] - swap a - rrca - and $3 - inc a - ret - -Func_fd78e: - ld hl, wd458 - inc [hl] - ld a, [wPikaPicAnimPointerSetupFinished] - and $f - inc a - cp [hl] - ret nz - ld [hl], 0 - ret - -Func_fd79d: - call Func_fd7b2 - ld a, [wd458] - add e - ld [wd458], a - add $20 - ld e, a - push hl - push bc - call Sine_e - pop bc - pop hl - ret - -Func_fd7b2: - ld a, [wPikaPicAnimPointerSetupFinished] - and $f - inc a - ld d, a - ld a, [wPikaPicAnimPointerSetupFinished] - swap a - and $7 - ld e, a - ld a, 1 - jr z, .asm_fd7c9 -.asm_fd7c5 - add a - dec e - jr nz, .asm_fd7c5 -.asm_fd7c9 - ld e, a - ret - -Func_fd7cb: - push bc - ld c, a - ld b, 0 - ld hl, Data_fd7e3 - add hl, bc - add hl, bc - ld d, [hl] - inc hl - ld e, [hl] - pop bc - ld hl, wSpriteStateData2 - wSpriteStateData1 + 4 - add hl, bc - ld a, [hl] - add e - ld [hli], a - ld a, [hl] - add d - ld [hl], a - ret - -Data_fd7e3: - db 0, 1 - db 0, -1 - db -1, 0 - db 1, 0 - db -1, 1 - db 1, 1 - db -1, -1 - db 1, -1 - -Func_fd7f3: - push bc - push de - push hl - - ld bc, wOAMBuffer + 4 * 36 - ld a, [wPikaSpriteY] - ld e, a - ld a, [wPikaPicAnimDelay] - ld d, a - ld hl, Data_fd80b - call Func_fd814 - - pop hl - pop de - pop bc - ret - -Data_fd80b: - db $02 - db $0c, $00, $ff, 0 - db $0c, $08, $ff, 1 << OAM_X_FLIP - -Func_fd814: - ld a, e - add $10 - ld e, a - ld a, d - add $8 - ld d, a - ld a, [hli] -.asm_fd81d - push af - ld a, [hli] - add e - ld [bc], a - inc bc - ld a, [hli] - add d - ld [bc], a - inc bc - ld a, [hli] - ld [bc], a - inc bc - ld a, [hli] - ld [bc], a - inc bc - pop af - dec a - jr nz, .asm_fd81d - ret - -LoadPikachuShadowIntoVRAM: - ld hl, vNPCSprites2 + $7f * $10 - ld de, LedgeHoppingShadowGFX_3F - lb bc, BANK(LedgeHoppingShadowGFX_3F), (LedgeHoppingShadowGFX_3FEnd - LedgeHoppingShadowGFX_3F) / 8 - jp CopyVideoDataDoubleAlternate - -LedgeHoppingShadowGFX_3F: -INCBIN "gfx/ledge_hopping_shadow.1bpp" -LedgeHoppingShadowGFX_3FEnd: - -LoadPikachuBallIconIntoVRAM: - ld hl, vNPCSprites2 + $7e * $10 - ld de, GFX_fd86b - lb bc, BANK(GFX_fd86b), 1 - jp CopyVideoDataDoubleAlternate - -Func_fd851: - ld hl, vNPCSprites + $c * $10 - ld a, 3 -.asm_fd856 - push af - push hl - ld de, GFX_fd86b - lb bc, BANK(GFX_fd86b), 4 - call CopyVideoDataAlternate - pop hl - ld de, 4 * $10 - add hl, de - pop af - dec a - jr nz, .asm_fd856 - ret - -GFX_fd86b: -INCBIN "gfx/unknown_fd86b.2bpp" - -LoadPikachuSpriteIntoVRAM: ; fd8ab (3f:58ab) - ld de, PikachuSprite - lb bc, BANK(PikachuSprite), (SandshrewSprite - PikachuSprite) / 32 - ld hl, vNPCSprites + $c * $10 - push bc - call CopyVideoDataAlternate - ld de, PikachuSprite + $c * $10 - ld hl, vNPCSprites2 + $c * $10 - ld a, [h_0xFFFC] - and a - jr z, .load - ld de, PikachuSprite + $c * $10 - ld hl, vNPCSprites2 + $4c * $10 -.load - pop bc - call CopyVideoDataAlternate - call LoadPikachuShadowIntoVRAM - call LoadPikachuBallIconIntoVRAM - ret - -PikachuPewterPokecenterCheck: ; fd8d4 (3f:58d4) - ld a, [wCurMap] - cp PEWTER_POKECENTER - ret nz - call EnablePikachuFollowingPlayer - call Func_fcff2 - ret - -PikachuFanClubCheck: ; fd8e1 (3f:58e1) - ld a, [wCurMap] - cp POKEMON_FAN_CLUB - ret nz - call EnablePikachuFollowingPlayer - call Func_fcff2 - ret - -PikachuBillsHouseCheck: ; fd8ee (3f:58ee) - ld a, [wCurMap] - cp BILLS_HOUSE - ret nz - call EnablePikachuFollowingPlayer - ret - -Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3: ; fd8f8 (3f:58f8) - call LoadCurrentMapView - call UpdateSprites - call Delay3 - ret - -Cosine_e: ; cosine? - ld a, e - add $10 - jr asm_fd908 - -Sine_e: ; sine? - ld a, e -asm_fd908 - and $3f - cp $20 - jr nc, .asm_fd913 - call GetSine - ld a, h - ret - -.asm_fd913 - and $1f - call GetSine - ld a, h - cpl - inc a - ret - -GetSine: - ld e, a - ld a, d - ld d, 0 - ld hl, SineWave_3f - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld hl, 0 -.asm_fd92b - srl a - jr nc, .asm_fd930 - add hl, de -.asm_fd930 - sla e - rl d - and a - jr nz, .asm_fd92b - ret - -SineWave_3f: - sine_wave $100 - GetPikaPicAnimationScriptIndex: ; fd978 (3f:5978) ld hl, PikachuMoodLookupTable ld a, [wPikachuMood] @@ -1757,7 +46,7 @@ PikaPicAnimationScriptPointerLookupTable: db $fa, $11, $11, $10, $0a, $0a db $ff, $11, $11, $13, $14, $14 -StarterPikachuEmotionCommand_5: ; fd9d0 (3f:59d0) +StarterPikachuEmotionCommand_pikapic: ; fd9d0 (3f:59d0) ld a, [H_AUTOBGTRANSFERENABLED] push af xor a @@ -1773,26 +62,26 @@ StarterPikachuEmotionCommand_5: ; fd9d0 (3f:59d0) ret Func_fd9e4: - call Func_fda2c - callab Func_720e3 - call Func_fd9ff + call PlacePikapicTextBoxBorder + callab LoadOverworldPikachuFrontpicPalettes + call ResetPikaPicAnimBuffer call LoadCurrentPikaPicAnimScriptPointer call Func_fda9a - call Func_fda2c + call PlacePikapicTextBoxBorder call RunDefaultPaletteCommand ret -Func_fd9ff: - ld hl, wPikaPicAnimPointer - ld bc, $11 +ResetPikaPicAnimBuffer: + ld hl, wCurPikaMovementData + ld bc, wCurPikaMovementDataEnd - wCurPikaMovementData xor a call FillMemory ld hl, wPikaPicAnimObjectDataBufferSize - ld bc, $21 + ld bc, wPikaPicAnimObjectDataBufferEnd - wPikaPicAnimObjectDataBufferSize xor a call FillMemory - call Func_fe15c - ld hl, $64 + call ClearPikaPicUsedGFXBuffer + ld hl, 100 ld a, l ld [wPikaPicAnimTimer], a ld a, h @@ -1803,7 +92,7 @@ Func_fd9ff: ld [wPikaPicTextboxStartY], a ret -Func_fda2c: +PlacePikapicTextBoxBorder: xor a ld [H_AUTOBGTRANSFERENABLED], a coord hl, 6, 5 @@ -2832,9 +1121,9 @@ DecompressRequestPikaPicAnimGFX: ; fe128 .failed ret -Func_fe15c: - ld hl, wNPCMovementDirections - ld bc, $11 +ClearPikaPicUsedGFXBuffer: + ld hl, wPikaPicUsedGFXCount + ld bc, wPikaPicUsedGFXEnd - wPikaPicUsedGFXCount xor a call FillMemory ret @@ -2857,7 +1146,7 @@ GetPikaPicVRAMAddressForNewGFX: CheckIfThereIsRoomForPikaPicAnimGFX: push bc push hl - ld hl, wNPCMovementDirections + 1 + ld hl, wPikaPicUsedGFX ld c, 8 .loop ld a, [hl] @@ -2880,12 +1169,12 @@ CheckIfThereIsRoomForPikaPicAnimGFX: .empty ld [hl], d inc hl - ld a, [wNPCMovementDirections] + ld a, [wPikaPicUsedGFXCount] add $80 ld [hl], a - ld a, [wNPCMovementDirections] + ld a, [wPikaPicUsedGFXCount] add e - ld [wNPCMovementDirections], a + ld [wPikaPicUsedGFXCount], a cp $80 jr z, .asm_fe1a7 jr nc, .failed @@ -2905,7 +1194,7 @@ LookUpTileOffsetForCurrentPikaPicAnimGFX: push bc push hl ld b, a - ld hl, wNPCMovementDirections + 1 + ld hl, wPikaPicUsedGFX ld c, 8 .loop ld a, [hli] @@ -2995,455 +1284,4 @@ GetDMGBGPalForPikaThunderbolt: call DelayFrames ret -Data_fe242: - db 4, %11000000 - db 4, %11100100 - db 4, %11000000 - db 4, %11100100 - db 4, %11000000 - db 4, %11100100 - db 4, %11000000 - db 4, %11100100 - db 4, %11000000 - db 4, %11100100 - db 4, %11000000 - db 4, %11100100 - db 4, %11000000 - db 4, %11100100 - db 4, %11000000 - db 4, %11100100 - db 4, %11000000 - db 4, %11100100 - db 4, %11000000 - db 4, %11100100 - db $ff - -Data_fe26b: ; fe26b (3f:626b) - pikapic_loadgfx Pic_e4000 - pikapic_loadgfx Pic_e49d1 - pikapic_loadgfx PikachuSprite - pikapic_object $1, $80, $0, $0 - pikapic_object $2, $b2, $5, $5 - pikapic_object $3, $b6, $5, $5 - pikapic_waitbgmap - pikapic_cry -Data_fe286: ; fe286 (3f:6286) - pikapic_waitbgmap - pikapic_jump Data_fe286 - -Data_fe28a: ; fe28a (3f:628a) - pikapic_setduration 40 - pikapic_loadgfx Pic_e4000 - pikapic_loadgfx GFX_e40cc - pikapic_object $4, $80, $0, $0 - pikapic_object $6, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry PikachuCry3 -Data_fe2a0: ; fe2a0 (3f:62a0) - pikapic_waitbgmap - pikapic_jump Data_fe2a0 - -Data_fe2a4: ; fe2a4 (3f:62a4) - pikapic_setduration 44 - pikapic_loadgfx Pic_e411c - pikapic_loadgfx GFX_e41d2 - pikapic_object $4, $80, $0, $0 - pikapic_object $7, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe2ba: ; fe2ba (3f:62ba) - pikapic_waitbgmap - pikapic_jump Data_fe2ba - -Data_fe2be: ; fe2be (3f:62be) - pikapic_setduration 80 - pikapic_loadgfx Pic_e4272 - pikapic_loadgfx GFX_e4323 - pikapic_object $4, $80, $0, $0 - pikapic_object $8, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe2d4: ; fe2d4 (3f:62d4) - pikapic_waitbgmap - pikapic_jump Data_fe2d4 - -Data_fe2d8: ; fe2d8 (3f:62d8) - pikapic_setduration 70 - pikapic_loadgfx Pic_e4383 - pikapic_loadgfx GFX_e444b - pikapic_object $4, $80, $0, $0 - pikapic_object $9, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe2ee: ; fe2ee (3f:62ee) - pikapic_waitbgmap - pikapic_jump Data_fe2ee - -Data_fe2f2: ; fe2f2 (3f:62f2) - pikapic_setduration 32 - pikapic_loadgfx Pic_e458b - pikapic_loadgfx GFX_e463b - pikapic_object $4, $80, $0, $0 - pikapic_object $a, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe308: ; fe308 (3f:6308) - pikapic_waitbgmap - pikapic_jump Data_fe308 - -Data_fe30c: ; fe30c (3f:630c) - pikapic_setduration 50 - pikapic_loadgfx Pic_e467b - pikapic_loadgfx GFX_e472e - pikapic_object $4, $80, $0, $0 - pikapic_object $b, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry PikachuCry38 -Data_fe322: ; fe322 (3f:6322) - pikapic_waitbgmap - pikapic_jump Data_fe322 - -Data_fe326: ; fe326 (3f:6326) - pikapic_setduration 58 - pikapic_loadgfx Pic_e476e - pikapic_loadgfx GFX_e4841 - pikapic_object $4, $80, $0, $0 - pikapic_object $c, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe33c: ; fe33c (3f:633c) - pikapic_waitbgmap - pikapic_jump Data_fe33c - -Data_fe340: ; fe340 (3f:6340) - pikapic_setduration 44 - pikapic_loadgfx Pic_e49d1 - pikapic_loadgfx GFX_e4a99 - pikapic_object $4, $80, $0, $0 - pikapic_object $d, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe356: ; fe356 (3f:6356) - pikapic_waitbgmap - pikapic_jump Data_fe356 - -Data_fe35a: ; fe35a (3f:635a) - pikapic_setduration 56 - pikapic_loadgfx Pic_e4b39 - pikapic_loadgfx GFX_e4bde - pikapic_object $4, $80, $0, $0 - pikapic_object $e, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe370: ; fe370 (3f:6370) - pikapic_waitbgmap - pikapic_jump Data_fe370 - -Data_fe374: ; fe374 (3f:6374) - pikapic_setduration 56 - pikapic_loadgfx Pic_e4c3e - pikapic_loadgfx GFX_e4ce0 - pikapic_loadgfx GFX_e4e70 - pikapic_object $4, $80, $0, $0 - pikapic_object $10, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe38c: ; fe38c (3f:638c) - pikapic_waitbgmap - pikapic_jump Data_fe38c - -Data_fe390: ; fe390 (3f:6390) - pikapic_setduration 100 - pikapic_loadgfx Pic_e5000 - pikapic_loadgfx GFX_e50af - pikapic_object $4, $80, $0, $0 - pikapic_object $11, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe3a6: ; fe3a6 (3f:63a6) - pikapic_waitbgmap - pikapic_jump Data_fe3a6 - -Data_fe3aa: ; fe3aa (3f:63aa) - pikapic_setduration 50 - pikapic_loadgfx Pic_e523f - pikapic_loadgfx GFX_e52fe - pikapic_object $4, $80, $0, $0 - pikapic_object $12, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry PikachuCry25 -Data_fe3c0: ; fe3c0 (3f:63c0) - pikapic_waitbgmap - pikapic_jump Data_fe3c0 - -Data_fe3c4: ; fe3c4 (3f:63c4) - pikapic_setduration 50 - pikapic_loadgfx Pic_e548e - pikapic_loadgfx GFX_e5541 - pikapic_object $4, $80, $0, $0 - pikapic_object $13, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe3da: ; fe3da (3f:63da) - pikapic_waitbgmap - pikapic_jump Data_fe3da - -Data_fe3de: ; fe3de (3f:63de) - pikapic_setduration 40 - pikapic_loadgfx Pic_e56d1 - pikapic_loadgfx GFX_e5794 - pikapic_object $4, $80, $0, $0 - pikapic_object $14, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe3f4: ; fe3f4 (3f:63f4) - pikapic_waitbgmap - pikapic_jump Data_fe3f4 - -Data_fe3f8: ; fe3f8 (3f:63f8) - pikapic_setduration 50 - pikapic_loadgfx Pic_e5924 - pikapic_loadgfx GFX_e59ed - pikapic_object $4, $80, $0, $0 - pikapic_object $15, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe40e: ; fe40e (3f:640e) - pikapic_waitbgmap - pikapic_jump Data_fe40e - -Data_fe412: ; fe412 (3f:6412) - pikapic_setduration 32 - pikapic_loadgfx Pic_e5b7d - pikapic_loadgfx GFX_e5c4d - pikapic_object $4, $80, $0, $0 - pikapic_object $16, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe428: ; fe428 (3f:6428) - pikapic_waitbgmap - pikapic_jump Data_fe428 - -Data_fe42c: ; fe42c (3f:642c) - pikapic_setduration 100 - pikapic_loadgfx Pic_e5ddd - pikapic_loadgfx GFX_e5e90 - pikapic_object $4, $80, $0, $0 - pikapic_object $17, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe442: ; fe442 (3f:6442) - pikapic_waitbgmap - pikapic_jump Data_fe442 - -Data_fe446: ; fe446 (3f:6446) - pikapic_setduration 32 - pikapic_loadgfx GFX_e6020 - pikapic_loadgfx GFX_e61b0 - pikapic_object $5, $80, $0, $0 - pikapic_object $18, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry PikachuCry18 -Data_fe45c: ; fe45c (3f:645c) - pikapic_waitbgmap - pikapic_jump Data_fe45c - -Data_fe460: ; fe460 (3f:6460) - pikapic_setduration 44 - pikapic_loadgfx Pic_e6340 - pikapic_loadgfx GFX_e63f7 - pikapic_object $4, $80, $0, $0 - pikapic_object $19, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe476: ; fe476 (3f:6476) - pikapic_waitbgmap - pikapic_jump Data_fe476 - -Data_fe47a: ; fe47a (3f:647a) - pikapic_setduration 50 - pikapic_loadgfx Pic_e6587 - pikapic_loadgfx GFX_e6646 - pikapic_object $4, $80, $0, $0 - pikapic_object $1a, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe490: ; fe490 (3f:6490) - pikapic_waitbgmap - pikapic_jump Data_fe490 - -Data_fe494: ; fe494 (3f:6494) - pikapic_setduration 40 - pikapic_loadgfx Pic_e67d6 - pikapic_loadgfx GFX_e682f - pikapic_loadgfx GFX_e69bf - pikapic_loadgfx GFX_e6b4f - pikapic_loadgfx GFX_e6cdf - pikapic_object $4, $80, $0, $0 - pikapic_object $1b, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry PikachuCry20 -Data_fe4b0: ; fe4b0 (3f:64b0) - pikapic_waitbgmap - pikapic_jump Data_fe4b0 - -Data_fe4b4: ; fe4b4 (3f:64b4) - pikapic_setduration 40 - pikapic_loadgfx GFX_e6e6f - pikapic_loadgfx GFX_e6fff - pikapic_object $5, $80, $0, $0 - pikapic_object $1c, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe4ca: ; fe4ca (3f:64ca) - pikapic_waitbgmap - pikapic_jump Data_fe4ca - -Data_fe4ce: ; fe4ce (3f:64ce) - pikapic_setduration 70 - pikapic_loadgfx GFX_e718f - pikapic_loadgfx GFX_e731f - pikapic_object $5, $80, $0, $0 - pikapic_object $1d, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe4e4: ; fe4e4 (3f:64e4) - pikapic_waitbgmap - pikapic_jump Data_fe4e4 - -Data_fe4e8: ; fe4e8 (3f:64e8) - pikapic_setduration 60 - pikapic_loadgfx GFX_e74af - pikapic_loadgfx GFX_e763f - pikapic_object $5, $80, $0, $0 - pikapic_object $1e, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe4fe: ; fe4fe (3f:64fe) - pikapic_waitbgmap - pikapic_jump Data_fe4fe - -Data_fe502: ; fe502 (3f:6502) - pikapic_setduration 50 - pikapic_loadgfx Pic_e77cf - pikapic_loadgfx GFX_e7863 - pikapic_loadgfx GFX_e79f3 - pikapic_object $4, $80, $0, $0 - pikapic_object $1f, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry - pikapic_writebyte 13 - pikapic_waitbgmap - pikapic_thunderbolt - pikapic_ret - -Data_fe51f: ; fe51f (3f:651f) - pikapic_waitbgmap -Data_fe520: ; fe520 (3f:6520) - pikapic_setduration 100 - pikapic_loadgfx Pic_e5000 - pikapic_loadgfx GFX_e50af - pikapic_loadgfx GFX_e7b83 - pikapic_loadgfx GFX_e7d13 - pikapic_object $4, $80, $0, $0 - pikapic_object $20, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe53a: ; fe53a (3f:653a) - pikapic_waitbgmap - pikapic_jump Data_fe53a - -Data_fe53e: ; fe53e (3f:653e) - pikapic_setduration 30 - pikapic_loadgfx Pic_f0abf - pikapic_loadgfx GFX_f0b64 - pikapic_object $4, $80, $0, $0 - pikapic_object $21, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe554: ; fe554 (3f:6554) - pikapic_waitbgmap - pikapic_jump Data_fe554 - -Data_fe558: ; fe558 (3f:6558) - pikapic_setduration 64 - pikapic_loadgfx Pic_f0cf4 - pikapic_loadgfx GFX_f0d82 - pikapic_object $4, $80, $0, $0 - pikapic_object $22, $99, $0, $0 - pikapic_waitbgmap - pikapic_cry -Data_fe56e: ; fe56e (3f:656e) - pikapic_waitbgmap - pikapic_jump Data_fe56e - -PikaPicAnimGFXHeaders: -pikapicanimgfx: MACRO -\2_id:: - db \1 - dba \2 - endm - - dbbw $01, $39, $0000 - pikapicanimgfx -1, Pic_e4000 ; 01 - pikapicanimgfx 5, GFX_e40cc ; 02 - pikapicanimgfx -1, Pic_e411c ; 03 - pikapicanimgfx 10, GFX_e41d2 ; 04 - pikapicanimgfx -1, Pic_e4272 ; 05 - pikapicanimgfx 6, GFX_e4323 ; 06 - pikapicanimgfx -1, Pic_e4383 ; 07 - pikapicanimgfx 20, GFX_e444b ; 08 - pikapicanimgfx -1, Pic_e458b ; 09 - pikapicanimgfx 4, GFX_e463b ; 0a - pikapicanimgfx -1, Pic_e467b ; 0b - pikapicanimgfx 4, GFX_e472e ; 0c - pikapicanimgfx -1, Pic_e476e ; 0d - pikapicanimgfx 25, GFX_e4841 ; 0e - pikapicanimgfx -1, Pic_e49d1 ; 0f - pikapicanimgfx 10, GFX_e4a99 ; 00 - pikapicanimgfx -1, Pic_e4b39 ; 11 - pikapicanimgfx 6, GFX_e4bde ; 12 - pikapicanimgfx -1, Pic_e4c3e ; 13 - pikapicanimgfx 25, GFX_e4ce0 ; 14 - pikapicanimgfx 25, GFX_e4e70 ; 15 - pikapicanimgfx -1, Pic_e5000 ; 16 - pikapicanimgfx 25, GFX_e50af ; 17 - pikapicanimgfx -1, Pic_e523f ; 18 - pikapicanimgfx 25, GFX_e52fe ; 19 - pikapicanimgfx -1, Pic_e548e ; 1a - pikapicanimgfx 25, GFX_e5541 ; 1b - pikapicanimgfx -1, Pic_e56d1 ; 1c - pikapicanimgfx 25, GFX_e5794 ; 1d - pikapicanimgfx -1, Pic_e5924 ; 1e - pikapicanimgfx 25, GFX_e59ed ; 1f - pikapicanimgfx -1, Pic_e5b7d ; 20 - pikapicanimgfx 25, GFX_e5c4d ; 21 - pikapicanimgfx -1, Pic_e5ddd ; 22 - pikapicanimgfx 25, GFX_e5e90 ; 23 - pikapicanimgfx 25, GFX_e6020 ; 24 - pikapicanimgfx 25, GFX_e61b0 ; 25 - pikapicanimgfx -1, Pic_e6340 ; 26 - pikapicanimgfx 25, GFX_e63f7 ; 27 - pikapicanimgfx -1, Pic_e6587 ; 28 - pikapicanimgfx 25, GFX_e6646 ; 29 - pikapicanimgfx -1, Pic_e67d6 ; 2a - pikapicanimgfx 25, GFX_e682f ; 2b - pikapicanimgfx 25, GFX_e69bf ; 2c - pikapicanimgfx 25, GFX_e6b4f ; 2d - pikapicanimgfx 25, GFX_e6cdf ; 2e - pikapicanimgfx 25, GFX_e6e6f ; 2f - pikapicanimgfx 25, GFX_e6fff ; 30 - pikapicanimgfx 25, GFX_e718f ; 31 - pikapicanimgfx 25, GFX_e731f ; 32 - pikapicanimgfx 25, GFX_e74af ; 33 - pikapicanimgfx 25, GFX_e763f ; 34 - pikapicanimgfx -1, Pic_e77cf ; 35 - pikapicanimgfx 25, GFX_e7863 ; 36 - pikapicanimgfx 25, GFX_e79f3 ; 37 - pikapicanimgfx 25, GFX_e7b83 ; 38 - pikapicanimgfx 25, GFX_e7d13 ; 39 - pikapicanimgfx -1, Pic_f0abf ; 3a - pikapicanimgfx 25, GFX_f0b64 ; 3b - pikapicanimgfx -1, Pic_f0cf4 ; 3c - pikapicanimgfx 25, GFX_f0d82 ; 3d - pikapicanimgfx 24, PikachuSprite ; 3e +INCLUDE "data/pikachu_pic_animation.asm" diff --git a/engine/pikachu_status.asm b/engine/pikachu_status.asm new file mode 100755 index 00000000..17330645 --- /dev/null +++ b/engine/pikachu_status.asm @@ -0,0 +1,258 @@ +IsStarterPikachuInOurParty:: ; fcdb8 (3f:4db8) + ld hl, wPartySpecies + ld de, wPartyMon1OTID + ld bc, wPartyMonOT + push hl +.loop + pop hl + ld a, [hli] + push hl + inc a + jr z, .noPlayerPikachu + cp PIKACHU + 1 + jr nz, .curMonNotPlayerPikachu + ld h, d + ld l, e + ld a, [wPlayerID] + cp [hl] + jr nz, .curMonNotPlayerPikachu + inc hl + ld a, [wPlayerID+1] + cp [hl] + jr nz, .curMonNotPlayerPikachu + push de + push bc + ld hl, wPlayerName + ld d, $6 ; possible player length - 1 +.nameCompareLoop + dec d + jr z, .sameOT + ld a, [bc] + inc bc + cp [hl] + inc hl + jr z, .nameCompareLoop + pop bc + pop de +.curMonNotPlayerPikachu + ld hl, wPartyMon2 - wPartyMon1 + add hl, de + ld d, h + ld e, l + ld hl, NAME_LENGTH + add hl, bc + ld b, h + ld c, l + jr .loop + +.sameOT + pop bc + pop de + ld h, d + ld l, e + ld bc, -NAME_LENGTH + add hl, bc + ld a, [hli] + or [hl] + jr z, .noPlayerPikachu ; XXX how is this determined? + pop hl + scf + ret + +.noPlayerPikachu + pop hl + and a + ret + +IsThisPartymonStarterPikachu_Box:: ; fce0d (3f:4e0d) + ld hl, wBoxMon1 + ld bc, wBoxMon2 - wBoxMon1 + ld de, wBoxMonOT + jr asm_fce21 + +IsThisPartymonStarterPikachu_Party:: ; fce18 (3f:4e18) +IsThisPartymonStarterPikachu:: + ld hl, wPartyMon1 + ld bc, wPartyMon2 - wPartyMon1 + ld de, wPartyMonOT +asm_fce21: ; fce21 (3f:4e21) + ld a, [wWhichPokemon] + call AddNTimes + ld a, [hl] + cp PIKACHU + jr nz, .notPlayerPikachu + ld bc, wPartyMon1OTID - wPartyMon1 + add hl, bc + ld a, [wPlayerID] + cp [hl] + jr nz, .notPlayerPikachu + inc hl + ld a, [wPlayerID+1] + cp [hl] + jr nz, .notPlayerPikachu + ld h, d + ld l, e + ld a, [wWhichPokemon] + ld bc, NAME_LENGTH + call AddNTimes + ld de, wPlayerName + ld b, $6 +.loop + dec b + jr z, .isPlayerPikachu + ld a, [de] + inc de + cp [hl] + inc hl + jr z, .loop +.notPlayerPikachu + and a + ret + +.isPlayerPikachu + scf + ret + +UpdatePikachuMoodAfterBattle:: ; fce5a (3f:4e5a) +; because d is always $82 at this function, it serves to +; ensure Pikachu's mood is at least 130 after battle + push de + call IsStarterPikachuInOurParty + pop de + ret nc + ld a, d + cp 128 + ld a, [wPikachuMood] + jr c, .d_less_than_128 ; we never jump + cp d + jr c, .load_d_into_mood + ret + +.d_less_than_128 + cp d + ret c +.load_d_into_mood + ld a, d + ld [wPikachuMood], a + ret + +CheckPikachuFaintedOrStatused:: ; fce73 (3f:4e73) +; function to test if Pikachu is alive? + xor a + ld [wWhichPokemon], a + ld hl, wPartyCount +.loop + inc hl + ld a, [hl] + cp $ff + jr z, .dead_or_not_in_party + push hl + call IsThisPartymonStarterPikachu_Party + pop hl + jr nc, .next + ld a, [wWhichPokemon] + ld hl, wPartyMon1HP + ld bc, wPartyMon2 - wPartyMon1 + call AddNTimes + ld a, [hli] + or [hl] + ld d, a + inc hl + inc hl + ld a, [hl] ; status + and a + jr nz, .alive + jr .dead_or_not_in_party + +.next + ld a, [wWhichPokemon] + inc a + ld [wWhichPokemon], a + jr .loop + +.alive + scf + ret + +.dead_or_not_in_party + and a + ret + +IsSurfingPikachuInThePlayersParty:: ; fceab (3f:4eab) + ld hl, wPartySpecies + ld de, wPartyMon1Moves + ld bc, wPartyMonOT + push hl +.loop + pop hl + ld a, [hli] + push hl + inc a + jr z, .noSurfingPlayerPikachu + cp PIKACHU+1 + jr nz, .curMonNotSurfingPlayerPikachu + ld h, d + ld l, e + push hl + push bc + ld b, NUM_MOVES +.moveSearchLoop + ld a, [hli] + cp SURF + jr z, .foundSurfingPikachu + dec b + jr nz, .moveSearchLoop + pop bc + pop hl + jr .curMonNotSurfingPlayerPikachu + +.foundSurfingPikachu + pop bc + pop hl + inc hl + inc hl + inc hl + inc hl + ld a, [wPlayerID] + cp [hl] + jr nz, .curMonNotSurfingPlayerPikachu + inc hl + ld a, [wPlayerID+1] + cp [hl] + jr nz, .curMonNotSurfingPlayerPikachu + push de + push bc + ld hl, wPlayerName + ld d, $6 +.nameCompareLoop + dec d + jr z, .foundSurfingPlayerPikachu + ld a, [bc] + inc bc + cp [hl] + inc hl + jr z, .nameCompareLoop + pop bc + pop de +.curMonNotSurfingPlayerPikachu + ld hl, wPartyMon2 - wPartyMon1 + add hl, de + ld d, h + ld e, l + ld hl, NAME_LENGTH + add hl, bc + ld b, h + ld c, l + jr .loop + +.foundSurfingPlayerPikachu + pop bc + pop de + pop hl + scf + ret + +.noSurfingPlayerPikachu + pop hl + and a + ret diff --git a/engine/printer.asm b/engine/printer.asm index 08523bfd..d4cc8192 100755..100644 --- a/engine/printer.asm +++ b/engine/printer.asm @@ -1,831 +1,232 @@ -Func_e8783: ; e8783 (3a:4783) - ld a, 9 -Func_e8785: - push af - ld hl, wOverworldMap - lb bc, 4, 13 - xor a - call Func_e8a2e - xor a - ld [rSB], a - ld [rSC], a - ld [wUnknownSerialFlag_d49b], a - ld hl, wUnknownSerialFlag_d49a - set 0, [hl] - ld a, [wd498] - ld [$cae3], a - pop af - ld [$caf4], a - ret - -; e87a8 -Func_e87a8: ; e87a8 (3a:47a8) - ld a, [wOverworldMap] - ld e, a - ld d, 0 - ld hl, Jumptable_e87b7 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp [hl] - -Jumptable_e87b7: - dw Func_e87fd - dw Func_e88c9 - dw Func_e88a6 - dw Func_e881f - dw Func_e8906 - dw Func_e88b4 - dw Func_e884b - dw Func_e8906 - dw Func_e88a6 - dw Func_e8864 - dw Func_e8906 - dw Func_e88a6 - dw Func_e8927 - dw Func_e87e9 - dw Func_e87f3 - dw Func_e88a6 - dw Func_e8889 - dw Func_e87f7 - dw Func_e8936 - dw Func_e8939 - -Func_e87df: - ld hl, wOverworldMap - inc [hl] - ret - -Func_e87e4: - ld hl, wOverworldMap - dec [hl] - ret - -Func_e87e9: - xor a - ld [$c971], a - ld hl, wOverworldMap - set 7, [hl] - ret - -Func_e87f3: - call Func_e87df - ret - -Func_e87f7: - ld a, $01 - ld [wOverworldMap], a - ret - -Func_e87fd: - call Func_e8981 - ld hl, Data_e8a3a - call Func_e8968 - xor a - ld [$c976], a - ld [$c977], a - ld a, [$caf4] - ld [$c6e9], a - call Func_e87df - call Func_e8949 - ld a, $01 - ld [$cae0], a - ret - -Func_e881f: - call Func_e8981 - ld hl, $c6e9 - ld a, [hl] - and a - jr z, Func_e884b - ld hl, Data_e8a46 - call Func_e8968 - call Func_e89e6 - ld a, $80 - ld [$c976], a - ld a, $02 - ld [$c977], a - call Func_e899f - call Func_e87df - call Func_e8949 - ld a, $02 - ld [$cae0], a - ret - -Func_e884b: - ld a, $06 - ld [wOverworldMap], a - ld hl, Data_e8a4c - call Func_e8968 - xor a - ld [$c976], a - ld [$c977], a - call Func_e87df - call Func_e8949 - ret - -Func_e8864: - call Func_e8981 - ld hl, Data_e8a40 - call Func_e8968 - call Func_e89cf - ld a, $04 - ld [$c976], a - ld a, $00 - ld [$c977], a - call Func_e899f - call Func_e87df - call Func_e8949 - ld a, $03 - ld [$cae0], a - ret - -Func_e8889: - call Func_e8981 - ld hl, Data_e8a3a - call Func_e8968 - xor a - ld [$c976], a - ld [$c977], a - ld a, [$caf4] - ld [$c6e9], a - call Func_e87df - call Func_e8949 - ret - -Func_e88a6: - ld hl, $c973 - inc [hl] - ld a, [hl] - cp a, $06 - ret c - xor a - ld [hl], a - call Func_e87df - ret - -Func_e88b4: - ld hl, $c973 - inc [hl] - ld a, [hl] - cp a, $06 - ret c - xor a - ld [hl], a - ld hl, $c6e9 - dec [hl] - call Func_e87e4 - call Func_e87e4 - ret - -Func_e88c9: - ld a, [wUnknownSerialFlag_d49b] - and a - ret nz - ld a, [$c970] - cp a, $ff - jr nz, .asm_e88dc - ld a, [$c971] - cp a, $ff - jr z, .asm_e88f8 -.asm_e88dc - ld a, [$c970] - cp a, $81 - jr nz, .asm_e88f8 - ld a, [$c971] - cp a, $00 - jr nz, .asm_e88f8 - ld hl, wUnknownSerialFlag_d49a - set 1, [hl] - ld a, $05 - ld [$c972], a - call Func_e87df - ret - -.asm_e88f8 - ld a, $ff - ld [$c970], a - ld [$c971], a - ld a, $0e - ld [wOverworldMap], a - ret - -Func_e8906: - ld a, [wUnknownSerialFlag_d49b] - and a - ret nz - ld a, [$c971] - and a, $f0 - jr nz, .asm_e8921 - ld a, [$c971] - and a, $01 - jr nz, .asm_e891d - call Func_e87df - ret - -.asm_e891d - call Func_e87e4 - ret - -.asm_e8921 - ld a, $12 - ld [wOverworldMap], a - ret - -Func_e8927: - ld a, [wUnknownSerialFlag_d49b] - and a - ret nz - ld a, [$c971] - and a, $f3 - ret nz - call Func_e87df - ret - -Func_e8936: - call Func_e87df -Func_e8939: - ld a, [wUnknownSerialFlag_d49b] - and a - ret nz - ld a, [$c971] - and a, $f0 - ret nz - xor a - ld [wOverworldMap], a - ret - -Func_e8949: -.asm_e8949 - ld a, [wUnknownSerialFlag_d49b] - and a - jr nz, .asm_e8949 - xor a - ld [$c974], a - ld [$c975], a - ld a, $01 - ld [wUnknownSerialFlag_d49b], a - ld a, $88 - ld [rSB], a - ld a, $01 - ld [rSC], a - ld a, $81 - ld [rSC], a - ret - -Func_e8968: - ld a, [hli] - ld [$c6ea], a - ld a, [hli] - ld [$c6eb], a - ld a, [hli] - ld [$c6ec], a - ld a, [hli] - ld [$c6ed], a - ld a, [hli] - ld [$c6ee], a - ld a, [hl] - ld [$c6ef], a - ret - -Func_e8981: - xor a - ld hl, $c6ea - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld hl, $c6ee - ld [hli], a - ld [hl], a - xor a - ld [$c976], a - ld [$c977], a - ld hl, $c6f0 - ld bc, $0280 - call Func_e8a2e - ret - -Func_e899f: - ld hl, $0000 - ld bc, $0004 - ld de, $c6ea - call Func_e89c2 - ld a, [$c976] - ld c, a - ld a, [$c977] - ld b, a - ld de, $c6f0 - call Func_e89c2 - ld a, l - ld [$c6ee], a - ld a, h - ld [$c6ef], a - ret - -Func_e89c2: -.asm_e89c2 - ld a, [de] - inc de - add l - jr nc, .asm_e89c8 - inc h -.asm_e89c8 - ld l, a - dec bc - ld a, c - or b - jr nz, .asm_e89c2 - ret - -Func_e89cf: - ld a, $01 - ld [$c6f0], a - ld a, [$cae2] - ld [$c6f1], a - ld a, $e4 - ld [$c6f2], a - ld a, [$cae3] - ld [$c6f3], a - ret - -Func_e89e6: - ld a, [$c6e9] - ld b, a - ld a, [$caf4] - sub b - ld hl, wPrinterTileBuffer - ld de, $0028 -.asm_e89f4 - and a - jr z, .asm_e89fb - add hl, de - dec a - jr .asm_e89f4 - -.asm_e89fb - ld e, l - ld d, h - ld hl, $c6f0 - ld c, $28 -.asm_e8a02 - ld a, [de] - inc de - push bc - push de - push hl - swap a - ld d, a - and a, $f0 - ld e, a - ld a, d - and a, $0f - ld d, a - and a, $08 - ld a, d - jr nz, .asm_e8a1a - or a, $90 - jr .asm_e8a1c - -.asm_e8a1a - or a, $80 -.asm_e8a1c - ld d, a - ld bc, $3a01 - call CopyVideoData - pop hl - ld de, $0010 - add hl, de - pop de - pop bc - dec c - jr nz, .asm_e8a02 - ret - -Func_e8a2e: ; e8a2e (3a:4a2e) - push de - ld e, a -.asm_e8a30 - ld [hl], e - inc hl - dec bc - ld a, c - or b - jr nz, .asm_e8a30 - ld a, e - pop de - ret - -Data_e8a3a: - db $01, $00, $00, $00, $01, $00 -Data_e8a40: - db $02, $00, $04, $00, $00, $00 -Data_e8a46: - db $04, $00, $80, $02, $00, $00 -Data_e8a4c: - db $04, $00, $00, $00, $04, $00 -Data_e8a52: - db $08, $00, $00, $00, $08, $00 -Data_e8a58: - db $0f, $00, $00, $00, $0f, $00 - -Func_e8a5e: ; e8a5e (3a:4a5e) - ld a, [wUnknownSerialFlag_d49b] - ld e, a - ld d, 0 - ld hl, Jumptable_e8a6d - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp [hl] - -Jumptable_e8a6d: - dw Func_e8ab2 - dw Func_e8ab3 - dw Func_e8abc - dw Func_e8ac6 - dw Func_e8ad0 - dw Func_e8ada - dw Func_e8ae4 - dw Func_e8b0f - dw Func_e8b19 - dw Func_e8b23 - dw Func_e8b2c - dw Func_e8b3a - dw Func_e8ab3 - dw Func_e8b44 - dw Func_e8b4d - dw Func_e8b4d - dw Func_e8b4d - dw Func_e8b44 - dw Func_e8b4d - dw Func_e8b23 - dw Func_e8b2c - dw Func_e8b6a - dw Func_e8ab3 - dw Func_e8b56 - dw Func_e8b4d - dw Func_e8b4d - dw Func_e8b4d - dw Func_e8b56 - dw Func_e8b4d - dw Func_e8b23 - dw Func_e8b2c - dw Func_e8b3a - -Func_e8aad: - ld hl, wUnknownSerialFlag_d49b - inc [hl] - ret - -Func_e8ab2: - ret - -Func_e8ab3: - ld a, $33 - call Func_e8b5f - call Func_e8aad - ret - -Func_e8abc: - ld a, [$c6ea] - call Func_e8b5f - call Func_e8aad - ret - -Func_e8ac6: - ld a, [$c6eb] - call Func_e8b5f - call Func_e8aad - ret - -Func_e8ad0: - ld a, [$c6ec] - call Func_e8b5f - call Func_e8aad - ret - -Func_e8ada: - ld a, [$c6ed] - call Func_e8b5f - call Func_e8aad - ret - -Func_e8ae4: - ld hl, $c976 - ld e, [hl] - inc hl - ld d, [hl] - ld a, e - or d - jr z, .asm_e8b0c - dec de - ld [hl], d - dec hl - ld [hl], e - ld a, [$c974] - ld e, a - ld a, [$c975] - ld d, a - ld hl, $c6f0 - add hl, de - inc de - ld a, e - ld [$c974], a - ld a, d - ld [$c975], a - ld a, [hl] - call Func_e8b5f - ret - -.asm_e8b0c - call Func_e8aad -Func_e8b0f: - ld a, [$c6ee] - call Func_e8b5f - call Func_e8aad - ret - -Func_e8b19: - ld a, [$c6ef] - call Func_e8b5f - call Func_e8aad - ret - -Func_e8b23: - ld a, $00 - call Func_e8b5f - call Func_e8aad - ret - -Func_e8b2c: - ld a, [rSB] - ld [$c970], a - ld a, $00 - call Func_e8b5f - call Func_e8aad - ret - -Func_e8b3a: - ld a, [rSB] - ld [$c971], a - xor a - ld [wUnknownSerialFlag_d49b], a - ret - -Func_e8b44: - ld a, $0f - call Func_e8b5f - call Func_e8aad - ret - -Func_e8b4d: - ld a, $00 - call Func_e8b5f - call Func_e8aad - ret - -Func_e8b56: - ld a, $08 - call Func_e8b5f - call Func_e8aad - ret - -Func_e8b5f: - ld [rSB], a - ld a, $01 - ld [rSC], a - ld a, $81 - ld [rSC], a - ret - -Func_e8b6a: - ld a, [rSB] - ld [$c971], a - xor a - ld [wUnknownSerialFlag_d49b], a - ret - -Func_e8b74: ; e8b74 (3a:4b74) - ld a, [$cfca] + const_def + const PRINTER_STATUS_BLANK + const PRINTER_STATUS_CHECKING_LINK + const PRINTER_STATUS_TRANSMITTING + const PRINTER_STATUS_PRINTING + const PRINTER_ERROR_1 + const PRINTER_ERROR_2 + const PRINTER_ERROR_3 + const PRINTER_ERROR_4 + const PRINTER_ERROR_WRONG_DEVICE + +INCLUDE "engine/printer/serial.asm" + +PrintPokedexEntry: ; e8b74 (3a:4b74) + ld a, [wUpdateSpritesEnabled] push af xor a - ld [$cfca], a - ld [$ffdb], a - call Func_e8f24 + ld [wUpdateSpritesEnabled], a + ld [hCanceledPrinting], a + call Printer_PlayPrinterMusic ld a, [rIE] push af xor a ld [rIF], a - ld a, $09 + ld a, $9 ld [rIE], a xor a - ld [$ffba], a - call Func_e8c30 - call Func_e8785 - ld a, [$caf9] + ld [H_AUTOBGTRANSFERENABLED], a + call Printer_GetDexEntryRegisters + call Printer_StartTransmission + ld a, [wPrinterPokedexMonIsOwned] and a - jr z, .asm_e8b9e - ld a, $10 - jr .asm_e8ba0 - -.asm_e8b9e - ld a, $13 -.asm_e8ba0 - ld [$cae2], a - call Func_e8efc + jr z, .not_caught + ld a, 16 + jr .got_size + +.not_caught + ld a, 19 +.got_size + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer call ClearScreen - callab Func_401c2 - callab Func_4027c - ld a, $01 - ld [$ffba], a - call Func_e8c0c - jr c, .asm_e8bf4 - ld a, [$caf9] + callab Pokedex_DrawInterface + callab Pokedex_PlacePokemonList + ld a, $1 + ld [H_AUTOBGTRANSFERENABLED], a + call .TryPrintPage + jr c, .finish_printing + ld a, [wPrinterPokedexMonIsOwned] and a - jr z, .asm_e8bf4 + jr z, .finish_printing xor a - ld [wUnknownSerialFlag_d49a], a - ld [wUnknownSerialFlag_d49b], a - ld c, $0c + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + ld c, $c call DelayFrames call SaveScreenTilesToBuffer1 xor a - ld [$ffba], a - call Func_e8c50 - ld a, $07 - call Func_e8785 - ld a, $03 - ld [$cae2], a - call Func_e8efc + ld [H_AUTOBGTRANSFERENABLED], a + call Printer_PrepareDexEntryForPrinting + ld a, $7 + call Printer_StartTransmission + ld a, $3 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer call LoadScreenTilesFromBuffer1 - ld a, $01 - ld [$ffba], a - call Func_e8c0c -.asm_e8bf4 + ld a, $1 + ld [H_AUTOBGTRANSFERENABLED], a + call .TryPrintPage +.finish_printing xor a - ld [wUnknownSerialFlag_d49a], a - ld [wUnknownSerialFlag_d49b], a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a xor a ld [rIF], a pop af ld [rIE], a - call Func_0f3d - call Func_e8f3b + call ReloadMapAfterPrinter + call Printer_PlayMapMusic pop af - ld [$cfca], a + ld [wUpdateSpritesEnabled], a ret -Func_e8c0c: - call Func_e8f16 -.asm_e8c0f +.TryPrintPage: + call Printer_ResetJoypadHRAM +.print_loop call JoypadLowSensitivity - call Func_e8eca - jr c, .asm_e8c2e - ld a, [$c6e8] + call Printer_CheckPressingB + jr c, .pressed_b + ld a, [wPrinterSendState] bit 7, a - jr nz, .asm_e8c2c - call Func_e87a8 - call Func_e8f51 - call Func_e8f82 + jr nz, .completed + call PrinterTransmissionJumptable + call GBPrinter_CheckForErrors + call GBPrinter_UpdateStatusMessage call DelayFrame - jr .asm_e8c0f + jr .print_loop -.asm_e8c2c +.completed and a ret -.asm_e8c2e +.pressed_b scf ret -Func_e8c30: - callab Func_4039c +Printer_GetDexEntryRegisters: + callab DrawDexEntryOnScreen ld a, l - ld [$caf5], a + ld [wPrinterPokedexEntryTextPointer], a ld a, h - ld [$caf6], a - ld a, $00 - rla - ld [$caf9], a + ld [wPrinterPokedexEntryTextPointer + 1], a + ld a, $0 + rla ; copy carry flag state to bit 0 + ld [wPrinterPokedexMonIsOwned], a and a - jr z, .asm_e8c4d - ld a, $05 - jr .asm_e8c4f + jr z, .not_caught + ld a, $5 + jr .got_num_rows -.asm_e8c4d - ld a, $09 -.asm_e8c4f +.not_caught + ld a, $9 +.got_num_rows ret -Func_e8c50: +Printer_PrepareDexEntryForPrinting: call ClearScreen - callab Func_404bc + callab Pokedex_PrepareDexEntryForPrinting ret -Func_e8c5c: +PrintSurfingMinigameHighScore: xor a - ld [$ffdb], a - call Func_e8f24 - call Func_e910a + ld [hCanceledPrinting], a + call Printer_PlayPrinterMusic + call Printer_PrepareSurfingMinigameHighScoreTileMap ld a, [rIE] push af xor a ld [rIF], a - ld a, $09 + ld a, $9 ld [rIE], a - call Func_e8783 + call StartTransmission_Send9Rows ld a, $13 - ld [$cae2], a - call Func_e8efc - call Func_e8f16 -.asm_e8c7d + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer + call Printer_ResetJoypadHRAM +.loop call JoypadLowSensitivity - call Func_e8eca - jr c, .asm_e8c9a - ld a, [$c6e8] + call Printer_CheckPressingB + jr c, .quit + ld a, [wPrinterSendState] bit 7, a - jr nz, .asm_e8c9a - call Func_e87a8 - call Func_e8f51 - call Func_e8f82 + jr nz, .quit + call PrinterTransmissionJumptable + call GBPrinter_CheckForErrors + call GBPrinter_UpdateStatusMessage call DelayFrame - jr .asm_e8c7d + jr .loop -.asm_e8c9a +.quit xor a - ld [wUnknownSerialFlag_d49a], a - ld [wUnknownSerialFlag_d49b], a - call Func_e8f09 + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + call Printer_CopyTileMapFromPrinterTileBuffer xor a ld [rIF], a pop af ld [rIE], a - call Func_0f3d - call Func_e8f3b + call ReloadMapAfterPrinter + call Printer_PlayMapMusic ret -Func_e8cb1: +PrintDiploma: xor a - ld [$ffdb], a - call Func_e8f24 + ld [hCanceledPrinting], a + call Printer_PlayPrinterMusic call _DisplayDiploma ld a, [rIE] push af xor a ld [rIF], a - ld a, $09 + ld a, $9 ld [rIE], a - call Func_e8783 + call StartTransmission_Send9Rows ld a, $10 - ld [$cae2], a - call Func_e8efc + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer call Func_e8d11 jr c, .asm_e8cfa xor a - ld [wUnknownSerialFlag_d49a], a - ld [wUnknownSerialFlag_d49b], a - ld c, $0c + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + ld c, $c call DelayFrames call SaveScreenTilesToBuffer1 xor a - ld [$ffba], a + ld [H_AUTOBGTRANSFERENABLED], a call Func_e9ad3 - call Func_e8783 - ld a, $03 - ld [$cae2], a - call Func_e8efc + call StartTransmission_Send9Rows + ld a, $3 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer call LoadScreenTilesFromBuffer1 call Func_e8d11 .asm_e8cfa xor a - ld [wUnknownSerialFlag_d49a], a - ld [wUnknownSerialFlag_d49b], a - call Func_e8f09 + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + call Printer_CopyTileMapFromPrinterTileBuffer xor a ld [rIF], a pop af ld [rIE], a - call Func_0f3d - call Func_e8f3b + call ReloadMapAfterPrinter + call Printer_PlayMapMusic ret Func_e8d11: - call Func_e8f16 + call Printer_ResetJoypadHRAM .asm_e8d14 call JoypadLowSensitivity - call Func_e8eca + call Printer_CheckPressingB jr c, .asm_e8d33 - ld a, [$c6e8] + ld a, [wPrinterSendState] bit 7, a jr nz, .asm_e8d31 - call Func_e87a8 - call Func_e8f51 - call Func_e8f82 + call PrinterTransmissionJumptable + call GBPrinter_CheckForErrors + call GBPrinter_UpdateStatusMessage call DelayFrame jr .asm_e8d14 @@ -837,9 +238,7 @@ Func_e8d11: scf ret - - -Func_e8d35:: ; e8d35 (3a:4e79) +PrintPCBox:: ; e8d35 (3a:4e79) ld a, [wBoxDataStart] and a jp z, Func_e8df4 @@ -847,79 +246,79 @@ Func_e8d35:: ; e8d35 (3a:4e79) push af xor a ld [wUpdateSpritesEnabled], a - ld [hItemCounter], a - call Func_e8f24 + ld [hCanceledPrinting], a + call Printer_PlayPrinterMusic ld a, [rIE] push af xor a ld [rIF], a - ld a, $09 + ld a, $9 ld [rIE], a call SaveScreenTilesToBuffer1 xor a ld [H_AUTOBGTRANSFERENABLED], a - call Func_e988a - call Func_e8783 + call PrintPCBox_DrawPage1 + call StartTransmission_Send9Rows ld a, $10 - ld [$cae2], a - call Func_e8efc + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer call LoadScreenTilesFromBuffer1 call Func_e8dfb jr c, .asm_e8ddc xor a - ld [wUnknownSerialFlag_d49a], a - ld [wUnknownSerialFlag_d49b], a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a ld c, 12 call DelayFrames xor a ld [H_AUTOBGTRANSFERENABLED], a - call Func_e98ec - call Func_e8783 - ld a, $00 - ld [$cae2], a - call Func_e8efc + call PrintPCBox_DrawPage2 + call StartTransmission_Send9Rows + ld a, $0 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer call LoadScreenTilesFromBuffer1 call Func_e8dfb jr c, .asm_e8ddc xor a - ld [wUnknownSerialFlag_d49a], a - ld [wUnknownSerialFlag_d49b], a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a ld c, 12 call DelayFrames xor a ld [H_AUTOBGTRANSFERENABLED], a - call Func_e9907 - call Func_e8783 - ld a, $00 - ld [$cae2], a - call Func_e8efc + call PrintPCBox_DrawPage3 + call StartTransmission_Send9Rows + ld a, $0 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer call LoadScreenTilesFromBuffer1 call Func_e8dfb jr c, .asm_e8ddc xor a - ld [wUnknownSerialFlag_d49a], a - ld [wUnknownSerialFlag_d49b], a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a ld c, 12 call DelayFrames xor a ld [H_AUTOBGTRANSFERENABLED], a - call Func_e9922 - call Func_e8783 - ld a, $03 - ld [$cae2], a - call Func_e8efc + call PrintPCBox_DrawPage4 + call StartTransmission_Send9Rows + ld a, $3 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer call LoadScreenTilesFromBuffer1 call Func_e8dfb .asm_e8ddc xor a - ld [wUnknownSerialFlag_d49a], a - ld [wUnknownSerialFlag_d49b], a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a xor a ld [rIF], a pop af ld [rIE], a - call Func_0f3d - call Func_e8f3b + call ReloadMapAfterPrinter + call Printer_PlayMapMusic pop af ld [wUpdateSpritesEnabled], a ret @@ -930,17 +329,17 @@ Func_e8df4: ; e8df4 ret Func_e8dfb: ; e8dfb - call Func_e8f16 + call Printer_ResetJoypadHRAM .asm_e8dfe call JoypadLowSensitivity - call Func_e8eca + call Printer_CheckPressingB jr c, .asm_e8e1d - ld a, [wOverworldMap] + ld a, [wPrinterSendState] bit 7, a jr nz, .asm_e8e1b - call Func_e87a8 - call Func_e8f51 - call Func_e8f82 + call PrinterTransmissionJumptable + call GBPrinter_CheckForErrors + call GBPrinter_UpdateStatusMessage call DelayFrame jr .asm_e8dfe @@ -956,46 +355,46 @@ String_e8e1f: ; e8e1f TX_FAR _NoPokemonText db "@" -Func_e8e24: ; e8e24 +PrintFanClubPortrait: ; e8e24 xor a - ld [hItemCounter], a - call Func_e8f24 + ld [hCanceledPrinting], a + call Printer_PlayPrinterMusic call Func_ea3ea ld a, [rIE] push af xor a ld [rIF], a - ld a, $09 + ld a, $9 ld [rIE], a - call Func_e8783 + call StartTransmission_Send9Rows ld a, $13 - ld [$cae2], a - call Func_e8efc - call Func_e8f16 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer + call Printer_ResetJoypadHRAM .asm_e8e45 call JoypadLowSensitivity - call Func_e8eca + call Printer_CheckPressingB jr c, .asm_e8e62 - ld a, [wOverworldMap] + ld a, [wPrinterSendState] bit 7, a jr nz, .asm_e8e62 - call Func_e87a8 - call Func_e8f51 - call Func_e8f82 + call PrinterTransmissionJumptable + call GBPrinter_CheckForErrors + call GBPrinter_UpdateStatusMessage call DelayFrame jr .asm_e8e45 .asm_e8e62 xor a - ld [wUnknownSerialFlag_d49a], a - ld [wUnknownSerialFlag_d49b], a - call Func_e8f09 + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + call Printer_CopyTileMapFromPrinterTileBuffer xor a ld [rIF], a pop af ld [rIE], a - call Func_0f3d - call Func_e8f3b + call ReloadMapAfterPrinter + call Printer_PlayMapMusic ret Func_e8e79: ; e8e79 (3a:4e79) @@ -1008,30 +407,30 @@ Func_e8e79: ; e8e79 (3a:4e79) push af xor a ld [rIF], a - ld a, $09 + ld a, $9 ld [rIE], a - call Func_e8783 + call StartTransmission_Send9Rows ld a, $13 - ld [$cae2], a + ld [wcae2], a ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a - call Func_e8efc + call Printer_CopyTileMapToPrinterTileBuffer call Func_ea573 -.asm_e8e9c - ld a, [wOverworldMap] +.loop + ld a, [wPrinterSendState] bit 7, a - jr nz, .asm_e8eae + jr nz, .quit call Func_ea5d1 call Func_ea5b7 call DelayFrame - jr .asm_e8e9c + jr .loop -.asm_e8eae +.quit xor a - ld [wUnknownSerialFlag_d49a], a - ld [wUnknownSerialFlag_d49b], a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a ld hl, wOAMBuffer + 32 * 4 - ld bc, $0020 + ld bc, 8 * 4 xor a call FillMemory xor a @@ -1044,54 +443,54 @@ Func_e8e79: ; e8e79 (3a:4e79) pop af ret -Func_e8eca: ; e8eca (3a:4eca) +Printer_CheckPressingB: ; e8eca (3a:4eca) ld a, [hJoyHeld] and B_BUTTON - jr nz, .asm_e8ed2 + jr nz, .quit and a ret -.asm_e8ed2 - ld a, [wOverworldMap] - cp $0c - jr nz, .asm_e8ef6 -.asm_e8ed9 - ld a, [wUnknownSerialFlag_d49b] +.quit + ld a, [wPrinterSendState] + cp $c + jr nz, .already_done +.wait_current_task + ld a, [wPrinterOpcode] and a - jr nz, .asm_e8ed9 + jr nz, .wait_current_task ld a, $16 - ld [wUnknownSerialFlag_d49b], a + ld [wPrinterOpcode], a ld a, $88 ld [rSB], a - ld a, $01 + ld a, $1 ld [rSC], a ld a, $81 ld [rSC], a -.asm_e8ef0 - ld a, [wUnknownSerialFlag_d49b] +.wait_send_cancel + ld a, [wPrinterOpcode] and a - jr nz, .asm_e8ef0 -.asm_e8ef6 - ld a, $01 - ld [hItemCounter], a + jr nz, .wait_send_cancel +.already_done + ld a, $1 + ld [hCanceledPrinting], a scf ret -Func_e8efc: ; e8efc (3a:4efc) +Printer_CopyTileMapToPrinterTileBuffer: ; e8efc (3a:4efc) coord hl, 0, 0 coord de, 0, 0, wPrinterTileBuffer ld bc, SCREEN_HEIGHT * SCREEN_WIDTH call CopyData ret -Func_e8f09: ; e8f09 (3a:4f09) +Printer_CopyTileMapFromPrinterTileBuffer: ; e8f09 (3a:4f09) coord hl, 0, 0, wPrinterTileBuffer coord de, 0, 0 ld bc, SCREEN_HEIGHT * SCREEN_WIDTH call CopyData ret -Func_e8f16: ; e8f16 (3a:4f16) +Printer_ResetJoypadHRAM: ; e8f16 (3a:4f16) xor a ld [hJoyLast], a ld [hJoyReleased], a @@ -1101,8 +500,8 @@ Func_e8f16: ; e8f16 (3a:4f16) ld [hJoy6], a ret -Func_e8f24: ; e8f24 (3a:4f24) - call Func_e8f42 +Printer_PlayPrinterMusic: ; e8f24 (3a:4f24) + call Printer_FadeOutMusicAndWait ld a, [wAudioROMBank] ld [wAudioSavedROMBank], a ld a, BANK(Music_GBPrinter) @@ -1112,58 +511,59 @@ Func_e8f24: ; e8f24 (3a:4f24) call PlaySound ret -Func_e8f3b: ; e8f3b (3a:4f3b) - call Func_e8f42 +Printer_PlayMapMusic: ; e8f3b (3a:4f3b) + call Printer_FadeOutMusicAndWait call PlayDefaultMusic ret -Func_e8f42: ; e8f42 (3a:4f42) +Printer_FadeOutMusicAndWait: ; e8f42 (3a:4f42) ld a, $4 ld [wAudioFadeOutControl], a call StopAllMusic -.asm_e8f4a +.wait_music_stop ld a, [wAudioFadeOutControl] and a - jr nz, .asm_e8f4a + jr nz, .wait_music_stop ret -Func_e8f51: ; e8f51 (3a:4f51) - ld a, [$c970] +GBPrinter_CheckForErrors: ; e8f51 (3a:4f51) + ld a, [wPrinterHandshake] cp $81 - jr z, .asm_e8f62 - ld a, [$c971] + jr z, .check_other_errors + ld a, [wPrinterStatusFlags] cp $ff - jr z, .asm_e8f7c + jr z, .error2 xor a - jr .asm_e8f7e + jr .load_status -.asm_e8f62 - ld a, [$c971] - and $e0 +.check_other_errors + ld a, [wPrinterStatusFlags] + and %11100000 ret z bit 7, a - jr nz, .asm_e8f78 + jr nz, .error1 bit 6, a - jr nz, .asm_e8f74 - ld a, 6 - jr .asm_e8f7e - -.asm_e8f74 - ld a, 7 - jr .asm_e8f7e - -.asm_e8f78 - ld a, 4 - jr .asm_e8f7e - -.asm_e8f7c - ld a, 5 -.asm_e8f7e - ld [wcae0], a + jr nz, .error4 + ; error 3 + ld a, PRINTER_ERROR_3 + jr .load_status + +.error4 + ld a, PRINTER_ERROR_4 + jr .load_status + +.error1 + ld a, PRINTER_ERROR_1 + jr .load_status + +.error2 + ld a, PRINTER_ERROR_2 +.load_status + ld [wPrinterStatusIndicator], a ret -Func_e8f82: - ld a, [wcae0] +GBPrinter_UpdateStatusMessage: + ld a, [wPrinterStatusIndicator] and a ret z push af @@ -1175,7 +575,7 @@ Func_e8f82: pop af ld e, a ld d, $0 - ld hl, Table_e8fca + ld hl, .PrinterStatusMessages add hl, de add hl, de ld e, [hl] @@ -1184,64 +584,64 @@ Func_e8f82: coord hl, 1, 7 call PlaceString coord hl, 2, 15 - ld de, String_e8fb8 + ld de, .PressBToCancel call PlaceString ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a xor a - ld [wcae0], a + ld [wPrinterStatusIndicator], a ret -String_e8fb8: +.PressBToCancel: db "Press B to Cancel@" -Table_e8fca: - dw String_e8fdc - dw String_e8fdd - dw String_e8ff0 - dw String_e9003 - dw String_e9014 - dw String_e9049 - dw String_e907e - dw String_e90b3 - dw String_e90e8 - -String_e8fdc: +.PrinterStatusMessages: + dw .Blank + dw .CheckingLink + dw .Transmitting + dw .Printing + dw .Error1 + dw .Error2 + dw .Error3 + dw .Error4 + dw .WrongDevice + +.Blank: db "@" -String_e8fdd: +.CheckingLink: db "" next " CHECKING LINK...@" -String_e8ff0: +.Transmitting: db "" next " TRANSMITTING...@" -String_e9003: +.Printing: db "" next " PRINTING...@" -String_e9014: +.Error1: db " Printer Error 1" next "" next "Check the Game Boy" next "Printer Manual.@" -String_e9049: +.Error2: db " Printer Error 2" next "" next "Check the Game Boy" next "Printer Manual.@" -String_e907e: +.Error3: db " Printer Error 3" next "" next "Check the Game Boy" next "Printer Manual.@" -String_e90b3: +.Error4: db " Printer Error 4" next "" next "Check the Game Boy" next "Printer Manual.@" -String_e90e8: +.WrongDevice: db "This is not the" next "Game Boy Printer!@" -Func_e910a: +Printer_PrepareSurfingMinigameHighScoreTileMap: call GBPalWhiteOutWithDelay3 call ClearScreen ld de, SurfingPikachu2Graphics @@ -1249,14 +649,14 @@ Func_e910a: lb bc, BANK(SurfingPikachu2Graphics), (SurfingPikachu2GraphicsEnd - SurfingPikachu2Graphics) / $10 call CopyVideoData coord hl, 0, 0 - call Func_e91a9 + call .PlaceRowAlternatingTiles coord hl, 0, 17 - call Func_e91a9 + call .PlaceRowAlternatingTiles coord hl, 0, 0 - call Func_e91b5 + call .PlaceColumnAlternatingTiles coord hl, 19, 0 - call Func_e91b5 - ld a, $04 + call .PlaceColumnAlternatingTiles + ld a, $4 coord hl, 0, 0 ld [hl], a coord hl, 0, 17 @@ -1265,41 +665,41 @@ Func_e910a: ld [hl], a coord hl, 19, 17 ld [hl], a - ld de, Data_e91c4 + ld de, .Tilemap1 coord hl, 10, 8 lb bc, 3, 8 - call Func_e925d - ld de, Data_e91dc + call Diploma_Surfing_CopyBox + ld de, .Tilemap2 coord hl, 2, 11 lb bc, 6, 16 - call Func_e925d - ld de, String_e923c + call Diploma_Surfing_CopyBox + ld de, .PikachusBeachString coord hl, 3, 2 call PlaceString - ld de, String_e924b + ld de, .HiScoreString coord hl, 9, 4 call PlaceString - ld de, String_e9256 + ld de, .PointsString coord hl, 12, 6 call PlaceString ld de, wPlayerName ld hl, wPlayerName ld bc, 0 -.asm_e9182 +.find_end_of_name ld a, [hli] inc c cp "@" - jr nz, .asm_e9182 + jr nz, .find_end_of_name ld a, 8 sub c - jr nc, .asm_e918e + jr nc, .got_name_length xor a -.asm_e918e +.got_name_length ld c, a coord hl, 2, 4 add hl, bc call PlaceString - call Func_e926f + call CopySurfingMinigameScore ld b, 8 call RunPaletteCommand ld a, $1 @@ -1308,35 +708,35 @@ Func_e910a: call GBPalNormal ret -Func_e91a9: +.PlaceRowAlternatingTiles: ld c, SCREEN_WIDTH / 2 -.asm_e91ab - ld [hl], $00 +.row_loop + ld [hl], $0 inc hl - ld [hl], $01 + ld [hl], $1 inc hl dec c - jr nz, .asm_e91ab + jr nz, .row_loop ret -Func_e91b5: +.PlaceColumnAlternatingTiles: ld c, SCREEN_HEIGHT / 2 ld de, SCREEN_WIDTH -.asm_e91ba - ld [hl], $02 +.col_loop + ld [hl], $2 add hl, de - ld [hl], $03 + ld [hl], $3 add hl, de dec c - jr nz, .asm_e91ba + jr nz, .col_loop ret -Data_e91c4: + +.Tilemap1: db $7f, $7f, $10, $11, $12, $13, $14, $15 db $0f, $3c, $3d, $3e, $20, $21, $30, $31 db $4c, $4d, $4e, $50, $34, $1a, $51, $2d - -Data_e91dc: +.Tilemap2: db $7f, $7f, $7f, $7f, $7f, $7f, $16, $17, $18, $19, $7f, $1b, $1c, $1d, $1e, $1f db $7f, $7f, $22, $23, $24, $25, $26, $27, $28, $29, $2a, $2b, $2c, $7f, $2e, $2f db $7f, $7f, $32, $33, $33, $35, $36, $37, $38, $39, $3a, $3b, $7f, $7f, $7f, $3f @@ -1344,39 +744,38 @@ Data_e91dc: db $52, $52, $52, $53, $54, $55, $56, $57, $58, $59, $5a, $5b, $5c, $5d, $5d, $5e db $7f, $7f, $7f, $05, $06, $07, $08, $09, $0a, $0b, $0c, $0d, $0e, $7f, $7f, $7f - -String_e923c: +.PikachusBeachString: db "Pikachu's Beach@" -String_e924b: +.HiScoreString: db "'s Hi-Score@" -String_e9256: +.PointsString: db "Points@" -Func_e925d: -.asm_e925d +Diploma_Surfing_CopyBox: +.y push bc push hl -.asm_e925f +.x ld a, [de] inc de ld [hli], a dec c - jr nz, .asm_e925f + jr nz, .x pop hl ld bc, SCREEN_WIDTH add hl, bc pop bc dec b - jr nz, .asm_e925d + jr nz, .y ret -Func_e926f: - ld de, wd496 +CopySurfingMinigameScore: + ld de, wSurfingMinigameHiScore + 1 coord hl, 7, 6 ld a, [de] - call Func_e927a + call .BCDConvertScore ld a, [de] -Func_e927a: +.BCDConvertScore: ld c, a swap a and $f @@ -1392,80 +791,79 @@ Func_e927a: SurfingPikachu2Graphics: INCBIN "gfx/surfing_pikachu_2.2bpp" SurfingPikachu2GraphicsEnd: -Func_e988a: +PrintPCBox_DrawPage1: xor a ld [wBoxNumString], a call ClearScreen - call Func_e99de + call PrintPCBox_PlaceHorizontalLines coord hl, 0, 0 ld bc, 11 * SCREEN_WIDTH ld a, " " call FillMemory - call Func_e99b9 - call Func_e99a7 + call PrintPCBox_DrawLeftAndRightBorders + call PrintPCBox_DrawTopBorder coord hl, 4, 4 - ld de, String_e98db + ld de, .PokemonListString call PlaceString coord hl, 7, 6 - ld de, String_e98e8 + ld de, .BoxString call PlaceString coord hl, 11, 6 ld a, [wCurrentBoxNum] and $7f cp 9 - jr c, .asm_e98cc + jr c, .less_than_9 sub 9 ld [hl], "1" inc hl add "0" - jr .asm_e98ce + jr .placed_box_number -.asm_e98cc +.less_than_9 add "1" -.asm_e98ce +.placed_box_number ld [hl], a coord hl, 4, 9 ld de, wBoxSpecies - ld c, $03 - call Func_e994e + ld c, $3 + call PrintPCBox_PlaceBoxMonInfo ret +.PokemonListString: db "POKéMON LIST@" +.BoxString: db "BOX@" -String_e98db: db "POKéMON LIST@" -String_e98e8: db "BOX@" - -Func_e98ec: +PrintPCBox_DrawPage2: call ClearScreen - call Func_e99de - call Func_e99b9 + call PrintPCBox_PlaceHorizontalLines + call PrintPCBox_DrawLeftAndRightBorders ld a, [wBoxDataStart] cp 4 ret c coord hl, 4, 0 ld de, wBoxSpecies + 3 ld c, 6 - call Func_e994e + call PrintPCBox_PlaceBoxMonInfo ret -Func_e9907: +PrintPCBox_DrawPage3: call ClearScreen - call Func_e99de - call Func_e99b9 + call PrintPCBox_PlaceHorizontalLines + call PrintPCBox_DrawLeftAndRightBorders ld a, [wBoxDataStart] cp 10 ret c coord hl, 4, 0 ld de, wBoxSpecies + 9 ld c, 6 - call Func_e994e + call PrintPCBox_PlaceBoxMonInfo ret -Func_e9922: +PrintPCBox_DrawPage4: call ClearScreen - call Func_e99de - call Func_e99b9 + call PrintPCBox_PlaceHorizontalLines + call PrintPCBox_DrawLeftAndRightBorders coord hl, 0, 15 - call Func_e99cf + call PrintPCBox_DrawBottomBorderAtHL coord hl, 0, 16 ld bc, 2 * SCREEN_WIDTH ld a, " " @@ -1476,18 +874,18 @@ Func_e9922: coord hl, 4, 0 ld de, wBoxSpecies + 15 ld c, 5 - call Func_e994e + call PrintPCBox_PlaceBoxMonInfo ret -Func_e994e: -.asm_e994e +PrintPCBox_PlaceBoxMonInfo: +.loop ld a, c and a - jr z, .asm_e99a6 + jr z, .done dec c ld a, [de] cp $ff - jr z, .asm_e99a6 + jr z, .done ld [wd11e], a push bc push hl @@ -1529,73 +927,73 @@ Func_e994e: add hl, bc pop bc inc de - jr .asm_e994e + jr .loop -.asm_e99a6 +.done ret -Func_e99a7: +PrintPCBox_DrawTopBorder: coord hl, 0, 0 ld a, $79 ld [hli], a ld a, $7a ld c, SCREEN_WIDTH - 2 -.asm_e99b1 +.loop ld [hli], a dec c - jr nz, .asm_e99b1 + jr nz, .loop ld a, $7b ld [hl], a ret -Func_e99b9: +PrintPCBox_DrawLeftAndRightBorders: coord hl, 0, 0 ld de, SCREEN_WIDTH - 1 ld c, SCREEN_HEIGHT -.asm_e99c1 +.loop ld a, $7c ld [hl], a add hl, de ld a, $7c ld [hli], a dec c - jr nz, .asm_e99c1 + jr nz, .loop ret -Func_e99cc: +PrintPCBox_DrawBottomBorder: coord hl, 0, 17 -Func_e99cf: +PrintPCBox_DrawBottomBorderAtHL: ld a, $7d ld [hli], a ld a, $7a ld c, SCREEN_WIDTH - 2 -.asm_e99b1 +.loop ld [hli], a dec c - jr nz, .asm_e99b1 + jr nz, .loop ld a, $7e ld [hl], a ret -Func_e99de: +PrintPCBox_PlaceHorizontalLines: coord hl, 4, 0 ld c, 6 - call Func_e99eb + call .PlaceHorizontalLine coord hl, 6, 1 ld c, 6 -Func_e99eb: -.asm_e99eb +.PlaceHorizontalLine: +.loop push bc push hl - ld de, String_e99fd + ld de, .HorizontalLineString call PlaceString pop hl ld bc, 3 * SCREEN_WIDTH add hl, bc pop bc dec c - jr nz, .asm_e99eb + jr nz, .loop ret -String_e99fd: +.HorizontalLineString: db "----------@" diff --git a/engine/printer/serial.asm b/engine/printer/serial.asm new file mode 100755 index 00000000..54d31a15 --- /dev/null +++ b/engine/printer/serial.asm @@ -0,0 +1,622 @@ +StartTransmission_Send9Rows: ; e8783 (3a:4783) + ld a, 9 +Printer_StartTransmission: + push af + ld hl, wPrinterData + ld bc, wPrinterDataEnd - wPrinterData + xor a + call Printer_FillMemory + xor a + ld [rSB], a + ld [rSC], a + ld [wPrinterOpcode], a + ld hl, wPrinterConnectionOpen + set 0, [hl] + ld a, [wPrinterSettings] + ld [wPrinterSettingsTempCopy], a + pop af + ld [wPrinterQueueLength], a + ret + +; e87a8 +PrinterTransmissionJumptable: ; e87a8 (3a:47a8) + ld a, [wPrinterSendState] + ld e, a + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp [hl] + +.Jumptable: + dw Printer_InitSerial ; 00 + dw Printer_CheckConnectionStatus ; 01 + dw Printer_WaitSerial ; 02 + dw Printer_StartTransmittingTilemap ; 03 + dw Printer_TransmissionLoop ; 04 + dw Printer_WaitSerialAndLoopBack2 ; 05 + dw Printer_EndTilemapTransmission ; 06 + dw Printer_TransmissionLoop ; 07 + dw Printer_WaitSerial ; 08 + + dw Printer_SignalSendHeader ; 09 + dw Printer_TransmissionLoop ; 0a + dw Printer_WaitSerial ; 0b + dw Printer_WaitUntilFinished ; 0c + dw Printer_Quit ; 0d + + dw Printer_Next_ ; 0e + dw Printer_WaitSerial ; 0f + dw Printer_SignalLoopBack ; 10 + dw Printer_LoopBack ; 11 + dw Printer_WaitLoopBack ; 12 + dw Printer_WaitLoopBack_ ; 13 + +Printer_Next: + ld hl, wPrinterSendState + inc [hl] + ret + +Printer_Back: + ld hl, wPrinterSendState + dec [hl] + ret + +Printer_Quit: + xor a + ld [wPrinterStatusFlags], a + ld hl, wPrinterSendState + set 7, [hl] + ret + +Printer_Next_: + call Printer_Next + ret + +Printer_LoopBack: + ld a, $1 + ld [wPrinterSendState], a + ret + +Printer_InitSerial: + call ResetPrinterData + ld hl, PrinterDataPacket1 + call CopyPrinterDataHeader + xor a + ld [wPrinterDataSize], a + ld [wPrinterDataSize + 1], a + ld a, [wPrinterQueueLength] + ld [wPrinterRowIndex], a + call Printer_Next + call Printer_PrepareToSend + ld a, PRINTER_STATUS_CHECKING_LINK + ld [wPrinterStatusIndicator], a + ret + +Printer_StartTransmittingTilemap: + call ResetPrinterData + ld hl, wPrinterRowIndex + ld a, [hl] + and a + jr z, Printer_EndTilemapTransmission + ld hl, PrinterDataPacket3 + call CopyPrinterDataHeader + call Printer_Convert2RowsTo2bpp + ld a, (wPrinterSendDataSourceEnd - wPrinterSendDataSource) % $100 + ld [wPrinterDataSize], a + ld a, (wPrinterSendDataSourceEnd - wPrinterSendDataSource) / $100 + ld [wPrinterDataSize + 1], a + call ComputePrinterChecksum + call Printer_Next + call Printer_PrepareToSend + ld a, PRINTER_STATUS_TRANSMITTING + ld [wPrinterStatusIndicator], a + ret + +Printer_EndTilemapTransmission: + ld a, $6 + ld [wPrinterSendState], a + ld hl, PrinterDataPacket4 + call CopyPrinterDataHeader + xor a + ld [wPrinterDataSize], a + ld [wPrinterDataSize + 1], a + call Printer_Next + call Printer_PrepareToSend + ret + +Printer_SignalSendHeader: + call ResetPrinterData + ld hl, PrinterDataPacket2 + call CopyPrinterDataHeader + call Printer_StageHeaderForSend + ld a, $4 + ld [wPrinterDataSize], a + ld a, $0 + ld [wPrinterDataSize + 1], a + call ComputePrinterChecksum + call Printer_Next + call Printer_PrepareToSend + ld a, PRINTER_STATUS_PRINTING + ld [wPrinterStatusIndicator], a + ret + +Printer_SignalLoopBack: + call ResetPrinterData + ld hl, PrinterDataPacket1 + call CopyPrinterDataHeader + xor a + ld [wPrinterDataSize], a + ld [wPrinterDataSize + 1], a + ld a, [wPrinterQueueLength] + ld [wPrinterRowIndex], a + call Printer_Next + call Printer_PrepareToSend + ret + +Printer_WaitSerial: + ld hl, wPrinterSerialFrameDelay + inc [hl] + ld a, [hl] + cp $6 + ret c + xor a + ld [hl], a + call Printer_Next + ret + +Printer_WaitSerialAndLoopBack2: + ld hl, wPrinterSerialFrameDelay + inc [hl] + ld a, [hl] + cp $6 + ret c + xor a + ld [hl], a + ld hl, wPrinterRowIndex + dec [hl] + call Printer_Back + call Printer_Back + ret + +Printer_CheckConnectionStatus: + ld a, [wPrinterOpcode] + and a + ret nz + ld a, [wPrinterHandshake] + cp $ff + jr nz, .asm_e88dc + ld a, [wPrinterStatusFlags] + cp $ff + jr z, .asm_e88f8 +.asm_e88dc + ld a, [wPrinterHandshake] + cp $81 + jr nz, .asm_e88f8 + ld a, [wPrinterStatusFlags] + cp $0 + jr nz, .asm_e88f8 + ld hl, wPrinterConnectionOpen + set 1, [hl] + ld a, $5 + ld [wHandshakeFrameDelay], a + call Printer_Next + ret + +.asm_e88f8 + ld a, $ff + ld [wPrinterHandshake], a + ld [wPrinterStatusFlags], a + ld a, $e + ld [wPrinterSendState], a + ret + +Printer_TransmissionLoop: + ld a, [wPrinterOpcode] + and a + ret nz + ld a, [wPrinterStatusFlags] + and $f0 + jr nz, .asm_e8921 + ld a, [wPrinterStatusFlags] + and $1 + jr nz, .asm_e891d + call Printer_Next + ret + +.asm_e891d + call Printer_Back + ret + +.asm_e8921 + ld a, $12 + ld [wPrinterSendState], a + ret + +Printer_WaitUntilFinished: + ld a, [wPrinterOpcode] + and a + ret nz + ld a, [wPrinterStatusFlags] + and $f3 + ret nz + call Printer_Next + ret + +Printer_WaitLoopBack: + call Printer_Next +Printer_WaitLoopBack_: + ld a, [wPrinterOpcode] + and a + ret nz + ld a, [wPrinterStatusFlags] + and $f0 + ret nz + xor a + ld [wPrinterSendState], a + ret + +Printer_PrepareToSend: +.wait_printer_operation + ld a, [wPrinterOpcode] + and a + jr nz, .wait_printer_operation + xor a + ld [wPrinterSendByteOffset], a + ld [wPrinterSendByteOffset + 1], a + ld a, $1 + ld [wPrinterOpcode], a + ld a, $88 + ld [rSB], a + ld a, $1 + ld [rSC], a + ld a, $81 + ld [rSC], a + ret + +CopyPrinterDataHeader: + ld a, [hli] + ld [wPrinterDataHeader], a + ld a, [hli] + ld [wPrinterDataHeader + 1], a + ld a, [hli] + ld [wPrinterDataHeader + 2], a + ld a, [hli] + ld [wPrinterDataHeader + 3], a + ld a, [hli] + ld [wPrinterChecksum], a + ld a, [hl] + ld [wPrinterChecksum + 1], a + ret + +ResetPrinterData: + xor a + ld hl, wPrinterDataHeader + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ld hl, wPrinterChecksum + ld [hli], a + ld [hl], a + xor a + ld [wPrinterDataSize], a + ld [wPrinterDataSize + 1], a + ld hl, wPrinterSendDataSource + ld bc, wPrinterSendDataSourceEnd - wPrinterSendDataSource + call Printer_FillMemory + ret + +ComputePrinterChecksum: + ld hl, $0 + ld bc, $4 + ld de, wPrinterDataHeader + call .AddToChecksum + ld a, [wPrinterDataSize] + ld c, a + ld a, [wPrinterDataSize + 1] + ld b, a + ld de, wPrinterSendDataSource + call .AddToChecksum + ld a, l + ld [wPrinterChecksum], a + ld a, h + ld [wPrinterChecksum + 1], a + ret + +.AddToChecksum: +.loop + ld a, [de] + inc de + add l + jr nc, .no_carry + inc h +.no_carry + ld l, a + dec bc + ld a, c + or b + jr nz, .loop + ret + +Printer_StageHeaderForSend: + ld a, $1 + ld [wPrinterSendDataSource], a + ld a, [wcae2] + ld [wPrinterSendDataSource + 1], a + ld a, %11100100 + ld [wPrinterSendDataSource + 2], a + ld a, [wPrinterSettingsTempCopy] + ld [wPrinterSendDataSource + 3], a + ret + +Printer_Convert2RowsTo2bpp: + ld a, [wPrinterRowIndex] + ld b, a + ld a, [wPrinterQueueLength] + sub b + ld hl, wPrinterTileBuffer + ld de, 2 * SCREEN_WIDTH +.get_row + and a + jr z, .got_row + add hl, de + dec a + jr .get_row + +.got_row + ld e, l + ld d, h + ld hl, wPrinterSendDataSource + ld c, 2 * SCREEN_WIDTH +.loop + ld a, [de] + inc de + push bc + push de + push hl + swap a + ld d, a + and $f0 + ld e, a + ld a, d + and $f + ld d, a + and $8 + ld a, d + jr nz, .vchars1 + or $90 + jr .got_addr + +.vchars1 + or $80 +.got_addr + ld d, a + lb bc, BANK(Printer_Convert2RowsTo2bpp), 1 + call CopyVideoData + pop hl + ld de, $10 + add hl, de + pop de + pop bc + dec c + jr nz, .loop + ret + +Printer_FillMemory: ; e8a2e (3a:4a2e) + push de + ld e, a +.loop + ld [hl], e + inc hl + dec bc + ld a, c + or b + jr nz, .loop + ld a, e + pop de + ret + +PrinterDataPacket1: + db 1, 0, $00, 0 + dw 1 +PrinterDataPacket2: + db 2, 0, $04, 0 + dw 0 +PrinterDataPacket3: + db 4, 0, $80, 2 + dw 0 +PrinterDataPacket4: + db 4, 0, $00, 0 + dw 4 +PrinterDataPacket5: ; unused + db 8, 0, $00, 0 + dw 8 +PrinterDataPacket6: ; unused + db 15, 0, $00, 0 + dw 15 + +PrinterSerial_: ; e8a5e (3a:4a5e) + ld a, [wPrinterOpcode] + ld e, a + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp [hl] + +.Jumptable: + dw .Nop + + dw .SignalTransmissionStart + dw .SendHeaderByte1 + dw .SendHeaderByte2 + dw .SendHeaderByte3 + dw .SendHeaderByte4 + dw .DataByte + dw .SendChecksumLo + dw .SendChecksumHi + dw .SignalTransmissionEnd + dw .Receive1 + dw .Receive2 + + dw .SignalTransmissionStart + dw .Send_0F + dw .Send_00 + dw .Send_00 + dw .Send_00 + dw .Send_0F + dw .Send_00 + dw .SignalTransmissionEnd + dw .Receive1 + dw .Receive2_ + + dw .SignalTransmissionStart + dw .SignalQuit + dw .Send_00 + dw .Send_00 + dw .Send_00 + dw .SignalQuit + dw .Send_00 + dw .SignalTransmissionEnd + dw .Receive1 + dw .Receive2 + +.NextInstruction: + ld hl, wPrinterOpcode + inc [hl] + ret + +.Nop: + ret + +.SignalTransmissionStart: + ld a, $33 + call .SendByte + call .NextInstruction + ret + +.SendHeaderByte1: + ld a, [wPrinterDataHeader] + call .SendByte + call .NextInstruction + ret + +.SendHeaderByte2: + ld a, [wPrinterDataHeader + 1] + call .SendByte + call .NextInstruction + ret + +.SendHeaderByte3: + ld a, [wPrinterDataHeader + 2] + call .SendByte + call .NextInstruction + ret + +.SendHeaderByte4: + ld a, [wPrinterDataHeader + 3] + call .SendByte + call .NextInstruction + ret + +.DataByte: + ld hl, wPrinterDataSize + ld e, [hl] + inc hl + ld d, [hl] + ld a, e + or d + jr z, .sent_last_byte + dec de + ld [hl], d + dec hl + ld [hl], e + ld a, [wPrinterSendByteOffset] + ld e, a + ld a, [wPrinterSendByteOffset + 1] + ld d, a + ld hl, wPrinterSendDataSource + add hl, de + inc de + ld a, e + ld [wPrinterSendByteOffset], a + ld a, d + ld [wPrinterSendByteOffset + 1], a + ld a, [hl] + call .SendByte + ret + +.sent_last_byte + call .NextInstruction +.SendChecksumLo: + ld a, [wPrinterChecksum] + call .SendByte + call .NextInstruction + ret + +.SendChecksumHi: + ld a, [wPrinterChecksum + 1] + call .SendByte + call .NextInstruction + ret + +.SignalTransmissionEnd: + ld a, $0 + call .SendByte + call .NextInstruction + ret + +.Receive1: + ld a, [rSB] + ld [wPrinterHandshake], a + ld a, $0 + call .SendByte + call .NextInstruction + ret + +.Receive2: + ld a, [rSB] + ld [wPrinterStatusFlags], a + xor a + ld [wPrinterOpcode], a + ret + +.Send_0F: + ld a, $f + call .SendByte + call .NextInstruction + ret + +.Send_00: + ld a, $0 + call .SendByte + call .NextInstruction + ret + +.SignalQuit: + ld a, $8 + call .SendByte + call .NextInstruction + ret + +.SendByte: + ld [rSB], a + ld a, $1 + ld [rSC], a + ld a, $81 + ld [rSC], a + ret + +.Receive2_: + ld a, [rSB] + ld [wPrinterStatusFlags], a + xor a + ld [wPrinterOpcode], a + ret diff --git a/engine/surfing_minigame.asm b/engine/surfing_minigame.asm new file mode 100755 index 00000000..f70e8119 --- /dev/null +++ b/engine/surfing_minigame.asm @@ -0,0 +1,2826 @@ +SurfingPikachuMinigame: + call SurfingPikachuMinigame_BlankPals + call DelayFrame + call DelayFrame + call DelayFrame + ld a, [hTilesetType] + push af + xor a + ld [hTilesetType], a + ld a, [wUpdateSpritesEnabled] + push af + ld a, $ff + ld [wUpdateSpritesEnabled], a + ld a, [rIE] + push af + xor a + ld [rIF], a + ld a, $f + ld [rIE], a + ld a, $8 + ld [rSTAT], a + ld a, [H_AUTOBGTRANSFERDEST + 1] + push af + ld a, $98 + ld [H_AUTOBGTRANSFERDEST + 1], a + call Func_f8fb3 + call Func_f807a + xor a + ld [rBGP], a + ld [rOBP0], a + ld [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + call ClearObjectAnimationBuffers + call ClearSprites + xor a + ld [hLCDCPointer], a + ld [hSCX], a + ld [hSCY], a + ld a, $90 + ld [hWY], a + call DelayFrame + pop af + ld [H_AUTOBGTRANSFERDEST + 1], a + xor a + ld [rIF], a + pop af + ld [rIE], a + xor a + ld [rSTAT], a + call RunDefaultPaletteCommand + call ReloadMapAfterSurfingMinigame + call PlayDefaultMusic + call GBPalNormal + pop af + ld [wUpdateSpritesEnabled], a + pop af + ld [hTilesetType], a + ret + +Func_f807a: + call Func_f8116 + call DelayFrame + ld b, $e + call RunPaletteCommand +.loop + ld a, [wc5d1] + bit 7, a + ret nz + call Func_f923f + call Func_f80ac + ret nz + call Func_f8282 + ld a, $3c + ld [wCurrentAnimatedObjectOAMBufferOffset], a + call RunObjectAnimations + call Func_f8848 + call Func_f80a8 + call Func_f80c4 + jr .loop + +Func_f80a8: + call DelayFrame + ret + +Func_f80ac: + ld hl, wd492 + bit 1, [hl] + ret z + ld a, [hJoyPressed] + and $4 + ret + +Func_f80b7: + ld a, [hJoyPressed] + and $8 + ret z + ld hl, wc5e2 + ld a, [hl] + xor $1 + ld [hl], a + ret + +Func_f80c4: + ld a, [wc634] + and a + ret z + ld hl, wChannelNoteDelayCounters + ld a, $1 + cp [hl] + ret nz + inc hl + cp [hl] + ret nz + inc hl + cp [hl] + ret nz + ld a, [wc5e3] + ld e, a + ld a, [wc5e3 + 1] + and $3 + ld d, a + sla e + rl d + ld e, d + ld d, $0 + ld hl, Unkn_f80f5 + add hl, de + add hl, de + ld a, [hli] + ld [wMusicTempo + 1], a + ld a, [hl] + ld [wMusicTempo], a + ret + +Unkn_f80f5: + dw $75 + dw $6d + dw $65 + dw $5d + dw $55 + +Func_f80ff: + ld hl, wChannelNoteDelayCounters + ld a, $1 + cp [hl] + ret nz + inc hl + cp [hl] + ret nz + inc hl + cp [hl] + ret nz + ld a, $75 + ld [wMusicTempo + 1], a + xor a + ld [wMusicTempo], a + ret + +Func_f8116: + call Func_f9279 + call ClearSprites + call DisableLCD + ld hl, wSerialEnemyMonsPatchList + ld bc, $67 + xor a + call FillMemory + ld hl, wc700 + ld bc, $200 + xor a + call FillMemory + xor a + ld [H_AUTOBGTRANSFERENABLED], a + call ClearObjectAnimationBuffers + + ld hl, SurfingPikachu1Graphics + ld de, $9000 + ld bc, $500 + ld a, BANK(SurfingPikachu1Graphics) + call FarCopyData + + ld hl, SurfingPikachu1Graphics + $410 + ld de, $8000 + ld bc, $1000 + ld a, BANK(SurfingPikachu1Graphics) + call FarCopyData + + ld a, Unkn_f93d3 % $100 + ld [wAnimatedObjectSpawnStateDataPointer], a + ld a, Unkn_f93d3 / $100 + ld [wAnimatedObjectSpawnStateDataPointer + 1], a + ld a, Jumptable_f93fa % $100 + ld [wAnimatedObjectJumptablePointer], a + ld a, Jumptable_f93fa / $100 + ld [wAnimatedObjectJumptablePointer + 1], a + ld a, Unkn_f9507 % $100 + ld [wAnimatedObjectOAMDataPointer], a + ld a, Unkn_f9507 / $100 + ld [wAnimatedObjectOAMDataPointer + 1], a + ld a, Unkn_f9405 % $100 + ld [wAnimatedObjectFramesDataPointer], a + ld a, Unkn_f9405 / $100 + ld [wAnimatedObjectFramesDataPointer + 1], a + ld hl, vBGMap0 + ld bc, $800 + ld a, $0 + call FillMemory + ld hl, $98c0 + ld bc, $180 + ld a, $b + call FillMemory + ld a, $1 + lb de, $74, $58 + call SpawnAnimatedObject + ld a, $74 + ld [wc5ea], a + call Func_f9223 + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7e + ld [hWY], a + ld a, $42 + ld [hLCDCPointer], a + ld a, $40 + ld [wc5e3], a + xor a + ld [wc5e3 + 1], a + xor a + ld [wc5d6], a + ld a, $60 + ld [wc5d7], a + ld hl, wc61a + ld bc, $14 + ld a, $74 + call FillMemory + call Func_f81ff + call Func_f8256 + ld a, $e3 + ld [rLCDC], a + call Func_f81e9 + ld a, $e4 + ld [rOBP0], a + ld a, $e0 + ld [rOBP1], a + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ret + +Func_f81e9: + ld a, [wOnSGB] + and a + jr nz, .asm_f81f7 + ld a, $d0 + ld [rBGP], a + call UpdateGBCPal_BGP + ret + +.asm_f81f7 + ld a, $e4 + ld [rBGP], a + call UpdateGBCPal_BGP + ret + +Func_f81ff: + ld hl, wSpriteDataEnd + ld de, Unkn_f8249 + ld b, $97 + ld c, $80 + ld a, $4 + call Func_f8233 + ld de, Unkn_f8248 + ld b, $96 + ld c, $50 + ld a, $1 + call Func_f8233 + ld de, Unkn_f824d + ld b, $14 + ld c, $20 + ld a, $5 + call Func_f8233 + ld de, Unkn_f8252 + ld b, $20 + ld c, $80 + ld a, $4 + call Func_f8233 + ret + +Func_f8233: +.asm_f8233 + push af + ld [hl], b + inc hl + ld [hl], c + inc hl + ld a, [de] + ld [hl], a + inc hl + ld [hl], $0 + inc hl + ld a, c + add $8 + ld c, a + inc de + pop af + dec a + jr nz, .asm_f8233 + ret + +Unkn_f8248: + db $fe + +Unkn_f8249: + db $d0 + db $d0 + db $d0 + db $d0 + +Unkn_f824d: + db $ec + db $ed + db $ed + db $ee + db $ef + +Unkn_f8252: + db $ec + db $ed + db $ee + db $ef + +Func_f8256: + ld de, $9c21 + ld hl, Unkn_f8279 + ld c, $9 +.asm_f825e + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .asm_f825e + ld hl, $9c01 + ld [hl], $15 + ld hl, $9c02 + ld [hl], $16 + ld hl, $9c2c + ld [hl], $1b + ld hl, $9c2d + ld [hl], $1c + ret + +Unkn_f8279: + db $17 + db $18 + db $19 + db $19 + db $19 + db $19 + db $19 + db $19 + db $19 + +Func_f8282: + ld a, [wc5d1] + ld e, a + ld d, $0 + ld hl, Jumptable_f8291 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp [hl] + +Jumptable_f8291: + dw Func_f82ab + dw Func_f82bd + dw Func_f8324 + dw Func_f835c + dw Func_f838c + dw Func_f8399 + dw Func_f83aa + dw Func_f83bb + dw Func_f83cc + dw Func_f83e3 + dw Func_f8406 + dw Func_f840f + dw Func_f841d + +Func_f82ab: + ld a, $2 + lb de, $48, $e0 + call SpawnAnimatedObject + ld hl, wc5d1 + inc [hl] + ld a, $1 + ld [wc634], a + ret + +Func_f82bd: + ld a, [wc5e5] + cp $18 + jr nc, .asm_f82e8 + ld hl, wc5d6 + ld a, [hli] + or [hl] + and a + jr z, .asm_f82f6 + call Random + ld [wc5d5], a + call Func_f9210 + call Func_f88ae + call Func_f886b + call Func_f8cb0 + call Func_f844c + call Func_f88e4 + call Func_f88fd + ret + +.asm_f82e8 + ld hl, wc5d1 + inc [hl] + xor a + ld [wc634], a + ld a, $c0 + ld [wc632], a + ret + +.asm_f82f6 + ld a, $1 +Func_f82f8: + ld [wc630], a + ld a, $c + ld [wc5d1], a +Func_f8300: + ld a, $80 + ld [wc631], a + ld a, $b + lb de, $88, $58 + call SpawnAnimatedObject + ld hl, $7 + add hl, bc + ld [hl], $80 + ld hl, $b + add hl, bc + ld [hl], $80 + ld hl, $c + add hl, bc + ld [hl], $30 + xor a + ld [wc634], a + ret + +Func_f8324: + call Func_f8440 + jr c, .asm_f833d + xor a + ld [wc5d5], a + call Func_f9210 + call Func_f88ae + call Func_f886b + call Func_f8c97 + call Func_f80ff + ret + +.asm_f833d + ld hl, wc5d1 + inc [hl] + ld a, $90 + ld [hSCX], a + ld a, $72 + ld [wc5d3], a + ld a, $4 + ld [wc5d2], a + xor a + ld [hLCDCPointer], a + ld [wc617], a + ld [wc618], a + ld [wc619], a + ret + +Func_f835c: + ld a, [hSCX] + and a + jr z, .asm_f837b + call Func_f9210 + call Func_f88ae + call Func_f886b + ld a, [hSCX] + dec a + dec a + dec a + dec a + ld [hSCX], a + ld a, $e0 + ld [wc62e], a + call Func_f8cc7 + ret + +.asm_f837b + xor a + ld [wc5e3], a + ld [wc5e3 + 1], a + ld hl, wc5d1 + inc [hl] + ld a, $5 + ld [wc5d2], a + ret + +Func_f838c: + call Func_f891e + ld a, $20 + ld [wc632], a + ld hl, wc5d1 + inc [hl] + ret + +Func_f8399: + call Func_f8440 + ret nc + call Func_f8a92 + ld a, $40 + ld [wc632], a + ld hl, wc5d1 + inc [hl] + ret + +Func_f83aa: + call Func_f8440 + ret nc + call Func_f8ae4 + ld a, $40 + ld [wc632], a + ld hl, wc5d1 + inc [hl] + ret + +Func_f83bb: + call Func_f8440 + ret nc + call Func_f8b7a + ld a, $40 + ld [wc632], a + ld hl, wc5d1 + inc [hl] + ret + +Func_f83cc: + call Func_f8440 + ret nc + call Func_f8aa9 + push af + call Func_f8b5d + pop af + ret nc + ld a, $40 + ld [wc632], a + ld hl, wc5d1 + inc [hl] + ret + +Func_f83e3: + call Func_f8440 + ret nc + call Func_f8afb + push af + call Func_f8b5d + pop af + ret nc + ld a, $80 + ld [wc632], a + ld hl, wc5d1 + inc [hl] + call Func_f8b92 + ret nc + call Func_f8a7c +Func_f83ff: + ld a, $6 + ld [wc5d2], a + ret + +Func_f8406: + call Func_f8440 +Func_f8408: + ret nc + ld hl, wc5d1 + inc [hl] + ret + +Func_f840f: + call Func_f9210 + ld a, [hJoyPressed] + and $1 + ret z + ld hl, wc5d1 + set 7, [hl] + ret + +Func_f841d: + call Func_f9210 + call Func_f88ae + call Func_f886b + call Func_f8cb0 + call Func_f80ff + ld hl, wc631 + ld a, [hl] + and a + jr z, .asm_f8435 + dec [hl] + ret + +.asm_f8435 + ld a, [hJoyPressed] + and $1 + ret z + ld hl, wc5d1 + set 7, [hl] + ret + +Func_f8440: + ld hl, wc632 + ld a, [hl] + and a + jr z, .asm_f844a + dec [hl] + and a + ret + +.asm_f844a + scf + ret + +Func_f844c: + ld a, [wc5e6] + ld h, a + ld a, [wc5e7] + ld l, a + ld a, [wc5e3] + ld e, a + ld a, [wc5e3 + 1] + ld d, a + add hl, de + ld a, h + ld [wc5e6], a + ld a, l + ld [wc5e7], a + ret nc + ld hl, wc5e5 + inc [hl] + ld hl, wOAMBuffer + 4 * 4 + 1 + dec [hl] + dec [hl] + ret + +Func_f8470 + ld a, [wc5d2] + ld e, a + ld d, $0 + ld hl, Jumptable_f847f + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp [hl] + +Jumptable_f847f: + dw Func_f848d + dw Func_f84e2 + dw Func_f8516 + dw Func_f8545 + dw Func_f8561 + dw Func_f856d + dw Func_f8579 + +Func_f848d: + ld a, [wc630] + and a + jr nz, .asm_f84d2 + call Func_f87b5 + ld a, [wc5ea] + ld hl, $5 + add hl, bc + ld [hl], a + call Func_f871e + jr c, .asm_f84aa + call Func_f8742 + call Func_f86b8 + ret + +.asm_f84aa + call Func_f8742 + ld a, $1 + ld [wc5d2], a + xor a + ld hl, $c + add hl, bc + ld [hl], a + ld hl, $d + add hl, bc + ld [hl], a + ld hl, $e + add hl, bc + ld [hl], a + ld [wc5d9], a + ld [wc62f], a + xor a + ld [wChannelSoundIDs + CH7], a + ld a, SFX_UNKNOWN_801B3_4 + call PlaySound + ret + +.asm_f84d2 + xor a + ld [wc5e3], a + ld [wc5e3 + 1], a + ld a, $4 + ld [wc5d2], a + call Func_f8742 + ret + +Func_f84e2: + call Func_f8598 + call Func_f928c + ret nc + call Func_f8606 + jr c, .asm_f84fd + call Func_f8bed + ld hl, $c + add hl, bc + ld [hl], $0 + ld a, $2 + ld [wc5d2], a + ret + +.asm_f84fd + ld a, $3 + ld [wc5d2], a + ld a, $60 + ld [wc5e1], a + ld a, $10 + call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters + xor a + ld [wChannelSoundIDs + CH7], a + ld a, SFX_UNKNOWN_801B9_4 + call PlaySound + ret + +Func_f8516: + ld hl, $c + add hl, bc + ld a, [hl] + cp $20 + jr nc, .asm_f8539 + inc [hl] + inc [hl] + inc [hl] + inc [hl] + ld d, $4 + call Func_f9362 + ld hl, $7 + add hl, bc + ld [hl], a + call Func_f87b5 + ld a, [wc5ea] + ld hl, $5 + add hl, bc + ld [hl], a + ret + +.asm_f8539 + ld hl, $7 + add hl, bc + ld [hl], $0 + ld a, $0 + ld [wc5d2], a + ret + +Func_f8545: + ld hl, wc5e1 + ld a, [hl] + and a + jr z, .asm_f8556 + dec [hl] + ld a, [wc5ea] + ld hl, $5 + add hl, bc + ld [hl], a + ret + +.asm_f8556 + ld a, $0 + ld [wc5d2], a + ld a, $4 + call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters + ret + +Func_f8561: + ld a, [wc5ea] + ld hl, $5 + add hl, bc + ld [hl], a + call Func_f8742 + ret + +Func_f856d: + ld a, $f + call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters + ld hl, $c + add hl, bc + ld [hl], $0 + ret + +Func_f8579: + ld hl, $c + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + and $3f + cp $20 + jr c, .asm_f8591 + ld d, $10 + call Func_f9362 + ld hl, $7 + add hl, bc + ld [hl], a + ret + +.asm_f8591 + ld hl, $7 + add hl, bc + ld [hl], $0 + ret + +Func_f8598: + ld de, hJoy5 + ld a, [de] + and $20 + jr nz, .asm_f85a6 + ld a, [de] + and $10 + jr nz, .asm_f85cc + ret + +.asm_f85a6 + ld hl, $e + add hl, bc + ld [hl], $0 + ld hl, $d + add hl, bc + ld a, [hl] + inc [hl] + cp $b + jr c, .asm_f85be + call Func_f85f2 + ld hl, wc62f + set 0, [hl] +.asm_f85be + ld hl, $1 + add hl, bc + ld a, [hl] + cp $e + jr nc, .asm_f85c9 + inc [hl] + ret + +.asm_f85c9 + ld [hl], $1 + ret + +.asm_f85cc + ld hl, $d + add hl, bc + ld [hl], $0 + ld hl, $e + add hl, bc + ld a, [hl] + inc [hl] + cp $d + jr c, .asm_f85e4 + call Func_f85f2 + ld hl, wc62f + set 1, [hl] +.asm_f85e4 + ld hl, $1 + add hl, bc + ld a, [hl] + cp $1 + jr z, .asm_f85ef + dec [hl] + ret + +.asm_f85ef + ld [hl], $e + ret + +Func_f85f2: + call Func_f8bdf + xor a + ld hl, $d + add hl, bc + ld [hl], a + ld hl, $e + add hl, bc + ld [hl], a + ld a, SFX_UNKNOWN_801B6_4 + call PlaySound + ret + +Func_f8606: + ld hl, $1 + add hl, bc + ld a, [wc5ef] + cp $6 + jr z, .asm_f863d + cp $14 + jr z, .asm_f867b + cp $12 + jr z, .asm_f867b + cp $7 + jr z, .asm_f865c + ld a, [hl] + cp $1 + jp z, .asm_f86ad + cp $2 + jr z, .asm_f869a + cp $3 + jr z, .asm_f869f + cp $4 + jr z, .asm_f86a2 + cp $5 + jr z, .asm_f869f + cp $6 + jr z, .asm_f869a + cp $7 + jr z, .asm_f86ad + jr .asm_f86ad + +.asm_f863d + ld a, [hl] + cp $1 + jr z, .asm_f86ad + cp $2 + jr z, .asm_f86ad + cp $3 + jr z, .asm_f86ad + cp $4 + jr z, .asm_f869a + cp $5 + jr z, .asm_f869f + cp $6 + jr z, .asm_f86a2 + cp $7 + jr z, .asm_f869f + jr .asm_f86ad + +.asm_f865c + ld a, [hl] + cp $1 + jr z, .asm_f869f + cp $2 + jr z, .asm_f86a2 + cp $3 + jr z, .asm_f869f + cp $4 + jr z, .asm_f869a + cp $5 + jr z, .asm_f86ad + cp $6 + jr z, .asm_f86ad + cp $7 + jr z, .asm_f86ad + jr .asm_f86ad + +.asm_f867b + ld a, [hl] + cp $1 + jr z, .asm_f86ad + cp $2 + jr z, .asm_f869a + cp $3 + jr z, .asm_f869f + cp $4 + jr z, .asm_f86a2 + cp $5 + jr z, .asm_f86a2 + cp $6 + jr z, .asm_f869f + cp $7 + jr z, .asm_f869a + jr .asm_f86ad + +.asm_f869a + call Func_f86f7 + jr .asm_f86a2 + +.asm_f869f + call Func_f86d0 +.asm_f86a2 + xor a + ld [wChannelSoundIDs + CH7], a + ld a, SFX_UNKNOWN_801BF_4 + call PlaySound + and a + ret + +.asm_f86ad + ld a, $40 + ld [wc5e3], a + xor a + ld [wc5e3 + 1], a + scf + ret + +Func_f86b8: + ld a, [wc5e3 + 1] + cp $2 + ret nc + ld h, a + ld a, [wc5e3] + ld l, a + ld de, $2 + add hl, de + ld a, h + ld [wc5e3 + 1], a + ld a, l + ld [wc5e3], a + ret + +Func_f86d0: + ld a, [wc5e3 + 1] + and a + jr nz, .asm_f86e2 + ld a, [wc5e3] + cp $40 + jr nc, .asm_f86e2 + xor a + ld [wc5e3], a + ret + +.asm_f86e2 + ld a, [wc5e3 + 1] + ld h, a + ld a, [wc5e3] + ld l, a + ld de, $ffc0 + add hl, de + ld a, h + ld [wc5e3 + 1], a + ld a, l + ld [wc5e3], a + ret + +Func_f86f7: + ld a, [wc5e3 + 1] + and a + jr nz, .asm_f8709 + ld a, [wc5e3] + cp $80 + jr nc, .asm_f8709 + xor a + ld [wc5e3], a + ret + +.asm_f8709 + ld a, [wc5e3 + 1] + ld h, a + ld a, [wc5e3] + ld l, a + ld de, $ff80 + add hl, de + ld a, h + ld [wc5e3 + 1], a + ld a, l + ld [wc5e3], a + ret + +Func_f871e: + ld a, [hSCX] + and $7 + cp $3 + jr c, .asm_f8740 + cp $5 + jr nc, .asm_f8740 + ld a, [wc5ef] + cp $14 + jr nz, .asm_f8740 + call Func_f87a8 + cp $a + jr c, .asm_f8740 + ld [wc5ec], a + call Func_f9284 + scf + ret + +.asm_f8740 + and a + ret + +Func_f8742: + ld a, [hSCX] + and $7 + cp $3 + ret c + cp $5 + ret nc + ld a, [wc5ef] + cp $6 + jr z, .asm_f8766 + cp $14 + jr z, .asm_f8766 + cp $7 + jr z, .asm_f876a + call Func_f8778 + ld a, $4 + ld hl, $1 + add hl, bc + ld [hl], a + ret + +.asm_f8766 + ld a, $6 + jr .asm_f876c + +.asm_f876a + ld a, $2 +.asm_f876c + ld e, a + ld a, [wc5de] + dec a + add e + ld hl, $1 + add hl, bc + ld [hl], a + ret + +Func_f8778: + ld hl, wc5e0 + ld a, [hl] + inc [hl] + and $7 + ret nz + ld a, [wc5df] + and a + jr z, .asm_f8796 + ld a, [wc5de] + and a + jr z, .asm_f8791 + dec a + ld [wc5de], a + ret + +.asm_f8791 + xor a + ld [wc5df], a + ret + +.asm_f8796 + ld a, [wc5de] + cp $2 + jr z, .asm_f87a2 + inc a + ld [wc5de], a + ret + +.asm_f87a2 + ld a, $1 + ld [wc5df], a + ret + +Func_f87a8: + ld a, [wc5e3] + ld l, a + ld a, [wc5e3 + 1] + ld h, a + add hl, hl + add hl, hl + add hl, hl + ld a, h + ret + +Func_f87b5: + ld hl, wc5eb + ld a, [hl] + inc [hl] + and $3 + ret nz + call Func_f87ce + ld d, a + ld hl, $4 + add hl, bc + ld e, [hl] + ld a, $a + push bc + call SpawnAnimatedObject + pop bc + ret + +Func_f87ce: + ld a, [hSCX] + and $8 + jr nz, .asm_f87d9 + ld hl, wc622 + jr .asm_f87dc + +.asm_f87d9 + ld hl, wc623 +.asm_f87dc + ld a, [wc5f0] + cp $6 + jr z, .asm_f87ed + cp $14 + jr z, .asm_f87ed + cp $7 + jr z, .asm_f87f5 + ld a, [hl] + ret + +.asm_f87ed + ld a, [hSCX] + and $7 + ld e, a + ld a, [hl] + sub e + ret + +.asm_f87f5 + ld a, [hSCX] + and $7 + add [hl] + ret + +Func_f87fb: + ld hl, $4 + add hl, bc + ld a, [hl] + cp $58 + ret z + add $4 + ld [hl], a + ret + +Func_f8807: + call MaskCurrentAnimatedObjectStruct + ret + +Func_f880b: + ld hl, $b + add hl, bc + ld a, [hl] + and a + ret z + dec [hl] + dec [hl] + ld d, a + ld hl, $c + add hl, bc + ld a, [hl] + inc [hl] + call Func_f9362 + cp $80 + jr nc, .asm_f8825 + xor $ff + inc a +.asm_f8825 + ld hl, $7 + add hl, bc + ld [hl], a + ret + +Func_f882b: + ld hl, $b + add hl, bc + ld a, [hl] + inc [hl] + and $1 + ret z + ld hl, $4 + add hl, bc + ld a, [hl] + cp $c0 + jr z, .asm_f883f + inc [hl] + ret + +.asm_f883f + ld a, $1 + ld [wc633], a + call MaskCurrentAnimatedObjectStruct + ret + +Func_f8848: + ld a, [wc635] + ld e, a + ld d, $0 + ld a, [wc5e3] + ld l, a + ld a, [wc5e3 + 1] + ld h, a + add hl, de + ld a, l + ld [wc635], a + ld d, h + ld hl, wOAMBuffer + 5 * 4 + 1 + ld e, $9 +.asm_f8861 + ld a, [hl] + add d + ld [hli], a + inc hl + inc hl + inc hl + dec e + jr nz, .asm_f8861 + ret + +Func_f886b: + ld a, [wc5ef] + ld a, [hSCX] + add $48 + ld e, a + srl e + srl e + srl e + ld d, $0 + ld hl, vBGMap0 + add hl, de + ld a, [wc5ea] + srl a + srl a + srl a + ld c, a +.asm_f8889 + ld a, c + and a + jr z, .asm_f889a + dec c + ld de, $20 + add hl, de + ld a, h + and $3 + or $98 + ld h, a + jr .asm_f8889 + +.asm_f889a + ld de, wc5ef + ld a, e + ld [H_VBCOPYDEST], a + ld a, d + ld [H_VBCOPYDEST + 1], a + ld a, l + ld [H_VBCOPYSRC], a + ld a, h + ld [H_VBCOPYSRC + 1], a + ld a, $1 + ld [H_VBCOPYSIZE], a + ret + +Func_f88ae: + ld a, [hSCX] + and $8 + jr nz, .asm_f88b9 + ld hl, wc621 + jr .asm_f88bc + +.asm_f88b9 + ld hl, wc622 +.asm_f88bc + ld a, [wc5ef] + cp $6 + jr z, .asm_f88d0 + cp $14 + jr z, .asm_f88d0 + cp $7 + jr z, .asm_f88db + ld a, [hl] + ld [wc5ea], a + ret + +.asm_f88d0 + ld a, [hSCX] + and $7 + ld e, a + ld a, [hl] + sub e + ld [wc5ea], a + ret + +.asm_f88db + ld a, [hSCX] + and $7 + add [hl] + ld [wc5ea], a + ret + +Func_f88e4: + ld hl, wc5d6 + ld e, $99 + call Func_f88f0 + ret nc + inc hl + ld e, $99 +Func_f88f0: + ld a, [hl] + and a + jr z, .asm_f88fa + sub $1 + daa + ld [hl], a + and a + ret + +.asm_f88fa + ld [hl], e + scf + ret + +Func_f88fd: + ld de, wc5d7 + ld hl, wOAMBuffer + 0 * 4 + 2 + ld a, [de] + call Func_f890b + ld hl, wOAMBuffer + 2 * 4 + 2 + ld a, [de] +Func_f890b: + ld c, a + swap a + and $f + add $d0 + ld [hli], a + inc hl + inc hl + inc hl + ld a, c + and $f + add $d0 + ld [hl], a + dec de + ret + +Func_f891e: + ld hl, wTileMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call FillMemory + ld hl, Tilemap_f8946 + coord de, 0, 6 + ld bc, Tilemap_f8946End - Tilemap_f8946 + call CopyData + call Func_f8a0e + ld hl, wOAMBuffer + 5 * 4 + 1 + ld bc, $24 + xor a + call FillMemory + ld a, $1 + ld [H_AUTOBGTRANSFERENABLED], a + ret + +Tilemap_f8946: +INCBIN "gfx/unknown_f8946.map" +Tilemap_f8946End: + +Func_f8a0e: + coord hl, 1, 1 + lb de, $3b, $3c + ld a, $40 + call Func_f8a72 + coord hl, 1, 2 + lb de, $3f, $3f + ld a, $ff + call Func_f8a72 + coord hl, 1, 3 + lb de, $3f, $3f + ld a, $ff + call Func_f8a72 + coord hl, 1, 4 + lb de, $3f, $3f + ld a, $ff + call Func_f8a72 + coord hl, 1, 5 + lb de, $3f, $3f + ld a, $ff + call Func_f8a72 + coord hl, 1, 6 + lb de, $3f, $3f + ld a, $ff + call Func_f8a72 + coord hl, 1, 7 + lb de, $3f, $3f + ld a, $ff + call Func_f8a72 + coord hl, 1, 8 + lb de, $3f, $3f + ld a, $ff + call Func_f8a72 + coord hl, 1, 9 + lb de, $3d, $3e + ld a, $40 + call Func_f8a72 + ret + +Func_f8a72: + ld [hl], d + inc hl + ld c, $10 +.asm_f8a76 + ld [hli], a + dec c + jr nz, .asm_f8a76 + ld [hl], e + ret + +Func_f8a7c: + ld hl, Tilemap_f8a89 + coord de, 6, 8 + ld bc, $9 + call CopyData + ret + +Tilemap_f8a89: + db $20,$2e,$2f,$30,$31,$2c,$32,$23,$33 + +Func_f8a92: + ld hl, Tilemap_f8aa2 + coord de, 2, 2 + ld bc, $7 + call CopyData + call Func_f8aca + ret + +Tilemap_f8aa2: + db $20,$21,$ff,$22,$23,$24,$25 + +Func_f8aa9: + ld c, $63 +.asm_f8aab + push bc + ld hl, wc5d6 + ld a, [hli] + or [hl] + and a + jr z, .asm_f8ac7 + call Func_f88e4 + ld e, $1 +.asm_f8ab9 + call Func_f8b42 + pop bc + dec c + jr nz, .asm_f8aab +.asm_f8abf + ld a, SFX_UNKNOWN_801B0_4 + call PlaySound +.asm_f8ac5 + and a + ret + +.asm_f8ac7 + pop bc + scf + ret + +Func_f8aca: + coord hl, 10, 2 + ld de, wc5d7 + ld a, [de] + call Func_f9350 + inc hl + ld a, [de] + call Func_f9350 + inc hl + inc hl + ld [hl], $21 + inc hl + ld [hl], $25 + inc hl + ld [hl], $26 + ret + +Func_f8ae4: + ld hl, Tilemap_f8af4 + coord de, 2, 4 + ld bc, $7 + call CopyData + call Func_f8b25 + ret + +Tilemap_f8af4: + db $27,$28,$29,$2a,$23,$26,$26 + +Func_f8afb: + ld c, $63 +.asm_f8afd + push bc + ld hl, wc5da + ld a, [hli] + ld e, a + or [hl] + jr z, .asm_f8b22 + ld d, [hl] + ld a, e + sub $1 + daa + ld e, a + ld a, d + sbc $0 + daa + ld [hld], a + ld [hl], e + ld e, $1 + call Func_f8b42 + pop bc + dec c + jr nz, .asm_f8afd + ld a, SFX_UNKNOWN_801B0_4 + call PlaySound +.asm_f8b20 + and a + ret + +.asm_f8b22 + pop bc + scf + ret + +Func_f8b25: + ld a, [wc5db] + coord hl, 10, 4 + call Func_f9350 + ld a, [wc5da] + coord hl, 12, 4 + call Func_f9350 + inc hl + inc hl + ld [hl], $21 + inc hl + ld [hl], $25 + inc hl + ld [hl], $26 + ret + +Func_f8b42: + ld a, [wc5dc] + add e + daa + ld [wc5dc], a + ld a, [wc5dd] + adc $0 + daa + ld [wc5dd], a + ret nc + ld a, $99 + ld [wc5dc], a + ld [wc5dd], a + ret + +Func_f8b5d: + ld a, [wc5dd] + coord hl, 10, 6 + call Func_f9350 + ld a, [wc5dc] + coord hl, 12, 6 + call Func_f9350 + inc hl + inc hl + ld [hl], $21 + inc hl + ld [hl], $25 + inc hl + ld [hl], $26 + ret + +Func_f8b7a: + ld hl, Tilemap_f8b8d + coord de, 2, 6 + ld bc, $5 + call CopyData + call Func_f8b25 + call Func_f8b5d + ret + +Tilemap_f8b8d: + db $2b,$2c,$25,$28,$2d + +Func_f8b92: + ld hl, wSurfingMinigameHiScore + 1 + ld a, [wc5dd] + cp [hl] + jr c, .asm_f8ba6 + jr nz, .asm_f8bb0 + dec hl + ld a, [wc5dc] + cp [hl] + jr c, .asm_f8ba6 + jr nz, .asm_f8bb0 +.asm_f8ba6 + call WaitForSoundToFinish + ldpikacry e, PikachuCry28 + call SurfingMinigame_PlayPikaCryIfSurfingPikaInParty + and a + ret + +.asm_f8bb0 + ld a, [wc5dc] + ld [wSurfingMinigameHiScore], a + ld a, [wc5dd] + ld [wSurfingMinigameHiScore + 1], a + call WaitForSoundToFinish + ldpikacry e, PikachuCry34 + call SurfingMinigame_PlayPikaCryIfSurfingPikaInParty + ld a, SFX_GET_ITEM2_4_2 + call PlaySound + scf + ret + +SurfingMinigame_PlayPikaCryIfSurfingPikaInParty: ; f8bcb (3e:4bcb) + push de + callab IsSurfingPikachuInThePlayersParty + pop de + ret nc + callab PlayPikachuSoundClip + ret + +Func_f8bdf: + ld a, [wc5d9] + inc a + cp $4 + jr c, .asm_f8be9 + ld a, $3 +.asm_f8be9 + ld [wc5d9], a + ret + +Func_f8bed: + ld a, [wc5d9] + and a + ret z + ld a, [wc62f] + and $3 + cp $3 + jr z, .asm_f8c2b + ld a, [wc5d9] + ld d, a + ld e, $1 + ld a, $0 +.asm_f8c03 + add e + sla e + dec d + jr nz, .asm_f8c03 +.asm_f8c09 + push af + ld e, $50 + call Func_f8c7c + pop af + dec a + jr nz, .asm_f8c09 + ld hl, $5 + add hl, bc + ld a, [hl] + sub $10 + ld d, a + ld hl, $4 + add hl, bc + ld e, [hl] + ld a, [wc5d9] + add $3 + push bc + call SpawnAnimatedObject + pop bc + ret + +.asm_f8c2b + ld a, [wc5d9] + cp $3 + jr c, .asm_f8c53 + ld a, $a +.asm_f8c34 + push af + ld e, $50 + call Func_f8c7c + pop af + dec a + jr nz, .asm_f8c34 + ld hl, $5 + add hl, bc + ld a, [hl] + sub $10 + ld d, a + ld hl, $4 + add hl, bc + ld e, [hl] + ld a, $9 + push bc + call SpawnAnimatedObject + pop bc + ret + +.asm_f8c53 + ld e, $50 + call Func_f8c7c + ld e, $50 + call Func_f8c7c + ld e, $50 + call Func_f8c7c + ld e, $30 + call Func_f8c7c + ld hl, $5 + add hl, bc + ld a, [hl] + sub $10 + ld d, a + ld hl, $4 + add hl, bc + ld e, [hl] + ld a, $8 + push bc + call SpawnAnimatedObject + pop bc + ret + +Func_f8c7c: + ld a, [wc5da] + add e + daa + ld [wc5da], a + ld a, [wc5db] + adc $0 + daa + ld [wc5db], a + ret nc + ld a, $99 + ld [wc5da], a + ld [wc5db], a + ret + +Func_f8c97: + ld a, $a0 + ld [wc62e], a + ld a, [hSCX] + ld h, a + ld a, [wc617] + ld l, a + ld de, $900 + add hl, de + ld a, l + ld [wc617], a + ld a, h + ld [hSCX], a + jr Func_f8cc7 + +Func_f8cb0: + ld a, $a0 + ld [wc62e], a + ld a, [hSCX] + ld h, a + ld a, [wc617] + ld l, a + ld de, $180 + add hl, de + ld a, l + ld [wc617], a + ld a, h + ld [hSCX], a +Func_f8cc7: + ld hl, wc618 + ld a, [hSCX] + cp [hl] + ret z + ld [hl], a + and $f0 + ld hl, wc619 + cp [hl] + ret z + ld [hl], a + call Func_f8d44 + ld a, b + ld [wc5e8], a + ld a, c + ld [wc5e9], a + push de + ld hl, wc61a + ld de, wc61c + ld c, $12 +.asm_f8ceb + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .asm_f8ceb + ld a, [wc5e8] + ld [hli], a + ld a, [wc5e9] + ld [hl], a + pop de + ld hl, wRedrawRowOrColumnSrcTiles + ld c, $8 +.asm_f8cff + ld a, [de] + call Func_f8d28 + inc de + dec c + jr nz, .asm_f8cff + ld a, [wc62e] + ld e, a + ld a, [hSCX] + add e + and $f0 + srl a + srl a + srl a + ld e, a + ld d, $0 + ld hl, vBGMap0 + add hl, de + ld a, l + ld [hRedrawRowOrColumnDest], a + ld a, h + ld [hRedrawRowOrColumnDest + 1], a + ld a, $1 + ld [hRedrawRowOrColumnMode], a + ret + +Func_f8d28: + push de + push hl + ld l, a + ld h, $0 + ld de, Unkn_f96e5 + add hl, hl + add hl, hl + add hl, de + ld e, l + ld d, h + pop hl + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + pop de + ret + +Func_f8d44: + ld a, [wc5d3] + ld e, a + ld d, $0 + ld hl, Jumptable_f8d53 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp [hl] + +Jumptable_f8d53: + dw Func_f8e4b + dw Func_f8f28 + dw Func_f8f31 + dw Func_f8f3a + dw Func_f8f43 + dw Func_f8e7d + dw Func_f8f4c + dw Func_f8f55 + dw Func_f8f5e + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8f94 + dw Func_f8ec5 + dw Func_f8ece + dw Func_f8ed7 + dw Func_f8ee0 + dw Func_f8ee9 + dw Func_f8ef2 + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8f94 + dw Func_f8efb + dw Func_f8f04 + dw Func_f8f0d + dw Func_f8f16 + dw Func_f8f1f + dw Func_f8efb + dw Func_f8f04 + dw Func_f8f0d + dw Func_f8f16 + dw Func_f8f1f + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8f94 + dw Func_f8f28 + dw Func_f8f31 + dw Func_f8f3a + dw Func_f8f43 + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8f94 + dw Func_f8f4c + dw Func_f8f55 + dw Func_f8f5e + dw Func_f8f4c + dw Func_f8f55 + dw Func_f8f5e + dw Func_f8f4c + dw Func_f8f55 + dw Func_f8f5e + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8f94 + dw Func_f8f67 + dw Func_f8f70 + dw Func_f8efb + dw Func_f8f04 + dw Func_f8f0d + dw Func_f8f16 + dw Func_f8f1f + dw Func_f8f67 + dw Func_f8f70 + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8f94 + dw Func_f8ec5 + dw Func_f8ece + dw Func_f8ed7 + dw Func_f8ee0 + dw Func_f8ee9 + dw Func_f8ef2 + dw Func_f8e7d + dw Func_f8f67 + dw Func_f8f70 + dw Func_f8f67 + dw Func_f8f70 + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8f94 + dw Func_f8efb + dw Func_f8f04 + dw Func_f8f0d + dw Func_f8f16 + dw Func_f8f1f + dw Func_f8f28 + dw Func_f8f31 + dw Func_f8f3a + dw Func_f8f43 + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8e7d + dw Func_f8f94 + dw Func_f8e86 + dw Func_f8e8f + dw Func_f8e98 + dw Func_f8ea1 + dw Func_f8eaa + dw Func_f8eb3 + dw Func_f8ebc + dw Func_f8f9d + dw Func_f8e7d + dw Func_f8f79 + dw Func_f8f82 + dw Func_f8f82 + dw Func_f8f82 + dw Func_f8f82 + dw Func_f8f82 + dw Func_f8f82 + dw Func_f8f82 + dw Func_f8f8b + +Func_f8e4b: + ld a, [wc5e5] + cp $16 + jr c, .asm_f8e5a + jr z, .asm_f8e56 + jr nc, .asm_f8e6e +.asm_f8e56 + ld a, $6a + jr .asm_f8e6b + +.asm_f8e5a + ld a, [wc5d5] + and a + jr z, .asm_f8e6e + dec a + and $7 + ld e, a + ld d, $0 + ld hl, Unkn_f8e75 + add hl, de + ld a, [hl] +.asm_f8e6b + ld [wc5d3], a +.asm_f8e6e + lb bc, $74, $74 + ld de, Unkn_f973d + ret + +Unkn_f8e75: + db $01,$0e,$1a,$29,$32,$40,$4d,$5c + +Func_f8e7d: + lb bc, $74, $74 + ld de, Unkn_f973d + jp Func_f8fa9 + +Func_f8e86: + lb bc, $74, $6c + ld de, Unkn_f9745 + jp Func_f8fa9 + +Func_f8e8f: + lb bc, $64, $5c + ld de, Unkn_f974d + jp Func_f8fa9 + +Func_f8e98: + lb bc, $54, $4c + ld de, Unkn_f9755 + jp Func_f8fa9 + +Func_f8ea1: + lb bc, $44, $44 + ld de, Unkn_f975d + jp Func_f8fa9 + +Func_f8eaa: + lb bc, $44, $4c + ld de, Unkn_f9765 + jp Func_f8fa9 + +Func_f8eb3: + lb bc, $54, $5c + ld de, Unkn_f976d + jp Func_f8fa9 + +Func_f8ebc: + lb bc, $64, $6c + ld de, Unkn_f9775 + jp Func_f8fa9 + +Func_f8ec5: + lb bc, $74, $6c + ld de, Unkn_f977d + jp Func_f8fa9 + +Func_f8ece: + lb bc, $64, $5c + ld de, Unkn_f9785 + jp Func_f8fa9 + +Func_f8ed7: + lb bc, $54, $4c + ld de, Unkn_f978d + jp Func_f8fa9 + +Func_f8ee0: + lb bc, $4c, $4c + ld de, Unkn_f9795 + jp Func_f8fa9 + +Func_f8ee9: + lb bc, $54, $5c + ld de, Unkn_f979d + jp Func_f8fa9 + +Func_f8ef2: + lb bc, $64, $6c + ld de, Unkn_f97a5 + jp Func_f8fa9 + +Func_f8efb: + lb bc, $74, $6c + ld de, Unkn_f97ad + jp Func_f8fa9 + +Func_f8f04: + lb bc, $64, $5c + ld de, Unkn_f97b5 + jp Func_f8fa9 + +Func_f8f0d: + lb bc, $54, $54 + ld de, Unkn_f97bd + jp Func_f8fa9 + +Func_f8f16: + lb bc, $54, $5c + ld de, Unkn_f97c5 + jp Func_f8fa9 + +Func_f8f1f: + lb bc, $64, $6c + ld de, Unkn_f97cd + jp Func_f8fa9 + +Func_f8f28: + lb bc, $74, $6c + ld de, Unkn_f97d5 + jp Func_f8fa9 + +Func_f8f31: + lb bc, $64, $5c + ld de, Unkn_f97dd + jp Func_f8fa9 + +Func_f8f3a: + lb bc, $5c, $5c + ld de, Unkn_f97e5 + jp Func_f8fa9 + +Func_f8f43: + lb bc, $64, $6c + ld de, Unkn_f97ed + jp Func_f8fa9 + +Func_f8f4c: + lb bc, $74, $6c + ld de, Unkn_f97f5 + jp Func_f8fa9 + +Func_f8f55: + lb bc, $64, $64 + ld de, Unkn_f97fd + jp Func_f8fa9 + +Func_f8f5e: + lb bc, $64, $6c + ld de, Unkn_f9805 + jp Func_f8fa9 + +Func_f8f67: + lb bc, $74, $6c + ld de, Unkn_f980d + jp Func_f8fa9 + +Func_f8f70: + lb bc, $6c, $6c + ld de, Unkn_f9815 + jp Func_f8fa9 + +Func_f8f79: + lb bc, $74, $74 + ld de, Unkn_f981d + jp Func_f8fa9 + +Func_f8f82: + lb bc, $74, $74 + ld de, Unkn_f9825 + jp Func_f8fa9 + +Func_f8f8b: + lb bc, $74, $74 + ld de, Unkn_f9825 + jp Func_f8fae + +Func_f8f94: + lb bc, $74, $74 + ld de, Unkn_f973d + jp Func_f8fae + +Func_f8f9d: + lb bc, $74, $74 + ld de, Unkn_f973d + ret + +Func_f8fa4: + inc a + ld [wc5d3], a + ret + +Func_f8fa9: + ld hl, wc5d3 + inc [hl] + ret + +Func_f8fae: + xor a + ld [wc5d3], a + ret + +Func_f8fb3: + call Func_f9279 + call ClearSprites + call DisableLCD + xor a + ld [H_AUTOBGTRANSFERENABLED], a + call ClearObjectAnimationBuffers + ld hl, $6324 + ld de, $8800 + ld bc, $900 + ld a, $20 + call FarCopyData + ld a, Unkn_f93d3 % $100 + ld [wAnimatedObjectSpawnStateDataPointer], a + ld a, Unkn_f93d3 / $100 + ld [wAnimatedObjectSpawnStateDataPointer + 1], a + ld a, Jumptable_f93fa % $100 + ld [wAnimatedObjectJumptablePointer], a + ld a, Jumptable_f93fa / $100 + ld [wAnimatedObjectJumptablePointer + 1], a + ld a, Unkn_f9507 % $100 + ld [wAnimatedObjectOAMDataPointer], a + ld a, Unkn_f9507 / $100 + ld [wAnimatedObjectOAMDataPointer + 1], a + ld a, Unkn_f9405 % $100 + ld [wAnimatedObjectFramesDataPointer], a + ld a, Unkn_f9405 / $100 + ld [wAnimatedObjectFramesDataPointer + 1], a + ld a, $c + lb de, $74, $58 + call SpawnAnimatedObject + call Func_f9053 + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $90 + ld [hWY], a + ld b, $f + call RunPaletteCommand + ld a, $e3 + ld [rLCDC], a + ld a, $1 + ld [H_AUTOBGTRANSFERENABLED], a + call DelayFrame + call DelayFrame + call DelayFrame + call Func_f81e9 + ld a, $e4 + ld [rOBP0], a + ld a, $e0 + ld [rOBP1], a + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + call DelayFrame + ld a, MUSIC_SURFING_PIKACHU + ld c, BANK(Music_SurfingPikachu) + call PlayMusic + xor a + ld [wc633], a +.loop + ld a, [wc633] + and a + ret nz + ld a, $0 + ld [wCurrentAnimatedObjectOAMBufferOffset], a + call RunObjectAnimations + call DelayFrame + jr .loop + +Func_f9053: + ld hl, wTileMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, $ff + call FillMemory + ld hl, Tilemap_f90bc + coord de, 0, 6 + ld bc, 12 * SCREEN_WIDTH + call CopyData + ld de, Tilemap_f91c8 + coord hl, 4, 0 + lb bc, 6, 12 + call .CopyBox + coord hl, 3, 7 + lb bc, 3, 15 + call .FillBoxWithFF + ld hl, Tilemap_f91ac + coord de, 3, 7 + ld bc, 15 + call CopyData + ld hl, Tilemap_f91bb + coord de, 4, 9 + ld bc, 13 + call CopyData + ret + +.CopyBox: +.copy_row + push bc + push hl +.copy_col + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .copy_col + ld bc, SCREEN_WIDTH + pop hl + add hl, bc + pop bc + dec b + jr nz, .copy_row + ret + +.FillBoxWithFF: +.fill_row + push bc + push hl +.fill_col + ld [hl], $ff + inc hl + dec c + jr nz, .fill_col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .fill_row + ret + +Tilemap_f90bc: INCBIN "gfx/unknown_f90bc.map" +Tilemap_f91ac: INCBIN "gfx/unknown_f91ac.map" +Tilemap_f91bb: INCBIN "gfx/unknown_f91bb.map" +Tilemap_f91c8: INCBIN "gfx/unknown_f91c8.map" + +Func_f9210: + ld hl, wc710 + ld de, wc710 + 1 + ld c, $80 + ld a, [hl] + push af +.asm_f921a + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .asm_f921a + pop af + ld [hl], a + ret + +Func_f9223: + ld hl, wc700 + ld bc, $100 + ld de, $0 +.asm_f922c + ld a, e + and $1f + ld e, a + push hl + ld hl, Unkn_f96c5 + add hl, de + ld a, [hl] + pop hl + ld [hli], a + inc e + dec bc + ld a, c + or b + jr nz, .asm_f922c + ret + +Func_f923f: + call Joypad + ld a, [H_FRAMECOUNTER] + and a + jr nz, .asm_f9250 + ld a, [hJoyHeld] + ld [hJoy5], a + ld a, $2 + ld [H_FRAMECOUNTER], a + ret + +.asm_f9250 + xor a + ld [hJoy5], a + ret + +SurfingPikachuMinigame_BlankPals: + xor a + ld [rBGP], a + ld [rOBP0], a + ld [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ret + +SurfingPikachuMinigame_NormalPals: + ld a, $e4 + ld [rBGP], a + ld [rOBP0], a + ld a, $e0 + ld [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ret + +Func_f9279: + ld hl, wTileMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call FillMemory + ret + +Func_f9284: + xor a + ld [wc5ed], a + ld [wc5ee], a + ret + +Func_f928c: + ld a, [wc5ed] + and a + jr nz, .asm_f92e4 + ld a, [wc5ec] + ld d, a + ld a, [wc5ee] + or d + jr z, .asm_f92dd + ld a, [wc5ee] + ld e, a + ld hl, $ff80 + add hl, de + ld a, l + ld [wc5ee], a + ld a, h + ld [wc5ec], a + ld e, a + ld d, $0 + call Func_f9340 + ld e, l + ld d, h + ld a, $4 + call Func_f9340 + ld a, l + xor $ff + inc a + ld l, a + ld a, h + xor $ff + ld h, a + push hl + ld hl, $5 + add hl, bc + ld d, [hl] + ld hl, $c + add hl, bc + ld e, [hl] + pop hl + add hl, de + ld e, l + ld d, h + ld hl, $5 + add hl, bc + ld [hl], d + ld hl, $c + add hl, bc + ld [hl], e + and a + ret + +.asm_f92dd + ld a, $1 + ld [wc5ed], a + and a + ret + +.asm_f92e4 + ld a, [wc5ea] + ld e, a + ld hl, $5 + add hl, bc + ld a, [hl] + cp $90 + jr nc, .asm_f92f4 + cp e + jr nc, .asm_f9330 +.asm_f92f4 + ld a, [wc5ec] + ld d, a + ld a, [wc5ee] + ld e, a + ld hl, $80 + add hl, de + ld a, l + ld [wc5ee], a + ld a, h + ld [wc5ec], a + ld e, a + ld d, $0 + call Func_f9340 + ld e, l + ld d, h + ld a, $4 + call Func_f9340 + push hl + ld hl, $5 + add hl, bc + ld d, [hl] + ld hl, $c + add hl, bc + ld e, [hl] + pop hl + add hl, de + ld e, l + ld d, h + ld hl, $5 + add hl, bc + ld [hl], d + ld hl, $c + add hl, bc + ld [hl], e + and a + ret + +.asm_f9330 + ld hl, $5 + add hl, bc + ld a, [wc5ea] + ld [hl], a + ld hl, $c + add hl, bc + ld [hl], $0 + scf + ret + +Func_f9340: + ld hl, $0 +.asm_f9343 + srl a + jr nc, .asm_f9348 + add hl, de +.asm_f9348 + sla e + rl d + and a + jr nz, .asm_f9343 + ret + +Func_f9350: + ld c, a + swap a + and $f + add $d0 + ld [hli], a + ld a, c + and $f + add $d0 + ld [hl], a + dec de + ret + +Func_f9360: ; cosine + add $10 +Func_f9362: ; sine + and $3f + cp $20 + jr nc, .asm_f936d + call Func_f9377 + ld a, h + ret + +.asm_f936d + and $1f + call Func_f9377 + ld a, h + xor $ff + inc a + ret + +Func_f9377: + ld e, a + ld a, d + ld d, $0 + ld hl, Unkn_f9393 + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, $0 +.asm_f9386 + srl a + jr nc, .asm_f938b + add hl, de +.asm_f938b + sla e + rl d + and a + jr nz, .asm_f9386 + ret + +Unkn_f9393: + sine_wave $100 + +Unkn_f93d3: + db $00, $00, $00 + db $04, $01, $00 + db $11, $02, $00 + db $12, $02, $00 + db $15, $00, $00 + db $16, $00, $00 + db $17, $00, $00 + db $18, $00, $00 + db $19, $00, $00 + db $1a, $00, $00 + db $14, $00, $00 + db $13, $03, $00 + db $1b, $04, $00 + +Jumptable_f93fa: + dw Func_f9404 + dw Func_f8470 + dw Func_f87fb + dw Func_f880b + dw Func_f882b + +Func_f9404: + ret + +INCLUDE "data/animated_objects_3e_1.asm" + +Unkn_f96c5: +; a sine wave with amplitude 2 + db 0, 0, 0, 1, 1, 1, 1, 2 + db 2, 2, 1, 1, 1, 1, 0, 0 + db 0, 0, 0, -1, -1, -1, -1, -2 + db -2, -2, -1, -1, -1, -1, 0, 0 + +Unkn_f96e5: + db $00, $00, $00, $00 + db $0b, $0b, $0b, $0b + db $0b, $02, $02, $06 + db $03, $0b, $07, $03 + db $06, $06, $06, $06 + db $07, $07, $07, $07 + db $06, $04, $04, $08 + db $05, $07, $08, $05 + db $0b, $0b, $11, $12 + db $0b, $0b, $13, $03 + db $14, $12, $04, $08 + db $13, $07, $08, $05 + db $06, $14, $06, $14 + db $13, $07, $13, $07 + db $08, $08, $08, $08 + db $14, $12, $14, $12 + db $0b, $11, $02, $14 + db $06, $14, $06, $14 + db $0c, $0c, $0d, $0d + db $0d, $0d, $0d, $0d + db $0e, $0f, $10, $0b + db $12, $13, $12, $13 + +Unkn_f973d: + db $00, $00, $00, $01, $01, $01, $01, $01 +Unkn_f9745: + db $00, $00, $00, $01, $01, $02, $04, $06 +Unkn_f974d: + db $00, $00, $00, $01, $02, $04, $06, $0e +Unkn_f9755: + db $00, $00, $00, $10, $11, $06, $0e, $0e +Unkn_f975d: + db $00, $00, $00, $15, $15, $0e, $0e, $0e +Unkn_f9765: + db $00, $00, $00, $03, $05, $07, $0e, $0e +Unkn_f976d: + db $00, $00, $00, $01, $03, $05, $07, $0e +Unkn_f9775: + db $00, $00, $00, $01, $01, $03, $05, $07 +Unkn_f977d: + db $00, $00, $00, $01, $01, $02, $04, $06 +Unkn_f9785: + db $00, $00, $00, $01, $02, $04, $06, $0e +Unkn_f978d: + db $00, $00, $00, $08, $0f, $0a, $0e, $0e +Unkn_f9795: + db $00, $00, $00, $09, $0d, $0b, $0e, $0e +Unkn_f979d: + db $00, $00, $00, $01, $03, $05, $07, $0e +Unkn_f97a5: + db $00, $00, $00, $01, $01, $03, $05, $07 +Unkn_f97ad: + db $00, $00, $00, $01, $01, $02, $04, $06 +Unkn_f97b5: + db $00, $00, $00, $01, $10, $11, $06, $0e +Unkn_f97bd: + db $00, $00, $00, $01, $15, $15, $0e, $0e +Unkn_f97c5: + db $00, $00, $00, $01, $03, $05, $07, $0e +Unkn_f97cd: + db $00, $00, $00, $01, $01, $03, $05, $07 +Unkn_f97d5: + db $00, $00, $00, $01, $01, $02, $04, $06 +Unkn_f97dd: + db $00, $00, $00, $01, $08, $0f, $0a, $0e +Unkn_f97e5: + db $00, $00, $00, $01, $09, $0d, $0b, $0e +Unkn_f97ed: + db $00, $00, $00, $01, $01, $03, $05, $07 +Unkn_f97f5: + db $00, $00, $00, $01, $01, $10, $11, $06 +Unkn_f97fd: + db $00, $00, $00, $01, $01, $15, $15, $0e +Unkn_f9805: + db $00, $00, $00, $01, $01, $03, $05, $07 +Unkn_f980d: + db $00, $00, $00, $01, $01, $08, $0f, $0a +Unkn_f9815: + db $00, $00, $00, $01, $01, $09, $0d, $0b +Unkn_f981d: + db $00, $00, $00, $14, $14, $14, $14, $14 +Unkn_f9825: + db $00, $00, $00, $12, $13, $13, $13, $13 diff --git a/engine/titlescreen.asm b/engine/titlescreen.asm index b9abc1eb..c10e0315 100755 --- a/engine/titlescreen.asm +++ b/engine/titlescreen.asm @@ -42,22 +42,22 @@ DisplayTitleScreen: ; 4171 (1:4171) ld a, BANK(NineTile) call FarCopyData ld hl, GamefreakLogoGraphics ; 4:4d78 - ld de, vTitleLogo + $650 - ld bc, $90 + ld de, vTitleLogo + 101 * $10 + ld bc, 9 * $10 ld a, BANK(GamefreakLogoGraphics) call FarCopyData - callab Func_f453f + callab LoadYellowTitleScreenGFX ld hl, vBGMap0 ld bc, (vBGMap1 + $400) - vBGMap0 ld a, " " call FillMemory - callab Func_f4578 - call Func_4418 + callab TitleScreen_PlacePokemonLogo + call FillSpriteBuffer0WithAA call .WriteCopyrightTiles call SaveScreenTilesToBuffer2 call LoadScreenTilesFromBuffer2 call EnableLCD - callab Func_f459a + callab TitleScreen_PlacePikachu ld a, $9b call TitleScreenCopyTileMapToVRAM call SaveScreenTilesToBuffer1 @@ -136,7 +136,7 @@ DisplayTitleScreen: ; 4171 (1:4171) call PlaySound ; scroll game version in from the right - callab Func_f4585 + callab TitleScreen_PlacePikaSpeechBubble ld a, SCREEN_HEIGHT_PIXELS ld [hWY], a call Delay3 @@ -147,15 +147,15 @@ DisplayTitleScreen: ; 4171 (1:4171) ld a, MUSIC_TITLE_SCREEN ld [wNewSoundID], a call PlaySound -.asm_428f +.loop xor a ld [wUnusedCC5B], a - ld [wTitleMonSpecies], a - ld [wTitleMonSpecies+1], a - ld [wTitleMonSpecies+2], a - ld [wTitleMonSpecies+3], a + ld [wTitleScreenScene], a + ld [wTitleScreenScene + 1], a + ld [wTitleScreenScene + 2], a + ld [wTitleScreenScene + 3], a ld a, $f - ld [wTitleMonSpecies+4], a + ld [wTitleScreenScene + 4], a .titleScreenLoop call IncrementResetCounter jp c, .doTitlescreenReset @@ -163,12 +163,13 @@ DisplayTitleScreen: ; 4171 (1:4171) call JoypadLowSensitivity ld a, [hJoyHeld] cp D_UP | SELECT | B_BUTTON - jr z, .asm_42bf + jr z, .go_to_main_menu and A_BUTTON | START - jr nz, .asm_42bf - call Func_4390 + jr nz, .go_to_main_menu + call DoTitleScreenFunction jr .titleScreenLoop -.asm_42bf + +.go_to_main_menu ld e, $a call TitleScreen_PlayPikachuPCM call GBPalWhiteOutWithDelay3 @@ -190,24 +191,28 @@ DisplayTitleScreen: ; 4171 (1:4171) cp D_UP | SELECT | B_BUTTON jp z, .doClearSaveDialogue jp MainMenu + .asm_42f0 ; 42f0 (1:42f0) +; unreferenced callab Func_e8e79 - jp .asm_428f + jp .loop .asm_42fb ; 42fb (1:42fb) - ld a, [wTitleMonSpecies+4] +; unreferenced + ld a, [wTitleScreenScene + 4] inc a cp $2a jr c, .asm_4305 ld a, $f .asm_4305 - ld [wTitleMonSpecies+4], a + ld [wTitleScreenScene + 4], a ld e, a callab PlayPikachuSoundClip xor a - ld [wTitleMonSpecies+2], a - ld [wTitleMonSpecies+3], a + ld [wTitleScreenScene + 2], a + ld [wTitleScreenScene + 3], a jp .titleScreenLoop + .doTitlescreenReset ; 431b (1:431b) ld [wAudioFadeOutControl], a call StopAllMusic @@ -249,49 +254,52 @@ CopyrightTextString: ; 4355 (1:4355) TitleScreen_PlayPikachuPCM: ; 4387 (1:4387) callab PlayPikachuSoundClip ret - -Func_4390: ; 4390 (1:4390) - call Func_43de - ld a, [wTitleMonSpecies] + +DoTitleScreenFunction: ; 4390 (1:4390) + call .CheckTimer + ld a, [wTitleScreenScene] ld e, a ld d, 0 - ld hl, PointerTable_43a2 + ld hl, .Jumptable add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a - jp hl - -PointerTable_43a2: ; 43a2 (1:43a2) - dw Func_43be - dw Func_43c3 - dw Func_43d9 - dw Func_43d9 - dw Func_43c7 - dw Func_43d9 - dw Func_43d9 - dw Func_43c3 - dw Func_43d9 - dw Func_43d9 - dw Func_43bf - dw Func_43ba + jp [hl] -Func_43ba: ; 43ba (1:43ba) + +.Jumptable: ; 43a2 (1:43a2) + dw .Nop + dw .BlinkHalf + dw .BlinkWait + dw .BlinkWait + dw .BlinkClosed + dw .BlinkWait + dw .BlinkWait + dw .BlinkHalf + dw .BlinkWait + dw .BlinkWait + dw .BlinkOpen + dw .GoBackToStart + +.GoBackToStart: ; 43ba (1:43ba) xor a - ld [wTitleMonSpecies], a -Func_43be + ld [wTitleScreenScene], a +.Nop ret - -Func_43bf: ; 43bf (1:43bf) + +.BlinkOpen: ; 43bf (1:43bf) ld e, 0 - jr asm_43c9 -Func_43c3: ; 43c3 (1:43c3) + jr .LoadBlinkFrame + +.BlinkHalf: ; 43c3 (1:43c3) ld e, 4 - jr asm_43c9 -Func_43c7: ; 43c7 (1:43c7) + jr .LoadBlinkFrame + +.BlinkClosed: ; 43c7 (1:43c7) ld e, 8 -asm_43c9: ; 43c9 (1:43c9) +.LoadBlinkFrame: ; 43c9 (1:43c9) ld hl, wOAMBuffer + 2 ld c, 8 .loop @@ -304,24 +312,24 @@ asm_43c9: ; 43c9 (1:43c9) inc hl dec c jr nz, .loop -Func_43d9: ; 43d9 (1:43d9) - ld hl, wTitleMonSpecies +.BlinkWait: ; 43d9 (1:43d9) + ld hl, wTitleScreenScene inc [hl] ret - -Func_43de: ; 43de (1:43de) - ld hl, wTitleMonSpecies + 1 + +.CheckTimer: ; 43de (1:43de) + ld hl, wTitleScreenTimer ld a, [hl] inc [hl] and a - jr z, .asm_43ed + jr z, .restart cp $80 - jr z, .asm_43ed + jr z, .restart cp $90 ret nz -.asm_43ed +.restart ld a, $1 - ld [wTitleMonSpecies], a + ld [wTitleScreenScene], a ret ; copy text of fixed length NAME_LENGTH (like player name, rival name, mon names, ...) @@ -333,7 +341,7 @@ NintenText: db "NINTEN@" SonyText: db "SONY@" IncrementResetCounter: ; 4405 (1:4405) - ld hl, wTitleMonSpecies + 2 + ld hl, wTitleScreenScene + 2 ld e, [hl] inc hl ld d, [hl] @@ -346,16 +354,17 @@ IncrementResetCounter: ; 4405 (1:4405) ld [hl], e and a ret + .doReset scf ret -Func_4418: ; 4418 (1:4418) +FillSpriteBuffer0WithAA: ; 4418 (1:4418) xor a call SwitchSRAMBankAndLatchClockData - ld hl, $a000 + ld hl, S_SPRITEBUFFER0 ld bc, $20 ld a, $aa call FillMemory call PrepareRTCDataAndDisableSRAM - ret
\ No newline at end of file + ret diff --git a/engine/titlescreen2.asm b/engine/titlescreen2.asm index dec37da2..cf4506bc 100755 --- a/engine/titlescreen2.asm +++ b/engine/titlescreen2.asm @@ -91,7 +91,7 @@ TitleBallYTable: ; 374fa (d:74fa) TitleScreenAnimateBallIfStarterOut: ; 37506 (d:7506) ; Animate the TitleBall if a starter just got scrolled out. - ld a, [wTitleMonSpecies] + ld a, [wTitleScreenScene] cp STARTER1 jr z, .ok cp STARTER2 diff --git a/engine/unknown_ea3ea.asm b/engine/unknown_ea3ea.asm index c00785b4..9962649d 100755 --- a/engine/unknown_ea3ea.asm +++ b/engine/unknown_ea3ea.asm @@ -19,11 +19,11 @@ Func_ea3ea: ; ea3ea (3a:63ea) call LoadMonData ld hl, wTileMap - lb bc, $10, $12 + lb bc, 16, 18 call TextBoxBorder coord hl, 0, 12 - lb bc, $04, $12 + lb bc, 4, 18 call TextBoxBorder coord hl, 3, 10 @@ -46,7 +46,7 @@ Func_ea3ea: ; ea3ea (3a:63ea) ld [wPokeBallAnimData], a ld [wd0b5], a ld hl, wPartyMonNicks - call Func_ea511 + call .GetNamePointer coord hl, 8, 2 call PlaceString @@ -65,16 +65,16 @@ Func_ea3ea: ; ea3ea (3a:63ea) call PrintNumber coord hl, 8, 4 - ld de, String_ea52f + ld de, .OT call PlaceString ld hl, wPartyMonOT - call Func_ea511 + call .GetNamePointer coord hl, 9, 5 call PlaceString coord hl, 9, 6 - ld de, String_ea533 + ld de, .IDNo call PlaceString coord hl, 13, 6 @@ -83,7 +83,7 @@ Func_ea3ea: ; ea3ea (3a:63ea) call PrintNumber coord hl, 9, 8 - ld de, String_ea537 + ld de, .Stats ld a, [hFlags_0xFFFA] set 2, a ld [hFlags_0xFFFA], a @@ -115,24 +115,24 @@ Func_ea3ea: ; ea3ea (3a:63ea) coord hl, 1, 13 ld a, [wLoadedMonMoves] - call Func_ea51d + call .PlaceMoveName coord hl, 1, 14 ld a, [wLoadedMonMoves + 1] - call Func_ea51d + call .PlaceMoveName coord hl, 1, 15 ld a, [wLoadedMonMoves + 2] - call Func_ea51d + call .PlaceMoveName coord hl, 1, 16 ld a, [wLoadedMonMoves + 3] - call Func_ea51d + call .PlaceMoveName - ld b, $04 ; SET_PAL_STATUS_SCREEN + ld b, $4 ; SET_PAL_STATUS_SCREEN call RunPaletteCommand - ld a, $01 + ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a call Delay3 call GBPalNormal @@ -140,7 +140,7 @@ Func_ea3ea: ; ea3ea (3a:63ea) call LoadFlippedFrontSpriteByMonIndex ret -Func_ea511: ; ea511 (3a:6511) +.GetNamePointer: ; ea511 (3a:6511) ld bc, NAME_LENGTH ld a, [wWhichPokemon] call AddNTimes @@ -148,36 +148,36 @@ Func_ea511: ; ea511 (3a:6511) ld d, h ret -Func_ea51d: ; ea51d (3a:651d) +.PlaceMoveName: ; ea51d (3a:651d) and a - jr z, .asm_e6528 + jr z, .no_move ld [wPokeBallAnimData], a call GetMoveName - jr .asm_ea52b + jr .place_string -.asm_e6528 - ld de, String_ea554 -.asm_ea52b +.no_move + ld de, .Blank +.place_string call PlaceString ret ; ea52f -String_ea52f: +.OT: db "OT/@" ; ea533 -String_ea533: +.IDNo: db $73, "№/@" ; ea537 -String_ea537: +.Stats: db "ATTACK" next "DEFENSE" next "SPEED" next "SPECIAL@" ; ea554 -String_ea554: ; ea554 (3a:6554) +.Blank: ; ea554 (3a:6554) db "--------------@" GFX_ea563: ; ea563 (3a:6563) @@ -195,8 +195,8 @@ Func_ea573: ; ea573 (3a:6573) call CopyVideoData ld hl, wOAMBuffer + 32 * 4 - ld a, $08 - ld c, $08 + ld a, $8 + ld c, $8 .loop ld [hl], $10 inc hl @@ -204,9 +204,9 @@ Func_ea573: ; ea573 (3a:6573) inc hl ld [hl], $fe inc hl - ld [hl], $00 + ld [hl], $0 inc hl - add $08 + add $8 dec c jr nz, .loop ret @@ -218,7 +218,7 @@ GFX_ea597End: Func_ea5b7: ; ea5b7 (3a:65b7) ld hl, wOAMBuffer + 32 * 4 + 2 ld de, 4 - ld a, [$c971] + ld a, [wPrinterStatusFlags] ld c, 8 .asm_ea5c2 sla a @@ -235,7 +235,7 @@ Func_ea5b7: ; ea5b7 (3a:65b7) ret Func_ea5d1: ; ea5d1 (3a:65d1) - ld a, [wOverworldMap] + ld a, [wPrinterSendState] ld e, a ld d, 0 ld hl, Jumptable_ea5e0 @@ -269,19 +269,19 @@ Jumptable_ea5e0: Func_ea606: ; ea606 (3a:6606) - ld hl, wOverworldMap + ld hl, wPrinterSendState inc [hl] ret Func_ea60b: ; ea60b (3a:660b) - ld hl, wOverworldMap + ld hl, wPrinterSendState dec [hl] ret Func_ea610: ; ea610 (3a:6610) xor a - ld [$c971], a - ld hl, wOverworldMap + ld [wPrinterStatusFlags], a + ld hl, wPrinterSendState set 7, [hl] ret @@ -291,7 +291,7 @@ Func_ea61a: ; ea61a (3a:661a) Func_ea61e: ; ea61e (3a:661e) xor a - ld [wOverworldMap], a + ld [wPrinterSendState], a ret Func_ea623: ; ea623 (3a:6623) @@ -299,19 +299,19 @@ Func_ea623: ; ea623 (3a:6623) ld hl, Data_ea9de call Func_ea76b xor a - ld [$c976], a - ld [$c977], a - ld a, [$caf4] - ld [$c6e9], a + ld [wPrinterDataSize], a + ld [wPrinterDataSize + 1], a + ld a, [wPrinterQueueLength] + ld [wPrinterRowIndex], a call Func_ea606 call Func_ea74c - ld a, $01 - ld [$cae0], a + ld a, $1 + ld [wPrinterStatusIndicator], a ret Func_ea645: ; ea645 (3a:6645) call Func_ea784 - ld hl, $c6e9 + ld hl, wPrinterRowIndex ld a, [hl] and a jr z, Func_ea671 @@ -319,24 +319,24 @@ Func_ea645: ; ea645 (3a:6645) call Func_ea76b call Func_ea7e9 ld a, $80 - ld [$c976], a - ld a, $02 - ld [$c977], a + ld [wPrinterDataSize], a + ld a, $2 + ld [wPrinterDataSize + 1], a call Func_ea7a2 call Func_ea606 call Func_ea74c - ld a, $02 - ld [$cae0], a + ld a, $2 + ld [wPrinterStatusIndicator], a ret Func_ea671: ; ea671 (3a:6671) - ld a, $06 - ld [wOverworldMap], a + ld a, $6 + ld [wPrinterSendState], a ld hl, Data_ea9f0 call Func_ea76b xor a - ld [$c976], a - ld [$c977], a + ld [wPrinterDataSize], a + ld [wPrinterDataSize + 1], a call Func_ea606 call Func_ea74c ret @@ -346,22 +346,22 @@ Func_ea68a: ; ea68a (3a:668a) ld hl, Data_ea9e4 call Func_ea76b call Func_ea7d2 - ld a, $04 - ld [$c976], a - ld a, $00 - ld [$c977], a + ld a, $4 + ld [wPrinterDataSize], a + ld a, $0 + ld [wPrinterDataSize + 1], a call Func_ea7a2 call Func_ea606 call Func_ea74c - ld a, $03 - ld [$cae0], a + ld a, $3 + ld [wPrinterStatusIndicator], a ret Func_ea6af: ; ea6af (3a:66af) - ld hl, $c973 + ld hl, wPrinterSerialFrameDelay inc [hl] ld a, [hl] - cp a, $06 + cp a, $6 ret c xor a ld [hl], a @@ -369,14 +369,14 @@ Func_ea6af: ; ea6af (3a:66af) ret Func_ea6bd: ; ea6bd (3a:66bd) - ld hl, $c973 + ld hl, wPrinterSerialFrameDelay inc [hl] ld a, [hl] cp 6 ret c xor a ld [hl], a - ld hl, $c6e9 + ld hl, wPrinterRowIndex dec [hl] call Func_ea60b call Func_ea60b @@ -385,37 +385,37 @@ Func_ea6bd: ; ea6bd (3a:66bd) Func_ea6d2: ; ea6d2 (3a:66d2) call Func_ea742 ret c - ld a, [$c970] + ld a, [wPrinterHandshake] cp a, $ff jr nz, .asm_ea6e4 - ld a, [$c971] + ld a, [wPrinterStatusFlags] cp a, $ff jr z, .asm_ea6fb .asm_ea6e4 - ld a, [$c970] + ld a, [wPrinterHandshake] cp a, $81 jr nz, .asm_ea6fb - ld a, [$c971] - cp a, $00 + ld a, [wPrinterStatusFlags] + cp a, $0 jr nz, .asm_ea6fb - ld hl, wUnknownSerialFlag_d49a + ld hl, wPrinterConnectionOpen set 1, [hl] call Func_ea606 ret .asm_ea6fb - ld a, $0e - ld [wOverworldMap], a + ld a, $e + ld [wPrinterSendState], a ret Func_ea701: ; ea701 (3a:6701) call Func_ea742 ret c - ld a, [$c971] + ld a, [wPrinterStatusFlags] and $f0 jr nz, .asm_ea71b - ld a, [$c971] - and $01 + ld a, [wPrinterStatusFlags] + and $1 jr nz, .asm_ea717 call Func_ea606 ret @@ -426,13 +426,13 @@ Func_ea701: ; ea701 (3a:6701) .asm_ea71b ld a, $11 - ld [wOverworldMap], a + ld [wPrinterSendState], a ret Func_ea721: ; ea721 (3a:6721) call Func_ea742 ret c - ld a, [$c971] + ld a, [wPrinterStatusFlags] and $f3 ret nz call Func_ea606 @@ -441,18 +441,18 @@ Func_ea721: ; ea721 (3a:6721) Func_ea72f: ; ea72f (3a:672f) call Func_ea606 Func_ea732: ; ea732 (3a:6732) - ld a, [wUnknownSerialFlag_d49b] + ld a, [wPrinterOpcode] and a ret nz - ld a, [$c971] + ld a, [wPrinterStatusFlags] and $f0 ret nz xor a - ld [wOverworldMap], a + ld [wPrinterSendState], a ret Func_ea742: ; ea742 (3a:6742) - ld a, [wUnknownSerialFlag_d49b] + ld a, [wPrinterOpcode] and a jr nz, .asm_ea74a and a @@ -464,17 +464,17 @@ Func_ea742: ; ea742 (3a:6742) Func_ea74c: ; ea74c (3a:674c) .asm_ea74c - ld a, [wUnknownSerialFlag_d49b] + ld a, [wPrinterOpcode] and a jr nz, .asm_ea74c - ld a, $01 - ld [wUnknownSerialFlag_d49b], a + ld a, $1 + ld [wPrinterOpcode], a xor a - ld [$c974], a - ld [$c975], a + ld [wPrinterSendByteOffset], a + ld [wPrinterSendByteOffset + 1], a ld a, $88 ld [rSB], a - ld a, $01 + ld a, $1 ld [rSC], a ld a, $81 ld [rSC], a @@ -482,52 +482,52 @@ Func_ea74c: ; ea74c (3a:674c) Func_ea76b: ; ea76b (3a:676b) ld a, [hli] - ld [$c6ea], a + ld [wPrinterDataHeader], a ld a, [hli] - ld [$c6eb], a + ld [wPrinterDataHeader + 1], a ld a, [hli] - ld [$c6ec], a + ld [wPrinterDataHeader + 2], a ld a, [hli] - ld [$c6ed], a + ld [wPrinterDataHeader + 3], a ld a, [hli] - ld [$c6ee], a + ld [wPrinterDataHeader + 4], a ld a, [hl] - ld [$c6ef], a + ld [wPrinterDataHeader + 5], a ret Func_ea784: ; ea784 (3a:6784) xor a - ld hl, $c6ea + ld hl, wPrinterDataHeader ld [hli], a ld [hli], a ld [hli], a ld [hl], a - ld hl, $c6ee + ld hl, wPrinterDataHeader + 4 ld [hli], a ld [hl], a xor a - ld [$c976], a - ld [$c977], a - ld hl, $c6f0 + ld [wPrinterDataSize], a + ld [wPrinterDataSize + 1], a + ld hl, wPrinterSendDataSource ld bc, $280 call FillMemory ret Func_ea7a2: ; ea7a2 (3a:67a2) - ld hl, $0000 - ld bc, $0004 - ld de, $c6ea + ld hl, $0 + ld bc, $4 + ld de, wPrinterDataHeader call Func_ea7c5 - ld a, [$c976] + ld a, [wPrinterDataSize] ld c, a - ld a, [$c977] + ld a, [wPrinterDataSize + 1] ld b, a - ld de, $c6f0 + ld de, wPrinterSendDataSource call Func_ea7c5 ld a, l - ld [$c6ee], a + ld [wPrinterDataHeader + 4], a ld a, h - ld [$c6ef], a + ld [wPrinterDataHeader + 5], a ret Func_ea7c5: ; ea7c5 (3a:67c5) @@ -546,36 +546,36 @@ Func_ea7c5: ; ea7c5 (3a:67c5) ret Func_ea7d2: ; ea7d2 (3a:67d2) - ld a, $01 - ld [$c6f0], a - ld a, [$cae2] - ld [$c6f1], a + ld a, $1 + ld [wPrinterSendDataSource], a + ld a, [wcae2] + ld [wPrinterStatusReceived], a ld a, $e4 - ld [$c6f2], a - ld a, [$cae3] - ld [$c6f3], a + ld [wc6f2], a + ld a, [wPrinterSettingsTempCopy] + ld [wc6f3], a ret Func_ea7e9: ; ea7e9 (3a:67e9) - ld a, [$c6e9] + ld a, [wPrinterRowIndex] ld b, a - ld a, [$caf4] + ld a, [wPrinterQueueLength] sub b - ld hl, $c978 - ld de, $0028 -.asm_ea7f7 + ld hl, wPrinterTileBuffer + ld de, $28 +.get_start_addr and a - jr z, .asm_ea7fe + jr z, .start_working add hl, de dec a - jr .asm_ea7f7 + jr .get_start_addr -.asm_ea7fe +.start_working ld e, l ld d, h - ld hl, $c6f0 + ld hl, wPrinterSendDataSource ld c, $28 -.asm_ea805 +.prep_loop ld a, [de] inc de push bc @@ -586,47 +586,47 @@ Func_ea7e9: ; ea7e9 (3a:67e9) and $f0 ld e, a ld a, d - and $0f + and $f ld d, a - and $08 + and $8 ld a, d - jr nz, .asm_ea81d + jr nz, .vtiles1 or $90 - jr .asm_ea81f + jr .got_vram_address -.asm_ea81d +.vtiles1 or $80 -.asm_ea81f +.got_vram_address ld d, a - lb bc, $3a, $01 + lb bc, BANK(Func_ea7e9), $1 call CopyVideoData pop hl - ld de, $0010 + ld de, $10 add hl, de pop de pop bc dec c - jr nz, .asm_ea805 - call Func_ea834 + jr nz, .prep_loop + call .UnnecessaryCall ret -Func_ea834: ; ea834 (3a:6834) - ld hl, $cbdc - ld bc, $0020 +.UnnecessaryCall: ; ea834 (3a:6834) + ld hl, wcbdc + ld bc, $20 xor a call FillMemory - ld hl, $c300 + ld hl, wOAMBuffer ld c, $28 -.asm_ea843 +.master_loop push bc push hl - call Func_ea860 - jr nc, .asm_ea856 - call Func_ea886 - call Func_ea8a1 - call Func_ea902 - call Func_ea999 -.asm_ea856 + call .AreWePrintingThisSegment + jr nc, .skip_segment + call .GetVRAMAddress + call .GetOAMFlags + call .ApplyObjectPalettes + call .PlaceObject +.skip_segment pop hl inc hl inc hl @@ -634,44 +634,44 @@ Func_ea834: ; ea834 (3a:6834) inc hl pop bc dec c - jr nz, .asm_ea843 + jr nz, .master_loop ret -Func_ea860: ; ea860 (3a:6860) - ld a, [$c6e9] +.AreWePrintingThisSegment: ; ea860 (3a:6860) + ld a, [wPrinterRowIndex] ld b, a - ld a, [$caf4] + ld a, [wPrinterQueueLength] sub b ld c, a ld b, $10 -.asm_ea86b +.add_n_times ld a, c and a - jr z, .asm_ea876 + jr z, .check ld a, b add $10 ld b, a dec c - jr .asm_ea86b + jr .add_n_times -.asm_ea876 +.check ld a, b ld e, a add $10 ld d, a ld a, [hl] cp e - jr c, .asm_ea884 + jr c, .not_printing cp d - jr nc, .asm_ea884 + jr nc, .not_printing scf ret -.asm_ea884 +.not_printing and a ret -Func_ea886: ; ea886 (3a:6886) +.GetVRAMAddress: ; ea886 (3a:6886) push hl inc hl inc hl @@ -681,81 +681,81 @@ Func_ea886: ; ea886 (3a:6886) and $f0 ld e, a ld a, d - and $0f + and $f or $80 ld d, a - ld hl, $cbdc - lb bc, $3a, $01 + ld hl, wcbdc + lb bc, BANK(.GetVRAMAddress), $1 call CopyVideoData pop hl ret -Func_ea8a1: ; ea8a1 (3a:68a1) +.GetOAMFlags: ; ea8a1 (3a:68a1) push hl inc hl inc hl inc hl ld a, [hl] - call Func_ea8ab + call .DoBitOperation pop hl ret -Func_ea8ab: ; ea8ab (3a:68ab) +.DoBitOperation: ; ea8ab (3a:68ab) and $60 swap a ld e, a ld d, 0 - ld hl, Jumptable_ea8ba + ld hl, .Jumptable add hl, de ld a, [hli] ld h, [hl] ld l, a jp [hl] -Jumptable_ea8ba: ; ea8ba (3a:68ba) - dw Func_ea8c2 - dw Func_ea8c3 - dw Func_ea8c7 - dw Func_ea8cb +.Jumptable: ; ea8ba (3a:68ba) + dw .nop + dw .one + dw .two + dw .both -Func_ea8c2: ; ea8c2 (3a:68c2) +.nop: ; ea8c2 (3a:68c2) ret -Func_ea8c3: ; ea8c3 (3a:68c3) - call Func_ea8d2 +.one: ; ea8c3 (3a:68c3) + call .Invert ret -Func_ea8c7: ; ea8c7 (3a:68c7) - call Func_ea8e8 +.two: ; ea8c7 (3a:68c7) + call .Swap ret -Func_ea8cb: ; ea8cb (3a:68cb) - call Func_ea8d2 - call Func_ea8e8 +.both: ; ea8cb (3a:68cb) + call .Invert + call .Swap ret -Func_ea8d2: ; ea8d2 (3a:68d2) - ld hl, $cbdc +.Invert: ; ea8d2 (3a:68d2) + ld hl, wcbdc ld c, 16 -.asm_ea8d7 +.byte_loop ld d, [hl] ld a, 0 ld b, 8 -.asm_ea8dc +.bit_loop sla d rr a dec b - jr nz, .asm_ea8dc + jr nz, .bit_loop ld [hli], a dec c - jr nz, .asm_ea8d7 + jr nz, .byte_loop ret -Func_ea8e8: ; ea8e8 (3a:68e8) - ld hl, $cbdc - ld de, $cbea - ld c, $04 -.asm_ea8f0 +.Swap: ; ea8e8 (3a:68e8) + ld hl, wcbdc + ld de, wcbea + ld c, $4 +.swap_loop ld b, [hl] ld a, [de] ld [hli], a @@ -771,19 +771,19 @@ Func_ea8e8: ; ea8e8 (3a:68e8) dec de dec de dec c - jr nz, .asm_ea8f0 + jr nz, .swap_loop ret -Func_ea902: ; ea902 (3a:6902) +.ApplyObjectPalettes: ; ea902 (3a:6902) push hl - ld hl, $cbdc - ld de, $cbec - ld a, $08 -.asm_ea90b + ld hl, wcbdc + ld de, wcbec + ld a, 8 +.loop1 push af - ld bc, $0000 - ld a, $08 -.asm_ea911 + ld bc, $0 + ld a, 8 +.loop2 push af xor a rlc [hl] @@ -794,12 +794,12 @@ Func_ea902: ; ea902 (3a:6902) dec hl push hl push de - call Func_ea936 + call .ExpandPalettesToBC pop de pop hl pop af dec a - jr nz, .asm_ea911 + jr nz, .loop2 inc hl inc hl ld a, b @@ -810,19 +810,19 @@ Func_ea902: ; ea902 (3a:6902) inc de pop af dec a - jr nz, .asm_ea90b + jr nz, .loop1 pop hl ret -Func_ea936 ; ea936 (3a:6936) - call Func_ea93d - call Func_ea96d +.ExpandPalettesToBC: ; ea936 (3a:6936) + call .GetPaletteFunction + call .ApplyPaletteFunction ret -Func_ea93d: ; ea93d (3a:693d) +.GetPaletteFunction: ; ea93d (3a:693d) ld e, a ld d, 0 - ld hl, Jumptable_ea949 + ld hl, .PalJumptable add hl, de add hl, de ld a, [hli] @@ -830,41 +830,41 @@ Func_ea93d: ; ea93d (3a:693d) ld l, a jp [hl] -Jumptable_ea949: ; ea949 (3a:6949) - dw Func_ea951 - dw Func_ea95f - dw Func_ea956 - dw Func_ea966 +.PalJumptable: ; ea949 (3a:6949) + dw .Pal0 + dw .Pal1 + dw .Pal2 + dw .Pal3 -Func_ea951: ; ea951 (3a:6951) +.Pal0: ; ea951 (3a:6951) ld a, [rOBP0] - and $03 + and $3 ret -Func_ea956: ; ea956 (3a:6956) +.Pal2: ; ea956 (3a:6956) ld a, [rOBP0] - and $0c + and $c srl a srl a ret -Func_ea95f: ; ea95f (3a:695f) +.Pal1: ; ea95f (3a:695f) ld a, [rOBP0] and $30 swap a ret -Func_ea966: ; ea966 (3a:6966) +.Pal3: ; ea966 (3a:6966) ld a, [rOBP0] and $c0 rlca rlca ret -Func_ea96d: ; ea96d (3a:696d) +.ApplyPaletteFunction: ; ea96d (3a:696d) ld e, a ld d, 0 - ld hl, Jumptable_ea979 + ld hl, .PalFunJumptable add hl, de add hl, de ld a, [hli] @@ -872,62 +872,62 @@ Func_ea96d: ; ea96d (3a:696d) ld l, a jp [hl] -Jumptable_ea979: ; ea979 (3a:6979) - dw Func_ea981 - dw Func_ea986 - dw Func_ea98c - dw Func_ea992 +.PalFunJumptable: ; ea979 (3a:6979) + dw .zero_zero + dw .one_zero + dw .zero_one + dw .one_one -Func_ea981: ; ea981 (3a:6981) +.zero_zero: ; ea981 (3a:6981) sla b sla c ret -Func_ea986: ; ea986 (3a:6986) +.one_zero: ; ea986 (3a:6986) scf rl b sla c ret -Func_ea98c: ; ea98c (3a:698c) +.zero_one: ; ea98c (3a:698c) sla b scf rl c ret -Func_ea992: ; ea992 (3a:6992) +.one_one: ; ea992 (3a:6992) scf rl b scf rl c ret -Func_ea999: ; ea999 (3a:6999) +.PlaceObject: ; ea999 (3a:6999) push hl ld a, [hli] ld c, [hl] - and $08 - jr nz, .asm_ea9a5 - ld hl, $c6f0 - jr .asm_ea9a8 - -.asm_ea9a5 - ld hl, $c830 -.asm_ea9a8 - ld b, $00 + and $8 + jr nz, .use_wc830 + ld hl, wPrinterSendDataSource + jr .got_data_source + +.use_wc830 + ld hl, wc830 +.got_data_source + ld b, $0 ld a, c - and $f8 - sub $08 + and %11111000 + sub $8 ld c, a sla c rl b add hl, bc ld e, l ld d, h - ld hl, $cbec - ld c, $08 -.asm_ea9bc - call Func_ea9d0 + ld hl, wcbec + ld c, $8 +.coord_copy_loop + call .GetBitMask ld a, [de] and b or [hl] @@ -941,14 +941,14 @@ Func_ea999: ; ea999 (3a:6999) inc hl inc de dec c - jr nz, .asm_ea9bc + jr nz, .coord_copy_loop pop hl ret -Func_ea9d0: ; ea9d0 (3a:69d0) +.GetBitMask: ; ea9d0 (3a:69d0) push hl push de - ld de, $fff0 + ld de, -$10 add hl, de ld a, [hli] or [hl] @@ -959,14 +959,20 @@ Func_ea9d0: ; ea9d0 (3a:69d0) ret Data_ea9de: ; ea9de - db $01, $00, $00, $00, $01, $00 + db 1, 0, $00, 0 + dw 1 Data_ea9e4: ; ea9e4 - db $02, $00, $04, $00, $00, $00 + db 2, 0, $04, 0 + dw 0 Data_ea9ea: ; ea9ea - db $04, $00, $80, $02, $00, $00 + db 4, 0, $80, 2 + dw 0 Data_ea9f0: ; ea9f0 - db $04, $00, $00, $00, $04, $00 + db 4, 0, $00, 0 + dw 4 Data_ea9f6: ; ea9f6 - db $08, $00, $00, $00, $08, $00 + db 8, 0, $00, 0 + dw 8 Data_ea9fc: ; ea9fc - db $0f, $00, $00, $00, $0f, $00 + db 15, 0, $00, 0 + dw 15 diff --git a/engine/yellow_intro.asm b/engine/yellow_intro.asm new file mode 100755 index 00000000..5aad4d33 --- /dev/null +++ b/engine/yellow_intro.asm @@ -0,0 +1,1081 @@ +PlayIntroScene: + ld a, [rIE] + push af + xor a + ld [rIF], a + ld a, $f + ld [rIE], a + ld a, $8 + ld [rSTAT], a + call InitYellowIntroGFXAndMusic + call DelayFrame +.loop + ld a, [wYellowIntroCurrentScene] + bit 7, a + jr nz, .go_to_title_screen + call JoypadLowSensitivity + ld a, [hJoyPressed] + and A_BUTTON | B_BUTTON | START + jr nz, .go_to_title_screen + call Func_f98fc + ld a, $0 + ld [wCurrentAnimatedObjectOAMBufferOffset], a + call RunObjectAnimations + ld a, [wYellowIntroCurrentScene] + cp $7 + call z, Func_f98a2 + cp $b + call z, Func_f98cb + call DelayFrame + jr .loop + +.go_to_title_screen + call YellowIntro_BlankPalettes + xor a + ld [hLCDCPointer], a + call DelayFrame + xor a + ld [rIF], a + pop af + ld [rIE], a + ld a, $90 + ld [hWY], a + call ClearObjectAnimationBuffers + ld hl, wTileMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call Bank3E_FillMemory + call YellowIntro_BlankOAMBuffer + ld a, $1 + ld [H_AUTOBGTRANSFERENABLED], a + call DelayFrame + call DelayFrame + call DelayFrame + xor a + ld [H_AUTOBGTRANSFERENABLED], a + ret + +Func_f98a2: + ld a, [wOAMBuffer + 8 * 4 + 3] + or $1 + ld [wOAMBuffer + 8 * 4 + 3], a + ld a, [wOAMBuffer + 14 * 4 + 3] + or $1 + ld [wOAMBuffer + 14 * 4 + 3], a + ld a, [wOAMBuffer + 16 * 4 + 3] + or $1 + ld [wOAMBuffer + 16 * 4 + 3], a + ld a, [wOAMBuffer + 18 * 4 + 3] + or $1 + ld [wOAMBuffer + 18 * 4 + 3], a + ld a, [wOAMBuffer + 19 * 4 + 3] + or $1 + ld [wOAMBuffer + 19 * 4 + 3], a + ret + +Func_f98cb: + ld a, [wOAMBuffer + 18 * 4 + 3] + or $1 + ld [wOAMBuffer + 18 * 4 + 3], a + ld a, [wOAMBuffer + 19 * 4 + 3] + or $1 + ld [wOAMBuffer + 19 * 4 + 3], a + ld a, [wOAMBuffer + 20 * 4 + 3] + or $1 + ld [wOAMBuffer + 20 * 4 + 3], a + ld a, [wOAMBuffer + 25 * 4 + 3] + or $1 + ld [wOAMBuffer + 25 * 4 + 3], a + ld a, [wOAMBuffer + 26 * 4 + 3] + or $1 + ld [wOAMBuffer + 26 * 4 + 3], a + ld a, [wOAMBuffer + 28 * 4 + 3] + or $1 + ld [wOAMBuffer + 28 * 4 + 3], a + ret + +Func_f98fc: + ld a, [wYellowIntroCurrentScene] + ld hl, Jumptable_f9906 + call Func_fa06e + jp [hl] + +Jumptable_f9906: + dw YellowIntroScene0 ; running pika 1 + dw YellowIntroScene1 ; wait last + dw YellowIntroScene2 ; pikachu kick + dw YellowIntroScene3 ; wait last + dw YellowIntroScene4 ; running pika 2 + dw YellowIntroScene5 ; wait last + dw YellowIntroScene6 ; surfing pika + dw YellowIntroScene7 ; wait last + dw YellowIntroScene8 ; running pika 3 + dw YellowIntroScene9 ; wait last + dw YellowIntroScene10 ; flying pika + dw YellowIntroScene11 ; wait last + dw YellowIntroScene12 ; pika close up + dw YellowIntroScene13 ; wait last + dw YellowIntroScene14 ; pika thunderbolt + dw YellowIntroScene15 ; wait last + dw YellowIntroScene16 ; fade to white + dw YellowIntroScene17 ; wait and quit + +YellowIntro_NextScene: + ld hl, wYellowIntroCurrentScene + inc [hl] + ret + +YellowIntroScene0: + xor a + ld [hLCDCPointer], a + lb de, $58, $58 + ld a, $1 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $90 + ld [hWY], a + ld a, $e4 + ld [rBGP], a + ld [rOBP0], a + ld a, $c4 + ld [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ld a, 130 + ld [wYellowIntroSceneTimer], a + call YellowIntro_NextScene + ret + +YellowIntroScene1: + call YellowIntro_CheckFrameTimerDecrement + ret nc + call YellowIntro_MaskCurrentAnimatedObjectStruct + call YellowIntro_NextScene + ret + +YellowIntroScene2: + call YellowIntro_BlankPalsDelay2AndDisableLCD + ld c, $8 + call UpdateMusicCTimes + xor a + ld [hLCDCPointer], a + ld hl, vBGMap0 + ld bc, $400 + xor a + call Bank3E_FillMemory + call YellowIntroScene2_PlaceGraphic + lb de, $58, $b8 ; overloaded + ld a, $4 ; overloaded + call LoadYellowIntroFlyingSpeedBars + ld a, $1 + call Func_f9e9a + call YellowIntro_SetTimerFor128Frames + call YellowIntro_NextScene + ret + +YellowIntroScene2_PlaceGraphic: + ld hl, $98d4 ; (20, 6) + ld de, $20 + ld b, $6 + ld a, $90 +.row + ld c, $6 + push af + push hl +.col + ld [hli], a + inc a + dec c + jr nz, .col + pop hl + add hl, de + pop af + add $10 + dec b + jr nz, .row + ld a, [hGBC] + and a + jr z, .dmg_sgb + ; We can actually set palettes! + ld hl, $98d4 ; (20, 6) + ld de, $20 + ld b, $6 + ld a, $1 + ld [rVBK], a +.attr_row + ld c, $6 + push hl +.attr_col + ld [hli], a + dec c + jr nz, .attr_col + pop hl + add hl, de + dec b + jr nz, .attr_row + xor a + ld [rVBK], a +.dmg_sgb + ret + +LoadYellowIntroFlyingSpeedBars: + ld hl, YellowIntroFlyingSpeedBarData + ld a, $8 +.loop +; Spawn object $8 at indicated coordinates with indicated speeds + push af + ld e, [hl] + inc hl + ld d, [hl] + inc hl + ld a, [hli] + push hl + push af + ld a, $8 + call SpawnAnimatedObject + pop af + ld hl, $b + add hl, bc + ld [hl], a + pop hl + pop af + dec a + jr nz, .loop + ret + +YellowIntroFlyingSpeedBarData: + ; y, x, speed + db $d0, $20, $02 + db $f0, $30, $04 + db $d0, $40, $06 + db $c0, $50, $08 + db $e0, $60, $08 + db $c0, $70, $06 + db $e0, $80, $04 + db $f0, $90, $02 + +YellowIntroScene3: + call YellowIntro_CheckFrameTimerDecrement + jr c, .expired + ld a, [hSCX] + cp $68 + ret z + add $4 + ld [hSCX], a + ret + +.expired + call MaskAllAnimatedObjectStructs + call YellowIntro_NextScene + ret + +YellowIntroScene4: + call YellowIntro_BlankPalsDelay2AndDisableLCD + ld c, $5 + call UpdateMusicCTimes + ld a, [hGBC] + and a + jr z, .dmg_sgb + ; We can actually set palettes! + ld hl, $98d4 + ld de, $20 + ld b, $6 + ld a, $1 + ld [rVBK], a + xor a +.attr_row + ld c, $6 + push hl +.attr_col + ld [hli], a + dec c + jr nz, .attr_col + pop hl + add hl, de + dec b + jr nz, .attr_row + xor a + ld [rVBK], a +.dmg_sgb + xor a + ld [hLCDCPointer], a + call Func_f9e5f + lb de, $58, $58 + ld a, $2 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + xor a + call Func_f9e9a + call YellowIntro_SetTimerFor128Frames + call YellowIntro_NextScene + ret + +YellowIntroScene5: + call YellowIntro_CheckFrameTimerDecrement + ret nc + call YellowIntro_MaskCurrentAnimatedObjectStruct + call YellowIntro_NextScene + ret + +YellowIntroScene6: + call YellowIntro_BlankPalsDelay2AndDisableLCD + ld c, $5 + call UpdateMusicCTimes + ld a, $42 + ld [hLCDCPointer], a + call YellowIntro_Copy8BitSineWave + ld hl, vBGMap0 + ld bc, $60 + xor a + call Bank3E_FillMemory + ld hl, $9860 + ld c, $10 + ld a, $20 +.asm_f9a8b + ld [hli], a + inc a + ld [hli], a + dec a + dec c + jr nz, .asm_f9a8b + ld hl, $9880 + ld bc, $300 + ld a, $10 + call Bank3E_FillMemory + lb de, $40, $f8 + ld a, $5 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + ld a, $1 + call Func_f9e9a + call YellowIntro_SetTimerFor88Frames + call YellowIntro_NextScene + ret + +YellowIntroScene7: + call YellowIntro_CheckFrameTimerDecrement + jr c, .expired + ld hl, hSCX + inc [hl] + inc [hl] + ld hl, wYellowIntroSurfingPikaSineWaveBuffer + ld de, wYellowIntroSurfingPikaSineWaveBuffer + 1 + ld a, [hl] + push af + ld c, $ff +.shift_loop + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .shift_loop + pop af + ld [hl], a + call Request7TileTransferFromC810ToC710 + ret + +.expired + call YellowIntro_MaskCurrentAnimatedObjectStruct + call YellowIntro_NextScene + ret + +YellowIntroScene8: + call YellowIntro_BlankPalsDelay2AndDisableLCD + ld c, $5 + call UpdateMusicCTimes + xor a + ld [hLCDCPointer], a + call Func_f9e5f + lb de, $58, $58 + ld a, $3 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + xor a + call Func_f9e9a + call YellowIntro_SetTimerFor128Frames + call YellowIntro_NextScene + ret + +YellowIntroScene9: + call YellowIntro_CheckFrameTimerDecrement + ret nc + call YellowIntro_MaskCurrentAnimatedObjectStruct + call YellowIntro_NextScene + ret + +YellowIntroScene10: + call YellowIntro_BlankPalsDelay2AndDisableLCD + ld c, $5 + call UpdateMusicCTimes + xor a + ld [hLCDCPointer], a + ld hl, vBGMap0 + ld bc, $400 + xor a + call Bank3E_FillMemory + ld hl, vBGMap0 + ld bc, $100 + ld a, $2 + call Bank3E_FillMemory + ld hl, $9900 + ld de, Unkn_f9b6e + lb bc, 6, 20 + call .FillBGMapBox + ld hl, $988c + ld de, Unkn_f9be6 + lb bc, 3, 4 + call .FillBGMapBox + ld hl, $98e3 + ld de, Unkn_f9bf2 + lb bc, 2, 2 + call .FillBGMapBox + lb de, $98, $58 + ld a, $6 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + ld a, $1 + call Func_f9e9a + call YellowIntro_SetTimerFor128Frames + call YellowIntro_NextScene + ret + +.FillBGMapBox: +.fill_row + push bc + push hl +.fill_col + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .fill_col + pop hl + ld bc, $20 + add hl, bc + pop bc + dec b + jr nz, .fill_row + ret + +Unkn_f9b6e: INCBIN "gfx/unknown_f9b6e.map" +Unkn_f9be6: INCBIN "gfx/unknown_f9be6.map" +Unkn_f9bf2: INCBIN "gfx/unknown_f9bf2.map" + +YellowIntroScene11: + call YellowIntro_CheckFrameTimerDecrement + jr c, .expired + ld a, [wYellowIntroSceneTimer] + and $7 + ret nz + ld a, [wYellowIntroSceneTimer] + and $8 + sla a + sla a + sla a + ld e, a + ld d, $0 + ld hl, YellowIntroCloudGFX1 + add hl, de + ld a, l + ld [H_VBCOPYSRC], a + ld a, h + ld [H_VBCOPYSRC + 1], a + xor a + ld [H_VBCOPYDEST], a + ld a, $96 + ld [H_VBCOPYDEST + 1], a + ld a, $4 + ld [H_VBCOPYSIZE], a + ret + +.expired + call YellowIntro_MaskCurrentAnimatedObjectStruct + call YellowIntro_NextScene + ret + +YellowIntroCloudGFX1: INCBIN "gfx/unknown_f9c2c.2bpp" +YellowIntroCloudGFX2: INCBIN "gfx/unknown_f9c6c.2bpp" ; indirectly referenced + +YellowIntroScene12: + call YellowIntro_BlankPalsDelay2AndDisableLCD + ld c, $5 + call UpdateMusicCTimes + xor a + ld [hLCDCPointer], a + ld hl, vBGMap0 + ld bc, $80 + ld a, $1 + call Bank3E_FillMemory + ld hl, $9880 + ld bc, $140 + xor a + call Bank3E_FillMemory + ld hl, $99c0 + ld bc, $80 + ld a, $1 + call Bank3E_FillMemory + + ; paste 8x12 graphic into vBGMap0 at (5, 6) starting at tile 4, skipping 4 vtiles at the end of each row + ld hl, $98c5 + ld de, $20 + ld a, $4 + ld b, 8 +.row + ld c, 12 + push hl +.col + ld [hli], a + inc a + dec c + jr nz, .col + pop hl + add hl, de + add $4 + dec b + jr nz, .row + + ld hl, $98c4 ; (4, 6) + ld [hl], $3 + ld hl, $98e4 ; (4, 7) + ld [hl], $74 + ld hl, $99a5 ; (5, 5) + ld [hl], $0 + lb de, $60, $58 + ld a, $9 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + xor a + call Func_f9e9a + call YellowIntro_SetTimerFor128Frames + call YellowIntro_NextScene + ret + +YellowIntroScene13: + call YellowIntro_CheckFrameTimerDecrement + ret nc + lb de, $68, $58 + ld a, $a + call SpawnAnimatedObject + call YellowIntro_NextScene + ret + +YellowIntroScene14: + ld de, YellowIntroPalSequence_f9dd6 + call YellowIntro_LoadDMGPalAndIncrementCounter + jr c, .expired + ld [rBGP], a + ld [rOBP0], a + and $f0 + ld [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ret + +.expired + call MaskAllAnimatedObjectStructs + call YellowIntro_BlankOAMBuffer + ld hl, wTileMap + ld bc, $50 + ld a, $1 + call Bank3E_FillMemory + coord hl, 0, 4 + ld bc, CopyVideoDataAlternate + xor a + call Bank3E_FillMemory + coord hl, 0, 14 + ld bc, $50 + ld a, $1 + call Bank3E_FillMemory + ld a, $1 + ld [H_AUTOBGTRANSFERENABLED], a + call DelayFrame + call DelayFrame + call DelayFrame + xor a + ld [H_AUTOBGTRANSFERENABLED], a + ld a, $e4 + ld [rOBP0], a + ld [rBGP], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + lb de, $58, $58 + ld a, $7 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + call YellowIntro_NextScene + ld a, $28 + ld [wYellowIntroSceneTimer], a + ret + +YellowIntroScene15: + call YellowIntro_CheckFrameTimerDecrement + jr c, .expired + ld a, [wYellowIntroSceneTimer] + and $3 + ret nz + ld a, [rOBP0] + xor $ff + ld [rOBP0], a + ld a, [rBGP] + xor $3 + ld [rBGP], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + ret + +.expired + xor a + ld [hLCDCPointer], a + ld a, $e4 + ld [rBGP], a + ld [rOBP0], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call YellowIntro_NextScene +YellowIntroScene16: + ld de, YellowIntroPalSequence_f9e0a + call YellowIntro_LoadDMGPalAndIncrementCounter + jr c, .expired + ld [rOBP0], a + ld [rBGP], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + ret + +.expired + call YellowIntro_NextScene + ret + +YellowIntroPalSequence_f9dd6: + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $ff + +YellowIntroPalSequence_f9e0a: + db $e4, $90, $90, $40 + db $40, $00, $00, $ff + +YellowIntroScene17: + ld c, 64 + call DelayFrames + ld hl, wYellowIntroCurrentScene + set 7, [hl] + ret + +YellowIntro_SpawnAnimatedObjectAndSavePointer: + call SpawnAnimatedObject + ld a, c + ld [wYellowIntroAnimatedObjectStructPointer], a + ld a, b + ld [wYellowIntroAnimatedObjectStructPointer + 1], a + ret + +YellowIntro_MaskCurrentAnimatedObjectStruct: + ld a, [wYellowIntroAnimatedObjectStructPointer] + ld c, a + ld a, [wYellowIntroAnimatedObjectStructPointer + 1] + ld b, a + call MaskCurrentAnimatedObjectStruct + ret + +YellowIntro_SetTimerFor128Frames: + ld a, 128 + ld [wYellowIntroSceneTimer], a + ret + +YellowIntro_SetTimerFor88Frames: + ld a, 88 + ld [wYellowIntroSceneTimer], a + ret + +YellowIntro_CheckFrameTimerDecrement: + ld hl, wYellowIntroSceneTimer + ld a, [hl] + and a + jr z, .asm_f9e4b + dec [hl] + and a + ret + +.asm_f9e4b + scf + ret + +YellowIntro_LoadDMGPalAndIncrementCounter: + ld hl, wYellowIntroSceneTimer + ld a, [hl] + inc [hl] + ld l, a + ld h, $0 + add hl, de + ld a, [hl] + cp $ff + jr z, .asm_f9e5d + and a + ret + +.asm_f9e5d + scf + ret + +Func_f9e5f: + ld hl, vBGMap0 + ld bc, $80 + ld a, $1 + call Bank3E_FillMemory + ld hl, $9880 + ld bc, $140 + xor a + call Bank3E_FillMemory + ld hl, $99c0 + ld bc, $80 + ld a, $1 + call Bank3E_FillMemory + ret + +YellowIntro_BlankPalsDelay2AndDisableLCD: + xor a + ld [rBGP], a + ld [rOBP0], a + ld [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + call DelayFrame + call DelayFrame + call DisableLCD + ret + +Func_f9e9a: + ld e, a + callab YellowIntroPaletteAction + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $90 + ld [hWY], a + ld a, $e3 + ld [rLCDC], a + ld a, $e4 + ld [rBGP], a + ld [rOBP0], a + ld a, $e0 + ld [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ret + +YellowIntro_Copy8BitSineWave: + ; Copy this sine wave into wYellowIntroSurfingPikaSineWaveBuffer 8 times (end just before wc900) + ld de, wYellowIntroSurfingPikaSineWaveBuffer + ld a, $8 +.loop + push af + ld hl, .SineWave + ld bc, .SineWaveEnd - .SineWave + call Bank3E_CopyData + pop af + dec a + jr nz, .loop + ret + +.SineWave: +; a sine wave with amplitude 4 + db 0, 0, 1, 2, 2, 3, 3, 3 + db 4, 3, 3, 3, 2, 2, 1, 0 + db 0, 0, -1, -2, -2, -3, -3, -3 + db -4, -3, -3, -3, -2, -2, -1, 0 +.SineWaveEnd: + +Request7TileTransferFromC810ToC710: + ld a, wc810 % $100 + ld [H_VBCOPYSRC], a + ld a, wc810 / $100 + ld [H_VBCOPYSRC + 1], a + ld a, wc710 % $100 + ld [H_VBCOPYDEST], a + ld a, wc710 / $100 + ld [H_VBCOPYDEST + 1], a + ld a, $7 + ld [H_VBCOPYSIZE], a + ret + +InitYellowIntroGFXAndMusic: + xor a + ld [H_AUTOBGTRANSFERENABLED], a + ld [hSCX], a + ld [hSCY], a + ld [H_AUTOBGTRANSFERDEST], a + ld a, $98 + ld [H_AUTOBGTRANSFERDEST + 1], a + call YellowIntro_BlankTileMap + ld hl, wTileMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, $1 + call Bank3E_FillMemory + coord hl, 0, 4 + ld bc, CopyVideoDataAlternate + xor a + call Bank3E_FillMemory + ld a, $1 + ld [H_AUTOBGTRANSFERENABLED], a + call DelayFrame + call DelayFrame + call DelayFrame + xor a + ld [H_AUTOBGTRANSFERENABLED], a + ld de, $6b5a + ld hl, $8000 + ld bc, $3eff + call CopyVideoData + ld de, $635a + ld hl, $9000 + ld bc, $3e80 + call CopyVideoData + call ClearObjectAnimationBuffers + call LoadYellowIntroObjectAnimationDataPointers + ld b, $8 + call RunPaletteCommand + xor a + ld hl, wYellowIntroCurrentScene + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ld a, MUSIC_INTRO_BATTLE + ld c, BANK(Music_IntroBattle) + call PlayMusic + ret + +LoadYellowIntroObjectAnimationDataPointers: + ld a, YellowIntro_AnimatedObjectSpawnStateData % $100 + ld [wAnimatedObjectSpawnStateDataPointer], a + ld a, YellowIntro_AnimatedObjectSpawnStateData / $100 + ld [wAnimatedObjectSpawnStateDataPointer + 1], a + ld a, YellowIntro_AnimatedObjectJumptable % $100 + ld [wAnimatedObjectJumptablePointer], a + ld a, YellowIntro_AnimatedObjectJumptable / $100 + ld [wAnimatedObjectJumptablePointer + 1], a + ld a, YellowIntro_AnimatedObjectOAMData % $100 + ld [wAnimatedObjectOAMDataPointer], a + ld a, YellowIntro_AnimatedObjectOAMData / $100 + ld [wAnimatedObjectOAMDataPointer + 1], a + ld a, YellowIntro_AnimatedObjectFramesData % $100 + ld [wAnimatedObjectFramesDataPointer], a + ld a, YellowIntro_AnimatedObjectFramesData / $100 + ld [wAnimatedObjectFramesDataPointer + 1], a + ret + +YellowIntro_BlankTileMap: + ld hl, wTileMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, $7f + call Bank3E_FillMemory + ret + +Bank3E_CopyData: +.loop + ld a, [hli] + ld [de], a + inc de + dec bc + ld a, c + or b + jr nz, .loop + ret + +Bank3E_FillMemory: + push de + ld e, a +.loop + ld a, e + ld [hli], a + dec bc + ld a, c + or b + jr nz, .loop + pop de + ret + +YellowIntro_BlankOAMBuffer: + ld hl, wOAMBuffer + ld bc, wOAMBufferEnd - wOAMBuffer + xor a + call Bank3E_FillMemory + ret + +YellowIntro_BlankPalettes: + xor a + ld [rBGP], a + ld [rOBP0], a + ld [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ret + +YellowIntro_AnimatedObjectSpawnStateData: + db $00, $00, $00 + db $01, $01, $00 + db $02, $01, $00 + db $03, $01, $00 + db $04, $02, $00 + db $05, $03, $00 + db $06, $04, $00 + db $07, $01, $00 + db $08, $05, $00 + db $09, $01, $00 + db $0a, $01, $00 + +YellowIntro_AnimatedObjectJumptable: + dw Func_fa007 + dw Func_fa007 + dw Func_fa008 + dw Func_fa014 + dw Func_fa02b + dw Func_fa062 + +Func_fa007: + ret + +Func_fa008: + ld hl, $4 + add hl, bc + ld a, [hl] + cp $58 + ret z + sub $4 + ld [hl], a + ret + +Func_fa014: + ld hl, $4 + add hl, bc + ld a, [hl] + cp $58 + jr z, .asm_fa020 + add $4 + ld [hl], a +.asm_fa020 + ld hl, $5 + add hl, bc + cp $58 + ret z + add $1 + ld [hl], a + ret + +Func_fa02b: + ld hl, $b + add hl, bc + ld e, [hl] + ld d, $0 + ld hl, Jumptable_fa03b + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp [hl] + +Jumptable_fa03b: + dw Func_fa03f + dw Func_fa051 + +Func_fa03f: + ld hl, $5 + add hl, bc + ld a, [hl] + cp $58 + jr z, .asm_fa04c + sub $2 + ld [hl], a + ret + +.asm_fa04c + ld hl, $b + add hl, bc + inc [hl] +Func_fa051: + ld hl, $c + add hl, bc + ld a, [hl] + inc [hl] + ld d, $8 + call Func_fa079 + ld hl, $7 + add hl, bc + ld [hl], a + ret + +Func_fa062: + ld hl, $b + add hl, bc + ld a, [hl] + ld hl, $4 + add hl, bc + add [hl] + ld [hl], a + ret + +Func_fa06e: + ld e, a + ld d, $0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +Func_fa077: ; cosine + add $10 +Func_fa079: + and $3f + cp $20 + jr nc, .asm_fa084 + call Func_fa08e + ld a, h + ret + +.asm_fa084 + and $1f + call Func_fa08e + ld a, h + xor $ff + inc a + ret + +Func_fa08e: + ld e, a + ld a, d + ld d, $0 + ld hl, Unkn_fa0aa + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, $0 +.asm_fa09d + srl a + jr nc, .asm_fa0a2 + add hl, de +.asm_fa0a2 + sla e + rl d + and a + jr nz, .asm_fa09d + ret + +Unkn_fa0aa: + sine_wave $100 |