|
@@ -499,27 +499,6 @@ int DefaultSpellMechanics::calculateDuration(const CGHeroInstance * caster, int
|
|
|
return caster->getPrimSkillLevel(PrimarySkill::SPELL_POWER) + caster->valOfBonuses(Bonus::SPELL_DURATION);
|
|
|
}
|
|
|
|
|
|
-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 = caster->getSpellBonus(owner, healedHealth, stack);
|
|
|
- return stack->calculateHealedHealthPoints(healedHealth, owner->isRisingSpell());
|
|
|
-}
|
|
|
-
|
|
|
void DefaultSpellMechanics::applyBattleEffects(const SpellCastEnvironment * env, BattleSpellCastParameters & parameters, SpellCastContext & ctx) const
|
|
|
{
|
|
|
int effectLevel = parameters.spellLvl;
|
|
@@ -673,26 +652,38 @@ void DefaultSpellMechanics::applyBattleEffects(const SpellCastEnvironment * env,
|
|
|
int unitSpellPower = parameters.casterStack->valOfBonuses(Bonus::SPECIFIC_SPELL_POWER, owner->id.toEnum());
|
|
|
if(unitSpellPower)
|
|
|
hpGained = parameters.casterStack->count * unitSpellPower; //Archangel
|
|
|
- else //Faerie Dragon-like effect - unused so far
|
|
|
+ else //Faerie Dragon-like effect - commanders(?)
|
|
|
{
|
|
|
parameters.usedSpellPower = parameters.casterStack->valOfBonuses(Bonus::CREATURE_SPELL_POWER) * parameters.casterStack->count / 100;
|
|
|
- hpGained = parameters.usedSpellPower * owner->power + owner->getPower(effectLevel);
|
|
|
+ hpGained = parameters.usedSpellPower * owner->power + owner->getPower(effectLevel);
|
|
|
}
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (owner->id == SpellID::SACRIFICE && parameters.selectedStack)
|
|
|
+ hpGained = (parameters.usedSpellPower + parameters.selectedStack->MaxHealth() + owner->getPower(effectLevel)) * parameters.selectedStack->count;
|
|
|
+ else
|
|
|
+ hpGained = parameters.usedSpellPower * owner->power + owner->getPower(effectLevel); //???
|
|
|
+ }
|
|
|
StacksHealedOrResurrected shr;
|
|
|
shr.lifeDrain = false;
|
|
|
shr.tentHealing = false;
|
|
|
+
|
|
|
+ const bool resurrect = owner->isRisingSpell();
|
|
|
for(auto & attackedCre : ctx.attackedCres)
|
|
|
{
|
|
|
StacksHealedOrResurrected::HealInfo hi;
|
|
|
hi.stackID = (attackedCre)->ID;
|
|
|
if (parameters.casterStack) //casted by creature
|
|
|
{
|
|
|
- const bool resurrect = owner->isRisingSpell();
|
|
|
hi.healedHP = attackedCre->calculateHealedHealthPoints(hpGained, resurrect);
|
|
|
}
|
|
|
else
|
|
|
- hi.healedHP = calculateHealedHP(parameters.casterHero, attackedCre, parameters.selectedStack); //Casted by hero
|
|
|
+ {
|
|
|
+ int stackHPgained = parameters.casterHero->getSpellBonus(owner, hpGained, attackedCre);
|
|
|
+ hi.healedHP = attackedCre->calculateHealedHealthPoints(stackHPgained, resurrect);
|
|
|
+ }
|
|
|
+
|
|
|
hi.lowLevelResurrection = (effectLevel <= 1) && (owner->id == SpellID::RESURRECTION);
|
|
|
shr.healedStacks.push_back(hi);
|
|
|
}
|