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

112 lines
4.8 KiB
GDScript

extends Node2D
const PULSE := preload("res://resources/items/pulse_laser.tres")
const BEAM := preload("res://resources/items/beam_laser.tres")
const GEN := preload("res://scripts/items/item_generator.gd")
const LAB := preload("res://scripts/planets/laboratory.gd")
class StraightLaser extends "res://scripts/game/weapon_controller.gd":
func _aim_direction_from(_origin: Vector2) -> Vector2: return Vector2.RIGHT
class ForcedPulse extends ItemInstance:
var bypass := false
func roll_shield_piercing(_roll: float = -1.0) -> float:
return 1.0 if bypass else shield_piercing()
func _ready() -> void:
GameState.start_new_run()
GameState.captain.level = 30
assert(PULSE not in GEN.available_definitions())
var progress: Resource = GameState.captain.expedition
progress.freighter_rooms.expansion_1 = "laboratory"
progress.laboratory_offers.assign(["pulse_laser"])
for key in LAB.COSTS.pulse_laser: GameState.captain.minerals[key] = 100
assert(LAB.start(GameState.captain,"pulse_laser"))
LAB.advance(progress,LAB.DURATION)
assert(PULSE in GEN.available_definitions())
var pulse := ItemInstance.new()
pulse.definition = PULSE
var beam := ItemInstance.new()
beam.definition = BEAM
var successes := 0
for value in 1000: successes += int(pulse.roll_shield_piercing((value+0.5)/1000.0) == 1.0)
assert(successes == 500)
assert(pulse.roll_shield_piercing(0.5) == 0.0)
assert(beam.roll_shield_piercing(0.0) == 0.0)
pulse.special_orbs.assign(["piercing"])
assert(pulse.roll_shield_piercing(0.49) == 1.0 and pulse.roll_shield_piercing(0.5) == 0.5)
pulse.special_orbs.clear()
for level in [1,5,30,120,1000]:
seed(457+level)
GEN.roll_base_values(pulse,level)
seed(457+level)
GEN.roll_base_values(beam,level)
assert(pulse.get_damage_range().is_equal_approx(beam.get_damage_range()*0.7))
assert(is_equal_approx(pulse.get_energy_cost(),beam.get_energy_cost()*1.3))
for value in 20:
seed(value)
var damage := pulse.roll_damage()
seed(value)
assert(is_equal_approx(damage,beam.roll_damage()*0.7))
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 := StraightLaser.new()
ship.add_child(controller)
controller.set_physics_process(false)
var enemy := preload("res://scenes/game/enemy_ship.tscn").instantiate()
enemy.position = Vector2(240,-28)
add_child(enemy)
enemy.set_physics_process(false)
enemy._player = ship
enemy.max_hull = 10000.0
enemy.max_shields = 1000.0
enemy.absorption = Vector3.ZERO
var item := ForcedPulse.new()
item.definition = PULSE
item.damage_min = 10.0
item.damage_max = 10.0
await get_tree().physics_frame
await get_tree().process_frame
for bypass in [false,true]:
enemy.hull = 10000.0
enemy.shields = 1000.0
item.bypass = bypass
controller._shot_timers[0] = 0.0
ship.energy = 1000.0
controller._fire_laser(0,item)
assert(is_equal_approx(ship.energy,1000.0-item.get_energy_cost()))
assert(enemy.hull == 10000.0 and enemy.shields == 1000.0,"A pulse does not hit instantly")
var bolts := get_children().filter(func(child): return child.get_script() == preload("res://scripts/game/weapon_projectile.gd"))
assert(bolts.size() == 1)
var bolt: Area2D = bolts[0]
bolt.set_physics_process(false)
assert(bolt.weapon_effect == "pulse_laser" and bolt.projectile_speed == 1500.0)
assert(bolt.shield_piercing == (1.0 if bypass else 0.0))
var origin := bolt.global_position
bolt._physics_process(0.04)
assert(is_equal_approx(bolt.global_position.distance_to(origin),60.0))
assert(enemy.hull == 10000.0 and enemy.shields == 1000.0,"Damage waits for arrival")
bolt._physics_process(0.2)
assert(is_equal_approx(enemy.hull,9993.0 if bypass else 10000.0))
assert(is_equal_approx(enemy.shields,1000.0 if bypass else 993.0))
assert(not controller._laser_lines[0].visible and controller._laser_pulse_timers[0] == 0.0)
bolt.free()
# Full bypass also stays full with the alien double-hit technology.
progress.alien_skills.weapons_a_next_next_next = true
enemy.hull = 10000.0
enemy.shields = 1000.0
controller._apply_damage(enemy,7.0,false,1.0,DamageTypes.Type.ENERGY)
assert(enemy.shields == 1000.0 and enemy.hull == 9993.0)
progress.alien_skills.clear()
controller._shot_timers[0] = 0.0
ship.energy = item.get_energy_cost()-0.01
var before: float = enemy.hull
controller._laser_lines[0].visible = false
controller._fire_laser(0,item)
assert(enemy.hull == before and not controller._laser_lines[0].visible)
print("PULSE_LASER_TEST: PASS (laboratory unlock, 50% full bypass and orb compatibility, -30% damage/+30% energy at five levels, moving 1500px/s red projectiles, no instant damage, shields/hull routing on impact, technology compatibility, insufficient energy)")
get_tree().quit()