2
0
Эх сурвалжийг харах

Use configuration for spell projectile

AlexVinS 11 жил өмнө
parent
commit
256894d18a

+ 58 - 44
client/battle/CBattleInterface.cpp

@@ -1234,49 +1234,30 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 	
 	
 	if(!castSoundPath.empty())
 	if(!castSoundPath.empty())
 		CCS->soundh->playSound(castSoundPath);
 		CCS->soundh->playSound(castSoundPath);
-
-	switch(sc->id)
+		
+	//TODO: play custom cast animation
 	{
 	{
-	case SpellID::MAGIC_ARROW:
-		{
-			//initialization of anims
-			anims.push_back("C20SPX0.DEF"); anims.push_back("C20SPX1.DEF"); anims.push_back("C20SPX2.DEF"); anims.push_back("C20SPX3.DEF"); anims.push_back("C20SPX4.DEF");
-		}
-	case SpellID::ICE_BOLT:
+				
+	}
+	
+	//playing projectile animation
+	if(sc->tile.isValid())
+	{	
+		//todo: srccoord of creature caster	
+		Point srccoord = (sc->side ? Point(770, 60) : Point(30, 60)) + pos;
+		Point destcoord = CClickableHex::getXYUnitAnim(sc->tile, curInt->cb->battleGetStackByPos(sc->tile), this); //position attacked by projectile
+		destcoord.x += 250; destcoord.y += 240;
+
+		//animation angle
+		double angle = atan2(static_cast<double>(destcoord.x - srccoord.x), static_cast<double>(destcoord.y - srccoord.y));
+		bool Vflip = (angle < 0);
+		if(Vflip)
+			angle = -angle;
+		
+		std::string animToDisplay = spell.animationInfo.selectProjectile(angle);
+		
+		if(!animToDisplay.empty())
 		{
 		{
-			if(anims.size() == 0) //initialization of anims
-			{
-				anims.push_back("C08SPW0.DEF"); anims.push_back("C08SPW1.DEF"); anims.push_back("C08SPW2.DEF"); anims.push_back("C08SPW3.DEF"); anims.push_back("C08SPW4.DEF");
-			}
-		} //end of ice bolt only part
-		{ //common ice bolt and magic arrow part
-			//initial variables
-			std::string animToDisplay;
-			Point srccoord = (sc->side ? Point(770, 60) : Point(30, 60)) + pos;
-			Point destcoord = CClickableHex::getXYUnitAnim(sc->tile, curInt->cb->battleGetStackByPos(sc->tile), this); //position attacked by arrow
-			destcoord.x += 250; destcoord.y += 240;
-
-			//animation angle
-			double angle = atan2(static_cast<double>(destcoord.x - srccoord.x), static_cast<double>(destcoord.y - srccoord.y));
-			bool Vflip = false;
-			if (angle < 0)
-			{
-				Vflip = true;
-				angle = -angle;
-			}
-
-			//choosing animation by angle
-			if(angle > 1.50)
-				animToDisplay = anims[0];
-			else if(angle > 1.20)
-				animToDisplay = anims[1];
-			else if(angle > 0.90)
-				animToDisplay = anims[2];
-			else if(angle > 0.60)
-				animToDisplay = anims[3];
-			else
-				animToDisplay = anims[4];
-
 			//displaying animation
 			//displaying animation
 			CDefEssential * animDef = CDefHandler::giveDefEss(animToDisplay);
 			CDefEssential * animDef = CDefHandler::giveDefEss(animToDisplay);
 			double diffX = (destcoord.x - srccoord.x)*(destcoord.x - srccoord.x);
 			double diffX = (destcoord.x - srccoord.x)*(destcoord.x - srccoord.x);
@@ -1288,10 +1269,43 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 			int dy = (destcoord.y - srccoord.y - animDef->ourImages[0].bitmap->h)/steps;
 			int dy = (destcoord.y - srccoord.y - animDef->ourImages[0].bitmap->h)/steps;
 
 
 			delete animDef;
 			delete animDef;
-			addNewAnim(new CSpellEffectAnimation(this, animToDisplay, srccoord.x, srccoord.y, dx, dy, Vflip));
-
-			break; //for 15 and 16 cases
+			addNewAnim(new CSpellEffectAnimation(this, animToDisplay, srccoord.x, srccoord.y, dx, dy, Vflip));			
 		}
 		}
+	}	
+	waitForAnims();
+	
+	//queuing hit animation
+	if(sc->tile.isValid())
+	{
+		for(const CSpell::TAnimation & animation : spell.animationInfo.hit)
+		{
+			//Point destcoord = CClickableHex::getXYUnitAnim(sc->tile, curInt->cb->battleGetStackByPos(sc->tile), this); //position attacked by projectile
+			
+			//addNewAnim(new CSpellEffectAnimation(this, animation, destTile, 0, 0, false, areaEffect));
+		}
+	}
+	else
+	{
+		//whole battlefield
+	}
+	
+	//queuing affect animation	
+	for (auto & elem : sc->affectedCres) 
+	{
+		for(const CSpell::TAnimation & animation : spell.animationInfo.affect)
+		{
+			//Point destcoord = CClickableHex::getXYUnitAnim(sc->tile, curInt->cb->battleGetStackByPos(sc->tile), this); //position attacked by projectile
+			
+			//addNewAnim(new CSpellEffectAnimation(this, animation, destTile, 0, 0, false, areaEffect));
+		}
+		//displayEffect(spell.mainEffectAnim, curInt->cb->battleGetStackByID(elem, false)->position);
+	}
+
+	
+
+	switch(sc->id)
+	{
+
 	case SpellID::LIGHTNING_BOLT:
 	case SpellID::LIGHTNING_BOLT:
 	case SpellID::TITANS_LIGHTNING_BOLT:
 	case SpellID::TITANS_LIGHTNING_BOLT:
 	case SpellID::THUNDERBOLT:
 	case SpellID::THUNDERBOLT:

+ 1 - 1
lib/CSpellHandler.h

@@ -94,7 +94,7 @@ public:
 	typedef std::string TAnimation;
 	typedef std::string TAnimation;
 	typedef std::vector<TAnimation> TAnimationQueue; 
 	typedef std::vector<TAnimation> TAnimationQueue; 
 	
 	
-	struct AnimationInfo
+	struct DLL_LINKAGE AnimationInfo
 	{
 	{
 		AnimationInfo();
 		AnimationInfo();
 		~AnimationInfo();
 		~AnimationInfo();