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