diff --git a/src/include/Tetris.h b/src/include/Tetris.h index 72d9042..22d97da 100644 --- a/src/include/Tetris.h +++ b/src/include/Tetris.h @@ -64,6 +64,10 @@ struct PlayerStats int infiniteFeverLevel; int feverLineCharge; int feverTicks; + int screenBombLevel; + int screenBombCharge; + int screenBombCount; + int terminalClearLevel; int stableStructureLevel; int doubleGrowthLevel; int gamblerLevel; diff --git a/src/source/TetrisLogic.cpp b/src/source/TetrisLogic.cpp index 8f6d372..ee4e05d 100644 --- a/src/source/TetrisLogic.cpp +++ b/src/source/TetrisLogic.cpp @@ -50,7 +50,9 @@ enum UpgradeId UPGRADE_THUNDER_LASER = 18, UPGRADE_FEVER_MODE = 19, UPGRADE_RAGE_STACK = 20, - UPGRADE_INFINITE_FEVER = 21 + UPGRADE_INFINITE_FEVER = 21, + UPGRADE_SCREEN_BOMB = 22, + UPGRADE_TERMINAL_CLEAR = 23 }; static const UpgradeEntry kUpgradePool[] = @@ -73,6 +75,8 @@ static const UpgradeEntry kUpgradePool[] = { 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_SCREEN_BOMB, 1, false, _T("\u6e05\u5c4f\u70b8\u5f39"), _T("\u8fdb\u9636"), _T("\u7d2f\u8ba1\u6d88\u884c 30 \u884c\u540e\u83b7\u5f97 1 \u6b21\u6e05\u5c4f\u70b8\u5f39\uff0c\u53ef\u81ea\u52a8\u6216\u4e3b\u52a8\u6e05\u9664\u5e95\u90e8 5 \u884c\u3002") }, + { UPGRADE_TERMINAL_CLEAR, 1, false, _T("\u7ec8\u672b\u6e05\u573a"), _T("\u8fdb\u5316"), _T("\u6fc0\u6d3b\u6700\u540e\u4e00\u640f\u65f6\u81ea\u52a8\u91ca\u653e\u4e00\u6b21\u6e05\u5c4f\u70b8\u5f39\uff0c\u5e76\u8fdb\u5165 10 \u79d2\u72c2\u70ed\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") }, @@ -242,6 +246,10 @@ static void ResetPlayerStats(PlayerStats& stats, bool useRogueRules) stats.infiniteFeverLevel = 0; stats.feverLineCharge = 0; stats.feverTicks = 0; + stats.screenBombLevel = 0; + stats.screenBombCharge = 0; + stats.screenBombCount = 0; + stats.terminalClearLevel = 0; stats.stableStructureLevel = 0; stats.doubleGrowthLevel = 0; stats.gamblerLevel = 0; @@ -311,6 +319,10 @@ static int GetUpgradeCurrentLevel(int upgradeId) return rogueStats.rageStackLevel; case UPGRADE_INFINITE_FEVER: return rogueStats.infiniteFeverLevel; + case UPGRADE_SCREEN_BOMB: + return rogueStats.screenBombLevel; + case UPGRADE_TERMINAL_CLEAR: + return rogueStats.terminalClearLevel; case UPGRADE_STABLE_STRUCTURE: return rogueStats.stableStructureLevel; case UPGRADE_DOUBLE_GROWTH: @@ -380,6 +392,16 @@ static bool IsUpgradeSelectable(const UpgradeEntry& entry) return rogueStats.feverLevel > 0 && rogueStats.rageStackLevel > 0 && rogueStats.infiniteFeverLevel == 0; } + if (entry.id == UPGRADE_SCREEN_BOMB) + { + return rogueStats.screenBombLevel == 0; + } + + if (entry.id == UPGRADE_TERMINAL_CLEAR) + { + return rogueStats.screenBombLevel > 0 && rogueStats.lastChanceUpgradeLevel > 0 && rogueStats.terminalClearLevel == 0; + } + if (entry.repeatable) { return true; @@ -528,6 +550,32 @@ static int ClearColumnAt(int column) return clearedCellCount; } +static int TriggerScreenBomb() +{ + int clearedCellCount = 0; + + for (int i = 0; i < 5; i++) + { + int row = nGameHeight - 1 - i; + if (row < 0) + { + break; + } + + for (int x = 0; x < nGameWidth; x++) + { + if (workRegion[row][x] != 0) + { + clearedCellCount++; + } + } + + DeleteOneLine(row); + } + + return clearedCellCount; +} + static int TriggerChainBlast(int lineAnchor) { if (currentMode != MODE_ROGUE || rogueStats.chainBlastLevel <= 0) @@ -863,6 +911,12 @@ static void ApplyUpgradeById(int upgradeId, int targetPieceType, int applyCount) case UPGRADE_INFINITE_FEVER: rogueStats.infiniteFeverLevel = 1; break; + case UPGRADE_SCREEN_BOMB: + rogueStats.screenBombLevel = 1; + break; + case UPGRADE_TERMINAL_CLEAR: + rogueStats.terminalClearLevel = 1; + break; case UPGRADE_STABLE_STRUCTURE: rogueStats.stableStructureLevel += applyCount; break; @@ -981,6 +1035,17 @@ static void ApplyLineClearResult(int linesCleared) currentFallInterval = GetRogueFallInterval(); } + if (rogueStats.screenBombLevel > 0) + { + rogueStats.screenBombCharge += linesCleared; + while (rogueStats.screenBombCharge >= 30) + { + rogueStats.screenBombCharge -= 30; + rogueStats.screenBombCount++; + SetFeedbackMessage(_T("\u6e05\u5c4f\u70b8\u5f39\u5c31\u7eea"), _T("\u5df2\u83b7\u5f97 1 \u6b21\u6e05\u9664\u5e95\u90e8 5 \u884c\u7684\u673a\u4f1a\u3002"), 12); + } + } + if (rogueStats.chainBlastLevel > 0) { int chainBlastCells = 0; @@ -1398,7 +1463,23 @@ void Fixing() if (overflowTop) { - if (currentMode == MODE_ROGUE && rogueStats.lastChanceCount > 0) + if (currentMode == MODE_ROGUE && rogueStats.terminalClearLevel > 0 && rogueStats.lastChanceCount > 0 && rogueStats.screenBombCount > 0) + { + rogueStats.lastChanceCount--; + rogueStats.screenBombCount--; + + int clearedByTerminal = TriggerScreenBomb(); + rogueStats.feverTicks = 10; + currentFallInterval = GetRogueFallInterval(); + + TCHAR terminalDetail[128]; + _stprintf_s( + terminalDetail, + _T("\u7ec8\u672b\u6e05\u573a\u751f\u6548\uff0c\u6e05\u9664 %d \u683c\uff0c\u5e76\u8fdb\u5165 10 \u79d2\u72c2\u70ed\u3002"), + clearedByTerminal); + SetFeedbackMessage(_T("\u7ec8\u672b\u6e05\u573a\u89e6\u53d1"), terminalDetail, 14); + } + else if (currentMode == MODE_ROGUE && rogueStats.lastChanceCount > 0) { rogueStats.lastChanceCount--; diff --git a/src/source/TetrisRender.cpp b/src/source/TetrisRender.cpp index 894cbe3..8cb0d24 100644 --- a/src/source/TetrisRender.cpp +++ b/src/source/TetrisRender.cpp @@ -745,6 +745,18 @@ void TDrawScreen(HDC hdc, HWND hWnd) 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.screenBombLevel > 0) + { + TCHAR bombText[96]; + _stprintf_s(bombText, _T("\u6e05\u5c4f\u70b8\u5f39 %d / 30 \u5e93\u5b58 %d"), rogueStats.screenBombCharge, rogueStats.screenBombCount); + TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(530), bombText, lstrlen(bombText)); + } + + if (rogueStats.terminalClearLevel > 0) + { + TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(562), _T("\u7ec8\u672b\u6e05\u573a \u6fc0\u6d3b\u6700\u540e\u4e00\u640f\u65f6\u81ea\u52a8\u89e6\u53d1"), lstrlen(_T("\u7ec8\u672b\u6e05\u573a \u6fc0\u6d3b\u6700\u540e\u4e00\u640f\u65f6\u81ea\u52a8\u89e6\u53d1"))); + } + 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"))); @@ -883,6 +895,14 @@ void TDrawScreen(HDC hdc, HWND hWnd) { _stprintf_s(upgradeSummary + lstrlen(upgradeSummary), 512 - lstrlen(upgradeSummary), _T("\u65e0\u9650\u72c2\u70ed Lv.1\r\n")); } + if (rogueStats.screenBombLevel > 0) + { + _stprintf_s(upgradeSummary + lstrlen(upgradeSummary), 512 - lstrlen(upgradeSummary), _T("\u6e05\u5c4f\u70b8\u5f39 Lv.1\r\n")); + } + if (rogueStats.terminalClearLevel > 0) + { + _stprintf_s(upgradeSummary + lstrlen(upgradeSummary), 512 - lstrlen(upgradeSummary), _T("\u7ec8\u672b\u6e05\u573a 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);