00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "resources/colordb.h"
00023
00024 #include "log.h"
00025
00026 #include "utils/xml.h"
00027
00028 #include <libxml/tree.h>
00029
00030 #define HAIR_COLOR_FILE "colors.xml"
00031 #define TMW_COLOR_FILE "hair.xml"
00032
00033 namespace
00034 {
00035 ColorDB::Colors mColors;
00036 bool mLoaded = false;
00037 std::string mFail = "#ffffff";
00038 }
00039
00040 void ColorDB::load()
00041 {
00042 if (mLoaded)
00043 return;
00044
00045 XML::Document *doc = new XML::Document(HAIR_COLOR_FILE);
00046 xmlNodePtr root = doc->rootNode();
00047 bool TMWHair = false;
00048
00049 if (!root || !xmlStrEqual(root->name, BAD_CAST "colors"))
00050 {
00051 logger->log("Trying TMW's color file, %s.", TMW_COLOR_FILE);
00052
00053 TMWHair = true;
00054
00055 delete doc;
00056
00057 doc = new XML::Document(TMW_COLOR_FILE);
00058 root = doc->rootNode();
00059 if (!root || !xmlStrEqual(root->name, BAD_CAST "colors"))
00060 {
00061 logger->log("ColorDB: Failed");
00062 mColors[0] = mFail;
00063 mLoaded = true;
00064
00065 delete doc;
00066
00067 return;
00068 }
00069 }
00070 for_each_xml_child_node(node, root)
00071 {
00072 if (xmlStrEqual(node->name, BAD_CAST "color"))
00073 {
00074 int id = XML::getProperty(node, "id", 0);
00075
00076 if (mColors.find(id) != mColors.end())
00077 {
00078 logger->log("ColorDB: Redefinition of dye ID %d", id);
00079 }
00080
00081 TMWHair ? mColors[id] = XML::getProperty(node, "value", "#FFFFFF") :
00082 mColors[id] = XML::getProperty(node, "dye", "#FFFFFF");
00083 }
00084 }
00085
00086 delete doc;
00087
00088 mLoaded = true;
00089 }
00090
00091 void ColorDB::unload()
00092 {
00093 logger->log("Unloading color database...");
00094
00095 mColors.clear();
00096 mLoaded = false;
00097 }
00098
00099 std::string &ColorDB::get(int id)
00100 {
00101 if (!mLoaded)
00102 load();
00103
00104 ColorIterator i = mColors.find(id);
00105
00106 if (i == mColors.end())
00107 {
00108 logger->log("ColorDB: Error, unknown dye ID# %d", id);
00109 return mFail;
00110 }
00111 else
00112 {
00113 return i->second;
00114 }
00115 }
00116
00117 int ColorDB::size()
00118 {
00119 return mColors.size();
00120 }