Fixed init with setWorldSeed for pre-1.13 at higher entry layers.

This commit is contained in:
Cubitect 2021-01-07 15:03:23 +01:00
parent f8c5baf97d
commit 40a65d89b9
3 changed files with 56 additions and 55 deletions

View File

@ -2388,7 +2388,7 @@ L_HAS_PROTO_MUSHROOM:
g->layers[L13_OCEAN_MIX_4].data = (void*) &filter;
g->layers[L13_OCEAN_MIX_4].getMap = mapFilterOceanMix;
applySeed(g, seed);
setWorldSeed(l, seed);
int ret = !l->getMap(l, map, x, z, w, h);
if (ret)
{

View File

@ -9,7 +9,7 @@
void setupLayer(Layer *l, Layer *p, int s, mapfunc_t getMap)
{
l->layerSeed = getLayerSeed(s);
l->layerSeed = s ? getLayerSeed(s) : 0;
l->startSalt = 0;
l->startSeed = 0;
l->p = p;
@ -129,8 +129,8 @@ static void setupGeneratorImpl(LayerStack *g, int mcversion, int largeBiomes)
// basic river layer chain, used to determine where hills generate
setupLayer(&l[L_RIVER_INIT_256], &l[L_DEEP_OCEAN_256], 100, mapRiverInit);
setupLayer(&l[L_ZOOM_128_HILLS], &l[L_RIVER_INIT_256], 1000, mapZoom);
setupLayer(&l[L_ZOOM_64_HILLS], &l[L_ZOOM_128_HILLS], 1001, mapZoom);
setupLayer(&l[L_ZOOM_128_HILLS], &l[L_RIVER_INIT_256], mcversion < MC_1_13 ? 0 : 1000, mapZoom);
setupLayer(&l[L_ZOOM_64_HILLS], &l[L_ZOOM_128_HILLS], mcversion < MC_1_13 ? 0 : 1001, mapZoom);
setupMultiLayer(&l[L_HILLS_64], &l[L_BIOME_EDGE_64], &l[L_ZOOM_64_HILLS], 1000,
(mcversion & 0xff) <= MC_1_12 ? mapHills112 : mapHills);

103
layers.c
View File

@ -131,10 +131,7 @@ void initBiomes()
void setWorldSeed(Layer *layer, int64_t worldSeed)
{
// TODO: setWorldSeed is problematic for layers during generation branches.
// Also the Hills branch gets zero-initialized pre 1.13 which is irritating.
if (layer->p2 != NULL && layer->getMap != mapHills112)
if (layer->p2 != NULL)
setWorldSeed(layer->p2, worldSeed);
if (layer->p != NULL)
@ -143,13 +140,22 @@ void setWorldSeed(Layer *layer, int64_t worldSeed)
if (layer->oceanRnd != NULL)
oceanRndInit(layer->oceanRnd, worldSeed);
int64_t st = worldSeed;
st = mcStepSeed(st, layer->layerSeed);
st = mcStepSeed(st, layer->layerSeed);
st = mcStepSeed(st, layer->layerSeed);
int64_t ls = layer->layerSeed;
if (ls != 0) // Pre 1.13 the Hills branch stays zero-initialized
{
int64_t st = worldSeed;
st = mcStepSeed(st, ls);
st = mcStepSeed(st, ls);
st = mcStepSeed(st, ls);
layer->startSalt = st;
layer->startSeed = mcStepSeed(st, 0);
layer->startSalt = st;
layer->startSeed = mcStepSeed(st, 0);
}
else
{
layer->startSalt = 0;
layer->startSeed = 0;
}
}
@ -1450,17 +1456,17 @@ inline static int replaceOcean(int *out, int idx, int v10, int v21, int v01, int
{
if (isOceanic(id)) return 0;
if (!isOceanic(v10) && !isOceanic(v21) && !isOceanic(v01) && !isOceanic(v12))
out[idx] = id;
else
if (isOceanic(v10) || isOceanic(v21) || isOceanic(v01) || isOceanic(v12))
out[idx] = replaceID;
else
out[idx] = id;
return 1;
}
inline static int isBiomeJFTO(int id)
{
return biomeExists(id) && (getBiomeType(id) == Jungle || id == forest || id == taiga || isOceanic(id));
return getBiomeType(id) == Jungle || id == forest || id == taiga || isOceanic(id);
}
int mapShore(const Layer * l, int * out, int x, int z, int w, int h)
@ -1489,67 +1495,62 @@ int mapShore(const Layer * l, int * out, int x, int z, int w, int h)
int v01 = vz1[i+0];
int v12 = vz2[i+1];
int biome = biomeExists(v11) ? v11 : 0;
if (v11 == mushroom_fields)
{
if (v10 != ocean && v21 != ocean && v01 != ocean && v12 != ocean)
out[i + j*w] = v11;
else
if (v10 == ocean || v21 == ocean || v01 == ocean || v12 == ocean)
out[i + j*w] = mushroom_field_shore;
else
out[i + j*w] = v11;
}
else if (/*biome < 128 &&*/ getBiomeType(biome) == Jungle)
else if (getBiomeType(v11) == Jungle)
{
if (isBiomeJFTO(v10) && isBiomeJFTO(v21) && isBiomeJFTO(v01) && isBiomeJFTO(v12))
{
if (!isOceanic(v10) && !isOceanic(v21) && !isOceanic(v01) && !isOceanic(v12))
out[i + j*w] = v11;
else
if (isOceanic(v10) || isOceanic(v21) || isOceanic(v01) || isOceanic(v12))
out[i + j*w] = beach;
else
out[i + j*w] = v11;
}
else
{
out[i + j*w] = jungle_edge;
}
}
else if (v11 != mountains && v11 != wooded_mountains && v11 != mountain_edge)
else if (v11 == mountains || v11 == wooded_mountains || v11 == mountain_edge)
{
if (isBiomeSnowy(biome))
replaceOcean(out, i + j*w, v10, v21, v01, v12, v11, stone_shore);
}
else if (isBiomeSnowy(v11))
{
replaceOcean(out, i + j*w, v10, v21, v01, v12, v11, snowy_beach);
}
else if (v11 == badlands || v11 == wooded_badlands_plateau)
{
if (!isOceanic(v10) && !isOceanic(v21) && !isOceanic(v01) && !isOceanic(v12))
{
replaceOcean(out, i + j*w, v10, v21, v01, v12, v11, snowy_beach);
}
else if (v11 != badlands && v11 != wooded_badlands_plateau)
{
if (v11 != ocean && v11 != deep_ocean && v11 != river && v11 != swamp)
{
if (!isOceanic(v10) && !isOceanic(v21) && !isOceanic(v01) && !isOceanic(v12))
out[i + j*w] = v11;
else
out[i + j*w] = beach;
}
else
{
if (getBiomeType(v10) == Mesa && getBiomeType(v21) == Mesa && getBiomeType(v01) == Mesa && getBiomeType(v12) == Mesa)
out[i + j*w] = v11;
}
else
out[i + j*w] = desert;
}
else
{
if (!isOceanic(v10) && !isOceanic(v21) && !isOceanic(v01) && !isOceanic(v12))
{
if (getBiomeType(v10) == Mesa && getBiomeType(v21) == Mesa && getBiomeType(v01) == Mesa && getBiomeType(v12) == Mesa)
out[i + j*w] = v11;
else
out[i + j*w] = desert;
}
else
{
out[i + j*w] = v11;
}
out[i + j*w] = v11;
}
}
else
{
replaceOcean(out, i + j*w, v10, v21, v01, v12, v11, stone_shore);
if (v11 != ocean && v11 != deep_ocean && v11 != river && v11 != swamp)
{
if (isOceanic(v10) || isOceanic(v21) || isOceanic(v01) || isOceanic(v12))
out[i + j*w] = beach;
else
out[i + j*w] = v11;
}
else
{
out[i + j*w] = v11;
}
}
}
}