pokecrystal/engine/tilesets/tileset_anims.asm

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"