diff --git a/client/CPlayerInterface.cpp b/client/CPlayerInterface.cpp index b3508c55..a354bf1d 100644 --- a/client/CPlayerInterface.cpp +++ b/client/CPlayerInterface.cpp @@ -1101,8 +1101,9 @@ template 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 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 &h, const int version ) @@ -1339,16 +1360,40 @@ void CPlayerInterface::objectPropertyChanged(const SetObjectProperty * sop) void CPlayerInterface::recreateHeroTownList() { + std::vector newWanderingHeroes; + std::vector 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 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 newTowns; + std::vector 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 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); }