From d7400221235554e2a0a7bb491a630df284c4d744 Mon Sep 17 00:00:00 2001 From: Qi-huanye <2728290997@qq.com> Date: Sat, 25 Apr 2026 12:59:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A5=E5=85=A5=E7=8B=82=E7=83=AD=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8E=E6=9A=B4=E8=B5=B0=E5=A0=86=E5=8F=A0=E8=BF=9B?= =?UTF-8?q?=E5=8C=96=E8=B7=AF=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/include/Tetris.h | 5 ++ src/source/Tetris.cpp | 12 +++++ src/source/TetrisLogic.cpp | 92 ++++++++++++++++++++++++++++++++++++- src/source/TetrisRender.cpp | 33 ++++++++++++- 4 files changed, 139 insertions(+), 3 deletions(-) diff --git a/src/include/Tetris.h b/src/include/Tetris.h index 11b31b0..72d9042 100644 --- a/src/include/Tetris.h +++ b/src/include/Tetris.h @@ -59,6 +59,11 @@ struct PlayerStats int laserLevel; int thunderTetrisLevel; int thunderLaserLevel; + int feverLevel; + int rageStackLevel; + int infiniteFeverLevel; + int feverLineCharge; + int feverTicks; int stableStructureLevel; int doubleGrowthLevel; int gamblerLevel; diff --git a/src/source/Tetris.cpp b/src/source/Tetris.cpp index 3cba999..8e34f47 100644 --- a/src/source/Tetris.cpp +++ b/src/source/Tetris.cpp @@ -155,6 +155,18 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) shouldRefresh = true; } + if (currentMode == MODE_ROGUE && rogueStats.feverTicks > 0) + { + rogueStats.feverTicks--; + currentFallInterval = 500 + rogueStats.slowFallStacks * 80; + if (rogueStats.feverTicks > 0) + { + currentFallInterval += 120; + } + ResetGameTimer(hWnd); + shouldRefresh = true; + } + if (currentScreen == SCREEN_PLAYING && !suspendFlag && !gameOverFlag) diff --git a/src/source/TetrisLogic.cpp b/src/source/TetrisLogic.cpp index dfdb6f8..8f6d372 100644 --- a/src/source/TetrisLogic.cpp +++ b/src/source/TetrisLogic.cpp @@ -47,7 +47,10 @@ enum UpgradeId UPGRADE_CHAIN_BOMB = 15, UPGRADE_LASER_PIECE = 16, UPGRADE_THUNDER_TETRIS = 17, - UPGRADE_THUNDER_LASER = 18 + UPGRADE_THUNDER_LASER = 18, + UPGRADE_FEVER_MODE = 19, + UPGRADE_RAGE_STACK = 20, + UPGRADE_INFINITE_FEVER = 21 }; static const UpgradeEntry kUpgradePool[] = @@ -67,6 +70,9 @@ static const UpgradeEntry kUpgradePool[] = { UPGRADE_LASER_PIECE, -1, true, _T("\u6fc0\u5149\u65b9\u5757"), _T("\u7279\u6b8a"), _T("\u63d0\u9ad8\u6fc0\u5149\u65b9\u5757\u51fa\u73b0\u6982\u7387\uff0c\u843d\u5730\u540e\u6e05\u9664\u6240\u5728\u6574\u5217\u3002") }, { UPGRADE_THUNDER_TETRIS, 1, false, _T("\u96f7\u9706\u56db\u6d88"), _T("\u8fdb\u9636"), _T("\u6bcf\u6b21\u5b8c\u6210\u56db\u6d88\u65f6\uff0c\u989d\u5916\u6e05\u9664\u968f\u673a 2 \u884c\u3002") }, { UPGRADE_THUNDER_LASER, 1, false, _T("\u96f7\u9706\u6fc0\u5149"), _T("\u8fdb\u5316"), _T("\u56db\u6d88\u65f6\u989d\u5916\u53d1\u5c04 2 \u9053\u6fc0\u5149\uff0c\u968f\u673a\u6e05\u9664 2 \u5217\u5e76\u83b7\u5f97 EXP\u3002") }, + { UPGRADE_FEVER_MODE, 1, false, _T("\u72c2\u70ed\u6a21\u5f0f"), _T("\u8fdb\u9636"), _T("\u7d2f\u8ba1\u6d88\u884c 20 \u884c\u540e\u8fdb\u5165 10 \u79d2\u72c2\u70ed\u72b6\u6001\u3002") }, + { UPGRADE_RAGE_STACK, 1, false, _T("\u66b4\u8d70\u5806\u53e0"), _T("\u8fdb\u9636"), _T("\u8fde\u7eed\u6d88\u884c\u8d8a\u591a\uff0c\u5f97\u5206\u500d\u7387\u8ffd\u52a0\u8d8a\u9ad8\u3002") }, + { UPGRADE_INFINITE_FEVER, 1, false, _T("\u65e0\u9650\u72c2\u70ed"), _T("\u8fdb\u5316"), _T("\u72c2\u70ed\u671f\u95f4\u6d88\u884c\u53ef\u5ef6\u957f\u65f6\u95f4\uff0c\u8fde\u51fb\u8d8a\u9ad8\u500d\u7387\u8d8a\u5f3a\u3002") }, { UPGRADE_STABLE_STRUCTURE, -1, true, _T("\u7a33\u5b9a\u7ed3\u6784"), _T("\u7279\u6b8a"), _T("\u843d\u5730\u540e\u5c0f\u6982\u7387\u81ea\u52a8\u586b\u8865\u90bb\u8fd1\u7a7a\u6d1e\uff0c\u63d0\u9ad8\u76d8\u9762\u7ed3\u6784\u7a33\u5b9a\u6027\u3002") }, { UPGRADE_DOUBLE_GROWTH, -1, true, _T("\u53cc\u500d\u6210\u957f"), _T("\u7279\u6b8a"), _T("\u989d\u5916\u63d0\u9ad8\u6d88\u884c\u5f97\u5206\u4e0e EXP \u6536\u76ca\uff0c\u6bcf\u5c42\u518d\u8ffd\u52a0 15%\u3002") }, { UPGRADE_PIECE_TUNING, -1, true, _T("\u65b9\u5757\u6539\u9020"), _T("\u7279\u6b8a"), _T("\u9009\u62e9\u4e00\u79cd\u65b9\u5757\uff0c\u964d\u4f4e\u5176\u540e\u7eed\u51fa\u73b0\u6982\u7387\u3002") }, @@ -231,6 +237,11 @@ static void ResetPlayerStats(PlayerStats& stats, bool useRogueRules) stats.laserLevel = 0; stats.thunderTetrisLevel = 0; stats.thunderLaserLevel = 0; + stats.feverLevel = 0; + stats.rageStackLevel = 0; + stats.infiniteFeverLevel = 0; + stats.feverLineCharge = 0; + stats.feverTicks = 0; stats.stableStructureLevel = 0; stats.doubleGrowthLevel = 0; stats.gamblerLevel = 0; @@ -294,6 +305,12 @@ static int GetUpgradeCurrentLevel(int upgradeId) return rogueStats.thunderTetrisLevel; case UPGRADE_THUNDER_LASER: return rogueStats.thunderLaserLevel; + case UPGRADE_FEVER_MODE: + return rogueStats.feverLevel; + case UPGRADE_RAGE_STACK: + return rogueStats.rageStackLevel; + case UPGRADE_INFINITE_FEVER: + return rogueStats.infiniteFeverLevel; case UPGRADE_STABLE_STRUCTURE: return rogueStats.stableStructureLevel; case UPGRADE_DOUBLE_GROWTH: @@ -348,6 +365,21 @@ static bool IsUpgradeSelectable(const UpgradeEntry& entry) return rogueStats.laserLevel > 0 && rogueStats.thunderTetrisLevel > 0 && rogueStats.thunderLaserLevel == 0; } + if (entry.id == UPGRADE_FEVER_MODE) + { + return rogueStats.feverLevel == 0; + } + + if (entry.id == UPGRADE_RAGE_STACK) + { + return rogueStats.rageStackLevel == 0; + } + + if (entry.id == UPGRADE_INFINITE_FEVER) + { + return rogueStats.feverLevel > 0 && rogueStats.rageStackLevel > 0 && rogueStats.infiniteFeverLevel == 0; + } + if (entry.repeatable) { return true; @@ -739,7 +771,12 @@ static void FillUpgradeOptions() static int GetRogueFallInterval() { - return 500 + rogueStats.slowFallStacks * 80; + int baseInterval = 500 + rogueStats.slowFallStacks * 80; + if (currentMode == MODE_ROGUE && rogueStats.feverTicks > 0) + { + baseInterval += 120; + } + return baseInterval; } static void ApplyUpgradeById(int upgradeId, int targetPieceType, int applyCount) @@ -817,6 +854,15 @@ static void ApplyUpgradeById(int upgradeId, int targetPieceType, int applyCount) case UPGRADE_THUNDER_LASER: rogueStats.thunderLaserLevel = 1; break; + case UPGRADE_FEVER_MODE: + rogueStats.feverLevel = 1; + break; + case UPGRADE_RAGE_STACK: + rogueStats.rageStackLevel = 1; + break; + case UPGRADE_INFINITE_FEVER: + rogueStats.infiniteFeverLevel = 1; + break; case UPGRADE_STABLE_STRUCTURE: rogueStats.stableStructureLevel += applyCount; break; @@ -869,6 +915,12 @@ static void ApplyLineClearResult(int linesCleared) expGain = expGain * growthMultiplierPercent / 100; } + if (rogueStats.feverTicks > 0) + { + scoreGain *= 2; + expGain *= 2; + } + int gamblerBonusPercent = 0; if (rogueStats.gamblerLevel > 0) { @@ -889,10 +941,46 @@ static void ApplyLineClearResult(int linesCleared) scoreGain += (rogueStats.comboChain - 1) * rogueStats.comboBonusStacks * 50; } + if (rogueStats.rageStackLevel > 0 && rogueStats.comboChain > 1) + { + int rageBonusPercent = (rogueStats.comboChain - 1) * 15; + if (rogueStats.infiniteFeverLevel > 0 && rogueStats.feverTicks > 0) + { + rageBonusPercent += (rogueStats.comboChain - 1) * 10; + } + scoreGain += scoreGain * rageBonusPercent / 100; + } + rogueStats.totalLinesCleared += linesCleared; rogueStats.score += scoreGain; rogueStats.exp += expGain; + if (rogueStats.feverLevel > 0) + { + rogueStats.feverLineCharge += linesCleared; + while (rogueStats.feverLineCharge >= 20) + { + rogueStats.feverLineCharge -= 20; + rogueStats.feverTicks = 10; + currentFallInterval = GetRogueFallInterval(); + SetFeedbackMessage(_T("\u8fdb\u5165\u72c2\u70ed\u6a21\u5f0f"), _T("\u672a\u6765 10 \u79d2\u5f97\u5206 / EXP x2\uff0c\u4e0b\u843d\u66f4\u6162\u3002"), 12); + } + } + + if (rogueStats.infiniteFeverLevel > 0 && rogueStats.feverTicks > 0) + { + rogueStats.feverTicks += 1; + if (linesCleared == 4) + { + rogueStats.feverTicks += 3; + } + if (rogueStats.feverTicks > 20) + { + rogueStats.feverTicks = 20; + } + currentFallInterval = GetRogueFallInterval(); + } + if (rogueStats.chainBlastLevel > 0) { int chainBlastCells = 0; diff --git a/src/source/TetrisRender.cpp b/src/source/TetrisRender.cpp index 1240b0c..894cbe3 100644 --- a/src/source/TetrisRender.cpp +++ b/src/source/TetrisRender.cpp @@ -362,7 +362,7 @@ void TDrawScreen(HDC hdc, HWND hWnd) hdc, _T("\u7ecf\u5178\u6a21\u5f0f\uff1a\u4fdd\u6301\u539f\u7248\u4fc4\u7f57\u65af\u65b9\u5757\u73a9\u6cd5\uff0c\u4ee5\u6d88\u884c\u548c\u751f\u5b58\u4e3a\u4e3b\u3002\r\n\r\n") _T("Rogue \u6a21\u5f0f\uff1a\u6d88\u884c\u540e\u9664\u4e86\u83b7\u5f97\u5206\u6570\uff0c\u8fd8\u4f1a\u83b7\u5f97 EXP\u3002EXP \u8fbe\u5230\u9608\u503c\u540e\u89e6\u53d1\u5347\u7ea7\uff0c\u4ece\u4e09\u4e2a\u5f3a\u5316\u4e2d\u9009\u4e00\u4e2a\u3002\r\n\r\n") - _T("\u5f53\u524d\u5df2\u63a5\u5165\uff1a\u7206\u7834\u65b9\u5757\u3001\u8fde\u9501\u7206\u7834\u3001\u8fde\u73af\u70b8\u5f39\u53ca\u591a\u79cd Rogue \u7279\u6b8a\u5f3a\u5316\u3002\r\n\r\n") + _T("\u5f53\u524d\u5df2\u63a5\u5165\uff1a\u7206\u7834\u8def\u7ebf\u3001\u96f7\u7535\u8def\u7ebf\u3001\u72c2\u70ed\u8def\u7ebf\u53ca\u591a\u79cd Rogue \u7279\u6b8a\u5f3a\u5316\u3002\r\n\r\n") _T("\u63d0\u793a\uff1a\u6682\u505c\u3001\u5931\u8d25\u548c\u5347\u7ea7\u4f1a\u8fdb\u5165\u4e0d\u540c\u754c\u9762\uff0c\u8bf7\u6839\u636e\u5c4f\u5e55\u63d0\u793a\u64cd\u4f5c\u3002"), -1, &rulesBody, @@ -726,6 +726,25 @@ void TDrawScreen(HDC hdc, HWND hWnd) TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(402), _T("\u96f7\u9706\u6fc0\u5149 \u56db\u6d88\u52a0\u6fc0\u5149 2 \u5217"), lstrlen(_T("\u96f7\u9706\u6fc0\u5149 \u56db\u6d88\u52a0\u6fc0\u5149 2 \u5217"))); } + if (rogueStats.feverLevel > 0) + { + TCHAR feverText[96]; + _stprintf_s(feverText, _T("\u72c2\u70ed\u5145\u80fd %d / 20 \u5269\u4f59 %d \u79d2"), rogueStats.feverLineCharge, rogueStats.feverTicks); + TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(434), feverText, lstrlen(feverText)); + } + + if (rogueStats.rageStackLevel > 0) + { + TCHAR rageText[96]; + _stprintf_s(rageText, _T("\u66b4\u8d70\u5806\u53e0 \u8fde\u51fb %d"), rogueStats.comboChain); + TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(466), rageText, lstrlen(rageText)); + } + + if (rogueStats.infiniteFeverLevel > 0) + { + TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(498), _T("\u65e0\u9650\u72c2\u70ed \u6d88\u884c\u53ef\u5ef6\u957f\u65f6\u95f4"), lstrlen(_T("\u65e0\u9650\u72c2\u70ed \u6d88\u884c\u53ef\u5ef6\u957f\u65f6\u95f4"))); + } + if (rogueStats.chainBlastLevel > 0) { TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(274), _T("\u8fde\u9501\u7206\u7834 \u5df2\u89e3\u9501"), lstrlen(_T("\u8fde\u9501\u7206\u7834 \u5df2\u89e3\u9501"))); @@ -852,6 +871,18 @@ void TDrawScreen(HDC hdc, HWND hWnd) { _stprintf_s(upgradeSummary + lstrlen(upgradeSummary), 512 - lstrlen(upgradeSummary), _T("\u96f7\u9706\u6fc0\u5149 Lv.1\r\n")); } + if (rogueStats.feverLevel > 0) + { + _stprintf_s(upgradeSummary + lstrlen(upgradeSummary), 512 - lstrlen(upgradeSummary), _T("\u72c2\u70ed\u6a21\u5f0f Lv.1\r\n")); + } + if (rogueStats.rageStackLevel > 0) + { + _stprintf_s(upgradeSummary + lstrlen(upgradeSummary), 512 - lstrlen(upgradeSummary), _T("\u66b4\u8d70\u5806\u53e0 Lv.1\r\n")); + } + if (rogueStats.infiniteFeverLevel > 0) + { + _stprintf_s(upgradeSummary + lstrlen(upgradeSummary), 512 - lstrlen(upgradeSummary), _T("\u65e0\u9650\u72c2\u70ed Lv.1\r\n")); + } if (rogueStats.stableStructureLevel > 0) { _stprintf_s(upgradeSummary + lstrlen(upgradeSummary), 512 - lstrlen(upgradeSummary), _T("\u7a33\u5b9a\u7ed3\u6784 Lv.%d\r\n"), rogueStats.stableStructureLevel);