Improvements/fixes for noise parameter input in advanced settings
authorMuhammad Rifqi Priyo Susanto <muhammadrifqipriyosusanto@gmail.com>
Sat, 9 Sep 2017 17:49:12 +0000 (00:49 +0700)
committerparamat <mat.gregory@virginmedia.com>
Mon, 23 Oct 2017 00:28:13 +0000 (01:28 +0100)
Formspec input for each individual noise parameter and flag.
Allow noise flags to be set in advanced settings, previously only settable
in minetest.conf.

Standardise 'group format' for noise parameters set in minetest.conf, as
only these support noise flags. However the older 'single line' format is
still accepted to support existing minetest.conf files.
Therefore auto-generate minetest.conf.example with noise parameters in
'group format'.

Setting 'type' in settingtypes.txt is now either 'noise_params_2D' or
'noise_params_3D', the dimension number is displayed in the advanced
settings edit page.

builtin/mainmenu/dlg_settings_advanced.lua
builtin/mainmenu/generate_from_settingtypes.lua
builtin/settingtypes.txt
doc/lua_api.txt
src/script/common/c_content.cpp
src/script/common/c_converter.cpp
src/script/common/c_converter.h
src/script/lua_api/l_settings.cpp
src/script/lua_api/l_settings.h

index bc942c47285bba9f055cdc42c7b9e1807b57846e..b784a295e954b3968f1619ebe37edfe3f8e25c2f 100644 (file)
@@ -25,6 +25,10 @@ local CHAR_CLASSES = {
        FLAGS = "[%w_%-%.,]",
 }
 
+local function flags_to_table(flags)
+       return flags:gsub("%s+", ""):split(",", true) -- Remove all spaces and split
+end
+
 -- returns error message, or nil
 local function parse_setting_line(settings, line, read_all, base_level, allow_secure)
        -- comment
@@ -111,7 +115,7 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
                return
        end
 
-       if setting_type == "string" or setting_type == "noise_params"
+       if setting_type == "string"
                        or setting_type == "key" or setting_type == "v3f" then
                local default = remaining_line:match("^(.*)$")
 
@@ -133,6 +137,60 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
                return
        end
 
+       if setting_type == "noise_params_2d"
+                       or setting_type == "noise_params_3d" then
+               local default = remaining_line:match("^(.*)$")
+
+               if not default then
+                       return "Invalid string setting"
+               end
+
+               local values = {}
+               local ti = 1
+               local index = 1
+               for line in default:gmatch("[+-]?[%d.-e]+") do -- All numeric characters
+                       index = default:find("[+-]?[%d.-e]+", index) + line:len()
+                       table.insert(values, line)
+                       ti = ti + 1
+                       if ti > 9 then
+                               break
+                       end
+               end
+               index = default:find("[^, ]", index)
+               local flags = ""
+               if index then
+                       flags = default:sub(index)
+                       default = default:sub(1, index - 3) -- Make sure no flags in single-line format
+               end
+               table.insert(values, flags)
+
+               table.insert(settings, {
+                       name = name,
+                       readable_name = readable_name,
+                       type = setting_type,
+                       default = default,
+                       default_table = {
+                               offset = values[1],
+                               scale = values[2],
+                               spread = {
+                                       x = values[3],
+                                       y = values[4],
+                                       z = values[5]
+                               },
+                               seed = values[6],
+                               octaves = values[7],
+                               persistence = values[8],
+                               lacunarity = values[9],
+                               flags = values[10]
+                       },
+                       values = values,
+                       comment = current_comment,
+                       noise_params = true,
+                       flags = flags_to_table("defaults,eased,absvalue")
+               })
+               return
+       end
+
        if setting_type == "bool" then
                if remaining_line ~= "false" and remaining_line ~= "true" then
                        return "Invalid boolean setting"
@@ -236,7 +294,7 @@ local function parse_setting_line(settings, line, read_all, base_level, allow_se
                        readable_name = readable_name,
                        type = "flags",
                        default = default,
-                       possible = possible,
+                       possible = flags_to_table(possible),
                        comment = current_comment,
                })
                return
@@ -430,11 +488,61 @@ local function get_current_value(setting)
        return value
 end
 
+local function get_current_np_group(setting)
+       local value = core.settings:get_np_group(setting.name)
+       local t = {}
+       if value == nil then
+               t = setting.values
+       else
+               table.insert(t, value.offset)
+               table.insert(t, value.scale)
+               table.insert(t, value.spread.x)
+               table.insert(t, value.spread.y)
+               table.insert(t, value.spread.z)
+               table.insert(t, value.seed)
+               table.insert(t, value.octaves)
+               table.insert(t, value.persistence)
+               table.insert(t, value.lacunarity)
+               table.insert(t, value.flags)
+       end
+       return t
+end
+
+local function get_current_np_group_as_string(setting)
+       local value = core.settings:get_np_group(setting.name)
+       local t
+       if value == nil then
+               t = setting.default
+       else
+               t = value.offset .. ", " ..
+                       value.scale .. ", (" ..
+                       value.spread.x .. ", " ..
+                       value.spread.y .. ", " ..
+                       value.spread.z .. "), " ..
+                       value.seed .. ", " ..
+                       value.octaves .. ", " ..
+                       value.persistence .. ", " ..
+                       value.lacunarity .. ", " ..
+                       value.flags
+       end
+       return t
+end
+
+local checkboxes = {} -- handle checkboxes events
+
 local function create_change_setting_formspec(dialogdata)
        local setting = settings[selected_setting]
