Explorar o código

Move calculateHealedHP to mechanics

AlexVinS %!s(int64=10) %!d(string=hai) anos
pai
achega
b3d8e2e783
Modificáronse 3 ficheiros con 27 adicións e 35 borrados
  1. 0 24
      lib/CSpellHandler.cpp
  2. 0 9
      lib/CSpellHandler.h
  3. 27 2
      lib/SpellMechanics.cpp

+ 0 - 24
lib/CSpellHandler.cpp

@@ -234,30 +234,6 @@ ui32 CSpell::calculateDamage(const CGHeroInstance * caster, const CStack * affec
 	return ret;	
 }
 
-
-ui32 CSpell::calculateHealedHP(const CGHeroInstance* caster, const CStack* stack, const CStack* sacrificedStack) const
-{
-//todo: use Mechanics class
-	int healedHealth;
-	
-	if(!isHealingSpell())
-	{
-		logGlobal->errorStream() << "calculateHealedHP called for nonhealing spell "<< name;
-		return 0;
-	}		
-	
-	const int spellPowerSkill = caster->getPrimSkillLevel(PrimarySkill::SPELL_POWER);
-	const int levelPower = getPower(caster->getSpellSchoolLevel(this));
-	
-	if (id == SpellID::SACRIFICE && sacrificedStack)
-		healedHealth = (spellPowerSkill + sacrificedStack->MaxHealth() + levelPower) * sacrificedStack->count;
-	else
-		healedHealth = spellPowerSkill * power + levelPower; //???
-	healedHealth = calculateBonus(healedHealth, caster, stack);
-	return std::min<ui32>(healedHealth, stack->MaxHealth() - stack->firstHPleft + (isRisingSpell() ? stack->baseAmount * stack->MaxHealth() : 0));	
-}
-
-
 std::vector<BattleHex> CSpell::rangeInHexes(BattleHex centralHex, ui8 schoolLvl, ui8 side, bool *outDroppedHexes) const
 {
 	return mechanics->rangeInHexes(centralHex,schoolLvl,side,outDroppedHexes);

+ 0 - 9
lib/CSpellHandler.h

@@ -270,9 +270,6 @@ public:
 	///calculate spell damage on stack taking caster`s secondary skills and affectedCreature`s bonuses into account
 	ui32 calculateDamage(const CGHeroInstance * caster, const CStack * affectedCreature, int spellSchoolLevel, int usedSpellPower) const;
 	
-	///calculate healed HP for all spells casted by hero
-	ui32 calculateHealedHP(const CGHeroInstance * caster, const CStack * stack, const CStack * sacrificedStack = nullptr) const;
-	
 	///selects from allStacks actually affected stacks
 	std::set<const CStack *> getAffectedStacks(const CBattleInfoCallback * cb, ECastingMode::ECastingMode mode, PlayerColor casterColor, int spellLvl, BattleHex destination, const CGHeroInstance * caster = nullptr) const;
 
@@ -283,12 +280,6 @@ public:
 	 */
 	si32 getPower(const int skillLevel) const;
 
-//	/**
-//	* Returns spell power, taking base power into account
-//	*/
-//	si32 calculatePower(const int skillLevel) const;
-
-
 	si32 getProbability(const TFaction factionId) const;
 
 	/**

+ 27 - 2
lib/SpellMechanics.cpp

@@ -153,6 +153,9 @@ protected:
 	
 	virtual int calculateDuration(const CGHeroInstance * caster, int usedSpellPower) const;
 	
+	///calculate healed HP for all spells casted by hero
+	ui32 calculateHealedHP(const CGHeroInstance* caster, const CStack* stack, const CStack* sacrificedStack) const;
+	
 	///actual adventure cast implementation
 	virtual bool applyAdventureEffects(const SpellCastEnvironment * env, AdventureSpellCastParameters & parameters) const;
 };
@@ -647,6 +650,28 @@ int DefaultSpellMechanics::calculateDuration(const CGHeroInstance * caster, int
 	}	
 }
 
+ui32 DefaultSpellMechanics::calculateHealedHP(const CGHeroInstance* caster, const CStack* stack, const CStack* sacrificedStack) const
+{
+	int healedHealth;
+	
+	if(!owner->isHealingSpell())
+	{
+		logGlobal->errorStream() << "calculateHealedHP called for nonhealing spell "<< owner->name;
+		return 0;
+	}		
+	
+	const int spellPowerSkill = caster->getPrimSkillLevel(PrimarySkill::SPELL_POWER);
+	const int levelPower = owner->getPower(caster->getSpellSchoolLevel(owner));
+	
+	if (owner->id == SpellID::SACRIFICE && sacrificedStack)
+		healedHealth = (spellPowerSkill + sacrificedStack->MaxHealth() + levelPower) * sacrificedStack->count;
+	else
+		healedHealth = spellPowerSkill * owner->power + levelPower; //???
+	healedHealth = owner->calculateBonus(healedHealth, caster, stack);
+	return std::min<ui32>(healedHealth, stack->MaxHealth() - stack->firstHPleft + (owner->isRisingSpell() ? stack->baseAmount * stack->MaxHealth() : 0));		
+}
+
+
 void DefaultSpellMechanics::applyBattleEffects(const SpellCastEnvironment * env, BattleSpellCastParameters & parameters, SpellCastContext & ctx) const
 {
 	//applying effects
@@ -808,7 +833,7 @@ void DefaultSpellMechanics::applyBattleEffects(const SpellCastEnvironment * env,
 				}					
 			}
 			else
-				hi.healedHP = owner->calculateHealedHP(parameters.caster, attackedCre, parameters.selectedStack); //Casted by hero
+				hi.healedHP = calculateHealedHP(parameters.caster, attackedCre, parameters.selectedStack); //Casted by hero
 			hi.lowLevelResurrection = parameters.spellLvl <= 1;
 			shr.healedStacks.push_back(hi);
 		}
@@ -1628,7 +1653,7 @@ ESpellCastProblem::ESpellCastProblem SpecialRisingSpellMechanics::isImmuneByStac
 	
 	if(caster) //FIXME: Archangels can cast immune stack
 	{
-		auto maxHealth = owner->calculateHealedHP(caster, obj);
+		auto maxHealth = calculateHealedHP(caster, obj, nullptr);
 		if (maxHealth < obj->MaxHealth()) //must be able to rise at least one full creature
 			return ESpellCastProblem::STACK_IMMUNE_TO_SPELL;
 	}