暂停层组B:两屏入口角标+has_open守卫+四探针断言+冒烟数据一致性(迭代17卡③T2)

- modal_stack.gd 新增 has_open_excluding(skip):排除式开态查询(地图屏系登记册模态成员=常态
  屏态,其上角标必须可点;只读查询零副作用,登记序/开合记账语义零改动)
- board_zone_view.gd 战斗屏 HUD 右下角+level_map_screen.gd 地图屏顶栏 GP 徽右——各一枚「暂停」
  角标(debug 角标同形制:UiKit.button 紧凑豁免宽度基准+FS_HINT 字号降档;可见性/置灰归组合根,
  信号连接归组合根 ADR-0001;非对局期显式不可见防菜单误现——P1 丁)
- main.gd 接线:两角标 pressed→_on_pause_badge_pressed(守卫兜底处理器:他层开着即拒开——
  常态防线=置灰,探针 emit 绕过 disabled 时由此兜住;地图屏开态经 has_open_excluding 不计自身)
  +_sync_pause_entry 单一同步点(可见性=_level_active∧屏态;置灰=has_open)挂模态开合单口与
  屏级互斥口/进局/离局/续玩五路径
- ui_struct_probe:pause 结构断言+只读性契约(游戏语义信号清单巡检——pressed/toggled/text/
  value/item/gui_input/focus/closed 十二名,白名单外零连接,合法连接恰 2=关闭钮+closed 外发)
  +零动效契约(子树零 AnimationPlayer+源码零 create_tween——R5/P4 甲)【首跑 L1 修正:全集
  巡检把 Godot 容器布局生命线连接(child_order_changed/item_rect_changed 等引擎自动脏标记)
  误判非法——收敛为信号名清单,任务书 v1.1「巡检信号名清单落码列全」本意】
- ui_input_probe case⑯:暂停层输入锁语义(角标真点击 press+release 开层→锁期挖掘零穿透→
  「继续」关层→同格挖掘重新到达;十七断言 PASS)【首跑 L1 修正:域恰 2 枚时 flag_t 带旗+dig_t
  揭开后零无旗格可取——case 挪全 case 之尾+前沿移位扩大可挖域兜底(板面扰动零波及)】
- ui_click_probe:战斗屏角标开合/守卫断言(图例开着=置灰+emit 兜底拒开)+地图屏角标一次性
  case(选路前开/关,地图屏选路态零扰动);ui_contrast_probe 增钥石徽深墨/烛光黄对(12 对全绿)
- smoke_all._pause_overlay_projection:暂停层投影==MetaProgression 访问器逐项(余额徽/锻造三行/
  工坊六行解锁态/天赋树概览——隔离档 smoke_meta 复用,+5 check)
- 任务书回填 T0 基线注记(冒烟 783/0·run_all 17 套·交集核对零命中,HEAD=44328b1 时点)
- T2 闸读数:冒烟 788/0(基线 783/0,+5 本批)· ui_input 十七断言 PASS · ui_struct 全绿 ·
  ui_contrast 12 对 PASS · ui_click 问题=0 · ui_layout_probe 退出码 0;纯呈现零数值=零 MC
This commit is contained in:
DKChan committed 2026-10-06 22:38:36 +08:00
1 parent fc9eb1e1e2
commit d44fdd54c5
10 files changed
+325 -1

No files matched your search

