feat(迭代38卡⑤ 奖励节点清扫批): 「奖励节点零兑付直通占位」过时表述族判据面清扫——d1 level_runner 两注释换代(reward=三选一停点现状准确表述)+d2 autoplay :484 理由句换代(sim 策略选择语义,行为零触碰)+d3 battle_narrator 战报文案「节点内容待定——直通」→「三选一——选毕推进」(唯一玩家可见行为改动,wr2 专行);d4 wa4 条件断言转正——病根=原捕获条件查 _curio_pending(通关三选一停点态)与奖励头部「关卡奖励点」互斥、恒不可命中(拦截能力未证实况),随修挂 _node_curio_pending(奖励节点停点态,头部校验串零触碰)+定向选路小改(候选含奖励节点优先,press_candidate 真实命中路径零变化)+必达判据(全程未到停点即红);wr2 战报文案断言(同驱动路径承载);撤销证明两条实测:回退 d3→wr2 单红、回退 d4 条件→wa4 必达红、还原复绿(问题=0);wr1 两串 grep 判据零输出;探针不进验证集清单提取面(extract_checks 扫 tests/unit|integration|system_test——无同步义务)

This commit is contained in:
DKChan committed 2026-10-26 07:08:32 +08:00
1 parent a15370c524
commit 00ed023659
4 files changed
+32 -7

No files matched your search

+3 -3
View File
@@ -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":
+1 -1
View File
@@ -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:
+27 -2
View File
@@ -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:
+1 -1
View File
@@ -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