提高粒子特效
This commit is contained in:
@@ -248,9 +248,11 @@ void HoldCurrentPiece();
|
|||||||
void UseScreenBomb();
|
void UseScreenBomb();
|
||||||
void UseBlackHole();
|
void UseBlackHole();
|
||||||
void UseAirReshape();
|
void UseAirReshape();
|
||||||
|
void ResetPendingRogueVisualEvents();
|
||||||
void ResetVisualEffects();
|
void ResetVisualEffects();
|
||||||
bool TickVisualEffects();
|
bool TickVisualEffects();
|
||||||
void TriggerLineClearEffect(const int* rows, int rowCount, int linesCleared);
|
void TriggerLineClearEffect(const int* rows, int rowCount, int linesCleared);
|
||||||
|
void PlayPendingLineClearEffect();
|
||||||
int GetRogueFallInterval();
|
int GetRogueFallInterval();
|
||||||
int GetRoguePlayableHeight();
|
int GetRoguePlayableHeight();
|
||||||
int GetRogueLockedRows();
|
int GetRogueLockedRows();
|
||||||
|
|||||||
@@ -32,6 +32,10 @@ bool currentPieceIsCross = false;
|
|||||||
bool currentPieceIsRainbow = false;
|
bool currentPieceIsRainbow = false;
|
||||||
Point pendingChainBombCenter = { 0, 0 };
|
Point pendingChainBombCenter = { 0, 0 };
|
||||||
bool pendingChainBombFollowup = false;
|
bool pendingChainBombFollowup = false;
|
||||||
|
static int pendingLineClearEffectTicks = 0;
|
||||||
|
static int pendingLineClearEffectRows[8] = {};
|
||||||
|
static int pendingLineClearEffectRowCount = 0;
|
||||||
|
static int pendingLineClearEffectLineCount = 0;
|
||||||
|
|
||||||
int bricks[7][4][4][4] =
|
int bricks[7][4][4][4] =
|
||||||
{
|
{
|
||||||
@@ -386,6 +390,43 @@ static void AddBurstParticles(int boardX, int boardY, COLORREF baseColor, bool s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void QueueLineClearEffect(const int* rows, int rowCount, int linesCleared)
|
||||||
|
{
|
||||||
|
if (rows == nullptr || rowCount <= 0 || linesCleared <= 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rowCount > 8)
|
||||||
|
{
|
||||||
|
rowCount = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
pendingLineClearEffectTicks = 1;
|
||||||
|
pendingLineClearEffectRowCount = rowCount;
|
||||||
|
pendingLineClearEffectLineCount = linesCleared;
|
||||||
|
for (int i = 0; i < rowCount; i++)
|
||||||
|
{
|
||||||
|
pendingLineClearEffectRows[i] = rows[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlayPendingLineClearEffect()
|
||||||
|
{
|
||||||
|
if (pendingLineClearEffectTicks <= 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pendingLineClearEffectTicks = 0;
|
||||||
|
TriggerLineClearEffect(
|
||||||
|
pendingLineClearEffectRows,
|
||||||
|
pendingLineClearEffectRowCount,
|
||||||
|
pendingLineClearEffectLineCount);
|
||||||
|
pendingLineClearEffectRowCount = 0;
|
||||||
|
pendingLineClearEffectLineCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void TriggerLineClearEffect(const int* rows, int rowCount, int linesCleared)
|
void TriggerLineClearEffect(const int* rows, int rowCount, int linesCleared)
|
||||||
{
|
{
|
||||||
if (rows == nullptr || rowCount <= 0 || linesCleared <= 0)
|
if (rows == nullptr || rowCount <= 0 || linesCleared <= 0)
|
||||||
@@ -981,7 +1022,14 @@ int DeleteLines()
|
|||||||
}
|
}
|
||||||
|
|
||||||
ApplyLineClearResult(clearedLines);
|
ApplyLineClearResult(clearedLines);
|
||||||
|
if (currentScreen == SCREEN_UPGRADE)
|
||||||
|
{
|
||||||
|
QueueLineClearEffect(clearedRows, clearedRowCount, clearedLines);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
TriggerLineClearEffect(clearedRows, clearedRowCount, clearedLines);
|
TriggerLineClearEffect(clearedRows, clearedRowCount, clearedLines);
|
||||||
|
}
|
||||||
|
|
||||||
if (pendingChainBombFollowup && clearedLines > 0)
|
if (pendingChainBombFollowup && clearedLines > 0)
|
||||||
{
|
{
|
||||||
@@ -1107,7 +1155,11 @@ void Restart()
|
|||||||
feedbackState.visibleTicks = 0;
|
feedbackState.visibleTicks = 0;
|
||||||
feedbackState.title[0] = _T('\0');
|
feedbackState.title[0] = _T('\0');
|
||||||
feedbackState.detail[0] = _T('\0');
|
feedbackState.detail[0] = _T('\0');
|
||||||
|
ResetPendingRogueVisualEvents();
|
||||||
ResetVisualEffects();
|
ResetVisualEffects();
|
||||||
|
pendingLineClearEffectTicks = 0;
|
||||||
|
pendingLineClearEffectRowCount = 0;
|
||||||
|
pendingLineClearEffectLineCount = 0;
|
||||||
holdType = -1;
|
holdType = -1;
|
||||||
holdUsedThisTurn = false;
|
holdUsedThisTurn = false;
|
||||||
RollCurrentPieceSpecialFlags(false);
|
RollCurrentPieceSpecialFlags(false);
|
||||||
@@ -1140,6 +1192,10 @@ void ReturnToMainMenu()
|
|||||||
suspendFlag = false;
|
suspendFlag = false;
|
||||||
gameOverFlag = false;
|
gameOverFlag = false;
|
||||||
ResetVisualEffects();
|
ResetVisualEffects();
|
||||||
|
ResetPendingRogueVisualEvents();
|
||||||
|
pendingLineClearEffectTicks = 0;
|
||||||
|
pendingLineClearEffectRowCount = 0;
|
||||||
|
pendingLineClearEffectLineCount = 0;
|
||||||
menuState.optionCount = 3;
|
menuState.optionCount = 3;
|
||||||
upgradeUiState.pendingCount = 0;
|
upgradeUiState.pendingCount = 0;
|
||||||
upgradeUiState.picksRemaining = 0;
|
upgradeUiState.picksRemaining = 0;
|
||||||
|
|||||||
@@ -1251,24 +1251,13 @@ void TDrawScreen(HDC hdc, HWND hWnd)
|
|||||||
{
|
{
|
||||||
_stprintf_s(upgradeSummary + lstrlen(upgradeSummary), 512 - lstrlen(upgradeSummary), _T("\u6210\u957f\u6838\u5fc3 Lv.1\r\n"));
|
_stprintf_s(upgradeSummary + lstrlen(upgradeSummary), 512 - lstrlen(upgradeSummary), _T("\u6210\u957f\u6838\u5fc3 Lv.1\r\n"));
|
||||||
}
|
}
|
||||||
int tunedPieceCount = 0;
|
if (rogueStats.pieceTuningLevels[0] > 0)
|
||||||
for (int pieceType = 0; pieceType < 7; pieceType++)
|
|
||||||
{
|
{
|
||||||
if (rogueStats.pieceTuningLevels[pieceType] > 0)
|
|
||||||
{
|
|
||||||
tunedPieceCount++;
|
|
||||||
_stprintf_s(
|
_stprintf_s(
|
||||||
upgradeSummary + lstrlen(upgradeSummary),
|
upgradeSummary + lstrlen(upgradeSummary),
|
||||||
512 - lstrlen(upgradeSummary),
|
512 - lstrlen(upgradeSummary),
|
||||||
_T("%s \u65b9\u5757\u6539\u9020 Lv.%d\r\n"),
|
_T("I \u65b9\u5757\u6539\u9020 Lv.%d\r\n"),
|
||||||
(pieceType == 0 ? _T("I") :
|
rogueStats.pieceTuningLevels[0]);
|
||||||
pieceType == 1 ? _T("T") :
|
|
||||||
pieceType == 2 ? _T("L") :
|
|
||||||
pieceType == 3 ? _T("J") :
|
|
||||||
pieceType == 4 ? _T("O") :
|
|
||||||
pieceType == 5 ? _T("S") : _T("Z")),
|
|
||||||
rogueStats.pieceTuningLevels[pieceType]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (rogueStats.gamblerLevel > 0)
|
if (rogueStats.gamblerLevel > 0)
|
||||||
{
|
{
|
||||||
|
|||||||
+65
-52
@@ -85,7 +85,7 @@ static const UpgradeEntry kUpgradePool[] =
|
|||||||
{ 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;每局只能选择一次。") },
|
||||||
{ UPGRADE_PIECE_TUNING, -1, 64, true, _T("方块改造"), _T("特殊"), _T("选择一种方块,降低它之后的出现率。") },
|
{ UPGRADE_PIECE_TUNING, -1, 64, true, _T("方块改造"), _T("特殊"), _T("固定提高 I 方块的生成概率。") },
|
||||||
{ UPGRADE_GAMBLER, -1, 64, true, _T("赌徒契约"), _T("特殊"), _T("选择强化时,有概率效果翻倍,也有概率本次落空。") }
|
{ UPGRADE_GAMBLER, -1, 64, true, _T("赌徒契约"), _T("特殊"), _T("选择强化时,有概率效果翻倍,也有概率本次落空。") }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -94,6 +94,8 @@ static constexpr int kDifficultyStepMs = 30000;
|
|||||||
static constexpr int kDifficultySpeedStepMs = 18;
|
static constexpr int kDifficultySpeedStepMs = 18;
|
||||||
static constexpr int kMaxRogueLockedRows = 4;
|
static constexpr int kMaxRogueLockedRows = 4;
|
||||||
static constexpr int kDifficultyLevelsPerLockedRow = 3;
|
static constexpr int kDifficultyLevelsPerLockedRow = 3;
|
||||||
|
static int pendingUpgradeShockwaveRows = 0;
|
||||||
|
static bool pendingEvolutionImpactShockwave = false;
|
||||||
|
|
||||||
static int GetUpgradeCurrentLevel(int upgradeId);
|
static int GetUpgradeCurrentLevel(int upgradeId);
|
||||||
static bool IsUpgradePrerequisiteConsumed(int upgradeId);
|
static bool IsUpgradePrerequisiteConsumed(int upgradeId);
|
||||||
@@ -114,6 +116,7 @@ static int GetRogueScoreByLines(int linesCleared);
|
|||||||
static int GetRogueExpByLines(int linesCleared);
|
static int GetRogueExpByLines(int linesCleared);
|
||||||
static int ApplyLevelProgress(PlayerStats& stats);
|
static int ApplyLevelProgress(PlayerStats& stats);
|
||||||
static int TriggerUpgradeShockwave(int rowsToClear);
|
static int TriggerUpgradeShockwave(int rowsToClear);
|
||||||
|
static void ResolvePendingUpgradeShockwave();
|
||||||
static void FillUpgradeOptions();
|
static void FillUpgradeOptions();
|
||||||
static void ApplyUpgradeById(int upgradeId, int targetPieceType, int applyCount);
|
static void ApplyUpgradeById(int upgradeId, int targetPieceType, int applyCount);
|
||||||
static void ApplyDestinyCurse();
|
static void ApplyDestinyCurse();
|
||||||
@@ -988,13 +991,10 @@ static int RollNextPieceType()
|
|||||||
|
|
||||||
if (currentMode == MODE_ROGUE)
|
if (currentMode == MODE_ROGUE)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 7; i++)
|
weights[0] += rogueStats.pieceTuningLevels[0] * 35;
|
||||||
|
if (weights[0] > 320)
|
||||||
{
|
{
|
||||||
weights[i] -= rogueStats.pieceTuningLevels[i] * 20;
|
weights[0] = 320;
|
||||||
if (weights[i] < 20)
|
|
||||||
{
|
|
||||||
weights[i] = 20;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1194,35 +1194,16 @@ static void FillUpgradeOptions()
|
|||||||
|
|
||||||
if (pickedEntry.id == UPGRADE_PIECE_TUNING)
|
if (pickedEntry.id == UPGRADE_PIECE_TUNING)
|
||||||
{
|
{
|
||||||
int targetPieceType = rand() % 7;
|
int targetPieceType = 0;
|
||||||
bool duplicatedPiece = true;
|
|
||||||
int guard = 0;
|
|
||||||
|
|
||||||
while (duplicatedPiece && guard < 16)
|
|
||||||
{
|
|
||||||
duplicatedPiece = false;
|
|
||||||
for (int optionIndex = 0; optionIndex < i; optionIndex++)
|
|
||||||
{
|
|
||||||
if (upgradeUiState.options[optionIndex].id == UPGRADE_PIECE_TUNING &&
|
|
||||||
upgradeUiState.options[optionIndex].targetPieceType == targetPieceType)
|
|
||||||
{
|
|
||||||
duplicatedPiece = true;
|
|
||||||
targetPieceType = (targetPieceType + 1) % 7;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
guard++;
|
|
||||||
}
|
|
||||||
|
|
||||||
upgradeUiState.options[i].targetPieceType = targetPieceType;
|
upgradeUiState.options[i].targetPieceType = targetPieceType;
|
||||||
upgradeUiState.options[i].currentLevel = rogueStats.pieceTuningLevels[targetPieceType];
|
upgradeUiState.options[i].currentLevel = rogueStats.pieceTuningLevels[0];
|
||||||
upgradeUiState.options[i].name = _T("方块改造");
|
upgradeUiState.options[i].name = _T("方块改造");
|
||||||
|
|
||||||
static TCHAR tuningDescriptions[6][64];
|
static TCHAR tuningDescriptions[6][64];
|
||||||
_stprintf_s(
|
_stprintf_s(
|
||||||
tuningDescriptions[i],
|
tuningDescriptions[i],
|
||||||
_T("%s 块之后的出现率降低。"),
|
_T("%s 块的生成概率提高。"),
|
||||||
GetPieceShortName(targetPieceType));
|
GetPieceShortName(0));
|
||||||
upgradeUiState.options[i].description = tuningDescriptions[i];
|
upgradeUiState.options[i].description = tuningDescriptions[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1456,10 +1437,7 @@ static void ApplyUpgradeById(int upgradeId, int targetPieceType, int applyCount)
|
|||||||
rogueStats.expMultiplierPercent += 15;
|
rogueStats.expMultiplierPercent += 15;
|
||||||
break;
|
break;
|
||||||
case UPGRADE_PIECE_TUNING:
|
case UPGRADE_PIECE_TUNING:
|
||||||
if (targetPieceType >= 0 && targetPieceType < 7)
|
rogueStats.pieceTuningLevels[0] += applyCount;
|
||||||
{
|
|
||||||
rogueStats.pieceTuningLevels[targetPieceType] += applyCount;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case UPGRADE_GAMBLER:
|
case UPGRADE_GAMBLER:
|
||||||
rogueStats.gamblerLevel += applyCount;
|
rogueStats.gamblerLevel += applyCount;
|
||||||
@@ -1737,22 +1715,8 @@ void ApplyLineClearResult(int linesCleared)
|
|||||||
|
|
||||||
if (shockwaveRows > 0)
|
if (shockwaveRows > 0)
|
||||||
{
|
{
|
||||||
int clearedRows = TriggerUpgradeShockwave(shockwaveRows);
|
pendingUpgradeShockwaveRows = shockwaveRows;
|
||||||
TCHAR shockwaveDetail[128];
|
pendingEvolutionImpactShockwave = rogueStats.evolutionImpactLevel > 0;
|
||||||
|
|
||||||
if (rogueStats.evolutionImpactLevel > 0)
|
|
||||||
{
|
|
||||||
_stprintf_s(
|
|
||||||
shockwaveDetail,
|
|
||||||
_T("进化能量爆发,清除底部 %d 行,并进入 10 秒双倍 EXP。"),
|
|
||||||
clearedRows);
|
|
||||||
SetFeedbackMessage(_T("进化冲击"), shockwaveDetail, 14);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_stprintf_s(shockwaveDetail, _T("灵感涌现前,冲击波清除底部 %d 行。"), clearedRows);
|
|
||||||
SetFeedbackMessage(_T("升级冲击波"), shockwaveDetail, 12);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TCHAR feedbackTitle[64];
|
TCHAR feedbackTitle[64];
|
||||||
@@ -1781,6 +1745,53 @@ static void ApplyDestinyCurse()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ResolvePendingUpgradeShockwave()
|
||||||
|
{
|
||||||
|
if (pendingUpgradeShockwaveRows <= 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int shockwaveRows = pendingUpgradeShockwaveRows;
|
||||||
|
bool evolutionImpact = pendingEvolutionImpactShockwave;
|
||||||
|
pendingUpgradeShockwaveRows = 0;
|
||||||
|
pendingEvolutionImpactShockwave = false;
|
||||||
|
|
||||||
|
int clearedRows = TriggerUpgradeShockwave(shockwaveRows);
|
||||||
|
int effectRows[4] = {};
|
||||||
|
int effectRowCount = clearedRows;
|
||||||
|
if (effectRowCount > 4)
|
||||||
|
{
|
||||||
|
effectRowCount = 4;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < effectRowCount; i++)
|
||||||
|
{
|
||||||
|
effectRows[i] = GetRoguePlayableHeight() - 1 - i;
|
||||||
|
}
|
||||||
|
TriggerLineClearEffect(effectRows, effectRowCount, clearedRows);
|
||||||
|
|
||||||
|
TCHAR shockwaveDetail[128];
|
||||||
|
if (evolutionImpact)
|
||||||
|
{
|
||||||
|
_stprintf_s(
|
||||||
|
shockwaveDetail,
|
||||||
|
_T("进化能量爆发,清除底部 %d 行,并进入 10 秒双倍 EXP。"),
|
||||||
|
clearedRows);
|
||||||
|
SetFeedbackMessage(_T("进化冲击"), shockwaveDetail, 14);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_stprintf_s(shockwaveDetail, _T("灵感涌现后,冲击波清除底部 %d 行。"), clearedRows);
|
||||||
|
SetFeedbackMessage(_T("升级冲击波"), shockwaveDetail, 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ResetPendingRogueVisualEvents()
|
||||||
|
{
|
||||||
|
pendingUpgradeShockwaveRows = 0;
|
||||||
|
pendingEvolutionImpactShockwave = false;
|
||||||
|
}
|
||||||
|
|
||||||
void OpenUpgradeMenu()
|
void OpenUpgradeMenu()
|
||||||
{
|
{
|
||||||
if (currentMode != MODE_ROGUE || upgradeUiState.pendingCount <= 0)
|
if (currentMode != MODE_ROGUE || upgradeUiState.pendingCount <= 0)
|
||||||
@@ -1833,8 +1844,8 @@ void ConfirmUpgradeSelection()
|
|||||||
{
|
{
|
||||||
_stprintf_s(
|
_stprintf_s(
|
||||||
feedbackDetail,
|
feedbackDetail,
|
||||||
_T("%s 块的出现率降低%s"),
|
_T("%s 块的生成概率提高%s"),
|
||||||
GetPieceShortName(selectedOption.targetPieceType),
|
GetPieceShortName(0),
|
||||||
gamblerSuffix);
|
gamblerSuffix);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1894,6 +1905,8 @@ void ConfirmUpgradeSelection()
|
|||||||
upgradeUiState.picksRemaining = 0;
|
upgradeUiState.picksRemaining = 0;
|
||||||
|
|
||||||
currentScreen = SCREEN_PLAYING;
|
currentScreen = SCREEN_PLAYING;
|
||||||
|
ResolvePendingUpgradeShockwave();
|
||||||
|
PlayPendingLineClearEffect();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HoldCurrentPiece()
|
void HoldCurrentPiece()
|
||||||
|
|||||||
Reference in New Issue
Block a user