summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2016-01-08 20:26:57 +0300
committerAndrei Karas <akaras@inbox.ru>2016-01-08 20:26:57 +0300
commit4b014aa3f403ae02587f6a3d89180f75161d4b78 (patch)
tree5baa6e0ddca465e335b78dd34ae7c2286adf1674
parent62c5097904bfc6c6e44e776730ea1d01aaf891c2 (diff)
downloadmv-4b014aa3f403ae02587f6a3d89180f75161d4b78.tar.gz
mv-4b014aa3f403ae02587f6a3d89180f75161d4b78.tar.bz2
mv-4b014aa3f403ae02587f6a3d89180f75161d4b78.tar.xz
mv-4b014aa3f403ae02587f6a3d89180f75161d4b78.zip
Add complexitem.
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/resources/item/complexitem.cpp97
-rw-r--r--src/resources/item/complexitem.h67
4 files changed, 168 insertions, 0 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 1e6ee392f..d67bfc654 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -951,6 +951,8 @@ SET(SRCS
resources/inventory/complexinventory.h
resources/inventory/inventory.cpp
resources/inventory/inventory.h
+ resources/item/complexitem.cpp
+ resources/item/complexitem.h
resources/item/item.cpp
resources/item/item.h
itemcolormanager.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index 2bae5c547..1076f577f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -723,6 +723,8 @@ manaplus_SOURCES += main.cpp \
resources/inventory/inventory.h \
textcommand.cpp \
textcommand.h \
+ resources/item/complexitem.cpp \
+ resources/item/complexitem.h \
resources/item/item.cpp \
resources/item/item.h \
itemcolormanager.cpp \
diff --git a/src/resources/item/complexitem.cpp b/src/resources/item/complexitem.cpp
new file mode 100644
index 000000000..95e30ac54
--- /dev/null
+++ b/src/resources/item/complexitem.cpp
@@ -0,0 +1,97 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2011-2016 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/complexitem.h"
+
+#include "logger.h"
+
+#include "utils/dtor.h"
+
+#include "debug.h"
+
+ComplexItem::ComplexItem(const int id,
+ const int 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) :
+ Item(id,
+ type,
+ quantity,
+ refine,
+ color,
+ identified,
+ damaged,
+ favorite,
+ equipment,
+ equipped),
+ mChildItems()
+{
+}
+
+ComplexItem::~ComplexItem()
+{
+ delete_all(mChildItems);
+ mChildItems.clear();
+}
+
+void ComplexItem::addChild(const Item *const item,
+ const int amount)
+{
+ if (!item)
+ return;
+ increaseQuantity(amount);
+ Item *child = nullptr;
+ FOR_EACH (std::vector<Item*>::iterator, it, mChildItems)
+ {
+ Item *const item1 = *it;
+ if (item1->getId() == item->getId() &&
+ item1->getInvIndex() == item->getInvIndex() &&
+ item1->getTag() == item->getTag())
+ {
+ child = item1;
+ break;
+ }
+ }
+ if (child)
+ {
+ child->increaseQuantity(amount);
+ }
+ else
+ {
+ child = new ComplexItem(item->getId(),
+ item->getType(),
+ amount,
+ item->getRefine(),
+ item->getColor(),
+ item->getIdentified(),
+ item->getDamaged(),
+ item->getFavorite(),
+ Equipm_false,
+ Equipped_false);
+ child->setTag(item->getTag());
+ child->setInvIndex(item->getInvIndex());
+ mChildItems.push_back(child);
+ }
+}
diff --git a/src/resources/item/complexitem.h b/src/resources/item/complexitem.h
new file mode 100644
index 000000000..9515e13f5
--- /dev/null
+++ b/src/resources/item/complexitem.h
@@ -0,0 +1,67 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2011-2016 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_COMPLEXITEM_H
+#define RESOURCES_ITEM_COMPLEXITEM_H
+
+#include "resources/item/item.h"
+
+#include <vector>
+
+#include "localconsts.h"
+
+/**
+ * Represents one or more instances of a certain item type.
+ */
+class ComplexItem final : public Item
+{
+ public:
+ /**
+ * Constructor.
+ */
+ ComplexItem(const int id,
+ const int 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);
+
+ A_DELETE_COPY(ComplexItem)
+
+ /**
+ * Destructor.
+ */
+ virtual ~ComplexItem();
+
+ void addChild(const Item *const item,
+ const int amount);
+
+ const std::vector<Item*> &getChilds() const A_WARN_UNUSED
+ { return mChildItems; }
+
+ protected:
+ std::vector<Item*> mChildItems;
+};
+
+#endif // RESOURCES_ITEM_COMPLEXITEM_H