mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-26 22:57:00 +02:00
Use ISpellCaster in CSpell::canBeCast.
* -2 todo notes
This commit is contained in:
parent
d4d1693152
commit
f6715ad787
@ -1661,7 +1661,7 @@ ESpellCastProblem::ESpellCastProblem CBattleInfoCallback::battleCanCastThisSpell
|
|||||||
if(!spell->combatSpell)
|
if(!spell->combatSpell)
|
||||||
return ESpellCastProblem::ADVMAP_SPELL_INSTEAD_OF_BATTLE_SPELL;
|
return ESpellCastProblem::ADVMAP_SPELL_INSTEAD_OF_BATTLE_SPELL;
|
||||||
|
|
||||||
const ESpellCastProblem::ESpellCastProblem specificProblem = spell->canBeCast(this, player);
|
const ESpellCastProblem::ESpellCastProblem specificProblem = spell->canBeCast(this, caster);
|
||||||
|
|
||||||
if(specificProblem != ESpellCastProblem::OK)
|
if(specificProblem != ESpellCastProblem::OK)
|
||||||
return specificProblem;
|
return specificProblem;
|
||||||
|
@ -326,7 +326,7 @@ void EarthquakeMechanics::applyBattleEffects(const SpellCastEnvironment * env, c
|
|||||||
env->sendAndApply(&ca);
|
env->sendAndApply(&ca);
|
||||||
}
|
}
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem EarthquakeMechanics::canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const
|
ESpellCastProblem::ESpellCastProblem EarthquakeMechanics::canBeCast(const CBattleInfoCallback * cb, const ISpellCaster * caster) const
|
||||||
{
|
{
|
||||||
if(nullptr == cb->battleGetDefendedTown())
|
if(nullptr == cb->battleGetDefendedTown())
|
||||||
{
|
{
|
||||||
@ -338,11 +338,11 @@ ESpellCastProblem::ESpellCastProblem EarthquakeMechanics::canBeCast(const CBattl
|
|||||||
return ESpellCastProblem::NO_APPROPRIATE_TARGET;
|
return ESpellCastProblem::NO_APPROPRIATE_TARGET;
|
||||||
}
|
}
|
||||||
|
|
||||||
CSpell::TargetInfo ti(owner, 0);//TODO: use real spell level
|
CSpell::TargetInfo ti(owner, caster->getSpellSchoolLevel(owner));
|
||||||
if(ti.smart)
|
if(ti.smart)
|
||||||
{
|
{
|
||||||
//if spell targeting is smart, then only attacker can use it
|
//if spell targeting is smart, then only attacker can use it
|
||||||
if(cb->playerToSide(player) != 0)
|
if(cb->playerToSide(caster->getOwner()) != 0)
|
||||||
return ESpellCastProblem::NO_APPROPRIATE_TARGET;
|
return ESpellCastProblem::NO_APPROPRIATE_TARGET;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -526,18 +526,13 @@ HealingSpellMechanics::EHealLevel RisingSpellMechanics::getHealLevel(int effectL
|
|||||||
}
|
}
|
||||||
|
|
||||||
///SacrificeMechanics
|
///SacrificeMechanics
|
||||||
ESpellCastProblem::ESpellCastProblem SacrificeMechanics::canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const
|
ESpellCastProblem::ESpellCastProblem SacrificeMechanics::canBeCast(const CBattleInfoCallback * cb, const ISpellCaster * caster) const
|
||||||
{
|
{
|
||||||
// for sacrifice we have to check for 2 targets (one dead to resurrect and one living to destroy)
|
// for sacrifice we have to check for 2 targets (one dead to resurrect and one living to destroy)
|
||||||
|
|
||||||
bool targetExists = false;
|
bool targetExists = false;
|
||||||
bool targetToSacrificeExists = false;
|
bool targetToSacrificeExists = false;
|
||||||
|
|
||||||
const CGHeroInstance * caster = nullptr; //todo: use ISpellCaster
|
|
||||||
|
|
||||||
if(cb->battleHasHero(cb->playerToSide(player)))
|
|
||||||
caster = cb->battleGetFightingHero(cb->playerToSide(player));
|
|
||||||
|
|
||||||
for(const CStack * stack : cb->battleGetAllStacks())
|
for(const CStack * stack : cb->battleGetAllStacks())
|
||||||
{
|
{
|
||||||
//using isImmuneBy directly as this mechanics does not have overridden immunity check
|
//using isImmuneBy directly as this mechanics does not have overridden immunity check
|
||||||
@ -545,7 +540,7 @@ ESpellCastProblem::ESpellCastProblem SacrificeMechanics::canBeCast(const CBattle
|
|||||||
//TODO: check that we really should check immunity for both stacks
|
//TODO: check that we really should check immunity for both stacks
|
||||||
ESpellCastProblem::ESpellCastProblem res = owner->internalIsImmune(caster, stack);
|
ESpellCastProblem::ESpellCastProblem res = owner->internalIsImmune(caster, stack);
|
||||||
const bool immune = ESpellCastProblem::OK != res && ESpellCastProblem::NOT_DECIDED != res;
|
const bool immune = ESpellCastProblem::OK != res && ESpellCastProblem::NOT_DECIDED != res;
|
||||||
const bool casterStack = stack->owner == player;
|
const bool casterStack = stack->owner == caster->getOwner();
|
||||||
|
|
||||||
if(!immune && casterStack)
|
if(!immune && casterStack)
|
||||||
{
|
{
|
||||||
@ -635,13 +630,13 @@ ESpellCastProblem::ESpellCastProblem SpecialRisingSpellMechanics::isImmuneByStac
|
|||||||
}
|
}
|
||||||
|
|
||||||
///SummonMechanics
|
///SummonMechanics
|
||||||
ESpellCastProblem::ESpellCastProblem SummonMechanics::canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const
|
ESpellCastProblem::ESpellCastProblem SummonMechanics::canBeCast(const CBattleInfoCallback * cb, const ISpellCaster * caster) const
|
||||||
{
|
{
|
||||||
//check if there are summoned elementals of other type
|
//check if there are summoned elementals of other type
|
||||||
|
|
||||||
auto otherSummoned = cb->battleGetStacksIf([player, this](const CStack * st)
|
auto otherSummoned = cb->battleGetStacksIf([caster, this](const CStack * st)
|
||||||
{
|
{
|
||||||
return (st->owner == player)
|
return (st->owner == caster->getOwner())
|
||||||
&& (vstd::contains(st->state, EBattleStackState::SUMMONED))
|
&& (vstd::contains(st->state, EBattleStackState::SUMMONED))
|
||||||
&& (!vstd::contains(st->state, EBattleStackState::CLONED))
|
&& (!vstd::contains(st->state, EBattleStackState::CLONED))
|
||||||
&& (st->getCreature()->idNumber != creatureToSummon);
|
&& (st->getCreature()->idNumber != creatureToSummon);
|
||||||
|
@ -78,7 +78,7 @@ class DLL_LINKAGE EarthquakeMechanics : public DefaultSpellMechanics
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
EarthquakeMechanics(CSpell * s): DefaultSpellMechanics(s){};
|
EarthquakeMechanics(CSpell * s): DefaultSpellMechanics(s){};
|
||||||
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const override;
|
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const ISpellCaster * caster) const override;
|
||||||
protected:
|
protected:
|
||||||
void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
|
void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
|
||||||
};
|
};
|
||||||
@ -127,7 +127,7 @@ class DLL_LINKAGE SacrificeMechanics : public RisingSpellMechanics
|
|||||||
public:
|
public:
|
||||||
SacrificeMechanics(CSpell * s): RisingSpellMechanics(s){};
|
SacrificeMechanics(CSpell * s): RisingSpellMechanics(s){};
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const override;
|
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const ISpellCaster * caster) const override;
|
||||||
protected:
|
protected:
|
||||||
void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
|
void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
|
||||||
int calculateHealedHP(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
|
int calculateHealedHP(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
|
||||||
@ -146,7 +146,7 @@ class DLL_LINKAGE SummonMechanics : public DefaultSpellMechanics
|
|||||||
public:
|
public:
|
||||||
SummonMechanics(CSpell * s, CreatureID cre): DefaultSpellMechanics(s), creatureToSummon(cre){};
|
SummonMechanics(CSpell * s, CreatureID cre): DefaultSpellMechanics(s), creatureToSummon(cre){};
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const override;
|
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const ISpellCaster * caster) const override;
|
||||||
protected:
|
protected:
|
||||||
void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
|
void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
|
||||||
private:
|
private:
|
||||||
|
@ -741,7 +741,7 @@ std::set<const CStack *> DefaultSpellMechanics::getAffectedStacks(SpellTargeting
|
|||||||
return attackedCres;
|
return attackedCres;
|
||||||
}
|
}
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem DefaultSpellMechanics::canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const
|
ESpellCastProblem::ESpellCastProblem DefaultSpellMechanics::canBeCast(const CBattleInfoCallback * cb, const ISpellCaster * caster) const
|
||||||
{
|
{
|
||||||
//no problems by default, this method is for spell-specific problems
|
//no problems by default, this method is for spell-specific problems
|
||||||
return ESpellCastProblem::OK;
|
return ESpellCastProblem::OK;
|
||||||
|
@ -40,7 +40,7 @@ public:
|
|||||||
std::vector<BattleHex> rangeInHexes(BattleHex centralHex, ui8 schoolLvl, ui8 side, bool * outDroppedHexes = nullptr) const override;
|
std::vector<BattleHex> rangeInHexes(BattleHex centralHex, ui8 schoolLvl, ui8 side, bool * outDroppedHexes = nullptr) const override;
|
||||||
std::set<const CStack *> getAffectedStacks(SpellTargetingContext & ctx) const override;
|
std::set<const CStack *> getAffectedStacks(SpellTargetingContext & ctx) const override;
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const override;
|
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const ISpellCaster * caster) const override;
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
|
ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
|
||||||
|
|
||||||
|
@ -143,9 +143,9 @@ ui32 CSpell::calculateDamage(const ISpellCaster * caster, const CStack * affecte
|
|||||||
return adjustRawDamage(caster, affectedCreature, calculateRawEffectValue(spellSchoolLevel, usedSpellPower));
|
return adjustRawDamage(caster, affectedCreature, calculateRawEffectValue(spellSchoolLevel, usedSpellPower));
|
||||||
}
|
}
|
||||||
|
|
||||||
ESpellCastProblem::ESpellCastProblem CSpell::canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const
|
ESpellCastProblem::ESpellCastProblem CSpell::canBeCast(const CBattleInfoCallback * cb, const ISpellCaster * caster) const
|
||||||
{
|
{
|
||||||
return mechanics->canBeCast(cb, player);
|
return mechanics->canBeCast(cb, caster);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<BattleHex> CSpell::rangeInHexes(BattleHex centralHex, ui8 schoolLvl, ui8 side, bool *outDroppedHexes) const
|
std::vector<BattleHex> CSpell::rangeInHexes(BattleHex centralHex, ui8 schoolLvl, ui8 side, bool *outDroppedHexes) const
|
||||||
|
@ -267,7 +267,7 @@ public:
|
|||||||
///internal interface (for callbacks)
|
///internal interface (for callbacks)
|
||||||
|
|
||||||
///Checks general but spell-specific problems for all casting modes. Use only during battle.
|
///Checks general but spell-specific problems for all casting modes. Use only during battle.
|
||||||
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const;
|
ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const ISpellCaster * caster) const;
|
||||||
|
|
||||||
///checks for creature immunity / anything that prevent casting *at given hex* - 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 hex* - doesn't take into account general problems such as not having spellbook or mana points etc.
|
||||||
ESpellCastProblem::ESpellCastProblem isImmuneAt(const CBattleInfoCallback * cb, const ISpellCaster * caster, ECastingMode::ECastingMode mode, BattleHex destination) const;
|
ESpellCastProblem::ESpellCastProblem isImmuneAt(const CBattleInfoCallback * cb, const ISpellCaster * caster, ECastingMode::ECastingMode mode, BattleHex destination) const;
|
||||||
|
@ -106,7 +106,7 @@ public:
|
|||||||
virtual std::vector<BattleHex> rangeInHexes(BattleHex centralHex, ui8 schoolLvl, ui8 side, bool * outDroppedHexes = nullptr) const = 0;
|
virtual std::vector<BattleHex> rangeInHexes(BattleHex centralHex, ui8 schoolLvl, ui8 side, bool * outDroppedHexes = nullptr) const = 0;
|
||||||
virtual std::set<const CStack *> getAffectedStacks(SpellTargetingContext & ctx) const = 0;
|
virtual std::set<const CStack *> getAffectedStacks(SpellTargetingContext & ctx) const = 0;
|
||||||
|
|
||||||
virtual ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, PlayerColor player) const = 0;
|
virtual ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const ISpellCaster * caster) const = 0;
|
||||||
|
|
||||||
virtual ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const = 0;
|
virtual ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const = 0;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user