95 lines
3.9 KiB
C#
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;
|
|
}
|
|
}
|
|
} |