Bazaar developer reference

CvPolicyAI::DoChooseIdeology(CvPlayer *)

Defined in
CvPolicyAI.cpp, line 335
Class
CvPolicyAI
Hook name
CivHooks::CvPolicyAI_DoChooseIdeology
Lua events
GameEvents.PlayerAdoptPolicyBranch

Hooks

static bool BeforeCvPolicyAI_DoChooseIdeology(CvPolicyAI* self, CvPlayer * pPlayer);static void AfterCvPolicyAI_DoChooseIdeology(CvPolicyAI* self, CvPlayer * pPlayer);static void ReplaceCvPolicyAI_DoChooseIdeology(void (*original)(CvPolicyAI*, CvPlayer *), CvPolicyAI* self, CvPlayer * pPlayer);CivRegisterBefore<CivHooks::CvPolicyAI_DoChooseIdeology>(host, &BeforeCvPolicyAI_DoChooseIdeology);CivRegisterAfter<CivHooks::CvPolicyAI_DoChooseIdeology>(host, &AfterCvPolicyAI_DoChooseIdeology);CivRegisterReplace<CivHooks::CvPolicyAI_DoChooseIdeology>(host, &ReplaceCvPolicyAI_DoChooseIdeology);

Code

335void CvPolicyAI::DoChooseIdeology(CvPlayer *pPlayer)336{337	int iFreedomPriority = 0;338	int iAutocracyPriority = 0;339	int iOrderPriority = 0;340	int iFreedomMultiplier = 1;341	int iAutocracyMultiplier = 1;342	int iOrderMultiplier = 1;343	PolicyBranchTypes eFreedomBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_FREEDOM();344	PolicyBranchTypes eAutocracyBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_AUTOCRACY();345	PolicyBranchTypes eOrderBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_ORDER();346	if (eFreedomBranch == NO_POLICY_BRANCH_TYPE || eAutocracyBranch == NO_POLICY_BRANCH_TYPE || eOrderBranch == NO_POLICY_BRANCH_TYPE)347	{348		return;349	}350351	// First consideration is our victory type352	int iConquestPriority = max(0, pPlayer->GetGrandStrategyAI()->GetConquestPriority());353	int iDiploPriority = max(0, pPlayer->GetGrandStrategyAI()->GetUnitedNationsPriority());354	int iTechPriority = max(0, pPlayer->GetGrandStrategyAI()->GetSpaceshipPriority());355	int iCulturePriority = max(0, pPlayer->GetGrandStrategyAI()->GetCulturePriority());356	357#if defined(MOD_EVENTS_IDEOLOGIES)358	if (MOD_EVENTS_IDEOLOGIES) {359		CvPlayerPolicies* pPolicies = pPlayer->GetPlayerPolicies();360361		// Just jump on the band-wagon and hard code for three ideologies!!!362		if (!pPolicies->CanAdoptIdeology(eFreedomBranch)) {363			iFreedomMultiplier = 0;364		}365		if (!pPolicies->CanAdoptIdeology(eAutocracyBranch)) {366			iAutocracyMultiplier = 0;367		}368		if (!pPolicies->CanAdoptIdeology(eOrderBranch)) {369			iOrderMultiplier = 0;370		}371	}372#endif373374#if defined(MOD_EVENTS_IDEOLOGIES)375	if (iFreedomMultiplier != 0 && iAutocracyMultiplier != 0 && iOrderMultiplier != 0) {376#endif377		// Rule out one ideology if we are clearly (at least 25% more priority) going for the victory this ideology doesn't support378		int iClearPrefPercent = GC.getIDEOLOGY_PERCENT_CLEAR_VICTORY_PREF();379		if (iConquestPriority > (iDiploPriority   * (100 + iClearPrefPercent) / 100) &&380			iConquestPriority > (iTechPriority    * (100 + iClearPrefPercent) / 100) &&381			iConquestPriority > (iCulturePriority * (100 + iClearPrefPercent) / 100))382		{383			iFreedomMultiplier = 0;384		}385		else if (iDiploPriority > (iConquestPriority * (100 + iClearPrefPercent) / 100) &&386				 iDiploPriority > (iTechPriority     * (100 + iClearPrefPercent) / 100) &&387				 iDiploPriority > (iCulturePriority  * (100 + iClearPrefPercent) / 100))388		{389			iOrderMultiplier = 0;390		}391		else if (iTechPriority > (iConquestPriority * (100 + iClearPrefPercent) / 100) &&392				 iTechPriority > (iDiploPriority    * (100 + iClearPrefPercent) / 100) &&393				 iTechPriority > (iCulturePriority  * (100 + iClearPrefPercent) / 100))394		{395			iAutocracyMultiplier = 0;396		}397#if defined(MOD_EVENTS_IDEOLOGIES)398	}399#endif400401	int iFreedomTotal = iDiploPriority + iTechPriority + iCulturePriority;402	int iAutocracyTotal = iDiploPriority + iConquestPriority + iCulturePriority;403	int iOrderTotal = iTechPriority + iConquestPriority + iCulturePriority;404	int iGrandTotal = iFreedomTotal + iAutocracyTotal + iOrderTotal;405406	if (iGrandTotal > 0)407	{408		int iPriorityToDivide = GC.getIDEOLOGY_SCORE_GRAND_STRATS();409		iFreedomPriority = (iFreedomTotal * iPriorityToDivide) / iGrandTotal;410		iAutocracyPriority = (iAutocracyTotal * iPriorityToDivide) / iGrandTotal;411		iOrderPriority = (iOrderTotal * iPriorityToDivide) / iGrandTotal;412	}413414	CvString stage = "After Grand Strategies";415	LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);416417	// Next look at free policies we can get418	iFreedomPriority += PolicyHelpers::GetNumFreePolicies(eFreedomBranch) * GC.getIDEOLOGY_SCORE_PER_FREE_TENET();419	iAutocracyPriority += PolicyHelpers::GetNumFreePolicies(eAutocracyBranch) * GC.getIDEOLOGY_SCORE_PER_FREE_TENET();420	iOrderPriority += PolicyHelpers::GetNumFreePolicies(eOrderBranch) * GC.getIDEOLOGY_SCORE_PER_FREE_TENET();;421422	stage = "After Free Policies";423	LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);424425	// Finally see what our friends (and enemies) have already chosen426	PlayerTypes eLoopPlayer;427	for (int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++)428	{429		eLoopPlayer = (PlayerTypes) iPlayerLoop;430		if (eLoopPlayer != pPlayer->GetID() && pPlayer->GetDiplomacyAI()->IsPlayerValid(eLoopPlayer))431		{432			CvPlayer &kOtherPlayer = GET_PLAYER(eLoopPlayer);433			PolicyBranchTypes eOtherPlayerIdeology;434			eOtherPlayerIdeology = kOtherPlayer.GetPlayerPolicies()->GetLateGamePolicyTree();435436			switch(pPlayer->GetDiplomacyAI()->GetMajorCivApproach(eLoopPlayer, /*bHideTrueFeelings*/ true))437			{438			case MAJOR_CIV_APPROACH_HOSTILE:439				if (eOtherPlayerIdeology == eFreedomBranch)440				{441					iAutocracyPriority += GC.getIDEOLOGY_SCORE_HOSTILE();442					iOrderPriority += GC.getIDEOLOGY_SCORE_HOSTILE();443				}444				else if (eOtherPlayerIdeology == eAutocracyBranch)445				{446					iFreedomPriority += GC.getIDEOLOGY_SCORE_HOSTILE();447					iOrderPriority += GC.getIDEOLOGY_SCORE_HOSTILE();448				}449				else if (eOtherPlayerIdeology == eOrderBranch)450				{451					iAutocracyPriority += GC.getIDEOLOGY_SCORE_HOSTILE();;452					iFreedomPriority += GC.getIDEOLOGY_SCORE_HOSTILE();453				}454				break;455			case MAJOR_CIV_APPROACH_GUARDED:456				if (eOtherPlayerIdeology == eFreedomBranch)457				{458					iAutocracyPriority += GC.getIDEOLOGY_SCORE_GUARDED();459					iOrderPriority += GC.getIDEOLOGY_SCORE_GUARDED();460				}461				else if (eOtherPlayerIdeology == eAutocracyBranch)462				{463					iFreedomPriority += GC.getIDEOLOGY_SCORE_GUARDED();464					iOrderPriority += GC.getIDEOLOGY_SCORE_GUARDED();465				}466				else if (eOtherPlayerIdeology == eOrderBranch)467				{468					iAutocracyPriority += GC.getIDEOLOGY_SCORE_GUARDED();469					iFreedomPriority += GC.getIDEOLOGY_SCORE_GUARDED();470				}471				break;472			case MAJOR_CIV_APPROACH_AFRAID:473				if (eOtherPlayerIdeology == eFreedomBranch)474				{475					iFreedomPriority += GC.getIDEOLOGY_SCORE_AFRAID();476				}477				else if (eOtherPlayerIdeology == eAutocracyBranch)478				{479					iAutocracyPriority += GC.getIDEOLOGY_SCORE_AFRAID();480				}481				else if (eOtherPlayerIdeology == eOrderBranch)482				{483					iOrderPriority += GC.getIDEOLOGY_SCORE_AFRAID();484				}485				break;486			case MAJOR_CIV_APPROACH_FRIENDLY:487				if (eOtherPlayerIdeology == eFreedomBranch)488				{489					iFreedomPriority += GC.getIDEOLOGY_SCORE_FRIENDLY();490				}491				else if (eOtherPlayerIdeology == eAutocracyBranch)492				{493					iAutocracyPriority += GC.getIDEOLOGY_SCORE_FRIENDLY();494				}495				else if (eOtherPlayerIdeology == eOrderBranch)496				{497					iOrderPriority += GC.getIDEOLOGY_SCORE_FRIENDLY();498				}499				break;500			case MAJOR_CIV_APPROACH_NEUTRAL:501				// No changes502				break;503			}504		}505	}506507	stage = "After Relations";508	LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);509510	// Look at Happiness impacts511	int iHappinessModifier = GC.getIDEOLOGY_SCORE_HAPPINESS();512513	// -- Happiness we could add through tenets514	int iHappinessDelta;515	int iHappinessPoliciesInBranch;516	iHappinessDelta = GetBranchBuildingHappiness(pPlayer, eFreedomBranch);517	iHappinessPoliciesInBranch = GetNumHappinessPolicies(pPlayer, eFreedomBranch);518	if (iHappinessPoliciesInBranch > 0)519	{520		iFreedomPriority += iHappinessDelta * iHappinessModifier / iHappinessPoliciesInBranch;		521	}522	iHappinessDelta = GetBranchBuildingHappiness(pPlayer, eAutocracyBranch);523	iHappinessPoliciesInBranch = GetNumHappinessPolicies(pPlayer, eAutocracyBranch);524	if (iHappinessPoliciesInBranch > 0)525	{526		iAutocracyPriority += iHappinessDelta * iHappinessModifier / iHappinessPoliciesInBranch;		527	}528	iHappinessDelta = GetBranchBuildingHappiness(pPlayer, eOrderBranch);529	iHappinessPoliciesInBranch = GetNumHappinessPolicies(pPlayer, eOrderBranch);530	if (iHappinessPoliciesInBranch > 0)531	{532		iOrderPriority += iHappinessDelta * iHappinessModifier / iHappinessPoliciesInBranch;		533	}534535	stage = "After Tenet Happiness Boosts";536	LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);537538	// -- Happiness we'd lose through Public Opinion539	iHappinessDelta = max (0, 100 - pPlayer->GetCulture()->ComputeHypotheticalPublicOpinionUnhappiness(eFreedomBranch));540	iFreedomPriority += iHappinessDelta * iHappinessModifier;541	iHappinessDelta = max (0, 100 - pPlayer->GetCulture()->ComputeHypotheticalPublicOpinionUnhappiness(eAutocracyBranch));542	iAutocracyPriority += iHappinessDelta * iHappinessModifier;543	iHappinessDelta = max (0, 100 - pPlayer->GetCulture()->ComputeHypotheticalPublicOpinionUnhappiness(eOrderBranch));544	iOrderPriority += iHappinessDelta * iHappinessModifier;545546	stage = "After Public Opinion Happiness";547	LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);548549	// Small random add-on550	iFreedomPriority += GC.getGame().getJonRandNum(10, "Freedom random priority bump");551	iAutocracyPriority += GC.getGame().getJonRandNum(10, "Autocracy random priority bump");552	iOrderPriority += GC.getGame().getJonRandNum(10, "Order random priority bump");553554	stage = "After Random (1 to 10)";555	LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);556557	// Rule out any branches that are totally out of consideration558	iFreedomPriority = iFreedomPriority * iFreedomMultiplier;559	iAutocracyPriority = iAutocracyPriority * iAutocracyMultiplier;560	iOrderPriority = iOrderPriority * iOrderMultiplier;561562	stage = "Final (after Clear Victory Preference)";563	LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);564565	// Pick the ideology566	PolicyBranchTypes eChosenBranch;567	if (iFreedomPriority >= iAutocracyPriority && iFreedomPriority >= iOrderPriority)568	{569		eChosenBranch = eFreedomBranch;570	}571	else if (iAutocracyPriority >= iFreedomPriority && iAutocracyPriority >= iOrderPriority)572	{573		eChosenBranch = eAutocracyBranch;574	}575	else576	{577		eChosenBranch = eOrderBranch;578	}579	pPlayer->GetPlayerPolicies()->SetPolicyBranchUnlocked(eChosenBranch, true, false);580	LogBranchChoice(eChosenBranch);581582#if defined(MOD_BUGFIX_MISSING_POLICY_EVENTS)583	if (MOD_BUGFIX_MISSING_POLICY_EVENTS)584	{585		ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();586		if(pkScriptSystem)587		{588			CvLuaArgsHandle args;589			args->Push(pPlayer->GetID());590			args->Push(eChosenBranch);591592			bool bResult = false;593			LuaSupport::CallHook(pkScriptSystem, "PlayerAdoptPolicyBranch", args.get(), bResult);594		}595	}596#endif597}

Calls

Called by