From f124db9f6187f04041f6d3006064745c31bcf892 Mon Sep 17 00:00:00 2001 From: AlexVinS Date: Sat, 1 Oct 2016 14:47:21 +0300 Subject: [PATCH] Get rid of Bonus::sourceSpell() * now bonus API looks more or less clean --- lib/HeroBonus.cpp | 7 ------- lib/HeroBonus.h | 2 -- lib/NetPacksLib.cpp | 17 +++++++++++++---- lib/spells/BattleSpellMechanics.cpp | 6 ++++-- lib/spells/CDefaultSpellMechanics.cpp | 6 ++++-- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/lib/HeroBonus.cpp b/lib/HeroBonus.cpp index db49e72d6..2de66fd39 100644 --- a/lib/HeroBonus.cpp +++ b/lib/HeroBonus.cpp @@ -1044,13 +1044,6 @@ bool NBonus::hasOfType(const CBonusSystemNode *obj, Bonus::BonusType type, int s return false; } -const CSpell * Bonus::sourceSpell() const -{ - if(source == SPELL_EFFECT) - return SpellID(sid).toSpell(); - return nullptr; -} - std::string Bonus::Description() const { std::ostringstream str; diff --git a/lib/HeroBonus.h b/lib/HeroBonus.h index 8dc78e30e..4cbd7b9d7 100644 --- a/lib/HeroBonus.h +++ b/lib/HeroBonus.h @@ -13,7 +13,6 @@ */ class CCreature; -class CSpell; struct Bonus; class CBonusSystemNode; class ILimiter; @@ -374,7 +373,6 @@ struct DLL_LINKAGE Bonus : public std::enable_shared_from_this { val += Val; } - const CSpell * sourceSpell() const; std::string Description() const; diff --git a/lib/NetPacksLib.cpp b/lib/NetPacksLib.cpp index 8ed7b7f5e..3c95d2245 100644 --- a/lib/NetPacksLib.cpp +++ b/lib/NetPacksLib.cpp @@ -1617,10 +1617,12 @@ DLL_LINKAGE void StacksHealedOrResurrected::applyGs( CGameState *gs ) //removing all spells effects auto selector = [](const Bonus * b) { - const CSpell *s = b->sourceSpell(); //Special case: DISRUPTING_RAY is "immune" to dispell //Other even PERMANENT effects can be removed - return (s != nullptr) && (s->id != SpellID::DISRUPTING_RAY); + if(b->source == Bonus::SPELL_EFFECT) + return b->sid != SpellID::DISRUPTING_RAY; + else + return false; }; changedStack->popBonuses(selector); } @@ -1629,10 +1631,17 @@ DLL_LINKAGE void StacksHealedOrResurrected::applyGs( CGameState *gs ) //removing all effects from negative spells auto selector = [](const Bonus* b) { - const CSpell *s = b->sourceSpell(); //Special case: DISRUPTING_RAY is "immune" to dispell //Other even PERMANENT effects can be removed - return (s != nullptr) && s->isNegative() && (s->id != SpellID::DISRUPTING_RAY); + if(b->source == Bonus::SPELL_EFFECT) + { + const CSpell * sourceSpell = SpellID(b->sid).toSpell(); + if(!sourceSpell) + return false; + return sourceSpell->id != SpellID::DISRUPTING_RAY && sourceSpell->isNegative(); + } + else + return false; }; changedStack->popBonuses(selector); } diff --git a/lib/spells/BattleSpellMechanics.cpp b/lib/spells/BattleSpellMechanics.cpp index d95452907..d744e4157 100644 --- a/lib/spells/BattleSpellMechanics.cpp +++ b/lib/spells/BattleSpellMechanics.cpp @@ -53,9 +53,11 @@ void AntimagicMechanics::applyBattle(BattleInfo * battle, const BattleSpellCast doDispell(battle, packet, [this](const Bonus *b) -> bool { - const CSpell * sourceSpell = b->sourceSpell(); - if(sourceSpell != nullptr) + if(b->source == Bonus::SPELL_EFFECT) { + const CSpell * sourceSpell = SpellID(b->sid).toSpell(); + if(!sourceSpell) + return false;//error //keep positive effects if(sourceSpell->isPositive()) return false; diff --git a/lib/spells/CDefaultSpellMechanics.cpp b/lib/spells/CDefaultSpellMechanics.cpp index 2b6bbb965..6088a242f 100644 --- a/lib/spells/CDefaultSpellMechanics.cpp +++ b/lib/spells/CDefaultSpellMechanics.cpp @@ -720,9 +720,11 @@ ESpellCastProblem::ESpellCastProblem DefaultSpellMechanics::isImmuneByStack(cons bool DefaultSpellMechanics::dispellSelector(const Bonus * bonus) { - const CSpell * sourceSpell = bonus->sourceSpell(); - if(sourceSpell != nullptr) + if(bonus->source == Bonus::SPELL_EFFECT) { + const CSpell * sourceSpell = SpellID(bonus->sid).toSpell(); + if(!sourceSpell) + return false;//error //Special case: DISRUPTING_RAY is "immune" to dispell //Other even PERMANENT effects can be removed (f.e. BIND) if(sourceSpell->id == SpellID::DISRUPTING_RAY)