Randoloot/scripts/levels/distant_sector_generator.gd
2026-10-20 19:53:03 +02:00

41 lines
1.8 KiB
GDScript

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}