extends SceneTree const BattleStateScript := preload("res://scripts/core/battle_state.gd") func _init() -> void: var failures: Array[String] = [] _check_contains( failures, "001 HUD progress", _progress_text("res://data/scenarios/001_yellow_turbans.json", false), "Enemies defeated 0/" ) _check_contains( failures, "001 briefing progress", _progress_text("res://data/scenarios/001_yellow_turbans.json", true), "Allies remaining" ) _check_contains( failures, "002 gated victory progress", _progress_text("res://data/scenarios/002_sishui_gate.json", false), "Objective unlocks on Turn 2" ) _check_contains( failures, "002 pending enemy progress", _progress_text("res://data/scenarios/002_sishui_gate.json", false), "Enemies defeated 0/" ) _check_contains( failures, "007 destination progress", _progress_text("res://data/scenarios/007_xian_emperor_escort.json", false), "Destination (14, 5): not reached" ) _check_contains( failures, "007 protected-unit risk progress", _progress_text("res://data/scenarios/007_xian_emperor_escort.json", true), "Imperial Envoy safe" ) _check_contains( failures, "045 gated destination progress", _progress_text("res://data/scenarios/045_fancheng_relief.json", false), "Reach (10, 5): not reached" ) if failures.is_empty(): print("objective progress smoke ok") quit(0) return for failure in failures: push_error(failure) quit(1) func _progress_text(path: String, include_defeat_risks: bool) -> String: var state = BattleStateScript.new() if not state.load_battle(path): return "" % path return state.get_objective_progress_text(include_defeat_risks) func _check_contains(failures: Array[String], label: String, text: String, expected: String) -> void: if text.contains(expected): return failures.append("%s expected `%s` in `%s`" % [label, expected, text])