riversong code showcase
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user