调整数值结构 提升爽感

This commit is contained in:
2026-04-26 14:33:52 +08:00
parent 68967f66c6
commit 01d06f1a5f
2 changed files with 78 additions and 61 deletions
+5 -5
View File
@@ -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);
+73 -56
View File
@@ -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)