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

Added new BattleSpellCastParameters support to SACRIFICE spell.

AlexVinS 10 жил өмнө
parent
commit
b07d272c2a

+ 34 - 5
lib/spells/BattleSpellMechanics.cpp

@@ -567,8 +567,23 @@ ESpellCastProblem::ESpellCastProblem SacrificeMechanics::canBeCast(const CBattle
 void SacrificeMechanics::applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const
 {
 	RisingSpellMechanics::applyBattleEffects(env, parameters, ctx);
+	const CStack * victim = nullptr;
+	if(parameters.destinations.size() == 2)
+	{
+		victim = parameters.destinations[1].stackValue;
+	}
+	else
+	{
+		//todo: remove and report error
+		victim = parameters.selectedStack;
+	}
+	if(nullptr == victim)
+	{
+		env->complain("SacrificeMechanics: No stack to sacrifice");
+		return;
+	}
 
-	if(parameters.selectedStack == parameters.cb->battleActiveStack())
+	if(victim == parameters.cb->battleActiveStack())
 	//set another active stack than the one removed, or bad things will happen
 	//TODO: make that part of BattleStacksRemoved? what about client update?
 	{
@@ -590,17 +605,31 @@ void SacrificeMechanics::applyBattleEffects(const SpellCastEnvironment * env, co
 
 	}
 	BattleStacksRemoved bsr;
-	bsr.stackIDs.insert(parameters.selectedStack->ID); //somehow it works for teleport?
+	bsr.stackIDs.insert(victim->ID);
 	env->sendAndApply(&bsr);
 }
 
 int SacrificeMechanics::calculateHealedHP(const SpellCastEnvironment* env, const BattleSpellCastParameters& parameters, SpellCastContext& ctx) const
 {
 	int res = 0;
-	if(nullptr == parameters.selectedStack)
-		env->complain("No stack to sacrifice.");
+	const CStack * victim = nullptr;
+
+	if(parameters.destinations.size() == 2)
+	{
+		victim = parameters.destinations[1].stackValue;
+	}
 	else
-		res = (parameters.effectPower + parameters.selectedStack->MaxHealth() + owner->getPower(parameters.effectLevel)) * parameters.selectedStack->count;
+	{
+		//todo: remove and report error
+		victim = parameters.selectedStack;
+	}
+	if(nullptr == victim)
+	{
+		env->complain("SacrificeMechanics: No stack to sacrifice");
+		return 0;
+	}
+
+	res = (parameters.effectPower + victim->MaxHealth() + owner->getPower(parameters.effectLevel)) * victim->count;
 	return res;
 }