using System.Collections.Generic; using SepCore.Entity; using UnityEngine; namespace SepCore.EnemyManager { public class EnemyRegistry { private readonly List _enemies; private readonly Dictionary _enemyById; public int Count { get; private set; } public List Enemies => _enemies; public EnemyRegistry() { _enemies = new List(); _enemyById = new Dictionary(); } public void Register(EnemyBase enemy) { if (enemy == null) return; Count++; RemoveFromCache(enemy.Id); _enemies.Add(enemy); _enemyById[enemy.Id] = enemy; } public void Remove(int entityId) { if (Count > 0) { Count--; } RemoveFromCache(entityId); } public bool TryGet(int entityId, out EntityBase enemy) { enemy = null; if (!_enemyById.TryGetValue(entityId, out EntityBase cachedEnemy)) { return false; } if (cachedEnemy == null || !cachedEnemy.Available) { _enemyById.Remove(entityId); return false; } enemy = cachedEnemy; return true; } public void Clear() { _enemies.Clear(); _enemyById.Clear(); Count = 0; } private void RemoveFromCache(int entityId) { _enemyById.Remove(entityId); for (int i = _enemies.Count - 1; i >= 0; i--) { EntityBase cachedEnemy = _enemies[i]; if (cachedEnemy == null || cachedEnemy.Id == entityId) { if (cachedEnemy != null) { _enemyById.Remove(cachedEnemy.Id); } _enemies.RemoveAt(i); } } } } }