Bazaar developer reference

CvWorldBuilderMapLoader::SetupPlayers()

Defined in
CvWorldBuilderMapLoader.cpp, line 300
Class
CvWorldBuilderMapLoader
Hook name
CivHooks::CvWorldBuilderMapLoader_SetupPlayers

Hooks

static bool BeforeCvWorldBuilderMapLoader_SetupPlayers();static void AfterCvWorldBuilderMapLoader_SetupPlayers();static void ReplaceCvWorldBuilderMapLoader_SetupPlayers(void (*original)());CivRegisterBefore<CivHooks::CvWorldBuilderMapLoader_SetupPlayers>(host, &BeforeCvWorldBuilderMapLoader_SetupPlayers);CivRegisterAfter<CivHooks::CvWorldBuilderMapLoader_SetupPlayers>(host, &AfterCvWorldBuilderMapLoader_SetupPlayers);CivRegisterReplace<CivHooks::CvWorldBuilderMapLoader_SetupPlayers>(host, &ReplaceCvWorldBuilderMapLoader_SetupPlayers);

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}

Calls

Called by