diff options
| -rw-r--r-- | README.txt | 2 | ||||
| -rw-r--r-- | init.lua | 373 | ||||
| -rw-r--r-- | textures/pathv7_path.png | bin | 616 -> 0 bytes | 
3 files changed, 181 insertions, 194 deletions
| @@ -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 @@ -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.pngBinary files differ deleted file mode 100644 index b57196e..0000000 --- a/textures/pathv7_path.png +++ /dev/null | 
