summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorparamat <mat.gregory@virginmedia.com>2016-08-31 02:23:55 +0100
committerparamat <mat.gregory@virginmedia.com>2016-08-31 02:23:55 +0100
commite8137cdc1796a611a3561a911a982e50401db226 (patch)
treedc10b7d039b6e5dd7eb054117b10adb2eca070bc
parent7fb407ab1edefa40198f1309b24a07c7d26116e8 (diff)
Move content ids outside 'on gen'. More reliable meselamps in tunnels. Code improvements
-rw-r--r--README.txt2
-rw-r--r--init.lua373
-rw-r--r--textures/pathv7_path.pngbin616 -> 0 bytes
3 files changed, 181 insertions, 194 deletions
diff --git a/README.txt b/README.txt
index 9e30a4e..caa29e1 100644
--- a/README.txt
+++ b/README.txt
@@ -1,4 +1,4 @@
-pathv7 0.1.3 by paramat
+pathv7 0.1.4 by paramat
For Minetest 0.4.14 and later
Depends default stairs
Licenses: Code LGPLv2.1, textures CC BY-SA 3.0
diff --git a/init.lua b/init.lua
index dcc3a21..00b2766 100644
--- a/init.lua
+++ b/init.lua
@@ -2,6 +2,7 @@
local HSAMP = 0.025 -- Height select amplitude.
-- Controls maximum steepness of paths.
+local DEBUG = false -- Print generation time
-- Mapgen v7 noises
@@ -101,6 +102,40 @@ local np_column = {
dofile(minetest.get_modpath("pathv7") .. "/nodes.lua")
+-- Constants
+
+local c_wood = minetest.get_content_id("pathv7:junglewood")
+local c_column = minetest.get_content_id("pathv7:bridgewood")
+local c_stairn = minetest.get_content_id("pathv7:stairn")
+local c_stairs = minetest.get_content_id("pathv7:stairs")
+local c_staire = minetest.get_content_id("pathv7:staire")
+local c_stairw = minetest.get_content_id("pathv7:stairw")
+local c_stairne = minetest.get_content_id("pathv7:stairne")
+local c_stairnw = minetest.get_content_id("pathv7:stairnw")
+local c_stairse = minetest.get_content_id("pathv7:stairse")
+local c_stairsw = minetest.get_content_id("pathv7:stairsw")
+
+local c_air = minetest.CONTENT_AIR
+local c_ignore = minetest.CONTENT_IGNORE
+local c_stone = minetest.get_content_id("default:stone")
+local c_sastone = minetest.get_content_id("default:sandstone")
+local c_destone = minetest.get_content_id("default:desert_stone")
+local c_ice = minetest.get_content_id("default:ice")
+local c_tree = minetest.get_content_id("default:tree")
+local c_leaves = minetest.get_content_id("default:leaves")
+local c_apple = minetest.get_content_id("default:apple")
+local c_jungletree = minetest.get_content_id("default:jungletree")
+local c_jungleleaves = minetest.get_content_id("default:jungleleaves")
+local c_pinetree = minetest.get_content_id("default:pine_tree")
+local c_pineneedles = minetest.get_content_id("default:pine_needles")
+local c_snow = minetest.get_content_id("default:snow")
+local c_acaciatree = minetest.get_content_id("default:acacia_tree")
+local c_acacialeaves = minetest.get_content_id("default:acacia_leaves")
+local c_aspentree = minetest.get_content_id("default:aspen_tree")
+local c_aspenleaves = minetest.get_content_id("default:aspen_leaves")
+local c_meselamp = minetest.get_content_id("default:meselamp")
+
+
-- Initialise noise objects to nil
local nobj_base = nil
@@ -112,6 +147,7 @@ local nobj_pathc = nil
local nobj_pathd = nil
local nobj_column = nil
+
-- Localise noise buffers
local nbuf_base
@@ -138,60 +174,25 @@ minetest.register_on_generated(function(minp, maxp, seed)
local x0 = minp.x
local y0 = minp.y
local z0 = minp.z
-
- local c_air = minetest.CONTENT_AIR
- local c_ignore = minetest.CONTENT_IGNORE
- local c_tree = minetest.get_content_id("default:tree")
- local c_sand = minetest.get_content_id("default:sand")
- local c_dirt = minetest.get_content_id("default:dirt")
- local c_grass = minetest.get_content_id("default:dirt_with_grass")
- local c_drygrass = minetest.get_content_id("default:dirt_with_dry_grass")
- local c_dirtsnow = minetest.get_content_id("default:dirt_with_snow")
- local c_desand = minetest.get_content_id("default:desert_sand")
- local c_stone = minetest.get_content_id("default:stone")
- local c_sastone = minetest.get_content_id("default:sandstone")
- local c_destone = minetest.get_content_id("default:desert_stone")
- local c_ice = minetest.get_content_id("default:ice")
- local c_meselamp = minetest.get_content_id("default:meselamp")
- local c_gravel = minetest.get_content_id("default:gravel")
- local c_tree = minetest.get_content_id("default:tree")
- local c_jungletree = minetest.get_content_id("default:jungletree")
- local c_pinetree = minetest.get_content_id("default:pine_tree")
- local c_acaciatree = minetest.get_content_id("default:acacia_tree")
- local c_aspentree = minetest.get_content_id("default:aspen_tree")
-
- local c_wood = minetest.get_content_id("pathv7:junglewood")
- local c_column = minetest.get_content_id("pathv7:bridgewood")
-
- local c_stairn = minetest.get_content_id("pathv7:stairn")
- local c_stairs = minetest.get_content_id("pathv7:stairs")
- local c_staire = minetest.get_content_id("pathv7:staire")
- local c_stairw = minetest.get_content_id("pathv7:stairw")
- local c_stairne = minetest.get_content_id("pathv7:stairne")
- local c_stairnw = minetest.get_content_id("pathv7:stairnw")
- local c_stairse = minetest.get_content_id("pathv7:stairse")
- local c_stairsw = minetest.get_content_id("pathv7:stairsw")
local sidelen = x1 - x0 + 1
local emerlen = sidelen + 32
local overlen = sidelen + 5
local chulens = {x = overlen, y = overlen, z = 1}
- local minpos = {x = x0 - 3, y = z0 - 3}
+ local minpos = {x = x0 - 3, y = z0 - 3}
nobj_base = nobj_base or minetest.get_perlin_map(np_base, chulens)
nobj_alt = nobj_alt or minetest.get_perlin_map(np_alt, chulens)
nobj_select = nobj_select or minetest.get_perlin_map(np_select, chulens)
-
nobj_patha = nobj_patha or minetest.get_perlin_map(np_patha, chulens)
nobj_pathb = nobj_pathb or minetest.get_perlin_map(np_pathb, chulens)
nobj_pathc = nobj_pathc or minetest.get_perlin_map(np_pathc, chulens)
nobj_pathd = nobj_pathd or minetest.get_perlin_map(np_pathd, chulens)
nobj_column = nobj_column or minetest.get_perlin_map(np_column, chulens)
- local nvals_base = nobj_base :get2dMap_flat({x = x0 - 3, y = z0 - 3}, nbuf_base)
- local nvals_alt = nobj_alt :get2dMap_flat({x = x0 - 3, y = z0 - 3}, nbuf_alt)
- local nvals_select = nobj_select:get2dMap_flat({x = x0 - 3, y = z0 - 3}, nbuf_select)
-
+ local nvals_base = nobj_base :get2dMap_flat(minpos, nbuf_base)
+ local nvals_alt = nobj_alt :get2dMap_flat(minpos, nbuf_alt)
+ local nvals_select = nobj_select:get2dMap_flat(minpos, nbuf_select)
local nvals_patha = nobj_patha :get2dMap_flat(minpos, nbuf_patha)
local nvals_pathb = nobj_pathb :get2dMap_flat(minpos, nbuf_pathb)
local nvals_pathc = nobj_pathc :get2dMap_flat(minpos, nbuf_pathc)
@@ -203,7 +204,6 @@ minetest.register_on_generated(function(minp, maxp, seed)
local data = vm:get_data()
local ni = 1
- local stable = {}
for z = z0 - 3, z1 + 2 do
local n_xprepatha = false
local n_xprepathb = false
@@ -213,13 +213,10 @@ minetest.register_on_generated(function(minp, maxp, seed)
for x = x0 - 3, x1 + 2 do
local n_patha = nvals_patha[ni]
local n_zprepatha = nvals_patha[(ni - overlen)]
-
local n_pathb = nvals_pathb[ni]
local n_zprepathb = nvals_pathb[(ni - overlen)]
-
local n_pathc = nvals_pathc[ni]
local n_zprepathc = nvals_pathc[(ni - overlen)]
-
local n_pathd = nvals_pathd[ni]
local n_zprepathd = nvals_pathd[(ni - overlen)]
@@ -234,7 +231,6 @@ minetest.register_on_generated(function(minp, maxp, seed)
local tblend = 0.5 + HSAMP * (select - 0.5)
tblend = math.min(math.max(tblend, 0), 1)
local tlevel = math.floor(base * tblend + alt * (1 - tblend))
- -- TODO allow path above
local pathy = math.min(math.max(tlevel, 7), 42)
if (n_patha >= 0 and n_xprepatha < 0) -- detect sign change of noise
@@ -256,178 +252,167 @@ minetest.register_on_generated(function(minp, maxp, seed)
or (n_pathd < 0 and n_xprepathd >= 0)
or (n_pathd >= 0 and n_zprepathd < 0)
or (n_pathd < 0 and n_zprepathd >= 0) then
- if pathy > y1 then
- -- build columns through this chunk
- if abscol < 0.3 then
- for xx = x - 1, x + 1, 2 do
- for zz = z - 1, z + 1, 2 do
- local vi = area:index(xx, y1, zz)
- for y = 1, sidelen do
- local nodid = data[vi]
- if nodid == c_stone
- or nodid == c_destone
- or nodid == c_sastone
- or nodid == c_ice then
- break
- else
- data[vi] = c_column
- end
- vi = vi - emerlen
- end
- end
- end
- end
- elseif pathy >= y0 then
- -- path in chunk
- -- scan disk 5 nodes above path
- local tunnel = false
- local excatop
- for zz = z - 2, z + 2 do
- local vi = area:index(x - 2, pathy + 5, zz)
- for xx = x - 2, x + 2 do
- local nodid = data[vi]
- if nodid == c_stone
- or nodid == c_destone
- or nodid == c_sastone
- or nodid == c_ice then
- tunnel = true
- end
- vi = vi + 1
+ -- scan disk 5 nodes above path
+ local tunnel = false
+ local excatop
+ for zz = z - 2, z + 2 do
+ local vi = area:index(x - 2, pathy + 5, zz)
+ for xx = x - 2, x + 2 do
+ local nodid = data[vi]
+ if nodid == c_stone
+ or nodid == c_destone
+ or nodid == c_sastone
+ or nodid == c_ice then
+ tunnel = true
end
+ vi = vi + 1
end
- if tunnel then
- excatop = pathy + 5 -- tunnel
- else
- excatop = y1 + 16 -- excavate to vm top
+ end
+ if tunnel then
+ excatop = pathy + 5
+ else
+ excatop = y1
+ end
+ -- place path node brush
+ local vi = area:index(x - 2, pathy, z - 2)
+ if data[vi] ~= c_wood then
+ data[vi] = c_stairne
+ end
+ for iter = 1, 3 do
+ vi = vi + 1
+ if data[vi] ~= c_wood then
+ data[vi] = c_stairn
end
-
- -- place path node brush
- local vi = area:index(x - 2, pathy, z - 2)
+ end
+ vi = vi + 1
+ if data[vi] ~= c_wood then
+ data[vi] = c_stairnw
+ end
+ for zz = z - 1, z + 1 do
+ local vi = area:index(x - 2, pathy, zz)
if data[vi] ~= c_wood then
- data[vi] = c_stairne
+ data[vi] = c_staire
end
for iter = 1, 3 do
vi = vi + 1
- if data[vi] ~= c_wood then
- data[vi] = c_stairn
- end
+ data[vi] = c_wood
end
vi = vi + 1
if data[vi] ~= c_wood then
- data[vi] = c_stairnw
- end
- for zz = z - 1, z + 1 do
- local vi = area:index(x - 2, pathy, zz)
- if data[vi] ~= c_wood then
- data[vi] = c_staire
- end
- for iter = 1, 3 do
- vi = vi + 1
- data[vi] = c_wood
- end
- vi = vi + 1
- if data[vi] ~= c_wood then
- data[vi] = c_stairw
- end
+ data[vi] = c_stairw
end
- local vi = area:index(x - 2, pathy, z + 2)
+ end
+ local vi = area:index(x - 2, pathy, z + 2)
+ if data[vi] ~= c_wood then
+ data[vi] = c_stairse
+ end
+ for iter = 1, 3 do
+ vi = vi + 1
if data[vi] ~= c_wood then
- data[vi] = c_stairse
+ data[vi] = c_stairs
end
- for iter = 1, 3 do
+ end
+ vi = vi + 1
+ if data[vi] ~= c_wood then
+ data[vi] = c_stairsw
+ end
+ -- bridge understructure
+ for zz = z - 1, z + 1 do
+ local vi = area:index(x - 1, pathy - 1, zz)
+ for xx = x - 1, x + 1 do
+ local nodid = data[vi]
+ if nodid ~= c_stone
+ and nodid ~= c_destone
+ and nodid ~= c_sastone then
+ data[vi] = c_column
+ end
vi = vi + 1
- if data[vi] ~= c_wood then
- data[vi] = c_stairs
+ end
+ end
+ local vi = area:index(x, pathy - 2, z)
+ data[vi] = c_column
+ -- bridge columns
+ if abscol < 0.3 then
+ for xx = x - 1, x + 1, 2 do
+ for zz = z - 1, z + 1, 2 do
+ local vi = area:index(xx, pathy - 2, zz)
+ for y = pathy - 2, y0, -1 do
+ local nodid = data[vi]
+ if nodid == c_stone
+ or nodid == c_destone
+ or nodid == c_sastone then
+ break
+ else
+ data[vi] = c_column
+ end
+ vi = vi - emerlen
end
end
- vi = vi + 1
- if data[vi] ~= c_wood then
- data[vi] = c_stairsw
end
-
- -- excavate above path
- local det_destone = false
- local det_sastone = false
- local det_ice = false
- for y = pathy + 1, excatop do
- for zz = z - 2, z + 2 do
- local vi = area:index(x - 2, y, zz)
- for xx = x - 2, x + 2 do
- local nodid = data[vi]
- if nodid == c_destone then
- det_destone = true
- elseif nodid == c_sastone then
- det_sastone = true
- elseif nodid == c_ice then
- det_ice = true
- end
- if tunnel and y == excatop then -- tunnel ceiling
- if nodid ~= c_air
- and nodid ~= c_ignore
- and nodid ~= c_meselamp then
- if math.random() < 0.1 then
- data[vi] = c_meselamp
- elseif det_destone then
- data[vi] = c_destone
- elseif det_sastone then
- data[vi] = c_sastone
- elseif det_ice then
- data[vi] = c_ice
- else
- data[vi] = c_stone
- end
- end
- elseif y <= pathy + 5 then
- if nodid ~= c_wood
- and nodid ~= c_stairn
- and nodid ~= c_stairs
- and nodid ~= c_staire
- and nodid ~= c_stairw
- and nodid ~= c_stairne
- and nodid ~= c_stairnw
- and nodid ~= c_stairse
- and nodid ~= c_stairsw then
- data[vi] = c_air
+ end
+ -- excavate above path
+ local det_destone = false
+ local det_sastone = false
+ local det_ice = false
+ for y = pathy + 1, excatop do
+ for zz = z - 2, z + 2 do
+ local vi = area:index(x - 2, y, zz)
+ for xx = x - 2, x + 2 do
+ local nodid = data[vi]
+ if nodid == c_destone then
+ det_destone = true
+ elseif nodid == c_sastone then
+ det_sastone = true
+ elseif nodid == c_ice then
+ det_ice = true
+ end
+ if tunnel and y == excatop then -- tunnel ceiling
+ if nodid ~= c_air
+ and nodid ~= c_ignore
+ and nodid ~= c_meselamp then
+ if (math.abs(zz - z) == 2
+ or math.abs(xx - x) == 2)
+ and math.random() <= 0.2 then
+ data[vi] = c_meselamp
+ elseif det_destone then
+ data[vi] = c_destone
+ elseif det_sastone then
+ data[vi] = c_sastone
+ elseif det_ice then
+ data[vi] = c_ice
+ else
+ data[vi] = c_stone
end
- else
+ end
+ elseif y <= pathy + 5 then
+ if nodid ~= c_wood
+ and nodid ~= c_stairn
+ and nodid ~= c_stairs
+ and nodid ~= c_staire
+ and nodid ~= c_stairw
+ and nodid ~= c_stairne
+ and nodid ~= c_stairnw
+ and nodid ~= c_stairse
+ and nodid ~= c_stairsw then
data[vi] = c_air
end
- vi = vi + 1
+ elseif nodid == c_tree
+ or nodid == c_leaves
+ or nodid == c_apple
+ or nodid == c_jungletree
+ or nodid == c_jungleleaves
+ or nodid == c_pinetree
+ or nodid == c_pineneedles
+ or nodid == c_snow
+ or nodid == c_acaciatree
+ or nodid == c_acacialeaves
+ or nodid == c_aspentree
+ or nodid == c_aspenleaves then
+ data[vi] = c_air
end
- end
- end
-
- -- bridge understructure
- for zz = z - 1, z + 1 do
- local vi = area:index(x - 1, pathy - 1, zz)
- for xx = x - 1, x + 1 do
- data[vi] = c_column
vi = vi + 1
end
end
- local vi = area:index(x, pathy - 2, z)
- data[vi] = c_column
-
- -- bridge columns
- if abscol < 0.3 then
- for xx = x - 1, x + 1, 2 do
- for zz = z - 1, z + 1, 2 do
- local vi = area:index(xx, pathy - 2, zz)
- for y = pathy - 2, y0, -1 do
- local nodid = data[vi]
- if nodid == c_stone
- or nodid == c_destone
- or nodid == c_sastone
- or nodid == c_ice then
- break
- else
- data[vi] = c_column
- end
- vi = vi - emerlen
- end
- end
- end
- end
end
end
end
@@ -446,5 +431,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
vm:write_to_map(data)
local chugent = math.ceil((os.clock() - t1) * 1000)
- print ("[pathv7] Generate chunk " .. chugent .. " ms")
+ if DEBUG then
+ print ("[pathv7] Generate chunk " .. chugent .. " ms")
+ end
end)
diff --git a/textures/pathv7_path.png b/textures/pathv7_path.png
deleted file mode 100644
index b57196e..0000000
--- a/textures/pathv7_path.png
+++ /dev/null
Binary files differ