1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00

Fix possible crash on invalid SPELL_LIKE_ATTACK ability

This commit is contained in:
Ivan Savenko
2024-07-29 15:58:07 +00:00
parent 5f0e6f7ce1
commit 15f37f8c4b
2 changed files with 9 additions and 6 deletions

View File

@@ -32,18 +32,14 @@ public:
int32_t getNum() const
{
int32_t result;
std::visit([&result] (const auto& v) { result = v.getNum(); }, value);
return result;
}
std::string toString() const
{
std::string result;
std::visit([&result] (const auto& v) { result = v.encode(v.getNum()); }, value);
return result;
}
@@ -58,6 +54,13 @@ public:
return IdentifierType();
}
bool hasValue() const
{
bool result = false;
std::visit([&result] (const auto& v) { result = v.hasValue(); }, value);
return result;
}
template <typename Handler> void serialize(Handler &h)
{
h & value;

View File

@@ -494,7 +494,7 @@ bool BattleActionProcessor::doHealAction(const CBattleInfoCallback & battle, con
else
destStack = battle.battleGetUnitByPos(target.at(0).hexValue);
if(stack == nullptr || destStack == nullptr || !healerAbility || healerAbility->subtype == BonusSubtypeID())
if(stack == nullptr || destStack == nullptr || !healerAbility || !healerAbility->subtype.hasValue())
{
gameHandler->complain("There is either no healer, no destination, or healer cannot heal :P");
}
@@ -971,7 +971,7 @@ void BattleActionProcessor::makeAttack(const CBattleInfoCallback & battle, const
}
std::shared_ptr<const Bonus> bonus = attacker->getFirstBonus(Selector::type()(BonusType::SPELL_LIKE_ATTACK));
if(bonus && ranged) //TODO: make it work in melee?
if(bonus && ranged && bonus->subtype.hasValue()) //TODO: make it work in melee?
{
//this is need for displaying hit animation
bat.flags |= BattleAttack::SPELL_LIKE;