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 not BALANCE.is_hard(120) and BALANCE.is_hard(121)) 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, 121, 130, 1000]: var base_power: float = 1.0 + 0.10 * (mini(level, 120) - 1) + 0.20 * maxi(0, level - 120) var mode_factor := 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 == "OTWÓRZ WORMHOLE") 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()