From 9fc12f791eb7bf4b588860c9cb015007d8a13b7f Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Mon, 9 Nov 2026 08:22:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E7=BA=A2(=E8=B0=83=E8=AF=95=E8=A7=92?= =?UTF-8?q?=E6=A0=87=E6=81=A2=E5=A4=8D=E6=89=B9=E5=90=8E=E7=BB=AD=C2=B7CI?= =?UTF-8?q?=20run=20152=20=E7=9C=9F=E7=BA=A2=E9=97=AD=E5=90=88):=20ui=5Fst?= =?UTF-8?q?ruct=5Fprobe=20ESC=E6=89=B9=20V8=20=E6=81=92=E9=9A=90=E6=96=AD?= =?UTF-8?q?=E8=A8=80=E7=BF=BB=E5=9B=9E=E2=80=94=E2=80=94=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E6=89=B9(5c9d8845)=E7=BF=BB=E4=BA=86=E4=B8=89=E5=A4=84?= =?UTF-8?q?=E6=81=92=E9=9A=90=E6=96=AD=E8=A8=80,=E6=9C=AC=E5=A4=84?= =?UTF-8?q?=E6=BC=8F=E7=BD=91=E7=AC=AC=E5=9B=9B=E5=A4=84(=E3=80=8C?= =?UTF-8?q?=E6=B5=AE=E7=AA=97=E5=BC=80=E6=80=81=20debug=5Fbadge=20?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E8=A7=81=E3=80=8D=E9=A2=84=E6=9C=9F=E9=9A=8F?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E6=80=81=E6=81=92=E9=9A=90=E8=AF=AD=E4=B9=89?= =?UTF-8?q?=E9=80=80=E5=BD=B9=E8=80=8C=E8=BF=87=E6=9C=9F),=E6=8C=89?= =?UTF-8?q?=E6=81=A2=E5=A4=8D=E6=89=B9=E5=90=8C=E5=8F=A3=E5=BE=84=E7=BF=BB?= =?UTF-8?q?=E5=9B=9E=E3=80=8C=E6=B5=AE=E7=AA=97=E5=BC=80=E6=80=81=E8=A7=92?= =?UTF-8?q?=E6=A0=87=E4=B8=8D=E5=8F=AF=E8=A7=81=3D=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E6=B5=AE=E5=B1=82=E6=9C=80=E9=A1=B6=E5=B1=82=E5=A4=B1=E5=AE=88?= =?UTF-8?q?=E3=80=8D;=E6=9C=AC=E6=96=87=E4=BB=B6=E5=88=A4=E6=8D=AE?= =?UTF-8?q?=E5=87=BA=E5=A4=84=E6=B3=A8=E8=AE=B0=E8=A1=8C=E9=9A=8F=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E9=94=9A=E6=94=B9=E7=89=88=E6=89=B9=E5=90=8C=E6=89=B9?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E5=8C=96=E3=80=82=E5=8C=BA=E5=86=85=E5=87=AD?= =?UTF-8?q?=E6=8D=AE:=20ui=5Fstruct=5Fprobe=20=E7=9B=B4=E8=B7=91=20exit=20?= =?UTF-8?q?0(=E7=9C=9F=E5=AE=9E=E8=B7=91=E6=89=B9=E8=AF=BB=E6=95=B0,?= =?UTF-8?q?=E6=8E=A2=E9=92=88=E9=80=80=E5=87=BA=E7=A0=81=E4=B8=BA=E5=94=AF?= =?UTF-8?q?=E4=B8=80=E6=9D=83=E5=A8=81=E5=88=A4=E6=8D=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/probe/ui_struct_probe.gd | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/game/probe/ui_struct_probe.gd b/game/probe/ui_struct_probe.gd index b217fe37..d7f3b989 100644 --- a/game/probe/ui_struct_probe.gd +++ b/game/probe/ui_struct_probe.gd @@ -89,7 +89,7 @@ func _ready() -> void: # ---- 生涯页:入口=帐篷旁笔记本(卡④ T3 改挂——场景点选信号真实路由→组合根 _open_career)→ # 结构断言族→只读巡检(契约 3)+零动效契约+零跳转契约(提纲 P4 甲)→组合根真实路径关闭。 #(登记序/树序契约统一在全模态 _modal_registry_contract——boot 段跑)---- - # 判据出处: design/ux/camp.md:19 帐篷旁笔记本→生涯记录;生涯页返回钮口径由结构校验兜底(生涯段) + # 判据出处: design/ux/camp.md「场景构成与七物件绑定」半开的门扇 半开的门扇;生涯页返回钮口径由结构校验兜底(生涯段) # 营地语境:开始层全程隐藏(笔记本入口在营地场景根——关生涯回营地不回开始层,卡④ T3 语境分支) main._camp_pres.open_camp() # 重开营地场景根(笔记本入口语境) _settle() @@ -106,7 +106,7 @@ func _ready() -> void: if main.ui.modals.menu.career_overlay.visible or main.ui.screens.start_overlay.visible: problems.append("[career] 关闭后页未隐藏或开始层回弹(营地语境分支失守)〔营地图批 V5〕") # ---- Esc 浮窗结构段(卡⑤——三钮在位且仅三+零动效契约+登记序在册+debug_badge 不波及)---- - # 判据出处: design/ux/camp.md:45 ESC 优先序:有窗先关最上层窗、无窗才进浮窗;各窗自带关闭钮(Esc 段) + # 判据出处: design/ux/camp.md「叠层与开合」各窗自带关闭钮 各窗自带关闭钮、无窗才进浮窗;各窗自带关闭钮(Esc 段) main._camp_pres.open_camp() _settle() var gpos_gate: Vector2 = main.ui.modals.camp.scene.get_hotspot_rect(&"gate").get_center() @@ -159,8 +159,10 @@ func _ready() -> void: var quit_chain := FileAccess.get_file_as_string("res://presentation/main.gd") + FileAccess.get_file_as_string("res://presentation/main_esc_flow.gd") if not quit_chain.contains("MainEscFlow.on_quit(self)") or not quit_chain.contains("root.quit_game()"): problems.append("[esc] 退出调用链断裂(_on_esc_quit→_on_quit→_quit_game)〔ESC批 V5〕") - if main.ui.screens.debug_badge.visible: - problems.append("[esc] 浮窗开态 debug_badge 可见(发布态恒隐——float 类不注册 ModalStack 应零波及)〔ESC批 V8〕") + # 调试入口断言(V8 随恢复批换代——全局浮层角标=UI 最顶层、任何 UI 不遮挡,浮窗开态仍应可见; + # 2026-11-09 特批恢复批——发布态恒隐语义退役,原「浮窗开态不可见」预期过期漏翻,CI run 152 红实证) + if main.ui.screens.debug_badge == null or not main.ui.screens.debug_badge.visible: + problems.append("[esc] 浮窗开态调试角标不可见(全局浮层最顶层失守——被遮挡)〔ESC批 V8〕") push_esc.call() _settle() if main.ui.modals.camp.esc_overlay.visible: @@ -213,7 +215,7 @@ func _ready() -> void: _settle() # ---- 冒险簇(真流推进:开冒险→地图选路态→选战斗节点→战斗 HUD)---- - # 判据出处: design/ux/level-map.md:3 图上点击选路·候选按钮退役(冒险簇选路真点组) + # 判据出处: design/ux/level-map.md「UX Spec: 关卡画面」四项设计拍板 四项设计拍板(冒险簇选路真点组) ProbeUiUtil.isolate_save(main, "smoke_ui_struct_probe_adv", true, false, true) main.ui.modals.menu.debug_overlay.seed_edit.text = "42" # 种子钉死(种子框默认为空=非首局随机,结构采样确定性禁依赖默认分支) main._start_adventure_from_menu() @@ -243,7 +245,7 @@ func _ready() -> void: # ---- 图例层(旧模态、首过结构族):ap_bar legend_toggled # 信号真路径开(board_zone 信号→组合根 _on_legend_toggled→_open_modal)→结构断言族→ # closed 信号真路径关(close()→组合根 _on_modal_closed)。 - # 判据出处: design/gdd/systems/表现与支撑/HUD框架.md:88 图例面板=模态族:统一登记序栈、入栈出栈、关闭逐层恢复(图例组) + # 判据出处: design/gdd/systems/表现与支撑/HUD框架.md「提示与弹层:轻提示随起随消、重弹层排队进出」入栈出栈 入栈出栈、入栈出栈、关闭逐层恢复(图例组) main.ui.battle.board_zone.ap_bar._btn_legend.pressed.emit() # 前提注入(保留 emit):emit 选路路径下 battle_root 未及显示且输入锁在(实证在案),真点不可达——图例开启的真输入承载随「route 信号路径屏幕切换时序」发现一并呈报待裁 _settle() if not main.ui.modals.run.legend_overlay.visible: @@ -406,7 +408,7 @@ const _PAUSE_READONLY_SIGNALS: Array[String] = [ func _status_readonly_contract(main: Node) -> void: - # 判据出处: design/engineering/code-conventions.md:21 视图零核心写调用、依赖单向(status 只读巡检组) + # 判据出处: design/engineering/code-conventions.md「1.3 依赖单向,核心写调用完成」依赖单向 依赖单向、依赖单向(status 只读巡检组) var overlay: Control = main.ui.modals.run.status_panel var stack: Array = [overlay] var conn_count := 0 @@ -453,7 +455,7 @@ func _status_zero_motion_contract(main: Node) -> void: # 清单外零连接。白名单={视图自身 _emit_closed〔返回钮〕, 组合根 _on_career_closed};页内任何 # 购买/导航/写入方向的新连接一律红,须先入册审查。 func _career_readonly_contract(main: Node) -> void: - # 判据出处: design/engineering/code-conventions.md:21 视图零核心写调用、依赖单向(career 只读巡检组) + # 判据出处: design/engineering/code-conventions.md「1.3 依赖单向,核心写调用完成」依赖单向 依赖单向、依赖单向(career 只读巡检组) var overlay: Control = main.ui.modals.menu.career_overlay var stack: Array = [overlay] var conn_count := 0 @@ -500,7 +502,7 @@ func _career_zero_motion_contract(main: Node) -> void: # _career_registry_contract 的断言(career=状态面板后/确认弹窗前、树序同步)由本全量合同覆盖) # ⑭选档界面契约(卡③ sl1/sl2/sl3/sl4/sl9——呈现面全部来自喂入数据,视图零自判) func _save_select_contract(main: Node, tpl: String) -> void: - # 判据出处: design/gdd/systems/表现与支撑/存档序列化.md:61 三存档位独立文件、激活态由选档界面建立(选档契约组) + # 判据出处: design/gdd/systems/表现与支撑/存档序列化.md「存什么:表与档分家,局内系统资源不入档」第一条边界 第一条边界、激活态由选档界面建立(选档契约组) var sso: Node = main.ui.modals.menu.save_select_overlay # sl1 三槽呈现:槽卡计数==3+零滚动容器(禁滚动长列表形态——契约 1) var rows: VBoxContainer = sso._rows_box @@ -580,7 +582,7 @@ func _collect_labels(node: Node, out: Array[String]) -> void: func _modal_registry_contract(main: Node) -> void: - # 判据出处: design/engineering/code-conventions.md:54 模态覆盖层层级规则——新增覆盖层必须登记 z 序位置(登记序契约组) + # 判据出处: design/engineering/code-conventions.md「2.3 模态覆盖层层级规则」打开任何模态覆盖层时 打开任何模态覆盖层时(登记序契约组) var list: Array = main.ui.flow.stack._list # ① 登记册序==合同模态序(逐位点名——合同是登记序唯一事实源) var contract_modals: Array = [] @@ -648,7 +650,7 @@ func _modal_registry_contract(main: Node) -> void: # ⑬career 零跳转契约(提纲 P4 甲——页内零「前往他处」入口:除「返回」外任何导航钮=红) func _career_nojump_contract(main: Node) -> void: - # 判据出处: design/ux/camp.md:19 生涯记录入口与返回钮口径由结构校验兜底——页内零导航入口(零跳转契约组) + # 判据出处: design/ux/camp.md「场景构成与七物件绑定」半开的门扇 半开的门扇(零跳转契约组) for nav in ["营地", "商店", "设置", "冒险", "继续上局", "退出", "前往"]: if ProbeUiUtil.find_button(main.ui.modals.menu.career_overlay, nav, "contains") != null: problems.append("[career][nojump] 页内出现导航入口「%s」(零跳转违约——生涯纯只读)" % nav) @@ -658,7 +660,7 @@ func _career_nojump_contract(main: Node) -> void: # (名行基线离盒底 1px 同型高危写法返修回归闸; # 内容矩形=StandeeBody.content_rect(),最低绘制元素=底座下缘) func _standeefit_contract(main: Node) -> void: - # 判据出处: design/ux/battle.md:154 主角站桩立绘(无框立绘+落影)——站桩内容矩形⊆舞台(站桩适配组) + # 判据出处: design/ux/battle.md「封印格呈现预览」封印受理后格子进入 封印受理后格子进入(无框立绘+落影)——站桩内容矩形⊆舞台(站桩适配组) var st: Node = main.ui.battle.stage if st == null or st.hero_standee == null: problems.append("[standee] 舞台/主角站桩缺失(断言中断)") @@ -743,7 +745,7 @@ func _in_scroll(c: Control) -> bool: func _audit(screen: String, roots: Array) -> void: - # 判据出处: design/engineering/architecture/architecture.md「三屏壳与组合根」(组合根交接面) 组合根交接面与呈现装配——屏结构审计宿主面(结构审计组) + # 判据出处: design/engineering/architecture/architecture.md「三屏壳与组合根」呈现场景拆为三屏壳 呈现场景拆为三屏壳(组合根交接面) 组合根交接面与呈现装配——屏结构审计宿主面(结构审计组) for r in roots: if r != null and is_instance_valid(r): _force_layout(r)