SchildDerStaerke/scripts/spawn_manager.gd

110 lines
3.0 KiB
GDScript

extends Node
@export var max_enemies: int = 3
@export var enemies_container: Node
@export var enemy_scenes: Array[PackedScene]
@export var enemies_ui_manager: Node
@export var spawn_points_container: Node
var player: Player
var current_enemies: Array[Enemy] = []
var _enemy_counter: int = 0
var _enemy_ui_ready: bool = false
var spawn_points: Array[SpawnPoint]
var enemy_ui_ready: bool:
get:
return _enemy_ui_ready
set(value):
_enemy_ui_ready = value
if value:
ensure_enemy_count()
func _ready() -> void:
player = get_tree().get_first_node_in_group("player")
if player == null:
print("Error: No player found!")
# SpawnPoints aus dem Container laden (falls gesetzt)
populate_spawn_points_from_container()
func populate_spawn_points_from_container() -> void:
if spawn_points_container == null:
push_warning("spawn_points_container is not assigned; cannot auto-collect SpawnPoints.")
return
var collected: Array[SpawnPoint] = []
var children: Array = spawn_points_container.get_children()
for child in children:
if child is SpawnPoint:
collected.append(child)
spawn_points = collected
func ensure_enemy_count() -> void:
var current := current_enemies.size()
print("Enough enemies? %d/%d" % [current, max_enemies])
if current >= max_enemies:
print("Enough enemies!")
return
var empty_points := find_empty_spawn_points()
if empty_points.is_empty():
print("No free SpawnPoints found!")
return
var need: int = min(max_enemies - current, empty_points.size())
for i in need:
spawn_enemy(empty_points[i])
func spawn_enemy(spawn_point: SpawnPoint) -> void:
var scene: PackedScene = enemy_scenes.pick_random()
if scene == null:
push_warning("No enemy scene available to spawn.")
return
var new_enemy := scene.instantiate() as Enemy
if new_enemy == null:
push_warning("PackedScene did not instantiate as Enemy.")
return
new_enemy.player = player
_enemy_counter += 1
new_enemy.name = "%s%d" % [new_enemy.name, _enemy_counter]
new_enemy.unit_name = new_enemy.name
print("Spawn %s on %s" % [new_enemy.unit_name, spawn_point.name])
new_enemy.position = spawn_point.position
new_enemy.unit_died.connect(_on_unit_died)
enemies_container.add_child(new_enemy)
spawn_point.isFull = true
spawn_point.enemy = new_enemy
current_enemies.append(new_enemy)
enemies_ui_manager.update_enemies_ui(current_enemies)
func find_empty_spawn_points() -> Array[SpawnPoint]:
var empty_spawn_points: Array[SpawnPoint] = []
print("Count of spawn points: " + str(spawn_points.size()))
for sp in spawn_points:
if not sp.isFull:
empty_spawn_points.append(sp)
else:
print("Spawn point " + sp.name + " is full!")
return empty_spawn_points
func _on_unit_died(unit: Unit) -> void:
if unit is Enemy:
print("%s died -> Remove from current_enemies." % unit.unit_name)
var index := current_enemies.find(unit)
if index != -1:
current_enemies.remove_at(index)
ensure_enemy_count()
else:
print("Enemy is not in the list!")
else:
print("Something died which is not an enemy!")