Hooks
static bool BeforeCvAStar_GeneratePath(CvAStar* self, int iXstart, int iYstart, int iXdest, int iYdest, int iInfo, bool bReuse, bool& result);static void AfterCvAStar_GeneratePath(CvAStar* self, int iXstart, int iYstart, int iXdest, int iYdest, int iInfo, bool bReuse, bool& result);static bool ReplaceCvAStar_GeneratePath(bool (*original)(CvAStar*, int, int, int, int, int, bool), CvAStar* self, int iXstart, int iYstart, int iXdest, int iYdest, int iInfo, bool bReuse);CivRegisterBefore<CivHooks::CvAStar_GeneratePath>(host, &BeforeCvAStar_GeneratePath);CivRegisterAfter<CivHooks::CvAStar_GeneratePath>(host, &AfterCvAStar_GeneratePath);CivRegisterReplace<CivHooks::CvAStar_GeneratePath>(host, &ReplaceCvAStar_GeneratePath);
Code
192/// Generates a path from iXstart,iYstart to iXdest,iYdest193bool CvAStar::GeneratePath(int iXstart, int iYstart, int iXdest, int iYdest, int iInfo, bool bReuse)194{195 CvAStarNode* temp;196 int retval;197198 const CvGame& game = GC.getGame();199 bool isMultiplayer = game.isNetworkMultiPlayer();200 bool discardCacheForMPGame = isMultiplayer && !m_bIsMPCacheSafe;201202 if(m_bForceReset || (m_iXstart != iXstart) || (m_iYstart != iYstart) || (m_iInfo != iInfo) || discardCacheForMPGame)203 bReuse = false;204205 m_iXdest = iXdest;206 m_iYdest = iYdest;207 m_iXstart = iXstart;208 m_iYstart = iYstart;209 m_iInfo = iInfo;210211 if (udInitializeFunc)212 udInitializeFunc(m_pData, this);213214 if(!isValid(iXstart, iYstart))215 {216 if (udUninitializeFunc)217 udUninitializeFunc(m_pData, this);218 return false;219 }220221 PREFETCH_FASTAR_NODE(&(m_ppaaNodes[iXdest][iYdest]));222223 if(!bReuse)224 {225 // XXX should we just be doing a memset here?226 if(m_pOpen)227 {228 while(m_pOpen)229 {230 temp = m_pOpen->m_pNext;231 m_pOpen->clear();232 m_pOpen = temp;233 }234 }235236 if(m_pClosed)237 {238 while(m_pClosed)239 {240 temp = m_pClosed->m_pNext;241 m_pClosed->clear();242 m_pClosed = temp;243 }244 }245246 PREFETCH_FASTAR_NODE(&(m_ppaaNodes[iXstart][iYstart]));247248 m_pBest = NULL;249 m_pStackHead = NULL;250251 m_bForceReset = false;252253 temp = &(m_ppaaNodes[iXstart][iYstart]);254255 temp->m_iKnownCost = 0;256 if(udHeuristic == NULL)257 {258 temp->m_iHeuristicCost = 0;259 }260 else261 {262 temp->m_iHeuristicCost = udHeuristic(m_iXstart, m_iYstart, m_iXdest, m_iYdest);263 }264 temp->m_iTotalCost = temp->m_iKnownCost + temp->m_iHeuristicCost;265266 m_pOpen = temp;267 m_pOpenTail = temp;268269 udFunc(udNotifyList, NULL, m_pOpen, ASNL_STARTOPEN, m_pData);270 udFunc(udValid, NULL, temp, 0, m_pData);271 udFunc(udNotifyChild, NULL, temp, ASNC_INITIALADD, m_pData);272 }273274 if(udDestValid != NULL)275 {276 if(!udDestValid(iXdest, iYdest, m_pData, this))277 {278 if (udUninitializeFunc)279 udUninitializeFunc(m_pData, this);280 return false;281 }282 }283284 if(isValid(m_iXdest, m_iYdest))285 {286 temp = &(m_ppaaNodes[m_iXdest][m_iYdest]);287288 if(temp->m_eCvAStarListType == CVASTARLIST_CLOSED)289 {290 m_pBest = temp;291 if (udUninitializeFunc)292 udUninitializeFunc(m_pData, this);293 return true;294 }295 }296297 retval = 0;298299 while(retval == 0)300 {301 retval = Step();302 }303304 if(retval == -1)305 {306 assert(m_pBest == NULL);307 if (udUninitializeFunc)308 udUninitializeFunc(m_pData, this);309 return false;310 }311312 if (udUninitializeFunc)313 udUninitializeFunc(m_pData, this);314 return true;315}