Files

221 lines
6.1 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class Inventory : MonoBehaviour
{
public ItemSlot[] itemSlots;
public BackPackType ownedBackpackType;
InventorySlotUI inventoryDisplay;
private bool showingInventory = false;
private void Update()
{
if (inventoryDisplay == null)
{
inventoryDisplay = GameObject.FindWithTag("InventorySlots").GetComponent<InventorySlotUI>();
inventoryDisplay.gameObject.SetActive(false);
}
if (Input.GetKeyDown(KeyCode.Tab))
{
if (showingInventory)
{
inventoryDisplay.HideSlots();
Time.timeScale = 1;
}
else
{
inventoryDisplay.ShowSlots();
Time.timeScale = 0;
}
showingInventory = !showingInventory;
}
}
// we'll set this up to only try to add one item to the inventory at a time for now
// there won't be stacked items in the wild for right now
public bool AddItem(Item item, int quantity)
{
// first try to stack
for (int i = 0; i < itemSlots.Length; i++)
{
if (itemSlots[i].item == item.id && itemSlots[i].quantity < item.maxStack)
{
itemSlots[i].quantity += 1;
return true;
}
}
// no stack to add to, try to find an empty slot
for (int i = 0; i < itemSlots.Length; i++)
{
if (itemSlots[i].item == ItemIdEnum.NONE)
{
itemSlots[i] = new ItemSlot();
itemSlots[i].quantity = 1;
itemSlots[i].item = item.id;
return true;
}
}
// no open slots, no open stacks, we can't add the item
return false;
}
public bool RemoveItemQuantity(ItemIdEnum itemId, int quantity)
{
if (GetItemQuantity(itemId) >= quantity)
{
int currentQuantity = quantity;
for (int i = 0; i < itemSlots.Length; i++)
{
if (itemSlots[i].item == itemId)
{
// we are trying to remove less items than what exists in the current
// stack, so just subtract from the stack
if (currentQuantity < itemSlots[i].quantity)
{
itemSlots[i].quantity -= currentQuantity;
break;
}
else if (currentQuantity == itemSlots[i].quantity)
{
// we have exactly enough in the current slot, so nullify it and
// exit
itemSlots[i].item = ItemIdEnum.NONE;
break;
}
else
{
// we don't have enough in the stack, but we DO have enough in our
// inventory. nullify the stack, subtract that number from the current
// count, and move to the next item
currentQuantity -= itemSlots[i].quantity;
itemSlots[i].item = ItemIdEnum.NONE;
}
}
}
return true;
}
else
{
return false;
}
}
public int GetItemQuantity(ItemIdEnum itemId)
{
int itemCount = 0;
foreach (ItemSlot slot in itemSlots)
{
if (slot.item == itemId)
{
itemCount += slot.quantity;
}
}
return itemCount;
}
private int GetItemSlotNum()
{
switch (ownedBackpackType)
{
case BackPackType.Pockets:
return 8;
case BackPackType.SmallBag:
return 16;
case BackPackType.LargeBag:
return 32;
}
return 0;
}
#region Inventory Save/Load
public void SaveInventory(ref InventorySaveData data)
{
data.itemSlots = itemSlots;
data.ownedBackpack = ownedBackpackType;
}
public void LoadInventory(InventorySaveData data)
{
ownedBackpackType = data.ownedBackpack;
if (data.itemSlots != null && data.itemSlots.Length > 0)
{
itemSlots = data.itemSlots;
// list is somehow corrupted, fill in the rest of the slots
if (itemSlots.Length < GetItemSlotNum())
{
ItemSlot[] newSlots = new ItemSlot[GetItemSlotNum()];
for (int i = 0; i < itemSlots.Length; i++)
{
if (itemSlots[i] != null)
newSlots[i] = itemSlots[i];
else
newSlots[i] = new ItemSlot();
}
itemSlots = newSlots;
}
}
else if (data.itemSlots != null && data.itemSlots.Length > GetItemSlotNum())
{
// list is bigger than it should be, generate new slots of the proper size
// and save just the items in the slots we SHOULD have. (shouldn't ever happen)
ItemSlot[] newSlots = new ItemSlot[GetItemSlotNum()];
for (int i = 0; i < newSlots.Length; i++)
{
if (itemSlots[i] != null)
newSlots[i] = itemSlots[i];
else
newSlots[i] = new ItemSlot();
}
itemSlots = newSlots;
}
else
{
itemSlots = new ItemSlot[GetItemSlotNum()];
for (int i = 0; i < itemSlots.Length; i++)
{
itemSlots[i] = new ItemSlot();
}
}
}
#endregion
}
public enum BackPackType
{
Pockets = 0,
SmallBag = 1,
LargeBag = 2
}
[System.Serializable]
public class ItemSlot
{
public int quantity;
public ItemIdEnum item;
}
[System.Serializable]
public struct InventorySaveData
{
public ItemSlot[] itemSlots;
public BackPackType ownedBackpack;
}