Hooks
static bool BeforeCvTacticalAI_FindBarbarianExploreTarget(CvTacticalAI* self, UnitHandle pUnit, CvPlot*& result);static void AfterCvTacticalAI_FindBarbarianExploreTarget(CvTacticalAI* self, UnitHandle pUnit, CvPlot*& result);static CvPlot* ReplaceCvTacticalAI_FindBarbarianExploreTarget(CvPlot* (*original)(CvTacticalAI*, UnitHandle), CvTacticalAI* self, UnitHandle pUnit);CivRegisterBefore<CivHooks::CvTacticalAI_FindBarbarianExploreTarget>(host, &BeforeCvTacticalAI_FindBarbarianExploreTarget);CivRegisterAfter<CivHooks::CvTacticalAI_FindBarbarianExploreTarget>(host, &AfterCvTacticalAI_FindBarbarianExploreTarget);CivRegisterReplace<CivHooks::CvTacticalAI_FindBarbarianExploreTarget>(host, &ReplaceCvTacticalAI_FindBarbarianExploreTarget);
Code
10218/// Scan nearby tiles for the best choice, borrowing code from the explore AI10219CvPlot* CvTacticalAI::FindBarbarianExploreTarget(UnitHandle pUnit)10220{10221 CvPlot* pBestMovePlot = NULL;10222 int iBestValue;10223 int iValue;1022410225 // Now looking for BEST score10226 iBestValue = 0;10227 int iMovementRange = pUnit->movesLeft() / GC.getMOVE_DENOMINATOR();10228 for(int iX = -iMovementRange; iX <= iMovementRange; iX++)10229 {10230 for(int iY = -iMovementRange; iY <= iMovementRange; iY++)10231 {10232 CvPlot* pPlot = plotXYWithRangeCheck(pUnit->getX(), pUnit->getY(), iX, iY, iMovementRange);10233 if(!pPlot)10234 {10235 continue;10236 }1023710238 if(pUnit->atPlot(*pPlot))10239 {10240 continue;10241 }1024210243 if(!pPlot->isRevealed(pUnit->getTeam()))10244 {10245 continue;10246 }1024710248 if(pPlot->area() != pUnit->area())10249 {10250 continue;10251 }1025210253 if(!CanReachInXTurns(pUnit, pPlot, 1))10254 {10255 continue;10256 }1025710258 // Value them based on their explore value10259 DomainTypes eDomain = pUnit->getDomainType();10260 iValue = CvEconomicAI::ScoreExplorePlot(pPlot, pUnit->getTeam(), pUnit->getUnitInfo().GetBaseSightRange(), eDomain);1026110262 // Add special value for popping up on hills or near enemy lands10263 if(pPlot->isAdjacentOwned())10264 {10265 iValue += 100;10266 }10267 else if(pPlot->isOwned())10268 {10269 iValue += 200;10270 }1027110272 // If still have no value, score equal to distance from my current plot10273 if(iValue == 0)10274 {10275 iValue = plotDistance(pUnit->getX(), pUnit->getY(), pPlot->getX(), pPlot->getY());10276 }1027710278 if(iValue > iBestValue)10279 {10280 pBestMovePlot = pPlot;10281 iBestValue = iValue;10282 }10283 }10284 }10285 return pBestMovePlot;10286}