/// How many policies in this branch help happiness? int CvPolicyAI::GetNumHappinessPolicies(CvPlayer* pPlayer, PolicyBranchTypes eBranch) { int iRtnValue = 0; int iBuildingClassLoop; BuildingClassTypes eBuildingClass; for(int iPolicyLoop = 0; iPolicyLoop < GC.getNumPolicyInfos(); iPolicyLoop++) { PolicyTypes ePolicy = (PolicyTypes)iPolicyLoop; CvPolicyEntry* pkPolicyInfo = GC.getPolicyInfo(ePolicy); if(pkPolicyInfo) { if (pkPolicyInfo->GetPolicyBranchType() == eBranch) { for(iBuildingClassLoop = 0; iBuildingClassLoop < GC.getNumBuildingClassInfos(); iBuildingClassLoop++) { eBuildingClass = (BuildingClassTypes) iBuildingClassLoop; CvBuildingClassInfo* pkBuildingClassInfo = GC.getBuildingClassInfo(eBuildingClass); if (!pkBuildingClassInfo) { continue; } BuildingTypes eBuilding = (BuildingTypes)pPlayer->getCivilizationInfo().getCivilizationBuildings(eBuildingClass); if (eBuilding != NO_BUILDING) { // Don't count a building that can only be built in conquered cities CvBuildingEntry *pkEntry = GC.getBuildingInfo(eBuilding); if (!pkEntry || pkEntry->IsNoOccupiedUnhappiness()) { continue; } if (pkPolicyInfo->GetBuildingClassHappiness(eBuildingClass) != 0) { iRtnValue++; break; } } } } } } return iRtnValue; }
void CvPlayerAI::AI_considerAnnex() { AI_PERF("AI-perf.csv", "AI_ considerAnnex"); // if the empire is unhappy, don't consider annexing if (IsEmpireUnhappy()) { return; } // if we're going for a culture victory, don't consider annexing if (GetDiplomacyAI()->IsGoingForCultureVictory()) { return; } // for Venice if (GetPlayerTraits()->IsNoAnnexing()) { return; } // if their capital city is puppeted, annex it CvCity* pCity = getCapitalCity(); if (pCity && pCity->IsPuppet()) { // we should only annex one city a turn, and sense this is one, we're done! pCity->DoAnnex(); return; } std::vector<CityAndProduction> aCityAndProductions; int iLoop = 0; pCity = NULL; // Find first coastal city in same area as settler for(pCity = firstCity(&iLoop); pCity != NULL; pCity = nextCity(&iLoop)) { CityAndProduction kEval; kEval.pCity = pCity; kEval.iProduction = pCity->getYieldRateTimes100(YIELD_PRODUCTION, false); aCityAndProductions.push_back(kEval); } std::stable_sort(aCityAndProductions.begin(), aCityAndProductions.end(), CityAndProductionEval()); CvCity* pTargetCity = NULL; float fCutoffValue = GC.getNORMAL_ANNEX(); BuildingClassTypes eCourthouseType = NO_BUILDINGCLASS; // find courthouse for(int eBuildingType = 0; eBuildingType < GC.getNumBuildingInfos(); eBuildingType++) { const BuildingTypes eBuilding = static_cast<BuildingTypes>(eBuildingType); CvBuildingEntry* buildingInfo = GC.getBuildingInfo(eBuilding); if(buildingInfo) { if (buildingInfo->IsNoOccupiedUnhappiness()) { eCourthouseType = (BuildingClassTypes)buildingInfo->GetBuildingClassType(); break; } } } bool bCourthouseImprovement = false; if (eCourthouseType != NO_BUILDINGCLASS) { if (GetPlayerPolicies()->GetBuildingClassProductionModifier(eCourthouseType) > 0) { bCourthouseImprovement = true; } } if (bCourthouseImprovement) { fCutoffValue = GC.getAGGRESIVE_ANNEX(); } uint uiCutOff = (uint)(aCityAndProductions.size() * fCutoffValue); for (uint ui = 0; ui < uiCutOff; ui++) { if (aCityAndProductions[ui].pCity->IsPuppet()) { pTargetCity = aCityAndProductions[ui].pCity; break; } } if (pTargetCity) { if (!pTargetCity->IsResistance()) { pTargetCity->DoAnnex(); } } }