Randoloot/tests/items/external_turret_test.gd
2026-10-27 22:20:01 +01:00

121 lines
5.2 KiB
GDScript

extends Node2D
const DEFINITION := preload("res://resources/items/external_turret.tres")
const MACHINE_GUN := preload("res://resources/items/machine_gun.tres")
const GENERATOR := preload("res://scripts/items/item_generator.gd")
const LAB := preload("res://scripts/planets/laboratory.gd")
const PROJECTILE := preload("res://scripts/game/weapon_projectile.gd")
func _ready() -> void:
GameState.start_new_run()
GameState.captain.level = 30
assert(DEFINITION not in GENERATOR.available_definitions())
var progress: Resource = GameState.captain.expedition
progress.freighter_rooms.expansion_1 = "laboratory"
progress.laboratory_offers.assign(["external_turret"])
for key in LAB.COSTS.external_turret: GameState.captain.minerals[key] = 100
assert(LAB.start(GameState.captain,"external_turret"))
LAB.advance(progress,LAB.DURATION)
assert(DEFINITION in GENERATOR.available_definitions())
for level in [1,5,30,120,1000]:
var turret_item := ItemInstance.new()
turret_item.definition = DEFINITION
var machine_item := ItemInstance.new()
machine_item.definition = MACHINE_GUN
seed(327+level)
GENERATOR.roll_base_values(turret_item,level)
seed(327+level)
GENERATOR.roll_base_values(machine_item,level)
assert(turret_item.get_damage_range().is_equal_approx(machine_item.get_damage_range()*0.5))
for value in 20:
seed(value)
var turret_damage := turret_item.roll_damage()
seed(value)
assert(is_equal_approx(turret_damage,machine_item.roll_damage()*0.5))
var ship := preload("res://scenes/game/player_ship.tscn").instantiate()
add_child(ship)
ship.set_physics_process(false)
ship.get_node("WeaponController").set_physics_process(false)
ship.get_node("ExtensionSystems").set_physics_process(false)
var controller: Node = ship.get_node("WeaponController")
var inventory: ShipInventory = ship.get_node("ShipInventory")
var item := ItemInstance.new()
item.definition = DEFINITION
item.damage_min = 8.0
item.damage_max = 12.0
inventory.weapon_slots[0] = item
GameState.captain.skills.efficient_magazine = 3
GameState.captain.skills.drone_commander = 3
inventory.ammunition = 49
assert(not controller.try_deploy_turret(0))
assert(inventory.ammunition == 49 and get_tree().get_nodes_in_group("player_external_turrets").is_empty())
inventory.ammunition = 100
assert(controller.try_deploy_turret(0))
assert(inventory.ammunition == 50)
assert(not controller.try_deploy_turret(0),"Deployment cooldown prevents repeated clicks")
var turret: Node2D = get_tree().get_nodes_in_group("player_external_turrets")[0]
turret.set_physics_process(false)
assert(turret.ammunition == 50)
var anchor := turret.global_position
ship.position += Vector2(1000,1000)
turret._physics_process(0.1)
assert(turret.global_position == anchor and turret.ammunition == 50,"Stays in space and holds ammo without targets")
ship.position = Vector2.ZERO
var enemy := preload("res://scenes/game/enemy_ship.tscn").instantiate()
enemy.position = anchor+Vector2(250,0)
add_child(enemy)
enemy.set_physics_process(false)
enemy.hull = 10000.0
enemy.max_hull = 10000.0
enemy.shields = 0.0
enemy.absorption = Vector3.ZERO
enemy._player = ship
await get_tree().physics_frame
await get_tree().process_frame
assert(turret._find_target() == enemy)
var base_ammo := inventory.ammunition
# The turret retains its own item even if the weapon is modified or unequipped.
item.damage_min = 100.0
item.damage_max = 100.0
inventory.weapon_slots[0] = null
var shots := 0
for index in 50:
turret._fire(enemy)
for child in get_children():
if child.get_script() == PROJECTILE:
shots += 1
assert(child.damage >= 4.0 and child.damage <= 6.0)
assert(child.weapon_kind == ItemDefinition.WeaponKind.MACHINE_GUN)
assert(child.source_ship == ship)
if index == 0:
var hull_before: float = enemy.hull
child._hit_target(enemy)
assert(enemy.hull < hull_before,"Turret bullets really damage enemies")
child.free()
assert(shots == 50 and turret.ammunition == 0)
assert(turret.is_queued_for_deletion())
assert(inventory.ammunition == base_ammo,"Only prepaid ammunition is used")
turret._fire(enemy)
assert(turret.ammunition == 0,"Never shoots a 51st bullet")
await get_tree().process_frame
inventory.weapon_slots[0] = item
controller._shot_timers[0] = 0.0
ship.is_docked = true
assert(not controller.try_deploy_turret(0) and inventory.ammunition == base_ammo)
ship.is_docked = false
controller._fire_buttons_down[0] = true
controller._fire_just_pressed[0] = true
controller._physics_process(0.01)
assert(inventory.ammunition == 0)
var second: Node2D = get_tree().get_nodes_in_group("player_external_turrets")[0]
second.set_physics_process(false)
inventory.ammunition = 50
controller._physics_process(2.0)
assert(inventory.ammunition == 50 and get_tree().get_nodes_in_group("player_external_turrets").size() == 1,"Holding the mouse does not deploy more turrets")
ship.is_docked = true
second._physics_process(0.1)
assert(second.is_queued_for_deletion(),"Docking clears deployed turrets")
await get_tree().create_timer(0.5).timeout
print("EXTERNAL_TURRET_TEST: PASS (laboratory unlock, exact half machine-gun damage at five levels, 50 prepaid ammo despite ammo skill, placement/cooldown/docking, fixed position, target acquisition, 50 real bullets and damage, snapshot, exhaustion cleanup)")
get_tree().quit()