diff --git a/Source/inv.cpp b/Source/inv.cpp index c26be968c..71021381c 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -595,6 +595,55 @@ InvXY GetInventorySize(const ItemStruct &item) }; } +/** + * @brief Checks whether the given item can fit in a belt slot (i.e. the item's size in inventory cells is 1x1). + * @param item The item to be checked. + * @return 'True' in case the item can fit a belt slot and 'False' otherwise. + */ +bool FitsInBeltSlot(const ItemStruct &item) +{ + InvXY size = GetInventorySize(item); + + return size.X == 1 && size.Y == 1; +} + +/** + * @brief Checks whether the given item can be placed on the belt. Takes item size as well as characteristics into account. Items + * that cannot be placed on the belt have to be placed in the inventory instead. + * @param item The item to be checked. + * @return 'True' in case the item can be placed on the belt and 'False' otherwise. + */ +bool CanBePlacedOnBelt(const ItemStruct &item) +{ + return + FitsInBeltSlot(item) && + item._itype != ITYPE_GOLD && + item._iStatFlag && + AllItemsList[item.IDidx].iUsable; +} + +/** + * @brief Checks whether the given item can be placed on the specified player's belt. Returns 'True' when the item can be placed + * on belt slots and the player has at least one empty slot in his belt. + * @param playerNumber The player number on whose belt will be checked. + * @param item The item to be checked. + * @return 'True' in case the item can be placed on the player's belt and 'False' otherwise. + */ +bool CanBePlacedOnBelt(int playerNumber, const ItemStruct &item) +{ + if (!CanBePlacedOnBelt(item)) { + return false; + } + + for (int i = 0; i < MAXBELTITEMS; i++) { + if (plr[playerNumber].SpdList[i]._itype == ITYPE_NONE) { + return true; + } + } + + return false; +} + BOOL AutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag) { int i, j, xx, yy; @@ -681,16 +730,7 @@ BOOL SpecialAutoPlace(int pnum, int ii, const ItemStruct &item) yy += 10; } if (!done) { - if (itemSize.X > 1 || itemSize.Y > 1) { - done = FALSE; - } else { - for (i = 0; i < MAXBELTITEMS; i++) { - if (plr[pnum].SpdList[i]._itype == ITYPE_NONE) { - done = TRUE; - break; - } - } - } + done = CanBePlacedOnBelt(pnum, item); } return done;