pokecrystal-board/engine/tilesets/tileset_anims.asm

1039 lines
22 KiB
NASM
Raw Permalink Normal View History

2018-06-24 07:09:41 -07:00
_AnimateTileset::
; Increment [hTileAnimFrame] and run that frame's function
; from the array pointed to by wTilesetAnim.
2013-12-25 23:09:58 -08:00
; 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.
2013-12-25 23:09:58 -08:00
2018-01-23 14:39:09 -08:00
ld a, [wTilesetAnim]
2013-12-25 23:09:58 -08:00
ld e, a
2018-01-23 14:39:09 -08:00
ld a, [wTilesetAnim + 1]
2013-12-25 23:09:58 -08:00
ld d, a
ldh a, [hTileAnimFrame]
2013-12-25 23:09:58 -08:00
ld l, a
inc a
ldh [hTileAnimFrame], a
2013-12-25 23:09:58 -08:00
ld h, 0
add hl, hl
add hl, hl
2013-12-25 23:09:58 -08:00
add hl, de
; 2-byte parameter
; All functions take input de
2013-12-25 23:09:58 -08:00
ld e, [hl]
inc hl
ld d, [hl]
inc hl
; Function address
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
2013-12-25 23:09:58 -08:00
Tileset0Anim:
TilesetJohtoModernAnim:
TilesetKantoAnim:
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $14, AnimateWaterTile
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, AnimateWaterPalette
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, AnimateFlowerTile
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, StandingTileFrame8
2013-12-25 23:09:58 -08:00
dw NULL, DoneTileAnimation
TilesetParkAnim:
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $14, AnimateWaterTile
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw vTiles2 tile $5f, AnimateFountainTile
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, AnimateWaterPalette
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, AnimateFlowerTile
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, StandingTileFrame8
2013-12-25 23:09:58 -08:00
dw NULL, DoneTileAnimation
TilesetForestAnim:
2013-12-25 23:09:58 -08:00
dw NULL, ForestTreeLeftAnimation
dw NULL, ForestTreeRightAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, ForestTreeLeftAnimation2
dw NULL, ForestTreeRightAnimation2
dw NULL, AnimateFlowerTile
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $14, AnimateWaterTile
dw NULL, AnimateWaterPalette
dw NULL, StandingTileFrame8
2013-12-25 23:09:58 -08:00
dw NULL, DoneTileAnimation
TilesetJohtoAnim:
if DEF(_DEBUG)
TilesetBoardDebug1Anim:
endc
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $14, AnimateWaterTile
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, AnimateWaterPalette
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, AnimateFlowerTile
2013-12-26 00:17:46 -08:00
dw WhirlpoolFrames1, AnimateWhirlpoolTile
dw WhirlpoolFrames2, AnimateWhirlpoolTile
dw WhirlpoolFrames3, AnimateWhirlpoolTile
dw WhirlpoolFrames4, AnimateWhirlpoolTile
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, StandingTileFrame8
2013-12-25 23:09:58 -08:00
dw NULL, DoneTileAnimation
UnusedTilesetAnim1: ; unreferenced
2021-03-24 07:24:52 -07:00
; Scrolls tile $03 like cave water, but also has the standard $03 flower tile.
dw vTiles2 tile $03, ReadTileToAnimBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileRightLeft
dw vTiles2 tile $03, WriteTileFromAnimBuffer
2013-12-26 00:13:25 -08:00
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
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileRightLeft
dw vTiles2 tile $14, WriteTileFromAnimBuffer
2013-12-26 00:13:25 -08:00
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, DoneTileAnimation
2013-12-25 23:09:58 -08:00
TilesetPortAnim:
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $14, AnimateWaterTile
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, AnimateWaterPalette
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, StandingTileFrame8
2013-12-25 23:09:58 -08:00
dw NULL, DoneTileAnimation
TilesetEliteFourRoomAnim:
dw NULL, AnimateLavaBubbleTile2
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, AnimateLavaBubbleTile1
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, StandingTileFrame8
2013-12-25 23:09:58 -08:00
dw NULL, DoneTileAnimation
UnusedTilesetAnim3: ; unreferenced
; Scrolls tile $53 like a waterfall; scrolls tile $03 like cave water.
dw vTiles2 tile $53, ReadTileToAnimBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw wTileAnimBuffer, ScrollTileDown
dw vTiles2 tile $53, WriteTileFromAnimBuffer
dw vTiles2 tile $03, ReadTileToAnimBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileRightLeft
dw vTiles2 tile $03, WriteTileFromAnimBuffer
dw vTiles2 tile $53, ReadTileToAnimBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw wTileAnimBuffer, ScrollTileDown
dw vTiles2 tile $53, WriteTileFromAnimBuffer
2013-12-26 00:13:25 -08:00
dw NULL, DoneTileAnimation
UnusedTilesetAnim4: ; unreferenced
; Scrolls tile $54 like a waterfall; scrolls tile $03 like cave water.
dw vTiles2 tile $54, ReadTileToAnimBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw wTileAnimBuffer, ScrollTileDown
dw vTiles2 tile $54, WriteTileFromAnimBuffer
2013-12-26 00:13:25 -08:00
dw NULL, WaitTileAnimation
dw vTiles2 tile $03, ReadTileToAnimBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileRightLeft
dw vTiles2 tile $03, WriteTileFromAnimBuffer
2013-12-26 00:13:25 -08:00
dw NULL, WaitTileAnimation
dw vTiles2 tile $54, ReadTileToAnimBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw wTileAnimBuffer, ScrollTileDown
dw vTiles2 tile $54, WriteTileFromAnimBuffer
2013-12-26 00:13:25 -08:00
dw NULL, DoneTileAnimation
2013-12-25 23:09:58 -08:00
TilesetCaveAnim:
TilesetDarkCaveAnim:
2023-12-14 08:13:07 -08:00
if DEF(_DEBUG)
TilesetBoardDebug2Anim:
endc
dw vTiles2 tile $14, ReadTileToAnimBuffer
dw NULL, FlickeringCaveEntrancePalette
2015-12-23 11:00:29 -08:00
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
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw NULL, FlickeringCaveEntrancePalette
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw NULL, FlickeringCaveEntrancePalette
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw NULL, FlickeringCaveEntrancePalette
dw vTiles2 tile $40, WriteTileFromAnimBuffer
dw NULL, FlickeringCaveEntrancePalette
2013-12-25 23:09:58 -08:00
dw NULL, DoneTileAnimation
TilesetIcePathAnim:
dw vTiles2 tile $35, ReadTileToAnimBuffer
dw NULL, FlickeringCaveEntrancePalette
2015-12-23 11:00:29 -08:00
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
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw NULL, FlickeringCaveEntrancePalette
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw NULL, FlickeringCaveEntrancePalette
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw NULL, FlickeringCaveEntrancePalette
dw vTiles2 tile $31, WriteTileFromAnimBuffer
dw NULL, FlickeringCaveEntrancePalette
2013-12-25 23:09:58 -08:00
dw NULL, DoneTileAnimation
TilesetTowerAnim:
dw TowerPillarTilePointer9, AnimateTowerPillarTile
2018-01-17 11:50:34 -08:00
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
2013-12-25 23:09:58 -08:00
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
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileRightLeft
dw vTiles2 tile $4f, WriteTileFromAnimBuffer
2013-12-26 00:13:25 -08:00
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, DoneTileAnimation
2013-12-25 23:09:58 -08:00
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:
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, DoneTileAnimation
2018-06-24 07:09:41 -07:00
DoneTileAnimation:
2013-12-25 23:09:58 -08:00
; Reset the animation command loop.
xor a
ldh [hTileAnimFrame], a
2018-06-24 07:09:41 -07:00
WaitTileAnimation:
2013-12-25 23:09:58 -08:00
; Do nothing this frame.
ret
2018-06-24 07:09:41 -07:00
StandingTileFrame8:
; Tick the wTileAnimationTimer, wrapping from 7 to 0.
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2013-12-25 23:09:58 -08:00
inc a
2018-01-09 14:20:47 -08:00
and %111
2018-01-23 14:39:09 -08:00
ld [wTileAnimationTimer], a
2013-12-25 23:09:58 -08:00
ret
2018-06-24 07:09:41 -07:00
ScrollTileRightLeft:
2013-12-25 23:09:58 -08:00
; Scroll right for 4 ticks, then left for 4 ticks.
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2013-12-25 23:09:58 -08:00
inc a
2018-01-09 14:20:47 -08:00
and %111
2018-01-23 14:39:09 -08:00
ld [wTileAnimationTimer], a
2018-01-09 14:20:47 -08:00
and %100
2013-12-25 23:09:58 -08:00
jr nz, ScrollTileLeft
jr ScrollTileRight
ScrollTileUpDown: ; unreferenced
2013-12-25 23:09:58 -08:00
; Scroll up for 4 ticks, then down for 4 ticks.
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2013-12-25 23:09:58 -08:00
inc a
2018-01-09 14:20:47 -08:00
and %111
2018-01-23 14:39:09 -08:00
ld [wTileAnimationTimer], a
2018-01-09 14:20:47 -08:00
and %100
2013-12-25 23:09:58 -08:00
jr nz, ScrollTileDown
jr ScrollTileUp
2018-06-24 07:09:41 -07:00
ScrollTileLeft:
2013-12-25 23:09:58 -08:00
ld h, d
ld l, e
ld c, LEN_2BPP_TILE / 4
2013-12-25 23:09:58 -08:00
.loop
2018-01-09 14:20:47 -08:00
rept 4
2013-12-25 23:09:58 -08:00
ld a, [hl]
rlca
ld [hli], a
2018-01-09 14:20:47 -08:00
endr
2013-12-25 23:09:58 -08:00
dec c
jr nz, .loop
ret
2018-06-24 07:09:41 -07:00
ScrollTileRight:
2013-12-25 23:09:58 -08:00
ld h, d
ld l, e
ld c, LEN_2BPP_TILE / 4
2013-12-25 23:09:58 -08:00
.loop
2018-01-09 14:20:47 -08:00
rept 4
2013-12-25 23:09:58 -08:00
ld a, [hl]
rrca
ld [hli], a
2018-01-09 14:20:47 -08:00
endr
2013-12-25 23:09:58 -08:00
dec c
jr nz, .loop
ret
2018-06-24 07:09:41 -07:00
ScrollTileUp:
2013-12-25 23:09:58 -08:00
ld h, d
ld l, e
ld d, [hl]
inc hl
ld e, [hl]
ld bc, LEN_2BPP_TILE - 2
2013-12-25 23:09:58 -08:00
add hl, bc
ld a, LEN_2BPP_TILE / 4
2013-12-25 23:09:58 -08:00
.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
2018-06-24 07:09:41 -07:00
ScrollTileDown:
2013-12-25 23:09:58 -08:00
ld h, d
ld l, e
ld de, LEN_2BPP_TILE - 2
2013-12-25 23:09:58 -08:00
push hl
add hl, de
ld d, [hl]
inc hl
ld e, [hl]
pop hl
ld a, LEN_2BPP_TILE / 4
2013-12-25 23:09:58 -08:00
.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
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
ld hl, .FountainTileFramePointers
; A cycle of 8 frames, updating every tick
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2018-01-09 14:20:47 -08:00
and %111
; hl = [.FountainTileFramePointers + a * 2]
2013-12-25 23:09:58 -08:00
add a
add l
ld l, a
2015-12-23 11:00:29 -08:00
jr nc, .okay
2013-12-25 23:09:58 -08:00
inc h
2015-12-23 11:00:29 -08:00
.okay
2013-12-25 23:09:58 -08:00
ld a, [hli]
ld h, [hl]
ld l, a
; Write the tile graphic from hl (now sp) to de (now hl)
2013-12-25 23:09:58 -08:00
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"
2013-12-25 23:09:58 -08:00
2018-06-24 07:09:41 -07:00
AnimateWaterTile:
; Save the stack pointer in bc for WriteTile to restore
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; A cycle of 4 frames, updating every other tick
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2018-01-09 14:20:47 -08:00
and %110
; hl = .WaterTileFrames + a * 8
; (a was pre-multiplied by 2 from 'and %110')
2013-12-25 23:09:58 -08:00
add a
add a
add a
add LOW(.WaterTileFrames)
2013-12-25 23:09:58 -08:00
ld l, a
ld a, 0
adc HIGH(.WaterTileFrames)
2013-12-25 23:09:58 -08:00
ld h, a
; Write the tile graphic from hl (now sp) to de (now hl)
2013-12-25 23:09:58 -08:00
ld sp, hl
ld l, e
ld h, d
jp WriteTile
.WaterTileFrames:
INCBIN "gfx/tilesets/water/water.2bpp"
2013-12-25 23:09:58 -08:00
2018-06-24 07:09:41 -07:00
ForestTreeLeftAnimation:
; Save the stack pointer in bc for WriteTile to restore
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; Only animate this during the Celebi event
2015-10-24 07:34:19 -07:00
ld a, [wCelebiEvent]
2018-01-22 11:34:55 -08:00
bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a
2021-02-05 09:44:21 -08:00
jr nz, .do_animation
2013-12-25 23:09:58 -08:00
ld hl, ForestTreeLeftFrames
2021-02-05 09:44:21 -08:00
jr .got_frames
2013-12-25 23:09:58 -08:00
2021-02-05 09:44:21 -08:00
.do_animation
; A cycle of 2 frames, updating every tick
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2013-12-25 23:09:58 -08:00
call GetForestTreeFrame
; hl = ForestTreeLeftFrames + a * 8
; (a was pre-multiplied by 2 from GetForestTreeFrame)
2013-12-25 23:09:58 -08:00
add a
add a
add a
add LOW(ForestTreeLeftFrames)
2013-12-25 23:09:58 -08:00
ld l, a
ld a, 0
adc HIGH(ForestTreeLeftFrames)
2013-12-25 23:09:58 -08:00
ld h, a
2021-02-05 09:44:21 -08:00
.got_frames
; Write the tile graphic from hl (now sp) to tile $0c (now hl)
2013-12-25 23:09:58 -08:00
ld sp, hl
2017-12-28 04:32:33 -08:00
ld hl, vTiles2 tile $0c
2013-12-25 23:09:58 -08:00
jp WriteTile
2018-06-24 07:09:41 -07:00
ForestTreeLeftFrames:
2013-12-25 23:09:58 -08:00
INCBIN "gfx/tilesets/forest-tree/1.2bpp"
INCBIN "gfx/tilesets/forest-tree/2.2bpp"
2018-06-24 07:09:41 -07:00
ForestTreeRightFrames:
2013-12-25 23:09:58 -08:00
INCBIN "gfx/tilesets/forest-tree/3.2bpp"
INCBIN "gfx/tilesets/forest-tree/4.2bpp"
2018-06-24 07:09:41 -07:00
ForestTreeRightAnimation:
; Save the stack pointer in bc for WriteTile to restore
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; Only animate this during the Celebi event
2015-10-24 07:34:19 -07:00
ld a, [wCelebiEvent]
2018-01-22 11:34:55 -08:00
bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a
2021-02-05 09:44:21 -08:00
jr nz, .do_animation
2013-12-25 23:09:58 -08:00
ld hl, ForestTreeRightFrames
2021-02-05 09:44:21 -08:00
jr .got_frames
2013-12-25 23:09:58 -08:00
2021-02-05 09:44:21 -08:00
.do_animation
; A cycle of 2 frames, updating every tick
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2013-12-25 23:09:58 -08:00
call GetForestTreeFrame
; hl = ForestTreeRightFrames + a * 8
; (a was pre-multiplied by 2 from GetForestTreeFrame)
2013-12-25 23:09:58 -08:00
add a
add a
add a
add LOW(ForestTreeLeftFrames)
2013-12-25 23:09:58 -08:00
ld l, a
ld a, 0
adc HIGH(ForestTreeLeftFrames)
2013-12-25 23:09:58 -08:00
ld h, a
push bc
ld bc, ForestTreeRightFrames - ForestTreeLeftFrames
add hl, bc
pop bc
2021-02-05 09:44:21 -08:00
.got_frames
; Write the tile graphic from hl (now sp) to tile $0f (now hl)
2013-12-25 23:09:58 -08:00
ld sp, hl
2017-12-28 04:32:33 -08:00
ld hl, vTiles2 tile $0f
2013-12-25 23:09:58 -08:00
jp WriteTile
2018-06-24 07:09:41 -07:00
ForestTreeLeftAnimation2:
; Save the stack pointer in bc for WriteTile to restore
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; Only animate this during the Celebi event
2015-10-24 07:34:19 -07:00
ld a, [wCelebiEvent]
2018-01-22 11:34:55 -08:00
bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a
2021-02-05 09:44:21 -08:00
jr nz, .do_animation
2013-12-25 23:09:58 -08:00
ld hl, ForestTreeLeftFrames
2021-02-05 09:44:21 -08:00
jr .got_frames
2013-12-25 23:09:58 -08:00
2021-02-05 09:44:21 -08:00
.do_animation
; A cycle of 2 frames, updating every tick
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2013-12-25 23:09:58 -08:00
call GetForestTreeFrame
; Offset by 1 frame from ForestTreeLeftAnimation
2021-02-05 09:44:21 -08:00
xor %10
; hl = ForestTreeLeftFrames + a * 8
; (a was pre-multiplied by 2 from GetForestTreeFrame)
2013-12-25 23:09:58 -08:00
add a
add a
add a
add LOW(ForestTreeLeftFrames)
2013-12-25 23:09:58 -08:00
ld l, a
ld a, 0
adc HIGH(ForestTreeLeftFrames)
2013-12-25 23:09:58 -08:00
ld h, a
2021-02-05 09:44:21 -08:00
.got_frames
; Write the tile graphic from hl (now sp) to tile $0c (now hl)
2013-12-25 23:09:58 -08:00
ld sp, hl
2017-12-28 04:32:33 -08:00
ld hl, vTiles2 tile $0c
2013-12-25 23:09:58 -08:00
jp WriteTile
2018-06-24 07:09:41 -07:00
ForestTreeRightAnimation2:
; Save the stack pointer in bc for WriteTile to restore
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; Only animate this during the Celebi event
2015-10-24 07:34:19 -07:00
ld a, [wCelebiEvent]
2018-01-22 11:34:55 -08:00
bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a
2021-02-05 09:44:21 -08:00
jr nz, .do_animation
2013-12-25 23:09:58 -08:00
ld hl, ForestTreeRightFrames
2021-02-05 09:44:21 -08:00
jr .got_frames
2013-12-25 23:09:58 -08:00
2021-02-05 09:44:21 -08:00
.do_animation
; A cycle of 2 frames, updating every tick
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2013-12-25 23:09:58 -08:00
call GetForestTreeFrame
; Offset by 1 frame from ForestTreeRightAnimation
2021-02-05 09:44:21 -08:00
xor %10
; hl = ForestTreeRightFrames + a * 8
; (a was pre-multiplied by 2 from GetForestTreeFrame)
2013-12-25 23:09:58 -08:00
add a
add a
add a
add LOW(ForestTreeLeftFrames)
2013-12-25 23:09:58 -08:00
ld l, a
ld a, 0
adc HIGH(ForestTreeLeftFrames)
2013-12-25 23:09:58 -08:00
ld h, a
push bc
ld bc, ForestTreeRightFrames - ForestTreeLeftFrames
add hl, bc
pop bc
2021-02-05 09:44:21 -08:00
.got_frames
; Write the tile graphic from hl (now sp) to tile $0f (now hl)
2013-12-25 23:09:58 -08:00
ld sp, hl
2017-12-28 04:32:33 -08:00
ld hl, vTiles2 tile $0f
2013-12-25 23:09:58 -08:00
jp WriteTile
2018-06-24 07:09:41 -07:00
GetForestTreeFrame:
2013-12-25 23:09:58 -08:00
; 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
2018-06-24 07:09:41 -07:00
AnimateFlowerTile:
; Save the stack pointer in bc for WriteTile to restore
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; A cycle of 2 frames, updating every other tick
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2018-01-09 14:20:47 -08:00
and %10
srl a
; hl = .FlowerTileFrames + a * 16
2018-01-09 14:20:47 -08:00
swap a
2013-12-25 23:09:58 -08:00
ld e, a
ld d, 0
ld hl, .FlowerTileFrames
2013-12-25 23:09:58 -08:00
add hl, de
; Write the tile graphic from hl (now sp) to tile $03 (now hl)
ld sp, hl
2018-01-09 14:20:47 -08:00
ld hl, vTiles2 tile $03
2013-12-25 23:09:58 -08:00
jp WriteTile
.FlowerTileFrames:
2013-12-25 23:46:08 -08:00
INCBIN "gfx/tilesets/flower/cgb_1.2bpp"
INCBIN "gfx/tilesets/flower/cgb_2.2bpp"
2013-12-25 23:09:58 -08:00
AnimateLavaBubbleTile1:
; Save the stack pointer in bc for WriteTile to restore
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; A cycle of 4 frames, updating every other tick
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2018-01-09 14:20:47 -08:00
and %110
; Offset by 2 frames from AnimateLavaBubbleTile2
2013-12-25 23:09:58 -08:00
srl a
inc a
inc a
2018-01-09 14:20:47 -08:00
and %011
; hl = LavaBubbleTileFrames + a * 16
2013-12-25 23:09:58 -08:00
swap a
ld e, a
ld d, 0
ld hl, LavaBubbleTileFrames
2013-12-25 23:09:58 -08:00
add hl, de
; Write the tile graphic from hl (now sp) to tile $5b (now hl)
2013-12-25 23:09:58 -08:00
ld sp, hl
2017-12-28 04:32:33 -08:00
ld hl, vTiles2 tile $5b
2013-12-25 23:09:58 -08:00
jp WriteTile
AnimateLavaBubbleTile2:
; Save the stack pointer in bc for WriteTile to restore
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; A cycle of 4 frames, updating every other tick
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2018-01-09 14:20:47 -08:00
and %110
; hl = LavaBubbleTileFrames + a * 8
; (a was pre-multiplied by 2 from 'and %110')
2013-12-25 23:09:58 -08:00
add a
add a
add a
2013-12-25 23:09:58 -08:00
ld e, a
ld d, 0
ld hl, LavaBubbleTileFrames
2013-12-25 23:09:58 -08:00
add hl, de
; Write the tile graphic from hl (now sp) to tile $38 (now hl)
2013-12-25 23:09:58 -08:00
ld sp, hl
2017-12-28 04:32:33 -08:00
ld hl, vTiles2 tile $38
2013-12-25 23:09:58 -08:00
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"
2013-12-25 23:09:58 -08:00
2018-06-24 07:09:41 -07:00
AnimateTowerPillarTile:
; Input de points to the destination in VRAM, then the source tile frames
2013-12-25 23:09:58 -08:00
; Save the stack pointer in bc for WriteTile to restore
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; A cycle of 8 frames, updating every tick
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2018-01-09 14:20:47 -08:00
and %111
2013-12-25 23:09:58 -08:00
; a = [.TowerPillarTileFrameOffsets + a]
ld hl, .TowerPillarTileFrameOffsets
2013-12-25 23:09:58 -08:00
add l
ld l, a
ld a, 0
adc h
ld h, a
ld a, [hl]
; de = the destination in VRAM
2013-12-25 23:09:58 -08:00
ld l, e
ld h, d
ld e, [hl]
inc hl
ld d, [hl]
inc hl
; hl = the source tile frames + offset a
2013-12-25 23:09:58 -08:00
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)
2013-12-25 23:09:58 -08:00
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
2013-12-25 23:09:58 -08:00
2018-06-24 07:09:41 -07:00
StandingTileFrame:
; Tick the wTileAnimationTimer.
2018-01-23 14:39:09 -08:00
ld hl, wTileAnimationTimer
2013-12-25 23:09:58 -08:00
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AnimateWhirlpoolTile:
; Input de points to the destination in VRAM, then the source tile frames
2013-12-25 23:09:58 -08:00
; Save the stack pointer in bc for WriteTile to restore
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; de = the destination in VRAM
2013-12-25 23:09:58 -08:00
ld l, e
ld h, d
ld e, [hl]
inc hl
ld d, [hl]
inc hl
; A cycle of 4 frames, updating every tick
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
and %11
; hl = the source tile frames + a * 16
swap a
2013-12-25 23:09:58 -08:00
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)
2013-12-25 23:09:58 -08:00
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
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; Write the tile graphic from wTileAnimBuffer (now sp) to de (now hl)
2015-12-23 11:00:29 -08:00
ld hl, wTileAnimBuffer
2013-12-25 23:09:58 -08:00
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
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; Write the tile graphic from de (now sp) to wTileAnimBuffer (now hl)
2013-12-25 23:09:58 -08:00
ld h, d
ld l, e
ld sp, hl
2015-12-23 11:00:29 -08:00
ld hl, wTileAnimBuffer
2013-12-25 23:09:58 -08:00
; fallthrough
2018-06-24 07:09:41 -07:00
WriteTile:
; Write one tile from sp to hl.
; The stack pointer has been saved in bc.
2013-12-25 23:09:58 -08:00
; This function cannot be called, only jumped to,
; because it relocates the stack pointer to quickly
; copy data with a "pop slide".
2013-12-25 23:09:58 -08:00
pop de
ld [hl], e
inc hl
ld [hl], d
rept (LEN_2BPP_TILE - 2) / 2
2013-12-25 23:09:58 -08:00
pop de
inc hl
ld [hl], e
inc hl
ld [hl], d
endr
; Restore the stack pointer from bc
2013-12-25 23:09:58 -08:00
ld h, b
ld l, c
ld sp, hl
ret
AnimateWaterPalette:
2013-12-25 23:09:58 -08:00
; Transition between color values 0-2 for color 0 in palette 3.
; Don't update a non-standard palette order
ldh a, [rBGP]
2013-12-25 23:09:58 -08:00
cp %11100100
ret nz
; Only update on even ticks
2018-01-23 14:39:09 -08:00
ld a, [wTileAnimationTimer]
2013-12-25 23:09:58 -08:00
ld l, a
and 1 ; odd
ret nz
; Ready for BGPD input
ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_WATER color 0
ldh [rBGPI], a
ldh a, [rSVBK]
2013-12-25 23:09:58 -08:00
push af
ld a, BANK(wBGPals1)
ldh [rSVBK], a
; A cycle of 4 colors (0 1 2 1), updating every other tick
2013-12-25 23:09:58 -08:00
ld a, l
and %110
2013-12-25 23:09:58 -08:00
jr z, .color0
cp %100
2013-12-25 23:09:58 -08:00
jr z, .color2
; Copy one color from hl to rBGPI via rBGPD
; color1
2018-01-22 16:40:17 -08:00
ld hl, wBGPals1 palette PAL_BG_WATER color 1
2013-12-25 23:09:58 -08:00
ld a, [hli]
ldh [rBGPD], a
2013-12-25 23:09:58 -08:00
ld a, [hli]
ldh [rBGPD], a
2013-12-25 23:09:58 -08:00
jr .end
2013-12-25 23:09:58 -08:00
.color0
2018-01-22 16:40:17 -08:00
ld hl, wBGPals1 palette PAL_BG_WATER color 0
2013-12-25 23:09:58 -08:00
ld a, [hli]
ldh [rBGPD], a
2013-12-25 23:09:58 -08:00
ld a, [hli]
ldh [rBGPD], a
2013-12-25 23:09:58 -08:00
jr .end
2013-12-25 23:09:58 -08:00
.color2
2018-01-22 16:40:17 -08:00
ld hl, wBGPals1 palette PAL_BG_WATER color 2
2013-12-25 23:09:58 -08:00
ld a, [hli]
ldh [rBGPD], a
2013-12-25 23:09:58 -08:00
ld a, [hli]
ldh [rBGPD], a
2013-12-25 23:09:58 -08:00
.end
pop af
ldh [rSVBK], a
2013-12-25 23:09:58 -08:00
ret
2018-06-24 07:09:41 -07:00
FlickeringCaveEntrancePalette:
; Don't update a non-standard palette order
ldh a, [rBGP]
cp %11100100
2013-12-25 23:09:58 -08:00
ret nz
; We only want to be here if we're in a dark cave.
2015-12-14 08:12:18 -08:00
ld a, [wTimeOfDayPalset]
2020-08-11 11:12:59 -07:00
cp DARKNESS_PALSET
2013-12-25 23:09:58 -08:00
ret nz
ldh a, [rSVBK]
2013-12-25 23:09:58 -08:00
push af
ld a, BANK(wBGPals1)
ldh [rSVBK], a
; Ready for BGPD input
ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_YELLOW color 0
ldh [rBGPI], a
; A cycle of 2 colors (0 2), updating every other vblank
ldh a, [hVBlankCounter]
2018-01-09 14:20:47 -08:00
and %10
jr nz, .color1
; Copy one color from hl to rBGPI via rBGPD
; color0
ld hl, wBGPals1 palette PAL_BG_YELLOW color 0
jr .okay
2013-12-25 23:09:58 -08:00
.color1
2018-01-22 16:40:17 -08:00
ld hl, wBGPals1 palette PAL_BG_YELLOW color 1
2013-12-25 23:09:58 -08:00
.okay
2013-12-25 23:09:58 -08:00
ld a, [hli]
ldh [rBGPD], a
2013-12-25 23:09:58 -08:00
ld a, [hli]
ldh [rBGPD], a
2013-12-25 23:09:58 -08:00
pop af
ldh [rSVBK], a
2013-12-25 23:09:58 -08:00
ret
2018-01-17 11:50:34 -08:00
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"
2013-12-25 23:09:58 -08:00
2017-12-28 04:32:33 -08:00
WhirlpoolFrames1: dw vTiles2 tile $32, WhirlpoolTiles1
WhirlpoolFrames2: dw vTiles2 tile $33, WhirlpoolTiles2
WhirlpoolFrames3: dw vTiles2 tile $42, WhirlpoolTiles3
WhirlpoolFrames4: dw vTiles2 tile $43, WhirlpoolTiles4
2013-12-25 23:37:23 -08:00
2013-12-26 00:21:29 -08:00
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"