diff --git a/finders.c b/finders.c index cb71be7..99b2ee4 100644 --- a/finders.c +++ b/finders.c @@ -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) { diff --git a/generator.c b/generator.c index 273860d..14408af 100644 --- a/generator.c +++ b/generator.c @@ -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); diff --git a/layers.c b/layers.c index e056304..46e86bf 100644 --- a/layers.c +++ b/layers.c @@ -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; + } } } }