93 lines
3.7 KiB
GDScript
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()
|