riversong code showcase
This commit is contained in:
55
Source/Riversong/Game/World/Buildings/BuildingAoESystem.cs
Normal file
55
Source/Riversong/Game/World/Buildings/BuildingAoESystem.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user