mirror of
https://github.com/neoStudiosLCE/neoLegacy.git
synced 2026-06-10 18:42:55 +00:00
world gen changes
init(int64_t seed) to init(uint32_t seed)
This commit is contained in:
parent
e176a9f5ec
commit
ab68bcfd15
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue