bool CvPathGenerator::generatePath(const CvPlot* pFrom, const CvPlot* pTo, CvSelectionGroup* pGroup, int iFlags, int iMaxTurns)
{
CvPathNode* root;
PROFILE_FUNC();
m_bFoundRoute = false;
m_iSeq++;
unsigned int iGroupMembershipChecksum = 0;
CLLNode<IDInfo>* pUnitNode;
CvUnit* pLoopUnit;
pUnitNode = pGroup->headUnitNode();
while (pUnitNode != NULL)
{
pLoopUnit = ::getUnit(pUnitNode->m_data);
pUnitNode = pGroup->nextUnitNode(pUnitNode);
CheckSum(iGroupMembershipChecksum, pLoopUnit->getID());
}
if ( m_currentGroupMembershipChecksum != iGroupMembershipChecksum || m_iFlags != iFlags )
{
CvSelectionGroup::setGroupToCacheFor(pGroup);
if ( !pGroup->AI_isControlled() )
{
m_useAIPathingAlways = getBugOptionBOOL("MainInterface__UseAIPathing", false);
}
}
bool bRequiresWar;
if ( !m_TerminusValidFunc(pGroup, pTo->getX_INLINE(), pTo->getY_INLINE(), iFlags, bRequiresWar) )
{
m_generatedPath.Set(NULL);
return false;
}
if ( bRequiresWar )
{
iFlags |= MOVE_TERMINUS_DECLARES_WAR;
}
#ifdef TRACE_PATHING
OutputDebugString(CvString::format("Generate path from (%d,%d) to (%d,%d)\n", pFrom->getX_INLINE(), pFrom->getY_INLINE(), pTo->getX_INLINE(), pTo->getY_INLINE()).c_str());
#endif
[COLOR="Red"]
bool bSameGroup = (m_iTurn == GC.getGameINLINE().getGameTurn() && m_currentGroupMembershipChecksum == iGroupMembershipChecksum && m_iFlags == iFlags);
// Optimize the case where we'e just stepping along the previously calculated path (as continueMission() does)
if ( bSameGroup && m_generatedPath.lastPlot() == pTo )
{
if ( m_generatedPath.containsNode(pFrom) )
{
bool bValid = true;
m_generatedPath.trimBefore(pFrom);
// Validate we can still follow this path (visibility may have changed)
for(CvPath::const_iterator itr = m_generatedPath.begin(); itr != m_generatedPath.end(); ++itr)
{
if ( itr.plot() != pFrom && !moveToValid(pGroup, itr.plot(), iFlags) )
{
bValid = false;
break;
}
}
if ( bValid )
{
return true;
}
}
}
m_generatedPath.Set(NULL);
if ( !bSameGroup || pFrom != m_pFrom )[/COLOR]
{
m_nodeAllocationPool->reset();
m_plotInfo->reset();
m_iTurn = GC.getGameINLINE().getGameTurn();
m_pReplacedNonTerminalNode = NULL;
m_pBestTerminalNode = NULL;
}