Files
riversong-code-showcase/Source/Riversong/Game/World/RawResources/RawResourcesRemovalSystem.cs
2026-05-21 16:04:49 +02:00

63 lines
2.1 KiB
C#

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<BuildingPlacementAnimationStartedSignal>(OnBuildingPlacementAnimationStarted);
_signalBus.Subscribe<RoadTileUpdatedSignal>(OnRoadTileUpdated);
_signalBus.Subscribe<DoDeleteToolSignal>(OnDoDeleteTool);
return UniTask.CompletedTask;
}
public void Dispose()
{
_signalBus.Unsubscribe<BuildingPlacementAnimationStartedSignal>(OnBuildingPlacementAnimationStarted);
_signalBus.Unsubscribe<RoadTileUpdatedSignal>(OnRoadTileUpdated);
_signalBus.Unsubscribe<DoDeleteToolSignal>(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<ResourceNode>.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));
}
}
}