Ejemplo n.º 1
0
        public IBiomeProvider GetBiome(double temperature, double rainfall, bool spawn)
        {
            List <IBiomeProvider> temperatureResults = new List <IBiomeProvider>();

            foreach (var biome in BiomeProviders)
            {
                if (biome != null && biome.Temperature.Equals(temperature))
                {
                    temperatureResults.Add(biome);
                }
            }

            if (temperatureResults.Count.Equals(0))
            {
                IBiomeProvider provider = null;
                float          temperatureDifference = 100.0f;
                foreach (var biome in BiomeProviders)
                {
                    if (biome != null)
                    {
                        var Difference = Math.Abs(temperature - biome.Temperature);
                        if (provider == null || Difference < temperatureDifference)
                        {
                            provider = biome;
                            temperatureDifference = (float)Difference;
                        }
                    }
                }
                temperatureResults.Add(provider);
            }

            foreach (var biome in BiomeProviders)
            {
                if (biome != null &&
                    biome.Rainfall.Equals(rainfall) &&
                    temperatureResults.Contains(biome) &&
                    (!spawn || biome.Spawn))
                {
                    return(biome);
                }
            }

            IBiomeProvider biomeProvider      = null;
            float          rainfallDifference = 100.0f;

            foreach (var biome in BiomeProviders)
            {
                if (biome != null)
                {
                    var difference = Math.Abs(temperature - biome.Temperature);
                    if ((biomeProvider == null || difference < rainfallDifference) &&
                        (!spawn || biome.Spawn))
                    {
                        biomeProvider      = biome;
                        rainfallDifference = (float)difference;
                    }
                }
            }
            return(biomeProvider ?? new PlainsBiome());
        }
Ejemplo n.º 2
0
    private static void testGetBiome(List <string> _params)
    {
        /* Using World.ChunkCache.ChunkProvider.GetBiomeProvider().GetBiomeAt
         *  Instead of World.getbiome */
        int x = int.Parse(_params[0]);
        int y = int.Parse(_params[1]);

        Printer.Print("testGetBiome at", x, y);
        World        w  = GameManager.Instance.World;
        ChunkCluster cc = w.ChunkCache;

        Printer.Print("testGetBiome ChunkCluster", cc);
        IChunkProvider icp = w.ChunkCache.ChunkProvider;

        Printer.Print("testGetBiome IChunkProvider", icp);
        IBiomeProvider bp = w.ChunkCache.ChunkProvider.GetBiomeProvider();

        Printer.Print("testGetBiome IBiomeProvider", bp);
        BiomeDefinition bd = w.ChunkCache.ChunkProvider.GetBiomeProvider().GetBiomeAt(x, y);

        Printer.Print("testGetBiome BiomeDefinition", bd);
    }
Ejemplo n.º 3
0
 public void RegisterBiomeProvider(IBiomeProvider provider)
 {
     BiomeProviders[provider.Id] = provider;
 }
Ejemplo n.º 4
0
 public void RegisterBiomeProvider(IBiomeProvider provider)
 {
     BiomeProviders[provider.ID] = provider;
 }
Ejemplo n.º 5
0
        public void Decorate(IWorld world, IChunk chunk, IBiomeRepository biomes)
        {
            var perlin = new Perlin(world.Seed);

            perlin.Lacunarity = 1;
            perlin.Amplitude  = 7;
            perlin.Frequency  = 0.015;
            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);
                            }
                        }
                    }
                }
            }
        }