diff --git a/game/probe/ui_probe.gd b/game/probe/ui_probe.gd index b106ba01..8a37e1d3 100644 --- a/game/probe/ui_probe.gd +++ b/game/probe/ui_probe.gd @@ -16,6 +16,7 @@ func _ready() -> void: await get_tree().process_frame var problems: Array = [] # ---- 放弃入口(台账 119):默认隐藏(非冒险模式无冒险可放弃——开始层/调试两层)---- + # oracle: design/gdd/ux/level-map.md:59 放弃冒险入口=边缘动作、任意选路停点承载——非冒险模式无入口(默认隐藏) if main.ui.modals.run.level_screen.abandon_btn == null or main.ui.modals.run.level_screen.abandon_btn.visible: print("[ui_probe] FAIL — 放弃按钮默认应隐藏(非冒险模式关)") get_tree().quit(1) @@ -23,6 +24,7 @@ func _ready() -> void: # ---- 营地覆盖层(主菜单入口/开合/余额文案/购买禁用态; # 隔离存档换注 main.meta 保确定性(禁碰真实档 user://save.json——SaveManager 路径注入纪律; # 营地先行段只换 meta 不换 save_manager——冒险段换注零档在前)---- + # oracle: design/gdd/ux/camp.md:45 五功能窗统一窗壳、五窗互斥单开、各窗自带关闭钮(营地开合组) ProbeUiUtil.isolate_save(main, "smoke_ui_probe_camp", false, false, false) if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_ui_probe_camp"): problems.append("营地入口缺失(选档层新档钮——mn9 新路径驱动中断)〔句柄子容器批 V1〕") @@ -34,10 +36,12 @@ func _ready() -> void: problems.append("营地层打开时开始层未隐藏(规范 2.3 遮挡纪律)〔句柄子容器批 V1〕") else: # 天赋树子界面(场景点选真实路由——木桩命中区进树界面;卡④ T5 深员改指) - main.ui.modals.camp.scene.object_pressed.emit(&"dummy") + # oracle: design/gdd/ux/camp.md:20 木桩命中区→天赋树界面入口(场景点选路由) + ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"dummy").get_center()) await get_tree().process_frame if not main.ui.modals.camp.tree.visible: problems.append("天赋树子界面未打开(场景点选路由中断)〔营地图批 V2〕") + # oracle: design/gdd/ux/camp.md:41 钥石余额常驻画面顶部 HUD 栏(余额文案组) if not String(main.ui.modals.camp.tree._balance_label.text).begins_with("钥石"): problems.append("营地余额文案缺失(%s)〔句柄子容器批 V1〕" % main.ui.modals.camp.tree._balance_label.text) if main.ui.modals.camp.tree._tree_buy_btns.is_empty(): @@ -50,14 +54,15 @@ func _ready() -> void: problems.append("脊柱生命 L1 白板可购钮未启用(无门槛——can_buy 不含余额面语义)〔句柄子容器批 V1〕") if not btn_by_id.has("att_socket2") or not bool(btn_by_id["att_socket2"].disabled): problems.append("同调位 2 前置未亮应禁用(点亮前置语义)〔句柄子容器批 V1〕") - main.ui.modals.camp.tree.closed.emit() + ProbeUiUtil.push_click(main, ProbeUiUtil.find_button(main.ui.modals.camp.tree, "返回营地")) # 真点底栏返回钮→_emit_closed(camp_sub_view_base.gd:66-84) await get_tree().process_frame # 秘宝匣子界面(场景点选真实路由——宝箱命中区) - main.ui.modals.camp.scene.object_pressed.emit(&"chest") + # oracle: design/gdd/ux/camp.md:18 宝箱命中区→秘宝匣界面入口 + ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"chest").get_center()) await get_tree().process_frame if main.ui.modals.camp.treasure._workshop_rows.size() != 12: problems.append("秘宝匣行数错误(%d ≠ 12——迭代 22 秘宝批换代)〔句柄子容器批 V1〕" % main.ui.modals.camp.treasure._workshop_rows.size()) - main.ui.modals.camp.treasure.closed.emit() + ProbeUiUtil.push_click(main, ProbeUiUtil.find_button(main.ui.modals.camp.treasure, "返回营地")) await get_tree().process_frame main._on_camp_closed() # 关层收闭(营地与选档层同收+开始层恢复——卡④ T3) await get_tree().process_frame @@ -71,6 +76,7 @@ func _ready() -> void: await get_tree().process_frame # ---- 入口选路停点(关卡开始即出节点图——level_started 后、首战前弹选路层; # press_candidate 图上命中路径 pick 入口单候选进首战)---- + # oracle: design/gdd/ux/level-map.md:11 入口停点候选数=入口个数(入口单候选断言) # ---- 独立性断言(独立屏激活期战斗屏宿主整体隐藏,零透出)---- if not main.ui.modals.run.level_screen.visible: problems.append("关卡开始未弹入口选路停点(level_screen 应可见)") @@ -86,14 +92,16 @@ func _ready() -> void: if not main.ui.screens.battle_root.visible or main.ui.modals.run.level_screen.visible: problems.append("选路提交战斗节点后未切回战斗屏(屏级互斥恢复失守)") # ---- 放弃入口·冒险模式可见 + 战斗中按下被拒(真实按钮路径——入口挂选路停点,战斗中拒绝为防御分支)---- + # oracle: design/gdd/ux/level-map.md:42 放弃冒险(任意选路停点)→ 冒险落幕——战斗域单事务在飞时拒绝 if main.ui.modals.run.level_screen.abandon_btn == null or not main.ui.modals.run.level_screen.abandon_btn.visible: problems.append("冒险模式放弃按钮未开放(选路停点入口在案)") else: - main.ui.modals.run.level_screen.abandon_btn.pressed.emit() + ProbeUiUtil.push_click(main, main.ui.modals.run.level_screen.abandon_btn) await get_tree().process_frame if main.run_scope.adventure == null or String(main.run_scope.adventure.state) != "running": problems.append("首战中放弃未被拒(战斗域单事务在飞——state 应保持 running)") # ---- 既有断言(回归基线;A 区无进度条——节点链进度由关卡画面独立屏承载)---- + # oracle: design/gdd/ux/battle.md:122 B 区构建组:主角与敌人站桩、明细带挖掘期收起、轮次指示、棋盘与 C 区/秘宝槽、首战进行中 if main.ui.battle.board_zone.board_view.cells_probe().is_empty(): problems.append("棋盘格未生成(cells=0)") if main.ui.battle.board_zone.board_view.board() == null: @@ -110,7 +118,8 @@ func _ready() -> void: if main.ui.battle.stage.enemy_box.get_child_count() < 1: problems.append("B 区敌方站桩未构建(%d 个)" % main.ui.battle.stage.enemy_box.get_child_count()) if main.ui.battle.board_zone.ap_bar._dots.get_child_count() != int(main.db.run.action_economy.ap_per_round): - problems.append("D 区 AP 点阵数量错误(%d)" % main.ui.battle.board_zone.ap_bar._dots.get_child_count()) + problems.append("D 区 AP 点阵数量错误(%d)" % main.ui.battle.board_zone.ap_bar._dots.get_child_count()) + # oracle: design/gdd/systems/排雷循环/行动经济.md:258 开轮硬重置:行动点回到表值(AP 点阵数=ap_per_round) if main.ui.battle.board_zone.ap_bar.refresh_remaining_text() == "": problems.append("D 区弃图刷新按钮文案缺失") if main.ui.battle.board_zone.toast == null: @@ -127,6 +136,7 @@ func _ready() -> void: # E 区无道具面板——四区构建由其余断言覆盖 # ---- 敌方站桩投影(顺位徽标/意图三档动作动画占位——敌人系统×4,全站桩)---- + # oracle: design/gdd/systems/表现与支撑/HUD框架.md:275 敌人呈现:意图占位三档可见性——普通攻击零表示、类型级提示(站桩投影组) # B 区站桩子件伴随件化(壳层 tooltip 载体)——断言口径见台账 171: # 伴随件化(壳层 tooltip 载体),穿透明(子件 _name_label/_armor_icon/_intent_badge)改本体 # 探针出口 stage.enemy_body_at(i).name_line_probe()/intent_probe()——呈现口径逐字保持 @@ -153,6 +163,7 @@ func _ready() -> void: elif not bool(main.ui.battle.stage.hero_standee.portrait_probe().get("has_tex", false)): problems.append("主角立绘纹理未落位(显示档 hero=144——显示档批)") # ---- BUG-0001 回归(tooltip 入树后 set_effects 槽位不错位——结算软锁修复沉淀)---- + # oracle: design/gdd/systems/表现与支撑/HUD框架.md:274 状态槽图标+层数+剩余次数、悬停见来源(tooltip 回归组) var slots_row = main.ui.battle.stage.hero_standee.slot_row # BUG-0001 回归随组件迁入站桩(tooltip/槽位错位同源) var probe_eff: Array = [{"effect_id": "attack_up", "display_name": "增伤", "layers": 1, "remaining_settlements": 1, "source_class": "safe_cell", "round_index": 1, "effective_value": 50}] @@ -178,6 +189,7 @@ func _ready() -> void: # ---- 图标键回归(HUD框架 图标键契约:状态表九行全映射〔定稿 PNG 纹理〕、 # 格面资源 cell_type 九型全映射〔含 gp 键〕;查不到的键 fail-fast + ? 占位 # ——此处钉死映射不残缺,未知键断言由 _icon_tex/_badge_glyph 承担)---- + # oracle: design/gdd/systems/表现与支撑/HUD框架.md:274 极性按键级表呈现——状态图标键映射不残缺(图标键回归组) for eid in ["attack_up", "ac_up", "alert", "weaken", "enrage", "off_guard", "sapped", "empower", "fortify"]: if not StatusSlotRow.EFFECT_ICON.has(eid) or StatusSlotRow.EFFECT_ICON[eid] == null: problems.append("状态图标九键纹理映射缺失(%s)" % eid) @@ -202,6 +214,7 @@ func _ready() -> void: # ---- L2 单场段(debug_session 单场原语 + 去饱和接口可用性;雾格机制已整体移除,不再断言变体呈现)---- # 单场无用户入口——探针直调 debug_session 原语(battle_created/ready 仍经组合根接线; # _reset_run_scope 复现 _start_single 的提示去重复位) + # oracle: design/gdd/systems/排雷循环/地形变异.md:156 布置域:变异格全在初始展开区外(L2 布置域组) main.begin_session(false) main._debug.start_single(2) await get_tree().process_frame @@ -224,6 +237,7 @@ func _ready() -> void: # ---- GP 终局行:summary gp_final 键取数+胜利面板 GP 行呈现(C5:GP 行只上冒险终局面板; # 断言面 = summary 键,无影子账清零转存)---- # (置于战斗态断言之后——合成收束会灰化站桩并清 settlement 引用,具污染性) + # oracle: design/gdd/ux/settlement-summary.md:20 战利品行=GP 增量+总量(冒险终局面板 GP 行组) var meta_saved = main.meta.save for p2 in ["user://smoke_ui_probe_settle_scratch.json", "user://smoke_ui_probe_settle_scratch.json.tmp"]: if FileAccess.file_exists(p2):