mirror of
https://github.com/thornAvery/jep-hack.git
synced 2025-09-17 02:30:50 +12:00

This implements Old City, the Honey Grandma's House, and its Pokecenter+Mart. Bunch of other bits and pieces not added yet, need to figure out the lore for them. Honey Grandma is designed to make it easier to get important Pokemon, rather than give access to anything new. Thus, she's Nihon-locked by being an Old City resident. Martha's Perfect Rod will follow this trend. Gold Berry tree exists to make them renewable in-game, I think this is very important. The flypoint seems bugged.
1097 lines
24 KiB
NASM
1097 lines
24 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:
|
|
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
|
|
|
|
TilesetNihon1Anim:
|
|
TilesetNihonBirdonAnim:
|
|
TilesetNihonFontAnim:
|
|
TilesetNihonHighTechAnim:
|
|
TilesetNihonOldAnim:
|
|
TilesetNihonSouthAnim:
|
|
TilesetNihonWestAnim:
|
|
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
|
|
|
|
TilesetForestKantoAnim:
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, AnimateFlowerTile
|
|
dw vTiles2 tile $14, AnimateWaterTile
|
|
dw NULL, AnimateWaterPalette
|
|
dw NULL, StandingTileFrame8
|
|
dw NULL, DoneTileAnimation
|
|
|
|
TilesetNihonSnowyAnim:
|
|
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
|
|
|
|
TilesetKantoAnim:
|
|
dw vTiles2 tile $14, AnimateWaterTile
|
|
dw NULL, AnimateLavaBubbleTile2
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, AnimateWaterPalette
|
|
dw NULL, AnimateLavaBubbleTile1
|
|
dw NULL, AnimateFlowerTile
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, WaitTileAnimation
|
|
dw NULL, StandingTileFrame8
|
|
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:
|
|
TilesetMuseumAnim:
|
|
TilesetLavenderCryptAnim:
|
|
TilesetBlueLabAnim:
|
|
TilesetNihonGateAnim:
|
|
TilesetNihonMartAnim:
|
|
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
|
|
ld a, [wOptions2]
|
|
and 1 << MENU_ACCOUNT
|
|
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
|
|
ld a, [wOptions2]
|
|
and 1 << MENU_ACCOUNT
|
|
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 color 0
|
|
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
|
|
|
|
; Copy one color from hl to rBGPI via rBGPD
|
|
|
|
; 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
|
|
ld a, [wOptions2]
|
|
and 1 << MENU_ACCOUNT
|
|
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 color 0
|
|
ldh [rBGPI], a
|
|
|
|
; A cycle of 2 colors (0 2), updating every other vblank
|
|
ldh a, [hVBlankCounter]
|
|
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
|
|
|
|
.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"
|