-       local formspec = "size[10,5.2,true]" ..
-                       "button[5,4.5;2,1;btn_done;" .. fgettext("Save") .. "]" ..
-                       "button[3,4.5;2,1;btn_cancel;" .. fgettext("Cancel") .. "]" ..
+       local height = 5.2
+       if setting.type == "noise_params_2d" or setting.type == "noise_params_3d" then
+               -- Three flags, checkboxes on 2 columns, with a vertical space of 1/2 unit
+               height = 8.7
+       elseif setting.type == "flags" then
+               -- Checkboxes on 2 columns, with a vertical space of 1/2 unit
+               height = 5.2 + math.ceil(#setting.possible / 2) / 2
+       end
+       local formspec = "size[10," .. height .. ",true]" ..
+                       "button[5," .. height - 0.7 .. ";2,1;btn_done;" .. fgettext("Save") .. "]" ..
+                       "button[3," .. height - 0.7 .. ";2,1;btn_cancel;" .. fgettext("Cancel") .. "]" ..
                        "tablecolumns[color;text]" ..
                        "tableoptions[background=#00000000;highlight=#00000000;border=false]" ..
                        "table[0,0;10,3;info;"
@@ -459,21 +567,6 @@ local function create_change_setting_formspec(dialogdata)
                formspec = formspec .. "," .. core.formspec_escape(comment_line) .. ","
        end
 
-       if setting.type == "flags" then
-               formspec = formspec .. ",,"
-                               .. "," .. fgettext("Please enter a comma seperated list of flags.") .. ","
-                               .. "," .. fgettext("Possible values are: ")
-                               .. core.formspec_escape(setting.possible:gsub(",", ", ")) .. ","
-       elseif setting.type == "noise_params" then
-               formspec = formspec .. ",,"
-                               .. "," .. fgettext("Format:") .. ","
-                               .. "," .. fgettext("<offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>),") .. ","
-                               .. "," .. fgettext("<seed>, <octaves>, <persistence>, <lacunarity>") .. ","
-       elseif setting.type == "v3f" then
-               formspec = formspec .. ",,"
-                               .. "," .. fgettext_ne("Format is 3 numbers separated by commas and inside brackets.") .. ","
-       end
-
        formspec = formspec:sub(1, -2) -- remove trailing comma
 
        formspec = formspec .. ";1]"
@@ -514,8 +607,91 @@ local function create_change_setting_formspec(dialogdata)
                                .. core.formspec_escape(current_value) .. "]"
                                .. "button[8,3.75;2,1;btn_browser_" .. setting.type .. ";" .. fgettext("Browse") .. "]"
 
+       elseif setting.type == "noise_params_2d" or setting.type == "noise_params_3d" then
+               local t = get_current_np_group(setting)
+               local dimension = 3
+               if setting.type == "noise_params_2d" then
+                       dimension = 2
+               end
+
+               formspec = formspec
+                               .. "label[0,2.5;(" .. dimension .. "D Noise)]"
+                               .. "field[0.5,4;3.3,1;te_offset;Offset;" -- Offset
+                               .. core.formspec_escape(t[1] or "") .. "]"
+                               .. "field[3.8,4;3.3,1;te_scale;Scale;" -- Scale
+                               .. core.formspec_escape(t[2] or "") .. "]"
+                               .. "field[7.1,4;3.3,1;te_seed;Seed;" -- Seed
+                               .. core.formspec_escape(t[6] or "") .. "]"
+                               .. "label[0.5,4.7;Spread]" -- Spread
+                               .. "field[2.0,5;2.8,1;te_spreadx;X;"
+                               .. core.formspec_escape(t[3] or "") .. "]"
+                               .. "field[4.8,5;2.8,1;te_spready;Y;"
+                               .. core.formspec_escape(t[4] or "") .. "]"
+                               .. "field[7.6,5;2.8,1;te_spreadz;Z;"
+                               .. core.formspec_escape(t[5] or "") .. "]"
+                               .. "field[0.5,6;3.3,1;te_octaves;Octaves;" -- Octaves
+                               .. core.formspec_escape(t[7] or "") .. "]"
+                               .. "field[3.8,6;3.3,1;te_persist;Persistance;" -- Persistance
+                               .. core.formspec_escape(t[8] or "") .. "]"
+                               .. "field[7.1,6;3.3,1;te_lacun;Lacunarity;" -- Lacunarity
+                               .. core.formspec_escape(t[9] or "") .. "]"
+
+               local enabled_flags = flags_to_table(t[10])
+               local flags = {}
+               for _, name in ipairs(enabled_flags) do
+                       -- Index by name, to avoid iterating over all enabled_flags for every possible flag.
+                       flags[name] = true
+               end
+               -- Flags
+               formspec = formspec
+                               .. "checkbox[0.5,6.5;cb_defaults;defaults;" -- defaults
+                               .. tostring(flags["defaults"] == true) .. "]" -- to get false if nil
+                               .. "checkbox[5,6.5;cb_eased;eased;" -- eased
+                               .. tostring(flags["eased"] == true) .. "]"
+                               .. "checkbox[5,7.0;cb_absvalue;absvalue;" -- absvalue
+                               .. tostring(flags["absvalue"] == true) .. "]"
+
+       elseif setting.type == "v3f" then
+               local val = get_current_value(setting)
+               local v3f = {}
+               for line in val:gmatch("[+-]?[%d.-e]+") do -- All numeric characters
+                       table.insert(v3f, line)
+               end
+
+               formspec = formspec
+                               .. "field[0.5,4;3.3,1;te_x;X;" -- X
+                               .. core.formspec_escape(v3f[1] or "") .. "]"
+                               .. "field[3.8,4;3.3,1;te_y;Y;" -- Y
+                               .. core.formspec_escape(v3f[2] or "") .. "]"
+                               .. "field[7.1,4;3.3,1;te_z;Z;" -- Z
+                               .. core.formspec_escape(v3f[3] or "") .. "]"
+
+       elseif setting.type == "flags" then
+               local enabled_flags = flags_to_table(get_current_value(setting))
+               local flags = {}
+               for _, name in ipairs(enabled_flags) do
+                       -- Index by name, to avoid iterating over all enabled_flags for every possible flag.
+                       flags[name] = true
+               end
+               local flags_count = #setting.possible
+               for i, name in ipairs(setting.possible) do
+                       local x = 0.5
+                       local y = 3.5 + i / 2
+                       if i - 1 >= flags_count / 2 then -- 2nd column
+                               x = 5
+                               y = y - flags_count / 4
+                       end
+                       local checkbox_name = "cb_" .. name
+                       local is_enabled = flags[name] == true -- to get false if nil
+                       checkboxes[checkbox_name] = is_enabled
+                       formspec = formspec .. "checkbox["
+                                       .. x .. "," .. y
+                                       .. ";" .. checkbox_name .. ";"
+                                       .. name .. ";" .. tostring(is_enabled) .. "]"
+               end
+
        else
-               -- TODO: fancy input for float, int, flags, noise_params, v3f
+               -- TODO: fancy input for float, int
                local width = 10
                local text = get_current_value(setting)
                if dialogdata.error_message then
@@ -535,8 +711,8 @@ local function create_change_setting_formspec(dialogdata)
 end
 
 local function handle_change_setting_buttons(this, fields)
+       local setting = settings[selected_setting]
        if fields["btn_done"] or fields["key_enter"] then
-               local setting = settings[selected_setting]
                if setting.type == "bool" then
                        local new_value = fields["dd_setting_value"]
                        -- Note: new_value is the actual (translated) value shown in the dropdown
@@ -579,17 +755,49 @@ local function handle_change_setting_buttons(this, fields)
                        core.settings:set(setting.name, new_value)
 
                elseif setting.type == "flags" then
-                       local new_value = fields["te_setting_value"]
-                       for _,value in ipairs(new_value:split(",", true)) do
-                               value = value:trim()
-                               local possible = "," .. setting.possible .. ","
-                               if not possible:find("," .. value .. ",", 0, true) then
-                                       this.data.error_message = fgettext_ne("\"$1\" is not a valid flag.", value)
-                                       this.data.entered_text = fields["te_setting_value"]
-                                       core.update_formspec(this:get_formspec())
-                                       return true
+                       local values = {}
+                       for _, name in ipairs(setting.possible) do
+                               if checkboxes["cb_" .. name] then
+                                       table.insert(values, name)
+                               end
+                       end
+
+                       checkboxes = {}
+
+                       local new_value = table.concat(values, ", ")
+                       core.settings:set(setting.name, new_value)
+
+               elseif setting.type == "noise_params_2d" or setting.type == "noise_params_3d" then
+                       local np_flags = {}
+                       for _, name in ipairs(setting.flags) do
+                               if checkboxes["cb_" .. name] then
+                                       table.insert(np_flags, name)
                                end
                        end
+
+                       checkboxes = {}
+
+                       local new_value = {
+                               offset = fields["te_offset"],
+                               scale = fields["te_scale"],
+                               spread = {
+                                       x = fields["te_spreadx"],
+                                       y = fields["te_spready"],
+                                       z = fields["te_spreadz"]
+                               },
+                               seed = fields["te_seed"],
+                               octaves = fields["te_octaves"],
+                               persistence = fields["te_persist"],
+                               lacunarity = fields["te_lacun"],
+                               flags = table.concat(np_flags, ", ")
+                       }
+                       core.settings:set_np_group(setting.name, new_value)
+
+               elseif setting.type == "v3f" then
+                       local new_value = "("
+                                       .. fields["te_x"] .. ", "
+                                       .. fields["te_y"] .. ", "
+                                       .. fields["te_z"] .. ")"
                        core.settings:set(setting.name, new_value)
 
                else
@@ -621,6 +829,16 @@ local function handle_change_setting_buttons(this, fields)
                core.update_formspec(this:get_formspec())
        end
 
+       if setting.type == "flags"
+                       or setting.type == "noise_params_2d"
+                       or setting.type == "noise_params_3d" then
+               for name, value in pairs(fields) do
+                       if name:sub(1, 3) == "cb_" then
+                               checkboxes[name] = value == "true"
+                       end
+               end
+       end
+
        return false
 end
 
@@ -659,6 +877,10 @@ local function create_settings_formspec(tabview, name, tabdata)
                elseif entry.type == "key" then
                        -- ignore key settings, since we have a special dialog for them
 
+               elseif entry.type == "noise_params_2d" or entry.type == "noise_params_3d" then
+                       formspec = formspec .. "," .. (current_level + 1) .. "," .. core.formspec_escape(name) .. ","
+                                       .. core.formspec_escape(get_current_np_group_as_string(entry)) .. ","
+
                else
                        formspec = formspec .. "," .. (current_level + 1) .. "," .. core.formspec_escape(name) .. ","
                                        .. core.formspec_escape(get_current_value(entry)) .. ","
@@ -743,7 +965,12 @@ local function handle_settings_buttons(this, fields, tabname, tabdata)
        if fields["btn_restore"] then
                local setting = settings[selected_setting]
                if setting and setting.type ~= "category" then
-                       core.settings:set(setting.name, setting.default)
+                       if setting.type == "noise_params_2d"
+                                       or setting.type == "noise_params_3d" then
+                               core.settings:set_np_group(setting.name, setting.default_table)
+                       else
+                               core.settings:set(setting.name, setting.default)
+                       end
                        core.settings:write()
                        core.update_formspec(this:get_formspec())
                end
index 6c9ba27fbcf272acce1705ebec11ca3d895494ff..9b36843e19e91fd43ee955fdadaad455daa49552 100644 (file)
@@ -22,6 +22,20 @@ local minetest_example_header = [[
 
 ]]
 
+local group_format_template = [[
+# %s = {
+#    offset      = %s,
+#    scale       = %s,
+#    spread      = (%s, %s, %s),
+#    seed        = %s,
+#    octaves     = %s,
+#    persistence = %s,
+#    lacunarity  = %s,
+#    flags       = "%s"
+# }
+
+]]
+
 local function create_minetest_conf_example()
        local result = { minetest_example_header }
        for _, entry in ipairs(settings) do
@@ -33,6 +47,12 @@ local function create_minetest_conf_example()
                                insert(result, "# " .. entry.name .. "\n\n")
                        end
                else
+                       local group_format = false
+                       if entry.noise_params and entry.values then
+                               if entry.type == "noise_params_2d" or entry.type == "noise_params_3d" then
+                                       group_format = true
+                               end
+                       end
                        if entry.comment ~= "" then
                                for _, comment_line in ipairs(entry.comment:split("\n", true)) do
                                        insert(result, "#    " .. comment_line .. "\n")
@@ -45,18 +65,25 @@ local function create_minetest_conf_example()
                        if entry.max then
                                insert(result, " max: " .. entry.max)
                        end
-                       if entry.values then
+                       if entry.values and entry.noise_params == nil then
                                insert(result, " values: " .. concat(entry.values, ", "))
                        end
                        if entry.possible then
-                               insert(result, " possible values: " .. entry.possible:gsub(",", ", "))
+                               insert(result, " possible values: " .. concat(entry.possible, ", "))
                        end
                        insert(result, "\n")
-                       local append
-                       if entry.default ~= "" then
-                               append = " " .. entry.default
+                       if group_format == true then
+                               insert(result, sprintf(group_format_template, entry.name, entry.values[1],
+                                               entry.values[2], entry.values[3], entry.values[4], entry.values[5],
+                                               entry.values[6], entry.values[7], entry.values[8], entry.values[9],
+                                               entry.values[10]))
+                       else
+                               local append
+                               if entry.default ~= "" then
+                                       append = " " .. entry.default
+                               end
+                               insert(result, sprintf("# %s =%s\n\n", entry.name, append or ""))
                        end
-                       insert(result, sprintf("# %s =%s\n\n", entry.name, append or ""))
                end
        end
        return concat(result)
index 7ebee9424c40b001a64c9ea4048d94464ef2f55e..ad88b97d0cc6d12cee904261ce2080c3f85a3824 100644 (file)
@@ -15,7 +15,9 @@
 #    - filepath
 #    - key (will be ignored in GUI, since a special key change dialog exists)
 #    - flags
-#    - noise_params
+#    - noise_params_2d
+#    - noise_params_3d
+#    - v3f
 #
 # `type_args` can be:
 #   * int:
 #   * flags:
 #            Flags are always separated by comma without spaces.
 #            - default possible_flags
-#   * noise_params:
-#            TODO: these are currently treated like strings
+#   * noise_params_2d:
+#            Format is <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, <octaves>, <persistance>, <lacunarity>[, <default flags>]
+#            - default
+#   * noise_params_3d:
+#            Format is <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, <octaves>, <persistance>, <lacunarity>[, <default flags>]
+#            - default
+#   * v3f:
+#            Format is (<X>, <Y>, <Z>)
+#            - default
 #
 # Comments directly above a setting are bound to this setting.
 # All other comments are ignored.
@@ -1239,7 +1248,7 @@ mapgen_limit (Map generation limit) int 31000 0 31000
 #    Global map generation attributes.
 #    In Mapgen v6 the 'decorations' flag controls all decorations except trees
 #    and junglegrass, in all other mapgens this flag controls all decorations.
-#    Flags that are not specified in the flag string are not modified from the default.
+#    Flags that are not enabled are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 mg_flags (Mapgen flags) flags caves,dungeons,light,decorations caves,dungeons,light,decorations,nocaves,nodungeons,nolight,nodecorations
 
@@ -1249,21 +1258,21 @@ projecting_dungeons (Projecting dungeons) bool true
 [*Biome API temperature and humidity noise parameters]
 
 #    Temperature variation for biomes.
-mg_biome_np_heat (Heat noise) noise_params 50, 50, (1000, 1000, 1000), 5349, 3, 0.5, 2.0
+mg_biome_np_heat (Heat noise) noise_params_2d 50, 50, (1000, 1000, 1000), 5349, 3, 0.5, 2.0, eased
 
 #    Small-scale temperature variation for blending biomes on borders.
-mg_biome_np_heat_blend (Heat blend noise) noise_params 0, 1.5, (8, 8, 8), 13, 2, 1.0, 2.0
+mg_biome_np_heat_blend (Heat blend noise) noise_params_2d 0, 1.5, (8, 8, 8), 13, 2, 1.0, 2.0, eased
 
 #    Humidity variation for biomes.
-mg_biome_np_humidity (Humidity noise) noise_params 50, 50, (1000, 1000, 1000), 842, 3, 0.5, 2.0
+mg_biome_np_humidity (Humidity noise) noise_params_2d 50, 50, (1000, 1000, 1000), 842, 3, 0.5, 2.0, eased
 
 #    Small-scale humidity variation for blending biomes on borders.
-mg_biome_np_humidity_blend (Humidity blend noise) noise_params 0, 1.5, (8, 8, 8), 90003, 2, 1.0, 2.0
+mg_biome_np_humidity_blend (Humidity blend noise) noise_params_2d 0, 1.5, (8, 8, 8), 90003, 2, 1.0, 2.0, eased
 
 [*Mapgen V5]
 
 #    Map generation attributes specific to Mapgen v5.
-#    Flags that are not specified in the flag string are not modified from the default.
+#    Flags that are not enabled are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 mgv5_spflags (Mapgen V5 specific flags) flags caverns caverns,nocaverns
 
@@ -1288,39 +1297,26 @@ mgv5_cavern_threshold (Cavern threshold) float 0.7
 [**Noises]
 
 #    Variation of biome filler depth.
-mgv5_np_filler_depth (Filler depth noise) noise_params 0, 1, (150, 150, 150), 261, 4, 0.7, 2.0
+mgv5_np_filler_depth (Filler depth noise) noise_params_2d 0, 1, (150, 150, 150), 261, 4, 0.7, 2.0, eased
 
 #    Variation of terrain vertical scale.
 #    When noise is < -0.55 terrain is near-flat.
-mgv5_np_factor (Factor noise) noise_params 0, 1, (250, 250, 250), 920381, 3, 0.45, 2.0
+mgv5_np_factor (Factor noise) noise_params_2d 0, 1, (250, 250, 250), 920381, 3, 0.45, 2.0, eased
 
 #    Y-level of average terrain surface.
-mgv5_np_height (Height noise) noise_params 0, 10, (250, 250, 250), 84174, 4, 0.5, 2.0
+mgv5_np_height (Height noise) noise_params_2d 0, 10, (250, 250, 250), 84174, 4, 0.5, 2.0, eased
 
 #    First of 2 3D noises that together define tunnels.
-mgv5_np_cave1 (Cave1 noise) noise_params 0, 12, (50, 50, 50), 52534, 4, 0.5, 2.0
+mgv5_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (50, 50, 50), 52534, 4, 0.5, 2.0
 
 #    Second of 2 3D noises that together define tunnels.
-mgv5_np_cave2 (Cave2 noise) noise_params 0, 12, (50, 50, 50), 10325, 4, 0.5, 2.0
+mgv5_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (50, 50, 50), 10325, 4, 0.5, 2.0
 
 #    3D noise defining giant caverns.
-mgv5_np_cavern (Cavern noise) noise_params 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0
+mgv5_np_cavern (Cavern noise) noise_params_3d 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0
 
-#    TODO
-#    Noise parameters in group format, unsupported by advanced settings
-#    menu but settable in minetest.conf.
-#    See documentation of noise parameter formats in minetest.conf.example.
 #    3D noise defining terrain.
-#mgv5_np_ground = {
-#    offset      = 0
-#    scale       = 40
-#    spread      = (80, 80, 80)
-#    seed        = 983240
-#    octaves     = 4
-#    persistence = 0.55
-#    lacunarity  = 2.0
-#    flags       = "eased"
-#}
+mgv5_np_ground (Ground noise) noise_params_3d 0, 40, (80, 80, 80), 983240, 4, 0.55, 2.0, eased
 
 [*Mapgen V6]
 
@@ -1328,7 +1324,7 @@ mgv5_np_cavern (Cavern noise) noise_params 0, 1, (384, 128, 384), 723, 5, 0.63,
 #    The 'snowbiomes' flag enables the new 5 biome system.
 #    When the new biome system is enabled jungles are automatically enabled and
 #    the 'jungles' flag is ignored.
-#    Flags that are not specified in the flag string are not modified from the default.
+#    Flags that are not enabled are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 mgv6_spflags (Mapgen V6 specific flags) flags jungles,biomeblend,mudflow,snowbiomes,trees jungles,biomeblend,mudflow,snowbiomes,flat,trees,nojungles,nobiomeblend,nomudflow,nosnowbiomes,noflat,notrees
 
@@ -1342,43 +1338,43 @@ mgv6_freq_beach (Beach noise threshold) float 0.15
 [**Noises]
 
 #    Y-level of lower terrain and lakebeds.
-mgv6_np_terrain_base (Terrain base noise) noise_params -4, 20, (250, 250, 250), 82341, 5, 0.6, 2.0
+mgv6_np_terrain_base (Terrain base noise) noise_params_2d -4, 20, (250, 250, 250), 82341, 5, 0.6, 2.0, eased
 
 #    Y-level of higher (cliff-top) terrain.
-mgv6_np_terrain_higher (Terrain higher noise) noise_params 20, 16, (500, 500, 500), 85039, 5, 0.6, 2.0
+mgv6_np_terrain_higher (Terrain higher noise) noise_params_2d 20, 16, (500, 500, 500), 85039, 5, 0.6, 2.0, eased
 
 #    Varies steepness of cliffs.
-mgv6_np_steepness (Steepness noise) noise_params 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2.0
+mgv6_np_steepness (Steepness noise) noise_params_2d 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2.0, eased
 
 #    Defines areas of 'terrain_higher' (cliff-top terrain).
-mgv6_np_height_select (Height select noise) noise_params 0.5, 1, (250, 250, 250), 4213, 5, 0.69, 2.0
+mgv6_np_height_select (Height select noise) noise_params_2d 0.5, 1, (250, 250, 250), 4213, 5, 0.69, 2.0, eased
 
 #    Varies depth of biome surface nodes.
-mgv6_np_mud (Mud noise) noise_params 4, 2, (200, 200, 200), 91013, 3, 0.55, 2.0
+mgv6_np_mud (Mud noise) noise_params_2d 4, 2, (200, 200, 200), 91013, 3, 0.55, 2.0, eased
 
 #    Defines areas with sandy beaches.
-mgv6_np_beach (Beach noise) noise_params 0, 1, (250, 250, 250), 59420, 3, 0.50, 2.0
+mgv6_np_beach (Beach noise) noise_params_2d 0, 1, (250, 250, 250), 59420, 3, 0.50, 2.0, eased
 
 #    Temperature variation for biomes.
-mgv6_np_biome (Biome noise) noise_params 0, 1, (500, 500, 500), 9130, 3, 0.50, 2.0
+mgv6_np_biome (Biome noise) noise_params_2d 0, 1, (500, 500, 500), 9130, 3, 0.50, 2.0, eased
 
 #    Variation of number of caves.
-mgv6_np_cave (Cave noise) noise_params 6, 6, (250, 250, 250), 34329, 3, 0.50, 2.0
+mgv6_np_cave (Cave noise) noise_params_2d 6, 6, (250, 250, 250), 34329, 3, 0.50, 2.0, eased
 
 #    Humidity variation for biomes.
-mgv6_np_humidity (Humidity noise) noise_params 0.5, 0.5, (500, 500, 500), 72384, 3, 0.50, 2.0
+mgv6_np_humidity (Humidity noise) noise_params_2d 0.5, 0.5, (500, 500, 500), 72384, 3, 0.50, 2.0, eased
 
 #    Defines tree areas and tree density.
-mgv6_np_trees (Trees noise) noise_params 0, 1, (125, 125, 125), 2, 4, 0.66, 2.0
+mgv6_np_trees (Trees noise) noise_params_2d 0, 1, (125, 125, 125), 2, 4, 0.66, 2.0, eased
 
 #    Defines areas where trees have apples.
-mgv6_np_apple_trees (Apple trees noise) noise_params 0, 1, (100, 100, 100), 342902, 3, 0.45, 2.0
+mgv6_np_apple_trees (Apple trees noise) noise_params_2d 0, 1, (100, 100, 100), 342902, 3, 0.45, 2.0, eased
 
 [*Mapgen V7]
 
 #    Map generation attributes specific to Mapgen v7.
 #    'ridges' enables the rivers.
-#    Flags that are not specified in the flag string are not modified from the default.
+#    Flags that are not enabled are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 mgv7_spflags (Mapgen V7 specific flags) flags mountains,ridges,nofloatlands,caverns mountains,ridges,floatlands,caverns,nomountains,noridges,nofloatlands,nocaverns
 
@@ -1419,54 +1415,54 @@ mgv7_cavern_threshold (Cavern threshold) float 0.7
 [**Noises]
 
 #    Y-level of higher (cliff-top) terrain.
-mgv7_np_terrain_base (Terrain base noise) noise_params 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0
+mgv7_np_terrain_base (Terrain base noise) noise_params_2d 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0, eased
 
 #    Y-level of lower terrain and lakebeds.
-mgv7_np_terrain_alt (Terrain alt noise) noise_params 4, 25, (600, 600, 600), 5934, 5, 0.6, 2.0
+mgv7_np_terrain_alt (Terrain alt noise) noise_params_2d 4, 25, (600, 600, 600), 5934, 5, 0.6, 2.0, eased
 
 #    Varies roughness of terrain.
 #    Defines the 'persistence' value for terrain_base and terrain_alt noises.
-mgv7_np_terrain_persist (Terrain persistence noise) noise_params 0.6, 0.1, (2000, 2000, 2000), 539, 3, 0.6, 2.0
+mgv7_np_terrain_persist (Terrain persistence noise) noise_params_2d 0.6, 0.1, (2000, 2000, 2000), 539, 3, 0.6, 2.0, eased
 
 #    Defines areas of higher (cliff-top) terrain and affects steepness of cliffs.
-mgv7_np_height_select (Height select noise) noise_params -8, 16, (500, 500, 500), 4213, 6, 0.7, 2.0
+mgv7_np_height_select (Height select noise) noise_params_2d -8, 16, (500, 500, 500), 4213, 6, 0.7, 2.0, eased
 
 #    Variation of biome filler depth.
-mgv7_np_filler_depth (Filler depth noise) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0
+mgv7_np_filler_depth (Filler depth noise) noise_params_2d 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0, eased
 
 #    Variation of maximum mountain height (in nodes).
-mgv7_np_mount_height (Mountain height noise) noise_params 256, 112, (1000, 1000, 1000), 72449, 3, 0.6, 2.0
+mgv7_np_mount_height (Mountain height noise) noise_params_2d 256, 112, (1000, 1000, 1000), 72449, 3, 0.6, 2.0, eased
 
 #    Defines large-scale river channel structure.
-mgv7_np_ridge_uwater (Ridge underwater noise) noise_params 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0
+mgv7_np_ridge_uwater (Ridge underwater noise) noise_params_2d 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0, eased
 
 #    Defines areas of floatland smooth terrain.
 #    Smooth floatlands occur when noise > 0.
-mgv7_np_floatland_base (Floatland base noise) noise_params -0.6, 1.5, (600, 600, 600), 114, 5, 0.6, 2.0
+mgv7_np_floatland_base (Floatland base noise) noise_params_2d -0.6, 1.5, (600, 600, 600), 114, 5, 0.6, 2.0, eased
 
 #    Variation of hill height and lake depth on floatland smooth terrain.
-mgv7_np_float_base_height (Floatland base height noise) noise_params 48, 24, (300, 300, 300), 907, 4, 0.7, 2.0
+mgv7_np_float_base_height (Floatland base height noise) noise_params_2d 48, 24, (300, 300, 300), 907, 4, 0.7, 2.0, eased
 
 #    3D noise defining mountain structure and height.
 #    Also defines structure of floatland mountain terrain.
-mgv7_np_mountain (Mountain noise) noise_params -0.6, 1, (250, 350, 250), 5333, 5, 0.63, 2.0
+mgv7_np_mountain (Mountain noise) noise_params_3d -0.6, 1, (250, 350, 250), 5333, 5, 0.63, 2.0
 
 #    3D noise defining structure of river canyon walls.
-mgv7_np_ridge (Ridge noise) noise_params 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0
+mgv7_np_ridge (Ridge noise) noise_params_3d 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0
 
 #    3D noise defining giant caverns.
-mgv7_np_cavern (Cavern noise) noise_params 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0
+mgv7_np_cavern (Cavern noise) noise_params_3d 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0
 
 #    First of 2 3D noises that together define tunnels.
-mgv7_np_cave1 (Cave1 noise) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
+mgv7_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
 
 #    Second of 2 3D noises that together define tunnels.
-mgv7_np_cave2 (Cave2 noise) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
+mgv7_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
 [*Mapgen Carpathian]
 
 #    Map generation attributes specific to Mapgen Carpathian.
-#    Flags that are not specified in the flag string are not modified from the default.
+#    Flags that are not enabled are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 mgcarpathian_spflags (Mapgen Carpathian specific flags) flags caverns caverns,nocaverns
 
@@ -1491,58 +1487,58 @@ mgcarpathian_cavern_threshold (Cavern threshold) float 0.7
 [**Noises]
 
 #    2D noise that defines the base ground level.
-mgcarpathian_np_base (Base ground noise) noise_params 12, 1, (2557, 2557, 2557), 6538, 4, 0.8, 0.5
+mgcarpathian_np_base (Base ground noise) noise_params_2d 12, 1, (2557, 2557, 2557), 6538, 4, 0.8, 0.5, eased
 
 #    Variation of biome filler depth.
-mgcarpathian_np_filler_depth (Filler depth noise) noise_params 0, 1, (128, 128, 128), 261, 3, 0.7, 2.0
+mgcarpathian_np_filler_depth (Filler depth noise) noise_params_2d 0, 1, (128, 128, 128), 261, 3, 0.7, 2.0, eased
 
-#    First of 4 3D noises that together define hill/mountain range height.
-mgcarpathian_np_height1 (Hilliness1 noise) noise_params 0, 5, (251, 251, 251), 9613, 5, 0.5, 2.0
+#    First of 4 2D noises that together define hill/mountain range height.
+mgcarpathian_np_height1 (Hilliness1 noise) noise_params_2d 0, 5, (251, 251, 251), 9613, 5, 0.5, 2.0, eased
 
-#    Second of 4 3D noises that together define hill/mountain range height.
-mgcarpathian_np_height2 (Hilliness2 noise) noise_params 0, 5, (383, 383, 383), 1949, 5, 0.5, 2.0
+#    Second of 4 2D noises that together define hill/mountain range height.
+mgcarpathian_np_height2 (Hilliness2 noise) noise_params_2d 0, 5, (383, 383, 383), 1949, 5, 0.5, 2.0, eased
 
-#    Third of 4 3D noises that together define hill/mountain range height.
-mgcarpathian_np_height3 (Hilliness3 noise) noise_params 0, 5, (509, 509, 509), 3211, 5, 0.5, 2.0
+#    Third of 4 2D noises that together define hill/mountain range height.
+mgcarpathian_np_height3 (Hilliness3 noise) noise_params_2d 0, 5, (509, 509, 509), 3211, 5, 0.5, 2.0, eased
 
-#    Fourth of 4 3D noises that together define hill/mountain range height.
-mgcarpathian_np_height4 (Hilliness4 noise) noise_params 0, 5, (631, 631, 631), 1583, 5, 0.5, 2.0
+#    Fourth of 4 2D noises that together define hill/mountain range height.
+mgcarpathian_np_height4 (Hilliness4 noise) noise_params_2d 0, 5, (631, 631, 631), 1583, 5, 0.5, 2.0, eased
 
 #    2D noise that controls the size/occurance of rolling hills.
-mgcarpathian_np_hills_terrain (Rolling hills spread noise) noise_params 1, 1, (1301, 1301, 1301), 1692, 3, 0.5, 2.0
+mgcarpathian_np_hills_terrain (Rolling hills spread noise) noise_params_2d 1, 1, (1301, 1301, 1301), 1692, 3, 0.5, 2.0, eased
 
 #    2D noise that controls the size/occurance of ridged mountain ranges.
-mgcarpathian_np_ridge_terrain (Ridge mountain spread noise) noise_params 1, 1, (1889, 1889, 1889), 3568, 3, 0.5, 2.0
+mgcarpathian_np_ridge_terrain (Ridge mountain spread noise) noise_params_2d 1, 1, (1889, 1889, 1889), 3568, 3, 0.5, 2.0, eased
 
 #    2D noise that controls the size/occurance of step mountain ranges.
-mgcarpathian_np_step_terrain (Step mountain spread noise) noise_params 1, 1, (1889, 1889, 1889), 4157, 3, 0.5, 2.0
+mgcarpathian_np_step_terrain (Step mountain spread noise) noise_params_2d 1, 1, (1889, 1889, 1889), 4157, 3, 0.5, 2.0, eased
 
 #    2D noise that controls the shape/size of rolling hills.
-mgcarpathian_np_hills (Rolling hill size noise) noise_params 0, 3, (257, 257, 257), 6604, 6, 0.5, 2.0
+mgcarpathian_np_hills (Rolling hill size noise) noise_params_2d 0, 3, (257, 257, 257), 6604, 6, 0.5, 2.0, eased
 
 #    2D noise that controls the shape/size of ridged mountains.
-mgcarpathian_np_ridge_mnt (Ridged mountain size noise) noise_params 0, 12, (743, 743, 743), 5520, 6, 0.7, 2.0
+mgcarpathian_np_ridge_mnt (Ridged mountain size noise) noise_params_2d 0, 12, (743, 743, 743), 5520, 6, 0.7, 2.0, eased
 
 #    2D noise that controls the shape/size of step mountains.
-mgcarpathian_np_step_mnt (Step mountain size noise) noise_params 0, 8, (509, 509, 509), 2590, 6, 0.6, 2.0
+mgcarpathian_np_step_mnt (Step mountain size noise) noise_params_2d 0, 8, (509, 509, 509), 2590, 6, 0.6, 2.0, eased
 
 #    3D noise for mountain overhangs, cliffs, etc. Usually small variations.
-mgcarpathian_np_mnt_var (Mountain variation noise) noise_params 0, 1, (499, 499, 499), 2490, 5, 0.55, 2.0
+mgcarpathian_np_mnt_var (Mountain variation noise) noise_params_3d 0, 1, (499, 499, 499), 2490, 5, 0.55, 2.0
 
 #    First of 2 3D noises that together define tunnels.
-mgcarpathian_np_cave1 (Cave1 noise) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
+mgcarpathian_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
 
 #    Second of 2 3D noises that together define tunnels.
-mgcarpathian_np_cave2 (Cave2 noise) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
+mgcarpathian_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
 #    3D noise defining giant caverns.
-mgcarpathian_np_cavern (Cavern noise) noise_params 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0
+mgcarpathian_np_cavern (Cavern noise) noise_params_3d 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0
 
 [*Mapgen Flat]
 
 #    Map generation attributes specific to Mapgen flat.
 #    Occasional lakes and hills can be added to the flat world.
-#    Flags that are not specified in the flag string are not modified from the default.
+#    Flags that are not enabled are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 mgflat_spflags (Mapgen Flat specific flags) flags nolakes,nohills lakes,hills,nolakes,nohills
 
@@ -1577,16 +1573,16 @@ mgflat_hill_steepness (Hill steepness) float 64.0
 [**Noises]
 
 #    Defines location and terrain of optional hills and lakes.
-mgflat_np_terrain (Terrain noise) noise_params 0, 1, (600, 600, 600), 7244, 5, 0.6, 2.0
+mgflat_np_terrain (Terrain noise) noise_params_2d 0, 1, (600, 600, 600), 7244, 5, 0.6, 2.0, eased
 
 #    Variation of biome filler depth.
-mgflat_np_filler_depth (Filler depth noise) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0
+mgflat_np_filler_depth (Filler depth noise) noise_params_2d 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0, eased
 
 #    First of 2 3D noises that together define tunnels.
-mgflat_np_cave1 (Cave1 noise) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
+mgflat_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
 
 #    Second of 2 3D noises that together define tunnels.
-mgflat_np_cave2 (Cave2 noise) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
+mgflat_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
 [*Mapgen Fractal]
 
@@ -1659,16 +1655,16 @@ mgfractal_julia_w (Julia w) float 0.33
 [**Noises]
 
 #    Y-level of seabed.
-mgfractal_np_seabed (Seabed noise) noise_params -14, 9, (600, 600, 600), 41900, 5, 0.6, 2.0
+mgfractal_np_seabed (Seabed noise) noise_params_2d -14, 9, (600, 600, 600), 41900, 5, 0.6, 2.0, eased
 
 #    Variation of biome filler depth.
-mgfractal_np_filler_depth (Filler depth noise) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0
+mgfractal_np_filler_depth (Filler depth noise) noise_params_2d 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0, eased
 
 #    First of 2 3D noises that together define tunnels.
-mgfractal_np_cave1 (Cave1 noise) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
+mgfractal_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
 
 #    Second of 2 3D noises that together define tunnels.
-mgfractal_np_cave2 (Cave2 noise) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
+mgfractal_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
 [*Mapgen Valleys]
 
@@ -1676,7 +1672,7 @@ mgfractal_np_cave2 (Cave2 noise) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5
 #    'altitude_chill' makes higher elevations colder, which may cause biome issues.
 #    'humid_rivers' modifies the humidity around rivers and in areas where water would tend to pool,
 #    it may interfere with delicately adjusted biomes.
-#    Flags that are not specified in the flag string are not modified from the default.
+#    Flags that are not enabled are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 mg_valleys_spflags (Mapgen Valleys specific flags) flags altitude_chill,humid_rivers altitude_chill,noaltitude_chill,humid_rivers,nohumid_rivers
 
@@ -1709,34 +1705,34 @@ mgvalleys_cave_width (Cave width) float 0.09
 [**Noises]
 
 # Caves and tunnels form at the intersection of the two noises
-mgvalleys_np_cave1 (Cave noise #1) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
+mgvalleys_np_cave1 (Cave noise #1) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
 
 # Caves and tunnels form at the intersection of the two noises
-mgvalleys_np_cave2 (Cave noise #2) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
+mgvalleys_np_cave2 (Cave noise #2) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
 # The depth of dirt or other filler
-mgvalleys_np_filler_depth (Filler Depth) noise_params 0, 1.2, (256, 256, 256), 1605, 3, 0.5, 2.0
+mgvalleys_np_filler_depth (Filler Depth) noise_params_2d 0, 1.2, (256, 256, 256), 1605, 3, 0.5, 2.0, eased
 
 # Massive caves form here.
-mgvalleys_np_massive_caves (Massive cave noise) noise_params 0, 1, (768, 256, 768), 59033, 6, 0.63, 2.0
+mgvalleys_np_massive_caves (Massive cave noise) noise_params_3d 0, 1, (768, 256, 768), 59033, 6, 0.63, 2.0
 
 # River noise -- rivers occur close to zero
-mgvalleys_np_rivers (River Noise) noise_params 0, 1, (256, 256, 256), -6050, 5, 0.6, 2.0
+mgvalleys_np_rivers (River Noise) noise_params_2d 0, 1, (256, 256, 256), -6050, 5, 0.6, 2.0, eased
 
 # Base terrain height
-mgvalleys_np_terrain_height (Terrain Height) noise_params -10, 50, (1024, 1024, 1024), 5202, 6, 0.4, 2.0
+mgvalleys_np_terrain_height (Terrain Height) noise_params_2d -10, 50, (1024, 1024, 1024), 5202, 6, 0.4, 2.0, eased
 
 # Raises terrain to make valleys around the rivers
-mgvalleys_np_valley_depth (Valley Depth) noise_params 5, 4, (512, 512, 512), -1914, 1, 1.0, 2.0
+mgvalleys_np_valley_depth (Valley Depth) noise_params_2d 5, 4, (512, 512, 512), -1914, 1, 1.0, 2.0, eased
 
 # Slope and fill work together to modify the heights
-mgvalleys_np_inter_valley_fill (Valley Fill) noise_params 0, 1, (256, 512, 256), 1993, 6, 0.8, 2.0
+mgvalleys_np_inter_valley_fill (Valley Fill) noise_params_3d 0, 1, (256, 512, 256), 1993, 6, 0.8, 2.0
 
 # Amplifies the valleys
-mgvalleys_np_valley_profile (Valley Profile) noise_params 0.6, 0.5, (512, 512, 512), 777, 1, 1.0, 2.0
+mgvalleys_np_valley_profile (Valley Profile) noise_params_2d 0.6, 0.5, (512, 512, 512), 777, 1, 1.0, 2.0, eased
 
 # Slope and fill work together to modify the heights
-mgvalleys_np_inter_valley_slope (Valley Slope) noise_params 0.5, 0.5, (128, 128, 128), 746, 1, 1.0, 2.0
+mgvalleys_np_inter_valley_slope (Valley Slope) noise_params_2d 0.5, 0.5, (128, 128, 128), 746, 1, 1.0, 2.0, eased
 
 [*Advanced]
 
index 726c23af64d2eb09c8fa8b25444c0034ce3851fb..9e3895d833939d500f15005e5f019aa79f9c015b 100644 (file)
@@ -1043,13 +1043,13 @@ Accumulates the absolute value of each noise gradient result.
 Noise parameters format example for 2D or 3D perlin noise or perlin noise maps:
 
     np_terrain = {
-        offset = 0,
-        scale = 1,
-        spread = {x=500, y=500, z=500},
+        offset = "0",
+        scale = "1",
+        spread = {x="500", y="500", z="500"},
         seed = 571347,
         octaves = 5,
-        persist = 0.63,
-        lacunarity = 2.0,
+        persist = "0.63",
+        lacunarity = "2.0",
         flags = "defaults, absvalue"
     }
     ^ A single noise parameter table can be used to get 2D or 3D noise,
@@ -4024,12 +4024,16 @@ It can be created via `Settings(filename)`.
 #### Methods
 * `get(key)`: returns a value
 * `get_bool(key)`: returns a boolean
+* `get_np_group(key)`: returns a NoiseParams table
 * `set(key, value)`
     * Setting names can't contain whitespace or any of `="{}#`.
     * Setting values can't contain the sequence `\n"""`.
     * Setting names starting with "secure." can't be set on the main settings object (`minetest.settings`).
 * `set_bool(key, value)`
     * See documentation for set() above.
+* `set_np_group(key, value)`
+    * `value` is a NoiseParams table.
+    * Also, see documentation for set() above.
 * `remove(key)`: returns a boolean (`true` for success)
 * `get_names()`: returns `{key1,...}`
 * `write()`: returns a boolean (`true` for success)
index 4d8cdd352a1bf621f0989d4fbf002168468a6d0a..1bbfac25ffe4a95df3be60498bdea269ee3c9e9f 100644 (file)
@@ -1586,13 +1586,13 @@ bool read_noiseparams(lua_State *L, int index, NoiseParams *np)
 void push_noiseparams(lua_State *L, NoiseParams *np)
 {
        lua_newtable(L);
-       lua_pushnumber(L, np->offset);
+       push_float_string(L, np->offset);
        lua_setfield(L, -2, "offset");
-       lua_pushnumber(L, np->scale);
+       push_float_string(L, np->scale);
        lua_setfield(L, -2, "scale");
-       lua_pushnumber(L, np->persist);
+       push_float_string(L, np->persist);
        lua_setfield(L, -2, "persistence");
-       lua_pushnumber(L, np->lacunarity);
+       push_float_string(L, np->lacunarity);
        lua_setfield(L, -2, "lacunarity");
        lua_pushnumber(L, np->seed);
        lua_setfield(L, -2, "seed");
@@ -1603,7 +1603,7 @@ void push_noiseparams(lua_State *L, NoiseParams *np)
                np->flags);
        lua_setfield(L, -2, "flags");
 
-       push_v3f(L, np->spread);
+       push_v3_float_string(L, np->spread);
        lua_setfield(L, -2, "spread");
 }
 
index 8f88aeb604818165e928281aff7572cd2c636837..e81cecac81fe513fb2bfd1e8083abbba1d1c9546 100644 (file)
@@ -51,6 +51,15 @@ if (value < F1000_MIN || value > F1000_MAX) { \
 #define CHECK_POS_TAB(index) CHECK_TYPE(index, "position", LUA_TTABLE)
 
 
+void push_float_string(lua_State *L, float value)
+{
+       std::stringstream ss;
+       std::string str;
+       ss << value;
+       str = ss.str();
+       lua_pushstring(L, str.c_str());
+}
+
 void push_v3f(lua_State *L, v3f p)
 {
        lua_newtable(L);
@@ -71,6 +80,26 @@ void push_v2f(lua_State *L, v2f p)
        lua_setfield(L, -2, "y");
 }
 
+void push_v3_float_string(lua_State *L, v3f p)
+{
+       lua_newtable(L);
+       push_float_string(L, p.X);
+       lua_setfield(L, -2, "x");
+       push_float_string(L, p.Y);
+       lua_setfield(L, -2, "y");
+       push_float_string(L, p.Z);
+       lua_setfield(L, -2, "z");
+}
+
+void push_v2_float_string(lua_State *L, v2f p)
+{
+       lua_newtable(L);
+       push_float_string(L, p.X);
+       lua_setfield(L, -2, "x");
+       push_float_string(L, p.Y);
+       lua_setfield(L, -2, "y");
+}
+
 v2s16 read_v2s16(lua_State *L, int index)
 {
        v2s16 p;
index 18b8f65316392a3a99dcc1e2adb3869ca5f27c2e..7827d8146753987a008907c0802c88ea46ea2913 100644 (file)
@@ -99,6 +99,9 @@ std::vector<aabb3f> read_aabb3f_vector  (lua_State *L, int index, f32 scale);
 size_t              read_stringlist     (lua_State *L, int index,
                                          std::vector<std::string> *result);
 
+void                push_float_string   (lua_State *L, float value);
+void                push_v3_float_string(lua_State *L, v3f p);
+void                push_v2_float_string(lua_State *L, v2f p);
 void                push_v2s16          (lua_State *L, v2s16 p);
 void                push_v2s32          (lua_State *L, v2s32 p);
 void                push_v3s16          (lua_State *L, v3s16 p);
index 2d6769ea1f912bab7961e189f6b0c6dcd50eccd1..141ac61d1c766f5f03b4c3ea65701790dbc2db62 100644 (file)
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "lua_api/l_internal.h"
 #include "cpp_api/s_security.h"
 #include "settings.h"
+#include "noise.h"
 #include "log.h"
 
 
@@ -105,6 +106,24 @@ int LuaSettings::l_get_bool(lua_State* L)
        return 1;
 }
 
+// get_np_group(self, key) -> value
+int LuaSettings::l_get_np_group(lua_State *L)
+{
+       NO_MAP_LOCK_REQUIRED;
+       LuaSettings *o = checkobject(L, 1);
+
+       std::string key = std::string(luaL_checkstring(L, 2));
+       if (o->m_settings->exists(key)) {
+               NoiseParams np;
+               o->m_settings->getNoiseParams(key, np);
+               push_noiseparams(L, &np);
+       } else {
+               lua_pushnil(L);
+       }
+
+       return 1;
+}
+
 // set(self, key, value)
 int LuaSettings::l_set(lua_State* L)
 {
@@ -138,6 +157,23 @@ int LuaSettings::l_set_bool(lua_State* L)
        return 1;
 }
 
+// set(self, key, value)
+int LuaSettings::l_set_np_group(lua_State *L)
+{
+       NO_MAP_LOCK_REQUIRED;
+       LuaSettings *o = checkobject(L, 1);
+
+       std::string key = std::string(luaL_checkstring(L, 2));
+       NoiseParams value;
+       read_noiseparams(L, 3, &value);
+
+       SET_SECURITY_CHECK(L, key);
+
+       o->m_settings->setNoiseParams(key, value, false);
+
+       return 0;
+}
+
 // remove(self, key) -> success
 int LuaSettings::l_remove(lua_State* L)
 {
@@ -264,8 +300,10 @@ const char LuaSettings::className[] = "Settings";
 const luaL_Reg LuaSettings::methods[] = {
        luamethod(LuaSettings, get),
        luamethod(LuaSettings, get_bool),
+       luamethod(LuaSettings, get_np_group),
        luamethod(LuaSettings, set),
        luamethod(LuaSettings, set_bool),
+       luamethod(LuaSettings, set_np_group),
        luamethod(LuaSettings, remove),
        luamethod(LuaSettings, get_names),
        luamethod(LuaSettings, write),
index 500917f0a79c305321399ebe48d8d75228a5c991..dcf39a89e1c5f07b943a048fd6f6ba664c2dd54f 100644 (file)
@@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #pragma once
 
+#include "common/c_content.h"
 #include "lua_api/l_base.h"
 
 class Settings;
@@ -38,12 +39,18 @@ private:
        // get_bool(self, key) -> boolean
        static int l_get_bool(lua_State *L);
 
+       // get_np_group(self, key) -> noiseparam
+       static int l_get_np_group(lua_State *L);
+
        // set(self, key, value)
        static int l_set(lua_State *L);
 
        // set_bool(self, key, value)
        static int l_set_bool(lua_State *L);
 
+       // set_np_group(self, key, value)
+       static int l_set_np_group(lua_State *L);
+
        // remove(self, key) -> success
        static int l_remove(lua_State *L);