// NeL - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include "nel/ligo/primitive_configuration.h" #include "nel/ligo/ligo_config.h" #include "nel/ligo/primitive.h" #include "nel/misc/i_xml.h" using namespace std; using namespace NLMISC; using namespace NLLIGO; extern bool ReadColor (CRGBA &color, xmlNodePtr node); // *************************************************************************** bool CPrimitiveConfigurations::read (xmlNodePtr configurationNode, const char *filename, const char *name, NLLIGO::CLigoConfig &config) { // The name Name = name; // Read the color ReadColor (Color, configurationNode); // Get the first matching pair MatchPairs.reserve (CIXml::countChildren (configurationNode, "MATCH_GROUP")); xmlNodePtr matchGroups = CIXml::getFirstChildNode (configurationNode, "MATCH_GROUP"); if (matchGroups) { do { // Add a pair MatchPairs.push_back(CMatchGroup()); CMatchGroup &matchGroup = MatchPairs.back(); // Get the first matching pair matchGroup.Pairs.reserve (CIXml::countChildren (matchGroups, "MATCH")); xmlNodePtr match = CIXml::getFirstChildNode (matchGroups, "MATCH"); if (match) { do { // Add the match matchGroup.Pairs.resize (matchGroup.Pairs.size()+1); std::pair &pair = matchGroup.Pairs.back(); // Get the match name std::string name; if (config.getPropertyString (name, filename, match, "NAME")) { pair.first = name; } else { config.syntaxError (filename, match, "Missing match name in configuration (%s)", name.c_str()); return false; } // Get the match value if (config.getPropertyString (name, filename, match, "VALUE")) { pair.second = name; } match = CIXml::getNextChildNode (match, "MATCH"); } while (match); } matchGroups = CIXml::getNextChildNode (matchGroups, "MATCH_GROUP"); } while (matchGroups); } return true; } // *************************************************************************** bool CPrimitiveConfigurations::belong (const IPrimitive &primitive) const { // For each match group uint group; const uint numGroup = (uint)MatchPairs.size(); for (group=0; group &pairs = matchGroup.Pairs[rules]; string key = toLower(pairs.second); // Get the property string value; if (primitive.getPropertyByName (pairs.first.c_str(), value)) { if (toLower(value) == key) continue; } // Get the property const std::vector *array = NULL; if (primitive.getPropertyByName (pairs.first.c_str(), array) && array) { uint i; for (i=0; isize(); i++) { if (toLower((*array)[i]) == key) break; } if (i!=array->size()) continue; } // Don't match break; } // Match ? if (rules == numRules) return true; } return false; } // ***************************************************************************