summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/defines.h11
-rw-r--r--src/game-server/attributemanager.cpp5
-rw-r--r--src/game-server/autoattack.h48
-rw-r--r--src/game-server/character.cpp4
-rw-r--r--src/game-server/monster.cpp25
5 files changed, 47 insertions, 46 deletions
diff --git a/src/common/defines.h b/src/common/defines.h
index c14aca50..140a6929 100644
--- a/src/common/defines.h
+++ b/src/common/defines.h
@@ -126,6 +126,17 @@ enum Element
};
/**
+ * Damage type, used to know how to compute them.
+ */
+enum DamageType
+{
+ DAMAGE_PHYSICAL = 0,
+ DAMAGE_MAGICAL,
+ DAMAGE_DIRECT,
+ DAMAGE_OTHER = -1
+};
+
+/**
* A series of hardcoded attributes that must be defined.
* FIXME: Much of these serve only to indicate derivatives, and so would not be
* needed once this is no longer a hardcoded system.
diff --git a/src/game-server/attributemanager.cpp b/src/game-server/attributemanager.cpp
index 31566bed..bb307846 100644
--- a/src/game-server/attributemanager.cpp
+++ b/src/game-server/attributemanager.cpp
@@ -97,7 +97,10 @@ bool AttributeManager::isAttributeDirectlyModifiable(int id) const
ModifierLocation AttributeManager::getLocation(const std::string &tag) const
{
- return mTagMap.at(tag);
+ if (mTagMap.find(tag) != mTagMap.end())
+ return mTagMap.at(tag);
+ else
+ return ModifierLocation(0, 0);
}
const std::string *AttributeManager::getTag(const ModifierLocation &location) const
diff --git a/src/game-server/autoattack.h b/src/game-server/autoattack.h
index 2e891fa9..5995d248 100644
--- a/src/game-server/autoattack.h
+++ b/src/game-server/autoattack.h
@@ -23,18 +23,8 @@
#include <cstddef>
#include <list>
-#include <limits>
-/**
- * Methods of damage calculation
- */
-enum DamageType
-{
- DAMAGE_PHYSICAL = 0,
- DAMAGE_MAGICAL,
- DAMAGE_DIRECT,
- DAMAGE_OTHER = -1
-};
+#include "common/defines.h"
/**
* Structure that describes the severity and nature of an attack a being can
@@ -42,28 +32,30 @@ enum DamageType
*/
struct Damage
{
+ unsigned int skill; /**< Skill used by source (needed for exp calculation) */
unsigned short base; /**< Base amount of damage. */
unsigned short delta; /**< Additional damage when lucky. */
unsigned short cth; /**< Chance to hit. Opposes the evade attribute. */
unsigned char element; /**< Elemental damage. */
DamageType type; /**< Damage type: Physical or magical? */
- unsigned trueStrike : 1; /**< Override dodge calculation */
- std::list<size_t> usedSkills; /**< Skills used by source (needed for exp calculation) */
- unsigned short range; /**< Maximum distance that this attack can be used from */
+ bool trueStrike; /**< Override dodge calculation */
+ unsigned short range; /**< Maximum distance that this attack can be used from, in pixels */
- Damage(unsigned short base,
+ Damage(unsigned int skill,
+ unsigned short base,
unsigned short delta,
unsigned short cth,
unsigned char element,
DamageType type = DAMAGE_OTHER,
- unsigned short range = std::numeric_limits<unsigned short>::max())
- : base(base)
- , delta(delta)
- , cth(cth)
- , element(element)
- , type(type)
- , trueStrike(false)
- , range(range)
+ unsigned short range = DEFAULT_TILE_LENGTH):
+ skill(skill),
+ base(base),
+ delta(delta),
+ cth(cth),
+ element(element),
+ type(type),
+ trueStrike(false),
+ range(range)
{}
};
@@ -74,11 +66,11 @@ struct Damage
class AutoAttack
{
public:
- AutoAttack(Damage &damage, unsigned int delay, unsigned int warmup)
- : mDamage(damage)
- , mTimer(0)
- , mAspd(delay)
- , mWarmup(warmup && warmup < delay ? warmup : delay >> 2)
+ AutoAttack(Damage &damage, unsigned int warmup, unsigned int cooldown):
+ mDamage(damage),
+ mTimer(0),
+ mAspd(cooldown),
+ mWarmup(warmup && warmup < cooldown ? warmup : cooldown >> 2)
{}
unsigned short getTimer() const { return mTimer; }
diff --git a/src/game-server/character.cpp b/src/game-server/character.cpp
index 0cac8cfa..0cdd57b1 100644
--- a/src/game-server/character.cpp
+++ b/src/game-server/character.cpp
@@ -36,6 +36,7 @@
#include "game-server/gamehandler.h"
#include "game-server/mapcomposite.h"
#include "game-server/mapmanager.h"
+#include "game-server/skillmanager.h"
#include "game-server/state.h"
#include "game-server/trade.h"
#include "scripting/script.h"
@@ -161,7 +162,8 @@ void Character::perform()
{
int damageBase = getModifiedAttribute(ATTR_STR);
int damageDelta = damageBase / 2;
- Damage knuckleDamage(damageBase, damageDelta, 2, ELEMENT_NEUTRAL,
+ Damage knuckleDamage(skillManager->getDefaultSkillId(),
+ damageBase, damageDelta, 2, ELEMENT_NEUTRAL,
DAMAGE_PHYSICAL,
(getSize() < DEFAULT_TILE_LENGTH) ?
DEFAULT_TILE_LENGTH : getSize());
diff --git a/src/game-server/monster.cpp b/src/game-server/monster.cpp
index d0c55073..0f387917 100644
--- a/src/game-server/monster.cpp
+++ b/src/game-server/monster.cpp
@@ -131,7 +131,8 @@ void Monster::perform()
{
setTimerHard(T_M_ATTACK_TIME, mCurrentAttack->aftDelay
+ mCurrentAttack->preDelay);
- Damage dmg(getModifiedAttribute(MOB_ATTR_PHY_ATK_MIN) *
+ Damage dmg(0,
+ getModifiedAttribute(MOB_ATTR_PHY_ATK_MIN) *
mCurrentAttack->damageFactor,
getModifiedAttribute(MOB_ATTR_PHY_ATK_DELTA) *
mCurrentAttack->damageFactor,
@@ -421,22 +422,14 @@ int Monster::damage(Actor *source, const Damage &damage)
{
Character *s = static_cast< Character * >(source);
- std::list<size_t>::const_iterator iSkill;
- for (iSkill = damage.usedSkills.begin();
- iSkill != damage.usedSkills.end(); ++iSkill)
+ mExpReceivers[s].insert(damage.skill);
+ if (!isTimerRunning(T_M_KILLSTEAL_PROTECTED) || mOwner == s
+ || mOwner->getParty() == s->getParty())
{
- if (*iSkill)
- {
- mExpReceivers[s].insert(*iSkill);
- if (!isTimerRunning(T_M_KILLSTEAL_PROTECTED) || mOwner == s
- || mOwner->getParty() == s->getParty())
- {
- mOwner = s;
- mLegalExpReceivers.insert(s);
- setTimerHard(T_M_KILLSTEAL_PROTECTED,
- KILLSTEAL_PROTECTION_TIME);
- }
- }
+ mOwner = s;
+ mLegalExpReceivers.insert(s);
+ setTimerHard(T_M_KILLSTEAL_PROTECTED,
+ KILLSTEAL_PROTECTION_TIME);
}
}
return HPLoss;