From 2f435f5ca6af7109252a4292c9eb863a12e6fd51 Mon Sep 17 00:00:00 2001 From: qihuanye <2728290997@qq.com> Date: Tue, 28 Apr 2026 21:11:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B8=AE=E5=8A=A9=E9=A1=B5?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/source/Tetris.cpp | 33 ++++++++++++++++---------- src/source/TetrisRogue.cpp | 47 ++++++++++---------------------------- 2 files changed, 33 insertions(+), 47 deletions(-) diff --git a/src/source/Tetris.cpp b/src/source/Tetris.cpp index 5f5ee66..fd32fcb 100644 --- a/src/source/Tetris.cpp +++ b/src/source/Tetris.cpp @@ -981,7 +981,20 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) if (currentScreen != SCREEN_MENU && IsPointInRect(GetBackButtonRect(hWnd), mouseX, mouseY)) { - ReturnToMainMenu(); + if (currentScreen == SCREEN_PLAYING && IsRogueSkillDemoMode()) + { + OpenSkillDemoScreen(); + } + else if (currentScreen == SCREEN_RULES && helpState.currentPage != 0) + { + helpState.selectedIndex = (helpState.currentPage == 5) ? 3 : helpState.currentPage - 1; + helpState.currentPage = 0; + helpScrollOffset = 0; + } + else + { + ReturnToMainMenu(); + } InvalidateRect(hWnd, nullptr, FALSE); break; } @@ -1076,15 +1089,9 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } else if (IsPointInRect(GetHelpBackHintRect(hWnd), mouseX, mouseY)) { - if (helpState.currentPage == 4) - { - ReturnToMainMenu(); - } - else - { - helpState.currentPage = 0; - helpScrollOffset = 0; - } + helpState.selectedIndex = (helpState.currentPage == 5) ? 3 : helpState.currentPage - 1; + helpState.currentPage = 0; + helpScrollOffset = 0; InvalidateRect(hWnd, nullptr, FALSE); } else if (helpState.currentPage == 4 && IsPointInRect(GetCreditArrowRect(hWnd, -1), mouseX, mouseY)) @@ -1387,7 +1394,9 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } else if (helpState.currentPage == 4) { - ReturnToMainMenu(); + helpState.currentPage = 0; + helpState.selectedIndex = 3; + helpScrollOffset = 0; } else if (helpState.currentPage == 5) { @@ -1535,7 +1544,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } else if (wParam == VK_ESCAPE || wParam == VK_BACK || wParam == 'M') { - ReturnToMainMenu(); + OpenSkillDemoScreen(); InvalidateRect(hWnd, nullptr, FALSE); break; } diff --git a/src/source/TetrisRogue.cpp b/src/source/TetrisRogue.cpp index e4d5192..4dc22cc 100644 --- a/src/source/TetrisRogue.cpp +++ b/src/source/TetrisRogue.cpp @@ -166,46 +166,18 @@ 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_PRESSURE_RELIEF, _T("卸压清场"), _T("进入场景时只演示卸压清场:最高占用行被清除。") }, - { DEMO_SWEEPER, _T("底线清道夫"), _T("Space 消去底行,充能满后自动再清扫底部。") }, + { DEMO_BLACK_HOLE, _T("黑洞奇点"), _T("按 Z 吞噬场上最多的粉色方块,观察棋盘变化。") }, + { DEMO_SCREEN_BOMB, _T("清屏炸弹"), _T("按 X 主动引爆,清理底部 5 行高压区。") }, + { DEMO_AIR_RESHAPE, _T("空中换形"), _T("按 V 把当前方块变为 I 块,再用 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_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_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 释放黑洞后,下一枚方块会被召唤成彩虹方块。") } + { DEMO_VOID_CORE, _T("虚空核心"), _T("按 Z 释放黑洞后,下一枚方块会被召唤成彩虹方块。") }, + { DEMO_UPGRADE_SHOCKWAVE, _T("升级冲击波"), _T("Space 消一行立刻升级,不弹强化菜单并清除底部 2 行。") }, + { DEMO_STABLE_STRUCTURE, _T("稳定结构"), _T("Space 落地后只触发稳定结构,自动填补局部空洞。") } }; static constexpr int kRogueDemoStepCount = sizeof(kRogueDemoSteps) / sizeof(kRogueDemoSteps[0]); @@ -3061,7 +3033,12 @@ static void ResetRogueDemoBoard() */ static void ShowRogueDemoFloatingName(const TCHAR* name) { - (void)name; + floatingTextEffects[0].ticks = 70; + floatingTextEffects[0].totalTicks = 70; + floatingTextEffects[0].boardX = 500; + floatingTextEffects[0].boardY = 1000; + floatingTextEffects[0].color = RGB(255, 248, 250); + lstrcpyn(floatingTextEffects[0].text, name, sizeof(floatingTextEffects[0].text) / sizeof(TCHAR)); } /**