Bazaar developer reference

CvReligionAI::ChooseMissionaryTargetPlot(UnitHandle, int *)

Defined in
CvReligionClasses.cpp, line 5378
Class
CvReligionAI
Hook name
CivHooks::CvReligionAI_ChooseMissionaryTargetPlot

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}

Calls

Called by