public override void Apply(TilemapStructure tilemap) { _random = new System.Random(tilemap.Grid.Seed); // Re-create the heightmap from our tilemap var heightmap = Noise.GenerateNoiseMap(tilemap.Width, tilemap.Height, tilemap.Grid.Seed, GroundHeightmap.NoiseScale, GroundHeightmap.Octaves, GroundHeightmap.Persistance, GroundHeightmap.Lacunarity, GroundHeightmap.Offset); if (GroundHeightmap.ApplyIslandGradient) { var islandGradient = Noise.GenerateIslandGradientMap(tilemap.Width, tilemap.Height); for (int x = 0, y; x < tilemap.Width; x++) { for (y = 0; y < tilemap.Height; y++) { // Subtract the islandGradient value from the noiseMap value float subtractedValue = heightmap[y * tilemap.Width + x] - islandGradient[y * tilemap.Width + x]; // Apply it into the map, but make sure we clamp it between 0f and 1f heightmap[y * tilemap.Width + x] = Mathf.Clamp01(subtractedValue); } } } // Get all start positions var validStartPositions = TilemapHelper.GetTilesByType(tilemap, StartingTileTypes.Select(a => (int)a)); var amountOfRivers = _random.Next(MinRiverQuota, MaxRiverQuota + 1); var rivers = new List <DownstreamRiver>(); for (int i = 0; i < amountOfRivers; i++) { // Get valid startPoint with respect to distance between existing rivers var startPoint = GetValidStartPosition(validStartPositions, rivers); if (!startPoint.HasValue) { break; } // Build river from start based on heightmap var river = new DownstreamRiver(startPoint.Value); if (river.Build(tilemap, heightmap)) { rivers.Add(river); } } // Set river tiles into tilemap int riverTileId = (int)GroundTileType.River; foreach (var riverPosition in rivers.SelectMany(a => a.RiverPositions)) { tilemap.SetTile(riverPosition.x, riverPosition.y, riverTileId); } }
public override void Apply(TilemapStructure tilemap) { _random = new System.Random(tilemap.Grid.Seed); var rivers = new List <DrunkenRiver>(); var validStartPositions = TilemapHelper.GetTilesByType(tilemap, StartingTileTypes.Select(a => (int)a)); var amountOfRivers = _random.Next(MinRiverQuota, MaxRiverQuota + 1); for (int i = 0; i < amountOfRivers; i++) { // Get valid startPoint with respect to distance between existing rivers var startPoint = GetValidStartPosition(validStartPositions, rivers); if (!startPoint.HasValue) { break; } // Find valid endPos (closest deep water tile to startPos) var endPos = TilemapHelper.FindClosestTileByType(tilemap, startPoint.Value, (int)GroundTileType.DeepWater); if (!endPos.HasValue) { break; } // Build river from start to end position var river = new DrunkenRiver(_random, RiverDriftChance, startPoint.Value, endPos.Value); if (river.Build()) { rivers.Add(river); } } // Set river tiles into tilemap int riverTileId = (int)GroundTileType.River; foreach (var riverPosition in rivers.SelectMany(a => a.RiverPositions)) { tilemap.SetTile(riverPosition.x, riverPosition.y, riverTileId); } }