コード例 #1
0
 private void DetermineStartRegions(IntVec3 start)
 {
     startingRegions.Clear();
     if (pathGrid.WalkableFast(start))
     {
         VehicleRegion validRegionAt = regionGrid.GetValidRegionAt(start);
         QueueNewOpenRegion(validRegionAt);
         startingRegions.Add(validRegionAt);
     }
     else
     {
         for (int i = 0; i < 8; i++)
         {
             IntVec3 c = start + GenAdj.AdjacentCells[i];
             if (c.InBoundsShip(map))
             {
                 if (pathGrid.WalkableFast(c))
                 {
                     VehicleRegion validRegionAt2 = regionGrid.GetValidRegionAt(c);
                     if (!(validRegionAt2 is null) && validRegionAt2.reachedIndex != reachedIndex)
                     {
                         QueueNewOpenRegion(validRegionAt2);
                         startingRegions.Add(validRegionAt2);
                     }
                 }
             }
         }
     }
 }
コード例 #2
0
        private List <int> PathableNeighborIndices(int index)
        {
            tmpPathableNeighborIndices.Clear();
            VehiclePathGrid pathGrid = mapE.VehiclePathGrid;
            int             x        = map.Size.x;
            bool            flag     = index % x > 0;
            bool            flag2    = index % x < x - 1;
            bool            flag3    = index >= x;
            bool            flag4    = index / x < map.Size.z - 1;

            if (flag3 && pathGrid.WalkableFast(index - x))
            {
                tmpPathableNeighborIndices.Add(index - x);
            }
            if (flag2 && pathGrid.WalkableFast(index + 1))
            {
                tmpPathableNeighborIndices.Add(index + 1);
            }
            if (flag && pathGrid.WalkableFast(index - 1))
            {
                tmpPathableNeighborIndices.Add(index - 1);
            }
            if (flag4 && pathGrid.WalkableFast(index + x))
            {
                tmpPathableNeighborIndices.Add(index + x);
            }
            bool flag5 = !flag || VehiclePathFinder.BlocksDiagonalMovement(map, index - 1);
            bool flag6 = !flag2 || VehiclePathFinder.BlocksDiagonalMovement(map, index + 1);

            if (flag3 && !VehiclePathFinder.BlocksDiagonalMovement(map, index - x))
            {
                if (!flag6 && pathGrid.WalkableFast(index - x + 1))
                {
                    tmpPathableNeighborIndices.Add(index - x + 1);
                }
                if (!flag5 && pathGrid.WalkableFast(index - x - 1))
                {
                    tmpPathableNeighborIndices.Add(index - x - 1);
                }
            }
            if (flag4 && !VehiclePathFinder.BlocksDiagonalMovement(map, index + x))
            {
                if (!flag6 && pathGrid.WalkableFast(index + x + 1))
                {
                    tmpPathableNeighborIndices.Add(index + x + 1);
                }
                if (!flag5 && pathGrid.WalkableFast(index + x - 1))
                {
                    tmpPathableNeighborIndices.Add(index + x - 1);
                }
            }
            return(tmpPathableNeighborIndices);
        }
コード例 #3
0
        private bool CheckCellBasedReachability(IntVec3 start, LocalTargetInfo dest, PathEndMode peMode, TraverseParms traverseParms)
        {
            IntVec3 foundCell = IntVec3.Invalid;

            VehicleRegion[] directionRegionGrid = regionGrid.DirectGrid;
            VehiclePathGrid pathGrid            = map.GetCachedMapComponent <VehicleMapping>().VehiclePathGrid;
            CellIndices     cellIndices         = map.cellIndices;

            map.floodFiller.FloodFill(start, delegate(IntVec3 c)
            {
                int num = cellIndices.CellToIndex(c);
                if ((traverseParms.mode == TraverseMode.PassAllDestroyableThingsNotWater || traverseParms.mode == TraverseMode.NoPassClosedDoorsOrWater) &&
                    c.GetTerrain(map).IsWater)
                {
                    return(false);
                }
                if (traverseParms.mode == TraverseMode.PassAllDestroyableThings || traverseParms.mode == TraverseMode.PassAllDestroyableThingsNotWater)
                {
                    if (!pathGrid.WalkableFast(num))
                    {
                        Building edifice = c.GetEdifice(map);
                        if (edifice is null || !VehiclePathFinder.IsDestroyable(edifice))
                        {
                            return(false);
                        }
                    }
                }
                else if (traverseParms.mode != TraverseMode.NoPassClosedDoorsOrWater)
                {
                    Log.ErrorOnce("Do not use this method for non-cell based modes!", 938476762);
                    if (!pathGrid.WalkableFast(num))
                    {
                        return(false);
                    }
                }
                VehicleRegion region = directionRegionGrid[num];
                return(region is null || region.Allows(traverseParms, false));
            }, delegate(IntVec3 c)
            {
                if (VehicleReachabilityImmediate.CanReachImmediateShip(c, dest, map, peMode, traverseParms.pawn))
                {
                    foundCell = c;
                    return(true);
                }
                return(false);
            }, int.MaxValue, false, null);

            if (foundCell.IsValid)
            {
                if (CanUseCache(traverseParms.mode))
                {
                    VehicleRegion validRegionAt = regionGrid.GetValidRegionAt(foundCell);
                    if (!(validRegionAt is null))
                    {
                        foreach (VehicleRegion startRegion in startingRegions)
                        {
                            cache.AddCachedResult(startRegion.Room, validRegionAt.Room, traverseParms, true);
                        }
                    }
                }
                return(true);
            }
            if (CanUseCache(traverseParms.mode))
            {
                foreach (VehicleRegion startRegion in startingRegions)
                {
                    foreach (VehicleRegion destRegion in destRegions)
                    {
                        cache.AddCachedResult(startRegion.Room, destRegion.Room, traverseParms, false);
                    }
                }
            }
            return(false);
        }