Explorar o código

We need to know caster stack ID for proper projectile animation

AlexVinS %!s(int64=11) %!d(string=hai) anos
pai
achega
657385e32c
Modificáronse 4 ficheiros con 30 adicións e 19 borrados
  1. 19 7
      client/battle/CBattleInterface.cpp
  2. 3 3
      lib/NetPacks.h
  3. 0 7
      lib/NetPacksLib.cpp
  4. 8 2
      lib/SpellMechanics.cpp

+ 19 - 7
client/battle/CBattleInterface.cpp

@@ -1315,7 +1315,19 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 //			displayEffect (spell.mainEffectAnim, sc->tile);
 //	}
 
-
+	std::string casterCreatureName = "";
+	{
+		const auto casterStackID = sc->casterStack;
+		
+		if(casterStackID > 0)
+		{
+			const CStack * casterStack = curInt->cb->battleGetStackByID(casterStackID);
+			if(casterStack != nullptr)
+			{
+				casterCreatureName = casterStack->type->namePl;
+			}
+		}
+	}
 	//displaying message in console
 	bool customSpell = false;
 	if(sc->affectedCres.size() == 1)
@@ -1373,7 +1385,7 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 					}
 					//The %s shrivel with age, and lose %d hit points."
 					TBonusListPtr bl = curInt->cb->battleGetStackByID(*sc->affectedCres.begin(), false)->getBonuses(Selector::type(Bonus::STACK_HEALTH));
-					bl->remove_if(Selector::source(Bonus::SPELL_EFFECT, 75));
+					bl->remove_if(Selector::source(Bonus::SPELL_EFFECT, SpellID::AGE));
 					boost::algorithm::replace_first(text, "%d", boost::lexical_cast<std::string>(bl->totalValue()/2));
 				}
 					break;
@@ -1407,15 +1419,15 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 							text = CGI->generaltexth->allTexts[118]; //One %s dies under the terrible gaze of the %s.
 							boost::algorithm::replace_first(text, "%s", curInt->cb->battleGetStackByID(*sc->affectedCres.begin())->type->nameSing);
 						}
-						boost::algorithm::replace_first(text, "%s", CGI->creh->creatures[sc->attackerType]->namePl); //casting stack
+						boost::algorithm::replace_first(text, "%s", casterCreatureName); //casting stack
 					}
 					else
 						text = "";
 					break;
 				default:
 					text = CGI->generaltexth->allTexts[565]; //The %s casts %s
-					if(auto castingCreature = vstd::atOrDefault(CGI->creh->creatures, sc->attackerType, nullptr))
-						boost::algorithm::replace_first(text, "%s", castingCreature->namePl); //casting stack
+					if(casterCreatureName != "")
+						boost::algorithm::replace_first(text, "%s", casterCreatureName); //casting stack
 					else
 						boost::algorithm::replace_first(text, "%s", "@Unknown caster@"); //should not happen
 			}
@@ -1445,9 +1457,9 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 		{
 			boost::algorithm::replace_first(text, "%s", curInt->cb->battleGetHeroInfo(sc->side).name);
 		}
-		if(auto castingCreature = vstd::atOrDefault(CGI->creh->creatures, sc->attackerType, nullptr))
+		if(casterCreatureName != "")
 		{
-			boost::algorithm::replace_first(text, "%s", castingCreature->namePl); //creature caster
+			boost::algorithm::replace_first(text, "%s", casterCreatureName); //creature caster
 		}
 		else
 		{

+ 3 - 3
lib/NetPacks.h

@@ -1440,7 +1440,7 @@ struct EndAction : public CPackForClient//3008
 
 struct BattleSpellCast : public CPackForClient//3009
 {
-	BattleSpellCast(){type = 3009;};
+	BattleSpellCast(){type = 3009; casterStack = -1;};
 	DLL_LINKAGE void applyGs(CGameState *gs);
 	void applyCl(CClient *cl);
 
@@ -1452,11 +1452,11 @@ struct BattleSpellCast : public CPackForClient//3009
 	BattleHex tile; //destination tile (may not be set in some global/mass spells
 	std::vector<ui32> resisted; //ids of creatures that resisted this spell
 	std::set<ui32> affectedCres; //ids of creatures affected by this spell, generally used if spell does not set any effect (like dispel or cure)
-	CreatureID attackerType;//id of caster to generate console message; -1 if not set (eg. spell casted by artifact)
+	si32 casterStack;// -1 if not cated by creature, >=0 caster stack ID
 	bool castedByHero; //if true - spell has been casted by hero, otherwise by a creature
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
-		h & dmgToDisplay & side & id & skill & manaGained & tile & resisted & affectedCres & attackerType & castedByHero;
+		h & dmgToDisplay & side & id & skill & manaGained & tile & resisted & affectedCres & casterStack & castedByHero;
 	}
 };
 

+ 0 - 7
lib/NetPacksLib.cpp

@@ -1335,13 +1335,6 @@ DLL_LINKAGE void StartAction::applyGs( CGameState *gs )
 DLL_LINKAGE void BattleSpellCast::applyGs( CGameState *gs )
 {
 	assert(gs->curB);
-	if (castedByHero)
-	{
-		if (side < 2)
-		{
-			gs->curB->sides[side].castSpellsCount++;
-		}
-	}
 
 	const CSpell * spell = SpellID(id).toSpell();
 	

+ 8 - 2
lib/SpellMechanics.cpp

@@ -336,7 +336,13 @@ ISpellMechanics * ISpellMechanics::createMechanics(CSpell * s)
 ///DefaultSpellMechanics
 void DefaultSpellMechanics::afterCast(BattleInfo * battle, const BattleSpellCast * packet) const
 {
-	//TODO: may be move all from BattleSpellCast::applyGs here 
+	if (packet->castedByHero)
+	{
+		if (packet->side < 2)
+		{
+			battle->sides[packet->side].castSpellsCount++;
+		}
+	}
 	
 	//handle countering spells
 	for(auto stackID : packet->affectedCres)
@@ -366,7 +372,7 @@ void DefaultSpellMechanics::battleCast(const SpellCastEnvironment * env, BattleS
 	sc.tile = parameters.destination;
 	sc.dmgToDisplay = 0;
 	sc.castedByHero = nullptr != parameters.caster;
-	sc.attackerType = (parameters.casterStack ? parameters.casterStack->type->idNumber : CreatureID(CreatureID::NONE));
+	sc.casterStack = (parameters.casterStack ? parameters.casterStack->ID : -1);
 	sc.manaGained = 0;
 	
 	int spellCost = 0;