1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Extracted MagicMirror handling

This commit is contained in:
AlexVinS 2016-09-06 11:03:36 +03:00
parent f3d9e718bf
commit cc4362211c
2 changed files with 32 additions and 27 deletions

View File

@ -263,35 +263,9 @@ void DefaultSpellMechanics::castNormal(const SpellCastEnvironment * env, const B
logGlobal->debugStream() << "will affect: " << ctx.attackedCres.size() << " stacks";
//checking if creatures resist
handleResistance(env, ctx.attackedCres, ctx.sc);
//reflection is applied only to negative spells
//if it is actual spell and can be reflected to single target, no recurrence
const bool tryMagicMirror = owner->isNegative() && owner->level && owner->getLevelInfo(0).range == "0";
if(tryMagicMirror)
{
for(auto s : ctx.attackedCres)
{
const int mirrorChance = (s)->valOfBonuses(Bonus::MAGIC_MIRROR);
if(env->getRandomGenerator().nextInt(99) < mirrorChance)
reflected.push_back(s);
}
vstd::erase_if(ctx.attackedCres, [&reflected](const CStack * s)
{
return vstd::contains(reflected, s);
});
for(auto s : reflected)
{
BattleSpellCast::CustomEffect effect;
effect.effect = 3;
effect.stack = s->ID;
ctx.sc.customEffects.push_back(effect);
}
}
handleMagicMirror(env, ctx, reflected);
applyBattleEffects(env, parameters, ctx);
@ -764,6 +738,35 @@ void DefaultSpellMechanics::handleImmunities(const CBattleInfoCallback * cb, con
vstd::erase_if(stacks, predicate);
}
void DefaultSpellMechanics::handleMagicMirror(const SpellCastEnvironment * env, SpellCastContext & ctx, std::vector <const CStack*> & reflected) const
{
//reflection is applied only to negative spells
//if it is actual spell and can be reflected to single target, no recurrence
const bool tryMagicMirror = owner->isNegative() && owner->level && owner->getLevelInfo(0).range == "0";
if(tryMagicMirror)
{
for(auto s : ctx.attackedCres)
{
const int mirrorChance = (s)->valOfBonuses(Bonus::MAGIC_MIRROR);
if(env->getRandomGenerator().nextInt(99) < mirrorChance)
reflected.push_back(s);
}
vstd::erase_if(ctx.attackedCres, [&reflected](const CStack * s)
{
return vstd::contains(reflected, s);
});
for(auto s : reflected)
{
BattleSpellCast::CustomEffect effect;
effect.effect = 3;
effect.stack = s->ID;
ctx.sc.customEffects.push_back(effect);
}
}
}
void DefaultSpellMechanics::handleResistance(const SpellCastEnvironment * env, std::vector<const CStack* >& attackedCres, BattleSpellCast& sc) const
{
//checking if creatures resist

View File

@ -67,7 +67,9 @@ protected:
private:
void castNormal(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, std::vector <const CStack*> & reflected) const;
void castMagicMirror(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters) const;
void handleImmunities(const CBattleInfoCallback * cb, const SpellTargetingContext & ctx, std::vector<const CStack *> & stacks) const;
void handleMagicMirror(const SpellCastEnvironment * env, SpellCastContext & ctx, std::vector <const CStack*> & reflected) const;
void handleResistance(const SpellCastEnvironment * env, std::vector<const CStack*> & attackedCres, BattleSpellCast & sc) const;
friend class SpellCastContext;