Randoloot/tests/abilities/auxiliary_shield_test.gd
2026-10-26 19:33:45 +01:00

108 lines
5.0 KiB
GDScript

extends Node2D
const DEFINITION := preload("res://resources/items/auxiliary_shield.tres")
const GEN := preload("res://scripts/items/item_generator.gd")
const LAB := preload("res://scripts/planets/laboratory.gd")
func _ready() -> void:
GameState.start_new_run()
assert(DEFINITION not in GEN.available_definitions())
var captain := GameState.captain
var progress: Resource = captain.expedition
progress.freighter_rooms.expansion_1 = "laboratory"
progress.laboratory_offers.assign(["auxiliary_shield"])
for key in LAB.COSTS.auxiliary_shield: captain.minerals[key] = 100
assert(LAB.start(captain,"auxiliary_shield"))
LAB.advance(progress,60)
assert(DEFINITION in GEN.available_definitions())
var item := GEN.generate_for_definition(DEFINITION,30)
assert(item.additional_modifiers.is_empty() and item.definition.icon != null)
item.extension_cooldown = 30
var ship := preload("res://scenes/game/player_ship.tscn").instantiate()
ship.get_node("Camera2D").enabled = false
add_child(ship)
ship.set_physics_process(false)
ship.get_node("WeaponController").set_physics_process(false)
var systems := ship.get_node("ExtensionSystems")
systems.set_physics_process(false)
ship.get_node("ShipInventory").extension_slots[0] = item
ship.max_energy = 200.0
ship.max_shields = 120.0
ship.shields = 120.0
ship.hull = 100.0
ship.absorption = Vector3.ZERO
ship.energy = 139.99
assert(not ship.activate_ability(0))
assert(ship.auxiliary_shields == 0.0 and not systems.cooldowns.has("auxiliary_shield"))
ship.energy = 140.0
assert(ship.activate_ability(0))
assert(ship.energy == 0.0 and ship.auxiliary_shields == 60.0 and ship.auxiliary_max_shields == 60.0)
assert(ship.shields == 120.0 and ship.hull == 100.0)
var outer: Node2D = ship.get_node("AuxiliaryShieldVisual")
assert(is_equal_approx(outer.shield_radius,ship.get_node("ShieldVisual").shield_radius*1.45))
assert(ship.get_active_shield_visual() == outer)
ship.take_damage(25.0)
assert(ship.auxiliary_shields == 35.0 and ship.shields == 120.0 and ship.hull == 100.0)
ship.take_damage(50.0)
assert(ship.auxiliary_shields == 0.0 and ship.shields == 105.0 and ship.hull == 100.0)
ship.take_damage(200.0)
assert(ship.shields == 0.0 and ship.hull == 5.0)
ship.energy = 200.0
assert(not ship.activate_ability(0),"Normal extension cooldown applies")
systems._physics_process(30.0)
assert(ship.activate_ability(0),"Works with empty ordinary shields")
assert(ship.energy == 60.0 and ship.auxiliary_shields == 60.0)
systems._physics_process(30.0)
ship.energy = 200.0
assert(not ship.activate_ability(0) and ship.energy == 200.0,"Cannot stack or refill an active outer layer")
ship.max_shields = 200.0
ship._update_shield_visual()
assert(ship.auxiliary_shields == 60.0 and ship.auxiliary_max_shields == 60.0,"Capacity is captured at activation")
ship.clear_auxiliary_shield()
assert(ship.activate_ability(0) and ship.auxiliary_shields == 100.0)
await get_tree().physics_frame
await get_tree().physics_frame
var bolt := preload("res://scenes/game/weapon_projectile.tscn").instantiate()
bolt.enemy_shot = true
bolt.collision_mask = 2
bolt.configure(Vector2(-150,0),Vector2.RIGHT,ItemDefinition.WeaponKind.PLASMA,1200.0,20.0,1000.0)
add_child(bolt)
bolt.set_physics_process(false)
bolt._physics_process(0.25)
assert(bolt.is_queued_for_deletion())
assert(is_equal_approx(bolt.position.length(),outer.shield_radius),"Fast bullets stop on the larger perimeter")
assert(ship.auxiliary_shields == 80.0 and ship.shields == 0.0 and ship.hull == 5.0)
var hit: Dictionary = preload("res://scripts/game/shield_intersections.gd").intercept({},Vector2(-200,0),Vector2(200,0),2,[],get_tree())
assert(hit.collider == ship and is_equal_approx(hit.position.length(),outer.shield_radius),"Lasers hit the outer shield even with normal shields empty")
systems.reset_combat_state()
assert(ship.auxiliary_shields == 0.0)
ship.energy = 200.0
assert(ship.activate_ability(0))
captain.skills.power_redirect = 1
captain.equip_skill(0,"power_redirect")
ship.shields = ship.max_shields
assert(captain.activate_skill("power_redirect",ship))
assert(ship.auxiliary_shields == 0.0)
systems.cooldowns.clear()
ship.energy = 200.0
assert(not ship.activate_ability(0))
captain.reset_combat_state()
ship.is_docked = true
assert(not ship.activate_ability(0))
ship.is_docked = false
assert(ship.activate_ability(0))
ship.is_docked = true
ship._physics_process(0.1)
assert(ship.auxiliary_shields == 0.0)
# Normal-shield emergency technologies must not trigger for absorbed hits.
ship.is_docked = false
ship.energy = 200.0
ship.shields = ship.max_shields
systems.cooldowns.clear()
assert(ship.activate_ability(0))
progress.alien_skills.shields_b_next_next = true
ship.take_damage(5.0)
assert(ship._salvo_cooldown == 0.0 and ship.auxiliary_shields == 95.0)
print("AUXILIARY_SHIELD_TEST: PASS (lab unlock, 70% max energy cost, 50% max shield snapshot, no stacking, outer-first damage and overflow, larger bullet/laser collision with empty main shields, cooldown, reset, power redirect and docking)")
get_tree().quit()