예제 #1
0
 public static IMapGenerator Get(string gen, long Seed, MapGenMaterials Materials)
 {
     if (gen == null)
         gen = "QuickHillGenerator";
     if (Generators.Count == 0)
     {
         Generators.Add("QuickHillGenerator", typeof(QuickHillGenerator));
     }
     string id = "QuickHillGenerator";
     if (Generators.ContainsKey(gen))
         id = gen;
     Console.WriteLine("Initializing {0}.", id);
     IMapGenerator g = (IMapGenerator)Generators[id].GetConstructor(new Type[] { typeof(long) }).Invoke(new object[] { Seed });
     g.Materials = Materials;
     g.GenerateCaves = true;
     g.GenerateDungeons = true;
     g.GenerateOres = true;
     g.GenerateWater = true;
     g.HellMode = false;
     g.GenerateTrees = true;
     g.NoPreservation = false;
     return g;
 }
예제 #2
0
        private void DoPreset()
        {
            mMaterials = new MapGenMaterials();
            if (cmbMatPreset.SelectedIndex != -1)
            {
                switch (cmbMatPreset.SelectedText)
                {
                case "Hell Mode":
                    mMaterials.Grass  = mMaterials.Soil;
                    mMaterials.Sand   = mMaterials.Gravel = 49; // Obsidian
                    mMaterials.Water  = mMaterials.Lava;
                    mMaterials.Snow   = 0;                      // F**K snow.
                    TemperatureOffset = 30;
                    break;

                default:
                    break;
                }
            }
            if (pgMapGen.SelectedObject != null)
            {
                (pgMapGen.SelectedObject as IMapGenerator).Materials = mMaterials;
            }
        }
예제 #3
0
 private void DoPreset()
 {
     mMaterials=new MapGenMaterials();
     if (cmbMatPreset.SelectedIndex != -1)
     {
         switch (cmbMatPreset.SelectedText)
         {
             case "Hell Mode":
                 mMaterials.Grass=mMaterials.Soil;
                 mMaterials.Sand=mMaterials.Gravel=49; // Obsidian
                 mMaterials.Water=mMaterials.Lava;
                 mMaterials.Snow=0; // F**K snow.
                 TemperatureOffset = 30;
                 break;
             default:
                 break;
         }
     }
     if (pgMapGen.SelectedObject != null)
     {
         (pgMapGen.SelectedObject as IMapGenerator).Materials = mMaterials;
     }
 }
예제 #4
0
        internal virtual void Precipitate(ref byte[, ,] b, BiomeType[,] bt, MapGenMaterials mats, long X, long Z)
        {
            int xs = b.GetLength(0);
            int zs = b.GetLength(2);

            for (int x = 0; x < xs; x++)
            {
                for (int z = 0; z < zs; z++)
                {
                    if(Biome.NeedsSnowAndIce(bt[x,z]))
                        continue;
                    // Fall down
                    for (int y = b.GetLength(1) - 1; y > 0; y--)
                    {
                        byte block = b[x, y, z];
                        if (block == 0) continue;
                        if (block == mats.Water)
                            b[x, y, z] = mats.Ice;
                        else
                            b[x, y + 1, z] = mats.Snow;
                        break;
                    }
                }
            }
        }
예제 #5
0
 public virtual void AddSoil(long X, long Z, RidgedMultifractal CavernNoise, Perlin CaveNoise, double[,] hm,ref byte[,,] b, BiomeType[,] biomes, int WaterHeight, int depth, MapGenMaterials mats)
 {
     int YH = b.GetLength(1) - 2;
     double xo = (double)(X * b.GetLength(0));
     double zo = (double)(Z * b.GetLength(2));
     for (int x = 0; x < b.GetLength(0); x++)
     {
         //Console.WriteLine();
         for (int z = 0; z < b.GetLength(2); z++)
         {
             double hmY=(double)(System.Math.Min(hm[x, z],1d) * (b.GetLength(1) - 3));
             bool HavePloppedGrass = false;
             bool HaveTouchedSoil = false;
             // Caves first
             if (GenerateCaves)
             {
                 for (int y = 0; y < b.GetLength(1); y++)
                 {
                     // If we're in rock, and CavernNoise value is under a threshold value calculated by height
                     //  or CaveNoise value is over threshold value, and the block we're removing won't fall on us...
                     if (
                         b[x, y, z] == 1
                         && (
                             ((CavernNoise.GetValue(x + xo, y, z + zo) / 2) + 1) < Utils.Lerp(CavernThresholdMax, CavernThresholdMin, (((double)y / (hmY + 1))))
                             || (Utils.FixLibnoiseOutput(CaveNoise.GetValue(x + xo, y, z + zo)) > CaveThreshold)
                         )
                         && !(b[x, y, z] == 9 || b[x, y, z] == 8 || b[x, y, z] == 12 || b[x, y, z] == 13))
                     {
                         // Remove it
                         b[x, y, z] = 0;
                     }
                 }
             }
             for (int y = (int)b.GetLength(1) - 1; y > 0; y--)
             {
                 byte supportBlock = b[x, y-1, z];
                 // Ensure there's going to be stuff holding us up.
                 if (b[x, y, z] == mats.Rock && supportBlock==mats.Rock)
                 {
                     HaveTouchedSoil = true;
                     if (y + depth >= YH)
                         continue;
                     byte ddt = b[x, y+depth, z];
                     switch (ddt)
                     {
                         case 0: // Air
                         case 8: // Water
                         case 9: // Water
                             BiomeType bt = biomes[x,z];
                             if (bt == BiomeType.Tundra)
                             {
                                 b[x, y, z] = mats.Sand;
                             }
                             else
                             {
                                 if (y - depth <= WaterHeight && GenerateWater)
                                 {
                                     if ((bt == BiomeType.Taiga || bt == BiomeType.TemperateForest || bt == BiomeType.Tundra) && y > WaterHeight)
                                     {
                                         b[x, y, z] = (HavePloppedGrass) ? mats.Soil : mats.Grass;
                                     }
                                     else
                                     {
                                         b[x, y, z] = mats.Sand;
                                     }
                                 }
                                 else
                                     b[x, y, z] = (HavePloppedGrass) ? mats.Soil : mats.Grass;
                             }
                             if (!HavePloppedGrass)
                                 HavePloppedGrass = true;
                             break;
                         default:
                             y = 0;
                             break;
                     }
                 }
                 else if (b[x, y, z] == 0 && y <= WaterHeight && !HaveTouchedSoil && GenerateWater)
                 {
                     b[x, y, z] = mats.Water;
                 }
             }
         }
     }
 }