using System; using System.Collections.Generic; using Cysharp.Threading.Tasks; namespace DanieleMarotta.RiversongCodeShowcase { [Service(typeof(IFailedPathCache))] public class FailedPathCacheSystem : GameSystem, IInitializable, IDisposable, IFailedPathCache { [InjectService] private ISignalBus _signalBus; private HashSet _failedPaths = new(); public FailedPathCacheSystem(IServiceLocator serviceLocator) : base(serviceLocator) { } public UniTask InitializeAsync() { _signalBus.Subscribe(InvalidateCacheOnSignal); _signalBus.Subscribe(InvalidateCacheOnSignal); return UniTask.CompletedTask; } public void Dispose() { _signalBus.Unsubscribe(InvalidateCacheOnSignal); _signalBus.Unsubscribe(InvalidateCacheOnSignal); } private void InvalidateCacheOnSignal(T signal) { Invalidate(); } public void FailPath(int sourceId, int targetId) { _failedPaths.Add(MakeKey(sourceId, targetId)); } public bool IsKnownFailedPath(int sourceId, int targetId) { return _failedPaths.Contains(MakeKey(sourceId, targetId)); } public void Invalidate() { _failedPaths.Clear(); } private ulong MakeKey(int sourceId, int targetId) { return sourceId < targetId ? ((ulong)sourceId << 32) | (uint)targetId : ((ulong)targetId << 32) | (uint)sourceId; } } }