Bazaar developer reference

CvAStar::AddToOpen(CvAStarNode *)

Defined in
CvAStar.cpp, line 499
Class
CvAStar
Hook name
CivHooks::CvAStar_AddToOpen

Hooks

static bool BeforeCvAStar_AddToOpen(CvAStar* self, CvAStarNode* addnode);static void AfterCvAStar_AddToOpen(CvAStar* self, CvAStarNode* addnode);static void ReplaceCvAStar_AddToOpen(void (*original)(CvAStar*, CvAStarNode*), CvAStar* self, CvAStarNode* addnode);CivRegisterBefore<CivHooks::CvAStar_AddToOpen>(host, &BeforeCvAStar_AddToOpen);CivRegisterAfter<CivHooks::CvAStar_AddToOpen>(host, &AfterCvAStar_AddToOpen);CivRegisterReplace<CivHooks::CvAStar_AddToOpen>(host, &ReplaceCvAStar_AddToOpen);

Code

498/// Add node to open list499void CvAStar::AddToOpen(CvAStarNode* addnode)500{501	CvAStarNode* node;502503	addnode->m_eCvAStarListType = CVASTARLIST_OPEN;504505	if(!m_pOpen)506	{507		m_pOpen = addnode;508		m_pOpenTail = addnode;509		m_pOpen->m_pNext = NULL;510		m_pOpen->m_pPrev = NULL;511512		udFunc(udNotifyList, NULL, addnode, ASNL_STARTOPEN, m_pData);513514		return;515	}516517	if(addnode->m_iTotalCost <= m_pOpen->m_iTotalCost)518	{519		addnode->m_pNext = m_pOpen;520		m_pOpen->m_pPrev = addnode;521		m_pOpen = addnode;522523		udFunc(udNotifyList, m_pOpen->m_pNext, m_pOpen, ASNL_STARTOPEN, m_pData);524	}525	else if(addnode->m_iTotalCost >= m_pOpenTail->m_iTotalCost)526	{527		addnode->m_pPrev = m_pOpenTail;528		m_pOpenTail->m_pNext = addnode;529		m_pOpenTail = addnode;530531		udFunc(udNotifyList, addnode->m_pPrev, addnode, ASNL_ADDOPEN, m_pData);532	}533	else if(abs(addnode->m_iTotalCost-m_pOpenTail->m_iTotalCost) < abs(addnode->m_iTotalCost-m_pOpen->m_iTotalCost))  //(addnode->m_iTotalCost > m_iOpenListAverage) // let's start at the end and work forwards534	{535		CvAStarNode* next;536		node = m_pOpenTail;537		next = NULL;538539		while(node)540		{541			if(addnode->m_iTotalCost < node->m_iTotalCost)542			{543				next = node;544				node = node->m_pPrev;545			}546			else547			{548				if(next)549				{550					next->m_pPrev = addnode;551					addnode->m_pNext = next;552					addnode->m_pPrev = node;553					node->m_pNext = addnode;554					if(node->m_pNext == NULL)555					{556						m_pOpenTail = node;557					}558559					udFunc(udNotifyList, addnode->m_pPrev, addnode, ASNL_ADDOPEN, m_pData);560				}561				else // we should just add it to the end of the list562				{563					addnode->m_pPrev = m_pOpenTail;564					m_pOpenTail->m_pNext = addnode;565					m_pOpenTail = addnode;566567					udFunc(udNotifyList, addnode->m_pPrev, addnode, ASNL_ADDOPEN, m_pData);568				}569570				return;571			}572		}573574		// we made it to the start of this list - insert it at the beginning - we shouldn't ever get here, but...575		next->m_pPrev = addnode;576		addnode->m_pNext = next;577		m_pOpen = addnode;578579		udFunc(udNotifyList, m_pOpen->m_pNext, m_pOpen, ASNL_STARTOPEN, m_pData);580	}581	else // let's start at the beginning as it should be closer582	{583		CvAStarNode* prev;584		node = m_pOpen;585		prev = NULL;586587		while(node)588		{589			if(addnode->m_iTotalCost > node->m_iTotalCost)590			{591				prev = node;592				node = node->m_pNext;593			}594			else595			{596				if(prev)597				{598					prev->m_pNext = addnode;599					addnode->m_pPrev = prev;600					addnode->m_pNext = node;601					node->m_pPrev = addnode;602					if(node->m_pNext == NULL)603					{604						m_pOpenTail = node;605					}606607					udFunc(udNotifyList, prev, addnode, ASNL_ADDOPEN, m_pData);608				}609				else610				{611					addnode->m_pNext = m_pOpen;612					m_pOpen->m_pPrev = addnode;613					m_pOpen = addnode;614615					udFunc(udNotifyList, m_pOpen->m_pNext, m_pOpen, ASNL_STARTOPEN, m_pData);616				}617618				return;619			}620		}621622		// we made it to the end of this list - insert it at the end - we shouldn't ever get here, but...623		prev->m_pNext = addnode;624		addnode->m_pPrev = prev;625		m_pOpenTail = addnode;626627		udFunc(udNotifyList, prev, addnode, ASNL_ADDOPEN, m_pData);628	}629}

Calls

Called by