Example #1
0
 public void FloodForValues(ref sFloodForValuesArgs Args)
 {
     int num;
     PathfinderNode otherNode;
     PathfinderNode node3;
     PathfinderNode node4 = Args.CurrentPath.Nodes[0];
     Args.SourceNodes[0] = node4;
     int index = 1;
     Args.NodeValues[node4.Layer_NodeNum] = 0f;
     for (int i = 0; i < index; i++)
     {
         node3 = Args.SourceNodes[i];
         int num9 = node3.ConnectionCount - 1;
         num = 0;
         while (num <= num9)
         {
             PathfinderConnection connection = node3.Connections[num];
             otherNode = connection.GetOtherNode(node3);
             if ((otherNode.ParentNode == Args.SourceParentNodeA) | (otherNode.ParentNode == Args.SourceParentNodeB))
             {
                 float num6 = Args.NodeValues[node3.Layer_NodeNum] + connection.Value;
                 if (num6 < Args.NodeValues[otherNode.Layer_NodeNum])
                 {
                     Args.NodeValues[otherNode.Layer_NodeNum] = num6;
                     Args.SourceNodes[index] = otherNode;
                     index++;
                 }
             }
             num++;
         }
     }
     int num10 = Args.FinishNodeCount - 1;
     for (num = 0; num <= num10; num++)
     {
         float maxValue;
         PathfinderNode node;
         float num5;
         if (Args.FinishIsParent)
         {
             node = null;
             maxValue = float.MaxValue;
             int num11 = Args.FinishNodes[num].NodeCount - 1;
             for (int j = 0; j <= num11; j++)
             {
                 node3 = Args.FinishNodes[num].Nodes[j];
                 num5 = Args.NodeValues[node3.Layer_NodeNum];
                 if (num5 < maxValue)
                 {
                     maxValue = num5;
                     node = node3;
                 }
             }
             node3 = node;
         }
         else
         {
             node3 = Args.FinishNodes[num];
         }
         if (node3 != null)
         {
             index = 0;
             maxValue = Args.NodeValues[node3.Layer_NodeNum];
             if (maxValue != float.MaxValue)
             {
                 int num2;
                 while (true)
                 {
                     Args.SourceNodes[index] = node3;
                     index++;
                     if (node3 == node4)
                     {
                         break;
                     }
                     node = null;
                     int num12 = node3.ConnectionCount - 1;
                     num2 = 0;
                     while (num2 <= num12)
                     {
                         otherNode = node3.Connections[num2].GetOtherNode(node3);
                         if ((otherNode.ParentNode == Args.SourceParentNodeA) | (otherNode.ParentNode == Args.SourceParentNodeB))
                         {
                             num5 = Args.NodeValues[otherNode.Layer_NodeNum];
                             if (num5 < maxValue)
                             {
                                 maxValue = num5;
                                 node = otherNode;
                             }
                         }
                         num2++;
                     }
                     if (node == null)
                     {
                         Args.BestPaths[num] = null;
                         continue;
                     }
                     node3 = node;
                 }
                 Path path = new Path();
                 Args.BestPaths[num] = path;
                 path.Value = Args.NodeValues[Args.FinishNodes[num].Layer_NodeNum];
                 path.NodeCount = index;
                 path.Nodes = new PathfinderNode[(path.NodeCount - 1) + 1];
                 int num13 = path.NodeCount - 1;
                 for (num2 = 0; num2 <= num13; num2++)
                 {
                     path.Nodes[num2] = Args.SourceNodes[(index - num2) - 1];
                 }
             }
         }
     }
 }
