merge: U2返工批落地——C1两刀终态+AC v1硬梯度重投+节点图池两规则重生成(模板0随重排)+完美L1杠杆提案+终态双窗读数(普通L2 10.6/13.6%完美L2 22/32.3%越带待批点丙);冒烟576/0五探针PASS doc三闸零新增 熵增闸PASS(design/qa图像白名单收编)
This commit is contained in:
commit
910d74cc89
32 files changed
+1094
-78
No files matched your search
+18
-15
@@ -662,17 +662,20 @@ func _smoke_ac_swap_guard() -> void:
|
||||
"主角 armor_class 在域内(%d——暂定基准随表走)" % int(_db.hero.armor_class))
|
||||
var ac_band := true
|
||||
var ac_detail := ""
|
||||
var heavy_names := ["熊地精重击手", "灰矮人重装手"] # U2 裁 v1 硬梯度(2026-09-29):逐行手设值 8/9,非精英编码位
|
||||
for row in _db.enemy.rows:
|
||||
var ac: int = int(row.get("armor_class", -1))
|
||||
var dname := String(row.get("display_name", "?"))
|
||||
var boss_row: bool = String(row.get("enemy_id", "")).ends_with("_chief") or \
|
||||
String(row.get("enemy_id", "")) == "drider" or String(row.get("enemy_id", "")) == "duergar_king"
|
||||
# 精英编码位现行不存在(registry/敌人系统:精英 P2 内容承载)——非 Boss 行全按杂鱼带 0~5
|
||||
var lo := 8 if boss_row else 0
|
||||
var hi := 12 if boss_row else 5
|
||||
var heavy_row: bool = dname in heavy_names
|
||||
# 杂鱼 0~5;重击手/重装手 8~9(U2 返工批手设精英值);Boss 8~12 台阶
|
||||
var lo := 8 if (boss_row or heavy_row) else 0
|
||||
var hi := 12 if boss_row else (9 if heavy_row else 5)
|
||||
if ac < lo or ac > hi:
|
||||
ac_band = false
|
||||
ac_detail += " %s:%d" % [String(row.get("display_name", "?")), ac]
|
||||
check(ac_band, "敌方 AC 行值在已裁带宽内(杂鱼 0~5·Boss 8~12——M-3 迭代 5 T4 投值批,越带行%s)" % [
|
||||
ac_detail += " %s:%d" % [dname, ac]
|
||||
check(ac_band, "敌方 AC 行值在已裁带宽内(杂鱼 0~5·重击手/重装手 8~9·Boss 8~12——迭代 5 返工批 v1 重投,越带行%s)" % [
|
||||
ac_detail if ac_detail != "" else "无"])
|
||||
# ③b Boss 台阶断言(关卡即台阶——L1 8 < L2 10 < L3 12)+ 首遇位教学位低 AC(≤3)
|
||||
var boss_ac := {}
|
||||
@@ -2708,17 +2711,17 @@ func _smoke_level_graph() -> void:
|
||||
var win_min = autoplay.run_level(_db, 42, 2, 200, 100, false, null, "normal", "min", 0)
|
||||
check(win_min.result == "victory", "L2·满配 min 路径通关(实测:%s)" % win_min.result)
|
||||
check(win_min.boss_depth == 9, "L2 Boss 以编号 9 解析(终点编号最大——商店房批重编号 8→9)")
|
||||
check(win_min.visited_ids == [0, 1, 3, 6, 8, 9], "min 路径 = 0→1→3(恢复)→6→8(商店零购离开)→9(实测 %s)" % str(win_min.visited_ids))
|
||||
check(win_min.visited_ids == [0, 1, 6, 8, 9], "min 路径 = 0→1→6→8(商店零购离开)→9(实测 %s——U2 返工批模板 0)" % str(win_min.visited_ids))
|
||||
check(win_min.choices >= 3, "选路口发生 %d 次(每节点兑付后——零自动推进)" % win_min.choices)
|
||||
var win_max := {}
|
||||
var max_seed := -1
|
||||
for s in range(42, 300):
|
||||
win_max = autoplay.run_level(_db, s, 2, 200, 100, false, null, "normal", "max", 0)
|
||||
if win_max.result == "victory" and win_max.visited_ids == [0, 2, 5, 7, 8, 9]:
|
||||
if win_max.result == "victory" and win_max.visited_ids == [0, 5, 7, 8, 9]:
|
||||
max_seed = s
|
||||
break
|
||||
check(max_seed > 0 and win_max.result == "victory" and win_max.visited_ids == [0, 2, 5, 7, 8, 9],
|
||||
"L2·满配 max 路径(经奖励点 2)通关 = 0→2→5→7→8(商店零购离开)→9(seed=%d,实测 %s %s)" % [max_seed, win_max.result, str(win_max.visited_ids)])
|
||||
check(max_seed > 0 and win_max.result == "victory" and win_max.visited_ids == [0, 5, 7, 8, 9],
|
||||
"L2·满配 max 路径(max 取最大编号候选)通关 = 0→5(重击手)→7→8(商店零购离开)→9(seed=%d,实测 %s %s——U2 返工批模板 0)" % [max_seed, win_max.result, str(win_max.visited_ids)])
|
||||
# ⑤ 零自动推进状态机(手动驱动——兑付确认 / 选路拒绝语义逐拍断言)
|
||||
var runner = load("res://core/level_runner.gd").new(_db, _fresh_rng(42))
|
||||
runner.set_hero_override(200, 100)
|
||||
@@ -2733,14 +2736,14 @@ func _smoke_level_graph() -> void:
|
||||
autoplay._autoplay_battle(runner, first, st, null)
|
||||
check(String(res_box.get("result", "")) == "victory" and runner.current_battle() == null and runner.awaiting_choice(),
|
||||
"首战胜利后:settlement 释放 + 进选路态(战斗胜利不再自动推进——接口漂移清偿)")
|
||||
check(runner.next_candidate_ids() == [1, 2], "入口岔路候选 = [1, 2]")
|
||||
check(not runner.pick_next_node(5) and runner.awaiting_choice(), "候选外编号拒绝且仍待选(拒绝语义)")
|
||||
check(runner.next_candidate_ids() == [1, 2, 3, 4, 5], "入口岔路候选 = [1, 2, 3, 4, 5](U2 返工批模板 0 五岔环廊——层宽 5)")
|
||||
check(not runner.pick_next_node(8) and runner.awaiting_choice(), "候选外编号拒绝且仍待选(拒绝语义)")
|
||||
check(runner.pick_next_node(2), "选编号 2(奖励点)受理")
|
||||
check(String(runner.current_node().get("type", "")) == "reward" and not runner.awaiting_choice(),
|
||||
"到达奖励点:直通兑付(确认前不出选路口)")
|
||||
check(runner.continue_after_node() and runner.awaiting_choice() and runner.next_candidate_ids() == [4, 5],
|
||||
"兑付确认后才出现选路口(continue_after_node 泛化语义)候选 = [4, 5]")
|
||||
check(runner.pick_next_node(4) and runner.current_battle() != null, "选编号 4(巨蜘蛛首遇)开战")
|
||||
check(runner.continue_after_node() and runner.awaiting_choice() and runner.next_candidate_ids() == [6, 7],
|
||||
"兑付确认后才出现选路口(continue_after_node 泛化语义)候选 = [6, 7]")
|
||||
check(runner.pick_next_node(6) and runner.current_battle() != null, "选编号 6(巨蜘蛛巢群)开战")
|
||||
# ⑥ L2 锚行首遇战:基线 0 加成 · 完美档(零盲挖 = 零踩雷上限口径)多种子扫描
|
||||
# (Package B 第 7 轮阶段拔高后锚行 45→50 退出绿档——13/12 全胜改多数胜 + 零踩雷恒要求,
|
||||
# 2026-09-23 拍板 B 接受现曲线;还原绿档需回调锚行血量,归用户决策)
|
||||
@@ -2805,7 +2808,7 @@ func _smoke_level_graph() -> void:
|
||||
branch3 += 1
|
||||
check(int(tcount3.battle) == 6 and int(tcount3.boss) == 1, "L3 普通战斗节点 = 6 + Boss 恒一(编号最大恒终点)")
|
||||
check(int(tcount3.reward) == 1 and int(tcount3.rest) == 1 and int(tcount3.shop) == 1, "L3 恢复节点 1(rest_heal_pct 行字段)+ 奖励节点 1(直通空态)+ 商店房节点 1(商店房批)")
|
||||
check(branch3 == 4, "L3 真实岔路 = %d 处(0→[1,2] · 1→[3,4] · 2→[4,5] · 4→[6,7])" % branch3)
|
||||
check(branch3 == 3, "L3 真实岔路 = %d 处(0→[1,2,3,4,5] · 2→[6,7] · 5→[6,7]——U2 返工批五岔环廊层宽 5)" % branch3)
|
||||
# ⑨ 跨表行完整:L3 每战斗/Boss 节点 (3, 编号) 在 board_gen 与 enemy 精确行(⑦ 的 bg_keys/en_keys 复用)
|
||||
var cross_ok3 := true
|
||||
for node in _level_active_nodes(3):
|
||||
|
||||
Reference in new issue
Block a user