Change internal type for seeds to s32
authorkwolekr <kwolekr@minetest.net>
Sat, 4 Jun 2016 05:35:37 +0000 (01:35 -0400)
committerkwolekr <kwolekr@minetest.net>
Sat, 4 Jun 2016 05:51:44 +0000 (01:51 -0400)
This fixes value truncation (and therefore incompatibility) on platforms
with an LP32 data model, such as VAX or MS-DOS.

13 files changed:
src/cavegen.cpp
src/cavegen.h
src/dungeongen.h
src/mapgen.cpp
src/mapgen.h
src/mg_biome.h
src/noise.cpp
src/noise.h
src/script/lua_api/l_env.cpp
src/script/lua_api/l_noise.cpp
src/script/lua_api/l_noise.h
src/treegen.cpp
src/treegen.h

index 1c25ce71198d535e30e5d5dc6e9bcd0b1399545b..dc7355fe074949135287e02c96eeeea3a3d5a8cb 100644 (file)
@@ -35,7 +35,7 @@ static NoiseParams nparams_caveliquids(0, 1, v3f(150.0, 150.0, 150.0), 776, 3, 0
 
 CavesNoiseIntersection::CavesNoiseIntersection(
        INodeDefManager *nodedef, BiomeManager *biomemgr, v3s16 chunksize,
-       NoiseParams *np_cave1, NoiseParams *np_cave2, int seed, float cave_width)
+       NoiseParams *np_cave1, NoiseParams *np_cave2, s32 seed, float cave_width)
 {
        assert(nodedef);
        assert(biomemgr);
@@ -130,7 +130,7 @@ void CavesNoiseIntersection::generateCaves(MMVManip *vm,
 CavesRandomWalk::CavesRandomWalk(
        INodeDefManager *ndef,
        GenerateNotifier *gennotify,
-       int seed,
+       s32 seed,
        int water_level,
        content_t water_source,
        content_t lava_source)
index da0894635033ad1374c404b75829472f6b70de17..2bf503d476dd105bf2beca0d5689e6f46ff53856 100644 (file)
@@ -41,7 +41,7 @@ class CavesNoiseIntersection {
 public:
        CavesNoiseIntersection(INodeDefManager *nodedef, BiomeManager *biomemgr,
                v3s16 chunksize, NoiseParams *np_cave1, NoiseParams *np_cave2,
-               int seed, float cave_width);
+               s32 seed, float cave_width);
        ~CavesNoiseIntersection();
 
        void generateCaves(MMVManip *vm, v3s16 nmin, v3s16 nmax, u8 *biomemap);
@@ -83,7 +83,7 @@ public:
        s16 *heightmap;
 
        // configurable parameters
-       int seed;
+       s32 seed;
        int water_level;
        int lava_depth;
        NoiseParams *np_caveliquids;
@@ -122,7 +122,7 @@ public:
        // If gennotify is NULL, generation events are not logged.
        CavesRandomWalk(INodeDefManager *ndef,
                GenerateNotifier *gennotify = NULL,
-               int seed = 0,
+               s32 seed = 0,
                int water_level = 1,
                content_t water_source = CONTENT_IGNORE,
                content_t lava_source = CONTENT_IGNORE);
index f0a5e5ba80b8eafd0c191e0911c1ece7f2c74a07..8986274834e2f6adc55c12095c10ff04a030f2cb 100644 (file)
@@ -39,7 +39,7 @@ int dir_to_facedir(v3s16 d);
 
 
 struct DungeonParams {
-       int seed;
+       s32 seed;
 
        content_t c_water;
        content_t c_river_water;
index 041356e3dd89007cbb6adcd2442f0b807ae31e31..32f7e29eb1912b2b80995b62fd3e1cec0c65a7bf 100644 (file)
@@ -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;
index 10595fafc6b8f1d9646a35c2b1613487bcf15062..0342fd46e32fbc3320af399825774d94374b70c1 100644 (file)
@@ -150,7 +150,7 @@ struct MapgenParams {
 */
 class Mapgen {
 public:
-       int seed;
+       s32 seed;
        int water_level;
        u32 flags;
        bool generating;
@@ -171,8 +171,8 @@ public:
        Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge);
        virtual ~Mapgen();
 
-       static u32 getBlockSeed(v3s16 p, int seed);
-       static u32 getBlockSeed2(v3s16 p, int seed);
+       static u32 getBlockSeed(v3s16 p, s32 seed);
+       static u32 getBlockSeed2(v3s16 p, s32 seed);
        s16 findGroundLevelFull(v2s16 p2d);
        s16 findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax);
        s16 findLiquidSurface(v2s16 p2d, s16 ymin, s16 ymax);
index e78e90e5f4c8eb054812c0eccfef0e7a971b5689..389b7664fac79b59ee2d7cf0218ec0fa56c67f61 100644 (file)
@@ -80,7 +80,7 @@ struct BiomeParams {
        virtual void writeParams(Settings *settings) const = 0;
        virtual ~BiomeParams() {}
 
-       int seed;
+       s32 seed;
 };
 
 class BiomeGen {
index 2ddc3926f56ca430a6010b06aa281010c24f4d89..c57c98ccbb8480a45b0d2997bfa268d8921492fb 100644 (file)
@@ -156,7 +156,7 @@ s32 PcgRandom::randNormalDist(s32 min, s32 max, int num_trials)
 
 ///////////////////////////////////////////////////////////////////////////////
 
-float noise2d(int x, int y, int seed)
+float noise2d(int x, int y, s32 seed)
 {
        unsigned int n = (NOISE_MAGIC_X * x + NOISE_MAGIC_Y * y
                        + NOISE_MAGIC_SEED * seed) & 0x7fffffff;
@@ -166,7 +166,7 @@ float noise2d(int x, int y, int seed)
 }
 
 
-float noise3d(int x, int y, int z, int seed)
+float noise3d(int x, int y, int z, s32 seed)
 {
        unsigned int n = (NOISE_MAGIC_X * x + NOISE_MAGIC_Y * y + NOISE_MAGIC_Z * z
                        + NOISE_MAGIC_SEED * seed) & 0x7fffffff;
@@ -235,7 +235,7 @@ float triLinearInterpolationNoEase(
        return linearInterpolation(u, v, z);
 }
 
-float noise2d_gradient(float x, float y, int seed, bool eased)
+float noise2d_gradient(float x, float y, s32 seed, bool eased)
 {
        // Calculate the integer coordinates
        int x0 = myfloor(x);
@@ -256,7 +256,7 @@ float noise2d_gradient(float x, float y, int seed, bool eased)
 }
 
 
-float noise3d_gradient(float x, float y, float z, int seed, bool eased)
+float noise3d_gradient(float x, float y, float z, s32 seed, bool eased)
 {
        // Calculate the integer coordinates
        int x0 = myfloor(x);
@@ -290,7 +290,7 @@ float noise3d_gradient(float x, float y, float z, int seed, bool eased)
 }
 
 
-float noise2d_perlin(float x, float y, int seed,
+float noise2d_perlin(float x, float y, s32 seed,
        int octaves, float persistence, bool eased)
 {
        float a = 0;
@@ -306,7 +306,7 @@ float noise2d_perlin(float x, float y, int seed,
 }
 
 
-float noise2d_perlin_abs(float x, float y, int seed,
+float noise2d_perlin_abs(float x, float y, s32 seed,
        int octaves, float persistence, bool eased)
 {
        float a = 0;
@@ -321,7 +321,7 @@ float noise2d_perlin_abs(float x, float y, int seed,
 }
 
 
-float noise3d_perlin(float x, float y, float z, int seed,
+float noise3d_perlin(float x, float y, float z, s32 seed,
        int octaves, float persistence, bool eased)
 {
        float a = 0;
@@ -336,7 +336,7 @@ float noise3d_perlin(float x, float y, float z, int seed,
 }
 
 
-float noise3d_perlin_abs(float x, float y, float z, int seed,
+float noise3d_perlin_abs(float x, float y, float z, s32 seed,
        int octaves, float persistence, bool eased)
 {
        float a = 0;
@@ -363,7 +363,7 @@ float contour(float v)
 ///////////////////////// [ New noise ] ////////////////////////////
 
 
-float NoisePerlin2D(NoiseParams *np, float x, float y, int seed)
+float NoisePerlin2D(NoiseParams *np, float x, float y, s32 seed)
 {
        float a = 0;
        float f = 1.0;
@@ -389,7 +389,7 @@ float NoisePerlin2D(NoiseParams *np, float x, float y, int seed)
 }
 
 
-float NoisePerlin3D(NoiseParams *np, float x, float y, float z, int seed)
+float NoisePerlin3D(NoiseParams *np, float x, float y, float z, s32 seed)
 {
        float a = 0;
        float f = 1.0;
@@ -416,7 +416,7 @@ float NoisePerlin3D(NoiseParams *np, float x, float y, float z, int seed)
 }
 
 
-Noise::Noise(NoiseParams *np_, int seed, u32 sx, u32 sy, u32 sz)
+Noise::Noise(NoiseParams *np_, s32 seed, u32 sx, u32 sy, u32 sz)
 {
        memcpy(&np, np_, sizeof(np));
        this->seed = seed;
@@ -543,7 +543,7 @@ void Noise::resizeNoiseBuf(bool is3d)
 void Noise::gradientMap2D(
                float x, float y,
                float step_x, float step_y,
-               int seed)
+               s32 seed)
 {
        float v00, v01, v10, v11, u, v, orig_u;
        u32 index, i, j, noisex, noisey;
@@ -607,7 +607,7 @@ void Noise::gradientMap2D(
 void Noise::gradientMap3D(
                float x, float y, float z,
                float step_x, float step_y, float step_z,
-               int seed)
+               s32 seed)
 {
        float v000, v010, v100, v110;
        float v001, v011, v101, v111;
index 0e4252dd42a5261c436120c625fe7efb103f6cd9..41b93ae01931ab907f9e673702751b1e2111dbe8 100644 (file)
@@ -148,7 +148,7 @@ struct NoiseParams {
 class Noise {
 public:
        NoiseParams np;
-       int seed;
+       s32 seed;
        u32 sx;
        u32 sy;
        u32 sz;
@@ -157,7 +157,7 @@ public:
        float *persist_buf;
        float *result;
 
-       Noise(NoiseParams *np, int seed, u32 sx, u32 sy, u32 sz=1);
+       Noise(NoiseParams *np, s32 seed, u32 sx, u32 sy, u32 sz=1);
        ~Noise();
 
        void setSize(u32 sx, u32 sy, u32 sz=1);
@@ -167,11 +167,11 @@ public:
        void gradientMap2D(
                float x, float y,
                float step_x, float step_y,
-               int seed);
+               s32 seed);
        void gradientMap3D(
                float x, float y, float z,
                float step_x, float step_y, float step_z,
-               int seed);
+               s32 seed);
 
        float *perlinMap2D(float x, float y, float *persistence_map=NULL);
        float *perlinMap3D(float x, float y, float z, float *persistence_map=NULL);
@@ -202,11 +202,11 @@ private:
 
 };
 
-float NoisePerlin2D(NoiseParams *np, float x, float y, int seed);
-float NoisePerlin3D(NoiseParams *np, float x, float y, float z, int seed);
+float NoisePerlin2D(NoiseParams *np, float x, float y, s32 seed);
+float NoisePerlin3D(NoiseParams *np, float x, float y, float z, s32 seed);
 
 inline float NoisePerlin2D_PO(NoiseParams *np, float x, float xoff,
-       float y, float yoff, int seed)
+       float y, float yoff, s32 seed)
 {
        return NoisePerlin2D(np,
                x + xoff * np->spread.X,
@@ -215,7 +215,7 @@ inline float NoisePerlin2D_PO(NoiseParams *np, float x, float xoff,
 }
 
 inline float NoisePerlin3D_PO(NoiseParams *np, float x, float xoff,
-       float y, float yoff, float z, float zoff, int seed)
+       float y, float yoff, float z, float zoff, s32 seed)
 {
        return NoisePerlin3D(np,
                x + xoff * np->spread.X,
@@ -225,22 +225,22 @@ inline float NoisePerlin3D_PO(NoiseParams *np, float x, float xoff,
 }
 
 // Return value: -1 ... 1
-float noise2d(int x, int y, int seed);
-float noise3d(int x, int y, int z, int seed);
+float noise2d(int x, int y, s32 seed);
+float noise3d(int x, int y, int z, s32 seed);
 
-float noise2d_gradient(float x, float y, int seed, bool eased=true);
-float noise3d_gradient(float x, float y, float z, int seed, bool eased=false);
+float noise2d_gradient(float x, float y, s32 seed, bool eased=true);
+float noise3d_gradient(float x, float y, float z, s32 seed, bool eased=false);
 
-float noise2d_perlin(float x, float y, int seed,
+float noise2d_perlin(float x, float y, s32 seed,
                int octaves, float persistence, bool eased=true);
 
-float noise2d_perlin_abs(float x, float y, int seed,
+float noise2d_perlin_abs(float x, float y, s32 seed,
                int octaves, float persistence, bool eased=true);
 
-float noise3d_perlin(float x, float y, float z, int seed,
+float noise3d_perlin(float x, float y, float z, s32 seed,
                int octaves, float persistence, bool eased=false);
 
-float noise3d_perlin_abs(float x, float y, float z, int seed,
+float noise3d_perlin_abs(float x, float y, float z, s32 seed,
                int octaves, float persistence, bool eased=false);
 
 inline float easeCurve(float t)
index 8284c3fcbc6cd7392cf658e91e29e8abea652214..ebdea09e4ebd1587a66b7aede422fade0bfb2dd8 100644 (file)
@@ -758,7 +758,7 @@ int ModApiEnvMod::l_get_perlin_map(lua_State *L)
                return 0;
        v3s16 size = read_v3s16(L, 2);
 
-       int seed = (int)(env->getServerMap().getSeed());
+       s32 seed = (s32)(env->getServerMap().getSeed());
        LuaPerlinNoiseMap *n = new LuaPerlinNoiseMap(&np, seed, size);
        *(void **)(lua_newuserdata(L, sizeof(void *))) = n;
        luaL_getmetatable(L, "PerlinNoiseMap");
index 04dc6048fbc8c5ea3713eace4e9a648f33b677c9..e0039371f0917aa9f4b3daa3ea87e97f6c1bb879 100644 (file)
@@ -146,7 +146,7 @@ const luaL_reg LuaPerlinNoise::methods[] = {
   LuaPerlinNoiseMap
 */
 
-LuaPerlinNoiseMap::LuaPerlinNoiseMap(NoiseParams *params, int seed, v3s16 size)
+LuaPerlinNoiseMap::LuaPerlinNoiseMap(NoiseParams *params, s32 seed, v3s16 size)
 {
        m_is3d = size.Z > 1;
        np = *params;
index 492eb7550651a8ebc236bacb6df51b8b6763d71a..40bfd13152b6e914d7e8ec0a2c25d114548c54dd 100644 (file)
@@ -79,7 +79,7 @@ class LuaPerlinNoiseMap : public ModApiBase {
        static int l_getMapSlice(lua_State *L);
 
 public:
-       LuaPerlinNoiseMap(NoiseParams *np, int seed, v3s16 size);
+       LuaPerlinNoiseMap(NoiseParams *np, s32 seed, v3s16 size);
 
        ~LuaPerlinNoiseMap();
 
@@ -111,7 +111,7 @@ private:
        static int l_next(lua_State *L);
 
 public:
-       LuaPseudoRandom(int seed) :
+       LuaPseudoRandom(s32 seed) :
                m_pseudo(seed) {}
 
        // LuaPseudoRandom(seed)
index 208f34552cd29813ceba5c9b4495c28e88753aff..36d387c577cb330761d559d6339971fdf9745676 100644 (file)
@@ -31,7 +31,7 @@ namespace treegen
 {
 
 void make_tree(MMVManip &vmanip, v3s16 p0,
-               bool is_apple_tree, INodeDefManager *ndef, int seed)
+               bool is_apple_tree, INodeDefManager *ndef, s32 seed)
 {
        /*
                NOTE: Tree-placing code is currently duplicated in the engine
@@ -149,7 +149,7 @@ treegen::error make_ltree(MMVManip &vmanip, v3s16 p0,
                INodeDefManager *ndef, TreeDef tree_definition)
 {
        MapNode dirtnode(ndef->getId("mapgen_dirt"));
-       int seed;
+       s32 seed;
        if (tree_definition.explicit_seed)
                seed = tree_definition.seed + 14002;
        else
@@ -649,7 +649,7 @@ v3f transposeMatrix(irr::core::matrix4 M, v3f v)
 }
 
 
-void make_jungletree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, int seed)
+void make_jungletree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, s32 seed)
 {
        /*
                NOTE: Tree-placing code is currently duplicated in the engine
@@ -748,7 +748,7 @@ void make_jungletree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, int seed
 }
 
 
-void make_pine_tree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, int seed)
+void make_pine_tree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, s32 seed)
 {
        /*
                NOTE: Tree-placing code is currently duplicated in the engine
index 4b0089d1e53770e11a638268e6a67913f2d7d2a3..4e6f95e6766cf2f9909bd4d00b458e82e82d107e 100644 (file)
@@ -54,19 +54,19 @@ namespace treegen {
                bool thin_branches;
                MapNode fruitnode;
                int fruit_chance;
-               int seed;
+               s32 seed;
                bool explicit_seed;
        };
 
        // Add default tree
        void make_tree(MMVManip &vmanip, v3s16 p0,
-               bool is_apple_tree, INodeDefManager *ndef, int seed);
+               bool is_apple_tree, INodeDefManager *ndef, s32 seed);
        // Add jungle tree
        void make_jungletree(MMVManip &vmanip, v3s16 p0,
-               INodeDefManager *ndef, int seed);
+               INodeDefManager *ndef, s32 seed);
        // Add pine tree
        void make_pine_tree(MMVManip &vmanip, v3s16 p0,
-               INodeDefManager *ndef, int seed);
+               INodeDefManager *ndef, s32 seed);
 
        // Add L-Systems tree (used by engine)
        treegen::error make_ltree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef,