1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-15 00:05:02 +02:00

- Fixed issues with number of players selection

- Added new template for testing multiple players
This commit is contained in:
DjWarmonger
2015-05-27 18:58:14 +02:00
parent 6890ae9f02
commit 34a59a2788
3 changed files with 280 additions and 16 deletions

View File

@ -67,11 +67,14 @@ void CMapGenOptions::setPlayerCount(si8 value)
{
assert((value >= 1 && value <= PlayerColor::PLAYER_LIMIT_I) || value == RANDOM_SIZE);
playerCount = value;
auto possibleCompPlayersCount = value;
if (compOnlyPlayerCount > possibleCompPlayersCount)
setCompOnlyPlayerCount(possibleCompPlayersCount);
humanPlayersCount = playerCount - compOnlyPlayerCount;
if (getPlayerCount() != RANDOM_SIZE && getCompOnlyPlayerCount() != RANDOM_SIZE)
humanPlayersCount = getPlayerCount() - getCompOnlyPlayerCount();
resetPlayersMap();
}
@ -82,7 +85,7 @@ si8 CMapGenOptions::getTeamCount() const
void CMapGenOptions::setTeamCount(si8 value)
{
assert(playerCount == RANDOM_SIZE || (value >= 0 && value < playerCount) || value == RANDOM_SIZE);
assert(getPlayerCount() == RANDOM_SIZE || (value >= 0 && value < getPlayerCount()) || value == RANDOM_SIZE);
teamCount = value;
}
@ -93,9 +96,12 @@ si8 CMapGenOptions::getCompOnlyPlayerCount() const
void CMapGenOptions::setCompOnlyPlayerCount(si8 value)
{
assert(value == RANDOM_SIZE || (value >= 0 && value <= playerCount));
assert(value == RANDOM_SIZE || (value >= 0 && value <= getPlayerCount()));
compOnlyPlayerCount = value;
humanPlayersCount = playerCount - compOnlyPlayerCount;
if (getPlayerCount() != RANDOM_SIZE && getCompOnlyPlayerCount() != RANDOM_SIZE)
humanPlayersCount = getPlayerCount() - getCompOnlyPlayerCount();
resetPlayersMap();
}
@ -136,7 +142,7 @@ void CMapGenOptions::resetPlayersMap()
int realPlayersCnt = humanPlayersCount;
int realCompOnlyPlayersCnt = (compOnlyPlayerCount == RANDOM_SIZE) ? (PlayerColor::PLAYER_LIMIT_I - realPlayersCnt) : compOnlyPlayerCount;
int totalPlayersLimit = realPlayersCnt + realCompOnlyPlayersCnt;
if(playerCount == RANDOM_SIZE || compOnlyPlayerCount == RANDOM_SIZE)
if (getPlayerCount() == RANDOM_SIZE || compOnlyPlayerCount == RANDOM_SIZE)
totalPlayersLimit = static_cast<int>(PlayerColor::PLAYER_LIMIT_I);
//FIXME: what happens with human players here?
@ -145,7 +151,7 @@ void CMapGenOptions::resetPlayersMap()
CPlayerSettings player;
player.setColor(PlayerColor(color));
auto playerType = EPlayerType::AI;
if((playerCount != RANDOM_SIZE && color >= realPlayersCnt)
if ((getPlayerCount() != RANDOM_SIZE && color >= realPlayersCnt)
|| (compOnlyPlayerCount != RANDOM_SIZE && color >= (PlayerColor::PLAYER_LIMIT_I-compOnlyPlayerCount)))
{
playerType = EPlayerType::COMP_ONLY;
@ -195,7 +201,7 @@ const std::map<std::string, CRmgTemplate *> & CMapGenOptions::getAvailableTempla
void CMapGenOptions::finalize(CRandomGenerator & rand)
{
logGlobal->infoStream() << boost::format ("RMG settings: players %d, teams %d, computer players %d, computer teams %d, water %d, monsters %d")
% playerCount % teamCount % compOnlyPlayerCount % compOnlyTeamCount % waterContent % monsterStrength;
% getPlayerCount() % getTeamCount() % getCompOnlyPlayerCount() % getCompOnlyTeamCount() % getWaterContent() % getMonsterStrength();
if(!mapTemplate)
{
@ -203,17 +209,17 @@ void CMapGenOptions::finalize(CRandomGenerator & rand)
}
assert(mapTemplate);
if(playerCount == RANDOM_SIZE)
if (getPlayerCount() == RANDOM_SIZE)
{
auto possiblePlayers = mapTemplate->getPlayers().getNumbers();
possiblePlayers.erase(possiblePlayers.begin(), possiblePlayers.lower_bound(countHumanPlayers()));
assert(!possiblePlayers.empty());
playerCount = *RandomGeneratorUtil::nextItem(possiblePlayers, rand);
setPlayerCount (*RandomGeneratorUtil::nextItem(possiblePlayers, rand));
updatePlayers();
}
if(teamCount == RANDOM_SIZE)
{
teamCount = rand.nextInt(playerCount - 1);
teamCount = rand.nextInt(getPlayerCount() - 1);
if (teamCount == 1)
teamCount = 0;
}
@ -252,7 +258,7 @@ void CMapGenOptions::updatePlayers()
{
auto it = itrev;
--it;
if(players.size() == playerCount) break;
if (players.size() == getPlayerCount()) break;
if(it->second.getPlayerType() == EPlayerType::AI)
{
players.erase(it);
@ -271,7 +277,7 @@ void CMapGenOptions::updateCompOnlyPlayers()
{
auto it = itrev;
--it;
if (players.size() <= playerCount) break;
if (players.size() <= getPlayerCount()) break;
if(it->second.getPlayerType() == EPlayerType::COMP_ONLY)
{
players.erase(it);
@ -283,7 +289,13 @@ void CMapGenOptions::updateCompOnlyPlayers()
}
// Add some comp only players if necessary
auto compOnlyPlayersToAdd = playerCount - players.size();
int compOnlyPlayersToAdd = getPlayerCount() - players.size();
if (compOnlyPlayersToAdd < 0)
{
logGlobal->errorStream() << boost::format("Incorrect number of players to add. Requested players %d, current players %d") % playerCount % players.size();
assert (compOnlyPlayersToAdd < 0);
}
for(int i = 0; i < compOnlyPlayersToAdd; ++i)
{
CPlayerSettings pSettings;
@ -310,7 +322,8 @@ PlayerColor CMapGenOptions::getNextPlayerColor() const
return i;
}
}
assert(0);
logGlobal->errorStream() << "Failed to get next player color";
assert(false);
return PlayerColor(0);
}
@ -340,9 +353,9 @@ const CRmgTemplate * CMapGenOptions::getPossibleTemplate(CRandomGenerator & rand
if(tplSize >= tpl->getMinSize() && tplSize <= tpl->getMaxSize())
{
bool isPlayerCountValid = false;
if(playerCount != RANDOM_SIZE)
if (getPlayerCount() != RANDOM_SIZE)
{
if (tpl->getPlayers().isInRange(playerCount))
if (tpl->getPlayers().isInRange(getPlayerCount()))
isPlayerCountValid = true;
}
else