Where is random Civ Selection activated

P&nny

Warlord
Joined
Sep 1, 2007
Messages
195
Hello,

I've been looking extensively for the code that checks/decide which civ is played when your playing random civ/leader, but cannot find those.


I've multiple reason why I'm looking for this :
- I'm trying to get an "observer" feature up & running, through a new civ, but that civ shouldn't be picked in random civ selection.
- I'd like to bring a new twist to the excellent MODComp of tholish : EralimitedCiv: http://forums.civfanatics.com/showthread.php?t=325547
- I'd like to have an option "play with additionnal civ" which allows, or not, to play with new Civ I'm putting in my MOD.



So far, I've located to part of the code that tends to make me think the code is "hard-coded" in the exe (or whatever else it is) :
A - in CvPlayer :
Code:
bool CvPlayer::isPlayable() const
{
	return [B]GC.getInitCore()[/B].getPlayableCiv(getID());
}

void CvPlayer::setPlayable(bool bNewValue)
{
	[B]GC.getInitCore[/B]().setPlayableCiv(getID(), bNewValue);
}
B- in CvGame
Code:
void CvGame::addPlayer(PlayerTypes eNewPlayer, LeaderHeadTypes eLeader, CivilizationTypes eCiv)
{
	PlayerColorTypes eColor = (PlayerColorTypes)GC.getCivilizationInfo(eCiv).getDefaultPlayerColor();

	for (int iI = 0; iI < MAX_CIV_PLAYERS; iI++)
	{
		if (eColor == NO_PLAYERCOLOR || GET_PLAYER((PlayerTypes)iI).getPlayerColor() == eColor)
		{
			for (int iK = 0; iK < GC.getNumPlayerColorInfos(); iK++)
			{
				if (iK != GC.getCivilizationInfo((CivilizationTypes)GC.getDefineINT("BARBARIAN_CIVILIZATION")).getDefaultPlayerColor())
				{
					bool bValid = true;

					for (int iL = 0; iL < MAX_CIV_PLAYERS; iL++)
					{
						if (GET_PLAYER((PlayerTypes)iL).getPlayerColor() == iK)
						{
							bValid = false;
							break;
						}
					}

					if (bValid)
					{
						eColor = (PlayerColorTypes)iK;
						iI = MAX_CIV_PLAYERS;
						break;
					}
				}
			}
		}
	}

	TeamTypes eTeam = GET_PLAYER(eNewPlayer).getTeam();
	[B]GC.getInitCore().setLeader(eNewPlayer, eLeader);
	GC.getInitCore().setCiv(eNewPlayer, eCiv);[/B]
	GC.getInitCore().setSlotStatus(eNewPlayer, SS_COMPUTER);
	GC.getInitCore().setColor(eNewPlayer, eColor);
	GET_TEAM(eTeam).init(eTeam);
	GET_PLAYER(eNewPlayer).init(eNewPlayer);
}

While doing now ok, I'm still pretty new to SDK & Python.

What would be the best way to approach the modification, dynamically (=wheter or not an option is checked), of the list of civ/leaders that can be played ?


Thx a lot and merry Christmas ! :p
 
2 of you told me to look into CvGame::Init, but really I don't see any potential candidate in this function, care to be more precise ? (I'm still learning, so it might seem pretty straightforward to you but....)

