Randoloot/tests/levels/hard_balance_test.gd
2026-10-19 22:33:24 +02:00

65 lines
3.1 KiB
GDScript

extends Node
const BALANCE := preload("res://scripts/levels/level_balance.gd")
const ENEMY := preload("res://scenes/game/enemy_ship.tscn")
func _ready() -> void:
GameState.start_new_run()
assert(BALANCE.MAX_LEVEL == 120)
assert(not BALANCE.is_hard(60) and BALANCE.is_hard(61))
var previous := 0.0
for level in range(1, 121):
var total := BALANCE.enemy_absorption_total(level)
assert(total >= previous and total <= (30.0 if level <= 60 else 60.0))
for seed_value in [1, 12345, 9876]:
var profile := DamageTypes.enemy_profile(level, seed_value)
var values: Vector3 = profile.absorption
assert(is_equal_approx(values.x + values.y + values.z, total))
assert(values.x >= 0 and values.y >= 0 and values.z >= 0)
previous = total
assert(is_equal_approx(BALANCE.enemy_absorption_total(60), 30.0))
assert(is_equal_approx(BALANCE.enemy_absorption_total(120), 60.0))
assert(is_equal_approx(BALANCE.enemy_absorption_total(1000), 60.0))
var enemy := ENEMY.instantiate() as CharacterBody2D
add_child(enemy)
enemy.set_physics_process(false)
for level in [1, 3, 6, 30, 60, 61, 90, 120]:
var base_power: float = 1.0 + 0.05 * (level - 1)
var mode_factor := 2.0 if level > 60 else 1.0
for tier in range(3):
enemy.apply_level_settings(level, tier)
var combat := 2.0 if tier == 2 else 1.25
var hull_factor := 4.0 if tier == 2 else (2.0 if tier == 1 else 1.0)
var damage_factor := 4.0 if tier == 2 else (1.3 if tier == 1 else 1.0)
var old_hull: float = 50.0 * base_power * hull_factor * combat
var old_damage: float = 8.0 * base_power * damage_factor * combat
if tier == 2:
var intro := clampf(float(level - 1) / 5.0, 0.0, 1.0)
old_hull *= lerpf(0.6, 1.0, intro)
old_damage *= lerpf(0.5, 1.0, intro)
assert(is_equal_approx(enemy.max_hull, old_hull * mode_factor * (5.0 if tier == 2 else 1.0)))
assert(is_equal_approx(enemy.max_shields, old_hull * 0.4 * mode_factor * (3.0 if tier == 2 else 1.0)))
assert(is_equal_approx(enemy.weapon_damage, old_damage * mode_factor * (0.5 if tier == 2 else 1.0) * (0.25 if tier == 2 and level == 1 else 1.0)))
assert(is_equal_approx(enemy.hull, enemy.max_hull) and is_equal_approx(enemy.shields, enemy.max_shields))
enemy.apply_level_settings(1, 2)
assert(is_equal_approx(enemy.weapon_damage, 4.0))
assert(is_equal_approx(enemy.weapon_cooldown, 1.875))
enemy.apply_level_settings(2, 2)
assert(enemy.weapon_damage > 4.0 and enemy.weapon_cooldown < 1.0)
enemy.free()
for level in [60, 61, 120]:
GameState.system_level = level
var game := preload("res://scenes/game/game.tscn").instantiate()
add_child(game)
game.set_physics_process(false)
game.player.set_physics_process(false)
game.system_cleared = true
game.player.global_position = game.protected_planet.global_position
game.services_menu.show_services(level == 120)
assert(GameState.system_level == level)
if level == 60: assert(game.services_menu.next_button.text == "PRZEJDŹ DO HARD")
assert(game.services_menu.next_button.disabled == (level == 120))
assert(game.open_wormhole() == (level < 120))
game.free()
print("HARD_BALANCE_TEST_OK: levels 1-120, 60/61 transition, absorption, all tiers, boss multipliers and intro")
get_tree().quit()