From 1231c12a6e3cf2c45dd7e3c3eb52b04aa1137aaa Mon Sep 17 00:00:00 2001 From: Earthcomputer Date: Thu, 29 Nov 2018 04:32:12 +0000 Subject: [PATCH] Bedrock Edition support --- generator.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++-- generator.h | 4 ++- layers.c | 48 ++++++++++++++++++++++++++ layers.h | 1 + 4 files changed, 146 insertions(+), 4 deletions(-) diff --git a/generator.c b/generator.c index e222bbc..b876a7e 100644 --- a/generator.c +++ b/generator.c @@ -29,10 +29,17 @@ void setupMultiLayer(int scale, Layer *l, Layer *p1, Layer *p2, int s, void (*ge LayerStack setupGenerator(const int mcversion) { - if (mcversion <= MC_1_12) - return setupGeneratorMC17(); + if (mcversion < MCBE_1_7) + { + if (mcversion <= MC_1_12) + return setupGeneratorMC17(); + else + return setupGeneratorMC113(); + } else - return setupGeneratorMC113(); + { + return setupGeneratorMCBE17(); + } } @@ -189,6 +196,90 @@ LayerStack setupGeneratorMC113() return g; } + +LayerStack setupGeneratorMCBE17() +{ + if (biomes[plains].id == 0) + { + fprintf(stderr, "Warning: The biomes have to be initialised first using initBiomes() before any generator can be used.\n"); + } + + LayerStack g; + + g.layerNum = 52; + g.layers = (Layer *) malloc(sizeof(Layer) * g.layerNum); + + // SCALE LAYER PARENT SEED LAYER_FUNCTION + setupLayer(4096, &g.layers[ 0], NULL, 1, mapIsland); + setupLayer(2048, &g.layers[ 1], &g.layers[ 0], 2000, mapZoom); + setupLayer(2048, &g.layers[ 2], &g.layers[ 1], 1, mapAddIsland); + setupLayer(1024, &g.layers[ 3], &g.layers[ 2], 2001, mapZoom); + setupLayer(1024, &g.layers[ 4], &g.layers[ 3], 2, mapAddIsland); + setupLayer(1024, &g.layers[ 5], &g.layers[ 4], 50, mapAddIsland); + setupLayer(1024, &g.layers[ 6], &g.layers[ 5], 70, mapAddIsland); + setupLayer(1024, &g.layers[ 7], &g.layers[ 6], 2, mapRemoveTooMuchOcean); + + setupLayer(1024, &g.layers[ 8], &g.layers[ 7], 2, mapAddSnow); + setupLayer(1024, &g.layers[ 9], &g.layers[ 8], 3, mapAddIsland); + setupLayer(1024, &g.layers[10], &g.layers[ 9], 2, mapCoolWarm); + setupLayer(1024, &g.layers[11], &g.layers[10], 2, mapHeatIce); + setupLayer(1024, &g.layers[12], &g.layers[11], 3, mapSpecial); + setupLayer( 512, &g.layers[13], &g.layers[12], 2002, mapZoom); + setupLayer( 256, &g.layers[14], &g.layers[13], 2003, mapZoom); + setupLayer( 256, &g.layers[15], &g.layers[14], 4, mapAddIsland); + setupLayer( 256, &g.layers[16], &g.layers[15], 5, mapAddMushroomIsland); + setupLayer( 256, &g.layers[17], &g.layers[16], 4, mapDeepOcean); + // biome layer chain + setupLayer( 256, &g.layers[18], &g.layers[17], 200, mapBiomeBE); + setupLayer( 128, &g.layers[19], &g.layers[18], 1001, mapZoom); + setupLayer( 64, &g.layers[20], &g.layers[19], 1001, mapZoom); + setupLayer( 64, &g.layers[21], &g.layers[20], 1000, mapBiomeEdge); + + // basic river layer chain, used to determine where hills generate + setupLayer( 256, &g.layers[22], &g.layers[17], 100, mapRiverInit); + setupLayer( 128, &g.layers[23], &g.layers[22], 1001, mapZoom); + setupLayer( 64, &g.layers[24], &g.layers[23], 1001, mapZoom); + + setupMultiLayer(64, &g.layers[25], &g.layers[21], &g.layers[24], 1000, mapHills113); + + setupLayer( 64, &g.layers[26], &g.layers[25], 1001, mapRareBiome); + setupLayer( 32, &g.layers[27], &g.layers[26], 1000, mapZoom); + setupLayer( 32, &g.layers[28], &g.layers[27], 3, mapAddIsland); + setupLayer( 16, &g.layers[29], &g.layers[28], 1001, mapZoom); + setupLayer( 16, &g.layers[30], &g.layers[29], 1000, mapShore); + setupLayer( 8, &g.layers[31], &g.layers[30], 1002, mapZoom); + setupLayer( 4, &g.layers[32], &g.layers[31], 1003, mapZoom); + setupLayer( 4, &g.layers[33], &g.layers[32], 1000, mapSmooth); + + // river layer chain + setupLayer( 128, &g.layers[34], &g.layers[22], 1001, mapZoom); + setupLayer( 64, &g.layers[35], &g.layers[34], 1001, mapZoom); + setupLayer( 32, &g.layers[36], &g.layers[35], 1001, mapZoom); + setupLayer( 16, &g.layers[37], &g.layers[36], 1001, mapZoom); + setupLayer( 8, &g.layers[38], &g.layers[37], 1001, mapZoom); + setupLayer( 4, &g.layers[39], &g.layers[38], 1001, mapZoom); + setupLayer( 4, &g.layers[40], &g.layers[39], 1, mapRiver); + setupLayer( 4, &g.layers[41], &g.layers[40], 1000, mapSmooth); + + setupMultiLayer(4, &g.layers[42], &g.layers[33], &g.layers[41], 100, mapRiverMix); + + // ocean variants + setupLayer( 256, &g.layers[43], NULL, 2, mapOceanTemp); + g.layers[43].oceanRnd = (OceanRnd *) malloc(sizeof(OceanRnd)); + setupLayer( 128, &g.layers[44], &g.layers[43], 2002, mapZoom); + setupLayer( 64, &g.layers[45], &g.layers[44], 2002, mapZoom); + setupLayer( 32, &g.layers[46], &g.layers[45], 2002, mapZoom); + setupLayer( 16, &g.layers[47], &g.layers[46], 2002, mapZoom); + setupLayer( 8, &g.layers[48], &g.layers[47], 2002, mapZoom); + setupLayer( 4, &g.layers[49], &g.layers[48], 2002, mapZoom); + + setupMultiLayer(4, &g.layers[50], &g.layers[42], &g.layers[49], 100, mapOceanMix); + + setupLayer(1, &g.layers[51], &g.layers[50], 10, mapVoronoiZoom); + + return g; +} + void freeGenerator(LayerStack g) { int i; diff --git a/generator.h b/generator.h index bc3b813..919266a 100644 --- a/generator.h +++ b/generator.h @@ -6,7 +6,8 @@ /* Minecraft versions */ enum { - MC_1_7, MC_1_8, MC_1_9, MC_1_10, MC_1_11, MC_1_12, MC_1_13 + MC_1_7, MC_1_8, MC_1_9, MC_1_10, MC_1_11, MC_1_12, MC_1_13, + MCBE_1_7 = 256 }; /* Enumeration of the layer indices in the generator. */ @@ -191,6 +192,7 @@ STRUCT(LayerStack) LayerStack setupGenerator(const int mcversion); LayerStack setupGeneratorMC17(); LayerStack setupGeneratorMC113(); +LayerStack setupGeneratorMCBE17(); /* Cleans up and frees the generator layers */ void freeGenerator(LayerStack g); diff --git a/layers.c b/layers.c index afabf88..7f3008d 100644 --- a/layers.c +++ b/layers.c @@ -815,6 +815,54 @@ void mapBiome(Layer *l, int * __restrict out, int areaX, int areaZ, int areaWidt } +const int lushBiomesBE[] = {forest, roofedForest, extremeHills, plains, plains, plains, birchForest, swampland}; + +void mapBiomeBE(Layer *l, int * __restrict out, int areaX, int areaZ, int areaWidth, int areaHeight) +{ + l->p->getMap(l->p, out, areaX, areaZ, areaWidth, areaHeight); + + int x, z; + for (z = 0; z < areaHeight; z++) + { + for (x = 0; x < areaWidth; x++) + { + int idx = x + z*areaWidth; + int id = out[idx]; + int hasHighBit = (id & 0xf00) >> 8; + id &= -0xf01; + + if (getBiomeType(id) == Ocean || id == mushroomIsland) + { + out[idx] = id; + continue; + } + + setChunkSeed(l, (int64_t)(x + areaX), (int64_t)(z + areaZ)); + + switch(id){ + case Warm: + if (hasHighBit) out[idx] = (mcNextInt(l, 3) == 0) ? mesaPlateau : mesaPlateau_F; + else out[idx] = warmBiomes[mcNextInt(l, 6)]; + break; + case Lush: + if (hasHighBit) out[idx] = jungle; + else out[idx] = lushBiomesBE[mcNextInt(l, 6)]; + break; + case Cold: + if (hasHighBit) out[idx] = megaTaiga; + else out[idx] = coldBiomes[mcNextInt(l, 4)]; + break; + case Freezing: + out[idx] = snowBiomes[mcNextInt(l, 4)]; + break; + default: + out[idx] = mushroomIsland; + } + } + } +} + + void mapRiverInit(Layer *l, int * __restrict out, int areaX, int areaZ, int areaWidth, int areaHeight) { l->p->getMap(l->p, out, areaX, areaZ, areaWidth, areaHeight); diff --git a/layers.h b/layers.h index ba8cadc..a3a4d60 100644 --- a/layers.h +++ b/layers.h @@ -454,6 +454,7 @@ void mapSpecial(Layer *l, int * __restrict out, int x, int z, int w, int h); void mapAddMushroomIsland(Layer *l, int * __restrict out, int x, int z, int w, int h); void mapDeepOcean(Layer *l, int * __restrict out, int x, int z, int w, int h); void mapBiome(Layer *l, int * __restrict out, int x, int z, int w, int h); +void mapBiomeBE(Layer *l, int * __restrict out, int x, int z, int w, int h); void mapRiverInit(Layer *l, int * __restrict out, int x, int z, int w, int h); void mapBiomeEdge(Layer *l, int * __restrict out, int x, int z, int w, int h); void mapHills(Layer *l, int * __restrict out, int x, int z, int w, int h);