1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-25 21:38:59 +02:00

Fixing #222 (hero/town order saving).

This commit is contained in:
yupsi 2011-10-10 20:37:11 +00:00
parent e0baffd0d0
commit 7ed83864e7

View File

@ -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++)
@ -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 )
@ -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);
}