Skip to content

Commit

Permalink
Fixing #222 (hero/town order saving).
Browse files Browse the repository at this point in the history
git-svn-id: https://vcmi.svn.sourceforge.net/svnroot/vcmi/trunk@2442 4dfc6b2a-8b31-0410-aa91-d6c70e3ac834
  • Loading branch information
yupsi committed Oct 10, 2011
1 parent f175229 commit 0866ff7
Showing 1 changed file with 53 additions and 8 deletions.
61 changes: 53 additions & 8 deletions client/CPlayerInterface.cpp
Expand Up @@ -1101,8 +1101,9 @@ template <typename Handler> void CPlayerInterface::serializeTempl( Handler &h, c
h & sysOpts;
h & spellbookSettings;

//sleeping heroes
ui8 sleepingSize;
if(h.saving)
if (h.saving)
sleepingSize = sleepingHeroes.size();
h & sleepingSize;
for (int i = 0; i < sleepingSize; i++)
Expand All @@ -1117,6 +1118,26 @@ template <typename Handler> void CPlayerInterface::serializeTempl( Handler &h, c
sleepingHeroes += hero;
}
}

//hero list order
ui8 heroListSize;
if (h.saving)
heroListSize = wanderingHeroes.size();
else
wanderingHeroes.clear();
h & heroListSize;
for (int i = 0; i < heroListSize; i++)
{
si32 hid;
if (h.saving)
hid = wanderingHeroes[i]->id;
h & hid;
if (!h.saving)
{
const CGHeroInstance *hero = cb->getHero(hid);
wanderingHeroes += hero;
}
}
}

void CPlayerInterface::serialize( COSer<CSaveFile> &h, const int version )
Expand Down Expand Up @@ -1339,16 +1360,40 @@ void CPlayerInterface::objectPropertyChanged(const SetObjectProperty * sop)

void CPlayerInterface::recreateHeroTownList()
{
std::vector <const CGHeroInstance *> newWanderingHeroes;
std::vector<const CGHeroInstance*> allHeroes = cb->getHeroesInfo();

//applying current heroes order to new heroes info
int j;
for (int i = 0; i < wanderingHeroes.size(); i++)
if ((j = vstd::findPos(allHeroes, wanderingHeroes[i])) >= 0)
if (!allHeroes[j]->inTownGarrison)
{
newWanderingHeroes += allHeroes[j];
allHeroes -= allHeroes[j];
}
//all the rest of new heroes go the end of the list
wanderingHeroes.clear();
std::vector<const CGHeroInstance*> heroes = cb->getHeroesInfo();
for(size_t i = 0; i < heroes.size(); i++)
if(!heroes[i]->inTownGarrison)
wanderingHeroes.push_back(heroes[i]);
wanderingHeroes = newWanderingHeroes;
newWanderingHeroes.clear();
for (int i = 0; i < allHeroes.size(); i++)
if (!allHeroes[i]->inTownGarrison)
wanderingHeroes += allHeroes[i];

std::vector<const CGTownInstance*> newTowns;
std::vector<const CGTownInstance*> allTowns = cb->getTownsInfo();
for (int i = 0; i < towns.size(); i++)
if ((j = vstd::findPos(allTowns, towns[i])) >= 0)
{
newTowns += allTowns[j];
allTowns -= allTowns[j];
}

towns.clear();
std::vector<const CGTownInstance*> townInfo = cb->getTownsInfo();
for(size_t i = 0; i < townInfo.size(); i++)
towns.push_back(townInfo[i]);
towns = newTowns;
newTowns.clear();
for(int i = 0; i < allTowns.size(); i++)
towns.push_back(allTowns[i]);

adventureInt->updateNextHero(NULL);
}
Expand Down

0 comments on commit 0866ff7

Please sign in to comment.