Files
RuinAdventurer/Scripts/Gameplay/Crafting/Inventory.cs
T
2026-05-09 16:15:51 +02:00

97 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
public class Inventory
{
public List<Item> items = new List<Item>();
public int maxInventorySize = 16;
public event EventHandler OnInventoryUpdate;
public bool AddItem(Item item, int amount)
{
Item inventoryItem = items.Find(x => x.data.Id == item.data.Id && x.currentAmount + amount <= x.data.StackSize);
if (inventoryItem != null)
{
inventoryItem.currentAmount += amount;
NotifyInventoryChanged();
return true;
}
if (items.Count < maxInventorySize * GameData.maxRobotCount)
{
items.Add(item);
items[items.Count - 1].currentAmount += amount;
NotifyInventoryChanged();
return true;
}
return false;
}
public bool CanCraft(List<Ingredient> neededIngredients, int amount)
{
foreach (Ingredient ingredient in neededIngredients)
{
Item item = items.Find(x => x.data.Id == ingredient.Item && x.currentAmount >= ingredient.Amount * amount);
if (item == null)
{
return false;
}
}
return true;
}
public void RemoveItem(string id, int amount)
{
TryRemoveItem(id, amount);
}
public bool TryRemoveItem(string id, int amount)
{
if (GetItemAmount(id) < amount)
{
return false;
}
int remainingAmount = amount;
for (int i = items.Count - 1; i >= 0 && remainingAmount > 0; i--)
{
Item item = items[i];
if (item.data.Id != id) continue;
int removedAmount = Math.Min(item.currentAmount, remainingAmount);
item.currentAmount -= removedAmount;
remainingAmount -= removedAmount;
if (item.currentAmount <= 0)
{
items.RemoveAt(i);
}
}
NotifyInventoryChanged();
return true;
}
public int GetItemAmount(string id)
{
int amount = 0;
foreach (Item item in items)
{
if (item.data.Id == id)
{
amount += item.currentAmount;
}
}
return amount;
}
private void NotifyInventoryChanged()
{
OnInventoryUpdate?.Invoke(this, EventArgs.Empty);
}
}