diff options
author | Yohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer> | 2010-07-22 00:07:44 +0200 |
---|---|---|
committer | Yohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer> | 2010-07-22 00:08:37 +0200 |
commit | 89d1862497222ea48fb38995492df7947b00c4d7 (patch) | |
tree | 65559d094f931b847eaa46c2031a22d1d98ba89c /src/game-server/skillmanager.cpp | |
parent | 26d8eba0ad906cd9b4a95bbd94fc1556719fd5d2 (diff) | |
download | manaserv-89d1862497222ea48fb38995492df7947b00c4d7.tar.gz manaserv-89d1862497222ea48fb38995492df7947b00c4d7.tar.bz2 manaserv-89d1862497222ea48fb38995492df7947b00c4d7.tar.xz manaserv-89d1862497222ea48fb38995492df7947b00c4d7.zip |
Upgraded Skill Map loading.
- Added a new 'default' boolean parameter in mana-skills.xml.
If set to true, unknown weapon types will be defaulted
to the given value.
- Added better checks on skill id and names and improved error
reporting.
- Corrected minor typos, and made small cleanups.
Reviewed-by: jaxad0127
Diffstat (limited to 'src/game-server/skillmanager.cpp')
-rw-r--r-- | src/game-server/skillmanager.cpp | 120 |
1 files changed, 106 insertions, 14 deletions
diff --git a/src/game-server/skillmanager.cpp b/src/game-server/skillmanager.cpp index 4d262a4a..dd9ee512 100644 --- a/src/game-server/skillmanager.cpp +++ b/src/game-server/skillmanager.cpp @@ -30,6 +30,7 @@ typedef std::map< std::string, int > SkillMap; static SkillMap skillMap; static std::string skillReferenceFile; +static std::string defaultSkillKey = std::string(); void SkillManager::initialize(const std::string &file) { @@ -49,8 +50,9 @@ void SkillManager::reload() std::string absPathFile = ResourceManager::resolve(skillReferenceFile); - if (!data) { - LOG_ERROR("Item Manager: Could not find " << skillReferenceFile << "!"); + if (!data) + { + LOG_ERROR("Skill Manager: Could not find " << skillReferenceFile << "!"); free(data); return; } @@ -84,38 +86,128 @@ void SkillManager::reload() { if (xmlStrEqual(skillnode->name, BAD_CAST "skill")) { - std::string name = XML::getProperty(skillnode, "name", std::string()); + std::string name = XML::getProperty(skillnode, "name", + std::string()); name = utils::toupper(name); int id = XML::getProperty(skillnode, "id", 0); if (id && !name.empty()) { - skillMap[utils::toupper(name)] = id; + bool duplicateKey = false; + for (SkillMap::iterator i = skillMap.begin(); + i != skillMap.end(); i++) + { + if (id == i->second) + { + LOG_ERROR("SkillManager: The same id: " << id + << " is given for skill names: " << i->first + << " and " << name); + LOG_ERROR("The skill reference: " << "'" << name + << "': " << id << " will be ignored."); + + duplicateKey = true; + break; + } + } + + if (!duplicateKey) + { + if (XML::getBoolProperty(skillnode, "default", false)) + { + if (!defaultSkillKey.empty()) + { + LOG_WARN("SkillManager: " + "Default Skill Key already defined as " + << defaultSkillKey + << ". Redefinit it as: " << name); + } + else + { + LOG_INFO("SkillManager: Defining " << name + << " as default weapon-type key."); + } + defaultSkillKey = name; + } + skillMap[name] = id; + } } } } } - LOG_DEBUG("skill map:"); - for (SkillMap::iterator i = skillMap.begin(); i != skillMap.end(); i++) + if (::utils::Logger::mVerbosity >= ::utils::Logger::Debug) { - LOG_DEBUG(" " << i->first << " : " << i->second); + LOG_DEBUG("Skill map in " << skillReferenceFile << ":" + << std::endl << "-----"); + for (SkillMap::iterator i = skillMap.begin(); i != skillMap.end(); i++) + { + if (!defaultSkillKey.compare(i->first)) + { + LOG_DEBUG("'" << i->first << "': " << i->second + << " (Default)"); + } + else + { + LOG_DEBUG("'" << i->first << "': " << i->second); + } + } + LOG_DEBUG("-----"); } + + if (defaultSkillKey.empty()) + LOG_WARN("SkillManager: No default weapon-type id was given during " + "Skill map loading. Defaults will fall back to id 0."); + + LOG_INFO("Loaded " << skillMap.size() << " skill references from " + << absPathFile); } int SkillManager::getIdFromString(const std::string &name) { - //check if already an integer, if yes just return it - int val; - val = atoi(name.c_str()); - if (val) - return val; + // Check if the name is an integer value. + if (utils::isNumeric(name)) + { + int val = 0; + val = utils::stringToInt(name); + if (val) + { + for (SkillMap::iterator i = skillMap.begin(); i != skillMap.end(); i++) + { + if (i->second == val) + return val; + } + LOG_WARN("SkillManager::getIdFromString(): Numeric weapon-type id " + << val << " not found into " << skillReferenceFile); + + SkillMap::iterator i = skillMap.find(defaultSkillKey); + if (i != skillMap.end()) + { + LOG_WARN("Id defaulted to " << defaultSkillKey << ": " + << i->second); + return i->second; + } + else + { + LOG_WARN("Id defaulted to 0."); + return 0; + } + } + else + { + LOG_WARN("SkillManager: Invalid skill id " << name); + return 0; + } + } - // convert to upper case for easier finding + // Convert to upper case for easier finding SkillMap::iterator i = skillMap.find(utils::toupper(name)); if (i == skillMap.end()) { + LOG_WARN("SkillManager: No weapon-type name corresponding to " + << utils::toupper(name) << " into " << skillReferenceFile); return 0; - } else { + } + else + { return i->second; } } |