using System; using Cysharp.Threading.Tasks; using UnityEngine.Pool; namespace DanieleMarotta.RiversongCodeShowcase { public class RawResourcesRemovalSystem : GameSystem, IInitializable, IDisposable { [InjectService] private ISignalBus _signalBus; [InjectService] private World _world; [InjectService] private GameConfig _config; public RawResourcesRemovalSystem(IServiceLocator serviceLocator) : base(serviceLocator) { } public UniTask InitializeAsync() { _signalBus.Subscribe(OnBuildingPlacementAnimationStarted); _signalBus.Subscribe(OnRoadTileUpdated); _signalBus.Subscribe(OnDoDeleteTool); return UniTask.CompletedTask; } public void Dispose() { _signalBus.Unsubscribe(OnBuildingPlacementAnimationStarted); _signalBus.Unsubscribe(OnRoadTileUpdated); _signalBus.Unsubscribe(OnDoDeleteTool); } private void OnBuildingPlacementAnimationStarted(BuildingPlacementAnimationStartedSignal signal) { RemoveResourceNodesAt(signal.Rect); } private void OnRoadTileUpdated(RoadTileUpdatedSignal signal) { RemoveResourceNodesAt(TileRect.OneTile(signal.Tile)); } private void OnDoDeleteTool(DoDeleteToolSignal signal) { RemoveResourceNodesAt(signal.Rect); } private void RemoveResourceNodesAt(TileRect rect) { using var _ = ListPool.Get(out var deletedResourceNodes); _world.RawResources.DeleteResourceNodes(rect, _config.GeneralSettings.BaseElevation, deletedResourceNodes); if (deletedResourceNodes.Count == 0) return; _signalBus.Raise(new RawResourcesRemovedSignal(deletedResourceNodes, RawResourcesRemovedSignal.RemovalReason.PlayerAction)); } } }