Hooks
static bool BeforeCvAStar_UpdateParents(CvAStar* self, CvAStarNode* node);static void AfterCvAStar_UpdateParents(CvAStar* self, CvAStarNode* node);static void ReplaceCvAStar_UpdateParents(void (*original)(CvAStar*, CvAStarNode*), CvAStar* self, CvAStarNode* node);CivRegisterBefore<CivHooks::CvAStar_UpdateParents>(host, &BeforeCvAStar_UpdateParents);CivRegisterAfter<CivHooks::CvAStar_UpdateParents>(host, &AfterCvAStar_UpdateParents);CivRegisterReplace<CivHooks::CvAStar_UpdateParents>(host, &ReplaceCvAStar_UpdateParents);
Code
682/// Refresh parent node (after linking in a child)683void CvAStar::UpdateParents(CvAStarNode* node)684{685 CvAStarNode* kid;686 CvAStarNode* parent;687 int iKnownCost;688 int iNumChildren;689 int i;690691 FAssert(m_pStackHead == NULL);692693 parent = node;694695 while(parent != NULL)696 {697 iNumChildren = parent->m_iNumChildren;698699 for(i = 0; i < iNumChildren; i++)700 {701 kid = parent->m_apChildren[i];702703 iKnownCost = (parent->m_iKnownCost + udFunc(udCost, parent, kid, 0, m_pData));704705 if(iKnownCost < kid->m_iKnownCost)706 {707 kid->m_iKnownCost = iKnownCost;708 kid->m_iTotalCost = kid->m_iKnownCost + kid->m_iHeuristicCost;709 FAssert(parent->m_pParent != kid);710 kid->m_pParent = parent;711 if(kid->m_eCvAStarListType == CVASTARLIST_OPEN)712 {713 UpdateOpenNode(kid);714 }715 udFunc(udNotifyChild, parent, kid, ASNC_PARENTADD_UP, m_pData);716717 Push(kid);718 }719 }720721 parent = Pop();722 }723}