private static int FindRandomStartingTileBasedOnExitDir(int tileID, Direction8Way 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) && grid.GetDirection8WayFromTo(tileID, num) == exitDir) { tileCandidates.Add(num); } } if (tileCandidates.TryRandomElement(out int result)) { return(result); } if (tmpNeighbors.Where(IsGoodCaravanStartingTile).TryRandomElement(out result)) { return(result); } return(tileID); }
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, Direction8Way 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 (grid.GetDirection8WayFromTo(tileID, num) == exitDir) { CaravanExitMapUtility.tileCandidates.Add(num); } } } int result; if (CaravanExitMapUtility.tileCandidates.TryRandomElement(out result)) { return(result); } if (CaravanExitMapUtility.tmpNeighbors.Where(new Func <int, bool>(CaravanExitMapUtility.IsGoodCaravanStartingTile)).TryRandomElement(out result)) { return(result); } return(tileID); }
public static void Erode(List <int> tiles, int count, Predicate <int> extraPredicate = null) { if (count <= 0) { return; } WorldGrid worldGrid = Find.WorldGrid; GenPlanetMorphology.tilesSet.Clear(); GenPlanetMorphology.tilesSet.AddRange(tiles); GenPlanetMorphology.tmpEdgeTiles.Clear(); for (int i = 0; i < tiles.Count; i++) { worldGrid.GetTileNeighbors(tiles[i], GenPlanetMorphology.tmpNeighbors); for (int j = 0; j < GenPlanetMorphology.tmpNeighbors.Count; j++) { if (!GenPlanetMorphology.tilesSet.Contains(GenPlanetMorphology.tmpNeighbors[j])) { GenPlanetMorphology.tmpEdgeTiles.Add(tiles[i]); break; } } } if (!GenPlanetMorphology.tmpEdgeTiles.Any <int>()) { return; } GenPlanetMorphology.tmpOutput.Clear(); Predicate <int> predicate; if (extraPredicate != null) { predicate = ((int x) => GenPlanetMorphology.tilesSet.Contains(x) && extraPredicate(x)); } else { predicate = ((int x) => GenPlanetMorphology.tilesSet.Contains(x)); } WorldFloodFiller arg_13F_0 = Find.WorldFloodFiller; int rootTile = -1; Predicate <int> passCheck = predicate; Func <int, int, bool> processor = delegate(int tile, int traversalDist) { if (traversalDist >= count) { GenPlanetMorphology.tmpOutput.Add(tile); } return(false); }; List <int> extraRootTiles = GenPlanetMorphology.tmpEdgeTiles; arg_13F_0.FloodFill(rootTile, passCheck, processor, 2147483647, extraRootTiles); tiles.Clear(); tiles.AddRange(GenPlanetMorphology.tmpOutput); }
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 static void Erode(List <int> tiles, int count, Predicate <int> extraPredicate = null) { if (count > 0) { WorldGrid worldGrid = Find.WorldGrid; GenPlanetMorphology.tilesSet.Clear(); GenPlanetMorphology.tilesSet.AddRange(tiles); GenPlanetMorphology.tmpEdgeTiles.Clear(); for (int i = 0; i < tiles.Count; i++) { worldGrid.GetTileNeighbors(tiles[i], GenPlanetMorphology.tmpNeighbors); int num = 0; while (num < GenPlanetMorphology.tmpNeighbors.Count) { if (GenPlanetMorphology.tilesSet.Contains(GenPlanetMorphology.tmpNeighbors[num])) { num++; continue; } GenPlanetMorphology.tmpEdgeTiles.Add(tiles[i]); break; } } if (GenPlanetMorphology.tmpEdgeTiles.Any()) { GenPlanetMorphology.tmpOutput.Clear(); Predicate <int> predicate = (extraPredicate == null) ? ((Predicate <int>)((int x) => GenPlanetMorphology.tilesSet.Contains(x))) : ((Predicate <int>)((int x) => GenPlanetMorphology.tilesSet.Contains(x) && extraPredicate(x))); WorldFloodFiller worldFloodFiller = Find.WorldFloodFiller; int rootTile = -1; Predicate <int> passCheck = predicate; Func <int, int, bool> processor = delegate(int tile, int traversalDist) { if (traversalDist >= count) { GenPlanetMorphology.tmpOutput.Add(tile); } return(false); }; List <int> extraRootTiles = GenPlanetMorphology.tmpEdgeTiles; worldFloodFiller.FloodFill(rootTile, passCheck, processor, 2147483647, extraRootTiles); tiles.Clear(); tiles.AddRange(GenPlanetMorphology.tmpOutput); } } }
public static void Erode(List <int> tiles, int count, Predicate <int> extraPredicate = null) { if (count <= 0) { return; } WorldGrid worldGrid = Find.WorldGrid; tilesSet.Clear(); tilesSet.AddRange(tiles); tmpEdgeTiles.Clear(); for (int i = 0; i < tiles.Count; i++) { worldGrid.GetTileNeighbors(tiles[i], tmpNeighbors); for (int j = 0; j < tmpNeighbors.Count; j++) { if (!tilesSet.Contains(tmpNeighbors[j])) { tmpEdgeTiles.Add(tiles[i]); break; } } } if (!tmpEdgeTiles.Any()) { return; } tmpOutput.Clear(); Predicate <int> passCheck = ((extraPredicate == null) ? ((Predicate <int>)((int x) => tilesSet.Contains(x))) : ((Predicate <int>)((int x) => tilesSet.Contains(x) && extraPredicate(x)))); Find.WorldFloodFiller.FloodFill(-1, passCheck, delegate(int tile, int traversalDist) { if (traversalDist >= count) { tmpOutput.Add(tile); } return(false); }, int.MaxValue, tmpEdgeTiles); tiles.Clear(); tiles.AddRange(tmpOutput); }
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)) { GetExitMapEdges(grid, currentTileID, num, out Rot4 primary, out Rot4 secondary); if (((primary != Rot4.Invalid && CellFinder.TryFindRandomEdgeCellWith((IntVec3 x) => x.Walkable(map) && !x.Fogged(map), map, primary, CellFinder.EdgeRoadChance_Ignore, out IntVec3 result)) || (secondary != Rot4.Invalid && CellFinder.TryFindRandomEdgeCellWith((IntVec3 x) => x.Walkable(map) && !x.Fogged(map), map, secondary, CellFinder.EdgeRoadChance_Ignore, out result))) && !retTiles.Contains(num)) { retTiles.Add(num); } } } retTiles.SortBy((int x) => grid.GetHeadingFromTo(currentTileID, x)); return(retTiles); }
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); }
private static int FindRandomStartingTileBasedOnExitDir(int tileID, Direction8Way 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 (grid.GetDirection8WayFromTo(tileID, num) == exitDir) { CaravanExitMapUtility.tileCandidates.Add(num); } } } int num2; int result; if (CaravanExitMapUtility.tileCandidates.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); }
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 void GeneratePaths(LayerSubMesh subMesh, int tileID, List <OutputDirection> nodes, Color32 color, bool allowSmoothTransition) { WorldGrid worldGrid = Find.WorldGrid; worldGrid.GetTileVertices(tileID, tmpVerts); worldGrid.GetTileNeighbors(tileID, tmpNeighbors); if (nodes.Count == 1 && pointyEnds) { int count = subMesh.verts.Count; AddPathEndpoint(subMesh, tmpVerts, tmpNeighbors.IndexOf(nodes[0].neighbor), color, tileID, nodes[0]); subMesh.verts.Add(FinalizePoint(worldGrid.GetTileCenter(tileID), nodes[0].distortionFrequency, nodes[0].distortionIntensity)); subMesh.colors.Add(color.MutateAlpha(0)); subMesh.tris.Add(count); subMesh.tris.Add(count + 3); subMesh.tris.Add(count + 1); subMesh.tris.Add(count + 1); subMesh.tris.Add(count + 3); subMesh.tris.Add(count + 2); return; } if (nodes.Count == 2) { int count2 = subMesh.verts.Count; int num = tmpNeighbors.IndexOf(nodes[0].neighbor); int num2 = tmpNeighbors.IndexOf(nodes[1].neighbor); if (allowSmoothTransition && Mathf.Abs(num - num2) > 1 && Mathf.Abs((num - num2 + tmpVerts.Count) % tmpVerts.Count) > 1) { AddPathEndpoint(subMesh, tmpVerts, num, color, tileID, nodes[0]); AddPathEndpoint(subMesh, tmpVerts, num2, color, tileID, nodes[1]); subMesh.tris.Add(count2); subMesh.tris.Add(count2 + 5); subMesh.tris.Add(count2 + 1); subMesh.tris.Add(count2 + 5); subMesh.tris.Add(count2 + 4); subMesh.tris.Add(count2 + 1); subMesh.tris.Add(count2 + 1); subMesh.tris.Add(count2 + 4); subMesh.tris.Add(count2 + 2); subMesh.tris.Add(count2 + 4); subMesh.tris.Add(count2 + 3); subMesh.tris.Add(count2 + 2); return; } } float num3 = 0f; for (int i = 0; i < nodes.Count; i++) { num3 = Mathf.Max(num3, nodes[i].width); } Vector3 tileCenter = worldGrid.GetTileCenter(tileID); tmpHexVerts.Clear(); for (int j = 0; j < tmpVerts.Count; j++) { tmpHexVerts.Add(FinalizePoint(Vector3.LerpUnclamped(tileCenter, tmpVerts[j], num3 * 0.5f * 2f), 0f, 0f)); } tileCenter = FinalizePoint(tileCenter, 0f, 0f); int count3 = subMesh.verts.Count; subMesh.verts.Add(tileCenter); subMesh.colors.Add(color); int count4 = subMesh.verts.Count; for (int k = 0; k < tmpHexVerts.Count; k++) { subMesh.verts.Add(tmpHexVerts[k]); subMesh.colors.Add(color.MutateAlpha(0)); subMesh.tris.Add(count3); subMesh.tris.Add(count4 + (k + 1) % tmpHexVerts.Count); subMesh.tris.Add(count4 + k); } for (int l = 0; l < nodes.Count; l++) { if (nodes[l].width != 0f) { int count5 = subMesh.verts.Count; int num4 = tmpNeighbors.IndexOf(nodes[l].neighbor); AddPathEndpoint(subMesh, tmpVerts, num4, color, tileID, nodes[l]); subMesh.tris.Add(count5); subMesh.tris.Add(count4 + (num4 + tmpHexVerts.Count - 1) % tmpHexVerts.Count); subMesh.tris.Add(count3); subMesh.tris.Add(count5); subMesh.tris.Add(count3); subMesh.tris.Add(count5 + 1); subMesh.tris.Add(count5 + 1); subMesh.tris.Add(count3); subMesh.tris.Add(count5 + 2); subMesh.tris.Add(count3); subMesh.tris.Add(count4 + (num4 + 2) % tmpHexVerts.Count); subMesh.tris.Add(count5 + 2); } } }
public void GeneratePaths(LayerSubMesh subMesh, int tileID, List <OutputDirection> nodes, Color32 color, bool allowSmoothTransition) { WorldGrid worldGrid = Find.WorldGrid; worldGrid.GetTileVertices(tileID, tmpVerts); worldGrid.GetTileNeighbors(tileID, tmpNeighbors); if (nodes.Count == 1 && pointyEnds) { int count = subMesh.verts.Count; List <Vector3> verts = tmpVerts; List <int> list = tmpNeighbors; OutputDirection outputDirection = nodes[0]; AddPathEndpoint(subMesh, verts, list.IndexOf(outputDirection.neighbor), color, tileID, nodes[0]); List <Vector3> verts2 = subMesh.verts; Vector3 tileCenter = worldGrid.GetTileCenter(tileID); OutputDirection outputDirection2 = nodes[0]; float distortionFrequency = outputDirection2.distortionFrequency; OutputDirection outputDirection3 = nodes[0]; verts2.Add(FinalizePoint(tileCenter, distortionFrequency, outputDirection3.distortionIntensity)); subMesh.colors.Add(color.MutateAlpha(0)); subMesh.tris.Add(count); subMesh.tris.Add(count + 3); subMesh.tris.Add(count + 1); subMesh.tris.Add(count + 1); subMesh.tris.Add(count + 3); subMesh.tris.Add(count + 2); } else { if (nodes.Count == 2) { int count2 = subMesh.verts.Count; List <int> list2 = tmpNeighbors; OutputDirection outputDirection4 = nodes[0]; int num = list2.IndexOf(outputDirection4.neighbor); List <int> list3 = tmpNeighbors; OutputDirection outputDirection5 = nodes[1]; int num2 = list3.IndexOf(outputDirection5.neighbor); if (allowSmoothTransition && Mathf.Abs(num - num2) > 1 && Mathf.Abs((num - num2 + tmpVerts.Count) % tmpVerts.Count) > 1) { AddPathEndpoint(subMesh, tmpVerts, num, color, tileID, nodes[0]); AddPathEndpoint(subMesh, tmpVerts, num2, color, tileID, nodes[1]); subMesh.tris.Add(count2); subMesh.tris.Add(count2 + 5); subMesh.tris.Add(count2 + 1); subMesh.tris.Add(count2 + 5); subMesh.tris.Add(count2 + 4); subMesh.tris.Add(count2 + 1); subMesh.tris.Add(count2 + 1); subMesh.tris.Add(count2 + 4); subMesh.tris.Add(count2 + 2); subMesh.tris.Add(count2 + 4); subMesh.tris.Add(count2 + 3); subMesh.tris.Add(count2 + 2); return; } } float num3 = 0f; for (int i = 0; i < nodes.Count; i++) { float a = num3; OutputDirection outputDirection6 = nodes[i]; num3 = Mathf.Max(a, outputDirection6.width); } Vector3 tileCenter2 = worldGrid.GetTileCenter(tileID); tmpHexVerts.Clear(); for (int j = 0; j < tmpVerts.Count; j++) { tmpHexVerts.Add(FinalizePoint(Vector3.LerpUnclamped(tileCenter2, tmpVerts[j], num3 * 0.5f * 2f), 0f, 0f)); } tileCenter2 = FinalizePoint(tileCenter2, 0f, 0f); int count3 = subMesh.verts.Count; subMesh.verts.Add(tileCenter2); subMesh.colors.Add(color); int count4 = subMesh.verts.Count; for (int k = 0; k < tmpHexVerts.Count; k++) { subMesh.verts.Add(tmpHexVerts[k]); subMesh.colors.Add(color.MutateAlpha(0)); subMesh.tris.Add(count3); subMesh.tris.Add(count4 + (k + 1) % tmpHexVerts.Count); subMesh.tris.Add(count4 + k); } for (int l = 0; l < nodes.Count; l++) { OutputDirection outputDirection7 = nodes[l]; if (outputDirection7.width != 0f) { int count5 = subMesh.verts.Count; List <int> list4 = tmpNeighbors; OutputDirection outputDirection8 = nodes[l]; int num4 = list4.IndexOf(outputDirection8.neighbor); AddPathEndpoint(subMesh, tmpVerts, num4, color, tileID, nodes[l]); subMesh.tris.Add(count5); subMesh.tris.Add(count4 + (num4 + tmpHexVerts.Count - 1) % tmpHexVerts.Count); subMesh.tris.Add(count3); subMesh.tris.Add(count5); subMesh.tris.Add(count3); subMesh.tris.Add(count5 + 1); subMesh.tris.Add(count5 + 1); subMesh.tris.Add(count3); subMesh.tris.Add(count5 + 2); subMesh.tris.Add(count3); subMesh.tris.Add(count4 + (num4 + 2) % tmpHexVerts.Count); subMesh.tris.Add(count5 + 2); } } } }