76 lines
2.1 KiB
C#
76 lines
2.1 KiB
C#
using System.Collections.Generic;
|
|
using GeometryTD.DataTable;
|
|
using UnityEngine;
|
|
|
|
namespace GeometryTD.CustomComponent
|
|
{
|
|
internal sealed class EnemyLifecycleTracker
|
|
{
|
|
private readonly HashSet<int> _trackedEnemyEntityIds = new();
|
|
private readonly Dictionary<int, DREnemy> _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<int> buffer)
|
|
{
|
|
if (buffer == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
buffer.Clear();
|
|
foreach (int trackedEnemyEntityId in _trackedEnemyEntityIds)
|
|
{
|
|
buffer.Add(trackedEnemyEntityId);
|
|
}
|
|
}
|
|
}
|
|
}
|