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