From 4a1e6763994dc5ae664732b11882d0cbd3712f4b Mon Sep 17 00:00:00 2001 From: Andrii Danylchenko Date: Fri, 18 Jun 2021 20:57:07 +0300 Subject: [PATCH] 3095 - fix campaign transition --- lib/CGameState.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/lib/CGameState.cpp b/lib/CGameState.cpp index 848fa2068..bef2a0294 100644 --- a/lib/CGameState.cpp +++ b/lib/CGameState.cpp @@ -1079,7 +1079,7 @@ CGameState::CrossoverHeroesList CGameState::getCrossoverHeroesFromPreviousScenar auto campaignState = scenarioOps->campState; auto bonus = campaignState->getBonusForCurrentMap(); - if (bonus && bonus->type == CScenarioTravel::STravelBonus::HEROES_FROM_PREVIOUS_SCENARIO) + if(bonus && bonus->type == CScenarioTravel::STravelBonus::HEROES_FROM_PREVIOUS_SCENARIO) { std::vector heroes; for(auto & node : campaignState->camp->scenarios[bonus->info2].crossoverHeroes) @@ -1093,12 +1093,8 @@ CGameState::CrossoverHeroesList CGameState::getCrossoverHeroesFromPreviousScenar { if(!campaignState->mapsConquered.empty()) { - std::vector heroes; - for(auto & node : campaignState->camp->scenarios[campaignState->mapsConquered.back()].crossoverHeroes) - { - auto h = CCampaignState::crossoverDeserialize(node); - heroes.push_back(h); - } + std::vector heroes = {}; + crossoverHeroes.heroesFromAnyPreviousScenarios = crossoverHeroes.heroesFromPreviousScenario = heroes; crossoverHeroes.heroesFromPreviousScenario = heroes; @@ -1111,7 +1107,7 @@ CGameState::CrossoverHeroesList CGameState::getCrossoverHeroesFromPreviousScenar // remove heroes which didn't reached the end of the scenario, but were available at the start for(auto hero : lostCrossoverHeroes) { -// auto hero = CCampaignState::crossoverDeserialize(node); + // auto hero = CCampaignState::crossoverDeserialize(node); vstd::erase_if(crossoverHeroes.heroesFromAnyPreviousScenarios, [hero](CGHeroInstance * h) { return hero->subID == h->subID; @@ -1123,11 +1119,12 @@ CGameState::CrossoverHeroesList CGameState::getCrossoverHeroesFromPreviousScenar { auto hero = CCampaignState::crossoverDeserialize(node); // add new heroes and replace old heroes with newer ones - auto it = range::find_if(crossoverHeroes.heroesFromAnyPreviousScenarios, [hero](CGHeroInstance * h) + auto it = range::find_if(crossoverHeroes.heroesFromAnyPreviousScenarios, [hero](CGHeroInstance * h) { return hero->subID == h->subID; }); - if (it != crossoverHeroes.heroesFromAnyPreviousScenarios.end()) + + if(it != crossoverHeroes.heroesFromAnyPreviousScenarios.end()) { // replace old hero with newer one crossoverHeroes.heroesFromAnyPreviousScenarios[it - crossoverHeroes.heroesFromAnyPreviousScenarios.begin()] = hero; @@ -1137,6 +1134,11 @@ CGameState::CrossoverHeroesList CGameState::getCrossoverHeroesFromPreviousScenar // add new hero crossoverHeroes.heroesFromAnyPreviousScenarios.push_back(hero); } + + if(mapNr == campaignState->mapsConquered.back()) + { + crossoverHeroes.heroesFromPreviousScenario.push_back(hero); + } } } }