summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
authorentrpntr <12521136+entrpntr@users.noreply.github.com>2020-06-03 19:58:45 -0400
committerGitHub <noreply@github.com>2020-06-03 19:58:45 -0400
commitd3a6668b1ce4336f9a4443c70376039b700ee012 (patch)
tree954c9cf0cbfad8207399563d36fd64d02c6f16ce /engine
parent7cc52fe23bac6ab9b2d58667e825aef62dd74e03 (diff)
parent1210a5ef54141eeeebf79132a3124a8392c35c4e (diff)
Merge pull request #41 from libjet/bank23
Disassemble bank $23
Diffstat (limited to 'engine')
-rwxr-xr-xengine/battle/battle_transition.asm747
-rwxr-xr-xengine/events/field_moves.asm449
-rwxr-xr-xengine/events/magnet_train.asm387
-rwxr-xr-xengine/gfx/mon_icons.asm337
-rwxr-xr-xengine/gfx/sprite_anims.asm2800
-rwxr-xr-xengine/gfx/sprites.asm1220
-rwxr-xr-xengine/menus/delete_save.asm34
-rwxr-xr-xengine/menus/savemenu_copytilemapatonce.asm84
-rwxr-xr-xengine/movie/init_hof_credits.asm60
-rwxr-xr-xengine/phone/phonering_copytilemapatonce.asm87
-rwxr-xr-xengine/rtc/reset_password.asm254
-rwxr-xr-xengine/tilesets/timeofday_pals.asm317
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