diff --git a/game/core/level_runner.gd b/game/core/level_runner.gd index 8d88a30c..ca2c3116 100644 --- a/game/core/level_runner.gd +++ b/game/core/level_runner.gd @@ -7,7 +7,7 @@ class_name LevelRunner extends RefCounted -signal node_entered(node: Dictionary, info: Dictionary) ## info 按 type:battle/boss={} · reward={}(内容待定) · rest={healed,hp,max_hp} · shop={gp} +signal node_entered(node: Dictionary, info: Dictionary) ## info 按 type:battle/boss={} · reward={}(三选一停点空载荷——内容经 present_node_curio 拉取) · rest={healed,hp,max_hp} · shop={gp} signal choices_presented(candidates: Array) ## 选路口(兑付确认后——候选节点引用数组,零自动推进) signal step_row(row: Dictionary) ## 转发当前 战斗结算 结算行 signal round_started(round_index: int) @@ -474,8 +474,8 @@ func _enter_node(node: Dictionary) -> bool: "battle", "boss": return _start_battle(node) "reward": - # 奖励点内容未定(可选类道具不在池、功能道具渠道未定—— - # 节点保留占位、零兑付直通);推进 = 兑付确认后选路(零自动推进) + # 奖励节点 = 三选一停点(与通关三选一同池同权重同上限);呈现编排归 + # curio_interact_controller.present_node_curio;推进 = 兑付确认后选路(零自动推进) node_entered.emit(node, {}) return true "rest": diff --git a/game/presentation/battle_narrator.gd b/game/presentation/battle_narrator.gd index d66cf267..8cfcb194 100644 --- a/game/presentation/battle_narrator.gd +++ b/game/presentation/battle_narrator.gd @@ -12,7 +12,7 @@ static func node_banner(runner: LevelRunner, node: Dictionary, t: String) -> Str static func reward_line() -> String: - return "[color=#%s]关卡奖励点(节点内容待定——直通)[/color]" % UiKit.HEX_ROUTE_NOTE + return "[color=#%s]关卡奖励点(三选一——选毕推进)[/color]" % UiKit.HEX_ROUTE_NOTE static func rest_line(healed: int, hp: int, max_hp: int) -> String: diff --git a/game/probe/ui_click_probe.gd b/game/probe/ui_click_probe.gd index b57d332c..39d84aa2 100644 --- a/game/probe/ui_click_probe.gd +++ b/game/probe/ui_click_probe.gd @@ -415,16 +415,27 @@ func _ready() -> void: # 未适配则走到即卡死)。两态分派:result 态(兑付反馈——点继续推进)/ # 待选态(点首件+确认)。真实信号路径全线。〔无替换子态——装配不可变契约。〕 # 三选一停点输入锁定断言(停点态断言面:待选/兑付两态共用此层)。 - if not _tested_curio_head and main.run_scope.adventure != null and not main.run_scope.adventure._curio_pending.is_empty() and String(main.curio_overlay._header).contains("关卡奖励点"): + if not _tested_curio_head and main.run_scope.adventure != null and not main.run_scope.adventure._node_curio_pending.is_empty() and String(main.curio_overlay._header).contains("关卡奖励点"): + # 停点态判据 = _node_curio_pending(奖励节点三选一停点住此——原条件查 + # _curio_pending〔通关三选一态〕与奖励头部互斥、恒不可命中=拦截能力未证病根, + # 卡⑤ d4 转正随修;头部校验串本体零触碰) _tested_curio_head = true var ch := String(main.curio_overlay._header) if not ch.contains("冒险牌库") or not ch.contains("属性值提升与补给") or ch.contains("同权重") or ch.contains("同上限") or ch.contains("提升池"): _problems.append("三选一头部旧话残留或新话缺失(wa4——%s)" % ch.replace(" ", "|")) + # 奖励节点战报文案换代断言(卡⑤ wr2——reward_line 同屏打印于停点拉起前, + # 同一驱动路径承载;旧「内容待定」残留或新话缺失即红) + var logtext: String = main.log_view.parsed_text() + if not logtext.contains("关卡奖励点(三选一——选毕推进)") or logtext.contains("内容待定"): + _problems.append("奖励节点战报文案未换代(卡⑤ wr2——旧话残留或新话缺失)") if not main._input_locked(): _problems.append("三选一停点打开时输入未锁定") if main.curio_overlay._continue_btn.visible: main.curio_overlay.press_continue() + elif main.run_scope.adventure != null and not main.run_scope.adventure._node_curio_pending.is_empty(): + main.curio_overlay.press_card(0) # 奖励节点待选态:点首件+确认(真实按钮信号路径——与通关停点同形) + main.curio_overlay.press_confirm() elif main.run_scope.adventure != null and not main.run_scope.adventure._curio_pending.is_empty(): main.curio_overlay.press_card(0) main.curio_overlay.press_confirm() @@ -470,7 +481,16 @@ func _ready() -> void: cap_found = true if not cap_found: _problems.append("地图屏加成帽未换代为「属性值提升」(wa2)") - main.level_screen.press_candidate(_route_clicks % 2) + # 选路定向(卡⑤ d4——wa4 转正的必达前提):候选含奖励节点优先选(真实 + # press_candidate 命中路径零变化,只改索引策略);无奖励候选回退交替(岔路使用率观测面保留) + var pick := _route_clicks % 2 + if main.run_scope.runner != null: + for nd in main.run_scope.runner.nodes(): + var nd_id: int = main.run_scope.runner.node_id_of(nd) + if String(nd.get("type", "")) == "reward" and main.level_screen._cand_ids.has(nd_id): + pick = main.level_screen._cand_ids.find(nd_id) + break + main.level_screen.press_candidate(pick) _route_clicks += 1 _seals_placed.clear() continue @@ -695,6 +715,11 @@ func _ready() -> void: else: print("[click_probe] 开场行②③判定:续玩重建开场行带后缀(bonus.atk=5、pct=0)— wait=%d 帧" % ol_r_wait) + # wa4 必达判据(卡⑤ d4 转正——条件位退役):定向选路保证到达奖励节点三选一停点, + # 全程未命中即红(拦截能力必证——test-conventions §6 条件断言转正口径) + if not _tested_curio_head: + _problems.append("wa4 转正失守:探针全程未到达奖励节点三选一停点(定向选路失效或奖励节点不可达)〔卡⑤〕") + print("[click_probe] 循环退出(done=%s budget=%s)问题=%d" % [ str(_done), str(action_budget), _problems.size()]) for p in _problems: diff --git a/game/sim/level_autoplay.gd b/game/sim/level_autoplay.gd index a719f0d1..7d020364 100644 --- a/game/sim/level_autoplay.gd +++ b/game/sim/level_autoplay.gd @@ -481,7 +481,7 @@ static func _on_node_entered(node: Dictionary, info: Dictionary, runner, st: Dic st.boss_depth = int(node.get("depth", -1)) st.hp_at_boss = runner.hero_hp elif t == "reward": - runner.continue_after_node() # 奖励点 = 内容未定直通节点 + runner.continue_after_node() # autoplay 直通不解三选一——sim 策略选择(测量期不进兑付面,非机制缺位) elif t == "rest": st.rest_healed = int(info.get("healed", 0)) st.hp_before_rest = int(info.get("hp", 0)) - st.rest_healed