// 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;
}
// ***************************************************************************