mirror of
https://github.com/vcmi/vcmi.git
synced 2025-02-09 13:14:02 +02:00
Use ISpellCaster in isImmuneByStack
This commit is contained in:
parent
a4d4851d80
commit
947f6089d5
@ -132,7 +132,7 @@ void CloneMechanics::applyBattleEffects(const SpellCastEnvironment * env, Battle
|
|||||||
env->sendAndApply(&ssp);
|
env->sendAndApply(&ssp);
|
||||||
}
|
}
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem CloneMechanics::isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const
|
ESpellCastProblem::ESpellCastProblem CloneMechanics::isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const
|
||||||
{
|
{
|
||||||
//can't clone already cloned creature
|
//can't clone already cloned creature
|
||||||
if(vstd::contains(obj->state, EBattleStackState::CLONED))
|
if(vstd::contains(obj->state, EBattleStackState::CLONED))
|
||||||
@ -144,7 +144,7 @@ ESpellCastProblem::ESpellCastProblem CloneMechanics::isImmuneByStack(const CGHer
|
|||||||
ui8 schoolLevel;
|
ui8 schoolLevel;
|
||||||
if(caster)
|
if(caster)
|
||||||
{
|
{
|
||||||
schoolLevel = caster->getSpellSchoolLevel(owner);
|
schoolLevel = caster->getEffectLevel(owner);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -189,7 +189,7 @@ void DispellMechanics::applyBattle(BattleInfo * battle, const BattleSpellCast *
|
|||||||
doDispell(battle, packet, Selector::sourceType(Bonus::SPELL_EFFECT));
|
doDispell(battle, packet, Selector::sourceType(Bonus::SPELL_EFFECT));
|
||||||
}
|
}
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem DispellMechanics::isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const
|
ESpellCastProblem::ESpellCastProblem DispellMechanics::isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
//just in case
|
//just in case
|
||||||
@ -351,15 +351,15 @@ ESpellCastProblem::ESpellCastProblem EarthquakeMechanics::canBeCast(const CBattl
|
|||||||
}
|
}
|
||||||
|
|
||||||
///HypnotizeMechanics
|
///HypnotizeMechanics
|
||||||
ESpellCastProblem::ESpellCastProblem HypnotizeMechanics::isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const
|
ESpellCastProblem::ESpellCastProblem HypnotizeMechanics::isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const
|
||||||
{
|
{
|
||||||
if(nullptr != caster) //do not resist hypnotize cast after attack, for example
|
//todo: maybe do not resist on passive cast
|
||||||
|
if(nullptr != caster)
|
||||||
{
|
{
|
||||||
//TODO: what with other creatures casting hypnotize, Faerie Dragons style?
|
//TODO: what with other creatures casting hypnotize, Faerie Dragons style?
|
||||||
ui64 subjectHealth = (obj->count - 1) * obj->MaxHealth() + obj->firstHPleft;
|
ui64 subjectHealth = (obj->count - 1) * obj->MaxHealth() + obj->firstHPleft;
|
||||||
//apply 'damage' bonus for hypnotize, including hero specialty
|
//apply 'damage' bonus for hypnotize, including hero specialty
|
||||||
ui64 maxHealth = caster->getSpellBonus(owner, caster->getPrimSkillLevel(PrimarySkill::SPELL_POWER)
|
ui64 maxHealth = caster->getSpellBonus(owner, owner->calculateRawEffectValue(caster->getEffectLevel(owner), caster->getEffectPower(owner)), obj);
|
||||||
* owner->power + owner->getPower(caster->getSpellSchoolLevel(owner)), obj);
|
|
||||||
if (subjectHealth > maxHealth)
|
if (subjectHealth > maxHealth)
|
||||||
return ESpellCastProblem::STACK_IMMUNE_TO_SPELL;
|
return ESpellCastProblem::STACK_IMMUNE_TO_SPELL;
|
||||||
}
|
}
|
||||||
@ -595,7 +595,7 @@ int SacrificeMechanics::calculateHealedHP(const SpellCastEnvironment* env, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
///SpecialRisingSpellMechanics
|
///SpecialRisingSpellMechanics
|
||||||
ESpellCastProblem::ESpellCastProblem SpecialRisingSpellMechanics::isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const
|
ESpellCastProblem::ESpellCastProblem SpecialRisingSpellMechanics::isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const
|
||||||
{
|
{
|
||||||
// following does apply to resurrect and animate dead(?) only
|
// following does apply to resurrect and animate dead(?) only
|
||||||
// for sacrifice health calculation and health limit check don't matter
|
// for sacrifice health calculation and health limit check don't matter
|
||||||
|
@ -48,7 +48,7 @@ class DLL_LINKAGE CloneMechanics : public DefaultSpellMechanics
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CloneMechanics(CSpell * s): DefaultSpellMechanics(s){};
|
CloneMechanics(CSpell * s): DefaultSpellMechanics(s){};
|
||||||
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const override;
|
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
|
||||||
protected:
|
protected:
|
||||||
void applyBattleEffects(const SpellCastEnvironment * env, BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
|
void applyBattleEffects(const SpellCastEnvironment * env, BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
|
||||||
};
|
};
|
||||||
@ -67,7 +67,7 @@ class DLL_LINKAGE DispellMechanics : public DefaultSpellMechanics
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DispellMechanics(CSpell * s): DefaultSpellMechanics(s){};
|
DispellMechanics(CSpell * s): DefaultSpellMechanics(s){};
|
||||||
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const override;
|
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
|
||||||
|
|
||||||
void applyBattle(BattleInfo * battle, const BattleSpellCast * packet) const override final;
|
void applyBattle(BattleInfo * battle, const BattleSpellCast * packet) const override final;
|
||||||
protected:
|
protected:
|
||||||
@ -87,7 +87,7 @@ class DLL_LINKAGE HypnotizeMechanics : public DefaultSpellMechanics
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
HypnotizeMechanics(CSpell * s): DefaultSpellMechanics(s){};
|
HypnotizeMechanics(CSpell * s): DefaultSpellMechanics(s){};
|
||||||
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const override;
|
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DLL_LINKAGE ObstacleMechanics : public DefaultSpellMechanics
|
class DLL_LINKAGE ObstacleMechanics : public DefaultSpellMechanics
|
||||||
@ -138,7 +138,7 @@ class DLL_LINKAGE SpecialRisingSpellMechanics : public RisingSpellMechanics
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SpecialRisingSpellMechanics(CSpell * s): RisingSpellMechanics(s){};
|
SpecialRisingSpellMechanics(CSpell * s): RisingSpellMechanics(s){};
|
||||||
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const override;
|
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DLL_LINKAGE SummonMechanics : public DefaultSpellMechanics
|
class DLL_LINKAGE SummonMechanics : public DefaultSpellMechanics
|
||||||
|
@ -743,7 +743,7 @@ ESpellCastProblem::ESpellCastProblem DefaultSpellMechanics::canBeCast(const CBat
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem DefaultSpellMechanics::isImmuneByStack(const CGHeroInstance * 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
|
||||||
return owner->internalIsImmune(caster, obj);
|
return owner->internalIsImmune(caster, obj);
|
||||||
|
@ -44,7 +44,7 @@ public:
|
|||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const override;
|
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const override;
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const override;
|
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
|
||||||
|
|
||||||
virtual void applyBattle(BattleInfo * battle, const BattleSpellCast * packet) const override;
|
virtual void applyBattle(BattleInfo * battle, const BattleSpellCast * packet) const override;
|
||||||
bool adventureCast(const SpellCastEnvironment * env, AdventureSpellCastParameters & parameters) const override final;
|
bool adventureCast(const SpellCastEnvironment * env, AdventureSpellCastParameters & parameters) const override final;
|
||||||
|
@ -506,7 +506,7 @@ ESpellCastProblem::ESpellCastProblem CSpell::internalIsImmune(const ISpellCaster
|
|||||||
return ESpellCastProblem::NOT_DECIDED;
|
return ESpellCastProblem::NOT_DECIDED;
|
||||||
}
|
}
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem CSpell::isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const
|
ESpellCastProblem::ESpellCastProblem CSpell::isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const
|
||||||
{
|
{
|
||||||
const auto immuneResult = mechanics->isImmuneByStack(caster,obj);
|
const auto immuneResult = mechanics->isImmuneByStack(caster,obj);
|
||||||
|
|
||||||
|
@ -272,7 +272,7 @@ public:
|
|||||||
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const;
|
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const;
|
||||||
|
|
||||||
///checks for creature immunity / anything that prevent casting *at given target* - doesn't take into account general problems such as not having spellbook or mana points etc.
|
///checks for creature immunity / anything that prevent casting *at given target* - doesn't take into account general problems such as not having spellbook or mana points etc.
|
||||||
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const;
|
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const;
|
||||||
public:
|
public:
|
||||||
///Server logic. Has write access to GameState via packets.
|
///Server logic. Has write access to GameState via packets.
|
||||||
///May be executed on client side by (future) non-cheat-proof scripts.
|
///May be executed on client side by (future) non-cheat-proof scripts.
|
||||||
|
@ -64,7 +64,7 @@ void DispellHelpfulMechanics::applyBattle(BattleInfo * battle, const BattleSpell
|
|||||||
doDispell(battle, packet, Selector::positiveSpellEffects);
|
doDispell(battle, packet, Selector::positiveSpellEffects);
|
||||||
}
|
}
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem DispellHelpfulMechanics::isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const
|
ESpellCastProblem::ESpellCastProblem DispellHelpfulMechanics::isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const
|
||||||
{
|
{
|
||||||
TBonusListPtr spellBon = obj->getSpellBonuses();
|
TBonusListPtr spellBon = obj->getSpellBonuses();
|
||||||
bool hasPositiveSpell = false;
|
bool hasPositiveSpell = false;
|
||||||
|
@ -36,5 +36,5 @@ public:
|
|||||||
|
|
||||||
void applyBattle(BattleInfo * battle, const BattleSpellCast * packet) const override final;
|
void applyBattle(BattleInfo * battle, const BattleSpellCast * packet) const override final;
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const override;
|
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
|
||||||
};
|
};
|
||||||
|
@ -92,7 +92,7 @@ public:
|
|||||||
|
|
||||||
virtual ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const = 0;
|
virtual ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const = 0;
|
||||||
|
|
||||||
virtual ESpellCastProblem::ESpellCastProblem isImmuneByStack(const CGHeroInstance * caster, const CStack * obj) const = 0;
|
virtual ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const = 0;
|
||||||
|
|
||||||
virtual void applyBattle(BattleInfo * battle, const BattleSpellCast * packet) const = 0;
|
virtual void applyBattle(BattleInfo * battle, const BattleSpellCast * packet) const = 0;
|
||||||
virtual bool adventureCast(const SpellCastEnvironment * env, AdventureSpellCastParameters & parameters) const = 0;
|
virtual bool adventureCast(const SpellCastEnvironment * env, AdventureSpellCastParameters & parameters) const = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user