+32
View File
@@ -224,6 +224,7 @@ func _build_ui() -> void:
func() -> Variant: return settlement, func() -> Variant: return runner)
board_zone.action_requested.connect(_on_board_action)
board_zone.pause_badge.pressed.connect(_on_pause_badge_pressed) # 暂停层入口(迭代 17 卡③——战斗屏 HUD 角标)
info_panel.treasure_slot_clicked.connect(_treasure_ui.on_slot_clicked) # 迭代 7 T4——两步交互第一步
board_zone.stop_pressed.connect(_on_stop_pressed)
board_zone.refresh_confirmed.connect(_on_refresh_confirmed)
@@ -256,6 +257,7 @@ func _build_ui() -> void:
legend_overlay.closed.connect(_on_modal_closed.bind(legend_overlay))
node_overlay.continue_pressed.connect(_on_node_continue)
level_screen.route_chosen.connect(_on_route_chosen)
level_screen.pause_badge.pressed.connect(_on_pause_badge_pressed) # 暂停层入口(迭代 17 卡③——地图屏顶栏角标)
level_screen.abandon_requested.connect(_on_abandon_requested) # 放弃入口(2026-09-21 用户拍板——台账 119)
_end_overlay.continue_pressed.connect(_on_battle_end_continue)
settings_overlay = SettingsOverlay.new(settings_store) # 迭代 8 卡④——最小设置面(音量/全屏/减动效)
@@ -367,10 +369,12 @@ func _open_modal(m: Control) -> void:
# 打开时显式隐藏树序在其上方的可见层(遮挡物隐藏),关闭恢复——单一模态栈
_flush_row_queue() # 卡⑦——任何覆盖层开启前排空排播队列(明细带恒完整,回看/停点面不缺行)
_modals.open(m)
_sync_pause_entry() # 迭代 17 卡③——暂停层入口角标可见性/置灰随开态同步
func _close_modal(m: Control) -> void:
_modals.close(m)
_sync_pause_entry() # 迭代 17 卡③——关闭恢复角标可点态(无残留——R3 同源口径)
func _on_modal_closed(m: Control) -> void:
@@ -436,6 +440,7 @@ func _resume_from_menu() -> void:
_start_overlay.visible = false
_wire_adventure()
_level_active = true
_sync_pause_entry() # 迭代 17 卡③——续玩恢复点亮暂停入口角标
level_screen.set_abandon_available(true)
_reset_run_scope()
log_view.clear()
@@ -470,6 +475,7 @@ func _wire_adventure() -> void:
func _start_adventure() -> void:
_wire_adventure()
_level_active = true
_sync_pause_entry() # 迭代 17 卡③——进对局点亮暂停入口角标
level_screen.set_abandon_available(true) # 放弃入口挂选路停点(天然非战斗期——2026-09-21 用户拍板)
_reset_run_scope()
log_view.clear()
@@ -546,6 +552,7 @@ func _on_adventure_finished(summary: Dictionary) -> void:
var result: String = String(summary.get("result", ""))
settlement = null
_exit_level_screen() # 终局兜底:独立屏在开态(放弃入口)也先回战斗屏呈现摘要——屏级互斥单一出口
_sync_pause_entry() # 迭代 17 卡③——离局熄灭暂停入口角标(防菜单误现)
_sync_settlement_visuals() # → 全关
HudPresenter.battle_end_feedback(stage, ap_bar, false) # 灰化/idle 回正/状态全清——HUD 单通道(T3 收口批)
# 存档入账(元进度实现批):settle = Boss 两档入账 + 工坊解锁 + 摘要入档 + 写盘(唯一写档点不变——
@@ -896,6 +903,7 @@ func _enter_level_screen() -> void:
_level_screen_active = true
_battle_root.visible = false
_open_modal(level_screen)
_sync_pause_entry() # 迭代 17 卡③——屏级互斥切换同步(_open_modal 单口不识屏级状态)
func _exit_level_screen() -> void:
@@ -903,6 +911,7 @@ func _exit_level_screen() -> void:
_battle_root.visible = true
if level_screen.visible:
_close_modal(level_screen)
_sync_pause_entry() # 迭代 17 卡③——同上
func _on_abandon_requested() -> void:
@@ -963,6 +972,29 @@ func _on_pause_closed() -> void:
_close_modal(pause_overlay) # 模态栈单口
# 入口角标点击(两屏同款处理器):P1 守卫兜底——其他模态开着即拒开(常态防线=角标置灰,
# 探针 pressed.emit 绕过 disabled 时由此兜住;地图屏自身的登记开态不计——has_open_excluding)
func _on_pause_badge_pressed() -> void:
var map_on: bool = level_screen != null and level_screen.visible
if _modals == null or (map_on and _modals.has_open_excluding(level_screen)) \
or (not map_on and _modals.has_open()):
return
_open_pause_layer()
# 入口角标可见性/置灰同步(P1 丁+守卫——单一同步点):战斗屏角标=对局内且地图屏未激活;
# 地图屏角标=随屏;置灰=登记册上除地图屏自身外任一层开着(防「看得见点不着」态)。
# 调用面=模态开合单口与屏级互斥口(凡影响开态/屏态的路径必经其一)。
func _sync_pause_entry() -> void:
if pause_overlay == null or _modals == null or board_zone == null or level_screen == null:
return
var map_on: bool = level_screen.visible
board_zone.pause_badge.visible = _level_active and not map_on
level_screen.pause_badge.visible = map_on
board_zone.pause_badge.disabled = _modals.has_open()
level_screen.pause_badge.disabled = _modals.has_open_excluding(level_screen)
# ---- 探针缝保缝(T4/D4 拆件——click/ui_probe 营地段直呼组合根面;实现归 camp_shop_presenter.gd)----
func _on_camp_closed() -> void:
+12
View File
@@ -41,3 +41,15 @@ func has_open() -> bool:
if is_instance_valid(m) and m.visible:
return true
return false
# 排除式开态查询(迭代 17 卡③ 2026-10-06——暂停层入口守卫判据):skip 层自身的开态不计入
#(关卡地图屏系登记册模态成员=常态屏态,其上的地图屏角标必须可点;其余任一层开着=角标置灰)。
# 只读查询零副作用——登记序/开合记账语义零改动。
func has_open_excluding(skip: Control) -> bool:
for m in _list:
if m == skip:
continue
if is_instance_valid(m) and m.visible:
return true
return false
@@ -11,6 +11,7 @@ var ap_bar: ApBarView
var board_view: BoardView
var toast: ToastStack
var fx: BoardFxView
var pause_badge: Button # 暂停层入口角标(迭代 17 卡③ P1 丁——debug 角标同形制;连接归组合根)
var _board_area: Control # resized 命名转发用(原 lambda 局部捕获——P1-3 转命名 2026-09-29)
signal action_requested(cell: Vector2i, kind: String)
@@ -41,6 +42,15 @@ func _init() -> void:
board_area.add_child(fx)
toast = ToastStack.new()
board_area.add_child(toast)
# 暂停层入口角标(迭代 17 卡③ P1 丁——战斗屏 HUD 右下角常驻;debug 角标同形制:紧凑钮豁免
# 宽度基准+字号降档+角距 16px。可见性/置灰归组合根 _sync_pause_entry(其他模态开着=置灰
# 不可点——has_open 守卫);信号连接归组合根(ADR-0001——装配器/视图零连接)
pause_badge = UiKit.button("暂停", 0.0) # 角落小件豁免宽度基准(同调试角标)
pause_badge.add_theme_font_size_override("font_size", UiKit.FS_HINT)
pause_badge.tooltip_text = "查看钥石与永久强化进度(只读)"
pause_badge.visible = false # 显式初始化——非对局期不误现(可见性归组合根同步)
pause_badge.set_anchors_and_offsets_preset(Control.PRESET_BOTTOM_RIGHT, Control.PRESET_MODE_MINSIZE, 16)
board_area.add_child(pause_badge)
# M8(UI 落码批):棋盘底常驻操作提示条(demo ⑦——文案经 board_view 输入代码证实;
# 旧 chord 一次性 toast 提示退役归此常驻条;审计第 7 条用户批)
var hint := PanelContainer.new()
@@ -61,6 +61,7 @@ var _cand_ids: Array[int] = [] # 本停点候选 id 集(图上命
var _content_size := Vector2(620, 240) # 图内容包络(open_choices 按图拟合——画布 min 尺寸随它)
var _hover_id := -1 # 悬停预承诺候选(-1 = 无)
var abandon_btn: Button # 放弃入口(可见性归组合根 set_abandon_available——只在冒险模式开)
var pause_badge: Button # 暂停层入口角标(迭代 17 卡③ P1 丁——顶栏 GP 徽右侧;连接归组合根)
var _abandon_timer := ArmedTimer.new() # 放弃确认窗(T3/D3 P4 乙——_process 帧驱动倒计时机制收口;窗口=CONFIRM_WINDOW_S)
var _node_icons := {} # 节点图标贴图(load_tex 守卫——缺位 null → 字形回退,冒烟/无素材检出安全)
var _noise_rect: TextureRect # 屏底石纹(换层色板渐变承载面——null = 纯色回退无挂点)
@@ -112,6 +113,14 @@ func _init() -> void:
gp_box.add_child(gp_row)
_gp_value = UiKit.label("",UiKit.FS_BODY, true, UiKit.INK_ON_GOLD)
gp_row.add_child(_gp_value)
# 暂停层入口角标(迭代 17 卡③ P1 丁——顶栏常驻;debug 角标同形制:紧凑钮豁免宽度基准+字号降档。
# 置灰守卫归组合根 _sync_pause_entry(其他模态开着=不可点;本屏自身的登记开态不计——has_open_excluding);
# 信号连接归组合根(ADR-0001——视图零连接))
pause_badge = UiKit.button("暂停", 0.0)
pause_badge.add_theme_font_size_override("font_size", UiKit.FS_HINT)
pause_badge.tooltip_text = "查看钥石与永久强化进度(只读)"
pause_badge.size_flags_vertical = Control.SIZE_SHRINK_CENTER
top.add_child(pause_badge)
_title = UiKit.label(TITLE_FORK,UiKit.FS_SUB, true, UiKit.WARM)
_title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
box.add_child(_title)