private static void CreateLinks(int cell, NavTable nav_table, int max_links_per_cell, NavGrid.Link[] links, NavGrid.Transition[][] transitions_by_nav_type)
    {
        int num  = cell * max_links_per_cell;
        int num2 = 0;

        for (int i = 0; i < 10; i++)
        {
            NavType nav_type           = (NavType)i;
            NavGrid.Transition[] array = transitions_by_nav_type[i];
            if (array != null && nav_table.IsValid(cell, nav_type))
            {
                NavGrid.Transition[] array2 = array;
                for (int j = 0; j < array2.Length; j++)
                {
                    NavGrid.Transition transition = array2[j];
                    int num3 = transition.IsValid(cell, nav_table);
                    if (num3 != Grid.InvalidCell)
                    {
                        links[num] = new NavGrid.Link(num3, transition.start, transition.end, transition.id, transition.cost);
                        num++;
                        num2++;
                    }
                }
            }
        }
        if (num2 >= max_links_per_cell)
        {
            Debug.LogError("Out of nav links. Need to increase maxLinksPerCell:" + max_links_per_cell);
        }
        links[num].link = Grid.InvalidCell;
    }
 public NavGraph(int cell_count, NavGrid nav_grid)
 {
     grid = new HandleVector <NavGraphEdge> .Handle[nav_grid.maxLinksPerCell * cell_count];
     for (int i = 0; i < grid.Length; i++)
     {
         grid[i] = HandleVector <NavGraphEdge> .InvalidHandle;
     }
     edges = new HandleVector <NavGraphEdge>(cell_count);
     for (int j = 0; j < cell_count; j++)
     {
         int          num  = j * nav_grid.maxLinksPerCell;
         NavGrid.Link link = nav_grid.Links[num];
         while (link.link != NavGrid.InvalidHandle)
         {
             NavGraphEdge item = new NavGraphEdge
             {
                 startNavType = link.startNavType,
                 endNavType   = link.endNavType,
                 endCell      = link.link,
                 startCell    = j
             };
             HandleVector <NavGraphEdge> .Handle handle = edges.Add(item);
             grid[num] = handle;
             num++;
             link = nav_grid.Links[num];
         }
         grid[num] = HandleVector <NavGraphEdge> .InvalidHandle;
     }
 }
예제 #3
0
 public override int GetSubmergedPathCostPenalty(PathFinder.PotentialPath path, NavGrid.Link link)
 {
     if (!path.HasAnyFlag(PathFinder.PotentialPath.Flags.HasAtmoSuit | PathFinder.PotentialPath.Flags.HasJetPack))
     {
         return(link.cost * 2);
     }
     return(0);
 }
 public static bool ValidatePath(NavGrid nav_grid, PathFinderAbilities abilities, ref Path path)
 {
     if (!path.IsValid())
     {
         return(false);
     }
     for (int i = 0; i < path.nodes.Count; i++)
     {
         Path.Node node = path.nodes[i];
         if (i < path.nodes.Count - 1)
         {
             Path.Node    node2 = path.nodes[i + 1];
             int          num   = node.cell * nav_grid.maxLinksPerCell;
             bool         flag  = false;
             NavGrid.Link link  = nav_grid.Links[num];
             while (link.link != InvalidHandle)
             {
                 if (link.link == node2.cell && node2.navType == link.endNavType && node.navType == link.startNavType)
                 {
                     PotentialPath path2 = new PotentialPath(node.cell, node.navType, PotentialPath.Flags.None);
                     flag = abilities.TraversePath(ref path2, node.cell, node.navType, 0, link.transitionId, 0);
                     if (flag)
                     {
                         break;
                     }
                 }
                 num++;
                 link = nav_grid.Links[num];
             }
             if (!flag)
             {
                 return(false);
             }
         }
     }
     return(true);
 }
    public static void AddPotentials(PotentialScratchPad potential_scratch_pad, PotentialPath potential, int cost, int underwater_cost, ref PathFinderAbilities abilities, PathFinderQuery query, int max_links_per_cell, NavGrid.Link[] links, PotentialList potentials, PathGrid path_grid, int parent_cell, NavType parent_nav_type)
    {
        int num = 0;

        NavGrid.Link[] linksWithCorrectNavType = potential_scratch_pad.linksWithCorrectNavType;
        int            num2 = potential.cell * max_links_per_cell;

        NavGrid.Link link = links[num2];
        for (int link2 = link.link; link2 != InvalidHandle; link2 = link.link)
        {
            if (link.startNavType == potential.navType && (parent_cell != link2 || parent_nav_type != link.startNavType))
            {
                linksWithCorrectNavType[num++] = link;
            }
            num2++;
            link = links[num2];
        }
        int num4 = 0;

        PotentialScratchPad.PathGridCellData[] linksInCellRange = potential_scratch_pad.linksInCellRange;
        for (int i = 0; i < num; i++)
        {
            NavGrid.Link link3            = linksWithCorrectNavType[i];
            int          link4            = link3.link;
            bool         is_cell_in_range = false;
            Cell         cell             = path_grid.GetCell(link4, link3.endNavType, out is_cell_in_range);
            if (is_cell_in_range)
            {
                int  num5  = cost + link3.cost;
                bool flag  = cell.cost == -1;
                bool flag2 = num5 < cell.cost;
                if (flag || flag2)
                {
                    linksInCellRange[num4++] = new PotentialScratchPad.PathGridCellData
                    {
                        pathGridCell = cell,
                        link         = link3
                    };
                }
            }
        }
        for (int j = 0; j < num4; j++)
        {
            PotentialScratchPad.PathGridCellData pathGridCellData = linksInCellRange[j];
            NavGrid.Link link5 = pathGridCellData.link;
            int          link6 = link5.link;
            pathGridCellData.isSubmerged = IsSubmerged(link6);
            linksInCellRange[j]          = pathGridCellData;
        }
        for (int k = 0; k < num4; k++)
        {
            PotentialScratchPad.PathGridCellData pathGridCellData2 = linksInCellRange[k];
            NavGrid.Link  link7     = pathGridCellData2.link;
            int           link8     = link7.link;
            Cell          cell_data = pathGridCellData2.pathGridCell;
            int           num7      = cost + link7.cost;
            PotentialPath path      = potential;
            path.cell    = link8;
            path.navType = link7.endNavType;
            int underwater_cost2;
            if (pathGridCellData2.isSubmerged)
            {
                underwater_cost2 = underwater_cost + 1;
                int submergedPathCostPenalty = abilities.GetSubmergedPathCostPenalty(path, link7);
                num7 += submergedPathCostPenalty;
            }
            else
            {
                underwater_cost2 = 0;
            }
            PotentialPath.Flags flags = path.flags;
            bool flag3 = abilities.TraversePath(ref path, potential.cell, potential.navType, num7, link7.transitionId, underwater_cost2);
            if (path.flags != flags)
            {
                KProfiler.AddEvent("NavChange");
            }
            if (flag3)
            {
                AddPotential(path, potential.cell, potential.navType, num7, underwater_cost2, link7.transitionId, potentials, path_grid, ref cell_data);
            }
        }
    }
 public virtual int GetSubmergedPathCostPenalty(PathFinder.PotentialPath path, NavGrid.Link link)
 {
     return(0);
 }