Randoloot/tests/levels/balance_adjustments_test.gd
2026-10-17 18:28:34 +02:00

93 lines
3.7 KiB
GDScript

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