# tests/unit/battle_settlement/boss_gate_test.gd — Boss 节点开战必选 Boss 行集(端到端) # 断言面 = 行类路由(resolver:boss 行集全行 boss / battle 行集零 boss 行)+端到端 # (begin_battle(node_type="boss") → 实例化敌人全部出自 boss 行集)。固定种子经 RngService 流口。 # 运行:godot --headless --path game --script res://tests/unit/battle_settlement/boss_gate_test.gd extends SceneTree const Kit := preload("res://tests/unit/test_kit.gd") func _init() -> void: # 判据出处: design/gdd/systems/战斗循环/敌人系统.md:293 Boss 节点开战行集宿主(装载组) _test_boss_node_spawns_boss_rowset() quit(Kit.finish("boss_gate_test")) func _test_boss_node_spawns_boss_rowset() -> void: # 判据出处: design/gdd/systems/战斗循环/敌人系统.md:295 开战生成按遭遇坐标取行集(Boss 行集组) var db = load("res://core/config_db.gd").new() var load_ok: bool = db.load_tables("res://data/tables", true) and db.diagnostics_count("error") == 0 Kit.check("前置:表加载零 error", load_ok) if not load_ok: return var rng = load("res://core/rng_service.gd").new() rng.set_master_seed(20261103) # 固定种子经 RngService 流口(RNG 单点) # 行类路由面:resolver 预解析(boss 行集全行 row_kind=="boss";对照 battle 行集零 boss 行) var boss_ids := {} var battle_ids := {} var boss_kind_ok := true for row in db.combat.enemy.resolve_rowset(1, 4, "boss"): boss_ids[String(row["enemy_id"])] = true if String(row["row_kind"]) != "boss": boss_kind_ok = false var battle_kind_ok := true for row in db.combat.enemy.resolve_rowset(1, 4, "battle"): battle_ids[String(row["enemy_id"])] = true if String(row["row_kind"]) == "boss": battle_kind_ok = false Kit.check("行类路由:boss 行集非空全行 boss、battle 行集非空零 boss 行〔断言补齐批 V10〕", boss_kind_ok and battle_kind_ok and boss_ids.size() > 0 and battle_ids.size() > 0) # 端到端:begin_battle(node_type="boss") → 实例化敌人行键全部出自 boss 行集 var oc = load("res://core/battle_orchestrator.gd").new(db, rng) var ok_boss: bool = oc.begin_battle({"level_index": 1, "node_depth": 4, "hero_hp": int(db.combat.hero.max_hp), "node_type": "boss"}) Kit.check("前置:boss 节点开局受理(L1 D4 Boss 行集)", ok_boss) if not ok_boss: return var all_from_boss := true for u in oc._enemy_system.all_enemies(): if not boss_ids.has(String(u["enemy_id"])): all_from_boss = false Kit.check("Boss 节点开战必选 Boss 行集(实例化敌人全部出自 boss 行集——跨宿主真实入口链)〔断言补齐批 V10〕", all_from_boss)