world gen changes

init(int64_t seed) to init(uint32_t seed)
This commit is contained in:
Lord_Cambion 2026-05-15 15:56:38 +02:00
parent e176a9f5ec
commit ab68bcfd15
7 changed files with 145 additions and 164 deletions

View file

@ -15,24 +15,25 @@ intArray AddMushroomIslandLayer::getArea(int xo, int yo, int w, int h)
int pw = w + 2;
int ph = h + 2;
intArray p = parent->getArea(px, py, pw, ph);
intArray result = IntCache::allocate(w * h);
for (int y = 0; y < h; y++)
{
{
for (int x = 0; x < w; x++)
{
{
int n1 = p[(x + 0) + (y + 0) * pw];
int n2 = p[(x + 2) + (y + 0) * pw];
int n3 = p[(x + 0) + (y + 2) * pw];
int n4 = p[(x + 2) + (y + 2) * pw];
int c = p[(x + 1) + (y + 1) * pw];
int c = p[(x + 1) + (y + 1) * pw];
initRandom(x + xo, y + yo);
if (c == 0 && (n1 == 0 && n2 == 0 && n3 == 0 && n4 == 0) && nextRandom(100) == 0)
{
if (c == 0 && n1 == 0 && n2 == 0 && n3 == 0 && n4 == 0
&& nextRandom(100) == 0)
{
result[x + y * w] = Biome::mushroomIsland->id;
}
else
{
else
{
result[x + y * w] = c;
}
}

View file

@ -15,27 +15,35 @@ intArray GrowMushroomIslandLayer::getArea(int xo, int yo, int w, int h)
int pw = w + 2;
int ph = h + 2;
intArray p = parent->getArea(px, py, pw, ph);
intArray result = IntCache::allocate(w * h);
int mushroomId = Biome::mushroomIsland->id;
for (int y = 0; y < h; y++)
{
{
for (int x = 0; x < w; x++)
{
int n1 = p[(x + 0) + (y + 0) * pw];
int n2 = p[(x + 2) + (y + 0) * pw];
int n3 = p[(x + 0) + (y + 2) * pw];
int n4 = p[(x + 2) + (y + 2) * pw];
{
int ul = p[(x + 0) + (y + 0) * pw];
int ur = p[(x + 2) + (y + 0) * pw];
int dl = p[(x + 0) + (y + 2) * pw];
int dr = p[(x + 2) + (y + 2) * pw];
int c = p[(x + 1) + (y + 1) * pw];
int north = p[(x + 1) + (y + 0) * pw];
int south = p[(x + 1) + (y + 2) * pw];
int west = p[(x + 0) + (y + 1) * pw];
int east = p[(x + 2) + (y + 1) * pw];
int c = p[(x + 1) + (y + 1) * pw];
if( ( n1 == Biome::mushroomIsland->id ) || ( n2 == Biome::mushroomIsland->id ) || ( n3 == Biome::mushroomIsland->id ) || ( n4 == Biome::mushroomIsland->id ) )
{
result[x + y * w] = Biome::mushroomIsland->id;
}
else
{
result[x + y * w] = c;
}
if (ul == mushroomId || ur == mushroomId ||
dl == mushroomId || dr == mushroomId ||
north == mushroomId || south == mushroomId ||
west == mushroomId || east == mushroomId)
{
result[x + y * w] = mushroomId;
}
else
{
result[x + y * w] = c;
}
}
}
return result;

View file

@ -21,48 +21,40 @@ libdivide::divider<long long> fast_d10(10);
LayerArray Layer::getDefaultLayers(int64_t seed, LevelType* levelType, void* superflatConfig)
{
shared_ptr<Layer> islandLayer = std::make_shared<IslandLayer>(seed, 1);
islandLayer = std::make_shared<FuzzyZoomLayer>(seed, islandLayer, 0x7D0);
islandLayer = std::make_shared<AddIslandLayer>(seed, islandLayer, 1);
islandLayer = std::make_shared<ZoomLayer>(seed, islandLayer, 0x7D1);
islandLayer = std::make_shared<AddIslandLayer>(seed, islandLayer, 2);
islandLayer = std::make_shared<AddIslandLayer>(seed, islandLayer, 0x32);
islandLayer = std::make_shared<AddIslandLayer>(seed, islandLayer, 0x46);
islandLayer = std::make_shared<RemoveTooMuchOceanLayer>(seed, islandLayer, 2);
islandLayer = std::make_shared<AddSnowLayer>(seed, islandLayer, 2);
islandLayer = std::make_shared<AddIslandLayer>(seed, islandLayer, 3);
islandLayer = std::make_shared<AddEdgeLayer>(seed, islandLayer, 2, 0);
islandLayer = std::make_shared<AddEdgeLayer>(seed, islandLayer, 2, 1);
islandLayer = std::make_shared<AddEdgeLayer>(seed, islandLayer, 3, 2);
islandLayer = std::make_shared<ZoomLayer>(seed, islandLayer, 0x7D2);
islandLayer = std::make_shared<ZoomLayer>(seed, islandLayer, 0x7D3);
islandLayer = std::make_shared<AddIslandLayer>(seed, islandLayer, 4);
islandLayer = std::make_shared<DeepOceanLayer>(seed, islandLayer, 4);
shared_ptr<Layer> islandLayer = make_shared<IslandLayer>(seed, 1);
islandLayer = make_shared<FuzzyZoomLayer>(seed, islandLayer, 0x7D0);
islandLayer = make_shared<AddIslandLayer>(seed, islandLayer, 1);
islandLayer = make_shared<ZoomLayer>(seed, islandLayer, 0x7D1);
islandLayer = make_shared<AddIslandLayer>(seed, islandLayer, 2);
islandLayer = make_shared<AddIslandLayer>(seed, islandLayer, 0x32);
islandLayer = make_shared<AddIslandLayer>(seed, islandLayer, 0x46);
islandLayer = make_shared<RemoveTooMuchOceanLayer>(seed, islandLayer, 2);
islandLayer = make_shared<AddSnowLayer>(seed, islandLayer, 2);
islandLayer = make_shared<AddIslandLayer>(seed, islandLayer, 3);
islandLayer = make_shared<AddEdgeLayer>(seed, islandLayer, 2, 0);
islandLayer = make_shared<AddEdgeLayer>(seed, islandLayer, 2, 1);
islandLayer = make_shared<AddEdgeLayer>(seed, islandLayer, 3, 2);
islandLayer = make_shared<ZoomLayer>(seed, islandLayer, 0x7D2);
islandLayer = make_shared<ZoomLayer>(seed, islandLayer, 0x7D3);
islandLayer = make_shared<AddIslandLayer>(seed, islandLayer, 4);
islandLayer = make_shared<DeepOceanLayer>(seed, islandLayer, 4);
shared_ptr<Layer> baseLayer = ZoomLayer::zoom(seed, islandLayer, 0x3E8, 0);
int zoomLevel = 4;
int riverZoomCount = 4;
if (levelType == LevelType::lvl_customized && superflatConfig != nullptr)
{
auto settings = CustomizableSourceSettings::Builder::build(
CustomizableSourceSettings::Builder::fromString(superflatConfig));
zoomLevel = settings->getBiomeSize();
riverZoomCount = settings->getRiverSize();
}
if (levelType == LevelType::lvl_largeBiomes)
zoomLevel = 6;
shared_ptr<Layer> riverInit = make_shared<RiverInitLayer>(seed, baseLayer, 0x64);
shared_ptr<Layer> hillsNoise = ZoomLayer::zoom(seed, riverInit, 0x3E8, 2);
shared_ptr<Layer> riverLayerFinal = ZoomLayer::zoom(seed, riverInit, 0x3E8, 2);
@ -71,7 +63,7 @@ LayerArray Layer::getDefaultLayers(int64_t seed, LevelType* levelType, void* sup
riverLayerFinal = make_shared<SmoothLayer>(seed, riverLayerFinal, 0x3E8);
shared_ptr<Layer> biomeLayer = make_shared<BiomeInitLayer>(seed, baseLayer, 0xC8, levelType, superflatConfig);
biomeLayer = ZoomLayer::zoom(seed, biomeLayer, 0x3E8, 2);
biomeLayer = make_shared<BiomeEdgeLayer>(seed, biomeLayer, 0x3E8);
biomeLayer = make_shared<RegionHillsLayer>(seed, biomeLayer, hillsNoise, 0x3E8);
biomeLayer = make_shared<RareBiomeSpotLayer>(seed, biomeLayer, 0x3E9);
@ -79,15 +71,12 @@ LayerArray Layer::getDefaultLayers(int64_t seed, LevelType* levelType, void* sup
for (int i = 0; i < zoomLevel; ++i)
{
biomeLayer = make_shared<ZoomLayer>(seed, biomeLayer, 0x3E8 + i);
if (i == 0)
{
biomeLayer = make_shared<AddIslandLayer>(seed, biomeLayer, 3);
biomeLayer = make_shared<AddMushroomIslandLayer>(seed, biomeLayer, 5);
}
if (zoomLevel == 1||i == 1)
if (zoomLevel == 1 || i == 1)
{
biomeLayer = make_shared<GrowMushroomIslandLayer>(seed, biomeLayer, 5);
biomeLayer = make_shared<ShoreLayer>(seed, biomeLayer, 0x3E8);
@ -95,7 +84,6 @@ LayerArray Layer::getDefaultLayers(int64_t seed, LevelType* levelType, void* sup
}
biomeLayer = make_shared<SmoothLayer>(seed, biomeLayer, 0x3E8);
shared_ptr<Layer> mixed = make_shared<RiverMixerLayer>(seed, biomeLayer, riverLayerFinal, 0x64);
shared_ptr<Layer> voronoi = make_shared<VoronoiZoom>(seed, mixed, 0xA);
@ -109,73 +97,78 @@ LayerArray Layer::getDefaultLayers(int64_t seed, LevelType* levelType, void* sup
return result;
}
Layer::Layer(int64_t seedMixup)
Layer::Layer(int64_t s)
{
parent = nullptr;
this->seedMixup = seedMixup;
this->seedMixup *= this->seedMixup * 6364136223846793005l + 1442695040888963407l;
this->seedMixup += seedMixup;
this->seedMixup *= this->seedMixup * 6364136223846793005l + 1442695040888963407l;
this->seedMixup += seedMixup;
this->seedMixup *= this->seedMixup * 6364136223846793005l + 1442695040888963407l;
this->seedMixup += seedMixup;
int64_t sm = (int64_t)(int32_t)s;
int64_t a = sm * (0x5851F42D4C957F2DLL * sm + 0x14057B7EF767814FLL) + sm;
int64_t b = (0x5851F42D4C957F2DLL * a + 0x14057B7EF767814FLL) * a + sm;
this->seedMixup = b * (0x5851F42D4C957F2DLL * b + 0x14057B7EF767814FLL) + sm;
this->parent = nullptr;
this->seed = 0;
this->rval = 0;
}
void Layer::initRandom(int64_t x, int64_t y)
{
rval = seed;
rval *= rval * 6364136223846793005L + 1442695040888963407L;
rval += x;
rval *= rval * 6364136223846793005L + 1442695040888963407L;
rval += y;
rval *= rval * 6364136223846793005L + 1442695040888963407L;
rval += x;
rval *= rval * 6364136223846793005L + 1442695040888963407L;
rval += y;
int64_t xi = (int64_t)(int32_t)x;
int64_t yi = (int64_t)(int32_t)y;
int64_t v4 = (0x5851F42D4C957F2DLL * seed + 0x14057B7EF767814FLL) * seed + xi;
uint32_t v5 = 1284865837u * (uint32_t)(v4 * (1284865837LL * (int32_t)v4 - 144211633LL) + yi) - 144211633u;
int64_t paired = (int64_t)(((uint64_t)v5 << 32) | (uint64_t)v5);
int64_t v6 = paired * (v4 * (0x5851F42D4C957F2DLL * v4 + 0x14057B7EF767814FLL) + yi) + xi;
uint32_t lo = 1284865837u * (uint32_t)v6 - 144211633u;
int64_t paired2 = (int64_t)(((uint64_t)lo << 32) | (uint64_t)lo);
rval = paired2 * v6 + yi;
}
int Layer::nextRandom(int max)
{
#ifdef __PSVITA__
int result;
long long temp = rval;
temp >>= 24;
if (max == 2)
result = temp - (temp / fast_d2) * 2;
else if (max == 3)
result = temp - (temp / fast_d3) * 3;
else if (max == 4)
result = temp - (temp / fast_d4) * 4;
else if (max == 5)
result = temp - (temp / fast_d5) * 5;
else if (max == 6)
result = temp - (temp / fast_d6) * 6;
else if (max == 7)
result = temp - (temp / fast_d7) * 7;
else if (max == 10)
result = temp - (temp / fast_d10) * 10;
else
result = temp - (temp / max) * max;
#else
int result = static_cast<int>((rval >> 24) % max);
#endif
int32_t hi = (int32_t)(rval >> 32);
int temp = hi >> 24;
int result = temp % max;
if (result < 0) result += max;
rval *= rval * 6364136223846793005L + 1442695040888963407L;
rval += seed;
int64_t v = rval;
int64_t lo = (int64_t)(int32_t)(
(int32_t)v * (1284865837 * (int32_t)v - 144211633)
+ (int32_t)seed);
int64_t hi64 = v * (0x5851F42D4C957F2DLL * v + 0x14057B7EF767814FLL) + seed;
rval = (hi64 & 0xFFFFFFFF00000000LL) | (uint32_t)lo;
return result;
}
void Layer::init(int64_t seed)
void Layer::init(uint32_t seed)
{
this->seed = seed;
if (parent != nullptr) parent->init(seed);
this->seed *= this->seed * 6364136223846793005L + 1442695040888963407L;
this->seed += seedMixup;
this->seed *= this->seed * 6364136223846793005L + 1442695040888963407L;
this->seed += seedMixup;
this->seed *= this->seed * 6364136223846793005L + 1442695040888963407L;
this->seed += seedMixup;
if (parent != nullptr)
parent->init(seed);
uint32_t lo = seed;
int64_t m = this->seedMixup;
uint32_t v12 = lo * (1284865837u * lo - 144211633u);
int64_t sum = (int64_t)(int32_t)(v12) + m;
int64_t step1 = sum * (1284865837LL * (int32_t)sum - 144211633LL);
int64_t sum2 = step1 + m;
int64_t step2 = sum2 * (0x5851F42D4C957F2DLL * sum2 + 0x14057B7EF767814FLL) + m;
this->seed = step2;
}
bool Layer::isOcean(int biomeId)

View file

@ -1,40 +1,30 @@
#pragma once
#include "ArrayWithLength.h"
class LevelType;
#ifndef _CONTENT_PACAKGE
#define _BIOME_OVERRIDE
#endif
class Layer
{
private:
int64_t seed;
int64_t seed;
protected:
shared_ptr<Layer>parent;
protected:
int64_t rval;
int64_t seedMixup;
shared_ptr<Layer> parent;
int64_t rval;
int64_t seedMixup;
public:
static LayerArray getDefaultLayers(int64_t seed, LevelType *levelType, void* superflatConfig = nullptr);
Layer(int64_t seedMixup);
virtual void init(int64_t seed);
bool isOcean(int biomeId);
bool isSame(int biomeIdA, int biomeIdB);
virtual void initRandom(int64_t x, int64_t y);
static LayerArray getDefaultLayers(int64_t seed, LevelType *levelType, void* superflatConfig = nullptr);
Layer(int64_t seedMixup);
virtual void init(uint32_t seed);
bool isOcean(int biomeId);
bool isSame(int biomeIdA, int biomeIdB);
virtual void initRandom(int64_t x, int64_t y);
protected:
int nextRandom(int max);
int random(int i, int j, int k, int l);
int random(int i, int j);
int modeOrRandom(int i, int j, int k, int l);
int nextRandom(int max);
int random(int i, int j, int k, int l);
int random(int i, int j);
int modeOrRandom(int i, int j, int k, int l);
public:
virtual intArray getArea(int xo, int yo, int w, int h) = 0;
virtual intArray getArea(int xo, int yo, int w, int h) = 0;
};

View file

@ -17,7 +17,7 @@ RegionHillsLayer::RegionHillsLayer(int64_t seed, shared_ptr<Layer> parent, share
this->riverNoise = riverNoise;
}
void RegionHillsLayer::init(int64_t seed)
void RegionHillsLayer::init(uint32_t seed)
{
Layer::init(seed);
if (riverNoise != nullptr)

View file

@ -11,7 +11,7 @@ public:
RegionHillsLayer(int64_t seed, shared_ptr<Layer> parent);
RegionHillsLayer(int64_t seed, shared_ptr<Layer> parent, shared_ptr<Layer> riverNoise, int64_t seedMixup);
virtual void init(int64_t seed) override;
virtual void init(uint32_t seed) override;
virtual intArray getArea(int xo, int yo, int w, int h) override;
private:

View file

@ -53,32 +53,21 @@ int ZoomLayer::random(int a, int b)
int ZoomLayer::random(int a, int b, int c, int d)
{
if (b == c && c == d) return b;
if (a == b && a == c) return a;
if (a == b && a == d) return a;
if (a == c && a == d) return a;
if (a == b && c != d) return a;
if (a == c && b != d) return a;
if (a == d && b != c) return a;
if (b == a && c != d) return b;
if (b == c && a != d) return b;
if (b == d && a != c) return b;
if (c == a && b != d) return c;
if (c == b && a != d) return c;
if (c == d && a != b) return c;
if (d == a && b != c) return c;
if (d == b && a != c) return c;
if (d == c && a != b) return c;
int s = nextRandom(4);
if (s == 0) return a;
if (s == 1) return b;
if (s == 2) return c;
return d;
if (b == c && c == d) return b;
if (a == b && (a == c || a == d || c != d)) return a;
if (a == c && (a == d || b != d)) return a;
if (a == d && b != c) return a;
if (b == c && a != d) return b;
if (b == d && a != c) return b;
if (c == d && a != b) return c;
int s = nextRandom(4);
if (s == 0) return a;
if (s == 1) return b;
if (s == 2) return c;
return d;
}
shared_ptr<Layer>ZoomLayer::zoom(int64_t seed, shared_ptr<Layer> sup, int64_t seedMixup, int count)