using Godot; using System; using System.Collections.Generic; using System.Linq; using Cirno.Scripts; using Cirno.Scripts.Resources; public partial class InventoryManager : Node2D { public bool RedKeycard { get; set; } private List _items = new List(); private Dictionary _itemsDict = new Dictionary(); public Dictionary Items => _itemsDict; [Signal] public delegate void ItemAddedEventHandler(LootItem item, int currentAmount); [Signal] public delegate void ItemRemovedEventHandler(LootItem item, int currentAmount); // Called when the node enters the scene tree for the first time. public override void _Ready() { } // Called every frame. 'delta' is the elapsed time since the previous frame. public override void _Process(double delta) { } public bool HasItems(List items) { return items.Aggregate(false, (current, item) => current || HasItem(item)); } public bool HasItem(ItemTypes type) { return _items.Any(x => x.Item == type && x.Amount > 0); } public int RemoveItem(LootItem item, int amount) { if (_itemsDict.ContainsKey(item.ItemKey)) { var itm = _itemsDict[item.ItemKey]; int removed = 0; itm.Count -= amount; if (itm.Count <= 0) { _itemsDict.Remove(item.ItemKey); } EmitSignal(nameof(ItemRemoved), item, item.Amount); return itm.Count; } return 0; } public bool AddItem(LootItem item) { //var item = new LootItem() { Item = type, Amount = amount }; if (!_itemsDict.TryGetValue(item.ItemKey, out var itm)) { _itemsDict.Add(item.ItemKey, new ItemContainer() { Item = item, Count = item.Amount, }); GD.Print($"Added new ({item.ItemKey}) {item.Item} x{item.Amount}"); EmitSignal(nameof(ItemAdded), item, item.Amount); } else { if (itm.Count < item.Amount) { itm.Count += item.Amount; } else { if (item.PickupIfMaxed) { itm.Count = item.Max; } else { return false; } } EmitSignal(nameof(ItemAdded), item, itm.Count, item.Amount); } return true; } public void AddRedKeycard() { RedKeycard = true; } public void RemoveRedKeycard() { RedKeycard = false; } } public class ItemContainer { public LootItem Item { get; set; } public int Count { get; set; } }