diff --git a/Minecraft.World/Layer.cpp b/Minecraft.World/Layer.cpp index ad0322fe..f10082d1 100644 --- a/Minecraft.World/Layer.cpp +++ b/Minecraft.World/Layer.cpp @@ -21,25 +21,27 @@ libdivide::divider fast_d10(10); LayerArray Layer::getDefaultLayers(int64_t seed, LevelType* levelType, void* superflatConfig) { - 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); + int32_t seed32 = (int32_t)seed; - shared_ptr baseLayer = ZoomLayer::zoom(seed, islandLayer, 0x3E8, 0); + shared_ptr islandLayer = make_shared(seed32, 1); + islandLayer = make_shared(seed32, islandLayer, 0x7D0); + islandLayer = make_shared(seed32, islandLayer, 1); + islandLayer = make_shared(seed32, islandLayer, 0x7D1); + islandLayer = make_shared(seed32, islandLayer, 2); + islandLayer = make_shared(seed32, islandLayer, 0x32); + islandLayer = make_shared(seed32, islandLayer, 0x46); + islandLayer = make_shared(seed32, islandLayer, 2); + islandLayer = make_shared(seed32, islandLayer, 2); + islandLayer = make_shared(seed32, islandLayer, 3); + islandLayer = make_shared(seed32, islandLayer, 2, 0); + islandLayer = make_shared(seed32, islandLayer, 2, 1); + islandLayer = make_shared(seed32, islandLayer, 3, 2); + islandLayer = make_shared(seed32, islandLayer, 0x7D2); + islandLayer = make_shared(seed32, islandLayer, 0x7D3); + islandLayer = make_shared(seed32, islandLayer, 4); + islandLayer = make_shared(seed32, islandLayer, 4); + + shared_ptr baseLayer = ZoomLayer::zoom(seed32, islandLayer, 0x3E8, 0); int zoomLevel = 4; int riverZoomCount = 4; @@ -54,38 +56,38 @@ LayerArray Layer::getDefaultLayers(int64_t seed, LevelType* levelType, void* sup 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 riverInit = make_shared(seed32, baseLayer, 0x64); + shared_ptr hillsNoise = ZoomLayer::zoom(seed32, riverInit, 0x3E8, 2); - shared_ptr riverLayerFinal = ZoomLayer::zoom(seed, riverInit, 0x3E8, 2); - riverLayerFinal = ZoomLayer::zoom(seed, riverLayerFinal, 0x3E8, riverZoomCount); - riverLayerFinal = make_shared(seed, riverLayerFinal, 1); - riverLayerFinal = make_shared(seed, riverLayerFinal, 0x3E8); + shared_ptr riverLayerFinal = ZoomLayer::zoom(seed32, riverInit, 0x3E8, 2); + riverLayerFinal = ZoomLayer::zoom(seed32, riverLayerFinal, 0x3E8, riverZoomCount); + riverLayerFinal = make_shared(seed32, riverLayerFinal, 1); + riverLayerFinal = make_shared(seed32, riverLayerFinal, 0x3E8); - shared_ptr biomeLayer = make_shared(seed, baseLayer, 0xC8, levelType, superflatConfig); + shared_ptr biomeLayer = make_shared(seed32, baseLayer, 0xC8, levelType, superflatConfig); - biomeLayer = make_shared(seed, biomeLayer, 0x3E8); - biomeLayer = make_shared(seed, biomeLayer, hillsNoise, 0x3E8); - biomeLayer = make_shared(seed, biomeLayer, 0x3E9); + biomeLayer = make_shared(seed32, biomeLayer, 0x3E8); + biomeLayer = make_shared(seed32, biomeLayer, hillsNoise, 0x3E8); + biomeLayer = make_shared(seed32, biomeLayer, 0x3E9); for (int i = 0; i < zoomLevel; ++i) { - biomeLayer = make_shared(seed, biomeLayer, 0x3E8 + i); + biomeLayer = make_shared(seed32, biomeLayer, 0x3E8 + i); if (i == 0) { - biomeLayer = make_shared(seed, biomeLayer, 3); - biomeLayer = make_shared(seed, biomeLayer, 5); + biomeLayer = make_shared(seed32, biomeLayer, 3); + biomeLayer = make_shared(seed32, biomeLayer, 5); } if (zoomLevel == 1 || i == 1) { - biomeLayer = make_shared(seed, biomeLayer, 5); - biomeLayer = make_shared(seed, biomeLayer, 0x3E8); + biomeLayer = make_shared(seed32, biomeLayer, 5); + biomeLayer = make_shared(seed32, biomeLayer, 0x3E8); } } - biomeLayer = make_shared(seed, biomeLayer, 0x3E8); - shared_ptr mixed = make_shared(seed, biomeLayer, riverLayerFinal, 0x64); - shared_ptr voronoi = make_shared(seed, mixed, 0xA); + biomeLayer = make_shared(seed32, biomeLayer, 0x3E8); + shared_ptr mixed = make_shared(seed32, biomeLayer, riverLayerFinal, 0x64); + shared_ptr voronoi = make_shared(seed32, mixed, 0xA); mixed->init(seed); voronoi->init(seed); @@ -106,6 +108,7 @@ Layer::Layer(int64_t s) int64_t b = (0x5851F42D4C957F2DLL * a + 0x14057B7EF767814FLL) * a + sm; this->seedMixup = b * (0x5851F42D4C957F2DLL * b + 0x14057B7EF767814FLL) + sm; + app.DebugPrintf("Layer ctor: s=%lld, seedMixup=%lld\n", s, this->seedMixup); this->parent = nullptr; this->seed = 0; this->rval = 0; @@ -149,25 +152,26 @@ int Layer::nextRandom(int max) return result; } -void Layer::init(uint32_t seed) +void Layer::init(int64_t seed) { if (parent != nullptr) parent->init(seed); - - uint32_t lo = seed; - int64_t m = this->seedMixup; - + + uint32_t lo = (uint32_t)seed; + uint32_t m = (uint32_t)seedMixup; uint32_t v12 = lo * (1284865837u * lo - 144211633u); - int64_t sum = (int64_t)(int32_t)(v12) + m; - + uint32_t sum = v12 + m; - int64_t step1 = sum * (1284865837LL * (int32_t)sum - 144211633LL); - int64_t sum2 = step1 + m; - + uint32_t step1 = sum * (1284865837u * sum - 144211633u); + uint32_t sum2 = step1 + m; - int64_t step2 = sum2 * (0x5851F42D4C957F2DLL * sum2 + 0x14057B7EF767814FLL) + m; - + int64_t step2 = (int64_t)(int32_t)sum2 + * (0x5851F42D4C957F2DLL * (int64_t)(int32_t)sum2 + + 0x14057B7EF767814FLL) + + (int64_t)(int32_t)m; + + app.DebugPrintf("init: seed=%lld, m=%u, result=%lld\n", seed, m, step2); this->seed = step2; } diff --git a/Minecraft.World/Layer.h b/Minecraft.World/Layer.h index 01949e61..4d798c0f 100644 --- a/Minecraft.World/Layer.h +++ b/Minecraft.World/Layer.h @@ -16,7 +16,7 @@ protected: public: static LayerArray getDefaultLayers(int64_t seed, LevelType *levelType, void* superflatConfig = nullptr); Layer(int64_t seedMixup); - virtual void init(uint32_t seed); + 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); diff --git a/Minecraft.World/RegionHillsLayer.cpp b/Minecraft.World/RegionHillsLayer.cpp index aae9875c..81b3a49e 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(uint32_t seed) +void RegionHillsLayer::init(int64_t seed) { Layer::init(seed); if (riverNoise != nullptr) diff --git a/Minecraft.World/RegionHillsLayer.h b/Minecraft.World/RegionHillsLayer.h index e23b6500..4cbd8568 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(uint32_t seed) override; + virtual void init(int64_t seed) override; virtual intArray getArea(int xo, int yo, int w, int h) override; private: