Randoloot/tests/ships/debug_ammo_drone_formation_test.gd
2026-10-16 23:36:49 +02:00

64 lines
2.9 KiB
GDScript

extends Node
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 := game.get_node("PlayerShip") as CharacterBody2D
ship.set_physics_process(false)
ship.get_node("WeaponController").set_physics_process(false)
var systems := ship.get_node("ExtensionSystems")
systems.set_physics_process(false)
for enemy in get_tree().get_nodes_in_group("enemies"):
enemy.queue_free()
await get_tree().process_frame
var hud := game.get_node("HUD")
hud.call("_toggle_debug")
var inventory := ship.get_node("ShipInventory") as ShipInventory
var before := Vector3i(inventory.ammunition, inventory.irradiated_ammunition, inventory.missile_ammunition)
var button := hud.get_node("HUDRoot/DebugActions/AddAmmunition") as Button
button.pressed.emit()
button.pressed.emit()
assert(Vector3i(inventory.ammunition, inventory.irradiated_ammunition, inventory.missile_ammunition) == before + Vector3i(20, 20, 20))
systems.call("activate", 5)
var drones := get_tree().get_nodes_in_group("player_combat_drones")
assert(drones.size() == 3)
for drone in drones:
drone.set_physics_process(false)
assert(drone.scale == Vector2(0.5, 0.5))
# Stationary formation converges to fixed positions in front, with no idle orbit.
_step(ship, drones, 120)
for drone in drones:
assert(drone.global_position.distance_to(drone.call("formation_position")) < 2.0)
assert((drone.global_position - ship.global_position).dot(Vector2.UP.rotated(ship.rotation)) > 60.0)
# Forward flight and a turn inherit mother velocity without position snapping.
ship.velocity = Vector2(0, -200)
var previous_velocity: Vector2 = drones[0].get("velocity")
_step(ship, drones, 1)
assert((drones[0].get("velocity") as Vector2).distance_to(previous_velocity) <= 650.0 / 60.0 + 0.01)
_step(ship, drones, 119)
for drone in drones:
assert(drone.global_position.distance_to(drone.call("formation_position")) < 12.0)
ship.set("angular_velocity", 0.6)
_step(ship, drones, 120, true)
for drone in drones:
assert(drone.global_position.distance_to(drone.call("formation_position")) < 15.0)
ship.set("angular_velocity", 0.0)
ship.velocity = Vector2.ZERO
_step(ship, drones, 120)
for drone in drones:
assert(drone.global_position.distance_to(drone.call("formation_position")) < 2.0)
assert((drone.get("velocity") as Vector2).length() < 3.0)
print("DEBUG_AMMO_DRONE_FORMATION_TEST: PASS (debug ammo x10 repeatable, half scale, fixed forward formation, acceleration bound, moving/turning mother tracking, smooth stop)")
get_tree().quit()
func _step(ship: CharacterBody2D, drones: Array[Node], frames: int, turning := false) -> void:
for frame in frames:
if turning:
ship.rotation += 0.6 / 60.0
ship.velocity = Vector2.UP.rotated(ship.rotation) * 200.0
ship.position += ship.velocity / 60.0
for drone in drones:
drone.call("_physics_process", 1.0 / 60.0)