public static void GenerateCave(int x, WorldData worldData) { int depth = 0; Vector2i surface = TerrainUtilities.FindUpperMostTile(x, worldData, type => type != TileType.Empty); int y = Random.Range(surface.Y, worldData.Height); do { if (!(Random.value < caveContinuationChance)) { continue; } depth++; TerrainUtilities.GenerateFuzzyCircle(minimumCaveSize, maximumCaveSize, worldData, new Vector2i(x, y), TileType.Empty); //Logger.Log("TerrainCaveProcessor", string.Format("Generated cave at ({0}, {1}). Current depth: {2}", x * Chunk.Size, y * Chunk.Size, depth)); float angle = Random.value * MathHelper.Tau; Vector2 direction = new Vector2((float)Math.Cos(angle), (float)-Math.Sin(angle)); int step = Random.Range(minimumCaveSize, maximumCaveSize); x += (int)Math.Floor(direction.x * step); y += (int)Math.Floor(direction.y * step); }while (depth < maximumCaveDepth); }
public void GeneratePrairie(int startX, WorldData worldData) { int size = Random.Range(minimumSize, maximumSize); int endX = startX + size; Vector2i spotPosition = TerrainUtilities.FindUpperMostTile(startX, worldData, type => type != TileType.Empty); for (int x = 0; x < size; x++) { int nx = x + endX; TileType tileAt = worldData.GetTileTypeAt(nx, spotPosition.Y); if (tileAt == TileType.Empty) { continue; } endX = nx; break; } if (worldData.GetTileTypeAt(endX, spotPosition.Y) == TileType.Empty) { return; } int offset = 0; int offsetSwitch = 0; int offsetRate = 0; for (int x = startX; x < endX; x++) { for (int y = spotPosition.Y; y < worldData.Height; y++) { TileType tileAt = worldData.GetTileTypeAt(x, y + offset); if (tileAt == TileType.Empty) { worldData.SetTileTypeAt(x, y + offset, TileType.NonEmpty); } else { break; } } if (offsetSwitch >= offsetRate) { offsetSwitch = 0; offsetRate = Random.Range(minimumOffsetSwitchRate, maximumOffsetSwitchRate); offset = Random.Range(minimumOffset, maximumOffset); } else { offsetSwitch++; } } }
private static void GenerateCanyon(int startX, WorldData worldData) { int steps = Random.Range(minimumCanyonSteps, maximumCanyonSteps); int currentX = startX; for (int i = 0; i < steps; i++) { int radius = Random.Range(minimumCanyonSize, maximumCanyonSize); int pivot = Random.Range(-radius, radius); int x = currentX + pivot; Vector2i spot = TerrainUtilities.FindUpperMostTile(x, worldData, type => type != TileType.Empty); TerrainUtilities.GenerateFuzzyCircle(minimumCanyonSize, maximumCanyonSize, worldData, spot, TileType.Empty); currentX = x; } }
private static void GenerateValley(int startX, WorldData worldData) { int steps = Random.Range(minimumValleySteps, maximumValleySteps); int currentX = startX; for (int i = 0; i < steps; i++) { int radius = Random.Range(minimumValleySize, maximumValleySize); int pivot = Random.Range(-radius, radius); int x = currentX + pivot; Vector2i spot = TerrainUtilities.FindUpperMostTile(x, worldData, type => type != TileType.Empty); TileType spotType = Random.value < valleyExtrusionChance ? TileType.NonEmpty : TileType.Empty; TerrainUtilities.GenerateFuzzyCircle(minimumValleySize, maximumValleySize, worldData, spot, spotType); currentX = x; } }