121 lines
5.2 KiB
GDScript
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()
|