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

Some work towards Eagle Eye skill support.

This commit is contained in:
Michał W. Urbańczyk 2011-02-11 19:12:08 +00:00
parent ab20e024c0
commit 9f90ef58ca
3 changed files with 61 additions and 1 deletions

View File

@ -58,7 +58,8 @@ struct DLL_EXPORT BattleInfo : public CBonusSystemNode
CArmedInstance *belligerents[2]; //may be same as heroes CArmedInstance *belligerents[2]; //may be same as heroes
std::vector<CStack*> stacks; std::vector<CStack*> stacks;
std::vector<CObstacleInstance> obstacles; std::vector<CObstacleInstance> obstacles;
ui8 castSpells[2]; //[0] - attacker, [1] - defender ui8 castSpells[2]; //how many spells each side has cast this turn [0] - attacker, [1] - defender
std::vector<const CSpell *> usedSpellsHistory[2]; //each time hero casts spell, it's inserted here -> eagle eye skill
SiegeInfo si; SiegeInfo si;
si32 battlefieldType; si32 battlefieldType;
@ -67,6 +68,7 @@ struct DLL_EXPORT BattleInfo : public CBonusSystemNode
h & sides & round & activeStack & siege & town & tile & stacks & belligerents & obstacles h & sides & round & activeStack & siege & town & tile & stacks & belligerents & obstacles
& castSpells & si & battlefieldType; & castSpells & si & battlefieldType;
h & heroes; h & heroes;
h & usedSpellsHistory;
h & static_cast<CBonusSystemNode&>(*this); h & static_cast<CBonusSystemNode&>(*this);
} }

View File

@ -973,7 +973,13 @@ DLL_EXPORT void StartAction::applyGs( CGameState *gs )
CStack *st = gs->curB->getStack(ba.stackNumber); CStack *st = gs->curB->getStack(ba.stackNumber);
if(ba.actionType != BattleAction::HERO_SPELL) //don't check for stack if it's custom action by hero if(ba.actionType != BattleAction::HERO_SPELL) //don't check for stack if it's custom action by hero
{
assert(st); assert(st);
}
else
{
gs->curB->usedSpellsHistory[ba.side].push_back(VLC->spellh->spells[ba.additionalInfo]);
}
switch(ba.actionType) switch(ba.actionType)
{ {

View File

@ -21,6 +21,7 @@
#include "../client/CSoundBase.h" #include "../client/CSoundBase.h"
#include "CGameHandler.h" #include "CGameHandler.h"
#include <boost/format.hpp> #include <boost/format.hpp>
#include <sstream>
/* /*
* CGameHandler.cpp, part of VCMI engine * CGameHandler.cpp, part of VCMI engine
@ -353,6 +354,57 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance *hero1, const CGHer
CasualtiesAfterBattle cab1(bEndArmy1, gs->curB), cab2(bEndArmy2, gs->curB); //calculate casualties before deleting battle CasualtiesAfterBattle cab1(bEndArmy1, gs->curB), cab2(bEndArmy2, gs->curB); //calculate casualties before deleting battle
sendAndApply(battleResult.data); sendAndApply(battleResult.data);
//Eagle Eye secondary skill handling
const CGHeroInstance *vistoriousHero = gs->curB->heroes[battleResult.data->winner];
if(0 && vistoriousHero)
{
if(int eagleEyeLevel = vistoriousHero->getSecSkillLevel(CGHeroInstance::EAGLE_EYE))
{
int maxLevel = eagleEyeLevel + 1;
double eagleEyeChance = vistoriousHero->valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, CGHeroInstance::EAGLE_EYE);
ChangeSpells cs;
cs.learn = 1;
cs.hid = vistoriousHero->id;
BOOST_FOREACH(const CSpell *sp, gs->curB->usedSpellsHistory[!battleResult.data->winner])
if(rand() % 100 < eagleEyeChance)
cs.spells.insert(sp->id);
if(cs.spells.size())
{
InfoWindow iw;
iw.text.addTxt(MetaString::GENERAL_TXT, 221); //Through eagle-eyed observation, %s is able to learn %s
iw.text.addReplacement(vistoriousHero->name);
std::ostringstream names;
for(int i = 0; i < cs.spells.size(); i++)
{
names << "%s";
if(i < cs.spells.size() - 2)
names << ", ";
else if(i < cs.spells.size() - 1)
names << "%s";
}
iw.text.addReplacement(names.str());
std::set<ui32>::iterator it = cs.spells.begin();
for(int i = 0; i < cs.spells.size(); i++, it++)
{
iw.text.addReplacement(MetaString::SPELL_NAME, *it);
if(i == cs.spells.size() - 2) //we just added pre-last name
iw.text.addReplacement(MetaString::GENERAL_TXT, 141); // " and "
iw.components.push_back(Component(Component::SPELL, *it, 0, 0));
}
sendAndApply(&iw);
sendAndApply(&cs);
}
}
}
if(!duel) if(!duel)
{ {
cab1.takeFromArmy(this); cab2.takeFromArmy(this); //take casualties after battle is deleted cab1.takeFromArmy(this); cab2.takeFromArmy(this); //take casualties after battle is deleted