Code:
[SIZE="1"]void CvGame::init(HandicapTypes eHandicap)
{
	bool bValid;
	int iStartTurn;
	int iEstimateEndTurn;
	int iI;

	//--------------------------------
	// Init saved data
	reset(eHandicap);

	//--------------------------------
	// Init containers
	m_deals.init();
	m_voteSelections.init();
	m_votesTriggered.init();

	m_mapRand.init(GC.getInitCore().getMapRandSeed() % 73637381);
	m_sorenRand.init(GC.getInitCore().getSyncRandSeed() % 52319761);

	//--------------------------------
	// Init non-saved data

	//--------------------------------
	// Init other game data

	// Turn off all MP options if it's a single player game
	if (GC.getInitCore().getType() == GAME_SP_NEW ||
		GC.getInitCore().getType() == GAME_SP_SCENARIO)
	{
		for (iI = 0; iI < NUM_MPOPTION_TYPES; ++iI)
		{
			setMPOption((MultiplayerOptionTypes)iI, false);
		}
	}

	// If this is a hot seat game, simultaneous turns is always off
	if (isHotSeat() || isPbem())
	{
		setMPOption(MPOPTION_SIMULTANEOUS_TURNS, false);
	}
	// If we didn't set a time in the Pitboss, turn timer off
	if (isPitboss() && getPitbossTurnTime() == 0)
	{
		setMPOption(MPOPTION_TURN_TIMER, false);
	}

	if (isMPOption(MPOPTION_SHUFFLE_TEAMS))
	{
		int aiTeams[MAX_CIV_PLAYERS];

		int iNumPlayers = 0;
		for (int i = 0; i < MAX_CIV_PLAYERS; i++)
		{
			if (GC.getInitCore().getSlotStatus((PlayerTypes)i) == SS_TAKEN)
			{
				aiTeams[iNumPlayers] = GC.getInitCore().getTeam((PlayerTypes)i);
				++iNumPlayers;
			}
		}

		for (int i = 0; i < iNumPlayers; i++)
		{
			int j = (getSorenRand().get(iNumPlayers - i, NULL) + i);

			if (i != j)
			{
				int iTemp = aiTeams[i];
				aiTeams[i] = aiTeams[j];
				aiTeams[j] = iTemp;
			}
		}

		iNumPlayers = 0;
		for (int i = 0; i < MAX_CIV_PLAYERS; i++)
		{
			if (GC.getInitCore().getSlotStatus((PlayerTypes)i) == SS_TAKEN)
			{
				GC.getInitCore().setTeam((PlayerTypes)i, (TeamTypes)aiTeams[iNumPlayers]);
				++iNumPlayers;
			}
		}
	}

	if (isOption(GAMEOPTION_LOCK_MODS))
	{
		if (isGameMultiPlayer())
		{
			setOption(GAMEOPTION_LOCK_MODS, false);
		}
		else
		{
			static const int iPasswordSize = 8;
			char szRandomPassword[iPasswordSize];
			for (int i = 0; i < iPasswordSize-1; i++)
			{
				szRandomPassword[i] = getSorenRandNum(128, NULL);
			}
			szRandomPassword[iPasswordSize-1] = 0;

			GC.getInitCore().setAdminPassword(szRandomPassword);
		}
	}

	if (getGameTurn() == 0)
	{
		iStartTurn = 0;

		for (iI = 0; iI < GC.getGameSpeedInfo(getGameSpeedType()).getNumTurnIncrements(); iI++)
		{
			iStartTurn += GC.getGameSpeedInfo(getGameSpeedType()).getGameTurnInfo(iI).iNumGameTurnsPerIncrement;
		}

		iStartTurn *= GC.getEraInfo(getStartEra()).getStartPercent();
		iStartTurn /= 100;

		setGameTurn(iStartTurn);
	}

	setStartTurn(getGameTurn());

	if (getMaxTurns() == 0)
	{
		iEstimateEndTurn = 0;

		for (iI = 0; iI < GC.getGameSpeedInfo(getGameSpeedType()).getNumTurnIncrements(); iI++)
		{
			iEstimateEndTurn += GC.getGameSpeedInfo(getGameSpeedType()).getGameTurnInfo(iI).iNumGameTurnsPerIncrement;
		}

		setEstimateEndTurn(iEstimateEndTurn);

		if (getEstimateEndTurn() > getGameTurn())
		{
			bValid = false;

			for (iI = 0; iI < GC.getNumVictoryInfos(); iI++)
			{
				if (isVictoryValid((VictoryTypes)iI))
				{
					if (GC.getVictoryInfo((VictoryTypes)iI).isEndScore())
					{
						bValid = true;
						break;
					}
				}
			}

			if (bValid)
			{
				setMaxTurns(getEstimateEndTurn() - getGameTurn());
			}
		}
	}
	else
	{
		setEstimateEndTurn(getGameTurn() + getMaxTurns());
	}

	setStartYear(GC.getDefineINT("START_YEAR"));

	for (iI = 0; iI < GC.getNumSpecialUnitInfos(); iI++)
	{
		if (GC.getSpecialUnitInfo((SpecialUnitTypes)iI).isValid())
		{
			makeSpecialUnitValid((SpecialUnitTypes)iI);
		}
	}

	for (iI = 0; iI < GC.getNumSpecialBuildingInfos(); iI++)
	{
		if (GC.getSpecialBuildingInfo((SpecialBuildingTypes)iI).isValid())
		{
			makeSpecialBuildingValid((SpecialBuildingTypes)iI);
		}
	}

	AI_init();

	doUpdateCacheOnTurn();
}[/SIZE]

