diff options
author | libjet <libj3t@gmail.com> | 2020-05-31 02:42:16 +0100 |
---|---|---|
committer | libjet <libj3t@gmail.com> | 2020-05-31 02:42:16 +0100 |
commit | 8a892f8240d1ed4fc69a00b4740dafa438d2efca (patch) | |
tree | aea78e6d5fe9e681b9e6e0882d9248ebedc01fc8 | |
parent | 61f53d2e8fb66c105485216757612756fddb6e8d (diff) |
Add engine/events/field_moves.asm
-rw-r--r-- | constants/sprite_anim_constants.asm | 8 | ||||
-rwxr-xr-x | engine/events/field_moves.asm | 449 | ||||
-rw-r--r-- | main.asm | 17 |
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 @@ -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:: |