Public Sub GetMovePathsUsingNodes(DestX As Integer, DestY As Integer)
Dim i As Integer
Dim j As Integer
Dim BestNode As TPathNode
Dim CurrentNode As New TNodeListElement
Dim TempNode As TPathNode
Dim NodesNRDest As New TNodeList
Dim NodesToCheck As New TNodeList
Dim CheckedNodes As New TNodeList
'This routine uses a method similar to that of the other one,
'except that it gets lots of paths from the same data (and so is faster)
Set CurrentNode = NodeNetwork.Nodes.Start
If IsVisible(DestX, DestY, CurrentNode.Data.X, CurrentNode.Data.Y) Then
Set TempNode = New TPathNode
TempNode.X = DestX
TempNode.Y = DestY
CurrentNode.Data.Distance = GetDistance(TempNode, CurrentNode.Data)
NodesNRDest.Add CurrentNode.Data
NodesToCheck.Add CurrentNode.Data
End If
Do
If Not Exists(CurrentNode.NextLE) Then Exit Do
Set CurrentNode = CurrentNode.NextLE
If IsVisible(DestX, DestY, CurrentNode.Data.X, CurrentNode.Data.Y) Then
Set TempNode = New TPathNode
TempNode.X = DestX
TempNode.Y = DestY
CurrentNode.Data.Distance = GetDistance(TempNode, CurrentNode.Data)
NodesNRDest.Add CurrentNode.Data
NodesToCheck.Add CurrentNode.Data
End If
Loop Until Not Exists(CurrentNode.NextLE)
'NodesNRDest now contains a list of all nodes that can see the destination as does NodesToCheck
While Not NodesToCheck.IsEmpty
Set TempNode = NodesToCheck.GetTop
NodesToCheck.RemoveTop
CheckedNodes.Add TempNode
'Check Up
If Exists(TempNode.UpLink) Then
If Not CheckedNodes.AlreadyExists(TempNode.UpLink) Then
If NodesToCheck.AlreadyExists(TempNode.UpLink) And (TempNode.UpLink.Distance > 0 Or (TempNode.UpLink.X = DestX And TempNode.UpLink.Y = DestY)) Then
If TempNode.Distance + GetDistance(TempNode, TempNode.UpLink) < TempNode.UpLink.Distance Then
TempNode.UpLink.Distance = TempNode.Distance + GetDistance(TempNode, TempNode.UpLink)
'Possibly reorder the list
End If
Else
NodesToCheck.Add TempNode.UpLink
TempNode.UpLink.Distance = TempNode.Distance + GetDistance(TempNode, TempNode.UpLink)
End If
Else
'If TempNode.Distance + GetDistance(TempNode, TempNode.UpLink) < TempNode.UpLink.Distance Then
' TempNode.UpLink.Distance = TempNode.Distance + GetDistance(TempNode, TempNode.UpLink)
' 'Possibly reorder the list
'End If
End If
End If
'Check Down
If Exists(TempNode.DownLink) Then
If Not CheckedNodes.AlreadyExists(TempNode.DownLink) Then
If NodesToCheck.AlreadyExists(TempNode.DownLink) And (TempNode.DownLink.Distance > 0 Or (TempNode.DownLink.X = DestX And TempNode.DownLink.Y = DestY)) Then
If TempNode.Distance + GetDistance(TempNode, TempNode.DownLink) < TempNode.DownLink.Distance Then
TempNode.DownLink.Distance = TempNode.Distance + GetDistance(TempNode, TempNode.DownLink)
'Possibly reorder the list
End If
Else
NodesToCheck.Add TempNode.DownLink
TempNode.DownLink.Distance = TempNode.Distance + GetDistance(TempNode, TempNode.DownLink)
End If
Else
'If TempNode.Distance + GetDistance(TempNode, TempNode.DownLink) < TempNode.DownLink.Distance Then
' TempNode.DownLink.Distance = TempNode.Distance + GetDistance(TempNode, TempNode.DownLink)
' 'Possibly reorder the list
'End If
End If
End If
'Check Left
If Exists(TempNode.LeftLink) Then
If Not CheckedNodes.AlreadyExists(TempNode.LeftLink) Then
If NodesToCheck.AlreadyExists(TempNode.LeftLink) And (TempNode.LeftLink.Distance > 0 Or (TempNode.LeftLink.X = DestX And TempNode.LeftLink.Y = DestY)) Then
If TempNode.Distance + GetDistance(TempNode, TempNode.LeftLink) < TempNode.LeftLink.Distance Then
TempNode.LeftLink.Distance = TempNode.Distance + GetDistance(TempNode, TempNode.LeftLink)
'Possibly reorder the list
End If
Else
NodesToCheck.Add TempNode.LeftLink
TempNode.LeftLink.Distance = TempNode.Distance + GetDistance(TempNode, TempNode.LeftLink)
End If
Else
'If TempNode.Distance + GetDistance(TempNode, TempNode.LeftLink) < TempNode.LeftLink.Distance Then
' TempNode.LeftLink.Distance = TempNode.Distance + GetDistance(TempNode, TempNode.LeftLink)
' 'Possibly reorder the list
'End If
End If
End If
'Check Right
If Exists(TempNode.RightLink) Then
If Not CheckedNodes.AlreadyExists(TempNode.RightLink) Then
If NodesToCheck.AlreadyExists(TempNode.RightLink) And (TempNode.RightLink.Distance > 0 Or (TempNode.RightLink.X = DestX And TempNode.RightLink.Y = DestY)) Then
If TempNode.Distance + GetDistance(TempNode, TempNode.RightLink) < TempNode.RightLink.Distance Then
TempNode.RightLink.Distance = TempNode.Distance + GetDistance(TempNode, TempNode.RightLink)
'Possibly reorder the list
End If
Else
NodesToCheck.Add TempNode.RightLink
TempNode.RightLink.Distance = TempNode.Distance + GetDistance(TempNode, TempNode.RightLink)
End If
Else
'If TempNode.Distance + GetDistance(TempNode, TempNode.RightLink) < TempNode.RightLink.Distance Then
' TempNode.RightLink.Distance = TempNode.Distance + GetDistance(TempNode, TempNode.RightLink)
' 'Possibly reorder the list
'End If
End If
End If
Wend
'Now every node has its distance from the destination associated with it.
'Loop through every possible place that could get to the destination
For i = 2 To GridWidth - 1
For j = 2 To GridHeight - 1
If ThinkGrid(i, j).Type = harddirto Or NodeNetwork.Nodes.IsEmpty Then
RouteData(i, j, DestX, DestY).PathExists = False
Else
If IsVisible(i, j, DestX, DestY) Then
'There is a direct route between the monster and this node
RouteData(i, j, DestX, DestY).Direction = GetDirection(i, j, DestX, DestY)
RouteData(i, j, DestX, DestY).PathExists = True
Else
If Not (i = DestX And j = DestY) Then
'The src isn't the dest, and the src is an open tile
'Loop through each node that the monster can see, and find the one with the shortest distance to the player, and workout how to get to it (a direction)
Set CurrentNode = CheckedNodes.Start
If IsVisible(i, j, CurrentNode.Data.X, CurrentNode.Data.Y) And Not (i = CurrentNode.Data.X And j = CurrentNode.Data.Y) Then
If Exists(BestNode) Then
Set TempNode = New TPathNode
TempNode.X = i
TempNode.Y = j
If BestNode.Distance + GetDistance(BestNode, TempNode) > CurrentNode.Data.Distance + GetDistance(CurrentNode.Data, TempNode) Then
Set BestNode = CurrentNode.Data
End If
Else
Set BestNode = CurrentNode.Data
End If
End If
Do
If Not Exists(CurrentNode.NextLE) Then Exit Do
Set CurrentNode = CurrentNode.NextLE
If IsVisible(i, j, CurrentNode.Data.X, CurrentNode.Data.Y) And Not (i = CurrentNode.Data.X And j = CurrentNode.Data.Y) Then
If Exists(BestNode) Then
If BestNode.Distance + GetDistance(BestNode, TempNode) > CurrentNode.Data.Distance + GetDistance(CurrentNode.Data, TempNode) Then
Set BestNode = CurrentNode.Data
End If
Else
Set BestNode = CurrentNode.Data
End If
End If
Loop Until Not Exists(CurrentNode.NextLE)
If Exists(BestNode) Then
RouteData(i, j, DestX, DestY).PathExists = True
RouteData(i, j, DestX, DestY).Direction = GetDirection(i, j, BestNode.X, BestNode.Y)
Set BestNode = Nothing
End If
End If
End If
End If
Next j
Next i
End Sub