class_name LuneBalance extends Resource ## Every tunable number of Champions of Luneraria. The default instance lives in ## data/luneraria/balance_default.tres; tests may load variants, bots never get extras. @export_group("Simulation") ## Fixed combat step in seconds. @export var sim_step: float = 0.05 ## Ends only the current combat phase, never the match (see REGELWERK). @export var combat_time_limit: float = 180.0 ## Lane marching speed relative to the catalogue speed of a unit. @export var march_speed_factor: float = 1.6 @export var aggro_radius: float = 7.0 ## Targets further away than this are dropped and re-acquired. @export var leash_radius: float = 10.0 @export var lane_half_width: float = 2.6 @export_group("Economy") @export var start_gold: int = 220 @export var base_income: int = 70 @export var income_per_round: int = 4 @export var income_growth_cap: int = 80 @export var supply_cap: int = 12 @export_range(0.0, 1.0) var sell_refund: float = 0.75 ## Share of lane kill gold for the responsible lane player; the rest splits evenly in the team. @export_range(0.0, 1.0) var lane_share: float = 0.5 @export_group("Waves") @export var wave_base_count: int = 3 ## One more monster per lane every N rounds, up to wave_max_count. @export var wave_count_every: int = 3 @export var wave_max_count: int = 7 @export var wave_hp_growth: float = 0.11 @export var wave_damage_growth: float = 0.07 @export var wave_growth_quadratic: float = 0.0015 @export var monster_bounty_scale: float = 2.0 @export var bounty_growth: float = 0.04 ## Monster types in rotation order; later indices unlock later (see LuneWaves). @export var monster_pool: PackedStringArray = PackedStringArray(["e01", "e02", "e04", "e03", "e06", "e05"]) @export_group("Buildings") @export var tower_outer_hp: float = 6000.0 @export var tower_inner_hp: float = 7500.0 @export var base_tower_hp: float = 9000.0 @export var core_hp: float = 12000.0 @export var tower_damage: float = 90.0 @export var base_tower_damage: float = 120.0 ## Must exceed the longest unit reach (6.5 m + building radius) so towers cannot be out-ranged. @export var tower_range: float = 8.6 @export var tower_attack_interval: float = 1.0 @export var building_radius: float = 1.3 @export var bounty_outer_tower: int = 150 @export var bounty_inner_tower: int = 210 @export var bounty_base_tower: int = 270 @export_group("Map") ## Inner / outer tower position as a fraction of the lane length from the own base. @export var inner_tower_fraction: float = 0.17 @export var outer_tower_fraction: float = 0.35 @export var tower_side_offset: float = 3.4 static func default_balance() -> LuneBalance: var path := "res://data/luneraria/balance_default.tres" if ResourceLoader.exists(path): return load(path) as LuneBalance return LuneBalance.new() func round_income(round_number: int) -> int: return base_income + mini(income_growth_cap, income_per_round * maxi(0, round_number - 1))