T5(迭代22秘宝批): 存档面+死通道拆除——treasure_inventory保留注记(主动件骑库存承载在役:线香/天眼handle+断点aux_items快照+set_attune_charges差额注入全链保留); 替换子交互整体拆除(CURIO_KINDS除名后不可达死通道=装配不可变契约1实现面保证): adventure_runner六函数删(_pick_treasure_item/resolve_treasure_replace/_resolve_node_replace/_replace_in_transit/_draw_pending_treasure/resolve_curio_replace)+_bonus_treasure_carry跨关携带/_last_draw_treasure掷定链/_roll_from/_bonus_treasure_pool/bonus_aux_carry断点键; level_runner.grant_treasure_item/treasure_items.holding_records删; 呈现面=controller替换子态三函数+aux_detail卡片直显链/curio_pick_overlay replace状态机(信号+面板+open_replace)/main两接线/level_autoplay替换策略; smoke与ui_click_probe替换分支摘除+reward_overlay_test替换段摘除; 修正则贪吃误删=apply_node_curio普通兑付主体补回。冒烟895/0+run_all 22套+探针全绿〔秘宝批 V15/V16拆除路线/V13〕

This commit is contained in:
DKChan committed 2026-10-12 19:32:29 +08:00
1 parent b7a2eadd2c
commit 73db171cb4
13 files changed
+42 -346

No files matched your search

