Files
riversong-code-showcase/Source/Riversong/Game/UI/Panels/BuildingPanel/HouseBuildingPanelSectionPresenter.cs
2026-05-21 16:04:49 +02:00

92 lines
3.3 KiB
C#

using Unity.Mathematics;
namespace DanieleMarotta.RiversongCodeShowcase
{
public class HouseBuildingPanelSectionPresenter : IBuildingPanelSectionPresenter
{
private readonly IProductCatalog _productCatalog;
public HouseBuildingPanelSectionPresenter(IProductCatalog productCatalog)
{
_productCatalog = productCatalog;
}
public bool IsSectionRelevant(Building building)
{
return building.Definition.IsHouse;
}
public void InitializeSection(BuildingPanelModel model, Building building)
{
var tiers = building.Definition.HouseTiers;
var tierIndex = building.TierIndex;
var maxTier = math.min(tierIndex, tiers.Count - 1);
ref var needsState = ref building.GetNeedsStateRW();
model.HouseModel.Needs.Clear();
var rowIndex = 0;
for (var i = 0; i <= maxTier; i++)
{
var tier = tiers[i];
foreach (var need in tier.Needs)
{
var needModel = new HousePanelNeedModel();
switch (need.Type)
{
case PopulationNeedType.Product:
needModel.Initialize(rowIndex++, need.Product.ProductName, need.Product.Icon, 0, need.YieldOnFetch);
break;
}
model.HouseModel.Needs.Add(needModel);
}
}
model.HouseModel.AllNeedsMet = needsState.AllNeedsMet;
model.HouseModel.UpgradeState = needsState.UpgradeState;
model.HouseModel.UpgradeMaterials.Clear();
if (tierIndex < tiers.Count)
foreach (var productAmount in tiers[tierIndex].UpgradeMaterials)
model.HouseModel.UpgradeMaterials.Add(new HousePanelUpgradeMaterialModel(productAmount));
model.HouseModel.NotifyChanged();
}
public void UpdateSection(BuildingPanelModel model, Building building)
{
ref var needsState = ref building.GetNeedsStateRW();
ref var storage = ref building.GetStorageRW();
for (var i = 0; i < needsState.Needs.Length; i++)
{
var need = needsState.Needs[i];
if (need.TierIndex > building.TierIndex) break;
var needModel = model.HouseModel.Needs[i];
switch (need.Type)
{
case PopulationNeedType.Product:
needModel.UpdateValue(need.Current);
break;
}
}
model.HouseModel.AllNeedsMet = needsState.AllNeedsMet;
model.HouseModel.UpgradeState = needsState.UpgradeState;
foreach (var upgradeMaterialModel in model.HouseModel.UpgradeMaterials)
{
var productHandle = _productCatalog.GetHandle(upgradeMaterialModel.Product);
upgradeMaterialModel.Remaining = math.max(upgradeMaterialModel.Needed - storage.AvailableNow(productHandle), 0);
upgradeMaterialModel.Done &= needsState.UpgradeState != TierUpgradeState.NotReady;
upgradeMaterialModel.Done |= upgradeMaterialModel.Remaining <= 0;
}
}
}
}