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

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