public override void InitPath() { //Setup Startnode's Info IPathNode startPNode = Handler.GetPathnode(m_StartNode); startPNode.Node = m_StartNode; startPNode.PathID = Handler.PathID; startPNode.Parent = null; startPNode.Cost = 0; startPNode.G = 0; startPNode.H = CalculateHScore(m_StartNode); startPNode.Open(this, Handler); m_SearchIndex++; PartialBestNode = startPNode; if (Handler.Heap.IsEmpty) { if (CalculatePartial) { CompleteState = PathCompleteState.PartialComplete; Trace(PartialBestNode); } else { //Todo: Error } } CurNode = Handler.Heap.Dequeue(); }
public override void Process(long targetTick) { int counter = 0; while (CompleteState == PathCompleteState.NotCalculated) { m_SearchIndex++; var heap = Handler.Heap; if (PartialBestNode.H > CurNode.H) { PartialBestNode = CurNode; } CurNode.Open(this, Handler); if (heap.IsEmpty) { if (CalculatePartial && PartialBestNode != null) { CompleteState = PathCompleteState.PartialComplete; Trace(PartialBestNode); } else { //Todo: Error } } CurNode = heap.Dequeue(); if (counter > 500) { if (System.DateTime.UtcNow.Ticks >= targetTick) { return; } counter = 0; if (m_SearchIndex > 1000000) { throw new System.Exception("Probable infinite loop. Over 1,000,000 nodes searched"); } } counter++; } if (CompleteState == PathCompleteState.Complete) { Trace(CurNode); } else if (CompleteState == PathCompleteState.PartialComplete) { Trace(PartialBestNode); } }