Browse Source

Fix handling of campaign bonus where player can select color to play

Ivan Savenko 7 months ago
parent
commit
71d742ab19
2 changed files with 12 additions and 2 deletions
  1. 11 1
      lib/gameState/CGameStateCampaign.cpp
  2. 1 1
      server/CVCMIServer.cpp

+ 11 - 1
lib/gameState/CGameStateCampaign.cpp

@@ -495,7 +495,17 @@ void CGameStateCampaign::generateCampaignHeroesToReplace()
 			if (nodeListIter == nodeList.end())
 				break;
 
-			auto hero = campaignState->crossoverDeserialize(*nodeListIter, gameState->map.get());
+			if (!gameState->players.count(placeholder->getOwner()))
+				continue; // illegal?
+
+			// It looks like heroes placeholder by power can only be replaced for human player
+			// Example where this is important: Spoils of War -> Greed
+			// Meanwhile, placeholders by hero ID can be replaced for AI as well
+			// Example: Armageddon's Blade -> To Kill A Hero
+			if (!gameState->players.at(placeholder->getOwner()).isHuman())
+				continue;
+
+			CGHeroInstance * hero = campaignState->crossoverDeserialize(*nodeListIter, gameState->map.get());
 			nodeListIter++;
 
 			logGlobal->info("Hero crossover: Loading placeholder as %d (%s)", hero->getHeroType(), hero->getNameTranslated());

+ 1 - 1
server/CVCMIServer.cpp

@@ -835,7 +835,7 @@ void CVCMIServer::setCampaignBonus(int bonusId)
 
 	const CampaignScenario & scenario = si->campState->scenario(campaignMap);
 	const std::vector<CampaignBonus> & bonDescs = scenario.travelOptions.bonusesToChoose;
-	if(bonDescs[bonusId].type == CampaignBonusType::HERO)
+	if(bonDescs[bonusId].type == CampaignBonusType::HERO || bonDescs[bonusId].type == CampaignBonusType::HEROES_FROM_PREVIOUS_SCENARIO)
 	{
 		for(auto & elem : si->playerInfos)
 		{