The only 2 lines I'm unsure about how they act/what they do are those 2 :
Code:
[SIZE="1"][B]m_mapRand.init(GC.getInitCore().getMapRandSeed() % 73637381);
m_sorenRand.init(GC.getInitCore().getSyncRandSeed() % 52319761);[/B][/SIZE]

What I'm asking is probably not really difficult...
 
sorry, seams the code I was referring to wasn't in base BTS. Here is what Kael added to FFH (and something similar might work for you)
Code:
//FfH: Added by Kael 05/28/2008
    int iRndCiv = GC.getDefineINT("RANDOM_CIVILIZATION");
    if (iRndCiv != -1)
    {
        int iAlignment = 0;
        int iBestLeader = -1;
        int iBestCiv = -1;
        int iBestValue = -1;
        int iValue = 0;

        for (int iPlayer = 0; iPlayer < MAX_CIV_PLAYERS; iPlayer++)
        {
			if ((GC.getInitCore().getSlotStatus((PlayerTypes)iPlayer) == SS_COMPUTER) || (GC.getInitCore().getSlotStatus((PlayerTypes)iPlayer) == SS_TAKEN))
			{
			    iAlignment = 0;
				if (GC.getInitCore().getCiv((PlayerTypes)iPlayer) == NO_CIVILIZATION)
				{
                    GC.getInitCore().setCiv((PlayerTypes)iPlayer, (CivilizationTypes)iRndCiv);
                    iAlignment = -1;
				}
                if (GC.getInitCore().getCiv((PlayerTypes)iPlayer) == iRndCiv)
                {
                    if (iAlignment != -1)
                    {
                        iAlignment = GC.getLeaderHeadInfo((LeaderHeadTypes)GC.getInitCore().getLeader((PlayerTypes)iPlayer)).getAlignment();
                    }
                    for (int iCiv = 0; iCiv < GC.getNumCivilizationInfos(); iCiv++)
                    {
                        if (GC.getCivilizationInfo((CivilizationTypes)iCiv).isAIPlayable())
                        {
                            for (int iLeader = 0; iLeader < GC.getNumLeaderHeadInfos(); iLeader++)
                            {
                                if (GC.getCivilizationInfo((CivilizationTypes)iCiv).isLeaders(iLeader))
                                {
                                    if (iAlignment == -1 || GC.getLeaderHeadInfo((LeaderHeadTypes)iLeader).getAlignment() == iAlignment)
                                    {
                                        iValue = 40000 + GC.getGameINLINE().getSorenRandNum(1000, "Random Leader");
                                        for (int iI = 0; iI < MAX_CIV_PLAYERS; iI++)
                                        {
                                            if (GC.getInitCore().getLeader((PlayerTypes)iI) == iLeader)
                                            {
                                                iValue -= 2000;
                                            }
                                            if (GC.getInitCore().getCiv((PlayerTypes)iI) == iCiv)
                                            {
                                                iValue -= 1000;
                                            }
                                        }

                                        if (iValue > iBestValue)
                                        {
                                            iBestCiv = iCiv;
                                            iBestLeader = iLeader;
                                            iBestValue = iValue;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    GC.getInitCore().setCiv((PlayerTypes)iPlayer, (CivilizationTypes)iBestCiv);
                    GC.getInitCore().setLeader((PlayerTypes)iPlayer, (LeaderHeadTypes)iBestLeader);
                    iBestCiv = -1;
                    iBestLeader = -1;
                    iBestValue = -1;
                }
            }
		}
	}
//FfH: End Add
basically loop over all players, check their slot status, check if they have civtype no_civ and in that case decide on era or whatever you want to add.
 
Top Bottom