fix(呈现): 主菜单副标题「扫雷的因 · 逐行兑现的果」整个删除(2026-10-16 用户令——无意义标语,玩家可见面禁扫雷字眼)

- ui_assembler.gd: 副标题 label 两行删除(标题与分隔线之间;局部变量无外部依赖,VBox 回流)
- shot_probe.gd: menu_sub 文字锚/自检腿退役(menu_title 保留)+ 菜单段头部历史注记换代
- shot_checker.py: 菜单·副标题 box/presence 两断言腿同撤(_meta 记录端随 pair 列表自断),不重锚
- golden: menu_boot.png 基线换代——触发原因=副标题件删除画面少一行字(呈现类批内换代,Q6 口径;提交说明强制成因即本条)
- 文档四面同步: 01-核心循环 节标题改「一场战斗的流程」(口号句无承载价值,正文已释流程);HUD框架 双舞台段删口号句保留因果论点并句;教学引导 P0 最小集合候选删「归因提示」项;07 ㉗ 目检判据删副标题字样
- 验证: shot_probe 问题=0;render_gate 全绿(shot_checker PASS / 棋盘三屏 golden OK / 菜单 golden changed=0.00% / 残留 Godot=0);改动面 7 文件(含基线 PNG)
This commit is contained in:
DKChan committed 2026-10-16 04:33:17 +08:00
1 parent 849e4b1cd2
commit 9846a29f4c
8 files changed
+10 -12

No files matched your search

