From 6b2065f4b2776a71f2c656dbc9b95d9342a224d6 Mon Sep 17 00:00:00 2001 From: Jennie Robinson Faber Date: Sun, 10 May 2026 17:39:55 +0100 Subject: [PATCH] Sync survivor spawning with per-floor pacing Clear runners on each new floor as well --- scenes/component_spawn.gd | 71 +++++++++++++++++++-------------------- scenes/elevator_panel.gd | 1 + scenes/game.gd | 4 +-- scripts/event_bus.gd | 1 + 4 files changed, 38 insertions(+), 39 deletions(-) diff --git a/scenes/component_spawn.gd b/scenes/component_spawn.gd index b887d7d..b6e88cf 100644 --- a/scenes/component_spawn.gd +++ b/scenes/component_spawn.gd @@ -1,44 +1,43 @@ extends Node3D -var survivors: int = 5 -var survivor_rate: float = .75 -var speed_modifer: int = 0 -var spawn_readiness: bool = false +@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 world = preload("res://scenes/world.tscn") - @onready var survivor_spawn = get_node("/root/Game/World/SuvivorSpawn") -@onready var start_pos = survivor_spawn.global_position +@onready var start_pos: Vector3 = survivor_spawn.global_position -func _ready() -> void: - start() - -func start() -> void: - spawn_readiness = true - spawn_survivor() +func _enter_tree() -> void: + EventBus.floor_started.connect(_on_floor_started, CONNECT_DEFERRED) -#func _physics_process(delta): - #if spawn_readiness == true: - #spawn_survivor() - #spawn_readiness = false - # - #else: pass +func _on_floor_started(count: int) -> void: + _batch_generation += 1 + _clear_active_walkers() + if count <= 0: + return + _run_batch(count, _batch_generation) -func spawn_survivor(): - - if spawn_readiness == false: pass - - else: - - var survivor_delay: float = randf_range(1, 2.5) - var start_variance = Vector3((randf_range(-1, 2)),0,0) - - for x in range(survivors): - var s = survivor.instantiate() - get_tree().root.add_child.call_deferred(s) - #get_node("/root/Game/World").add_child(s) - s.position = start_pos + start_variance - await get_tree().create_timer(survivor_rate * survivor_delay).timeout - spawn_readiness = true - +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) + get_tree().root.add_child.call_deferred(s) + s.position = start_pos + offset + _active_walkers.append(s) diff --git a/scenes/elevator_panel.gd b/scenes/elevator_panel.gd index b239648..3825515 100644 --- a/scenes/elevator_panel.gd +++ b/scenes/elevator_panel.gd @@ -48,6 +48,7 @@ func _start_floor(): EventBus.people_changed.emit(people_in_elevator, threshold) EventBus.floor_changed.emit(current_floor) + EventBus.floor_started.emit(survivors_remaining) var screen = $PanelMargin/PanelColumn/Screen screen.start() diff --git a/scenes/game.gd b/scenes/game.gd index af525c2..94265a7 100644 --- a/scenes/game.gd +++ b/scenes/game.gd @@ -1,6 +1,4 @@ extends Node3D func _ready() -> void: - $ComponentSpawn.spawn_survivor() - - + pass diff --git a/scripts/event_bus.gd b/scripts/event_bus.gd index ba6f2b0..bbad6fa 100644 --- a/scripts/event_bus.gd +++ b/scripts/event_bus.gd @@ -8,5 +8,6 @@ signal score_changed(new_score: int) signal people_changed(count: int, threshold: int) signal game_won signal game_lost +signal floor_started(survivor_count: int) @warning_ignore_restore("unused_signal") # put any future signals you add between the two ignore annotations