diff options
Diffstat (limited to 'src/resources/inventory')
-rw-r--r-- | src/resources/inventory/complexinventory.cpp | 170 | ||||
-rw-r--r-- | src/resources/inventory/complexinventory.h | 65 | ||||
-rw-r--r-- | src/resources/inventory/inventory.cpp | 556 | ||||
-rw-r--r-- | src/resources/inventory/inventory.h | 219 |
4 files changed, 0 insertions, 1010 deletions
diff --git a/src/resources/inventory/complexinventory.cpp b/src/resources/inventory/complexinventory.cpp deleted file mode 100644 index c6037fe38..000000000 --- a/src/resources/inventory/complexinventory.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "resources/inventory/complexinventory.h" - -#include "logger.h" - -#include "being/playerinfo.h" - -#include "utils/cast.h" - -#include "resources/item/complexitem.h" - -#include "debug.h" - -ComplexInventory::ComplexInventory(const InventoryTypeT type, - const int size1) : - Inventory(type, size1) -{ -} - -ComplexInventory::~ComplexInventory() -{ -} - -bool ComplexInventory::addVirtualItem(const Item *const item, - int index, - const int amount) -{ - if ((item == nullptr) || PlayerInfo::isItemProtected(item->getId())) - return false; - - if (index >= 0 && index < CAST_S32(mSize)) - { - ComplexItem *citem = nullptr; - if (mItems[index] != nullptr) - { - const Item *const item2 = mItems[index]; - if (item->getId() != item2->getId() || - item->getColor() != item2->getColor()) - { // not same id or color - return false; - } - citem = dynamic_cast<ComplexItem*>(mItems[index]); - if (citem == nullptr) - { // if in inventory not complex item, converting it to complex - citem = new ComplexItem(item2->getId(), - item2->getType(), - item2->getQuantity(), - item2->getRefine(), - item2->getColor(), - item2->getIdentified(), - item2->getDamaged(), - item2->getFavorite(), - Equipm_false, - Equipped_false); - citem->setTag(item2->getTag()); - delete mItems[index]; - mItems[index] = citem; - } - } - else - { - citem = new ComplexItem(item->getId(), - item->getType(), - 0, - item->getRefine(), - item->getColor(), - item->getIdentified(), - item->getDamaged(), - item->getFavorite(), - Equipm_false, - Equipped_false); - mItems[index] = citem; - } - citem->addChild(item, amount); - } - else - { - index = addItem(item->getId(), - item->getType(), - 1, - 1, - item->getColor(), - item->getIdentified(), - item->getDamaged(), - item->getFavorite(), - Equipm_false, - Equipped_false); - } - if (index == -1) - return false; - - Item *const item2 = getItem(index); - if (item2 != nullptr) - item2->setTag(item->getInvIndex()); - return true; -} - -void ComplexInventory::setItem(const int index, - const int id, - const ItemTypeT type, - const int quantity, - const uint8_t refine, - const ItemColor color, - const Identified identified, - const Damaged damaged, - const Favorite favorite, - const Equipm equipment, - const Equipped equipped) -{ - if (index < 0 || index >= CAST_S32(mSize)) - { - logger->log("Warning: invalid inventory index: %d", index); - return; - } - - const Item *const item1 = mItems[index]; - if ((item1 == nullptr) && id > 0) - { - ComplexItem *const item = new ComplexItem(id, - type, - quantity, - refine, - color, - identified, - damaged, - favorite, - equipment, - equipped); - item->setInvIndex(index); - - Item *const item2 = new Item(id, - type, - quantity, - refine, - color, - identified, - damaged, - favorite, - equipment, - equipped); - item2->setInvIndex(index); - item->addChild(item2, quantity); - delete item2; - - mItems[index] = item; - mUsed ++; - distributeSlotsChangedEvent(); - } -} diff --git a/src/resources/inventory/complexinventory.h b/src/resources/inventory/complexinventory.h deleted file mode 100644 index f016ab5e5..000000000 --- a/src/resources/inventory/complexinventory.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef RESOURCES_INVENTORY_COMPLEXINVENTORY_H -#define RESOURCES_INVENTORY_COMPLEXINVENTORY_H - -#include "resources/inventory/inventory.h" - -#include "localconsts.h" - -class ComplexInventory final : public Inventory -{ - public: - A_DELETE_COPY(ComplexInventory) - - /** - * Constructor. - * - * @param size the number of items that fit in the inventory - */ - explicit ComplexInventory(const InventoryTypeT type, - const int size = -1); - - /** - * Destructor. - */ - ~ComplexInventory(); - - bool addVirtualItem(const Item *const item, - int index, - const int amount) override final; - - void setItem(const int index, - const int id, - const ItemTypeT type, - const int quantity, - const uint8_t refine, - const ItemColor color, - const Identified identified, - const Damaged damaged, - const Favorite favorite, - const Equipm equipment, - const Equipped equipped) override final; -}; - -#endif // RESOURCES_INVENTORY_COMPLEXINVENTORY_H diff --git a/src/resources/inventory/inventory.cpp b/src/resources/inventory/inventory.cpp deleted file mode 100644 index d256ea9ac..000000000 --- a/src/resources/inventory/inventory.cpp +++ /dev/null @@ -1,556 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "resources/inventory/inventory.h" - -#include "being/playerinfo.h" - -#include "net/inventoryhandler.h" - -#include "resources/iteminfo.h" - -#include "resources/item/item.h" - -#include "listeners/inventorylistener.h" - -#include "utils/checkutils.h" -#include "utils/delete2.h" -#include "utils/foreach.h" -#include "utils/gettext.h" -#include "utils/stringutils.h" - -#include <algorithm> - -#include "debug.h" - -namespace -{ - struct SlotUsed final - { - A_DEFAULT_COPY(SlotUsed) - - bool operator()(const Item *const item) const - { - return (item != nullptr) && item->mId >= 0 && item->mQuantity > 0; - } - typedef Item *argument_type; - }; -} // namespace - -Inventory::Inventory(const InventoryTypeT type, - const int size1) : - mInventoryListeners(), - mVirtualRemove(), - mType(type), - mSize(size1 == -1 ? CAST_U32( - inventoryHandler->getSize(type)) - : CAST_U32(size1)), - mItems(new Item*[mSize]), - mUsed(0) -{ - std::fill_n(mItems, mSize, static_cast<Item*>(nullptr)); -} - -Inventory::~Inventory() -{ - for (unsigned i = 0; i < mSize; i++) - delete mItems[i]; - - delete [] mItems; - mItems = nullptr; -} - -Item *Inventory::getItem(const int index) const -{ - if (index < 0 || index >= CAST_S32(mSize) || (mItems[index] == nullptr) - || mItems[index]->mQuantity <= 0) - { - return nullptr; - } - - return mItems[index]; -} - -Item *Inventory::findItem(const int itemId, - const ItemColor color) const -{ - for (unsigned i = 0; i < mSize; i++) - { - Item *const item = mItems[i]; - if ((item != nullptr) && item->mId == itemId) - { - if (color == ItemColor_zero || - item->mColor == color || - (color == ItemColor_one && - item->mColor <= ItemColor_one)) - { - return item; - } - } - } - - return nullptr; -} - -int Inventory::addItem(const int id, - const ItemTypeT type, - const int quantity, - const uint8_t refine, - const ItemColor color, - const Identified identified, - const Damaged damaged, - const Favorite favorite, - const Equipm equipment, - const Equipped equipped) -{ - const int slot = getFreeSlot(); - setItem(slot, - id, - type, - quantity, - refine, - color, - identified, - damaged, - favorite, - equipment, - equipped); - return slot; -} - -void Inventory::setItem(const int index, - const int id, - const ItemTypeT type, - const int quantity, - const uint8_t refine, - const ItemColor color, - const Identified identified, - const Damaged damaged, - const Favorite favorite, - const Equipm equipment, - const Equipped equipped) -{ - if (index < 0 || index >= CAST_S32(mSize)) - { - reportAlways("Warning: invalid inventory index: %d", - index); - return; - } - - Item *const item1 = mItems[index]; - if ((item1 == nullptr) && id > 0) - { - Item *const item = new Item(id, - type, - quantity, - refine, - color, - identified, - damaged, - favorite, - equipment, - equipped); - item->setInvIndex(index); - mItems[index] = item; - mUsed++; - distributeSlotsChangedEvent(); - } - else if (id > 0 && (item1 != nullptr)) - { - item1->setId(id, color); - item1->setQuantity(quantity); - item1->setRefine(refine); - item1->setEquipment(equipment); - item1->setIdentified(identified); - item1->setDamaged(damaged); - item1->setFavorite(favorite); - } - else if (item1 != nullptr) - { - removeItemAt(index); - } -} - -void Inventory::setCards(const int index, - const int *const cards, - const int size) const -{ - if (index < 0 || index >= CAST_S32(mSize)) - { - reportAlways("Warning: invalid inventory index: %d", - index); - return; - } - - Item *const item1 = mItems[index]; - if (item1 != nullptr) - item1->setCards(cards, size); -} - -void Inventory::setOptions(const int index, - const ItemOptionsList *const options) -{ - if (index < 0 || index >= CAST_S32(mSize)) - { - reportAlways("Warning: invalid inventory index: %d", - index); - return; - } - Item *const item1 = mItems[index]; - if (item1 != nullptr) - item1->setOptions(options); -} - -void Inventory::setTag(const int index, - const int tag) -{ - if (index < 0 || index >= CAST_S32(mSize)) - { - reportAlways("Warning: invalid inventory index: %d", - index); - return; - } - Item *const item1 = mItems[index]; - if (item1 != nullptr) - item1->setTag(tag); -} - -void Inventory::clear() -{ - for (unsigned i = 0; i < mSize; i++) - removeItemAt(i); -} - -void Inventory::removeItem(const int id) -{ - for (unsigned i = 0; i < mSize; i++) - { - const Item *const item = mItems[i]; - if ((item != nullptr) && item->mId == id) - removeItemAt(i); - } -} - -void Inventory::removeItemAt(const int index) -{ - if (mItems[index] == nullptr) - return; - delete2(mItems[index]); - mUsed--; - if (mUsed < 0) // Already at 0, no need to distribute event - mUsed = 0; - else - distributeSlotsChangedEvent(); -} - -bool Inventory::contains(const Item *const item) const -{ - if (item == nullptr) - return false; - - const int id = item->mId; - for (unsigned i = 0; i < mSize; i++) - { - const Item *const item1 = mItems[i]; - if ((item1 != nullptr) && item1->mId == id) - return true; - } - - return false; -} - -int Inventory::getFreeSlot() const -{ - Item *const *const i = std::find_if(mItems, - mItems + mSize, - std::not1(SlotUsed())); - return (i == mItems + mSize) ? -1 - : CAST_S32(i - mItems); -} - -int Inventory::getLastUsedSlot() const -{ - for (int i = mSize - 1; i >= 0; i--) - { - if (SlotUsed()(mItems[i])) - return i; - } - - return -1; -} - -void Inventory::addInventoyListener(InventoryListener* const listener) -{ - mInventoryListeners.push_back(listener); -} - -void Inventory::removeInventoyListener(InventoryListener* const listener) -{ - mInventoryListeners.remove(listener); -} - -void Inventory::distributeSlotsChangedEvent() -{ - FOR_EACH (InventoryListenerList::const_iterator, i, mInventoryListeners) - (*i)->slotsChanged(this); -} - -const Item *Inventory::findItemBySprite(std::string spritePath, - const GenderT gender, - const BeingTypeId race) const -{ - spritePath = removeSpriteIndex(spritePath); - - const std::string spritePathShort = extractNameFromSprite(spritePath); - int partialIndex = -1; - - for (unsigned i = 0; i < mSize; i++) - { - const Item *const item = mItems[i]; - if (item != nullptr) - { - std::string path = item->getInfo().getSprite(gender, race); - if (!path.empty()) - { - path = removeSpriteIndex(path); - if (spritePath == path) - return item; - - path = extractNameFromSprite(path); - if (spritePathShort == path) - partialIndex = i; - } - } - } - if (partialIndex != -1) - return mItems[partialIndex]; - - return nullptr; -} - -std::string Inventory::getName() const -{ - switch (mType) - { - case InventoryType::Inventory: - case InventoryType::Vending: - case InventoryType::TypeEnd: - default: - { - // TRANSLATORS: inventory type name - return N_("Inventory"); - } - case InventoryType::Storage: - { - // TRANSLATORS: inventory type name - return N_("Storage"); - } - case InventoryType::Npc: - { - // TRANSLATORS: inventory type name - return N_("Npc"); - } - case InventoryType::Cart: - { - // TRANSLATORS: inventory type name - return N_("Cart"); - } - case InventoryType::MailEdit: - case InventoryType::MailView: - { - // TRANSLATORS: inventory type name - return N_("Mail"); - } - case InventoryType::Craft: - { - // TRANSLATORS: inventory type name - return N_("Craft"); - } - case InventoryType::Trade: - { - // TRANSLATORS: inventory type name - return N_("Trade"); - } - } -} - -void Inventory::resize(const unsigned int newSize) -{ - clear(); - if (mSize == newSize) - return; - - for (unsigned i = 0; i < mSize; i++) - delete mItems[i]; - delete [] mItems; - - mSize = newSize; - mItems = new Item*[CAST_SIZE(mSize)]; - std::fill_n(mItems, mSize, static_cast<Item*>(nullptr)); -} - -int Inventory::findIndexByTag(const int tag) const -{ - for (unsigned i = 0; i < mSize; i++) - { - const Item *const item = mItems[i]; - if ((item != nullptr) && item->mTag == tag) - return i; - } - - return -1; -} - -Item *Inventory::findItemByTag(const int tag) const -{ - for (unsigned i = 0; i < mSize; i++) - { - Item *const item = mItems[i]; - if (item != nullptr && - item->mTag == tag) - { - return item; - } - } - - return nullptr; -} - -bool Inventory::addVirtualItem(const Item *const item, - int index, - const int amount) -{ - if ((item != nullptr) && !PlayerInfo::isItemProtected(item->getId())) - { - if (index >= 0 && index < CAST_S32(mSize)) - { - if (mItems[index] != nullptr) - return false; - setItem(index, - item->getId(), - item->getType(), - amount, - 1, - item->getColor(), - item->getIdentified(), - item->getDamaged(), - item->getFavorite(), - Equipm_false, - Equipped_false); - } - else - { - index = addItem(item->getId(), - item->getType(), - amount, - 1, - item->getColor(), - item->getIdentified(), - item->getDamaged(), - item->getFavorite(), - Equipm_false, - Equipped_false); - } - if (index == -1) - return false; - - Item *const item2 = getItem(index); - if (item2 != nullptr) - item2->setTag(item->getInvIndex()); - return true; - } - return false; -} - -void Inventory::virtualRemove(Item *const item, - const int amount) -{ - if ((item == nullptr) || item->mQuantity < amount) - return; - - const int index = item->getInvIndex(); - const IntMapCIter it = mVirtualRemove.find(index); - if (it == mVirtualRemove.end()) - mVirtualRemove[index] = amount; - else - mVirtualRemove[index] += amount; - item->mQuantity -= amount; -} - -void Inventory::restoreVirtuals() -{ - const int sz = CAST_S32(mSize); - - FOR_EACH (IntMapCIter, it, mVirtualRemove) - { - const int index = (*it).first; - if (index < 0 || index >= sz) - continue; - Item *const item = mItems[index]; - if (item == nullptr) - continue; - item->mQuantity += (*it).second; - } - mVirtualRemove.clear(); -} - -void Inventory::virtualRestore(const Item *const item, - const int amount) -{ - const int index = item->getTag(); - const IntMapCIter it = mVirtualRemove.find(index); - if (it != mVirtualRemove.end()) - { - mVirtualRemove[index] -= amount; - if (mVirtualRemove[index] < 0) - mVirtualRemove.erase(index); - if (index < 0 || - index >= CAST_S32(mSize) || - mItems[index] == nullptr) - { - return; - } - mItems[index]->mQuantity += amount; - } -} - -void Inventory::moveItem(const int index1, - const int index2) -{ - if (index1 < 0 || - index1 >= CAST_S32(mSize) || - index2 < 0 || - index2 >= CAST_S32(mSize)) - { - return; - } - - Item *const item1 = mItems[index1]; - Item *const item2 = mItems[index2]; - if (item1 != nullptr) - item1->setInvIndex(index2); - if (item2 != nullptr) - item2->setInvIndex(index1); - mItems[index1] = item2; - mItems[index2] = item1; - distributeSlotsChangedEvent(); -} diff --git a/src/resources/inventory/inventory.h b/src/resources/inventory/inventory.h deleted file mode 100644 index 573a0f5c0..000000000 --- a/src/resources/inventory/inventory.h +++ /dev/null @@ -1,219 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef RESOURCES_INVENTORY_INVENTORY_H -#define RESOURCES_INVENTORY_INVENTORY_H - -#include "enums/inventorytype.h" - -#include "enums/resources/item/itemtype.h" - -#include "enums/simpletypes/beingtypeid.h" -#include "enums/simpletypes/damaged.h" -#include "enums/simpletypes/equipm.h" -#include "enums/simpletypes/equipped.h" -#include "enums/simpletypes/favorite.h" -#include "enums/simpletypes/identified.h" -#include "enums/simpletypes/itemcolor.h" - -#include "enums/being/gender.h" - -#include "utils/intmap.h" - -#include <list> -#include <string> - -#include "localconsts.h" - -class InventoryListener; -class Item; - -struct ItemOptionsList; - -class Inventory notfinal -{ - public: - A_DELETE_COPY(Inventory) - - static const int NO_SLOT_INDEX = -1; /**< Slot has no index. */ - - /** - * Constructor. - * - * @param size the number of items that fit in the inventory - */ - explicit Inventory(const InventoryTypeT type, - const int size = -1); - - /** - * Destructor. - */ - virtual ~Inventory(); - - /** - * Returns the size that this instance is configured for. - */ - unsigned getSize() const noexcept2 A_WARN_UNUSED - { return mSize; } - - /** - * Returns the item at the specified index. - */ - Item *getItem(const int index) const A_WARN_UNUSED; - - /** - * Searches for the specified item by it's id. - * - * @param itemId The id of the item to be searched. - * @param color The color of the item to be searched. - * @return Item found on success, NULL on failure. - */ - Item *findItem(const int itemId, - const ItemColor color) const A_WARN_UNUSED; - - /** - * Adds a new item in a free slot. - */ - int addItem(const int id, - const ItemTypeT type, - const int quantity, - const uint8_t refine, - const ItemColor color, - const Identified identified, - const Damaged damaged, - const Favorite favorite, - const Equipm equipment, - const Equipped equipped); - - /** - * Sets the item at the given position. - */ - virtual void setItem(const int index, - const int id, - const ItemTypeT type, - const int quantity, - const uint8_t refine, - const ItemColor color, - const Identified identified, - const Damaged damaged, - const Favorite favorite, - const Equipm equipment, - const Equipped equipped); - - void setCards(const int index, - const int *const cards, - const int size) const; - - void setOptions(const int index, - const ItemOptionsList *const options); - - void setTag(const int index, - const int tag); - - void moveItem(const int index1, - const int index2); - - /** - * Remove a item from the inventory. - */ - void removeItem(const int id); - - /** - * Remove the item at the specified index from the inventory. - */ - void removeItemAt(const int index); - - /** - * Checks if the given item is in the inventory. - */ - bool contains(const Item *const item) const A_WARN_UNUSED; - - /** - * Returns id of next free slot or -1 if all occupied. - */ - int getFreeSlot() const A_WARN_UNUSED; - - /** - * Reset all item slots. - */ - void clear(); - - /** - * Get the number of slots filled with an item - */ - int getNumberOfSlotsUsed() const noexcept2 A_WARN_UNUSED - { return mUsed; } - - /** - * Returns the index of the last occupied slot or 0 if none occupied. - */ - int getLastUsedSlot() const A_WARN_UNUSED; - - void addInventoyListener(InventoryListener *const listener); - - void removeInventoyListener(InventoryListener *const listener); - - InventoryTypeT getType() const noexcept2 A_WARN_UNUSED - { return mType; } - - bool isMainInventory() const noexcept2 A_WARN_UNUSED - { return mType == InventoryType::Inventory; } - - const Item *findItemBySprite(std::string spritePath, - const GenderT gender, - const BeingTypeId race) - const A_WARN_UNUSED; - - std::string getName() const A_WARN_UNUSED; - - void resize(const unsigned int newSize); - - int findIndexByTag(const int tag) const; - - Item *findItemByTag(const int tag) const; - - virtual bool addVirtualItem(const Item *const item, - int index, - const int amount); - - void virtualRemove(Item *const item, - const int amount); - - void virtualRestore(const Item *const item, - const int amount); - - void restoreVirtuals(); - - protected: - typedef std::list<InventoryListener*> InventoryListenerList; - InventoryListenerList mInventoryListeners; - - void distributeSlotsChangedEvent(); - - IntMap mVirtualRemove; - InventoryTypeT mType; - unsigned mSize; /**< The max number of inventory items */ - Item **mItems; /**< The holder of items */ - int mUsed; /**< THe number of slots in use */ -}; - -#endif // RESOURCES_INVENTORY_INVENTORY_H |