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 Dictionary _itemsDict = new Dictionary(); public List Items => _itemsDict.Where(x => x.Value.Count > 0).Select(x => x.Value).ToList(); [Signal] public delegate void ItemAddedEventHandler(LootItem item, int currentAmount); [Signal] public delegate void ItemRemovedEventHandler(string itemKey, int currentAmount); [Signal] public delegate void WeaponEquipEventHandler(string itemKey); // 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 itemKeys) { return itemKeys.Aggregate(false, (current, item) => current || GetItemCount(item) > 0); } public int GetItemCount(string itemKey) { return _itemsDict.TryGetValue(itemKey, out var itm) ? itm.Count : 0; } public int RemoveItem(string itemKey, int amount) { if (!_itemsDict.TryGetValue(itemKey, out var itm)) return 0; int removed = Math.Min(itm.Count, amount); itm.Count -= amount; if (itm.Count <= 0) { _itemsDict.Remove(itemKey); } EmitSignal(nameof(ItemRemoved), itemKey, itm.Count); return removed; } 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.Max) { itm.Count += item.Amount; } else { if (item.PickupIfMaxed) { itm.Count = item.Max; } else { return false; } } EmitSignal(nameof(ItemAdded), item, itm.Count); } return true; } public void AddRedKeycard() { RedKeycard = true; } public void RemoveRedKeycard() { RedKeycard = false; } public bool UseItem(string itemKey) { if (!_itemsDict.TryGetValue(itemKey, out var itm)) return false; if (itm.Count == 0) return false; switch (itm.Item.Item) { case ItemTypes.Medkit: // Heal break; case ItemTypes.FrogBomb: // Use Bomb break; case ItemTypes.Bomb: // Bomb break; case ItemTypes.Mine: break; case ItemTypes.Battery: break; case ItemTypes.Weapon: // Equip weapon EmitSignal(SignalName.WeaponEquip, itm.Item.ItemKey); break; } return true; } } public class ItemContainer { public LootItem Item { get; set; } public int Count { get; set; } }