pokecrystal-board/engine/tileset_anims.asm

1061 lines
20 KiB
NASM
Raw Normal View History

_AnimateTileset:: ; fc000
2013-12-25 23:09:58 -08:00
; Iterate over a given pointer array of
; animation functions (one per frame).
; Typically in wra1, vra0
ld a, [TilesetAnim]
ld e, a
ld a, [TilesetAnim + 1]
ld d, a
ld a, [hTileAnimFrame]
ld l, a
inc a
ld [hTileAnimFrame], a
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.
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
; fc01b
Tileset0Anim: ; 0xfc01b
TilesetJohto2Anim: ; 0xfc01b
TilesetKantoAnim: ; 0xfc01b
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, TileAnimationPalette
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
; 0xfc047
TilesetParkAnim: ; 0xfc047
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $14, AnimateWaterTile
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $5f, AnimateFountain
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, TileAnimationPalette
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
; 0xfc073
TilesetIlexForestAnim: ; 0xfc073
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
2013-12-25 23:09:58 -08:00
dw NULL, TileAnimationPalette
dw NULL, StandingTileFrame8
2013-12-25 23:09:58 -08:00
dw NULL, DoneTileAnimation
; 0xfc0a3
TilesetJohto1Anim: ; 0xfc0a3
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, TileAnimationPalette
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
; 0xfc0d7
UnusedTilesetAnim_fc0d7: ; 0xfc0d7
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $03, WriteTileToBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileRightLeft
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $03, WriteTileFromBuffer
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
; 0xfc103
UnusedTilesetAnim_fc103: ; 0xfc103
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $14, WriteTileToBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileRightLeft
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $14, WriteTileFromBuffer
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
; 0xfc12f
2013-12-25 23:09:58 -08:00
TilesetPortAnim: ; 0xfc12f
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, TileAnimationPalette
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
; 0xfc15f
TilesetGym1Anim: ; 0xfc15f
dw NULL, LavaBubbleAnim2
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, LavaBubbleAnim1
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
; 0xfc17f
UnusedTilesetAnim_fc17f: ; 0xfc17f
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $53, WriteTileToBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw wTileAnimBuffer, ScrollTileDown
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $53, WriteTileFromBuffer
dw vTiles2 tile $03, WriteTileToBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileRightLeft
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $03, WriteTileFromBuffer
dw vTiles2 tile $53, WriteTileToBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw wTileAnimBuffer, ScrollTileDown
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $53, WriteTileFromBuffer
2013-12-26 00:13:25 -08:00
dw NULL, DoneTileAnimation
; 0xfc1af
UnusedTilesetAnim_fc1af: ; 0xfc1af
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $54, WriteTileToBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw wTileAnimBuffer, ScrollTileDown
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $54, WriteTileFromBuffer
2013-12-26 00:13:25 -08:00
dw NULL, WaitTileAnimation
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $03, WriteTileToBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileRightLeft
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $03, WriteTileFromBuffer
2013-12-26 00:13:25 -08:00
dw NULL, WaitTileAnimation
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $54, WriteTileToBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileDown
dw wTileAnimBuffer, ScrollTileDown
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $54, WriteTileFromBuffer
2013-12-26 00:13:25 -08:00
dw NULL, DoneTileAnimation
; 0xfc1e7
2013-12-25 23:09:58 -08:00
TilesetCaveAnim: ; 0xfc1e7
TilesetWhirlIslandsAnim: ; 0xfc1e7
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $14, WriteTileToBuffer
dw NULL, FlickeringCaveEntrancePalette
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileRightLeft
dw NULL, FlickeringCaveEntrancePalette
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $14, WriteTileFromBuffer
dw NULL, FlickeringCaveEntrancePalette
2013-12-25 23:09:58 -08:00
dw NULL, TileAnimationPalette
dw NULL, FlickeringCaveEntrancePalette
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $40, WriteTileToBuffer
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
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $40, WriteTileFromBuffer
dw NULL, FlickeringCaveEntrancePalette
2013-12-25 23:09:58 -08:00
dw NULL, DoneTileAnimation
; 0xfc233
TilesetIcePathAnim: ; 0xfc233
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $35, WriteTileToBuffer
dw NULL, FlickeringCaveEntrancePalette
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileRightLeft
dw NULL, FlickeringCaveEntrancePalette
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $35, WriteTileFromBuffer
dw NULL, FlickeringCaveEntrancePalette
2013-12-25 23:09:58 -08:00
dw NULL, TileAnimationPalette
dw NULL, FlickeringCaveEntrancePalette
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $31, WriteTileToBuffer
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
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $31, WriteTileFromBuffer
dw NULL, FlickeringCaveEntrancePalette
2013-12-25 23:09:58 -08:00
dw NULL, DoneTileAnimation
; 0xfc27f
TilesetSproutTowerAnim: ; 0xfc27f
2013-12-25 23:09:58 -08:00
dw SproutPillarTilePointer9, AnimateSproutPillarTile
dw SproutPillarTilePointer10, AnimateSproutPillarTile
dw SproutPillarTilePointer7, AnimateSproutPillarTile
dw SproutPillarTilePointer8, AnimateSproutPillarTile
dw SproutPillarTilePointer5, AnimateSproutPillarTile
dw SproutPillarTilePointer6, AnimateSproutPillarTile
dw SproutPillarTilePointer3, AnimateSproutPillarTile
dw SproutPillarTilePointer4, AnimateSproutPillarTile
dw SproutPillarTilePointer1, AnimateSproutPillarTile
dw SproutPillarTilePointer2, AnimateSproutPillarTile
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
; 0xfc2bf
UnusedTilesetAnim_fc2bf: ; 0xfc2bf
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $4f, WriteTileToBuffer
2015-12-23 11:00:29 -08:00
dw wTileAnimBuffer, ScrollTileRightLeft
2017-12-28 04:32:33 -08:00
dw vTiles2 tile $4f, WriteTileFromBuffer
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
; 0xfc2e7
2013-12-25 23:09:58 -08:00
TilesetBattleTowerOutsideAnim: ; 0xfc2e7
TilesetHouse1Anim: ; 0xfc2e7
TilesetPlayersHouseAnim: ; 0xfc2e7
TilesetPokecenterAnim: ; 0xfc2e7
TilesetGateAnim: ; 0xfc2e7
TilesetLabAnim: ; 0xfc2e7
TilesetPowerPlantAnim: ; 0xfc2e7
TilesetMartAnim: ; 0xfc2e7
TilesetCeladonMansionAnim: ; 0xfc2e7
TilesetGameCornerAnim: ; 0xfc2e7
TilesetKurtsHouseAnim: ; 0xfc2e7
TilesetTrainStationAnim: ; 0xfc2e7
TilesetOlivineGymAnim: ; 0xfc2e7
TilesetLighthouseAnim: ; 0xfc2e7
TilesetPlayersHouse2FAnim: ; 0xfc2e7
TilesetPokeComCenterAnim: ; 0xfc2e7
TilesetBattleTowerAnim: ; 0xfc2e7
TilesetRuinsOfAlphAnim: ; 0xfc2e7
TilesetRadioTowerAnim: ; 0xfc2e7
TilesetUndergroundAnim: ; 0xfc2e7
TilesetBetaWordRoomAnim: ; 0xfc2e7
TilesetHoOhWordRoomAnim: ; 0xfc2e7
TilesetKabutoWordRoomAnim: ; 0xfc2e7
TilesetOmanyteWordRoomAnim: ; 0xfc2e7
TilesetAerodactylWordRoomAnim: ; 0xfc2e7
2013-12-25 23:09:58 -08:00
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, WaitTileAnimation
dw NULL, DoneTileAnimation
; 0xfc2fb
DoneTileAnimation: ; fc2fb
; Reset the animation command loop.
xor a
ld [hTileAnimFrame], a
2013-12-25 23:09:58 -08:00
WaitTileAnimation: ; fc2fe
; Do nothing this frame.
ret
; fc2ff
StandingTileFrame8: ; fc2ff
2013-12-25 23:09:58 -08:00
ld a, [TileAnimationTimer]
inc a
2018-01-09 14:20:47 -08:00
and %111
2013-12-25 23:09:58 -08:00
ld [TileAnimationTimer], a
ret
; fc309
ScrollTileRightLeft: ; fc309
; Scroll right for 4 ticks, then left for 4 ticks.
ld a, [TileAnimationTimer]
inc a
2018-01-09 14:20:47 -08:00
and %111
2013-12-25 23:09:58 -08:00
ld [TileAnimationTimer], a
2018-01-09 14:20:47 -08:00
and %100
2013-12-25 23:09:58 -08:00
jr nz, ScrollTileLeft
jr ScrollTileRight
; fc318
ScrollTileUpDown: ; fc318
; Scroll up for 4 ticks, then down for 4 ticks.
ld a, [TileAnimationTimer]
inc a
2018-01-09 14:20:47 -08:00
and %111
2013-12-25 23:09:58 -08:00
ld [TileAnimationTimer], a
2018-01-09 14:20:47 -08:00
and %100
2013-12-25 23:09:58 -08:00
jr nz, ScrollTileDown
jr ScrollTileUp
; fc327
ScrollTileLeft: ; fc327
ld h, d
ld l, e
ld c, 4
.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
; fc33b
ScrollTileRight: ; fc33b
ld h, d
ld l, e
ld c, 4
.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
; fc34f
ScrollTileUp: ; fc34f
ld h, d
ld l, e
ld d, [hl]
inc hl
ld e, [hl]
2018-01-09 15:08:40 -08:00
ld bc, TILE_WIDTH * 2 - 2
2013-12-25 23:09:58 -08:00
add hl, bc
2018-01-09 15:08:40 -08:00
ld a, TILE_WIDTH / 2
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
; fc36a
ScrollTileDown: ; fc36a
ld h, d
ld l, e
2018-01-09 15:08:40 -08:00
ld de, TILE_WIDTH * 2 - 2
2013-12-25 23:09:58 -08:00
push hl
add hl, de
ld d, [hl]
inc hl
ld e, [hl]
pop hl
2018-01-09 15:08:40 -08:00
ld a, TILE_WIDTH / 2
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
; fc387
AnimateFountain: ; fc387
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
ld hl, .frames
ld a, [TileAnimationTimer]
2018-01-09 14:20:47 -08:00
and %111
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
ld sp, hl
ld l, e
ld h, d
jp WriteTile
.frames
dw .frame1
dw .frame2
dw .frame3
dw .frame4
dw .frame3
dw .frame4
dw .frame5
dw .frame1
2013-12-26 00:21:29 -08:00
.frame1 INCBIN "gfx/tilesets/fountain/1.2bpp"
.frame2 INCBIN "gfx/tilesets/fountain/2.2bpp"
.frame3 INCBIN "gfx/tilesets/fountain/3.2bpp"
.frame4 INCBIN "gfx/tilesets/fountain/4.2bpp"
.frame5 INCBIN "gfx/tilesets/fountain/5.2bpp"
2013-12-25 23:09:58 -08:00
; fc402
AnimateWaterTile: ; fc402
; Draw a water tile for the current frame in VRAM tile at de.
; Save sp in bc (see WriteTile).
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
2013-12-25 23:09:58 -08:00
ld a, [TileAnimationTimer]
2013-12-25 23:09:58 -08:00
; 4 tile graphics, updated every other frame.
2018-01-09 14:20:47 -08:00
and %110
2013-12-25 23:09:58 -08:00
; 2 x 8 = 16 bytes per tile
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
2013-12-25 23:09:58 -08:00
; Stack now points to the start of the tile for this frame.
ld sp, hl
2013-12-25 23:09:58 -08:00
ld l, e
ld h, d
2013-12-25 23:09:58 -08:00
jp WriteTile
; fc41c
WaterTileFrames: ; fc41c
INCBIN "gfx/tilesets/water/water.2bpp"
2013-12-25 23:09:58 -08:00
; fc45c
ForestTreeLeftAnimation: ; fc45c
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; Only during the Celebi event.
2015-10-24 07:34:19 -07:00
ld a, [wCelebiEvent]
2013-12-25 23:09:58 -08:00
bit 2, a
jr nz, .asm_fc46c
ld hl, ForestTreeLeftFrames
jr .asm_fc47d
.asm_fc46c
ld a, [TileAnimationTimer]
call GetForestTreeFrame
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
.asm_fc47d
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
; fc484
ForestTreeLeftFrames: ; fc484
INCBIN "gfx/tilesets/forest-tree/1.2bpp"
INCBIN "gfx/tilesets/forest-tree/2.2bpp"
; fc4a4
ForestTreeRightFrames: ; fc4a4
INCBIN "gfx/tilesets/forest-tree/3.2bpp"
INCBIN "gfx/tilesets/forest-tree/4.2bpp"
; fc4c4
ForestTreeRightAnimation: ; fc4c4
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; Only during the Celebi event.
2015-10-24 07:34:19 -07:00
ld a, [wCelebiEvent]
2013-12-25 23:09:58 -08:00
bit 2, a
jr nz, .asm_fc4d4
ld hl, ForestTreeRightFrames
jr .asm_fc4eb
.asm_fc4d4
ld a, [TileAnimationTimer]
call GetForestTreeFrame
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
.asm_fc4eb
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
; fc4f2
ForestTreeLeftAnimation2: ; fc4f2
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; Only during the Celebi event.
2015-10-24 07:34:19 -07:00
ld a, [wCelebiEvent]
2013-12-25 23:09:58 -08:00
bit 2, a
jr nz, .asm_fc502
ld hl, ForestTreeLeftFrames
jr .asm_fc515
.asm_fc502
ld a, [TileAnimationTimer]
call GetForestTreeFrame
xor 2
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
.asm_fc515
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
; fc51c
ForestTreeRightAnimation2: ; fc51c
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
; Only during the Celebi event.
2015-10-24 07:34:19 -07:00
ld a, [wCelebiEvent]
2013-12-25 23:09:58 -08:00
bit 2, a
jr nz, .asm_fc52c
ld hl, ForestTreeRightFrames
jr .asm_fc545
.asm_fc52c
ld a, [TileAnimationTimer]
call GetForestTreeFrame
xor 2
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
.asm_fc545
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
; fc54c
GetForestTreeFrame: ; fc54c
; 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
; fc56d
AnimateFlowerTile: ; fc56d
; No parameters.
; Save sp in bc (see WriteTile).
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
2013-12-25 23:46:08 -08:00
; Alternate tile graphic every other frame
2013-12-25 23:09:58 -08:00
ld a, [TileAnimationTimer]
2018-01-09 14:20:47 -08:00
and %10
2013-12-25 23:09:58 -08:00
ld e, a
2013-12-25 23:09:58 -08:00
; CGB has different color mappings for flowers.
ld a, [hCGB]
and 1
2013-12-25 23:09:58 -08:00
add e
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
add hl, de
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
; fc58c
FlowerTileFrames: ; fc58c
2013-12-25 23:46:08 -08:00
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"
2013-12-25 23:09:58 -08:00
; fc5cc
LavaBubbleAnim1: ; fc5cc
2013-12-25 23:09:58 -08:00
; Splash in the bottom-right corner of the fountain.
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
ld a, [TileAnimationTimer]
2018-01-09 14:20:47 -08:00
and %110
2013-12-25 23:09:58 -08:00
srl a
inc a
inc a
2018-01-09 14:20:47 -08:00
and %011
2013-12-25 23:09:58 -08:00
swap a
ld e, a
ld d, 0
ld hl, LavaBubbleFrames
2013-12-25 23:09:58 -08:00
add hl, de
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
; fc5eb
LavaBubbleAnim2: ; fc5eb
2013-12-25 23:09:58 -08:00
; Splash in the top-left corner of the fountain.
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
ld a, [TileAnimationTimer]
2018-01-09 14:20:47 -08:00
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, LavaBubbleFrames
2013-12-25 23:09:58 -08:00
add hl, de
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
; fc605
LavaBubbleFrames: ; fc605
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
; fc645
AnimateSproutPillarTile: ; fc645
; Read from struct at de:
; Destination (VRAM)
; Address of the first tile in the frame array
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
ld a, [TileAnimationTimer]
2018-01-09 14:20:47 -08:00
and %111
2013-12-25 23:09:58 -08:00
; Get frame index a
ld hl, .frames
add l
ld l, a
ld a, 0
adc h
ld h, a
ld a, [hl]
; Destination
ld l, e
ld h, d
ld e, [hl]
inc hl
ld d, [hl]
inc hl
; Add the frame index to the starting address
add [hl]
inc hl
ld h, [hl]
ld l, a
ld a, 0
adc h
ld h, a
ld sp, hl
ld l, e
ld h, d
jr WriteTile
.frames
db $00, $10, $20, $30, $40, $30, $20, $10
; fc673
StandingTileFrame: ; fc673
2013-12-25 23:09:58 -08:00
ld hl, TileAnimationTimer
inc [hl]
ret
; fc678
AnimateWhirlpoolTile: ; fc678
; Update whirlpool tile using struct at de.
; Struct:
; VRAM address
; Address of the first tile
; Only does one of 4 tiles at a time.
; Save sp in bc (see WriteTile).
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
2013-12-25 23:09:58 -08:00
; de = VRAM address
ld l, e
ld h, d
ld e, [hl]
inc hl
ld d, [hl]
inc hl
; Tile address is now at hl.
2013-12-25 23:09:58 -08:00
; Get the tile for this frame.
ld a, [TileAnimationTimer]
and %11 ; 4 frames x2
swap a ; * 16 bytes per tile
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
2013-12-25 23:09:58 -08:00
; Stack now points to the desired frame.
ld sp, hl
2013-12-25 23:09:58 -08:00
ld l, e
ld h, d
2013-12-25 23:09:58 -08:00
jr WriteTile
; fc696
2013-12-25 23:09:58 -08:00
WriteTileFromBuffer: ; fc696
2015-12-23 11:00:29 -08:00
; Write tiledata at wTileAnimBuffer to de.
; wTileAnimBuffer is loaded to sp for WriteTile.
2013-12-25 23:09:58 -08:00
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
2015-12-23 11:00:29 -08:00
ld hl, wTileAnimBuffer
2013-12-25 23:09:58 -08:00
ld sp, hl
2013-12-25 23:09:58 -08:00
ld h, d
ld l, e
jr WriteTile
; fc6a2
2013-12-25 23:09:58 -08:00
WriteTileToBuffer: ; fc6a2
2015-12-23 11:00:29 -08:00
; Write tiledata de to wTileAnimBuffer.
2013-12-25 23:09:58 -08:00
; de is loaded to sp for WriteTile.
ld hl, sp+0
2013-12-25 23:09:58 -08:00
ld b, h
ld c, l
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
WriteTile: ; fc6ac
; Write one 8x8 tile ($10 bytes) from sp to hl.
; Warning: sp is saved in bc so we can abuse pop.
; sp is restored to address bc. Save sp in bc before calling.
pop de
ld [hl], e
inc hl
ld [hl], d
2013-12-25 23:09:58 -08:00
rept 7
pop de
inc hl
ld [hl], e
inc hl
ld [hl], d
endr
2013-12-25 23:09:58 -08:00
; restore sp
ld h, b
ld l, c
ld sp, hl
ret
; fc6d7
TileAnimationPalette: ; fc6d7
; Transition between color values 0-2 for color 0 in palette 3.
; No palette changes on DMG.
ld a, [hCGB]
and a
ret z
2013-12-25 23:09:58 -08:00
; We don't want to mess with non-standard palettes.
ld a, [rBGP] ; BGP
cp %11100100
ret nz
2013-12-25 23:09:58 -08:00
; Only update on even frames.
ld a, [TileAnimationTimer]
ld l, a
and 1 ; odd
ret nz
2013-12-25 23:09:58 -08:00
; Ready for BGPD input...
ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_WATER
2013-12-25 23:09:58 -08:00
ld [rBGPI], a
2013-12-25 23:09:58 -08:00
ld a, [rSVBK]
push af
ld a, BANK(wBGPals1)
2013-12-25 23:09:58 -08:00
ld [rSVBK], a
2013-12-25 23:09:58 -08:00
; Update color 0 in order 0 1 2 1
ld a, l
and %110 ; frames 0 2 4 6
jr z, .color0
2018-01-09 14:20:47 -08:00
cp %100 ; frame 4
2013-12-25 23:09:58 -08:00
jr z, .color2
2013-12-25 23:09:58 -08:00
.color1
ld hl, wBGPals1 palette PAL_BG_WATER + 2
2013-12-25 23:09:58 -08:00
ld a, [hli]
ld [rBGPD], a
ld a, [hli]
ld [rBGPD], a
jr .end
2013-12-25 23:09:58 -08:00
.color0
ld hl, wBGPals1 palette PAL_BG_WATER
2013-12-25 23:09:58 -08:00
ld a, [hli]
ld [rBGPD], a
ld a, [hli]
ld [rBGPD], a
jr .end
2013-12-25 23:09:58 -08:00
.color2
ld hl, wBGPals1 palette PAL_BG_WATER + 4
2013-12-25 23:09:58 -08:00
ld a, [hli]
ld [rBGPD], a
ld a, [hli]
ld [rBGPD], a
2013-12-25 23:09:58 -08:00
.end
pop af
ld [rSVBK], a
ret
; fc71e
FlickeringCaveEntrancePalette: ; fc71e
; No palette changes on DMG.
2013-12-25 23:09:58 -08:00
ld a, [hCGB]
and a
ret z
; We don't want to mess with non-standard palettes.
2013-12-25 23:09:58 -08:00
ld 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]
2018-01-09 14:20:47 -08:00
cp %11111111 ; 3,3,3,3
2013-12-25 23:09:58 -08:00
ret nz
ld a, [rSVBK]
push af
ld a, BANK(wBGPals1)
2013-12-25 23:09:58 -08:00
ld [rSVBK], a
; Ready for BGPD input...
ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_YELLOW
2013-12-25 23:09:58 -08:00
ld [rBGPI], a
ld a, [hVBlankCounter]
2018-01-09 14:20:47 -08:00
and %10
jr nz, .bit1set
ld hl, wBGPals1 palette PAL_BG_YELLOW
jr .okay
2013-12-25 23:09:58 -08:00
.bit1set
ld hl, wBGPals1 palette PAL_BG_YELLOW + 2
2013-12-25 23:09:58 -08:00
.okay
2013-12-25 23:09:58 -08:00
ld a, [hli]
ld [rBGPD], a
ld a, [hli]
ld [rBGPD], a
pop af
ld [rSVBK], a
ret
; fc750
2017-12-28 04:32:33 -08:00
SproutPillarTilePointer1: dw vTiles2 tile $2d, SproutPillarTile1
SproutPillarTilePointer2: dw vTiles2 tile $2f, SproutPillarTile2
SproutPillarTilePointer3: dw vTiles2 tile $3d, SproutPillarTile3
SproutPillarTilePointer4: dw vTiles2 tile $3f, SproutPillarTile4
SproutPillarTilePointer5: dw vTiles2 tile $3c, SproutPillarTile5
SproutPillarTilePointer6: dw vTiles2 tile $2c, SproutPillarTile6
SproutPillarTilePointer7: dw vTiles2 tile $4d, SproutPillarTile7
SproutPillarTilePointer8: dw vTiles2 tile $4f, SproutPillarTile8
SproutPillarTilePointer9: dw vTiles2 tile $5d, SproutPillarTile9
SproutPillarTilePointer10: dw vTiles2 tile $5f, SproutPillarTile10
2013-12-26 00:21:29 -08:00
SproutPillarTile1: INCBIN "gfx/tilesets/sprout-pillar/1.2bpp"
SproutPillarTile2: INCBIN "gfx/tilesets/sprout-pillar/2.2bpp"
SproutPillarTile3: INCBIN "gfx/tilesets/sprout-pillar/3.2bpp"
SproutPillarTile4: INCBIN "gfx/tilesets/sprout-pillar/4.2bpp"
SproutPillarTile5: INCBIN "gfx/tilesets/sprout-pillar/5.2bpp"
SproutPillarTile6: INCBIN "gfx/tilesets/sprout-pillar/6.2bpp"
SproutPillarTile7: INCBIN "gfx/tilesets/sprout-pillar/7.2bpp"
SproutPillarTile8: INCBIN "gfx/tilesets/sprout-pillar/8.2bpp"
SproutPillarTile9: INCBIN "gfx/tilesets/sprout-pillar/9.2bpp"
SproutPillarTile10: INCBIN "gfx/tilesets/sprout-pillar/10.2bpp"
2013-12-25 23:09:58 -08:00
; fca98
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
; fcaa8
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"
2013-12-25 23:37:23 -08:00
; fcba8