summaryrefslogtreecommitdiff
path: root/src/game-server/abilitymanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game-server/abilitymanager.cpp')
-rw-r--r--src/game-server/abilitymanager.cpp182
1 files changed, 182 insertions, 0 deletions
diff --git a/src/game-server/abilitymanager.cpp b/src/game-server/abilitymanager.cpp
new file mode 100644
index 00000000..91669f1f
--- /dev/null
+++ b/src/game-server/abilitymanager.cpp
@@ -0,0 +1,182 @@
+/*
+ * The Mana Server
+ * Copyright (C) 2004-2010 The Mana World Development Team
+ * Copyright (C) 2010-2012 The Mana Developers
+ *
+ * This file is part of The Mana Server.
+ *
+ * The Mana Server 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 Server 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 Server. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "abilitymanager.h"
+
+#include "utils/xml.h"
+#include "utils/logger.h"
+
+static AbilityManager::TargetMode getTargetByString(const std::string &str)
+{
+ std::string strLower = utils::toLower(str);
+ if (strLower == "being")
+ return AbilityManager::TARGET_BEING;
+ else if (strLower == "point")
+ return AbilityManager::TARGET_POINT;
+
+ LOG_WARN("Unknown targetmode " << str << " assuming being.");
+ return AbilityManager::TARGET_BEING;
+}
+
+
+/**
+ * Read a <special> element from settings.
+ * Used by SettingsManager.
+ */
+void AbilityManager::readAbilitySetNode(xmlNodePtr node,
+ const std::string &filename)
+{
+ std::string setName = XML::getProperty(node, "name", std::string());
+ if (setName.empty())
+ {
+ LOG_WARN("The " << filename << " file contains unamed "
+ << "<ability-set> tags and will be ignored.");
+ return;
+ }
+
+ setName = utils::toLower(setName);
+
+ for_each_xml_child_node(specialNode, node)
+ {
+ if (xmlStrEqual(specialNode->name, BAD_CAST "ability")) {
+ readAbilityNode(specialNode, setName);
+ }
+ }
+
+}
+
+/**
+ * Check the status of recently loaded configuration.
+ */
+void AbilityManager::checkStatus()
+{
+ LOG_INFO("Loaded " << mAbilitiesInfo.size() << " abilities");
+}
+
+
+void AbilityManager::readAbilityNode(xmlNodePtr abilityNode,
+ const std::string &setName)
+{
+ std::string name = utils::toLower(
+ XML::getProperty(abilityNode, "name", std::string()));
+ int id = XML::getProperty(abilityNode, "id", 0);
+
+ if (id <= 0 || name.empty())
+ {
+ LOG_WARN("Invalid ability (empty name or id <= 0) in set: " << setName);
+ return;
+ }
+
+ AbilitiesInfo::iterator it = mAbilitiesInfo.find(id);
+ if (it != mAbilitiesInfo.end())
+ {
+ LOG_WARN("AbilityManager: The same id: " << id
+ << " is given for ability names: " << it->first
+ << " and " << name);
+ LOG_WARN("The ability reference: " << id
+ << ": '" << name << "' will be ignored.");
+ return;
+ }
+
+ bool rechargeable = XML::getBoolProperty(abilityNode, "rechargeable", true);
+ int neededMana = XML::getProperty(abilityNode, "needed", 0);
+ int defaultRechargeSpeed = XML::getProperty(abilityNode,
+ "rechargespeed", 0);
+
+ if (rechargeable && neededMana <= 0)
+ {
+ LOG_WARN("Invalid ability '" << name
+ << "' (rechargable but no needed attribute) in set: "
+ << setName);
+ return;
+ }
+
+
+ AbilityInfo *newInfo = new AbilityManager::AbilityInfo;
+ newInfo->setName = setName;
+ newInfo->name = name;
+ newInfo->id = id;
+ newInfo->rechargeable = rechargeable;
+ newInfo->neededPoints = neededMana;
+ newInfo->defaultRechargeSpeed = defaultRechargeSpeed;
+
+ newInfo->target = getTargetByString(XML::getProperty(abilityNode, "target",
+ std::string()));
+
+ mAbilitiesInfo[newInfo->id] = newInfo;
+
+ std::string keyName = setName + "_" + newInfo->name;
+ mNamedAbilitiesInfo[keyName] = newInfo;
+}
+
+void AbilityManager::initialize()
+{
+ clear();
+}
+
+void AbilityManager::reload()
+{
+ clear();
+}
+
+void AbilityManager::clear()
+{
+ for (AbilitiesInfo::iterator it = mAbilitiesInfo.begin(),
+ it_end = mAbilitiesInfo.end(); it != it_end; ++it)
+ {
+ delete it->second;
+ }
+ mAbilitiesInfo.clear();
+ mNamedAbilitiesInfo.clear();
+}
+
+unsigned AbilityManager::getId(const std::string &set,
+ const std::string &name) const
+{
+ std::string key = utils::toLower(set) + "_" + utils::toLower(name);
+ return getId(key);
+}
+
+unsigned AbilityManager::getId(const std::string &abilityName) const
+{
+ if (mNamedAbilitiesInfo.contains(abilityName))
+ return mNamedAbilitiesInfo.value(abilityName)->id;
+ else
+ return 0;
+}
+
+const std::string AbilityManager::getAbilityName(int id) const
+{
+ AbilitiesInfo::const_iterator it = mAbilitiesInfo.find(id);
+ return it != mAbilitiesInfo.end() ? it->second->name : "";
+}
+
+const std::string AbilityManager::getSetName(int id) const
+{
+ AbilitiesInfo::const_iterator it = mAbilitiesInfo.find(id);
+ return it != mAbilitiesInfo.end() ? it->second->setName : "";
+}
+
+AbilityManager::AbilityInfo *AbilityManager::getAbilityInfo(int id)
+{
+ AbilitiesInfo::const_iterator it = mAbilitiesInfo.find(id);
+ return it != mAbilitiesInfo.end() ? it->second : 0;
+}