summaryrefslogtreecommitdiff
path: root/src/resources/item
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-12-29 02:21:53 +0300
committerAndrei Karas <akaras@inbox.ru>2015-12-29 02:21:53 +0300
commit75802940ea0f10c4ecce5ab55140c38a164ba574 (patch)
tree506873f03fd72b2bb3fc84085d0202c61f79a89c /src/resources/item
parent9b072c42f4508de8fb15d1fc8b59931777d5b5a7 (diff)
downloadplus-75802940ea0f10c4ecce5ab55140c38a164ba574.tar.gz
plus-75802940ea0f10c4ecce5ab55140c38a164ba574.tar.bz2
plus-75802940ea0f10c4ecce5ab55140c38a164ba574.tar.xz
plus-75802940ea0f10c4ecce5ab55140c38a164ba574.zip
Move shopitem into item directory.
Diffstat (limited to 'src/resources/item')
-rw-r--r--src/resources/item/shopitem.cpp166
-rw-r--r--src/resources/item/shopitem.h178
2 files changed, 344 insertions, 0 deletions
diff --git a/src/resources/item/shopitem.cpp b/src/resources/item/shopitem.cpp
new file mode 100644
index 000000000..78a29065d
--- /dev/null
+++ b/src/resources/item/shopitem.cpp
@@ -0,0 +1,166 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 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/item/shopitem.h"
+
+#include "units.h"
+
+#include "resources/iteminfo.h"
+
+#include "utils/stringutils.h"
+
+#include "net/serverfeatures.h"
+
+#include "debug.h"
+
+ShopItem::ShopItem(const int inventoryIndex,
+ const int id,
+ const int type,
+ const ItemColor color,
+ const int quantity,
+ const int price) :
+ Item(id, type, 0, 0, color,
+ Identified_true,
+ Damaged_false,
+ Favorite_false,
+ Equipm_false,
+ Equipped_false),
+ mDisplayName(),
+ mDuplicates(),
+ mPrice(price),
+ mUsedQuantity(0),
+ mShowQuantity(true),
+ mVisible(true),
+ mDisabled(false)
+{
+ updateDisplayName(quantity);
+ setInvIndex(inventoryIndex);
+ addDuplicate(inventoryIndex, quantity);
+}
+
+ShopItem::ShopItem(const int id,
+ const int type,
+ const ItemColor color,
+ const int price) :
+ Item(id, type, 0, 0, color,
+ Identified_true,
+ Damaged_false,
+ Favorite_false,
+ Equipm_false,
+ Equipped_false),
+ mDisplayName(),
+ mDuplicates(),
+ mPrice(price),
+ mUsedQuantity(0),
+ mShowQuantity(false),
+ mVisible(true),
+ mDisabled(false)
+{
+ updateDisplayName(0);
+ setInvIndex(-1);
+ addDuplicate(-1, 0);
+}
+
+ShopItem::~ShopItem()
+{
+ /** Clear all remaining duplicates on Object destruction. */
+ while (!mDuplicates.empty())
+ {
+ delete mDuplicates.top();
+ mDuplicates.pop();
+ }
+}
+
+void ShopItem::updateDisplayName(const int quantity)
+{
+ if (serverFeatures->haveItemColors())
+ mDisplayName = std::string(getInfo().getName(mColor));
+ else
+ mDisplayName = std::string(getInfo().getName());
+ if (mPrice)
+ {
+ mDisplayName.append(" (").append(
+ Units::formatCurrency(mPrice)).append(") ");
+ }
+ if (mShowQuantity && quantity > 1)
+ mDisplayName.append("[").append(toString(quantity)).append("]");
+ if (mUsedQuantity > 0)
+ mDisplayName.append(" +").append(toString(mUsedQuantity));
+}
+
+void ShopItem::update()
+{
+ updateDisplayName(mQuantity);
+}
+
+void ShopItem::addDuplicate(const int inventoryIndex, const int quantity)
+{
+ DuplicateItem *const di = new DuplicateItem;
+ di->inventoryIndex = inventoryIndex;
+ di->quantity = quantity;
+ mDuplicates.push(di);
+ mQuantity += quantity;
+}
+
+void ShopItem::addDuplicate()
+{
+ DuplicateItem *const di = new DuplicateItem;
+ di->inventoryIndex = -1;
+ di->quantity = 0;
+ mDuplicates.push(di);
+}
+
+int ShopItem::sellCurrentDuplicate(const int quantity)
+{
+ DuplicateItem* dupl = mDuplicates.top();
+ if (!dupl)
+ return 0;
+
+ const int sellCount = quantity <= dupl->quantity
+ ? quantity : dupl->quantity;
+ dupl->quantity -= sellCount;
+ mQuantity -= sellCount;
+ if (dupl->quantity == 0)
+ {
+ delete dupl;
+ mDuplicates.pop();
+ }
+ return sellCount;
+}
+
+void ShopItem::increaseUsedQuantity(const int amount)
+{
+ if (mShowQuantity && mQuantity)
+ {
+ if (mQuantity < mUsedQuantity + amount ||
+ mUsedQuantity + amount < 0)
+ {
+ return;
+ }
+ }
+ else if (mUsedQuantity + amount < 0)
+ {
+ return;
+ }
+
+ mUsedQuantity += amount;
+}
diff --git a/src/resources/item/shopitem.h b/src/resources/item/shopitem.h
new file mode 100644
index 000000000..e5f9efe0d
--- /dev/null
+++ b/src/resources/item/shopitem.h
@@ -0,0 +1,178 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 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_ITEM_SHOPITEM_H
+#define RESOURCES_ITEM_SHOPITEM_H
+
+#include "resources/item/item.h"
+
+#include <stack>
+
+#include "localconsts.h"
+
+/**
+ * Represents an item in a shop inventory. It can store quantity and inventory
+ * indices of duplicate entries in the shop as well.
+ */
+class ShopItem final : public Item
+{
+ public:
+ /**
+ * Constructor. Creates a new ShopItem.
+ *
+ * @param inventoryIndex the inventory index of the item
+ * @param id the id of the item
+ * @param quantity number of available copies of the item
+ * @param price price of the item
+ */
+ ShopItem(const int inventoryIndex,
+ const int id,
+ const int type,
+ const ItemColor color,
+ const int quantity,
+ const int price);
+
+ /**
+ * Constructor. Creates a new ShopItem. Inventory index will be set to
+ * -1 and quantity to 0.
+ *
+ * @param id the id of the item
+ * @param price price of the item
+ */
+ ShopItem(const int id,
+ const int type,
+ const ItemColor color,
+ const int price);
+
+ A_DELETE_COPY(ShopItem)
+
+ /**
+ * Destructor.
+ */
+ ~ShopItem();
+
+ /**
+ * Add a duplicate. Id and price will be taken from this item.
+ *
+ * @param inventoryIndex the inventory index of the item
+ * @param quantity number of available copies of the item
+ */
+ void addDuplicate(const int inventoryIndex, const int quantity);
+
+ /**
+ * Add a duplicate. Id and price will be taken from this item.
+ * Needed for compatibility with ShopDuplicateItems (see) class
+ * documentation).
+ */
+ void addDuplicate();
+
+ void update();
+
+ /**
+ * Gets the quantity of the currently topmost duplicate.
+ *
+ * @return the quantity of the currently topmost duplicate
+ */
+ int getCurrentQuantity() const A_WARN_UNUSED
+ {
+ return mDuplicates.empty() ? 0 : mDuplicates.top()->quantity;
+ }
+
+ /**
+ * Gets the inventory index of the currently topmost duplicate.
+ *
+ * @return the inventory index of the currently topmost duplicate
+ */
+ int getCurrentInvIndex() const A_WARN_UNUSED
+ {
+ return mDuplicates.empty() ? mInvIndex :
+ mDuplicates.top()->inventoryIndex;
+ }
+
+ /**
+ * Reduces the quantity of the topmost duplicate by the specified
+ * amount. Also reduces the total quantity of this DuplicateItem.
+ * Empty duplicates are automatically removed.
+ *
+ * If the amount is bigger than the quantity of the current topmost,
+ * only sell as much as possible. Returns the amount actually sold (do
+ * not ignore the return value!)
+ *
+ * @return the amount, that actually was sold.
+ */
+ int sellCurrentDuplicate(const int quantity);
+
+ /**
+ * Gets the price of the item.
+ *
+ * @return the price of the item
+ */
+ int getPrice() const A_WARN_UNUSED
+ { return mPrice; }
+
+ /**
+ * Gets the display name for the item in the shop list.
+ *
+ * @return the display name for the item in the shop list
+ */
+ const std::string &getDisplayName() const A_WARN_UNUSED
+ { return mDisplayName; }
+
+ void setVisible(const bool b)
+ { mVisible = b; }
+
+ bool isVisible() const
+ { return mVisible; }
+
+ void increaseUsedQuantity(const int amount);
+
+ int getUsedQuantity() const A_WARN_UNUSED
+ { return mUsedQuantity; }
+
+ void setDisabled(const bool b)
+ { mDisabled = b; }
+
+ bool getDisabled() const A_WARN_UNUSED
+ { return mDisabled; }
+
+ protected:
+ void updateDisplayName(const int quantity);
+
+ std::string mDisplayName;
+
+ /**
+ * Struct to keep track of duplicates.
+ */
+ typedef struct
+ {
+ int inventoryIndex;
+ int quantity;
+ } DuplicateItem;
+ std::stack<DuplicateItem*> mDuplicates; /** <-- Stores duplicates */
+ int mPrice;
+ int mUsedQuantity;
+ bool mShowQuantity;
+ bool mVisible;
+ bool mDisabled;
+};
+
+#endif // RESOURCES_ITEM_SHOPITEM_H