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 leaving # its own coherent VFX behind. # # #130 changed what the ship leaves. Its death is a sequence now - the hull # breaks away from the fleet, drifts clear, and explodes out there - so what # exists on the frame of the collision is the WRECK, and the explosion comes # later, somewhere else. That the wreck really does drift and really does go # up is test_ship_death's job; what matters here is that the collision still # ends the ship, ends the rock, and leaves each of them something to look at. 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 ShipWreckVFX: 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)