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}