From 992c2920f7e1940aa293e27cf4ea7ec23668a673 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Sat, 12 Feb 2011 17:02:17 +0200
Subject: Add items attribute what allow hide other sprites only by id.

---
 src/being.cpp              |  5 ++++-
 src/resources/itemdb.cpp   |  3 +++
 src/resources/iteminfo.cpp | 13 +++++++++++++
 src/resources/iteminfo.h   |  7 +++++++
 src/utils/stringutils.cpp  | 11 +++++++++++
 src/utils/stringutils.h    |  3 +++
 6 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/src/being.cpp b/src/being.cpp
index 7851725d4..6d26f74a7 100644
--- a/src/being.cpp
+++ b/src/being.cpp
@@ -1901,7 +1901,10 @@ void Being::recalcSpritesOrder()
 
         const ItemInfo &info = ItemDB::get(id);
         if (info.getRemoveSprite() > 0)
-            mSpriteHide[info.getRemoveSprite()] = 1;
+        {
+            if (info.isRemoveSpriteId(mSpriteIDs[info.getRemoveSprite()]))
+                mSpriteHide[info.getRemoveSprite()] = 1;
+        }
 
         if (info.getDrawBefore() > 0)
         {
diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp
index 075104516..97a6ba1f4 100644
--- a/src/resources/itemdb.cpp
+++ b/src/resources/itemdb.cpp
@@ -205,6 +205,8 @@ void ItemDB::load()
         std::string drawBefore = XML::getProperty(node, "drawBefore", "");
         std::string drawAfter = XML::getProperty(node, "drawAfter", "");
         std::string removeSprite = XML::getProperty(node, "removeSprite", "");
+        std::string removeSpriteIds = XML::getProperty(node, "removeSpriteIds", "");
+        std::set<int> rSprites = splitToIntSet(removeSpriteIds, ',');
 
         std::string tags[3];
         tags[0] = XML::getProperty(node, "tag",
@@ -265,6 +267,7 @@ void ItemDB::load()
         itemInfo->setDrawAfter(parseSpriteName(drawAfter));
         itemInfo->setDrawPriority(drawPriority);
         itemInfo->setRemoveSprite(parseSpriteName(removeSprite));
+        itemInfo->setRemoveSpriteIds(rSprites);
 
         std::string effect;
         for (int i = 0; i < int(sizeof(fields) / sizeof(fields[0])); ++i)
diff --git a/src/resources/iteminfo.cpp b/src/resources/iteminfo.cpp
index 300c6bd26..f65e0396a 100644
--- a/src/resources/iteminfo.cpp
+++ b/src/resources/iteminfo.cpp
@@ -24,6 +24,8 @@
 #include "resources/itemdb.h"
 #include "configuration.h"
 
+#include <set>
+
 const std::string &ItemInfo::getSprite(Gender gender) const
 {
     if (mView)
@@ -64,3 +66,14 @@ const std::string &ItemInfo::getSound(EquipmentSoundEvent event) const
 
     return i == mSounds.end() ? empty : i->second[rand() % i->second.size()];
 }
+
+bool ItemInfo::isRemoveSpriteId(int id) const
+{
+    if (!mRemoveSpriteIds.size()
+        || mRemoveSpriteIds.find(id) != mRemoveSpriteIds.end())
+    {
+        return true;
+    }
+
+    return false;
+}
\ No newline at end of file
diff --git a/src/resources/iteminfo.h b/src/resources/iteminfo.h
index 8dbef87b7..ba7866518 100644
--- a/src/resources/iteminfo.h
+++ b/src/resources/iteminfo.h
@@ -29,6 +29,7 @@
 #include <map>
 #include <string>
 #include <vector>
+#include <set>
 
 enum EquipmentSoundEvent
 {
@@ -220,6 +221,11 @@ class ItemInfo
         void addTag(int tag)
         { mTags[tag] = 1; }
 
+        void setRemoveSpriteIds(std::set<int> ids)
+        { mRemoveSpriteIds = ids; }
+
+        bool isRemoveSpriteId(int id) const;
+
     protected:
         SpriteDisplay mDisplay;     /**< Display info (like icon) */
         std::string mName;
@@ -234,6 +240,7 @@ class ItemInfo
         int mDrawAfter;
         int mDrawPriority;
         int mRemoveSprite;
+        std::set<int> mRemoveSpriteIds;
 
         // Equipment related members.
         /** Attack type, in case of weapon.
diff --git a/src/utils/stringutils.cpp b/src/utils/stringutils.cpp
index ffce9897e..99316ce32 100644
--- a/src/utils/stringutils.cpp
+++ b/src/utils/stringutils.cpp
@@ -364,3 +364,14 @@ std::string normalize(const std::string &name)
     std::string normalized = name;
     return toLower(trim(normalized));
 }
+
+std::set<int> splitToIntSet(const std::string &text, char separator)
+{
+    std::set<int> tokens;
+    std::stringstream ss(text);
+    std::string item;
+    while(std::getline(ss, item, separator))
+        tokens.insert(atoi(item.c_str()));
+
+    return tokens;
+}
diff --git a/src/utils/stringutils.h b/src/utils/stringutils.h
index 15d41380f..934c0f82d 100644
--- a/src/utils/stringutils.h
+++ b/src/utils/stringutils.h
@@ -25,6 +25,7 @@
 #include <string>
 #include <sstream>
 #include <list>
+#include <set>
 
 /**
  * Trims spaces off the end and the beginning of the given string.
@@ -164,4 +165,6 @@ void replaceSpecialChars(std::string &text);
  */
 std::string normalize(const std::string &name);
 
+std::set<int> splitToIntSet(const std::string &text, char separator);
+
 #endif // UTILS_STRINGUTILS_H
-- 
cgit v1.2.3-70-g09d2