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:
@ -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
|
||||
|
Reference in New Issue
Block a user