// Gold from Cities times 100 int CvTreasury::GetGoldFromCitiesTimes100(bool bExcludeTradeRoutes) const { int iGold = 0; CvCity* pLoopCity; int iLoop; for(pLoopCity = m_pPlayer->firstCity(&iLoop); pLoopCity != NULL; pLoopCity = m_pPlayer->nextCity(&iLoop)) { iGold += pLoopCity->getYieldRateTimes100(YIELD_GOLD, bExcludeTradeRoutes); } return iGold; }
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(); } } }