extends Node const BAL = preload("res://scripts/captain/captain_balance.gd") const ENEMY = preload("res://scenes/game/enemy_ship.tscn") const POI = preload("res://scripts/levels/exploration_poi.gd") func _ready() -> void: assert(BAL.xp_required(1) == 120 and BAL.xp_required(2) == 180) var captain := CaptainProgress.new() for level in range(1, 1001): assert(BAL.xp_required(level) == 120 + 60 * (level - 1)) for gap in range(0, 12): captain.level = 20 + gap var xp := captain.reward_enemy(20, 0, 1.0, 1.0).x var expected := roundi(39.0 * BAL.encounter_xp_factor(20 + gap, 20)) assert(xp == expected) captain.level = 9 assert(captain.encounter_xp(1000000, 1, 1000) == 0) var money := captain.credits assert(captain.reward_enemy(1, 0, 1.0, 1.0) == Vector2i(0, 15)) assert(captain.credits == money + 15) captain = CaptainProgress.new() for index in 20000: captain.reward_enemy(1, index % 3, 1.0, 1.0) assert(captain.level == 9) assert(captain.encounter_xp(20, 1) == 0) assert(captain.reward_enemy(9, 0, 1.0, 1.0).x > 0) # Normal progress still reaches later captain levels. captain = CaptainProgress.new() for level in range(1, 51): for tier in preload("res://scripts/levels/level_balance.gd").enemy_tiers(level): captain.reward_enemy(level, tier, 1.0, 1.0) assert(captain.level >= 39 and captain.level <= 41) print("NORMAL_PROGRESS_CAPTAIN_LEVEL_AT_50: ", captain.level) GameState.start_new_run() 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 inv: ShipInventory = ship.get_node("ShipInventory") assert(inv.ammunition == 200) inv.ammunition = 123 inv.preserve_for_restart() ship.queue_free() await get_tree().process_frame 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) inv = ship.get_node("ShipInventory") assert(inv.ammunition == 123, "Restart must preserve ammunition, not grant another starting stack") var ammo_wrecks := 0 for level in [1, 50]: GameState.system_level = level for reward_seed in range(1, 50): var poi := StaticBody2D.new() poi.set_script(POI) poi.kind = "wreck" poi.player = ship poi.reward_seed = reward_seed poi.poi_id = "balance:%d:%d" % [level, reward_seed] add_child(poi) var state: int = poi._rng.state var choice: int = poi._rng.randi_range(0, 3) poi._rng.state = state if choice == 3: var before := inv.ammunition assert(poi.claim()) assert(inv.ammunition - before >= 40 and inv.ammunition - before <= 60) ammo_wrecks += 1 else: poi.queue_free() assert(ammo_wrecks > 10) var enemy := ENEMY.instantiate() add_child(enemy) enemy.set_physics_process(false) enemy.apply_level_settings(1, 2) assert(is_equal_approx(enemy.max_hull, 240.0)) assert(is_equal_approx(enemy.max_shields, 96.0)) assert(is_equal_approx(enemy.weapon_damage, 32.0)) assert(is_equal_approx(enemy.approach_speed, 99.2)) var previous_hull: float = enemy.max_hull for level in range(2, 7): enemy.apply_level_settings(level, 2) assert(enemy.max_hull > previous_hull) previous_hull = enemy.max_hull assert(is_equal_approx(enemy.max_hull, 500.0)) enemy.apply_level_settings(1, 0) assert(is_equal_approx(enemy.max_hull, 62.5) and is_equal_approx(enemy.weapon_damage, 10.0)) print("BALANCE_ADJUSTMENTS_TEST: PASS XP thresholds, farm limit, normal progression, starting/restart ammo, actual wreck rewards and smooth boss introduction") get_tree().quit()