+1 -1
View File
@@ -2,7 +2,7 @@
一句话:下洞 → 扫雷攒筹码 → 自动战斗兑现 → 变强再下洞;死了,从头再来。
## 一场战斗:扫雷的因,战斗的果
## 一场战斗的流程
每场战斗都在一张雷图上打。战斗本身不用手操——你能做的全部决策,都在它的"准备期"里:
+1 -1
View File
@@ -300,7 +300,7 @@
| # | 目检项 | 判据 |
|---|---|---|
| 1 | 启动即见主菜单 | F5 启动后第一屏是主菜单(标题「Dungeon Sweeper」+副标题「扫雷的因」+开始/继续上局/营地/生涯/设置/退出六钮),**不再**是战斗界面/棋盘背景 |
| 1 | 启动即见主菜单 | F5 启动后第一屏是主菜单(标题「Dungeon Sweeper」+开始/继续上局/营地/生涯/设置/退出六钮),**不再**是战斗界面/棋盘背景 |
| 2 | 菜单按钮可点 | 六钮逐个点:鼠标悬停有反馈、点击有响应(继续上局在无断点时不显示——有断点时显示且文案带关卡号) |
| 3 | 菜单与战斗互不遮挡 | 开新冒险后菜单让位、战斗界面完整可见;回菜单后战斗内容不再透出(模态互斥观感与改前一致) |
| 4 | 各覆盖层开合层级正确 | 图鉴/关卡地图/奇物/终局/商店/营地/设置/状态/生涯/确认框/调试浮窗逐个开合——浮层都在内容之上,调试浮窗浮于菜单之上且不吃下层点击 |
@@ -51,7 +51,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
### 战斗屏三区双舞台:挖掘与结算同屏不切场景
战斗屏是 MVP 唯一的玩法屏,采用"双舞台"布局——战斗画面与扫雷图两块区域同屏常驻、互不顶替:挖掘期敌人在上方待机可见,轮末结算在原地逐行展开,全程不切换场景。"扫雷的因"与"战斗的果"因此永远摆在一起,因果不需要玩家凭记忆拼接。
战斗屏是 MVP 唯一的玩法屏,采用"双舞台"布局——战斗画面与扫雷图两块区域同屏常驻、互不顶替:挖掘期敌人在上方待机可见,轮末结算在原地逐行展开,全程不切换场景,因果不需要玩家凭记忆拼接。
三区各管一块:
@@ -80,7 +80,7 @@ HUD 框架定稿时已为教学留好两个承载位,本系统的内容将来
## P0 最小闭环
教学引导整体后置,MVP 不要求最小闭环。Alpha 期的最小集合候选:三动作教学 + 行动点价目 + "扫雷的因 = 战斗的果"归因提示 + chord 首遇提示。
教学引导整体后置,MVP 不要求最小闭环。Alpha 期的最小集合候选:三动作教学 + 行动点价目 + chord 首遇提示。
## P1 / P2 后置
-2
View File
@@ -125,8 +125,6 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary:
var title := UiKit.label("Dungeon Sweeper",UiKit.FS_H1, true, UiKit.INK_ON_DEEP)
box.add_child(title)
var sub := UiKit.label("扫雷的因 · 逐行兑现的果",UiKit.FS_BODY, false, UiKit.WARM_SOFT)
box.add_child(sub)
box.add_child(HSeparator.new())
# 组帽·冒险(M2 分组)
+4 -4
View File
@@ -49,8 +49,8 @@ func _ready() -> void:
if main.debug_overlay != null and main.debug_overlay.visible:
main._close_modal(main.debug_overlay)
await get_tree().process_frame
# ① 菜单(启动态)——meta 锚经 S1 裁后换代(2026-10-08 用户裁:副标题锚改认现行文案;
# 帮助文腿整个退役——载体玩法速览牌 2026-10-06 用户令退役,checker 对应断言段同撤)
# ① 菜单(启动态)——帮助文腿整个退役(载体玩法速览牌 2026-10-06 用户令退役,checker 对应断言段同撤);
# 副标题件 2026-10-16 用户令整个删除(无意义标语),菜单文字锚只剩标题
# 自检一(迭代 28 T4):boot 态顶层可见全屏层=start_overlay(内容层树遍历——屏壳是容器不当候选:
# camp 壳 boot 态 vis=true 但成员恒隐,裸树遍历自顶向下会先命中透明壳)
var top: Node = null
@@ -71,10 +71,10 @@ func _ready() -> void:
if top != main._start_overlay:
_problems.append("boot 态顶层可见层≠start_overlay(实测 %s——菜单被埋)〔装配生命批 V4〕"
% (top.name if top != null else "null"))
# 自检二(迭代 28 T4):菜单标题/副标题 label 必须 is_visible_in_tree 且 rect 落屏内
# 自检二(迭代 28 T4):菜单标题 label 必须 is_visible_in_tree 且 rect 落屏内
#(对比度只判反差不判「字在」——本条+checker 墨色占比共同补内容判据)
var vp := get_viewport().get_visible_rect()
for pair in [["menu_title", "Dungeon Sweeper"], ["menu_sub", "扫雷的因"]]:
for pair in [["menu_title", "Dungeon Sweeper"]]:
var lbl: Label = ProbeUiUtil.find_label(main._start_overlay, String(pair[1]))
if lbl == null:
_problems.append("菜单文字缺失: %s(find_label 零命中)〔装配生命批 V4〕" % String(pair[1]))
Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 KiB

After

Width:  |  Height:  |  Size: 323 KiB

+2 -2
View File
@@ -160,11 +160,11 @@ def main() -> int:
failures.append("明度三档带: meta 几何缺失")
if "shot_menu.png" in imgs:
m = imgs["shot_menu.png"]
check_text_box(m, box_of(meta, "menu_sub"), "菜单·副标题", failures)
check_text_presence(m, box_of(meta, "menu_title"), "菜单·标题", failures)
check_text_presence(m, box_of(meta, "menu_sub"), "菜单·副标题", failures)
# 菜单·帮助文断言腿退役(迭代 19 卡① S1 裁 2026-10-08——载体玩法速览牌 2026-10-06 用户令
# 退役「界面禁玩法文字墙」,锚/取样键/断言段三处同撤,不重锚)
# 菜单·副标题断言腿退役(2026-10-16 用户令——副标题件整个删除〔无意义标语〕,
# meta 键/断言两腿同撤,不重锚)
print("[shot_checker] 焦点预算〔首焦唯一〕= 目检项(T15 段闸人闸清单判定——语义面不机检)")
if failures:
print("[shot_checker] FAIL——")