/* * 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 . */ #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 element from settings. * Used by SettingsManager. */ void AbilityManager::readAbilityCategoryNode(xmlNodePtr node, const std::string &filename) { std::string categoryName = XML::getProperty(node, "name", std::string()); if (categoryName.empty()) { LOG_WARN("The " << filename << " file contains unamed " << " tags and will be ignored."); return; } categoryName = utils::toLower(categoryName); for_each_xml_child_node(specialNode, node) { if (xmlStrEqual(specialNode->name, BAD_CAST "ability")) { readAbilityNode(specialNode, categoryName); } } } /** * Check the status of recently loaded configuration. */ void AbilityManager::checkStatus() { LOG_INFO("Loaded " << mAbilitiesInfo.size() << " abilities"); } void AbilityManager::readAbilityNode(xmlNodePtr abilityNode, const std::string &categoryName) { 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 category: " << categoryName); 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 rechargeAttribute = XML::getProperty(abilityNode, "rechargeattribute", 0); int cooldownAttribute = XML::getProperty(abilityNode, "cooldownattribute", 0); bool autoconsume = XML::getBoolProperty(abilityNode, "autoconsume", true); if (rechargeable && neededMana <= 0) { LOG_WARN("Invalid ability '" << name << "' (rechargable but no needed attribute) in category: " << categoryName); return; } AbilityInfo *newInfo = new AbilityManager::AbilityInfo; newInfo->categoryName = categoryName; newInfo->name = name; newInfo->id = id; newInfo->rechargeable = rechargeable; newInfo->neededPoints = neededMana; newInfo->rechargeAttribute = rechargeAttribute; newInfo->cooldownAttribute = cooldownAttribute; newInfo->autoconsume = autoconsume; newInfo->target = getTargetByString(XML::getProperty(abilityNode, "target", std::string())); mAbilitiesInfo[newInfo->id] = newInfo; std::string keyName = categoryName + "_" + 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 &category, const std::string &name) const { std::string key = utils::toLower(category) + "_" + 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::getCategoryName(int id) const { AbilitiesInfo::const_iterator it = mAbilitiesInfo.find(id); return it != mAbilitiesInfo.end() ? it->second->categoryName : ""; } AbilityManager::AbilityInfo *AbilityManager::getAbilityInfo(int id) const { AbilitiesInfo::const_iterator it = mAbilitiesInfo.find(id); return it != mAbilitiesInfo.end() ? it->second : 0; } AbilityManager::AbilityInfo *AbilityManager::getAbilityInfo( const std::string &category, const std::string &name) const { std::string key = utils::toLower(category) + "_" + utils::toLower(name); return getAbilityInfo(key); } AbilityManager::AbilityInfo *AbilityManager::getAbilityInfo( const std::string &abilityName) const { if (mNamedAbilitiesInfo.contains(abilityName)) return mNamedAbilitiesInfo.value(abilityName); else return 0; }