summaryrefslogtreecommitdiff
path: root/src/game-server/statusmanager.cpp
diff options
context:
space:
mode:
authorChuck Miller <shadowmil@gmail.com>2009-07-17 14:11:30 -0400
committerChuck Miller <shadowmil@gmail.com>2009-07-17 14:11:30 -0400
commit1923fcab4fc9aefd3eaa97fd9ca9b1c507bb4bcb (patch)
tree9400828ce46de3dd8246f012d78af6bf8f4d744b /src/game-server/statusmanager.cpp
parent053d2fa151ae209fe15c0a38fddb10abf1f6ad8a (diff)
downloadmanaserv-1923fcab4fc9aefd3eaa97fd9ca9b1c507bb4bcb.tar.gz
manaserv-1923fcab4fc9aefd3eaa97fd9ca9b1c507bb4bcb.tar.bz2
manaserv-1923fcab4fc9aefd3eaa97fd9ca9b1c507bb4bcb.tar.xz
manaserv-1923fcab4fc9aefd3eaa97fd9ca9b1c507bb4bcb.zip
Adds scripted status effects
Diffstat (limited to 'src/game-server/statusmanager.cpp')
-rw-r--r--src/game-server/statusmanager.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/src/game-server/statusmanager.cpp b/src/game-server/statusmanager.cpp
new file mode 100644
index 00000000..ea96a226
--- /dev/null
+++ b/src/game-server/statusmanager.cpp
@@ -0,0 +1,141 @@
+/*
+ * The Mana World
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * The Mana World 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <map>
+#include <set>
+
+#include "game-server/statusmanager.hpp"
+
+#include "defines.h"
+#include "game-server/statuseffect.hpp"
+#include "game-server/resourcemanager.hpp"
+#include "scripting/script.hpp"
+#include "utils/logger.h"
+#include "utils/xml.hpp"
+
+#include <sstream>
+
+typedef std::map< int, StatusEffect * > StatusEffects;
+static StatusEffects statusEffects;
+static std::string statusReferenceFile;
+
+void StatusManager::initialize(const std::string &file)
+{
+ statusReferenceFile = file;
+ reload();
+}
+
+void StatusManager::reload()
+{
+ int size;
+ char *data = ResourceManager::loadFile(statusReferenceFile, size);
+
+ if (!data) {
+ LOG_ERROR("Status Manager: Could not find " << statusReferenceFile << "!");
+ free(data);
+ return;
+ }
+
+ xmlDocPtr doc = xmlParseMemory(data, size);
+ free(data);
+
+ if (!doc)
+ {
+ LOG_ERROR("Status Manager: Error while parsing status database ("
+ << statusReferenceFile << ")!");
+ return;
+ }
+
+ xmlNodePtr node = xmlDocGetRootElement(doc);
+ if (!node || !xmlStrEqual(node->name, BAD_CAST "status-effects"))
+ {
+ LOG_ERROR("Status Manager: " << statusReferenceFile
+ << " is not a valid database file!");
+ xmlFreeDoc(doc);
+ return;
+ }
+
+ LOG_INFO("Loading status reference...");
+ for (node = node->xmlChildrenNode; node != NULL; node = node->next)
+ {
+ if (!xmlStrEqual(node->name, BAD_CAST "status-effect"))
+ {
+ continue;
+ }
+
+ int id = XML::getProperty(node, "id", 0);
+ if (id == 0)
+ {
+ LOG_WARN("Status Manager: An (ignored) Status has no ID in "
+ << statusReferenceFile << "!");
+ continue;
+ }
+
+ std::string scriptFile = XML::getProperty(node, "script", "");
+ //TODO: Get these modifiers
+/*
+ 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));
+*/
+ StatusEffect *statusEffect = new StatusEffect(id);
+ if (scriptFile != "")
+ {
+ std::stringstream filename;
+ filename << "scripts/status/" << scriptFile;
+ if (ResourceManager::exists(filename.str())) // file exists!
+ {
+ LOG_INFO("Loading status script: " << filename.str());
+ Script *s = Script::create("lua");
+ s->loadFile(filename.str());
+ statusEffect->setScript(s);
+ } else {
+ LOG_WARN("Could not find script file \"" << filename.str() << "\" for status #"<<id);
+ }
+ }
+ statusEffects[id] = statusEffect;
+ }
+
+ xmlFreeDoc(doc);
+}
+
+void StatusManager::deinitialize()
+{
+ for (StatusEffects::iterator i = statusEffects.begin(), i_end = statusEffects.end(); i != i_end; ++i)
+ {
+ delete i->second;
+ }
+ statusEffects.clear();
+}
+
+StatusEffect *StatusManager::getStatus(int statusId)
+{
+ StatusEffects::const_iterator i = statusEffects.find(statusId);
+ return i != statusEffects.end() ? i->second : NULL;
+}
+