diff --git a/src/include/Tetris.h b/src/include/Tetris.h index 7ecaedf..0d9d0a0 100644 --- a/src/include/Tetris.h +++ b/src/include/Tetris.h @@ -269,6 +269,7 @@ void SetFeedbackMessage(const TCHAR* title, const TCHAR* detail, int ticks); void OpenRulesScreen(); void OpenUpgradeMenu(); void ConfirmUpgradeSelection(); +void ResetUpgradeUiState(); void HoldCurrentPiece(); void UseScreenBomb(); void UseBlackHole(); diff --git a/src/source/TetrisLogic.cpp b/src/source/TetrisLogic.cpp index 9c1966c..1f40d9f 100644 --- a/src/source/TetrisLogic.cpp +++ b/src/source/TetrisLogic.cpp @@ -855,12 +855,7 @@ void Restart() ResetPlayerStats(classicStats, false); ResetPlayerStats(rogueStats, true); - upgradeUiState.selectedIndex = 0; - upgradeUiState.optionCount = 0; - upgradeUiState.pendingCount = 0; - upgradeUiState.totalChosenCount = 0; - upgradeUiState.picksRemaining = 0; - upgradeUiState.markedCount = 0; + ResetUpgradeUiState(); feedbackState.visibleTicks = 0; feedbackState.title[0] = _T('\0'); feedbackState.detail[0] = _T('\0'); diff --git a/src/source/TetrisLogicInnovation.cpp b/src/source/TetrisLogicInnovation.cpp index 0ba321c..a543caa 100644 --- a/src/source/TetrisLogicInnovation.cpp +++ b/src/source/TetrisLogicInnovation.cpp @@ -528,9 +528,7 @@ void ReturnToMainMenu() pendingLineClearEffectRowCount = 0; pendingLineClearEffectLineCount = 0; menuState.optionCount = 3; - upgradeUiState.pendingCount = 0; - upgradeUiState.picksRemaining = 0; - upgradeUiState.markedCount = 0; + ResetUpgradeUiState(); if (menuState.selectedIndex < 0 || menuState.selectedIndex >= menuState.optionCount) { diff --git a/src/source/TetrisRogue.cpp b/src/source/TetrisRogue.cpp index 974299a..08e4935 100644 --- a/src/source/TetrisRogue.cpp +++ b/src/source/TetrisRogue.cpp @@ -2274,12 +2274,34 @@ void ResetPendingRogueVisualEvents() pendingEvolutionImpactShockwave = false; } +/** + * @brief 清空升级选择界面的所有临时状态,避免跨局残留。 + */ +void ResetUpgradeUiState() +{ + upgradeUiState.selectedIndex = 0; + upgradeUiState.optionCount = 0; + upgradeUiState.pendingCount = 0; + upgradeUiState.totalChosenCount = 0; + upgradeUiState.picksRemaining = 0; + upgradeUiState.markedCount = 0; + for (int i = 0; i < 6; i++) + { + upgradeUiState.marked[i] = false; + upgradeUiState.options[i] = {}; + } +} + /** * @brief 在 Rogue 模式中打开升级强化选择界面。 */ void OpenUpgradeMenu() { - if (currentMode != MODE_ROGUE || upgradeUiState.pendingCount <= 0) + if (currentMode != MODE_ROGUE || + currentScreen != SCREEN_PLAYING || + suspendFlag || + gameOverFlag || + upgradeUiState.pendingCount <= 0) { return; }