Browse Source

More battle log refactoring

AlexVinS 10 years ago
parent
commit
5d0ecd9cdf
1 changed files with 54 additions and 52 deletions
  1. 54 52
      client/battle/CBattleInterface.cpp

+ 54 - 52
client/battle/CBattleInterface.cpp

@@ -360,7 +360,7 @@ CBattleInterface::CBattleInterface(const CCreatureSet * army1, const CCreatureSe
 		{
 			idToObstacle[ID] = CDefHandler::giveDef(elem->getInfo().defName);
 			for(auto & _n : idToObstacle[ID]->ourImages)
-			{		
+			{
 				CSDL_Ext::setDefaultColorKey(_n.bitmap);
 			}
 		}
@@ -1263,7 +1263,7 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 			if(casterStack != nullptr)
 			{
 				casterName = casterStack->type->namePl;
-				srccoord = CClickableHex::getXYUnitAnim(casterStack->position, casterStack, this); 
+				srccoord = CClickableHex::getXYUnitAnim(casterStack->position, casterStack, this);
 				srccoord.x += 250;
 				srccoord.y += 240;
 			}
@@ -1274,7 +1274,7 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 	{
 
 	}
-	
+
 	//playing projectile animation
 	if(sc->tile.isValid())
 	{
@@ -1304,13 +1304,13 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 			delete animDef;
 			addNewAnim(new CSpellEffectAnimation(this, animToDisplay, srccoord.x, srccoord.y, dx, dy, Vflip));
 		}
-	}	
+	}
 	waitForAnims();
-	
+
 	displaySpellHit(spellID, sc->tile);
-	
-	//queuing affect /resist animation	
-	for (auto & elem : sc->affectedCres) 
+
+	//queuing affect /resist animation
+	for (auto & elem : sc->affectedCres)
 	{
 		BattleHex position = curInt->cb->battleGetStackByID(elem, false)->position;
 
@@ -1333,7 +1333,7 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 	} //switch(sc->id)
 
 	//displaying message in console
-	std::vector<std::string> logLines;	
+	std::vector<std::string> logLines;
 	bool customSpell = false;
 	if(sc->affectedCres.size() == 1)
 	{
@@ -1350,42 +1350,50 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 		}
 		else
 		{
-			auto getPluralText = [attackedStack, attackedName](const int baseTextID) -> std::string
+			auto getPluralFormat = [attackedStack](const int baseTextID) -> boost::format
+			{
+				return boost::format(CGI->generaltexth->allTexts[(attackedStack->count > 1 ? baseTextID+1 : baseTextID)]);
+			};
+
+			auto logSimple = [&logLines, getPluralFormat, attackedName](const int baseTextID)
 			{
-				std::string res = CGI->generaltexth->allTexts[(attackedStack->count > 1 ? baseTextID+1 : baseTextID)];
-				boost::algorithm::replace_first(res, "%s", attackedName);
-				return res;
+				boost::format fmt = getPluralFormat(baseTextID);
+				fmt % attackedName;
+				logLines.push_back(fmt.str());
+			};
+
+			auto logPlural = [&logLines, attackedNamePl](const int baseTextID)
+			{
+				boost::format fmt(CGI->generaltexth->allTexts[baseTextID]);
+				fmt % attackedNamePl;
+				logLines.push_back(fmt.str());
 			};
 
 			customSpell = true; //in most following cases text is custom
 			switch(sc->id)
 			{
 			case SpellID::STONE_GAZE:
-				logLines.push_back(getPluralText(558));
+				logSimple(558);
 				break;
 			case SpellID::POISON:
-				logLines.push_back(getPluralText(561));
+				logSimple(561);
 				break;
 			case SpellID::BIND:
-				{
-					//Roots and vines bind the %s to the ground!
-					boost::format text(CGI->generaltexth->allTexts[560]);
-					text % attackedNamePl;
-					logLines.push_back(text.str());
-				}
+				logPlural(560);//Roots and vines bind the %s to the ground!
 				break;
 			case SpellID::DISEASE:
-				logLines.push_back(getPluralText(553));
+				logSimple(553);
 				break;
 			case SpellID::PARALYZE:
-				logLines.push_back(getPluralText(563));
+				logSimple(563);
 				break;
 			case SpellID::AGE:
 				{
-					boost::format text(getPluralText(551));
+					boost::format text = getPluralFormat(551);
+					text % attackedName;
 					//The %s shrivel with age, and lose %d hit points."
 					TBonusListPtr bl = attackedStack->getBonuses(Selector::type(Bonus::STACK_HEALTH));
-					const int fullHP = bl->totalValue(); 
+					const int fullHP = bl->totalValue();
 					bl->remove_if(Selector::source(Bonus::SPELL_EFFECT, SpellID::AGE));
 					text % (fullHP - bl->totalValue());
 					logLines.push_back(text.str());
@@ -1393,20 +1401,14 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 				break;
 			case SpellID::THUNDERBOLT:
 				{
-					std::string text = CGI->generaltexth->allTexts[367];
-					boost::algorithm::replace_first(text, "%s", attackedNamePl);
-					logLines.push_back(text);
-					text = CGI->generaltexth->allTexts[343].substr(1, CGI->generaltexth->allTexts[343].size() - 1); //Does %d points of damage.
+					logPlural(367);
+					std::string text = CGI->generaltexth->allTexts[343].substr(1, CGI->generaltexth->allTexts[343].size() - 1); //Does %d points of damage.
 					boost::algorithm::replace_first(text, "%d", boost::lexical_cast<std::string>(sc->dmgToDisplay)); //no more text afterwards
-					logLines.push_back(text);									
+					logLines.push_back(text);
 				}
 				break;
 			case SpellID::DISPEL_HELPFUL_SPELLS:
-					{
-						boost::format text(CGI->generaltexth->allTexts[555]);
-						text % attackedNamePl;
-						logLines.push_back(text.str());
-					}
+				logPlural(555);
 				break;
 			case SpellID::DEATH_STARE:
 				if (sc->dmgToDisplay)
@@ -1432,7 +1434,7 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 					boost::format text(CGI->generaltexth->allTexts[565]); //The %s casts %s
 					text % casterName % spellName;
 					customSpell = false;
-					logLines.push_back(text.str());						
+					logLines.push_back(text.str());
 				}
 				break;
 			}
@@ -1444,17 +1446,17 @@ void CBattleInterface::spellCast( const BattleSpellCast * sc )
 		text % casterName % spellName;
 		logLines.push_back(text.str());
 	}
