From bbb5bdca1c6cd95675e0086ebed5cdde0e8ea596 Mon Sep 17 00:00:00 2001 From: Mat Date: Sun, 15 Jun 2014 06:24:19 +0100 Subject: [PATCH] Unlimited size. Flolands nodes. Tunnels --- README.txt | 4 +- init.lua | 264 +++++++++-------------------- textures/floatindev_floatsand.png | Bin 0 -> 723 bytes textures/floatindev_floatstone.png | Bin 0 -> 541 bytes textures/floatindev_floc.png | Bin 0 -> 206 bytes 5 files changed, 78 insertions(+), 190 deletions(-) create mode 100644 textures/floatindev_floatsand.png create mode 100644 textures/floatindev_floatstone.png create mode 100644 textures/floatindev_floc.png diff --git a/README.txt b/README.txt index 302b2bf..1642394 100644 --- a/README.txt +++ b/README.txt @@ -1,4 +1,4 @@ -floatindev 0.2.0 by paramat +floatindev 0.3.0 by paramat For latest stable Minetest back to 0.4.8 Depends default -Licenses: code WTFPL \ No newline at end of file +Licenses: code WTFPL diff --git a/init.lua b/init.lua index 318d705..4bfe3bb 100644 --- a/init.lua +++ b/init.lua @@ -1,53 +1,58 @@ --- floatindev 0.2.0 by paramat +-- floatindev 0.3.0 by paramat -- For latest stable Minetest and back to 0.4.8 -- Depends default -- License: code WTFPL -- Parameters -local YMIN = 128 -- Approximate realm limits. +local YMIN = 1 -- Approximate realm limits. local YMAX = 33000 local XMIN = -33000 local XMAX = 33000 local ZMIN = -33000 local ZMAX = 33000 -local CHUINT = 2 -- Chunk interval for floatland layers -local WAVAMP = 16 -- Structure wave amplitude -local HISCAL = 24 -- Upper structure vertical scale -local LOSCAL = 24 -- Lower structure vertical scale -local HIEXP = 0.5 -- Upper structure density gradient exponent -local LOEXP = 0.5 -- Lower structure density gradient exponent +local CHUINT = 8 -- Chunk interval for floatland layers +local WAVAMP = 48 -- Structure wave amplitude +local HISCAL = 96 -- Upper structure vertical scale +local LOSCAL = 96 -- Lower structure vertical scale +local HIEXP = 0.33 -- Upper structure density gradient exponent +local LOEXP = 0.33 -- Lower structure density gradient exponent local CLUSAV = 0 -- Large scale variation average local CLUSAM = 0 -- Large scale variation amplitude -local DIRTHR = 0.04 -- Dirt density threshold -local STOTHR = 0.08 -- Stone density threshold -local STABLE = 2 -- Minimum number of stacked stone nodes in column for dirt / sand on top - -local APPCHA = 0.02 -- Appletree chance -local FLOCHA = 0.02 -- Flower chance -local GRACHA = 0.11 -- Grass chance -local ORECHA = 1 / (5 * 5 * 5) +local TSTONE = 0.1 -- Stone density threshold +local TTUN = 0.03 -- Tunnel width +local TVOID = 0.6 -- Void threshold +local FLOCHA = 1 / 17 ^ 3 -- Floc chance per stone node -- 3D noise for floatlands local np_float = { offset = 0, scale = 1, - spread = {x=256, y=256, z=256}, + spread = {x=384, y=192, z=384}, seed = 277777979, - octaves = 6, - persist = 0.6 + octaves = 5, + persist = 0.67 } --- 3D noise for caves +-- 3D noises for tunnels -local np_caves = { +local np_weba = { offset = 0, scale = 1, - spread = {x=8, y=8, z=8}, + spread = {x=128, y=128, z=128}, seed = -89000, - octaves = 2, + octaves = 3, + persist = 0.5 +} + +local np_webb = { + offset = 0, + scale = 1, + spread = {x=127, y=127, z=127}, + seed = 85911, + octaves = 3, persist = 0.5 } @@ -62,26 +67,15 @@ local np_cluster = { persist = 0.5 } --- 2D noise for wave +-- 3D noise for wave local np_wave = { offset = 0, scale = 1, - spread = {x=256, y=256, z=256}, - seed = -400000000089, + spread = {x=512, y=512, z=512}, + seed = -4000000089, octaves = 3, - persist = 0.5 -} - --- 2D noise for biome - -local np_biome = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 9130, - octaves = 3, - persist = 0.5 + persist = 0.4 } -- Stuff @@ -90,90 +84,29 @@ floatindev = {} -- Nodes -minetest.register_node("floatindev:stone", { - description = "FLI Stone", - tiles = {"default_stone.png"}, +minetest.register_node("floatindev:floatstone", { + description = "Floatstone", + tiles = {"floatindev_floatstone.png"}, is_ground_content = false, -- stops cavegen removing this node groups = {cracky=3}, - drop = "default:cobble", sounds = default.node_sound_stone_defaults(), }) -minetest.register_node("floatindev:desertstone", { - description = "FLI Desert Stone", - tiles = {"default_desert_stone.png"}, - is_ground_content = false, -- stops cavegen removing this node - groups = {cracky=3}, - drop = "default:desert_stone", - sounds = default.node_sound_stone_defaults(), +minetest.register_node("floatindev:floatsand", { + description = "Floatsand", + tiles = {"floatindev_floatsand.png"}, + is_ground_content = false, + groups = {crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), }) --- Functions - -local function floatindev_appletree(x, y, z, area, data) - local c_tree = minetest.get_content_id("default:tree") - local c_apple = minetest.get_content_id("default:apple") - local c_leaves = minetest.get_content_id("default:leaves") - for j = -2, 4 do - if j >= 1 then - for i = -2, 2 do - for k = -2, 2 do - local vi = area:index(x + i, y + j + 1, z + k) - if math.random(48) == 2 then - data[vi] = c_apple - elseif math.random(3) ~= 2 then - data[vi] = c_leaves - end - end - end - end - local vi = area:index(x, y + j, z) - data[vi] = c_tree - end -end - -local function floatindev_grass(data, vi) - local c_grass1 = minetest.get_content_id("default:grass_1") - local c_grass2 = minetest.get_content_id("default:grass_2") - local c_grass3 = minetest.get_content_id("default:grass_3") - local c_grass4 = minetest.get_content_id("default:grass_4") - local c_grass5 = minetest.get_content_id("default:grass_5") - local rand = math.random(5) - if rand == 1 then - data[vi] = c_grass1 - elseif rand == 2 then - data[vi] = c_grass2 - elseif rand == 3 then - data[vi] = c_grass3 - elseif rand == 4 then - data[vi] = c_grass4 - else - data[vi] = c_grass5 - end -end - -local function floatindev_flower(data, vi) - local c_danwhi = minetest.get_content_id("flowers:dandelion_white") - local c_danyel = minetest.get_content_id("flowers:dandelion_yellow") - local c_rose = minetest.get_content_id("flowers:rose") - local c_tulip = minetest.get_content_id("flowers:tulip") - local c_geranium = minetest.get_content_id("flowers:geranium") - local c_viola = minetest.get_content_id("flowers:viola") - local rand = math.random(6) - if rand == 1 then - data[vi] = c_danwhi - elseif rand == 2 then - data[vi] = c_rose - elseif rand == 3 then - data[vi] = c_tulip - elseif rand == 4 then - data[vi] = c_danyel - elseif rand == 5 then - data[vi] = c_geranium - else - data[vi] = c_viola - end -end +minetest.register_node("floatindev:floc", { + description = "Float crystal block", + tiles = {"floatindev_floc.png"}, + is_ground_content = false, + groups = {cracky=1}, + sounds = default.node_sound_stone_defaults(), +}) -- On generated function @@ -183,10 +116,6 @@ minetest.register_on_generated(function(minp, maxp, seed) or minp.z < ZMIN or maxp.z > ZMAX then return end - local chulay = math.floor((minp.y + 32) / 80) -- chunk layer number, 0 = surface chunk - if math.fmod(chulay, CHUINT) ~= 0 then -- if chulay / CHUINT has a remainder - return - end local t1 = os.clock() local x1 = maxp.x @@ -203,109 +132,68 @@ minetest.register_on_generated(function(minp, maxp, seed) local data = vm:get_data() local c_air = minetest.get_content_id("air") - local c_stodiam = minetest.get_content_id("default:stone_with_diamond") - local c_stomese = minetest.get_content_id("default:stone_with_mese") - local c_stogold = minetest.get_content_id("default:stone_with_gold") - local c_stocopp = minetest.get_content_id("default:stone_with_copper") - local c_stoiron = minetest.get_content_id("default:stone_with_iron") - local c_stocoal = minetest.get_content_id("default:stone_with_coal") - local c_grass = minetest.get_content_id("default:dirt_with_grass") - local c_dirt = minetest.get_content_id("default:dirt") - local c_desand = minetest.get_content_id("default:desert_sand") - local c_flistone = minetest.get_content_id("floatindev:stone") - local c_flidestone = minetest.get_content_id("floatindev:desertstone") + local c_floatstone = minetest.get_content_id("floatindev:floatstone") + local c_floatsand = minetest.get_content_id("floatindev:floatsand") + local c_floc = minetest.get_content_id("floatindev:floc") local sidelen = x1 - x0 + 1 local chulens = {x=sidelen, y=sidelen, z=sidelen} local minposxyz = {x=x0, y=y0, z=z0} - local minposxz = {x=x0, y=z0} local nvals_float = minetest.get_perlin_map(np_float, chulens):get3dMap_flat(minposxyz) - local nvals_caves = minetest.get_perlin_map(np_caves, chulens):get3dMap_flat(minposxyz) + local nvals_weba = minetest.get_perlin_map(np_weba, chulens):get3dMap_flat(minposxyz) + local nvals_webb = minetest.get_perlin_map(np_webb, chulens):get3dMap_flat(minposxyz) local nvals_cluster = minetest.get_perlin_map(np_cluster, chulens):get3dMap_flat(minposxyz) + local nvals_wave = minetest.get_perlin_map(np_wave, chulens):get3dMap_flat(minposxyz) - local nvals_wave = minetest.get_perlin_map(np_wave, chulens):get2dMap_flat(minposxz) - local nvals_biome = minetest.get_perlin_map(np_biome, chulens):get2dMap_flat({x=x0+150, y=z0+50}) - + local chulay = math.floor((minp.y + 32) / 80) -- chunk layer number, 0 = surface chunk + local tercen = (math.floor(chulay / CHUINT) * CHUINT + CHUINT / 2) * 80 - 32 -- terrain centre of this layer + local nixyz = 1 local nixz = 1 local stable = {} - local dirt = {} - local chumid = y0 + sidelen / 2 for z = z0, z1 do -- for each xy plane progressing northwards for x = x0, x1 do local si = x - x0 + 1 - dirt[si] = 0 local nodename = minetest.get_node({x=x,y=y0-1,z=z}).name if nodename == "air" or nodename == "default:water_source" then stable[si] = 0 else -- all else including ignore in ungenerated chunks - stable[si] = STABLE + stable[si] = 2 end end for y = y0, y1 do -- for each x row progressing upwards local vi = area:index(x0, y, z) for x = x0, x1 do -- for each node do local si = x - x0 + 1 - local flomid = chumid + nvals_wave[nixz] * WAVAMP - local grad + local flomid = tercen + nvals_wave[nixyz] * WAVAMP -- y of floatland middle + + local grad -- density for node if y > flomid then grad = ((y - flomid) / HISCAL) ^ HIEXP else grad = ((flomid - y) / LOSCAL) ^ LOEXP end local density = nvals_float[nixyz] - grad + CLUSAV + nvals_cluster[nixyz] * CLUSAM - if density > 0 and density < 0.7 then -- if floatland shell - if nvals_caves[nixyz] - density > -0.7 then -- if no cave - if y > flomid and density < STOTHR and stable[si] >= STABLE then - if nvals_biome[nixz] > 0.45 then -- fine materials - data[vi] = c_desand - else - if density < DIRTHR then - data[vi] = c_grass - else - data[vi] = c_dirt - end - dirt[si] = dirt[si] + 1 - end + + local weba = math.abs(nvals_weba[nixyz]) < TTUN -- check for tunnel + local webb = math.abs(nvals_webb[nixyz]) < TTUN + local notun = not (weba and webb) + + if density > 0 and density < TVOID and notun then -- if floatland shell + if y > flomid and density < TSTONE and stable[si] >= 2 then + data[vi] = c_floatsand -- sand + else + if math.random() < FLOCHA then + data[vi] = c_floc -- floc else - if nvals_biome[nixz] > 0.45 then -- stone - data[vi] = c_flidestone - elseif math.random() < ORECHA then - local osel = math.random(34) - if osel == 34 then - data[vi] = c_stodiam - elseif osel >= 31 then - data[vi] = c_stomese - elseif osel >= 28 then - data[vi] = c_stogold - elseif osel >= 19 then - data[vi] = c_stocopp - elseif osel >= 10 then - data[vi] = c_stoiron - else - data[vi] = c_stocoal - end - else - data[vi] = c_flistone - end - stable[si] = stable[si] + 1 + data[vi] = c_floatstone -- stone end - else -- cave - stable[si] = 0 + stable[si] = stable[si] + 1 end - elseif y > flomid and density < 0 and dirt[si] >= 1 then -- node above surface dirt - if dirt[si] >= 2 and math.random() < APPCHA then - floatindev_appletree(x, y, z, area, data) - elseif math.random() < FLOCHA then - floatindev_flower(data, vi) - elseif math.random() < GRACHA then - floatindev_grass(data, vi) - end - dirt[si] = 0 - else -- atmosphere + else -- air stable[si] = 0 end nixyz = nixyz + 1 @@ -323,4 +211,4 @@ minetest.register_on_generated(function(minp, maxp, seed) vm:write_to_map(data) local chugent = math.ceil((os.clock() - t1) * 1000) print ("[floatindev] "..chugent.." ms") -end) \ No newline at end of file +end) diff --git a/textures/floatindev_floatsand.png b/textures/floatindev_floatsand.png new file mode 100644 index 0000000000000000000000000000000000000000..8ab3111a740f20b62e31c612744f5cddc32cceee GIT binary patch literal 723 zcmV;^0xbQBP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RY0vr%KCh+3dqW}N`Wl2OqR5;5$ zky~;jMHEEOy;WV^trn6^jI9A2411eRvJDnN5aaP!mekLB+~Pw73&@N-C*|v3e^%!L z+vNjs4%hF%j9Lt%Ql=3npu3;Y(2?VW4;=>Bc)>dti0h1o262wE%y?C_-{YObLZB=& zwIuR5V+N*5Ed@6m@M*fBO-l#^r4-!I6S@J*nd$ru1^oVjrtuh%LVEwxru6*D7EBT_5vrxTc< zVL(JsKt$lbg=v||amAYoQlZpLiVJ1Bvj6-7IKR**|~A)YFJy6dLgq5y+Xi-k9IN6Y$9MBT9qMwjsr^j|+!izfj%%?=7tWWXV*g z*rdpcN{cl-aKoLZh zR3as9X{WcmT!SS!2R1Lrm1e0j~pF*(lpYe1D@>p>12j=@+CJ;O_-S z1eERkitmmz$0GpS?Tu1kyZxXaj_7`eh{w5xQWn%Z{srK&T>9lsluG~r002ovPDHLk FV1l!`O+Eks literal 0 HcmV?d00001 diff --git a/textures/floatindev_floatstone.png b/textures/floatindev_floatstone.png new file mode 100644 index 0000000000000000000000000000000000000000..cd86812ceb5995cd0bf0c2acd05b04ab7deca5fa GIT binary patch literal 541 zcmV+&0^Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RY0vr(tA6iaOtN;K3uSrBfR5;6R zlfiP@Fc5}65d}+FW*{wXE-AhCU3%(!^o4utB$Mfc5(AcG0aMh2kZNbTGrq{$fB*e< zCBA<99s$JU27q|^LnIPoB!_ngX7!w52q6#%WZf(Qa9vB?EIFTgarnxIZ^7-)x0F|lK}}ZE}tPAm7cQltB(F4;>79)w71G((Kxo!lpJ$oNbX} zazpRCVkfg1;^kqpcjCKYadD9v6V^UXl3`Wudpd4#hUVevZHj1hPA9|66$| fmjAzv5G;QIz;@z;>x{6j00000NkvXXu0mjf94qC) literal 0 HcmV?d00001 diff --git a/textures/floatindev_floc.png b/textures/floatindev_floc.png new file mode 100644 index 0000000000000000000000000000000000000000..d86cbe81dc425034fbda42cdf4680edf73b8cbcd GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfT~-lsM)eERZ<_&y5