This commit is contained in:
Cubitect 2019-05-04 14:19:47 +02:00
commit 26e97f8216
4 changed files with 146 additions and 4 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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);