summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/being.cpp111
-rw-r--r--src/being.h6
-rw-r--r--src/defaults.cpp1
-rw-r--r--src/resources/beinginfo.cpp6
-rw-r--r--src/resources/beinginfo.h8
-rw-r--r--src/resources/itemdb.cpp3
-rw-r--r--src/resources/iteminfo.cpp5
-rw-r--r--src/resources/iteminfo.h7
-rw-r--r--src/resources/monsterdb.cpp9
9 files changed, 102 insertions, 54 deletions
diff --git a/src/being.cpp b/src/being.cpp
index 89134bd0b..ad867ffbc 100644
--- a/src/being.cpp
+++ b/src/being.cpp
@@ -635,67 +635,92 @@ void Being::takeDamage(Being *const attacker, const int amount,
updateName();
}
else if (mType == PLAYER && socialWindow && getName() != "")
+ {
socialWindow->updateAvatar(getName());
+ }
if (effectManager)
{
- // Init the particle effect path based on current
- // weapon or default.
- int hitEffectId = 0;
- if (type != SKILL)
+ int hitEffectId = getHitEffect(attacker, type, attackId);
+ if (hitEffectId >= 0)
+ effectManager->trigger(hitEffectId, this);
+ }
+ }
+ else
+ {
+ if (effectManager)
+ {
+ int hitEffectId = getHitEffect(attacker,
+ MISS, attackId);
+ if (hitEffectId >= 0)
+ effectManager->trigger(hitEffectId, this);
+ }
+ }
+}
+
+int Being::getHitEffect(const Being *const attacker,
+ const AttackType type, const int attackId) const
+{
+ if (!effectManager)
+ return 0;
+
+ // Init the particle effect path based on current
+ // weapon or default.
+ int hitEffectId = 0;
+ if (type != SKILL)
+ {
+ const ItemInfo *attackerWeapon = attacker->getEquippedWeapon();
+ if (attackerWeapon && attacker->getType() == PLAYER)
+ {
+ if (type == MISS)
+ hitEffectId = attackerWeapon->getMissEffectId();
+ else if (type != CRITICAL)
+ hitEffectId = attackerWeapon->getHitEffectId();
+ else
+ hitEffectId = attackerWeapon->getCriticalHitEffectId();
+ }
+ else if (attacker && attacker->getType() == MONSTER)
+ {
+ const BeingInfo *const info = attacker->getInfo();
+ if (info)
{
- const ItemInfo *attackerWeapon = attacker->getEquippedWeapon();
- if (attackerWeapon && attacker->getType() == PLAYER)
+ const Attack *atk = info->getAttack(attackId);
+ if (atk)
{
- if (type != CRITICAL)
- hitEffectId = attackerWeapon->getHitEffectId();
+ if (type == MISS)
+ hitEffectId = atk->mMissEffectId;
+ else if (type != CRITICAL)
+ hitEffectId = atk->mHitEffectId;
else
- hitEffectId = attackerWeapon->getCriticalHitEffectId();
- }
- else if (attacker && attacker->getType() == MONSTER)
- {
- const BeingInfo *const info = attacker->getInfo();
- if (info)
- {
- const Attack *atk = info->getAttack(attackId);
- if (atk)
- {
- if (type != CRITICAL)
- hitEffectId = atk->mHitEffectId;
- else
- hitEffectId = atk->mCriticalHitEffectId;
- }
- else
- {
- if (type != CRITICAL)
- {
- hitEffectId = paths.getIntValue("hitEffectId");
- }
- else
- {
- hitEffectId = paths.getIntValue(
- "criticalHitEffectId");
- }
- }
- }
+ hitEffectId = atk->mCriticalHitEffectId;
}
else
{
- if (type != CRITICAL)
+ if (type == MISS)
+ hitEffectId = paths.getIntValue("missEffectId");
+ else if (type != CRITICAL)
hitEffectId = paths.getIntValue("hitEffectId");
else
hitEffectId = paths.getIntValue("criticalHitEffectId");
}
}
+ }
+ else
+ {
+ if (type == MISS)
+ hitEffectId = paths.getIntValue("missEffectId");
+ else if (type != CRITICAL)
+ hitEffectId = paths.getIntValue("hitEffectId");
else
- {
- // move skills effects to +100000 in effects list
- hitEffectId = attackId + 100000;
- }
- if (effectManager && hitEffectId >= 0)
- effectManager->trigger(hitEffectId, this);
+ hitEffectId = paths.getIntValue("criticalHitEffectId");
}
}
+ else
+ {
+ // move skills effects to +100000 in effects list
+ hitEffectId = attackId + 100000;
+ }
+ return hitEffectId;
}
void Being::handleAttack(Being *const victim, const int damage,
diff --git a/src/being.h b/src/being.h
index 379e7a179..58d3ea21c 100644
--- a/src/being.h
+++ b/src/being.h
@@ -137,7 +137,8 @@ class Being : public ActorSprite, public ConfigListener
MULTI = 0x08,
REFLECT = 0x04,
FLEE = 0x0b,
- SKILL = 0xff
+ SKILL = 0xff,
+ MISS = 0xffff // pseudo value for miss attacks
};
enum Reachable
@@ -834,6 +835,9 @@ class Being : public ActorSprite, public ConfigListener
void recalcSpritesOrder();
+ int getHitEffect(const Being *const attacker,
+ const AttackType type, const int attackId) const;
+
static uint8_t genderToInt(const Gender sex);
static Gender intToGender(uint8_t sex);
diff --git a/src/defaults.cpp b/src/defaults.cpp
index 49b683a37..a7b403298 100644
--- a/src/defaults.cpp
+++ b/src/defaults.cpp
@@ -323,6 +323,7 @@ DefaultsData* getPathsDefaults()
AddDEF("portalEffectFile", "warparea.particle.xml");
AddDEF("effectId", -1);
AddDEF("hitEffectId", 26);
+ AddDEF("missEffectId", -1);
AddDEF("criticalHitEffectId", 28);
AddDEF("minimaps", "graphics/minimaps/");
diff --git a/src/resources/beinginfo.cpp b/src/resources/beinginfo.cpp
index eef4ba7b7..f55d1f2e3 100644
--- a/src/resources/beinginfo.cpp
+++ b/src/resources/beinginfo.cpp
@@ -32,7 +32,7 @@
BeingInfo *BeingInfo::unknown = nullptr;
Attack *BeingInfo::empty = new Attack(SpriteAction::ATTACK,
- -1, -1, -1, std::string());
+ -1, -1, -1, -1, std::string());
BeingInfo::BeingInfo() :
mName(_("unnamed")),
@@ -117,13 +117,14 @@ const Attack *BeingInfo::getAttack(const int id) const
void BeingInfo::addAttack(const int id, std::string action, const int effectId,
const int hitEffectId, const int criticalHitEffectId,
+ const int missEffectId,
const std::string &missileParticle)
{
if (mAttacks[id])
delete mAttacks[id];
mAttacks[id] = new Attack(action, effectId, hitEffectId,
- criticalHitEffectId, missileParticle);
+ criticalHitEffectId, missEffectId, missileParticle);
}
void BeingInfo::clear()
@@ -141,5 +142,6 @@ void BeingInfo::init()
empty->mEffectId = paths.getIntValue("effectId");
empty->mHitEffectId = paths.getIntValue("hitEffectId");
empty->mCriticalHitEffectId = paths.getIntValue("criticalHitEffectId");
+ empty->mMissEffectId = paths.getIntValue("missEffectId");
}
}
diff --git a/src/resources/beinginfo.h b/src/resources/beinginfo.h
index d08e85608..208fcd541 100644
--- a/src/resources/beinginfo.h
+++ b/src/resources/beinginfo.h
@@ -34,15 +34,17 @@ struct Attack final
int mEffectId;
int mHitEffectId;
int mCriticalHitEffectId;
+ int mMissEffectId;
std::string mMissileParticle;
Attack(const std::string &action, const int effectId,
const int hitEffectId, const int criticalHitEffectId,
- const std::string &missileParticle) :
+ const int missEffectId, const std::string &missileParticle) :
mAction(action),
mEffectId(effectId),
mHitEffectId(hitEffectId),
mCriticalHitEffectId(criticalHitEffectId),
+ mMissEffectId(missEffectId),
mMissileParticle(missileParticle)
{
}
@@ -105,9 +107,9 @@ class BeingInfo final
const std::string &getSound(const SoundEvent event) const;
- void addAttack(const int id, std::string action,
+ void addAttack(const int id, std::string action, const int effectId,
const int hitEffectId, const int criticalHitEffectId,
- const int effectId,
+ const int missEffectId,
const std::string &missileParticle);
const Attack *getAttack(const int id) const;
diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp
index 8fd4a9fdc..559015be9 100644
--- a/src/resources/itemdb.cpp
+++ b/src/resources/itemdb.cpp
@@ -245,6 +245,8 @@ void ItemDB::load()
const int criticalEffectId = XML::getProperty(
node, "critical-hit-effect-id",
paths.getIntValue("criticalHitEffectId"));
+ const int missEffectId = XML::getProperty(node, "miss-effect-id",
+ paths.getIntValue("missEffectId"));
SpriteDisplay display;
display.image = image;
@@ -305,6 +307,7 @@ void ItemDB::load()
itemInfo->setMissileParticleFile(missileParticle);
itemInfo->setHitEffectId(hitEffectId);
itemInfo->setCriticalHitEffectId(criticalEffectId);
+ itemInfo->setMissEffectId(missEffectId);
itemInfo->setDrawBefore(-1, parseSpriteName(drawBefore));
itemInfo->setDrawAfter(-1, parseSpriteName(drawAfter));
itemInfo->setDrawPriority(-1, drawPriority);
diff --git a/src/resources/iteminfo.cpp b/src/resources/iteminfo.cpp
index 7e106af80..c7d8ecc0e 100644
--- a/src/resources/iteminfo.cpp
+++ b/src/resources/iteminfo.cpp
@@ -81,8 +81,9 @@ ItemInfo::ItemInfo() :
mMissileParticle(""),
mColors(nullptr),
mColorList(""),
- mHitEffectId(0),
- mCriticalHitEffectId(0),
+ mHitEffectId(-1),
+ mCriticalHitEffectId(-1),
+ mMissEffectId(-1),
maxFloorOffset(32)
{
for (int f = 0; f < 10; f ++)
diff --git a/src/resources/iteminfo.h b/src/resources/iteminfo.h
index 644b80154..ba429341d 100644
--- a/src/resources/iteminfo.h
+++ b/src/resources/iteminfo.h
@@ -194,6 +194,12 @@ class ItemInfo final
int getCriticalHitEffectId() const
{ return mCriticalHitEffectId; }
+ void setMissEffectId(const int s)
+ { mMissEffectId = s; }
+
+ int getMissEffectId() const
+ { return mMissEffectId; }
+
const std::string &getAttackAction() const
{ return mAttackAction; }
@@ -306,6 +312,7 @@ class ItemInfo final
std::string mColorList;
int mHitEffectId;
int mCriticalHitEffectId;
+ int mMissEffectId;
int maxFloorOffset;
};
diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp
index 3629357d1..22441c34e 100644
--- a/src/resources/monsterdb.cpp
+++ b/src/resources/monsterdb.cpp
@@ -192,11 +192,13 @@ void MonsterDB::load()
const int id = XML::getProperty(spriteNode, "id", 0);
const int effectId = XML::getProperty(
spriteNode, "effect-id", paths.getIntValue("effectId"));
- int hitEffectId = XML::getProperty(spriteNode,
+ const int hitEffectId = XML::getProperty(spriteNode,
"hit-effect-id", paths.getIntValue("hitEffectId"));
- int criticalHitEffectId = XML::getProperty(spriteNode,
+ const int criticalHitEffectId = XML::getProperty(spriteNode,
"critical-hit-effect-id",
paths.getIntValue("criticalHitEffectId"));
+ const int missEffectId = XML::getProperty(spriteNode,
+ "miss-effect-id", paths.getIntValue("missEffectId"));
const std::string spriteAction = XML::getProperty(
spriteNode, "action", "attack");
@@ -205,7 +207,8 @@ void MonsterDB::load()
spriteNode, "missile-particle", "");
currentInfo->addAttack(id, spriteAction, effectId,
- hitEffectId, criticalHitEffectId, missileParticle);
+ hitEffectId, criticalHitEffectId, missEffectId,
+ missileParticle);
}
else if (xmlNameEqual(spriteNode, "particlefx"))
{