summaryrefslogtreecommitdiff
path: root/src/mapgen.cpp
diff options
context:
space:
mode:
authorkwolekr <kwolekr@minetest.net>2016-06-04 01:35:37 -0400
committerkwolekr <kwolekr@minetest.net>2016-06-04 01:51:44 -0400
commitdfbdb5bcd7bc48efb21d585d5c22454a9d5f0f1e (patch)
tree20f2d5cbb64f1a6bf0ee2638f4396effb42d362b /src/mapgen.cpp
parent2060fd9cbe587d7e8ffe0cecdd67925f13a56c05 (diff)
downloadminetest-dfbdb5bcd7bc48efb21d585d5c22454a9d5f0f1e.tar.gz
minetest-dfbdb5bcd7bc48efb21d585d5c22454a9d5f0f1e.tar.bz2
minetest-dfbdb5bcd7bc48efb21d585d5c22454a9d5f0f1e.zip
Change internal type for seeds to s32
This fixes value truncation (and therefore incompatibility) on platforms with an LP32 data model, such as VAX or MS-DOS.
Diffstat (limited to 'src/mapgen.cpp')
-rw-r--r--src/mapgen.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/mapgen.cpp b/src/mapgen.cpp
index 041356e3d..32f7e29eb 100644
--- a/src/mapgen.cpp
+++ b/src/mapgen.cpp
@@ -89,11 +89,25 @@ Mapgen::Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge) :
{
generating = false;
id = mapgenid;
- seed = (int)params->seed;
water_level = params->water_level;
flags = params->flags;
csize = v3s16(1, 1, 1) * (params->chunksize * MAP_BLOCKSIZE);
+ /*
+ We are losing half our entropy by doing this, but it is necessary to
+ preserve reverse compatibility. If the top half of our current 64 bit
+ seeds ever starts getting used, existing worlds will break due to a
+ different hash outcome and no way to differentiate between versions.
+
+ A solution could be to add a new bit to designate that the top half of
+ the seed value should be used, essentially a 1-bit version code, but
+ this would require increasing the total size of a seed to 9 bytes (yuck)
+
+ It's probably okay if this never gets fixed. 4.2 billion possibilities
+ ought to be enough for anyone.
+ */
+ seed = (s32)params->seed;
+
vm = NULL;
ndef = emerge->ndef;
biomegen = NULL;
@@ -107,7 +121,7 @@ Mapgen::~Mapgen()
}
-u32 Mapgen::getBlockSeed(v3s16 p, int seed)
+u32 Mapgen::getBlockSeed(v3s16 p, s32 seed)
{
return (u32)seed +
p.Z * 38134234 +
@@ -116,7 +130,7 @@ u32 Mapgen::getBlockSeed(v3s16 p, int seed)
}
-u32 Mapgen::getBlockSeed2(v3s16 p, int seed)
+u32 Mapgen::getBlockSeed2(v3s16 p, s32 seed)
{
u32 n = 1619 * p.X + 31337 * p.Y + 52591 * p.Z + 1013 * seed;
n = (n >> 13) ^ n;