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.cpp85
1 files changed, 15 insertions, 70 deletions
diff --git a/src/game-server/monstermanager.cpp b/src/game-server/monstermanager.cpp
index 7612ddc1..e0b45bad 100644
--- a/src/game-server/monstermanager.cpp
+++ b/src/game-server/monstermanager.cpp
@@ -32,28 +32,6 @@
#define DEFAULT_MONSTER_SIZE 16
#define DEFAULT_MONSTER_SPEED 4.0f
-Element elementFromString (const std::string &name)
-{
- static std::map<const std::string, Element> table;
-
- if (table.empty())
- {
- table["neutral"] = ELEMENT_NEUTRAL;
- table["fire"] = ELEMENT_FIRE;
- table["water"] = ELEMENT_WATER;
- table["earth"] = ELEMENT_EARTH;
- table["air"] = ELEMENT_AIR;
- table["lightning"] = ELEMENT_LIGHTNING;
- table["metal"] = ELEMENT_METAL;
- table["wood"] = ELEMENT_WOOD;
- table["ice"] = ELEMENT_ICE;
- }
-
- std::map<const std::string, Element>::iterator val = table.find(name);
-
- return val == table.end() ? ELEMENT_ILLEGAL : (*val).second;
-}
-
void MonsterManager::reload()
{
deinitialize();
@@ -136,12 +114,6 @@ void MonsterManager::initialize()
monster->setAttribute(ATTR_MAX_HP, hp);
monster->setAttribute(ATTR_HP, hp);
- monster->setAttribute(MOB_ATTR_PHY_ATK_MIN,
- XML::getProperty(subnode, "attack-min", -1));
- monster->setAttribute(MOB_ATTR_PHY_ATK_DELTA,
- XML::getProperty(subnode, "attack-delta", -1));
- monster->setAttribute(MOB_ATTR_MAG_ATK,
- XML::getProperty(subnode, "attack-magic", -1));
monster->setAttribute(ATTR_DODGE,
XML::getProperty(subnode, "evade", -1));
monster->setAttribute(ATTR_MAGIC_DODGE,
@@ -235,62 +207,28 @@ void MonsterManager::initialize()
}
else if (xmlStrEqual(subnode->name, BAD_CAST "attack"))
{
- MonsterAttack *att = new MonsterAttack;
- att->id = XML::getProperty(subnode, "id", 0);
- att->priority = XML::getProperty(subnode, "priority", 1);
- att->damageFactor = XML::getFloatProperty(subnode,
- "damage-factor", 1.0f);
- att->preDelay = XML::getProperty(subnode, "pre-delay", 1);
- att->aftDelay = XML::getProperty(subnode, "aft-delay", 0);
- att->range = XML::getProperty(subnode, "range", 0);
- att->scriptEvent = XML::getProperty(subnode, "script-event",
- std::string());
- std::string sElement = XML::getProperty(subnode,
- "element", "neutral");
- att->element = elementFromString(sElement);
- std::string sType = XML::getProperty(subnode,
- "type", "physical");
-
+ AttackInfo *att = AttackInfo::readAttackNode(subnode);
bool validMonsterAttack = true;
- 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
- {
- LOG_WARN("Monster manager " << mMonsterReferenceFile
- << ": unknown damage type '" << sType << "'.");
- validMonsterAttack = false;
- }
- if (att->id < 1)
+ if (att->getDamage().id < 1)
{
LOG_WARN(mMonsterReferenceFile
<< ": Attack without ID for monster Id:"
<< id << " (" << name << ") - attack ignored");
validMonsterAttack = false;
}
- else if (att->element == ELEMENT_ILLEGAL)
+ else if (att->getDamage().element == ELEMENT_ILLEGAL)
{
LOG_WARN(mMonsterReferenceFile
- << ": Attack with unknown element \""
- << sElement << "\" for monster Id:" << id
- << " (" << name << ") - attack ignored");
+ << ": Attack with unknown element for monster Id:"
+ << id << " (" << name << ") - attack ignored");
validMonsterAttack = false;
}
- else if (att->type == -1)
+ else if (att->getDamage().type == DAMAGE_OTHER)
{
LOG_WARN(mMonsterReferenceFile
- << ": Attack with unknown type \"" << sType << "\""
- << " for monster Id:" << id
+ << ": Attack with unknown damage type "
+ << "for monster Id:" << id
<< " (" << name << ")");
validMonsterAttack = false;
}
@@ -312,6 +250,13 @@ void MonsterManager::initialize()
std::string val = (char *)filename;
monster->setScript(val);
}
+ else if (xmlStrEqual(subnode->name, BAD_CAST "vulnerability"))
+ {
+ Element element = elementFromString(
+ XML::getProperty(subnode, "element", std::string()));
+ float factor = XML::getFloatProperty(subnode, "factor", 1.0);
+ monster->setVulnerability(element, factor);
+ }
}
monster->setDrops(drops);