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; } }
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); }