-	
+
 	if(sc->dmgToDisplay && !customSpell)
 	{
 		boost::format dmgInfo(CGI->generaltexth->allTexts[376]);
 		dmgInfo % spellName % sc->dmgToDisplay;
 		logLines.push_back(dmgInfo.str());
 	}
-	
+
 	for(auto line : logLines)
 		console->addText(line);
-	
+
 	waitForAnims();
 	//mana absorption
 	if(sc->manaGained > 0)
@@ -1511,14 +1513,14 @@ void CBattleInterface::castThisSpell(SpellID spellID)
 	assert(castingHero); // code below assumes non-null hero
 	sp = spellID.toSpell();
 	spellSelMode = ANY_LOCATION;
-	
+
 	const CSpell::TargetInfo ti = sp->getTargetInfo(castingHero->getSpellSchoolLevel(sp));
-	
+
 	if(ti.massive || ti.type == CSpell::NO_TARGET)
-		spellSelMode = NO_LOCATION;	
+		spellSelMode = NO_LOCATION;
 	else if(ti.type == CSpell::LOCATION && ti.clearAffected)
 	{
-		spellSelMode = FREE_LOCATION;		
+		spellSelMode = FREE_LOCATION;
 	}
 	else if(ti.type == CSpell::CREATURE)
 	{
@@ -1526,11 +1528,11 @@ void CBattleInterface::castThisSpell(SpellID spellID)
 			spellSelMode = selectionTypeByPositiveness(*sp);
 		else
 			spellSelMode = ANY_CREATURE;
-	}	
+	}
 	else if(ti.type == CSpell::OBSTACLE)
 	{
 		spellSelMode = OBSTACLE;
-	} 
+	}
 
 	if (spellSelMode == NO_LOCATION) //user does not have to select location
 	{
@@ -1555,12 +1557,12 @@ void CBattleInterface::displayEffect(ui32 effect, int destTile, bool areaEffect)
 void CBattleInterface::displaySpellEffect(SpellID spellID, BattleHex destinationTile, bool areaEffect)
 {
 	const CSpell * spell = spellID.toSpell();
-	
+
 	if(spell == nullptr)
 		return;
 
 	for(const CSpell::TAnimation & animation : spell->animationInfo.affect)
-	{				
+	{
 		addNewAnim(new CSpellEffectAnimation(this, animation.resourceName, destinationTile, false, animation.verticalPosition == VerticalPosition::BOTTOM));
 	}
 }
@@ -1568,12 +1570,12 @@ void CBattleInterface::displaySpellEffect(SpellID spellID, BattleHex destination
 void CBattleInterface::displaySpellHit(SpellID spellID, BattleHex destinationTile, bool areaEffect)
 {
 	const CSpell * spell = spellID.toSpell();
-	
+
 	if(spell == nullptr)
-		return;	
-	
+		return;
+
 	for(const CSpell::TAnimation & animation : spell->animationInfo.hit)
-	{			
+	{
 		addNewAnim(new CSpellEffectAnimation(this, animation.resourceName, destinationTile, false, animation.verticalPosition == VerticalPosition::BOTTOM));
 	}
 }
@@ -1791,7 +1793,7 @@ void CBattleInterface::printConsoleAttacked( const CStack * defender, int dmg, i
 	{
 		if (attacker)
 			formattedText.append(" ");
-		
+
 		boost::format txt;
 		if(killed > 1)
 		{