Code
300void CvWorldBuilderMapLoader::SetupPlayers()301{302 const uint uiPlayerCount = std::min(sg_kSave.GetPlayerCount(), (byte)MAX_CIV_PLAYERS);303 for(uint i = 0; i < uiPlayerCount; ++i)304 {305 const PlayerTypes ePlayer = (PlayerTypes)i;306 const SlotStatus eStatus = CvPreGame::slotStatus(ePlayer);307 if(eStatus != SS_TAKEN && eStatus != SS_COMPUTER)308 CvPreGame::setSlotStatus(ePlayer, SS_COMPUTER);309310 const CvWorldBuilderMap::Player& kPlayer = sg_kSave.GetPlayer(i);311312 CivilizationTypes eCivType = NO_CIVILIZATION;313 for(int iCiv = 0; iCiv < GC.getNumCivilizationInfos(); ++iCiv)314 {315 CvCivilizationInfo* pkCivilization = GC.getCivilizationInfo((CivilizationTypes)iCiv);316 if(pkCivilization != NULL && strcmp(kPlayer.m_szCivType, pkCivilization->GetType()) == 0)317 {318 eCivType = (CivilizationTypes)iCiv;319 break;320 }321 }322323 CvPreGame::setCivilization(ePlayer, eCivType);324325 PlayerColorTypes eColorType = NO_PLAYERCOLOR;326 for(int iColor = 0; iColor < GC.GetNumPlayerColorInfos(); ++iColor)327 {328 CvPlayerColorInfo* pkColor = GC.GetPlayerColorInfo((PlayerColorTypes)iColor);329 if(pkColor != NULL && strcmp(kPlayer.m_szTeamColor, pkColor->GetType()) == 0)330 {331 eColorType = (PlayerColorTypes)iColor;332 break;333 }334 }335336 CvPreGame::setPlayerColor(ePlayer, eColorType);337338 if(!(eStatus == SS_TAKEN && CvPreGame::overrideScenarioHandicap()))339 {340 HandicapTypes eHandicap = NO_HANDICAP;341 for(int iHandicap = 0; iHandicap < GC.getNumHandicapInfos(); ++iHandicap)342 {343 CvHandicapInfo* pkHandicap = GC.getHandicapInfo((HandicapTypes)iHandicap);344 if(pkHandicap != NULL && strcmp(kPlayer.m_szHandicap, pkHandicap->GetType()) == 0)345 {346 eHandicap = (HandicapTypes)iHandicap;347 break;348 }349 }350351 CvPreGame::setHandicap(ePlayer, eHandicap);352 }353354 CvPreGame::setTeamType(ePlayer, (TeamTypes)kPlayer.m_byTeam);355 CvPreGame::setMinorCiv(ePlayer, false);356357 if(strlen(kPlayer.m_szLeaderName) > 0)358 CvPreGame::setLeaderName(ePlayer, kPlayer.m_szLeaderName);359360 if(strlen(kPlayer.m_szCivName) > 0)361 {362 CvPreGame::setCivilizationShortDescription(ePlayer, kPlayer.m_szCivName);363 CvPreGame::setCivilizationDescription(ePlayer, kPlayer.m_szCivName);364 }365 }366367 // If this is a map with defined player slots then close any slots out of this defined range368 // that are being filled by computer players. Hopefully there aren't any human players there.369 const uint uiPlayerSlotCount = sg_kMapInfo.uiMajorCivStartingPositions + sg_kMapInfo.uiPlayers;370 if(uiPlayerSlotCount > 0)371 {372 for(uint i = uiPlayerSlotCount; i < MAX_MAJOR_CIVS; ++i)373 {374 const PlayerTypes ePlayer = (PlayerTypes)i;375 const SlotStatus eStatus = CvPreGame::slotStatus(ePlayer);376 if(eStatus == SS_COMPUTER)377 CvPreGame::resetPlayer(ePlayer); // Do a full reset, which will also close the slot. A reset is better so that the player data does not get initialized later.378 }379 }380381 const uint uiCityStateCount = std::min(sg_kSave.GetCityStateCount(), (byte)MAX_MINOR_CIVS);382383 if(uiCityStateCount > 0)384 CvPreGame::setNumMinorCivs(uiCityStateCount);385 else if(sg_kMapInfo.uiMinorCivStartingPositions > 0)386 CvPreGame::setNumMinorCivs(sg_kMapInfo.uiMinorCivStartingPositions);387 else if(!CvPreGame::mapNoPlayers())388 CvPreGame::setNumMinorCivs(0);389390 for(uint i = 0; i < uiCityStateCount; ++i)391 {392 const PlayerTypes ePlayer = (PlayerTypes)(i + MAX_MAJOR_CIVS);393 const CvWorldBuilderMap::Player& kPlayer = sg_kSave.GetCityState(i);394395 MinorCivTypes eCivType = NO_MINORCIV;396 for(int iCiv = 0; iCiv < GC.getNumMinorCivInfos(); ++iCiv)397 {398 CvMinorCivInfo* pkCivilization = GC.getMinorCivInfo((MinorCivTypes)iCiv);399 if(pkCivilization != NULL && strcmp(kPlayer.m_szCivType, pkCivilization->GetType()) == 0)400 {401 eCivType = (MinorCivTypes)iCiv;402 break;403 }404 }405406 CvPreGame::setMinorCivType(ePlayer, eCivType);407408 PlayerColorTypes eColorType = NO_PLAYERCOLOR;409 for(int iColor = 0; iColor < GC.GetNumPlayerColorInfos(); ++iColor)410 {411 CvPlayerColorInfo* pkColor = GC.GetPlayerColorInfo((PlayerColorTypes)iColor);412 if(pkColor != NULL && strcmp(kPlayer.m_szTeamColor, pkColor->GetType()) == 0)413 {414 eColorType = (PlayerColorTypes)iColor;415 break;416 }417 }418419 CvPreGame::setPlayerColor(ePlayer, eColorType);420421 HandicapTypes eHandicap = NO_HANDICAP;422 for(int iHandicap = 0; iHandicap < GC.getNumHandicapInfos(); ++iHandicap)423 {424 CvHandicapInfo* pkHandicap = GC.getHandicapInfo((HandicapTypes)iHandicap);425 if(pkHandicap != NULL && strcmp(kPlayer.m_szHandicap, pkHandicap->GetType()) == 0)426 {427 eHandicap = (HandicapTypes)iHandicap;428 break;429 }430 }431432 CvPreGame::setHandicap(ePlayer, eHandicap);433434 CvPreGame::setSlotStatus(ePlayer, SS_COMPUTER);435 CvPreGame::setTeamType(ePlayer, (TeamTypes)kPlayer.m_byTeam);436 CvPreGame::setMinorCiv(ePlayer, true);437 }438}