瀏覽代碼

* more campaign bonuses supported

mateuszb 15 年之前
父節點
當前提交
32597fb391
共有 1 個文件被更改,包括 46 次插入1 次删除
  1. 46 1
      lib/CGameState.cpp

+ 46 - 1
lib/CGameState.cpp

@@ -1217,7 +1217,7 @@ void CGameState::init( StartInfo * si, ui32 checksum, int Seed )
 					break;
 					break;
 				case 5: //prim skill
 				case 5: //prim skill
 					{
 					{
-						const ui8* ptr = reinterpret_cast<const ui8*>(curBonus.info2);
+						const ui8* ptr = reinterpret_cast<const ui8*>(&curBonus.info2);
 						for (int g=0; g<PRIMARY_SKILLS; ++g)
 						for (int g=0; g<PRIMARY_SKILLS; ++g)
 						{
 						{
 							int val = ptr[g];
 							int val = ptr[g];
@@ -1546,6 +1546,51 @@ void CGameState::init( StartInfo * si, ui32 checksum, int Seed )
 		hpool.pavailable[map->disposedHeroes[i].ID] = map->disposedHeroes[i].players;
 		hpool.pavailable[map->disposedHeroes[i].ID] = map->disposedHeroes[i].players;
 	}
 	}
 
 
+	if (si->mode == 2) //give campaign bonuses for specific / best hero
+	{
+
+		CScenarioTravel::STravelBonus chosenBonus = 
+			campaign->camp->scenarios[si->whichMapInCampaign].travelOptions.bonusesToChoose[si->choosenCampaignBonus];
+		if (chosenBonus.isBonusForHero() && chosenBonus.info1 != 0xFFFE) //exclude generated heroes
+		{
+			//find human player
+			int humanPlayer;
+			for (std::map<ui8, PlayerState>::iterator it=players.begin(); it != players.end(); ++it)
+			{
+				if(it->second.human)
+				{
+					humanPlayer = it->first;
+					break;
+				}
+			}
+			std::vector<CGHeroInstance *> & heroes = players[humanPlayer].heroes;
+
+			if (chosenBonus.info1 == 0xFFFD) //most powerful
+			{
+				int maxB = -1;
+				for (int b=0; b<heroes.size(); ++b)
+				{
+					if (maxB == -1 || heroes[b]->getTotalStrength() > heroes[maxB]->getTotalStrength())
+					{
+						maxB = b;
+					}
+				}
+				HLP::giveCampaignBonusToHero(heroes[maxB], 0xFFFD, si, campaign->camp->scenarios[si->whichMapInCampaign].travelOptions);
+			}
+			else //specific hero
+			{
+				for (int b=0; b<heroes.size(); ++b)
+				{
+					if (heroes[b]->subID == chosenBonus.info1)
+					{
+						HLP::giveCampaignBonusToHero(heroes[b], chosenBonus.info1, si, campaign->camp->scenarios[si->whichMapInCampaign].travelOptions);
+						break;
+					}
+				}
+			}
+		}
+	}
+
 	/*************************FOG**OF**WAR******************************************/		
 	/*************************FOG**OF**WAR******************************************/		
 	for(std::map<ui8, PlayerState>::iterator k=players.begin(); k!=players.end(); ++k)
 	for(std::map<ui8, PlayerState>::iterator k=players.begin(); k!=players.end(); ++k)
 	{
 	{