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!")