using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using UnityEngine; namespace DDD { public class InventoryManager : Singleton, IManager { private Dictionary _itemDataLookup; private Dictionary _inventoryItemDatas; public void PreInit() { } public Task Init() { return Task.CompletedTask; } public void PostInit() { InitializeItemData(); // TODO : 테스트용 이후 삭제 AddItem("item_food_recipe_001"); AddItem("item_food_recipe_002"); AddItem("item_food_recipe_003"); AddItem("item_drink_recipe_001"); AddItem("item_drink_recipe_002"); AddItem("item_ingredient_001", 12); AddItem("item_ingredient_002", 6); AddItem("item_ingredient_003", 3); AddItem("item_ingredient_004", 5); AddItem("item_ingredient_005", 1); AddItem("item_ingredient_006", 5); AddItem("item_ingredient_021", 8); AddItem("item_ingredient_023", 5); } private void InitializeItemData() { var itemDataSo = DataManager.Instance.ItemDataSo; Debug.Assert(itemDataSo != null, "itemDataSo != null"); _itemDataLookup = itemDataSo.GetDataList() .Where(item => !string.IsNullOrEmpty(item.Id)) .ToDictionary(item => item.Id, item => item); _inventoryItemDatas = new Dictionary(itemDataSo.GetDataCount()); } public bool AddItem(string id, int quantity = 1) { if (!_itemDataLookup.ContainsKey(id)) { Debug.LogError($"[Inventory] 등록되지 않은 아이템 ID: {id}"); return false; } if (_inventoryItemDatas.TryGetValue(id, out var itemData)) { itemData.Quantity += quantity; } else { _inventoryItemDatas[id] = new InventoryItemData(id, quantity); } InventoryChangedEvent evt = GameEvents.InventoryChangedEvent; evt.ItemId = id; evt.NewCount = GetItemCount(id); EventBus.Broadcast(evt); return true; } public bool RemoveItem(string id, int quantity = 1) { if (!_inventoryItemDatas.TryGetValue(id, out var itemData)) { Debug.LogError($"[Inventory] 등록되지 않은 아이템 ID: {id}"); return false; } if (itemData.Quantity < quantity) { Debug.LogWarning($"[Inventory] 보유 수량보다 삭제하는 수량이 더 많습니다 " + $"{id}, 보유 수량 : {itemData.Quantity}, 삭제 수량 : {quantity}"); return false; } itemData.Quantity -= quantity; if (itemData.Quantity <= 0) { _inventoryItemDatas.Remove(id); } InventoryChangedEvent evt = GameEvents.InventoryChangedEvent; evt.ItemId = id; evt.NewCount = GetItemCount(id); EventBus.Broadcast(evt); return true; } public IReadOnlyDictionary InventoryItems => _inventoryItemDatas; public bool TryGetItemData(string id, out ItemData itemData) => _itemDataLookup.TryGetValue(id, out itemData); public int GetItemCount(string id) => _inventoryItemDatas.TryGetValue(id, out var itemData) ? itemData.Quantity : 0; public ItemData GetItemDataByIdOrNull(string id) { _itemDataLookup.TryGetValue(id, out var itemData); return itemData; } } }