Hooks
static bool BeforeCvReligionAIHelpers_GetBestCityFaithUnitPurchase(CvPlayer & kPlayer, UnitTypes eUnit, ReligionTypes eReligion, CvCity *& result);static void AfterCvReligionAIHelpers_GetBestCityFaithUnitPurchase(CvPlayer & kPlayer, UnitTypes eUnit, ReligionTypes eReligion, CvCity *& result);static CvCity * ReplaceCvReligionAIHelpers_GetBestCityFaithUnitPurchase(CvCity * (*original)(CvPlayer &, UnitTypes, ReligionTypes), CvPlayer & kPlayer, UnitTypes eUnit, ReligionTypes eReligion);CivRegisterBefore<CivHooks::CvReligionAIHelpers_GetBestCityFaithUnitPurchase>(host, &BeforeCvReligionAIHelpers_GetBestCityFaithUnitPurchase);CivRegisterAfter<CivHooks::CvReligionAIHelpers_GetBestCityFaithUnitPurchase>(host, &AfterCvReligionAIHelpers_GetBestCityFaithUnitPurchase);CivRegisterReplace<CivHooks::CvReligionAIHelpers_GetBestCityFaithUnitPurchase>(host, &ReplaceCvReligionAIHelpers_GetBestCityFaithUnitPurchase);
Code
7294CvCity *CvReligionAIHelpers::GetBestCityFaithUnitPurchase(CvPlayer &kPlayer, UnitTypes eUnit, ReligionTypes eReligion)7295{7296 bool bReligious = false;7297 CvCity *pHolyCity = NULL;7298 SpecialUnitTypes eSpecialUnitGreatPerson = (SpecialUnitTypes) GC.getInfoTypeForString("SPECIALUNIT_PEOPLE");7299 int iLoop;7300 CvCity* pLoopCity;73017302 CvGameReligions* pReligions = GC.getGame().GetGameReligions();7303 const CvReligion* pMyReligion = pReligions->GetReligion(eReligion, kPlayer.GetID());73047305 CvUnitEntry *pkUnitEntry = GC.getUnitInfo(eUnit);7306 if (pkUnitEntry)7307 {7308 // Religious unit?7309 if (pkUnitEntry->IsSpreadReligion() || pkUnitEntry->IsRemoveHeresy())7310 {7311 bReligious = true;7312 }7313 7314 // Great person?7315 else if (pkUnitEntry->GetSpecialUnitType() == eSpecialUnitGreatPerson)7316 {7317 for (pLoopCity = kPlayer.firstCity(&iLoop); pLoopCity != NULL; pLoopCity = kPlayer.nextCity(&iLoop))7318 {7319 if (pLoopCity->IsCanPurchase(true/*bTestPurchaseCost*/, true/*bTestTrainable*/, eUnit, NO_BUILDING, NO_PROJECT, YIELD_FAITH))7320 {7321 return pLoopCity;7322 }7323 }7324 return NULL;7325 }7326 }73277328 // If religious, try to buy in the city with the Great Mosque first if a Missionary7329 if (bReligious && pMyReligion)7330 {7331 for(pLoopCity = kPlayer.firstCity(&iLoop); pLoopCity != NULL; pLoopCity = kPlayer.nextCity(&iLoop))7332 {7333 if (pLoopCity->getOwner() != kPlayer.GetID())7334 {7335 continue;7336 }73377338 if (pLoopCity->GetCityBuildings()->GetMissionaryExtraSpreads() < 1 || pkUnitEntry->GetReligionSpreads() < 1)7339 {7340 continue;7341 }73427343 if (pLoopCity->GetCityReligions()->GetReligiousMajority() == eReligion)7344 {7345 if(pLoopCity->IsCanPurchase(true, true, eUnit, NO_BUILDING, NO_PROJECT, YIELD_FAITH))7346 {7347 return pLoopCity;7348 }7349 }7350 }7351 }73527353 // If religious, next try to buy in the holy city, assuming it hasn't been converted7354 if (bReligious && pMyReligion)7355 {7356 CvPlot* pHolyCityPlot = GC.getMap().plot(pMyReligion->m_iHolyCityX, pMyReligion->m_iHolyCityY);7357 if (pHolyCityPlot)7358 {7359 pHolyCity = pHolyCityPlot->getPlotCity();73607361 if (pHolyCity && (pHolyCity->getOwner() == kPlayer.GetID()))7362 {7363 if (pHolyCity->GetCityReligions()->GetReligiousMajority() == eReligion && pHolyCity->IsCanPurchase(true, true, eUnit, NO_BUILDING, NO_PROJECT, YIELD_FAITH))7364 {7365 return pHolyCity;7366 }7367 }7368 }7369 }73707371 // Now see if there is another city with our majority religion7372 for(pLoopCity = kPlayer.firstCity(&iLoop); pLoopCity != NULL; pLoopCity = kPlayer.nextCity(&iLoop))7373 {7374 if (bReligious && pMyReligion && pLoopCity == pHolyCity)7375 {7376 continue;7377 }73787379 if (pLoopCity->getOwner() != kPlayer.GetID())7380 {7381 continue;7382 }73837384 if (pLoopCity->GetCityReligions()->GetReligiousMajority() == eReligion)7385 {7386 if(pLoopCity->IsCanPurchase(true, true, eUnit, NO_BUILDING, NO_PROJECT, YIELD_FAITH))7387 {7388 return pLoopCity;7389 }7390 }7391 }73927393 return NULL;7394}