Hooks
static bool BeforeCvHomelandAI_IsAnyValidExploreMoves(const CvHomelandAI* self, const CvUnit* pUnit, bool& result);static void AfterCvHomelandAI_IsAnyValidExploreMoves(const CvHomelandAI* self, const CvUnit* pUnit, bool& result);static bool ReplaceCvHomelandAI_IsAnyValidExploreMoves(bool (*original)(const CvHomelandAI*, const CvUnit*), const CvHomelandAI* self, const CvUnit* pUnit);CivRegisterBefore<CivHooks::CvHomelandAI_IsAnyValidExploreMoves>(host, &BeforeCvHomelandAI_IsAnyValidExploreMoves);CivRegisterAfter<CivHooks::CvHomelandAI_IsAnyValidExploreMoves>(host, &AfterCvHomelandAI_IsAnyValidExploreMoves);CivRegisterReplace<CivHooks::CvHomelandAI_IsAnyValidExploreMoves>(host, &ReplaceCvHomelandAI_IsAnyValidExploreMoves);
Code
175bool CvHomelandAI::IsAnyValidExploreMoves(const CvUnit* pUnit) const176{177 CvEconomicAI* pEconomicAI = m_pPlayer->GetEconomicAI();178 FFastVector<int>& aiExplorationPlots = pEconomicAI->GetExplorationPlots();179 FFastVector<int>& aiExplorationPlotRatings = pEconomicAI->GetExplorationPlotRatings();180181 if (aiExplorationPlots.size() > 0)182 {183 int iUnitX = pUnit->getX();184 int iUnitY = pUnit->getY();185186 // Filter the list with some quick checks, then add the rest to a list that we can sort by distance187 DistanceSortedPlotArray aDistanceList;188 aDistanceList.reserve( aiExplorationPlots.size() );189190 for(uint ui = 0; ui < aiExplorationPlots.size(); ui++)191 {192 int iPlot = aiExplorationPlots[ui];193 if(iPlot < 0)194 {195 continue;196 }197198 CvPlot* pEvalPlot = GC.getMap().plotByIndex(iPlot);199 if(!pEvalPlot)200 {201 continue;202 }203204 if(aiExplorationPlotRatings[ui] == 0)205 {206 continue;207 }208209 int iDistX = abs( pEvalPlot->getX() - iUnitX );210 int iDistY = abs( pEvalPlot->getY() - iUnitY );211212 aDistanceList.push_back(std::pair<int, CvPlot*>((iDistX*iDistX)+(iDistY*iDistY), pEvalPlot));213214 }215216 if (aDistanceList.size())217 {218 std::sort(aDistanceList.begin(), aDistanceList.end(), SortUnitDistance);219220 for (DistanceSortedPlotArray::const_iterator itr = aDistanceList.begin(); itr != aDistanceList.end(); ++itr)221 {222 CvPlot* pEvalPlot = (*itr).second;223 if(!IsValidExplorerEndTurnPlot(pUnit, pEvalPlot))224 {225 continue;226 }227 // hitting the path finder, may not be the best idea. . .228 bool bCanFindPath = GC.getPathFinder().GenerateUnitPath(pUnit, iUnitX, iUnitY, pEvalPlot->getX(), pEvalPlot->getY(), MOVE_TERRITORY_NO_ENEMY | MOVE_MAXIMIZE_EXPLORE | MOVE_UNITS_IGNORE_DANGER /*iFlags*/, true/*bReuse*/);229 if(!bCanFindPath)230 {231 continue;232 }233234 return true;235 }236 }237 }238239240 return false;241}