Files
2026-05-21 16:04:49 +02:00

55 lines
2.0 KiB
C#

using UnityEngine.Pool;
namespace DanieleMarotta.RiversongCodeShowcase
{
[UpdateAfter(typeof(EditingStateGameSystem))]
public class BuildingAoESystem : GameSystem, IUpdatable
{
[InjectService]
private EditingState _editingState;
[InjectService]
private UIState _uiState;
[InjectService]
private IBuildingSpatialQuery _buildingSpatialQuery;
[InjectService]
private IAoERenderingService _aoeRenderingService;
public BuildingAoESystem(IServiceLocator serviceLocator) : base(serviceLocator)
{
}
public void Update()
{
var tool = _editingState.ActiveTool;
if (tool is BuildTool buildTool && buildTool.Preview.IsVisible) AddAoE(buildTool.Building, buildTool.BuildingRect);
var selectedBuilding = _uiState.SelectedBuilding;
if (selectedBuilding != null) AddAoE(selectedBuilding.Definition, selectedBuilding.Rect);
}
private void AddAoE(BuildingDefinition definition, TileRect rect)
{
var range = definition.Range;
if (range > 0) _aoeRenderingService.Add(definition.AoELayer, rect.Inflate(range));
if (definition.IsHouse)
{
using var providersScope = ListPool<Building>.Get(out var providers);
_buildingSpatialQuery.FindProvidersForHouse(rect, providers);
foreach (var provider in providers) _aoeRenderingService.Add(provider.Definition.AoELayer, provider.Rect.Inflate(provider.Definition.Range));
}
if (definition.IsStorage)
{
using var providersScope = ListPool<Building>.Get(out var providers);
_buildingSpatialQuery.FindProvidersForStorage(rect, providers);
foreach (var provider in providers) _aoeRenderingService.Add(provider.Definition.AoELayer, provider.Rect.Inflate(provider.Definition.Range));
}
}
}
}