extends SceneTree var failures: Array[String] = [] func _init() -> void: var scene: PackedScene = load("res://scenes/main/main.tscn") if scene == null: push_error("Could not load main.tscn") quit(1) return var main: Node = scene.instantiate() get_root().add_child(main) var player: Node = main.get_node_or_null("Player") if player == null: failures.append("Missing Player") elif not player.has_signal("combo_window_cleared"): failures.append("Player should expose combo_window_cleared") if not main.has_method("_play_combo_clear_animation"): failures.append("Main should implement _play_combo_clear_animation") if not main.has_method("_on_energy_changed"): failures.append("Main should implement _on_energy_changed") if not main.has_method("_on_health_changed"): failures.append("Main should implement _on_health_changed") if not main.has_method("_on_charge_changed"): failures.append("Main should implement _on_charge_changed") var status_bars: Node = main.get_node_or_null("RhythmFeedback/StatusBars") if status_bars == null: failures.append("Missing StatusBars") else: var health_bar := status_bars.get_node_or_null("HealthBar") if health_bar == null: failures.append("Missing HealthBar") elif not health_bar is ProgressBar: failures.append("HealthBar should be a ProgressBar") var energy_bar := status_bars.get_node_or_null("EnergyBar") if energy_bar == null: failures.append("Missing EnergyBar") else: for index: int in range(10): var segment := energy_bar.get_node_or_null("Segment%d" % index) if segment == null: failures.append("Missing energy segment %d" % index) elif not segment is Panel: failures.append("Energy segment %d should be a Panel" % index) var charge_bar := status_bars.get_node_or_null("ChargeBar") if charge_bar == null: failures.append("Missing ChargeBar") elif not charge_bar is ProgressBar: failures.append("ChargeBar should be a ProgressBar") elif main.has_method("_on_charge_changed") and main.has_method("_update_charge_bar_flash"): main.set("charge_bar", charge_bar) main.call("_on_charge_changed", 1.1, 1.1, true, true) main.call("_update_charge_bar_flash", 0.13) var flashing_alpha: float = charge_bar.modulate.a main.call("_on_charge_changed", 1.1, 1.1, true, true) if is_equal_approx(charge_bar.modulate.a, 1.0): failures.append("Ready charge updates should not reset ChargeBar flash alpha") if not is_equal_approx(charge_bar.modulate.a, flashing_alpha): failures.append("Ready charge updates should preserve ChargeBar flash alpha") var combo_window: Node = main.get_node_or_null("RhythmFeedback/ComboWindow") if combo_window == null: failures.append("Missing ComboWindow") else: for index: int in range(4): var slot := combo_window.get_node_or_null("Slot%d" % index) if slot == null: failures.append("Missing visual slot %d" % index) continue if not slot is PanelContainer: failures.append("Slot%d should be a PanelContainer" % index) if slot.get_node_or_null("Key") == null: failures.append("Slot%d should contain Key label" % index) main.free() if failures.is_empty(): print("PASS combo hud") quit(0) else: for failure: String in failures: push_error(failure) quit(1)