接入狂热模式与暴走堆叠进化路线

This commit is contained in:
2026-04-25 12:59:39 +08:00
parent 77e5d01ef0
commit d740022123
4 changed files with 139 additions and 3 deletions
+12
View File
@@ -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)
+90 -2
View File
@@ -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;
+32 -1
View File
@@ -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);