Hooks
static bool BeforeCvReligionAI_ChooseMissionaryTargetPlot(CvReligionAI* self, UnitHandle pUnit, int* piTurns, CvPlot*& result);static void AfterCvReligionAI_ChooseMissionaryTargetPlot(CvReligionAI* self, UnitHandle pUnit, int* piTurns, CvPlot*& result);static CvPlot* ReplaceCvReligionAI_ChooseMissionaryTargetPlot(CvPlot* (*original)(CvReligionAI*, UnitHandle, int*), CvReligionAI* self, UnitHandle pUnit, int* piTurns);CivRegisterBefore<CivHooks::CvReligionAI_ChooseMissionaryTargetPlot>(host, &BeforeCvReligionAI_ChooseMissionaryTargetPlot);CivRegisterAfter<CivHooks::CvReligionAI_ChooseMissionaryTargetPlot>(host, &AfterCvReligionAI_ChooseMissionaryTargetPlot);CivRegisterReplace<CivHooks::CvReligionAI_ChooseMissionaryTargetPlot>(host, &ReplaceCvReligionAI_ChooseMissionaryTargetPlot);
Code
5377/// Choose a plot next to the target city for the missionary to maneuver to5378CvPlot* CvReligionAI::ChooseMissionaryTargetPlot(UnitHandle pUnit, int* piTurns)5379{5380 CvCity* pCity = ChooseMissionaryTargetCity(pUnit);5381 int iBestNumTurns = MAX_INT;5382 int iTurns;5383 int iBestDistance = MAX_INT;5384 int iDistance;5385 CvPlot* pBestTarget = NULL;53865387 if(pCity == NULL)5388 {5389 return NULL;5390 }53915392 // Our city with no civilian units? If so go right in there5393 if(pCity->getOwner() == m_pPlayer->GetID())5394 {5395 CvUnit* pFirstUnit = pCity->plot()->getUnitByIndex(0);5396 if(!pFirstUnit || pFirstUnit->IsCombatUnit())5397 {5398 iTurns = TurnsToReachTarget(pUnit, pCity->plot(), true /* bReusePaths */);5399 if(iTurns < MAX_INT)5400 {5401 *piTurns = iTurns;5402 return pCity->plot();5403 }5404 }5405 }54065407#pragma warning ( push )5408#pragma warning ( disable : 6011 ) // Dereferencing NULL pointer5409 AI_PERF_FORMAT("AI-perf-tact.csv", ("ChooseMissionaryTargetPlot: %s %d; %s, Turn %03d, %s", pUnit->getName().c_str(), pUnit->GetID(), pCity->getName().c_str(), GC.getGame().getElapsedGameTurns(), m_pPlayer->getCivilizationShortDescription()) );5410#pragma warning ( pop )54115412 // Find adjacent plot with no units (that aren't our own)5413 CvPlot* pLoopPlot;5414 for(int iI = 0; iI < NUM_DIRECTION_TYPES; iI++)5415 {5416 pLoopPlot = plotDirection(pCity->getX(), pCity->getY(), ((DirectionTypes)iI));54175418 if(pLoopPlot != NULL)5419 {5420 CvUnit* pFirstUnit = pLoopPlot->getUnitByIndex(0);5421 if(pFirstUnit && pFirstUnit->getOwner() != m_pPlayer->GetID())5422 {5423 continue;5424 }54255426 if(pUnit->CanSpreadReligion(pLoopPlot))5427 {5428 iTurns = TurnsToReachTarget(pUnit, pLoopPlot, true /* bReusePaths */);5429 if(iTurns < MAX_INT)5430 {5431 iDistance = plotDistance(pUnit->getX(), pUnit->getY(), pLoopPlot->getX(), pLoopPlot->getY());54325433 // Consider it to be twice as far if a water plot (those are dangerous!)5434 if(pLoopPlot->isWater())5435 {5436 iDistance *= 2;5437 }54385439 if(iTurns < iBestNumTurns || (iTurns == iBestNumTurns && iDistance < iBestDistance))5440 {5441 iBestNumTurns = iTurns;5442 iBestDistance = iDistance;5443 pBestTarget = pLoopPlot;5444 }5445 }5446 }5447 }5448 }54495450 if(piTurns)5451 *piTurns = iBestNumTurns;5452 return pBestTarget;5453}