From c8f1e6d1a1783c24cb8724a882a934a7a9d09459 Mon Sep 17 00:00:00 2001 From: AlexVinS Date: Tue, 25 Nov 2014 14:58:42 +0300 Subject: [PATCH] Move mechanics factory --- lib/CSpellHandler.cpp | 31 +------------------------------ lib/SpellMechanics.cpp | 26 ++++++++++++++++++++++++++ lib/SpellMechanics.h | 2 ++ 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/lib/CSpellHandler.cpp b/lib/CSpellHandler.cpp index 6741a8fc4..74b3097bb 100644 --- a/lib/CSpellHandler.cpp +++ b/lib/CSpellHandler.cpp @@ -537,38 +537,9 @@ void CSpell::setupMechanics() { logGlobal->errorStream() << "Spell " << this->name << " mechanics already set"; delete mechanics; - mechanics = nullptr; - } - - switch (id) - { - case SpellID::CLONE: - mechanics = new CloneMechanics(this); - break; - case SpellID::DISPEL_HELPFUL_SPELLS: - mechanics = new DispellHelpfulMechanics(this); - break; - case SpellID::SACRIFICE: - mechanics = new SacrificeMechanics(this); - break; - case SpellID::CHAIN_LIGHTNING: - mechanics = new ChainLightningMechanics(this); - break; - case SpellID::FIRE_WALL: - case SpellID::FORCE_FIELD: - mechanics = new WallMechanics(this); - break; - case SpellID::LAND_MINE: - case SpellID::QUICKSAND: - mechanics = new ObstacleMechanics(this); - default: - if(isRisingSpell()) - mechanics = new SpecialRisingSpellMechanics(this); - else - mechanics = new DefaultSpellMechanics(this); - break; } + mechanics = ISpellMechanics::createMechanics(this); } ///CSpell::TargetInfo diff --git a/lib/SpellMechanics.cpp b/lib/SpellMechanics.cpp index cbb95e24f..d16d840f9 100644 --- a/lib/SpellMechanics.cpp +++ b/lib/SpellMechanics.cpp @@ -127,6 +127,32 @@ ISpellMechanics::ISpellMechanics(CSpell * s): } +ISpellMechanics * ISpellMechanics::createMechanics(CSpell* s) +{ + switch (s->id) + { + case SpellID::CLONE: + return new CloneMechanics(s); + case SpellID::DISPEL_HELPFUL_SPELLS: + return new DispellHelpfulMechanics(s); + case SpellID::SACRIFICE: + return new SacrificeMechanics(s); + case SpellID::CHAIN_LIGHTNING: + return new ChainLightningMechanics(s); + case SpellID::FIRE_WALL: + case SpellID::FORCE_FIELD: + return new WallMechanics(s); + case SpellID::LAND_MINE: + case SpellID::QUICKSAND: + return new ObstacleMechanics(s); + default: + if(s->isRisingSpell()) + return new SpecialRisingSpellMechanics(s); + else + return new DefaultSpellMechanics(s); + } +} + ///DefaultSpellMechanics diff --git a/lib/SpellMechanics.h b/lib/SpellMechanics.h index 66f2f92fb..601a96ab0 100644 --- a/lib/SpellMechanics.h +++ b/lib/SpellMechanics.h @@ -51,6 +51,8 @@ public: //virtual bool adventureCast(const SpellCastContext & context) const = 0; virtual bool battleCast(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters) const = 0; + static ISpellMechanics * createMechanics(CSpell * s); + protected: CSpell * owner; };