2
0
Эх сурвалжийг харах

Extract general dispell logic

AlexVinS 10 жил өмнө
parent
commit
0134266fa1

+ 7 - 31
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

+ 12 - 0
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);
+	}	
+}

+ 2 - 0
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;
 };

+ 2 - 12
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