85 lines
2.6 KiB
C#
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;
|
|
}
|
|
}
|
|
} |