mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-11-16 11:27:33 -08:00
1046 lines
22 KiB
NASM
1046 lines
22 KiB
NASM
_AnimateTileset::
|
|
; Increment [hTileAnimFrame] and run that frame's function
|
|
; from the array pointed to by wTilesetAnim.
|
|
|
|
; Called in WRAM bank 1, VRAM bank 0, so map tiles
|
|
; $80 and above in VRAM bank 1 cannot be animated
|
|
; without switching to that bank themselves.
|
|
|
|
ld a, [wTilesetAnim]
|
|
ld e, a
|
|
ld a, [wTilesetAnim + 1]
|
|
ld d, a
|
|
|
|
ldh a, [hTileAnimFrame]
|
|
ld l, a
|
|
inc a
|
|
ldh [hTileAnimFrame], a
|
|
|
|
ld h, 0
|
|
add hl, hl
|
|
add hl, hl
|
|
add hl, de
|
|
|
|
; 2-byte parameter
|
|
; All functions take input de
|
|
ld e, [hl]
|
|
inc hl
|
|
ld d, [hl]
|
|
inc hl
|
|
|
|
; Function address
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
|
|
jp hl
|
|
|
|
Tileset0Anim:
|
|
TilesetJohtoModernAnim:
|
|
TilesetKantoAnim:
|
|
dw vTiles2 tile $14, AnimateWaterTile
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, AnimateWaterPalette
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, AnimateFlowerTile
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, StandingTileFrame8
|
|
dw NULL, DoneTileAnimation
|
|
|
|
TilesetParkAnim:
|
|
dw vTiles2 tile $14, AnimateWaterTile
|
|
dw NULL, WaitTileAnimation
|
|
dw vTiles2 tile $5f, AnimateFountainTile
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, AnimateWaterPalette
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, AnimateFlowerTile
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, StandingTileFrame8
|
|
dw NULL, DoneTileAnimation
|
|
|
|
TilesetForestAnim:
|
|
dw NULL, ForestTreeLeftAnimation
|
|
dw NULL, ForestTreeRightAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, ForestTreeLeftAnimation2
|
|
dw NULL, ForestTreeRightAnimation2
|
|
dw NULL, AnimateFlowerTile
|
|
dw vTiles2 tile $14, AnimateWaterTile
|
|
dw NULL, AnimateWaterPalette
|
|
dw NULL, StandingTileFrame8
|
|
dw NULL, DoneTileAnimation
|
|
|
|
TilesetJohtoAnim:
|
|
dw vTiles2 tile $14, AnimateWaterTile
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, AnimateWaterPalette
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, AnimateFlowerTile
|
|
dw WhirlpoolFrames1, AnimateWhirlpoolTile
|
|
dw WhirlpoolFrames2, AnimateWhirlpoolTile
|
|
dw WhirlpoolFrames3, AnimateWhirlpoolTile
|
|
dw WhirlpoolFrames4, AnimateWhirlpoolTile
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, StandingTileFrame8
|
|
dw NULL, DoneTileAnimation
|
|
|
|
UnusedTilesetAnim1: ; unreferenced
|
|
; Scrolls tile $03 like cave water, but also has the standard $03 flower tile.
|
|
dw vTiles2 tile $03, ReadTileToAnimBuffer
|
|
dw wTileAnimBuffer, ScrollTileRightLeft
|
|
dw vTiles2 tile $03, WriteTileFromAnimBuffer
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, AnimateFlowerTile
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, DoneTileAnimation
|
|
|
|
UnusedTilesetAnim2: ; unreferenced
|
|
; Scrolls tile $14 like cave water.
|
|
dw vTiles2 tile $14, ReadTileToAnimBuffer
|
|
dw wTileAnimBuffer, ScrollTileRightLeft
|
|
dw vTiles2 tile $14, WriteTileFromAnimBuffer
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, DoneTileAnimation
|
|
|
|
TilesetPortAnim:
|
|
dw vTiles2 tile $14, AnimateWaterTile
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, AnimateWaterPalette
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, StandingTileFrame8
|
|
dw NULL, DoneTileAnimation
|
|
|
|
TilesetEliteFourRoomAnim:
|
|
dw NULL, AnimateLavaBubbleTile2
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, AnimateLavaBubbleTile1
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, StandingTileFrame8
|
|
dw NULL, DoneTileAnimation
|
|
|
|
UnusedTilesetAnim3: ; unreferenced
|
|
; Scrolls tile $53 like a waterfall; scrolls tile $03 like cave water.
|
|
dw vTiles2 tile $53, ReadTileToAnimBuffer
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw vTiles2 tile $53, WriteTileFromAnimBuffer
|
|
dw vTiles2 tile $03, ReadTileToAnimBuffer
|
|
dw wTileAnimBuffer, ScrollTileRightLeft
|
|
dw vTiles2 tile $03, WriteTileFromAnimBuffer
|
|
dw vTiles2 tile $53, ReadTileToAnimBuffer
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw vTiles2 tile $53, WriteTileFromAnimBuffer
|
|
dw NULL, DoneTileAnimation
|
|
|
|
UnusedTilesetAnim4: ; unreferenced
|
|
; Scrolls tile $54 like a waterfall; scrolls tile $03 like cave water.
|
|
dw vTiles2 tile $54, ReadTileToAnimBuffer
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw vTiles2 tile $54, WriteTileFromAnimBuffer
|
|
dw NULL, WaitTileAnimation
|
|
dw vTiles2 tile $03, ReadTileToAnimBuffer
|
|
dw wTileAnimBuffer, ScrollTileRightLeft
|
|
dw vTiles2 tile $03, WriteTileFromAnimBuffer
|
|
dw NULL, WaitTileAnimation
|
|
dw vTiles2 tile $54, ReadTileToAnimBuffer
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw vTiles2 tile $54, WriteTileFromAnimBuffer
|
|
dw NULL, DoneTileAnimation
|
|
|
|
TilesetCaveAnim:
|
|
TilesetDarkCaveAnim:
|
|
dw vTiles2 tile $14, ReadTileToAnimBuffer
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw wTileAnimBuffer, ScrollTileRightLeft
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw vTiles2 tile $14, WriteTileFromAnimBuffer
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw NULL, AnimateWaterPalette
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw vTiles2 tile $40, ReadTileToAnimBuffer
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw vTiles2 tile $40, WriteTileFromAnimBuffer
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw NULL, DoneTileAnimation
|
|
|
|
TilesetIcePathAnim:
|
|
dw vTiles2 tile $35, ReadTileToAnimBuffer
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw wTileAnimBuffer, ScrollTileRightLeft
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw vTiles2 tile $35, WriteTileFromAnimBuffer
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw NULL, AnimateWaterPalette
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw vTiles2 tile $31, ReadTileToAnimBuffer
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw wTileAnimBuffer, ScrollTileDown
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw vTiles2 tile $31, WriteTileFromAnimBuffer
|
|
dw NULL, FlickeringCaveEntrancePalette
|
|
dw NULL, DoneTileAnimation
|
|
|
|
TilesetTowerAnim:
|
|
dw TowerPillarTilePointer9, AnimateTowerPillarTile
|
|
dw TowerPillarTilePointer10, AnimateTowerPillarTile
|
|
dw TowerPillarTilePointer7, AnimateTowerPillarTile
|
|
dw TowerPillarTilePointer8, AnimateTowerPillarTile
|
|
dw TowerPillarTilePointer5, AnimateTowerPillarTile
|
|
dw TowerPillarTilePointer6, AnimateTowerPillarTile
|
|
dw TowerPillarTilePointer3, AnimateTowerPillarTile
|
|
dw TowerPillarTilePointer4, AnimateTowerPillarTile
|
|
dw TowerPillarTilePointer1, AnimateTowerPillarTile
|
|
dw TowerPillarTilePointer2, AnimateTowerPillarTile
|
|
dw NULL, StandingTileFrame
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, DoneTileAnimation
|
|
|
|
UnusedTilesetAnim5: ; unreferenced
|
|
; Scrolls tile $4f like cave water.
|
|
dw vTiles2 tile $4f, ReadTileToAnimBuffer
|
|
dw wTileAnimBuffer, ScrollTileRightLeft
|
|
dw vTiles2 tile $4f, WriteTileFromAnimBuffer
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, DoneTileAnimation
|
|
|
|
TilesetBattleTowerOutsideAnim:
|
|
TilesetHouseAnim:
|
|
TilesetPlayersHouseAnim:
|
|
TilesetPokecenterAnim:
|
|
TilesetGateAnim:
|
|
TilesetLabAnim:
|
|
TilesetFacilityAnim:
|
|
TilesetMartAnim:
|
|
TilesetMansionAnim:
|
|
TilesetGameCornerAnim:
|
|
TilesetTraditionalHouseAnim:
|
|
TilesetTrainStationAnim:
|
|
TilesetChampionsRoomAnim:
|
|
TilesetLighthouseAnim:
|
|
TilesetPlayersRoomAnim:
|
|
TilesetPokeComCenterAnim:
|
|
TilesetBattleTowerInsideAnim:
|
|
TilesetRuinsOfAlphAnim:
|
|
TilesetRadioTowerAnim:
|
|
TilesetUndergroundAnim:
|
|
TilesetBetaWordRoomAnim:
|
|
TilesetHoOhWordRoomAnim:
|
|
TilesetKabutoWordRoomAnim:
|
|
TilesetOmanyteWordRoomAnim:
|
|
TilesetAerodactylWordRoomAnim:
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, DoneTileAnimation
|
|
|
|
DoneTileAnimation:
|
|
; Reset the animation command loop.
|
|
xor a
|
|
ldh [hTileAnimFrame], a
|
|
|
|
WaitTileAnimation:
|
|
; Do nothing this frame.
|
|
ret
|
|
|
|
StandingTileFrame8:
|
|
; Tick the wTileAnimationTimer, wrapping from 7 to 0.
|
|
ld a, [wTileAnimationTimer]
|
|
inc a
|
|
and %111
|
|
ld [wTileAnimationTimer], a
|
|
ret
|
|
|
|
ScrollTileRightLeft:
|
|
; Scroll right for 4 ticks, then left for 4 ticks.
|
|
ld a, [wTileAnimationTimer]
|
|
inc a
|
|
and %111
|
|
ld [wTileAnimationTimer], a
|
|
and %100
|
|
jr nz, ScrollTileLeft
|
|
jr ScrollTileRight
|
|
|
|
ScrollTileUpDown: ; unreferenced
|
|
; Scroll up for 4 ticks, then down for 4 ticks.
|
|
ld a, [wTileAnimationTimer]
|
|
inc a
|
|
and %111
|
|
ld [wTileAnimationTimer], a
|
|
and %100
|
|
jr nz, ScrollTileDown
|
|
jr ScrollTileUp
|
|
|
|
ScrollTileLeft:
|
|
ld h, d
|
|
ld l, e
|
|
ld c, LEN_2BPP_TILE / 4
|
|
.loop
|
|
rept 4
|
|
ld a, [hl]
|
|
rlca
|
|
ld [hli], a
|
|
endr
|
|
dec c
|
|
jr nz, .loop
|
|
ret
|
|
|
|
ScrollTileRight:
|
|
ld h, d
|
|
ld l, e
|
|
ld c, LEN_2BPP_TILE / 4
|
|
.loop
|
|
rept 4
|
|
ld a, [hl]
|
|
rrca
|
|
ld [hli], a
|
|
endr
|
|
dec c
|
|
jr nz, .loop
|
|
ret
|
|
|
|
ScrollTileUp:
|
|
ld h, d
|
|
ld l, e
|
|
ld d, [hl]
|
|
inc hl
|
|
ld e, [hl]
|
|
ld bc, LEN_2BPP_TILE - 2
|
|
add hl, bc
|
|
ld a, LEN_2BPP_TILE / 4
|
|
.loop
|
|
ld c, [hl]
|
|
ld [hl], e
|
|
dec hl
|
|
ld b, [hl]
|
|
ld [hl], d
|
|
dec hl
|
|
ld e, [hl]
|
|
ld [hl], c
|
|
dec hl
|
|
ld d, [hl]
|
|
ld [hl], b
|
|
dec hl
|
|
dec a
|
|
jr nz, .loop
|
|
ret
|
|
|
|
ScrollTileDown:
|
|
ld h, d
|
|
ld l, e
|
|
ld de, LEN_2BPP_TILE - 2
|
|
push hl
|
|
add hl, de
|
|
ld d, [hl]
|
|
inc hl
|
|
ld e, [hl]
|
|
pop hl
|
|
ld a, LEN_2BPP_TILE / 4
|
|
.loop
|
|
ld b, [hl]
|
|
ld [hl], d
|
|
inc hl
|
|
ld c, [hl]
|
|
ld [hl], e
|
|
inc hl
|
|
ld d, [hl]
|
|
ld [hl], b
|
|
inc hl
|
|
ld e, [hl]
|
|
ld [hl], c
|
|
inc hl
|
|
dec a
|
|
jr nz, .loop
|
|
ret
|
|
|
|
AnimateFountainTile:
|
|
; Save the stack pointer in bc for WriteTile to restore
|
|
ld hl, sp+0
|
|
ld b, h
|
|
ld c, l
|
|
|
|
ld hl, .FountainTileFramePointers
|
|
|
|
; A cycle of 8 frames, updating every tick
|
|
ld a, [wTileAnimationTimer]
|
|
and %111
|
|
|
|
; hl = [.FountainTileFramePointers + a * 2]
|
|
add a
|
|
add l
|
|
ld l, a
|
|
jr nc, .okay
|
|
inc h
|
|
.okay
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
|
|
; Write the tile graphic from hl (now sp) to de (now hl)
|
|
ld sp, hl
|
|
ld l, e
|
|
ld h, d
|
|
jp WriteTile
|
|
|
|
.FountainTileFramePointers:
|
|
dw .FountainTile1
|
|
dw .FountainTile2
|
|
dw .FountainTile3
|
|
dw .FountainTile4
|
|
dw .FountainTile3
|
|
dw .FountainTile4
|
|
dw .FountainTile5
|
|
dw .FountainTile1
|
|
|
|
.FountainTile1: INCBIN "gfx/tilesets/fountain/1.2bpp"
|
|
.FountainTile2: INCBIN "gfx/tilesets/fountain/2.2bpp"
|
|
.FountainTile3: INCBIN "gfx/tilesets/fountain/3.2bpp"
|
|
.FountainTile4: INCBIN "gfx/tilesets/fountain/4.2bpp"
|
|
.FountainTile5: INCBIN "gfx/tilesets/fountain/5.2bpp"
|
|
|
|
AnimateWaterTile:
|
|
; Save the stack pointer in bc for WriteTile to restore
|
|
ld hl, sp+0
|
|
ld b, h
|
|
ld c, l
|
|
|
|
; A cycle of 4 frames, updating every other tick
|
|
ld a, [wTileAnimationTimer]
|
|
and %110
|
|
|
|
; hl = .WaterTileFrames + a * 8
|
|
; (a was pre-multiplied by 2 from 'and %110')
|
|
add a
|
|
add a
|
|
add a
|
|
add LOW(.WaterTileFrames)
|
|
ld l, a
|
|
ld a, 0
|
|
adc HIGH(.WaterTileFrames)
|
|
ld h, a
|
|
|
|
; Write the tile graphic from hl (now sp) to de (now hl)
|
|
ld sp, hl
|
|
ld l, e
|
|
ld h, d
|
|
jp WriteTile
|
|
|
|
.WaterTileFrames:
|
|
INCBIN "gfx/tilesets/water/water.2bpp"
|
|
|
|
ForestTreeLeftAnimation:
|
|
; Save the stack pointer in bc for WriteTile to restore
|
|
ld hl, sp+0
|
|
ld b, h
|
|
ld c, l
|
|
|
|
; Only animate this during the Celebi event
|
|
ld a, [wCelebiEvent]
|
|
bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a
|
|
jr nz, .do_animation
|
|
ld hl, ForestTreeLeftFrames
|
|
jr .got_frames
|
|
|
|
.do_animation
|
|
; A cycle of 2 frames, updating every tick
|
|
ld a, [wTileAnimationTimer]
|
|
call GetForestTreeFrame
|
|
|
|
; hl = ForestTreeLeftFrames + a * 8
|
|
; (a was pre-multiplied by 2 from GetForestTreeFrame)
|
|
add a
|
|
add a
|
|
add a
|
|
add LOW(ForestTreeLeftFrames)
|
|
ld l, a
|
|
ld a, 0
|
|
adc HIGH(ForestTreeLeftFrames)
|
|
ld h, a
|
|
|
|
.got_frames
|
|
; Write the tile graphic from hl (now sp) to tile $0c (now hl)
|
|
ld sp, hl
|
|
ld hl, vTiles2 tile $0c
|
|
jp WriteTile
|
|
|
|
ForestTreeLeftFrames:
|
|
INCBIN "gfx/tilesets/forest-tree/1.2bpp"
|
|
INCBIN "gfx/tilesets/forest-tree/2.2bpp"
|
|
|
|
ForestTreeRightFrames:
|
|
INCBIN "gfx/tilesets/forest-tree/3.2bpp"
|
|
INCBIN "gfx/tilesets/forest-tree/4.2bpp"
|
|
|
|
ForestTreeRightAnimation:
|
|
; Save the stack pointer in bc for WriteTile to restore
|
|
ld hl, sp+0
|
|
ld b, h
|
|
ld c, l
|
|
|
|
; Only animate this during the Celebi event
|
|
ld a, [wCelebiEvent]
|
|
bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a
|
|
jr nz, .do_animation
|
|
ld hl, ForestTreeRightFrames
|
|
jr .got_frames
|
|
|
|
.do_animation
|
|
; A cycle of 2 frames, updating every tick
|
|
ld a, [wTileAnimationTimer]
|
|
call GetForestTreeFrame
|
|
|
|
; hl = ForestTreeRightFrames + a * 8
|
|
; (a was pre-multiplied by 2 from GetForestTreeFrame)
|
|
add a
|
|
add a
|
|
add a
|
|
add LOW(ForestTreeLeftFrames)
|
|
ld l, a
|
|
ld a, 0
|
|
adc HIGH(ForestTreeLeftFrames)
|
|
ld h, a
|
|
push bc
|
|
ld bc, ForestTreeRightFrames - ForestTreeLeftFrames
|
|
add hl, bc
|
|
pop bc
|
|
|
|
.got_frames
|
|
; Write the tile graphic from hl (now sp) to tile $0f (now hl)
|
|
ld sp, hl
|
|
ld hl, vTiles2 tile $0f
|
|
jp WriteTile
|
|
|
|
ForestTreeLeftAnimation2:
|
|
; Save the stack pointer in bc for WriteTile to restore
|
|
ld hl, sp+0
|
|
ld b, h
|
|
ld c, l
|
|
|
|
; Only animate this during the Celebi event
|
|
ld a, [wCelebiEvent]
|
|
bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a
|
|
jr nz, .do_animation
|
|
ld hl, ForestTreeLeftFrames
|
|
jr .got_frames
|
|
|
|
.do_animation
|
|
; A cycle of 2 frames, updating every tick
|
|
ld a, [wTileAnimationTimer]
|
|
call GetForestTreeFrame
|
|
|
|
; Offset by 1 frame from ForestTreeLeftAnimation
|
|
xor %10
|
|
|
|
; hl = ForestTreeLeftFrames + a * 8
|
|
; (a was pre-multiplied by 2 from GetForestTreeFrame)
|
|
add a
|
|
add a
|
|
add a
|
|
add LOW(ForestTreeLeftFrames)
|
|
ld l, a
|
|
ld a, 0
|
|
adc HIGH(ForestTreeLeftFrames)
|
|
ld h, a
|
|
|
|
.got_frames
|
|
; Write the tile graphic from hl (now sp) to tile $0c (now hl)
|
|
ld sp, hl
|
|
ld hl, vTiles2 tile $0c
|
|
jp WriteTile
|
|
|
|
ForestTreeRightAnimation2:
|
|
; Save the stack pointer in bc for WriteTile to restore
|
|
ld hl, sp+0
|
|
ld b, h
|
|
ld c, l
|
|
|
|
; Only animate this during the Celebi event
|
|
ld a, [wCelebiEvent]
|
|
bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a
|
|
jr nz, .do_animation
|
|
ld hl, ForestTreeRightFrames
|
|
jr .got_frames
|
|
|
|
.do_animation
|
|
; A cycle of 2 frames, updating every tick
|
|
ld a, [wTileAnimationTimer]
|
|
call GetForestTreeFrame
|
|
|
|
; Offset by 1 frame from ForestTreeRightAnimation
|
|
xor %10
|
|
|
|
; hl = ForestTreeRightFrames + a * 8
|
|
; (a was pre-multiplied by 2 from GetForestTreeFrame)
|
|
add a
|
|
add a
|
|
add a
|
|
add LOW(ForestTreeLeftFrames)
|
|
ld l, a
|
|
ld a, 0
|
|
adc HIGH(ForestTreeLeftFrames)
|
|
ld h, a
|
|
push bc
|
|
ld bc, ForestTreeRightFrames - ForestTreeLeftFrames
|
|
add hl, bc
|
|
pop bc
|
|
|
|
.got_frames
|
|
; Write the tile graphic from hl (now sp) to tile $0f (now hl)
|
|
ld sp, hl
|
|
ld hl, vTiles2 tile $0f
|
|
jp WriteTile
|
|
|
|
GetForestTreeFrame:
|
|
; Return 0 if a is even, or 2 if odd.
|
|
and a
|
|
jr z, .even
|
|
cp 1
|
|
jr z, .odd
|
|
cp 2
|
|
jr z, .even
|
|
cp 3
|
|
jr z, .odd
|
|
cp 4
|
|
jr z, .even
|
|
cp 5
|
|
jr z, .odd
|
|
cp 6
|
|
jr z, .even
|
|
.odd
|
|
ld a, 2
|
|
scf
|
|
ret
|
|
.even
|
|
xor a
|
|
ret
|
|
|
|
AnimateFlowerTile:
|
|
; Save the stack pointer in bc for WriteTile to restore
|
|
ld hl, sp+0
|
|
ld b, h
|
|
ld c, l
|
|
|
|
; A cycle of 2 frames, updating every other tick
|
|
ld a, [wTileAnimationTimer]
|
|
and %10
|
|
|
|
; CGB has different tile graphics for flowers
|
|
ld e, a
|
|
ldh a, [hCGB]
|
|
and 1
|
|
add e
|
|
|
|
; hl = .FlowerTileFrames + a * 16
|
|
swap a
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, .FlowerTileFrames
|
|
add hl, de
|
|
|
|
; Write the tile graphic from hl (now sp) to tile $03 (now hl)
|
|
ld sp, hl
|
|
ld hl, vTiles2 tile $03
|
|
jp WriteTile
|
|
|
|
.FlowerTileFrames:
|
|
INCBIN "gfx/tilesets/flower/dmg_1.2bpp"
|
|
INCBIN "gfx/tilesets/flower/cgb_1.2bpp"
|
|
INCBIN "gfx/tilesets/flower/dmg_2.2bpp"
|
|
INCBIN "gfx/tilesets/flower/cgb_2.2bpp"
|
|
|
|
AnimateLavaBubbleTile1:
|
|
; Save the stack pointer in bc for WriteTile to restore
|
|
ld hl, sp+0
|
|
ld b, h
|
|
ld c, l
|
|
|
|
; A cycle of 4 frames, updating every other tick
|
|
ld a, [wTileAnimationTimer]
|
|
and %110
|
|
|
|
; Offset by 2 frames from AnimateLavaBubbleTile2
|
|
srl a
|
|
inc a
|
|
inc a
|
|
and %011
|
|
|
|
; hl = LavaBubbleTileFrames + a * 16
|
|
swap a
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, LavaBubbleTileFrames
|
|
add hl, de
|
|
|
|
; Write the tile graphic from hl (now sp) to tile $5b (now hl)
|
|
ld sp, hl
|
|
ld hl, vTiles2 tile $5b
|
|
jp WriteTile
|
|
|
|
AnimateLavaBubbleTile2:
|
|
; Save the stack pointer in bc for WriteTile to restore
|
|
ld hl, sp+0
|
|
ld b, h
|
|
ld c, l
|
|
|
|
; A cycle of 4 frames, updating every other tick
|
|
ld a, [wTileAnimationTimer]
|
|
and %110
|
|
|
|
; hl = LavaBubbleTileFrames + a * 8
|
|
; (a was pre-multiplied by 2 from 'and %110')
|
|
add a
|
|
add a
|
|
add a
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, LavaBubbleTileFrames
|
|
add hl, de
|
|
|
|
; Write the tile graphic from hl (now sp) to tile $38 (now hl)
|
|
ld sp, hl
|
|
ld hl, vTiles2 tile $38
|
|
jp WriteTile
|
|
|
|
LavaBubbleTileFrames:
|
|
INCBIN "gfx/tilesets/lava/1.2bpp"
|
|
INCBIN "gfx/tilesets/lava/2.2bpp"
|
|
INCBIN "gfx/tilesets/lava/3.2bpp"
|
|
INCBIN "gfx/tilesets/lava/4.2bpp"
|
|
|
|
AnimateTowerPillarTile:
|
|
; Input de points to the destination in VRAM, then the source tile frames
|
|
|
|
; Save the stack pointer in bc for WriteTile to restore
|
|
ld hl, sp+0
|
|
ld b, h
|
|
ld c, l
|
|
|
|
; A cycle of 8 frames, updating every tick
|
|
ld a, [wTileAnimationTimer]
|
|
and %111
|
|
|
|
; a = [.TowerPillarTileFrameOffsets + a]
|
|
ld hl, .TowerPillarTileFrameOffsets
|
|
add l
|
|
ld l, a
|
|
ld a, 0
|
|
adc h
|
|
ld h, a
|
|
ld a, [hl]
|
|
|
|
; de = the destination in VRAM
|
|
ld l, e
|
|
ld h, d
|
|
ld e, [hl]
|
|
inc hl
|
|
ld d, [hl]
|
|
inc hl
|
|
|
|
; hl = the source tile frames + offset a
|
|
add [hl]
|
|
inc hl
|
|
ld h, [hl]
|
|
ld l, a
|
|
ld a, 0
|
|
adc h
|
|
ld h, a
|
|
|
|
; Write the tile graphic from hl (now sp) to de (now hl)
|
|
ld sp, hl
|
|
ld l, e
|
|
ld h, d
|
|
jr WriteTile
|
|
|
|
.TowerPillarTileFrameOffsets:
|
|
db 0 tiles
|
|
db 1 tiles
|
|
db 2 tiles
|
|
db 3 tiles
|
|
db 4 tiles
|
|
db 3 tiles
|
|
db 2 tiles
|
|
db 1 tiles
|
|
|
|
StandingTileFrame:
|
|
; Tick the wTileAnimationTimer.
|
|
ld hl, wTileAnimationTimer
|
|
inc [hl]
|
|
ret
|
|
|
|
AnimateWhirlpoolTile:
|
|
; Input de points to the destination in VRAM, then the source tile frames
|
|
|
|
; Save the stack pointer in bc for WriteTile to restore
|
|
ld hl, sp+0
|
|
ld b, h
|
|
ld c, l
|
|
|
|
; de = the destination in VRAM
|
|
ld l, e
|
|
ld h, d
|
|
ld e, [hl]
|
|
inc hl
|
|
ld d, [hl]
|
|
inc hl
|
|
|
|
; A cycle of 4 frames, updating every tick
|
|
ld a, [wTileAnimationTimer]
|
|
and %11
|
|
|
|
; hl = the source tile frames + a * 16
|
|
swap a
|
|
add [hl]
|
|
inc hl
|
|
ld h, [hl]
|
|
ld l, a
|
|
ld a, 0
|
|
adc h
|
|
ld h, a
|
|
|
|
; Write the tile graphic from hl (now sp) to de (now hl)
|
|
ld sp, hl
|
|
ld l, e
|
|
ld h, d
|
|
jr WriteTile
|
|
|
|
WriteTileFromAnimBuffer:
|
|
; Save the stack pointer in bc for WriteTile to restore
|
|
ld hl, sp+0
|
|
ld b, h
|
|
ld c, l
|
|
|
|
; Write the tile graphic from wTileAnimBuffer (now sp) to de (now hl)
|
|
ld hl, wTileAnimBuffer
|
|
ld sp, hl
|
|
ld h, d
|
|
ld l, e
|
|
jr WriteTile
|
|
|
|
ReadTileToAnimBuffer:
|
|
; Save the stack pointer in bc for WriteTile to restore
|
|
ld hl, sp+0
|
|
ld b, h
|
|
ld c, l
|
|
|
|
; Write the tile graphic from de (now sp) to wTileAnimBuffer (now hl)
|
|
ld h, d
|
|
ld l, e
|
|
ld sp, hl
|
|
ld hl, wTileAnimBuffer
|
|
; fallthrough
|
|
|
|
WriteTile:
|
|
; Write one tile from sp to hl.
|
|
; The stack pointer has been saved in bc.
|
|
|
|
; This function cannot be called, only jumped to,
|
|
; because it relocates the stack pointer to quickly
|
|
; copy data with a "pop slide".
|
|
|
|
pop de
|
|
ld [hl], e
|
|
inc hl
|
|
ld [hl], d
|
|
rept (LEN_2BPP_TILE - 2) / 2
|
|
pop de
|
|
inc hl
|
|
ld [hl], e
|
|
inc hl
|
|
ld [hl], d
|
|
endr
|
|
|
|
; Restore the stack pointer from bc
|
|
ld h, b
|
|
ld l, c
|
|
ld sp, hl
|
|
ret
|
|
|
|
AnimateWaterPalette:
|
|
; Transition between color values 0-2 for color 0 in palette 3.
|
|
|
|
; Don't update the palette on DMG
|
|
ldh a, [hCGB]
|
|
and a
|
|
ret z
|
|
|
|
; Don't update a non-standard palette order
|
|
ldh a, [rBGP]
|
|
cp %11100100
|
|
ret nz
|
|
|
|
; Only update on even ticks
|
|
ld a, [wTileAnimationTimer]
|
|
ld l, a
|
|
and 1 ; odd
|
|
ret nz
|
|
|
|
; Ready for BGPD input
|
|
ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_WATER
|
|
ldh [rBGPI], a
|
|
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
|
|
; A cycle of 4 colors (0 1 2 1), updating every other tick
|
|
ld a, l
|
|
and %110
|
|
jr z, .color0
|
|
cp %100
|
|
jr z, .color2
|
|
|
|
; color1
|
|
ld hl, wBGPals1 palette PAL_BG_WATER color 1
|
|
ld a, [hli]
|
|
ldh [rBGPD], a
|
|
ld a, [hli]
|
|
ldh [rBGPD], a
|
|
jr .end
|
|
|
|
.color0
|
|
ld hl, wBGPals1 palette PAL_BG_WATER color 0
|
|
ld a, [hli]
|
|
ldh [rBGPD], a
|
|
ld a, [hli]
|
|
ldh [rBGPD], a
|
|
jr .end
|
|
|
|
.color2
|
|
ld hl, wBGPals1 palette PAL_BG_WATER color 2
|
|
ld a, [hli]
|
|
ldh [rBGPD], a
|
|
ld a, [hli]
|
|
ldh [rBGPD], a
|
|
|
|
.end
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ret
|
|
|
|
FlickeringCaveEntrancePalette:
|
|
; Don't update the palette on DMG
|
|
ldh a, [hCGB]
|
|
and a
|
|
ret z
|
|
|
|
; Don't update a non-standard palette order
|
|
ldh a, [rBGP]
|
|
cp %11100100
|
|
ret nz
|
|
|
|
; We only want to be here if we're in a dark cave.
|
|
ld a, [wTimeOfDayPalset]
|
|
cp DARKNESS_PALSET
|
|
ret nz
|
|
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
|
|
; Ready for BGPD input
|
|
ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_YELLOW
|
|
ldh [rBGPI], a
|
|
|
|
; A cycle of 2 colors (0 2), updating every other vblank
|
|
ldh a, [hVBlankCounter]
|
|
and %10
|
|
jr nz, .color1
|
|
|
|
; color0
|
|
ld hl, wBGPals1 palette PAL_BG_YELLOW color 0
|
|
jr .okay
|
|
|
|
.color1
|
|
ld hl, wBGPals1 palette PAL_BG_YELLOW color 1
|
|
|
|
.okay
|
|
ld a, [hli]
|
|
ldh [rBGPD], a
|
|
ld a, [hli]
|
|
ldh [rBGPD], a
|
|
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ret
|
|
|
|
TowerPillarTilePointer1: dw vTiles2 tile $2d, TowerPillarTile1
|
|
TowerPillarTilePointer2: dw vTiles2 tile $2f, TowerPillarTile2
|
|
TowerPillarTilePointer3: dw vTiles2 tile $3d, TowerPillarTile3
|
|
TowerPillarTilePointer4: dw vTiles2 tile $3f, TowerPillarTile4
|
|
TowerPillarTilePointer5: dw vTiles2 tile $3c, TowerPillarTile5
|
|
TowerPillarTilePointer6: dw vTiles2 tile $2c, TowerPillarTile6
|
|
TowerPillarTilePointer7: dw vTiles2 tile $4d, TowerPillarTile7
|
|
TowerPillarTilePointer8: dw vTiles2 tile $4f, TowerPillarTile8
|
|
TowerPillarTilePointer9: dw vTiles2 tile $5d, TowerPillarTile9
|
|
TowerPillarTilePointer10: dw vTiles2 tile $5f, TowerPillarTile10
|
|
|
|
TowerPillarTile1: INCBIN "gfx/tilesets/tower-pillar/1.2bpp"
|
|
TowerPillarTile2: INCBIN "gfx/tilesets/tower-pillar/2.2bpp"
|
|
TowerPillarTile3: INCBIN "gfx/tilesets/tower-pillar/3.2bpp"
|
|
TowerPillarTile4: INCBIN "gfx/tilesets/tower-pillar/4.2bpp"
|
|
TowerPillarTile5: INCBIN "gfx/tilesets/tower-pillar/5.2bpp"
|
|
TowerPillarTile6: INCBIN "gfx/tilesets/tower-pillar/6.2bpp"
|
|
TowerPillarTile7: INCBIN "gfx/tilesets/tower-pillar/7.2bpp"
|
|
TowerPillarTile8: INCBIN "gfx/tilesets/tower-pillar/8.2bpp"
|
|
TowerPillarTile9: INCBIN "gfx/tilesets/tower-pillar/9.2bpp"
|
|
TowerPillarTile10: INCBIN "gfx/tilesets/tower-pillar/10.2bpp"
|
|
|
|
WhirlpoolFrames1: dw vTiles2 tile $32, WhirlpoolTiles1
|
|
WhirlpoolFrames2: dw vTiles2 tile $33, WhirlpoolTiles2
|
|
WhirlpoolFrames3: dw vTiles2 tile $42, WhirlpoolTiles3
|
|
WhirlpoolFrames4: dw vTiles2 tile $43, WhirlpoolTiles4
|
|
|
|
WhirlpoolTiles1: INCBIN "gfx/tilesets/whirlpool/1.2bpp"
|
|
WhirlpoolTiles2: INCBIN "gfx/tilesets/whirlpool/2.2bpp"
|
|
WhirlpoolTiles3: INCBIN "gfx/tilesets/whirlpool/3.2bpp"
|
|
WhirlpoolTiles4: INCBIN "gfx/tilesets/whirlpool/4.2bpp"
|