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