New file |
| | |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using UnityEngine; |
| | | |
| | | public class Inventory : MonoBehaviour |
| | | { |
| | | public static Inventory Instance { get; private set; } |
| | | public List<InventorySlot> items = new List<InventorySlot>(); |
| | | public int maxInventorySize = 20; |
| | | |
| | | private void Awake() |
| | | { |
| | | if (Instance == null) |
| | | { |
| | | Instance = this; |
| | | } |
| | | else |
| | | { |
| | | Destroy(gameObject); |
| | | } |
| | | } |
| | | |
| | | public bool AddItem(Item item, int quantity = 1) |
| | | { |
| | | if (items.Count >= maxInventorySize && !item.isStackable) |
| | | { |
| | | //TODO: Show inventory full message |
| | | Debug.Log("Inventory is full"); |
| | | return false; |
| | | } |
| | | |
| | | InventorySlot existingSlot = items.Find(slot => slot.item.itemName == item.itemName); |
| | | if (existingSlot != null && item.isStackable) |
| | | { |
| | | //Add to existing stack |
| | | if (existingSlot.quantity + quantity <= item.maxStackSize) |
| | | { |
| | | existingSlot.quantity += quantity; |
| | | } |
| | | else |
| | | { |
| | | int remainingQuantity = item.maxStackSize - existingSlot.quantity; |
| | | existingSlot.quantity = item.maxStackSize; |
| | | //TODO: Show inventory overflow message |
| | | Debug.Log("Inventory overflow"); |
| | | existingSlot.quantity += remainingQuantity; |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | //Add new item to inventory |
| | | items.Add(new InventorySlot(item, quantity)); |
| | | } |
| | | GameStateEvents.inventoryChanged?.Invoke(); |
| | | return true; |
| | | } |
| | | |
| | | public void RemoveItem(Item item, int quantity = 1) |
| | | { |
| | | InventorySlot existingSlot = items.Find(slot => slot.item.itemName == item.itemName); |
| | | |
| | | if (existingSlot != null) |
| | | { |
| | | if (existingSlot.quantity > quantity) |
| | | { |
| | | existingSlot.quantity -= quantity; |
| | | } |
| | | else |
| | | { |
| | | items.Remove(existingSlot); |
| | | } |
| | | } |
| | | GameStateEvents.inventoryChanged?.Invoke(); |
| | | } |
| | | } |
| | | |
| | | [System.Serializable] |
| | | public class InventorySlot |
| | | { |
| | | public Item item; |
| | | public int quantity; |
| | | |
| | | public InventorySlot(Item item, int quantity) |
| | | { |
| | | this.item = item; |
| | | this.quantity = quantity; |
| | | } |
| | | } |