diff --git a/game/presentation/main.gd b/game/presentation/main.gd index 82d1289e..8f0c7043 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -1196,6 +1196,13 @@ func _on_board_action(cell: Vector2i, kind: String) -> void: # 玩家动作 → 核心写调用的唯一通道(模态/无战斗拒绝在此收口) if _input_locked(): return + # 结算演播期棋盘冻结(T17 用户明确令 v3——不可点/不可移/不可挖): + # 锁面=排播队列活跃(纯队列判据;_row_pace_wait 有末行尾迹窗口不可作演播中标志)。 + # 队列排空即解锁、无状态残留;HUD 按钮不在锁面(停手/明细回看各自通路,开启前 + # _flush_row_queue 自行排空)。v1 撞收尾链的教训对策:ui_click_probe 的排播期 stall + # 豁免随批(合法停顿态),Waiting 收尾等待期**不豁免**——probe 报卡即为真回归信号。 + if not _row_queue.is_empty(): + return # 魔法道具选中态劫持(迭代 7 T4——两步交互第二步):点格=使用目标拾取,不落挖格; # 只劫持挖掘点击(move/flag 语义不冲突——选中期玩家仍可移动/插旗) if _aux_use_selection != 0 and kind == "dig": diff --git a/game/smoke/ui_click_probe.gd b/game/smoke/ui_click_probe.gd index 44f6fd69..07d8f040 100644 --- a/game/smoke/ui_click_probe.gd +++ b/game/smoke/ui_click_probe.gd @@ -259,10 +259,14 @@ func _ready() -> void: "settling": diag.settling, } if JSON.stringify(st) == JSON.stringify(_last_state): - _stall_frames += 1 - if _stall_frames == 30: - _report_stall(st) - return + # 排播演播期豁免(T17 硬锁 v3 随批——合法停顿态):演播期棋盘锁生效、probe 点击被吞、 + # 逻辑态恒定属预期。判据=纯队列(与 main 锁同源)。Waiting 收尾等待期**不豁免**—— + # 锁若把收尾链卡死,此处 stall 照报(探测面)。 + if main._row_queue.is_empty(): + _stall_frames += 1 + if _stall_frames == 30: + _report_stall(st) + return else: _stall_frames = 0 _ap_spent_this_round = 0