Example #2
0
        public void FloodForValues(sFloodForValuesArgs Args)
        {
            PathfinderNode CurrentNode = default(PathfinderNode);
            PathfinderNode ConnectedNode = default(PathfinderNode);
            int A = 0;
            int SourceNodeCount = 0;
            int SourceNodeNum = 0;
            PathfinderConnection tmpConnection = default(PathfinderConnection);
            float ResultValue = 0;
            Path BestPath = default(Path);
            PathfinderNode StartNode = default(PathfinderNode);
            int B = 0;
            float BestDist = 0;
            float Dist = 0;
            PathfinderNode BestNode = default(PathfinderNode);
            int C = 0;

            StartNode = Args.CurrentPath.Nodes[0];

            Args.SourceNodes[0] = StartNode;
            SourceNodeCount = 1;
            Args.NodeValues[StartNode.Layer_NodeNum] = 0.0F;

            SourceNodeNum = 0;
            while ( SourceNodeNum < SourceNodeCount )
            {
                CurrentNode = Args.SourceNodes[SourceNodeNum];
                for ( A = 0; A <= CurrentNode.ConnectionCount - 1; A++ )
                {
                    tmpConnection = CurrentNode.Connections[A];
                    ConnectedNode = tmpConnection.GetOtherNode(CurrentNode);
                    if ( ConnectedNode.ParentNode == Args.SourceParentNodeA || ConnectedNode.ParentNode == Args.SourceParentNodeB )
                    {
                        ResultValue = Args.NodeValues[CurrentNode.Layer_NodeNum] + tmpConnection.Value;
                        if ( ResultValue < Args.NodeValues[ConnectedNode.Layer_NodeNum] )
                        {
                            Args.NodeValues[ConnectedNode.Layer_NodeNum] = ResultValue;
                            Args.SourceNodes[SourceNodeCount] = ConnectedNode;
                            SourceNodeCount++;
                        }
                    }
                }
                SourceNodeNum++;
            }

            for ( A = 0; A <= Args.FinishNodeCount - 1; A++ )
            {
                if ( Args.FinishIsParent )
                {
                    BestNode = null;
                    BestDist = float.MaxValue;
                    for ( C = 0; C <= Args.FinishNodes[A].NodeCount - 1; C++ )
                    {
                        CurrentNode = Args.FinishNodes[A].Nodes[C];
                        Dist = Args.NodeValues[CurrentNode.Layer_NodeNum];
                        if ( Dist < BestDist )
                        {
                            BestDist = Dist;
                            BestNode = CurrentNode;
                        }
                    }
                    CurrentNode = BestNode;
                }
                else
                {
                    CurrentNode = Args.FinishNodes[A];
                }
                if ( CurrentNode == null )
                {
                    //no path
                    return;
                }
                SourceNodeCount = 0;
                BestDist = Args.NodeValues[CurrentNode.Layer_NodeNum];
                if ( BestDist == float.MaxValue )
                {
                    //no path
                    return;
                }
                do
                {
                    Args.SourceNodes[SourceNodeCount] = CurrentNode;
                    SourceNodeCount++;
                    if ( CurrentNode == StartNode )
                    {
                        break;
                    }
                    BestNode = null;
                    for ( B = 0; B <= CurrentNode.ConnectionCount - 1; B++ )
                    {
                        tmpConnection = CurrentNode.Connections[B];
                        ConnectedNode = tmpConnection.GetOtherNode(CurrentNode);
                        if ( ConnectedNode.ParentNode == Args.SourceParentNodeA || ConnectedNode.ParentNode == Args.SourceParentNodeB )
                        {
                            Dist = Args.NodeValues[ConnectedNode.Layer_NodeNum];
                            if ( Dist < BestDist )
                            {
                                BestDist = Dist;
                                BestNode = ConnectedNode;
                            }
                        }
                    }
                    if ( BestNode == null )
                    {
                        Args.BestPaths[A] = null;
                        //no path
                        return;
                    }
                    CurrentNode = BestNode;
                } while ( true );

                BestPath = new Path();
                Args.BestPaths[A] = BestPath;
                BestPath.Value = Args.NodeValues[Args.FinishNodes[A].Layer_NodeNum];
                BestPath.NodeCount = SourceNodeCount;
                BestPath.Nodes = new PathfinderNode[BestPath.NodeCount];
                for ( B = 0; B <= BestPath.NodeCount - 1; B++ )
                {
                    BestPath.Nodes[B] = Args.SourceNodes[SourceNodeCount - B - 1];
                }
            }
        }
