From 6b1e447d27f3a5587dfbdb86ba40fb772b6c065a Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 16 Oct 2026 23:53:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=B0=83=E8=AF=95=E5=85=A5=E5=8F=A3):=20?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E6=B5=AE=E5=B1=82=E8=A7=92=E6=A0=87=E2=80=94?= =?UTF-8?q?=E2=80=94UI=20=E6=9C=80=E9=A1=B6=E5=B1=82=E3=80=81=E4=BB=BB?= =?UTF-8?q?=E4=BD=95=20UI=20=E4=B8=8D=E9=81=AE=E6=8C=A1=EF=BC=882026-10-16?= =?UTF-8?q?=20=E7=94=A8=E6=88=B7=E4=BB=A4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户定稿:调试入口不做置顶钮式按需出现,要的是「UI 最顶层浮层、不被任何 UI 遮挡」。 实现=三枚屏内角标(菜单右下/战斗 HUD 右下/地图顶栏)合并为一枚全局浮层角标: - LAYER_CONTRACT 末位新增 {"key": "debug_badge", "kind": "float"}——只落树序(最顶绘制序)、 不注册 ModalStack:open() 遮挡记账只隐藏登记层,故任何模态/覆盖层开都不遮它(用户需求 的机制根因);_layer_node 补映射;main 直接子层、构建走 ui_assembler.build_debug_badge - 位置:右下角 16px 惯例位;地图屏底栏 85px 常驻→_sync_status_entry 按 map_on 抬 offset 至底栏上方 16px;战斗屏状态角标经 MarginContainer 让位(right 16/bottom 52)不再被压 - 屏内角标全退役:menu_screen/board_zone_view/level_map_screen 三处 debug_badge 删除, main 两处接线与 _sync_status_entry 四条可见性/置灰行清除(浮层常显不置灰——点它就是开浮窗) - 浮窗 desc 文案改「UI 最顶层「调试」浮层角标随时可开——任何界面不遮挡」 - 断言/探针换代:smoke V2f 查 main.debug_badge boot 可见;click_probe 遮挡判据移至设置面 开中段(浮层角标此时仍应可见=直接验「不遮挡」);tune_probe ①点击路径与⑨对局中角标 全改 main.debug_badge(T2 防线断言不动——浮窗 non_locking×遮挡复活×has_open 组合回归) 冒烟 1127/0 过;全量闸待跑。 --- game/presentation/main.gd | 29 +++++++++++------- game/presentation/scenes/menu_screen.gd | 2 -- game/presentation/ui_assembler.gd | 32 +++++++++++++------- game/presentation/views/board_zone_view.gd | 33 ++++++++++----------- game/presentation/views/debug_overlay.gd | 2 +- game/presentation/views/level_map_screen.gd | 11 +------ game/smoke/smoke_all.gd | 4 +-- game/smoke/ui_click_probe.gd | 12 ++++---- game/smoke/ui_tune_probe.gd | 17 +++++------ 9 files changed, 72 insertions(+), 70 deletions(-) diff --git a/game/presentation/main.gd b/game/presentation/main.gd index 389c0caf..15ffe719 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -48,6 +48,8 @@ const LAYER_CONTRACT: Array[Dictionary] = [ {"key": "inter_overlay", "kind": "state", "tags": []}, {"key": "confirm_dialog", "kind": "modal", "tags": []}, {"key": "debug_overlay", "kind": "modal", "tags": [ModalStack.TAG_NON_LOCKING]}, + {"key": "debug_badge", "kind": "float"}, # 2026-10-16 用户令:调试入口全局浮层——末位=最顶绘制序; + # float 类不注册 ModalStack(open() 遮挡记账只隐藏登记层)→ 任何 UI 打开都不遮它 ] var db @@ -113,6 +115,7 @@ var settings_overlay: SettingsOverlay # 设置覆盖层(迭代 8 卡④— var status_panel: StatusPanel # 局内状态面板·只读(迭代 17 卡③——钥石余额+营地三柜台进度查看;登记设置层同档) var career_overlay: CareerOverlay # 生涯页·只读全屏页(迭代 18 卡④——跨局汇总六类九项;登记营地同档〔设置层旁、确认弹窗之前〕) var debug_overlay: DebugOverlay # 调试浮窗(迭代 14.5 调试整合批——种子/数值调整/批量模拟/两层调试入口收一) +var debug_badge: Button # 调试浮层入口角标(2026-10-16 用户令:UI 最顶层浮层——LAYER_CONTRACT 末位 float 类,任何 UI 不遮挡) var _modal_flow = null # 模态编排纯逻辑类(modal_flow.gd——迭代 27 T4 P1-5/P2-7 抽取;依赖仅 ModalStack+查询 Callable) var _modals = null # 模态层级状态机(=_modal_flow.stack——探针 _list 登记序断言缝保留) @@ -191,9 +194,9 @@ func _ready() -> void: _refresh_resume_button() # 迭代 8 卡②——启动读盘后按断点在档态点亮「继续上局」 _start_overlay.visible = true _debug_entry = true # 2026-10-16 用户令:DS_DEBUG 环境变量门控写死(原 OS.get_environment 读取已退役;发布前清) - _menu_screen.dbgbtn.visible = _debug_entry # 角标可见性须门控落定后赋值(连接在 _build_ui 接线区) + debug_badge.visible = _debug_entry # 浮层角标可见性须门控落定后赋值(构建/连接在 _build_ui) # 2026-10-16 用户令修正:boot 菜单优先——不自动开浮窗(原「启动即开」把开始屏盖成调试面板, - # 用户实测否决);调试入口=开始屏右下角「调试」角标+对局中两屏角标(见菜单屏接线段) + # 用户实测否决);调试入口=UI 最顶层全局浮层角标(LAYER_CONTRACT 末位 float 类,任何 UI 不遮挡) # ==================== 视图接线(三屏壳 + 模态层装配;构建归屏壳/UiAssembler,本类只接线) ==================== @@ -237,7 +240,6 @@ func _build_ui() -> void: board_zone.action_requested.connect(_on_board_action) board_zone.status_badge.pressed.connect(_on_status_badge_pressed) # 状态面板入口(迭代 17 卡③——战斗屏 HUD 角标) - board_zone.debug_badge.pressed.connect(_on_debug_badge_pressed) # 调试浮窗入口(迭代 18 卡⑦ P2 甲——战斗屏 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) @@ -270,7 +272,6 @@ func _build_ui() -> void: node_overlay.continue_pressed.connect(_on_node_continue) level_screen.route_chosen.connect(_on_route_chosen) level_screen.status_badge.pressed.connect(_on_status_badge_pressed) # 状态面板入口(迭代 17 卡③——地图屏顶栏角标) - level_screen.debug_badge.pressed.connect(_on_debug_badge_pressed) # 调试浮窗入口(迭代 18 卡⑦ P2 甲——地图屏顶栏角标) 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 卡④——最小设置面(音量/全屏/减动效) @@ -306,9 +307,11 @@ func _build_ui() -> void: _menu_screen.lvbtn.pressed.connect(_start_adventure_from_menu) _menu_screen.resumebtn.pressed.connect(_resume_from_menu) # 迭代 8 卡②——续玩入口 _resume_btn = _menu_screen.resumebtn - # 调试角标入口(2026-10-16 用户令恢复开始屏右下角角标——iter18 卡⑦ P2 甲迁宿主两屏的理由 - # =「启动即开」,已随菜单优先修正不成立;对局中两枚角标接线见两屏装配段) - _menu_screen.dbgbtn.pressed.connect(_on_debug_badge_pressed) + # 调试入口=UI 最顶层全局浮层角标(2026-10-16 用户令:任何 UI 不遮挡——菜单/战斗/地图三枚 + # 屏内角标形态退役,全局浮层全场景承载;连接归组合根,树序/登记面见 LAYER_CONTRACT 末位) + debug_badge = UiAssembler.build_debug_badge(self) + add_child(debug_badge) + debug_badge.pressed.connect(_on_debug_badge_pressed) # 营地/商店投影(T4/D4 拆件批——迁 camp_shop_presenter.gd;本类只接线、探针缝保缝转发; # 购买写调用唯一经 MetaProgression/LevelRunner core 单口——组合根 lambda 现值注入) _camp_pres = CampShopPresenter.new(CampFlowContext.new(db, func() -> Variant: return meta, func() -> Variant: return save_manager, camp_overlay, shop_overlay, @@ -417,6 +420,7 @@ func _layer_node(key: String) -> Node: "inter_overlay": return _inter_overlay "confirm_dialog": return confirm_dialog "debug_overlay": return debug_overlay + "debug_badge": return debug_badge return null @@ -1147,10 +1151,13 @@ func _sync_status_entry() -> void: level_screen.status_badge.disabled = _modal_flow.badge_greyed_map() # 调试浮窗角标(迭代 18 卡⑦ P2 甲——迁宿主两屏,调试会话门控恒开;17卡③状态角标同形制同守卫): # 战斗屏=对局内(冒险或调试两层)且地图屏未激活;地图屏=随屏;开始菜单零角标(恒开=启动即开) - board_zone.debug_badge.visible = _debug_entry and not map_on and battle_live - level_screen.debug_badge.visible = _debug_entry and map_on - board_zone.debug_badge.disabled = board_zone.status_badge.disabled - level_screen.debug_badge.disabled = level_screen.status_badge.disabled + board_zone.status_badge.visible = run_scope.level_active and not map_on + level_screen.status_badge.visible = map_on + board_zone.status_badge.disabled = _modal_flow.badge_greyed_battle() # 迭代 27 T4——互斥域谓词 + level_screen.status_badge.disabled = _modal_flow.badge_greyed_map() + # 调试浮层角标(2026-10-16 用户令:全局浮层任何 UI 不遮挡——可见性不随场景变,只抬 offset + # 避让:地图屏底栏 85px 常驻,角标抬至底栏上方 16px;其余场景右下角 16px 贴底) + debug_badge.offset_bottom = -101.0 if map_on else -16.0 # ---- 探针缝保缝(T4/D4 拆件——click/ui_probe 营地段直呼组合根面;实现归 camp_shop_presenter.gd)---- diff --git a/game/presentation/scenes/menu_screen.gd b/game/presentation/scenes/menu_screen.gd index feb22615..47d285b8 100644 --- a/game/presentation/scenes/menu_screen.gd +++ b/game/presentation/scenes/menu_screen.gd @@ -14,7 +14,6 @@ var campbtn: Button var careerbtn: Button var settingsbtn: Button var quitbtn: Button -var dbgbtn: Button # 调试浮窗入口角标(2026-10-16 用户令恢复——boot 菜单优先,浮窗按需开) const UiAssembler := preload("res://presentation/ui_assembler.gd") # 构建归装配器(规范 1.1——非全局类,preload 引用) @@ -30,4 +29,3 @@ func _ready() -> void: careerbtn = start.careerbtn settingsbtn = start.settingsbtn quitbtn = start.quitbtn - dbgbtn = start.dbgbtn diff --git a/game/presentation/ui_assembler.gd b/game/presentation/ui_assembler.gd index 3d361655..411f9ee2 100644 --- a/game/presentation/ui_assembler.gd +++ b/game/presentation/ui_assembler.gd @@ -86,9 +86,9 @@ static func build_overlays(host: Control, db) -> Dictionary: } -# 开始覆盖层(返回 {overlay, box, lvbtn, resumebtn, campbtn, careerbtn, settingsbtn, quitbtn, dbgbtn}——按钮接线归组合根; +# 开始覆盖层(返回 {overlay, box, lvbtn, resumebtn, campbtn, careerbtn, settingsbtn, quitbtn}——按钮接线归组合根; # 迭代 14.5 调试整合批:随机种子/数值调整板/两层调试三散件撤出主按钮组,收进调试浮窗—— -# 2026-10-16 用户令:右下角「调试」角标恢复(boot 菜单优先,浮窗按需开——见装配段注) +# 2026-10-16 用户令:调试入口=UI 最顶层全局浮层角标(build_debug_badge,本层零调试入口) # UI 落码批 M2(2026-10-04):单列 VBox→双列(左操作 56% + 右舞台);按钮动词化+悬停解释 #(解释全迁 tooltip,G5);lvbtn 升主操作钮(烛光黄 CANDLE);右列=立绘看台。**玩法速览牌已退役 #(2026-10-06 用户令:界面禁玩法文字墙——教学内容归 Beta 帮助手册〔教学引导定稿批 P4 丙〕,历史文案在 git)**; @@ -152,14 +152,9 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary: var quitbtn := UiKit.button("退出游戏") box.add_child(quitbtn) - # 迭代 14.5 调试整合批——调试入口收右下角标(与主按钮组非平级;调试会话恒开点亮,可见性归组合根)。 - # 2026-10-16 用户令修正:boot 菜单优先不开浮窗(原「启动即开」浮窗盖住开始屏,用户实测否决), - # 角标恢复为菜单层唯一调试入口(iter18 卡⑦ P2 甲迁宿主两屏的理由=启动即开,已不成立) - var dbgbtn := UiKit.button("调试", 0.0) # 角标豁免宽度基准(0=不设 min/flags——角落小件) - dbgbtn.add_theme_font_size_override("font_size", UiKit.FS_HINT) - dbgbtn.tooltip_text = "打开调试浮窗(当局数据/种子/数值调整)" - dbgbtn.set_anchors_and_offsets_preset(Control.PRESET_BOTTOM_RIGHT, Control.PRESET_MODE_MINSIZE, 16) - overlay.add_child(dbgbtn) + # 迭代 14.5 调试整合批——调试入口收浮层角标;2026-10-16 用户令修正:boot 菜单优先不开 + # 浮窗,调试入口=UI 最顶层全局浮层角标(build_debug_badge——LAYER_CONTRACT 末位、 + # ModalStack 登记外,任何 UI 不遮挡;对局中两屏角标形态随之退役,全局浮层全场景承载) # 右列:立绘看台 + 玩法速览牌(M2——帮助全文保留表值驱动,仅容器化;内容含地形变异段不删) var right := VBoxContainer.new() @@ -197,7 +192,22 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary: return {"overlay": overlay, "box": box, "lvbtn": lvbtn, "resumebtn": resumebtn, "campbtn": campbtn, "careerbtn": careerbtn, - "settingsbtn": settingsbtn, "quitbtn": quitbtn, "dbgbtn": dbgbtn} + "settingsbtn": settingsbtn, "quitbtn": quitbtn} + + +# 调试浮层入口角标(2026-10-16 用户令:UI 最顶层浮层,任何 UI 不遮挡)——main 直接子层、 +# LAYER_CONTRACT 末位(float 类:只落树序、不注册 ModalStack——open() 遮挡记账只动登记层, +# 故永不被隐藏);右下角 16px(拇指区惯例,与旧三屏角标同域);可见性归组合根(_debug_entry +# 门控落定后赋值);地图屏底栏 85px 常驻,offset 抬升本函数不处理(组合根 _sync_status_entry)。 +static func build_debug_badge(host: Control) -> Button: + var badge := UiKit.button("调试", 0.0) # 角落小件豁免宽度基准(0=不设 min/flags——同状态角标) + badge.add_theme_font_size_override("font_size", UiKit.FS_HINT) + badge.tooltip_text = "打开调试浮窗(当局数据/种子/数值调整)" + badge.grow_horizontal = Control.GROW_DIRECTION_BEGIN # 向左上生长——尺寸变化向屏内 + badge.grow_vertical = Control.GROW_DIRECTION_BEGIN + badge.set_anchors_and_offsets_preset(Control.PRESET_BOTTOM_RIGHT, Control.PRESET_MODE_MINSIZE, 16) + badge.visible = false # 显式初始化——门控落定后由组合根置位 + return badge # 调试两层模式的层间过渡覆盖层(历史入口专用)。返回 {overlay, label, next_btn}——接线归组合根 diff --git a/game/presentation/views/board_zone_view.gd b/game/presentation/views/board_zone_view.gd index 9ce7e344..f07774b9 100644 --- a/game/presentation/views/board_zone_view.gd +++ b/game/presentation/views/board_zone_view.gd @@ -7,8 +7,7 @@ var ap_bar: ApBarView var board_view: BoardView var toast: ToastStack var fx: BoardFxView -var status_badge: Button # 状态面板入口角标(迭代 17 卡③ P1 丁——debug 角标同形制;连接归组合根) -var debug_badge: Button # 调试浮窗入口角标(迭代 18 卡⑦ P2 甲——调试门控归组合根;状态角标同形制) +var status_badge: Button # 状态面板入口角标(迭代 17 卡③ P1 丁;连接归组合根) var _board_area: Control # resized 命名转发用(原 lambda 局部捕获——P1-3 转命名 2026-09-29) signal action_requested(cell: Vector2i, kind: String) @@ -39,29 +38,27 @@ func _init() -> void: board_area.add_child(fx) toast = ToastStack.new() board_area.add_child(toast) - # 角标对(迭代 18 卡⑦ P2 甲——调试+状态两枚右下角常驻,HBox 并排锚角距 16px): - # 17卡③状态角标同形制:紧凑钮豁免宽度基准+字号降档。可见性/置灰归组合根 _sync_status_entry - #(调试门控/其他模态开着=置灰不可点——排除式开态查询);信号连接归组合根。 + # 状态角标(迭代 17 卡③ P1 丁——右下角常驻;2026-10-16 调试角标迁全局浮层后本屏只留状态): + # 17卡③同形制:紧凑钮豁免宽度基准+字号降档。可见性/置灰归组合根 _sync_status_entry + #(其他模态开着=置灰不可点——排除式开态查询);信号连接归组合根。 + # 全局调试浮层角标常驻右下角 16px(main 直接子层、ModalStack 登记外——任何 UI 不遮挡), + # 状态角标经 MarginContainer 让位抬高(right 16/bottom 52=浮层钮高约24+间距8+16 贴底); # preset 在子件全部入列后调用——MINSIZE 锚按当时最小尺寸计偏移(空容器调用=零尺寸锚外溢屏边) + var corner_wrap := MarginContainer.new() + corner_wrap.add_theme_constant_override("margin_right", 16) + corner_wrap.add_theme_constant_override("margin_bottom", 52) + corner_wrap.grow_horizontal = Control.GROW_DIRECTION_BEGIN + corner_wrap.grow_vertical = Control.GROW_DIRECTION_BEGIN + corner_wrap.set_anchors_and_offsets_preset.call_deferred(Control.PRESET_BOTTOM_RIGHT, Control.PRESET_MODE_MINSIZE, 0) + board_area.add_child(corner_wrap) var corner := HBoxContainer.new() corner.add_theme_constant_override("separation", 8) - debug_badge = UiKit.button("调试", 0.0) # 角落小件豁免宽度基准(同状态角标) - debug_badge.add_theme_font_size_override("font_size", UiKit.FS_HINT) - debug_badge.tooltip_text = "打开调试浮窗(当局数据/种子/数值调整)" - debug_badge.visible = false # 显式初始化——非调试会话不误现(可见性归组合根同步) - corner.add_child(debug_badge) - status_badge = UiKit.button("状态", 0.0) # 角落小件豁免宽度基准(同调试角标) + status_badge = UiKit.button("状态", 0.0) # 角落小件豁免宽度基准 status_badge.add_theme_font_size_override("font_size", UiKit.FS_HINT) status_badge.tooltip_text = "查看钥石与永久强化进度(只读)" status_badge.visible = false # 显式初始化——非对局期不误现(可见性归组合根同步) corner.add_child(status_badge) - # 右下角锚定(迭代 18 卡⑦):MINSIZE 预设须在入树后调用——容器出树的最小尺寸缓存陈旧为 0 - #(裸 Button 无此病,容器延迟到首轮排序才重算),零尺寸锚角会使钮对悬出屏边; - # grow 向左上=后续最小尺寸变化向屏内生长。预设延迟帧尾——届时容器最小尺寸已就绪 - corner.grow_horizontal = Control.GROW_DIRECTION_BEGIN - corner.grow_vertical = Control.GROW_DIRECTION_BEGIN - corner.set_anchors_and_offsets_preset.call_deferred(Control.PRESET_BOTTOM_RIGHT, Control.PRESET_MODE_MINSIZE, 16) - board_area.add_child(corner) + corner_wrap.add_child(corner) # M8(UI 落码批):棋盘底常驻操作提示条(demo ⑦——文案经 board_view 输入代码证实; # 旧 chord 一次性 toast 提示退役归此常驻条;审计第 7 条用户批) var hint := PanelContainer.new() diff --git a/game/presentation/views/debug_overlay.gd b/game/presentation/views/debug_overlay.gd index 58e037eb..d0a54334 100644 --- a/game/presentation/views/debug_overlay.gd +++ b/game/presentation/views/debug_overlay.gd @@ -155,7 +155,7 @@ func _build() -> void: var title := UiKit.label("调试",UiKit.FS_TITLE, true, UiKit.WARM) box.add_child(title) var desc := UiKit.label( - "开发调试专用(开始屏右下角/战斗屏 HUD/关卡地图屏「调试」角标均可开)。当局数据=本局只读投影,种子即本局种子唯一查看位。\n百分比叠加基础值:攻击 %d / 生命 %d。影响所有模式(手动与模拟),不落盘。" % [_base_atk, _base_hp], + "开发调试专用(UI 最顶层「调试」浮层角标随时可开——任何界面不遮挡)。当局数据=本局只读投影,种子即本局种子唯一查看位。\n百分比叠加基础值:攻击 %d / 生命 %d。影响所有模式(手动与模拟),不落盘。" % [_base_atk, _base_hp], 13, false, UiKit.WARM_SOFT) box.add_child(desc) box.add_child(HSeparator.new()) diff --git a/game/presentation/views/level_map_screen.gd b/game/presentation/views/level_map_screen.gd index 43fcd160..bdfb7ab2 100644 --- a/game/presentation/views/level_map_screen.gd +++ b/game/presentation/views/level_map_screen.gd @@ -47,7 +47,6 @@ var _content_size := Vector2(620, 240) # 图内容包络(open_choices 按图 var _hover_id := -1 # 悬停预承诺候选(-1 = 无) var abandon_btn: Button # 放弃入口(可见性归组合根 set_abandon_available——只在冒险模式开) var status_badge: Button # 状态面板入口角标(迭代 17 卡③ P1 丁——顶栏 GP 徽右侧;连接归组合根) -var debug_badge: Button # 调试浮窗入口角标(迭代 18 卡⑦ P2 甲——调试门控;状态角标同形制) var _abandon_timer := ArmedTimer.new() # 放弃确认窗(T3/D3 P4 乙——_process 帧驱动倒计时机制收口;窗口=CONFIRM_WINDOW_S) var _node_icons := {} # 节点图标贴图(load_tex 守卫——缺位 null → 字形回退,冒烟/无素材检出安全) var _noise_rect: TextureRect # 屏底石纹(换层色板渐变承载面——null = 纯色回退无挂点) @@ -99,7 +98,7 @@ 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 角标同形制:紧凑钮豁免宽度基准+字号降档。 + # 状态面板入口角标(迭代 17 卡③ P1 丁——顶栏常驻;2026-10-16 调试角标迁全局浮层后本屏只留状态。 # 置灰守卫归组合根 _sync_status_entry(其他模态开着=不可点;本屏自身的登记开态不计——has_open_excluding); # 信号连接归组合根(视图零连接)) status_badge = UiKit.button("状态", 0.0) @@ -107,14 +106,6 @@ func _init() -> void: status_badge.tooltip_text = "查看钥石与永久强化进度(只读)" status_badge.size_flags_vertical = Control.SIZE_SHRINK_CENTER top.add_child(status_badge) - # 调试浮窗入口角标(迭代 18 卡⑦ P2 甲——顶栏状态角标右侧;17卡③同形制:紧凑钮豁免宽度基准+ - # 字号降档。可见性/置灰归组合根 _sync_status_entry(调试门控/其他模态开着=置灰——排除式 - # 开态查询,本屏自身开态不计);信号连接归组合根(视图零连接)) - debug_badge = UiKit.button("调试", 0.0) - debug_badge.add_theme_font_size_override("font_size", UiKit.FS_HINT) - debug_badge.tooltip_text = "打开调试浮窗(当局数据/种子/数值调整)" - debug_badge.size_flags_vertical = Control.SIZE_SHRINK_CENTER - top.add_child(debug_badge) _title = UiKit.label(TITLE_FORK,UiKit.FS_SUB, true, UiKit.WARM) _title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER box.add_child(_title) diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index 6e0e003b..b661d196 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -295,8 +295,8 @@ func _smoke_boot_chain() -> void: # 入口=开始屏右下角「调试」角标+对局中两屏角标) check(not main.debug_overlay.visible, "V2f 调试浮窗 boot 不自动开(菜单优先)〔2026-10-16 用户令〕") - check(main._menu_screen.dbgbtn != null and main._menu_screen.dbgbtn.visible, - "V2f 开始屏调试角标可见(菜单层调试入口在座)〔2026-10-16 用户令〕") + check(main.debug_badge != null and main.debug_badge.visible, + "V2f 调试浮层角标 boot 可见(全局浮层入口在座)〔2026-10-16 用户令〕") main.queue_free() await process_frame for p in ["user://smoke_boot_chain.json", "user://smoke_boot_chain.json.tmp"]: diff --git a/game/smoke/ui_click_probe.gd b/game/smoke/ui_click_probe.gd index 3d45bd80..6bc8983a 100644 --- a/game/smoke/ui_click_probe.gd +++ b/game/smoke/ui_click_probe.gd @@ -46,8 +46,8 @@ func _ready() -> void: add_child(main) await get_tree().process_frame var t_ui_ready := Time.get_ticks_msec() - t0 - # 调试浮窗 boot 不开(2026-10-16 用户令修正:菜单优先——入口=开始屏右下角「调试」角标+ - # 对局中两屏角标;角标存在性判据见设置面段) + # 调试浮窗 boot 不开(2026-10-16 用户令修正:菜单优先——入口=UI 最顶层全局浮层角标, + # 任何 UI 不遮挡;浮层角标遮挡判据见设置面段) if main.debug_overlay.visible: _problems.append("调试浮窗 boot 自动开(菜单优先失守)") # ---- 营地购买合成点击路径(元进度实现批——campbtn/购买/关闭全走真实按钮信号路径; @@ -171,10 +171,10 @@ func _ready() -> void: _problems.append("音量滑杆未实时生效(master bus db %f ≠ %f)" % [AudioServer.get_bus_volume_db(master_idx), expect_db]) if absf(iso_s.volume_linear - 0.3) > 0.001: _problems.append("音量未入 store(%f ≠ 0.3)" % iso_s.volume_linear) - # 调试入口断言(2026-10-16 用户令:开始屏右下角「调试」角标恢复为菜单层调试入口—— - # iter18 卡⑦ P2 甲迁宿主两屏+本层零入口的旧形态已废;角标点击开浮窗路径归 tune_probe ⑨) - if ProbeUiUtil.find_button(main._start_overlay, "调试", "prefix") == null: - _problems.append("开始层调试角标缺失(调试入口失守)") + # 调试入口断言(2026-10-16 用户令:全局浮层角标=UI 最顶层、任何 UI 不遮挡——本段设置面 + # 开中正是遮挡场景:浮层角标此时仍应可见;点击开浮窗路径归 tune_probe) + if main.debug_badge == null or not main.debug_badge.visible: + _problems.append("设置面开中调试浮层角标不可见(最顶层浮层失守——被遮挡)") var settings_close: Button = ProbeUiUtil.find_button(main.settings_overlay, "返回", "prefix") if settings_close == null: _problems.append("设置面返回按钮缺失") diff --git a/game/smoke/ui_tune_probe.gd b/game/smoke/ui_tune_probe.gd index 441bc204..a51837af 100644 --- a/game/smoke/ui_tune_probe.gd +++ b/game/smoke/ui_tune_probe.gd @@ -2,7 +2,7 @@ # Date: 2026-09-11(加成应用契约 = 组合根单一应用路径) # 调试浮窗场景探针(原数值调整板收进 debug_overlay; # 角标挂宿主 / 启动即开 / 当局数据只读区块 / 输入锁防护配套): -# 驱动真实 UI 路径——①角标开窗(开始屏右下角「调试」钮点击路径)+悬浮菜单之上+登记册末位树序 +# 驱动真实 UI 路径——①全局浮层角标开窗(UI 最顶层「调试」钮点击路径)+悬浮菜单之上+登记册末位树序 # ②滑条联动 ③应用 ④重置 ⑤批量模拟 N=10 ⑥关闭 ⑦hero 表运行期不可变 # ⑧单次加成生效(经 _start_adventure_from_menu 真实路径+显式种子钉死)+开冒险路径显式关浮窗 # ⑨对局中可开(战斗屏角标真实信号路径)+棋盘输入不锁+状态角标不置灰(停机点回归闸) @@ -40,14 +40,13 @@ func _ready() -> void: var base_hp := int(main.db.hero.max_hp) var boosted_atk := base_atk * 2 # 攻击滑条 100 → ×2 var boosted_hp := int(round(base_hp * 1.5)) # 生命滑条 50 → +50% - # ① 角标开窗(2026-10-16 用户令修正:boot 菜单优先不开浮窗——开始屏右下角「调试」角标 - # 真实点击路径开窗;悬浮于菜单之上——开始层不隐藏;树序新基准=登记册末位(确认弹窗之后= - # 绘制序最上);旧「_show_debug_overlay 打开+开始层在屏」断言随入口迁宿主换代——打开动作 - # 本身移至 ⑨ 角标真实路径承载) - main._menu_screen.dbgbtn.pressed.emit() + # ① 全局浮层角标开窗(2026-10-16 用户令:调试入口=UI 最顶层浮层,任何 UI 不遮挡—— + # main 直接子层、LAYER_CONTRACT 末位 float 类;boot 菜单优先不开浮窗,角标真实点击路径开窗; + # 悬浮于菜单之上——开始层不隐藏;树序新基准=登记册末位(确认弹窗之后=绘制序最上)) + main.debug_badge.pressed.emit() await get_tree().process_frame if not main.debug_overlay.visible: - problems.append("开始屏调试角标点击后浮窗未开(菜单层调试入口失守)") + problems.append("调试浮层角标点击后浮窗未开(全局浮层入口失守)") if not main._start_overlay.visible: problems.append("开始覆盖层被隐藏——浮窗应悬浮于菜单之上(14.5 形态失守)") if main.debug_overlay.get_index() < main.confirm_dialog.get_index(): @@ -114,9 +113,9 @@ func _ready() -> void: # ⑨ 对局中可开(18卡⑦ P2 甲/T2 防护——S1+ 停机点回归闸):战斗屏角标真实信号路径开窗; # 棋盘输入不锁、状态角标不置灰(旧 has_open 判据在「默认开×遮挡复活」下必锁死的破约回归面); # 对局中批量模拟/两层调试两钮禁用;当局数据六项与只读访问器逐项一致;关闭钮真实路径收窗恢复 - var dbg_badge: Button = main.board_zone.debug_badge + var dbg_badge: Button = main.debug_badge if dbg_badge == null or not dbg_badge.visible: - problems.append("战斗屏调试角标未点亮(P2 甲恒开门控失守)") + problems.append("对局中调试浮层角标未点亮(全局浮层最顶层失守)") else: if dbg_badge.disabled: problems.append("战斗屏调试角标被置灰(T2 排除式判据失守)")