summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/being.cpp12
-rw-r--r--src/particlecontainer.cpp3
-rw-r--r--src/statuseffect.cpp4
-rw-r--r--src/statuseffect.h7
4 files changed, 19 insertions, 7 deletions
diff --git a/src/being.cpp b/src/being.cpp
index 85807b2f..2be72360 100644
--- a/src/being.cpp
+++ b/src/being.cpp
@@ -432,6 +432,7 @@ Being::setStatusEffectBlock(int offset, Uint16 newEffects)
{
for (int i = 0; i < STATUS_EFFECTS; i++) {
int index = StatusEffect::blockEffectIndexToEffectIndex(offset + i);
+
if (index != -1)
setStatusEffect(index, (newEffects & (1 << i)) > 0);
}
@@ -451,13 +452,12 @@ Being::handleStatusEffect(StatusEffect *effect, int effectId)
Particle *particle = effect->getParticle();
- if (particle) {
- if (effectId >= 0)
- mStatusParticleEffects.setLocally(effectId, particle);
- else {
- mStunParticleEffects.clearLocally();
+ if (effectId >= 0)
+ mStatusParticleEffects.setLocally(effectId, particle);
+ else {
+ mStunParticleEffects.clearLocally();
+ if (particle)
mStunParticleEffects.addLocally(particle);
- }
}
}
diff --git a/src/particlecontainer.cpp b/src/particlecontainer.cpp
index ddd99ff2..bf15f1b5 100644
--- a/src/particlecontainer.cpp
+++ b/src/particlecontainer.cpp
@@ -130,7 +130,8 @@ void ParticleVector::setLocally(int index, Particle *particle)
if (mIndexedElements.size() <= (unsigned) index)
mIndexedElements.resize(index + 1, NULL);
- particle->disableAutoDelete();
+ if (particle)
+ particle->disableAutoDelete();
mIndexedElements[index] = particle;
}
diff --git a/src/statuseffect.cpp b/src/statuseffect.cpp
index eeae45d8..8aeb66c6 100644
--- a/src/statuseffect.cpp
+++ b/src/statuseffect.cpp
@@ -91,6 +91,7 @@ static std::map<int, int> blockEffectIndexMap;
int StatusEffect::blockEffectIndexToEffectIndex(int blockIndex)
{
+ load();
if (blockEffectIndexMap.find(blockIndex) == blockEffectIndexMap.end())
return -1;
return blockEffectIndexMap[blockIndex];
@@ -142,6 +143,7 @@ void StatusEffect::load()
if (index >= 0 && block_index >= 0)
blockEffectIndexMap[block_index] = index;
+
} else if (xmlStrEqual(node->name, BAD_CAST "stun-effect"))
the_map = &stunEffects;
@@ -159,6 +161,8 @@ void StatusEffect::load()
endEffect->mSFXEffect = XML::getProperty(node, "end-audio", "");
endEffect->mParticleEffect = XML::getProperty(node, "end-particle", "");
+ endEffect->mPersistentParticleEffect = (XML::getProperty(node, "persistent-particle-effect", "no")) != "no";
+
(*the_map)[1][index] = startEffect;
(*the_map)[0][index] = endEffect;
}
diff --git a/src/statuseffect.h b/src/statuseffect.h
index 5d18ac92..c720ed97 100644
--- a/src/statuseffect.h
+++ b/src/statuseffect.h
@@ -60,6 +60,12 @@ public:
*/
SpriteAction getAction();
+ /**
+ * Determines whether the particle effect should be restarted when the
+ * being changes maps
+ */
+ bool particleEffectIsPersistent() const { return mPersistentParticleEffect; }
+
/**
* Retrieves a status effect.
@@ -96,6 +102,7 @@ private:
std::string mParticleEffect;
std::string mIcon;
std::string mAction;
+ bool mPersistentParticleEffect;
};
#endif // !defined(STATUS_EFFECT_H)