public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { for (int attempts = 0; attempts < 8; attempts++) { var noise = new Perlin(); noise.Seed = world.Seed - (chunk.Coordinates.X + chunk.Coordinates.Z); var offsetNoise = new ClampNoise(noise); offsetNoise.MaxValue = 3; var x = 0; var z = 0; var offset = 0.0; offset += offsetNoise.Value2D(x, z); int finalX = (int)Math.Floor(x + offset); int finalZ = (int)Math.Floor(z + offset); var y = (int)(10 + offset); var blockX = MathHelper.ChunkToBlockX(finalX, chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ(finalZ, chunk.Coordinates.Z); var spawnValue = offsetNoise.Value2D(blockX, blockZ); if (spawnValue > 1.95 && spawnValue < 2.09) { var generated = new Dungeon().GenerateAt(world, chunk, new Coordinates3D(blockX, y, blockZ)); if (generated) break; } } }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { var noise = new Perlin(); noise.Seed = world.Seed; var chanceNoise = new ClampNoise(noise); chanceNoise.MaxValue = 2; for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); var blockX = MathHelper.ChunkToBlockX(x, chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ(z, chunk.Coordinates.Z); var height = chunk.HeightMap[x * Chunk.Width + z]; if (biome.Plants.Contains(PlantSpecies.Cactus) && chanceNoise.Value2D(blockX, blockZ) > 1.7) { var blockLocation = new Coordinates3D(x, height, z); var cactiPosition = blockLocation + Coordinates3D.Up; if (chunk.GetBlockID(blockLocation).Equals(SandBlock.BlockID)) { var HeightChance = chanceNoise.Value2D(blockX, blockZ); var CactusHeight = (HeightChance < 1.4) ? 2 : 3; Decoration.GenerateColumn(chunk, cactiPosition, CactusHeight, CactusBlock.BlockID); } } } } }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { var noise = new Perlin(); noise.Seed = world.Seed; var chanceNoise = new ClampNoise(noise); chanceNoise.MaxValue = 2; for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); var blockX = MathHelper.ChunkToBlockX(x, chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ(z, chunk.Coordinates.Z); var height = chunk.HeightMap[x * Chunk.Width + z]; if (noise.Value2D(blockX, blockZ) > 0) { var blockLocation = new Coordinates3D(x, height, z); var plantPosition = blockLocation + Coordinates3D.Up; if (chunk.GetBlockID(blockLocation) == biome.SurfaceBlock && plantPosition.Y < Chunk.Height) { var chance = chanceNoise.Value2D(blockX, blockZ); if (chance < 1) { var bushNoise = chanceNoise.Value2D(blockX * 0.7, blockZ * 0.7); var grassNoise = chanceNoise.Value2D(blockX * 0.3, blockZ * 0.3); if (biome.Plants.Contains(PlantSpecies.Deadbush) && bushNoise > 1 && chunk.GetBlockID(blockLocation) == SandBlock.BlockID) { GenerateDeadBush(chunk, plantPosition); continue; } if (biome.Plants.Contains(PlantSpecies.TallGrass) && grassNoise > 0.3 && grassNoise < 0.95) { byte meta = (grassNoise > 0.3 && grassNoise < 0.45 && biome.Plants.Contains(PlantSpecies.Fern)) ? (byte)0x2 : (byte)0x1; GenerateTallGrass(chunk, plantPosition, meta); continue; } } else { var flowerTypeNoise = chanceNoise.Value2D(blockX * 1.2, blockZ * 1.2); if (biome.Plants.Contains(PlantSpecies.Rose) && flowerTypeNoise > 0.8 && flowerTypeNoise < 1.5) { GenerateRose(chunk, plantPosition); } else if (biome.Plants.Contains(PlantSpecies.Dandelion) && flowerTypeNoise <= 0.8) { GenerateDandelion(chunk, plantPosition); } } } } } } }
public StandardGenerator(bool singleBiome = false, bool enableCaves = true, byte generateBiome = (byte)Biome.Plains) { SingleBiome = singleBiome; GenerationBiome = generateBiome; EnableCaves = enableCaves; CaveNoise.Octaves = 3; CaveNoise.Amplitude = 0.05; CaveNoise.Persistance = 2; CaveNoise.Frequency = 0.05; CaveNoise.Lacunarity = 2; HighNoise.Persistance = 1; HighNoise.Frequency = 0.013; HighNoise.Amplitude = 10; HighNoise.Octaves = 2; HighNoise.Lacunarity = 2; LowNoise.Persistance = 1; LowNoise.Frequency = 0.004; LowNoise.Amplitude = 35; LowNoise.Octaves = 2; LowNoise.Lacunarity = 2.5; BottomNoise.Persistance = 0.5; BottomNoise.Frequency = 0.013; BottomNoise.Amplitude = 5; BottomNoise.Octaves = 2; BottomNoise.Lacunarity = 1.5; HighClamp = new ClampNoise(HighNoise); HighClamp.MinValue = -30; HighClamp.MaxValue = 50; LowClamp = new ClampNoise(LowNoise); LowClamp.MinValue = -30; LowClamp.MaxValue = 30; BottomClamp = new ClampNoise(BottomNoise); BottomClamp.MinValue = -20; BottomClamp.MaxValue = 5; FinalNoise = new ModifyNoise(HighClamp, LowClamp, NoiseModifier.Add); ChunkDecorators = new List<IChunkDecorator>(); ChunkDecorators.Add(new LiquidDecorator()); ChunkDecorators.Add(new OreDecorator()); ChunkDecorators.Add(new PlantDecorator()); ChunkDecorators.Add(new TreeDecorator()); ChunkDecorators.Add(new FreezeDecorator()); ChunkDecorators.Add(new CactusDecorator()); ChunkDecorators.Add(new SugarCaneDecorator()); ChunkDecorators.Add(new DungeonDecorator(GroundLevel)); }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { var noise = new Perlin(); noise.Seed = world.Seed; var chanceNoise = new ClampNoise(noise); chanceNoise.MaxValue = 1; for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); var height = chunk.HeightMap[x * Chunk.Width + z]; var blockX = MathHelper.ChunkToBlockX(x, chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ(z, chunk.Coordinates.Z); if (biome.Plants.Contains(PlantSpecies.SugarCane)) { if (noise.Value2D(blockX, blockZ) > 0.65) { var blockLocation = new Coordinates3D(x, height, z); var sugarCaneLocation = blockLocation + Coordinates3D.Up; var neighborsWater = Decoration.NeighboursBlock(chunk, blockLocation, WaterBlock.BlockID) || Decoration.NeighboursBlock(chunk, blockLocation, StationaryWaterBlock.BlockID); if (chunk.GetBlockID(blockLocation).Equals(GrassBlock.BlockID) && neighborsWater || chunk.GetBlockID(blockLocation).Equals(SandBlock.BlockID) && neighborsWater) { var random = new Random(world.Seed); double heightChance = random.NextDouble(); int caneHeight = 3; if (heightChance < 0.05) caneHeight = 4; else if (heightChance > 0.1 && height < 0.25) caneHeight = 2; Decoration.GenerateColumn(chunk, sugarCaneLocation, caneHeight, SugarcaneBlock.BlockID); } } } } } }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { Noise = new Perlin(); Noise.Seed = world.Seed; ChanceNoise = new ClampNoise(Noise); ChanceNoise.MaxValue = 2; Coordinates2D? lastTree = null; for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { var biome = biomes.GetBiome(chunk.Biomes[x * Chunk.Width + z]); var blockX = MathHelper.ChunkToBlockX(x, chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ(z, chunk.Coordinates.Z); var height = chunk.HeightMap[x * Chunk.Width + z]; if (lastTree != null && lastTree.Value.DistanceTo(new Coordinates2D(x, z)) < biome.TreeDensity) continue; if (Noise.Value2D(blockX, blockZ) > 0.3) { var location = new Coordinates3D(x, height, z); var id = chunk.GetBlockID(location); var provider = world.BlockRepository.GetBlockProvider(id); if (id == DirtBlock.BlockID || id == GrassBlock.BlockID || id == SnowfallBlock.BlockID || (id != StationaryWaterBlock.BlockID && id != WaterBlock.BlockID && id != LavaBlock.BlockID && id != StationaryLavaBlock.BlockID && provider.BoundingBox == null)) { if (provider.BoundingBox == null) location.Y--; var oakNoise = ChanceNoise.Value2D(blockX * 0.6, blockZ * 0.6); var birchNoise = ChanceNoise.Value2D(blockX * 0.2, blockZ * 0.2); var spruceNoise = ChanceNoise.Value2D(blockX * 0.35, blockZ * 0.35); var baseCoordinates = location + Coordinates3D.Up; if (biome.Trees.Contains(TreeSpecies.Oak) && oakNoise > 1.01 && oakNoise < 1.25) { var oak = new OakTree().GenerateAt(world, chunk, baseCoordinates); if (oak) { lastTree = new Coordinates2D(x, z); continue; } } if (biome.Trees.Contains(TreeSpecies.Birch) && birchNoise > 0.3 && birchNoise < 0.95) { var birch = new BirchTree().GenerateAt(world, chunk, baseCoordinates); if (birch) { lastTree = new Coordinates2D(x, z); continue; } } if (biome.Trees.Contains(TreeSpecies.Spruce) && spruceNoise < 0.75) { var random = new Random(world.Seed); var type = random.Next(1, 2); var generated = false; if (type.Equals(1)) generated = new PineTree().GenerateAt(world, chunk, baseCoordinates); else generated = new ConiferTree().GenerateAt(world, chunk, baseCoordinates); if (generated) { lastTree = new Coordinates2D(x, z); continue; } } } } } } }
public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes) { //Test Seed: 291887241 var perlin = new Perlin(); perlin.Lacunarity = 1; perlin.Amplitude = 7; perlin.Frequency = 0.015; perlin.Seed = world.Seed; var chanceNoise = new ClampNoise(perlin); var noise = new ScaledNoise(perlin); var random = new Random(world.Seed); var lowWeightOffset = new int[2] { 2, 3 }; var highWeightOffset = new int[2] { 2, 2 }; foreach (var data in Ores) { var midpoint = (data.MaxY + data.MinY) / 2; var weightOffsets = (data.MaxY > 30) ? highWeightOffset : lowWeightOffset; const int weightPasses = 4; for (int i = 0; i < data.Veins; i++) { double weight = 0; for (int j = 0; j < weightPasses; j++) { weight += random.NextDouble(); } weight /= data.Rarity; weight = weightOffsets[0] - Math.Abs(weight - weightOffsets[1]); double x = random.Next(0, Chunk.Width); double z = random.Next(0, Chunk.Depth); double y = weight * midpoint; double randomOffsetX = (float)random.NextDouble() - 1; double randomOffsetY = (float)random.NextDouble() - 1; double randomOffsetZ = (float)random.NextDouble() - 1; int abundance = random.Next(0, data.Abundance); for (int k = 0; k < abundance; k++) { x += randomOffsetX; y += randomOffsetY; z += randomOffsetZ; if (x >= 0 && z >= 0 && y >= data.MinY && x < Chunk.Width && y < data.MaxY && z < Chunk.Depth) { var biome = biomes.GetBiome(chunk.Biomes[(int)(x * Chunk.Width + z)]); if (biome.Ores.Contains(data.Type) && chunk.GetBlockID(new Coordinates3D((int)x, (int)y, (int)z)).Equals(StoneBlock.BlockID)) chunk.SetBlockID(new Coordinates3D((int)x, (int)y, (int)z), data.ID); } var blockX = MathHelper.ChunkToBlockX((int)(x), chunk.Coordinates.X); var blockZ = MathHelper.ChunkToBlockZ((int)(z), chunk.Coordinates.Z); double offsetX = 0; double offsetY = 0; double offsetZ = 0; int offset = random.Next(0, 3); double offset2 = random.NextDouble(); if (offset.Equals(0) && offset2 < 0.4) offsetX += 1; else if (offset.Equals(1) && offset2 >= 0.4 && offset2 < 0.65) offsetY += 1; else offsetZ += 1; var newX = (int)(x + offsetX); var newY = (int)(y + offsetY); var newZ = (int)(z + offsetZ); if (newX >= 0 && newZ >= 0 && newY >= data.MinY && newX < Chunk.Width && newY < data.MaxY && newZ < Chunk.Depth) { IBiomeProvider Biome = biomes.GetBiome(chunk.Biomes[newX * Chunk.Width + newZ]); var coordinates = new Coordinates3D((int)newX, (int)newY, (int)newZ); if (Biome.Ores.Contains(data.Type) && chunk.GetBlockID(coordinates).Equals(StoneBlock.BlockID)) { chunk.SetBlockID(coordinates, data.ID); } } } } } }