Board menu: break die and appear die number animations (#11)

This commit is contained in:
xCrystal
2023-09-26 20:09:13 +02:00
parent db7d9c7063
commit 98d69d4e04
12 changed files with 188 additions and 8 deletions

View File

@@ -226,6 +226,71 @@ DIE_MAX_NUMBER EQU 6
ld [wScriptVar], a
ret
BoardMenu_BreakDieAnimation:
farcall LoadBoardMenuDieNumbersGFX
ld a, [wDieRoll]
dec a
add a
ld c, a
ld a, SPRITE_ANIM_DICT_BOARD_MENU
ld hl, wSpriteAnimDict ; wSpriteAnimDict[0]
ld [hli], a
ld a, DIE_ROLL_OAM_FIRST_TILE
add c
ld [hli], a
xor a ; SPRITE_ANIM_DICT_DEFAULT
ld [hli], a ; wSpriteAnimDict[1]
ld a, DIE_NUMBERS_OAM_FIRST_TILE
add c
ld [hl], a
; initialize break die animation
depixel 8, 10, 0, 0
ld a, SPRITE_ANIM_OBJ_BOARD_MENU_BREAK_DIE
call InitSpriteAnimStruct
; initialize appear die number animation, but only if there is enough
; OAM space without pushing aside some NPC (aesthetic failsafe).
ldh a, [hUsedSpriteIndex]
cp (NUM_SPRITE_OAM_STRUCTS * SPRITEOAMSTRUCT_LENGTH) - (4 * SPRITEOAMSTRUCT_LENGTH) + 1
jr nc, .anims_initialized
depixel 8, 10, 0, 0
ld a, SPRITE_ANIM_OBJ_BOARD_MENU_APPEAR_DIE_NUMBER
call InitSpriteAnimStruct
.anims_initialized
ld hl, wDisplaySecondarySprites
res SECONDARYSPRITES_DIE_ROLL_F, [hl]
ld hl, wVramState
set 2, [hl] ; do not clear wShadowOAM during DoNextFrameForAllSprites
; animation plays above NPCs so draw the graphics at the beginning of OAM.
; begin placing NPC sprites in OAM after all objects allocated to animations.
ld a, [wSpriteAnim2Index]
and a
ld a, $8 * SPRITEOAMSTRUCT_LENGTH ; with SPRITE_ANIM_OBJ_BOARD_MENU_APPEAR_DIE_NUMBER
jr nz, .go
ld a, $4 * SPRITEOAMSTRUCT_LENGTH ; w/o SPRITE_ANIM_OBJ_BOARD_MENU_APPEAR_DIE_NUMBER
ldh [hUsedSpriteIndex], a
.go
farcall _UpdateSpritesAfterOffset
ld a, 44 ; total duration of SPRITE_ANIM_FRAMESET_BOARD_MENU_BREAK_DIE
ld [wFrameCounter], a
.loop
farcall PlaySpriteAnimationsAndDelayFrame
ld hl, wFrameCounter
ld a, [hl]
and a
jr z, .done
dec [hl]
jr .loop
.done
ld hl, wVramState
res 2, [hl]
ret
BoardMenu_Party:
ld a, [wPartyCount]
and a
@@ -247,9 +312,6 @@ BoardMenu_Party:
ldh [hMenuReturn], a
ret
BoardMenu_BreakDieAnimation:
ret
BoardMenu_Pack:
call BoardMenu_OpenSubmenu
farcall Pack

View File

@@ -9,7 +9,7 @@ LoadBoardMenuGFX::
call Get2bppViaHDMA
ld de, .DieRollOAMGFX
ld hl, vTiles0 + DIE_ROLL_OAM_FIRST_TILE * LEN_2BPP_TILE
lb bc, BANK(.BoardMenuOAMGFX), DIE_SIZE * 10
lb bc, BANK(.DieRollOAMGFX), DIE_SIZE * 10
call Get2bppViaHDMA
ret
@@ -26,4 +26,15 @@ INCBIN "gfx/board/menu_exit.2bpp"
assert_table_length NUM_BOARD_MENU_ITEMS
.DieRollOAMGFX:
INCBIN "gfx/board/die_roll.2bpp"
INCBIN "gfx/board/die_roll.2bpp"
LoadBoardMenuDieNumbersGFX::
ld de, .DieNumbersOAMGFX
; overwrite in vTiles0 the no-longer-needed BoardMenuOAMGFX, but keep DieRollOAMGFX
ld hl, vTiles0 + DIE_NUMBERS_OAM_FIRST_TILE * LEN_2BPP_TILE
lb bc, BANK(.DieNumbersOAMGFX), DIE_NUMBER_SIZE * 10
call Get2bppViaHDMA
ret
.DieNumbersOAMGFX:
INCBIN "gfx/board/die_numbers.2bpp"

View File

@@ -2754,12 +2754,19 @@ ResetObject:
db SPRITEMOVEDATA_STANDING_LEFT
db SPRITEMOVEDATA_STANDING_RIGHT
_UpdateSpritesAfterOffset::
ld a, [wVramState]
bit 0, a
ret z
jr _UpdateSprites.go
_UpdateSprites::
ld a, [wVramState]
bit 0, a
ret z
xor a
ldh [hUsedSpriteIndex], a
.go
ldh a, [hOAMUpdate]
push af
ld a, 1

View File

@@ -53,6 +53,9 @@ DoSpriteAnimFrame:
dw SpriteAnimFunc_LevelSelectionMenuWalkUp
dw SpriteAnimFunc_LevelSelectionMenuWalkLeft
dw SpriteAnimFunc_LevelSelectionMenuWalkRight
dw SpriteAnimFunc_BoardMenuBreakDie
dw SpriteAnimFunc_BoardMenuAppearDieNumber
dw SpriteAnimFunc_BoardMenuMoveDieNumber
assert_table_length NUM_SPRITE_ANIM_FUNCS
SpriteAnimFunc_Null:
@@ -877,6 +880,15 @@ SpriteAnimFunc_LevelSelectionMenuWalkRight:
inc [hl]
ret
SpriteAnimFunc_BoardMenuBreakDie:
ret
SpriteAnimFunc_BoardMenuAppearDieNumber:
ret
SpriteAnimFunc_BoardMenuMoveDieNumber:
ret
LevelSelectionMenuHandleTransition:
; return carry if apply x/y displacement during this frame
ld a, [wLevelSelectionMenuStandingStill]