using System; using Cysharp.Threading.Tasks; namespace DanieleMarotta.RiversongCodeShowcase { public class BlockMapUpdateSystem : GameSystem, IInitializable, IDisposable { [InjectService] private ISignalBus _signalBus; [InjectService] private World _world; [InjectService] private GameConfig _config; public BlockMapUpdateSystem(IServiceLocator serviceLocator) : base(serviceLocator) { } public UniTask InitializeAsync() { _signalBus.Subscribe(OnBuildingPlacementAnimationStarted); _signalBus.Subscribe(OnBuildingCreated); _signalBus.Subscribe(OnBuildingDeleteAnimationCompleted); _signalBus.Subscribe(OnConstructionSiteDeleted); _signalBus.Subscribe(OnRoadTileUpdated); _signalBus.Subscribe(OnRawResourcesRemoved); return UniTask.CompletedTask; } public void Dispose() { _signalBus.Unsubscribe(OnBuildingPlacementAnimationStarted); _signalBus.Unsubscribe(OnBuildingCreated); _signalBus.Unsubscribe(OnBuildingDeleteAnimationCompleted); _signalBus.Unsubscribe(OnConstructionSiteDeleted); _signalBus.Unsubscribe(OnRoadTileUpdated); _signalBus.Unsubscribe(OnRawResourcesRemoved); } private void OnBuildingPlacementAnimationStarted(BuildingPlacementAnimationStartedSignal signal) { _world.BlockMap.AddReason(signal.Rect.Min, signal.Rect.Max, BlockReason.Building); } private void OnBuildingCreated(BuildingCreatedSignal signal) { var rect = signal.Building.Rect; _world.BlockMap.AddReason(rect.Min, rect.Max, BlockReason.Building); } private void OnBuildingDeleteAnimationCompleted(BuildingDeleteAnimationCompletedSignal signal) { var rect = signal.Building.Rect; _world.BlockMap.RemoveReason(rect.Min, rect.Max, BlockReason.Building); } private void OnConstructionSiteDeleted(ConstructionSiteDeletedSignal signal) { var rect = signal.ConstructionSite.Rect; _world.BlockMap.RemoveReason(rect.Min, rect.Max, BlockReason.Building); } private void OnRoadTileUpdated(RoadTileUpdatedSignal signal) { if (_world.RoadNetwork.IsRoadTile(signal.Tile)) _world.BlockMap.AddReason(signal.Tile, BlockReason.Road); else _world.BlockMap.RemoveReason(signal.Tile, BlockReason.Road); } private void OnRawResourcesRemoved(RawResourcesRemovedSignal signal) { foreach (var resourceNode in signal.ResourceNodes) _world.BlockMap.RemoveReason(resourceNode.Tile, BlockReason.RawResource); } } }