111 lines
4.8 KiB
GDScript
111 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()
|
|
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,60)
|
|
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()
|