diff --git a/Minecraft.World/AddMushroomIslandLayer.cpp b/Minecraft.World/AddMushroomIslandLayer.cpp index 99815ed8..49e00396 100644 --- a/Minecraft.World/AddMushroomIslandLayer.cpp +++ b/Minecraft.World/AddMushroomIslandLayer.cpp @@ -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; } } diff --git a/Minecraft.World/GrowMushroomIslandLayer.cpp b/Minecraft.World/GrowMushroomIslandLayer.cpp index 1a13e69a..b95abd23 100644 --- a/Minecraft.World/GrowMushroomIslandLayer.cpp +++ b/Minecraft.World/GrowMushroomIslandLayer.cpp @@ -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; diff --git a/Minecraft.World/Layer.cpp b/Minecraft.World/Layer.cpp index 52010d59..ad0322fe 100644 --- a/Minecraft.World/Layer.cpp +++ b/Minecraft.World/Layer.cpp @@ -21,48 +21,40 @@ libdivide::divider fast_d10(10); LayerArray Layer::getDefaultLayers(int64_t seed, LevelType* levelType, void* superflatConfig) { - shared_ptr islandLayer = std::make_shared(seed, 1); - islandLayer = std::make_shared(seed, islandLayer, 0x7D0); - islandLayer = std::make_shared(seed, islandLayer, 1); - islandLayer = std::make_shared(seed, islandLayer, 0x7D1); - islandLayer = std::make_shared(seed, islandLayer, 2); - islandLayer = std::make_shared(seed, islandLayer, 0x32); - islandLayer = std::make_shared(seed, islandLayer, 0x46); - islandLayer = std::make_shared(seed, islandLayer, 2); - islandLayer = std::make_shared(seed, islandLayer, 2); - islandLayer = std::make_shared(seed, islandLayer, 3); - islandLayer = std::make_shared(seed, islandLayer, 2, 0); - islandLayer = std::make_shared(seed, islandLayer, 2, 1); - islandLayer = std::make_shared(seed, islandLayer, 3, 2); - islandLayer = std::make_shared(seed, islandLayer, 0x7D2); - islandLayer = std::make_shared(seed, islandLayer, 0x7D3); - islandLayer = std::make_shared(seed, islandLayer, 4); - - - - islandLayer = std::make_shared(seed, islandLayer, 4); + shared_ptr islandLayer = make_shared(seed, 1); + islandLayer = make_shared(seed, islandLayer, 0x7D0); + islandLayer = make_shared(seed, islandLayer, 1); + islandLayer = make_shared(seed, islandLayer, 0x7D1); + islandLayer = make_shared(seed, islandLayer, 2); + islandLayer = make_shared(seed, islandLayer, 0x32); + islandLayer = make_shared(seed, islandLayer, 0x46); + islandLayer = make_shared(seed, islandLayer, 2); + islandLayer = make_shared(seed, islandLayer, 2); + islandLayer = make_shared(seed, islandLayer, 3); + islandLayer = make_shared(seed, islandLayer, 2, 0); + islandLayer = make_shared(seed, islandLayer, 2, 1); + islandLayer = make_shared(seed, islandLayer, 3, 2); + islandLayer = make_shared(seed, islandLayer, 0x7D2); + islandLayer = make_shared(seed, islandLayer, 0x7D3); + islandLayer = make_shared(seed, islandLayer, 4); + islandLayer = make_shared(seed, islandLayer, 4); shared_ptr 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 riverInit = make_shared(seed, baseLayer, 0x64); - shared_ptr hillsNoise = ZoomLayer::zoom(seed, riverInit, 0x3E8, 2); shared_ptr riverLayerFinal = ZoomLayer::zoom(seed, riverInit, 0x3E8, 2); @@ -71,7 +63,7 @@ LayerArray Layer::getDefaultLayers(int64_t seed, LevelType* levelType, void* sup riverLayerFinal = make_shared(seed, riverLayerFinal, 0x3E8); shared_ptr biomeLayer = make_shared(seed, baseLayer, 0xC8, levelType, superflatConfig); - biomeLayer = ZoomLayer::zoom(seed, biomeLayer, 0x3E8, 2); + biomeLayer = make_shared(seed, biomeLayer, 0x3E8); biomeLayer = make_shared(seed, biomeLayer, hillsNoise, 0x3E8); biomeLayer = make_shared(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(seed, biomeLayer, 0x3E8 + i); - if (i == 0) { biomeLayer = make_shared(seed, biomeLayer, 3); biomeLayer = make_shared(seed, biomeLayer, 5); } - - - if (zoomLevel == 1||i == 1) + if (zoomLevel == 1 || i == 1) { biomeLayer = make_shared(seed, biomeLayer, 5); biomeLayer = make_shared(seed, biomeLayer, 0x3E8); @@ -95,7 +84,6 @@ LayerArray Layer::getDefaultLayers(int64_t seed, LevelType* levelType, void* sup } biomeLayer = make_shared(seed, biomeLayer, 0x3E8); - shared_ptr mixed = make_shared(seed, biomeLayer, riverLayerFinal, 0x64); shared_ptr voronoi = make_shared(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((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) diff --git a/Minecraft.World/Layer.h b/Minecraft.World/Layer.h index cfc3cf28..01949e61 100644 --- a/Minecraft.World/Layer.h +++ b/Minecraft.World/Layer.h @@ -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_ptrparent; - -protected: - int64_t rval; - int64_t seedMixup; - + shared_ptr 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; }; \ No newline at end of file diff --git a/Minecraft.World/RegionHillsLayer.cpp b/Minecraft.World/RegionHillsLayer.cpp index 81b3a49e..aae9875c 100644 --- a/Minecraft.World/RegionHillsLayer.cpp +++ b/Minecraft.World/RegionHillsLayer.cpp @@ -17,7 +17,7 @@ RegionHillsLayer::RegionHillsLayer(int64_t seed, shared_ptr parent, share this->riverNoise = riverNoise; } -void RegionHillsLayer::init(int64_t seed) +void RegionHillsLayer::init(uint32_t seed) { Layer::init(seed); if (riverNoise != nullptr) diff --git a/Minecraft.World/RegionHillsLayer.h b/Minecraft.World/RegionHillsLayer.h index 4cbd8568..e23b6500 100644 --- a/Minecraft.World/RegionHillsLayer.h +++ b/Minecraft.World/RegionHillsLayer.h @@ -11,7 +11,7 @@ public: RegionHillsLayer(int64_t seed, shared_ptr parent); RegionHillsLayer(int64_t seed, shared_ptr parent, shared_ptr 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: diff --git a/Minecraft.World/ZoomLayer.cpp b/Minecraft.World/ZoomLayer.cpp index 88f3e0b3..d1dd7799 100644 --- a/Minecraft.World/ZoomLayer.cpp +++ b/Minecraft.World/ZoomLayer.cpp @@ -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_ptrZoomLayer::zoom(int64_t seed, shared_ptr sup, int64_t seedMixup, int count)