演播后排窗修复+定点探针(T17用户令「伤害过程演完才切胜利结算窗」): ①缺陷本体=open_victory首行visible=true上屏先于模态注册——延迟只挂了栈注册没挂视觉,排播期窗照会上屏;修=挂起路径补m.visible=false(派发开窗经_modals.open点亮)②四开口(普通胜利/Boss总结/冒险终局/调试终局)统一走_open_modal_after_playback③新增t17_defer_probe定点探针(真实信号路径驱动击杀胜利,两断言:胜利同帧窗不开+挂起在案+队列在播〔旧路径同帧开窗即红=判别性〕/排播完5.5s窗开)④撤全部临时插桩+ui_click_probe终局判据改adventure.state(running=中途面/settling=真终局);闸=定点探针PASS(按用户测试粒度铁规只跑关联测试,全量归迭代出口批)

This commit is contained in:
DKChan committed 2026-10-02 18:04:10 +08:00
1 parent c22f084e10
commit b0c5d7e081
4 files changed
+157 -10

No files matched your search

+37 -5
View File
@@ -123,6 +123,32 @@ var _locked_click := {} # 锁期点击缓存(T17 v3.1——最后一
# 锁期点击重放(v3.1):延迟一帧重入唯一动作通道——此刻队列空锁已解,按普通动作受理
#(局面在演播期无变化:逻辑先行、演播只是回放——点击语义保真;_row_queue=RowPacer 委托面,
# 排播泵本体已迁 row_pacer.gd——T3 结构段)。
var _deferred_modal: Control = null # 演播后开窗挂起(T17——胜利/Boss 总结/终局面等排播放完再开)
# 演播后排窗(T17 用户令「伤害过程演完才切结算窗口」):排播队列在播=挂起,演播完边沿
# (_on_pump_ended 派发)再开——旧路径 _open_modal 前置 flush 会把击杀轮的伤害/死亡演出
# 同帧倒掉(「直接跳战斗胜利」缺陷本体)。队列空=立即开(行为同旧路径)。
func _open_modal_after_playback(m: Control) -> void:
if _row_pacer.pending_rows().is_empty():
_open_modal(m)
return
_deferred_modal = m
m.visible = false # 挂起含视觉(open_* 已置 visible=true——不压掉则窗在排播期照会上屏,延迟形同虚设)
# 演播完边沿派发(row_pacer.pump_ended 注入口——原直连锁期点击重放,现统一派发):
# 先开挂起 modal(胜利窗接管呈现),后锁期点击重放——modal 开启后 _input_locked 吞掉
# 重放点击(战斗已收场,重放无意义)。
func _on_pump_ended() -> void:
if _deferred_modal != null:
var m: Control = _deferred_modal
_deferred_modal = null
_open_modal(m)
return
_replay_locked_click()
func _replay_locked_click() -> void:
if _locked_click.is_empty() or not _row_queue.is_empty():
return
@@ -180,7 +206,7 @@ func _build_ui() -> void:
_row_pacer.settlement_fx = settlement_fx
_row_pacer.board_view = board_view
_row_pacer.refresh_request = _refresh_presentations
_row_pacer.pump_ended = _replay_locked_click # T17 v3.1——演播完边沿重放锁期点击(合并批接线)
_row_pacer.pump_ended = _on_pump_ended # T17 v3.1+演播后排窗——边沿统一派发(挂起 modal 优先,其次锁期点击重放) # T17 v3.1——演播完边沿重放锁期点击(合并批接线)
add_child(_row_pacer)
# 魔法道具两步交互(T3 拆件批——迁 aux_interact_controller.gd;settlement/runner 随关卡更替,
# 经现值回调注入——仿 identity_resolver 只读回调先例)
@@ -298,6 +324,12 @@ func _register_modal(m: Control) -> void:
func _open_modal(m: Control) -> void:
# 挂起兜底(T17 演播后排窗):其他路径(如回看)在播期排空队列会使演播完边沿不再触发——
# 此处先结挂起 modal 防永不兑现(m==挂起对象时跳过=本调用自身)。
if _deferred_modal != null and m != _deferred_modal:
var dm: Control = _deferred_modal
_deferred_modal = null
_open_modal(dm)
# 打开时显式隐藏树序在其上方的可见层(遮挡物隐藏),关闭恢复——单一模态栈
_flush_row_queue() # 卡⑦——任何覆盖层开启前排空排播队列(明细带恒完整,回看/停点面不缺行)
_modals.open(m)
@@ -486,7 +518,7 @@ func _on_bonus_presented(payload: Dictionary) -> void:
_end_overlay.open_victory(Narrator.battle_end_text("victory", false), "继续",
board_view.get_global_rect(),
"%s\n%s" % [_gp_summary_text({"gp_dropped": _last_gain_amount}), Narrator.bonus_keystone_line(payload)])
_open_modal(_end_overlay)
_open_modal_after_playback(_end_overlay)
_refresh_presentations()
@@ -615,7 +647,7 @@ func _on_adventure_finished(summary: Dictionary) -> void:
logger.log_level_end(summary) # 试玩时间线:冒险终局(摘要随载荷)
if runner != null:
runner.restore_hero_base()
_open_modal(_end_overlay)
_open_modal_after_playback(_end_overlay)
_refresh_presentations()
@@ -779,7 +811,7 @@ func _on_battle_finished(payload: Dictionary) -> void:
else:
_end_overlay.open_defeat(Narrator.battle_end_text("defeat", false),
"返回", board_view.get_global_rect())
_open_modal(_end_overlay)
_open_modal_after_playback(_end_overlay)
_refresh_presentations()
@@ -898,7 +930,7 @@ func _on_choices_presented(candidates: Array) -> void:
_end_overlay.open_victory(Narrator.battle_end_text("victory", false), "下一节点",
board_view.get_global_rect(),
"战利品 GP +%d · 合计 %d" % [_last_gain_amount, int(runner.gp)])
_open_modal(_end_overlay)
_open_modal_after_playback(_end_overlay)
_refresh_presentations()
return
_enter_level_screen()