修改彩虹方块效果

This commit is contained in:
2026-04-26 18:02:20 +08:00
parent 8e68d9c712
commit 93045cc2d3
4 changed files with 39 additions and 32 deletions
+2 -2
View File
@@ -40,9 +40,9 @@ bool IsRainbowBoardCell(int cellValue);
int TriggerMiniBlackHole(int maxCellsToClear); int TriggerMiniBlackHole(int maxCellsToClear);
/** /**
* @brief 触发彩虹方块补洞效果并返回补齐格数。 * @brief 触发彩虹方块棱彩复制效果并返回变色格数。
*/ */
int TriggerRainbowRowCompletion(int minRow, int maxRow); int TriggerRainbowPrismCopy(int minRow, int maxRow);
/** /**
* @brief 引爆清屏炸弹并返回清除格数。 * @brief 引爆清屏炸弹并返回清除格数。
+5 -5
View File
@@ -384,7 +384,7 @@ void Fixing()
bool overflowTop = false; bool overflowTop = false;
Point explosiveCells[4] = {}; Point explosiveCells[4] = {};
int explosiveCellCount = 0; int explosiveCellCount = 0;
int rainbowFilledCount = 0; int rainbowCopiedCount = 0;
pendingChainBombFollowup = false; pendingChainBombFollowup = false;
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
@@ -419,15 +419,15 @@ void Fixing()
if (!overflowTop && currentPieceIsRainbow) if (!overflowTop && currentPieceIsRainbow)
{ {
rainbowFilledCount = TriggerRainbowRowCompletion(point.y, point.y + 3); rainbowCopiedCount = TriggerRainbowPrismCopy(point.y, point.y + 3);
TCHAR rainbowDetail[128]; TCHAR rainbowDetail[128];
if (rainbowFilledCount > 0) if (rainbowCopiedCount > 0)
{ {
_stprintf_s(rainbowDetail, _T("彩虹能量补齐 %d 个缺口,消行机会扩大"), rainbowFilledCount); _stprintf_s(rainbowDetail, _T("棱彩共鸣,%d 格复制为覆盖行中的主色方块"), rainbowCopiedCount);
} }
else else
{ {
_stprintf_s(rainbowDetail, _T("覆盖行没有 1~2 格缺口,彩虹能量保留为特殊固定块。")); _stprintf_s(rainbowDetail, _T("覆盖行没有可复制的主色,彩虹能量保留为特殊固定块。"));
} }
SetFeedbackMessage(_T("彩虹方块"), rainbowDetail, 10); SetFeedbackMessage(_T("彩虹方块"), rainbowDetail, 10);
} }
+2 -2
View File
@@ -698,11 +698,11 @@ void TDrawScreen(HDC hdc, HWND hWnd)
_T("赏金纹章:得分+20%,可叠加\r\n成长印记:EXP+25%,可叠加\r\n缓坠羽翼:自然下落变慢\r\n连击律动:连续消行追加奖励\r\n先见之眼:下一方块预览+1"), _T("赏金纹章:得分+20%,可叠加\r\n成长印记:EXP+25%,可叠加\r\n缓坠羽翼:自然下落变慢\r\n连击律动:连续消行追加奖励\r\n先见之眼:下一方块预览+1"),
_T("最后一搏:首次濒死清底3行\r\n备用仓:C / Shift 暂存方块\r\n完美旋转:旋转受阻时左右修正\r\n时间缓流:高堆叠自动减速\r\n空中换形:V 将当前方块变 I"), _T("最后一搏:首次濒死清底3行\r\n备用仓:C / Shift 暂存方块\r\n完美旋转:旋转受阻时左右修正\r\n时间缓流:高堆叠自动减速\r\n空中换形:V 将当前方块变 I"),
_T("卸压清场:立刻清最高占用行\r\n底线清道夫:消行充能后清底\r\n清屏炸弹:X 清底5行,消行充能\r\n黑洞奇点:Z 吞噬数量最多的方块"), _T("卸压清场:立刻清最高占用行\r\n底线清道夫:消行充能后清底\r\n清屏炸弹:X 清底5行,消行充能\r\n黑洞奇点:Z 吞噬数量最多的方块"),
_T("爆破核心:橙红边框,落地清 3x3\r\n棱镜激光:青色边框,落地清整列\r\n十字方块:绿色边框,落地清行列\r\n彩虹方块:紫色边框,覆盖行1~2缺口\r\n方块改造:提高 I 块生成概率"), _T("爆破核心:橙红边框,落地清 3x3\r\n棱镜激光:青色边框,落地清整列\r\n十字方块:绿色边框,落地清行列\r\n彩虹方块:紫色边框,复制覆盖行主色\r\n方块改造:提高 I 块生成概率"),
_T("连锁火花:消行后追加随机破坏\r\n连环炸弹:爆破扩大为 5x5\r\n雷霆四消:三消/四消额外轰击\r\n雷霆棱镜:三消/四消追加激光"), _T("连锁火花:消行后追加随机破坏\r\n连环炸弹:爆破扩大为 5x5\r\n雷霆四消:三消/四消额外轰击\r\n雷霆棱镜:三消/四消追加激光"),
_T("狂热节拍:累计12行进入狂热\r\n怒火连段:连击越高倍率越高\r\n无尽狂热:狂热中消行延时\r\n高压悬赏:更快但收益更高\r\n豪赌四消 / 极限玩家:偏向四消爆发"), _T("狂热节拍:累计12行进入狂热\r\n怒火连段:连击越高倍率越高\r\n无尽狂热:狂热中消行延时\r\n高压悬赏:更快但收益更高\r\n豪赌四消 / 极限玩家:偏向四消爆发"),
_T("双重抉择:升级可多选1个\r\n命运轮盘:6选2但含诅咒\r\n升级冲击波:升级后清底2行\r\n进化冲击:升级后清底3行\r\n成长核心:永久得分/EXP +15%"), _T("双重抉择:升级可多选1个\r\n命运轮盘:6选2但含诅咒\r\n升级冲击波:升级后清底2行\r\n进化冲击:升级后清底3行\r\n成长核心:永久得分/EXP +15%"),
_T("操控大师:Hold 后减速并预览+1\r\n方块风暴:接下来5个全 I 块\r\n稳定结构:概率填局部小洞,和彩虹不同\r\n虚空核心:黑洞生成彩虹,彩虹消行触发小黑洞\r\n赌徒契约:强化可能翻倍或落空") _T("操控大师:Hold 后减速并预览+1\r\n方块风暴:接下来5个全 I 块\r\n稳定结构:概率填局部小洞\r\n虚空核心:黑洞生成彩虹,彩虹消行触发小黑洞\r\n赌徒契约:强化可能翻倍或落空")
}; };
int columnGap = SS(18); int columnGap = SS(18);
+30 -23
View File
@@ -89,7 +89,7 @@ static const UpgradeEntry kUpgradePool[] =
{ UPGRADE_CROSS_PIECE, -1, 84, true, _T("十字方块"), _T("爆发"), _T("大幅提高十字方块出现率。十字方块落地后清除所在行与所在列。") }, { UPGRADE_CROSS_PIECE, -1, 84, true, _T("十字方块"), _T("爆发"), _T("大幅提高十字方块出现率。十字方块落地后清除所在行与所在列。") },
{ UPGRADE_BLACK_HOLE, 1, 88, false, _T("黑洞奇点"), _T("特殊"), _T("获得 2 次黑洞。按 Z 吞噬棋盘上数量最多的一种固定方块。") }, { UPGRADE_BLACK_HOLE, 1, 88, false, _T("黑洞奇点"), _T("特殊"), _T("获得 2 次黑洞。按 Z 吞噬棋盘上数量最多的一种固定方块。") },
{ UPGRADE_AIR_RESHAPE, 1, 82, false, _T("空中换形"), _T("操作"), _T("获得 2 次换形。按 V 将正在下落的方块重塑为 I 块。") }, { UPGRADE_AIR_RESHAPE, 1, 82, false, _T("空中换形"), _T("操作"), _T("获得 2 次换形。按 V 将正在下落的方块重塑为 I 块。") },
{ UPGRADE_RAINBOW_PIECE, 1, 84, false, _T("彩虹方块"), _T("爆发"), _T("更高概率生成彩虹方块。落地后补齐覆盖行中 1~2 个缺口,更容易达成消行") }, { UPGRADE_RAINBOW_PIECE, 1, 84, false, _T("彩虹方块"), _T("爆发"), _T("更高概率生成彩虹方块。落地后复制覆盖行中最常见的方块颜色,形成棱彩共鸣") },
{ UPGRADE_VOID_CORE, 1, 112, false, _T("虚空核心"), _T("进化"), _T("黑洞后额外生成 1 个彩虹方块;彩虹消行时撕开小型黑洞。") }, { UPGRADE_VOID_CORE, 1, 112, false, _T("虚空核心"), _T("进化"), _T("黑洞后额外生成 1 个彩虹方块;彩虹消行时撕开小型黑洞。") },
{ UPGRADE_STABLE_STRUCTURE, -1, 72, true, _T("稳定结构"), _T("特殊"), _T("落地后有小概率填补邻近空洞,让阵型更加稳固。") }, { UPGRADE_STABLE_STRUCTURE, -1, 72, true, _T("稳定结构"), _T("特殊"), _T("落地后有小概率填补邻近空洞,让阵型更加稳固。") },
{ UPGRADE_DOUBLE_GROWTH, 1, 84, false, _T("成长核心"), _T("成长"), _T("永久获得 +15% 得分与 +15% EXP;每局只能选择一次。") }, { UPGRADE_DOUBLE_GROWTH, 1, 84, false, _T("成长核心"), _T("成长"), _T("永久获得 +15% 得分与 +15% EXP;每局只能选择一次。") },
@@ -746,7 +746,7 @@ static bool RollCrossPiece()
} }
/** /**
* @brief 根据彩虹强化等级随机判定当前方块是否获得彩虹补洞特性。 * @brief 根据彩虹强化等级随机判定当前方块是否获得棱彩复制特性。
*/ */
static bool RollRainbowPiece() static bool RollRainbowPiece()
{ {
@@ -955,11 +955,11 @@ int ClearRowAt(int row)
} }
/** /**
* @brief 让彩虹方块尝试补齐其覆盖行内的少量空缺格 * @brief 让彩虹方块复制覆盖行内最常见的固定方块颜色
*/ */
int TriggerRainbowRowCompletion(int minRow, int maxRow) int TriggerRainbowPrismCopy(int minRow, int maxRow)
{ {
int filledCellCount = 0; int copiedCellCount = 0;
if (minRow < 0) if (minRow < 0)
{ {
@@ -972,37 +972,44 @@ int TriggerRainbowRowCompletion(int minRow, int maxRow)
for (int row = minRow; row <= maxRow; row++) for (int row = minRow; row <= maxRow; row++)
{ {
int emptyCount = 0; int colorCounts[8] = {};
int emptyColumns[2] = {}; int targetColor = 0;
bool hasRainbowCell = false; int targetColorCount = 0;
for (int x = 0; x < nGameWidth; x++) for (int x = 0; x < nGameWidth; x++)
{ {
if (workRegion[row][x] == 0) int cell = workRegion[row][x];
if (cell >= 1 && cell <= 7)
{ {
if (emptyCount < 2) colorCounts[cell]++;
{
emptyColumns[emptyCount] = x;
}
emptyCount++;
}
else if (IsRainbowBoardCell(workRegion[row][x]))
{
hasRainbowCell = true;
} }
} }
if (hasRainbowCell && emptyCount > 0 && emptyCount <= 2) for (int cell = 1; cell <= 7; cell++)
{ {
for (int i = 0; i < emptyCount; i++) if (colorCounts[cell] > targetColorCount)
{ {
workRegion[row][emptyColumns[i]] = 8; targetColor = cell;
filledCellCount++; targetColorCount = colorCounts[cell];
}
}
if (targetColor == 0)
{
continue;
}
for (int x = 0; x < nGameWidth; x++)
{
if (IsRainbowBoardCell(workRegion[row][x]))
{
workRegion[row][x] = targetColor;
copiedCellCount++;
} }
} }
} }
return filledCellCount; return copiedCellCount;
} }
/** /**