summaryrefslogtreecommitdiff
path: root/builtin/mainmenu
diff options
context:
space:
mode:
Diffstat (limited to 'builtin/mainmenu')
-rw-r--r--builtin/mainmenu/dlg_settings_advanced.lua291
-rw-r--r--builtin/mainmenu/generate_from_settingtypes.lua39
2 files changed, 292 insertions, 38 deletions
diff --git a/builtin/mainmenu/dlg_settings_advanced.lua b/builtin/mainmenu/dlg_settings_advanced.lua
index bc942c472..b784a295e 100644
--- a/builtin/mainmenu/dlg_settings_advanced.lua
+++ b/builtin/mainmenu/dlg_settings_advanced.lua
@@ -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
diff --git a/builtin/mainmenu/generate_from_settingtypes.lua b/builtin/mainmenu/generate_from_settingtypes.lua
index 6c9ba27fb..9b36843e1 100644
--- a/builtin/mainmenu/generate_from_settingtypes.lua
+++ b/builtin/mainmenu/generate_from_settingtypes.lua
@@ -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)