diff options
Diffstat (limited to 'src/inventory.cpp')
-rw-r--r-- | src/inventory.cpp | 106 |
1 files changed, 64 insertions, 42 deletions
diff --git a/src/inventory.cpp b/src/inventory.cpp index 85461f90..cdd7b61c 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -1,47 +1,52 @@ /* * The Mana World - * Copyright 2004 The Mana World Development Team + * Copyright (C) 2004 The Mana World Development Team * * This file is part of The Mana World. * - * The Mana World is free software; you can redistribute it and/or modify + * 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. * - * The Mana World is distributed in the hope that it will be useful, + * 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 The Mana World; if not, write to the Free Software + * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "inventory.h" - #include <algorithm> +#include "inventory.h" #include "item.h" #include "log.h" struct SlotUsed : public std::unary_function<Item*, bool> { - bool operator()(const Item *item) const { + bool operator()(const Item *item) const + { +#ifdef TMWSERV_SUPPORT return item && item->getId() && item->getQuantity(); +#else + return item && item->getId() != -1 && item->getQuantity() > 0; +#endif } }; -Inventory::Inventory() +Inventory::Inventory(int size): + mSize(size) { - mItems = new Item*[INVENTORY_SIZE]; - std::fill_n(mItems, INVENTORY_SIZE, (Item*) 0); + mItems = new Item*[mSize]; + std::fill_n(mItems, mSize, (Item*) 0); } Inventory::~Inventory() { - for (int i = 0; i < INVENTORY_SIZE; i++) + for (int i = 0; i < mSize; i++) delete mItems[i]; delete [] mItems; @@ -49,53 +54,70 @@ Inventory::~Inventory() Item* Inventory::getItem(int index) const { - if (index < 0 || index >= INVENTORY_SIZE) +#ifdef TMWSERV_SUPPORT + if (index < 0 || index >= mSize) +#else + if (index < 0 || index >= mSize || !mItems[index] || mItems[index]->getQuantity() <= 0) +#endif return 0; return mItems[index]; } +Item* Inventory::findItem(int itemId) const +{ + for (int i = 0; i < mSize; i++) + if (mItems[i] && mItems[i]->getId() == itemId) + return mItems[i]; + + return NULL; +} -void Inventory::addItem(int id, int quantity) +void Inventory::addItem(int id, int quantity, bool equipment) { - setItem(getFreeSlot(), id, quantity); + setItem(getFreeSlot(), id, quantity, equipment); } -void Inventory::setItem(int index, int id, int quantity) +void Inventory::setItem(int index, int id, int quantity, bool equipment) { - if (index < 0 || index >= INVENTORY_SIZE) { + if (index < 0 || index >= mSize) + { logger->log("Warning: invalid inventory index: %d", index); return; } - if (!mItems[index] && id > 0) { - mItems[index] = new Item(id, quantity); - mItems[index]->setInvIndex(index); - } else if (id > 0) { + if (!mItems[index] && id > 0) + { + Item *item = new Item(id, quantity, equipment); + item->setInvIndex(index); + mItems[index] = item; + } + else if (id > 0) + { mItems[index]->setId(id); mItems[index]->setQuantity(quantity); - } else if (mItems[index]) { - removeItemIndex(index); + mItems[index]->setEquipment(equipment); + } + else if (mItems[index]) + { + removeItemAt(index); } } void Inventory::clear() { - for (int i = 0; i < INVENTORY_SIZE; i++) { - removeItemIndex(i); - } + for (int i = 0; i < mSize; i++) + removeItemAt(i); } void Inventory::removeItem(int id) { - for (int i = 0; i < INVENTORY_SIZE; i++) { - if (mItems[i] && mItems[i]->getId() == id) { - removeItemIndex(i); - } - } + for (int i = 0; i < mSize; i++) + if (mItems[i] && mItems[i]->getId() == id) + removeItemAt(i); } -void Inventory::removeItemIndex(int index) +void Inventory::removeItemAt(int index) { delete mItems[index]; mItems[index] = 0; @@ -103,34 +125,34 @@ void Inventory::removeItemIndex(int index) bool Inventory::contains(Item *item) const { - for (int i = 0; i < INVENTORY_SIZE; i++) { - if (mItems[i] && mItems[i]->getId() == item->getId()) { + for (int i = 0; i < mSize; i++) + if (mItems[i] && mItems[i]->getId() == item->getId()) return true; - } - } return false; } int Inventory::getFreeSlot() const { - Item **i = std::find_if(mItems, mItems + INVENTORY_SIZE, +#ifdef TMWSERV_SUPPORT + Item **i = std::find_if(mItems, mItems + mSize, +#else + Item **i = std::find_if(mItems + 2, mItems + mSize, +#endif std::not1(SlotUsed())); - return (i == mItems + INVENTORY_SIZE) ? -1 : (i - mItems); + return (i == mItems + mSize) ? -1 : (i - mItems); } int Inventory::getNumberOfSlotsUsed() const { - return count_if(mItems, mItems + INVENTORY_SIZE, SlotUsed()); + return count_if(mItems, mItems + mSize, SlotUsed()); } int Inventory::getLastUsedSlot() const { - for (int i = INVENTORY_SIZE - 1; i >= 0; i--) { - if (SlotUsed()(mItems[i])) { + for (int i = mSize - 1; i >= 0; i--) + if (SlotUsed()(mItems[i])) return i; - } - } return -1; } |