/// <summary> /// Display equipment select overview /// </summary> private void DrawEquipmentSelect() { //Get screen handle RootConsole rootConsole = RootConsole.GetInstance(); //Draw frame rootConsole.DrawFrame(inventoryTL.x, inventoryTL.y, inventoryTR.x - inventoryTL.x + 1, inventoryBL.y - inventoryTL.y + 1, true); //Draw title rootConsole.PrintLineRect(inventoryTitle, (inventoryTL.x + inventoryTR.x) / 2, inventoryTL.y, inventoryTR.x - inventoryTL.x, 1, LineAlignment.Center); //Draw instructions rootConsole.PrintLineRect(inventoryInstructions, (inventoryTL.x + inventoryTR.x) / 2, inventoryBL.y, inventoryTR.x - inventoryTL.x, 1, LineAlignment.Center); //List the inventory //Inventory area is slightly reduced from frame int inventoryListX = inventoryTL.x + 2; int inventoryListW = inventoryTR.x - inventoryTL.x - 4; int inventoryListY = inventoryTL.y + 2; int inventoryListH = inventoryBL.y - inventoryTL.y - 4; List <InventoryListing> inventoryList = currentInventory.InventoryListing; for (int i = 0; i < inventoryListH; i++) { int inventoryIndex = topInventoryIndex + i; //End of inventory if (inventoryIndex == inventoryList.Count) { break; } //Create entry string char selectionChar = (char)((int)'a' + i); string entryString = "(" + selectionChar.ToString() + ") " + inventoryList[inventoryIndex].Description; //Add equipped status //Only consider the first item in a stack, since equipped items can't stack Item firstItemInStack = currentInventory.Items[inventoryList[inventoryIndex].ItemIndex[0]]; EquipmentSlotInfo equippedInSlot = currentEquipment.Find(x => x.equippedItem == firstItemInStack); if (equippedInSlot != null) { entryString += " (equipped: " + StringEquivalent.EquipmentSlots[equippedInSlot.slotType] + ")"; } //Print entry rootConsole.PrintLineRect(entryString, inventoryListX, inventoryListY + i, inventoryListW, 1, LineAlignment.Left); } }
/// <summary> /// Display equipment overlay /// </summary> private void DrawEquipment() { //Get screen handle RootConsole rootConsole = RootConsole.GetInstance(); //Use frame and strings from inventory for now //Draw frame rootConsole.DrawFrame(inventoryTL.x, inventoryTL.y, inventoryTR.x - inventoryTL.x + 1, inventoryBL.y - inventoryTL.y + 1, true); //Draw title rootConsole.PrintLineRect(inventoryTitle, (inventoryTL.x + inventoryTR.x) / 2, inventoryTL.y, inventoryTR.x - inventoryTL.x, 1, LineAlignment.Center); //Draw instructions rootConsole.PrintLineRect(inventoryInstructions, (inventoryTL.x + inventoryTR.x) / 2, inventoryBL.y, inventoryTR.x - inventoryTL.x, 1, LineAlignment.Center); //List current slots & items if filled //Equipment area is slightly reduced from frame int inventoryListX = inventoryTL.x + 2; int inventoryListW = inventoryTR.x - inventoryTL.x - 4; int inventoryListY = inventoryTL.y + 2; int inventoryListH = inventoryBL.y - inventoryTL.y - 4; for (int i = 0; i < inventoryListH; i++) { int inventoryIndex = topInventoryIndex + i; //End of inventory if (inventoryIndex == currentEquipment.Count) { break; } //Create entry string EquipmentSlotInfo currentSlot = currentEquipment[inventoryIndex]; char selectionChar = (char)((int)'a' + i); string entryString = "(" + selectionChar.ToString() + ") " + StringEquivalent.EquipmentSlots[currentSlot.slotType] + ": "; if (currentSlot.equippedItem == null) { entryString += "Empty"; } else { entryString += currentSlot.equippedItem.SingleItemDescription; } //Print entry rootConsole.PrintLineRect(entryString, inventoryListX, inventoryListY + i, inventoryListW, 1, LineAlignment.Left); } }
/// <summary> /// Predicate for matching equipment slot of EquipmentSlot type /// </summary> private static bool EquipmentSlotMatchesType(EquipmentSlotInfo equipSlot, EquipmentSlot type) { return (equipSlot.slotType == type); }
/// <summary> /// Predicate for matching equipment slot of EquipmentSlot type /// </summary> private static bool EquipmentSlotMatchesType(EquipmentSlotInfo equipSlot, EquipmentSlot type) { return(equipSlot.slotType == type); }
/// <summary> /// Equip an item. Item is removed from the main inventory. /// Returns true if item was used successfully. /// </summary> /// <param name="selectedGroup"></param> /// <returns></returns> public bool EquipItem(InventoryListing selectedGroup) { //Select the first item in the stack int itemIndex = selectedGroup.ItemIndex[0]; Item itemToUse = Inventory.Items[itemIndex]; //Check if this item is equippable IEquippableItem equippableItem = itemToUse as IEquippableItem; if (equippableItem == null) { LogFile.Log.LogEntryDebug("Can't equip item, not equippable: " + itemToUse.SingleItemDescription, LogDebugLevel.Medium); Game.MessageQueue.AddMessage("Can't equip " + itemToUse.SingleItemDescription); return(false); } //Find all matching slots available on the player List <EquipmentSlot> itemPossibleSlots = equippableItem.EquipmentSlots; List <EquipmentSlotInfo> matchingEquipSlots = new List <EquipmentSlotInfo>(); foreach (EquipmentSlot slotType in itemPossibleSlots) { matchingEquipSlots.AddRange(this.EquipmentSlots.FindAll(x => x.slotType == slotType)); } //No suitable slots if (matchingEquipSlots.Count == 0) { LogFile.Log.LogEntryDebug("Can't equip item, no valid slots: " + itemToUse.SingleItemDescription, LogDebugLevel.Medium); Game.MessageQueue.AddMessage("Can't equip " + itemToUse.SingleItemDescription); return(false); } //Look for first empty slot EquipmentSlotInfo freeSlot = matchingEquipSlots.Find(x => x.equippedItem == null); if (freeSlot == null) { //Not slots free, unequip first slot Item oldItem = matchingEquipSlots[0].equippedItem; IEquippableItem oldItemEquippable = oldItem as IEquippableItem; //Sanity check if (oldItemEquippable == null) { LogFile.Log.LogEntry("Currently equipped item is not equippable!: " + oldItem.SingleItemDescription); return(false); } //Run unequip routine oldItemEquippable.UnEquip(this); oldItem.IsEquipped = false; //Can't do this right now, since not in inventory items appear on the floor //This slot is now free freeSlot = matchingEquipSlots[0]; } //We now have a free slot to equip in //Put new item in first relevant slot and run equipping routine matchingEquipSlots[0].equippedItem = itemToUse; equippableItem.Equip(this); itemToUse.IsEquipped = true; //Update the inventory listing since equipping an item changes its stackability Inventory.RefreshInventoryListing(); //Message the user LogFile.Log.LogEntryDebug("Item equipped: " + itemToUse.SingleItemDescription, LogDebugLevel.Low); Game.MessageQueue.AddMessage(itemToUse.SingleItemDescription + " equipped in " + StringEquivalent.EquipmentSlots[matchingEquipSlots[0].slotType]); return(true); }