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}