summaryrefslogtreecommitdiff
path: root/src/game-server/monstermanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game-server/monstermanager.cpp')
-rw-r--r--src/game-server/monstermanager.cpp88
1 files changed, 44 insertions, 44 deletions
diff --git a/src/game-server/monstermanager.cpp b/src/game-server/monstermanager.cpp
index 3ad033f6..d7540281 100644
--- a/src/game-server/monstermanager.cpp
+++ b/src/game-server/monstermanager.cpp
@@ -21,17 +21,12 @@
#include "game-server/monstermanager.hpp"
#include "common/resourcemanager.hpp"
+#include "game-server/attributemanager.hpp"
#include "game-server/itemmanager.hpp"
#include "game-server/monster.hpp"
#include "utils/logger.h"
#include "utils/xml.hpp"
-#include <map>
-
-typedef std::map< int, MonsterClass * > MonsterClasses;
-static MonsterClasses monsterClasses; /**< Monster reference */
-static std::string monsterReferenceFile;
-
Element elementFromString (const std::string &name)
{
static std::map<const std::string, Element> table;
@@ -54,17 +49,16 @@ Element elementFromString (const std::string &name)
return val == table.end() ? ELEMENT_ILLEGAL : (*val).second;
}
-void MonsterManager::initialize(const std::string &file)
+void MonsterManager::initialize()
{
- monsterReferenceFile = file;
reload();
}
void MonsterManager::reload()
{
- std::string absPathFile = ResourceManager::resolve(monsterReferenceFile);
+ std::string absPathFile = ResourceManager::resolve(mMonsterReferenceFile);
if (absPathFile.empty()) {
- LOG_ERROR("Monster Manager: Could not find " << monsterReferenceFile << "!");
+ LOG_ERROR("Monster Manager: Could not find " << mMonsterReferenceFile << "!");
return;
}
@@ -92,16 +86,16 @@ void MonsterManager::reload()
{
LOG_WARN("Monster Manager: There is a monster ("
<< name << ") without ID in "
- << monsterReferenceFile << "! It has been ignored.");
+ << mMonsterReferenceFile << "! It has been ignored.");
continue;
}
MonsterClass *monster;
- MonsterClasses::iterator i = monsterClasses.find(id);
- if (i == monsterClasses.end())
+ MonsterClasses::iterator i = mMonsterClasses.find(id);
+ if (i == mMonsterClasses.end())
{
monster = new MonsterClass(id);
- monsterClasses[id] = monster;
+ mMonsterClasses[id] = monster;
}
else
{
@@ -117,7 +111,7 @@ void MonsterManager::reload()
if (xmlStrEqual(subnode->name, BAD_CAST "drop"))
{
MonsterDrop drop;
- drop.item = ItemManager::getItem(XML::getProperty(subnode, "item", 0));
+ drop.item = itemManager->getItem(XML::getProperty(subnode, "item", 0));
drop.probability = XML::getProperty(subnode, "percent", 0) * 100;
if (drop.item && drop.probability)
{
@@ -127,21 +121,21 @@ void MonsterManager::reload()
else if (xmlStrEqual(subnode->name, BAD_CAST "attributes"))
{
attributesSet = true;
- monster->setAttribute(BASE_ATTR_HP,
+ monster->setAttribute(ATTR_MAX_HP,
XML::getProperty(subnode, "hp", -1));
- monster->setAttribute(BASE_ATTR_PHY_ATK_MIN,
+ monster->setAttribute(MOB_ATTR_PHY_ATK_MIN,
XML::getProperty(subnode, "attack-min", -1));
- monster->setAttribute(BASE_ATTR_PHY_ATK_DELTA,
+ monster->setAttribute(MOB_ATTR_PHY_ATK_DELTA,
XML::getProperty(subnode, "attack-delta", -1));
- monster->setAttribute(BASE_ATTR_MAG_ATK,
+ monster->setAttribute(MOB_ATTR_MAG_ATK,
XML::getProperty(subnode, "attack-magic", -1));
- monster->setAttribute(BASE_ATTR_EVADE,
+ monster->setAttribute(ATTR_DODGE,
XML::getProperty(subnode, "evade", -1));
- monster->setAttribute(BASE_ATTR_HIT,
+ monster->setAttribute(ATTR_ACCURACY,
XML::getProperty(subnode, "hit", -1));
- monster->setAttribute(BASE_ATTR_PHY_RES,
+ monster->setAttribute(ATTR_DEFENSE,
XML::getProperty(subnode, "physical-defence", -1));
- monster->setAttribute(BASE_ATTR_MAG_RES,
+ monster->setAttribute(ATTR_MAGIC_DEFENSE,
XML::getProperty(subnode, "magical-defence", -1));
monster->setSize(XML::getProperty(subnode, "size", 0));
float speed = (XML::getFloatProperty(subnode, "speed", -1.0f));
@@ -150,21 +144,27 @@ void MonsterManager::reload()
//checking attributes for completeness and plausibility
if (monster->getMutation() > 99)
{
- LOG_WARN(monsterReferenceFile
+ LOG_WARN(mMonsterReferenceFile
<<": Mutation of monster #"<<id
<<" more than 99% - ignored");
monster->setMutation(0);
}
bool attributesComplete = true;
- for (int i = BASE_ATTR_BEGIN; i < BASE_ATTR_END; i++)
+ const AttributeScopes &mobAttr = attributeManager->getAttributeInfoForType(ATTR_MOB);
+
+ for (AttributeScopes::const_iterator it = mobAttr.begin(),
+ it_end = mobAttr.end();
+ it != it_end;
+ ++it)
{
- if (monster->getAttribute(i) == -1)
+ if (!monster->mAttributes.count(it->first))
{
attributesComplete = false;
- monster->setAttribute(i, 0);
+ monster->setAttribute(it->first, 0);
}
}
+
if (monster->getSize() == 0)
{
monster->setSize(16);
@@ -176,12 +176,9 @@ void MonsterManager::reload()
attributesComplete = false;
}
- if (!attributesComplete) LOG_WARN(monsterReferenceFile
+ if (!attributesComplete) LOG_WARN(mMonsterReferenceFile
<< ": Attributes incomplete for monster #" << id);
- //The speed is set in tiles per second in the monsters.xml
- monster->setSpeed(speed);
-
}
else if (xmlStrEqual(subnode->name, BAD_CAST "exp"))
{
@@ -216,24 +213,27 @@ void MonsterManager::reload()
if (sType == "physical") {att->type = DAMAGE_PHYSICAL; }
else if (sType == "magical" || sType == "magic") {att->type = DAMAGE_MAGICAL; }
else if (sType == "other") {att->type = DAMAGE_OTHER; }
- else { att->type = -1; }
+ else {
+ LOG_WARN("Monster manager " << mMonsterReferenceFile
+ << ": unknown damage type '" << sType << "'.");
+ }
if (att->id == 0)
{
- LOG_WARN(monsterReferenceFile
+ LOG_WARN(mMonsterReferenceFile
<< ": Attack without ID for monster #"
<< id << " (" << name << ") - attack ignored");
}
else if (att->element == ELEMENT_ILLEGAL)
{
- LOG_WARN(monsterReferenceFile
+ LOG_WARN(mMonsterReferenceFile
<< ": Attack with unknown element \""
<< sElement << "\" for monster #" << id
<< " (" << name << ") - attack ignored");
}
else if (att->type == -1)
{
- LOG_WARN(monsterReferenceFile
+ LOG_WARN(mMonsterReferenceFile
<< ": Attack with unknown type \"" << sType << "\""
<< " for monster #" << id << " (" << name << ")");
}
@@ -252,15 +252,15 @@ void MonsterManager::reload()
}
monster->setDrops(drops);
- if (!attributesSet) LOG_WARN(monsterReferenceFile
+ if (!attributesSet) LOG_WARN(mMonsterReferenceFile
<< ": No attributes defined for monster #"
<< id << " (" << name << ")");
- if (!behaviorSet) LOG_WARN(monsterReferenceFile
+ if (!behaviorSet) LOG_WARN(mMonsterReferenceFile
<< ": No behavior defined for monster #"
<< id << " (" << name << ")");
if (monster->getExp() == -1)
{
- LOG_WARN(monsterReferenceFile
+ LOG_WARN(mMonsterReferenceFile
<< ": No experience defined for monster #"
<< id << " (" << name << ")");
monster->setExp(0);
@@ -269,21 +269,21 @@ void MonsterManager::reload()
}
LOG_INFO("Loaded " << nbMonsters << " monsters from "
- << monsterReferenceFile << '.');
+ << mMonsterReferenceFile << '.');
}
void MonsterManager::deinitialize()
{
- for (MonsterClasses::iterator i = monsterClasses.begin(),
- i_end = monsterClasses.end(); i != i_end; ++i)
+ for (MonsterClasses::iterator i = mMonsterClasses.begin(),
+ i_end = mMonsterClasses.end(); i != i_end; ++i)
{
delete i->second;
}
- monsterClasses.clear();
+ mMonsterClasses.clear();
}
MonsterClass *MonsterManager::getMonster(int id)
{
- MonsterClasses::const_iterator i = monsterClasses.find(id);
- return i != monsterClasses.end() ? i->second : 0;
+ MonsterClasses::const_iterator i = mMonsterClasses.find(id);
+ return i != mMonsterClasses.end() ? i->second : 0;
}