41 lines
1.8 KiB
GDScript
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}
|