/// <summary> /// Buys item from NPC inventory /// The way it works is exchange the money and remove ItemObject from NPC inventory, then adds the ItemObject to Player inventory /// </summary> private void BuyItem(BaseCharacter playerChar, BaseCharacter npcChar) { if (_isItemFromNpc) { var itemPrice = _npcPrices[_selectedItemObject]; if (playerChar.Gold >= itemPrice) { playerChar.Gold -= short.Parse(itemPrice.ToString()); npcChar.Gold += short.Parse(itemPrice.ToString()); UpdateNpcPlayerWealthString(); if (_playerPrices.Count >= 27) { return; } // Check if player has the item in their inventory to prevent same key error if (!_playerPrices.ContainsKey(_selectedItemObject)) { // Add item to player item cell var itemCellToAdd = FindAvailableItemCell(false); var itemCellRawImgToAdd = itemCellToAdd.transform.GetChild(0).GetComponent <Image>(); // Set texture itemCellRawImgToAdd.sprite = _selectedItemObject.uiDisplay; var color = itemCellRawImgToAdd.color; color = new Color(color.r, color.g, color.b, 255f); itemCellRawImgToAdd.color = color; _playerPrices.Add(_selectedItemObject, Mathf.RoundToInt(_selectedItemObject.data.price * _playerRate)); // Add item to inventory object var emptyInventorySlot = playerInv.FindAvailableSlot(playerInv); emptyInventorySlot.item.Name = _selectedItemObject.name; emptyInventorySlot.item.level = _selectedItemObject.data.level; emptyInventorySlot.item.Id = _selectedItemObject.data.Id; emptyInventorySlot.item.price = _playerPrices[_selectedItemObject]; emptyInventorySlot.amount = 1; if (_npcPrices != null) { UpdateItemSlots(_npcPrices, true); } if (_playerPrices != null) { UpdateItemSlots(_playerPrices, false); } // updating amount string UpdateAmountString(); } else if (_selectedItemObject.stackable) // Check to see if the itemObject is stackable { playerInv.FindItemOnInventorySlot(_selectedItemObject).AddAmount(1); if (_npcPrices != null) { UpdateItemSlots(_npcPrices, true); } if (_playerPrices != null) { UpdateItemSlots(_playerPrices, false); } // updating amount string UpdateAmountString(); } else if (_selectedItemObject.stackable == false) { // Add item to player item cell var itemCellToAdd = FindAvailableItemCell(false); var itemCellRawImgToAdd = itemCellToAdd.transform.GetChild(0).GetComponent <Image>(); // Set texture itemCellRawImgToAdd.sprite = _selectedItemObject.uiDisplay; var color = itemCellRawImgToAdd.color; color = new Color(color.r, color.g, color.b, 255f); itemCellRawImgToAdd.color = color; // Add item to inventory object var emptyInventorySlot = playerInv.FindAvailableSlot(playerInv); emptyInventorySlot.item.Name = _selectedItemObject.name; emptyInventorySlot.item.level = _selectedItemObject.data.level; emptyInventorySlot.item.Id = _selectedItemObject.data.Id; emptyInventorySlot.item.price = _playerPrices[_selectedItemObject]; emptyInventorySlot.amount = 1; // Add Item to dict var itemObject = ScriptableObject.CreateInstance <ItemObject>(); itemObject.description = _selectedItemObject.description; itemObject.stackable = _selectedItemObject.stackable; itemObject.type = _selectedItemObject.type; itemObject.characterDisplay = _selectedItemObject.characterDisplay; itemObject.uiDisplay = _selectedItemObject.uiDisplay; itemObject.is1HWeapon = _selectedItemObject.is1HWeapon; itemObject.data.level = _selectedItemObject.data.level; itemObject.data.price = _selectedItemObject.data.price; itemObject.data.Id = _selectedItemObject.data.Id; itemObject.data.Name = _selectedItemObject.data.Name + "123"; itemObject.name = _selectedItemObject.name; _playerPrices.Add(itemObject, Mathf.RoundToInt(_playerRate * _selectedItemObject.data.price)); if (_npcPrices != null) { UpdateItemSlots(_npcPrices, true); } if (_playerPrices != null) { UpdateItemSlots(_playerPrices, false); } // Updating amount string UpdateAmountString(); } var itemInventoryToEdit = npcRole.inventory.FindItemOnInventorySlot(_selectedItemObject); npcRole.inventory.FindItemOnInventorySlot(_selectedItemObject).RemoveItem(1); // Check the item amount of that inventory slot if (itemInventoryToEdit.amount <= 0) { // Removing all texture from item slots foreach (var selectedItemCellRawImg in _itemCellListNpc.Select(itemSlot => itemSlot.transform.GetChild(0).GetComponent <Image>())) { selectedItemCellRawImg.sprite = null; var color = selectedItemCellRawImg.color; color = new Color(color.r, color.g, color.b, 0f); selectedItemCellRawImg.color = color; } // Set the inventory to null as there will be 0 amount for the specified item itemInventoryToEdit.amount = 0; itemInventoryToEdit.item.Name = null; itemInventoryToEdit.item.Id = -1; _npcPrices.Remove(_selectedItemObject); // Remove the key from dict since there is 0 amount of that item var itemCellToNull = ExtractNumberFromString(_selectedItemCell.name) - 1; var itemCellToNullRawImgCom = _itemCellListNpc[itemCellToNull].transform.GetChild(0).GetComponent <Image>(); itemCellToNullRawImgCom.sprite = null; var color1 = itemCellToNullRawImgCom.color; color1 = new Color(color1.r, color1.g, color1.b, 0f); itemCellToNullRawImgCom.color = color1; if (_npcPrices != null) { UpdateItemSlots(_npcPrices, true); } if (_playerPrices != null) { UpdateItemSlots(_playerPrices, false); } EmptyItemDetails(0); _selectedItemCell = null; _isSelectedItemCell = false; _isItemFromPlayer = false; _isItemFromNpc = false; } else { _onSelectedImageCom.enabled = true; if (_npcPrices != null) { UpdateItemSlots(_npcPrices, true); } if (_playerPrices != null) { UpdateItemSlots(_playerPrices, false); } UpdateAmountString(); if (npcRole.inventory.FindItemOnInventorySlot(_selectedItemObject).amount > 0) { return; } EmptyItemDetails(0); _selectedItemCell = null; _isSelectedItemCell = false; _isItemFromPlayer = false; _isItemFromNpc = false; var selectedItemCellRawImg = _selectedItemCell != null?_selectedItemCell.transform.GetChild(0).GetComponent <Image>() : null; if (selectedItemCellRawImg is null) { return; } selectedItemCellRawImg.sprite = null; var color = selectedItemCellRawImg.color; color = new Color(color.r, color.g, color.b, 0f); selectedItemCellRawImg.color = color; } } else { // TODO a message to tell the player that he dont have enough money } } else { // TODO possibly a message to tell the player that his inventory is full } }