From db9094fbe880f52a3cf21cc02328c020465569a0 Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 31 Mar 2014 09:33:38 +0100 Subject: [PATCH] Turquoise freshwater. Magma rising under ridges. Lavacooling --- functions.lua | 24 +++++++++++++++++++++ init.lua | 31 +++++++++++++++++++++------ nodes.lua | 12 +++++------ textures/watershed_water.png | Bin 0 -> 713 bytes textures/watershed_wateranim.png | Bin 0 -> 4927 bytes textures/watershed_waterflowanim.png | Bin 0 -> 5819 bytes 6 files changed, 54 insertions(+), 13 deletions(-) create mode 100644 textures/watershed_water.png create mode 100644 textures/watershed_wateranim.png create mode 100644 textures/watershed_waterflowanim.png diff --git a/functions.lua b/functions.lua index c88c604..ea66186 100644 --- a/functions.lua +++ b/functions.lua @@ -225,4 +225,28 @@ minetest.register_craft({ recipe = "watershed:bucket_lava", burntime = 60, replacements = {{"watershed:bucket_lava", "bucket:bucket_empty"}}, +}) + +-- ABM + +minetest.register_abm({ + nodenames = {"watershed:lavaflow"}, + neighbors = {"group:water"}, + interval = 1, + chance = 11, + action = function(pos, node, active_object_count, active_object_count_wider) + minetest.set_node(pos, {name="watershed:stone"}) + minetest.sound_play("default_cool_lava", {pos = pos, gain = 0.25}) + end, +}) + +minetest.register_abm({ + nodenames = {"watershed:lava"}, + neighbors = {"group:water"}, + interval = 1, + chance = 11, + action = function(pos, node, active_object_count, active_object_count_wider) + minetest.set_node(pos, {name="default:obsidian"}) + minetest.sound_play("default_cool_lava", {pos = pos, gain = 0.25}) + end, }) \ No newline at end of file diff --git a/init.lua b/init.lua index 8a7ec06..49b6700 100644 --- a/init.lua +++ b/init.lua @@ -3,14 +3,14 @@ -- Depends default -- License: code WTFPL --- register bucket water lava --- remove leaves from leafdecay, grass function --- appleleaf mod node --- TODO +-- greener freshwater in rivers -- magma rising at ridges +-- lavacooling +-- turquiose freshwater in rivers +-- TODO -- all tree heights vary -- fog --- singlenode option +-- singlenode game version -- Parameters @@ -30,6 +30,7 @@ local ATANAMP = 1.1 -- Arctan function amplitude, smaller = more and larger floa local TSTONE = 0.01 -- Density threshold for stone, depth of soil at TERCEN local TRIV = -0.015 -- Maximum densitybase threshold for river water local TSAND = -0.018 -- Maximum densitybase threshold for river sand +local TLAVA = 1 local FIST = 0 -- Fissure threshold at surface, controls size of fissure entrances at surface local FISEXP = 0.02 -- Fissure expansion rate under surface local ORETHI = 0.001 -- Ore seam thickness tuner @@ -179,6 +180,17 @@ local np_cloud = { persist = 0.7 } +-- 2D noise for magma + +local np_magma = { + offset = 0, + scale = 1, + spread = {x=128, y=128, z=128}, + seed = -13, + octaves = 1, + persist = 0.5 +} + -- Stuff watershed = {} @@ -286,11 +298,11 @@ minetest.register_on_generated(function(minp, maxp, seed) local nvals_base = minetest.get_perlin_map(np_base, chulens):get2dMap_flat(minposxz) local nvals_xlscale = minetest.get_perlin_map(np_xlscale, chulens):get2dMap_flat(minposxz) local nvals_cloud = minetest.get_perlin_map(np_cloud, chulens):get2dMap_flat(minposxz) + local nvals_magma = minetest.get_perlin_map(np_magma, chulens):get2dMap_flat(minposxz) local ungen = false -- ungenerated chunk below? if minetest.get_node({x=x0, y=y0-1, z=z0}).name == "ignore" then ungen = true - print ("[watershed] ungen") end local nixyz = 1 @@ -311,6 +323,7 @@ minetest.register_on_generated(function(minp, maxp, seed) local triv = TRIV * (1 - altprop * 1.1) local tsand = TSAND * (1 - altprop * 1.1) local tstone = TSTONE * (1 - math.atan(altprop) * 0.6) -- 1 to 0.05 + local tlava = TLAVA * (0.9 - nvals_magma[nixz] ^ 4 * terblen ^ 16) local density if nvals_fault[nixyz] >= 0 then density = densitybase @@ -378,7 +391,11 @@ minetest.register_on_generated(function(minp, maxp, seed) end end - if density >= tstone and nofis -- stone cut by fissures + if density >= tstone and densitybase >= tlava then + data[vi] = c_wslava + stable[si] = 0 + under[si] = 0 + elseif density >= tstone and nofis -- stone cut by fissures or (density >= tstone and density < TSTONE * 3 and y <= YWAT) -- stone around water or (density >= tstone and density < TSTONE * 3 and densitybase >= triv ) then -- stone around river local densitystr = nvals_strata[nixyz] / 4 + (TERCEN - y) / TERSCA diff --git a/nodes.lua b/nodes.lua index eb23933..9cb66a3 100644 --- a/nodes.lua +++ b/nodes.lua @@ -162,18 +162,18 @@ minetest.register_node("watershed:vine", { minetest.register_node("watershed:water", { description = "WS Water Source", - inventory_image = minetest.inventorycube("default_water.png"), + inventory_image = minetest.inventorycube("watershed_water.png"), drawtype = "liquid", tiles = { { - name="default_water_source_animated.png", + name="watershed_wateranim.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0} } }, special_tiles = { { - name="default_water_source_animated.png", + name="watershed_wateranim.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}, backface_culling = false, @@ -200,17 +200,17 @@ minetest.register_node("watershed:water", { minetest.register_node("watershed:waterflow", { description = "WS Flowing Water", - inventory_image = minetest.inventorycube("default_water.png"), + inventory_image = minetest.inventorycube("watershed_water.png"), drawtype = "flowingliquid", tiles = {"default_water.png"}, special_tiles = { { - image="default_water_flowing_animated.png", + image="watershed_waterflowanim.png", backface_culling=false, animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8} }, { - image="default_water_flowing_animated.png", + image="watershed_waterflowanim.png", backface_culling=true, animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8} }, diff --git a/textures/watershed_water.png b/textures/watershed_water.png new file mode 100644 index 0000000000000000000000000000000000000000..a4dfae047dc815f209a1addeeeff02b4a13c6d2f GIT binary patch literal 713 zcmV;)0yh1LP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^l8 z2NoAGKFo6f00K!#L_t(I%RQ6bcHA}$gg=0!DD6)+b<#R^k_Yc2k(o;bDF$A77J zC6OY~3pK&*0A~Qqj9h;C`X>OYNJ@Oj9e2&~rGgn=D=Z5#3|wzF92aA$g>BBfzP_Tm z-9d~lv9@h@LJKXBZ#1?d`f`_b5421 z%XsD=K)TFTPNWowdl61;0W)HkxsFP3M|00@GcHs)#Rz6FPb*O=+=jO#6=D?lkh@=N z{yh~W1l|YbheH$y?pO%W5BNMojBB$)yr~VFrsTK8|350JU&uk?X!g+<7VR{BXaju-Ot* z+K6KZxXhHPHD?8wQF+j%8WXs0z8~B1Qz~aWPt%G2qZ=p6fsaR!MLa vFf)9qhzMu^;L$;wbCHC{|3mj;2Ft>Kqp3wXzLE+_00000NkvXXu0mjfwsbHJ literal 0 HcmV?d00001 diff --git a/textures/watershed_wateranim.png b/textures/watershed_wateranim.png new file mode 100644 index 0000000000000000000000000000000000000000..ec359339e268dbd3785178e197ba83eb040760c8 GIT binary patch literal 4927 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 literal 0 HcmV?d00001 diff --git a/textures/watershed_waterflowanim.png b/textures/watershed_waterflowanim.png new file mode 100644 index 0000000000000000000000000000000000000000..bb1b2a3d389118a72fd3dba86160e3fbad4daaf2 GIT binary patch literal 5819 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