summaryrefslogtreecommitdiff
path: root/src/inventory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/inventory.cpp')
-rw-r--r--src/inventory.cpp106
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;
}