test(迭代35卡②T3 尾缀对齐): 本批新落地断言补可 grep 尾缀(〔v2〕入口候选数=参数档 entry_count 与第二入口进入/〔v5〕商店三性质与扫描面非空/〔v7〕同档同种子两次产图同图·起关图=生成器直取·种子 42 两开局同图·断点重生成同图·同种子重开局同图/〔v8〕快照代差标记·句柄往返·旧断点拒绝/〔v9〕快照无已抽模板键·表无 templates 键/〔v4〕三关图各含奖励节点)+商店宿主重复段头清理——独立审计第 1 件(对照表逐行核尾缀可 grep)的执行面;四宿主复跑 21/176/138 全绿零错误行

This commit is contained in:
DKChan committed 2026-10-24 19:35:01 +08:00
1 parent 4cec838f0e
commit 3461e83bec
5 files changed
+30 -24

No files matched your search

@@ -40,7 +40,7 @@ func _smoke_generated_map_determinism() -> void:
var g_b: Dictionary = gen.generate(params2, 910002)
var g_c: Dictionary = gen.generate(params2, 910003)
var nodes_a: Array = g_a.get("nodes", [])
Kit.check("同参数档同种子两次产图逐位同图(D2 执行边界)",
Kit.check("同参数档同种子两次产图逐位同图(D2 执行边界)〔v7〕",
nodes_a == (g_b.get("nodes", []) as Array))
Kit.check("同参数档换种子即变图(图确为种子函数,非恒定输出)",
nodes_a != (g_c.get("nodes", []) as Array))
@@ -50,7 +50,7 @@ func _smoke_generated_map_determinism() -> void:
var runner1 = load("res://core/level_runner.gd").new(_db, _fresh_rng(910004))
Kit.check("单关起关受理(种子 910004——生成图直供,无兜底图)",
runner1.start_level(2, 910004))
Kit.check("起关生效图 = 生成器同档同种子直取逐位一致(消费侧无第二图源)",
Kit.check("起关生效图 = 生成器同档同种子直取逐位一致(消费侧无第二图源)〔v7〕",
runner1.level_row.get("nodes", []) == (gen.generate(params2, 910004) as Dictionary).get("nodes", []))
# ③ 产图零统一流消费(纯派生流不占计数器号位——断点在任意号位重生成同图的机制承载)
var rng_c = _fresh_rng(910005)
@@ -61,11 +61,11 @@ func _smoke_generated_map_determinism() -> void:
Kit.check("起关产图零计数器消费(同图不依赖取数号位)", rng_c.counter() == counter_before)
var params3: Dictionary = _db.level_gen_params_row(3)
var entry_count: int = int(params3.get("entry_count", -1))
Kit.check("入口停点候选数=参数档入口个数(L3 档 %d——多入口首跳即选路,禁写死单入口)" % entry_count,
Kit.check("入口停点候选数=参数档入口个数(L3 档 %d——多入口首跳即选路,禁写死单入口)〔v2〕" % entry_count,
entry_count >= 1 and (runner2.next_candidates() as Array).size() == entry_count)
if entry_count >= 2:
var eids: Array = runner2.next_candidate_ids()
Kit.check("第二入口经句柄显式进入(句柄 %d)" % int(eids[1]),
Kit.check("第二入口经句柄显式进入(句柄 %d)〔v2〕" % int(eids[1]),
runner2.pick_next_node(int(eids[1])) and int(runner2.current_node_id()) == int(eids[1]))
# ④ 开局种子承载:新档(首局)种子 42 两次开局逐位同图,且与生成器直取一致
DirAccess.remove_absolute(_bp_path) # 测试隔离——上轮落盘残留先删,断点面从零档起
@@ -77,7 +77,7 @@ func _smoke_generated_map_determinism() -> void:
var adr_y = AdventureRunnerScript.new(_db, _fresh_rng(42))
Kit.check("同种子第二次开局受理", adr_y.start_adventure(42,
{"hero_override": {}, "treasure_unlocked": {}}))
Kit.check("种子 42 两次开局图逐位同图(教学局恒同图——首局固定种子的确定性承载)",
Kit.check("种子 42 两次开局图逐位同图(教学局恒同图——首局固定种子的确定性承载)〔v7〕",
adr_x.runner().nodes() == adr_y.runner().nodes())
Kit.check("开局图 = L1 参数档在种子 42 下的生成图(开局无隐式取数分叉)",
adr_x.runner().nodes() == (gen.generate(_db.level_gen_params_row(1), 42) as Dictionary).get("nodes", []))
@@ -85,20 +85,20 @@ func _smoke_generated_map_determinism() -> void:
Kit.check("停点断点落盘在档", sv_w.has_breakpoint())
var bp: Dictionary = sv_w.breakpoint_snapshot()
var adr_z = AdventureRunnerScript.new(_db, load("res://core/rng_service.gd").new())
Kit.check("断点续玩受理(代差标记键在档)", adr_z.resume_adventure(bp,
Kit.check("断点续玩受理(代差标记键在档)〔v8〕", adr_z.resume_adventure(bp,
{"hero_override": {}, "treasure_unlocked": {}}))
Kit.check("续玩重生成图与中断前逐位同图", adr_z.runner().nodes() == adr_x.runner().nodes())
Kit.check("续玩重生成图与中断前逐位同图〔v7〕", adr_z.runner().nodes() == adr_x.runner().nodes())
var adr_old = AdventureRunnerScript.new(_db, load("res://core/rng_service.gd").new())
var bp_old: Dictionary = bp.duplicate(true)
bp_old.erase("graph_gen_v2") # 换代前旧断点形态(模板池时代无代差标记键)
Kit.check("缺生成图代差标记键的旧断点被显式拒绝(禁按新语义静默回放)",
Kit.check("缺生成图代差标记键的旧断点被显式拒绝(禁按新语义静默回放)〔v8〕",
adr_old.resume_adventure(bp_old, {}) == false)
# ⑥ 关卡表不再携带图数据(图源换代后 level 行只剩行级字段)
var tpl_free := true
for li in range(1, _db.level_count() + 1):
if (_db.level_row(li) as Dictionary).has("templates"):
tpl_free = false
Kit.check("level 表三行均无 templates 键(模板数据已清出)",
Kit.check("level 表三行均无 templates 键(模板数据已清出)〔v9〕",
tpl_free and _db.level_count() == 3)
# ⑦ 收束置位:新档 false → settle 置 true 恰一次(幂等)
var sv = SaveManagerScript.new(_bp_path + ".flag.json")