|
|
@@ -1104,12 +1104,12 @@ void CGameState::placeCampaignHeroes()
|
|
|
}
|
|
|
|
|
|
// replace heroes placeholders
|
|
|
- auto campaignScenario = getCampaignScenarioForCrossoverHeroes();
|
|
|
+ auto sourceCrossoverHeroes = getCrossoverHeroesFromPreviousScenario();
|
|
|
|
|
|
- if(campaignScenario)
|
|
|
+ if(!sourceCrossoverHeroes.empty())
|
|
|
{
|
|
|
logGlobal->debugStream() << "\tPrepare crossover heroes";
|
|
|
- auto crossoverHeroes = prepareCrossoverHeroes(campaignScenario);
|
|
|
+ auto crossoverHeroes = prepareCrossoverHeroes(sourceCrossoverHeroes, scenarioOps->campState->getCurrentScenario().travelOptions);
|
|
|
|
|
|
logGlobal->debugStream() << "\tGenerate list of hero placeholders";
|
|
|
const auto campaignHeroReplacements = generateCampaignHeroesToReplace(crossoverHeroes);
|
|
|
@@ -1176,33 +1176,32 @@ void CGameState::placeStartingHero(PlayerColor playerColor, HeroTypeID heroTypeI
|
|
|
map->getEditManager()->insertObject(hero, townPos);
|
|
|
}
|
|
|
|
|
|
-const CCampaignScenario * CGameState::getCampaignScenarioForCrossoverHeroes() const
|
|
|
+std::vector<CGHeroInstance *> CGameState::getCrossoverHeroesFromPreviousScenario() const
|
|
|
{
|
|
|
- const CCampaignScenario * campaignScenario = nullptr;
|
|
|
+ std::vector<CGHeroInstance *> crossoverHeroes;
|
|
|
|
|
|
auto campaignState = scenarioOps->campState;
|
|
|
auto bonus = campaignState->getBonusForCurrentMap();
|
|
|
if (bonus->type == CScenarioTravel::STravelBonus::HEROES_FROM_PREVIOUS_SCENARIO)
|
|
|
{
|
|
|
- campaignScenario = &campaignState->camp->scenarios[bonus->info2];
|
|
|
+ crossoverHeroes = campaignState->camp->scenarios[bonus->info2].crossoverHeroes;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if(!campaignState->mapsConquered.empty())
|
|
|
{
|
|
|
- campaignScenario = &campaignState->camp->scenarios[campaignState->mapsConquered.back()];
|
|
|
+ crossoverHeroes = campaignState->camp->scenarios[campaignState->mapsConquered.back()].crossoverHeroes;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return campaignScenario;
|
|
|
+ return std::move(crossoverHeroes);
|
|
|
}
|
|
|
|
|
|
-std::vector<CGHeroInstance *> CGameState::prepareCrossoverHeroes(const CCampaignScenario * campaignScenario)
|
|
|
+std::vector<CGHeroInstance *> CGameState::prepareCrossoverHeroes(const std::vector<CGHeroInstance *> & sourceCrossoverHeroes, const CScenarioTravel & travelOptions)
|
|
|
{
|
|
|
- auto crossoverHeroes = campaignScenario->crossoverHeroes; //TODO hero instances need to be copied, warning not trivial
|
|
|
- const auto & travelOptions = campaignScenario->travelOptions;
|
|
|
+ auto crossoverHeroes = sourceCrossoverHeroes; //TODO deep copy hero instances
|
|
|
|
|
|
- if (!(travelOptions.whatHeroKeeps & 1))
|
|
|
+ if(!(travelOptions.whatHeroKeeps & 1))
|
|
|
{
|
|
|
//trimming experience
|
|
|
for(CGHeroInstance * cgh : crossoverHeroes)
|
|
|
@@ -1210,7 +1209,8 @@ std::vector<CGHeroInstance *> CGameState::prepareCrossoverHeroes(const CCampaign
|
|
|
cgh->initExp();
|
|
|
}
|
|
|
}
|
|
|
- if (!(travelOptions.whatHeroKeeps & 2))
|
|
|
+
|
|
|
+ if(!(travelOptions.whatHeroKeeps & 2))
|
|
|
{
|
|
|
//trimming prim skills
|
|
|
for(CGHeroInstance * cgh : crossoverHeroes)
|
|
|
@@ -1225,7 +1225,8 @@ std::vector<CGHeroInstance *> CGameState::prepareCrossoverHeroes(const CCampaign
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- if (!(travelOptions.whatHeroKeeps & 4))
|
|
|
+
|
|
|
+ if(!(travelOptions.whatHeroKeeps & 4))
|
|
|
{
|
|
|
//trimming sec skills
|
|
|
for(CGHeroInstance * cgh : crossoverHeroes)
|
|
|
@@ -1233,7 +1234,8 @@ std::vector<CGHeroInstance *> CGameState::prepareCrossoverHeroes(const CCampaign
|
|
|
cgh->secSkills = cgh->type->secSkillsInit;
|
|
|
}
|
|
|
}
|
|
|
- if (!(travelOptions.whatHeroKeeps & 8))
|
|
|
+
|
|
|
+ if(!(travelOptions.whatHeroKeeps & 8))
|
|
|
{
|
|
|
//trimming spells
|
|
|
for(CGHeroInstance * cgh : crossoverHeroes)
|
|
|
@@ -1242,7 +1244,8 @@ std::vector<CGHeroInstance *> CGameState::prepareCrossoverHeroes(const CCampaign
|
|
|
cgh->eraseArtSlot(ArtifactPosition(ArtifactPosition::SPELLBOOK)); // spellbook will also be removed
|
|
|
}
|
|
|
}
|
|
|
- if (!(travelOptions.whatHeroKeeps & 16))
|
|
|
+
|
|
|
+ if(!(travelOptions.whatHeroKeeps & 16))
|
|
|
{
|
|
|
//trimming artifacts
|
|
|
for(CGHeroInstance * hero : crossoverHeroes)
|