From 0134266fa1b5c96f6475c0abc9ec09309ec3626f Mon Sep 17 00:00:00 2001 From: AlexVinS Date: Sat, 11 Apr 2015 16:27:14 +0300 Subject: [PATCH] Extract general dispell logic --- lib/spells/BattleSpellMechanics.cpp | 38 +++++---------------------- lib/spells/CDefaultSpellMechanics.cpp | 12 +++++++++ lib/spells/CDefaultSpellMechanics.h | 2 ++ lib/spells/CreatureSpellMechanics.cpp | 14 ++-------- 4 files changed, 23 insertions(+), 43 deletions(-) diff --git a/lib/spells/BattleSpellMechanics.cpp b/lib/spells/BattleSpellMechanics.cpp index de63bac9e..c43327af9 100644 --- a/lib/spells/BattleSpellMechanics.cpp +++ b/lib/spells/BattleSpellMechanics.cpp @@ -19,24 +19,14 @@ void AntimagicMechanics::applyBattle(BattleInfo * battle, const BattleSpellCast { DefaultSpellMechanics::applyBattle(battle, packet); - for(auto stackID : packet->affectedCres) + doDispell(battle, packet, [this](const Bonus * b) -> bool { - if(vstd::contains(packet->resisted, stackID)) - { - logGlobal->errorStream() << "Resistance to positive spell " << owner->name; - continue; + if(b->source == Bonus::SPELL_EFFECT) + { + return b->sid != owner->id; //effect from this spell } - - CStack * s = battle->getStack(stackID); - s->popBonuses([&](const Bonus *b) -> bool - { - if(b->source == Bonus::SPELL_EFFECT) - { - return b->sid != owner->id; //effect from this spell - } - return false; //not a spell effect - }); - } + return false; //not a spell effect + }); } ///ChainLightningMechanics @@ -163,21 +153,7 @@ void CureMechanics::applyBattle(BattleInfo * battle, const BattleSpellCast * pac void DispellMechanics::applyBattle(BattleInfo * battle, const BattleSpellCast * packet) const { DefaultSpellMechanics::applyBattle(battle, packet); - - for(auto stackID : packet->affectedCres) - { - if(vstd::contains(packet->resisted, stackID)) - { - logGlobal->errorStream() << "Resistance to DISPELL"; - continue; - } - - CStack *s = battle->getStack(stackID); - s->popBonuses([&](const Bonus *b) -> bool - { - return Selector::sourceType(Bonus::SPELL_EFFECT)(b); - }); - } + doDispell(battle, packet, Selector::sourceType(Bonus::SPELL_EFFECT)); } ESpellCastProblem::ESpellCastProblem DispellMechanics::isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const diff --git a/lib/spells/CDefaultSpellMechanics.cpp b/lib/spells/CDefaultSpellMechanics.cpp index 344c071d0..1872922df 100644 --- a/lib/spells/CDefaultSpellMechanics.cpp +++ b/lib/spells/CDefaultSpellMechanics.cpp @@ -723,3 +723,15 @@ ESpellCastProblem::ESpellCastProblem DefaultSpellMechanics::isImmuneByStack(cons //by default use general algorithm return owner->isImmuneBy(obj); } + +void DefaultSpellMechanics::doDispell(BattleInfo * battle, const BattleSpellCast * packet, const CSelector & selector) const +{ + for(auto stackID : packet->affectedCres) + { + if(vstd::contains(packet->resisted, stackID)) + continue; + + CStack *s = battle->getStack(stackID); + s->popBonuses(selector); + } +} diff --git a/lib/spells/CDefaultSpellMechanics.h b/lib/spells/CDefaultSpellMechanics.h index cdf025982..6d59c6b77 100644 --- a/lib/spells/CDefaultSpellMechanics.h +++ b/lib/spells/CDefaultSpellMechanics.h @@ -51,4 +51,6 @@ protected: ///actual adventure cast implementation virtual bool applyAdventureEffects(const SpellCastEnvironment * env, AdventureSpellCastParameters & parameters) const; + + void doDispell(BattleInfo * battle, const BattleSpellCast * packet, const CSelector & selector) const; }; diff --git a/lib/spells/CreatureSpellMechanics.cpp b/lib/spells/CreatureSpellMechanics.cpp index 205923af7..5e47e616d 100644 --- a/lib/spells/CreatureSpellMechanics.cpp +++ b/lib/spells/CreatureSpellMechanics.cpp @@ -59,18 +59,8 @@ void DeathStareMechanics::applyBattleEffects(const SpellCastEnvironment * env, B void DispellHelpfulMechanics::applyBattle(BattleInfo * battle, const BattleSpellCast * packet) const { DefaultSpellMechanics::applyBattle(battle, packet); - - for(auto stackID : packet->affectedCres) - { - if(vstd::contains(packet->resisted, stackID)) - continue; - - CStack *s = battle->getStack(stackID); - s->popBonuses([&](const Bonus *b) -> bool - { - return Selector::positiveSpellEffects(b); - }); - } + + doDispell(battle, packet, Selector::positiveSpellEffects); } ESpellCastProblem::ESpellCastProblem DispellHelpfulMechanics::isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const