extends Node2D var _finished_count := 0 func _ready() -> void: GameState.start_new_run() var game := preload("res://scenes/game/game.tscn").instantiate() add_child(game) game.set_physics_process(false) var ship: CharacterBody2D = game.get_node("PlayerShip") ship.set_physics_process(false) ship.get_node("WeaponController").set_physics_process(false) var camera: Camera2D = ship.get_node("Camera2D") camera.offset = Vector2(3, 5) ship.velocity = Vector2(100, -40) ship.call("_destroy_ship") assert(ship.get("_is_destroyed") and ship.collision_layer == 0 and ship.velocity == Vector2.ZERO) assert(not ship.get_node("Sprite2D").visible and not ship.get_node("ShieldVisual").visible) var effect: Node = game.get_node("PlayerDestructionEffect") effect.set_process(false) assert(effect.get("_texture") == ship.get_node("Sprite2D").texture) assert(effect.get("_fragments").size() >= 4) assert(not game.has_node("DefeatOverlay")) assert(not effect.has_node("ExplosionAudio")) effect.finished.connect(func() -> void: _finished_count += 1) effect._process(0.2) assert(not effect.get("_detonated") and camera.offset != Vector2(3, 5)) for step in 18: effect._process(0.1) assert(not effect.get("_detonated") and not game.has_node("DefeatOverlay")) assert(effect.get("_smoke").size() > 0) effect._process(0.35) assert(effect.get("_detonated") and effect.get("_sparks").size() > 30) assert(effect.has_node("ExplosionAudio")) assert(effect.get_node("ExplosionAudio").stream.resource_path == "res://assets/sounds/effects/explosion.mp3") assert(not game.has_node("DefeatOverlay")) effect._process(2.7) assert(not game.has_node("DefeatOverlay")) effect._process(0.3) assert(game.has_node("DefeatOverlay") and _finished_count == 1) assert(camera.offset == Vector2(3, 5)) effect._process(0.1) ship.call("_destroy_ship") assert(_finished_count == 1) var deaths := 0 for child in game.get_children(): if child.name == "PlayerDestructionEffect": deaths += 1 assert(deaths == 1) for chassis in preload("res://scripts/game/ship_catalog.gd").SHIPS: var source := Sprite2D.new() source.texture = load(preload("res://scripts/game/ship_catalog.gd").texture_path(chassis)) source.scale = Vector2.ONE * 64.0 / source.texture.get_width() var variant := Node2D.new() variant.set_script(preload("res://scripts/game/player_destruction_effect.gd")) variant.configure(source, Vector2.ZERO, null) add_child(variant) variant.set_process(false) assert(variant.get("_fragments").size() >= 4) source.free() variant.queue_free() print("PLAYER_DESTRUCTION_TEST: PASS (ship texture fragments, collision shutdown, overload, detonation, delayed defeat, camera restoration, single death)") get_tree().quit()