82 lines
3.2 KiB
GDScript
82 lines
3.2 KiB
GDScript
extends Node2D
|
|
|
|
const SKILLS := preload("res://scripts/captain/captain_skills.gd")
|
|
const POI := preload("res://scripts/levels/exploration_poi.gd")
|
|
const PROJECTILE := preload("res://scripts/game/weapon_projectile.gd")
|
|
|
|
func _ready() -> void:
|
|
GameState.start_new_run()
|
|
var captain := GameState.captain
|
|
assert(SKILLS.IDS.size() == 16)
|
|
for id in ["scrap_collector","drone_commander"]:
|
|
assert(SKILLS.icon(id) != null)
|
|
captain.learning_points = 1
|
|
captain.skill_offers.assign([id])
|
|
assert(captain.train_skill(id))
|
|
assert(not captain.equip_skill(0,id),"Both new skills are passive")
|
|
for rank in range(4):
|
|
captain.skills.scrap_collector = rank
|
|
captain.parts = 0.0
|
|
for roll in 1000:
|
|
captain.roll_wreck_spare_part((roll+0.5)/1000.0)
|
|
assert(captain.parts == [0,150,250,400][rank],"Exact probability at each rank")
|
|
var threshold: float = [0.0,0.15,0.25,0.40][rank]
|
|
var before := captain.parts
|
|
assert(not captain.roll_wreck_spare_part(threshold))
|
|
assert(captain.parts == before)
|
|
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)
|
|
var inventory: ShipInventory = ship.get_node("ShipInventory")
|
|
var systems: Node = ship.get_node("ExtensionSystems")
|
|
systems.set_physics_process(false)
|
|
for rank in range(4):
|
|
captain.skills.scrap_collector = rank
|
|
var successes := 0
|
|
for value in range(1,61):
|
|
var wreck := StaticBody2D.new()
|
|
wreck.set_script(POI)
|
|
wreck.kind = "wreck"
|
|
wreck.player = ship
|
|
wreck.reward_seed = value
|
|
wreck.poi_id = "salvage:%d:%d" % [rank,value]
|
|
add_child(wreck)
|
|
wreck.set_physics_process(false)
|
|
var before := captain.parts
|
|
assert(wreck.claim())
|
|
var gained := captain.parts-before
|
|
assert(gained == 0.0 or gained == 1.0)
|
|
assert(not wreck.claim(),"Cannot roll or grant parts twice")
|
|
assert(captain.parts == before+gained)
|
|
successes += int(gained)
|
|
assert(successes == 0 if rank == 0 else successes > 0 and successes < 60)
|
|
await get_tree().process_frame
|
|
var target := Node2D.new()
|
|
target.position = Vector2(300,0)
|
|
add_child(target)
|
|
var baseline_dps := inventory.get_total_dps()
|
|
for rank in range(4):
|
|
captain.skills.drone_commander = rank
|
|
inventory.ammunition = 100
|
|
systems.activate(5)
|
|
assert(inventory.ammunition == 50)
|
|
var drones := get_tree().get_nodes_in_group("player_combat_drones")
|
|
assert(drones.size() == 3)
|
|
for drone in drones:
|
|
drone.set_physics_process(false)
|
|
drone._fire(target)
|
|
var count := 0
|
|
for child in get_children():
|
|
if child.get_script() == PROJECTILE:
|
|
assert(is_equal_approx(child.damage,baseline_dps*0.5/3.0*0.25*[1.0,1.1,1.2,1.3][rank]))
|
|
count += 1
|
|
child.free()
|
|
assert(count == 1)
|
|
assert(inventory.ammunition == 50,"No extra cost per drone shot")
|
|
assert(is_equal_approx(inventory.get_total_dps(),baseline_dps),"Ship weapons do not gain drone damage")
|
|
systems.reset_combat_state()
|
|
await get_tree().process_frame
|
|
print("SALVAGE_DRONE_SKILLS_TEST: PASS (16 skills, passive training, 0/15/25/40% probabilities, 240 wrecks, no double claims, three drones, actual projectile damage at all ranks, unchanged ammo cost and ship DPS)")
|
|
get_tree().quit()
|