73 lines
3.2 KiB
GDScript
73 lines
3.2 KiB
GDScript
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"))
|
|
var start_position: Vector2 = effect.global_position
|
|
assert(effect.get("_drift") == Vector2(100, -40))
|
|
effect.finished.connect(func() -> void: _finished_count += 1)
|
|
effect._process(0.2)
|
|
assert(effect.global_position.is_equal_approx(start_position + Vector2(20, -8)))
|
|
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))
|
|
assert(effect.global_position.is_equal_approx(start_position + Vector2(100, -40) * 5.35))
|
|
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)
|
|
# A drifting wreck must retain its velocity even after the visual cleanup.
|
|
effect._process(2.0)
|
|
var coasting_position: Vector2 = effect.global_position
|
|
effect._process(0.5)
|
|
assert(effect.global_position.is_equal_approx(coasting_position + Vector2(50, -20)))
|
|
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()
|