Hooks
static bool BeforeCanReachInXTurns(UnitHandle pUnit, CvPlot* pTarget, int iTurns, bool bIgnoreUnits, int* piTurns, bool& result);static void AfterCanReachInXTurns(UnitHandle pUnit, CvPlot* pTarget, int iTurns, bool bIgnoreUnits, int* piTurns, bool& result);static bool ReplaceCanReachInXTurns(bool (*original)(UnitHandle, CvPlot*, int, bool, int*), UnitHandle pUnit, CvPlot* pTarget, int iTurns, bool bIgnoreUnits, int* piTurns);CivRegisterBefore<CivHooks::CanReachInXTurns>(host, &BeforeCanReachInXTurns);CivRegisterAfter<CivHooks::CanReachInXTurns>(host, &AfterCanReachInXTurns);CivRegisterReplace<CivHooks::CanReachInXTurns>(host, &ReplaceCanReachInXTurns);
Code
3792bool CanReachInXTurns(UnitHandle pUnit, CvPlot* pTarget, int iTurns, bool bIgnoreUnits, int* piTurns /* = NULL */)3793{3794 int iDistance;37953796 if(!pTarget)3797 {3798 return false;3799 }38003801 // Compare distance to movement rate3802 iDistance = plotDistance(pUnit->getX(), pUnit->getY(), pTarget->getX(), pTarget->getY());3803 // KWG: If the unit is a land unit that can embark, baseMoves() is only going to give correct value if the starting and ending locations3804 // are in the same domain (LAND vs. SEA) and no transition occurs.3805 if(iTurns == 0 && iDistance >= pUnit->baseMoves())3806 {3807 return false;3808 }38093810 else if(iTurns > 0 && iDistance > (pUnit->baseMoves() * iTurns))3811 {3812 return false;3813 }38143815 // Distance not too far, now use pathfinder3816 else3817 {3818 int iTurnsCalculated = TurnsToReachTarget(pUnit, pTarget, false /*bReusePaths*/, bIgnoreUnits);3819 if (piTurns)3820 *piTurns = iTurnsCalculated;3821 return (iTurnsCalculated <= iTurns);3822 }3823}