Bazaar developer reference

CvAStar::GeneratePath(int, int, int, int, int, bool)

Defined in
CvAStar.cpp, line 193
Class
CvAStar
Hook name
CivHooks::CvAStar_GeneratePath

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}

Calls

Called by