Bazaar developer reference

CvTacticalAI::MoveToEmptySpaceTwoFromTarget(UnitHandle, CvPlot *, bool)

Defined in
CvTacticalAI.cpp, line 9813
Class
CvTacticalAI
Hook name
CivHooks::CvTacticalAI_MoveToEmptySpaceTwoFromTarget

Hooks

static bool BeforeCvTacticalAI_MoveToEmptySpaceTwoFromTarget(CvTacticalAI* self, UnitHandle pUnit, CvPlot* pTarget, bool bLand, bool& result);static void AfterCvTacticalAI_MoveToEmptySpaceTwoFromTarget(CvTacticalAI* self, UnitHandle pUnit, CvPlot* pTarget, bool bLand, bool& result);static bool ReplaceCvTacticalAI_MoveToEmptySpaceTwoFromTarget(bool (*original)(CvTacticalAI*, UnitHandle, CvPlot*, bool), CvTacticalAI* self, UnitHandle pUnit, CvPlot* pTarget, bool bLand);CivRegisterBefore<CivHooks::CvTacticalAI_MoveToEmptySpaceTwoFromTarget>(host, &BeforeCvTacticalAI_MoveToEmptySpaceTwoFromTarget);CivRegisterAfter<CivHooks::CvTacticalAI_MoveToEmptySpaceTwoFromTarget>(host, &AfterCvTacticalAI_MoveToEmptySpaceTwoFromTarget);CivRegisterReplace<CivHooks::CvTacticalAI_MoveToEmptySpaceTwoFromTarget>(host, &ReplaceCvTacticalAI_MoveToEmptySpaceTwoFromTarget);

Code

9812/// Move up to our target (this time within 2 spaces) avoiding our own units if possible9813bool CvTacticalAI::MoveToEmptySpaceTwoFromTarget(UnitHandle pUnit, CvPlot* pTarget, bool bLand)9814{9815#if defined(MOD_AI_SMART_V3)9816	if (MOD_AI_SMART_V3 && plotDistance(pUnit->getX(), pUnit->getY(), pTarget->getX(), pTarget->getY()) == 2 && pUnit->plot()->isWater() != bLand)9817	{9818		return true;9819	}9820#endif98219822#if defined(MOD_AI_SMART_V3)9823	CvWeightedVector<CvPlot*> pPossiblePlots;9824	int iTurnsNeeded;9825#endif9826	CvPlot* pLoopPlot;98279828	// Look at spaces adjacent to target9829#if defined(MOD_GLOBAL_CITY_WORKING)9830	for(int iI = 0; iI < AVG_CITY_PLOTS; iI++)9831#else9832	for(int iI = 0; iI < NUM_CITY_PLOTS; iI++)9833#endif9834	{9835		pLoopPlot = plotCity(pTarget->getX(), pTarget->getY(), iI);9836		if(pLoopPlot != NULL && pLoopPlot->isWater() != bLand && plotDistance(pLoopPlot->getX(), pLoopPlot->getY(), pTarget->getX(), pTarget->getY() == 2))9837		{9838			// Must be currently empty of friendly combat units9839			if(!pLoopPlot->getBestDefender(m_pPlayer->GetID()))9840			{9841				// Enemies too9842				if(!pLoopPlot->getBestDefender(NO_PLAYER, m_pPlayer->GetID()))9843				{9844					// And if it is a city, make sure we are friends with them, else we will automatically attack9845					if(pLoopPlot->getPlotCity() == NULL || pLoopPlot->isFriendlyCity(*pUnit, false))9846					{9847						// Find a path to this space9848#if defined(MOD_AI_SMART_V3)9849						iTurnsNeeded = MAX_INT;9850						bool bFoundPlot = MOD_AI_SMART_V3 ? pUnit->GeneratePath(pLoopPlot, MOVE_UNITS_IGNORE_DANGER, false, &iTurnsNeeded) : pUnit->GeneratePath(pLoopPlot);9851						if (bFoundPlot)9852#else9853						if(pUnit->GeneratePath(pLoopPlot))9854#endif9855						{9856							// Go ahead with mission9857#if defined(MOD_AI_SMART_V3)9858							if (MOD_AI_SMART_V3)9859							{9860								pPossiblePlots.push_back(pLoopPlot, iTurnsNeeded);9861							}9862							else9863							{9864#endif9865								bool bMoveWasSafe;9866								MoveToUsingSafeEmbark(pUnit, pLoopPlot, bMoveWasSafe);9867								return true;9868#if defined(MOD_AI_SMART_V3)9869							}9870#endif9871						}9872					}9873				}9874			}9875		}9876	}9877	9878#if defined(MOD_AI_SMART_V3)9879	if (MOD_AI_SMART_V3 && pPossiblePlots.size() > 0)9880	{9881		iTurnsNeeded = pPossiblePlots.GetWeight(0);9882		pPossiblePlots.SortItems();9883		pLoopPlot = pPossiblePlots.GetElement(0);9884		for (int iI = 1; iI < pPossiblePlots.size(); iI++)9885		{9886			if (pPossiblePlots.GetWeight(iI) == iTurnsNeeded)9887			{9888				if (m_pPlayer->GetPlotDanger(*pLoopPlot) > m_pPlayer->GetPlotDanger(*pPossiblePlots.GetElement(iI)))9889				{9890					pLoopPlot = pPossiblePlots.GetElement(iI);9891				}9892			}9893			else9894				break;9895		}98969897		// Go ahead with mission9898		bool bMoveWasSafe;9899		MoveToUsingSafeEmbark(pUnit, pLoopPlot, bMoveWasSafe);9900		return true;9901	}9902#endif99039904	return false;9905}

Calls

Called by