diff options
author | Erik Schilling <ablu.erikschilling@googlemail.com> | 2012-07-02 20:48:54 +0200 |
---|---|---|
committer | Erik Schilling <ablu.erikschilling@googlemail.com> | 2013-01-08 16:58:57 +0100 |
commit | ac9acaa564750c0ce421742de029497ecb02852a (patch) | |
tree | 818b62ff4836137fcb35948997070717df789e1f /src/game-server | |
parent | cf69b4b007e602576208d1beff9852c8bf1acbe9 (diff) | |
download | manaserv-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/game-server')
-rw-r--r-- | src/game-server/monster.cpp | 14 | ||||
-rw-r--r-- | src/game-server/monster.h | 8 | ||||
-rw-r--r-- | src/game-server/monstermanager.cpp | 7 |
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); |