forked from mtcontrib/minetest-mod-snow
make mgv6 snow biome size configurable (currently just in the mapgen file) @Splizard, partially generated snow biomes could appear on maps because the perlin noise is different
This commit is contained in:
parent
521e24f69a
commit
e990039ea3
@ -14,7 +14,6 @@ local np_default = {
|
|||||||
local np_cold = {
|
local np_cold = {
|
||||||
offset = 0,
|
offset = 0,
|
||||||
scale = 1,
|
scale = 1,
|
||||||
spread = {x=150, y=150, z=150},
|
|
||||||
seed = 112,
|
seed = 112,
|
||||||
octaves = 3,
|
octaves = 3,
|
||||||
persist = 0.5
|
persist = 0.5
|
||||||
@ -122,6 +121,27 @@ local function define_contents()
|
|||||||
replacements = snow.known_plants or {}
|
replacements = snow.known_plants or {}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- perlin noise "hills" are not peaks but looking like sinus curve
|
||||||
|
local function upper_rarity(rarity)
|
||||||
|
return math.sign(rarity)*math.sin(math.abs(rarity)*math.pi/2)
|
||||||
|
end
|
||||||
|
|
||||||
|
local rarity = 18 --snow.mapgen_rarity
|
||||||
|
local size = 210 --snow.mapgen_size
|
||||||
|
|
||||||
|
local nosmooth_rarity = 1-rarity/50
|
||||||
|
local perlin_scale = size*100/rarity
|
||||||
|
np_cold.spread = {x=perlin_scale, y=perlin_scale, z=perlin_scale}
|
||||||
|
local smooth_rarity_max, smooth_rarity_min, smooth_rarity_dif
|
||||||
|
local smooth = snow.smooth_biomes
|
||||||
|
if smooth then
|
||||||
|
local smooth_trans_size = 4 --snow.smooth_trans_size
|
||||||
|
smooth_rarity_max = upper_rarity(nosmooth_rarity+smooth_trans_size*2/perlin_scale)
|
||||||
|
smooth_rarity_min = upper_rarity(nosmooth_rarity-smooth_trans_size/perlin_scale)
|
||||||
|
smooth_rarity_dif = smooth_rarity_max-smooth_rarity_min
|
||||||
|
end
|
||||||
|
nosmooth_rarity = upper_rarity(nosmooth_rarity)
|
||||||
|
|
||||||
minetest.register_on_generated(function(minp, maxp, seed)
|
minetest.register_on_generated(function(minp, maxp, seed)
|
||||||
local t1 = os.clock()
|
local t1 = os.clock()
|
||||||
|
|
||||||
@ -130,8 +150,6 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
local x1 = maxp.x
|
local x1 = maxp.x
|
||||||
local z1 = maxp.z
|
local z1 = maxp.z
|
||||||
|
|
||||||
local smooth = snow.smooth_biomes
|
|
||||||
|
|
||||||
if not c then
|
if not c then
|
||||||
define_contents()
|
define_contents()
|
||||||
end
|
end
|
||||||
@ -163,23 +181,27 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
pr = PseudoRandom(seed+68)
|
pr = PseudoRandom(seed+68)
|
||||||
|
|
||||||
-- Loop through columns in chunk
|
-- Loop through columns in chunk
|
||||||
|
local smooth = smooth and not snowy
|
||||||
local write_to_map = false
|
local write_to_map = false
|
||||||
local ni = 1
|
local ni = 1
|
||||||
for z = z0, z1 do
|
for z = z0, z1 do
|
||||||
for x = x0, x1 do
|
for x = x0, x1 do
|
||||||
local in_biome = false
|
local in_biome = false
|
||||||
local test
|
local test
|
||||||
if nvals_default[ni] < 0.35 then
|
if nvals_default[ni] < 0.35 then
|
||||||
if not nvals_cold then
|
if not nvals_cold then
|
||||||
nvals_cold = minetest.get_perlin_map(np_cold, chulens):get2dMap_flat({x=x0, y=z0})
|
nvals_cold = minetest.get_perlin_map(np_cold, chulens):get2dMap_flat({x=x0, y=z0})
|
||||||
end
|
end
|
||||||
test = math.min(nvals_cold[ni], 1)
|
test = math.min(nvals_cold[ni], 1)
|
||||||
if smooth
|
if smooth then
|
||||||
and not snowy then
|
if test >= smooth_rarity_max
|
||||||
if (test > 0.73 or (test > 0.43 and pr:next(0,29) > (0.73 - test) * 100 )) then
|
or (
|
||||||
|
test > smooth_rarity_min
|
||||||
|
and pr:next(1, 1000) <= ((test-smooth_rarity_min)/smooth_rarity_dif)*1000
|
||||||
|
) then
|
||||||
in_biome = true
|
in_biome = true
|
||||||
end
|
end
|
||||||
elseif test > 0.53 then
|
elseif test > nosmooth_rarity then
|
||||||
in_biome = true
|
in_biome = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -187,7 +209,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
if not in_biome then
|
if not in_biome then
|
||||||
if alpine
|
if alpine
|
||||||
and test
|
and test
|
||||||
and test > 0.43 then
|
and test > smooth_rarity_min then
|
||||||
-- remove trees near alpine
|
-- remove trees near alpine
|
||||||
local ground_y = nil
|
local ground_y = nil
|
||||||
for y = maxp.y, minp.y, -1 do
|
for y = maxp.y, minp.y, -1 do
|
||||||
@ -235,7 +257,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
local ground_y
|
local ground_y
|
||||||
for y = maxp.y, minp.y, -1 do
|
for y = maxp.y, minp.y, -1 do
|
||||||
local nodid = data[area:index(x, y, z)]
|
local nodid = data[area:index(x, y, z)]
|
||||||
if nodid ~= c.air and nodid ~= c.ignore then
|
if nodid ~= c.air then
|
||||||
ground_y = y
|
ground_y = y
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
@ -247,7 +269,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
|
|
||||||
if c_ground == c.dirt_with_grass then
|
if c_ground == c.dirt_with_grass then
|
||||||
if alpine
|
if alpine
|
||||||
and test > 0.53 then
|
and test > nosmooth_rarity then
|
||||||
snow_tab[num] = {ground_y, z, x, test}
|
snow_tab[num] = {ground_y, z, x, test}
|
||||||
num = num+1
|
num = num+1
|
||||||
-- generate stone ground
|
-- generate stone ground
|
||||||
@ -268,7 +290,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
data[area:index(x, ground_y+1, z)] = c.dry_shrub
|
data[area:index(x, ground_y+1, z)] = c.dry_shrub
|
||||||
else
|
else
|
||||||
if snowy
|
if snowy
|
||||||
or test > 0.8 then
|
or test > smooth_rarity_max then
|
||||||
-- more, deeper snow
|
-- more, deeper snow
|
||||||
data[node] = c.snow_block
|
data[node] = c.snow_block
|
||||||
else
|
else
|
||||||
@ -416,7 +438,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
local wsz, wsx
|
local wsz, wsx
|
||||||
for _,i in pairs(snow_tab) do
|
for _,i in pairs(snow_tab) do
|
||||||
local y,z,x,test = unpack(i)
|
local y,z,x,test = unpack(i)
|
||||||
test = (test-0.53)/0.47 -- /(1-0.53)
|
test = (test-nosmooth_rarity)/(1-nosmooth_rarity) -- /(1-0.53)
|
||||||
if test > 0 then
|
if test > 0 then
|
||||||
local maxh = math.floor(test*10)%10+1
|
local maxh = math.floor(test*10)%10+1
|
||||||
if maxh ~= 1 then
|
if maxh ~= 1 then
|
||||||
|
Loading…
Reference in New Issue
Block a user