diff --git a/game/presentation/main.gd b/game/presentation/main.gd index 2267c49d..5a0c2d7e 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -330,19 +330,18 @@ func _build_ui() -> void: _inter_label = inter.label inter.next_btn.pressed.connect(_on_inter_next_pressed) - var diag_btn := UiAssembler.build_diag_button(self) - diag_btn.pressed.connect(_on_diagnose_pressed) - - # 确认弹窗(二轮修改批 A——新冒险互斥确认弹窗化):树序落在开始层/过场层/诊断钮之后 = 子级最末 + # 确认弹窗(二轮修改批 A——新冒险互斥确认弹窗化):树序落在开始层/过场层之后 = 子级最末 #(T3 收口批——「登记序 = 树序 = z 序」纪律复位,confirm_dialog.open 的 move_child 运行时自提 - # 创可贴随之删除;弹窗只在开始菜单域弹出,绘制序恒最上) + # 创可贴随之删除;弹窗只在开始菜单域弹出,绘制序恒最上。原诊断转储角落钮随迭代 26 T5b 退役, + # 转储入口迁调试浮窗——grilling Q8 裁甲) confirm_dialog = ConfirmDialog.new() add_child(confirm_dialog) confirm_dialog.confirmed.connect(_on_confirm_new_adventure) confirm_dialog.cancelled.connect(_on_confirm_cancelled) # 调试浮窗(迭代 14.5 调试整合批——主菜单三散件收一:随机种子/数值调整/批量模拟/两层调试入口; - # 迭代 18 卡⑦——升级为全局可开浮窗:DS_DEBUG=1 启动即开〔_ready〕+两屏角标再开〔P2 甲〕+当局数据只读区块〔T3〕)。 + # 迭代 18 卡⑦——升级为全局可开浮窗:DS_DEBUG=1 启动即开〔_ready〕+两屏角标再开〔P2 甲〕+当局数据只读区块〔T3〕; + # 迭代 26 T5b——诊断转储入口并入(原主画面左下角常驻钮退役,玩家画面清零))。 # 树序在开始层与确认弹窗之后 = 浮于菜单之上的 Dialog(不隐藏开始层——与确认弹窗同款形态); # 开窗唯一入口 = _show_debug_overlay(C6 单口——角标/探针/启动路径全收口) debug_overlay = DebugOverlay.new(db, int(db.hero.atk), int(db.hero.max_hp)) @@ -352,6 +351,7 @@ func _build_ui() -> void: debug_overlay.apply_requested.connect(_on_tune_apply) debug_overlay.simulate_requested.connect(_on_tune_simulate) debug_overlay.debug_levels_requested.connect(_start_debug_levels) + debug_overlay.diagnose_requested.connect(_on_diagnose_pressed) # 迭代 26 T5b——诊断转储入口随迁(原角落钮连接) # 模态登记(缺陷⑤纪律——登记序 = 树序:含 move_child 调位后的关卡画面/三选一终位; # 状态面板设置层同档、确认弹窗之前——P2 甲;生涯页同档随状态面板之后(迭代 18 卡④ P3 甲)) diff --git a/game/presentation/ui_assembler.gd b/game/presentation/ui_assembler.gd index d6e11dcd..0430715e 100644 --- a/game/presentation/ui_assembler.gd +++ b/game/presentation/ui_assembler.gd @@ -216,18 +216,6 @@ static func build_inter_overlay(host: Control) -> Dictionary: return {"overlay": overlay, "label": label, "next_btn": next_btn} -# Playtest 诊断按钮(调试变体——battle.md §States 允许;卡死转储) -static func build_diag_button(host: Control) -> Button: - var diag_btn := UiKit.button("诊断转储", 0.0) # 角落小件豁免宽度基准(固定 offsets 112px 宽) - diag_btn.set_anchors_preset(Control.PRESET_BOTTOM_LEFT) - diag_btn.offset_left = 6.0 - diag_btn.offset_top = -30.0 - diag_btn.offset_right = 118.0 - diag_btn.offset_bottom = -6.0 - host.add_child(diag_btn) - return diag_btn - - static func overlay_bg(host: Control, color: Color) -> ColorRect: var dim := ColorRect.new() dim.color = color diff --git a/game/presentation/views/confirm_dialog.gd b/game/presentation/views/confirm_dialog.gd index b7f6c144..343e1325 100644 --- a/game/presentation/views/confirm_dialog.gd +++ b/game/presentation/views/confirm_dialog.gd @@ -40,7 +40,8 @@ func open(text: String, confirm_label: String, cancel_label: String = "取消") _confirm_btn.text = confirm_label _cancel_btn.text = cancel_label # z 序纪律(T3 收口批 2026-10-02):树序由组合根构建序保证——本弹窗在 main._build_ui 尾部 - # add_child(开始层/过场层/诊断钮之后 = 子级最末,登记序 = 树序 = 绘制序恒最上), + # add_child(开始层/过场层之后 = 子级最末,登记序 = 树序 = 绘制序恒最上;原诊断转储角落钮随 + # 迭代 26 T5b 退役迁调试浮窗,此处不再经其之后), # 「每次打开 move_child 运行时自提」创可贴随之删除。 visible = true diff --git a/game/presentation/views/debug_overlay.gd b/game/presentation/views/debug_overlay.gd index 3800013f..4bedb82d 100644 --- a/game/presentation/views/debug_overlay.gd +++ b/game/presentation/views/debug_overlay.gd @@ -16,6 +16,7 @@ extends Control signal apply_requested(atk_pct: int, hp_pct: int) # 应用并关闭——加成落表归组合根单一应用路径 signal simulate_requested(count: int) # 批量模拟编排归组合根(表基线复位 + 单路径施加) signal debug_levels_requested # 两层调试对局入口(编排归 debug_session.gd) +signal diagnose_requested # 诊断转储入口(迭代 26 T5b——原主画面角落钮迁入;卡死取证编排归组合根) signal closed var seed_edit: LineEdit # 组合根 _seed_value 唯一读取面(原开始覆盖层种子行迁入) @@ -265,6 +266,18 @@ func _build() -> void: _dbg_btn.pressed.connect(_emit_debug_levels) list.add_child(_dbg_btn) + # 区块⑤诊断转储(迭代 26 T5b——原主画面左下角「诊断转储」常驻钮退役迁入:grilling Q8 裁甲, + # 承迭代 18 卡⑦「主菜单三散件收一」纪律;dump_diagnosis 卡死取证功能保留〔删除案否〕, + # 门控隐藏案否——本浮窗本就可全局可开,双轨无意义。纯视图边界:转储编排经信号外发归组合根) + var diag_row := HBoxContainer.new() + diag_row.add_theme_constant_override("separation", 10) + list.add_child(diag_row) + diag_row.add_child(UiKit.label("诊断转储",UiKit.FS_BODY, false)) + var diag_btn := UiKit.button("转储") + diag_btn.tooltip_text = "卡死取证:全量核心状态+环形缓冲 → user://logs/diag_*.json" + diag_btn.pressed.connect(_emit_diagnose_requested) + diag_row.add_child(diag_btn) + var close_btn := UiKit.button("关闭") close_btn.pressed.connect(_emit_closed) box.add_child(close_btn) @@ -298,6 +311,10 @@ func _emit_simulate_requested() -> void: simulate_requested.emit(int(_sim_count.value)) +func _emit_diagnose_requested() -> void: + diagnose_requested.emit() + + func _emit_debug_levels() -> void: debug_levels_requested.emit() diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index 21fa65c5..75d38edd 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -111,6 +111,7 @@ func _run_core_smoke(db, rng) -> void: _smoke_texture_filter() _smoke_contrast_inks() _smoke_element_details() + _smoke_diag_button_retired() _smoke_encounter_roll() _smoke_attack_chain_fresh_pool() _smoke_clear_reward_chain() @@ -5630,6 +5631,22 @@ func _smoke_element_details() -> void: check(camp_src.count("SIZE_SHRINK_CENTER") >= 3, "T5③ 三处锁文垂直居中在位") +# ---- 诊断转储钮退役冒烟(迭代 26 T5b——角落钮退出玩家画面+转储入口迁调试浮窗;V6)---- +func _smoke_diag_button_retired() -> void: + print("--- UI 诊断转储钮退役(V6:玩家画面清零+浮窗可达)---") + var main_src: String = FileAccess.get_file_as_string("res://presentation/main.gd") + check(not main_src.contains("build_diag_button"), "V6 主区无 build_diag_button 调用残留(旧实现同批清理)") + check(main_src.contains("debug_overlay.diagnose_requested.connect(_on_diagnose_pressed)"), + "V6 转储入口连接随迁(组合根接浮窗 diagnose_requested 信号)") + check(main_src.contains("func _on_diagnose_pressed()"), "V6 转储编排承接函数在位(dump_diagnosis 卡死取证保留)") + var asm_src: String = FileAccess.get_file_as_string("res://presentation/ui_assembler.gd") + check(not asm_src.contains("build_diag_button"), "V6 build_diag_button 工厂已退役(ui_assembler 零残留)") + var dbg_src: String = FileAccess.get_file_as_string("res://presentation/views/debug_overlay.gd") + check(dbg_src.contains("signal diagnose_requested"), "V6 调试浮窗 diagnose_requested 信号在位") + check(dbg_src.contains("_emit_diagnose_requested"), "V6 浮窗转储钮外发方法在位(纯视图边界)") + check(dbg_src.contains('UiKit.button("转储")'), "V6 浮窗诊断转储钮在位(玩家画面角落钮清零后唯一入口)") + + # ---- 存档序列化冒烟(SaveManager——读写往返/新档合法/余额拒花/锻造出域拒/高版本拒读禁写/ # 损坏兜底/迁移链/域界干净/摘要 cap/摘要集成/生涯终身计数域 v6)。测试文件统一 user://smoke_save_*.json 隔离, # 段首清场+段尾清理——绝不碰 user://save.json(红线)。 diff --git a/game/smoke/ui_tune_probe.gd b/game/smoke/ui_tune_probe.gd index 63ea6216..7938229b 100644 --- a/game/smoke/ui_tune_probe.gd +++ b/game/smoke/ui_tune_probe.gd @@ -23,10 +23,11 @@ const _OVERLAY_READONLY_SIGNALS: Array[String] = [ "text_changed", "text_submitted", "value_changed", "item_selected", "gui_input", "focus_entered", "focus_exited", "closed", ] -# 视图内白名单方法(fx 切换/应用/重置/模拟/两层调试/关闭/滑条联动——全部视图自身信号外发前置, +# 视图内白名单方法(fx 切换/应用/重置/模拟/两层调试/诊断转储/关闭/滑条联动——全部视图自身信号外发前置, # 零跨对象写;清单外任何新连接一律红须入册) const _OVERLAY_VIEW_METHODS: Array[String] = ["_on_fx_toggle", "_apply_btn_pressed", "_reset_btn_pressed", - "_emit_simulate_requested", "_emit_debug_levels", "_emit_closed", "_on_slider_value_changed"] + "_emit_simulate_requested", "_emit_debug_levels", "_emit_diagnose_requested", "_emit_closed", + "_on_slider_value_changed"] func _ready() -> void: @@ -194,7 +195,7 @@ func _ready() -> void: # 只读巡检(18卡⑦ T3——17卡③「白名单外零连接」形制沿用):浮窗子树全控件 × 游戏语义信号名清单 -# 全连接巡检——白名单={视图自身七方法 + 组合根 _on_modal_closed(closed 外发消费)}; +# 全连接巡检——白名单={视图自身八方法 + 组合根 _on_modal_closed(closed 外发消费)}; # 当局数据区块=纯标签零连接在此被一并约束(新增任何连接=红须入册审查)。 func _overlay_readonly_contract(main: Node, problems: Array) -> void: var overlay: Control = main.debug_overlay @@ -216,8 +217,8 @@ func _overlay_readonly_contract(main: Node, problems: Array) -> void: % [n.name, sig_name, host, m]) for ch in n.get_children(): stack.append(ch) - if conn_count != 10: - problems.append("[readonly] 信号连接数=%d 应=10(fx切换/应用/重置/模拟/两层调试/关闭六钮+滑条2+closed 外发+引擎滚动条 drag 1——多连接=写通路嫌疑)" % conn_count) + if conn_count != 11: + problems.append("[readonly] 信号连接数=%d 应=11(fx切换/应用/重置/模拟/两层调试/诊断转储/关闭七钮+滑条2+closed 外发+引擎滚动条 drag 1——多连接=写通路嫌疑)" % conn_count) # 零动效契约(17卡③ R5 形制——子树零 AnimationPlayer + 视图源码零 tween/动效包装调用)