diff --git a/Generator/AdvNoiseGen.cs b/Generator/AdvNoiseGen.cs index a57395984..5d1a3ac6e 100644 --- a/Generator/AdvNoiseGen.cs +++ b/Generator/AdvNoiseGen.cs @@ -21,22 +21,19 @@ using LibNoise; namespace MCGalaxy.Generator { public static class AdvNoiseGen { - - static Dictionary> generators - = new Dictionary>{ - { "billow", GenBillow2D }, { "ridgedmultifractal", GenRidged2D }, - { "perlin", GenPerlin2D }, { "checkerboard", GenCheckerboard }, - { "spheres", GenSpheres }, { "cylinders", GenCylinders }, - { "voronoi", GenVoronoi }, { "perlin3d", GenPerlin3D }, - { "perlin3dyadjust", GenPerlin3DYAdjust }, { "billow3d", GenBillow3D } - }; - public static bool Generate(MapGenArgs args) { - Action generator; - generators.TryGetValue(args.Type, out generator); - if (generator != null) generator(args); - return generator != null; - } + public static void RegisterGenerators() { + MapGen.RegisterAdvancedGen("billow", GenBillow2D); + MapGen.RegisterAdvancedGen("ridgedmultifractal", GenRidged2D); + MapGen.RegisterAdvancedGen("perlin", GenPerlin2D); + MapGen.RegisterAdvancedGen("checkerboard", GenCheckerboard); + MapGen.RegisterAdvancedGen("spheres", GenSpheres); + MapGen.RegisterAdvancedGen("cylinders", GenCylinders); + MapGen.RegisterAdvancedGen("voronoi", GenVoronoi); + MapGen.RegisterAdvancedGen("perlin3d", GenPerlin3D); + MapGen.RegisterAdvancedGen("perlin3dyadjust", GenPerlin3DYAdjust); + MapGen.RegisterAdvancedGen("billow3d", GenBillow3D); + } #region Implementations diff --git a/Generator/MapGen.cs b/Generator/MapGen.cs index f3453cbfa..e72027a77 100644 --- a/Generator/MapGen.cs +++ b/Generator/MapGen.cs @@ -22,42 +22,59 @@ namespace MCGalaxy.Generator { public struct MapGenArgs { public Level Level; - public string Type, RawArgs; + public string Theme, RawArgs; public bool UseSeed; public int Seed; } public static class MapGen { + public static bool IsRecognisedTheme(string s) { s = s.ToLower(); - return Array.IndexOf(types, s) >= 0 || Array.IndexOf(advTypes, s) >= 0; + return simpleGens.ContainsKey(s) || advGens.ContainsKey(s); } - static string[] types = { "island", "mountains", "forest", "ocean", "flat", - "pixel", "empty", "desert", "space", "rainbow", "hell" }; - static string[] advTypes = { "billow", "perlin", "checkerboard", "spheres", "cylinders", - "voronoi", "ridgedmultifractal", "perlin3d", "perlin3dyadjust" }; - public static void PrintThemes(Player p) { - Player.Message(p, "Simple themes: " + String.Join(", ", types)); - Player.Message(p, "Advanced themes: " + String.Join(", ", advTypes)); + Player.Message(p, "Simple themes: " + simpleGens.Keys.Concatenate(", ")); + Player.Message(p, "Advanced themes: " + advGens.Keys.Concatenate(", ")); } public static bool OkayAxis(int len) { return len >= 16 && len <= 8192 && (len % 16) == 0; } - public unsafe static void Generate(Level lvl, string type, string args) { + public static bool Generate(Level lvl, string theme, string args) { MapGenArgs genArgs = new MapGenArgs(); - genArgs.Level = lvl; genArgs.Type = type; + genArgs.Level = lvl; genArgs.Theme = theme; genArgs.RawArgs = args; genArgs.UseSeed = args != ""; if (genArgs.UseSeed && !int.TryParse(args, out genArgs.Seed)) genArgs.Seed = args.GetHashCode(); + Action generator = null; - if (!SimpleGen.Generate(genArgs)) - AdvNoiseGen.Generate(genArgs); + simpleGens.TryGetValue(theme, out generator); + if (generator != null) { generator(genArgs); return true; } + advGens.TryGetValue(theme, out generator); + if (generator != null) { generator(genArgs); return true; } + return false; + } + + + static Dictionary> simpleGens, advGens; + public static void RegisterSimpleGen(string theme, Action gen) { + simpleGens[theme.ToLower()] = gen; + } + + public static void RegisterAdvancedGen(string theme, Action gen) { + advGens[theme.ToLower()] = gen; + } + + static MapGen() { + simpleGens = new Dictionary>(); + advGens = new Dictionary>(); + SimpleGen.RegisterGenerators(); + AdvNoiseGen.RegisterGenerators(); } } } diff --git a/Generator/SimpleGen.cs b/Generator/SimpleGen.cs index 41b2843ba..ec7843540 100644 --- a/Generator/SimpleGen.cs +++ b/Generator/SimpleGen.cs @@ -20,25 +20,21 @@ using System.Collections.Generic; namespace MCGalaxy.Generator { public static class SimpleGen { - - static Dictionary> generators - = new Dictionary>{ - { "island", GenSimple }, { "mountains", GenSimple }, - { "forest", GenSimple }, { "ocean", GenSimple }, - { "flat", GenFlat }, { "pixel", GenPixel }, - { "empty", GenEmpty }, { "desert", GenSimple }, - { "space", GenSpace }, { "rainbow", GenRainbow }, - { "hell", GenHell }, - }; - - public static bool Generate(MapGenArgs args) { - Action generator; - generators.TryGetValue(args.Type, out generator); - if (generator != null) generator(args); - return generator != null; + + public static void RegisterGenerators() { + MapGen.RegisterSimpleGen("island", GenSimple); + MapGen.RegisterSimpleGen("mountains", GenSimple); + MapGen.RegisterSimpleGen("forest", GenSimple); + MapGen.RegisterSimpleGen("ocean", GenSimple); + MapGen.RegisterSimpleGen("flat", GenFlat); + MapGen.RegisterSimpleGen("pixel", GenPixel); + MapGen.RegisterSimpleGen("empty", GenEmpty); + MapGen.RegisterSimpleGen("desert", GenSimple); + MapGen.RegisterSimpleGen("space", GenSpace); + MapGen.RegisterSimpleGen("rainbow", GenRainbow); + MapGen.RegisterSimpleGen("hell", GenHell); } - unsafe static void GenFlat(MapGenArgs args) { Level lvl = args.Level; int grassHeight = lvl.Height / 2; @@ -154,7 +150,7 @@ namespace MCGalaxy.Generator { static void GenSimple(MapGenArgs args) { RealisticMapGen gen = new RealisticMapGen(); - gen.GenerateMap(args.Level, args.Type, args.Seed, args.UseSeed); + gen.GenerateMap(args.Level, args.Theme, args.Seed, args.UseSeed); } } }