1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Spell cast logging refactored.

This commit is contained in:
AlexVinS 2016-09-17 23:04:23 +03:00
parent d993710f8e
commit 53fbf88316
7 changed files with 53 additions and 45 deletions

View File

@ -1249,6 +1249,14 @@ void CStack::getCasterName(MetaString & text) const
text.addReplacement(MetaString::CRE_PL_NAMES, type->idNumber.num);
}
void CStack::getCastDescription(const CSpell * spell, const std::vector<const CStack*> & attacked, MetaString & text) const
{
text.addTxt(MetaString::GENERAL_TXT, 565);//The %s casts %s
//todo: use text 566 for single creature
getCasterName(text);
text.addReplacement(MetaString::SPELL_NAME, spell->id.toEnum());
}
bool CMP_stack::operator()( const CStack* a, const CStack* b )
{
switch(phase)

View File

@ -251,6 +251,8 @@ public:
void getCasterName(MetaString & text) const override;
void getCastDescription(const CSpell * spell, const std::vector<const CStack *> & attacked, MetaString & text) const override;
///stack will be ghost in next battle state update
void makeGhost();

View File

@ -960,6 +960,18 @@ void CGHeroInstance::getCasterName(MetaString & text) const
text.addReplacement(name);
}
void CGHeroInstance::getCastDescription(const CSpell * spell, const std::vector<const CStack*> & attacked, MetaString & text) const
{
const bool singleTarget = attacked.size() == 1;
const int textIndex = singleTarget ? 195 : 196;
text.addTxt(MetaString::GENERAL_TXT, textIndex);
getCasterName(text);
text.addReplacement(MetaString::SPELL_NAME, spell->id.toEnum());
if(singleTarget)
text.addReplacement(MetaString::CRE_PL_NAMES, attacked.at(0)->getCreature()->idNumber.num);
}
bool CGHeroInstance::canCastThisSpell(const CSpell * spell) const
{
if(nullptr == getArt(ArtifactPosition::SPELLBOOK))

View File

@ -247,6 +247,7 @@ public:
const PlayerColor getOwner() const override;
void getCasterName(MetaString & text) const override;
void getCastDescription(const CSpell * spell, const std::vector<const CStack *> & attacked, MetaString & text) const override;
void deserializationFix();

View File

@ -155,40 +155,9 @@ void SpellCastContext::setDamageToDisplay(const si32 value)
void SpellCastContext::prepareBattleLog()
{
//todo: prepare battle log
bool displayDamage = true;
if(attackedCres.size() == 1)
{
const CStack * attackedStack = *attackedCres.begin();
switch(parameters.mode)
{
case ECastingMode::HERO_CASTING:
{
MetaString line;
line.addTxt(MetaString::GENERAL_TXT, 195);
parameters.caster->getCasterName(line);
line.addReplacement(MetaString::SPELL_NAME, mechanics->owner->id.toEnum());
line.addReplacement(MetaString::CRE_PL_NAMES, attackedStack->getCreature()->idNumber.num);
}
break;
default:
{
mechanics->battleLogSingleTarget(sc.battleLog, parameters, attackedStack, damageToDisplay, displayDamage);
}
break;
}
}
else
{
MetaString line;
line.addTxt(MetaString::GENERAL_TXT, 196);
parameters.caster->getCasterName(line);
line.addReplacement(MetaString::SPELL_NAME, mechanics->owner->id.toEnum());
sc.battleLog.push_back(line);
}
mechanics->battleLog(sc.battleLog, parameters, attackedCres, damageToDisplay, displayDamage);
displayDamage = displayDamage && damageToDisplay > 0;
@ -359,9 +328,18 @@ void DefaultSpellMechanics::cast(const SpellCastEnvironment * env, const BattleS
ctx.afterCast();
}
void DefaultSpellMechanics::battleLogSingleTarget(std::vector<MetaString>& logLines, const BattleSpellCastParameters & parameters,
const CStack * attackedStack, const si32 damageToDisplay, bool & displayDamage) const
void DefaultSpellMechanics::battleLog(std::vector<MetaString> & logLines, const BattleSpellCastParameters & parameters,
const std::vector<const CStack *> & attacked, const si32 damageToDisplay, bool & displayDamage) const
{
if(attacked.size() != 1)
{
displayDamage = true;
battleLogDefault(logLines, parameters, attacked);
return;
}
auto attackedStack = attacked.at(0);
auto getPluralFormat = [attackedStack](const int baseTextID) -> si32
{
return attackedStack->count > 1 ? baseTextID + 1 : baseTextID;
@ -451,19 +429,19 @@ void DefaultSpellMechanics::battleLogSingleTarget(std::vector<MetaString>& logL
}
break;
default:
{
MetaString line;
line.addTxt(MetaString::GENERAL_TXT, 565);//The %s casts %s
//todo: use text 566 for single creature
parameters.caster->getCasterName(line);
line.addReplacement(MetaString::SPELL_NAME, owner->id.toEnum());
displayDamage = true;
logLines.push_back(line);
}
displayDamage = true;
battleLogDefault(logLines, parameters, attacked);
break;
}
}
void DefaultSpellMechanics::battleLogDefault(std::vector<MetaString> & logLines, const BattleSpellCastParameters & parameters, const std::vector<const CStack*> & attacked) const
{
MetaString line;
parameters.caster->getCastDescription(owner, attacked, line);
logLines.push_back(line);
}
void DefaultSpellMechanics::applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const
{
//applying effects

View File

@ -59,8 +59,11 @@ public:
void battleCast(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters) const override final;
void battleLogSingleTarget(std::vector<MetaString> & logLines, const BattleSpellCastParameters & parameters,
const CStack * attackedStack, const si32 damageToDisplay, bool & displayDamage) const;
void battleLog(std::vector<MetaString> & logLines, const BattleSpellCastParameters & parameters,
const std::vector<const CStack *> & attacked, const si32 damageToDisplay, bool & displayDamage) const;
void battleLogDefault(std::vector<MetaString> & logLines, const BattleSpellCastParameters & parameters,
const std::vector<const CStack *> & attacked) const;
bool requiresCreatureTarget() const override;
protected:

View File

@ -47,5 +47,9 @@ public:
virtual const PlayerColor getOwner() const = 0;
///only name substitution
virtual void getCasterName(MetaString & text) const = 0;
///full default text
virtual void getCastDescription(const CSpell * spell, const std::vector<const CStack *> & attacked, MetaString & text) const = 0;
};