From 9d0fbf3883bc92673afa054a07e85cf49cec1add Mon Sep 17 00:00:00 2001 From: xCrystal Date: Mon, 29 Jan 2024 19:52:08 +0100 Subject: [PATCH] Level selection menu: entry transition events (#12) (#35) [commit 2] --- constants/level_constants.asm | 4 ++++ engine/menus/cleared_level_screen.asm | 19 +++++++++--------- engine/menus/game_menu.asm | 10 ++++++++- engine/menus/level_selection_menu.asm | 8 ++++++-- .../time_of_day_symbols.png | Bin 390 -> 391 bytes ram/wram.asm | 11 ++++------ 6 files changed, 32 insertions(+), 20 deletions(-) diff --git a/constants/level_constants.asm b/constants/level_constants.asm index 7beb3896b..e4631e20d 100755 --- a/constants/level_constants.asm +++ b/constants/level_constants.asm @@ -29,3 +29,7 @@ DEF STAGE_4 EQU 1 << STAGE_4_F const UNLOCK_WHEN_LEVELS_CLEARED ; 00 const UNLOCK_WHEN_NUMBER_OF_LEVELS_CLEARED ; 01 const UNLOCK_WHEN_TECHNIQUES_CLEARED ; 02 + +; maximum amount of levels that can be unlocked in a single level cleared run. +; levels to unlock are processed in level order. +DEF MAX_UNLOCK_LEVELS_AT_ONCE EQU 10 diff --git a/engine/menus/cleared_level_screen.asm b/engine/menus/cleared_level_screen.asm index 9da8256ac..a8c210986 100755 --- a/engine/menus/cleared_level_screen.asm +++ b/engine/menus/cleared_level_screen.asm @@ -31,10 +31,6 @@ ClearedLevelScreen: .exit call AddLevelCoinsToBalance call ClearLevel - xor a - ld [wNumTempUnlockedLevels], a - ld a, $ff - ld [wTempUnlockedLevels], a jp UnlockLevels .LevelCleared1Text: @@ -92,7 +88,10 @@ ComputeLevelsToUnlock: inc b ld a, b cp NUM_LEVELS - jr z, .done + jr z, .done ; done if went through all existing levels + ld a, [wLastUnlockedLevelsCount] + cp MAX_UNLOCK_LEVELS_AT_ONCE + jr nc, .done ; done if reached the capacity of wLastUnlockedLevels ; advance hl to next level in LevelUnlockRequirements .loop ld a, [hli] @@ -169,19 +168,19 @@ ComputeLevelsToUnlock: jr .check_techniques_cleared_loop .reqs_met -; add level to wTempUnlockedLevels +; add level to wLastUnlockedLevels pop bc ; b = which level push hl - ld a, [wNumTempUnlockedLevels] + ld a, [wLastUnlockedLevelsCount] ld e, a ld d, 0 - ld hl, wTempUnlockedLevels + ld hl, wLastUnlockedLevels add hl, de ld [hl], b inc hl ld [hl], $ff inc a - ld [wNumTempUnlockedLevels], a + ld [wLastUnlockedLevelsCount], a pop hl pop de ret @@ -192,7 +191,7 @@ ComputeLevelsToUnlock: ret SaveUnlockedLevels: - ld hl, wTempUnlockedLevels + ld hl, wLastUnlockedLevels .loop ld a, [hli] ld e, a diff --git a/engine/menus/game_menu.asm b/engine/menus/game_menu.asm index 90716ae44..56ea01fbf 100755 --- a/engine/menus/game_menu.asm +++ b/engine/menus/game_menu.asm @@ -145,14 +145,22 @@ GameMenu_WorldMap: call ClearObjectStructs call ClearBGPalettes call ClearSprites +; clear unlocked levels + xor a + ld [wLastUnlockedLevelsCount], a + ld a, $ff + ld [wLastUnlockedLevels], a +; handle overworld exit ld a, [wExitOverworldReason] cp CLEARED_LEVEL jr nz, .save_and_return +; if CLEARED_LEVEL: +; show post-level screen, clear level, unlock levels, advance ToD, request appropriate LSM events farcall ClearedLevelScreen call AdvanceTimeOfDay ld hl, wLevelSelectionMenuEntryEventQueue set LSMEVENT_ANIMATE_TIME_OF_DAY, [hl] - ld a, [wNumTempUnlockedLevels] + ld a, [wLastUnlockedLevelsCount] and a jr z, .save_and_return set LSMEVENT_SHOW_UNLOCKED_LEVELS, [hl] diff --git a/engine/menus/level_selection_menu.asm b/engine/menus/level_selection_menu.asm index ca8611824..4a1443d3a 100755 --- a/engine/menus/level_selection_menu.asm +++ b/engine/menus/level_selection_menu.asm @@ -23,14 +23,18 @@ LevelSelectionMenu:: bit LSMEVENT_SHOW_UNLOCKED_LEVELS, a jr z, .load_default_landmark - ld hl, wTempUnlockedLevels + ld a, [wLastUnlockedLevelsCount] + and a + jr z, .load_default_landmark + + ld hl, wLastUnlockedLevels .show_unlocked_levels_loop ld a, [hli] cp $ff jr z, .load_default_landmark push hl -; perform level-to-landmark lookup of wTempUnlockedLevels[i] in $ff-terminated LandmarkToLevelTable. +; perform level-to-landmark lookup of wLastUnlockedLevels[i] in $ff-terminated LandmarkToLevelTable. ; stop at the first match and load it to wLevelSelectionMenuCurrentLandmark. ld hl, LandmarkToLevelTable ld c, 0 diff --git a/gfx/level_selection_menu/time_of_day_symbols.png b/gfx/level_selection_menu/time_of_day_symbols.png index 09585ca415d8ff803d8a047173142ecd36e675b0..b1f7c53ba0ead6d5e6983fc3bc23e52b4981c11f 100755 GIT binary patch delta 327 zcmV-N0l5B#1BU~UNq;FxL_t(oN9C6b4#FT1M5}jf57{2FGRQUyF3V?3W8zCTrNB6_ zeALGoSpJx2dRE!CEtTeA^w8> zm(Y~&0;>mT3zNOV>sw;^NNDu?#~q+E89JuYvK+^eO8#mvdVg7U4RoGg$*8}12S8X3 z#Hy>o>V?tC3nTu`OYknN)xU!*0X>62yWVCRR?jly9}|Fz(Lreqt7l>SV*+r_M$eko zu=*OkyM^&LzXiN))Vi1$eN8Jjc+Vt9{eR{X^uUA=n4FGp@Ke770QBApg4Qk)di=8l zK&%_}hn4l#06dh1!e1^VdlsI|B1v;P7XE#nrfp2hb+ Z&lmDHl8;HWa0>tc002ovPDHLkV1lMaoyGtF delta 326 zcmV-M0lEH%1BL^TNq;CwL_t(oN9C6Z4uUWgMA19KA>okNsr_VHyN@9zzT}5))V5LUVp8-at=-@~lN|N`nM<$+CWOG`IKIJ8{SE-o*H#d;c9GHJA0+@{ z>*NmtEaGvDsy{bOn