diff --git a/README.txt b/README.txt index 339592b..7a34a34 100644 --- a/README.txt +++ b/README.txt @@ -1,4 +1,4 @@ -watershed 0.7.0 by paramat +watershed 0.7.1 by paramat For Minetest 0.4.13 and later Depends default stairs bucket Licenses: code WTFPL, textures CC BY-SA diff --git a/functions.lua b/functions.lua index 0f72db7..f397f62 100644 --- a/functions.lua +++ b/functions.lua @@ -210,147 +210,6 @@ function watershed_papyrus(x, y, z, area, data) end end --- Singlenode option - -local SINGLENODE = true - -if SINGLENODE then - -- Set mapgen parameters - - minetest.set_mapgen_params({mgname = "singlenode", flags = "nolight"}) - - -- Spawn player function. Requires chunksize = 80 nodes (the default) - - function spawnplayer(player) - local TERCEN = -128 - local TERSCA = 512 - local XLSAMP = 0.1 - local BASAMP = 0.3 - local MIDAMP = 0.1 - local CANAMP = 0.4 - local ATANAMP = 1.1 - local BLENEXP = 2 - local xsp - local ysp - local zsp - - local np_terrain = { - offset = 0, - scale = 1, - spread = {x=384, y=192, z=384}, - seed = 593, - octaves = 5, - persist = 0.67 - } - local np_mid = { - offset = 0, - scale = 1, - spread = {x=768, y=768, z=1}, - seed = 85546, - octaves = 5, - persist = 0.5 - } - local np_base = { - offset = 0, - scale = 1, - spread = {x=4096, y=4096, z=1}, - seed = 8890, - octaves = 3, - persist = 0.33 - } - local np_xlscale = { - offset = 0, - scale = 1, - spread = {x=8192, y=8192, z=1}, - seed = -72, - octaves = 3, - persist = 0.33 - } - - local nobj_terrain = nil - local nobj_mid = nil - local nobj_base = nil - local nobj_xlscale = nil - - for chunk = 1, 64 do - print ("[watershed] searching for spawn "..chunk) - local x0 = 80 * math.random(-32, 32) - 32 - local z0 = 80 * math.random(-32, 32) - 32 - local y0 = -32 - local x1 = x0 + 79 - local z1 = z0 + 79 - local y1 = 47 - local sidelen = 80 - local chulensxyz = {x = sidelen, y = sidelen + 2, z = sidelen} - local chulensxz = {x = sidelen, y = sidelen, z = 1} - local minposxyz = {x = x0, y = y0 - 1, z = z0} - local minposxz = {x = x0, y = z0} - - nobj_terrain = nobj_terrain or minetest.get_perlin_map(np_terrain, chulensxyz) - nobj_mid = nobj_mid or minetest.get_perlin_map(np_mid, chulensxz) - nobj_base = nobj_base or minetest.get_perlin_map(np_base, chulensxz) - nobj_xlscale = nobj_xlscale or minetest.get_perlin_map(np_xlscale, chulensxz) - - local nvals_terrain = nobj_terrain:get3dMap_flat(minposxyz) - local nvals_mid = nobj_mid:get2dMap_flat(minposxz) - local nvals_base = nobj_base:get2dMap_flat(minposxz) - local nvals_xlscale = nobj_xlscale:get2dMap_flat(minposxz) - - local nixz = 1 - local nixyz = 1 - for z = z0, z1 do - for y = y0, y1 do - for x = x0, x1 do - local n_absterrain = math.abs(nvals_terrain[nixyz]) - local n_absmid = math.abs(nvals_mid[nixz]) - local n_absbase = math.abs(nvals_base[nixz]) - local n_xlscale = nvals_xlscale[nixz] - - local n_invbase = (1 - n_absbase) - local terblen = (math.max(n_invbase, 0)) ^ BLENEXP - local grad = math.atan((TERCEN - y) / TERSCA) * ATANAMP - local densitybase = n_invbase * BASAMP + n_xlscale * XLSAMP + grad - local densitymid = n_absmid * MIDAMP + densitybase - local canexp = 0.5 + terblen * 0.5 - local canamp = terblen * CANAMP - local density = n_absterrain ^ canexp * canamp * n_absmid + densitymid - - if y >= 1 and density > -0.005 and density < 0 then - ysp = y + 1 - xsp = x - zsp = z - break - end - nixz = nixz + 1 - nixyz = nixyz + 1 - end - if ysp then - break - end - nixz = nixz - 80 - end - if ysp then - break - end - nixz = nixz + 80 - end - if ysp then - break - end - end - print ("[watershed] spawn player (" .. xsp .. " " .. ysp .. " " .. zsp .. ")") - player:setpos({x = xsp, y = ysp, z = zsp}) - end - - minetest.register_on_newplayer(function(player) - spawnplayer(player) - end) - - minetest.register_on_respawnplayer(function(player) - spawnplayer(player) - return true - end) -end -- ABM diff --git a/init.lua b/init.lua index 7c96503..71ed357 100644 --- a/init.lua +++ b/init.lua @@ -1,5 +1,6 @@ -- Parameters +local SINGLENODE = true -- Use singlenode mapgen and spawnplayer function local YMIN = -33000 -- Approximate base of realm stone local YMAX = 33000 -- Approximate top of atmosphere / mountains / floatlands local TERCEN = -128 -- Terrain zero level, average seabed @@ -777,6 +778,9 @@ minetest.register_on_generated(function(minp, maxp, seed) watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data) vm:set_data(data) + if not SINGLENODE then + vm:set_lighting({day = 0, night = 0}) -- remove incorrect precalculated light + end vm:calc_lighting() vm:write_to_map(data) vm:update_liquids() @@ -784,3 +788,111 @@ minetest.register_on_generated(function(minp, maxp, seed) local chugent = math.ceil((os.clock() - t1) * 1000) print ("[watershed] " .. chugent .. " ms") end) + + +-- Singlenode option + +if SINGLENODE then + -- Set mapgen parameters + + minetest.set_mapgen_params({mgname = "singlenode", flags = "nolight"}) + + + -- Spawn player function. Requires chunksize = 80 nodes (the default) + + function spawnplayer(player) + local xsp + local ysp + local zsp + + local nobj_terrain = nil + local nobj_mid = nil + local nobj_base = nil + local nobj_xlscale = nil + + local nbuf_terrain + local nbuf_mid + local nbuf_base + local nbuf_xlscale + + for chunk = 1, 128 do + print ("[watershed] searching for spawn "..chunk) + local x0 = 80 * math.random(-32, 32) - 32 + local z0 = 80 * math.random(-32, 32) - 32 + local y0 = -32 + local x1 = x0 + 79 + local z1 = z0 + 79 + local y1 = 47 + local sidelen = 80 + local chulensxyz = {x = sidelen, y = sidelen + 2, z = sidelen} + local chulensxz = {x = sidelen, y = sidelen, z = 1} + local minposxyz = {x = x0, y = y0 - 1, z = z0} + local minposxz = {x = x0, y = z0} + + nobj_terrain = nobj_terrain or minetest.get_perlin_map(np_terrain, chulensxyz) + nobj_mid = nobj_mid or minetest.get_perlin_map(np_mid, chulensxz) + nobj_base = nobj_base or minetest.get_perlin_map(np_base, chulensxz) + nobj_xlscale = nobj_xlscale or minetest.get_perlin_map(np_xlscale, chulensxz) + + local nvals_terrain = nobj_terrain:get3dMap_flat(minposxyz, nbuf_terrain) + local nvals_mid = nobj_mid :get2dMap_flat(minposxz, nbuf_mid) + local nvals_base = nobj_base :get2dMap_flat(minposxz, nbuf_base) + local nvals_xlscale = nobj_xlscale:get2dMap_flat(minposxz, nbuf_xlscale) + + local nixz = 1 + local nixyz = 1 + for z = z0, z1 do + for y = y0, y1 do + for x = x0, x1 do + local n_absterrain = math.abs(nvals_terrain[nixyz]) + local n_absmid = math.abs(nvals_mid[nixz]) + local n_absbase = math.abs(nvals_base[nixz]) + local n_xlscale = nvals_xlscale[nixz] + + local n_invbase = (1 - n_absbase) + local terblen = (math.max(n_invbase, 0)) ^ BLENEXP + local grad = math.atan((TERCEN - y) / TERSCA) * ATANAMP + local densitybase = n_invbase * BASAMP + n_xlscale * XLSAMP + + grad + local densitymid = n_absmid * MIDAMP + densitybase + local canexp = 0.5 + terblen * 0.5 + local canamp = terblen * CANAMP + local density = n_absterrain ^ canexp * canamp * n_absmid + + densitymid + + if y >= 1 and density > -0.005 and density < 0 then + ysp = y + 1 + xsp = x + zsp = z + break + end + nixz = nixz + 1 + nixyz = nixyz + 1 + end + if ysp then + break + end + nixz = nixz - 80 + end + if ysp then + break + end + nixz = nixz + 80 + end + if ysp then + break + end + end + print ("[watershed] spawn player (" .. xsp .. " " .. ysp .. " " .. zsp .. ")") + player:setpos({x = xsp, y = ysp, z = zsp}) + end + + minetest.register_on_newplayer(function(player) + spawnplayer(player) + end) + + minetest.register_on_respawnplayer(function(player) + spawnplayer(player) + return true + end) +end