+2 -12
View File
@@ -150,10 +150,9 @@ static func run_adventure(db, seed_val: int, atk_pct: int, hp_pct: int, collect_
adr.node_entered.connect(_on_adventure_node_entered.bind(adr, st, logger))
adr.wallet_changed.connect(_on_adventure_wallet.bind(st, logger))
# 三选一停点驱动(迭代 10 奖励重构批——big_reward_paid 退役:确定性策略候选取首件、
# 道具件满位替换放弃新件、兑付后推进下一关——零随机流自开,同种子逐位可复放)
# 兑付后推进下一关——零随机流自开,同种子逐位可复放;满位替换策略随迭代 22 T5 拆除)
adr.curio_choice_presented.connect(_on_adventure_bonus.bind(st, adr))
adr.curio_resolved.connect(_on_adventure_curio_resolved.bind(st, adr))
adr.treasure_replace_presented.connect(_on_adventure_treasure_replace.bind(st, adr))
adr.adventure_finished.connect(_on_adventure_finished.bind(st, logger))
adr.set_hero_override(atk_pct, hp_pct)
# 同调分层注入(迭代 11 第①批 T8——缺省 {} 与既有调用方逐位一致零行为变更)
@@ -226,7 +225,7 @@ static func _on_adventure_node_entered(node: Dictionary, info: Dictionary, adr,
if ncands.is_empty():
r.continue_after_node() # 牌库空合法态直通(池耗即枯竭——防御保留)
else:
adr.present_node_curio(ncands, ndraw.get("aux_detail", []) as Array)
adr.present_node_curio(ncands)
var npick: Dictionary = _pick_token(ncands, String(st.get("feat_mode", "off")))
if adr.apply_node_curio(String(npick.get("kind", "")), String(npick.get("tier", "")), String(npick.get("feat_id", ""))):
# T5 门票拿到即开——候选已被替换为专长三选一,就地再选一轮(确定性策略同款 316-f);
@@ -236,8 +235,6 @@ static func _on_adventure_node_entered(node: Dictionary, info: Dictionary, adr,
if not fcands.is_empty():
var fpick: Dictionary = _pick_token(fcands, String(st.get("feat_mode", "off")))
adr.apply_node_curio(String(fpick.get("kind", "")), String(fpick.get("tier", "")), String(fpick.get("feat_id", "")))
if not adr._node_curio_pending.is_empty() and adr._node_curio_pending.has("incoming"):
adr.resolve_curio_replace(-1) # 满位替换:放弃新件
else:
st.result = "advance_failed"
elif t == "rest":
@@ -310,13 +307,6 @@ static func _pick_token(candidates: Array, feat_mode: String = "off") -> Diction
return best
# 同调位满位替换子交互(确定性策略:放弃新件不获取——分发面按停点上下文裁决节点/通关渠道)
static func _on_adventure_treasure_replace(items: Array, incoming: Dictionary, st: Dictionary, adr) -> void:
st.reward_events.append({"treasure_replace": incoming.duplicate(true)})
if not adr.resolve_curio_replace(-1):
st.result = "advance_failed"
# 三选一兑付完成 → 上下文分派(通关停点=推进下一关 / 奖励节点=回图选路)
static func _on_adventure_curio_resolved(result: Dictionary, st: Dictionary, adr) -> void:
st.reward_events.append({"curio_resolved": result.duplicate(true)})
+4 -6
View File
@@ -649,7 +649,7 @@ func _smoke_adventure() -> void:
break
check(not has_attack13,
"奖励节点共享池:令牌耗尽同样不出候选(同库同池——%s)" % str(ncands13))
a13.present_node_curio(ncands13, ndraw.get("aux_detail", []) as Array)
a13.present_node_curio(ncands13)
a13.present_node_curio([{"kind": "gp", "tier": "common"}])
var gp13 := int(a13.ledger.get("gp", 0))
check(a13.apply_node_curio("gp", "common") and int(a13.ledger.get("gp", 0)) == gp13 + int(_db.adventure.curio_value("gp", "common")),
@@ -750,7 +750,7 @@ func _smoke_feats() -> void:
var stock_before := {}
for kk in ["attack", "gp", "heal"]:
stock_before[kk] = a_t.pool_stock(kk)
a_t._node_curio_pending = {"candidates": [{"kind": "feat_ticket", "tier": "excellent"}, {"kind": "attack", "tier": "common"}], "aux_detail": []}
a_t._node_curio_pending = {"candidates": [{"kind": "feat_ticket", "tier": "excellent"}, {"kind": "attack", "tier": "common"}]}
check(a_t.apply_node_curio("feat_ticket", "excellent"), "A5 门票兑付受理(节点渠道——拿到即开)")
var tkt_cands: Array = (a_t.node_curio_pending_state().get("candidates", []) as Array)
var tkt_all_relic := tkt_cands.size() > 0
@@ -1040,11 +1040,9 @@ func _adv_drive_to_shop(a, st: Dictionary, autoplay) -> bool:
var ndraw: Dictionary = a.node_curio_candidates()
var ncands: Array = ndraw.get("candidates", []) as Array
if not ncands.is_empty():
a.present_node_curio(ncands, ndraw.get("aux_detail", []) as Array)
a.present_node_curio(ncands)
var npick: Dictionary = autoplay._pick_token(ncands)
if a.apply_node_curio(String(npick.get("kind", "")), String(npick.get("tier", "")), String(npick.get("feat_id", ""))):
if not a._node_curio_pending.is_empty() and a._node_curio_pending.has("incoming"):
a.resolve_curio_replace(-1)
a.apply_node_curio(String(npick.get("kind", "")), String(npick.get("tier", "")), String(npick.get("feat_id", "")))
r.continue_after_node()
elif t == "rest":
r.continue_after_node()
+1 -1
View File
@@ -34,7 +34,7 @@ func _ready() -> void:
main.save_manager.set_breakpoint({
"master_seed": 42, "rng_counter": 0, "hero_hp": 20, "gp": 24, "keystone": 4,
"level_index": 1, "bonus": {}, "shop_purchased": {}, "relics": [],
"bonus_aux_carry": [], "keystone_drops": [], "bonus_taken": {},
"keystone_drops": [], "bonus_taken": {},
})
main._refresh_resume_button()
await get_tree().process_frame
+5 -9
View File
@@ -262,14 +262,12 @@ func _ready() -> void:
continue
if main.curio_overlay.visible:
# 迭代 10 三选一停点(CurioPickOverlay——奖励节点/通关兑付共用面;T17 硬锁批适配——
# 本探针此前未适配该层,走到即卡死)。三态分派:替换子态(满位——放弃新件)/
# result 态(兑付反馈——点继续推进)/ 待选态(点首件+确认)。真实信号路径全线。
# T1 D1——三选一停点输入锁定断言(停点态断言面:替换子/待选/兑付三态共用此层)。
# 本探针此前未适配该层,走到即卡死)。两态分派:result 态(兑付反馈——点继续推进)/
# 待选态(点首件+确认)。真实信号路径全线。〔替换子态随迭代 22 T5 拆除——装配不可变契约。〕
# T1 D1——三选一停点输入锁定断言(停点态断言面:待选/兑付两态共用此层)。
if not main._input_locked():
_problems.append("三选一停点打开时输入未锁定")
if main.curio_overlay._replace_box.visible:
main.curio_overlay.replace_chosen.emit(-1)
elif main.curio_overlay._continue_btn.visible:
if main.curio_overlay._continue_btn.visible:
main.curio_overlay.press_continue()
elif main.adventure != null and not main.adventure._curio_pending.is_empty():
main.curio_overlay.press_card(0)
@@ -409,9 +407,7 @@ func _ready() -> void:
else:
break
elif main.curio_overlay.visible:
if main.curio_overlay._replace_box.visible:
main.curio_overlay.replace_chosen.emit(-1)
elif main.curio_overlay._continue_btn.visible:
if main.curio_overlay._continue_btn.visible:
main.curio_overlay.press_continue()
elif main.adventure != null and not main.adventure._curio_pending.is_empty():
main.curio_overlay.press_card(0)
+1 -1
View File
@@ -198,7 +198,7 @@ func _resume_bp_fixture() -> Dictionary:
return {
"master_seed": 42, "rng_counter": 0, "hero_hp": 20, "gp": 24, "keystone": 0,
"level_index": 1, "bonus": {}, "shop_purchased": {}, "relics": [],
"bonus_aux_carry": [], "keystone_drops": [], "bonus_taken": {},
"keystone_drops": [], "bonus_taken": {},
"bonus_pending": {"candidates": [{"kind": "heal", "tier": "common"}], "payload": {"gp_dropped": 0}},
}