/// <summary> /// Attempts to put on a wearable InventoryItem if there is space. Does not remove items to do so. /// </summary> /// <param name="item">Item to put on</param> private static void Equip(InventoryItem item) { if (item == null || !(item is IWearable)) { return; } var wornItem = item as IWearable; if (wornItem.Equipped) { return; } // Identify all items of the same class that are equiped. Most classes will have only // one item equiped at a time, but rings may have more than one. This list is used to // handle removing and replacing one worn item with another. List <InventoryItem> replaces = new List <InventoryItem>(); foreach (var kvPair in inventoryContents) // UniqueID, InventoryItem { if (kvPair.Value.Class != item.Class) { continue; } // If they are the same class, then assume IWearable if ((kvPair.Value as IWearable).Equipped) { replaces.Add(kvPair.Value); } } string attemptResponse = wornItem.Equip(replaces); if (attemptResponse != string.Empty) { InventoryEffectManager.AddMessageToQueue(attemptResponse); closingWindow = true; } GameText inventoryText = inventoryList[searchString]; inventoryText.Text = item.InventoryTitle + wornItem.WornOn; inventoryList.Remove(searchString); inventoryList.Add(item.SortingValue, inventoryText); }
/// <summary> /// Attempts to unequip an item if it is not cursed. Cursed items are blocked from removal. /// </summary> /// <param name="item">Item to remove from body</param> private static void Unequip(InventoryItem item) { if (item == null || !(item is IWearable)) { return; } var wornItem = item as IWearable; if (!wornItem.Equipped) { return; } string attemptResponse = wornItem.Unequip(); if (attemptResponse != string.Empty) { InventoryEffectManager.AddMessageToQueue(attemptResponse); closingWindow = true; } inventoryList[searchString].Text = item.InventoryTitle + wornItem.WornOn; // Because removal may fail }
internal static void RemoveCurseItem(bool selected = false) { InventoryEffectManager.AddMessageToQueue("Remove Curse effect not implemented yet."); }
/// <summary> /// Separates a consumable from the stack (if stackable) and consumes it triggering its effect. /// The weight is adjusted with the loss of the item and the item is removed from the list if it /// is the last of its kind in the stack or otherwise not stackable. Consumed items do not get dropped /// to the floor. /// </summary> /// <param name="item">Item to be consumed.</param> private static void Consume(InventoryItem item) { if (item == null || !(item is IConsumable)) { return; } IConsumable consumedItem; bool lastOfStack = false; if (item is IStackable && (item as IStackable).Qty > 1) { // Preserve old inventoryList Dictionary values on item var oldItemSortingValue = item.SortingValue; var oldItemInventoryGameText = inventoryList[oldItemSortingValue]; // Remove old item from inventoryList (not contents though) inventoryList.Remove(oldItemSortingValue); // Get the consumed item by removing it from the stack consumedItem = (IConsumable)((item as IStackable).Remove()); // Update the GameText object using the new InventoryTitle (incorperates qty change) oldItemInventoryGameText.Text = item.InventoryTitle; // Insert the updated data back into the Dictionary (because the key is different, we couldn't just change it) inventoryList.Add(item.SortingValue, oldItemInventoryGameText); } else { consumedItem = item as IConsumable; lastOfStack = true; } string listKey = item.SortingValue; // Preserve old key in case using an item renames it. // Consume the item and get the string response from it for the message log // Note, that in order for remaining items in the stack to get the new name, Consume must be // called on the stack, not the item being tossed away. string attemptResponse = (item as IConsumable).Consume(); if (attemptResponse != string.Empty) { InventoryEffectManager.AddMessageToQueue(attemptResponse); } if (InventoryEffectManager.HasMessages && currentSelectionAction == SelectionActions.None) { closingWindow = true; } // If last in the stack, remove the stack and update inventory weight if (lastOfStack && inventoryContents.Remove(item.UniqueID)) { inventoryList.Remove(listKey); weight -= item.InventoryWeight; } else // otherwise just update the inventory weight and text if (!lastOfStack) { weight -= (consumedItem as InventoryItem).InventoryWeight; if (item.SortingValue != listKey) { GameText textItem = inventoryList[listKey]; textItem.Text = item.InventoryTitle; inventoryList.Remove(listKey); inventoryList.Add(item.SortingValue, textItem); } } else { throw new IndexOutOfRangeException("Item to be removed not found in the Inventory's Contents List"); } UpdateCurrentItem(); }