diff --git a/game/presentation/main.gd b/game/presentation/main.gd index 7b5fdda2..3e3e74d5 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -217,8 +217,9 @@ func _ready() -> void: _refresh_resume_button() # 迭代 8 卡②——启动读盘后按断点在档态点亮「继续上局」 _start_overlay.visible = true _debug_entry = true # 2026-10-16 用户令:DS_DEBUG 环境变量门控写死(原 OS.get_environment 读取已退役;发布前清) - if _debug_entry: - _show_debug_overlay() # 启动即开(手动可关、两屏角标可再开——P3 甲) + _menu_screen.dbgbtn.visible = _debug_entry # 角标可见性须门控落定后赋值(连接在 _build_ui 接线区) + # 2026-10-16 用户令修正:boot 菜单优先——不自动开浮窗(原「启动即开」把开始屏盖成调试面板, + # 用户实测否决);调试入口=开始屏右下角「调试」角标+对局中两屏角标(见菜单屏接线段) # ==================== 视图接线(三屏壳 + 模态层装配;构建归屏壳/UiAssembler,本类只接线) ==================== @@ -331,8 +332,9 @@ 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 - # 调试角标入口退役(迭代 18 卡⑦ P2 甲——迁宿主:战斗屏 HUD+关卡地图屏各一枚, - # 接线见两屏装配段;开始层不再有调试入口,调试会话恒开=启动即开浮窗) + # 调试角标入口(2026-10-16 用户令恢复开始屏右下角角标——iter18 卡⑦ P2 甲迁宿主两屏的理由 + # =「启动即开」,已随菜单优先修正不成立;对局中两枚角标接线见两屏装配段) + _menu_screen.dbgbtn.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, diff --git a/game/presentation/scenes/menu_screen.gd b/game/presentation/scenes/menu_screen.gd index 47d285b8..feb22615 100644 --- a/game/presentation/scenes/menu_screen.gd +++ b/game/presentation/scenes/menu_screen.gd @@ -14,6 +14,7 @@ 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 引用) @@ -29,3 +30,4 @@ 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 eabeae87..5a4b5bdf 100644 --- a/game/presentation/ui_assembler.gd +++ b/game/presentation/ui_assembler.gd @@ -88,10 +88,9 @@ static func build_overlays(host: Control, db) -> Dictionary: } -# 开始覆盖层(返回 {overlay, box, lvbtn, resumebtn, campbtn, careerbtn, settingsbtn, quitbtn}——按钮接线归组合根; +# 开始覆盖层(返回 {overlay, box, lvbtn, resumebtn, campbtn, careerbtn, settingsbtn, quitbtn, dbgbtn}——按钮接线归组合根; # 迭代 14.5 调试整合批:随机种子/数值调整板/两层调试三散件撤出主按钮组,收进调试浮窗—— -# 迭代 18 卡⑦ P2 甲:右下角「调试」角标亦退役(入口迁宿主=战斗屏 HUD+关卡地图屏两枚角标, -# 调试会话恒开,浮窗启动即开——本层零调试入口) +# 2026-10-16 用户令:右下角「调试」角标恢复(boot 菜单优先,浮窗按需开——见装配段注) # UI 落码批 M2(2026-10-04):单列 VBox→双列(左操作 56% + 右舞台);按钮动词化+悬停解释 #(解释全迁 tooltip,G5);lvbtn 升主操作钮(烛光黄 CANDLE);右列=立绘看台。**玩法速览牌已退役 #(2026-10-06 用户令:界面禁玩法文字墙——教学内容归 Beta 帮助手册〔教学引导定稿批 P4 丙〕,历史文案在 git)**; @@ -157,9 +156,14 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary: var quitbtn := UiKit.button("退出游戏") box.add_child(quitbtn) - # 迭代 18 卡⑦ P2 甲——旧右下角调试角标退役(原迭代 14.5 装配段删除):入口迁宿主两屏 - #(board_zone_view.debug_badge / level_map_screen.debug_badge),调试门控与可见性 - # 同步归组合根 _sync_status_entry;开始层零调试入口(调试会话恒开=浮窗启动即开) + # 迭代 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) # 右列:立绘看台 + 玩法速览牌(M2——帮助全文保留表值驱动,仅容器化;内容含地形变异段不删) var right := VBoxContainer.new() @@ -197,7 +201,7 @@ 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} + "settingsbtn": settingsbtn, "quitbtn": quitbtn, "dbgbtn": dbgbtn} # 调试两层模式的层间过渡覆盖层(历史入口专用)。返回 {overlay, label, next_btn}——接线归组合根 diff --git a/game/presentation/views/debug_overlay.gd b/game/presentation/views/debug_overlay.gd index 014d1433..ab7a54e9 100644 --- a/game/presentation/views/debug_overlay.gd +++ b/game/presentation/views/debug_overlay.gd @@ -163,7 +163,7 @@ func _build() -> void: var title := UiKit.label("调试",UiKit.FS_TITLE, true, UiKit.WARM) box.add_child(title) var desc := UiKit.label( - "开发调试专用(恒开:启动即开;战斗屏/地图屏「调试」角标可再开)。当局数据=本局只读投影,种子即本局种子唯一查看位。\n百分比叠加基础值:攻击 %d / 生命 %d。影响所有模式(手动与模拟),不落盘。" % [_base_atk, _base_hp], + "开发调试专用(开始屏右下角/战斗屏 HUD/关卡地图屏「调试」角标均可开)。当局数据=本局只读投影,种子即本局种子唯一查看位。\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/smoke/shot_probe.gd b/game/smoke/shot_probe.gd index eabea54f..eed87371 100644 --- a/game/smoke/shot_probe.gd +++ b/game/smoke/shot_probe.gd @@ -44,11 +44,6 @@ func _ready() -> void: # apply 隔离档出厂默认=窗口化 1280x800,恢复本探针设计前提。探针侧环境修正,零运行时改动) main.settings_store.apply() await get_tree().process_frame - # 调试浮窗归一(2026-10-16 用户令 DS_DEBUG 写死=true 后 boot 即开——视觉契约截图不含开发件, - # 走真实关闭单口 _close_modal;golden/shot 基线与调试模式解耦,发布前删写死时基线不受影响) - 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 对应断言段同撤) # 自检一(迭代 28 T4):boot 态顶层可见全屏层=start_overlay(内容层树遍历——屏壳是容器不当候选: diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index 14be52f4..6e0e003b 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -185,8 +185,8 @@ func _smoke_scene_split() -> void: # V1a 启动态顶层断言:boot 后自树顶向下第一个可见内容层=start_overlay(headless 可判) #(内容层遍历——屏壳是容器不当候选:camp 壳 boot 态 vis=true 但成员恒隐,裸树遍历会误命中) var top: Node = _topmost_visible_layer(main) - check(top == main._start_overlay or top == main.debug_overlay, - "V1a 启动态顶层可见层=start_overlay(调试浮窗悬浮于菜单之上=合法顶层——2026-10-16 写死后 boot 即开;实测顶层=%s——菜单被冒险屏盖住即红)〔装配生命批 V1〕" + check(top == main._start_overlay, + "V1a 启动态顶层可见层=start_overlay(实测顶层=%s——菜单被冒险屏盖住即红)〔装配生命批 V1〕" % (top.name if top != null else "null")) # V1b 语义关系:start_overlay 在冒险屏内容之上(菜单屏壳在冒险屏壳之上——装配序修复判据) check(main._menu_screen.get_index() > main._adventure_screen.get_index(), @@ -291,9 +291,12 @@ func _smoke_boot_chain() -> void: # ⑤ 闲时会话(_ready 即建、永非 null、在树) check(main.run_scope != null and not main.run_scope.is_adventure and main.run_scope.is_inside_tree(), "V2e run_scope 非空且为闲时会话(is_adventure=false+is_inside_tree)〔装配生命批 V2〕") - # ⑥ 调试浮窗恒开(2026-10-16 用户令 DS_DEBUG 写死=true——原环境变量门控退役,启动即开为常态) - check(main.debug_overlay.visible, - "V2f 调试浮窗恒开(visible=%s)〔2026-10-16 写死令〕" % str(main.debug_overlay.visible)) + # ⑥ 调试浮窗 boot 不开+菜单角标在(2026-10-16 用户令修正:菜单优先——boot 不自动开浮窗, + # 入口=开始屏右下角「调试」角标+对局中两屏角标) + 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 用户令〕") 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 239f13cb..3d45bd80 100644 --- a/game/smoke/ui_click_probe.gd +++ b/game/smoke/ui_click_probe.gd @@ -46,10 +46,10 @@ func _ready() -> void: add_child(main) await get_tree().process_frame var t_ui_ready := Time.get_ticks_msec() - t0 - # 调试浮窗恒开(2026-10-16 用户令 DS_DEBUG 写死=true——boot 即开;他模态开时暂隐归 ModalStack - # 遮挡语义,恢复判据见设置面关闭段) - if not main.debug_overlay.visible: - _problems.append("调试浮窗启动未即开(恒开门控失守)") + # 调试浮窗 boot 不开(2026-10-16 用户令修正:菜单优先——入口=开始屏右下角「调试」角标+ + # 对局中两屏角标;角标存在性判据见设置面段) + if main.debug_overlay.visible: + _problems.append("调试浮窗 boot 自动开(菜单优先失守)") # ---- 营地购买合成点击路径(元进度实现批——campbtn/购买/关闭全走真实按钮信号路径; # 隔离存档换注 main.meta 保确定性(禁碰真实档 user://save.json);陈旧档段首清理)---- for p0 in ["user://smoke_click_probe_reset.json", "user://smoke_click_probe_reset.json.tmp"]: @@ -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) - # 调试入口断言改向(迭代 18 卡⑦ P2 甲——开始层角标退役迁宿主两屏;DS_DEBUG 写死后浮窗 - # 恒开,本段(设置面开中)浮窗暂隐归 ModalStack 遮挡语义,恢复判据见下方关闭段) - if ProbeUiUtil.find_button(main._start_overlay, "调试", "prefix") != null: - _problems.append("开始层调试角标未退役(迭代 18 卡⑦ P2 甲迁宿主失守)") + # 调试入口断言(2026-10-16 用户令:开始屏右下角「调试」角标恢复为菜单层调试入口—— + # iter18 卡⑦ P2 甲迁宿主两屏+本层零入口的旧形态已废;角标点击开浮窗路径归 tune_probe ⑨) + if ProbeUiUtil.find_button(main._start_overlay, "调试", "prefix") == null: + _problems.append("开始层调试角标缺失(调试入口失守)") var settings_close: Button = ProbeUiUtil.find_button(main.settings_overlay, "返回", "prefix") if settings_close == null: _problems.append("设置面返回按钮缺失") @@ -183,8 +183,6 @@ func _ready() -> void: await get_tree().process_frame if main.settings_overlay.visible or not main._start_overlay.visible: _problems.append("设置面关闭后未恢复开始层") - if not main.debug_overlay.visible: - _problems.append("设置面关闭后调试浮窗未恢复(ModalStack 遮挡恢复失守)") # 旧入口退役断言(卡④ AC③——测试调整板不再含减动效开关;14.5 起载体=调试浮窗) var legacy_motion = ProbeUiUtil.find_check_button(main.debug_overlay, "减动效") if legacy_motion != null: diff --git a/game/smoke/ui_tune_probe.gd b/game/smoke/ui_tune_probe.gd index a68cedb2..441bc204 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 路径——①角标开窗(开始屏右下角「调试」钮点击路径)+悬浮菜单之上+登记册末位树序 # ②滑条联动 ③应用 ④重置 ⑤批量模拟 N=10 ⑥关闭 ⑦hero 表运行期不可变 # ⑧单次加成生效(经 _start_adventure_from_menu 真实路径+显式种子钉死)+开冒险路径显式关浮窗 # ⑨对局中可开(战斗屏角标真实信号路径)+棋盘输入不锁+状态角标不置灰(停机点回归闸) @@ -40,11 +40,14 @@ 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 用户令写死=恒开——组合根 _ready 即开;悬浮于菜单之上——开始层不隐藏; - # 树序新基准=登记册末位(确认弹窗之后=绘制序最上);旧「_show_debug_overlay 打开+开始层在屏」 - # 断言随入口迁宿主换代——打开动作本身移至 ⑨ 角标真实路径承载) + # ① 角标开窗(2026-10-16 用户令修正:boot 菜单优先不开浮窗——开始屏右下角「调试」角标 + # 真实点击路径开窗;悬浮于菜单之上——开始层不隐藏;树序新基准=登记册末位(确认弹窗之后= + # 绘制序最上);旧「_show_debug_overlay 打开+开始层在屏」断言随入口迁宿主换代——打开动作 + # 本身移至 ⑨ 角标真实路径承载) + main._menu_screen.dbgbtn.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():