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}