summaryrefslogtreecommitdiff
path: root/src/game-server/itemmanager.cpp
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <thorbjorn@lindeijer.nl>2010-05-30 17:49:26 +0200
committerThorbjørn Lindeijer <thorbjorn@lindeijer.nl>2010-05-30 17:51:00 +0200
commit117fa948708616405ae7ffeffd790cbfb707ac69 (patch)
tree571b3311dd1864820aff0013b4625766d277f090 /src/game-server/itemmanager.cpp
parent3e669831a05c36a38519b6f22cb1ed3c11837f2f (diff)
downloadmanaserv-117fa948708616405ae7ffeffd790cbfb707ac69.tar.gz
manaserv-117fa948708616405ae7ffeffd790cbfb707ac69.tar.bz2
manaserv-117fa948708616405ae7ffeffd790cbfb707ac69.tar.xz
manaserv-117fa948708616405ae7ffeffd790cbfb707ac69.zip
Use XML::Document to automate memory cleanup
Makes the code a little nicer.
Diffstat (limited to 'src/game-server/itemmanager.cpp')
-rw-r--r--src/game-server/itemmanager.cpp64
1 files changed, 25 insertions, 39 deletions
diff --git a/src/game-server/itemmanager.cpp b/src/game-server/itemmanager.cpp
index e7069636..c1750443 100644
--- a/src/game-server/itemmanager.cpp
+++ b/src/game-server/itemmanager.cpp
@@ -45,39 +45,25 @@ void ItemManager::initialize(const std::string &file)
void ItemManager::reload()
{
- int size;
- char *data = ResourceManager::loadFile(itemReferenceFile, size);
-
std::string absPathFile = ResourceManager::resolve(itemReferenceFile);
-
- if (!data) {
+ if (absPathFile.empty()) {
LOG_ERROR("Item Manager: Could not find " << itemReferenceFile << "!");
- free(data);
return;
}
- xmlDocPtr doc = xmlParseMemory(data, size);
- free(data);
+ XML::Document doc(absPathFile, false);
+ xmlNodePtr rootNode = doc.rootNode();
- if (!doc)
+ if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "items"))
{
LOG_ERROR("Item Manager: Error while parsing item database ("
<< absPathFile << ")!");
return;
}
- xmlNodePtr node = xmlDocGetRootElement(doc);
- if (!node || !xmlStrEqual(node->name, BAD_CAST "items"))
- {
- LOG_ERROR("Item Manager: " << absPathFile
- << " is not a valid database file!");
- xmlFreeDoc(doc);
- return;
- }
-
LOG_INFO("Loading item reference: " << absPathFile);
unsigned nbItems = 0;
- for (node = node->xmlChildrenNode; node != NULL; node = node->next)
+ for_each_xml_child_node(node, rootNode)
{
// Try to load the version of the item database. The version is defined
// as subversion tag embedded as XML attribute. So every modification
@@ -109,8 +95,9 @@ void ItemManager::reload()
if (itemType == ITEM_UNKNOWN)
{
- LOG_WARN(itemReferenceFile<<": Unknown item type \""<<sItemType
- <<"\" for item #"<<id<<" - treating it as \"generic\"");
+ LOG_WARN(itemReferenceFile << ": Unknown item type \"" << sItemType
+ << "\" for item #" << id <<
+ " - treating it as \"generic\"");
itemType = ITEM_UNUSABLE;
}
@@ -146,27 +133,28 @@ void ItemManager::reload()
std::string strWeaponType = XML::getProperty(node, "weapon-type", "");
if (strWeaponType == "")
{
- LOG_WARN(itemReferenceFile<<": Unknown weapon type \""
- <<"\" for item #"<<id<<" - treating it as generic item");
+ LOG_WARN(itemReferenceFile << ": Unknown weapon type \""
+ << "\" for item #" << id <<
+ " - treating it as generic item");
} else {
weaponType = SkillManager::getIdFromString(strWeaponType);
}
modifiers.setValue(MOD_WEAPON_TYPE, weaponType);
- modifiers.setValue(MOD_WEAPON_RANGE, XML::getProperty(node, "range", 0));
- modifiers.setValue(MOD_ELEMENT_TYPE, XML::getProperty(node, "element", 0));
+ modifiers.setValue(MOD_WEAPON_RANGE, XML::getProperty(node, "range", 0));
+ modifiers.setValue(MOD_ELEMENT_TYPE, XML::getProperty(node, "element", 0));
}
- modifiers.setValue(MOD_LIFETIME, XML::getProperty(node, "lifetime", 0) * 10);
+ modifiers.setValue(MOD_LIFETIME, XML::getProperty(node, "lifetime", 0) * 10);
//TODO: add child nodes for these modifiers (additive and factor)
- modifiers.setAttributeValue(BASE_ATTR_PHY_ATK_MIN, XML::getProperty(node, "attack-min", 0));
- modifiers.setAttributeValue(BASE_ATTR_PHY_ATK_DELTA, XML::getProperty(node, "attack-delta", 0));
- modifiers.setAttributeValue(BASE_ATTR_HP, XML::getProperty(node, "hp", 0));
- modifiers.setAttributeValue(BASE_ATTR_PHY_RES, XML::getProperty(node, "defense", 0));
- modifiers.setAttributeValue(CHAR_ATTR_STRENGTH, XML::getProperty(node, "strength", 0));
- modifiers.setAttributeValue(CHAR_ATTR_AGILITY, XML::getProperty(node, "agility", 0));
- modifiers.setAttributeValue(CHAR_ATTR_DEXTERITY, XML::getProperty(node, "dexterity", 0));
- modifiers.setAttributeValue(CHAR_ATTR_VITALITY, XML::getProperty(node, "vitality", 0));
- modifiers.setAttributeValue(CHAR_ATTR_INTELLIGENCE, XML::getProperty(node, "intelligence", 0));
- modifiers.setAttributeValue(CHAR_ATTR_WILLPOWER, XML::getProperty(node, "willpower", 0));
+ modifiers.setAttributeValue(BASE_ATTR_PHY_ATK_MIN, XML::getProperty(node, "attack-min", 0));
+ modifiers.setAttributeValue(BASE_ATTR_PHY_ATK_DELTA, XML::getProperty(node, "attack-delta", 0));
+ modifiers.setAttributeValue(BASE_ATTR_HP, XML::getProperty(node, "hp", 0));
+ modifiers.setAttributeValue(BASE_ATTR_PHY_RES, XML::getProperty(node, "defense", 0));
+ modifiers.setAttributeValue(CHAR_ATTR_STRENGTH, XML::getProperty(node, "strength", 0));
+ modifiers.setAttributeValue(CHAR_ATTR_AGILITY, XML::getProperty(node, "agility", 0));
+ modifiers.setAttributeValue(CHAR_ATTR_DEXTERITY, XML::getProperty(node, "dexterity", 0));
+ modifiers.setAttributeValue(CHAR_ATTR_VITALITY, XML::getProperty(node, "vitality", 0));
+ modifiers.setAttributeValue(CHAR_ATTR_INTELLIGENCE, XML::getProperty(node, "intelligence", 0));
+ modifiers.setAttributeValue(CHAR_ATTR_WILLPOWER, XML::getProperty(node, "willpower", 0));
if (maxPerSlot == 0)
{
@@ -220,9 +208,7 @@ void ItemManager::reload()
}
LOG_INFO("Loaded " << nbItems << " items from "
- << itemReferenceFile << ".");
-
- xmlFreeDoc(doc);
+ << absPathFile << ".");
}
void ItemManager::deinitialize()