1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-27 21:49:10 +02:00

- copy of campaign heroes can be done later (at the point where it's clear if they will be replaced)

This commit is contained in:
beegee1 2014-05-29 17:07:21 +02:00
parent 1d17d60449
commit 40ab89e179

View File

@ -1268,21 +1268,6 @@ CGameState::CrossoverHeroesList CGameState::getCrossoverHeroesFromPreviousScenar
}
}
// Now we need to perform deep copies of all heroes
// The lambda below replaces pointer to a hero with a pointer to its deep copy.
auto replaceWithDeepCopy = [](CGHeroInstance *&hero)
{
// We cache map original hero => copy.
// We may be called multiple times with the same hero and should return a single copy.
static std::map<CGHeroInstance*, CGHeroInstance*> oldToCopy;
if(!oldToCopy[hero])
oldToCopy[hero] = CMemorySerializer::deepCopy(*hero).release();
hero = oldToCopy[hero];
};
range::for_each(crossoverHeroes.heroesFromAnyPreviousScenarios, replaceWithDeepCopy);
range::for_each(crossoverHeroes.heroesFromPreviousScenario, replaceWithDeepCopy);
return crossoverHeroes;
}
@ -2808,7 +2793,7 @@ std::vector<CGameState::CampaignHeroReplacement> CGameState::generateCampaignHer
{
auto hero = *it;
crossoverHeroes.removeHeroFromBothLists(hero);
campaignHeroReplacements.push_back(CampaignHeroReplacement(hero, heroPlaceholder->id));
campaignHeroReplacements.push_back(CampaignHeroReplacement(CMemorySerializer::deepCopy(*hero).release(), heroPlaceholder->id));
}
}
}
@ -2843,7 +2828,8 @@ std::vector<CGameState::CampaignHeroReplacement> CGameState::generateCampaignHer
auto heroPlaceholder = heroPlaceholders[i];
if(crossoverHeroes.heroesFromPreviousScenario.size() > i)
{
campaignHeroReplacements.push_back(CampaignHeroReplacement(crossoverHeroes.heroesFromPreviousScenario[i], heroPlaceholder->id));
auto hero = crossoverHeroes.heroesFromPreviousScenario[i];
campaignHeroReplacements.push_back(CampaignHeroReplacement(CMemorySerializer::deepCopy(*hero).release(), heroPlaceholder->id));
}
}