using Godot; using System.Collections.Generic; public enum EnemyType { Stone, Stump, Liquid } public partial class EnemyPool : Node { [Export] private Godot.Collections.Dictionary _scenes; [Export] private int _poolSize = 10; private readonly Dictionary> _pool = new(); public override void _Ready() { foreach (var kvp in _scenes) { var q = new Queue(); _pool[kvp.Key] = q; for (int i = 0; i < _poolSize; i++) q.Enqueue(CreateEnemy(kvp.Key)); } } private Enemy CreateEnemy(EnemyType type) { var e = _scenes[type].Instantiate(); e.Died += ReturnToPool; return e; } public Enemy Get(EnemyType type) { if (!_pool.TryGetValue(type, out var q)) return null; var e = q.Count > 0 ? q.Dequeue() : CreateEnemy(type); e.ResetEnemy(); return e; } private void ReturnToPool(Enemy e) { e.GetParent()?.RemoveChild(e); e.ProcessMode = ProcessModeEnum.Disabled; _pool[e.Type].Enqueue(e); } public EnemyType GetRandomType() { var keys = new List(_pool.Keys); return keys[GD.RandRange(0, keys.Count - 1)]; } }