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

85 lines
2.6 KiB
C#

using System;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace DanieleMarotta.RiversongCodeShowcase
{
public class HouseTierCountTrackingSystem : GameSystem, IInitializable, IDisposable
{
[InjectService]
private ISignalBus _signalBus;
[InjectService]
private World _world;
public HouseTierCountTrackingSystem(IServiceLocator serviceLocator) : base(serviceLocator)
{
}
public UniTask InitializeAsync()
{
_signalBus.Subscribe<BuildingCreatedSignal>(OnBuildingCreated);
_signalBus.Subscribe<BuildingDeletedSignal>(OnBuildingDeleted);
_signalBus.Subscribe<BuildingUpgradedSignal>(OnBuildingUpgraded);
return UniTask.CompletedTask;
}
public void Dispose()
{
_signalBus.Unsubscribe<BuildingCreatedSignal>(OnBuildingCreated);
_signalBus.Unsubscribe<BuildingDeletedSignal>(OnBuildingDeleted);
_signalBus.Unsubscribe<BuildingUpgradedSignal>(OnBuildingUpgraded);
}
private void OnBuildingCreated(BuildingCreatedSignal signal)
{
var building = signal.Building;
if (!building.Definition.IsHouse) return;
UpdateTierCount(building.TierIndex, 1);
}
private void OnBuildingDeleted(BuildingDeletedSignal signal)
{
var building = signal.Building;
if (!building.Definition.IsHouse) return;
UpdateTierCount(building.TierIndex, -1);
}
private void OnBuildingUpgraded(BuildingUpgradedSignal signal)
{
var building = signal.Building;
if (!building.Definition.IsHouse) return;
if (building.TierIndex > 0) UpdateTierCount(building.TierIndex - 1, -1);
UpdateTierCount(building.TierIndex, 1);
}
private void UpdateTierCount(int tierIndex, int delta)
{
if (!ValidateTierIndex(tierIndex)) return;
var countsByTier = _world.PopulationState.HouseCountsByTier;
var updatedCount = countsByTier[tierIndex] + delta;
if (updatedCount < 0)
{
Debug.LogError($"Attempted to decrease house count for tier {tierIndex} that was already at 0");
return;
}
countsByTier[tierIndex] = updatedCount;
}
private bool ValidateTierIndex(int tierIndex)
{
if (tierIndex is >= 0 and < WorldPopulationState.MaxBuildingTier) return true;
Debug.LogError($"Invalid tier index {tierIndex}");
return false;
}
}
}