From 435d441d5800d08cfed9c24117b577aecf48adef Mon Sep 17 00:00:00 2001 From: xCrystal Date: Sat, 3 Feb 2024 14:22:00 +0100 Subject: [PATCH] Level selection menu: entry transition events (#12) (#35) [commit 3] --- constants/sprite_anim_constants.asm | 5 ++- data/sprite_anims/framesets.asm | 10 +++++ data/sprite_anims/oam.asm | 16 +++++++ data/sprite_anims/objects.asm | 2 + data/sprite_anims/unused_gfx.asm | 23 ---------- engine/menus/level_selection_menu.asm | 41 ++++++++++++++---- engine/sprite_anims/core.asm | 23 ---------- .../level_highlighter.png | Bin 0 -> 229 bytes 8 files changed, 64 insertions(+), 56 deletions(-) delete mode 100644 data/sprite_anims/unused_gfx.asm create mode 100755 gfx/level_selection_menu/level_highlighter.png diff --git a/constants/sprite_anim_constants.asm b/constants/sprite_anim_constants.asm index b2498b29a..c682050c1 100644 --- a/constants/sprite_anim_constants.asm +++ b/constants/sprite_anim_constants.asm @@ -20,7 +20,6 @@ DEF SPRITEANIMSTRUCT_LENGTH EQU _RS DEF NUM_SPRITE_ANIM_STRUCTS EQU 10 ; see wSpriteAnimationStructs ; wSpriteAnimDict keys (see wram.asm) -; UnusedSpriteAnimGFX indexes (see data/sprite_anims/unused_gfx.asm) const_def const SPRITE_ANIM_DICT_DEFAULT ; 0 const SPRITE_ANIM_DICT_BOARD_MENU ; 1 @@ -92,6 +91,7 @@ DEF NUM_SPRITEANIMDICT_ENTRIES EQU 10 const SPRITE_ANIM_OBJ_BOARD_MENU_BREAK_DIE ; 35 const SPRITE_ANIM_OBJ_BOARD_MENU_APPEAR_DIE_NUMBER ; 36 const SPRITE_ANIM_OBJ_BOARD_MENU_MOVE_DIE_NUMBER ; 37 + const SPRITE_ANIM_OBJ_LEVEL_SELECTION_MENU_HIGHLIGHT_LEVEL ; 38 DEF NUM_SPRITE_ANIM_OBJS EQU const_value ; DoSpriteAnimFrame.Jumptable indexes (see engine/sprite_anims/functions.asm) @@ -217,6 +217,7 @@ DEF NUM_SPRITE_ANIM_FUNCS EQU const_value const SPRITE_ANIM_FRAMESET_BOARD_MENU_BREAK_DIE ; 50 const SPRITE_ANIM_FRAMESET_BOARD_MENU_APPEAR_DIE_NUMBER ; 51 const SPRITE_ANIM_FRAMESET_BOARD_MENU_MOVE_DIE_NUMBER ; 52 + const SPRITE_ANIM_FRAMESET_LEVEL_SELECTION_MENU_HIGHLIGHT_LEVEL ; 53 DEF NUM_SPRITE_ANIM_FRAMESETS EQU const_value ; SpriteAnimOAMData indexes (see data/sprite_anims/oam.asm) @@ -382,6 +383,8 @@ DEF NUM_SPRITE_ANIM_FRAMESETS EQU const_value const SPRITE_ANIM_OAMSET_BOARD_MENU_BREAK_DIE_3 ; 9e const SPRITE_ANIM_OAMSET_BOARD_MENU_BREAK_DIE_4 ; 9f const SPRITE_ANIM_OAMSET_BOARD_MENU_DIE_NUMBER ; a0 + const SPRITE_ANIM_OAMSET_LSM_HIGHLIGHT_LEVEL_1 ; a1 + const SPRITE_ANIM_OAMSET_LSM_HIGHLIGHT_LEVEL_2 ; a2 DEF NUM_SPRITE_ANIM_OAMSETS EQU const_value assert NUM_SPRITE_ANIM_OAMSETS <= FIRST_OAM_CMD, \ diff --git a/data/sprite_anims/framesets.asm b/data/sprite_anims/framesets.asm index e31b0dc7d..c167f23f0 100644 --- a/data/sprite_anims/framesets.asm +++ b/data/sprite_anims/framesets.asm @@ -78,6 +78,7 @@ SpriteAnimFrameData: dw .Frameset_BoardMenuBreakDie dw .Frameset_BoardMenuAppearDieNumber dw .Frameset_BoardMenuMoveDieNumber + dw .Frameset_LevelSelectionMenuHighlightLevel assert_table_length NUM_SPRITE_ANIM_FRAMESETS .Frameset_00: @@ -586,3 +587,12 @@ SpriteAnimFrameData: .Frameset_BoardMenuMoveDieNumber: oamframe SPRITE_ANIM_OAMSET_BOARD_MENU_DIE_NUMBER, 42 oamdelete + +.Frameset_LevelSelectionMenuHighlightLevel: + oamframe SPRITE_ANIM_OAMSET_LSM_HIGHLIGHT_LEVEL_1, 15 + oamframe SPRITE_ANIM_OAMSET_LSM_HIGHLIGHT_LEVEL_2, 15 + oamframe SPRITE_ANIM_OAMSET_LSM_HIGHLIGHT_LEVEL_1, 15 + oamframe SPRITE_ANIM_OAMSET_LSM_HIGHLIGHT_LEVEL_2, 15 + oamframe SPRITE_ANIM_OAMSET_LSM_HIGHLIGHT_LEVEL_1, 15 + oamframe SPRITE_ANIM_OAMSET_LSM_HIGHLIGHT_LEVEL_2, 15 + oamdelete diff --git a/data/sprite_anims/oam.asm b/data/sprite_anims/oam.asm index 1be1ed8b8..f360c29aa 100644 --- a/data/sprite_anims/oam.asm +++ b/data/sprite_anims/oam.asm @@ -168,6 +168,8 @@ SpriteAnimOAMData: spriteanimoam $00, .OAMData_BreakDie3 ; SPRITE_ANIM_OAMSET_BOARD_MENU_BREAK_DIE_3 spriteanimoam $00, .OAMData_BreakDie4 ; SPRITE_ANIM_OAMSET_BOARD_MENU_BREAK_DIE_4 spriteanimoam $00, .OAMData_DieNumber ; SPRITE_ANIM_OAMSET_BOARD_MENU_DIE_NUMBER + spriteanimoam $00, .OAMData_HighlightLevel1 ; SPRITE_ANIM_OAMSET_LSM_HIGHLIGHT_LEVEL_1 + spriteanimoam $00, .OAMData_HighlightLevel2 ; SPRITE_ANIM_OAMSET_LSM_HIGHLIGHT_LEVEL_2 assert_table_length NUM_SPRITE_ANIM_OAMSETS @@ -1186,3 +1188,17 @@ SpriteAnimOAMData: dbsprite -1, 0, 4, 0, $51, 1 dbsprite 0, 0, 4, 0, $52, 1 dbsprite 1, 0, 4, 0, $53, 1 + +.OAMData_HighlightLevel1: + db 4 + dbsprite -1, -1, 0, 0, 24 + NUM_DIRECTIONS + NUM_LEVEL_STAGES * 2 + NUM_DAYTIMES * 4 + 0, 0 + dbsprite 0, -1, 0, 0, 24 + NUM_DIRECTIONS + NUM_LEVEL_STAGES * 2 + NUM_DAYTIMES * 4 + 1, 0 + dbsprite -1, 0, 0, 0, 24 + NUM_DIRECTIONS + NUM_LEVEL_STAGES * 2 + NUM_DAYTIMES * 4 + 2, 0 + dbsprite 0, 0, 0, 0, 24 + NUM_DIRECTIONS + NUM_LEVEL_STAGES * 2 + NUM_DAYTIMES * 4 + 3, 0 + +.OAMData_HighlightLevel2: + db 4 + dbsprite -1, -1, 0, 0, 24 + NUM_DIRECTIONS + NUM_LEVEL_STAGES * 2 + NUM_DAYTIMES * 4 + 4, 0 + dbsprite 0, -1, 0, 0, 24 + NUM_DIRECTIONS + NUM_LEVEL_STAGES * 2 + NUM_DAYTIMES * 4 + 5, 0 + dbsprite -1, 0, 0, 0, 24 + NUM_DIRECTIONS + NUM_LEVEL_STAGES * 2 + NUM_DAYTIMES * 4 + 6, 0 + dbsprite 0, 0, 0, 0, 24 + NUM_DIRECTIONS + NUM_LEVEL_STAGES * 2 + NUM_DAYTIMES * 4 + 7, 0 diff --git a/data/sprite_anims/objects.asm b/data/sprite_anims/objects.asm index c4777ba98..c4eefe1e1 100644 --- a/data/sprite_anims/objects.asm +++ b/data/sprite_anims/objects.asm @@ -114,5 +114,7 @@ SpriteAnimObjects: db SPRITE_ANIM_FRAMESET_BOARD_MENU_APPEAR_DIE_NUMBER, SPRITE_ANIM_FUNC_NULL, SPRITE_ANIM_DICT_DEFAULT ; SPRITE_ANIM_OBJ_BOARD_MENU_MOVE_DIE_NUMBER db SPRITE_ANIM_FRAMESET_BOARD_MENU_MOVE_DIE_NUMBER, SPRITE_ANIM_FUNC_BOARD_MENU_MOVE_DIE_NUMBER, SPRITE_ANIM_DICT_DEFAULT +; SPRITE_ANIM_OBJ_LEVEL_SELECTION_MENU_HIGHLIGHT_LEVEL + db SPRITE_ANIM_FRAMESET_LEVEL_SELECTION_MENU_HIGHLIGHT_LEVEL, SPRITE_ANIM_FUNC_NULL, SPRITE_ANIM_DICT_DEFAULT assert_table_length NUM_SPRITE_ANIM_OBJS diff --git a/data/sprite_anims/unused_gfx.asm b/data/sprite_anims/unused_gfx.asm deleted file mode 100644 index 9dae35b26..000000000 --- a/data/sprite_anims/unused_gfx.asm +++ /dev/null @@ -1,23 +0,0 @@ -MACRO sprite_anim_obj_gfx -; # tiles, gfx pointer - db \1 - dbw \2, \3 -ENDM - -UnusedSpriteAnimGFX: -; entries correspond to SPRITE_ANIM_DICT_* constants - table_width 4, UnusedSpriteAnimGFX - ; # tiles, gfx bank, gfx pointer - ; (all pointers were dummied out to .DeletedGFX) - sprite_anim_obj_gfx 128, $01, .DeletedGFX ; SPRITE_ANIM_DICT_DEFAULT - sprite_anim_obj_gfx 128, $01, .DeletedGFX ; unused - sprite_anim_obj_gfx 128, $01, .DeletedGFX ; unused - sprite_anim_obj_gfx 128, $01, .DeletedGFX ; unused - sprite_anim_obj_gfx 16, $37, .DeletedGFX ; unused - sprite_anim_obj_gfx 16, $11, .DeletedGFX ; SPRITE_ANIM_DICT_TEXT_CURSOR - sprite_anim_obj_gfx 16, $39, .DeletedGFX ; SPRITE_ANIM_DICT_GS_SPLASH (the bank includes engine/movie/splash.asm) - sprite_anim_obj_gfx 16, $24, .DeletedGFX ; SPRITE_ANIM_DICT_SLOTS (the bank includes engine/games/slot_machine.asm) - sprite_anim_obj_gfx 16, $21, .DeletedGFX ; SPRITE_ANIM_DICT_ARROW_CURSOR - assert_table_length NUM_SPRITE_ANIM_GFX - -.DeletedGFX diff --git a/engine/menus/level_selection_menu.asm b/engine/menus/level_selection_menu.asm index 9402d82b5..029255d53 100755 --- a/engine/menus/level_selection_menu.asm +++ b/engine/menus/level_selection_menu.asm @@ -21,17 +21,17 @@ LevelSelectionMenu:: ld a, [wLevelSelectionMenuEntryEventQueue] bit LSMEVENT_SHOW_UNLOCKED_LEVELS, a - jr z, .load_default_landmark + jp z, .load_default_landmark ld a, [wLastUnlockedLevelsCount] and a - jr z, .load_default_landmark + jp z, .load_default_landmark ld hl, wLastUnlockedLevels .show_unlocked_levels_loop ld a, [hli] cp $ff - jr z, .load_default_landmark + jp z, .load_default_landmark push hl ; perform level-to-landmark lookup of wLastUnlockedLevels[i] in $ff-terminated LandmarkToLevelTable. @@ -53,6 +53,7 @@ LevelSelectionMenu:: call LevelSelectionMenu_GetLandmarkPage ld [wLevelSelectionMenuCurrentPage], a +; load and draw gfx involved in the show unlocked levels event call LevelSelectionMenu_DrawTilemapAndAttrmap call LevelSelectionMenu_DrawTimeOfDaySymbol ld b, CGB_LEVEL_SELECTION_MENU @@ -65,15 +66,32 @@ LevelSelectionMenu:: call LevelSelectionMenu_DrawStageTrophies call LevelSelectionMenu_RefreshTextboxAttrs - ld c, 60 - call DelayFrames +; play animation that highlights landmark of unlocked level + ld a, [wLevelSelectionMenuCurrentLandmark] + call LevelSelectionMenu_GetLandmarkCoords + ld a, SPRITE_ANIM_OBJ_LEVEL_SELECTION_MENU_HIGHLIGHT_LEVEL + call InitSpriteAnimStruct + ld a, (15 + 1) * 6 ; %01100000 +.highlight_level_anim_loop + ld [wFrameCounter], a + ld a, [wFrameCounter] + and %11111 + ld de, SFX_POKEBALLS_PLACED_ON_TABLE + call z, PlaySFX + farcall PlaySpriteAnimationsAndDelayFrame + ld a, [wFrameCounter] + dec a + jr nz, .highlight_level_anim_loop + farcall ClearSpriteAnims + +; fade to the next unlocked level, or to the regular level selection menu ld b, RGBFADE_TO_BLACK_6BGP_1OBP2 call DoRGBFadeEffect ld c, 30 ; call DelayFrames ; black screen --> next landmark shown .invalid_level pop hl - jr .show_unlocked_levels_loop + jp .show_unlocked_levels_loop .load_default_landmark ld a, [wDefaultLevelSelectionMenuLandmark] @@ -234,6 +252,10 @@ LevelSelectionMenu_LoadGFX: ; ld de, vTiles0 + (24 + NUM_DIRECTIONS + NUM_LEVEL_STAGES * 2) tiles ld bc, NUM_DAYTIMES * 4 tiles call FarCopyBytes + ld hl, LevelSelectionMenuLevelHighlighterGFX +; ld de, vTiles0 + (24 + NUM_DIRECTIONS + NUM_LEVEL_STAGES * 2 + NUM_DAYTIMES * 4) tiles + ld bc, 8 tiles + call FarCopyBytes ret LevelSelectionMenu_InitTilemap: @@ -307,7 +329,6 @@ LevelSelectionMenu_InitPlayerSprite: add hl, bc ld [hl], $00 ld a, [wLevelSelectionMenuCurrentLandmark] - ld e, a call LevelSelectionMenu_GetLandmarkCoords ; wSpriteAnim1*Coord contain the coord of the bottom right object of the player sprite ld hl, SPRITEANIMSTRUCT_XCOORD @@ -837,12 +858,11 @@ LevelSelectionMenu_GetLandmarkPage: ret LevelSelectionMenu_GetLandmarkCoords:: -; Return coordinates (d, e) of landmark e. +; Return coordinates (d, e) of landmark a. push hl push bc ld hl, LevelSelectionMenu_Landmarks + $1 ld bc, LevelSelectionMenu_Landmarks.landmark2 - LevelSelectionMenu_Landmarks.landmark1 - ld a, e call AddNTimes ld a, [hli] ld e, a @@ -1144,3 +1164,6 @@ INCBIN "gfx/level_selection_menu/stage_trophies.2bpp" LevelSelectionMenuTimeOfDaySymbolsGFX: INCBIN "gfx/level_selection_menu/time_of_day_symbols.2bpp" + +LevelSelectionMenuLevelHighlighterGFX: +INCBIN "gfx/level_selection_menu/level_highlighter.2bpp" diff --git a/engine/sprite_anims/core.asm b/engine/sprite_anims/core.asm index 23f611c9c..7afa9c2b9 100644 --- a/engine/sprite_anims/core.asm +++ b/engine/sprite_anims/core.asm @@ -510,27 +510,6 @@ GetFrameOAMPointer: add hl, de ret -UnusedLoadSpriteAnimGFX: ; unreferenced - push hl - ld l, a - ld h, 0 - add hl, hl - add hl, hl - ld de, UnusedSpriteAnimGFX - add hl, de - ld c, [hl] - inc hl - ld b, [hl] - inc hl - ld e, [hl] - inc hl - ld d, [hl] - pop hl - push bc - call Request2bpp - pop bc - ret - INCLUDE "data/sprite_anims/objects.asm" INCLUDE "engine/sprite_anims/functions.asm" @@ -539,8 +518,6 @@ INCLUDE "data/sprite_anims/framesets.asm" INCLUDE "data/sprite_anims/oam.asm" -INCLUDE "data/sprite_anims/unused_gfx.asm" - Sprites_Cosine: ; a = d * cos(a * pi/32) add %010000 ; cos(x) = sin(x + pi/2) diff --git a/gfx/level_selection_menu/level_highlighter.png b/gfx/level_selection_menu/level_highlighter.png new file mode 100755 index 0000000000000000000000000000000000000000..5665fbac64b288ba61f046ce392b27feab2fdb1b GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3QY`6?zK#qG8~eHcB(eheoCO|{ z#S9EWB_ParFHODzDA?}l;uzxL{dV$2z6J#j*R}m$l>eR-YG>ovv1zTGjsDIZ-%lmv zxvTjsU^^o5@rbA9!u+7`4WO`TN z{in?gRzBP-H5spUsodHY#lBeJEKf=P!Pg8D>jJqnqH=#(?%#b(eNBTX!FVdQ&MBb@0H_vE!T