Files
fgj-26/Scripts/Enemies/EnemyPool.cs
T
2026-02-01 14:06:04 +02:00

78 lines
1.8 KiB
C#

using System;
using Godot;
using System.Collections.Generic;
public enum EnemyType
{
Stone,
Stump,
Liquid
}
public partial class EnemyPool : Node
{
[Export] private Godot.Collections.Dictionary<EnemyType, PackedScene> _scenes;
[Export] private int _poolSize = 10;
private readonly Dictionary<EnemyType, Queue<Enemy>> _pool = new();
public override void _Ready()
{
foreach (var kvp in _scenes)
{
var q = new Queue<Enemy>();
_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<Enemy>();
e.Died += Died;
e.ReachedShrine += DamageShrine;
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 DamageShrine(Enemy e)
{
GameController.Instance.DamageShrine(5);
ReturnToPool(e);
}
private void Died(Enemy e)
{
GameController.Instance.AddCurrency((int)Math.Floor(e.Health.MaxHP));
ReturnToPool(e);
}
private void ReturnToPool(Enemy e)
{
EnemySpawner.Instance.EnemiesSpawned--;
if (EnemySpawner.Instance.EnemiesSpawned <= 0)
{
GameController.Instance.WaveComplete();
}
e.GetParent()?.RemoveChild(e);
e.ProcessMode = ProcessModeEnum.Disabled;
_pool[e.Type].Enqueue(e);
}
public EnemyType GetRandomType()
{
var keys = new List<EnemyType>(_pool.Keys);
return keys[GD.RandRange(0, keys.Count - 1)];
}
}