extends Node3D @export var waves: Array[WaveData] = [] signal wave_started() signal wave_completed() var next_wave_id: int = 0 var wave_timer: float = 0.0 var wave_in_progress: bool = false var next_spawn_times: Dictionary[String, float] = {} func _process(delta: float) -> void: if next_wave_id >= waves.size(): next_wave_id = 0 var wave: WaveData = waves[next_wave_id] wave_timer += delta if !wave_in_progress: if wave_timer >= wave.delay: wave_timer = 0 next_spawn_times.clear() wave_in_progress = true wave_started.emit() else: if wave_timer >= wave.duration: wave_in_progress = false wave_timer = 0 next_wave_id += 1 else: for key in wave.enemies.keys(): var next_spawn_time: float = next_spawn_times.get(key, 0) if wave_timer >= next_spawn_time: var enemy_delay: float = wave.duration / wave.enemies.get(key) next_spawn_time += enemy_delay next_spawn_times.set(key, next_spawn_time) spawn(key as String) func spawn(key: String) -> void: var node: Node = get_tree().get_nodes_in_group("Spawners").pick_random() var spawner: Spawner = node as Spawner spawner.spawn()