private static int FindRandomStartingTileBasedOnExitDir(int tileID, Rot4 exitDir) { CaravanExitMapUtility.tileCandidates.Clear(); World world = Find.World; WorldGrid grid = world.grid; grid.GetTileNeighbors(tileID, CaravanExitMapUtility.tmpNeighbors); for (int i = 0; i < CaravanExitMapUtility.tmpNeighbors.Count; i++) { int num = CaravanExitMapUtility.tmpNeighbors[i]; if (CaravanExitMapUtility.IsGoodCaravanStartingTile(num)) { if (!exitDir.IsValid || !(grid.GetRotFromTo(tileID, num) != exitDir)) { CaravanExitMapUtility.tileCandidates.Add(num); } } } int num2; int result; if (CaravanExitMapUtility.tileCandidates.TryRandomElement(out num2)) { result = num2; } else if (CaravanExitMapUtility.tmpNeighbors.Where(delegate(int x) { bool result2; if (!CaravanExitMapUtility.IsGoodCaravanStartingTile(x)) { result2 = false; } else { Rot4 rotFromTo = grid.GetRotFromTo(tileID, x); result2 = (((exitDir == Rot4.North || exitDir == Rot4.South) && (rotFromTo == Rot4.East || rotFromTo == Rot4.West)) || ((exitDir == Rot4.East || exitDir == Rot4.West) && (rotFromTo == Rot4.North || rotFromTo == Rot4.South))); } return(result2); }).TryRandomElement(out num2)) { result = num2; } else if ((from x in CaravanExitMapUtility.tmpNeighbors where CaravanExitMapUtility.IsGoodCaravanStartingTile(x) select x).TryRandomElement(out num2)) { result = num2; } else { result = tileID; } return(result); }
public Rot4 CoastDirectionAt(int tileID) { if (!grid[tileID].biome.canBuildBase) { return(Rot4.Invalid); } tmpOceanDirs.Clear(); grid.GetTileNeighbors(tileID, tmpNeighbors); int i = 0; for (int count = tmpNeighbors.Count; i < count; i++) { if (grid[tmpNeighbors[i]].biome == BiomeDefOf.Ocean) { Rot4 rotFromTo = grid.GetRotFromTo(tileID, tmpNeighbors[i]); if (!tmpOceanDirs.Contains(rotFromTo)) { tmpOceanDirs.Add(rotFromTo); } } } if (tmpOceanDirs.Count == 0) { return(Rot4.Invalid); } Rand.PushState(); Rand.Seed = tileID; int index = Rand.Range(0, tmpOceanDirs.Count); Rand.PopState(); return(tmpOceanDirs[index]); }
private static int FindRandomStartingTileBasedOnExitDir(int tileID, Rot4 exitDir) { tileCandidates.Clear(); World world = Find.World; WorldGrid grid = world.grid; grid.GetTileNeighbors(tileID, tmpNeighbors); for (int i = 0; i < tmpNeighbors.Count; i++) { int num = tmpNeighbors[i]; if (IsGoodCaravanStartingTile(num) && (!exitDir.IsValid || !(grid.GetRotFromTo(tileID, num) != exitDir))) { tileCandidates.Add(num); } } if (tileCandidates.TryRandomElement(out int result)) { return(result); } if (tmpNeighbors.Where(delegate(int x) { if (!IsGoodCaravanStartingTile(x)) { return(false); } Rot4 rotFromTo = grid.GetRotFromTo(tileID, x); return(((exitDir == Rot4.North || exitDir == Rot4.South) && (rotFromTo == Rot4.East || rotFromTo == Rot4.West)) || ((exitDir == Rot4.East || exitDir == Rot4.West) && (rotFromTo == Rot4.North || rotFromTo == Rot4.South))); }).TryRandomElement(out result)) { return(result); } if (tmpNeighbors.Where((int x) => IsGoodCaravanStartingTile(x)).TryRandomElement(out result)) { return(result); } return(tileID); }
public static List <int> AvailableExitTilesAt(Map map) { retTiles.Clear(); int currentTileID = map.Tile; World world = Find.World; WorldGrid grid = world.grid; grid.GetTileNeighbors(currentTileID, tmpNeighbors); for (int i = 0; i < tmpNeighbors.Count; i++) { int num = tmpNeighbors[i]; if (IsGoodCaravanStartingTile(num)) { Rot4 rotFromTo = grid.GetRotFromTo(currentTileID, num); if (CellFinder.TryFindRandomEdgeCellWith((IntVec3 x) => x.Walkable(map) && !x.Fogged(map), map, rotFromTo, CellFinder.EdgeRoadChance_Ignore, out IntVec3 _)) { retTiles.Add(num); } } } retTiles.SortBy((int x) => grid.GetHeadingFromTo(currentTileID, x)); return(retTiles); }