Browse Source

Merge pull request #1496 from kambala-decapitator/resurrect-message

show resurrect message in the battle log
Andrey Filipenkov 2 years ago
parent
commit
07dc2e1c48
3 changed files with 20 additions and 4 deletions
  1. 1 1
      client/battle/BattleConstants.h
  2. 17 2
      lib/spells/effects/Heal.cpp
  3. 2 1
      lib/spells/effects/Heal.h

+ 1 - 1
client/battle/BattleConstants.h

@@ -79,7 +79,7 @@ enum class ECreatureAnimType
 
 	DEAD            = 22, // new group, used to show dead stacks. If empty - last frame from "DEATH" will be copied here
 	DEAD_RANGED     = 23, // new group, used to show dead stacks (if DEATH_RANGED was used). If empty - last frame from "DEATH_RANGED" will be copied here
-	RESURRECTION    = 24, // new group, used for animating resurrection, if empty - reversed "DEATH" animation will be copiend here
+	RESURRECTION    = 24, // new group, used for animating resurrection, if empty - reversed "DEATH" animation will be copied here
 	FROZEN          = 25, // new group, used when stack animation is paused (e.g. petrified). If empty - consist of first frame from HOLDING animation
 
 	CAST_UP            = 30,

+ 17 - 2
lib/spells/effects/Heal.cpp

@@ -49,10 +49,13 @@ void Heal::apply(ServerCallback * server, const Mechanics * m, const EffectTarge
 
 void Heal::apply(int64_t value, ServerCallback * server, const Mechanics * m, const EffectTarget & target) const
 {
+	BattleLogMessage logMessage;
 	BattleUnitsChanged pack;
-	prepareHealEffect(value, pack, *server->getRNG(), m, target);
+	prepareHealEffect(value, pack, logMessage, *server->getRNG(), m, target);
 	if(!pack.changedStacks.empty())
 		server->apply(&pack);
+	if(!logMessage.lines.empty())
+		server->apply(&logMessage);
 }
 
 bool Heal::isValidTarget(const Mechanics * m, const battle::Unit * unit) const
@@ -112,7 +115,7 @@ void Heal::serializeJsonUnitEffect(JsonSerializeFormat & handler)
 	handler.serializeInt("minFullUnits", minFullUnits);
 }
 
-void Heal::prepareHealEffect(int64_t value, BattleUnitsChanged & pack, RNG & rng, const Mechanics * m, const EffectTarget & target) const
+void Heal::prepareHealEffect(int64_t value, BattleUnitsChanged & pack, BattleLogMessage & logMessage, RNG & rng, const Mechanics * m, const EffectTarget & target) const
 {
 	for(auto & oneTarget : target)
 	{
@@ -123,8 +126,20 @@ void Heal::prepareHealEffect(int64_t value, BattleUnitsChanged & pack, RNG & rng
 			auto unitHPgained = m->applySpellBonus(value, unit);
 
 			auto state = unit->acquire();
+			const auto countBeforeHeal = state->getCount();
 			state->heal(unitHPgained, healLevel, healPower);
 
+			if(const auto resurrectedCount = std::max(0, state->getCount() - countBeforeHeal))
+			{
+				// %d %s rise from the dead!
+				// in the table first comes plural string, then the singular one
+				MetaString resurrectText;
+				state->addText(resurrectText, MetaString::GENERAL_TXT, 116, resurrectedCount == 1);
+				state->addNameReplacement(resurrectText);
+				resurrectText.addReplacement(resurrectedCount);
+				logMessage.lines.push_back(std::move(resurrectText));
+			}
+
 			if(unitHPgained > 0)
 			{
 				UnitChanges info(state->unitId(), UnitChanges::EOperation::RESET_STATE);

+ 2 - 1
lib/spells/effects/Heal.h

@@ -15,6 +15,7 @@
 
 VCMI_LIB_NAMESPACE_BEGIN
 
+struct BattleLogMessage;
 struct BattleUnitsChanged;
 
 namespace spells
@@ -42,7 +43,7 @@ private:
 
 	int32_t minFullUnits;
 
-	void prepareHealEffect(int64_t value, BattleUnitsChanged & pack, RNG & rng, const Mechanics * m, const EffectTarget & target) const;
+	void prepareHealEffect(int64_t value, BattleUnitsChanged & pack, BattleLogMessage & logMessage, RNG & rng, const Mechanics * m, const EffectTarget & target) const;
 };
 
 }