From aa9e2f3ddc00a4e7df6a16b3eda3fbeef110d76a Mon Sep 17 00:00:00 2001 From: qihuanye <2728290997@qq.com> Date: Tue, 28 Apr 2026 20:41:15 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E8=B0=83=E6=95=B4=E6=BC=94?= =?UTF-8?q?=E7=A4=BA=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/source/TetrisRogue.cpp | 490 +++++++++++++++++++++++++++++-------- 1 file changed, 385 insertions(+), 105 deletions(-) diff --git a/src/source/TetrisRogue.cpp b/src/source/TetrisRogue.cpp index 013fd88..7132eb9 100644 --- a/src/source/TetrisRogue.cpp +++ b/src/source/TetrisRogue.cpp @@ -115,22 +115,46 @@ static bool rogueDemoAutoAdvance = true; enum RogueDemoKind { - DEMO_HOLD = 0, - DEMO_BLACK_HOLE, - DEMO_SCREEN_BOMB, - DEMO_AIR_RESHAPE, + DEMO_SCORE_MULTIPLIER = 0, + DEMO_EXP_MULTIPLIER, + DEMO_SLOW_FALL, + DEMO_COMBO_BONUS, + DEMO_PREVIEW_PLUS_ONE, + DEMO_LAST_CHANCE, + DEMO_HOLD, + DEMO_PRESSURE_RELIEF, + DEMO_SWEEPER, DEMO_EXPLOSIVE, + DEMO_STABLE_STRUCTURE, + DEMO_DOUBLE_GROWTH, + DEMO_PIECE_TUNING, + DEMO_GAMBLER, + DEMO_CHAIN_BLAST, DEMO_CHAIN_BOMB, DEMO_LASER, - DEMO_CROSS, - DEMO_RAINBOW, - DEMO_VOID_CORE, - DEMO_SWEEPER, - DEMO_LAST_CHANCE, + DEMO_THUNDER_TETRIS, + DEMO_THUNDER_LASER, + DEMO_FEVER_MODE, + DEMO_RAGE_STACK, + DEMO_INFINITE_FEVER, + DEMO_SCREEN_BOMB, + DEMO_TERMINAL_CLEAR, + DEMO_DUAL_CHOICE, + DEMO_DESTINY_WHEEL, + DEMO_PERFECT_ROTATE, DEMO_TIME_DILATION, + DEMO_HIGH_PRESSURE, + DEMO_TETRIS_GAMBLE, + DEMO_EXTREME_PLAYER, DEMO_UPGRADE_SHOCKWAVE, + DEMO_EVOLUTION_IMPACT, + DEMO_CONTROL_MASTER, DEMO_BLOCK_STORM, - DEMO_STABLE_STRUCTURE + DEMO_CROSS, + DEMO_BLACK_HOLE, + DEMO_AIR_RESHAPE, + DEMO_RAINBOW, + DEMO_VOID_CORE }; struct RogueDemoStep @@ -142,22 +166,46 @@ struct RogueDemoStep static const RogueDemoStep kRogueDemoSteps[] = { + { DEMO_SCORE_MULTIPLIER, _T("赏金纹章"), _T("Space 消一行,观察得分倍率提高后的分数收益。") }, + { DEMO_EXP_MULTIPLIER, _T("成长印记"), _T("Space 消一行,观察 EXP 倍率提高后的成长收益。") }, + { DEMO_SLOW_FALL, _T("缓坠羽翼"), _T("当前下落速度已放慢,练习在慢速节奏中调整落点。") }, + { DEMO_COMBO_BONUS, _T("连击律动"), _T("连续完成两次消行,第二次会获得连击收益。") }, + { DEMO_PREVIEW_PLUS_ONE, _T("先见之眼"), _T("右侧预览增加到 2 个,便于提前规划落点。") }, + { DEMO_LAST_CHANCE, _T("最后一搏"), _T("Space 固定触顶方块,濒死时自动清理底部 3 行。") }, { DEMO_HOLD, _T("备用仓"), _T("按 C / Shift 换出备用 I 块,再用 Space 填平底行缺口。") }, - { DEMO_BLACK_HOLE, _T("黑洞奇点"), _T("按 Z 吞噬场上最多的粉色方块,观察棋盘重力补位。") }, - { DEMO_SCREEN_BOMB, _T("清屏炸弹"), _T("按 X 主动引爆,清理底部 5 行高压区。") }, - { DEMO_AIR_RESHAPE, _T("空中换形"), _T("按 V 把当前方块变为 I 块,再用 Space 完成四消。") }, + { DEMO_PRESSURE_RELIEF, _T("卸压清场"), _T("进入场景时只演示卸压清场:最高占用行被清除。") }, + { DEMO_SWEEPER, _T("底线清道夫"), _T("Space 消去底行,充能满后自动再清扫底部。") }, { DEMO_EXPLOSIVE, _T("爆破核心"), _T("用方向键微调红框方块,Space 落地后清除 3x3 区域。") }, + { DEMO_STABLE_STRUCTURE, _T("稳定结构"), _T("Space 落地后只触发稳定结构,自动填补局部空洞。") }, + { DEMO_DOUBLE_GROWTH, _T("成长核心"), _T("Space 消一行,观察得分与 EXP 同时提高。") }, + { DEMO_PIECE_TUNING, _T("方块改造"), _T("预览队列固定给出更多 I 块,展示改造后的出块倾向。") }, + { DEMO_GAMBLER, _T("赌徒契约"), _T("Space 消一行,观察随机波动后的收益变化。") }, + { DEMO_CHAIN_BLAST, _T("连锁火花"), _T("Space 消行后,在清除行附近追加随机破坏。") }, { DEMO_CHAIN_BOMB, _T("连环炸弹"), _T("Space 落下红框方块,演示更大的连环爆破范围。") }, { DEMO_LASER, _T("棱镜激光"), _T("把青色边框方块落到中列,落地后贯穿整列。") }, - { DEMO_CROSS, _T("十字方块"), _T("把绿色边框方块落到交叉点,清除一行一列。") }, - { DEMO_RAINBOW, _T("彩虹方块"), _T("把紫色边框方块落到彩色层,按中心行主色触发清除。") }, - { DEMO_VOID_CORE, _T("虚空核心"), _T("按 Z 释放黑洞后,下一枚方块会被召唤成彩虹方块。") }, - { DEMO_SWEEPER, _T("底线清道夫"), _T("Space 消去底行,充能满后自动再清扫底部。") }, - { DEMO_LAST_CHANCE, _T("最后一搏"), _T("Space 固定触顶方块,濒死时自动清理底部 3 行。") }, + { DEMO_THUNDER_TETRIS, _T("雷霆四消"), _T("Space 完成四消,额外轰击随机 2 行。") }, + { DEMO_THUNDER_LASER, _T("雷霆棱镜"), _T("Space 完成四消,额外发射 2 道激光。") }, + { DEMO_FEVER_MODE, _T("狂热节拍"), _T("Space 消一行补满充能,进入狂热收益状态。") }, + { DEMO_RAGE_STACK, _T("怒火连段"), _T("连续消行时得分倍率追加,当前已预置连击层数。") }, + { DEMO_INFINITE_FEVER, _T("无尽狂热"), _T("狂热期间消行会延长狂热时间。") }, + { DEMO_SCREEN_BOMB, _T("清屏炸弹"), _T("按 X 主动引爆,清理底部 5 行高压区。") }, + { DEMO_TERMINAL_CLEAR, _T("终末清场"), _T("Space 固定触顶方块,最后一搏会连带引爆清屏炸弹。") }, + { DEMO_DUAL_CHOICE, _T("双重抉择"), _T("演示升级规则:每次升级可选择 2 个强化。") }, + { DEMO_DESTINY_WHEEL, _T("命运轮盘"), _T("演示升级规则:6 选 2,并可能出现诅咒选项。") }, + { DEMO_PERFECT_ROTATE, _T("完美旋转"), _T("靠墙旋转受阻时,系统会尝试左右修正。") }, { DEMO_TIME_DILATION, _T("时间缓流"), _T("高堆叠开局会自动减速,玩家可用慢速窗口整理局面。") }, + { DEMO_HIGH_PRESSURE, _T("高压悬赏"), _T("下落速度提高,但 Space 消行后得分与 EXP 更高。") }, + { DEMO_TETRIS_GAMBLE, _T("豪赌四消"), _T("Space 完成四消,展示四消收益暴增。") }, + { DEMO_EXTREME_PLAYER, _T("极限玩家"), _T("Space 完成四消,触发短暂缓速补位窗口。") }, { DEMO_UPGRADE_SHOCKWAVE, _T("升级冲击波"), _T("Space 消一行立刻升级,不弹强化菜单并清除底部 2 行。") }, + { DEMO_EVOLUTION_IMPACT, _T("进化冲击"), _T("Space 消一行立刻升级,清除底部 3 行并进入狂热。") }, + { DEMO_CONTROL_MASTER, _T("操控大师"), _T("按 C / Shift 使用备用仓后,触发短暂减速并增加预览。") }, { DEMO_BLOCK_STORM, _T("方块风暴"), _T("连续用 I 块清理竖井,后续预览也固定为 I 块。") }, - { DEMO_STABLE_STRUCTURE, _T("稳定结构"), _T("Space 落地后只触发稳定结构,自动填补局部空洞。") } + { DEMO_CROSS, _T("十字方块"), _T("把绿色边框方块落到交叉点,清除一行一列。") }, + { DEMO_BLACK_HOLE, _T("黑洞奇点"), _T("按 Z 吞噬场上最多的粉色方块,观察棋盘重力补位。") }, + { DEMO_AIR_RESHAPE, _T("空中换形"), _T("按 V 把当前方块变为 I 块,再用 Space 完成四消。") }, + { DEMO_RAINBOW, _T("彩虹方块"), _T("把紫色边框方块落到彩色层,按中心行主色触发清除。") }, + { DEMO_VOID_CORE, _T("虚空核心"), _T("按 Z 释放黑洞后,下一枚方块会被召唤成彩虹方块。") } }; static constexpr int kRogueDemoStepCount = sizeof(kRogueDemoSteps) / sizeof(kRogueDemoSteps[0]); @@ -953,6 +1001,25 @@ void RollCurrentPieceSpecialFlags(bool allowRandomSpecials) return; } + if (rogueDemoMode) + { + if (currentMode == MODE_ROGUE && rogueStats.pendingRainbowPieceCount > 0) + { + rogueStats.pendingRainbowPieceCount--; + currentPieceIsExplosive = false; + currentPieceIsLaser = false; + currentPieceIsCross = false; + currentPieceIsRainbow = true; + return; + } + + currentPieceIsExplosive = false; + currentPieceIsLaser = false; + currentPieceIsCross = false; + currentPieceIsRainbow = false; + return; + } + if (currentMode == MODE_ROGUE && rogueStats.pendingRainbowPieceCount > 0) { rogueStats.pendingRainbowPieceCount--; @@ -3022,7 +3089,7 @@ static void FillRogueDemoCell(int y, int x, int value) } /** - * @brief 按交错颜色填充演示棋盘中的连续行。 + * @brief 按交错颜色填充演示棋盘中的连续压力行,并为每行保留缺口避免开局满行。 */ static void FillRogueDemoRows(int firstRow, int lastRow, int baseValue) { @@ -3037,9 +3104,17 @@ static void FillRogueDemoRows(int firstRow, int lastRow, int baseValue) for (int y = firstRow; y <= lastRow; y++) { + int gapX = (baseValue + y) % nGameWidth; for (int x = 0; x < nGameWidth; x++) { - workRegion[y][x] = 1 + ((baseValue + y + x) % 7); + if (x == gapX) + { + workRegion[y][x] = 0; + } + else + { + workRegion[y][x] = 1 + ((baseValue + y + x) % 7); + } } } } @@ -3097,6 +3172,55 @@ static void ApplyRogueSkillDemoStep() switch (demoStep.kind) { + case DEMO_SCORE_MULTIPLIER: + rogueStats.scoreUpgradeLevel = 2; + rogueStats.scoreMultiplierPercent = 160; + FillRogueDemoRows(16, 18, 1); + FillRogueDemoRowExcept(19, 3, 4, 1); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_EXP_MULTIPLIER: + rogueStats.expUpgradeLevel = 2; + rogueStats.expMultiplierPercent = 150; + FillRogueDemoRows(16, 18, 2); + FillRogueDemoRowExcept(19, 3, 4, 2); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_SLOW_FALL: + rogueStats.slowFallStacks = 4; + currentFallInterval = GetRogueFallInterval(); + FillRogueDemoRows(16, 19, 3); + SetRogueDemoCurrentPiece(1, 0, 3, 0); + break; + + case DEMO_COMBO_BONUS: + rogueStats.comboBonusStacks = 2; + rogueStats.comboChain = 1; + FillRogueDemoRows(16, 18, 4); + FillRogueDemoRowExcept(19, 3, 4, 4); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_PREVIEW_PLUS_ONE: + rogueStats.previewCount = 2; + rogueStats.previewUpgradeLevel = 1; + FillRogueDemoRows(16, 19, 5); + SetRogueDemoCurrentPiece(4, 0, 4, 0); + nextTypes[0] = 0; + nextTypes[1] = 1; + nextTypes[2] = 2; + break; + + case DEMO_LAST_CHANCE: + rogueStats.lastChanceUpgradeLevel = 1; + rogueStats.lastChanceCount = 1; + FillRogueDemoRows(0, 5, 5); + FillRogueDemoRows(14, 19, 3); + SetRogueDemoCurrentPiece(4, 0, 3, -1); + break; + case DEMO_HOLD: rogueStats.holdUnlocked = 1; rogueStats.controlMasterLevel = 1; @@ -3106,36 +3230,20 @@ static void ApplyRogueSkillDemoStep() SetRogueDemoCurrentPiece(2, 0, 3, 0); break; - case DEMO_BLACK_HOLE: - rogueStats.blackHoleLevel = 1; - rogueStats.blackHoleCharges = 1; - FillRogueDemoRows(9, 19, 2); - for (int y = 8; y < nGameHeight; y++) - { - for (int x = 1; x < nGameWidth; x += 3) - { - workRegion[y][x] = 2; - } - } + case DEMO_PRESSURE_RELIEF: + rogueStats.pressureReliefLevel = 1; + FillRogueDemoRows(5, 19, 6); + DeleteOneLine(5); + ApplyBoardGravity(); SetRogueDemoCurrentPiece(1, 0, 3, 0); + SetFeedbackMessage(_T("卸压清场"), _T("最高占用行已被清除,顶部压力立即下降。"), 12); break; - case DEMO_SCREEN_BOMB: - rogueStats.screenBombLevel = 1; - rogueStats.screenBombCount = 1; - FillRogueDemoRows(11, 19, 0); - SetRogueDemoCurrentPiece(4, 0, 4, 0); - break; - - case DEMO_AIR_RESHAPE: - rogueStats.reshapeLevel = 1; - rogueStats.reshapeCharges = 1; - FillRogueDemoRows(16, 19, 3); - for (int y = 10; y < nGameHeight; y++) - { - FillRogueDemoCell(y, 9, 0); - } - SetRogueDemoCurrentPiece(1, 0, 6, 0); + case DEMO_SWEEPER: + rogueStats.sweeperLevel = 4; + FillRogueDemoRows(15, 18, 1); + FillRogueDemoRowExcept(19, 3, 4, 3); + SetRogueDemoCurrentPiece(0, 0, 3, 0); break; case DEMO_EXPLOSIVE: @@ -3147,6 +3255,47 @@ static void ApplyRogueSkillDemoStep() SetRogueDemoCurrentPiece(1, 0, 3, 0); break; + case DEMO_STABLE_STRUCTURE: + rogueStats.stableStructureLevel = 4; + FillRogueDemoRows(14, 19, 1); + workRegion[15][4] = 0; + workRegion[16][6] = 0; + workRegion[17][5] = 0; + SetRogueDemoCurrentPiece(1, 0, 3, 0); + break; + + case DEMO_DOUBLE_GROWTH: + rogueStats.doubleGrowthLevel = 1; + rogueStats.scoreMultiplierPercent = 115; + rogueStats.expMultiplierPercent = 115; + FillRogueDemoRows(16, 18, 2); + FillRogueDemoRowExcept(19, 3, 4, 2); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_PIECE_TUNING: + rogueStats.pieceTuningLevels[0] = 4; + FillRogueDemoRows(16, 19, 3); + SetRogueDemoCurrentPiece(0, 1, 3, 0); + nextTypes[0] = 0; + nextTypes[1] = 0; + nextTypes[2] = 0; + break; + + case DEMO_GAMBLER: + rogueStats.gamblerLevel = 4; + FillRogueDemoRows(16, 18, 4); + FillRogueDemoRowExcept(19, 3, 4, 4); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_CHAIN_BLAST: + rogueStats.chainBlastLevel = 1; + FillRogueDemoRows(15, 18, 5); + FillRogueDemoRowExcept(19, 3, 4, 5); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + case DEMO_CHAIN_BOMB: rogueStats.chainBombLevel = 1; FillRogueDemoRows(10, 19, 4); @@ -3173,6 +3322,194 @@ static void ApplyRogueSkillDemoStep() SetRogueDemoCurrentPiece(0, 1, 3, 0); break; + case DEMO_THUNDER_TETRIS: + rogueStats.thunderTetrisLevel = 1; + FillRogueDemoRows(10, 15, 1); + FillRogueDemoRows(16, 18, 2); + FillRogueDemoRowExcept(19, 3, 4, 2); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_THUNDER_LASER: + rogueStats.thunderLaserLevel = 1; + FillRogueDemoRows(10, 15, 3); + FillRogueDemoRows(16, 18, 4); + FillRogueDemoRowExcept(19, 3, 4, 4); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_FEVER_MODE: + rogueStats.feverLevel = 1; + rogueStats.feverLineCharge = kFeverLineThreshold - 1; + FillRogueDemoRows(16, 18, 5); + FillRogueDemoRowExcept(19, 3, 4, 5); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_RAGE_STACK: + rogueStats.rageStackLevel = 1; + rogueStats.comboChain = 3; + FillRogueDemoRows(16, 18, 6); + FillRogueDemoRowExcept(19, 3, 4, 6); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_INFINITE_FEVER: + rogueStats.feverLevel = 1; + rogueStats.infiniteFeverLevel = 1; + rogueStats.feverTicks = 8; + currentFallInterval = GetRogueFallInterval(); + FillRogueDemoRows(16, 18, 1); + FillRogueDemoRowExcept(19, 3, 4, 1); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_SCREEN_BOMB: + rogueStats.screenBombLevel = 1; + rogueStats.screenBombCount = 1; + FillRogueDemoRows(11, 19, 0); + SetRogueDemoCurrentPiece(4, 0, 4, 0); + break; + + case DEMO_TERMINAL_CLEAR: + rogueStats.lastChanceUpgradeLevel = 1; + rogueStats.lastChanceCount = 1; + rogueStats.terminalClearLevel = 1; + rogueStats.screenBombLevel = 1; + rogueStats.screenBombCount = 1; + FillRogueDemoRows(0, 5, 2); + FillRogueDemoRows(12, 19, 3); + SetRogueDemoCurrentPiece(4, 0, 3, -1); + break; + + case DEMO_DUAL_CHOICE: + rogueStats.dualChoiceLevel = 1; + FillRogueDemoRows(16, 18, 4); + FillRogueDemoRowExcept(19, 3, 4, 4); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_DESTINY_WHEEL: + rogueStats.destinyWheelLevel = 1; + FillRogueDemoRows(16, 18, 5); + FillRogueDemoRowExcept(19, 3, 4, 5); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_PERFECT_ROTATE: + rogueStats.perfectRotateLevel = 1; + FillRogueDemoRows(16, 19, 6); + for (int y = 10; y < nGameHeight; y++) + { + FillRogueDemoCell(y, 0, 0); + } + SetRogueDemoCurrentPiece(2, 1, 0, 0); + break; + + case DEMO_TIME_DILATION: + rogueStats.timeDilationLevel = 1; + rogueStats.timeDilationTicks = 8; + FillRogueDemoRows(3, 19, 4); + currentFallInterval = GetRogueFallInterval(); + SetRogueDemoCurrentPiece(0, 1, 3, 0); + SetFeedbackMessage(_T("时间缓流"), _T("堆叠高度危险,短时间内下落速度降低。"), 12); + break; + + case DEMO_HIGH_PRESSURE: + rogueStats.highPressureLevel = 1; + rogueStats.scoreMultiplierPercent = 150; + rogueStats.expMultiplierPercent = 150; + currentFallInterval = GetRogueFallInterval(); + FillRogueDemoRows(16, 18, 1); + FillRogueDemoRowExcept(19, 3, 4, 1); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_TETRIS_GAMBLE: + rogueStats.tetrisGambleLevel = 1; + FillRogueDemoRows(16, 18, 2); + FillRogueDemoRowExcept(19, 3, 4, 2); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_EXTREME_PLAYER: + rogueStats.extremePlayerLevel = 1; + rogueStats.highPressureLevel = 1; + rogueStats.tetrisGambleLevel = 1; + currentFallInterval = GetRogueFallInterval(); + FillRogueDemoRows(16, 18, 3); + FillRogueDemoRowExcept(19, 3, 4, 3); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_UPGRADE_SHOCKWAVE: + rogueStats.upgradeShockwaveLevel = 1; + rogueStats.exp = 0; + rogueStats.requiredExp = 12; + FillRogueDemoRows(12, 18, 2); + FillRogueDemoRowExcept(19, 3, 4, 6); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_EVOLUTION_IMPACT: + rogueStats.evolutionImpactLevel = 1; + rogueStats.exp = 0; + rogueStats.requiredExp = 12; + FillRogueDemoRows(11, 18, 3); + FillRogueDemoRowExcept(19, 3, 4, 3); + SetRogueDemoCurrentPiece(0, 0, 3, 0); + break; + + case DEMO_CONTROL_MASTER: + rogueStats.holdUnlocked = 1; + rogueStats.controlMasterLevel = 1; + rogueStats.previewCount = 3; + holdType = 0; + FillRogueDemoRows(16, 18, 4); + FillRogueDemoRowExcept(19, 3, 4, 4); + SetRogueDemoCurrentPiece(2, 0, 3, 0); + break; + + case DEMO_BLOCK_STORM: + rogueStats.blockStormLevel = 1; + rogueStats.blockStormPiecesRemaining = 5; + FillRogueDemoRows(15, 19, 0); + for (int y = 8; y < nGameHeight; y++) + { + FillRogueDemoCell(y, 5, 0); + } + SetRogueDemoCurrentPiece(0, 1, 3, 0); + nextTypes[0] = 0; + nextTypes[1] = 0; + nextTypes[2] = 0; + SetFeedbackMessage(_T("方块风暴"), _T("当前和后续预览全部变为 I 块,方便制造四消。"), 12); + break; + + case DEMO_BLACK_HOLE: + rogueStats.blackHoleLevel = 1; + rogueStats.blackHoleCharges = 1; + FillRogueDemoRows(9, 19, 2); + for (int y = 8; y < nGameHeight; y++) + { + for (int x = 1; x < nGameWidth; x += 3) + { + workRegion[y][x] = 2; + } + } + SetRogueDemoCurrentPiece(1, 0, 3, 0); + break; + + case DEMO_AIR_RESHAPE: + rogueStats.reshapeLevel = 1; + rogueStats.reshapeCharges = 1; + FillRogueDemoRows(16, 19, 3); + for (int y = 10; y < nGameHeight; y++) + { + FillRogueDemoCell(y, 9, 0); + } + SetRogueDemoCurrentPiece(1, 0, 6, 0); + break; + case DEMO_CROSS: FillRogueDemoRows(13, 17, 5); for (int y = 6; y < nGameHeight; y++) @@ -3208,63 +3545,6 @@ static void ApplyRogueSkillDemoStep() SetRogueDemoCurrentPiece(1, 0, 3, 0); break; - case DEMO_SWEEPER: - rogueStats.sweeperLevel = 4; - FillRogueDemoRows(15, 18, 1); - FillRogueDemoRowExcept(19, 3, 4, 3); - SetRogueDemoCurrentPiece(0, 0, 3, 0); - break; - - case DEMO_LAST_CHANCE: - rogueStats.lastChanceUpgradeLevel = 1; - rogueStats.lastChanceCount = 1; - FillRogueDemoRows(0, 5, 5); - FillRogueDemoRows(14, 19, 3); - SetRogueDemoCurrentPiece(4, 0, 3, -1); - break; - - case DEMO_TIME_DILATION: - rogueStats.timeDilationLevel = 1; - rogueStats.timeDilationTicks = 8; - FillRogueDemoRows(3, 19, 4); - currentFallInterval = GetRogueFallInterval(); - SetRogueDemoCurrentPiece(0, 1, 3, 0); - SetFeedbackMessage(_T("时间缓流"), _T("堆叠高度危险,短时间内下落速度降低。"), 12); - break; - - case DEMO_UPGRADE_SHOCKWAVE: - rogueStats.upgradeShockwaveLevel = 1; - rogueStats.exp = 0; - rogueStats.requiredExp = 12; - FillRogueDemoRows(12, 18, 2); - FillRogueDemoRowExcept(19, 3, 4, 6); - SetRogueDemoCurrentPiece(0, 0, 3, 0); - break; - - case DEMO_BLOCK_STORM: - rogueStats.blockStormLevel = 1; - rogueStats.blockStormPiecesRemaining = 5; - FillRogueDemoRows(15, 19, 0); - for (int y = 8; y < nGameHeight; y++) - { - FillRogueDemoCell(y, 5, 0); - } - SetRogueDemoCurrentPiece(0, 1, 3, 0); - nextTypes[0] = 0; - nextTypes[1] = 0; - nextTypes[2] = 0; - SetFeedbackMessage(_T("方块风暴"), _T("当前和后续预览全部变为 I 块,方便制造四消。"), 12); - break; - - case DEMO_STABLE_STRUCTURE: - rogueStats.stableStructureLevel = 4; - FillRogueDemoRows(14, 19, 1); - workRegion[15][4] = 0; - workRegion[16][6] = 0; - workRegion[17][5] = 0; - SetRogueDemoCurrentPiece(1, 0, 3, 0); - break; - default: break; }