summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlibjet <libj3t@gmail.com>2020-05-31 02:42:16 +0100
committerlibjet <libj3t@gmail.com>2020-05-31 02:42:16 +0100
commit8a892f8240d1ed4fc69a00b4740dafa438d2efca (patch)
treeaea78e6d5fe9e681b9e6e0882d9248ebedc01fc8
parent61f53d2e8fb66c105485216757612756fddb6e8d (diff)
Add engine/events/field_moves.asm
-rw-r--r--constants/sprite_anim_constants.asm8
-rwxr-xr-xengine/events/field_moves.asm449
-rw-r--r--main.asm17
3 files changed, 461 insertions, 13 deletions
diff --git a/constants/sprite_anim_constants.asm b/constants/sprite_anim_constants.asm
index 1df8c368..4ad57dbb 100644
--- a/constants/sprite_anim_constants.asm
+++ b/constants/sprite_anim_constants.asm
@@ -38,12 +38,20 @@ SPRITE_ANIM_INDEX_TRADE_TUBE_BULGE EQU $22
SPRITE_ANIM_INDEX_TRADEMON_ICON EQU $23
SPRITE_ANIM_INDEX_TRADEMON_BUBBLE EQU $24
SPRITE_ANIM_INDEX_RADIO_TUNING_KNOB EQU $26
+SPRITE_ANIM_INDEX_LEAF EQU $28
+SPRITE_ANIM_INDEX_CUT_TREE EQU $29
+SPRITE_ANIM_INDEX_FLY_LEAF EQU $2a
SPRITE_ANIM_INDEX_EGG_CRACK EQU $2b
SPRITE_ANIM_INDEX_GS_INTRO_HO_OH EQU $2c
+SPRITE_ANIM_INDEX_HEADBUTT EQU $2d
+
SPRITE_ANIM_INDEX_EGG_HATCH EQU $2e
; DoAnimFrame.Jumptable indexes (see engine/gfx/sprite_anims.asm)
SPRITE_ANIM_SEQ_NULL EQU $00
+SPRITE_ANIM_SEQ_FLY_FROM EQU $26
+SPRITE_ANIM_SEQ_FLY_LEAF EQU $27
+SPRITE_ANIM_SEQ_FLY_TO EQU $28
; SpriteAnimFrameData indexes (see data/sprite_anims/framesets.asm)
const_def
diff --git a/engine/events/field_moves.asm b/engine/events/field_moves.asm
new file mode 100755
index 00000000..3423f840
--- /dev/null
+++ b/engine/events/field_moves.asm
@@ -0,0 +1,449 @@
+FIELDMOVE_GRASS EQU $80
+FIELDMOVE_TREE EQU $84
+FIELDMOVE_FLY EQU $84
+
+PlayWhirlpoolSound:
+ call WaitSFX
+ ld de, SFX_SURF
+ call PlaySFX
+ call WaitSFX
+ ret
+
+BlindingFlash:
+ farcall FadeOutPalettes
+ ld hl, wStatusFlags
+ set STATUSFLAGS_FLASH_F, [hl]
+ farcall ReplaceTimeOfDayPals
+ farcall UpdateTimeOfDayPal
+ ld b, SCGB_MAPPALS
+ call GetSGBLayout
+ farcall FadeInPalettes
+ ret
+
+ShakeHeadbuttTree:
+ farcall ClearSpriteAnims
+ ld de, CutGrassGFX
+ ld hl, vTiles0 tile FIELDMOVE_GRASS
+ lb bc, BANK(CutGrassGFX), 4
+ call Request2bpp
+ ld de, HeadbuttTreeGFX
+ ld hl, vTiles0 tile FIELDMOVE_TREE
+ lb bc, BANK(HeadbuttTreeGFX), 8
+ call Request2bpp
+ call Cut_Headbutt_GetPixelFacing
+ ld a, SPRITE_ANIM_INDEX_HEADBUTT
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], FIELDMOVE_TREE
+ ld a, 36 * SPRITEOAMSTRUCT_LENGTH
+ ld [wCurSpriteOAMAddr], a
+ farcall DoNextFrameForAllSprites
+ call HideHeadbuttTree
+ ld a, 32
+ ld [wFrameCounter], a
+ call WaitSFX
+ ld de, SFX_SANDSTORM
+ call PlaySFX
+.loop
+ ld hl, wFrameCounter
+ ld a, [hl]
+ and a
+ jr z, .done
+ dec [hl]
+ ld a, 36 * SPRITEOAMSTRUCT_LENGTH
+ ld [wCurSpriteOAMAddr], a
+ farcall DoNextFrameForAllSprites
+ call DelayFrame
+ jr .loop
+
+.done
+ call OverworldTextModeSwitch
+ call WaitBGMap
+ xor a
+ ldh [hBGMapMode], a
+ farcall ClearSpriteAnims
+ ld hl, wVirtualOAMSprite36
+ ld bc, wVirtualOAMEnd - wVirtualOAMSprite36
+ xor a
+ call ByteFill
+ call ReplaceChrisSprite
+ ret
+
+HeadbuttTreeGFX:
+INCBIN "gfx/overworld/headbutt_tree.2bpp"
+
+HideHeadbuttTree:
+ xor a
+ ldh [hBGMapMode], a
+ ld a, [wPlayerDirection]
+ and %00001100
+ srl a
+ ld e, a
+ ld d, 0
+ ld hl, TreeRelativeLocationTable
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+ ld a, 5 ; grass block
+ ld [hli], a
+ ld [hld], a
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hli], a
+ ld [hld], a
+ call WaitBGMap
+ xor a
+ ldh [hBGMapMode], a
+ ret
+
+TreeRelativeLocationTable:
+ dwcoord 8, 8 + 2 ; RIGHT
+ dwcoord 8, 8 - 2 ; LEFT
+ dwcoord 8 - 2, 8 ; DOWN
+ dwcoord 8 + 2, 8 ; UP
+
+OWCutAnimation:
+ ; Animation index in e
+ ; 0: Split tree in half
+ ; 1: Mow the lawn
+ ld a, e
+ and 1
+ ld [wJumptableIndex], a
+ call .LoadCutGFX
+ call WaitSFX
+ ld de, SFX_PLACE_PUZZLE_PIECE_DOWN
+ call PlaySFX
+.loop
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .finish
+ ld a, 36 * SPRITEOAMSTRUCT_LENGTH
+ ld [wCurSpriteOAMAddr], a
+ callfar DoNextFrameForAllSprites
+ call OWCutJumptable
+ call DelayFrame
+ jr .loop
+
+.finish
+ ret
+
+.LoadCutGFX:
+ callfar ClearSpriteAnims ; pointless to farcall
+ ld de, CutGrassGFX
+ ld hl, vTiles0 tile FIELDMOVE_GRASS
+ lb bc, BANK(CutGrassGFX), 4
+ call Request2bpp
+ ld de, CutTreeGFX
+ ld hl, vTiles0 tile FIELDMOVE_TREE
+ lb bc, BANK(CutTreeGFX), 4
+ call Request2bpp
+ ret
+
+CutTreeGFX:
+INCBIN "gfx/overworld/cut_tree.2bpp"
+
+CutGrassGFX:
+INCBIN "gfx/overworld/cut_grass.2bpp"
+
+OWCutJumptable:
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, 0
+ ld hl, .dw
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.dw
+ dw Cut_SpawnAnimateTree
+ dw Cut_SpawnAnimateLeaves
+ dw Cut_StartWaiting
+ dw Cut_WaitAnimSFX
+
+Cut_SpawnAnimateTree:
+ call Cut_Headbutt_GetPixelFacing
+ ld a, SPRITE_ANIM_INDEX_CUT_TREE ; cut tree
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], FIELDMOVE_TREE
+ ld a, 32
+ ld [wFrameCounter], a
+; Cut_StartWaiting
+ ld hl, wJumptableIndex
+ inc [hl]
+ inc [hl]
+ ret
+
+Cut_SpawnAnimateLeaves:
+ call Cut_GetLeafSpawnCoords
+ xor a
+ call Cut_SpawnLeaf
+ ld a, $10
+ call Cut_SpawnLeaf
+ ld a, $20
+ call Cut_SpawnLeaf
+ ld a, $30
+ call Cut_SpawnLeaf
+ ld a, 32 ; frames
+ ld [wFrameCounter], a
+; Cut_StartWaiting
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+Cut_StartWaiting:
+ ld a, 1
+ ldh [hBGMapMode], a
+; Cut_WaitAnimSFX
+ ld hl, wJumptableIndex
+ inc [hl]
+
+Cut_WaitAnimSFX:
+ ld hl, wFrameCounter
+ ld a, [hl]
+ and a
+ jr z, .finished
+ dec [hl]
+ ret
+
+.finished
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+Cut_SpawnLeaf:
+ push de
+ push af
+ ld a, SPRITE_ANIM_INDEX_LEAF ; leaf
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], FIELDMOVE_GRASS
+ ld hl, SPRITEANIMSTRUCT_0E
+ add hl, bc
+ ld [hl], 4
+ pop af
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], a
+ pop de
+ ret
+
+Cut_GetLeafSpawnCoords:
+ ld de, 0
+ ld a, [wMetatileStandingX]
+ bit 0, a
+ jr z, .left_side
+ set 0, e
+.left_side
+ ld a, [wMetatileStandingY]
+ bit 0, a
+ jr z, .top_side
+ set 1, e
+.top_side
+ ld a, [wPlayerDirection]
+ and %00001100
+ add e
+ ld e, a
+ ld hl, .Coords
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ret
+
+.Coords:
+ dbpixel 11, 12 ; facing down, top left
+ dbpixel 9, 12 ; facing down, top right
+ dbpixel 11, 14 ; facing down, bottom left
+ dbpixel 9, 14 ; facing down, bottom right
+
+ dbpixel 11, 8 ; facing up, top left
+ dbpixel 9, 8 ; facing up, top right
+ dbpixel 11, 10 ; facing up, bottom left
+ dbpixel 9, 10 ; facing up, bottom right
+
+ dbpixel 7, 12 ; facing left, top left
+ dbpixel 9, 12 ; facing left, top right
+ dbpixel 7, 10 ; facing left, bottom left
+ dbpixel 9, 10 ; facing left, bottom right
+
+ dbpixel 11, 12 ; facing right, top left
+ dbpixel 13, 12 ; facing right, top right
+ dbpixel 11, 10 ; facing right, bottom left
+ dbpixel 13, 10 ; facing right, bottom right
+
+Cut_Headbutt_GetPixelFacing:
+ ld a, [wPlayerDirection]
+ and %00001100
+ srl a
+ ld e, a
+ ld d, 0
+ ld hl, .Coords
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ret
+
+.Coords:
+ dbpixel 10, 13
+ dbpixel 10, 9
+ dbpixel 8, 11
+ dbpixel 12, 11
+
+FlyFromAnim:
+ call DelayFrame
+ ld a, [wVramState]
+ push af
+ xor a
+ ld [wVramState], a
+ call FlyFunction_InitGFX
+ depixel 10, 10, 4, 0
+ ld a, SPRITE_ANIM_INDEX_RED_WALK
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], FIELDMOVE_FLY
+ ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
+ add hl, bc
+ ld [hl], SPRITE_ANIM_SEQ_FLY_FROM
+ ld a, 128
+ ld [wFrameCounter], a
+.loop
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .exit
+ ld a, 0 * SPRITEOAMSTRUCT_LENGTH
+ ld [wCurSpriteOAMAddr], a
+ callfar DoNextFrameForAllSprites
+ call FlyFunction_FrameTimer
+ call DelayFrame
+ jr .loop
+
+.exit
+ pop af
+ ld [wVramState], a
+ ret
+
+FlyToAnim:
+ call DelayFrame
+ ld a, [wVramState]
+ push af
+ xor a
+ ld [wVramState], a
+ call FlyFunction_InitGFX
+ depixel 31, 10, 4, 0
+ ld a, SPRITE_ANIM_INDEX_RED_WALK
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], FIELDMOVE_FLY
+ ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
+ add hl, bc
+ ld [hl], SPRITE_ANIM_SEQ_FLY_TO
+ ld hl, SPRITEANIMSTRUCT_0F
+ add hl, bc
+ ld [hl], 11 * 8
+ ld a, 64
+ ld [wFrameCounter], a
+.loop
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .exit
+ ld a, 0 * SPRITEOAMSTRUCT_LENGTH
+ ld [wCurSpriteOAMAddr], a
+ callfar DoNextFrameForAllSprites
+ call FlyFunction_FrameTimer
+ call DelayFrame
+ jr .loop
+
+.exit
+ pop af
+ ld [wVramState], a
+ call .RestorePlayerSprite_DespawnLeaves
+ ret
+
+.RestorePlayerSprite_DespawnLeaves:
+ ld hl, wVirtualOAMSprite00TileID
+ xor a
+ ld c, 4
+.OAMloop
+ ld [hli], a ; tile id
+rept SPRITEOAMSTRUCT_LENGTH - 1
+ inc hl
+endr
+ inc a
+ dec c
+ jr nz, .OAMloop
+ ld hl, wVirtualOAMSprite04
+ ld bc, wVirtualOAMEnd - wVirtualOAMSprite04
+ xor a
+ call ByteFill
+ ret
+
+FlyFunction_InitGFX:
+ callfar ClearSpriteAnims
+ ld de, CutGrassGFX
+ ld hl, vTiles0 tile FIELDMOVE_GRASS
+ lb bc, BANK(CutGrassGFX), 4
+ call Request2bpp
+ ld a, [wCurPartyMon]
+ ld hl, wPartySpecies
+ ld e, a
+ ld d, 0
+ add hl, de
+ ld a, [hl]
+ ld [wTempIconSpecies], a
+ ld e, FIELDMOVE_FLY
+ farcall GetSpeciesIcon
+ xor a
+ ld [wJumptableIndex], a
+ ret
+
+FlyFunction_FrameTimer:
+ call .SpawnLeaf
+ ld hl, wFrameCounter
+ ld a, [hl]
+ and a
+ jr z, .exit
+ dec [hl]
+ cp $40
+ ret c
+ and 7
+ ret nz
+ ld de, SFX_FLY
+ call PlaySFX
+ ret
+
+.exit
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+.SpawnLeaf:
+ ld hl, wce65
+ ld a, [hl]
+ inc [hl]
+ and 7
+ ret nz
+ ld a, [hl]
+ and (6 * 8) >> 1
+ sla a
+ add 8 * 8 ; gives a number in [$40, $50, $60, $70]
+ ld d, a
+ ld e, 0
+ ld a, SPRITE_ANIM_INDEX_FLY_LEAF ; fly land
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], FIELDMOVE_GRASS
+ ret
diff --git a/main.asm b/main.asm
index a4c7ecc9..421702f8 100644
--- a/main.asm
+++ b/main.asm
@@ -235,19 +235,8 @@ INCLUDE "engine/rtc/reset_password.asm"
INCLUDE "engine/menus/delete_save.asm"
INCLUDE "engine/tilesets/timeofday_pals.asm"
INCLUDE "engine/battle/battle_transition.asm"
+INCLUDE "engine/events/field_moves.asm"
-PlayWhirlpoolSound::
- dr $8ca5e, $8ca6b
-BlindingFlash::
- dr $8ca6b, $8ca8e
-ShakeHeadbuttTree::
- dr $8ca8e, $8cbb8
-OWCutAnimation::
- dr $8cbb8, $8cd65
-FlyFromAnim::
- dr $8cd65, $8cdab
-FlyToAnim::
- dr $8cdab, $8ce7c
MagnetTrain::
dr $8ce7c, $8d174
@@ -256,7 +245,9 @@ ClearSpriteAnims::
PlaySpriteAnimationsAndDelayFrame::
dr $8d183, $8d18a
PlaySpriteAnimations::
- dr $8d18a, $8d1c9
+ dr $8d18a, $8d19b
+DoNextFrameForAllSprites::
+ dr $8d19b, $8d1c9
DoNextFrameForFirst16Sprites::
dr $8d1c9, $8d1f7
_InitSpriteAnimStruct::