From 01d06f1a5fddf8dcf38c93043854e648ee46e5b1 Mon Sep 17 00:00:00 2001 From: Qi-huanye <2728290997@qq.com> Date: Sun, 26 Apr 2026 14:33:52 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=95=B0=E5=80=BC=E7=BB=93?= =?UTF-8?q?=E6=9E=84=20=E6=8F=90=E5=8D=87=E7=88=BD=E6=84=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/source/TetrisRender.cpp | 10 +-- src/source/TetrisRogue.cpp | 129 ++++++++++++++++++++---------------- 2 files changed, 78 insertions(+), 61 deletions(-) diff --git a/src/source/TetrisRender.cpp b/src/source/TetrisRender.cpp index 9c062df..ed989f9 100644 --- a/src/source/TetrisRender.cpp +++ b/src/source/TetrisRender.cpp @@ -643,12 +643,12 @@ void TDrawScreen(HDC hdc, HWND hWnd) { _T("赏金纹章:得分+20%\r\n成长印记:EXP+25%\r\n缓坠羽翼:下落变慢\r\n连击律动:连续消行加分;先见之眼:预览+1"), _T("最后一搏:濒死清底3行\r\n备用仓:解锁 Hold\r\n完美旋转:卡墙修正\r\n时间缓流:高堆叠减速;空中换形:V 变 I 块"), - _T("卸压清场:清最高行\r\n底线清道夫:消行充能清底\r\n清屏炸弹:X 清底5行\r\n黑洞奇点:Z 吞噬最多方块"), - _T("爆破核心:爆破块清 3x3\r\n棱镜激光:清整列\r\n十字方块:清行列\r\n彩虹方块:补齐缺口;方块改造:提高 I 块概率"), - _T("连锁火花:消行追加破坏\r\n连环炸弹:爆破扩大 5x5\r\n雷霆四消:四消额外轰击\r\n雷霆棱镜:四消额外激光"), - _T("狂热节拍:20行进狂热\r\n怒火连段:连击加倍率\r\n无尽狂热:延长狂热\r\n高压悬赏 / 豪赌四消 / 极限玩家:高风险高收益"), + _T("卸压清场:清最高行\r\n底线清道夫:更快充能清底\r\n清屏炸弹:X 清底5行,16行充能\r\n黑洞奇点:Z 吞噬最多方块,获得2次"), + _T("爆破核心:更频繁爆破块清 3x3\r\n棱镜激光:更高概率清整列\r\n十字方块:更高概率清行列\r\n彩虹方块:更高概率补齐缺口;方块改造:提高 I 块概率"), + _T("连锁火花:消行追加破坏\r\n连环炸弹:爆破扩大 5x5\r\n雷霆四消:三消/四消额外轰击\r\n雷霆棱镜:三消/四消额外激光"), + _T("狂热节拍:12行进狂热\r\n怒火连段:连击加倍率\r\n无尽狂热:延长狂热\r\n高压悬赏 / 豪赌四消 / 极限玩家:高风险高收益"), _T("双重抉择:升级多选1个\r\n命运轮盘:6选2但带诅咒\r\n升级冲击波 / 进化冲击:升级清底\r\n成长核心:永久得分 / EXP +15%"), - _T("操控大师:Hold 后减速并预览+1\r\n方块风暴:接下来全 I 块\r\n稳定结构:落地补洞\r\n虚空核心:黑洞和彩虹联动;赌徒契约:强化可能翻倍或落空") + _T("操控大师:Hold 后减速并预览+1\r\n方块风暴:接下来5个全 I 块\r\n稳定结构:更高概率落地补洞\r\n虚空核心:黑洞和彩虹联动;赌徒契约:强化可能翻倍或落空") }; int columnGap = SS(18); diff --git a/src/source/TetrisRogue.cpp b/src/source/TetrisRogue.cpp index 41e25fb..a68f880 100644 --- a/src/source/TetrisRogue.cpp +++ b/src/source/TetrisRogue.cpp @@ -56,16 +56,16 @@ static const UpgradeEntry kUpgradePool[] = { UPGRADE_HOLD_UNLOCK, 1, 78, false, _T("备用仓"), _T("特殊"), _T("解锁 Hold。按 C 或 Shift 暂存下落方块,每个方块落地前限用一次。") }, { UPGRADE_PRESSURE_RELIEF, -1, 82, true, _T("卸压清场"), _T("特殊"), _T("立刻清除最高占用行,为棋盘腾出一段喘息空间。") }, { UPGRADE_SWEEPER, -1, 74, true, _T("底线清道夫"), _T("特殊"), _T("消行会为清道夫充能,充满后自动清除底部 1 行。") }, - { UPGRADE_EXPLOSIVE_PIECE, -1, 76, true, _T("爆破核心"), _T("特殊"), _T("提高爆破方块出现率。爆破方块落地时清除 3x3 区域。") }, + { UPGRADE_EXPLOSIVE_PIECE, -1, 86, true, _T("爆破核心"), _T("特殊"), _T("大幅提高爆破方块出现率。爆破方块落地时清除 3x3 区域。") }, { UPGRADE_CHAIN_BLAST, 1, 92, false, _T("连锁火花"), _T("进阶"), _T("每次消行后,在被清除行附近追加随机破坏。") }, { UPGRADE_CHAIN_BOMB, 1, 110, false, _T("连环炸弹"), _T("进化"), _T("爆破范围扩大为 5x5;若引发消行,再追加一次小爆炸。") }, - { UPGRADE_LASER_PIECE, -1, 72, true, _T("棱镜激光"), _T("特殊"), _T("提高激光方块出现率。激光方块落地后清除所在整列。") }, - { UPGRADE_THUNDER_TETRIS, 1, 94, false, _T("雷霆四消"), _T("进阶"), _T("完成四消时,额外轰击随机 2 行。") }, - { UPGRADE_THUNDER_LASER, 1, 112, false, _T("雷霆棱镜"), _T("进化"), _T("四消时额外发射 2 道激光,随机清除 2 列并获得 EXP。") }, - { UPGRADE_FEVER_MODE, 1, 84, false, _T("狂热节拍"), _T("进阶"), _T("累计消行 20 行后进入 10 秒狂热:得分与 EXP 翻倍。") }, + { UPGRADE_LASER_PIECE, -1, 84, true, _T("棱镜激光"), _T("特殊"), _T("大幅提高激光方块出现率。激光方块落地后清除所在整列。") }, + { UPGRADE_THUNDER_TETRIS, 1, 94, false, _T("雷霆四消"), _T("进阶"), _T("完成三消或四消时,额外轰击随机 2 行。") }, + { UPGRADE_THUNDER_LASER, 1, 112, false, _T("雷霆棱镜"), _T("进化"), _T("三消或四消时额外发射 2 道激光,随机清除 2 列并获得 EXP。") }, + { UPGRADE_FEVER_MODE, 1, 92, false, _T("狂热节拍"), _T("进阶"), _T("累计消行 12 行后进入 12 秒狂热:得分与 EXP 翻倍。") }, { UPGRADE_RAGE_STACK, 1, 84, false, _T("怒火连段"), _T("进阶"), _T("连续消行越多,得分倍率追加越高。") }, { UPGRADE_INFINITE_FEVER, 1, 110, false, _T("无尽狂热"), _T("进化"), _T("狂热期间消行可延长狂热时间;连击越高,倍率越凶。") }, - { UPGRADE_SCREEN_BOMB, 1, 78, false, _T("清屏炸弹"), _T("进阶"), _T("累计消行 30 行后获得 1 枚炸弹。按 X 可清除底部 5 行。") }, + { UPGRADE_SCREEN_BOMB, 1, 90, false, _T("清屏炸弹"), _T("进阶"), _T("立刻获得 1 枚炸弹;之后累计消行 16 行再获得 1 枚。按 X 清底 5 行。") }, { UPGRADE_TERMINAL_CLEAR, 1, 108, false, _T("终末清场"), _T("进化"), _T("最后一搏启动时,自动引爆 1 枚清屏炸弹,并进入 10 秒狂热。") }, { UPGRADE_DUAL_CHOICE, 1, 68, false, _T("双重抉择"), _T("进阶"), _T("每次升级可额外选择 1 个强化,但下一次升级所需 EXP +30%。") }, { UPGRADE_DESTINY_WHEEL, 1, 104, false, _T("命运轮盘"), _T("进化"), _T("升级时出现 6 个选项,可选择 2 个;其中 1 个会携带诅咒。") }, @@ -78,10 +78,10 @@ static const UpgradeEntry kUpgradePool[] = { UPGRADE_EVOLUTION_IMPACT, 1, 118, false, _T("进化冲击"), _T("进化"), _T("升级时清除底部 3 行,并获得 10 秒双倍 EXP。") }, { UPGRADE_CONTROL_MASTER, 1, 112, false, _T("操控大师"), _T("进化"), _T("使用备用仓后短暂降低下落速度,并额外增加 1 个预览方块。") }, { UPGRADE_BLOCK_STORM, 1, 82, false, _T("方块风暴"), _T("爆发"), _T("接下来 5 个方块全部变为 I 块,快速制造四消机会。") }, - { UPGRADE_CROSS_PIECE, -1, 76, true, _T("十字方块"), _T("爆发"), _T("提高十字方块出现率。十字方块落地后清除所在行与所在列。") }, - { UPGRADE_BLACK_HOLE, 1, 78, false, _T("黑洞奇点"), _T("特殊"), _T("获得 1 次黑洞。按 Z 吞噬棋盘上数量最多的一种固定方块。") }, - { UPGRADE_AIR_RESHAPE, 1, 74, false, _T("空中换形"), _T("操作"), _T("获得 1 次换形。按 V 将正在下落的方块重塑为 I 块。") }, - { UPGRADE_RAINBOW_PIECE, 1, 74, false, _T("彩虹方块"), _T("爆发"), _T("有概率生成彩虹方块。落地后自动补齐行内缺口,更容易达成消行。") }, + { UPGRADE_CROSS_PIECE, -1, 84, true, _T("十字方块"), _T("爆发"), _T("大幅提高十字方块出现率。十字方块落地后清除所在行与所在列。") }, + { UPGRADE_BLACK_HOLE, 1, 88, false, _T("黑洞奇点"), _T("特殊"), _T("获得 2 次黑洞。按 Z 吞噬棋盘上数量最多的一种固定方块。") }, + { UPGRADE_AIR_RESHAPE, 1, 82, false, _T("空中换形"), _T("操作"), _T("获得 2 次换形。按 V 将正在下落的方块重塑为 I 块。") }, + { UPGRADE_RAINBOW_PIECE, 1, 84, false, _T("彩虹方块"), _T("爆发"), _T("更高概率生成彩虹方块。落地后自动补齐行内缺口,更容易达成消行。") }, { UPGRADE_VOID_CORE, 1, 112, false, _T("虚空核心"), _T("进化"), _T("黑洞后额外生成 1 个彩虹方块;彩虹消行时撕开小型黑洞。") }, { UPGRADE_STABLE_STRUCTURE, -1, 72, true, _T("稳定结构"), _T("特殊"), _T("落地后有小概率填补邻近空洞,让阵型更加稳固。") }, { UPGRADE_DOUBLE_GROWTH, 1, 84, false, _T("成长核心"), _T("成长"), _T("永久获得 +15% 得分与 +15% EXP;每局只能选择一次。") }, @@ -94,6 +94,11 @@ static constexpr int kDifficultyStepMs = 30000; static constexpr int kDifficultySpeedStepMs = 18; static constexpr int kMaxRogueLockedRows = 4; static constexpr int kDifficultyLevelsPerLockedRow = 3; +static constexpr int kFeverLineThreshold = 12; +static constexpr int kFeverDurationTicks = 12; +static constexpr int kScreenBombLineThreshold = 16; +static constexpr int kExplosiveBaseInterval = 6; +static constexpr int kExplosiveMinInterval = 3; static int pendingUpgradeShockwaveRows = 0; static bool pendingEvolutionImpactShockwave = false; @@ -594,9 +599,9 @@ static int GetTopOccupiedRow() static int GetSweeperThreshold() { - int reduction = (rogueStats.sweeperLevel - 1) * 2; - int threshold = 8 - reduction; - return threshold < 3 ? 3 : threshold; + int reduction = (rogueStats.sweeperLevel - 1); + int threshold = 5 - reduction; + return threshold < 2 ? 2 : threshold; } static bool RollExplosivePiece() @@ -606,12 +611,23 @@ static bool RollExplosivePiece() return false; } - if (rogueStats.explosivePieceCounter < 10) + int explosiveInterval = kExplosiveBaseInterval - (rogueStats.explosiveLevel - 1); + if (explosiveInterval < kExplosiveMinInterval) + { + explosiveInterval = kExplosiveMinInterval; + } + + if (rogueStats.feverTicks > 0 && explosiveInterval > kExplosiveMinInterval) + { + explosiveInterval--; + } + + if (rogueStats.explosivePieceCounter < explosiveInterval) { rogueStats.explosivePieceCounter++; } - if (rogueStats.explosivePieceCounter < 10) + if (rogueStats.explosivePieceCounter < explosiveInterval) { return false; } @@ -627,18 +643,18 @@ static bool RollLaserPiece() return false; } - int chancePercent = 10 + (rogueStats.laserLevel - 1) * 8; - if (chancePercent > 35) + int chancePercent = 16 + (rogueStats.laserLevel - 1) * 10; + if (chancePercent > 55) { - chancePercent = 35; + chancePercent = 55; } if (rogueStats.feverTicks > 0) { - chancePercent += 10; - if (chancePercent > 50) + chancePercent += 15; + if (chancePercent > 70) { - chancePercent = 50; + chancePercent = 70; } } @@ -652,18 +668,18 @@ static bool RollCrossPiece() return false; } - int chancePercent = 8 + (rogueStats.crossPieceLevel - 1) * 6; - if (chancePercent > 28) + int chancePercent = 14 + (rogueStats.crossPieceLevel - 1) * 8; + if (chancePercent > 45) { - chancePercent = 28; + chancePercent = 45; } if (rogueStats.feverTicks > 0) { - chancePercent += 10; - if (chancePercent > 40) + chancePercent += 15; + if (chancePercent > 60) { - chancePercent = 40; + chancePercent = 60; } } @@ -677,10 +693,10 @@ static bool RollRainbowPiece() return false; } - int chancePercent = 12; + int chancePercent = 18; if (rogueStats.feverTicks > 0) { - chancePercent += 10; + chancePercent += 17; } return (rand() % 100) < chancePercent; } @@ -1040,10 +1056,10 @@ static int RollNextPieceType() if (currentMode == MODE_ROGUE) { - weights[0] += rogueStats.pieceTuningLevels[0] * 35; - if (weights[0] > 320) + weights[0] += rogueStats.pieceTuningLevels[0] * 55; + if (weights[0] > 430) { - weights[0] = 320; + weights[0] = 430; } } @@ -1073,10 +1089,10 @@ int TryStabilizeBoard() return 0; } - int triggerChance = 15 + (rogueStats.stableStructureLevel - 1) * 10; - if (triggerChance > 50) + int triggerChance = 25 + (rogueStats.stableStructureLevel - 1) * 12; + if (triggerChance > 70) { - triggerChance = 50; + triggerChance = 70; } if ((rand() % 100) >= triggerChance) @@ -1146,10 +1162,10 @@ static int GetRogueExpByLines(int linesCleared) { switch (linesCleared) { - case 1: return 10; - case 2: return 25; - case 3: return 45; - case 4: return 80; + case 1: return 12; + case 2: return 32; + case 3: return 58; + case 4: return 100; default: return 0; } } @@ -1162,7 +1178,7 @@ static int ApplyLevelProgress(PlayerStats& stats) { stats.exp -= stats.requiredExp; stats.level++; - stats.requiredExp = 8 + stats.level * 6; + stats.requiredExp = 6 + stats.level * 5; levelUps++; } @@ -1402,6 +1418,7 @@ static void ApplyUpgradeById(int upgradeId, int targetPieceType, int applyCount) break; case UPGRADE_SCREEN_BOMB: rogueStats.screenBombLevel = 1; + rogueStats.screenBombCount += applyCount; break; case UPGRADE_TERMINAL_CLEAR: rogueStats.terminalClearLevel = 1; @@ -1455,7 +1472,7 @@ static void ApplyUpgradeById(int upgradeId, int targetPieceType, int applyCount) break; case UPGRADE_BLOCK_STORM: rogueStats.blockStormLevel = 1; - rogueStats.blockStormPiecesRemaining = 2; + rogueStats.blockStormPiecesRemaining = 5; nextTypes[0] = 0; nextTypes[1] = 0; nextTypes[2] = 0; @@ -1465,11 +1482,11 @@ static void ApplyUpgradeById(int upgradeId, int targetPieceType, int applyCount) break; case UPGRADE_BLACK_HOLE: rogueStats.blackHoleLevel = 1; - rogueStats.blackHoleCharges++; + rogueStats.blackHoleCharges += 2 * applyCount; break; case UPGRADE_AIR_RESHAPE: rogueStats.reshapeLevel = 1; - rogueStats.reshapeCharges++; + rogueStats.reshapeCharges += 2 * applyCount; break; case UPGRADE_RAINBOW_PIECE: rogueStats.rainbowPieceLevel = 1; @@ -1537,9 +1554,9 @@ void AwardRogueSkillClearRewards(int clearedCells, int& scoreGain, int& expGain, if (rogueStats.screenBombLevel > 0) { rogueStats.screenBombCharge += clearedCells; - while (rogueStats.screenBombCharge >= 30) + while (rogueStats.screenBombCharge >= kScreenBombLineThreshold) { - rogueStats.screenBombCharge -= 30; + rogueStats.screenBombCharge -= kScreenBombLineThreshold; rogueStats.screenBombCount++; } } @@ -1666,12 +1683,12 @@ void ApplyLineClearResult(int linesCleared) if (rogueStats.feverLevel > 0) { rogueStats.feverLineCharge += linesCleared; - while (rogueStats.feverLineCharge >= 20) + while (rogueStats.feverLineCharge >= kFeverLineThreshold) { - rogueStats.feverLineCharge -= 20; - rogueStats.feverTicks = 10; + rogueStats.feverLineCharge -= kFeverLineThreshold; + rogueStats.feverTicks = kFeverDurationTicks; currentFallInterval = GetRogueFallInterval(); - SetFeedbackMessage(_T("\u8fdb\u5165\u72c2\u70ed\u6a21\u5f0f"), _T("\u672a\u6765 10 \u79d2\u5f97\u5206 / EXP x2\uff0c\u4e0b\u843d\u66f4\u6162\uff0c\u7279\u6b8a\u65b9\u5757\u66f4\u6613\u51fa\u73b0\u3002"), 12); + SetFeedbackMessage(_T("\u8fdb\u5165\u72c2\u70ed\u6a21\u5f0f"), _T("\u672a\u6765 12 \u79d2\u5f97\u5206 / EXP x2\uff0c\u4e0b\u843d\u66f4\u6162\uff0c\u7279\u6b8a\u65b9\u5757\u66f4\u6613\u51fa\u73b0\u3002"), 12); } } @@ -1682,9 +1699,9 @@ void ApplyLineClearResult(int linesCleared) { rogueStats.feverTicks += 3; } - if (rogueStats.feverTicks > 20) + if (rogueStats.feverTicks > 24) { - rogueStats.feverTicks = 20; + rogueStats.feverTicks = 24; } currentFallInterval = GetRogueFallInterval(); } @@ -1700,9 +1717,9 @@ void ApplyLineClearResult(int linesCleared) if (rogueStats.screenBombLevel > 0) { rogueStats.screenBombCharge += linesCleared; - while (rogueStats.screenBombCharge >= 30) + while (rogueStats.screenBombCharge >= kScreenBombLineThreshold) { - rogueStats.screenBombCharge -= 30; + rogueStats.screenBombCharge -= kScreenBombLineThreshold; 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); } @@ -1734,7 +1751,7 @@ void ApplyLineClearResult(int linesCleared) } } - if (linesCleared == 4 && rogueStats.thunderTetrisLevel > 0) + if (linesCleared >= 3 && rogueStats.thunderTetrisLevel > 0) { int thunderRowsCleared = 0; Point thunderCells[20] = {}; @@ -1767,7 +1784,7 @@ void ApplyLineClearResult(int linesCleared) } } - if (linesCleared == 4 && rogueStats.thunderLaserLevel > 0) + if (linesCleared >= 3 && rogueStats.thunderLaserLevel > 0) { int laserCellsCleared = 0; for (int i = 0; i < 2; i++) @@ -1829,7 +1846,7 @@ void ApplyLineClearResult(int linesCleared) if (rogueStats.evolutionImpactLevel > 0) { shockwaveRows = 3; - rogueStats.feverTicks = 10; + rogueStats.feverTicks = kFeverDurationTicks; currentFallInterval = GetRogueFallInterval(); } else if (rogueStats.upgradeShockwaveLevel > 0)