浏览代码

Move mechanics factory

AlexVinS 11 年之前
父节点
当前提交
c8f1e6d1a1
共有 3 个文件被更改,包括 29 次插入30 次删除
  1. 1 30
      lib/CSpellHandler.cpp
  2. 26 0
      lib/SpellMechanics.cpp
  3. 2 0
      lib/SpellMechanics.h

+ 1 - 30
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

+ 26 - 0
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
 

+ 2 - 0
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;	
 };