tojam20-elevator/scenes/component_spawn.gd
2026-05-10 23:56:09 +01:00

43 lines
1.3 KiB
GDScript

extends Node3D
@export var batch_duration: float = 16.0
@export var lateral_variance: float = 1.5
var _active_walkers: Array[Node] = []
var _batch_generation: int = 0
@onready var survivor = preload("res://scenes/survivor.tscn")
@onready var survivor_spawn = get_node("/root/Game/World/SurvivorSpawn")
@onready var start_pos: Vector3 = survivor_spawn.global_position
func _enter_tree() -> void:
EventBus.floor_started.connect(_on_floor_started, CONNECT_DEFERRED)
func _on_floor_started(count: int) -> void:
_batch_generation += 1
_clear_active_walkers()
if count <= 0:
return
_run_batch(count, _batch_generation)
func _clear_active_walkers() -> void:
for w in _active_walkers:
if is_instance_valid(w):
w.queue_free()
_active_walkers.clear()
func _run_batch(count: int, generation: int) -> void:
var gap: float = batch_duration / float(count)
for i in range(count):
if generation != _batch_generation:
return
_spawn_one()
var jitter: float = randf_range(-gap * 0.25, gap * 0.25)
await get_tree().create_timer(max(0.05, gap + jitter)).timeout
func _spawn_one() -> void:
var s = survivor.instantiate()
var offset := Vector3(randf_range(-lateral_variance, lateral_variance), 0, 0)
add_child.call_deferred(s)
s.position = start_pos + offset
_active_walkers.append(s)