Example #3
0
        public void FloodForValues(ref sFloodForValuesArgs Args)
        {
            var   CurrentNode     = default(PathfinderNode);
            var   ConnectedNode   = default(PathfinderNode);
            var   A               = 0;
            var   SourceNodeCount = 0;
            var   SourceNodeNum   = 0;
            var   tmpConnection   = default(PathfinderConnection);
            float ResultValue     = 0;
            var   BestPath        = default(Path);
            var   StartNode       = default(PathfinderNode);
            var   B               = 0;
            float BestDist        = 0;
            float Dist            = 0;
            var   BestNode        = default(PathfinderNode);
            var   C               = 0;

            StartNode = Args.CurrentPath.Nodes[0];

            Args.SourceNodes[0] = StartNode;
            SourceNodeCount     = 1;
            Args.NodeValues[StartNode.Layer_NodeNum] = 0.0F;

            SourceNodeNum = 0;
            while (SourceNodeNum < SourceNodeCount)
            {
                CurrentNode = Args.SourceNodes[SourceNodeNum];
                for (A = 0; A <= CurrentNode.ConnectionCount - 1; A++)
                {
                    tmpConnection = CurrentNode.Connections[A];
                    ConnectedNode = tmpConnection.GetOtherNode(CurrentNode);
                    if (ConnectedNode.ParentNode == Args.SourceParentNodeA || ConnectedNode.ParentNode == Args.SourceParentNodeB)
                    {
                        ResultValue = Args.NodeValues[CurrentNode.Layer_NodeNum] + tmpConnection.Value;
                        if (ResultValue < Args.NodeValues[ConnectedNode.Layer_NodeNum])
                        {
                            Args.NodeValues[ConnectedNode.Layer_NodeNum] = ResultValue;
                            Args.SourceNodes[SourceNodeCount]            = ConnectedNode;
                            SourceNodeCount++;
                        }
                    }
                }
                SourceNodeNum++;
            }

            for (A = 0; A <= Args.FinishNodeCount - 1; A++)
            {
                if (Args.FinishIsParent)
                {
                    BestNode = null;
                    BestDist = float.MaxValue;
                    for (C = 0; C <= Args.FinishNodes[A].NodeCount - 1; C++)
                    {
                        CurrentNode = Args.FinishNodes[A].Nodes[C];
                        Dist        = Args.NodeValues[CurrentNode.Layer_NodeNum];
                        if (Dist < BestDist)
                        {
                            BestDist = Dist;
                            BestNode = CurrentNode;
                        }
                    }
                    CurrentNode = BestNode;
                }
                else
                {
                    CurrentNode = Args.FinishNodes[A];
                }
                if (CurrentNode == null)
                {
                    //no path
                    return;
                }
                SourceNodeCount = 0;
                BestDist        = Args.NodeValues[CurrentNode.Layer_NodeNum];
                if (BestDist == float.MaxValue)
                {
                    //no path
                    return;
                }
                do
                {
                    Args.SourceNodes[SourceNodeCount] = CurrentNode;
                    SourceNodeCount++;
                    if (CurrentNode == StartNode)
                    {
                        break;
                    }
                    BestNode = null;
                    for (B = 0; B <= CurrentNode.ConnectionCount - 1; B++)
                    {
                        tmpConnection = CurrentNode.Connections[B];
                        ConnectedNode = tmpConnection.GetOtherNode(CurrentNode);
                        if (ConnectedNode.ParentNode == Args.SourceParentNodeA || ConnectedNode.ParentNode == Args.SourceParentNodeB)
                        {
                            Dist = Args.NodeValues[ConnectedNode.Layer_NodeNum];
                            if (Dist < BestDist)
                            {
                                BestDist = Dist;
                                BestNode = ConnectedNode;
                            }
                        }
                    }
                    if (BestNode == null)
                    {
                        Args.BestPaths[A] = null;
                        //no path
                        return;
                    }
                    CurrentNode = BestNode;
                } while (true);

                BestPath           = new Path();
                Args.BestPaths[A]  = BestPath;
                BestPath.Value     = Args.NodeValues[Args.FinishNodes[A].Layer_NodeNum];
                BestPath.NodeCount = SourceNodeCount;
                BestPath.Nodes     = new PathfinderNode[BestPath.NodeCount];
                for (B = 0; B <= BestPath.NodeCount - 1; B++)
                {
                    BestPath.Nodes[B] = Args.SourceNodes[SourceNodeCount - B - 1];
                }
            }
        }