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(OnBuildingCreated); _signalBus.Subscribe(OnBuildingDeleted); _signalBus.Subscribe(OnBuildingUpgraded); return UniTask.CompletedTask; } public void Dispose() { _signalBus.Unsubscribe(OnBuildingCreated); _signalBus.Unsubscribe(OnBuildingDeleted); _signalBus.Unsubscribe(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; } } }