Add engine/events/field_moves.asm

This commit is contained in:
libjet
2020-05-31 02:42:16 +01:00
parent 61f53d2e8f
commit 8a892f8240
3 changed files with 461 additions and 13 deletions

View File

@@ -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

449
engine/events/field_moves.asm Executable file
View File

@@ -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

View File

@@ -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::