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

95 lines
3.9 KiB
C#

using UnityEngine;
using UnityEngine.InputSystem;
namespace DanieleMarotta.RiversongCodeShowcase
{
public class StorageBuildingPanelSectionPresenter : IBuildingPanelSectionPresenter
{
private const int RequestedAmountLargeDelta = 5;
private readonly IProductCatalog _productCatalog;
public StorageBuildingPanelSectionPresenter(IProductCatalog productCatalog)
{
_productCatalog = productCatalog;
}
public bool IsSectionRelevant(Building building)
{
return building.Definition.IsStorage;
}
public void InitializeSection(BuildingPanelModel model, Building building)
{
model.StorageModel.Products.Clear();
for (var productHandle = 0; productHandle < _productCatalog.ProductTypeCount; productHandle++)
{
var productModel = new StoragePanelProductModel();
productModel.Initialize(
productHandle,
productHandle,
_productCatalog.GetProduct(productHandle),
() => ToggleAllowTaking(building, productModel),
() => ToggleCanFulfillRequests(building, productModel),
() => ChangeRequestedAmount(building, productModel, Keyboard.current.shiftKey.isPressed ? -RequestedAmountLargeDelta : -1),
() => ChangeRequestedAmount(building, productModel, Keyboard.current.shiftKey.isPressed ? RequestedAmountLargeDelta : 1));
model.StorageModel.Products.Add(productModel);
}
UpdateSection(model, building);
model.StorageModel.NotifyChanged();
}
public void UpdateSection(BuildingPanelModel model, Building building)
{
ref var storage = ref building.GetStorageRW();
ref var storagePolicy = ref building.GetProductStoragePolicyRW();
foreach (var productModel in model.StorageModel.Products)
{
var productHandle = productModel.ProductHandle;
productModel.AvailableNow = storage.AvailableNow(productHandle);
productModel.InputBlocked = !storagePolicy.IsTakingAllowed(productHandle);
productModel.CanFulfillRequests = storagePolicy.CanFulfillRequests(productHandle);
productModel.RequestedAmount = storagePolicy.GetRequestedAmount(productHandle);
}
}
private static void ToggleAllowTaking(Building building, StoragePanelProductModel productModel)
{
ref var storagePolicy = ref building.GetProductStoragePolicyRW();
var isTakingAllowed = storagePolicy.IsTakingAllowed(productModel.ProductHandle);
storagePolicy.SetAllowTaking(productModel.ProductHandle, !isTakingAllowed);
productModel.InputBlocked = isTakingAllowed;
}
private static void ToggleCanFulfillRequests(Building building, StoragePanelProductModel productModel)
{
ref var storagePolicy = ref building.GetProductStoragePolicyRW();
var canFulfillRequests = storagePolicy.CanFulfillRequests(productModel.ProductHandle);
storagePolicy.SetCanFulfillRequests(productModel.ProductHandle, !canFulfillRequests);
productModel.CanFulfillRequests = !canFulfillRequests;
}
private static void ChangeRequestedAmount(Building building, StoragePanelProductModel productModel, int delta)
{
ref var storage = ref building.GetStorageRW();
ref var storagePolicy = ref building.GetProductStoragePolicyRW();
var requestedAmount = storagePolicy.GetRequestedAmount(productModel.ProductHandle) + delta;
requestedAmount = Mathf.Clamp(requestedAmount, 0, storage.Capacity);
storagePolicy.SetRequestedAmount(productModel.ProductHandle, requestedAmount);
productModel.RequestedAmount = requestedAmount;
}
}
}