00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <algorithm>
00023
00024 #include "inventory.h"
00025 #include "item.h"
00026 #include "log.h"
00027
00028 struct SlotUsed : public std::unary_function<Item*, bool>
00029 {
00030 bool operator()(const Item *item) const
00031 {
00032 #ifdef TMWSERV_SUPPORT
00033 return item && item->getId() && item->getQuantity();
00034 #else
00035 return item && item->getId() != -1 && item->getQuantity() > 0;
00036 #endif
00037 }
00038 };
00039
00040 Inventory::Inventory(int size):
00041 mSize(size)
00042 {
00043 mItems = new Item*[mSize];
00044 std::fill_n(mItems, mSize, (Item*) 0);
00045 }
00046
00047 Inventory::~Inventory()
00048 {
00049 for (int i = 0; i < mSize; i++)
00050 delete mItems[i];
00051
00052 delete [] mItems;
00053 }
00054
00055 Item *Inventory::getItem(int index) const
00056 {
00057 #ifdef TMWSERV_SUPPORT
00058 if (index < 0 || index >= mSize)
00059 #else
00060 if (index < 0 || index >= mSize || !mItems[index] || mItems[index]->getQuantity() <= 0)
00061 #endif
00062 return 0;
00063
00064 return mItems[index];
00065 }
00066
00067 Item *Inventory::findItem(int itemId) const
00068 {
00069 for (int i = 0; i < mSize; i++)
00070 if (mItems[i] && mItems[i]->getId() == itemId)
00071 return mItems[i];
00072
00073 return NULL;
00074 }
00075
00076 void Inventory::addItem(int id, int quantity, bool equipment)
00077 {
00078 setItem(getFreeSlot(), id, quantity, equipment);
00079 }
00080
00081 void Inventory::setItem(int index, int id, int quantity, bool equipment)
00082 {
00083 if (index < 0 || index >= mSize)
00084 {
00085 logger->log("Warning: invalid inventory index: %d", index);
00086 return;
00087 }
00088
00089 if (!mItems[index] && id > 0)
00090 {
00091 Item *item = new Item(id, quantity, equipment);
00092 item->setInvIndex(index);
00093 mItems[index] = item;
00094 }
00095 else if (id > 0)
00096 {
00097 mItems[index]->setId(id);
00098 mItems[index]->setQuantity(quantity);
00099 mItems[index]->setEquipment(equipment);
00100 }
00101 else if (mItems[index])
00102 {
00103 removeItemAt(index);
00104 }
00105 }
00106
00107 void Inventory::clear()
00108 {
00109 for (int i = 0; i < mSize; i++)
00110 removeItemAt(i);
00111 }
00112
00113 void Inventory::removeItem(int id)
00114 {
00115 for (int i = 0; i < mSize; i++)
00116 if (mItems[i] && mItems[i]->getId() == id)
00117 removeItemAt(i);
00118 }
00119
00120 void Inventory::removeItemAt(int index)
00121 {
00122 delete mItems[index];
00123 mItems[index] = 0;
00124 }
00125
00126 bool Inventory::contains(Item *item) const
00127 {
00128 for (int i = 0; i < mSize; i++)
00129 if (mItems[i] && mItems[i]->getId() == item->getId())
00130 return true;
00131
00132 return false;
00133 }
00134
00135 int Inventory::getFreeSlot() const
00136 {
00137 Item **i = std::find_if(mItems, mItems + mSize,
00138 std::not1(SlotUsed()));
00139 return (i == mItems + mSize) ? -1 : (i - mItems);
00140 }
00141
00142 int Inventory::getNumberOfSlotsUsed() const
00143 {
00144 return count_if(mItems, mItems + mSize, SlotUsed());
00145 }
00146
00147 int Inventory::getLastUsedSlot() const
00148 {
00149 for (int i = mSize - 1; i >= 0; i--)
00150 if (SlotUsed()(mItems[i]))
00151 return i;
00152
00153 return -1;
00154 }