From 22f79fd0d623c8e11994905534f53da267e22935 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 3 Mar 2011 01:25:21 +0200 Subject: Dehardcode item colors. Now reading all from configs. --- src/resources/colordb.cpp | 74 +++++++++++++++++++++++++++++++++++++++------- src/resources/colordb.h | 32 ++++++++++++++++++-- src/resources/itemdb.cpp | 2 ++ src/resources/iteminfo.cpp | 36 +++++++++++----------- src/resources/iteminfo.h | 12 +++++++- 5 files changed, 124 insertions(+), 32 deletions(-) (limited to 'src/resources') diff --git a/src/resources/colordb.cpp b/src/resources/colordb.cpp index c35cec95e..79622e8ed 100644 --- a/src/resources/colordb.cpp +++ b/src/resources/colordb.cpp @@ -28,9 +28,10 @@ namespace { - ColorDB::Colors mColors; + ColorDB::Colors mHairColors; bool mLoaded = false; std::string mFail = "#ffffff"; + ColorDB::ColorLists mColorLists; } void ColorDB::load() @@ -38,6 +39,12 @@ void ColorDB::load() if (mLoaded) unload(); + loadHair(); + loadColorLists(); +} + +void ColorDB::loadHair() +{ XML::Document *doc = new XML::Document("hair.xml"); xmlNodePtr root = doc->rootNode(); bool hairXml = true; @@ -55,7 +62,7 @@ void ColorDB::load() if (!root || !xmlStrEqual(root->name, BAD_CAST "colors")) { logger->log1("ColorDB: Failed to find any color files."); - mColors[0] = mFail; + mHairColors[0] = mFail; mLoaded = true; delete doc; @@ -69,10 +76,10 @@ void ColorDB::load() { int id = XML::getProperty(node, "id", 0); - if (mColors.find(id) != mColors.end()) + if (mHairColors.find(id) != mHairColors.end()) logger->log("ColorDB: Redefinition of dye ID %d", id); - mColors[id] = hairXml ? + mHairColors[id] = hairXml ? XML::getProperty(node, "value", "#FFFFFF") : XML::getProperty(node, "dye", "#FFFFFF"); } @@ -83,22 +90,59 @@ void ColorDB::load() mLoaded = true; } +void ColorDB::loadColorLists() +{ + XML::Document *doc = new XML::Document("itemcolors.xml"); + xmlNodePtr root = doc->rootNode(); + if (!root) + return; + + for_each_xml_child_node(node, root) + { + if (xmlStrEqual(node->name, BAD_CAST "list")) + { + std::string name = XML::getProperty(node, "name", ""); + if (name.empty()) + continue; + + std::map colors; + ColorListsIterator it = mColorLists.find(name); + + if (it != mColorLists.end()) + colors = it->second; + + for_each_xml_child_node(colorNode, node) + { + if (xmlStrEqual(colorNode->name, BAD_CAST "color")) + { + ItemColor c(XML::getProperty(colorNode, "id", -1), + XML::getProperty(colorNode, "name", ""), + XML::getProperty(colorNode, "value", "")); + if (c.id > -1) + colors[c.id] = c; + } + } + mColorLists[name] = colors; + } + } +} + void ColorDB::unload() { logger->log1("Unloading color database..."); - mColors.clear(); + mHairColors.clear(); mLoaded = false; } -std::string &ColorDB::get(int id) +std::string &ColorDB::getHairColor(int id) { if (!mLoaded) load(); - ColorIterator i = mColors.find(id); + ColorIterator i = mHairColors.find(id); - if (i == mColors.end()) + if (i == mHairColors.end()) { logger->log("ColorDB: Error, unknown dye ID# %d", id); return mFail; @@ -109,7 +153,17 @@ std::string &ColorDB::get(int id) } } -int ColorDB::size() +int ColorDB::getHairSize() { - return static_cast(mColors.size()); + return static_cast(mHairColors.size()); +} + +std::map *ColorDB::getColorsList(std::string name) +{ + std::map colors; + ColorListsIterator it = mColorLists.find(name); + + if (it != mColorLists.end()) + return &it->second; + return 0; } diff --git a/src/resources/colordb.h b/src/resources/colordb.h index 72d34afe8..fb0da0036 100644 --- a/src/resources/colordb.h +++ b/src/resources/colordb.h @@ -29,23 +29,51 @@ */ namespace ColorDB { + class ItemColor + { + public: + ItemColor() + { } + ItemColor(int id, std::string name, std::string color) + { + this->id = id; + this->name = name; + this->color = color; + } + + int id; + std::string name; + std::string color; + }; + /** * Loads the color data from colors.xml. */ void load(); + /** + * Loads the color data from colors.xml. + */ + void loadHair(); + + void loadColorLists(); + /** * Clear the color data */ void unload(); - std::string &get(int id); + std::string &getHairColor(int id); + + int getHairSize(); - int size(); + std::map *getColorsList(std::string name); // Color DB typedef std::map Colors; typedef Colors::iterator ColorIterator; + typedef std::map > ColorLists; + typedef ColorLists::iterator ColorListsIterator; } #endif diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index 418bfb848..d515495de 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -207,6 +207,7 @@ 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 colors = XML::getProperty(node, "colors", ""); std::string tags[3]; tags[0] = XML::getProperty(node, "tag", @@ -266,6 +267,7 @@ void ItemDB::load() itemInfo->setDrawBefore(parseSpriteName(drawBefore)); itemInfo->setDrawAfter(parseSpriteName(drawAfter)); itemInfo->setDrawPriority(drawPriority); + itemInfo->setColorsList(colors); 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 49aadc23d..990c78f45 100644 --- a/src/resources/iteminfo.cpp +++ b/src/resources/iteminfo.cpp @@ -82,30 +82,28 @@ std::map &ItemInfo::addReplaceSprite(int sprite) return it->second; } -std::string ItemInfo::getDyeString(int color) const +void ItemInfo::setColorsList(std::string name) { - if (mId == 1172) + if (name.empty()) { - if (color == 1) - return "W:#115511,22aa22,99dd99;R:#547000,a5dc00,d1ff46"; - if (color == 0) - return "W:#547000,a5dc00,d1ff46;R:#115511,22aa22,99dd99"; - if (color == 3) - return "W:#ffffff,000000,000000;R:#333333,333333,333333"; + mColors = 0; + mColorList = ""; + } + else + { + mColors = ColorDB::getColorsList(name); + mColorList = name; } - return ""; } std::string ItemInfo::getDyeColorsString(int color) const { - if (mId == 1172) - { - if (color == 1) - return "#115511,22aa22,99dd99;#547000,a5dc00,d1ff46"; - if (color == 0) - return "#547000,a5dc00,d1ff46;#115511,22aa22,99dd99"; - if (color == 3) - return "#ffffff,000000,000000;#333333,333333,333333"; - } - return ""; + if (!mColors || mColorList.empty()) + return ""; + + std::map ::iterator it = mColors->find(color); + if (it == mColors->end()) + return ""; + + return it->second.color; } \ No newline at end of file diff --git a/src/resources/iteminfo.h b/src/resources/iteminfo.h index 3b72c7830..297c1b036 100644 --- a/src/resources/iteminfo.h +++ b/src/resources/iteminfo.h @@ -25,6 +25,7 @@ #include "being.h" +#include "resources/colordb.h" #include "resources/spritedef.h" #include @@ -111,7 +112,9 @@ class ItemInfo mDrawPriority(0), mIsRemoveSprites(false), mAttackAction(SpriteAction::INVALID), - mAttackRange(0) + mAttackRange(0), + mColors(0), + mColorList("") { } @@ -235,6 +238,11 @@ class ItemInfo std::string getDyeColorsString(int color) const; + void setColorsList(std::string name); + + bool isHaveColors() + { return !mColorList.empty(); } + protected: SpriteDisplay mDisplay; /**< Display info (like icon) */ std::string mName; @@ -269,6 +277,8 @@ class ItemInfo /** Stores the names of sounds to be played at certain event. */ std::map < EquipmentSoundEvent, std::vector > mSounds; std::map mTags; + std::map *mColors; + std::string mColorList; }; #endif -- cgit v1.2.3-60-g2f50