1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-24 08:32:34 +02:00

Handle AcidBreathDamage immunity in standard way.

This commit is contained in:
AlexVinS 2016-09-06 10:52:54 +03:00
parent 0241c6e843
commit f3d9e718bf
4 changed files with 25 additions and 8 deletions

View File

@ -266,7 +266,9 @@ void DefaultSpellMechanics::castNormal(const SpellCastEnvironment * env, const B
//checking if creatures resist
handleResistance(env, ctx.attackedCres, ctx.sc);
//it is actual spell and can be reflected to single target, no recurrence
//reflection is applied only to negative spells
//if it is actual spell and can be reflected to single target, no recurrence
const bool tryMagicMirror = owner->isNegative() && owner->level && owner->getLevelInfo(0).range == "0";
if(tryMagicMirror)
{
@ -765,7 +767,7 @@ void DefaultSpellMechanics::handleImmunities(const CBattleInfoCallback * cb, con
void DefaultSpellMechanics::handleResistance(const SpellCastEnvironment * env, std::vector<const CStack* >& attackedCres, BattleSpellCast& sc) const
{
//checking if creatures resist
//resistance/reflection is applied only to negative spells
//resistance is applied only to negative spells
if(owner->isNegative())
{
std::vector <const CStack*> resisted;
@ -802,7 +804,6 @@ bool DefaultSpellMechanics::requiresCreatureTarget() const
return true;
}
std::vector<const CStack *> SpecialSpellMechanics::calculateAffectedStacks(const CBattleInfoCallback * cb, const SpellTargetingContext & ctx) const
{
return std::vector<const CStack *>();

View File

@ -61,13 +61,13 @@ protected:
virtual void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const;
virtual std::vector<const CStack *> calculateAffectedStacks(const CBattleInfoCallback * cb, const SpellTargetingContext & ctx) const;
virtual void handleImmunities(const CBattleInfoCallback * cb, const SpellTargetingContext & ctx, std::vector<const CStack *> & stacks) const;
protected:
void doDispell(BattleInfo * battle, const BattleSpellCast * packet, const CSelector & selector) const;
private:
void castNormal(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, std::vector <const CStack*> & reflected) const;
void castMagicMirror(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters) const;
void handleImmunities(const CBattleInfoCallback * cb, const SpellTargetingContext & ctx, std::vector<const CStack *> & stacks) const;
void handleResistance(const SpellCastEnvironment * env, std::vector<const CStack*> & attackedCres, BattleSpellCast & sc) const;
friend class SpellCastContext;

View File

@ -22,7 +22,7 @@ void AcidBreathDamageMechanics::applyBattleEffects(const SpellCastEnvironment *
//calculating dmg to display
ctx.setDamageToDisplay(parameters.effectPower);
for(auto & attackedCre : ctx.attackedCres) //no immunities
for(auto & attackedCre : ctx.attackedCres)
{
BattleStackAttacked bsa;
bsa.flags |= BattleStackAttacked::SPELL_EFFECT;
@ -35,9 +35,23 @@ void AcidBreathDamageMechanics::applyBattleEffects(const SpellCastEnvironment *
}
}
void AcidBreathDamageMechanics::handleImmunities(const CBattleInfoCallback * cb, const SpellTargetingContext & ctx, std::vector<const CStack*> & stacks) const
ESpellCastProblem::ESpellCastProblem AcidBreathDamageMechanics::isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const
{
//no immunities
//just in case
if(!obj->alive())
return ESpellCastProblem::WRONG_SPELL_TARGET;
//there should be no immunities by design
//but make it a bit configurable
//ignore all immunities, except specific absolute immunity
{
//SPELL_IMMUNITY absolute case
std::stringstream cachingStr;
cachingStr << "type_" << Bonus::SPELL_IMMUNITY << "subtype_" << owner->id.toEnum() << "addInfo_1";
if(obj->hasBonus(Selector::typeSubtypeInfo(Bonus::SPELL_IMMUNITY, owner->id.toEnum(), 1), cachingStr.str()))
return ESpellCastProblem::STACK_IMMUNE_TO_SPELL;
}
return ESpellCastProblem::OK;
}
///DeathStareMechanics

View File

@ -17,9 +17,11 @@ class DLL_LINKAGE AcidBreathDamageMechanics : public DefaultSpellMechanics
{
public:
AcidBreathDamageMechanics(CSpell * s): DefaultSpellMechanics(s){};
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
protected:
void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
void handleImmunities(const CBattleInfoCallback * cb, const SpellTargetingContext & ctx, std::vector<const CStack *> & stacks) const override;
};
class DLL_LINKAGE DeathStareMechanics : public DefaultSpellMechanics