From 6d523469ec017b3d7649767c6553ec8053fc9d8c Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 20 Jul 2016 13:02:23 +1000 Subject: [PATCH] First step in modularising map generators. --- Generator/AdvNoiseGen.cs | 111 ++++++++++++++++++ Generator/MapGen.cs | 74 +----------- Generator/NoiseGen.cs | 6 +- .../{RealisticMapGen.cs => RealisticGen.cs} | 13 +- ...{MapGenParams.cs => RealisticGenParams.cs} | 20 ++-- MCGalaxy_.csproj | 5 +- 6 files changed, 131 insertions(+), 98 deletions(-) create mode 100644 Generator/AdvNoiseGen.cs rename Generator/{RealisticMapGen.cs => RealisticGen.cs} (98%) rename Generator/{MapGenParams.cs => RealisticGenParams.cs} (74%) diff --git a/Generator/AdvNoiseGen.cs b/Generator/AdvNoiseGen.cs new file mode 100644 index 000000000..ad9863844 --- /dev/null +++ b/Generator/AdvNoiseGen.cs @@ -0,0 +1,111 @@ +/* + Copyright 2015 MCGalaxy + + Dual-licensed under the Educational Community License, Version 2.0 and + the GNU General Public License, Version 3 (the "Licenses"); you may + not use this file except in compliance with the Licenses. You may + obtain a copy of the Licenses at + + http://www.opensource.org/licenses/ecl2.php + http://www.gnu.org/licenses/gpl-3.0.html + + Unless required by applicable law or agreed to in writing, + software distributed under the Licenses are distributed on an "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the Licenses for the specific language governing + permissions and limitations under the Licenses. + */ +using System; +using LibNoise; + +namespace MCGalaxy { + public static class AdvNoiseGen { + + public unsafe static void Generate(Level lvl, string type, bool useSeed, int seed) { + switch (type) { + case "billow": + Billow billow2D = new Billow(); + billow2D.Seed = useSeed ? seed : new Random().Next(); + Generate2D(lvl, billow2D); break; + case "ridgedmultifractal": + RidgedMultifractal ridged2D = new RidgedMultifractal(); + ridged2D.Seed = useSeed ? seed : new Random().Next(); + Generate2D(lvl, ridged2D); break; + case "perlin": + Perlin perlin2D = new Perlin(); + perlin2D.Seed = useSeed ? seed : new Random().Next(); + Generate2D(lvl, perlin2D); break; + case "checkerboard": + Generate2D(lvl, new Checkerboard()); break; + case "spheres": + Generate2D(lvl, new Spheres()); break; + case "cylinders": + Generate2D(lvl, new Cylinders()); break; + case "voronoi": + Voronoi voronoi2D = new Voronoi(); + voronoi2D.Seed = useSeed ? seed : new Random().Next(); + Generate2D(lvl, voronoi2D); break; + case "perlin3d": + Perlin perlin3D = new Perlin(); + perlin3D.Seed = useSeed ? seed : new Random().Next(); + Generate3D(lvl, perlin3D); break; + case "perlin3dyadjust": + Perlin adjNoise = new Perlin(); + adjNoise.Seed = useSeed ? seed : new Random().Next(); + Generate3DYAdjust(lvl, adjNoise); break; + case "billow3d": + Billow billow3D = new Billow(); + billow3D.Seed = useSeed ? seed : new Random().Next(); + Generate3D(lvl, billow3D); break; + } + } + + static void Generate2D(Level lvl, IModule module) { + int width = lvl.Width, length = lvl.Length, half = lvl.Height / 2; + int waterHeight = half - 1; + + for (int z = 0; z < length; ++z) + for (int x = 0; x < width; ++x) + { + double noise = module.GetValue(x / 100.0, 0.1, z / 100.0); + int height2D = (int)System.Math.Floor((noise + 2) * 10) + (half - 20); + int height2Dtex01 = (int)System.Math.Floor((noise + 2) * 15) + (half - 30); + byte topBlock = height2D < height2Dtex01 ? Block.grass : Block.sand; + lvl.SetTile((ushort)x, (ushort)height2D, (ushort)z, topBlock); + + if (height2D < waterHeight) { + for (int y = waterHeight; y >= height2D; y--) + lvl.SetTile((ushort)x, (ushort)y, (ushort)z, Block.water); + } + for (int y = height2D - 1; y >= 0; y--) { + byte block = (y > height2D * 3 / 4) ? Block.dirt : Block.rock; + lvl.SetTile((ushort)x, (ushort)y, (ushort)z, block); + } + } + } + + static void Generate3D(Level lvl, IModule module) { + int width = lvl.Width, height = lvl.Height, length = lvl.Length; + for (int y = 0; y < height; y++) + for (int z = 0; z < length; ++z) + for (int x = 0; x < width; ++x) + { + double value = System.Math.Floor((module.GetValue(x / 100.0, y / 100.0, z / 100.0) + 2) * 10); + if (value > 20) + lvl.SetTile((ushort)x, (ushort)y, (ushort)z, Block.grass); + } + } + + static void Generate3DYAdjust(Level lvl, IModule module) { + int width = lvl.Width, height = lvl.Height, length = lvl.Length; + for (int y = 0; y < height; y++) + for (int z = 0; z < length; ++z) + for (int x = 0; x < width; ++x) + { + double value = System.Math.Floor((module.GetValue(x / 100.0, y / 100.0, z / 100.0) + 2) * 10); + if (value > 30 * y / height) + lvl.SetTile((ushort)x, (ushort)y, (ushort)z, Block.grass); + } + } + } +} diff --git a/Generator/MapGen.cs b/Generator/MapGen.cs index 5ff40e0a2..5b5b2e1cc 100644 --- a/Generator/MapGen.cs +++ b/Generator/MapGen.cs @@ -16,12 +16,9 @@ permissions and limitations under the Licenses. */ using System; -using LibNoise; namespace MCGalaxy { - public static class MapGen { - public static bool IsRecognisedTheme(string s) { s = s.ToLower(); return Array.IndexOf(types, s) >= 0 || Array.IndexOf(advTypes, s) >= 0; @@ -52,7 +49,6 @@ namespace MCGalaxy { byte[] blocks = lvl.blocks; int half = height / 2; RealisticMapGen generator = new RealisticMapGen(); - IModule module2D = null, module3D = null; int seed = 0; bool useSeed = args != ""; @@ -135,42 +131,6 @@ namespace MCGalaxy { } index++; } generator.GenerateMap(lvl, type, seed, useSeed); return; - case "billow": - module2D = new Billow(); - ((Billow)module2D).Seed = useSeed ? seed : new Random().Next(); break; - case "ridgedmultifractal": - module2D = new RidgedMultifractal(); - ((RidgedMultifractal)module2D).Seed = useSeed ? seed : new Random().Next(); break; - case "perlin": - module2D = new Perlin(); - ((Perlin)module2D).Seed = useSeed ? seed : new Random().Next(); break; - case "checkerboard": - module2D = new Checkerboard(); break; - case "spheres": - module2D = new Spheres(); break; - case "cylinders": - module2D = new Cylinders(); break; - case "voronoi": - module2D = new Voronoi(); - ((Voronoi)module2D).Seed = useSeed ? seed : new Random().Next(); break; - case "perlin3d": - module3D = new Perlin(); - ((Perlin)module3D).Seed = useSeed ? seed : new Random().Next(); break; - case "perlin3dyadjust": - Perlin adjNoise = new Perlin(); - adjNoise.Seed = useSeed ? seed : new Random().Next(); - for (int y = 0; y < height; y++) - for (int z = 0; z < length; ++z) - for (int x = 0; x < width; ++x) - { - double value = System.Math.Floor((adjNoise.GetValue(x / 100.0, y / 100.0, z / 100.0) + 2) * 10); - if (value > 30 * y / height) - lvl.SetTile((ushort)x, (ushort)y, (ushort)z, Block.grass); - } - break; - case "billow3d": - module3D = new Billow(); - ((Billow)module3D).Seed = useSeed ? seed : new Random().Next(); break; case "island": case "mountains": case "ocean": @@ -178,39 +138,7 @@ namespace MCGalaxy { case "desert": generator.GenerateMap(lvl, type, seed, useSeed); return; } - - if (module2D != null) { - int waterlvl = half - 1; - for (int z = 0; z < length; ++z) - for (int x = 0; x < width; ++x) - { - double noise = module2D.GetValue(x / 100.0, 0.1, z / 100.0); - int height2D = (int)System.Math.Floor((noise + 2) * 10) + (half-20); - int height2Dtex01 = (int)System.Math.Floor((noise + 2) * 15) + (half- 30); - byte topBlock = height2D < height2Dtex01 ? Block.grass : Block.sand; - lvl.SetTile((ushort)x, (ushort)height2D, (ushort)z, topBlock); - - if (height2D < waterlvl) { - for (int y = waterlvl; y >= height2D; y--) - lvl.SetTile((ushort)x, (ushort)y, (ushort)z, Block.water); - } - for (int y = height2D - 1; y >= 0; y--) { - byte block = (y > height2D * 3 / 4) ? Block.dirt : Block.rock; - lvl.SetTile((ushort)x, (ushort)y, (ushort)z, block); - } - } - } - - if (module3D != null) { - for (int y = 0; y < height; y++) - for (int z = 0; z < length; ++z) - for (int x = 0; x < width; ++x) - { - double value = System.Math.Floor((module3D.GetValue(x / 100.0, y / 100.0, z / 100.0) + 2) * 10); - if (value > 20) - lvl.SetTile((ushort)x, (ushort)y, (ushort)z, Block.grass); - } - } + AdvNoiseGen.Generate(lvl, type, useSeed, seed); } } } diff --git a/Generator/NoiseGen.cs b/Generator/NoiseGen.cs index 15ba4e3c4..347f7217e 100644 --- a/Generator/NoiseGen.cs +++ b/Generator/NoiseGen.cs @@ -25,10 +25,8 @@ Ideas, concepts, and code were used from the following two sources: */ using System; -namespace MCGalaxy { - - public sealed class NoiseGen { - +namespace MCGalaxy { + public static class NoiseGen { public static void GenerateNormalized(float[] array, float persistence, int octaves, int width, int height, int seed, float zoom) { float min = float.MaxValue, max = float.MinValue; diff --git a/Generator/RealisticMapGen.cs b/Generator/RealisticGen.cs similarity index 98% rename from Generator/RealisticMapGen.cs rename to Generator/RealisticGen.cs index 3708b15aa..c2fa03225 100644 --- a/Generator/RealisticMapGen.cs +++ b/Generator/RealisticGen.cs @@ -28,17 +28,14 @@ using System; using MCGalaxy.Drawing; using MCGalaxy.Drawing.Ops; -namespace MCGalaxy { - - public sealed class RealisticMapGen { - +namespace MCGalaxy { + public sealed class RealisticMapGen { float[] terrain, overlay, overlay2; - float treeDens; short treeDist; Random rand; ushort LiquidLevel; - MapGenParams genParams; + RealisticGenParams genParams; TreeDrawOp treeDrawer; Vec3S32[] treeCoords; @@ -46,8 +43,8 @@ namespace MCGalaxy { DateTime startTime = DateTime.UtcNow; Server.s.Log("Attempting map gen"); rand = useSeed ? new System.Random(seed) : new System.Random(); - if (!MapGenParams.Themes.TryGetValue(type, out genParams)) - genParams = new MapGenParams(); + if (!RealisticGenParams.Themes.TryGetValue(type, out genParams)) + genParams = new RealisticGenParams(); if (genParams.GenTrees) { treeDrawer = new TreeDrawOp(); treeDrawer.Level = Lvl; diff --git a/Generator/MapGenParams.cs b/Generator/RealisticGenParams.cs similarity index 74% rename from Generator/MapGenParams.cs rename to Generator/RealisticGenParams.cs index 8b4ac40f8..7a8a59526 100644 --- a/Generator/MapGenParams.cs +++ b/Generator/RealisticGenParams.cs @@ -18,10 +18,8 @@ using System; using System.Collections.Generic; -namespace MCGalaxy { - - public sealed class MapGenParams { - +namespace MCGalaxy { + public sealed class RealisticGenParams { public float RangeLow = 0.2f; public float RangeHigh = 0.8f; public bool SimpleColumns = false, IslandColumns = false; @@ -41,25 +39,25 @@ namespace MCGalaxy { public float DisplacementMax = 0.01f; public float DisplacementStep = -0.0025f; - public static Dictionary Themes = new Dictionary() { - { "hell", new MapGenParams() { RangeLow = 0.3f, RangeHigh = 1.3f, + public static Dictionary Themes = new Dictionary() { + { "hell", new RealisticGenParams() { RangeLow = 0.3f, RangeHigh = 1.3f, DisplacementMax = 0.02f, StartHeight = 0.04f, UseLavaLiquid = true, GetLiquidLevel = (height) => 5 } }, - { "island", new MapGenParams() { RangeLow = 0.4f, RangeHigh = 0.75f, + { "island", new RealisticGenParams() { RangeLow = 0.4f, RangeHigh = 0.75f, FalloffEdges = true, IslandColumns = true } }, - { "forest", new MapGenParams() { RangeLow = 0.45f, RangeHigh = 0.8f, + { "forest", new RealisticGenParams() { RangeLow = 0.45f, RangeHigh = 0.8f, TreeDens = 0.7f, TreeDist = 2 } }, - { "mountains", new MapGenParams() { RangeLow = 0.3f, RangeHigh = 0.9f, + { "mountains", new RealisticGenParams() { RangeLow = 0.3f, RangeHigh = 0.9f, TreeDist = 4, DisplacementMax = 0.02f, StartHeight = 0.6f } }, - { "ocean", new MapGenParams() { RangeLow = 0.1f, RangeHigh = 0.6f, + { "ocean", new RealisticGenParams() { RangeLow = 0.1f, RangeHigh = 0.6f, GenTrees = false, GenerateOverlay2 = false, GetLiquidLevel = (height) => (ushort)(height * 0.85f) } }, - { "desert", new MapGenParams() { RangeLow = 0.5f, RangeHigh = 0.85f, + { "desert", new RealisticGenParams() { RangeLow = 0.5f, RangeHigh = 0.85f, TreeDist = 24, GenFlowers = false, GenerateOverlay2 = false, UseCactus = true, SimpleColumns = true, GetLiquidLevel = (height) => 0 } diff --git a/MCGalaxy_.csproj b/MCGalaxy_.csproj index e88d9af80..bea581cf9 100644 --- a/MCGalaxy_.csproj +++ b/MCGalaxy_.csproj @@ -474,11 +474,12 @@ + - - + +