using System.Collections.Generic; using GeometryTD.DataTable; using UnityEngine; namespace GeometryTD.CustomComponent { internal sealed class EnemyLifecycleTracker { private readonly HashSet _trackedEnemyEntityIds = new(); private readonly Dictionary _trackedEnemyConfigByEntityId = new(); public int AliveEnemyCount { get; private set; } public void Reset() { _trackedEnemyEntityIds.Clear(); _trackedEnemyConfigByEntityId.Clear(); AliveEnemyCount = 0; } public void TrackEnemy(int entityId, DREnemy enemyConfig) { _trackedEnemyEntityIds.Add(entityId); _trackedEnemyConfigByEntityId[entityId] = enemyConfig; } public bool Contains(int entityId) { return _trackedEnemyEntityIds.Contains(entityId); } public void HandleShowSuccess(int entityId) { if (_trackedEnemyEntityIds.Contains(entityId)) { AliveEnemyCount++; } } public void HandleShowFailure(int entityId) { _trackedEnemyEntityIds.Remove(entityId); _trackedEnemyConfigByEntityId.Remove(entityId); } public bool TryHandleHideComplete(int entityId, out DREnemy enemyConfig) { enemyConfig = null; if (!_trackedEnemyEntityIds.Remove(entityId)) { _trackedEnemyConfigByEntityId.Remove(entityId); return false; } _trackedEnemyConfigByEntityId.TryGetValue(entityId, out enemyConfig); _trackedEnemyConfigByEntityId.Remove(entityId); AliveEnemyCount = Mathf.Max(0, AliveEnemyCount - 1); return true; } public void CopyTrackedEntityIdsTo(List buffer) { if (buffer == null) { return; } buffer.Clear(); foreach (int trackedEnemyEntityId in _trackedEnemyEntityIds) { buffer.Add(trackedEnemyEntityId); } } } }