diff options
author | entrpntr <12521136+entrpntr@users.noreply.github.com> | 2020-06-03 19:58:45 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-03 19:58:45 -0400 |
commit | d3a6668b1ce4336f9a4443c70376039b700ee012 (patch) | |
tree | 954c9cf0cbfad8207399563d36fd64d02c6f16ce /engine | |
parent | 7cc52fe23bac6ab9b2d58667e825aef62dd74e03 (diff) | |
parent | 1210a5ef54141eeeebf79132a3124a8392c35c4e (diff) |
Merge pull request #41 from libjet/bank23
Disassemble bank $23
Diffstat (limited to 'engine')
-rwxr-xr-x | engine/battle/battle_transition.asm | 747 | ||||
-rwxr-xr-x | engine/events/field_moves.asm | 449 | ||||
-rwxr-xr-x | engine/events/magnet_train.asm | 387 | ||||
-rwxr-xr-x | engine/gfx/mon_icons.asm | 337 | ||||
-rwxr-xr-x | engine/gfx/sprite_anims.asm | 2800 | ||||
-rwxr-xr-x | engine/gfx/sprites.asm | 1220 | ||||
-rwxr-xr-x | engine/menus/delete_save.asm | 34 | ||||
-rwxr-xr-x | engine/menus/savemenu_copytilemapatonce.asm | 84 | ||||
-rwxr-xr-x | engine/movie/init_hof_credits.asm | 60 | ||||
-rwxr-xr-x | engine/phone/phonering_copytilemapatonce.asm | 87 | ||||
-rwxr-xr-x | engine/rtc/reset_password.asm | 254 | ||||
-rwxr-xr-x | engine/tilesets/timeofday_pals.asm | 317 |
12 files changed, 4831 insertions, 1945 deletions
diff --git a/engine/battle/battle_transition.asm b/engine/battle/battle_transition.asm new file mode 100755 index 00000000..4de4d347 --- /dev/null +++ b/engine/battle/battle_transition.asm @@ -0,0 +1,747 @@ +; BattleTransitionJumptable.Jumptable indexes +BATTLETRANSITION_CAVE EQU $01 +BATTLETRANSITION_CAVE_STRONGER EQU $09 +BATTLETRANSITION_NO_CAVE EQU $10 +BATTLETRANSITION_NO_CAVE_STRONGER EQU $18 +BATTLETRANSITION_FINISH EQU $20 +BATTLETRANSITION_END EQU $80 + +BATTLETRANSITION_SQUARE EQU "8" ; $fe +BATTLETRANSITION_BLACK EQU "9" ; $ff + +DoBattleTransition: + call .InitGFX + ldh a, [rBGP] + ld [wBGP], a + ldh a, [rOBP0] + ld [wOBP0], a + ldh a, [rOBP1] + ld [wOBP1], a + call DelayFrame + ld hl, hVBlank + ld a, [hl] + push af + ld [hl], 1 + +.loop + ld a, [wJumptableIndex] + bit 7, a ; BATTLETRANSITION_END? + jr nz, .done + call BattleTransitionJumptable + call DelayFrame + jr .loop + +.done + ld hl, wBGPals1 + ld bc, 8 palettes + xor a + call ByteFill + + ld a, %11111111 + ld [wBGP], a + call DmgToCgbBGPals + call DelayFrame + xor a + ldh [hLCDCPointer], a + ldh [hLYOverrideStart], a + ldh [hLYOverrideEnd], a + ldh [hSCY], a + + pop af + ldh [hVBlank], a + call DelayFrame + ret + +.InitGFX: + farcall ReanchorBGMap_NoOAMUpdate + call UpdateSprites + call DelayFrame + call ConvertTrainerBattlePokeballTilesTo2bpp + call CGBOnly_CopyTilemapAtOnce + + ld a, SCREEN_HEIGHT_PX + ldh [hWY], a + call DelayFrame + xor a + ldh [hBGMapMode], a + ld hl, wJumptableIndex + xor a + ld [hli], a + ld [hli], a + ld [hl], a + call WipeLYOverrides + ret + +ConvertTrainerBattlePokeballTilesTo2bpp: + ld hl, wDecompressScratch + ld bc, $28 tiles +.loop + ld [hl], -1 + inc hl + dec bc + ld a, c + or b + jr nz, .loop + + ld de, wDecompressScratch + ld hl, vBGMap2 + ld b, BANK(@) + ld c, $28 + call Request2bpp + + ld de, TrainerBattlePokeballTiles + ld hl, vTiles3 tile BATTLETRANSITION_SQUARE + ld b, BANK(TrainerBattlePokeballTiles) + ld c, 2 + call Request2bpp + ret + +TrainerBattlePokeballTiles: +INCBIN "gfx/overworld/trainer_battle_pokeball_tiles.2bpp" + +BattleTransitionJumptable: + jumptable .Jumptable, wJumptableIndex + +.Jumptable + dw StartTrainerBattle_DetermineWhichAnimation ; 00 + + ; BATTLETRANSITION_CAVE + dw StartTrainerBattle_LoadPokeBallGraphics ; 01 + dw StartTrainerBattle_SetUpBGMap ; 02 + dw StartTrainerBattle_Flash ; 03 + dw StartTrainerBattle_Flash ; 04 + dw StartTrainerBattle_Flash ; 05 + dw StartTrainerBattle_NextScene ; 06 + dw StartTrainerBattle_SetUpForWavyOutro ; 07 + dw StartTrainerBattle_SineWave ; 08 + + ; BATTLETRANSITION_CAVE_STRONGER + dw StartTrainerBattle_LoadPokeBallGraphics ; 09 + dw StartTrainerBattle_SetUpBGMap ; 0a + dw StartTrainerBattle_Flash ; 0b + dw StartTrainerBattle_Flash ; 0c + dw StartTrainerBattle_Flash ; 0d + dw StartTrainerBattle_NextScene ; 0e + ; There is no setup for this one + dw StartTrainerBattle_ZoomToBlack ; 0f + + ; BATTLETRANSITION_NO_CAVE + dw StartTrainerBattle_LoadPokeBallGraphics ; 10 + dw StartTrainerBattle_SetUpBGMap ; 11 + dw StartTrainerBattle_Flash ; 12 + dw StartTrainerBattle_Flash ; 13 + dw StartTrainerBattle_Flash ; 14 + dw StartTrainerBattle_NextScene ; 15 + dw StartTrainerBattle_SetUpForSpinOutro ; 16 + dw StartTrainerBattle_SpinToBlack ; 17 + + ; BATTLETRANSITION_NO_CAVE_STRONGER + dw StartTrainerBattle_LoadPokeBallGraphics ; 18 + dw StartTrainerBattle_SetUpBGMap ; 19 + dw StartTrainerBattle_Flash ; 1a + dw StartTrainerBattle_Flash ; 1b + dw StartTrainerBattle_Flash ; 1c + dw StartTrainerBattle_NextScene ; 1d + dw StartTrainerBattle_SetUpForRandomScatterOutro ; 1e + dw StartTrainerBattle_SpeckleToBlack ; 1f + + ; BATTLETRANSITION_FINISH + dw StartTrainerBattle_Finish ; 20 + +; transition animations + const_def + const TRANS_CAVE + const TRANS_CAVE_STRONGER + const TRANS_NO_CAVE + const TRANS_NO_CAVE_STRONGER + +; transition animation bits +TRANS_STRONGER_F EQU 0 ; bit set in TRANS_CAVE_STRONGER and TRANS_NO_CAVE_STRONGER +TRANS_NO_CAVE_F EQU 1 ; bit set in TRANS_NO_CAVE and TRANS_NO_CAVE_STRONGER + +StartTrainerBattle_DetermineWhichAnimation: +; The screen flashes a different number of times depending on the level of +; your lead Pokemon relative to the opponent's. +; BUG: wBattleMonLevel and wEnemyMonLevel are not set at this point, so whatever +; values happen to be there will determine the animation. + ld de, 0 + ld a, [wBattleMonLevel] + add 3 + ld hl, wEnemyMonLevel + cp [hl] + jr nc, .not_stronger + set TRANS_STRONGER_F, e +.not_stronger + ld a, [wEnvironment] + cp CAVE + jr z, .cave + cp ENVIRONMENT_5 + jr z, .cave + cp DUNGEON + jr z, .cave + set TRANS_NO_CAVE_F, e +.cave + ld hl, .StartingPoints + add hl, de + ld a, [hl] + ld [wJumptableIndex], a + ret + +.StartingPoints: +; entries correspond to TRANS_* constants + db BATTLETRANSITION_CAVE + db BATTLETRANSITION_CAVE_STRONGER + db BATTLETRANSITION_NO_CAVE + db BATTLETRANSITION_NO_CAVE_STRONGER + +StartTrainerBattle_Finish: + call ClearSprites + ld a, BATTLETRANSITION_END + ld [wJumptableIndex], a + ret + +StartTrainerBattle_NextScene: + ld hl, wJumptableIndex + inc [hl] + ret + +StartTrainerBattle_SetUpBGMap: + call StartTrainerBattle_NextScene + xor a + ld [wce64], a + ldh [hBGMapMode], a + ret + +StartTrainerBattle_Flash: + call .DoFlashAnimation + ret nc + call StartTrainerBattle_NextScene + ret + +.DoFlashAnimation: + ld a, [wTimeOfDayPalset] + cp %11111111 ; dark cave + jr z, .done + ld hl, wce64 + ld a, [hl] + inc [hl] + srl a + ld e, a + ld d, 0 + ld hl, .pals + add hl, de + ld a, [hl] + cp %00000001 + jr z, .done + ld [wBGP], a + call DmgToCgbBGPals + and a + ret + +.done + xor a + ld [wce64], a + scf + ret + +.pals + dc 3, 3, 2, 1 + dc 3, 3, 3, 2 + dc 3, 3, 3, 3 + dc 3, 3, 3, 2 + dc 3, 3, 2, 1 + dc 3, 2, 1, 0 + dc 2, 1, 0, 0 + dc 1, 0, 0, 0 + dc 0, 0, 0, 0 + dc 1, 0, 0, 0 + dc 2, 1, 0, 0 + dc 3, 2, 1, 0 + dc 0, 0, 0, 1 + +StartTrainerBattle_SetUpForWavyOutro: + farcall Function55a1 + + call StartTrainerBattle_NextScene + + ld a, LOW(rSCX) + ldh [hLCDCPointer], a + xor a + ldh [hLYOverrideStart], a + ld a, $90 + ldh [hLYOverrideEnd], a + xor a + ld [wce64], a + ld [wce65], a + ret + +StartTrainerBattle_SineWave: + ld a, [wce64] + cp $60 + jr nc, .end + call .DoSineWave + ret + +.end + ld a, BATTLETRANSITION_FINISH + ld [wJumptableIndex], a + ret + +.DoSineWave: + ld hl, wce65 + ld a, [hl] + inc [hl] + ld hl, wce64 + ld d, [hl] + add [hl] + ld [hl], a + ld a, wLYOverridesEnd - wLYOverrides + ld bc, wLYOverrides + ld e, 0 + +.loop + push af + push de + ld a, e + call StartTrainerBattle_DrawSineWave + ld [bc], a + inc bc + pop de + ld a, e + add 2 + ld e, a + pop af + dec a + jr nz, .loop + ret + +StartTrainerBattle_SetUpForSpinOutro: + farcall Function55a1 + call StartTrainerBattle_NextScene + xor a + ld [wce64], a + ret + +StartTrainerBattle_SpinToBlack: + xor a + ldh [hBGMapMode], a + ld a, [wce64] + ld e, a + ld d, 0 + ld hl, .spintable +rept 5 + add hl, de +endr + ld a, [hli] + cp -1 + jr z, .end + ld [wce65], a + call .load + ld a, 1 + ldh [hBGMapMode], a + call DelayFrame + call DelayFrame + ld hl, wce64 + inc [hl] + ret + +.end + ld a, 1 + ldh [hBGMapMode], a + call DelayFrame + call DelayFrame + call DelayFrame + xor a + ldh [hBGMapMode], a + ld a, BATTLETRANSITION_FINISH + ld [wJumptableIndex], a + ret + +; quadrants + const_def + const UPPER_LEFT + const UPPER_RIGHT + const LOWER_LEFT + const LOWER_RIGHT + +; quadrant bits +RIGHT_QUADRANT_F EQU 0 ; bit set in UPPER_RIGHT and LOWER_RIGHT +LOWER_QUADRANT_F EQU 1 ; bit set in LOWER_LEFT and LOWER_RIGHT + +.spintable +spintable_entry: MACRO + db \1 + dw .wedge\2 + dwcoord \3, \4 +ENDM + spintable_entry UPPER_LEFT, 1, 1, 6 + spintable_entry UPPER_LEFT, 2, 0, 3 + spintable_entry UPPER_LEFT, 3, 1, 0 + spintable_entry UPPER_LEFT, 4, 5, 0 + spintable_entry UPPER_LEFT, 5, 9, 0 + spintable_entry UPPER_RIGHT, 5, 10, 0 + spintable_entry UPPER_RIGHT, 4, 14, 0 + spintable_entry UPPER_RIGHT, 3, 18, 0 + spintable_entry UPPER_RIGHT, 2, 19, 3 + spintable_entry UPPER_RIGHT, 1, 18, 6 + spintable_entry LOWER_RIGHT, 1, 18, 11 + spintable_entry LOWER_RIGHT, 2, 19, 14 + spintable_entry LOWER_RIGHT, 3, 18, 17 + spintable_entry LOWER_RIGHT, 4, 14, 17 + spintable_entry LOWER_RIGHT, 5, 10, 17 + spintable_entry LOWER_LEFT, 5, 9, 17 + spintable_entry LOWER_LEFT, 4, 5, 17 + spintable_entry LOWER_LEFT, 3, 1, 17 + spintable_entry LOWER_LEFT, 2, 0, 14 + spintable_entry LOWER_LEFT, 1, 1, 11 + db -1 + +.load + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + ld h, [hl] + ld l, a +.loop + push hl + ld a, [de] + ld c, a + inc de +.loop1 + ld [hl], BATTLETRANSITION_BLACK + ld a, [wce65] + bit RIGHT_QUADRANT_F, a + jr z, .leftside + inc hl + jr .okay1 +.leftside + dec hl +.okay1 + dec c + jr nz, .loop1 + pop hl + ld a, [wce65] + bit LOWER_QUADRANT_F, a + ld bc, SCREEN_WIDTH + jr z, .upper + ld bc, -SCREEN_WIDTH +.upper + add hl, bc + ld a, [de] + inc de + cp -1 + ret z + and a + jr z, .loop + ld c, a +.loop2 + ld a, [wce65] + bit RIGHT_QUADRANT_F, a + jr z, .leftside2 + dec hl + jr .okay2 +.leftside2 + inc hl +.okay2 + dec c + jr nz, .loop2 + jr .loop + +.wedge1 db 2, 3, 5, 4, 9, -1 +.wedge2 db 1, 1, 2, 2, 4, 2, 4, 2, 3, -1 +.wedge3 db 2, 1, 3, 1, 4, 1, 4, 1, 4, 1, 3, 1, 2, 1, 1, 1, 1, -1 +.wedge4 db 4, 1, 4, 0, 3, 1, 3, 0, 2, 1, 2, 0, 1, -1 +.wedge5 db 4, 0, 3, 0, 3, 0, 2, 0, 2, 0, 1, 0, 1, 0, 1, -1 + +StartTrainerBattle_SetUpForRandomScatterOutro: + farcall Function55a1 + call StartTrainerBattle_NextScene + ld a, $10 + ld [wce64], a + ld a, 1 + ldh [hBGMapMode], a + ret + +StartTrainerBattle_SpeckleToBlack: + ld hl, wce64 + ld a, [hl] + and a + jr z, .done + dec [hl] + ld c, 12 +.loop + push bc + call .BlackOutRandomTile + pop bc + dec c + jr nz, .loop + ret + +.done + ld a, 1 + ldh [hBGMapMode], a + call DelayFrame + call DelayFrame + call DelayFrame + xor a + ldh [hBGMapMode], a + ld a, BATTLETRANSITION_FINISH + ld [wJumptableIndex], a + ret + +.BlackOutRandomTile: +.y_loop + call Random + cp SCREEN_HEIGHT + jr nc, .y_loop + ld b, a + +.x_loop + call Random + cp SCREEN_WIDTH + jr nc, .x_loop + ld c, a + + hlcoord 0, -1 + ld de, SCREEN_WIDTH + inc b + +.row_loop + add hl, de + dec b + jr nz, .row_loop + add hl, bc + +; If the tile has already been blacked out, +; sample a new tile + ld a, [hl] + cp BATTLETRANSITION_BLACK + jr z, .y_loop + ld [hl], BATTLETRANSITION_BLACK + ret + +StartTrainerBattle_LoadPokeBallGraphics: + ld a, [wOtherTrainerClass] + and a + jr z, .nextscene ; don't need to be here if wild + + xor a + ldh [hBGMapMode], a + + hlcoord 2, 1 + ld de, .PokeBallTransition + ld b, SCREEN_WIDTH - 4 +.loop + push hl + ld c, 2 +.loop2 + push hl + ld a, [de] + inc de +.loop3 +; Loading is done bit by bit + and a + jr z, .done + sla a + jr nc, .no_load + ld [hl], BATTLETRANSITION_SQUARE +.no_load + inc hl + jr .loop3 + +.done + pop hl + push bc + ld bc, (SCREEN_WIDTH - 4) / 2 + add hl, bc + pop bc + dec c + jr nz, .loop2 + + pop hl + push bc + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .loop + + ldh a, [hCGB] + and a + jr nz, .cgb + ld a, 1 + ldh [hBGMapMode], a + call DelayFrame + call DelayFrame + jr .nextscene + +.cgb + ld hl, .daypals + ld a, [wTimeOfDayPal] + maskbits NUM_DAYTIMES + cp DARKNESS_F + jr nz, .daytime + ld hl, .nightpals +.daytime + call .copypals + push hl + ld de, wBGPals1 palette PAL_BG_TEXT + ld bc, 1 palettes + call CopyBytes + pop hl + ld de, wBGPals2 palette PAL_BG_TEXT + ld bc, 1 palettes + call CopyBytes + hlcoord 0, 0, wAttrmap + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, %00000111 + call ByteFill + ld a, 1 + ldh [hCGBPalUpdate], a + call DelayFrame + call CGBOnly_CopyTilemapAtOnce + +.nextscene + call StartTrainerBattle_NextScene + ret + +.PokeBallTransition: + ; 16x16 overlay of a Poke Ball +pusho +opt b.X ; . = 0, X = 1 + bigdw %......XXXX...... + bigdw %....XXXXXXXX.... + bigdw %..XXXX....XXXX.. + bigdw %..XX........XX.. + bigdw %.XX..........XX. + bigdw %.XX...XXXX...XX. + bigdw %XX...XX..XX...XX + bigdw %XXXXXX....XXXXXX + bigdw %XXXXXX....XXXXXX + bigdw %XX...XX..XX...XX + bigdw %.XX...XXXX...XX. + bigdw %.XX..........XX. + bigdw %..XX........XX.. + bigdw %..XXXX....XXXX.. + bigdw %....XXXXXXXX.... + bigdw %......XXXX...... +popo + +.copypals + ld de, wBGPals1 palette PAL_BG_TEXT + call .copy + ld de, wBGPals2 palette PAL_BG_TEXT + call .copy + ld de, wOBPals1 palette PAL_OW_TREE + call .copy + ld de, wOBPals2 palette PAL_OW_TREE + call .copy + ld de, wOBPals1 palette PAL_OW_ROCK + call .copy + ld de, wOBPals2 palette PAL_OW_ROCK + +.copy + push hl + ld bc, 1 palettes + call CopyBytes + pop hl + ret + +.daypals +INCLUDE "gfx/overworld/trainer_battle_day.pal" + +.nightpals +INCLUDE "gfx/overworld/trainer_battle_nite.pal" + +WipeLYOverrides: + ld hl, wLYOverrides + call .wipe + ld hl, wLYOverridesBackup +.wipe + xor a + ld c, SCREEN_HEIGHT_PX +.loop + ld [hli], a + dec c + jr nz, .loop + ret + +StartTrainerBattle_DrawSineWave: + calc_sine_wave .SineWave + +.SineWave: + sine_table 256 + +StartTrainerBattle_ZoomToBlack: + farcall Function55a1 + ld de, .boxes + +.loop + ld a, [de] + cp -1 + jr z, .done + inc de + ld c, a + ld a, [de] + inc de + ld b, a + ld a, [de] + inc de + ld l, a + ld a, [de] + inc de + ld h, a + xor a + ldh [hBGMapMode], a + call .Copy + call WaitBGMap + jr .loop + +.done + ld a, BATTLETRANSITION_FINISH + ld [wJumptableIndex], a + ret + +.boxes +zoombox: MACRO +; width, height, start y, start x + db \1, \2 + dwcoord \3, \4 +ENDM + zoombox 4, 2, 8, 8 + zoombox 6, 4, 7, 7 + zoombox 8, 6, 6, 6 + zoombox 10, 8, 5, 5 + zoombox 12, 10, 4, 4 + zoombox 14, 12, 3, 3 + zoombox 16, 14, 2, 2 + zoombox 18, 16, 1, 1 + zoombox 20, 18, 0, 0 + db -1 + +.Copy: + ld a, BATTLETRANSITION_BLACK +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret + +Unreferenced_Function8ca53: + ld a, 1 + ldh [hBGMapMode], a + call WaitBGMap + xor a + ldh [hBGMapMode], a + ret diff --git a/engine/events/field_moves.asm b/engine/events/field_moves.asm new file mode 100755 index 00000000..3423f840 --- /dev/null +++ b/engine/events/field_moves.asm @@ -0,0 +1,449 @@ +FIELDMOVE_GRASS EQU $80 +FIELDMOVE_TREE EQU $84 +FIELDMOVE_FLY EQU $84 + +PlayWhirlpoolSound: + call WaitSFX + ld de, SFX_SURF + call PlaySFX + call WaitSFX + ret + +BlindingFlash: + farcall FadeOutPalettes + ld hl, wStatusFlags + set STATUSFLAGS_FLASH_F, [hl] + farcall ReplaceTimeOfDayPals + farcall UpdateTimeOfDayPal + ld b, SCGB_MAPPALS + call GetSGBLayout + farcall FadeInPalettes + ret + +ShakeHeadbuttTree: + farcall ClearSpriteAnims + ld de, CutGrassGFX + ld hl, vTiles0 tile FIELDMOVE_GRASS + lb bc, BANK(CutGrassGFX), 4 + call Request2bpp + ld de, HeadbuttTreeGFX + ld hl, vTiles0 tile FIELDMOVE_TREE + lb bc, BANK(HeadbuttTreeGFX), 8 + call Request2bpp + call Cut_Headbutt_GetPixelFacing + ld a, SPRITE_ANIM_INDEX_HEADBUTT + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], FIELDMOVE_TREE + ld a, 36 * SPRITEOAMSTRUCT_LENGTH + ld [wCurSpriteOAMAddr], a + farcall DoNextFrameForAllSprites + call HideHeadbuttTree + ld a, 32 + ld [wFrameCounter], a + call WaitSFX + ld de, SFX_SANDSTORM + call PlaySFX +.loop + ld hl, wFrameCounter + ld a, [hl] + and a + jr z, .done + dec [hl] + ld a, 36 * SPRITEOAMSTRUCT_LENGTH + ld [wCurSpriteOAMAddr], a + farcall DoNextFrameForAllSprites + call DelayFrame + jr .loop + +.done + call OverworldTextModeSwitch + call WaitBGMap + xor a + ldh [hBGMapMode], a + farcall ClearSpriteAnims + ld hl, wVirtualOAMSprite36 + ld bc, wVirtualOAMEnd - wVirtualOAMSprite36 + xor a + call ByteFill + call ReplaceChrisSprite + ret + +HeadbuttTreeGFX: +INCBIN "gfx/overworld/headbutt_tree.2bpp" + +HideHeadbuttTree: + xor a + ldh [hBGMapMode], a + ld a, [wPlayerDirection] + and %00001100 + srl a + ld e, a + ld d, 0 + ld hl, TreeRelativeLocationTable + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + + ld a, 5 ; grass block + ld [hli], a + ld [hld], a + ld bc, SCREEN_WIDTH + add hl, bc + ld [hli], a + ld [hld], a + call WaitBGMap + xor a + ldh [hBGMapMode], a + ret + +TreeRelativeLocationTable: + dwcoord 8, 8 + 2 ; RIGHT + dwcoord 8, 8 - 2 ; LEFT + dwcoord 8 - 2, 8 ; DOWN + dwcoord 8 + 2, 8 ; UP + +OWCutAnimation: + ; Animation index in e + ; 0: Split tree in half + ; 1: Mow the lawn + ld a, e + and 1 + ld [wJumptableIndex], a + call .LoadCutGFX + call WaitSFX + ld de, SFX_PLACE_PUZZLE_PIECE_DOWN + call PlaySFX +.loop + ld a, [wJumptableIndex] + bit 7, a + jr nz, .finish + ld a, 36 * SPRITEOAMSTRUCT_LENGTH + ld [wCurSpriteOAMAddr], a + callfar DoNextFrameForAllSprites + call OWCutJumptable + call DelayFrame + jr .loop + +.finish + ret + +.LoadCutGFX: + callfar ClearSpriteAnims ; pointless to farcall + ld de, CutGrassGFX + ld hl, vTiles0 tile FIELDMOVE_GRASS + lb bc, BANK(CutGrassGFX), 4 + call Request2bpp + ld de, CutTreeGFX + ld hl, vTiles0 tile FIELDMOVE_TREE + lb bc, BANK(CutTreeGFX), 4 + call Request2bpp + ret + +CutTreeGFX: +INCBIN "gfx/overworld/cut_tree.2bpp" + +CutGrassGFX: +INCBIN "gfx/overworld/cut_grass.2bpp" + +OWCutJumptable: + ld a, [wJumptableIndex] + ld e, a + ld d, 0 + ld hl, .dw + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.dw + dw Cut_SpawnAnimateTree + dw Cut_SpawnAnimateLeaves + dw Cut_StartWaiting + dw Cut_WaitAnimSFX + +Cut_SpawnAnimateTree: + call Cut_Headbutt_GetPixelFacing + ld a, SPRITE_ANIM_INDEX_CUT_TREE ; cut tree + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], FIELDMOVE_TREE + ld a, 32 + ld [wFrameCounter], a +; Cut_StartWaiting + ld hl, wJumptableIndex + inc [hl] + inc [hl] + ret + +Cut_SpawnAnimateLeaves: + call Cut_GetLeafSpawnCoords + xor a + call Cut_SpawnLeaf + ld a, $10 + call Cut_SpawnLeaf + ld a, $20 + call Cut_SpawnLeaf + ld a, $30 + call Cut_SpawnLeaf + ld a, 32 ; frames + ld [wFrameCounter], a +; Cut_StartWaiting + ld hl, wJumptableIndex + inc [hl] + ret + +Cut_StartWaiting: + ld a, 1 + ldh [hBGMapMode], a +; Cut_WaitAnimSFX + ld hl, wJumptableIndex + inc [hl] + +Cut_WaitAnimSFX: + ld hl, wFrameCounter + ld a, [hl] + and a + jr z, .finished + dec [hl] + ret + +.finished + ld hl, wJumptableIndex + set 7, [hl] + ret + +Cut_SpawnLeaf: + push de + push af + ld a, SPRITE_ANIM_INDEX_LEAF ; leaf + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], FIELDMOVE_GRASS + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld [hl], 4 + pop af + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + pop de + ret + +Cut_GetLeafSpawnCoords: + ld de, 0 + ld a, [wMetatileStandingX] + bit 0, a + jr z, .left_side + set 0, e +.left_side + ld a, [wMetatileStandingY] + bit 0, a + jr z, .top_side + set 1, e +.top_side + ld a, [wPlayerDirection] + and %00001100 + add e + ld e, a + ld hl, .Coords + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ret + +.Coords: + dbpixel 11, 12 ; facing down, top left + dbpixel 9, 12 ; facing down, top right + dbpixel 11, 14 ; facing down, bottom left + dbpixel 9, 14 ; facing down, bottom right + + dbpixel 11, 8 ; facing up, top left + dbpixel 9, 8 ; facing up, top right + dbpixel 11, 10 ; facing up, bottom left + dbpixel 9, 10 ; facing up, bottom right + + dbpixel 7, 12 ; facing left, top left + dbpixel 9, 12 ; facing left, top right + dbpixel 7, 10 ; facing left, bottom left + dbpixel 9, 10 ; facing left, bottom right + + dbpixel 11, 12 ; facing right, top left + dbpixel 13, 12 ; facing right, top right + dbpixel 11, 10 ; facing right, bottom left + dbpixel 13, 10 ; facing right, bottom right + +Cut_Headbutt_GetPixelFacing: + ld a, [wPlayerDirection] + and %00001100 + srl a + ld e, a + ld d, 0 + ld hl, .Coords + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ret + +.Coords: + dbpixel 10, 13 + dbpixel 10, 9 + dbpixel 8, 11 + dbpixel 12, 11 + +FlyFromAnim: + call DelayFrame + ld a, [wVramState] + push af + xor a + ld [wVramState], a + call FlyFunction_InitGFX + depixel 10, 10, 4, 0 + ld a, SPRITE_ANIM_INDEX_RED_WALK + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], FIELDMOVE_FLY + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], SPRITE_ANIM_SEQ_FLY_FROM + ld a, 128 + ld [wFrameCounter], a +.loop + ld a, [wJumptableIndex] + bit 7, a + jr nz, .exit + ld a, 0 * SPRITEOAMSTRUCT_LENGTH + ld [wCurSpriteOAMAddr], a + callfar DoNextFrameForAllSprites + call FlyFunction_FrameTimer + call DelayFrame + jr .loop + +.exit + pop af + ld [wVramState], a + ret + +FlyToAnim: + call DelayFrame + ld a, [wVramState] + push af + xor a + ld [wVramState], a + call FlyFunction_InitGFX + depixel 31, 10, 4, 0 + ld a, SPRITE_ANIM_INDEX_RED_WALK + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], FIELDMOVE_FLY + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], SPRITE_ANIM_SEQ_FLY_TO + ld hl, SPRITEANIMSTRUCT_0F + add hl, bc + ld [hl], 11 * 8 + ld a, 64 + ld [wFrameCounter], a +.loop + ld a, [wJumptableIndex] + bit 7, a + jr nz, .exit + ld a, 0 * SPRITEOAMSTRUCT_LENGTH + ld [wCurSpriteOAMAddr], a + callfar DoNextFrameForAllSprites + call FlyFunction_FrameTimer + call DelayFrame + jr .loop + +.exit + pop af + ld [wVramState], a + call .RestorePlayerSprite_DespawnLeaves + ret + +.RestorePlayerSprite_DespawnLeaves: + ld hl, wVirtualOAMSprite00TileID + xor a + ld c, 4 +.OAMloop + ld [hli], a ; tile id +rept SPRITEOAMSTRUCT_LENGTH - 1 + inc hl +endr + inc a + dec c + jr nz, .OAMloop + ld hl, wVirtualOAMSprite04 + ld bc, wVirtualOAMEnd - wVirtualOAMSprite04 + xor a + call ByteFill + ret + +FlyFunction_InitGFX: + callfar ClearSpriteAnims + ld de, CutGrassGFX + ld hl, vTiles0 tile FIELDMOVE_GRASS + lb bc, BANK(CutGrassGFX), 4 + call Request2bpp + ld a, [wCurPartyMon] + ld hl, wPartySpecies + ld e, a + ld d, 0 + add hl, de + ld a, [hl] + ld [wTempIconSpecies], a + ld e, FIELDMOVE_FLY + farcall GetSpeciesIcon + xor a + ld [wJumptableIndex], a + ret + +FlyFunction_FrameTimer: + call .SpawnLeaf + ld hl, wFrameCounter + ld a, [hl] + and a + jr z, .exit + dec [hl] + cp $40 + ret c + and 7 + ret nz + ld de, SFX_FLY + call PlaySFX + ret + +.exit + ld hl, wJumptableIndex + set 7, [hl] + ret + +.SpawnLeaf: + ld hl, wce65 + ld a, [hl] + inc [hl] + and 7 + ret nz + ld a, [hl] + and (6 * 8) >> 1 + sla a + add 8 * 8 ; gives a number in [$40, $50, $60, $70] + ld d, a + ld e, 0 + ld a, SPRITE_ANIM_INDEX_FLY_LEAF ; fly land + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], FIELDMOVE_GRASS + ret diff --git a/engine/events/magnet_train.asm b/engine/events/magnet_train.asm new file mode 100755 index 00000000..715c801c --- /dev/null +++ b/engine/events/magnet_train.asm @@ -0,0 +1,387 @@ +MagnetTrain: + ld a, [wScriptVar] + and a + jr nz, .ToGoldenrod + ld a, 1 ; forwards + lb bc, 8 * TILE_WIDTH, 12 * TILE_WIDTH + lb de, (11 * TILE_WIDTH) - (11 * TILE_WIDTH + 4), -12 * TILE_WIDTH + jr .continue + +.ToGoldenrod: + ld a, -1 ; backwards + lb bc, -8 * TILE_WIDTH, -12 * TILE_WIDTH + lb de, (11 * TILE_WIDTH) + (11 * TILE_WIDTH + 4), 12 * TILE_WIDTH + +.continue + ld [wMagnetTrainDirection], a + ld a, c + ld [wMagnetTrainInitPosition], a + ld a, b + ld [wMagnetTrainHoldPosition], a + ld a, e + ld [wMagnetTrainFinalPosition], a + ld a, d + ld [wMagnetTrainPlayerSpriteInitX], a + + ldh a, [hSCX] + push af + ldh a, [hSCY] + push af + call MagnetTrain_LoadGFX_PlayMusic + ld hl, hVBlank + ld a, [hl] + push af + ld [hl], 1 +.loop + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + callfar PlaySpriteAnimations + call MagnetTrain_Jumptable + call MagnetTrain_UpdateLYOverrides + call PushLYOverrides + call DelayFrame + jr .loop + +.done + pop af + ldh [hVBlank], a + call ClearBGPalettes + xor a + ldh [hLCDCPointer], a + ldh [hLYOverrideStart], a + ldh [hLYOverrideEnd], a + ldh [hSCX], a + ld [wRequested2bppSource], a + ld [wRequested2bppSource + 1], a + ld [wRequested2bppDest], a + ld [wRequested2bppDest + 1], a + ld [wRequested2bpp], a + call ClearTilemap + + pop af + ldh [hSCY], a + pop af + ldh [hSCX], a + xor a + ldh [hBGMapMode], a + ret + +MagnetTrain_UpdateLYOverrides: + ld hl, wLYOverridesBackup + ld c, 6 * TILE_WIDTH - 1 + ld a, [wMagnetTrainOffset] + add a + ldh [hSCX], a + call .loadloop + ld c, 6 * TILE_WIDTH + ld a, [wMagnetTrainPosition] + call .loadloop + ld c, 6 * TILE_WIDTH + 1 + ld a, [wMagnetTrainOffset] + add a + call .loadloop + + ld a, [wMagnetTrainDirection] + ld d, a + ld hl, wMagnetTrainOffset + ld a, [hl] + add d + add d + ld [hl], a + ret + +.loadloop + ld [hli], a + dec c + jr nz, .loadloop + ret + +MagnetTrain_LoadGFX_PlayMusic: + call ClearBGPalettes + call ClearSprites + call DisableLCD + callfar ClearSpriteAnims + call SetMagnetTrainPals + call DrawMagnetTrain + ld a, SCREEN_HEIGHT_PX + ldh [hWY], a + call EnableLCD + xor a + ldh [hBGMapMode], a + ldh [hSCX], a + ldh [hSCY], a + + ld de, ChrisSpriteGFX + ld hl, vTiles0 + lb bc, BANK(ChrisSpriteGFX), 4 + call Request2bpp + + ld de, ChrisSpriteGFX + 12 tiles + ld hl, vTiles0 tile $04 + lb bc, BANK(ChrisSpriteGFX), 4 + call Request2bpp + + call MagnetTrain_InitLYOverrides + + ld a, [wTimeOfDayPal] + push af + ld a, [wEnvironment] + push af + + ld a, [wTimeOfDay] + maskbits NUM_DAYTIMES + ld [wTimeOfDayPal], a + ld a, TOWN + ld [wEnvironment], a + ld b, SCGB_MAPPALS + call GetSGBLayout + call UpdateTimePals + + ldh a, [rBGP] + ld [wBGP], a + ldh a, [rOBP0] + ld [wOBP0], a + ldh a, [rOBP1] + ld [wOBP1], a + + pop af + ld [wEnvironment], a + pop af + ld [wTimeOfDayPal], a + + ld hl, wJumptableIndex + xor a + ld [hli], a ; wJumptableIndex + ld a, [wMagnetTrainInitPosition] + ld [hli], a ; wMagnetTrainOffset + ld [hli], a ; wMagnetTrainPosition + ld [hli], a ; wMagnetTrainWaitCounter + + ld de, MUSIC_MAGNET_TRAIN + call PlayMusic2 + ret + +DrawMagnetTrain: + hlbgcoord 0, 0 + xor a +.loop + call GetMagnetTrainBGTiles + ld b, BG_MAP_WIDTH / 2 + call .FillAlt + inc a + cp SCREEN_HEIGHT + jr c, .loop + + hlbgcoord 0, 6 + ld de, MagnetTrainTilemap + ld c, SCREEN_WIDTH + call .FillLine + hlbgcoord 0, 7 + ld de, MagnetTrainTilemap + SCREEN_WIDTH + ld c, SCREEN_WIDTH + call .FillLine + hlbgcoord 0, 8 + ld de, MagnetTrainTilemap + (SCREEN_WIDTH * 2) + ld c, SCREEN_WIDTH + call .FillLine + hlbgcoord 0, 9 + ld de, MagnetTrainTilemap + (SCREEN_WIDTH * 3) + ld c, SCREEN_WIDTH + call .FillLine + ret + +.FillLine: + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .FillLine + ret + +.FillAlt: + ld [hl], e + inc hl + ld [hl], d + inc hl + dec b + jr nz, .FillAlt + ret + +GetMagnetTrainBGTiles: + push hl + ld e, a + ld d, 0 + ld hl, MagnetTrainBGTiles + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + pop hl + ret + +MagnetTrainBGTiles: +; 2x18 tilemap, repeated in vertical strips for the background. +INCBIN "gfx/overworld/magnet_train_bg.tilemap" + +MagnetTrain_InitLYOverrides: + ld hl, wLYOverrides + ld bc, wLYOverridesEnd - wLYOverrides + ld a, [wMagnetTrainInitPosition] + call ByteFill + ld hl, wLYOverridesBackup + ld bc, wLYOverridesBackupEnd - wLYOverridesBackup + ld a, [wMagnetTrainInitPosition] + call ByteFill + ld a, LOW(rSCX) + ldh [hLCDCPointer], a + ret + +SetMagnetTrainPals: + ld a, 1 + ldh [rVBK], a + + ; bushes + hlbgcoord 0, 0 + ld bc, 4 * BG_MAP_WIDTH + ld a, PAL_BG_GREEN + call ByteFill + + ; train + hlbgcoord 0, 4 + ld bc, 10 * BG_MAP_WIDTH + xor a ; PAL_BG_GRAY + call ByteFill + + ; more bushes + hlbgcoord 0, 14 + ld bc, 4 * BG_MAP_WIDTH + ld a, PAL_BG_GREEN + call ByteFill + + ; train window + hlbgcoord 7, 8 + ld bc, 6 + ld a, PAL_BG_YELLOW + call ByteFill + + ld a, 0 + ldh [rVBK], a + ret + +MagnetTrain_Jumptable: + ld a, [wJumptableIndex] + 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 .InitPlayerSpriteAnim + dw .WaitScene + dw .MoveTrain1 + dw .WaitScene + dw .MoveTrain2 + dw .WaitScene + dw .TrainArrived + +.Next: + ld hl, wJumptableIndex + inc [hl] + ret + +.InitPlayerSpriteAnim: + ld d, (8 + 2) * TILE_WIDTH + 5 + ld a, [wMagnetTrainPlayerSpriteInitX] + ld e, a + ld a, SPRITE_ANIM_INDEX_MAGNET_TRAIN_RED + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], 0 + call .Next + ld a, 128 + ld [wMagnetTrainWaitCounter], a + ret + +.MoveTrain1: + ld hl, wMagnetTrainHoldPosition + ld a, [wMagnetTrainPosition] + cp [hl] + jr z, .PrepareToHoldTrain + ld e, a + ld a, [wMagnetTrainDirection] + xor $ff + inc a + add e + ld [wMagnetTrainPosition], a + ld hl, wGlobalAnimXOffset + ld a, [wMagnetTrainDirection] + add [hl] + ld [hl], a + ret + +.PrepareToHoldTrain: + call .Next + ld a, 128 + ld [wMagnetTrainWaitCounter], a + ret + +.WaitScene: + ld hl, wMagnetTrainWaitCounter + ld a, [hl] + and a + jr z, .DoneWaiting + dec [hl] + ret + +.DoneWaiting: + call .Next + ret + +.MoveTrain2: + ld hl, wMagnetTrainFinalPosition + ld a, [wMagnetTrainPosition] + cp [hl] + jr z, .PrepareToFinishAnim + ld e, a + ld a, [wMagnetTrainDirection] + xor $ff + inc a + ld d, a + ld a, e + add d + add d + ld [wMagnetTrainPosition], a + ld hl, wGlobalAnimXOffset + ld a, [wMagnetTrainDirection] + ld d, a + ld a, [hl] + add d + add d + ld [hl], a + ret + + ret + +.PrepareToFinishAnim: + call .Next + ret + +.TrainArrived: + ld a, $80 + ld [wJumptableIndex], a + ld de, SFX_TRAIN_ARRIVED + call PlaySFX + ret + + +MagnetTrainTilemap: +; 20x4 tilemap +INCBIN "gfx/overworld/magnet_train_fg.tilemap" diff --git a/engine/gfx/mon_icons.asm b/engine/gfx/mon_icons.asm new file mode 100755 index 00000000..d0d3856e --- /dev/null +++ b/engine/gfx/mon_icons.asm @@ -0,0 +1,337 @@ +LoadOverworldMonIcon: + ld a, e + call ReadMonMenuIcon + ld l, a + ld h, 0 + add hl, hl + ld de, IconPointers + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + ld b, BANK(Icons) + ld c, 8 + ret + +LoadMenuMonIcon: + push hl + push de + push bc + call .LoadIcon + pop bc + pop de + pop hl + ret + +.LoadIcon: + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: +; entries correspond to MONICON_* constants + dw PartyMenu_InitAnimatedMonIcon ; MONICON_PARTYMENU + dw NamingScreen_InitAnimatedMonIcon ; MONICON_NAMINGSCREEN + dw MoveList_InitAnimatedMonIcon ; MONICON_MOVES + dw Trade_LoadMonIconGFX ; MONICON_TRADE + +PartyMenu_InitAnimatedMonIcon: + ld a, [wCurIconTile] + push af + ldh a, [hObjectStructIndexBuffer] + ld hl, wPartySpecies + ld e, a + ld d, 0 + add hl, de + ld a, [hl] + call ReadMonMenuIcon + ld [wCurIcon], a + call GetMemIconGFX + ldh a, [hObjectStructIndexBuffer] +; y coord + add a + add a + add a + add a + add $1c + ld d, a +; x coord + ld e, $10 +; type is partymon icon + ld a, SPRITE_ANIM_INDEX_PARTY_MON + call _InitSpriteAnimStruct + pop af + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], a + + call .SpawnItemIcon + call SetPartyMonIconAnimSpeed + ret + +.SpawnItemIcon: + push bc + ldh a, [hObjectStructIndexBuffer] + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop bc + ld a, [hl] + and a + ret z + push hl + push bc + ld d, a + callfar ItemIsMail + pop bc + pop hl + jr c, .mail + ld a, SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_ITEM + jr .okay + +.mail + ld a, SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_MAIL +.okay + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], a + ret + +SetPartyMonIconAnimSpeed: + push bc + ldh a, [hObjectStructIndexBuffer] + ld b, a + call .getspeed + ld a, b + pop bc + ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET + add hl, bc + ld [hl], a + rlca + rlca + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], a + ret + +.getspeed + farcall PlacePartymonHPBar + call GetHPPal + ld e, d + ld d, 0 + ld hl, .speeds + add hl, de + ld b, [hl] + ret + +.speeds + db $00 ; HP_GREEN + db $40 ; HP_YELLOW + db $80 ; HP_RED + +NamingScreen_InitAnimatedMonIcon: + ld a, [wTempIconSpecies] + call ReadMonMenuIcon + ld [wCurIcon], a + xor a + call GetIconGFX + depixel 4, 4, 4, 0 + ld a, SPRITE_ANIM_INDEX_PARTY_MON + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], SPRITE_ANIM_SEQ_NULL + ret + +MoveList_InitAnimatedMonIcon: + ld a, [wTempIconSpecies] + call ReadMonMenuIcon + ld [wCurIcon], a + xor a + call GetIconGFX + ld d, 3 * 8 + 2 ; depixel 3, 4, 2, 4 + ld e, 4 * 8 + 4 + ld a, SPRITE_ANIM_INDEX_PARTY_MON + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], SPRITE_ANIM_SEQ_NULL + ret + +Trade_LoadMonIconGFX: + ld a, [wTempIconSpecies] + call ReadMonMenuIcon + ld [wCurIcon], a + ld a, $62 + ld [wCurIconTile], a + call GetMemIconGFX + ret + +GetSpeciesIcon: +; Load species icon into VRAM at tile a + push de + ld a, [wTempIconSpecies] + call ReadMonMenuIcon + ld [wCurIcon], a + pop de + ld a, e + call GetIconGFX + ret + +GetMemIconGFX: + ld a, [wCurIconTile] +GetIconGFX: +; Load icon graphics into VRAM starting from tile a. + ld l, a + ld h, 0 + +; One tile is 16 bytes long. +rept 4 + add hl, hl +endr + + ld de, vTiles0 + add hl, de + push hl + +; The icons are contiguous, in order and of the same +; size, so the pointer table is somewhat redundant. + ld a, [wCurIcon] + push hl + ld l, a + ld h, 0 + add hl, hl + ld de, IconPointers + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + pop hl + + lb bc, BANK(Icons), 8 + call Request2bpp + + pop hl + ld de, 8 tiles + add hl, de + ld de, HeldItemIcons + lb bc, BANK(HeldItemIcons), 2 + call Request2bpp + ld a, [wCurIconTile] + add 10 + ld [wCurIconTile], a + ret + +HeldItemIcons: +INCBIN "gfx/icons/mail.2bpp" +INCBIN "gfx/icons/item.2bpp" + +FreezeMonIcons: + ld hl, wSpriteAnimationStructs + ld e, PARTY_LENGTH + ld a, [wMenuCursorY] + ld d, a +.loop + ld a, [hl] + and a + jr z, .next + cp d + jr z, .loadwithtwo + ld a, SPRITE_ANIM_SEQ_NULL + jr .ok + +.loadwithtwo + ld a, SPRITE_ANIM_SEQ_PARTY_MON_SWITCH + +.ok + push hl + ld c, l + ld b, h + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], a + pop hl + +.next + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + ret + +UnfreezeMonIcons: + ld hl, wSpriteAnimationStructs + ld e, PARTY_LENGTH +.loop + ld a, [hl] + and a + jr z, .next + push hl + ld c, l + ld b, h + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], SPRITE_ANIM_SEQ_PARTY_MON + pop hl +.next + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + ret + +HoldSwitchmonIcon: + ld hl, wSpriteAnimationStructs + ld e, PARTY_LENGTH + ld a, [wSwitchMon] + ld d, a +.loop + ld a, [hl] + and a + jr z, .next + cp d + jr z, .is_switchmon + ld a, SPRITE_ANIM_SEQ_PARTY_MON_SELECTED + jr .join_back + +.is_switchmon + ld a, SPRITE_ANIM_SEQ_PARTY_MON_SWITCH +.join_back + push hl + ld c, l + ld b, h + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], a + pop hl +.next + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + ret + +ReadMonMenuIcon: + cp EGG + jr z, .egg + dec a + ld hl, MonMenuIcons + ld e, a + ld d, 0 + add hl, de + ld a, [hl] + ret +.egg + ld a, ICON_EGG + ret + +INCLUDE "data/pokemon/menu_icons.asm" + +INCLUDE "data/icon_pointers.asm" + +INCLUDE "gfx/icons.asm" diff --git a/engine/gfx/sprite_anims.asm b/engine/gfx/sprite_anims.asm index 2877539d..a6e717e8 100755 --- a/engine/gfx/sprite_anims.asm +++ b/engine/gfx/sprite_anims.asm @@ -1,1361 +1,1497 @@ -DoAnimFrame: ; 8d463 - ld hl, $2 ; 23:5463 - add hl, bc ; 23:5466 - ld e, [hl] ; 23:5467 - ld d, $0 ; 23:5468 - ld hl, .Jumptable ; 23:546a - add hl, de ; 23:546d - add hl, de ; 23:546e - ld a, [hli] ; 23:546f - ld h, [hl] ; 23:5470 - ld l, a ; 23:5471 - jp hl ; 23:5472 - -.Jumptable: ; 23:5473 - dw Function8d4c7 - dw Function8d4c8 - dw Function8d4df - dw Function8d510 - dw Function8d528 - dw Function8d54e - dw Function8d55d - dw Function8d5a2 - dw Function8d5bf - dw Function8d623 - dw Function8d66b - dw Function8d690 - dw Function8d702 - dw Function8d765 - dw Function8d7b1 - dw Function8d7ef - dw Function8d82d - dw Function8d897 - dw Function8d8b8 - dw Function8d8bf - dw Function8d909 - dw Function8d91a - dw Function8d928 - dw Function8d92f - dw Function8d971 - dw Function8d9d0 - dw Function8d9d7 - dw Function8d9ec - dw Function8d921 - dw Function8da1c - dw Function8da2a - dw Function8da23 - dw Function8da31 - dw Function8dad8 - dw Function8daf0 - dw Function8daf7 - dw Function8db25 - dw Function8db2c - dw Function8db5d - dw Function8db8f - dw Function8dbb4 - dw Function8d885 - -Function8d4c7: ; 8d4c7 - ret ; 23:54c7 - -Function8d4c8: ; 8d4c8 - ld a, [$cee0] ; 23:54c8 - ld hl, $0 ; 23:54cb - add hl, bc ; 23:54ce - cp [hl] ; 23:54cf - jr z, Function8d4df ; 23:54d0 - ld hl, $4 ; 23:54d2 - add hl, bc ; 23:54d5 - ld [hl], $10 ; 23:54d6 - ld hl, $7 ; 23:54d8 - add hl, bc ; 23:54db - ld [hl], $0 ; 23:54dc - ret ; 23:54de - -Function8d4df: ; 8d4df - ld hl, $4 ; 23:54df - add hl, bc ; 23:54e2 - ld [hl], $18 ; 23:54e3 - ld hl, $c ; 23:54e5 - add hl, bc ; 23:54e8 - ld a, [hl] ; 23:54e9 - ld d, a ; 23:54ea - inc [hl] ; 23:54eb - and $f ; 23:54ec - ret nz ; 23:54ee - ld hl, $d ; 23:54ef - add hl, bc ; 23:54f2 - ld e, [hl] ; 23:54f3 - ld hl, $7 ; 23:54f4 - add hl, bc ; 23:54f7 - ld a, d ; 23:54f8 - and $10 ; 23:54f9 - jr z, .asm_8d505 ; 23:54fb - ld a, e ; 23:54fd - and a ; 23:54fe - jr z, Function8d50c ; 23:54ff - cp $1 ; 23:5501 - jr z, Function8d508 ; 23:5503 -.asm_8d505 - xor a ; 23:5505 - ld [hl], a ; 23:5506 - ret ; 23:5507 - -Function8d508: ; 8d508 - ld a, $ff ; 23:5508 - ld [hl], a ; 23:550a - ret ; 23:550b - -Function8d50c: ; 8d50c - ld a, $fe ; 23:550c - ld [hl], a ; 23:550e - ret ; 23:550f - -Function8d510: ; 8d510 - ld a, [$cee0] ; 23:5510 - ld hl, $0 ; 23:5513 - add hl, bc ; 23:5516 - cp [hl] ; 23:5517 - jr z, Function8d521 ; 23:5518 - ld hl, $4 ; 23:551a - add hl, bc ; 23:551d - ld [hl], $10 ; 23:551e - ret ; 23:5520 - -Function8d521: ; 8d521 - ld hl, $4 ; 23:5521 - add hl, bc ; 23:5524 - ld [hl], $18 ; 23:5525 - ret ; 23:5527 - -Function8d528: ; 8d528 - ld hl, $d ; 23:5528 - add hl, bc ; 23:552b - ld a, [hl] ; 23:552c - inc [hl] ; 23:552d - cp $40 ; 23:552e - jr nc, Function8d54a ; 23:5530 - ld hl, $7 ; 23:5532 - add hl, bc ; 23:5535 - dec [hl] ; 23:5536 - ld hl, $c ; 23:5537 - add hl, bc ; 23:553a - ld a, [hl] ; 23:553b - add a, $2 ; 23:553c - ld [hl], a ; 23:553e - ld d, $8 ; 23:553f - call Function8dbf6 ; 23:5541 - ld hl, $6 ; 23:5544 - add hl, bc ; 23:5547 - ld [hl], a ; 23:5548 - ret ; 23:5549 - -Function8d54a: ; 8d54a - call DeinitializeSprite ; 23:554a - ret ; 23:554d - -Function8d54e: ; 8d54e - ld a, [$c5c7] ; 23:554e - ld hl, $5 ; 23:5551 - add hl, bc ; 23:5554 - add [hl] ; 23:5555 - cp $b0 ; 23:5556 - ret c ; 23:5558 - call DeinitializeSprite ; 23:5559 - ret ; 23:555c - -Function8d55d: ; 8d55d - call Function8dbdd ; 23:555d - jp hl ; 23:5560 - -; anonymous jumptable - dw Function8d565 - dw Function8d576 - -Function8d565: ; 8d565 - call Function8dbf0 ; 23:5565 - ld hl, $0 ; 23:5568 - add hl, bc ; 23:556b - ld a, [hl] ; 23:556c - and $3 ; 23:556d - swap a ; 23:556f - ld hl, $c ; 23:5571 - add hl, bc ; 23:5574 - ld [hl], a ; 23:5575 -Function8d576: ; 8d576 - ld de, $201 ; 23:5576 - ldh a, [$ffe9] ; 23:5579 - and a ; 23:557b - jr z, .asm_8d581 ; 23:557c - ld de, $402 ; 23:557e +DoAnimFrame: + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: +; entries correspond to SPRITE_ANIM_SEQ_* constants + dw .Null + dw .PartyMon + dw .PartyMonSwitch + dw .PartyMonSelected + dw .GSIntroBubble + dw .GSIntroShellder + dw .GSIntroMagikarp + dw .GSIntroLapras + dw .GSIntroLapras2 + dw .GSIntroNote + dw .GSIntroJigglypuff + dw .GSIntroPikachu + dw .GSIntroPikachuTail + dw .GSIntroFireball + dw .GSIntroChikoritaTotodile + dw .GSIntroCyndaquil + dw .GSTitleTrail + dw .UnusedPikachu + dw .UnusedPikachuTail + dw .UnusedNote + dw .UnusedJigglypuff + dw .NamingScreenCursor + dw .GameFreakLogo + dw .GSIntroStar + dw .GSIntroSparkle + dw .SlotsGolem + dw .SlotsChansey + dw .SlotsChanseyEgg + dw .MailCursor + dw .UnusedCursor + dw .DummyGameCursor + dw .PokegearArrow + dw .TradePokeBall + dw .TradeTubeBulge + dw .TrademonInTube + dw .RevealNewMon + dw .RadioTuningKnob + dw .CutLeaves + dw .FlyFrom + dw .FlyLeaf + dw .FlyTo + dw .GSIntroHoOhLugia + +.Null: + ret + +.PartyMon + ld a, [wMenuCursorY] + + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + cp [hl] + jr z, .PartyMonSwitch + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], 8 * 2 + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], 0 + ret + +.PartyMonSwitch + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], 8 * 3 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + ld d, a + inc [hl] + and $f + ret nz + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld e, [hl] + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld a, d + and $10 ; bit 4 + jr z, .load_zero + ld a, e + and a + jr z, .load_minus_two + cp $1 + jr z, .load_minus_one +.load_zero + xor a + ld [hl], a + ret + +.load_minus_one + ld a, -1 + ld [hl], a + ret + +.load_minus_two + ld a, -2 + ld [hl], a + ret + +.PartyMonSelected + ld a, [wMenuCursorY] + + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + cp [hl] + jr z, .three_offset_right + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], 8 * 2 + ret + +.three_offset_right + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], 8 * 3 + ret + +.GSIntroBubble + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + inc [hl] + cp $40 + jr nc, .asm_8d54a + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + dec [hl] + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add $02 + ld [hl], a + ld d, $08 + call .Sprites_Sine + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.asm_8d54a + call DeinitializeSprite + ret + +.GSIntroShellder + ld a, [wGlobalAnimYOffset] + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + add [hl] + cp $b0 + ret c + call DeinitializeSprite + ret + +.GSIntroMagikarp + call .AnonymousJumptable + jp hl + +; Anonymous dw (see .AnonymousJumptable) + dw .Function8d565 + dw .Function8d576 + +.Function8d565 + call .IncrementJumptableIndex + + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld a, [hl] + + and $03 + swap a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + +.Function8d576 + ld de, $0201 + ldh a, [hSGB] + and a + jr z, .asm_8d581 + ld de, $0402 + .asm_8d581 - ld hl, $6 ; 23:5581 - add hl, bc ; 23:5584 - ld a, [hl] ; 23:5585 - cp $f0 ; 23:5586 - jr nc, Function8d59e ; 23:5588 - add d ; 23:558a - ld [hl], a ; 23:558b - ld hl, $c ; 23:558c - add hl, bc ; 23:558f - ld a, [hl] ; 23:5590 - add e ; 23:5591 - ld [hl], a ; 23:5592 - ld d, $8 ; 23:5593 - call Function8dbf6 ; 23:5595 - ld hl, $7 ; 23:5598 - add hl, bc ; 23:559b - ld [hl], a ; 23:559c - ret ; 23:559d - -Function8d59e: ; 8d59e - call DeinitializeSprite ; 23:559e - ret ; 23:55a1 - -Function8d5a2: ; 8d5a2 - ld hl, $4 ; 23:55a2 - add hl, bc ; 23:55a5 - ld a, [hl] ; 23:55a6 - cp $b0 ; 23:55a7 - jr nc, Function8d5bb ; 23:55a9 - inc [hl] ; 23:55ab - ld hl, $c ; 23:55ac - add hl, bc ; 23:55af - ld a, [hl] ; 23:55b0 - inc [hl] ; 23:55b1 - and $1 ; 23:55b2 - ret z ; 23:55b4 - ld hl, $5 ; 23:55b5 - add hl, bc ; 23:55b8 - inc [hl] ; 23:55b9 - ret ; 23:55ba - -Function8d5bb: ; 8d5bb - call DeinitializeSprite ; 23:55bb - ret ; 23:55be - -Function8d5bf: ; 8d5bf - call Function8dbdd ; 23:55bf - jp hl ; 23:55c2 + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + cp $f0 + jr nc, .asm_8d59e + + add d + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add e + ld [hl], a + ld d, $08 + call .Sprites_Sine + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.asm_8d59e + call DeinitializeSprite + ret + +.GSIntroLapras + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $b0 + jr nc, .asm_8d5bb + + inc [hl] + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc [hl] + and $1 + ret z + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + inc [hl] + ret + +.asm_8d5bb + call DeinitializeSprite + ret + +.GSIntroLapras2 + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d5c9 - dw Function8d5e2 - dw Function8d5f3 - -Function8d5c9: ; 8d5c9 - call Function8d60b ; 23:55c9 - ret z ; 23:55cc - ld hl, $4 ; 23:55cd - add hl, bc ; 23:55d0 - ld a, [hl] ; 23:55d1 - cp $58 ; 23:55d2 - jr c, Function8d5d8 ; 23:55d4 - dec [hl] ; 23:55d6 - ret ; 23:55d7 - -Function8d5d8: ; 8d5d8 - call Function8dbf0 ; 23:55d8 - ld hl, $d ; 23:55db - add hl, bc ; 23:55de - ld [hl], $b0 ; 23:55df - ret ; 23:55e1 - -Function8d5e2: ; 8d5e2 - call Function8d60b ; 23:55e2 - ld hl, $d ; 23:55e5 - add hl, bc ; 23:55e8 - ld a, [hl] ; 23:55e9 - and a ; 23:55ea - jr z, Function8d5ef ; 23:55eb - dec [hl] ; 23:55ed - ret ; 23:55ee - -Function8d5ef: ; 8d5ef - call Function8dbf0 ; 23:55ef - ret ; 23:55f2 - -Function8d5f3: ; 8d5f3 - call Function8d60b ; 23:55f3 - ret z ; 23:55f6 - ld hl, $4 ; 23:55f7 - add hl, bc ; 23:55fa - ld a, [hl] ; 23:55fb - cp $d0 ; 23:55fc - jr z, Function8d602 ; 23:55fe - dec [hl] ; 23:5600 - ret ; 23:5601 - -Function8d602: ; 8d602 - call DeinitializeSprite ; 23:5602 - ld a, $1 ; 23:5605 - ld [$cb19], a ; 23:5607 - ret ; 23:560a - -Function8d60b: ; 8d60b - ld hl, $c ; 23:560b - add hl, bc ; 23:560e - ld a, [hl] ; 23:560f - inc [hl] ; 23:5610 - ld d, $4 ; 23:5611 - call Function8dbf6 ; 23:5613 - ld hl, $7 ; 23:5616 - add hl, bc ; 23:5619 - ld [hl], a ; 23:561a - ld hl, $c ; 23:561b - add hl, bc ; 23:561e - ld a, [hl] ; 23:561f - and $1 ; 23:5620 - ret ; 23:5622 - -Function8d623: ; 8d623 - call Function8dbdd ; 23:5623 - jp hl ; 23:5626 + dw .Function8d5c9 + dw .Function8d5e2 + dw .Function8d5f3 + +.Function8d5c9 + call .Function8d60b + ret z + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $58 + jr c, .asm_8d5d8 + + dec [hl] + ret + + +.asm_8d5d8 + call .IncrementJumptableIndex + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $b0 + ret + +.Function8d5e2 + call .Function8d60b + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and a + jr z, .asm_8d5ef + + dec [hl] + ret + +.asm_8d5ef + call .IncrementJumptableIndex + ret + +.Function8d5f3 + call .Function8d60b + ret z + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $d0 + jr z, .asm_8d602 + dec [hl] + ret + +.asm_8d602 + call DeinitializeSprite + ld a, $1 + ld [wBattleMonLevel], a + ret + +.Function8d60b + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc [hl] + ld d, 4 + call .Sprites_Sine + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and $1 + ret + +.GSIntroNote + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d62b - dw Function8d63e - -Function8d62b: ; 8d62b - call Function8dbf0 ; 23:562b - ld hl, $0 ; 23:562e - add hl, bc ; 23:5631 - ld a, [hl] ; 23:5632 - and $1 ; 23:5633 - swap a ; 23:5635 - sla a ; 23:5637 - ld hl, $c ; 23:5639 - add hl, bc ; 23:563c - ld [hl], a ; 23:563d -Function8d63e: ; 8d63e - ld hl, $6 ; 23:563e - add hl, bc ; 23:5641 - ld a, [hl] ; 23:5642 - cp $80 ; 23:5643 - jr nc, Function8d667 ; 23:5645 - inc [hl] ; 23:5647 - ld d, $4 ; 23:5648 - ld hl, $c ; 23:564a - add hl, bc ; 23:564d - ld a, [hl] ; 23:564e - add a, $2 ; 23:564f - ld [hl], a ; 23:5651 - call Function8dbf6 ; 23:5652 - ld hl, $7 ; 23:5655 - add hl, bc ; 23:5658 - ld [hl], a ; 23:5659 - ld hl, $c ; 23:565a - add hl, bc ; 23:565d - and $2 ; 23:565e - ret z ; 23:5660 - ld hl, $5 ; 23:5661 - add hl, bc ; 23:5664 - dec [hl] ; 23:5665 - ret ; 23:5666 - -Function8d667: ; 8d667 - call DeinitializeSprite ; 23:5667 - ret ; 23:566a - -Function8d66b: ; 8d66b - call Function8dbdd ; 23:566b - jp hl ; 23:566e + dw .Function8d62b + dw .Function8d63e + +.Function8d62b + call .IncrementJumptableIndex + ld hl, 0 + add hl, bc + ld a, [hl] + and $1 + swap a + sla a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a +.Function8d63e + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + cp $80 + jr nc, .asm_8d667 + inc [hl] + ld d, $04 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add $02 + ld [hl], a + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + and $2 + ret z + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + ret + +.asm_8d667 + call DeinitializeSprite + ret + +.GSIntroJigglypuff + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d673 - dw Function8d680 - -Function8d673: ; 8d673 - ld a, [$cb19] ; 23:5673 - and a ; 23:5676 - ret z ; 23:5677 - call Function8dbf0 ; 23:5678 - ld a, $c ; 23:567b - call Function8d332 ; 23:567d -Function8d680: ; 8d680 - ld hl, $4 ; 23:5680 - add hl, bc ; 23:5683 - ld a, [hl] ; 23:5684 - cp $d0 ; 23:5685 - jr z, Function8d68c ; 23:5687 - dec [hl] ; 23:5689 - dec [hl] ; 23:568a - ret ; 23:568b - -Function8d68c: ; 8d68c - call DeinitializeSprite ; 23:568c - ret ; 23:568f - -Function8d690: ; 8d690 - call Function8dbdd ; 23:5690 - jp hl ; 23:5693 + dw .Function8d673 + dw .Function8d680 + +.Function8d673 + ld a, [wBattleMonLevel] + and a + ret z + call .IncrementJumptableIndex + ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_JIGGLYPUFF_2 + call _ReinitSpriteAnimFrame +.Function8d680 + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $d0 + jr z, .asm_8d68c + dec [hl] + dec [hl] + ret + +.asm_8d68c + call DeinitializeSprite + ret + +.GSIntroPikachu + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d69c - dw Function8d6b6 - dw Function8d6c9 - dw Function8d6f2 -Function8d69c: - ld hl, $4 ; 23:569c - add hl, bc ; 23:569f - ld a, [hl] ; 23:56a0 - cp $80 ; 23:56a1 - jr z, Function8d6a7 ; 23:56a3 - dec [hl] ; 23:56a5 - ret ; 23:56a6 - -Function8d6a7: ; 8d6a7 - call Function8dbf0 ; 23:56a7 - ld hl, $d ; 23:56aa - add hl, bc ; 23:56ad - ld [hl], $30 ; 23:56ae - ld a, $e ; 23:56b0 - call Function8d332 ; 23:56b2 - ret ; 23:56b5 - -Function8d6b6: ; 8d6b6 - ld hl, $d ; 23:56b6 - add hl, bc ; 23:56b9 - ld a, [hl] ; 23:56ba - and a ; 23:56bb - jr z, Function8d6c0 ; 23:56bc - dec [hl] ; 23:56be - ret ; 23:56bf - -Function8d6c0: ; 8d6c0 - call Function8dbf0 ; 23:56c0 - ld a, $f ; 23:56c3 - call Function8d332 ; 23:56c5 - ret ; 23:56c8 - -Function8d6c9: ; 8d6c9 - ld hl, $c ; 23:56c9 - add hl, bc ; 23:56cc - ld a, [hl] ; 23:56cd - add a, $4 ; 23:56ce - ld [hl], a ; 23:56d0 - ld d, $4 ; 23:56d1 - call Function8dbf6 ; 23:56d3 - ld hl, $7 ; 23:56d6 - add hl, bc ; 23:56d9 - ld [hl], a ; 23:56da - ld hl, $4 ; 23:56db - add hl, bc ; 23:56de - ld a, [hl] ; 23:56df - cp $50 ; 23:56e0 - jr z, Function8d6e9 ; 23:56e2 - dec [hl] ; 23:56e4 - dec [hl] ; 23:56e5 - dec [hl] ; 23:56e6 - dec [hl] ; 23:56e7 - ret ; 23:56e8 - -Function8d6e9: ; 8d6e9 - ld a, $1 ; 23:56e9 - ld [$cb19], a ; 23:56eb - call Function8dbf0 ; 23:56ee - ret ; 23:56f1 - -Function8d6f2: ; 8d6f2 - ld hl, $4 ; 23:56f2 - add hl, bc ; 23:56f5 - ld a, [hl] ; 23:56f6 - cp $d0 ; 23:56f7 - jr z, Function8d6fe ; 23:56f9 - dec [hl] ; 23:56fb - dec [hl] ; 23:56fc - ret ; 23:56fd - -Function8d6fe: ; 8d6fe - call DeinitializeSprite ; 23:56fe - ret ; 23:5701 - -Function8d702: ; 8d702 - call Function8dbdd ; 23:5702 - jp hl ; 23:5705 + dw .Function8d69c + dw .Function8d6b6 + dw .Function8d6c9 + dw .Function8d6f2 + +.Function8d69c + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $80 + jr z, .asm_8d6a7 + dec [hl] + ret + +.asm_8d6a7 + call .IncrementJumptableIndex + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $30 + ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_2 + call _ReinitSpriteAnimFrame + ret + +.Function8d6b6 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and a + jr z, .asm_8d6c0 + dec [hl] + ret + +.asm_8d6c0 + call .IncrementJumptableIndex + ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_3 + call _ReinitSpriteAnimFrame + ret + +.Function8d6c9 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add $04 + ld [hl], a + ld d, $04 + call .Sprites_Sine + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $50 + jr z, .asm_8d6e9 + dec [hl] + dec [hl] + dec [hl] + dec [hl] + ret + +.asm_8d6e9 + ld a, 1 + ld [wBattleMonLevel], a + call .IncrementJumptableIndex + ret + +.Function8d6f2 + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $d0 + jr z, .asm_8d6fe + dec [hl] + dec [hl] + ret + +.asm_8d6fe + call DeinitializeSprite + ret + +.GSIntroPikachuTail + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d70c - dw Function8d726 - dw Function8d73c - -Function8d70c: ; 8d70c - ld hl, $4 ; 23:570c - add hl, bc ; 23:570f - ld a, [hl] ; 23:5710 - cp $80 ; 23:5711 - jr z, Function8d717 ; 23:5713 - dec [hl] ; 23:5715 - ret ; 23:5716 - -Function8d717: ; 8d717 - call Function8dbf0 ; 23:5717 - ld hl, $d ; 23:571a - add hl, bc ; 23:571d - ld [hl], $30 ; 23:571e - ld a, $11 ; 23:5720 - call Function8d332 ; 23:5722 - ret ; 23:5725 - -Function8d726: ; 8d726 - ld hl, $d ; 23:5726 - add hl, bc ; 23:5729 - ld a, [hl] ; 23:572a - and a ; 23:572b - jr z, Function8d738 ; 23:572c - dec [hl] ; 23:572e - cp $20 ; 23:572f - ret nz ; 23:5731 - ld a, $10 ; 23:5732 - call Function8d332 ; 23:5734 - ret ; 23:5737 - -Function8d738: ; 8d738 - call Function8dbf0 ; 23:5738 - ret ; 23:573b - -Function8d73c: ; 8d73c - ld hl, $c ; 23:573c - add hl, bc ; 23:573f - ld a, [hl] ; 23:5740 - add a, $4 ; 23:5741 - ld [hl], a ; 23:5743 - ld d, $4 ; 23:5744 - call Function8dbf6 ; 23:5746 - ld hl, $7 ; 23:5749 - add hl, bc ; 23:574c - ld [hl], a ; 23:574d - ld hl, $4 ; 23:574e - add hl, bc ; 23:5751 - ld a, [hl] ; 23:5752 - cp $d0 ; 23:5753 - jr z, Function8d761 ; 23:5755 - dec [hl] ; 23:5757 - dec [hl] ; 23:5758 - ld a, [$cb19] ; 23:5759 - and a ; 23:575c - ret nz ; 23:575d - dec [hl] ; 23:575e - dec [hl] ; 23:575f - ret ; 23:5760 - -Function8d761: ; 8d761 - call DeinitializeSprite ; 23:5761 - ret ; 23:5764 - -Function8d765: ; 8d765 - call Function8dbdd ; 23:5765 - jp hl ; 23:5768 + dw .Function8d70c + dw .Function8d726 + dw .Function8d73c + +.Function8d70c + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $80 + jr z, .asm_8d717 + dec [hl] + ret + +.asm_8d717 + call .IncrementJumptableIndex + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $30 + ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_TAIL_2 + call _ReinitSpriteAnimFrame + ret + +.Function8d726 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and a + jr z, .asm_8d738 + dec [hl] + cp $20 + ret nz + ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_TAIL + call _ReinitSpriteAnimFrame + ret + +.asm_8d738 + call .IncrementJumptableIndex + ret + +.Function8d73c + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add $04 + ld [hl], a + ld d, $04 + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $d0 + jr z, .asm_8d761 + dec [hl] + dec [hl] + ld a, [wBattleMonLevel] + and a + ret nz + dec [hl] + dec [hl] + ret + +.asm_8d761 + call DeinitializeSprite + ret + +.GSIntroFireball + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d76d - dw Function8d786 - -Function8d76d: ; 8d76d - call Function8dbf0 ; 23:576d - ld hl, $0 ; 23:5770 - add hl, bc ; 23:5773 - ld a, [hl] ; 23:5774 - and $4 ; 23:5775 - sla a ; 23:5777 - ld e, a ; 23:5779 - ld a, [hl] ; 23:577a - and $3 ; 23:577b - swap a ; 23:577d - add e ; 23:577f - ld hl, $c ; 23:5780 - add hl, bc ; 23:5783 - ld [hl], a ; 23:5784 - ret ; 23:5785 - -Function8d786: ; 8d786 - ld hl, $4 ; 23:5786 - add hl, bc ; 23:5789 - dec [hl] ; 23:578a - dec [hl] ; 23:578b - dec [hl] ; 23:578c - dec [hl] ; 23:578d - ld hl, $d ; 23:578e - add hl, bc ; 23:5791 - ld a, [hl] ; 23:5792 - ld d, a ; 23:5793 - add a, $8 ; 23:5794 - ld [hl], a ; 23:5796 - ld hl, $c ; 23:5797 - add hl, bc ; 23:579a - ld a, [hl] ; 23:579b - push af ; 23:579c - push de ; 23:579d - call Function8dbf6 ; 23:579e - ld hl, $7 ; 23:57a1 - add hl, bc ; 23:57a4 - ld [hl], a ; 23:57a5 - pop de ; 23:57a6 - pop af ; 23:57a7 - call Function8dbfa ; 23:57a8 - ld hl, $6 ; 23:57ab - add hl, bc ; 23:57ae - ld [hl], a ; 23:57af - ret ; 23:57b0 - -Function8d7b1: ; 8d7b1 - call Function8dbdd ; 23:57b1 - jp hl ; 23:57b4 + dw .Function8d76d + dw .Function8d786 + +.Function8d76d + call .IncrementJumptableIndex + ld hl, 0 + add hl, bc + ld a, [hl] + and $4 + sla a + ld e, a + ld a, [hl] + and $3 + swap a + add e + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + ret + +.Function8d786 + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + dec [hl] + dec [hl] + dec [hl] + dec [hl] + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + ld d, a + add $8 + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +; flash down/right +.GSIntroChikoritaTotodile + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d7b9 - dw Function8d7c9 - -Function8d7b9: ; 8d7b9 - call Function8dbf0 ; 23:57b9 - ld hl, $c ; 23:57bc - add hl, bc ; 23:57bf - ld [hl], $30 ; 23:57c0 - ld hl, $d ; 23:57c2 - add hl, bc ; 23:57c5 - ld [hl], $30 ; 23:57c6 - ret ; 23:57c8 - -Function8d7c9: ; 8d7c9 - ld hl, $c ; 23:57c9 - add hl, bc ; 23:57cc - ld a, [hl] ; 23:57cd - cp $3c ; 23:57ce - ret nc ; 23:57d0 - inc [hl] ; 23:57d1 - inc [hl] ; 23:57d2 - ld d, $90 ; 23:57d3 - call Function8dbf6 ; 23:57d5 - ld hl, $7 ; 23:57d8 - add hl, bc ; 23:57db - ld [hl], a ; 23:57dc - ld hl, $d ; 23:57dd - add hl, bc ; 23:57e0 - ld a, [hl] ; 23:57e1 - inc [hl] ; 23:57e2 - inc [hl] ; 23:57e3 - ld d, $90 ; 23:57e4 - call Function8dbfa ; 23:57e6 - ld hl, $6 ; 23:57e9 - add hl, bc ; 23:57ec - ld [hl], a ; 23:57ed - ret ; 23:57ee - -Function8d7ef: ; 8d7ef - call Function8dbdd ; 23:57ef - jp hl ; 23:57f2 + dw .Function8d7b9 + dw .Function8d7c9 + +.Function8d7b9 + call .IncrementJumptableIndex + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $30 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $30 + ret + +.Function8d7c9 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $3c + ret nc + + inc [hl] + inc [hl] + ld d, $90 + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + ld d, $90 + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +; flash down/left +.GSIntroCyndaquil + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d7f7 - dw Function8d807 - -Function8d7f7: ; 8d7f7 - call Function8dbf0 ; 23:57f7 - ld hl, $c ; 23:57fa - add hl, bc ; 23:57fd - ld [hl], $30 ; 23:57fe - ld hl, $d ; 23:5800 - add hl, bc ; 23:5803 - ld [hl], $10 ; 23:5804 - ret ; 23:5806 - -Function8d807: ; 8d807 - ld hl, $c ; 23:5807 - add hl, bc ; 23:580a - ld a, [hl] ; 23:580b - cp $3c ; 23:580c - ret nc ; 23:580e - inc [hl] ; 23:580f - inc [hl] ; 23:5810 - ld d, $90 ; 23:5811 - call Function8dbf6 ; 23:5813 - ld hl, $7 ; 23:5816 - add hl, bc ; 23:5819 - ld [hl], a ; 23:581a - ld hl, $d ; 23:581b - add hl, bc ; 23:581e - ld a, [hl] ; 23:581f - inc [hl] ; 23:5820 - inc [hl] ; 23:5821 - ld d, $90 ; 23:5822 - call Function8dbfa ; 23:5824 - ld hl, $6 ; 23:5827 - add hl, bc ; 23:582a - ld [hl], a ; 23:582b - ret ; 23:582c - -Function8d82d: ; 8d82d - call Function8dbdd ; 23:582d - jp hl ; 23:5830 + dw .Function8d7f7 + dw .Function8d807 + +.Function8d7f7 + call .IncrementJumptableIndex + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $30 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $10 + ret + +.Function8d807 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $3c + ret nc + inc [hl] + inc [hl] + ld d, $90 + call .Sprites_Sine + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + ld d, $90 + call .Sprites_Cosine + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret +.GSTitleTrail + call .AnonymousJumptable + jp hl + +IF DEF(_GOLD) ; anonymous jumptable - dw Function8d835 - dw Function8d84c - -Function8d835: ; 8d835 - call Function8dbf0 ; 23:5835 - ld hl, $0 ; 23:5838 - add hl, bc ; 23:583b - ld a, [hl] ; 23:583c - ld hl, $d ; 23:583d - add hl, bc ; 23:5840 - and $3 ; 23:5841 - ld [hl], a ; 23:5843 - inc [hl] ; 23:5844 - swap a ; 23:5845 - ld hl, $c ; 23:5847 - add hl, bc ; 23:584a - ld [hl], a ; 23:584b -Function8d84c: ; 8d84c - ld hl, $4 ; 23:584c - add hl, bc ; 23:584f - ld a, [hl] ; 23:5850 - cp $a4 ; 23:5851 - jr nc, Function8d881 ; 23:5853 - ld hl, $d ; 23:5855 - add hl, bc ; 23:5858 - add a, $4 ; 23:5859 - ld hl, $4 ; 23:585b - add hl, bc ; 23:585e - ld [hl], a ; 23:585f - ld hl, $5 ; 23:5860 - add hl, bc ; 23:5863 - inc [hl] ; 23:5864 - ld hl, $d ; 23:5865 - add hl, bc ; 23:5868 - ld a, [hl] ; 23:5869 - sla a ; 23:586a - sla a ; 23:586c - ld d, $2 ; 23:586e - ld hl, $c ; 23:5870 - add hl, bc ; 23:5873 - ld a, [hl] ; 23:5874 - add a, $3 ; 23:5875 - ld [hl], a ; 23:5877 - call Function8dbf6 ; 23:5878 - ld hl, $7 ; 23:587b - add hl, bc ; 23:587e - ld [hl], a ; 23:587f - ret ; 23:5880 - -Function8d881: ; 8d881 - call DeinitializeSprite ; 23:5881 - ret ; 23:5884 - -Function8d885: ; 8d885 - ld hl, $c ; 23:5885 - add hl, bc ; 23:5888 - ld a, [hl] ; 23:5889 - inc a ; 23:588a - ld [hl], a ; 23:588b - ld d, $2 ; 23:588c - call Function8dbf6 ; 23:588e - ld hl, $7 ; 23:5891 - add hl, bc ; 23:5894 - ld [hl], a ; 23:5895 - ret ; 23:5896 - -Function8d897: ; 8d897 - push bc ; 23:5897 - callba_hc $38, $4000 ; 23:5898 ; 23:589d - pop bc ; 23:589e - ld hl, $c704 ; 23:589f - ld a, [hl] ; 23:58a2 - and $3 ; 23:58a3 - ret z ; 23:58a5 - ld [hl], $0 ; 23:58a6 - ld e, a ; 23:58a8 - ld d, $0 ; 23:58a9 - ld hl, $58b4 ; 23:58ab - add hl, de ; 23:58ae - ld a, [hl] ; 23:58af - call Function8d332 ; 23:58b0 - ret ; 23:58b3 - -Function8d8b4: ; 8d8b4 - db $17 - db $18 - db $17 - db $19 - -Function8d8b8: ; 8d8b8 - callba_hc $38, $4000 ; 23:58b8 ; 23:58bd - ret ; 23:58be - -Function8d8bf: ; 8d8bf - call Function8dbdd ; 23:58bf - jp hl ; 23:58c2 + dw .Function8d835 + dw .Function8d84c + +.Function8d835 + call .IncrementJumptableIndex + + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld a, [hl] + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + and $3 + ld [hl], a + inc [hl] + swap a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + +.Function8d84c + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $a4 + jr nc, .asm_8d881 + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + add $4 + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + inc [hl] + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + sla a + sla a + ld d, 2 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add $3 + ld [hl], a + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.asm_8d881 + call DeinitializeSprite + ret + +ELIF DEF(_SILVER) +; anonymous jumptable + dw .Function8d835 + dw .Function8d856 + +.Function8d835 + ld a, [wIntroSceneTimer] + and $30 + swap a + add $3 + ld d, a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [wIntroSceneTimer] + and $30 + swap a + add $07 + add [hl] + ld [hl], a + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a +.Function8d856 + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $a4 + jr nc, .asm_8d863 + add $4 + ld [hl], a + ret + +.asm_8d863 + call DeinitializeSprite + ret +ENDC + +.GSIntroHoOhLugia + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] +IF DEF(_GOLD) + inc a + ld [hl], a + ld d, 2 +ELIF DEF(_SILVER) + dec a + ld [hl], a + ld d, 8 +ENDC + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.UnusedPikachu + push bc + farcall ret_e0000 + pop bc + ld hl, wc704 + ld a, [hl] + and $3 + ret z + ld [hl], 0 + ld e, a + ld d, 0 + ld hl, .Data_8d8b4 + add hl, de + ld a, [hl] + call _ReinitSpriteAnimFrame + ret + +.Data_8d8b4 + db SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU + db SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU_2 + db SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU + db SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU_3 + +.UnusedPikachuTail + farcall ret_e0000 + ret + +.UnusedNote + call .AnonymousJumptable + jp hl ; anonymous jumptable - dw Function8d8c7 - dw Function8d8d9 - -Function8d8c7: ; 8d8c7 - call Function8d8e1 ; 23:58c7 - ld a, [$c717] ; 23:58ca - ld hl, $4 ; 23:58cd - add hl, bc ; 23:58d0 - add [hl] ; 23:58d1 - ld [hl], a ; 23:58d2 - cp $c0 ; 23:58d3 - ret nc ; 23:58d5 - cp $a8 ; 23:58d6 - ret c ; 23:58d8 -Function8d8d9: - call DeinitializeSprite ; 23:58d9 - ld hl, $c5bc ; 23:58dc - dec [hl] ; 23:58df - ret ; 23:58e0 - -Function8d8e1: ; 8d8e1 - ld hl, $c ; 23:58e1 - add hl, bc ; 23:58e4 - ld a, [hl] ; 23:58e5 - inc [hl] ; 23:58e6 - and $1f ; 23:58e7 - srl a ; 23:58e9 - ld e, a ; 23:58eb - ld d, $0 ; 23:58ec - ld hl, Data_8d8f9 ; 23:58ee - add hl, de ; 23:58f1 - ld a, [hl] ; 23:58f2 - ld hl, $7 ; 23:58f3 - add hl, bc ; 23:58f6 - ld [hl], a ; 23:58f7 - ret ; 23:58f8 - -Data_8d8f9: ; 8d8f9 - db $04 - db $07 - db $09 - db $0a - db $09 - db $07 - db $04 - db $00 - db $fc - db $f9 - db $f7 - db $f6 - db $f7 - db $f9 - db $fc - db $00 - -Function8d909: ; 8d909 - ld a, [$c717] - ld hl, $4 + dw .Function8d8c7 + dw .Function8d8d9 + +.Function8d8c7 + call .Function8d8e1 + ld a, [wc717] + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + add [hl] + ld [hl], a + cp $c0 + ret nc + cp $a8 + ret c +.Function8d8d9 + call DeinitializeSprite + ld hl, wSpriteAnimCount + dec [hl] + ret + +.Function8d8e1 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc [hl] + and $1f + srl a + ld e, a + ld d, 0 + ld hl, .Data_8d8f9 + add hl, de + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.Data_8d8f9 + db 4, 7, 9, 10, 9, 7, 4, 0 + db -4, -7, -9, -10, -9, -7, -4, 0 + +.UnusedJigglypuff + ld a, [wc717] + + ld hl, SPRITEANIMSTRUCT_XCOORD add hl, bc add [hl] ld [hl], a cp $30 ret nz xor a - ld [$c717], a - ret ; 23:5919 - -Function8d91a: ; 8d91a - callab_hc $4, $5dfa ; 23:591a ; 23:591f - ret ; 23:5920 - -Function8d921: ; 8d921 - callab_hc $4, $648e ; 23:5921 ; 23:5926 - ret ; 23:5927 - -Function8d928: ; 8d928 - callab_hc $39, $4b20 ; 23:5928 ; 23:592d - ret ; 23:592e - -Function8d92f: ; 8d92f - ld hl, $c ; 23:592f - add hl, bc ; 23:5932 - ld a, [hl] ; 23:5933 - and a ; 23:5934 - jr z, Function8d968 ; 23:5935 - dec [hl] ; 23:5937 - dec [hl] ; 23:5938 - ld d, a ; 23:5939 - and $1f ; 23:593a - jr nz, .asm_8d943 ; 23:593c - ld hl, $d ; 23:593e - add hl, bc ; 23:5941 - dec [hl] ; 23:5942 + ld [wc717], a + ret + +.NamingScreenCursor + callfar NamingScreen_AnimateCursor + ret + +.MailCursor + callfar ComposeMail_AnimateCursor + ret + +.GameFreakLogo: + callfar GFPresents_UpdateLogoPal + ret + +.GSIntroStar + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .asm_8d968 + dec [hl] + dec [hl] + ld d, a + and $1f + jr nz, .asm_8d943 + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + dec [hl] .asm_8d943 - ld hl, $b ; 23:5943 - add hl, bc ; 23:5946 - ld a, [hl] ; 23:5947 - push af ; 23:5948 - push de ; 23:5949 - call Function8dbf6 ; 23:594a - ld hl, $7 ; 23:594d - add hl, bc ; 23:5950 - ld [hl], a ; 23:5951 - pop de ; 23:5952 - pop af ; 23:5953 - call Function8dbfa ; 23:5954 - ld hl, $6 ; 23:5957 - add hl, bc ; 23:595a - ld [hl], a ; 23:595b - ld hl, $d ; 23:595c - add hl, bc ; 23:595f - ld a, [hl] ; 23:5960 - ld hl, $b ; 23:5961 - add hl, bc ; 23:5964 - add [hl] ; 23:5965 - ld [hl], a ; 23:5966 - ret ; 23:5967 - -Function8d968: ; 8d968 - ld a, $1 ; 23:5968 - ld [$ce64], a ; 23:596a - call DeinitializeSprite ; 23:596d - ret ; 23:5970 - -Function8d971: ; 8d971 - ld hl, $c ; 23:5971 - add hl, bc ; 23:5974 - ld a, [hli] ; 23:5975 - or [hl] ; 23:5976 - jr z, Function8d9cc ; 23:5977 - ld hl, $f ; 23:5979 - add hl, bc ; 23:597c - ld d, [hl] ; 23:597d - ld hl, $b ; 23:597e - add hl, bc ; 23:5981 - ld a, [hl] ; 23:5982 - push af ; 23:5983 - push de ; 23:5984 - call Function8dbf6 ; 23:5985 - ld hl, $7 ; 23:5988 - add hl, bc ; 23:598b - ld [hl], a ; 23:598c - pop de ; 23:598d - pop af ; 23:598e - call Function8dbfa ; 23:598f - ld hl, $6 ; 23:5992 - add hl, bc ; 23:5995 - ld [hl], a ; 23:5996 - ld hl, $c ; 23:5997 - add hl, bc ; 23:599a - ld e, [hl] ; 23:599b - inc hl ; 23:599c - ld d, [hl] ; 23:599d - ld hl, $e ; 23:599e - add hl, bc ; 23:59a1 - ld a, [hli] ; 23:59a2 - ld h, [hl] ; 23:59a3 - ld l, a ; 23:59a4 - add hl, de ; 23:59a5 - ld e, l ; 23:59a6 - ld d, h ; 23:59a7 - ld hl, $e ; 23:59a8 - add hl, bc ; 23:59ab - ld [hl], e ; 23:59ac - inc hl ; 23:59ad - ld [hl], d ; 23:59ae - ld hl, $c ; 23:59af - add hl, bc ; 23:59b2 - ld a, [hli] ; 23:59b3 - ld h, [hl] ; 23:59b4 - ld l, a ; 23:59b5 - ld de, $fff0 ; 23:59b6 - add hl, de ; 23:59b9 - ld e, l ; 23:59ba - ld d, h ; 23:59bb - ld hl, $c ; 23:59bc - add hl, bc ; 23:59bf - ld [hl], e ; 23:59c0 - inc hl ; 23:59c1 - ld [hl], d ; 23:59c2 - ld hl, $b ; 23:59c3 - add hl, bc ; 23:59c6 - ld a, [hl] ; 23:59c7 - xor $20 ; 23:59c8 - ld [hl], a ; 23:59ca - ret ; 23:59cb - -Function8d9cc: ; 8d9cc - call DeinitializeSprite ; 23:59cc - ret ; 23:59cf - -Function8d9d0: ; 8d9d0 - callab_hc $24, $7772 ; 23:59d0 ; 23:59d5 - ret ; 23:59d6 - -Function8d9d7: ; 8d9d7 - callab_hc $24, $7801 ; 23:59d7 ; 23:59dc - ld hl, $ce64 ; 23:59dd - ld a, [hl] ; 23:59e0 - cp $2 ; 23:59e1 - ret nz ; 23:59e3 - ld [hl], $3 ; 23:59e4 - ld a, $21 ; 23:59e6 - call Function8d332 ; 23:59e8 - ret ; 23:59eb - -Function8d9ec: ; 8d9ec - ld hl, $b ; 23:59ec - add hl, bc ; 23:59ef - ld a, [hl] ; 23:59f0 - dec [hl] ; 23:59f1 - ld e, a ; 23:59f2 - and $1 ; 23:59f3 - jr z, .asm_8da10 ; 23:59f5 - ld hl, $4 ; 23:59f7 - add hl, bc ; 23:59fa - ld a, [hl] ; 23:59fb - cp $78 ; 23:59fc - jr c, asm_8da0f ; 23:59fe - call DeinitializeSprite ; 23:5a00 - ld a, $4 ; 23:5a03 - ld [$ce64], a ; 23:5a05 - ld de, $1e ; 23:5a08 - call $3e24 ; 23:5a0b - ret ; 23:5a0e - -.asm_8da0f - inc [hl] ; 23:5a0f -.asm_8da10 - ld a, e ; 23:5a10 - ld d, $20 ; 23:5a11 - call Function8dbf6 ; 23:5a13 - ld hl, $7 ; 23:5a16 - add hl, bc ; 23:5a19 - ld [hl], a ; 23:5a1a - ret ; 23:5a1b - -Function8da1c: ; 8da1c - callab_hc $38, $4908 ; 23:5a1c ; 23:5a21 - ret ; 23:5a22 - -Function8da23: ; 8da23 - callab_hc $24, $4d0b ; 23:5a23 ; 23:5a28 - ret ; 23:5a29 - -Function8da2a: ; 8da2a - callab_hc $38, $69ae ; 23:5a2a ; 23:5a2f - ret ; 23:5a30 - -Function8da31: ; 8da31 - call Function8dbdd ; 23:5a31 - jp hl ; 23:5a34 - ld b, c ; 23:5a35 - ld e, d ; 23:5a36 - add e ; 23:5a37 - ld e, d ; 23:5a38 - ld d, e ; 23:5a39 - ld e, d ; 23:5a3a - ld h, [hl] ; 23:5a3b - ld e, d ; 23:5a3c - sub [hl] ; 23:5a3d - ld e, d ; 23:5a3e - call nc, $3e5a ; 23:5a3f - ld h, $cd ; 23:5a42 - ld [hld], a ; 23:5a44 - ld d, e ; 23:5a45 - ld hl, $b ; 23:5a46 - add hl, bc ; 23:5a49 - ld [hl], $2 ; 23:5a4a - ld hl, $c ; 23:5a4c - add hl, bc ; 23:5a4f - ld [hl], $20 ; 23:5a50 - ret ; 23:5a52 - -Function8da53: ; 8da53 - ld hl, $c ; 23:5a53 - add hl, bc ; 23:5a56 - ld a, [hl] ; 23:5a57 - and a ; 23:5a58 - jr z, Function8da5d ; 23:5a59 - dec [hl] ; 23:5a5b - ret ; 23:5a5c - -Function8da5d: ; 8da5d - call Function8dbf0 ; 23:5a5d - ld hl, $c ; 23:5a60 - add hl, bc ; 23:5a63 - ld [hl], $40 ; 23:5a64 - ld hl, $c ; 23:5a66 - add hl, bc ; 23:5a69 - ld a, [hl] ; 23:5a6a - cp $30 ; 23:5a6b - jr c, Function8da7b ; 23:5a6d - dec [hl] ; 23:5a6f - ld d, $28 ; 23:5a70 - call Function8dbf6 ; 23:5a72 - ld hl, $7 ; 23:5a75 - add hl, bc ; 23:5a78 - ld [hl], a ; 23:5a79 - ret ; 23:5a7a - -Function8da7b: ; 8da7b - ld de, $c ; 23:5a7b - call $3e24 ; 23:5a7e - jr Function8dad4 ; 23:5a81 - ld hl, $b ; 23:5a83 - add hl, bc ; 23:5a86 - ld [hl], $4 ; 23:5a87 - ld hl, $c ; 23:5a89 - add hl, bc ; 23:5a8c - ld [hl], $30 ; 23:5a8d - ld hl, $d ; 23:5a8f - add hl, bc ; 23:5a92 - ld [hl], $24 ; 23:5a93 - ret ; 23:5a95 - -Function8da96: ; 8da96 - ld hl, $d ; 23:5a96 - add hl, bc ; 23:5a99 - ld a, [hl] ; 23:5a9a - and a ; 23:5a9b - jr z, Function8daca ; 23:5a9c - ld d, a ; 23:5a9e - ld hl, $c ; 23:5a9f - add hl, bc ; 23:5aa2 - ld a, [hl] ; 23:5aa3 - call Sprites_Sine ; 23:5aa4 - ld hl, $7 ; 23:5aa7 - add hl, bc ; 23:5aaa - ld [hl], a ; 23:5aab - ld hl, $c ; 23:5aac - add hl, bc ; 23:5aaf - inc [hl] ; 23:5ab0 - ld a, [hl] ; 23:5ab1 - and $3f ; 23:5ab2 - ret nz ; 23:5ab4 - ld hl, $c ; 23:5ab5 - add hl, bc ; 23:5ab8 - ld [hl], $20 ; 23:5ab9 - ld hl, $d ; 23:5abb - add hl, bc ; 23:5abe - ld a, [hl] ; 23:5abf - sub a, $c ; 23:5ac0 - ld [hl], a ; 23:5ac2 - ld de, $20 ; 23:5ac3 - call $3e24 ; 23:5ac6 - ret ; 23:5ac9 - -Function8daca: ; 8daca - xor a ; 23:5aca - ld hl, $7 ; 23:5acb - add hl, bc ; 23:5ace - ld [hl], a ; 23:5acf - call Function8dbf0 ; 23:5ad0 - ret ; 23:5ad3 - -Function8dad4: ; 8dad4 - call DeinitializeSprite ; 23:5ad4 - ret ; 23:5ad7 - -Function8dad8: ; 8dad8 - ld hl, $4 ; 23:5ad8 - add hl, bc ; 23:5adb - ld a, [hl] ; 23:5adc - inc [hl] ; 23:5add - cp $b0 ; 23:5ade - jr nc, Function8daec ; 23:5ae0 - and $3 ; 23:5ae2 - ret nz ; 23:5ae4 - ld de, $3 ; 23:5ae5 - call $3e24 ; 23:5ae8 - ret ; 23:5aeb - -Function8daec: ; 8daec - call DeinitializeSprite ; 23:5aec - ret ; 23:5aef - -Function8daf0: ; 8daf0 - callab_hc $a, $54cf ; 23:5af0 ; 23:5af5 - ret ; 23:5af6 - -Function8daf7: ; 8daf7 - ld hl, $c ; 23:5af7 - add hl, bc ; 23:5afa - ld a, [hl] ; 23:5afb - cp $80 ; 23:5afc - jr nc, Function8db21 ; 23:5afe - ld d, a ; 23:5b00 - add a, $8 ; 23:5b01 - ld [hl], a ; 23:5b03 - ld hl, $b ; 23:5b04 - add hl, bc ; 23:5b07 - ld a, [hl] ; 23:5b08 - xor $20 ; 23:5b09 - ld [hl], a ; 23:5b0b - push af ; 23:5b0c - push de ; 23:5b0d - call Function8dbf6 ; 23:5b0e - ld hl, $7 ; 23:5b11 - add hl, bc ; 23:5b14 - ld [hl], a ; 23:5b15 - pop de ; 23:5b16 - pop af ; 23:5b17 - call Function8dbfa ; 23:5b18 - ld hl, $6 ; 23:5b1b - add hl, bc ; 23:5b1e - ld [hl], a ; 23:5b1f - ret ; 23:5b20 - -Function8db21: ; 8db21 - call DeinitializeSprite ; 23:5b21 - ret ; 23:5b24 - -Function8db25: ; 8db25 - callab_hc $24, $55ff ; 23:5b25 ; 23:5b2a - ret ; 23:5b2b - -Function8db2c: ; 8db2c - ld hl, $d ; 23:5b2c - add hl, bc ; 23:5b2f - ld e, [hl] ; 23:5b30 - inc hl ; 23:5b31 - ld d, [hl] ; 23:5b32 - ld hl, $80 ; 23:5b33 - add hl, de ; 23:5b36 - ld e, l ; 23:5b37 - ld d, h ; 23:5b38 - ld hl, $d ; 23:5b39 - add hl, bc ; 23:5b3c - ld [hl], e ; 23:5b3d - inc hl ; 23:5b3e - ld [hl], d ; 23:5b3f - ld hl, $c ; 23:5b40 - add hl, bc ; 23:5b43 - ld a, [hl] ; 23:5b44 - inc [hl] ; 23:5b45 - inc [hl] ; 23:5b46 - inc [hl] ; 23:5b47 - push af ; 23:5b48 - push de ; 23:5b49 - call Function8dbf6 ; 23:5b4a - ld hl, $7 ; 23:5b4d - add hl, bc ; 23:5b50 - ld [hl], a ; 23:5b51 - pop de ; 23:5b52 - pop af ; 23:5b53 - call Function8dbfa ; 23:5b54 - ld hl, $6 ; 23:5b57 - add hl, bc ; 23:5b5a - ld [hl], a ; 23:5b5b - ret ; 23:5b5c - -Function8db5d: ; 8db5d - ld hl, $5 ; 23:5b5d - add hl, bc ; 23:5b60 - ld a, [hl] ; 23:5b61 - and a ; 23:5b62 - ret z ; 23:5b63 - ld hl, $d ; 23:5b64 - add hl, bc ; 23:5b67 - ld a, [hl] ; 23:5b68 - inc [hl] ; 23:5b69 - cp $40 ; 23:5b6a - ret c ; 23:5b6c - ld hl, $5 ; 23:5b6d - add hl, bc ; 23:5b70 - dec [hl] ; 23:5b71 - dec [hl] ; 23:5b72 - ld hl, $f ; 23:5b73 - add hl, bc ; 23:5b76 - ld a, [hl] ; 23:5b77 - ld d, a ; 23:5b78 - cp $40 ; 23:5b79 - jr nc, .asm_8db80 ; 23:5b7b - add a, $8 ; 23:5b7d - ld [hl], a ; 23:5b7f -.asm_8db80 - ld hl, $e ; 23:5b80 - add hl, bc ; 23:5b83 - ld a, [hl] ; 23:5b84 - inc [hl] ; 23:5b85 - call Function8dbfa ; 23:5b86 - ld hl, $6 ; 23:5b89 - add hl, bc ; 23:5b8c - ld [hl], a ; 23:5b8d - ret ; 23:5b8e - -Function8db8f: ; 8db8f - ld hl, $4 ; 23:5b8f - add hl, bc ; 23:5b92 - ld a, [hl] ; 23:5b93 - cp $b8 ; 23:5b94 - jr nc, Function8dbb0 ; 23:5b96 - inc [hl] ; 23:5b98 - inc [hl] ; 23:5b99 - ld hl, $5 ; 23:5b9a - add hl, bc ; 23:5b9d - dec [hl] ; 23:5b9e - ld d, $40 ; 23:5b9f - ld hl, $c ; 23:5ba1 - add hl, bc ; 23:5ba4 - ld a, [hl] ; 23:5ba5 - inc [hl] ; 23:5ba6 - call Function8dbfa ; 23:5ba7 - ld hl, $6 ; 23:5baa - add hl, bc ; 23:5bad - ld [hl], a ; 23:5bae - ret ; 23:5baf - -Function8dbb0: ; 8dbb0 - call DeinitializeSprite ; 23:5bb0 - ret ; 23:5bb3 - -Function8dbb4: ; 8dbb4 - ld hl, $5 ; 23:5bb4 - add hl, bc ; 23:5bb7 - ld a, [hl] ; 23:5bb8 - cp $54 ; 23:5bb9 - ret z ; 23:5bbb - ld hl, $5 ; 23:5bbc - add hl, bc ; 23:5bbf - inc [hl] ; 23:5bc0 - inc [hl] ; 23:5bc1 - ld hl, $f ; 23:5bc2 - add hl, bc ; 23:5bc5 - ld a, [hl] ; 23:5bc6 - ld d, a ; 23:5bc7 - and a ; 23:5bc8 - jr z, .asm_8dbce ; 23:5bc9 - sub a, $2 ; 23:5bcb - ld [hl], a ; 23:5bcd + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + add [hl] + ld [hl], a + ret + +.asm_8d968 + ld a, 1 + ld [wce64], a + call DeinitializeSprite + ret + +.GSIntroSparkle + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hli] + or [hl] + jr z, .asm_8d9cc + + ld hl, SPRITEANIMSTRUCT_0F + add hl, bc + ld d, [hl] + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + add hl, de + ld e, l + ld d, h + + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld [hl], e + inc hl + ld [hl], d + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld de, -$10 + add hl, de + ld e, l + ld d, h + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], e + inc hl + ld [hl], d + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + xor $20 + ld [hl], a + ret + +.asm_8d9cc + call DeinitializeSprite + ret + +.SlotsGolem: + callfar Slots_AnimateGolem + ret + +.SlotsChansey: + callfar Slots_AnimateChansey + ld hl, wce64 + ld a, [hl] + cp 2 + ret nz + ld [hl], 3 + ld a, SPRITE_ANIM_FRAMESET_SLOTS_CHANSEY_2 + call _ReinitSpriteAnimFrame + ret + +.SlotsChanseyEgg: + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + dec [hl] + ld e, a + and 1 + jr z, .move_vertical + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp 15 * 8 + jr c, .move_right + call DeinitializeSprite + ld a, 4 + ld [wce64], a + ld de, SFX_PLACE_PUZZLE_PIECE_DOWN + call PlaySFX + ret + +.move_right + inc [hl] +.move_vertical + ld a, e + ld d, $20 + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.UnusedCursor + callfar ret_e0908 + ret + +.PokegearArrow + callfar AnimatePokegearModeIndicatorArrow + ret + +.DummyGameCursor + callfar DummyGame_InterpretJoypad_AnimateCursor + ret + +.TradePokeBall + call .AnonymousJumptable + jp hl + +; Anonymous dw (see .AnonymousJumptable) + dw .TradePokeBall_zero + dw .TradePokeBall_one + dw .TradePokeBall_two + dw .TradePokeBall_three + dw .TradePokeBall_four + dw .TradePokeBall_five + +.TradePokeBall_zero + ld a, SPRITE_ANIM_FRAMESET_TRADE_POKE_BALL_WOBBLE + call _ReinitSpriteAnimFrame + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], $2 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $20 + ret + +.TradePokeBall_two + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .asm_8da5d + dec [hl] + ret + +.asm_8da5d + call .IncrementJumptableIndex + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $40 + +.TradePokeBall_three + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $30 + jr c, .asm_8da7b + dec [hl] + ld d, $28 + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.asm_8da7b + ld de, SFX_GOT_SAFARI_BALLS + call PlaySFX + jr .TradePokeBall_five + +.TradePokeBall_one + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], $4 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $30 + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $24 + ret + +.TradePokeBall_four + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and a + jr z, .asm_8daca + ld d, a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + call Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + inc [hl] + ld a, [hl] + and $3f + ret nz + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $20 + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + sub $c + ld [hl], a + ld de, SFX_SWITCH_POKEMON + call PlaySFX + ret + +.asm_8daca + xor a + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + call .IncrementJumptableIndex + ret + +.TradePokeBall_five + call DeinitializeSprite + ret + +.TradeTubeBulge + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + inc [hl] + cp $b0 + jr nc, .delete + and $3 + ret nz + ld de, SFX_POKEBALLS_PLACED_ON_TABLE + call PlaySFX + ret + +.delete + call DeinitializeSprite + ret + +.TrademonInTube + callfar TradeAnim_AnimateTrademonInTube + ret + +.RevealNewMon: + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $80 + jr nc, .finish_EggShell + ld d, a + add $8 + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + xor $20 + ld [hl], a + + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.finish_EggShell + call DeinitializeSprite + ret + +.RadioTuningKnob: + callfar AnimateTuningKnob + ret + +.CutLeaves + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + ld hl, $80 + add hl, de + ld e, l + ld d, h + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], e + inc hl + ld [hl], d + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + inc [hl] + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.FlyFrom: + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + and a + ret z + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + inc [hl] + cp $40 + ret c + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + dec [hl] + + ld hl, SPRITEANIMSTRUCT_0F + add hl, bc + ld a, [hl] + ld d, a + cp $40 + jr nc, .skip + add $8 + ld [hl], a +.skip + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld a, [hl] + inc [hl] + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.FlyLeaf: + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp -9 * 8 + jr nc, .delete_leaf + inc [hl] + inc [hl] + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + + ld d, $40 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc [hl] + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.delete_leaf + call DeinitializeSprite + ret + +.FlyTo: + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + cp 10 * 8 + 4 + ret z + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + inc [hl] + inc [hl] + + ld hl, SPRITEANIMSTRUCT_0F + add hl, bc + ld a, [hl] + ld d, a + and a + jr z, .asm_8dbce + sub 2 + ld [hl], a .asm_8dbce - ld hl, $e ; 23:5bce - add hl, bc ; 23:5bd1 - ld a, [hl] ; 23:5bd2 - inc [hl] ; 23:5bd3 - call Function8dbfa ; 23:5bd4 - ld hl, $6 ; 23:5bd7 - add hl, bc ; 23:5bda - ld [hl], a ; 23:5bdb - ret ; 23:5bdc - -Function8dbdd: ; 8dbdd - ld hl, [sp+$0] ; 23:5bdd - ld e, [hl] ; 23:5bdf - inc hl ; 23:5be0 - ld d, [hl] ; 23:5be1 - inc de ; 23:5be2 - ld hl, $b ; 23:5be3 - add hl, bc ; 23:5be6 - ld l, [hl] ; 23:5be7 - ld h, $0 ; 23:5be8 - add hl, hl ; 23:5bea - add hl, de ; 23:5beb - ld a, [hli] ; 23:5bec - ld h, [hl] ; 23:5bed - ld l, a ; 23:5bee - ret ; 23:5bef - -Function8dbf0: ; 8dbf0 - ld hl, $b ; 23:5bf0 - add hl, bc ; 23:5bf3 - inc [hl] ; 23:5bf4 - ret ; 23:5bf5 - -Function8dbf6: ; 8dbf6 - call Sprites_Sine ; 23:5bf6 - ret ; 23:5bf9 - -Function8dbfa: ; 8dbfa - call Sprites_Cosine ; 23:5bfa - ret ; 23:5bfd + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld a, [hl] + inc [hl] + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.AnonymousJumptable: + ld hl, sp+$0 + ld e, [hl] + inc hl + ld d, [hl] + inc de + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld l, [hl] + ld h, 0 + add hl, hl + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +.IncrementJumptableIndex: + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ret + +.Sprites_Sine: + call Sprites_Sine + ret + +.Sprites_Cosine: + call Sprites_Cosine + ret diff --git a/engine/gfx/sprites.asm b/engine/gfx/sprites.asm index b9267d66..824ceac4 100755 --- a/engine/gfx/sprites.asm +++ b/engine/gfx/sprites.asm @@ -1,645 +1,639 @@ -ClearAnimatedObjects: ; 8d174 - ld hl, $c508 ; 23:5174 - ld bc, $c1 ; 23:5177 +ClearSpriteAnims: + ld hl, wSpriteAnimDict + ld bc, wSpriteAnimsEnd - wSpriteAnimDict .loop - ld [hl], $0 ; 23:517a - inc hl ; 23:517c - dec bc ; 23:517d - ld a, c ; 23:517e - or b ; 23:517f - jr nz, .loop ; 23:5180 - ret ; 23:5182 - -PlayAnimatedObjectationsAndDelayFrame: ; 8d182 - call PlayAnimatedObjectations ; 23:5183 - call $32e ; DelayFrame ; 23:5186 - ret ; 23:5189 - -PlayAnimatedObjectations: ; 8d189 - push hl ; 23:518a - push de ; 23:518b - push bc ; 23:518c - push af ; 23:518d - - ld a, $0 ; 23:518e - ld [$c5bd], a ; 23:5190 - call DoNextFrameForAllSprites ; 23:5193 - - pop af ; 23:5196 - pop bc ; 23:5197 - pop de ; 23:5198 - pop hl ; 23:5199 - ret ; 23:519a - -DoNextFrameForAllSprites: ; 8d19b - ld hl, $c51c ; 23:519b - ld e, $a ; 23:519e + ld [hl], 0 + inc hl + dec bc + ld a, c + or b + jr nz, .loop + ret + +PlaySpriteAnimationsAndDelayFrame: + call PlaySpriteAnimations + call DelayFrame + ret + +PlaySpriteAnimations: + push hl + push de + push bc + push af + + ld a, LOW(wVirtualOAM) + ld [wCurSpriteOAMAddr], a + call DoNextFrameForAllSprites + + pop af + pop bc + pop de + pop hl + ret + +DoNextFrameForAllSprites: + ld hl, wSpriteAnimationStructs + ld e, NUM_SPRITE_ANIM_STRUCTS + .loop - ld a, [hl] ; 23:51a0 - and a ; 23:51a1 - jr z, .skip_capacity_check ; 23:51a2 - ld c, l ; 23:51a4 - ld b, h ; 23:51a5 - push hl ; 23:51a6 - push de ; 23:51a7 - call DoAnimFrame ; 23:51a8 - call UpdateAnimFrame ; 23:51ab - pop de ; 23:51ae - pop hl ; 23:51af - jr c, .cancel ; 23:51b0 -.skip_capacity_check - ld bc, $10 ; 23:51b2 - add hl, bc ; 23:51b5 - dec e ; 23:51b6 - jr nz, .loop ; 23:51b7 - ld a, [$c5bd] ; 23:51b9 - ld l, a ; 23:51bc - ld h, $c3 ; 23:51bd -.loop2 - ld a, l ; 23:51bf - cp $a0 ; 23:51c0 - jr nc, .cancel ; 23:51c2 - xor a ; 23:51c4 - ld [hli], a ; 23:51c5 - jr .loop2 ; 23:51c6 - -.cancel - ret ; 23:51c8 - -DoNextFrameForFirst16Sprites: ; 8d1c9 - ld hl, $c51c ; 23:51c9 - ld e, $a ; 23:51cc + ld a, [hl] + and a + jr z, .next ; This struct is deinitialized. + ld c, l + ld b, h + push hl + push de + call DoAnimFrame ; Uses a massive dw + call UpdateAnimFrame + pop de + pop hl + jr c, .done + +.next + ld bc, SPRITEANIMSTRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop + + ld a, [wCurSpriteOAMAddr] + ld l, a + ld h, HIGH(wVirtualOAM) + +.loop2 ; Clear (wVirtualOAM + [wCurSpriteOAMAddr] --> wVirtualOAMEnd) + ld a, l + cp LOW(wVirtualOAMEnd) + jr nc, .done + xor a + ld [hli], a + jr .loop2 + +.done + ret + +DoNextFrameForFirst16Sprites: + ld hl, wSpriteAnimationStructs + ld e, NUM_SPRITE_ANIM_STRUCTS + .loop - ld a, [hl] ; 23:51ce - and a ; 23:51cf - jr z, .skip_capacity_check ; 23:51d0 - ld c, l ; 23:51d2 - ld b, h ; 23:51d3 - push hl ; 23:51d4 - push de ; 23:51d5 - call DoAnimFrame ; 23:51d6 - call UpdateAnimFrame ; 23:51d9 - pop de ; 23:51dc - pop hl ; 23:51dd - jr c, .cancel ; 23:51de -.skip_capacity_check - ld bc, $10 ; 23:51e0 - add hl, bc ; 23:51e3 - dec e ; 23:51e4 - jr nz, .loop ; 23:51e5 - ld a, [$c5bd] ; 23:51e7 - ld l, a ; 23:51ea - ld h, $c3 ; 23:51eb -.loop2 - ld a, l ; 23:51ed - cp $40 ; 23:51ee - jr nc, .cancel ; 23:51f0 - xor a ; 23:51f2 - ld [hli], a ; 23:51f3 - jr .loop2 ; 23:51f4 - -.cancel - ret ; 23:51f6 - -_InitSpriteAnimStruct:: ; 8d1f7 - push de ; 23:51f7 - push af ; 23:51f8 - ld hl, $c51c ; 23:51f9 - ld e, $a ; 23:51fc + ld a, [hl] + and a + jr z, .next + ld c, l + ld b, h + push hl + push de + call DoAnimFrame ; Uses a massive dw + call UpdateAnimFrame + pop de + pop hl + jr c, .done + +.next + ld bc, SPRITEANIMSTRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop + + ld a, [wCurSpriteOAMAddr] + ld l, a + ld h, HIGH(wVirtualOAMSprite16) + +.loop2 ; Clear (wVirtualOAM + [wCurSpriteOAMAddr] --> Sprites + $40) + ld a, l + cp LOW(wVirtualOAMSprite16) + jr nc, .done + xor a + ld [hli], a + jr .loop2 + +.done + ret + +_InitSpriteAnimStruct:: +; Initialize animation a at pixel x=e, y=d +; Find if there's any room in the wSpriteAnimationStructs array, which is 10x16 + push de + push af + ld hl, wSpriteAnimationStructs + ld e, NUM_SPRITE_ANIM_STRUCTS .loop - ld a, [hl] ; 23:51fe - and a ; 23:51ff - jr z, .found ; 23:5200 - ld bc, $10 ; 23:5202 - add hl, bc ; 23:5205 - dec e ; 23:5206 - jr nz, .loop ; 23:5207 - pop af ; 23:5209 - pop de ; 23:520a - scf ; 23:520b - ret ; 23:520c - -.found ; 8d20d - ld c, l ; 23:520d - ld b, h ; 23:520e - ld hl, $c5bc ; 23:520f - inc [hl] ; 23:5212 - ld a, [hl] ; 23:5213 - and a ; 23:5214 - jr nz, .initialized ; 23:5215 - inc [hl] ; 23:5217 + ld a, [hl] + and a + jr z, .found + ld bc, SPRITEANIMSTRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop +; We've reached the end. There is no more room here. +; Return carry. + pop af + pop de + scf + ret + +.found +; Back up the structure address to bc. + ld c, l + ld b, h +; Value [wSpriteAnimCount] is initially set to -1. Set it to +; the number of objects loaded into this array. + ld hl, wSpriteAnimCount + inc [hl] + ld a, [hl] + and a + jr nz, .initialized + inc [hl] + .initialized - pop af ; 23:5218 - ld e, a ; 23:5219 - ld d, $0 ; 23:521a - ld hl, AnimatedObjectSeqData ; 23:521c - add hl, de ; 23:521f - add hl, de ; 23:5220 - add hl, de ; 23:5221 - ld e, l ; 23:5222 - ld d, h ; 23:5223 - ld hl, $0 ; 23:5224 - add hl, bc ; 23:5227 - ld a, [$c5bc] ; 23:5228 - ld [hli], a ; 23:522b - ld a, [de] ; 23:522c - ld [hli], a ; 23:522d - inc de ; 23:522e - ld a, [de] ; 23:522f - ld [hli], a ; 23:5230 - inc de ; 23:5231 - ld a, [de] ; 23:5232 - call GetAnimatedObjectVTile ; 23:5233 - ld [hli], a ; 23:5236 - pop de ; 23:5237 - ld hl, $4 ; 23:5238 - add hl, bc ; 23:523b - ld a, e ; 23:523c - ld [hli], a ; 23:523d - ld a, d ; 23:523e - ld [hli], a ; 23:523f - xor a ; 23:5240 - ld [hli], a ; 23:5241 - ld [hli], a ; 23:5242 - xor a ; 23:5243 - ld [hli], a ; 23:5244 - ld [hli], a ; 23:5245 - dec a ; 23:5246 - ld [hli], a ; 23:5247 - xor a ; 23:5248 - ld [hli], a ; 23:5249 - ld [hli], a ; 23:524a - ld [hli], a ; 23:524b - ld [hli], a ; 23:524c - ld [hl], a ; 23:524d - ld a, c ; 23:524e - ld [$c5c0], a ; 23:524f - ld a, b ; 23:5252 - ld [$c5c1], a ; 23:5253 - ret ; 23:5256 - -DeinitializeSprite: ; 8d257 - ld hl, $0 ; 23:5257 - add hl, bc ; 23:525a - ld [hl], $0 ; 23:525b - ret ; 23:525d - -UpdateAnimFrame: ; 8d25e - call InitAnimatedObjectBuffer ; 23:525e - call GetAnimatedObjectFrame ; 23:5261 - cp $fd ; 23:5264 - jr z, .done ; 23:5266 - cp $fc ; 23:5268 - jr z, .delete ; 23:526a - call GetFrameOAMPointer ; 23:526c - ld a, [$c5c2] ; 23:526f - add [hl] ; 23:5272 - ld [$c5c2], a ; 23:5273 - inc hl ; 23:5276 - ld a, [hli] ; 23:5277 - ld h, [hl] ; 23:5278 - ld l, a ; 23:5279 - push bc ; 23:527a - ld a, [$c5bd] ; 23:527b - ld e, a ; 23:527e - ld d, $c3 ; 23:527f - ld a, [hli] ; 23:5281 - ld c, a ; 23:5282 +; Get row a of SpriteAnimSeqData, copy the pointer into de + pop af + ld e, a + ld d, 0 + ld hl, SpriteAnimSeqData + add hl, de + add hl, de + add hl, de + ld e, l + ld d, h +; Set hl to the first field (field 0) in the current structure. + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc +; Load the index. + ld a, [wSpriteAnimCount] + ld [hli], a +; Copy the table entry to the next two fields. + ld a, [de] + ld [hli], a + inc de + ld a, [de] + ld [hli], a + inc de +; Look up the third field from the table in the wSpriteAnimDict array (10x2). +; Take the value and load it in + ld a, [de] + call GetSpriteAnimVTile + ld [hli], a + pop de +; Set hl to field 4 (X coordinate). Kinda pointless, because we're presumably already here. + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc +; Load the original value of de into here. + ld a, e + ld [hli], a + ld a, d + ld [hli], a +; load 0 into the next four fields + xor a + ld [hli], a + ld [hli], a + xor a + ld [hli], a + ld [hli], a +; load -1 into the next field + dec a + ld [hli], a +; load 0 into the last five fields + xor a +rept 4 + ld [hli], a +endr + ld [hl], a +; back up the address of the first field to wSpriteAnimAddrBackup + ld a, c + ld [wSpriteAnimAddrBackup], a + ld a, b + ld [wSpriteAnimAddrBackup + 1], a + ret + +DeinitializeSprite: +; Clear the index field of the struct in bc. + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld [hl], 0 + ret + +UpdateAnimFrame: + call InitSpriteAnimBuffer ; init WRAM + call GetSpriteAnimFrame ; read from a memory array + cp -3 + jr z, .done + cp -4 + jr z, .delete + call GetFrameOAMPointer + ; add byte to [wCurAnimVTile] + ld a, [wCurAnimVTile] + add [hl] + ld [wCurAnimVTile], a + inc hl + ; load pointer into hl + ld a, [hli] + ld h, [hl] + ld l, a + push bc + ld a, [wCurSpriteOAMAddr] + ld e, a + ld d, HIGH(wVirtualOAM) + ld a, [hli] + ld c, a ; number of objects .loop - ld a, [$c5c4] ; 23:5283 - ld b, a ; 23:5286 - ld a, [$c5c6] ; 23:5287 - add b ; 23:528a - ld b, a ; 23:528b - ld a, [$c5c7] ; 23:528c - add b ; 23:528f - ld b, a ; 23:5290 - call AddOrSubtractX ; 23:5291 - add b ; 23:5294 - ld [de], a ; 23:5295 - inc hl ; 23:5296 - inc de ; 23:5297 - ld a, [$c5c3] ; 23:5298 - ld b, a ; 23:529b - ld a, [$c5c5] ; 23:529c - add b ; 23:529f - ld b, a ; 23:52a0 - ld a, [$c5c8] ; 23:52a1 - add b ; 23:52a4 - ld b, a ; 23:52a5 - call AddOrSubtractY ; 23:52a6 - add b ; 23:52a9 - ld [de], a ; 23:52aa - inc hl ; 23:52ab - inc de ; 23:52ac - ld a, [$c5c2] ; 23:52ad - add [hl] ; 23:52b0 - ld [de], a ; 23:52b1 - inc hl ; 23:52b2 - inc de ; 23:52b3 - call GetSpriteOAMAttr ; 23:52b4 - ld [de], a ; 23:52b7 - inc hl ; 23:52b8 - inc de ; 23:52b9 - ld a, e ; 23:52ba - ld [$c5bd], a ; 23:52bb - cp $a0 ; 23:52be - jr nc, reached_the_end ; 23:52c0 - dec c ; 23:52c2 - jr nz, .loop ; 23:52c3 - pop bc ; 23:52c5 - jr .done ; 23:52c6 + ; first byte: y (px) + ; [de] = [wCurAnimYCoord] + [wCurAnimYOffset] + [wGlobalAnimYOffset] + AddOrSubtractY([hl]) + ld a, [wCurAnimYCoord] + ld b, a + ld a, [wCurAnimYOffset] + add b + ld b, a + ld a, [wGlobalAnimYOffset] + add b + ld b, a + call AddOrSubtractY + add b + ld [de], a + inc hl + inc de + ; second byte: x (px) + ; [de] = [wCurAnimXCoord] + [wCurAnimXOffset] + [wGlobalAnimXOffset] + AddOrSubtractX([hl]) + ld a, [wCurAnimXCoord] + ld b, a + ld a, [wCurAnimXOffset] + add b + ld b, a + ld a, [wGlobalAnimXOffset] + add b + ld b, a + call AddOrSubtractX + add b + ld [de], a + inc hl + inc de + ; third byte: vtile + ; [de] = [wCurAnimVTile] + [hl] + ld a, [wCurAnimVTile] + add [hl] + ld [de], a + inc hl + inc de + ; fourth byte: attributes + ; [de] = GetSpriteOAMAttr([hl]) + call GetSpriteOAMAttr + ld [de], a + inc hl + inc de + ld a, e + ld [wCurSpriteOAMAddr], a + cp LOW(wVirtualOAMEnd) + jr nc, .reached_the_end + dec c + jr nz, .loop + pop bc + jr .done .delete - call DeinitializeSprite ; 23:52c8 + call DeinitializeSprite .done - and a ; 23:52cb - ret ; 23:52cc - -reached_the_end - pop bc ; 23:52cd - scf ; 23:52ce - ret ; 23:52cf - -AddOrSubtractX: ; 8d2d0 - push hl ; 23:52d0 - ld a, [hl] ; 23:52d1 - ld hl, $c5c0 ; 23:52d2 - bit 6, [hl] ; 23:52d5 - jr z, .ok ; 23:52d7 - add a, $8 ; 23:52d9 - xor $ff ; 23:52db - inc a ; 23:52dd + and a + ret + +.reached_the_end + pop bc + scf + ret + +AddOrSubtractY: + push hl + ld a, [hl] + ld hl, wCurSpriteOAMFlags + bit OAM_Y_FLIP, [hl] + jr z, .ok + ; -8 - a + add $8 + xor $ff + inc a + .ok - pop hl ; 23:52de - ret ; 23:52df - -AddOrSubtractY: ; 8d2e0 - push hl ; 23:52e0 - ld a, [hl] ; 23:52e1 - ld hl, $c5c0 ; 23:52e2 - bit 5, [hl] ; 23:52e5 - jr z, .ok ; 23:52e7 - add a, $8 ; 23:52e9 - xor $ff ; 23:52eb - inc a ; 23:52ed + pop hl + ret + +AddOrSubtractX: + push hl + ld a, [hl] + ld hl, wCurSpriteOAMFlags + bit OAM_X_FLIP, [hl] + jr z, .ok + ; -8 - a + add 8 + xor $ff + inc a + .ok - pop hl ; 23:52ee - ret ; 23:52ef - -GetSpriteOAMAttr: ; 8d2f0 - ld a, [$c5c0] ; 23:52f0 - ld b, a ; 23:52f3 - ld a, [hl] ; 23:52f4 - xor b ; 23:52f5 - and $e0 ; 23:52f6 - ld b, a ; 23:52f8 - ld a, [hl] ; 23:52f9 - and $1f ; 23:52fa - or b ; 23:52fc - ret ; 23:52fd - -InitAnimatedObjectBuffer: ; 8d2fe - xor a ; 23:52fe - ld [$c5c0], a ; 23:52ff - ld hl, $3 ; 23:5302 - add hl, bc ; 23:5305 - ld a, [hli] ; 23:5306 - ld [$c5c2], a ; 23:5307 - ld a, [hli] ; 23:530a - ld [$c5c3], a ; 23:530b - ld a, [hli] ; 23:530e - ld [$c5c4], a ; 23:530f - ld a, [hli] ; 23:5312 - ld [$c5c5], a ; 23:5313 - ld a, [hli] ; 23:5316 - ld [$c5c6], a ; 23:5317 - ret ; 23:531a - -GetAnimatedObjectVTile: ; 8d31b - push hl ; 23:531b - push bc ; 23:531c - ld hl, $c508 ; 23:531d - ld b, a ; 23:5320 - ld c, $a ; 23:5321 + pop hl + ret + +GetSpriteOAMAttr: + ld a, [wCurSpriteOAMFlags] + ld b, a + ld a, [hl] + xor b + and PRIORITY | Y_FLIP | X_FLIP + ld b, a + ld a, [hl] + and $ff ^ (PRIORITY | Y_FLIP | X_FLIP) + or b + ret + +InitSpriteAnimBuffer: + xor a + ld [wCurSpriteOAMFlags], a + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld a, [hli] + ld [wCurAnimVTile], a + ld a, [hli] + ld [wCurAnimXCoord], a + ld a, [hli] + ld [wCurAnimYCoord], a + ld a, [hli] + ld [wCurAnimXOffset], a + ld a, [hli] + ld [wCurAnimYOffset], a + ret + +GetSpriteAnimVTile: +; a = wSpriteAnimDict[a] if a in wSpriteAnimDict else 0 +; vTiles offset + push hl + push bc + ld hl, wSpriteAnimDict + ld b, a + ld c, NUM_SPRITE_ANIM_STRUCTS .loop - ld a, [hli] ; 23:5323 - cp b ; 23:5324 - jr z, .ok ; 23:5325 - inc hl ; 23:5327 - dec c ; 23:5328 - jr nz, .loop ; 23:5329 - xor a ; 23:532b - jr .done ; 23:532c + ld a, [hli] + cp b + jr z, .ok + inc hl + dec c + jr nz, .loop + xor a + jr .done .ok - ld a, [hl] ; 23:532e + ld a, [hl] + .done - pop bc ; 23:532f - pop hl ; 23:5330 - ret ; 23:5331 - -Function8d332: ; 8d332 - ld hl, $1 ; 23:5332 - add hl, bc ; 23:5335 - ld [hl], a ; 23:5336 - ld hl, $8 ; 23:5337 - add hl, bc ; 23:533a - ld [hl], $0 ; 23:533b - ld hl, $a ; 23:533d - add hl, bc ; 23:5340 - ld [hl], $ff ; 23:5341 - ret ; 23:5343 - -GetAnimatedObjectFrame: ; 8d344 + pop bc + pop hl + ret + +_ReinitSpriteAnimFrame:: + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], a + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld [hl], 0 + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + ld [hl], -1 + ret + +GetSpriteAnimFrame: .loop - ld hl, $8 ; 23:5344 - add hl, bc ; 23:5347 - ld a, [hl] ; 23:5348 - and a ; 23:5349 - jr z, .next_frame ; 23:534a - dec [hl] ; 23:534c - call .GetPointer ; 23:534d - ld a, [hli] ; 23:5350 - push af ; 23:5351 - jr .okay ; 23:5352 + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld a, [hl] + and a + jr z, .next_frame ; finished the current sequence + dec [hl] + call .GetPointer ; load pointer from SpriteAnimFrameData + ld a, [hli] + push af + jr .okay .next_frame - ld hl, $a ; 23:5354 - add hl, bc ; 23:5357 - inc [hl] ; 23:5358 - call .GetPointer ; 23:5359 - ld a, [hli] ; 23:535c - cp $fe ; 23:535d - jr z, .restart ; 23:535f - cp $ff ; 23:5361 - jr z, .repeat_last ; 23:5363 - push af ; 23:5365 - ld a, [hl] ; 23:5366 - push hl ; 23:5367 - and $3f ; 23:5368 - ld hl, $9 ; 23:536a - add hl, bc ; 23:536d - add [hl] ; 23:536e - ld hl, $8 ; 23:536f - add hl, bc ; 23:5372 - ld [hl], a ; 23:5373 - pop hl ; 23:5374 + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + inc [hl] + call .GetPointer ; load pointer from SpriteAnimFrameData + ld a, [hli] + cp dorestart_command + jr z, .restart + cp endanim_command + jr z, .repeat_last + + push af + ld a, [hl] + push hl + and $ff ^ (Y_FLIP << 1 | X_FLIP << 1) + ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET + add hl, bc + add [hl] + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld [hl], a + pop hl .okay - ld a, [hl] ; 23:5375 - and $c0 ; 23:5376 - srl a ; 23:5378 - ld [$c5c0], a ; 23:537a - pop af ; 23:537d - ret ; 23:537e - -.repeat_last ; 8d37f - xor a ; 23:537f - ld hl, $8 ; 23:5380 - add hl, bc ; 23:5383 - ld [hl], a ; 23:5384 - ld hl, $a ; 23:5385 - add hl, bc ; 23:5388 - dec [hl] ; 23:5389 - dec [hl] ; 23:538a - jr .loop ; 23:538b + ld a, [hl] + and Y_FLIP << 1 | X_FLIP << 1 ; The << 1 is compensated in the "frame" macro + srl a + ld [wCurSpriteOAMFlags], a + pop af + ret + +.repeat_last + xor a + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + dec [hl] + dec [hl] + jr .loop .restart - xor a ; 23:538d - ld hl, $8 ; 23:538e - add hl, bc ; 23:5391 - ld [hl], a ; 23:5392 - dec a ; 23:5393 - ld hl, $a ; 23:5394 - add hl, bc ; 23:5397 - ld [hl], a ; 23:5398 - jr .loop ; 23:5399 - -.GetPointer - ld hl, $1 ; 23:539b - add hl, bc ; 23:539e - ld e, [hl] ; 23:539f - ld d, $0 ; 23:53a0 - ld hl, AnimatedObjectFrameData ; 23:53a2 - add hl, de ; 23:53a5 - add hl, de ; 23:53a6 - ld e, [hl] ; 23:53a7 - inc hl ; 23:53a8 - ld d, [hl] ; 23:53a9 - ld hl, $a ; 23:53aa - add hl, bc ; 23:53ad - ld l, [hl] ; 23:53ae - ld h, $0 ; 23:53af - add hl, hl ; 23:53b1 - add hl, de ; 23:53b2 - ret ; 23:53b3 - -GetFrameOAMPointer: ; 8d3b4 - ld e, a ; 23:53b4 - ld d, $0 ; 23:53b5 - ld hl, AnimatedObjectOAMData ; 23:53b7 - add hl, de ; 23:53ba - add hl, de ; 23:53bb - add hl, de ; 23:53bc - ret ; 23:53bd - -BrokenGetStdGraphics: ; 8d3be - push hl ; 23:53be - ld l, a ; 23:53bf - ld h, $0 ; 23:53c0 - add hl, hl ; 23:53c2 - add hl, hl ; 23:53c3 - ld de, $6666 ; 23:53c4 - add hl, de ; 23:53c7 - ld c, [hl] ; 23:53c8 - inc hl ; 23:53c9 - ld b, [hl] ; 23:53ca - inc hl ; 23:53cb - ld e, [hl] ; 23:53cc - inc hl ; 23:53cd - ld d, [hl] ; 23:53ce - pop hl ; 23:53cf - push bc ; 23:53d0 - call $dfe ; Request2bpp ; 23:53d1 - pop bc ; 23:53d4 - ret ; 23:53d5 - -AnimatedObjectSeqData: ; 8d3d6 - db $01, $01, $00 - db $04, $04, $00 - db $05, $05, $00 - db $06, $06, $00 - db $07, $07, $00 - db $08, $08, $00 - db $09, $09, $01 - db $0a, $09, $01 - db $0b, $0a, $01 - db $0d, $0b, $01 - db $10, $0c, $01 - db $12, $0d, $02 - db $13, $0e, $02 - db $14, $0f, $02 - db $15, $0e, $02 - db $16, $10, $00 - db $0d, $11, $01 - db $10, $12, $01 - db $09, $13, $01 - db $0b, $14, $01 - db $1a, $15, $05 - db $1c, $16, $06 - db $1d, $17, $06 - db $1e, $18, $06 - db $1f, $19, $07 - db $20, $1a, $07 - db $22, $1b, $07 - db $1a, $1c, $05 - db $23, $00, $00 - db $24, $1d, $08 - db $24, $1e, $08 - db $24, $1f, $08 - db $25, $20, $00 - db $27, $00, $00 - db $28, $21, $00 - db $29, $22, $00 - db $2a, $22, $00 - db $2b, $23, $00 - db $2c, $24, $00 - db $2d, $00, $00 - db $2f, $25, $00 - db $30, $00, $00 - db $2f, $27, $00 - db $31, $00, $00 - db $36, $29, $00 - db $37, $00, $00 - db $32, $23, $00 - -INCLUDE "engine/sprite_anims.asm" -INCLUDE "data/sprite_engine.asm" + xor a + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld [hl], a + + dec a + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + ld [hl], a + jr .loop + +.GetPointer: + ; Get the data for the current frame for the current animation sequence + + ; SpriteAnimFrameData[SpriteAnim[SPRITEANIMSTRUCT_FRAMESET_ID]][SpriteAnim[SPRITEANIMSTRUCT_FRAME]] + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, SpriteAnimFrameData + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + ld l, [hl] + ld h, 0 + add hl, hl + add hl, de + ret + +GetFrameOAMPointer: +; Load OAM data pointer + ld e, a + ld d, 0 + ld hl, SpriteAnimOAMData + add hl, de + add hl, de + add hl, de + ret + +Unreferenced_BrokenGetStdGraphics: + push hl + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld de, BrokenStdGFXPointers ; broken 2bpp pointers + add hl, de + ld c, [hl] + inc hl + ld b, [hl] + inc hl + ld e, [hl] + inc hl + ld d, [hl] + pop hl + push bc + call Request2bpp + pop bc + ret + +INCLUDE "data/sprite_anims/sequences.asm" + +INCLUDE "engine/gfx/sprite_anims.asm" + +INCLUDE "data/sprite_anims/framesets.asm" + +INCLUDE "data/sprite_anims/oam.asm" + +BrokenStdGFXPointers: + ; tile count, bank, pointer + ; (all pointers were dummied out to .deleted) + dbbw 128, $01, .deleted + dbbw 128, $01, .deleted + dbbw 128, $01, .deleted + dbbw 128, $01, .deleted + dbbw 16, $37, .deleted + dbbw 16, $11, .deleted + dbbw 16, $39, .deleted + dbbw 16, $24, .deleted + dbbw 16, $21, .deleted + +.deleted Sprites_Cosine: - add a, $10 ; 23:668a +; a = d * cos(a * pi/32) + add %010000 ; cos(x) = sin(x + pi/2) + ; fallthrough Sprites_Sine: - and $3f ; 23:668c - cp $20 ; 23:668e - jr nc, .negative ; 23:6690 - call .ApplySineWave ; 23:6692 - ld a, h ; 23:6695 - ret ; 23:6696 - -.negative - and $1f ; 23:6697 - call .ApplySineWave ; 23:6699 - ld a, h ; 23:669c - xor $ff ; 23:669d - inc a ; 23:669f - ret ; 23:66a0 - -.ApplySineWave: - ld e, a ; 23:66a1 - ld a, d ; 23:66a2 - ld d, $0 ; 23:66a3 - ld hl, .sinewave ; 23:66a5 - add hl, de ; 23:66a8 - add hl, de ; 23:66a9 - ld e, [hl] ; 23:66aa - inc hl ; 23:66ab - ld d, [hl] ; 23:66ac - ld hl, $0 ; 23:66ad -.multiply - srl a ; 23:66b0 - jr nc, .even ; 23:66b2 - add hl, de ; 23:66b4 -.even - sla e ; 23:66b5 - rl d ; 23:66b7 - and a ; 23:66b9 - jr nz, .multiply ; 23:66ba - ret ; 23:66bc - -.sinewave ; 8e75d - sine_wave $100 +; a = d * sin(a * pi/32) + calc_sine_wave .SineWave + +.SineWave: + sine_table 256 AnimateEndOfExpBar: - ldh a, [$ffe9] ; 23:66fd - ld de, EndOfExpBarGFX ; 23:66ff - and a ; 23:6702 - jr z, .got_gfx ; 23:6703 - ld de, SGBEndOfExpBarGFX ; 23:6705 -.got_gfx - ld hl, VTiles0 tile $00 ; 23:6708 - lb bc, BANK(EndOfExpBarGFX), 1 ; 23:670b - call $dfe ; Request2bpp ; 23:670e - ld c, $8 ; 23:6711 - ld d, $0 ; 23:6713 + ldh a, [hSGB] + ld de, EndOfExpBarGFX + and a + jr z, .load + ld de, SGBEndOfExpBarGFX + +.load + ld hl, vTiles0 tile $00 + lb bc, BANK(EndOfExpBarGFX), 1 + call Request2bpp + ld c, 8 + ld d, 0 .loop - push bc ; 23:6715 - call .AnimateFrame ; 23:6716 - call $32e ; DelayFrame ; 23:6719 - pop bc ; 23:671c - inc d ; 23:671d - inc d ; 23:671e - dec c ; 23:671f - jr nz, .loop ; 23:6720 - call $30ff ; ClearSprites ; 23:6722 - ret ; 23:6725 - -.AnimateFrame - ld hl, $c300 ; 23:6726 - ld c, $8 ; 23:6729 + push bc + call .AnimateFrame + call DelayFrame + pop bc + inc d + inc d + dec c + jr nz, .loop + call ClearSprites + ret + +.AnimateFrame: + ld hl, wVirtualOAMSprite00 + ld c, 8 ; number of animated circles .anim_loop - ld a, c ; 23:672b - and a ; 23:672c - ret z ; 23:672d - dec c ; 23:672e - ld a, c ; 23:672f - sla a ; 23:6730 - sla a ; 23:6732 - sla a ; 23:6734 - push af ; 23:6736 - push de ; 23:6737 - push hl ; 23:6738 - call Sprites_Sine ; 23:6739 - pop hl ; 23:673c - pop de ; 23:673d - add a, $68 ; 23:673e - ld [hli], a ; 23:6740 - pop af ; 23:6741 - push de ; 23:6742 - push hl ; 23:6743 - call Sprites_Cosine ; 23:6744 - pop hl ; 23:6747 - pop de ; 23:6748 - add a, $54 ; 23:6749 - ld [hli], a ; 23:674b - ld a, $0 ; 23:674c - ld [hli], a ; 23:674e - ld a, $6 ; 23:674f - ld [hli], a ; 23:6751 - jr .anim_loop ; 23:6752 + ld a, c + and a + ret z + dec c + ld a, c +; multiply by 8 + sla a + sla a + sla a + push af + + push de + push hl + call Sprites_Sine + pop hl + pop de + add 13 * TILE_WIDTH + ld [hli], a ; y + + pop af + push de + push hl + call Sprites_Cosine + pop hl + pop de + add 10 * TILE_WIDTH + 4 + ld [hli], a ; x + + ld a, $0 + ld [hli], a ; tile id + ld a, PAL_BATTLE_OB_BLUE + ld [hli], a ; attributes + jr .anim_loop EndOfExpBarGFX: - dr $8e754, $8e764 - +INCBIN "gfx/battle/expbarend.2bpp" SGBEndOfExpBarGFX: - dr $8e764, $8e774 - -ClearAnimatedObjects2 - push hl ; 23:6774 - push de ; 23:6775 - push bc ; 23:6776 - push af ; 23:6777 - ld hl, $c508 ; 23:6778 - ld bc, $c1 ; 23:677b +INCBIN "gfx/battle/expbarend_sgb.2bpp" + +ClearSpriteAnims2: + push hl + push de + push bc + push af + ld hl, wSpriteAnimDict + ld bc, wSpriteAnimsEnd - wSpriteAnimDict .loop - ld [hl], $0 ; 23:677e - inc hl ; 23:6780 - dec bc ; 23:6781 - ld a, c ; 23:6782 - or b ; 23:6783 - jr nz, .loop ; 23:6784 - pop af ; 23:6786 - pop bc ; 23:6787 - pop de ; 23:6788 - pop hl ; 23:6789 - ret ; 23:678a -; 8e78a + ld [hl], 0 + inc hl + dec bc + ld a, c + or b + jr nz, .loop + pop af + pop bc + pop de + pop hl + ret diff --git a/engine/menus/delete_save.asm b/engine/menus/delete_save.asm new file mode 100755 index 00000000..a3ea661d --- /dev/null +++ b/engine/menus/delete_save.asm @@ -0,0 +1,34 @@ +_DeleteSaveData: + call ClearTilemap + call GetMemSGBLayout + call LoadStandardFont + call LoadFontsExtra + ld de, MUSIC_MAIN_MENU + call PlayMusic + ld hl, .ClearAllSaveDataText + call PrintText + ld hl, .NoYesMenuHeader + call CopyMenuHeader + call VerticalMenu + ret c + ld a, [wMenuCursorY] + cp 1 + ret z + farcall EmptyAllSRAMBanks + ret + +.ClearAllSaveDataText: + text_far _ClearAllSaveDataText + text_end + +.NoYesMenuHeader: + db 0 ; flags + menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option + +.MenuData: + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "NO@" + db "YES@" diff --git a/engine/menus/savemenu_copytilemapatonce.asm b/engine/menus/savemenu_copytilemapatonce.asm new file mode 100755 index 00000000..4b567a58 --- /dev/null +++ b/engine/menus/savemenu_copytilemapatonce.asm @@ -0,0 +1,84 @@ +SaveMenu_CopyTilemapAtOnce: + ldh a, [hCGB] + and a + jp z, WaitBGMap + +; The following is a modified version of CopyTilemapAtOnce +; that waits for [rLY] to be $60 instead of $80 - 1. + ldh a, [hBGMapMode] + push af + xor a + ldh [hBGMapMode], a + + ldh a, [hMapAnims] + push af + xor a + ldh [hMapAnims], a + +.wait + ldh a, [rLY] + cp $60 + jr c, .wait + + di + ld a, BANK(vBGMap2) + ldh [rVBK], a + hlcoord 0, 0, wAttrmap + call .CopyBGMapViaStack + ld a, BANK(vBGMap0) + ldh [rVBK], a + hlcoord 0, 0 + call .CopyBGMapViaStack + +.wait2 + ldh a, [rLY] + cp $60 + jr c, .wait2 + ei + + pop af + ldh [hMapAnims], a + pop af + ldh [hBGMapMode], a + ret + +.CopyBGMapViaStack: +; Copy all tiles to vBGMap + ld [hSPBuffer], sp + ld sp, hl + ldh a, [hBGMapAddress + 1] + ld h, a + ld l, 0 + ld a, SCREEN_HEIGHT + ldh [hTilesPerCycle], a + ld b, 1 << 1 ; not in v/hblank + ld c, LOW(rSTAT) + +.loop +rept SCREEN_WIDTH / 2 + pop de +; if in v/hblank, wait until not in v/hblank +.loop\@ + ldh a, [c] + and b + jr nz, .loop\@ +; load vBGMap + ld [hl], e + inc l + ld [hl], d + inc l +endr + + ld de, BG_MAP_WIDTH - SCREEN_WIDTH + add hl, de + ldh a, [hTilesPerCycle] + dec a + ldh [hTilesPerCycle], a + jr nz, .loop + + ldh a, [hSPBuffer] + ld l, a + ldh a, [hSPBuffer + 1] + ld h, a + ld sp, hl + ret diff --git a/engine/movie/init_hof_credits.asm b/engine/movie/init_hof_credits.asm new file mode 100755 index 00000000..70a9b6e7 --- /dev/null +++ b/engine/movie/init_hof_credits.asm @@ -0,0 +1,60 @@ +InitDisplayForHallOfFame: + call ClearBGPalettes + call ClearTilemap + call ClearSprites + call DisableLCD + call LoadStandardFont + call LoadFontsBattleExtra + hlbgcoord 0, 0 + ld bc, vBGMap1 - vBGMap0 + ld a, " " + call ByteFill + hlcoord 0, 0, wAttrmap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + xor a + ldh [hSCY], a + ldh [hSCX], a + call EnableLCD + ld hl, .SavingRecordText + call PrintText + call WaitBGMap2 + call SetPalettes + ret + +.SavingRecordText: + text_far _SavingRecordText + text_end + +InitDisplayForRedCredits: + call ClearBGPalettes + call ClearTilemap + call ClearSprites + call DisableLCD + call LoadStandardFont + call LoadFontsBattleExtra + hlbgcoord 0, 0 + ld bc, vBGMap1 - vBGMap0 + ld a, " " + call ByteFill + hlcoord 0, 0, wAttrmap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + ld hl, wBGPals1 + ld c, 4 tiles +.load_white_palettes + ld a, LOW(PALRGB_WHITE) + ld [hli], a + ld a, HIGH(PALRGB_WHITE) + ld [hli], a + dec c + jr nz, .load_white_palettes + xor a + ldh [hSCY], a + ldh [hSCX], a + call EnableLCD + call WaitBGMap2 + call SetPalettes + ret diff --git a/engine/phone/phonering_copytilemapatonce.asm b/engine/phone/phonering_copytilemapatonce.asm new file mode 100755 index 00000000..6ce141b5 --- /dev/null +++ b/engine/phone/phonering_copytilemapatonce.asm @@ -0,0 +1,87 @@ +PhoneRing_CopyTilemapAtOnce: + ldh a, [hCGB] + and a + jp z, WaitBGMap + ld a, [wSpriteUpdatesEnabled] + cp $0 + jp z, WaitBGMap + +; The following is a modified version of CopyTilemapAtOnce +; that waits for [rLY] to be LY_VBLANK - 1 instead of $80 - 1. + ldh a, [hBGMapMode] + push af + xor a + ldh [hBGMapMode], a + + ldh a, [hMapAnims] + push af + xor a + ldh [hMapAnims], a + +.wait + ldh a, [rLY] + cp LY_VBLANK - 1 + jr c, .wait + + di + ld a, BANK(vBGMap2) + ldh [rVBK], a + hlcoord 0, 0, wAttrmap + call .CopyBGMapViaStack + ld a, BANK(vBGMap0) + ldh [rVBK], a + hlcoord 0, 0 + call .CopyBGMapViaStack + +.wait2 + ldh a, [rLY] + cp LY_VBLANK - 1 + jr c, .wait2 + ei + + pop af + ldh [hMapAnims], a + pop af + ldh [hBGMapMode], a + ret + +.CopyBGMapViaStack: +; Copy all tiles to vBGMap + ld [hSPBuffer], sp + ld sp, hl + ldh a, [hBGMapAddress + 1] + ld h, a + ld l, 0 + ld a, SCREEN_HEIGHT + ldh [hTilesPerCycle], a + ld b, 1 << 1 ; not in v/hblank + ld c, LOW(rSTAT) + +.loop +rept SCREEN_WIDTH / 2 + pop de +; if in v/hblank, wait until not in v/hblank +.loop\@ + ldh a, [c] + and b + jr nz, .loop\@ +; load vBGMap + ld [hl], e + inc l + ld [hl], d + inc l +endr + + ld de, BG_MAP_WIDTH - SCREEN_WIDTH + add hl, de + ldh a, [hTilesPerCycle] + dec a + ldh [hTilesPerCycle], a + jr nz, .loop + + ldh a, [hSPBuffer] + ld l, a + ldh a, [hSPBuffer + 1] + ld h, a + ld sp, hl + ret diff --git a/engine/rtc/reset_password.asm b/engine/rtc/reset_password.asm new file mode 100755 index 00000000..b935d747 --- /dev/null +++ b/engine/rtc/reset_password.asm @@ -0,0 +1,254 @@ +_ResetClock: + call ClearTilemap + call GetMemSGBLayout + call LoadStandardFont + call LoadFontsExtra + ld de, MUSIC_MAIN_MENU + call PlayMusic + ld hl, .PasswordAskResetClockText + call PrintText + ld hl, .NoYes_MenuHeader + call CopyMenuHeader + call VerticalMenu + ret c + ld a, [wMenuCursorY] + cp 1 + ret z + call ClockResetPassword + jr c, .wrongpassword + ld a, BANK(sRTCStatusFlags) + call OpenSRAM + ld a, $80 + ld [sRTCStatusFlags], a + call CloseSRAM + ld hl, .PasswordAskResetText + call PrintText + ret + +.wrongpassword + ld hl, .PasswordWrongText + call PrintText + ret + +.PasswordAskResetText: + text_far _PasswordAskResetText + text_end + +.PasswordWrongText: + text_far _PasswordWrongText + text_end + +.PasswordAskResetClockText: + text_far _PasswordAskResetClockText + text_end + +.NoYes_MenuHeader: + db 0 ; flags + menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .NoYes_MenuData + db 1 ; default option + +.NoYes_MenuData: + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "NO@" + db "YES@" + +ClockResetPassword: + call .CalculatePassword + push de + ld hl, wStringBuffer2 + ld bc, 5 + xor a + call ByteFill + ld a, 4 + ld [wStringBuffer2 + 5], a + ld hl, .PasswordAskEnterText + call PrintText +.loop + call .updateIDdisplay +.loop2 + call JoyTextDelay + ldh a, [hJoyLast] + ld b, a + and A_BUTTON + jr nz, .confirm + ld a, b + and D_PAD + jr z, .loop2 + call .dpadinput + ld c, 3 + call DelayFrames + jr .loop + +.confirm + call .ConvertDecIDToBytes + pop de + ld a, e + cp l + jr nz, .nope + ld a, d + cp h + jr nz, .nope + and a + ret + +.nope + scf + ret + +.PasswordAskEnterText: + text_far _PasswordAskEnterText + text_end + +.updateIDdisplay + hlcoord 14, 15 + ld de, wStringBuffer2 + ld c, 5 +.loop3 + ld a, [de] + add "0" + ld [hli], a + inc de + dec c + jr nz, .loop3 + hlcoord 14, 16 + ld bc, 5 + ld a, " " + call ByteFill + hlcoord 14, 16 + ld a, [wStringBuffer2 + 5] + ld e, a + ld d, 0 + add hl, de + ld [hl], "▲" + ret + +.dpadinput + ld a, b + and D_LEFT + jr nz, .left + ld a, b + and D_RIGHT + jr nz, .right + ld a, b + and D_UP + jr nz, .up + ld a, b + and D_DOWN + jr nz, .down + ret + +.left + ld a, [wStringBuffer2 + 5] + and a + ret z + dec a + ld [wStringBuffer2 + 5], a + ret + +.right + ld a, [wStringBuffer2 + 5] + cp 4 + ret z + inc a + ld [wStringBuffer2 + 5], a + ret + +.up + call .getcurrentdigit + ld a, [hl] + cp 9 + jr z, .wraparound_up + inc a + ld [hl], a + ret + +.wraparound_up + ld [hl], 0 + ret + +.down + call .getcurrentdigit + ld a, [hl] + and a + jr z, .wraparound_down + dec a + ld [hl], a + ret + +.wraparound_down + ld [hl], 9 + ret + +.getcurrentdigit + ld a, [wStringBuffer2 + 5] + ld e, a + ld d, $0 + ld hl, wStringBuffer2 + add hl, de + ret + +.ConvertDecIDToBytes: + ld hl, 0 + ld de, wStringBuffer2 + 4 + ld bc, 1 + call .ConvertToBytes + ld bc, 10 + call .ConvertToBytes + ld bc, 100 + call .ConvertToBytes + ld bc, 1000 + call .ConvertToBytes + ld bc, 10000 +.ConvertToBytes: + ld a, [de] + dec de + push hl + ld hl, 0 + call AddNTimes + ld c, l + ld b, h + pop hl + add hl, bc + ret + +.CalculatePassword: + ld a, BANK(sPlayerData) + call OpenSRAM + ld de, 0 + ld hl, sPlayerData + (wPlayerID - wPlayerData) + ld c, 2 + call .ComponentFromNumber + ld hl, sPlayerData + (wPlayerName - wPlayerData) + ld c, NAME_LENGTH_JAPANESE - 1 + call .ComponentFromString + ld hl, sPlayerData + (wMoney - wPlayerData) + ld c, 3 + call .ComponentFromNumber + call CloseSRAM + ret + +.ComponentFromNumber: + ld a, [hli] + add e + ld e, a + ld a, 0 + adc d + ld d, a + dec c + jr nz, .ComponentFromNumber + ret + +.ComponentFromString: + ld a, [hli] + cp "@" + ret z + add e + ld e, a + ld a, 0 + adc d + ld d, a + dec c + jr nz, .ComponentFromString + ret diff --git a/engine/tilesets/timeofday_pals.asm b/engine/tilesets/timeofday_pals.asm new file mode 100755 index 00000000..8a92484a --- /dev/null +++ b/engine/tilesets/timeofday_pals.asm @@ -0,0 +1,317 @@ +DummyPredef35: +DummyPredef36: + ret + +UpdateTimeOfDayPal:: + call UpdateTime + ld a, [wTimeOfDay] + ld [wCurTimeOfDay], a + call GetTimePalette + ld [wTimeOfDayPal], a + ret + +_TimeOfDayPals:: +; return carry if pals are changed + +; forced pals? + ld hl, wTimeOfDayPalFlags + bit 7, [hl] + jr nz, .dontchange + +; do we need to bother updating? + ld a, [wTimeOfDay] + ld hl, wCurTimeOfDay + cp [hl] + jr z, .dontchange + +; if so, the time of day has changed + ld a, [wTimeOfDay] + ld [wCurTimeOfDay], a + +; get palette id + call GetTimePalette + +; same palette as before? + ld hl, wTimeOfDayPal + cp [hl] + jr z, .dontchange + +; update palette id + ld [wTimeOfDayPal], a + +; update sgb pals + ld b, SCGB_MAPPALS + call GetSGBLayout + +; update palettes + call _UpdateTimePals + call DelayFrame + +; successful change + scf + ret + +.dontchange +; no change occurred + and a + ret + +_UpdateTimePals:: + ld c, 9 ; normal + call GetTimePalFade + call DmgToCgbTimePals + ret + +FadeInPalettes:: + ld c, 18 + call GetTimePalFade + ld b, 4 + call ConvertTimePalsDecHL + ret + +FadeOutPalettes:: + call FillWhiteBGColor + ld c, 9 + call GetTimePalFade + ld b, 4 + call ConvertTimePalsIncHL + ret + +FadeInQuickly: + ld c, 0 + call GetTimePalFade + ld b, 4 + call ConvertTimePalsIncHL + ret + +FadeBlackQuickly: + ld c, 9 + call GetTimePalFade + ld b, 4 + call ConvertTimePalsDecHL + ret + +FillWhiteBGColor: + ld hl, wBGPals1 + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld hl, wBGPals1 + 1 palettes + ld c, 6 +.loop + ld a, e + ld [hli], a + ld a, d + ld [hli], a +rept 6 + inc hl +endr + dec c + jr nz, .loop + ret + +ReplaceTimeOfDayPals:: + ld hl, .BrightnessLevels + ld a, [wMapTimeOfDay] + cp 4 ; Dark cave, needs Flash + jr z, .DarkCave + and 7 + add l + ld l, a + ld a, 0 + adc h + ld h, a + ld a, [hl] + ld [wTimeOfDayPalset], a + ret + +.DarkCave: + ld a, [wStatusFlags] + bit STATUSFLAGS_FLASH_F, a + jr nz, .UsedFlash + ld a, %11111111 ; 3, 3, 3, 3 + ld [wTimeOfDayPalset], a + ret + +.UsedFlash: + ld a, %10101010 ; 2, 2, 2, 2 + ld [wTimeOfDayPalset], a + ret + +.BrightnessLevels: + dc 3, 2, 1, 0 + dc 1, 1, 1, 1 + dc 2, 2, 2, 2 + dc 0, 0, 0, 0 + dc 3, 3, 3, 3 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 + +GetTimePalette: + ld a, [wTimeOfDay] + ld e, a + ld d, 0 + ld hl, .TimePalettes + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.TimePalettes: + dw .MorningPalette + dw .DayPalette + dw .NitePalette + dw .DarknessPalette + +.MorningPalette: + ld a, [wTimeOfDayPalset] + and %00000011 ; 0 + ret + +.DayPalette: + ld a, [wTimeOfDayPalset] + and %00001100 ; 1 + srl a + srl a + ret + +.NitePalette: + ld a, [wTimeOfDayPalset] + and %00110000 ; 2 + swap a + ret + +.DarknessPalette: + ld a, [wTimeOfDayPalset] + and %11000000 ; 3 + rlca + rlca + ret + +DmgToCgbTimePals: + push hl + push de + ld a, [hli] + call DmgToCgbBGPals + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + call DmgToCgbObjPals + pop de + pop hl + ret + +ConvertTimePalsIncHL: +.loop + call DmgToCgbTimePals + inc hl + inc hl + inc hl + ld c, 2 + call DelayFrames + dec b + jr nz, .loop + ret + +ConvertTimePalsDecHL: +.loop + call DmgToCgbTimePals + dec hl + dec hl + dec hl + ld c, 2 + call DelayFrames + dec b + jr nz, .loop + ret + +GetTimePalFade: +; check cgb + ldh a, [hCGB] + and a + jr nz, .cgb + +; else: dmg + +; index + ld a, [wTimeOfDayPal] + and %11 + +; get fade table + push bc + ld c, a + ld b, 0 + ld hl, .dmgfades + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + pop bc + +; get place in fade table + ld b, 0 + add hl, bc + ret + +.cgb + ld hl, .cgbfade + ld b, 0 + add hl, bc + ret + +.dmgfades + dw .morn + dw .day + dw .nite + dw .darkness + +.morn + dc 3,3,3,3, 3,3,3,3, 3,3,3,3 + dc 3,3,3,2, 3,3,3,2, 3,3,3,2 + dc 3,3,2,1, 3,2,1,0, 3,2,1,0 + dc 3,2,1,0, 3,1,0,0, 3,1,0,0 + dc 2,1,0,0, 2,0,0,0, 2,0,0,0 + dc 1,0,0,0, 1,0,0,0, 1,0,0,0 + dc 0,0,0,0, 0,0,0,0, 0,0,0,0 + +.day + dc 3,3,3,3, 3,3,3,3, 3,3,3,3 + dc 3,3,3,2, 3,3,3,2, 3,3,3,2 + dc 3,3,2,1, 3,2,1,0, 3,2,1,0 + dc 3,2,1,0, 3,1,0,0, 3,1,0,0 + dc 2,1,0,0, 2,0,0,0, 2,0,0,0 + dc 1,0,0,0, 1,0,0,0, 1,0,0,0 + dc 0,0,0,0, 0,0,0,0, 0,0,0,0 + +.nite + dc 3,3,3,3, 3,3,3,3, 3,3,3,3 + dc 3,3,3,2, 3,3,3,2, 3,3,3,2 + dc 3,3,2,1, 3,2,1,0, 3,2,1,0 + dc 3,2,2,1, 3,1,0,0, 3,1,0,0 + dc 2,1,0,0, 2,0,0,0, 2,0,0,0 + dc 1,0,0,0, 1,0,0,0, 1,0,0,0 + dc 0,0,0,0, 0,0,0,0, 0,0,0,0 + +.darkness + dc 3,3,3,3, 3,3,3,3, 3,3,3,3 + dc 3,3,3,2, 3,3,3,2, 3,3,3,3 + dc 3,3,3,2, 3,2,1,0, 3,3,3,3 + dc 3,3,3,1, 3,1,0,0, 3,3,3,3 + dc 3,3,3,1, 2,0,0,0, 3,3,3,3 + dc 0,0,0,0, 1,0,0,0, 0,0,0,0 + dc 0,0,0,0, 0,0,0,0, 0,0,0,0 + +.cgbfade + dc 3,3,3,3, 3,3,3,3, 3,3,3,3 + dc 3,3,3,2, 3,3,3,2, 3,3,3,2 + dc 3,3,2,1, 3,3,2,1, 3,3,2,1 + dc 3,2,1,0, 3,2,1,0, 3,2,1,0 + dc 2,1,0,0, 2,1,0,0, 2,1,0,0 + dc 1,0,0,0, 1,0,0,0, 1,0,0,0 + dc 0,0,0,0, 0,0,0,0, 0,0,0,0 |