From ceea341bb02c76bede09726b876c3385c6e32870 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Thu, 4 Jan 2024 23:54:35 +0200 Subject: [PATCH] Fix crash on attempt to dereference invalid subtype in bonus --- lib/CBonusTypeHandler.cpp | 4 ++-- server/battles/BattleFlowProcessor.cpp | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/CBonusTypeHandler.cpp b/lib/CBonusTypeHandler.cpp index b5cce121f..66f22cd61 100644 --- a/lib/CBonusTypeHandler.cpp +++ b/lib/CBonusTypeHandler.cpp @@ -76,10 +76,10 @@ std::string CBonusTypeHandler::bonusToString(const std::shared_ptr & bonu if (text.find("${val}") != std::string::npos) boost::algorithm::replace_all(text, "${val}", std::to_string(bearer->valOfBonuses(Selector::typeSubtype(bonus->type, bonus->subtype)))); - if (text.find("${subtype.creature}") != std::string::npos) + if (text.find("${subtype.creature}") != std::string::npos && bonus->subtype.as() != CreatureID::NONE) boost::algorithm::replace_all(text, "${subtype.creature}", bonus->subtype.as().toCreature()->getNamePluralTranslated()); - if (text.find("${subtype.spell}") != std::string::npos) + if (text.find("${subtype.spell}") != std::string::npos && bonus->subtype.as() != SpellID::NONE) boost::algorithm::replace_all(text, "${subtype.spell}", bonus->subtype.as().toSpell()->getNameTranslated()); return text; diff --git a/server/battles/BattleFlowProcessor.cpp b/server/battles/BattleFlowProcessor.cpp index 0fba8f63a..542803e62 100644 --- a/server/battles/BattleFlowProcessor.cpp +++ b/server/battles/BattleFlowProcessor.cpp @@ -712,6 +712,11 @@ void BattleFlowProcessor::stackTurnTrigger(const CBattleInfoCallback & battle, c } } BonusList bl = *(st->getBonuses(Selector::type()(BonusType::ENCHANTER))); + bl.remove_if([](const Bonus * b) + { + return b->subtype.as() == SpellID::NONE; + }); + int side = *battle.playerToSide(st->unitOwner()); if(st->canCast() && battle.battleGetEnchanterCounter(side) == 0) {