summaryrefslogtreecommitdiff
path: root/src/resources/itemdb.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/resources/itemdb.h')
-rw-r--r--src/resources/itemdb.h194
1 files changed, 167 insertions, 27 deletions
diff --git a/src/resources/itemdb.h b/src/resources/itemdb.h
index be023073..e80f2cd0 100644
--- a/src/resources/itemdb.h
+++ b/src/resources/itemdb.h
@@ -26,45 +26,185 @@
#include <map>
#include <string>
+#include "utils/xml.h"
+
+#define ITEMS_DB_FILE "items.xml"
+
class ItemInfo;
+class SpriteDisplay;
+
+// Used to make the compiler uderstand the iteminfo friendship.
+namespace TmwAthena { class TaItemDB; };
+namespace ManaServ { class ManaServItemDB; };
/**
- * Item information database.
+ * Nano-description functions
*/
-namespace ItemDB
+class ItemStat
{
- /**
- * Loads the item data from <code>items.xml</code>.
- */
- void load();
+ friend class ItemDB;
+ friend class TmwAthena::TaItemDB;
+ friend class ManaServ::ManaServItemDB;
- /**
- * Frees item data.
- */
- void unload();
+ public:
+ ItemStat(const std::string &tag,
+ const std::string &format):
+ mTag(tag), mFormat(format) {}
- bool exists(int id);
+ bool operator ==(std::string &name) const
+ { return mTag == name; }
- const ItemInfo &get(int id);
- const ItemInfo &get(const std::string &name);
+ private:
+ std::string mTag;
+ std::string mFormat;
+};
- struct Stat
- {
- Stat(const std::string &tag,
- const std::string &format):
- tag(tag),
- format(format)
+// Used to set nano-description
+static std::list<ItemStat> extraStats;
+void setStatsList(const std::list<ItemStat> &stats);
+
+/**
+ * Item information database generic definition.
+ */
+class ItemDB
+{
+ public:
+ ItemDB() :
+ mUnknown(0),
+ mLoaded(false)
+ {}
+
+ ~ItemDB()
+ {}
+
+ /**
+ * Loads the item data from <code>items.xml</code>.
+ */
+ virtual void load() = 0;
+
+ /**
+ * Frees item data.
+ */
+ virtual void unload();
+
+ /**
+ * Tells whether the item database is loaded.
+ */
+ bool isLoaded() const
+ { return mLoaded; }
+
+ bool exists(int id);
+
+ const ItemInfo &get(int id);
+ const ItemInfo &get(const std::string &name);
+
+ protected:
+ /**
+ * Permits to load item definitions which are common
+ * for each protocols to avoid code duplication.
+ */
+ void loadCommonRef(ItemInfo *itemInfo, xmlNodePtr node);
+
+ /**
+ * Checks the items parameters consistency.
+ */
+ virtual void checkItemInfo(ItemInfo* itemInfo);
+
+ /**
+ * Register the item to mItemInfos and mNamedItemsInfos
+ */
+ void addItem(ItemInfo *itemInfo);
+
+ // Default unknown reference
+ ItemInfo *mUnknown;
+
+ bool mLoaded;
+
+ private:
+ /**
+ * Loads the sprite references contained in a <sprite> tag.
+ */
+ void loadSpriteRef(ItemInfo *itemInfo, xmlNodePtr node);
+
+ /**
+ * Loads the sound references contained in a <sound> tag.
+ */
+ void loadSoundRef(ItemInfo *itemInfo, xmlNodePtr node);
+
+ /**
+ * Loads the floor item references contained in a <floor> tag.
+ */
+ void loadFloorSprite(SpriteDisplay *display, xmlNodePtr node);
+
+ // Items database
+ typedef std::map<int, ItemInfo*> ItemInfos;
+ typedef std::map<std::string, ItemInfo*> NamedItemInfos;
+
+ ItemInfos mItemInfos;
+ NamedItemInfos mNamedItemInfos;
+};
+
+namespace TmwAthena {
+
+class TaItemInfo;
+
+/**
+ * Item information database TmwAthena specific class.
+ */
+class TaItemDB: public ItemDB
+{
+ public:
+ TaItemDB() : ItemDB()
+ { load(); }
+
+ ~TaItemDB()
+ { unload(); }
+
+ /**
+ * Loads the item data from <code>items.xml</code>.
+ */
+ void load();
+
+ private:
+ /**
+ * Check items id specific hard limits and log errors found.
+ * TODO: Do it.
+ */
+ void checkHairWeaponsRacesSpecialIds()
{}
- std::string tag;
- std::string format;
- };
+ void checkItemInfo(ItemInfo* itemInfo);
+};
+
+}; // namespace TmwAthena
+
+namespace ManaServ {
+
+class ManaServItemInfo;
+
+/**
+ * Item information database TmwAthena specific class.
+ */
+class ManaServItemDB: public ItemDB
+{
+ public:
+ ManaServItemDB() : ItemDB()
+ { load(); }
+
+ ~ManaServItemDB()
+ { unload(); }
+
+ /**
+ * Loads the item data from <code>items.xml</code>.
+ */
+ void load();
+
+ private:
+ void checkItemInfo(ItemInfo* itemInfo);
+};
- void setStatsList(const std::list<Stat> &stats);
+}; // namespace ManaServ
- // Items database
- typedef std::map<int, ItemInfo*> ItemInfos;
- typedef std::map<std::string, ItemInfo*> NamedItemInfos;
-}
+extern ItemDB *itemDb;
#endif