Ejemplo n.º 1
0
        private void CompleteTask(PathFinderTask task, int[,] hopsMatrix, int size)
        {
            Coordinate coord = task.ClosestToGoal;
            int        row   = coord.Row;
            int        col   = coord.Col;

            List <Coordinate> path = new List <Coordinate>();

            path.Add(coord);

            int        minHops  = hopsMatrix[row, col];
            int        minRow   = 0;
            int        minCol   = 0;
            Coordinate minCoord = new Coordinate();

            while (minHops != 0)
            {
                bool canMove = false;
                for (int r = -1; r <= 1; r++)
                {
                    for (int c = -1; c <= 1; c++)
                    {
                        int s = r + c;
                        if (s != -1 && s != 1)
                        {
                            continue;
                        }

                        int prevRow = row + r;
                        int prevCol = col + c;

                        if (prevCol < 0 || prevRow < 0 || prevRow >= size || prevCol >= size)
                        {
                            continue;
                        }

                        int hops = hopsMatrix[prevRow, prevCol];
                        if (hops == (minHops - 1))
                        {
                            Coordinate prevCoord = GetCoordinate(task, prevRow, prevCol);
                            Coordinate modifiedCoord;
                            VoxelData  notUsed;
                            if (TryToMove(false, task, prevCoord, coord, out modifiedCoord, out notUsed)) //possible errors here (yes you were right... infinite loop if try to move failed?
                            {
                                minHops  = hops;
                                minRow   = prevRow;
                                minCol   = prevCol;
                                minCoord = prevCoord;
                                canMove  = true;
                            }
                        }
                    }
                }

                if (!canMove)
                {
                    //if can't move clear path
                    path.Clear();

                    for (int r = -1; r <= 1; r++)
                    {
                        for (int c = -1; c <= 1; c++)
                        {
                            int s = r + c;
                            if (s != -1 && s != 1)
                            {
                                continue;
                            }

                            int prevRow = row + r;
                            int prevCol = col + c;

                            if (prevCol < 0 || prevRow < 0 || prevRow >= size || prevCol >= size)
                            {
                                continue;
                            }

                            int hops = hopsMatrix[prevRow, prevCol];
                            if (hops == (minHops - 1))
                            {
                                //take first appropriate coordinate
                                Coordinate prevCoord = GetCoordinate(task, prevRow, prevCol);
                                minHops  = hops;
                                minRow   = prevRow;
                                minCol   = prevCol;
                                minCoord = prevCoord;
                                canMove  = true;
                                break;
                            }
                        }
                    }
                }

                if (canMove)
                {
                    row   = minRow;
                    col   = minCol;
                    coord = minCoord;

                    path.Add(coord);
                }
                else
                {
                    //if still can't move then something went wrong and infinite loop take place here
                    Debug.LogError("Infinite Loop");
                    break; //we break this loop
                }
            }

            path.Reverse();
            task.SetCompleted(path.ToArray());
        }