Finish modularising map generators.

This commit is contained in:
UnknownShadow200 2016-07-20 14:13:12 +10:00
parent 59485b317d
commit 29c4d600f7
3 changed files with 56 additions and 46 deletions

View File

@ -21,22 +21,19 @@ using LibNoise;
namespace MCGalaxy.Generator {
public static class AdvNoiseGen {
static Dictionary<string, Action<MapGenArgs>> generators
= new Dictionary<string, Action<MapGenArgs>>{
{ "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<MapGenArgs> 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

View File

@ -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<string>(types, s) >= 0 || Array.IndexOf<string>(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<MapGenArgs> 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<string, Action<MapGenArgs>> simpleGens, advGens;
public static void RegisterSimpleGen(string theme, Action<MapGenArgs> gen) {
simpleGens[theme.ToLower()] = gen;
}
public static void RegisterAdvancedGen(string theme, Action<MapGenArgs> gen) {
advGens[theme.ToLower()] = gen;
}
static MapGen() {
simpleGens = new Dictionary<string, Action<MapGenArgs>>();
advGens = new Dictionary<string, Action<MapGenArgs>>();
SimpleGen.RegisterGenerators();
AdvNoiseGen.RegisterGenerators();
}
}
}

View File

@ -20,25 +20,21 @@ using System.Collections.Generic;
namespace MCGalaxy.Generator {
public static class SimpleGen {
static Dictionary<string, Action<MapGenArgs>> generators
= new Dictionary<string, Action<MapGenArgs>>{
{ "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<MapGenArgs> 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);
}
}
}