mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-27 22:49:25 +02:00
Fixed 0002280
This commit is contained in:
@@ -1459,21 +1459,15 @@ DLL_LINKAGE void StacksHealedOrResurrected::applyGs( CGameState *gs )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
vstd::amin(changedStack->firstHPleft, changedStack->MaxHealth());
|
vstd::amin(changedStack->firstHPleft, changedStack->MaxHealth());
|
||||||
//removal of negative effects
|
|
||||||
if(resurrected)
|
if(resurrected)
|
||||||
{
|
{
|
||||||
//removing all features from negative spells
|
//removing all effects from negative spells
|
||||||
const BonusList tmpFeatures = changedStack->getBonusList();
|
auto selector = [](const Bonus * b)
|
||||||
//changedStack->bonuses.clear();
|
|
||||||
|
|
||||||
for(Bonus *b : tmpFeatures)
|
|
||||||
{
|
{
|
||||||
const CSpell *s = b->sourceSpell();
|
const CSpell *s = b->sourceSpell();
|
||||||
if(s && s->isNegative())
|
return (s != nullptr) && s->isNegative() && (s->id != SpellID::DISRUPTING_RAY);
|
||||||
{
|
};
|
||||||
changedStack->removeBonus(b);
|
changedStack->popBonuses(selector);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -742,7 +742,6 @@ ESpellCastProblem::ESpellCastProblem DefaultSpellMechanics::canBeCast(const CBat
|
|||||||
return ESpellCastProblem::OK;
|
return ESpellCastProblem::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem DefaultSpellMechanics::isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const
|
ESpellCastProblem::ESpellCastProblem DefaultSpellMechanics::isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const
|
||||||
{
|
{
|
||||||
//by default use general algorithm
|
//by default use general algorithm
|
||||||
@@ -751,10 +750,22 @@ ESpellCastProblem::ESpellCastProblem DefaultSpellMechanics::isImmuneByStack(cons
|
|||||||
|
|
||||||
void DefaultSpellMechanics::doDispell(BattleInfo * battle, const BattleSpellCast * packet, const CSelector & selector) const
|
void DefaultSpellMechanics::doDispell(BattleInfo * battle, const BattleSpellCast * packet, const CSelector & selector) const
|
||||||
{
|
{
|
||||||
|
auto localSelector = [](const Bonus * bonus)
|
||||||
|
{
|
||||||
|
const CSpell * sourceSpell = bonus->sourceSpell();
|
||||||
|
if(sourceSpell != nullptr)
|
||||||
|
{
|
||||||
|
//Special case: DISRUPTING_RAY is "immune" to dispell
|
||||||
|
//Other even PERMANENT effects can be removed (f.e. BIND)
|
||||||
|
if(sourceSpell->id == SpellID::DISRUPTING_RAY)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
for(auto stackID : packet->affectedCres)
|
for(auto stackID : packet->affectedCres)
|
||||||
{
|
{
|
||||||
CStack *s = battle->getStack(stackID);
|
CStack *s = battle->getStack(stackID);
|
||||||
s->popBonuses(selector);
|
s->popBonuses(CSelector(localSelector).And(selector));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user