Randoloot/tests/items/player_destruction_test.gd

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()