2022-11-13 19:52:09 -08:00
|
|
|
using System.Collections.Generic;
|
|
|
|
using Godot;
|
|
|
|
using SupaLidlGame.Characters;
|
|
|
|
|
|
|
|
namespace SupaLidlGame.Items
|
|
|
|
{
|
|
|
|
public partial class Inventory : Node2D
|
|
|
|
{
|
|
|
|
public Character Character { get; private set; }
|
|
|
|
|
|
|
|
public List<Item> Items { get; private set; } = new List<Item>();
|
|
|
|
|
|
|
|
public const int MaxCapacity = 32;
|
|
|
|
|
|
|
|
private Item _selectedItem;
|
|
|
|
|
2023-03-19 23:36:36 -07:00
|
|
|
private Item _offhandItem;
|
|
|
|
|
2022-11-13 19:52:09 -08:00
|
|
|
public Item SelectedItem
|
|
|
|
{
|
|
|
|
get => _selectedItem;
|
2023-03-19 23:36:36 -07:00
|
|
|
set => EquipItem(value, ref _selectedItem);
|
|
|
|
}
|
|
|
|
|
|
|
|
public Item OffhandItem
|
|
|
|
{
|
|
|
|
get => _selectedItem;
|
|
|
|
set => EquipItem(value, ref _offhandItem);
|
|
|
|
}
|
|
|
|
|
|
|
|
private bool EquipItem(Item item, ref Item slot)
|
|
|
|
{
|
|
|
|
if (item is not null && item.IsOneHanded)
|
2022-11-13 19:52:09 -08:00
|
|
|
{
|
2023-03-19 23:36:36 -07:00
|
|
|
// we can not equip this if either hand is occupied by
|
|
|
|
// two-handed item
|
|
|
|
|
|
|
|
if (_selectedItem is not null && !_selectedItem.IsOneHanded)
|
2022-11-13 19:52:09 -08:00
|
|
|
{
|
2023-03-19 23:36:36 -07:00
|
|
|
return false;
|
2022-11-13 19:52:09 -08:00
|
|
|
}
|
|
|
|
|
2023-03-19 23:36:36 -07:00
|
|
|
if (_offhandItem is not null && !_offhandItem.IsOneHanded)
|
2022-11-13 19:52:09 -08:00
|
|
|
{
|
2023-03-19 23:36:36 -07:00
|
|
|
return false;
|
2022-11-13 19:52:09 -08:00
|
|
|
}
|
2023-03-19 23:36:36 -07:00
|
|
|
}
|
2022-11-13 19:52:09 -08:00
|
|
|
|
2023-03-19 23:36:36 -07:00
|
|
|
if (!Items.Contains(item))
|
|
|
|
{
|
|
|
|
GD.PrintErr("Tried to equip an item not in the inventory.");
|
|
|
|
return false;
|
|
|
|
}
|
2022-11-13 19:52:09 -08:00
|
|
|
|
2023-03-19 23:36:36 -07:00
|
|
|
if (slot is not null)
|
|
|
|
{
|
|
|
|
slot.Unequip(Character);
|
2022-11-13 19:52:09 -08:00
|
|
|
}
|
2023-03-19 23:36:36 -07:00
|
|
|
|
|
|
|
slot = item;
|
|
|
|
|
|
|
|
if (item is not null)
|
|
|
|
{
|
|
|
|
item.Equip(Character);
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
2022-11-13 19:52:09 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
public Item AddItem(Item item)
|
|
|
|
{
|
|
|
|
if (Items.Count >= MaxCapacity)
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2022-11-19 21:21:12 -08:00
|
|
|
item.CharacterOwner = Character;
|
|
|
|
item.Visible = false;
|
2022-11-13 19:52:09 -08:00
|
|
|
Items.Add(item);
|
|
|
|
return item;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Item DropItem(Item item)
|
|
|
|
{
|
2022-11-19 21:21:12 -08:00
|
|
|
item.CharacterOwner = null;
|
|
|
|
item.Visible = true;
|
2023-03-19 23:36:36 -07:00
|
|
|
var e = SelectedItem = item;
|
2022-11-13 19:52:09 -08:00
|
|
|
throw new System.NotImplementedException();
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void _Ready()
|
|
|
|
{
|
2022-11-19 21:21:12 -08:00
|
|
|
Character = GetParent<Character>();
|
2022-11-18 13:53:51 -08:00
|
|
|
foreach (Node child in GetChildren())
|
|
|
|
{
|
|
|
|
if (child is Item item)
|
|
|
|
{
|
2022-11-19 21:21:12 -08:00
|
|
|
AddItem(item);
|
2022-11-18 13:53:51 -08:00
|
|
|
}
|
|
|
|
}
|
2022-11-13 19:52:09 -08:00
|
|
|
base._Ready();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|