Browse Source

CMapGenOptions: fix crash when computer only limit is used

Currently when there is computer only players set resetPlayersMap may try to change settings for more than 8 players which obviously cause crash.
Now if any of "players and computer limit" or "computer limit" is set to random we automatically set total limit to 8 players.
ArseniyShestakov 10 years ago
parent
commit
783dcfea2e
1 changed files with 15 additions and 2 deletions
  1. 15 2
      lib/rmg/CMapGenOptions.cpp

+ 15 - 2
lib/rmg/CMapGenOptions.cpp

@@ -67,6 +67,9 @@ void CMapGenOptions::setPlayerCount(si8 value)
 {
 	assert((value >= 1 && value <= PlayerColor::PLAYER_LIMIT_I) || value == RANDOM_SIZE);
 	playerCount = value;
+	auto possibleCompPlayersCount = PlayerColor::PLAYER_LIMIT_I-value;
+	if(compOnlyPlayerCount > possibleCompPlayersCount)
+		setCompOnlyPlayerCount(possibleCompPlayersCount);
 	resetPlayersMap();
 }
 
@@ -129,11 +132,21 @@ void CMapGenOptions::resetPlayersMap()
 	players.clear();
 	int realPlayersCnt = playerCount == RANDOM_SIZE ? static_cast<int>(PlayerColor::PLAYER_LIMIT_I) : playerCount;
 	int realCompOnlyPlayersCnt = compOnlyPlayerCount == RANDOM_SIZE ? (PlayerColor::PLAYER_LIMIT_I - realPlayersCnt) : compOnlyPlayerCount;
-	for(int color = 0; color < (realPlayersCnt + realCompOnlyPlayersCnt); ++color)
+	int totalPlayersLimit = realPlayersCnt + realCompOnlyPlayersCnt;
+	if(playerCount == RANDOM_SIZE || compOnlyPlayerCount == RANDOM_SIZE)
+		totalPlayersLimit = static_cast<int>(PlayerColor::PLAYER_LIMIT_I);
+
+	for(int color = 0; color < totalPlayersLimit; ++color)
 	{
 		CPlayerSettings player;
 		player.setColor(PlayerColor(color));
-		player.setPlayerType((color >= realPlayersCnt) ? EPlayerType::COMP_ONLY : EPlayerType::AI);
+		auto playerType = EPlayerType::AI;
+		if((playerCount != RANDOM_SIZE && color >= realPlayersCnt)
+		   || (compOnlyPlayerCount != RANDOM_SIZE && color >= (PlayerColor::PLAYER_LIMIT_I-compOnlyPlayerCount)))
+		{
+			playerType = EPlayerType::COMP_ONLY;
+		}
+		player.setPlayerType(playerType);
 		players[PlayerColor(color)] = player;
 	}
 }