extends RefCounted const BALANCE := preload("res://scripts/levels/level_balance.gd") const WORLD_SIZE := Vector2(5200,3600) static func enemy_tiers(level: int) -> Array[int]: var result: Array[int] = [] for tier in BALANCE.enemy_tiers(level): result.append(tier) if tier != 2: result.append(tier) return result static func generate(map: Dictionary) -> Dictionary: var rng := RandomNumberGenerator.new() rng.seed = int(map.seed) var enemies: Array[Dictionary] = [] var index := 0 for tier in enemy_tiers(int(map.level)): var chosen := Vector2.ZERO var best := -INF for attempt in 100: var candidate := Vector2(rng.randf_range(-2300,2300),rng.randf_range(-1480,1480)) var clearance := candidate.length()-900.0 for other in enemies: clearance = minf(clearance,candidate.distance_to(other.position)-220.0) if clearance > best: best = clearance chosen = candidate if clearance >= 0: break enemies.append({"tier":tier,"position":chosen,"texture_index":rng.randi_range(0,preload("res://scripts/items/alien_ship_catalog.gd").TEXTURES.size()-1),"spawn_index":index}) index += 1 var structures: Array[Dictionary] = [] for prop in 7: var width := rng.randf_range(240,460) var position := Vector2.ZERO for attempt in 100: position = Vector2(rng.randf_range(-2200,2200),rng.randf_range(-1350,1350)) if position.length() < 650: continue var clear := true for other in structures: if position.distance_to(other.position) < (width+float(other.size))*0.5+180: clear = false if clear: break structures.append({"position":position,"size":width,"rotation":rng.randf_range(-PI,PI),"name":["Rozbity przekaźnik","Archiwum bez głosu","Brama zapomnianych","Wrak konwoju","Pusta stocznia","Echo dawnej cywilizacji","Cmentarz maszyn"][prop]}) return {"planets":[],"player_start":Vector2.ZERO,"enemies":enemies,"structures":structures}