extends SceneTree # Headless gameplay test: run with # godot --headless -s res://tests/test_asteroid_ship_collision.gd # Verifies that a ship touching an asteroid destroys BOTH the ship (removed # from the fleet) and the asteroid itself (mutual destruction), each # spawning its own coherent explosion VFX: light-burst blue for the ship, # debris brown for the asteroid. const CHECK_DELAY: float = 0.05 var main_scene: Node var fleet: Node var target_ship: Node var asteroid: Node2D var elapsed: float = 0.0 var stage: int = 0 func _initialize() -> void: var packed: PackedScene = load("res://world/Main.tscn") main_scene = packed.instantiate() root.add_child(main_scene) fleet = main_scene.get_node("Fleet") func _process(delta: float) -> bool: elapsed += delta match stage: 0: # Wait one tick so Fleet._ready() has run and fleet.ships is # populated before we grab a ship reference. target_ship = fleet.ships[0] var asteroid_scene: PackedScene = load("res://world/Asteroid.tscn") asteroid = asteroid_scene.instantiate() asteroid.position = target_ship.position asteroid.velocity = Vector2.ZERO main_scene.add_child(asteroid) stage = 1 elapsed = 0.0 return false 1: if elapsed < CHECK_DELAY: return false _check_results() return true return false func _check_results() -> void: var ship_destroyed: bool = not is_instance_valid(target_ship) var ship_removed_from_fleet: bool = fleet.ships.find(target_ship) == -1 var asteroid_destroyed: bool = not is_instance_valid(asteroid) var ship_vfx_ok: bool = false var asteroid_vfx_ok: bool = false for child in root.get_children(): if child is ShipExplosionVFX: ship_vfx_ok = true elif child is AsteroidExplosionVFX: asteroid_vfx_ok = true print("ship_destroyed=%s ship_removed_from_fleet=%s asteroid_destroyed=%s ship_vfx_ok=%s asteroid_vfx_ok=%s" % [ ship_destroyed, ship_removed_from_fleet, asteroid_destroyed, ship_vfx_ok, asteroid_vfx_ok ]) if ship_destroyed and ship_removed_from_fleet and asteroid_destroyed and ship_vfx_ok and asteroid_vfx_ok: print("TEST_ASTEROID_SHIP_COLLISION: PASS") quit(0) else: print("TEST_ASTEROID_SHIP_COLLISION: FAIL") quit(1)