summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorErik Schilling <ablu.erikschilling@googlemail.com>2012-07-02 20:48:54 +0200
committerErik Schilling <ablu.erikschilling@googlemail.com>2013-01-08 16:58:57 +0100
commitac9acaa564750c0ce421742de029497ecb02852a (patch)
tree818b62ff4836137fcb35948997070717df789e1f /src
parentcf69b4b007e602576208d1beff9852c8bf1acbe9 (diff)
downloadmanaserv-ac9acaa564750c0ce421742de029497ecb02852a.tar.gz
manaserv-ac9acaa564750c0ce421742de029497ecb02852a.tar.xz
manaserv-ac9acaa564750c0ce421742de029497ecb02852a.zip
Added Vulnerabilities for monsters
You can now actually use the already used node in the monsters.xml Monsters can have different vulnerabillities against elements: <vulnerabillity element="earth" factor="2.0" /> This will double damage of the element earth to this monster.
Diffstat (limited to 'src')
-rw-r--r--src/game-server/monster.cpp14
-rw-r--r--src/game-server/monster.h8
-rw-r--r--src/game-server/monstermanager.cpp7
3 files changed, 28 insertions, 1 deletions
diff --git a/src/game-server/monster.cpp b/src/game-server/monster.cpp
index 26dc95f..71ff09b 100644
--- a/src/game-server/monster.cpp
+++ b/src/game-server/monster.cpp
@@ -56,6 +56,14 @@ MonsterClass::~MonsterClass()
}
}
+double MonsterClass::getVulnerability(Element element) const
+{
+ Vulnerabilities::const_iterator it = mVulnerabilities.find(element);
+ if (it == mVulnerabilities.end())
+ return 1.0f;
+ return it->second;
+}
+
Monster::Monster(MonsterClass *specy):
Being(OBJECT_MONSTER),
mSpecy(specy),
@@ -385,7 +393,11 @@ void Monster::changeAnger(Actor *target, int amount)
int Monster::damage(Actor *source, const Damage &damage)
{
- int HPLoss = Being::damage(source, damage);
+ Damage newDamage = damage;
+ float factor = mSpecy->getVulnerability(newDamage.element);
+ newDamage.base = newDamage.base * factor;
+ newDamage.delta = newDamage.delta * factor;
+ int HPLoss = Being::damage(source, newDamage);
if (source)
{
changeAnger(source, HPLoss);
diff --git a/src/game-server/monster.h b/src/game-server/monster.h
index 600196f..ea6cd30 100644
--- a/src/game-server/monster.h
+++ b/src/game-server/monster.h
@@ -62,6 +62,8 @@ struct MonsterAttack
std::string scriptEvent;
};
+typedef std::map<Element, double> Vulnerabilities;
+
/**
* Class describing the characteristics of a generic monster.
*/
@@ -193,6 +195,11 @@ class MonsterClass
/** Returns all attacks of the monster. */
std::vector<AttackInfo *> &getAttackInfos() { return mAttacks; }
+ void setVulnerability(Element element, double factor)
+ { mVulnerabilities[element] = factor; }
+
+ double getVulnerability(Element element) const;
+
/** sets the script file for the monster */
void setScript(const std::string &filename) { mScript = filename; }
@@ -229,6 +236,7 @@ class MonsterClass
int mAttackDistance;
int mOptimalLevel;
std::vector<AttackInfo *> mAttacks;
+ Vulnerabilities mVulnerabilities;
std::string mScript;
/**
diff --git a/src/game-server/monstermanager.cpp b/src/game-server/monstermanager.cpp
index 0e98f94..e82a847 100644
--- a/src/game-server/monstermanager.cpp
+++ b/src/game-server/monstermanager.cpp
@@ -264,6 +264,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()));
+ double factor = XML::getFloatProperty(subnode, "factor", 1.0);
+ monster->setVulnerability(element, factor);
+ }
}
monster->setDrops(drops);