|
@@ -499,7 +499,7 @@ int DefaultSpellMechanics::calculateDuration(const CGHeroInstance * caster, int
|
|
return caster->getPrimSkillLevel(PrimarySkill::SPELL_POWER) + caster->valOfBonuses(Bonus::SPELL_DURATION);
|
|
return caster->getPrimSkillLevel(PrimarySkill::SPELL_POWER) + caster->valOfBonuses(Bonus::SPELL_DURATION);
|
|
}
|
|
}
|
|
|
|
|
|
-void DefaultSpellMechanics::applyBattleEffects(const SpellCastEnvironment * env, BattleSpellCastParameters & parameters, SpellCastContext & ctx) const
|
|
|
|
|
|
+int DefaultSpellMechanics::calculateEffectLevel(const BattleSpellCastParameters& parameters) const
|
|
{
|
|
{
|
|
int effectLevel = parameters.spellLvl;
|
|
int effectLevel = parameters.spellLvl;
|
|
{
|
|
{
|
|
@@ -508,7 +508,14 @@ void DefaultSpellMechanics::applyBattleEffects(const SpellCastEnvironment * env,
|
|
if(parameters.casterHero->hasBonusOfType(Bonus::MAXED_SPELL, owner->id))
|
|
if(parameters.casterHero->hasBonusOfType(Bonus::MAXED_SPELL, owner->id))
|
|
effectLevel = 3;
|
|
effectLevel = 3;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ return effectLevel;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
|
|
|
|
+void DefaultSpellMechanics::applyBattleEffects(const SpellCastEnvironment * env, BattleSpellCastParameters & parameters, SpellCastContext & ctx) const
|
|
|
|
+{
|
|
|
|
+ int effectLevel = calculateEffectLevel(parameters);
|
|
//applying effects
|
|
//applying effects
|
|
if(owner->isOffensiveSpell())
|
|
if(owner->isOffensiveSpell())
|
|
{
|
|
{
|
|
@@ -642,54 +649,7 @@ void DefaultSpellMechanics::applyBattleEffects(const SpellCastEnvironment * env,
|
|
if(!sse.stacks.empty())
|
|
if(!sse.stacks.empty())
|
|
env->sendAndApply(&sse);
|
|
env->sendAndApply(&sse);
|
|
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if(owner->isHealingSpell())
|
|
|
|
- {
|
|
|
|
- int hpGained = 0;
|
|
|
|
- if(parameters.casterStack)
|
|
|
|
- {
|
|
|
|
- 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 - commanders(?)
|
|
|
|
- {
|
|
|
|
- parameters.usedSpellPower = parameters.casterStack->valOfBonuses(Bonus::CREATURE_SPELL_POWER) * parameters.casterStack->count / 100;
|
|
|
|
- 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
|
|
|
|
- {
|
|
|
|
- hi.healedHP = attackedCre->calculateHealedHealthPoints(hpGained, resurrect);
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- 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);
|
|
|
|
- }
|
|
|
|
- if(!shr.healedStacks.empty())
|
|
|
|
- env->sendAndApply(&shr);
|
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
std::vector<BattleHex> DefaultSpellMechanics::rangeInHexes(BattleHex centralHex, ui8 schoolLvl, ui8 side, bool *outDroppedHexes) const
|
|
std::vector<BattleHex> DefaultSpellMechanics::rangeInHexes(BattleHex centralHex, ui8 schoolLvl, ui8 side, bool *outDroppedHexes) const
|