Ejemplo n.º 1
0
        /// <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
            }
        }