void CvPolicyAI::DoChooseIdeology(CvPlayer *pPlayer)
{
int iFreedomPriority = 0;
int iAutocracyPriority = 0;
int iOrderPriority = 0;
int iFreedomMultiplier = 1;
int iAutocracyMultiplier = 1;
int iOrderMultiplier = 1;
PolicyBranchTypes eFreedomBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_FREEDOM();
PolicyBranchTypes eAutocracyBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_AUTOCRACY();
PolicyBranchTypes eOrderBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_ORDER();
if (eFreedomBranch == NO_POLICY_BRANCH_TYPE || eAutocracyBranch == NO_POLICY_BRANCH_TYPE || eOrderBranch == NO_POLICY_BRANCH_TYPE)
{
return;
}
// First consideration is our victory type
int iConquestPriority = max(0, pPlayer->GetGrandStrategyAI()->GetConquestPriority());
int iDiploPriority = max(0, pPlayer->GetGrandStrategyAI()->GetUnitedNationsPriority());
int iTechPriority = max(0, pPlayer->GetGrandStrategyAI()->GetSpaceshipPriority());
int iCulturePriority = max(0, pPlayer->GetGrandStrategyAI()->GetCulturePriority());
// Rule out one ideology if we are clearly (at least 25% more priority) going for the victory this ideology doesn't support
int iClearPrefPercent = GC.getIDEOLOGY_PERCENT_CLEAR_VICTORY_PREF();
if (iConquestPriority > (iDiploPriority * (100 + iClearPrefPercent) / 100) &&
iConquestPriority > (iTechPriority * (100 + iClearPrefPercent) / 100) &&
iConquestPriority > (iCulturePriority * (100 + iClearPrefPercent) / 100))
{
iFreedomMultiplier = 0;
}
else if (iDiploPriority > (iConquestPriority * (100 + iClearPrefPercent) / 100) &&
iDiploPriority > (iTechPriority * (100 + iClearPrefPercent) / 100) &&
iDiploPriority > (iCulturePriority * (100 + iClearPrefPercent) / 100))
{
iOrderMultiplier = 0;
}
else if (iTechPriority > (iConquestPriority * (100 + iClearPrefPercent) / 100) &&
iTechPriority > (iDiploPriority * (100 + iClearPrefPercent) / 100) &&
iTechPriority > (iCulturePriority * (100 + iClearPrefPercent) / 100))
{
iAutocracyMultiplier = 0;
}
int iFreedomTotal = iDiploPriority + iTechPriority + iCulturePriority;
int iAutocracyTotal = iDiploPriority + iConquestPriority + iCulturePriority;
int iOrderTotal = iTechPriority + iConquestPriority + iCulturePriority;
int iGrandTotal = iFreedomTotal + iAutocracyTotal + iOrderTotal;
if (iGrandTotal > 0)
{
int iPriorityToDivide = GC.getIDEOLOGY_SCORE_GRAND_STRATS();
iFreedomPriority = (iFreedomTotal * iPriorityToDivide) / iGrandTotal;
iAutocracyPriority = (iAutocracyTotal * iPriorityToDivide) / iGrandTotal;
iOrderPriority = (iOrderTotal * iPriorityToDivide) / iGrandTotal;
}
CvString stage = "After Grand Strategies";
LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);
// Next look at free policies we can get
iFreedomPriority += PolicyHelpers::GetNumFreePolicies(eFreedomBranch) * GC.getIDEOLOGY_SCORE_PER_FREE_TENET();
iAutocracyPriority += PolicyHelpers::GetNumFreePolicies(eAutocracyBranch) * GC.getIDEOLOGY_SCORE_PER_FREE_TENET();
iOrderPriority += PolicyHelpers::GetNumFreePolicies(eOrderBranch) * GC.getIDEOLOGY_SCORE_PER_FREE_TENET();;
stage = "After Free Policies";
LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);
// Finally see what our friends (and enemies) have already chosen
PlayerTypes eLoopPlayer;
for (int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++)
{
eLoopPlayer = (PlayerTypes) iPlayerLoop;
if (eLoopPlayer != pPlayer->GetID() && pPlayer->GetDiplomacyAI()->IsPlayerValid(eLoopPlayer))
{
CvPlayer &kOtherPlayer = GET_PLAYER(eLoopPlayer);
PolicyBranchTypes eOtherPlayerIdeology;
eOtherPlayerIdeology = kOtherPlayer.GetPlayerPolicies()->GetLateGamePolicyTree();
switch(pPlayer->GetDiplomacyAI()->GetMajorCivApproach(eLoopPlayer, /*bHideTrueFeelings*/ true))
{
case MAJOR_CIV_APPROACH_HOSTILE:
if (eOtherPlayerIdeology == eFreedomBranch)
{
iAutocracyPriority += GC.getIDEOLOGY_SCORE_HOSTILE();
iOrderPriority += GC.getIDEOLOGY_SCORE_HOSTILE();
}
else if (eOtherPlayerIdeology == eAutocracyBranch)
{
iFreedomPriority += GC.getIDEOLOGY_SCORE_HOSTILE();
iOrderPriority += GC.getIDEOLOGY_SCORE_HOSTILE();
}
else if (eOtherPlayerIdeology == eOrderBranch)
{
iAutocracyPriority += GC.getIDEOLOGY_SCORE_HOSTILE();;
iFreedomPriority += GC.getIDEOLOGY_SCORE_HOSTILE();
}
break;
case MAJOR_CIV_APPROACH_GUARDED:
if (eOtherPlayerIdeology == eFreedomBranch)
{
iAutocracyPriority += GC.getIDEOLOGY_SCORE_GUARDED();
iOrderPriority += GC.getIDEOLOGY_SCORE_GUARDED();
}
else if (eOtherPlayerIdeology == eAutocracyBranch)
{
iFreedomPriority += GC.getIDEOLOGY_SCORE_GUARDED();
iOrderPriority += GC.getIDEOLOGY_SCORE_GUARDED();
}
else if (eOtherPlayerIdeology == eOrderBranch)
{
iAutocracyPriority += GC.getIDEOLOGY_SCORE_GUARDED();
iFreedomPriority += GC.getIDEOLOGY_SCORE_GUARDED();
}
break;
case MAJOR_CIV_APPROACH_AFRAID:
if (eOtherPlayerIdeology == eFreedomBranch)
{
iFreedomPriority += GC.getIDEOLOGY_SCORE_AFRAID();
}
else if (eOtherPlayerIdeology == eAutocracyBranch)
{
iAutocracyPriority += GC.getIDEOLOGY_SCORE_AFRAID();
}
else if (eOtherPlayerIdeology == eOrderBranch)
{
iOrderPriority += GC.getIDEOLOGY_SCORE_AFRAID();
}
break;
case MAJOR_CIV_APPROACH_FRIENDLY:
if (eOtherPlayerIdeology == eFreedomBranch)
{
iFreedomPriority += GC.getIDEOLOGY_SCORE_FRIENDLY();
}
else if (eOtherPlayerIdeology == eAutocracyBranch)
{
iAutocracyPriority += GC.getIDEOLOGY_SCORE_FRIENDLY();
}
else if (eOtherPlayerIdeology == eOrderBranch)
{
iOrderPriority += GC.getIDEOLOGY_SCORE_FRIENDLY();
}
break;
case MAJOR_CIV_APPROACH_NEUTRAL:
// No changes
break;
}
}
}
stage = "After Relations";
LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);
// Look at Happiness impacts
int iHappinessModifier = GC.getIDEOLOGY_SCORE_HAPPINESS();
// -- Happiness we could add through tenets
int iHappinessDelta;
int iHappinessPoliciesInBranch;
iHappinessDelta = GetBranchBuildingHappiness(pPlayer, eFreedomBranch);
iHappinessPoliciesInBranch = GetNumHappinessPolicies(pPlayer, eFreedomBranch);
if (iHappinessPoliciesInBranch > 0)
{
iFreedomPriority += iHappinessDelta * iHappinessModifier / iHappinessPoliciesInBranch;
}
iHappinessDelta = GetBranchBuildingHappiness(pPlayer, eAutocracyBranch);
iHappinessPoliciesInBranch = GetNumHappinessPolicies(pPlayer, eAutocracyBranch);
if (iHappinessPoliciesInBranch > 0)
{
iAutocracyPriority += iHappinessDelta * iHappinessModifier / iHappinessPoliciesInBranch;
}
iHappinessDelta = GetBranchBuildingHappiness(pPlayer, eOrderBranch);
iHappinessPoliciesInBranch = GetNumHappinessPolicies(pPlayer, eOrderBranch);
if (iHappinessPoliciesInBranch > 0)
{
iOrderPriority += iHappinessDelta * iHappinessModifier / iHappinessPoliciesInBranch;
}
stage = "After Tenet Happiness Boosts";
LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);
// -- Happiness we'd lose through Public Opinion
iHappinessDelta = max (0, 100 - pPlayer->GetCulture()->ComputeHypotheticalPublicOpinionUnhappiness(eFreedomBranch));
iFreedomPriority += iHappinessDelta * iHappinessModifier;
iHappinessDelta = max (0, 100 - pPlayer->GetCulture()->ComputeHypotheticalPublicOpinionUnhappiness(eAutocracyBranch));
iAutocracyPriority += iHappinessDelta * iHappinessModifier;
iHappinessDelta = max (0, 100 - pPlayer->GetCulture()->ComputeHypotheticalPublicOpinionUnhappiness(eOrderBranch));
iOrderPriority += iHappinessDelta * iHappinessModifier;
stage = "After Public Opinion Happiness";
LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);
// Small random add-on
iFreedomPriority += GC.getGame().getJonRandNum(10, "Freedom random priority bump");
iAutocracyPriority += GC.getGame().getJonRandNum(10, "Autocracy random priority bump");
iOrderPriority += GC.getGame().getJonRandNum(10, "Order random priority bump");
stage = "After Random (1 to 10)";
LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);
// Rule out any branches that are totally out of consideration
iFreedomPriority = iFreedomPriority * iFreedomMultiplier;
iAutocracyPriority = iAutocracyPriority * iAutocracyMultiplier;
iOrderPriority = iOrderPriority * iOrderMultiplier;
stage = "Final (after Clear Victory Preference)";
LogIdeologyChoice(stage, iFreedomPriority, iAutocracyPriority, iOrderPriority);
// Pick the ideology
PolicyBranchTypes eChosenBranch;
if (iFreedomPriority >= iAutocracyPriority && iFreedomPriority >= iOrderPriority)
{
eChosenBranch = eFreedomBranch;
}
else if (iAutocracyPriority >= iFreedomPriority && iAutocracyPriority >= iOrderPriority)
{
eChosenBranch = eAutocracyBranch;
}
else
{
eChosenBranch = eOrderBranch;
}
pPlayer->GetPlayerPolicies()->SetPolicyBranchUnlocked(eChosenBranch, true, false);
LogBranchChoice(eChosenBranch);
}