diff options
Diffstat (limited to 'src/resources/itemdb.h')
-rw-r--r-- | src/resources/itemdb.h | 194 |
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 |