⑦T2: 输入锁死防护+P2甲角标迁宿主+T3当局数据只读区块(三件互锁一批落码)——modal_stack 增 has_open_excluding_any 多排除式查询(has_open_excluding 委托零语义变);main.gd 输入锁/暂停角标置灰/暂停守卫判据全改排除式排除调试浮窗(审计🔴S1+防线:DS_DEBUG默认开×遮挡复活×has_open=棋盘锁死破局)+开冒险/续玩路径显式关浮窗+_show_debug_overlay 门禁改向对局中可开(C6 单口保持)+_start_debug_levels/_on_tune_simulate 对局中守卫(长程异步模拟与活跃结算并存态不开放)+DS_DEBUG=1 启动即开(P3甲)+当局数据六项只读投影 _debug_run_data/_current_master_seed 单点(:1174 诊断种子重算冒充病灶同批改向)+模态开合单口挂 _sync_debug_overlay;P2甲:战斗屏 HUD 角标对(HBox 并排锚角距16px)+地图屏顶栏调试角标(17卡③同形制 DS_DEBUG 门控)+开始层 dbgbtn 退役(ui_assembler 返回键集换代);T3:debug_overlay 当局数据只读区块(种子/关卡/节点/HP/GP/钥石六项标签喂入制零信号连接零动效)+is_running 语义拆分(模拟在跑≠对局禁用)+set_context_locked 对局中两钮禁用+desc 文案换代;冒烟 811/0
This commit is contained in:
1 parent
40fb4a5c1b
commit
dd2c57c4cf
6 files changed
+190
-42
No files matched your search
+88
-16
@@ -50,6 +50,7 @@ var adventure = null # 冒险结构编排器(冒险结构实现
|
||||
var save_manager = null # 存档序列化承载(存档序列化批——启动读盘/冒险收束写盘;只经访问器与 apply 原语,禁读内部结构)
|
||||
var meta = null # 元进度账本服务(元进度实现批——余额/定价/购买/工坊解锁/Boss两档入账/注入计算;零信号纯被动)
|
||||
var _adventure_mode := false # 冒险模式标记(inter 层确认分派与终局分派)
|
||||
var _debug_entry := false # 调试会话门控(迭代 18 卡⑦——DS_DEBUG=1:启动即开浮窗+两屏角标点亮;_ready 赋值)
|
||||
var logger = null # 试玩日志器(JSONL 持久化 + 卡死诊断转储——呈现层组件)
|
||||
var _level_active := false
|
||||
var _seed_edit: LineEdit
|
||||
@@ -191,6 +192,9 @@ func _ready() -> void:
|
||||
_build_ui()
|
||||
_refresh_resume_button() # 迭代 8 卡②——启动读盘后按断点在档态点亮「继续上局」
|
||||
_start_overlay.visible = true
|
||||
_debug_entry = OS.get_environment("DS_DEBUG") == "1" # 迭代 18 卡⑦ P3 甲——DS_DEBUG=1 调试会话门控
|
||||
if _debug_entry:
|
||||
_show_debug_overlay() # 启动即开(手动可关、两屏角标可再开——P3 甲)
|
||||
|
||||
|
||||
# ==================== 视图接线(battle.md 四区布局 1280×800;节点构建归 UiAssembler) ====================
|
||||
@@ -225,6 +229,7 @@ func _build_ui() -> void:
|
||||
|
||||
board_zone.action_requested.connect(_on_board_action)
|
||||
board_zone.pause_badge.pressed.connect(_on_pause_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)
|
||||
@@ -258,6 +263,7 @@ func _build_ui() -> void:
|
||||
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.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 卡④——最小设置面(音量/全屏/减动效)
|
||||
@@ -289,8 +295,8 @@ func _build_ui() -> void:
|
||||
_resume_btn = start.resumebtn
|
||||
start.lvbtn.pressed.connect(_start_adventure_from_menu)
|
||||
start.resumebtn.pressed.connect(_resume_from_menu) # 迭代 8 卡②——续玩入口
|
||||
start.dbgbtn.pressed.connect(_show_debug_overlay) # 迭代 14.5——调试角标入口(浮窗,非平级主按钮)
|
||||
start.dbgbtn.visible = OS.get_environment("DS_DEBUG") == "1" # 迭代 8 卡④——调试入口默认隐藏门控(DS_DEBUG=1 点亮)
|
||||
# 调试角标入口退役(迭代 18 卡⑦ P2 甲——迁宿主:战斗屏 HUD+关卡地图屏各一枚,
|
||||
# 接线见两屏装配段;开始层不再有调试入口,DS_DEBUG=1 会话=启动即开浮窗)
|
||||
# 营地/商店投影(T4/D4 拆件批——迁 camp_shop_presenter.gd;本类只接线、探针缝保缝转发;
|
||||
# 购买写调用唯一经 MetaProgression/LevelRunner core 单口——组合根 lambda 现值注入)
|
||||
_camp_pres = CampShopPresenter.new(db, func() -> Variant: return meta, func() -> Variant: return save_manager, camp_overlay, shop_overlay,
|
||||
@@ -324,9 +330,10 @@ func _build_ui() -> void:
|
||||
confirm_dialog.confirmed.connect(_on_confirm_new_adventure)
|
||||
confirm_dialog.cancelled.connect(_on_confirm_cancelled)
|
||||
|
||||
# 调试浮窗(迭代 14.5 调试整合批——主菜单三散件收一:随机种子/数值调整/批量模拟/两层调试入口)。
|
||||
# 树序在开始层与确认弹窗之后 = 浮于菜单之上的 Dialog(不隐藏开始层——与确认弹窗同款形态,
|
||||
# 旧 TunePanel「与开始层互斥」形态退役);入口仅开始覆盖层角标(DS_DEBUG=1 门控)
|
||||
# 调试浮窗(迭代 14.5 调试整合批——主菜单三散件收一:随机种子/数值调整/批量模拟/两层调试入口;
|
||||
# 迭代 18 卡⑦——升级为全局可开浮窗:DS_DEBUG=1 启动即开〔_ready〕+两屏角标再开〔P2 甲〕+当局数据只读区块〔T3〕)。
|
||||
# 树序在开始层与确认弹窗之后 = 浮于菜单之上的 Dialog(不隐藏开始层——与确认弹窗同款形态);
|
||||
# 开窗唯一入口 = _show_debug_overlay(C6 单口——角标/探针/启动路径全收口)
|
||||
debug_overlay = DebugOverlay.new(db, int(db.hero.atk), int(db.hero.max_hp))
|
||||
add_child(debug_overlay)
|
||||
_seed_edit = debug_overlay.seed_edit # 种子读取面随浮窗迁入(_seed_value 唯一消费点不变)
|
||||
@@ -370,11 +377,13 @@ func _open_modal(m: Control) -> void:
|
||||
_flush_row_queue() # 卡⑦——任何覆盖层开启前排空排播队列(明细带恒完整,回看/停点面不缺行)
|
||||
_modals.open(m)
|
||||
_sync_pause_entry() # 迭代 17 卡③——暂停层入口角标可见性/置灰随开态同步
|
||||
_sync_debug_overlay() # 迭代 18 卡⑦——浮窗当局数据/按钮态随开态同步(T3 刷新=模态开合信号驱动)
|
||||
|
||||
|
||||
func _close_modal(m: Control) -> void:
|
||||
_modals.close(m)
|
||||
_sync_pause_entry() # 迭代 17 卡③——关闭恢复角标可点态(无残留——R3 同源口径)
|
||||
_sync_debug_overlay() # 迭代 18 卡⑦——他层关闭复活浮窗时同步刷新(P1 甲关后自动恢复语义配套)
|
||||
|
||||
|
||||
func _on_modal_closed(m: Control) -> void:
|
||||
@@ -384,7 +393,9 @@ func _on_modal_closed(m: Control) -> void:
|
||||
func _input_locked() -> bool:
|
||||
# 模态/非战斗期棋盘输入锁(T3 收口批——开态查询归 modal_stack.has_open(),登记册单一来源,
|
||||
# 不再手工罗列各层;例外三件:开始层/过场层(非模态全屏态,不在登记册)与战斗缺位(棋盘输入无载体))
|
||||
return _modals.has_open() or _start_overlay.visible or _inter_overlay.visible or settlement == null
|
||||
# 迭代 18 卡⑦ T2 防护(审计🔴):判据改排除式——调试浮窗对局中可开(P2 甲),其开态不计入锁
|
||||
#(否则 DS_DEBUG 默认开×他层关闭复活浮窗×has_open 组合=棋盘永久锁死——S1+ 停机点防线)
|
||||
return _modals.has_open_excluding(debug_overlay) or _start_overlay.visible or _inter_overlay.visible or settlement == null
|
||||
|
||||
|
||||
# ==================== 冒险模式入口(唯一试玩入口——单关测试直入口退役 2026-09-23 用户拍板)====================
|
||||
@@ -437,6 +448,7 @@ func _resume_from_menu() -> void:
|
||||
if save_manager == null or not save_manager.has_breakpoint():
|
||||
return
|
||||
var bp: Dictionary = save_manager.breakpoint_snapshot()
|
||||
_close_modal(debug_overlay) # 开冒险路径显式关浮窗(迭代 18 卡⑦ T2 防护——续玩同口径)
|
||||
_start_overlay.visible = false
|
||||
_wire_adventure()
|
||||
_level_active = true
|
||||
@@ -473,6 +485,7 @@ func _wire_adventure() -> void:
|
||||
# 冒险模式(三关连探——AdventureRunner 编排;转发信号签名与 runner 一致,接线照原样对接;
|
||||
# 信号连接只在组合根——ADR-0001)
|
||||
func _start_adventure() -> void:
|
||||
_close_modal(debug_overlay) # 开冒险路径显式关浮窗(迭代 18 卡⑦ T2 防护——DS_DEBUG 默认开态下开局不带窗;对局中经角标再开)
|
||||
_wire_adventure()
|
||||
_level_active = true
|
||||
_sync_pause_entry() # 迭代 17 卡③——进对局点亮暂停入口角标
|
||||
@@ -605,6 +618,10 @@ func _on_battle_end_continue() -> void:
|
||||
|
||||
|
||||
func _start_debug_levels() -> void:
|
||||
# 守卫(迭代 18 卡⑦ T2——浮窗对局中可开后,调试对局与活跃冒险/结算并存不开放:并发会清写
|
||||
# settlement/编排态=状态机破坏;随开随收逻辑改向——对局中开窗只读浮窗,不再视为开局前置)
|
||||
if _adventure_mode or settlement != null:
|
||||
return
|
||||
debug_overlay.reset_sliders()
|
||||
_close_modal(debug_overlay) # 浮窗内入口发起——随开随收(对局期不可再开:门禁在 _show_debug_overlay)
|
||||
_start_overlay.visible = false
|
||||
@@ -976,8 +993,10 @@ func _on_pause_closed() -> void:
|
||||
# 探针 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()):
|
||||
# P1 守卫兜底——其他模态开着即拒开(常态防线=角标置灰,探针 pressed.emit 绕过 disabled 时由此兜住;
|
||||
# 地图屏自身的登记开态不计;迭代 18 卡⑦ T2——判据排除调试浮窗:对局中浮窗开着时暂停角标仍可点)
|
||||
if _modals == null or (map_on and _modals.has_open_excluding_any([level_screen, debug_overlay])) \
|
||||
or (not map_on and _modals.has_open_excluding(debug_overlay)):
|
||||
return
|
||||
_open_pause_layer()
|
||||
|
||||
@@ -989,10 +1008,18 @@ 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
|
||||
var battle_live: bool = _level_active or settlement != null # 调试两层无 _level_active——settlement 判据补位(迭代 18 卡⑦)
|
||||
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)
|
||||
# 置灰判据改排除式(迭代 18 卡⑦ T2——调试浮窗开态不计入:对局中浮窗开着时角标仍可点)
|
||||
board_zone.pause_badge.disabled = _modals.has_open_excluding(debug_overlay)
|
||||
level_screen.pause_badge.disabled = _modals.has_open_excluding_any([level_screen, debug_overlay])
|
||||
# 调试浮窗角标(迭代 18 卡⑦ P2 甲——迁宿主两屏,DS_DEBUG 门控;17卡③暂停角标同形制同守卫):
|
||||
# 战斗屏=对局内(冒险或调试两层)且地图屏未激活;地图屏=随屏;开始菜单零角标(DS_DEBUG=1 启动即开)
|
||||
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.pause_badge.disabled
|
||||
level_screen.debug_badge.disabled = level_screen.pause_badge.disabled
|
||||
|
||||
|
||||
# ---- 探针缝保缝(T4/D4 拆件——click/ui_probe 营地段直呼组合根面;实现归 camp_shop_presenter.gd)----
|
||||
@@ -1171,7 +1198,8 @@ func _on_legend_toggled() -> void:
|
||||
# ==================== 诊断转储(卡死时点击——全量核心状态 + 环形缓冲)====================
|
||||
|
||||
func _on_diagnose_pressed() -> void:
|
||||
var ctx := {"mode": "level" if _level_active else "debug", "seed": _seed_value()}
|
||||
# 迭代 18 卡⑦——本局种子现值(原 _seed_value() 重算冒充病灶改向 _current_master_seed 只读单点)
|
||||
var ctx := {"mode": "level" if _level_active else "debug", "seed": _current_master_seed()}
|
||||
if _level_active and runner != null:
|
||||
ctx["runner"] = {"node_index": runner.node_index, "level_result": String(runner.level_result),
|
||||
"hero_hp": runner.hero_hp, "settlement_is_null": runner.current_battle() == null}
|
||||
@@ -1184,11 +1212,52 @@ func _on_diagnose_pressed() -> void:
|
||||
# ==================== 调试浮窗(迭代 14.5 整合批——原数值调整板节收编;开合/应用/模拟编排组合根承接)====================
|
||||
|
||||
func _show_debug_overlay() -> void:
|
||||
# 门禁(用户裁 2026-10-04:仅开始菜单可开,对局中不可达):入口角标宿主即开始层,
|
||||
# 此护栏防御未来调用面(含探针直呼);浮窗树序在开始层之后 = 悬浮其上,不隐藏菜单
|
||||
if not _start_overlay.visible:
|
||||
# 门禁改向(迭代 18 卡⑦ P2/P3 甲——对局中可开;本函数仍是唯一开窗入口 C6,门禁逻辑收函数内):
|
||||
# 旧「仅开始菜单可开」门随入口迁宿主退役——棋盘输入锁/暂停角标判据已排除浮窗(T2 防护),
|
||||
# 遮挡语义=P1 甲 ModalStack 登记制(他模态开时暂隐、关后自动恢复),此处零场景限制
|
||||
if debug_overlay == null:
|
||||
return
|
||||
_open_modal(debug_overlay) # 模态栈单口
|
||||
_open_modal(debug_overlay)
|
||||
_sync_debug_overlay()
|
||||
|
||||
|
||||
# 调试浮窗角标点击(两屏同款处理器——17卡③暂停角标同形制守卫;C6:仍收口 _show_debug_overlay 单口)
|
||||
func _on_debug_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_any([level_screen, debug_overlay])) \
|
||||
or (not map_on and _modals.has_open_excluding(debug_overlay)):
|
||||
return
|
||||
_show_debug_overlay()
|
||||
|
||||
|
||||
# 浮窗上下文同步(迭代 18 卡⑦——当局数据刷新+对局中按钮禁用单点):调用面=开窗口与模态开合
|
||||
# 单口(凡影响开态/对局态的路径必经其一——与 _sync_pause_entry 同款纪律)
|
||||
func _sync_debug_overlay() -> void:
|
||||
if debug_overlay == null:
|
||||
return
|
||||
debug_overlay.set_context_locked(settlement != null or _adventure_mode) # 对局中批量模拟/两层调试入口禁用(长程异步模拟与活跃结算并存态不开放——T2)
|
||||
debug_overlay.update_run_data(_debug_run_data()) # T3 当局数据只读区块喂入(开窗+模态开合信号驱动)
|
||||
|
||||
|
||||
# 当局数据六项只读投影(P4 甲——C4 零直读内部状态、零写通路):种子=adventure.master_seed 现值
|
||||
# (非 _seed_value() 重算);调试两层/非对局无冒险对象=RNG 服务 master_seed 现值(E5 只读出口,
|
||||
# 未播种 -1 显「—」);其余五项=runner 成文出口;缺位=「—」占位。零动效(纯标签重查——17卡③契约)。
|
||||
func _debug_run_data() -> Dictionary:
|
||||
var r = adventure.runner() if adventure != null else null
|
||||
var seed_now: int = _current_master_seed()
|
||||
var seed_txt: String = str(seed_now) if seed_now >= 0 else "—"
|
||||
if r == null:
|
||||
return {"seed": seed_txt, "level": "—", "node": "—", "hp": "—", "gp": "—", "keystone": "—"}
|
||||
return {"seed": seed_txt, "level": int(adventure.level_index), "node": int(r.node_index),
|
||||
"hp": "%d/%d" % [int(r.hero_hp), int(r.effective_max_hp())], "gp": int(r.gp), "keystone": int(r.keystone)}
|
||||
|
||||
|
||||
# 本局种子现值(只读单点——当局数据区块与诊断转储共用):冒险=adventure.master_seed 访问器现值;
|
||||
# 调试两层=RNG 服务 master_seed。禁 _seed_value() 重算冒充本局种子(main.gd 旧 :1174 病灶随批改向)。
|
||||
func _current_master_seed() -> int:
|
||||
if adventure != null:
|
||||
return int(adventure.master_seed)
|
||||
return int(get_node("/root/RngService").master_seed)
|
||||
|
||||
|
||||
func _close_debug_overlay() -> void:
|
||||
@@ -1201,7 +1270,10 @@ func _on_tune_apply(atk_pct: int, hp_pct: int) -> void:
|
||||
|
||||
|
||||
func _on_tune_simulate(n: int) -> void:
|
||||
# 批量模拟编排 = 控制器承接(tune_sim_controller.gd);E4 后无表态需复位——模拟走 runner 覆盖参数
|
||||
# 批量模拟编排 = 控制器承接(tune_sim_controller.gd);E4 后无表态需复位——模拟走 runner 覆盖参数。
|
||||
# 对局中禁用兜底(迭代 18 卡⑦ T2——长程异步模拟与活跃结算并存态不开放;探针 emit 绕过 disabled 时由此守住)
|
||||
if settlement != null:
|
||||
return
|
||||
_tune_sim.run(n)
|
||||
|
||||
|
||||
|
||||
@@ -47,8 +47,16 @@ func has_open() -> bool:
|
||||
#(关卡地图屏系登记册模态成员=常态屏态,其上的地图屏角标必须可点;其余任一层开着=角标置灰)。
|
||||
# 只读查询零副作用——登记序/开合记账语义零改动。
|
||||
func has_open_excluding(skip: Control) -> bool:
|
||||
return has_open_excluding_any([skip])
|
||||
|
||||
|
||||
# 多排除式开态查询(迭代 18 卡⑦ T2 防护——调试浮窗对局中可开后,棋盘输入锁与暂停角标置灰
|
||||
# 判据须同时排除调试浮窗自身〔否则 DS_DEBUG 默认开×遮挡复活×has_open 组合=棋盘永久锁死——
|
||||
# 审计🔴 S1+ 停机点防线〕;地图屏场景=地图屏+调试浮窗双排除)。语义同 has_open_excluding,
|
||||
# skip 集参数化;只读查询零副作用,登记序/开合记账语义零改动。
|
||||
func has_open_excluding_any(skips: Array) -> bool:
|
||||
for m in _list:
|
||||
if m == skip:
|
||||
if skips.has(m):
|
||||
continue
|
||||
if is_instance_valid(m) and m.visible:
|
||||
return true
|
||||
|
||||
@@ -92,9 +92,10 @@ static func build_overlays(host: Control, db) -> Dictionary:
|
||||
}
|
||||
|
||||
|
||||
# 开始覆盖层(返回 {overlay, box, lvbtn, resumebtn, campbtn, settingsbtn, quitbtn, dbgbtn}——按钮接线归组合根;
|
||||
# 开始覆盖层(返回 {overlay, box, lvbtn, resumebtn, campbtn, settingsbtn, quitbtn}——按钮接线归组合根;
|
||||
# 迭代 14.5 调试整合批:随机种子/数值调整板/两层调试三散件撤出主按钮组,收进调试浮窗——
|
||||
# 本层只留右下角「调试」角标入口(DS_DEBUG=1 门控归组合根),dbgbtn 即该角标。
|
||||
# 迭代 18 卡⑦ P2 甲:右下角「调试」角标亦退役(入口迁宿主=战斗屏 HUD+关卡地图屏两枚角标,
|
||||
# DS_DEBUG=1 会话浮窗启动即开——本层零调试入口)
|
||||
# UI 落码批 M2(2026-10-04):单列 VBox→双列(左操作 56% + 右舞台);按钮动词化+悬停解释
|
||||
#(解释全迁 tooltip,G5);lvbtn 升主操作钮(烛光黄 CANDLE);右列=立绘看台。**玩法速览牌已退役
|
||||
#(2026-10-06 用户令:界面禁玩法文字墙——教学内容归 Beta 帮助手册〔教学引导定稿批 P4 丙〕,历史文案在 git)**;
|
||||
@@ -156,12 +157,9 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary:
|
||||
var quitbtn := UiKit.button("退出游戏")
|
||||
box.add_child(quitbtn)
|
||||
|
||||
# 迭代 14.5 调试整合批——调试入口收右下角标(与主按钮组非平级;DS_DEBUG=1 点亮,可见性归组合根)。
|
||||
# margin 16px 角距;字号降档与主按钮拉开层级
|
||||
var dbgbtn := UiKit.button("调试", 0.0) # 角标豁免宽度基准(0=不设 min/flags——角落小件)
|
||||
dbgbtn.add_theme_font_size_override("font_size", UiKit.FS_HINT)
|
||||
dbgbtn.set_anchors_and_offsets_preset(Control.PRESET_BOTTOM_RIGHT, Control.PRESET_MODE_MINSIZE, 16)
|
||||
overlay.add_child(dbgbtn)
|
||||
# 迭代 18 卡⑦ P2 甲——旧右下角调试角标退役(原迭代 14.5 装配段删除):入口迁宿主两屏
|
||||
#(board_zone_view.debug_badge / level_map_screen.debug_badge),DS_DEBUG 门控与可见性
|
||||
# 同步归组合根 _sync_pause_entry;开始层零调试入口(DS_DEBUG=1 会话=浮窗启动即开)
|
||||
|
||||
# 右列:立绘看台 + 玩法速览牌(M2——帮助全文保留表值驱动,仅容器化;内容含地形变异段不删)
|
||||
var right := VBoxContainer.new()
|
||||
@@ -198,7 +196,7 @@ static func build_start_overlay(host: Control, db = null) -> Dictionary:
|
||||
|
||||
return {"overlay": overlay, "box": box,
|
||||
"lvbtn": lvbtn, "resumebtn": resumebtn,
|
||||
"campbtn": campbtn, "settingsbtn": settingsbtn, "quitbtn": quitbtn, "dbgbtn": dbgbtn}
|
||||
"campbtn": campbtn, "settingsbtn": settingsbtn, "quitbtn": quitbtn}
|
||||
|
||||
|
||||
# 调试两层模式的层间过渡覆盖层(历史入口专用)。返回 {overlay, label, next_btn}——接线归组合根
|
||||
|
||||
@@ -12,6 +12,7 @@ var board_view: BoardView
|
||||
var toast: ToastStack
|
||||
var fx: BoardFxView
|
||||
var pause_badge: Button # 暂停层入口角标(迭代 17 卡③ P1 丁——debug 角标同形制;连接归组合根)
|
||||
var debug_badge: Button # 调试浮窗入口角标(迭代 18 卡⑦ P2 甲——DS_DEBUG 门控归组合根;暂停角标同形制)
|
||||
var _board_area: Control # resized 命名转发用(原 lambda 局部捕获——P1-3 转命名 2026-09-29)
|
||||
|
||||
signal action_requested(cell: Vector2i, kind: String)
|
||||
@@ -42,15 +43,24 @@ 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——装配器/视图零连接)
|
||||
# 角标对(迭代 18 卡⑦ P2 甲——调试+暂停两枚右下角常驻,HBox 并排锚角距 16px):
|
||||
# 17卡③暂停角标同形制:紧凑钮豁免宽度基准+字号降档。可见性/置灰归组合根 _sync_pause_entry
|
||||
#(DS_DEBUG 门控/其他模态开着=置灰不可点——排除式开态查询);信号连接归组合根(ADR-0001)。
|
||||
# preset 在子件全部入列后调用——MINSIZE 锚按当时最小尺寸计偏移(空容器调用=零尺寸锚外溢屏边)
|
||||
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)
|
||||
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)
|
||||
corner.add_child(pause_badge)
|
||||
corner.set_anchors_and_offsets_preset(Control.PRESET_BOTTOM_RIGHT, Control.PRESET_MODE_MINSIZE, 16)
|
||||
board_area.add_child(corner)
|
||||
# M8(UI 落码批):棋盘底常驻操作提示条(demo ⑦——文案经 board_view 输入代码证实;
|
||||
# 旧 chord 一次性 toast 提示退役归此常驻条;审计第 7 条用户批)
|
||||
var hint := PanelContainer.new()
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
# VERTICAL SLICE - NOT FOR PRODUCTION
|
||||
# Date: 2026-10-04(迭代 14.5 调试整合批——主菜单三散件(随机种子/角色数值调整板/两层调试入口)收一张调试浮窗,
|
||||
# 原 views/tune_panel.gd 整体吸收退役)
|
||||
# 开发调试浮窗:入口 = 开始覆盖层右下角「调试」角标(DS_DEBUG=1 门控归组合根)——非主按钮组平级;
|
||||
# 仅开始菜单可开(浮于菜单之上的 Dialog 形态,不隐藏开始层——与确认弹窗同款;对局中不可达)。
|
||||
# 开发调试浮窗:全局可开(迭代 18 卡⑦——DS_DEBUG=1 会话启动即开〔组合根 _ready〕+战斗屏 HUD/关卡地图屏
|
||||
# 两枚角标再开〔P2 甲,17卡③暂停角标同形制〕;遮挡语义=ModalStack 登记制:他模态开时暂隐、关后自动恢复;
|
||||
# 旧「仅开始菜单可开」门随入口迁宿主退役)。当局数据只读区块=本局种子唯一查看位(T3,P4 甲六项)。
|
||||
# 列表页形态可扩展:后续调试项按区块往下追加,超高滚动。
|
||||
# 纯视图边界(规范 1.3):数值应用/批量模拟/对局启动全部经信号外发由组合根承接
|
||||
#(apply_requested / simulate_requested / debug_levels_requested / closed);
|
||||
# 模拟进度与报告经 setter 注入——零核心写、不拼报告文案(装配归 HudPresenter)。
|
||||
# 当局数据经 update_run_data setter 喂入(只读投影零回读);模拟进度与报告经 setter 注入——
|
||||
# 零核心写、不拼报告文案(装配归 HudPresenter)。零动效(零 tween/AnimationPlayer——17卡③契约)。
|
||||
# 探针接缝(ADR-0004"合成输入走真实翻译出口"口径):press_apply_for_probe 等三键 = 按钮真实信号路径。
|
||||
class_name DebugOverlay
|
||||
extends Control
|
||||
@@ -28,7 +30,12 @@ var _hp_val: Label
|
||||
var _eff: Label
|
||||
var _sim_count: SpinBox
|
||||
var _sim_btn: Button
|
||||
var _dbg_btn: Button # 两层调试入口钮(迭代 18 卡⑦——对局中禁用承载面)
|
||||
var _sim_out: RichTextLabel
|
||||
var _sim_running := false # 批量模拟进行中(is_running 判据——与对局中禁用态分离防互扰)
|
||||
var _ctx_locked := false # 对局中上下文锁定(组合根 _sync_debug_overlay 喂入——批量模拟/两层调试入口禁用)
|
||||
var _run_labels := {} # 当局数据六项标签(P4 甲——只读投影,组合根 update_run_data 喂入)
|
||||
var _run_data := {} # 最近一次投喂快照(探针值对面 run_data_probe)
|
||||
|
||||
|
||||
func _init(db_ref, base_atk: int, base_hp: int) -> void:
|
||||
@@ -70,12 +77,37 @@ func set_sim_count(n: int) -> void:
|
||||
|
||||
|
||||
func is_running() -> bool:
|
||||
return _sim_btn.disabled
|
||||
return _sim_running # 批量模拟进行中(迭代 18 卡⑦——与对局中禁用态分离,置灰 ≠ 在跑)
|
||||
|
||||
|
||||
func set_sim_running(running: bool) -> void:
|
||||
_sim_btn.disabled = running
|
||||
_sim_btn.text = "模拟中…" if running else "运行模拟"
|
||||
_sim_running = running
|
||||
_sync_sim_button()
|
||||
|
||||
|
||||
# 对局中上下文锁定(迭代 18 卡⑦ T2——组合根 _sync_debug_overlay 喂入):批量模拟与两层调试入口
|
||||
# 在活跃对局并存态不开放(长程异步模拟/并发对局编排与活跃结算并存态破坏状态机)
|
||||
func set_context_locked(locked: bool) -> void:
|
||||
_ctx_locked = locked
|
||||
_dbg_btn.disabled = _ctx_locked
|
||||
_sync_sim_button()
|
||||
|
||||
|
||||
# 当局数据只读投影喂入(T3 P4 甲六项——组合根 _debug_run_data 构造;纯标签重查零动效)
|
||||
func update_run_data(data: Dictionary) -> void:
|
||||
_run_data = data.duplicate()
|
||||
for key in _run_labels:
|
||||
(_run_labels[key] as Label).text = str(data.get(key, "—"))
|
||||
|
||||
|
||||
# 当局数据快照读面(探针值对面——ui_tune_probe 断言六项与只读访问器逐项一致)
|
||||
func run_data_probe() -> Dictionary:
|
||||
return _run_data.duplicate()
|
||||
|
||||
|
||||
func _sync_sim_button() -> void:
|
||||
_sim_btn.disabled = _sim_running or _ctx_locked
|
||||
_sim_btn.text = "模拟中…" if _sim_running else "运行模拟"
|
||||
|
||||
|
||||
func set_sim_progress(text: String) -> void:
|
||||
@@ -131,7 +163,7 @@ func _build() -> void:
|
||||
var title := UiKit.label("调试",UiKit.FS_TITLE, true, UiKit.WARM)
|
||||
box.add_child(title)
|
||||
var desc := UiKit.label(
|
||||
"开发调试专用——仅开始菜单可开(DS_DEBUG=1 时入口点亮)。\n百分比叠加基础值:攻击 %d / 生命 %d。影响所有模式(手动与模拟),不落盘。" % [_base_atk, _base_hp],
|
||||
"开发调试专用(DS_DEBUG=1 会话:启动即开;战斗屏/地图屏「调试」角标可再开)。当局数据=本局只读投影,种子即本局种子唯一查看位。\n百分比叠加基础值:攻击 %d / 生命 %d。影响所有模式(手动与模拟),不落盘。" % [_base_atk, _base_hp],
|
||||
13, false, UiKit.WARM_SOFT)
|
||||
box.add_child(desc)
|
||||
box.add_child(HSeparator.new())
|
||||
@@ -146,6 +178,25 @@ func _build() -> void:
|
||||
list.add_theme_constant_override("separation", 8)
|
||||
scroll.add_child(list)
|
||||
|
||||
# 区块·当局数据(迭代 18 卡⑦ T3 P4 甲——六项只读投影:种子=本局种子唯一查看位〔adventure
|
||||
# .master_seed 现值,非 _seed_value() 重算〕/关卡/节点/HP/GP/钥石;数据由组合根开窗与模态开合
|
||||
# 时 update_run_data 喂入;纯标签零信号连接零动效——17卡③只读契约)
|
||||
var run_head := UiKit.label("当局数据(只读)",UiKit.FS_HINT, true, UiKit.WARM)
|
||||
list.add_child(run_head)
|
||||
var run_grid := GridContainer.new()
|
||||
run_grid.columns = 2
|
||||
run_grid.add_theme_constant_override("h_separation", 14)
|
||||
run_grid.add_theme_constant_override("v_separation", 2)
|
||||
list.add_child(run_grid)
|
||||
for item in [["seed", "种子"], ["level", "关卡"], ["node", "节点"], ["hp", "HP"], ["gp", "GP"], ["keystone", "钥石"]]:
|
||||
var cap := UiKit.label(String(item[1]),UiKit.FS_HINT, false, UiKit.WARM_FAINT)
|
||||
cap.custom_minimum_size = Vector2(52, 0)
|
||||
run_grid.add_child(cap)
|
||||
var val := UiKit.label("—",UiKit.FS_HINT, false, UiKit.WARM)
|
||||
_run_labels[item[0]] = val
|
||||
run_grid.add_child(val)
|
||||
list.add_child(HSeparator.new())
|
||||
|
||||
# 区块⓪胜利演出风格(P-C5 两套并存——纹章拼合[默认]/尘金粒子;会话级不落盘)
|
||||
var fx_row := HBoxContainer.new()
|
||||
fx_row.add_theme_constant_override("separation", 10)
|
||||
@@ -211,10 +262,10 @@ func _build() -> void:
|
||||
list.add_child(_sim_out)
|
||||
list.add_child(HSeparator.new())
|
||||
|
||||
# 区块④两层调试对局入口(原开始覆盖层调试按钮迁入——HP 关内延续)
|
||||
var dbg_btn := UiKit.button("调试 · 连续关卡两层(HP 关内延续)")
|
||||
dbg_btn.pressed.connect(_emit_debug_levels)
|
||||
list.add_child(dbg_btn)
|
||||
# 区块④两层调试对局入口(原开始覆盖层调试按钮迁入——HP 关内延续;迭代 18 卡⑦——对局中禁用)
|
||||
_dbg_btn = UiKit.button("调试 · 连续关卡两层(HP 关内延续)")
|
||||
_dbg_btn.pressed.connect(_emit_debug_levels)
|
||||
list.add_child(_dbg_btn)
|
||||
|
||||
var close_btn := UiKit.button("关闭")
|
||||
close_btn.pressed.connect(_emit_closed)
|
||||
|
||||
@@ -62,6 +62,7 @@ var _content_size := Vector2(620, 240) # 图内容包络(open_choices 按图
|
||||
var _hover_id := -1 # 悬停预承诺候选(-1 = 无)
|
||||
var abandon_btn: Button # 放弃入口(可见性归组合根 set_abandon_available——只在冒险模式开)
|
||||
var pause_badge: Button # 暂停层入口角标(迭代 17 卡③ P1 丁——顶栏 GP 徽右侧;连接归组合根)
|
||||
var debug_badge: Button # 调试浮窗入口角标(迭代 18 卡⑦ P2 甲——DS_DEBUG 门控;暂停角标同形制)
|
||||
var _abandon_timer := ArmedTimer.new() # 放弃确认窗(T3/D3 P4 乙——_process 帧驱动倒计时机制收口;窗口=CONFIRM_WINDOW_S)
|
||||
var _node_icons := {} # 节点图标贴图(load_tex 守卫——缺位 null → 字形回退,冒烟/无素材检出安全)
|
||||
var _noise_rect: TextureRect # 屏底石纹(换层色板渐变承载面——null = 纯色回退无挂点)
|
||||
@@ -121,6 +122,14 @@ func _init() -> void:
|
||||
pause_badge.tooltip_text = "查看钥石与永久强化进度(只读)"
|
||||
pause_badge.size_flags_vertical = Control.SIZE_SHRINK_CENTER
|
||||
top.add_child(pause_badge)
|
||||
# 调试浮窗入口角标(迭代 18 卡⑦ P2 甲——顶栏暂停角标右侧;17卡③同形制:紧凑钮豁免宽度基准+
|
||||
# 字号降档。可见性/置灰归组合根 _sync_pause_entry(DS_DEBUG 门控/其他模态开着=置灰——排除式
|
||||
# 开态查询,本屏自身开态不计);信号连接归组合根(ADR-0001——视图零连接))
|
||||
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)
|
||||
|
||||
Reference in new issue
Block a user