diff --git a/src/include/Tetris.h b/src/include/Tetris.h index 49a8f1e..f63a4f2 100644 --- a/src/include/Tetris.h +++ b/src/include/Tetris.h @@ -266,6 +266,7 @@ void TriggerLineClearEffect(const int* rows, int rowCount, int linesCleared); void PlayPendingLineClearEffect(); void TriggerCellClearEffect(const Point* cells, int cellCount, bool strongBurst); void AwardRogueSkillClearRewards(int clearedCells, int& scoreGain, int& expGain, bool allowLevelProgress); +void CheckRogueLevelProgress(); void ApplyBoardGravity(); int GetRogueFallInterval(); int GetRoguePlayableHeight(); diff --git a/src/source/Tetris.cpp b/src/source/Tetris.cpp index 6c96cce..63d34ba 100644 --- a/src/source/Tetris.cpp +++ b/src/source/Tetris.cpp @@ -608,6 +608,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) if (!gameOverFlag) { DeleteLines(); + CheckRogueLevelProgress(); } } @@ -911,6 +912,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) if (!gameOverFlag) { DeleteLines(); + CheckRogueLevelProgress(); } } break; @@ -924,6 +926,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) if (!gameOverFlag) { DeleteLines(); + CheckRogueLevelProgress(); } break; case 'C': diff --git a/src/source/TetrisRender.cpp b/src/source/TetrisRender.cpp index ed989f9..494a6b0 100644 --- a/src/source/TetrisRender.cpp +++ b/src/source/TetrisRender.cpp @@ -1152,6 +1152,10 @@ void TDrawScreen(HDC hdc, HWND hWnd) { expFillRect.right = expFillRect.left; } + if (expFillRect.right > expBarRect.right) + { + expFillRect.right = expBarRect.right; + } HBRUSH expFillBrush = CreateSolidBrush(accentColor); FillRect(hdc, &expFillRect, expFillBrush); DeleteObject(expFillBrush); diff --git a/src/source/TetrisRogue.cpp b/src/source/TetrisRogue.cpp index a68f880..c05a705 100644 --- a/src/source/TetrisRogue.cpp +++ b/src/source/TetrisRogue.cpp @@ -1572,6 +1572,53 @@ void AwardRogueSkillClearRewards(int clearedCells, int& scoreGain, int& expGain, } } +void CheckRogueLevelProgress() +{ + if (currentMode != MODE_ROGUE || currentScreen != SCREEN_PLAYING) + { + return; + } + + int levelUps = ApplyLevelProgress(rogueStats); + if (levelUps <= 0) + { + return; + } + + upgradeUiState.pendingCount += levelUps; + + int shockwaveRows = 0; + if (rogueStats.evolutionImpactLevel > 0) + { + shockwaveRows = 3; + rogueStats.feverTicks = kFeverDurationTicks; + currentFallInterval = GetRogueFallInterval(); + } + else if (rogueStats.upgradeShockwaveLevel > 0) + { + shockwaveRows = 2; + } + + if (shockwaveRows > 0) + { + pendingUpgradeShockwaveRows = shockwaveRows; + pendingEvolutionImpactShockwave = rogueStats.evolutionImpactLevel > 0; + } + + TCHAR feedbackTitle[64]; + TCHAR feedbackDetail[128]; + _stprintf_s(feedbackTitle, _T("灵感涌现 x%d"), levelUps); + _stprintf_s( + feedbackDetail, + _T("等级 Lv.%d EXP %d/%d 选择新的强化"), + rogueStats.level, + rogueStats.exp, + rogueStats.requiredExp); + SetFeedbackMessage(feedbackTitle, feedbackDetail, 10); + + OpenUpgradeMenu(); +} + void ApplyBoardGravity() { int playableHeight = GetRoguePlayableHeight();