42 lines
1.1 KiB
GDScript
42 lines
1.1 KiB
GDScript
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()
|