summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Schilling <ablu.erikschilling@googlemail.com>2012-07-02 20:48:54 +0200
committerErik Schilling <ablu.erikschilling@googlemail.com>2012-07-07 21:56:30 +0200
commit4eedc6fa1367c7e7ce81c8539176d998b8e92641 (patch)
treeced3bb96fef24b9ef98f808a2c62a69de63b228e
parent68158fffc6d2b28856e7b8f9f11e26131c1f3761 (diff)
downloadmanaserv-4eedc6fa1367c7e7ce81c8539176d998b8e92641.tar.gz
manaserv-4eedc6fa1367c7e7ce81c8539176d998b8e92641.tar.bz2
manaserv-4eedc6fa1367c7e7ce81c8539176d998b8e92641.tar.xz
manaserv-4eedc6fa1367c7e7ce81c8539176d998b8e92641.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.
-rw-r--r--example/items.xml2
-rw-r--r--example/monsters.xml2
-rw-r--r--src/game-server/monster.cpp14
-rw-r--r--src/game-server/monster.h8
-rw-r--r--src/game-server/monstermanager.cpp7
5 files changed, 30 insertions, 3 deletions
diff --git a/example/items.xml b/example/items.xml
index 3ed6ec9d..a42879b5 100644
--- a/example/items.xml
+++ b/example/items.xml
@@ -119,7 +119,7 @@
<modifier attribute="acc1" value="1.0" />
<attack skill="102" warmuptime="1" cooldowntime="5" reusetime="1"
basedamage="1" deltadamage="10" chancetohit="200" range="320"
- element="neutral" type="physical" />
+ element="fire" type="physical" />
<attack skill="102" priority="2" warmuptime="100" cooldowntime="10" reusetime="100"
basedamage="50" deltadamage="10" chancetohit="200" range="320"
element="neutral" type="physical" />
diff --git a/example/monsters.xml b/example/monsters.xml
index 5e73e93e..86a0c15a 100644
--- a/example/monsters.xml
+++ b/example/monsters.xml
@@ -52,7 +52,7 @@ exp<TAG>: Tells how much experience point a monster is giving up
magical-defence="0"
mutation="50"
/>
- <vulnerability element="fire" factor="1.5"/>
+ <vulnerability element="fire" factor="10"/>
<vulnerability element="earth" factor="0.7"/>
<exp>10</exp>
<!-- average stroll- and track range-->
diff --git a/src/game-server/monster.cpp b/src/game-server/monster.cpp
index 052b0ae2..5e3fb4b7 100644
--- a/src/game-server/monster.cpp
+++ b/src/game-server/monster.cpp
@@ -56,6 +56,14 @@ MonsterClass::~MonsterClass()
}
}
+float 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.base = 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 32d25b2f..8e87d758 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, float> 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, float factor)
+ { mVulnerabilities[element] = factor; }
+
+ float 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 7a0e186a..e0b45bad 100644
--- a/src/game-server/monstermanager.cpp
+++ b/src/game-server/monstermanager.cpp
@@ -250,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);