diff --git a/Source/inv.cpp b/Source/inv.cpp index a5716b8ae..55d61218e 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -830,6 +830,77 @@ void CheckInvCut(int pnum, Point cursorPosition, bool automaticMove, bool dropIt if (CanBePlacedOnBelt(holdItem)) { automaticallyMoved = AutoPlaceItemInBelt(player, holdItem, true); } else { + /* + * Move the respective InvBodyItem to inventory before moving the item from inventory + * to InvBody with AutoEquip. AutoEquip requires the InvBody slot to be empty. + * First identify the correct InvBody slot and store it in invloc. + */ + automaticallyUnequip = true; // Switch to say "I have no room when inventory is too full" + int invloc = NUM_INVLOC; + switch (holdItem._iLoc) { + case ILOC_ARMOR: + invloc = INVLOC_CHEST; + break; + case ILOC_HELM: + invloc = INVLOC_HEAD; + break; + case ILOC_AMULET: + invloc = INVLOC_AMULET; + break; + case ILOC_ONEHAND: + // Ensure shield is on the right, weapon on the left. + if (player.InvBody[INVLOC_HAND_LEFT]._itype == ItemType::Shield) { + SwapItem(&player.InvBody[INVLOC_HAND_RIGHT], &player.InvBody[INVLOC_HAND_LEFT]); + } + // User is attempting to move a weapon (left hand) + if (player.InvList[iv - 1]._iClass == player.InvBody[INVLOC_HAND_LEFT]._iClass + && player.InvList[iv - 1]._iLoc == player.InvBody[INVLOC_HAND_LEFT]._iLoc) { + invloc = INVLOC_HAND_LEFT; + } + // User is attempting to move a shield (right hand) + if (player.InvList[iv - 1]._iClass == player.InvBody[INVLOC_HAND_RIGHT]._iClass + && player.InvList[iv - 1]._iLoc == player.InvBody[INVLOC_HAND_RIGHT]._iLoc) { + invloc = INVLOC_HAND_RIGHT; + } + // A two-hand item can always be replaced with a one-hand item + if (player.InvBody[INVLOC_HAND_LEFT]._iLoc == ILOC_TWOHAND) { + invloc = INVLOC_HAND_LEFT; + } + break; + case ILOC_TWOHAND: + // Moving a two-hand item from inventory to InvBody requires emptying both hands + if (!player.InvBody[INVLOC_HAND_RIGHT].isEmpty()) { + holdItem = player.InvBody[INVLOC_HAND_RIGHT]; + if (!AutoPlaceItemInInventory(player, holdItem, true)) { + // No space to move right hand item to inventory, abort. + break; + } + holdItem = player.InvBody[INVLOC_HAND_LEFT]; + if (!AutoPlaceItemInInventory(player, holdItem, false)) { + // No space for left item. Move back right item to right hand and abort. + player.InvBody[INVLOC_HAND_RIGHT] = player.InvList[player._pNumInv - 1]; + player.RemoveInvItem(player._pNumInv - 1, false); + break; + } + player.InvBody[INVLOC_HAND_RIGHT]._itype = ItemType::None; + invloc = INVLOC_HAND_LEFT; + } else { + invloc = INVLOC_HAND_LEFT; + } + break; + default: + automaticallyUnequip = false; // Switch to say "I can't do that" + invloc = NUM_INVLOC; + break; + } + // Empty the identified InvBody slot (invloc) and hand over to AutoEquip + holdItem = player.InvBody[invloc]; + if (player.InvBody[invloc]._itype != ItemType::None) { + if (invloc != NUM_INVLOC && AutoPlaceItemInInventory(player, holdItem, true)) { + player.InvBody[invloc]._itype = ItemType::None; + } + } + holdItem = player.InvList[iv - 1]; automaticallyMoved = automaticallyEquipped = AutoEquip(pnum, holdItem); } }