Improve Lua settings menu

* Add key settings to setting table and ignore them later
  This way they are added to the auto-generated minetest.conf.example
* Add flags type
* Add input validation for int, float and flags
* Break in-game graphic settings into multiple sections
* Parse settingtpes.txt in mods and games
* Improve description for a lot of settings
* Fix typos and wording in settingtypes.txt
* Convert language setting to an enum
This commit is contained in:
PilzAdam 2015-10-18 10:41:52 +02:00
parent 2d207afe8e
commit 6f2d9de769
5 changed files with 1360 additions and 755 deletions

@ -17,34 +17,36 @@
local FILENAME = "settingtypes.txt"
local function parse_setting_line(settings, line)
local CHAR_CLASSES = {
SPACE = "[%s]",
VARIABLE = "[%w_%-%.]",
INTEGER = "[-]?[%d]",
FLOAT = "[-]?[%d%.]",
FLAGS = "[%w_%-%.,]",
}
-- returns error message, or nil
local function parse_setting_line(settings, line, read_all, base_level)
-- empty lines
if line:match("^[%s]*$") then
if line:match("^" .. CHAR_CLASSES.SPACE .. "*$") then
-- clear current_comment so only comments directly above a setting are bound to it
settings.current_comment = ""
return
end
-- category
local category = line:match("^%[([^%]]+)%]$")
local stars, category = line:match("^%[([%*]*)([^%]]+)%]$")
if category then
local level = 0
local index = 1
while category:sub(index, index) == "*" do
level = level + 1
index = index + 1
end
category = category:sub(index, -1)
table.insert(settings, {
name = category,
level = level,
level = stars:len() + base_level,
type = "category",
})
return
end
-- comment
local comment = line:match("^#[%s]*(.*)$")
local comment = line:match("^#" .. CHAR_CLASSES.SPACE .. "*(.*)$")
if comment then
if settings.current_comment == "" then
settings.current_comment = comment
@ -54,9 +56,20 @@ local function parse_setting_line(settings, line)
return
end
local error_msg
-- settings
local first_part, name, readable_name, setting_type =
line:match("^(([%w%._-]+)[%s]+%(([^%)]*)%)[%s]+([%w_]+)[%s]*)")
local first_part, name, readable_name, setting_type = line:match("^"
-- this first capture group matches the whole first part,
-- so we can later strip it from the rest of the line
.. "("
.. "([" .. CHAR_CLASSES.VARIABLE .. "+)" -- variable name
.. CHAR_CLASSES.SPACE
.. "%(([^%)]*)%)" -- readable name
.. CHAR_CLASSES.SPACE
.. "(" .. CHAR_CLASSES.VARIABLE .. "+)" -- type
.. CHAR_CLASSES.SPACE .. "?"
.. ")")
if first_part then
if readable_name == "" then
@ -65,14 +78,15 @@ local function parse_setting_line(settings, line)
local remaining_line = line:sub(first_part:len() + 1)
if setting_type == "int" then
local default, min, max = remaining_line:match("^([%d]+)[%s]*([%d]*)[%s]*([%d]*)$")
local default, min, max = remaining_line:match("^"
-- first int is required, the last 2 are optional
.. "(" .. CHAR_CLASSES.INTEGER .. "+)" .. CHAR_CLASSES.SPACE .. "?"
.. "(" .. CHAR_CLASSES.INTEGER .. "*)" .. CHAR_CLASSES.SPACE .. "?"
.. "(" .. CHAR_CLASSES.INTEGER .. "*)"
.. "$")
if default and tonumber(default) then
if min == "" then
min = nil
end
if max == "" then
max = nil
end
min = tonumber(min)
max = tonumber(max)
table.insert(settings, {
name = name,
readable_name = readable_name,
@ -83,21 +97,24 @@ local function parse_setting_line(settings, line)
comment = settings.current_comment,
})
else
core.log("error", "Found invalid int in " .. FILENAME .. ": " .. line)
error_msg = "Invalid integer setting"
end
elseif setting_type == "string" or setting_type == "flags" or setting_type == "noise_params" then
local default = remaining_line:match("^[%s]*(.*)$")
elseif setting_type == "string" or setting_type == "noise_params"
or setting_type == "key" then
local default = remaining_line:match("^(.*)$")
if default then
table.insert(settings, {
name = name,
readable_name = readable_name,
type = setting_type,
default = default,
comment = settings.current_comment,
})
if setting_type ~= "key" or read_all then -- ignore key type if read_all is false
table.insert(settings, {
name = name,
readable_name = readable_name,
type = setting_type,
default = default,
comment = settings.current_comment,
})
end
else
core.log("error", "Found invalid string in " .. FILENAME .. ": " .. line)
error_msg = "Invalid string setting"
end
elseif setting_type == "bool" then
@ -110,19 +127,19 @@ local function parse_setting_line(settings, line)
comment = settings.current_comment,
})
else
core.log("error", "Found invalid bool in " .. FILENAME .. ": " .. line)
error_msg = "Invalid boolean setting"
end
elseif setting_type == "float" then
local default, min, max
= remaining_line:match("^([%d%.]+)[%s]*([%d%.]*)[%s]*([%d%.]*)$")
local default, min, max = remaining_line:match("^"
-- first float is required, the last 2 are optional
.. "(" .. CHAR_CLASSES.FLOAT .. "+)" .. CHAR_CLASSES.SPACE .. "?"
.. "(" .. CHAR_CLASSES.FLOAT .. "*)" .. CHAR_CLASSES.SPACE .. "?"
.. "(" .. CHAR_CLASSES.FLOAT .. "*)"
.."$")
if default and tonumber(default) then
if min == "" then
min = nil
end
if max == "" then
max = nil
end
min = tonumber(min)
max = tonumber(max)
table.insert(settings, {
name = name,
readable_name = readable_name,
@ -133,26 +150,26 @@ local function parse_setting_line(settings, line)
comment = settings.current_comment,
})
else
core.log("error", "Found invalid float in " .. FILENAME .. ": " .. line)
error_msg = "Invalid float setting"
end
elseif setting_type == "enum" then
local default, values = remaining_line:match("^([^%s]+)[%s]+(.+)$")
local default, values = remaining_line:match("^(.+)" .. CHAR_CLASSES.SPACE .. "(.+)$")
if default and values ~= "" then
table.insert(settings, {
name = name,
readable_name = readable_name,
type = "enum",
default = default,
values = values:split(","),
values = values:split(",", true),
comment = settings.current_comment,
})
else
core.log("error", "Found invalid enum in " .. FILENAME .. ": " .. line)
error_msg = "Invalid enum setting"
end
elseif setting_type == "path" then
local default = remaining_line:match("^[%s]*(.*)$")
local default = remaining_line:match("^(.*)$")
if default then
table.insert(settings, {
name = name,
@ -162,50 +179,143 @@ local function parse_setting_line(settings, line)
comment = settings.current_comment,
})
else
core.log("error", "Found invalid path in " .. FILENAME .. ": " .. line)
error_msg = "Invalid path setting"
end
elseif setting_type == "key" then
--ignore keys, since we have a special dialog for them
elseif setting_type == "flags" then
local default, possible = remaining_line:match("^"
.. "(" .. CHAR_CLASSES.FLAGS .. "+)" .. CHAR_CLASSES.SPACE .. ""
.. "(" .. CHAR_CLASSES.FLAGS .. "+)"
.. "$")
if default and possible then
table.insert(settings, {
name = name,
readable_name = readable_name,
type = "flags",
default = default,
possible = possible,
comment = settings.current_comment,
})
else
error_msg = "Invalid flags setting"
end
-- TODO: flags, noise_params (, struct)
else
core.log("error", "Found setting with invalid setting type in " .. FILENAME .. ": " .. line)
error_msg = "Invalid setting type \"" .. type .. "\""
end
else
core.log("error", "Found invalid line in " .. FILENAME .. ": " .. line)
error_msg = "Invalid line"
end
-- clear current_comment since we just used it
-- if we not just used it, then clear it since we only want comments
-- directly above the setting to be bound to it
settings.current_comment = ""
return error_msg
end
local function parse_config_file()
local file = io.open(core.get_builtin_path() .. DIR_DELIM .. FILENAME, "r")
local function parse_single_file(file, filepath, read_all, result, base_level)
-- store this helper variable in the table so it's easier to pass to parse_setting_line()
result.current_comment = ""
local line = file:read("*line")
while line do
local error_msg = parse_setting_line(result, line, read_all, base_level)
if error_msg then
core.log("error", error_msg .. " in " .. filepath .. " \"" .. line .. "\"")
end
line = file:read("*line")
end
result.current_comment = nil
end
-- read_all: whether to ignore certain setting types for GUI or not
-- parse_mods: whether to parse settingtypes.txt in mods and games
local function parse_config_file(read_all, parse_mods)
local builtin_path = core.get_builtin_path() .. DIR_DELIM .. FILENAME
local file = io.open(builtin_path, "r")
local settings = {}
if not file then
core.log("error", "Can't load " .. FILENAME)
return settings
end
-- store this helper variable in the table so it's easier to pass to parse_setting_line()
settings.current_comment = ""
local line = file:read("*line")
while line do
parse_setting_line(settings, line)
line = file:read("*line")
end
settings.current_comment = nil
parse_single_file(file, builtin_path, read_all, settings, 0)
file:close()
if parse_mods then
-- Parse games
local games_category_initialized = false
local index = 1
local game = gamemgr.get_game(index)
while game do
local path = game.path .. DIR_DELIM .. FILENAME
local file = io.open(path, "r")
if file then
if not games_category_initialized then
local translation = fgettext_ne("Games"), -- not used, but needed for xgettext
table.insert(settings, {
name = "Games",
level = 0,
type = "category",
})
games_category_initialized = true
end
table.insert(settings, {
name = game.name,
level = 1,
type = "category",
})
parse_single_file(file, path, read_all, settings, 2)
file:close()
end
index = index + 1
game = gamemgr.get_game(index)
end
-- Parse mods
local mods_category_initialized = false
local mods = {}
get_mods(core.get_modpath(), mods)
for _, mod in ipairs(mods) do
local path = mod.path .. DIR_DELIM .. FILENAME
local file = io.open(path, "r")
if file then
if not mods_category_initialized then
local translation = fgettext_ne("Mods"), -- not used, but needed for xgettext
table.insert(settings, {
name = "Mods",
level = 0,
type = "category",
})
mods_category_initialized = true
end
table.insert(settings, {
name = mod.name,
level = 1,
type = "category",
})
parse_single_file(file, path, read_all, settings, 2)
file:close()
end
end
end
return settings
end
local settings = parse_config_file()
local settings = parse_config_file(false, true)
local selected_setting = 1
local function get_current_value(setting)
@ -236,16 +346,28 @@ local function create_change_setting_formspec(dialogdata)
local comment_text = ""
-- fgettext_ne("") doesn't have to return "", according to specification of gettext(3)
if setting.comment == "" then
comment_text = fgettext_ne("(No description of setting given)")
else
comment_text = fgettext_ne(setting.comment)
end
for _, comment_line in ipairs(comment_text:split("\n")) do
for _, comment_line in ipairs(comment_text:split("\n", true)) do
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: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, <octaves>, <persistence>") .. ","
.. "," .. fgettext("Optionally the lacunarity can be appended with a leading comma.") .. ","
end
formspec = formspec:sub(1, -2) -- remove trailing comma
formspec = formspec .. ";1]"
if setting.type == "bool" then
@ -256,7 +378,8 @@ local function create_change_setting_formspec(dialogdata)
selected_index = 1
end
formspec = formspec .. "dropdown[0.5,3.5;3,1;dd_setting_value;"
.. fgettext("Disabled") .. "," .. fgettext("Enabled") .. ";" .. selected_index .. "]"
.. fgettext("Disabled") .. "," .. fgettext("Enabled") .. ";"
.. selected_index .. "]"
elseif setting.type == "enum" then
local selected_index = 0
@ -285,8 +408,20 @@ local function create_change_setting_formspec(dialogdata)
else
-- TODO: fancy input for float, int, flags, noise_params
formspec = formspec .. "field[0.5,4;9.5,1;te_setting_value;;"
.. core.formspec_escape(get_current_value(setting)) .. "]"
local width = 10
local text = get_current_value(setting)
if dialogdata.error_message then
formspec = formspec .. "tablecolumns[color;text]" ..
"tableoptions[background=#00000000;highlight=#00000000;border=false]" ..
"table[5,4;5,1;error_message;#FF0000,"
.. core.formspec_escape(dialogdata.error_message) .. ";0]"
width = 5
if dialogdata.entered_text then
text = dialogdata.entered_text
end
end
formspec = formspec .. "field[0.5,4;" .. width .. ",1;te_setting_value;;"
.. core.formspec_escape(text) .. "]"
end
return formspec
end
@ -303,6 +438,52 @@ local function handle_change_setting_buttons(this, fields)
local new_value = fields["dd_setting_value"]
core.setting_set(setting.name, new_value)
elseif setting.type == "int" then
local new_value = tonumber(fields["te_setting_value"])
if not new_value or math.floor(new_value) ~= new_value then
this.data.error_message = fgettext_ne("Please enter a valid integer.")
this.data.entered_text = fields["te_setting_value"]
core.update_formspec(this:get_formspec())
return true
end
if setting.min and new_value < setting.min then
this.data.error_message = fgettext_ne("The value must be greater than $1.", setting.min)
this.data.entered_text = fields["te_setting_value"]
core.update_formspec(this:get_formspec())
return true
end
if setting.max and new_value > setting.max then
this.data.error_message = fgettext_ne("The value must be lower than $1.", setting.max)
this.data.entered_text = fields["te_setting_value"]
core.update_formspec(this:get_formspec())
return true
end
core.setting_set(setting.name, new_value)
elseif setting.type == "float" then
local new_value = tonumber(fields["te_setting_value"])
if not new_value then
this.data.error_message = fgettext_ne("Please enter a valid number.")
this.data.entered_text = fields["te_setting_value"]
core.update_formspec(this:get_formspec())
return true
end
core.setting_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()
if not value:match(CHAR_CLASSES.FLAGS .. "+")
or not setting.possible:match("[,]?" .. value .. "[,]?") then
this.data.error_message = fgettext_ne("\"" .. value .. "\" is not a valid flag.")
this.data.entered_text = fields["te_setting_value"]
core.update_formspec(this:get_formspec())
return true
end
end
core.setting_set(setting.name, new_value)
else
local new_value = fields["te_setting_value"]
core.setting_set(setting.name, new_value)
@ -345,7 +526,8 @@ local function create_settings_formspec(tabview, name, tabdata)
if entry.type == "category" then
current_level = entry.level
formspec = formspec .. "#FFFF00," .. current_level .. "," .. core.formspec_escape(name) .. ",,"
formspec = formspec .. "#FFFF00," .. current_level .. "," .. fgettext(name) .. ",,"
elseif entry.type == "bool" then
local value = get_current_value(entry)
if core.is_yes(value) then
@ -355,6 +537,10 @@ local function create_settings_formspec(tabview, name, tabdata)
end
formspec = formspec .. "," .. (current_level + 1) .. "," .. core.formspec_escape(name) .. ","
.. value .. ","
elseif entry.type == "key" then
-- ignore key settings, since we have a special dialog for them
else
formspec = formspec .. "," .. (current_level + 1) .. "," .. core.formspec_escape(name) .. ","
.. core.formspec_escape(get_current_value(entry)) .. ","
@ -431,6 +617,13 @@ local function handle_settings_buttons(this, fields, tabname, tabdata)
return false
end
tab_settings = {
name = "settings",
caption = fgettext("Settings"),
cbf_formspec = create_settings_formspec,
cbf_button_handler = handle_settings_buttons,
}
local function create_minetest_conf_example()
local result = "# This file contains a list of all available settings and their default value for minetest.conf\n" ..
"\n" ..
@ -447,6 +640,7 @@ local function create_minetest_conf_example()
"# http://wiki.minetest.net/\n" ..
"\n"
local settings = parse_config_file(true, false)
for _, entry in ipairs(settings) do
if entry.type == "category" then
if entry.level == 0 then
@ -458,8 +652,8 @@ local function create_minetest_conf_example()
result = result .. "# " .. entry.name .. "\n\n"
end
else
if entry.comment_line ~= "" then
for _, comment_line in ipairs(entry.comment:split("\n")) do
if entry.comment ~= "" then
for _, comment_line in ipairs(entry.comment:split("\n", true)) do
result = result .."# " .. comment_line .. "\n"
end
end
@ -473,6 +667,9 @@ local function create_minetest_conf_example()
if entry.values then
result = result .. " values: " .. table.concat(entry.values, ", ")
end
if entry.possible then
result = result .. " possible values: " .. entry.possible:gsub(",", ", ")
end
result = result .. "\n"
result = result .. "# " .. entry.name .. " = ".. entry.default .. "\n\n"
end
@ -485,6 +682,8 @@ local function create_translation_file()
"// It conatins a bunch of fake gettext calls, to tell xgettext about the strings in config files\n" ..
"// To update it, refer to the bottom of builtin/mainmenu/tab_settings.lua\n\n" ..
"fake_function() {\n"
local settings = parse_config_file(true, false)
for _, entry in ipairs(settings) do
if entry.type == "category" then
result = result .. "\tgettext(\"" .. entry.name .. "\");\n"
@ -511,16 +710,9 @@ if false then
end
if false then
local file = io.open("src/settings_translation_file.c", "w")
local file = io.open("src/settings_translation_file.cpp", "w")
if file then
file:write(create_translation_file())
file:close()
end
end
tab_settings = {
name = "settings",
caption = fgettext("Settings"),
cbf_formspec = create_settings_formspec,
cbf_button_handler = handle_settings_buttons,
}

File diff suppressed because it is too large Load Diff

@ -64,6 +64,8 @@ e.g.
The game directory can contain the file minetest.conf, which will be used
to set default settings when running the particular game.
It can also contain a settingtypes.txt in the same format as the one in builtin.
This settingtypes.txt will be parsed by the menu and the settings will be displayed in the "Games" category in the settings tab.
### Menu images
@ -125,6 +127,7 @@ Mod directory structure
| |-- depends.txt
| |-- screenshot.png
| |-- description.txt
| |-- settingtypes.txt
| |-- init.lua
| |-- models
| |-- textures
@ -155,6 +158,10 @@ A screenshot shown in modmanager within mainmenu.
### `description.txt`
A File containing description to be shown within mainmenu.
### `settingtypes.txt`
A file in the same format as the one in builtin. It will be parsed by the
settings menu and the settings will be displayed in the "Mods" category.
### `init.lua`
The main Lua script. Running this script should register everything it
wants to register. Subsequent execution depends on minetest calling the

File diff suppressed because it is too large Load Diff

@ -7,10 +7,12 @@ fake_function() {
gettext("Controls");
gettext("Build inside player");
gettext("If enabled, you can place blocks at the position (feet + eye level) where you stand.\nThis is helpful when working with nodeboxes in small areas.");
gettext("Free movement");
gettext("Unobstructed movement without physics, downwards key is keymap_special1.");
gettext("Flying");
gettext("Player is able to fly without being affected by gravity.\nThis requires the "fly" privilege on the server.");
gettext("Fast movement");
gettext("Fast movement (keymap_special1).");
gettext("Fast movement (via use key).\nThis requires the "fast" privilege on the server.");
gettext("Noclip");
gettext("If enabled together with fly mode, player is able to fly through solid nodes.\nThis requires the "noclip" privilege on the server.");
gettext("Cinematic mode");
gettext("Smooths camera when moving and looking arround.\nUseful for recording videos.");
gettext("Camera smoothing");
@ -22,42 +24,168 @@ fake_function() {
gettext("Mouse sensitivity");
gettext("Mouse sensitivity multiplier.");
gettext("Key use for climbing/descending");
gettext("If enabled, keymap_special1 instead of keymap_sneak is used for climbing down and descending.");
gettext("If enabled, "use" key instead of "sneak" key is used for climbing down and descending.");
gettext("Double tap jump for fly");
gettext("Double-tapping the jump key toggles fly mode.");
gettext("Always fly and fast");
gettext("If false aux1 is used to fly fast.");
gettext("If disabled "use" key is used to fly fast if both fly and fast mode are enabled.");
gettext("Rightclick repetition interval");
gettext("The time in seconds it takes between repeated right clicks when holding the right mouse button.");
gettext("Random input");
gettext("Enable random user input, for testing.");
gettext("Enable random user input (only used for testing).");
gettext("Continuous forward");
gettext("Continuous forward movement (for testing).");
gettext("Continuous forward movement (only used for testing).");
gettext("Forward key");
gettext("Key for moving the player forward.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Backward key");
gettext("Key for moving the player backward.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Left key");
gettext("Key for moving the player left.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Right key");
gettext("Key for moving the player right.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Jump key");
gettext("Key for jumping.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Sneak key");
gettext("Key for sneaking.\nAlso used for climbing down and descending in water if aux1_descends is disabled.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Inventory key");
gettext("Key for opening the inventory.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Use key");
gettext("Key for moving fast in fast mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Chat key");
gettext("Key for opening the chat window.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Command key");
gettext("Key for opening the chat window to type commands.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Console key");
gettext("Key for opening the chat console.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Range select key");
gettext("Key for toggling unlimited view range.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Fly key");
gettext("Key for toggling flying.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Fast key");
gettext("Key for toggling fast mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Noclip key");
gettext("Key for toggling noclip mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Cinematic mode key");
gettext("Key for toggling cinematic mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Minimap key");
gettext("Key for toggling display of minimap.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Screenshot");
gettext("Key for taking screenshots.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Drop item key");
gettext("Key for dropping the currently selected item.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("HUD toggle key");
gettext("Key for toggling the display of the HUD.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Chat toggle key");
gettext("Key for toggling the display of the chat.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Fog toggle key");
gettext("Key for toggling the display of the fog.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Camera update toggle key");
gettext("Key for toggling the camrea update. Only used for development\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Debug info toggle key");
gettext("Key for toggling the display of debug info.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Profiler toggle key");
gettext("Key for toggling the display of the profiler. Used for development.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Toggle camera mode key");
gettext("Key for switching between first- and third-person camera.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("View range increase key");
gettext("Key for increasing the viewing range. Modifies the minimum viewing range.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("View range decrease key");
gettext("Key for decreasing the viewing range. Modifies the minimum viewing range.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Print stacks");
gettext("Key for printing debug stacks. Used for development.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Network");
gettext("Server address");
gettext("Address to connect to (blank = start local server).");
gettext("Address to connect to.\nLeave this blank to start a local server.\nNote that the address field in the main menu overrides this setting.");
gettext("Remote port");
gettext("Port to connect to (UDP).");
gettext("Saving map received by server");
gettext("Port to connect to (UDP).\nNote that the port field in the main menu overrides this setting.");
gettext("Saving map received from server");
gettext("Save the map received by the client on disk.");
gettext("Connect to external media server");
gettext("Enable usage of remote media server (if provided by server).");
gettext("Enable usage of remote media server (if provided by server).\nRemote servers offer a significantly faster way to download media (e.g. textures)\nwhen connecting to the server.");
gettext("Serverlist URL");
gettext("URL to the server list displayed in the Multiplayer Tab.");
gettext("Serverlist file");
gettext("File in client/serverlist/ that contains your favorite servers displayed in the Multiplayer Tab.");
gettext("Graphics");
gettext("In-Game");
gettext("Basic");
gettext("Fog");
gettext("Whether to fog out the end of the visible area.");
gettext("New style water");
gettext("Enable a bit lower water surface, so it doesn't "fill" the node completely.\nNote that this is not quite optimized and that smooth lighting on the\nwater surface doesn't work with this.");
gettext("Leaves style");
gettext("Leaves style:\n- Fancy: all faces visible\n- Simple: only outer faces, if defined special_tiles are used\n- Opaque: disable transparency");
gettext("Connect glass");
gettext("Connects glass if supported by node.");
gettext("Smooth lighting");
gettext("Enable smooth lighting with simple ambient occlusion.\nDisable for speed or for different looks.");
gettext("Clouds");
gettext("Clouds are a client side effect.");
gettext("3D clouds");
gettext("Use 3D cloud look instead of flat.");
gettext("Filtering");
gettext("Mipmapping");
gettext("Use mip mapping to scale textures. May slightly increase performance.");
gettext("Anisotropic filtering");
gettext("Use anisotropic filtering when viewing at textures from an angle.");
gettext("Bilinear filtering");
gettext("Use bilinear filtering when scaling textures.");
gettext("Trilinear filtering");
gettext("Use trilinear filtering when scaling textures.");
gettext("Clean transparent textures");
gettext("Filtered textures can blend RGB values with fully-transparent neighbors,\nwhich PNG optimizers usually discard, sometimes resulting in a dark or\nlight edge to transparent textures. Apply this filter to clean that up\nat texture load time.");
gettext("Minimum texture size for filters");
gettext("When using bilinear/trilinear/anisotropic filters, low-resolution textures\ncan be blurred, so automatically upscale them with nearest-neighbor\ninterpolation to preserve crisp pixels. This sets the minimum texture size\nfor the upscaled textures; higher values look sharper, but require more\nmemory. Powers of 2 are recommended. Setting this higher than 1 may not\nhave a visible effect unless bilinear/trilinear/anisotropic filtering is\nenabled.");
gettext("Preload inventory textures");
gettext("Pre-generate all item visuals used in the inventory.\nThis increases startup time, but runs smoother in-game.\nThe generated textures can easily exceed your VRAM, causing artifacts in the inventory.");
gettext("FSAA");
gettext("Experimental option, might cause visible spaces between blocks\nwhen set to higher number than 0.");
gettext("Shaders");
gettext("Shaders");
gettext("Shaders allow advanced visul effects and may increase performance on some video cards.\nThy only work with the OpenGL video backend.");
gettext("Bumpmapping");
gettext("Bumpmapping");
gettext("Enables bumpmapping for textures. Normalmaps need to be supplied by the texture pack\nor need to be auto-generated.\nRequires shaders to be enabled.");
gettext("Generate normalmaps");
gettext("Enables on the fly normalmap generation (Emboss effect).\nRequires bumpmapping to be enabled.");
gettext("Normalmaps strength");
gettext("Strength of generated normalmaps.");
gettext("Normalmaps sampling");
gettext("Defines sampling step of texture.\nA higher value results in smoother normal maps.");
gettext("Parallax Occlusion");
gettext("Parallax occlusion");
gettext("Enables parallax occlusion mapping.\nRequires shaders to be enabled.");
gettext("Parallax occlusion mode");
gettext("0 = parallax occlusion with slope information (faster).\n1 = relief mapping (slower, more accurate).");
gettext("Parallax occlusion strength");
gettext("Strength of parallax.");
gettext("Parallax occlusion iterations");
gettext("Number of parallax occlusion iterations.");
gettext("Parallax occlusion Scale");
gettext("Overall scale of parallax occlusion effect.");
gettext("Parallax occlusion bias");
gettext("Overall bias of parallax occlusion effect, usually scale/2.");
gettext("Waving Nodes");
gettext("Waving water");
gettext("Set to true enables waving water.\nRequires shaders to be enabled.");
gettext("Waving water height");
gettext("Waving water length");
gettext("Waving water speed");
gettext("Waving leaves");
gettext("Set to true enables waving leaves.\nRequires shaders to be enabled.");
gettext("Waving plants");
gettext("Set to true enables waving plants.\nRequires shaders to be enabled.");
gettext("Advanced");
gettext("Wanted FPS");
gettext("Minimum wanted FPS.\nThe amount of rendered stuff is dynamically set according to this.");
gettext("Minimum wanted FPS.\nThe amount of rendered stuff is dynamically set according to this. and viewing range min and max.");
gettext("Maximum FPS");
gettext("If FPS would go higher than this, limit it by sleeping.\nto not waste CPU power for no benefit.");
gettext("If FPS would go higher than this, limit it by sleeping\nto not waste CPU power for no benefit.");
gettext("FPS in pause menu");
gettext("Maximum FPS when game is paused.");
gettext("Viewing range maximum");
gettext("The allowed adjustment range for the automatic rendering range adjustment.");
gettext("View range minimum");
gettext("The allowed adjustment range for the automatic rendering range adjustment.");
gettext("The allowed adjustment range for the automatic rendering range adjustment.\nSet this to be equal to viewing range minimum to disable the auto-adjustment algorithm.");
gettext("Viewing range minimum");
gettext("The allowed adjustment range for the automatic rendering range adjustment.\nSet this to be equal to viewing range minimum to disable the auto-adjustment algorithm.");
gettext("Screen width");
gettext("Vertical initial window size.");
gettext("Screen height");
@ -65,42 +193,27 @@ fake_function() {
gettext("Full screen");
gettext("Fullscreen mode.");
gettext("Full screen BPP");
gettext("FSAA");
gettext("Experimental option, might cause visible spaces between blocks\nwhen set to higher number than 0.");
gettext("Bits per pixel (aka color depth) in fullscreen mode.");
gettext("V-Sync");
gettext("Vertical screen synchronization.");
gettext("Field of view");
gettext("Field of view in degrees.");
gettext("Fog");
gettext("Whether to fog out the end of the visible area.");
gettext("New style water");
gettext("Enable a bit lower water surface; disable for speed (not quite optimized).");
gettext("Leaves style");
gettext("Leaves style:\n- Fancy -> all faces visible\n- Simple -> only outer faces, if defined special_tiles are used\n- Opaque -> disable transparency");
gettext("Connect glass");
gettext("Connects glass if supported by node.");
gettext("Smooth lighting");
gettext("Enable smooth lighting with simple ambient occlusion.\nDisable for speed or for different looks.");
gettext("Gamma");
gettext("Adjust the gamma encoding for the light tables. Lower numbers are brighter.\nThis setting is for the client only and is ignored by the server.");
gettext("Texture path");
gettext("Path to texture directory. All textures are first searched from here.");
gettext("Video driver");
gettext("Video back-end.\nPossible values: null, software, burningsvideo, direct3d8, direct3d9, opengl.");
gettext("Clouds");
gettext("Enable/disable clouds.");
gettext("The rendering back-end for Irrlicht.");
gettext("Cloud height");
gettext("Height on which clouds are appearing.");
gettext("Cloud radius");
gettext("Radius of cloud area stated in number of 64 node cloud squares.\nValues larger than 26 will start to produce sharp cutoffs at cloud area corners.");
gettext("3D clouds");
gettext("Use 3D cloud look instead of flat.");
gettext("View bobbing");
gettext("Amount of view bobbing (0 = no view bobbing, 1.0 = normal, 2.0 = double).");
gettext("Multiplier for view bobbing.\nFor example: 0 for no view bobbing; 1.0 for normal; 2.0 for double.");
gettext("Fall bobbing");
gettext("Amount of fall bobbing (0 = no fall bobbing, 1.0 = normal, 2.0 = double).");
gettext("Multiplier for fall bobbing.\nFor example: 0 for no view bobbing; 1.0 for normal; 2.0 for double.");
gettext("3D mode");
gettext("3D support.\nCurrently:\n- "none" = no 3d output.\n- "anaglyph" = cyan/magenta color 3d.\n- "interlaced" = odd/even line based polarisation screen support.\n- "topbottom" = split screen top/bottom.\n- "sidebyside" = split screen side by side.");
gettext("3D support.\nCurrently supported:\n- none: no 3d output.\n- anaglyph: cyan/magenta color 3d.\n- interlaced: odd/even line based polarisation screen support.\n- topbottom: split screen top/bottom.\n- sidebyside: split screen side by side.");
gettext("Console color");
gettext("In-game chat console background color (R,G,B).");
gettext("Console alpha");
@ -108,62 +221,17 @@ fake_function() {
gettext("Selection box color");
gettext("Selection box border color (R,G,B).");
gettext("Selection box width");
gettext("Width of the selectionbox's lines.");
gettext("Width of the selectionbox's lines around nodes.");
gettext("Crosshair color");
gettext("Crosshair color (R,G,B).");
gettext("Crosshair alpha");
gettext("Cross alpha (opaqueness, between 0 and 255).");
gettext("Screenshot folder");
gettext("Path for screenshots.");
gettext("Crosshair alpha (opaqueness, between 0 and 255).");
gettext("Desynchronize block animation");
gettext("Whether node texture animations should be desynchronized per mapblock.");
gettext("Maximum hotbar width");
gettext("Maximum proportion of current window to be used for hotbar.\nUseful if there's something to be displayed right or left of hotbar.");
gettext("Node highlighting");
gettext("Enable selection highlighting for nodes (disables selectionbox).");
gettext("Mipmapping");
gettext("Anisotropic filtering");
gettext("Bilinear filtering");
gettext("Trilinear filtering");
gettext("Clean transparent textures");
gettext("Filtered textures can blend RGB values with fully-transparent neighbors,\nwhich PNG optimizers usually discard, sometimes resulting in a dark or\nlight edge to transparent textures. Apply this filter to clean that up\nat texture load time.");
gettext("Minimum texture size for filters");
gettext("When using bilinear/trilinear/anisotropic filters, low-resolution textures\ncan be blurred, so automatically upscale them with nearest-neighbor\ninterpolation to preserve crisp pixels. This sets the minimum texture size\nfor the upscaled textures; higher values look sharper, but require more\nmemory. Powers of 2 are recommended. Setting this higher than 1 may not\nhave a visible effect unless bilinear/trilinear/anisotropic filtering is\nenabled.");
gettext("Preload inventory textures");
gettext("Set to true to pre-generate all item visuals.");
gettext("Shaders");
gettext("Set to true to enable shaders. Disable them if video_driver = direct3d9/8.");
gettext("Bumpmapping");
gettext("Set to true to enable textures bumpmapping. Requires shaders enabled.");
gettext("Generate normalmaps");
gettext("Set to true enables on the fly normalmap generation (Emboss effect).\nRequires bumpmapping enabled.");
gettext("Normalmaps strength");
gettext("Strength of generated normalmaps.");
gettext("Normalmaps sampling");
gettext("Defines sampling step of texture (0 - 2).\nA higher value results in smoother normal maps.");
gettext("Parralax occlusion");
gettext("Set to true enables parallax occlusion mapping. Requires shaders enabled.");
gettext("Parralax occlusion mode");
gettext("0 = parallax occlusion with slope information (faster).\n1 = relief mapping (slower, more accurate).");
gettext("Parralax occlusion strength");
gettext("Strength of parallax.");
gettext("Parralax occlusion iterations");
gettext("Number of parallax occlusion iterations.");
gettext("Parralax occlusion Scale");
gettext("Overall scale of parallax occlusion effect.");
gettext("Parralax occlusion bias");
gettext("Overall bias of parallax occlusion effect, usually scale/2.");
gettext("Waving water");
gettext("Set to true enables waving water. Requires shaders enabled.");
gettext("Waving water height");
gettext("Waving water length");
gettext("Waving water speed");
gettext("Waving leaves");
gettext("Set to true enables waving leaves. Requires shaders enabled.");
gettext("Waving plants");
gettext("Set to true enables waving plants. Requires shaders enabled.");
gettext("Ambient occlusion gamma");
gettext("The strength (darkness) of node ambient-occlusion shading.\nLower is darker, Higher is lighter. The valid range of values for this\nsetting is 0.25 to 4.0 inclusive. If the value is out of range it will be\nset to the nearest valid value.");
gettext("Mesh cache");
gettext("Enables caching of facedir rotated meshes.");
gettext("Minimap");
@ -174,6 +242,8 @@ fake_function() {
gettext("True = 256\nFalse = 128\nUseable to make minimap smoother on slower machines.");
gettext("Colored fog");
gettext("Make fog and sky colors depend on daytime (dawn/sunset) and view direction.");
gettext("Ambient occlusion gamma");
gettext("The strength (darkness) of node ambient-occlusion shading.\nLower is darker, Higher is lighter. The valid range of values for this\nsetting is 0.25 to 4.0 inclusive. If the value is out of range it will be\nset to the nearest valid value.");
gettext("Menus");
gettext("Clouds in menu");
gettext("Use a cloud animation for the main menu background.");
@ -190,7 +260,6 @@ fake_function() {
gettext("Font path");
gettext("Path to TrueTypeFont or bitmap.");
gettext("Font size");
gettext("Font size.");
gettext("Font shadow");
gettext("Font shadow offset, if 0 then shadow will not be drawn.");
gettext("Font shadow alpha");
@ -202,6 +271,8 @@ fake_function() {
gettext("Fallback font size");
gettext("Fallback font shadow");
gettext("Fallback font shadow alpha");
gettext("Screenshot folder");
gettext("Path to save screenshots at.");
gettext("Advanced");
gettext("DPI");
gettext("Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k screens.");
@ -217,73 +288,69 @@ fake_function() {
gettext("Whether to show the client debug info (has the same effect as hitting F5).");
gettext("Server / Singleplayer");
gettext("Server name");
gettext("Name of the server.");
gettext("Name of the server, to be displayed when players join and in the serverlist.");
gettext("Server description");
gettext("Description of server.");
gettext("Description of server, to be displayed when players join and in the serverlist.");
gettext("Server address");
gettext("Domain name of server.");
gettext("Domain name of server, to be displayed in the serverlist.");
gettext("Server URL");
gettext("Homepage of server.");
gettext("Homepage of server, to be displayed in the serverlist.");
gettext("Announce server");
gettext("Automaticaly report to masterserver.");
gettext("Automaticaly report to the serverlist.");
gettext("Serverlist URL");
gettext("Announce to this masterserver.\nIf you want to announce your ipv6 address - use serverlist_url = v6.servers.minetest.net.");
gettext("Announce to this serverlist.\nIf you want to announce your ipv6 address, use serverlist_url = v6.servers.minetest.net.");
gettext("Network");
gettext("Server port");
gettext("Network port to listen (UDP).");
gettext("Network port to listen (UDP).\nThis value will be overridden when starting from the main menu.");
gettext("Bind address");
gettext("The network interface that the server listens on.");
gettext("Strict protocol checking");
gettext("Set to true to disallow old clients from connecting.");
gettext("Enable to disallow old clients from connecting.\nOlder clients are compatible in the sense that they will not crash when connecting\nto new servers, but they may not support all new features that you are expecting.");
gettext("Remote media");
gettext("Specifies URL from which client fetches media instead of using UDP.\n$filename should be accessible from $remote_media$filename via cURL\n(obviously, remote_media should end with a slash).\nFiles that are not present would be fetched the usual way.");
gettext("Specifies URL from which client fetches media instead of using UDP.\n$filename should be accessible from $remote_media$filename via cURL\n(obviously, remote_media should end with a slash).\nFiles that are not present will be fetched the usual way.");
gettext("IPv6 server");
gettext("Enable/disable running an IPv6 server. An IPv6 server may be restricted\nto IPv6 clients, depending on system configuration.\nIgnored if bind_address is set.");
gettext("Advanced");
gettext("Maximum simultaneously blocks send per client");
gettext("How many blocks are flying in the wire simultaneously per client.");
gettext("Maximum simultaneously bocks send total");
gettext("How many blocks are flying in the wire simultaneously per server.");
gettext("How many blocks are flying in the wire simultaneously for the whole server.");
gettext("To reduce lag, block transfers are slowed down when a player is building something.\nThis determines how long they are slowed down after placing or removing a node.");
gettext("Max. packets per iteration");
gettext("Maximum number of packets sent per send step, if you have a slow connection\ntry reducing it, but don't reduce it to a number below double of targeted\nclient number.");
gettext("Game");
gettext("Default game");
gettext("Default game (default when creating a new world).");
gettext("Default game when creating a new world.\nThis will be overridden when creating a world from the main menu.");
gettext("Message of the day");
gettext("Message of the Day.");
gettext("Message of the day displayed to players connecting.");
gettext("Maximum users");
gettext("Maximum number of players connected simultaneously.");
gettext("Maximum number of players that can connect simultaneously.");
gettext("Map directory");
gettext("World directory (everything in the world is stored here).");
gettext("World directory (everything in the world is stored here).\nNot needed if starting from the main menu.");
gettext("Item entity TTL");
gettext("Time in seconds for item entity to live.\nSetting it to -1 disables the feature.");
gettext("Creative mode");
gettext("Set to true to enable creative mode (unlimited inventory).");
gettext("Time in seconds for item entity (dropped items) to live.\nSetting it to -1 disables the feature.");
gettext("Damage");
gettext("Enable players getting damage and dying.");
gettext("Fixed map seed");
gettext("A chosen map seed for a new map, leave empty for random.");
gettext("Give initial stuff");
gettext("Gives some stuff to players at the beginning.");
gettext("A chosen map seed for a new map, leave empty for random.\nWill be overridden when creating a new world in the main menu.");
gettext("Default password");
gettext("New users need to input this password.");
gettext("Default privileges");
gettext("Available privileges: interact, shout, teleport, settime, privs, ...\nSee /privs in game for a full list on your server and mod configuration.");
gettext("The privileges that new users automatically get.\nSee /privs in game for a full list on your server and mod configuration.");
gettext("Unlimited player transfer distance");
gettext("Whether players are shown to clients without any range limit.\nDeprecated, use the setting player_transfer_distance instead.");
gettext("Player transfer distance");
gettext("Defines the maximal player transfer distance in blocks (0 = unlimited).");
gettext("Player versus Player");
gettext("Whether to enable players killing each other.");
gettext("Whether to allow players to damage and kill each other.");
gettext("Static spawnpoint");
gettext("If this is set, players will always (re)spawn at the given position.");
gettext("Disallow empty passwords");
gettext("If true, new players cannot join with an empty password.");
gettext("If enabled, new players cannot join with an empty password.");
gettext("Disable anticheat");
gettext("If true, disable cheat prevention in multiplayer.");
gettext("If enabled, disable cheat prevention in multiplayer.");
gettext("Rollback recording");
gettext("If true, actions are recorded for rollback.\nThis option is only read when server starts.");
gettext("If enabled, actions are recorded for rollback.\nThis option is only read when server starts.");
gettext("Shutdown message");
gettext("A message to be displayed to all clients when the server shuts down.");
gettext("Crash message");
@ -291,17 +358,17 @@ fake_function() {
gettext("Ask to reconnect after crash");
gettext("Whether to ask clients to reconnect after a (Lua) crash.\nSet this to true if your server is set up to restart automatically.");
gettext("Active object send range");
gettext("From how far client knows about objects.");
gettext("From how far clients know about objects, stated in mapblocks (16 nodes).");
gettext("Active block range");
gettext("How large area of blocks are subject to the active block stuff.\nActive = objects are loaded and ABMs run.");
gettext("How large area of blocks are subject to the active block stuff, stated in mapblocks (16 nodes).\nIn active blocks objects are loaded and ABMs run.");
gettext("Max block send distance");
gettext("From how far blocks are sent to clients, stated in mapblocks (16 nodes).");
gettext("Maximum forceloaded blocks");
gettext("Maximum number of forceloaded blocks.");
gettext("Maximum number of forceloaded mapblocks.");
gettext("Time send interval");
gettext("Interval of sending time of day to clients.");
gettext("Time speed");
gettext("Controls length of day/night cycle.\n72=20min, 360=4min, 1=24hour, 0=day/night/whatever stays unchanged.");
gettext("Controls length of day/night cycle.\nExamples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged.");
gettext("Map save interval");
gettext("Interval of saving important changes in the world, stated in seconds.");
gettext("Physics");
@ -320,25 +387,25 @@ fake_function() {
gettext("Gravity");
gettext("Advanced");
gettext("Deprecated Lua API handling");
gettext("Handling for deprecated lua api calls:\n- "legacy" = (try to) mimic old behaviour (default for release).\n- "log" = mimic and log backtrace of deprecated call (default for debug).\n- "error" = abort on usage of deprecated call (suggested for mod developers).");
gettext("Handling for deprecated lua api calls:\n- legacy: (try to) mimic old behaviour (default for release).\n- log: mimic and log backtrace of deprecated call (default for debug).\n- error: abort on usage of deprecated call (suggested for mod developers).");
gettext("Mod profiling");
gettext("Mod profiler.");
gettext("Useful for mod developers.");
gettext("Detailed mod profiling");
gettext("Detailed mod profile data.");
gettext("Detailed mod profile data. Useful for mod developers.");
gettext("Profiling print interval");
gettext("Profiler data print interval. 0 = disable.");
gettext("Profiler data print interval. 0 = disable. Useful for developers.");
gettext("Max. clearobjects extra blocks");
gettext("Number of extra blocks that can be loaded by /clearobjects at once.\nThis is a trade-off between sqlite transaction overhead and\nmemory consumption (4096=100MB, as a rule of thumb).");
gettext("Unload unused server data");
gettext("How much the server will wait before unloading unused MapBlocks.\nHigher value is smoother, but will use more RAM.");
gettext("How much the server will wait before unloading unused mapblocks.\nHigher value is smoother, but will use more RAM.");
gettext("Maxmimum objects per block");
gettext("Maximum number of statically stored objects in a block.");
gettext("Synchronous SQLite");
gettext("http://www.sqlite.org/pragma.html#pragma_synchronous only numeric values: 0 1 2");
gettext("See http://www.sqlite.org/pragma.html#pragma_synchronous");
gettext("Dedicated server step");
gettext("Length of a server tick and the interval at which objects are generally updated over network.");
gettext("Ignore world errors");
gettext("Can be set to true to disable shutting down on invalid world data.");
gettext("If enabled, invalid world data won't cause the server to shut down.\nOnly enable this if you know what you are doing.");
gettext("Liquid loop max");
gettext("Max liquids processed per step.");
gettext("Liquid queue purge time");
@ -347,18 +414,18 @@ fake_function() {
gettext("Liquid update interval in seconds.");
gettext("Mapgen");
gettext("Mapgen name");
gettext("Name of map generator to be used when creating a new world.\nCurrently supported: v5, v6, v7, singlenode.");
gettext("Name of map generator to be used when creating a new world.\nCreating a world in the main menu will override this.");
gettext("Water level");
gettext("Water surface level of map");
gettext("Water surface level of the world.");
gettext("Max block generate distance");
gettext("From how far blocks are generated for clients, stated in mapblocks (16 nodes).");
gettext("Map generation limit");
gettext("Where the map generator stops.\nPlease note:\n* Limited to 31000 (setting above has no effect)\n* The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n* Those groups have an offset of -32, -32 nodes from the origin.\n* Only groups which are within the map_generation_limit are generated");
gettext("Where the map generator stops.\nPlease note:\n- Limited to 31000 (setting above has no effect)\n- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n- Those groups have an offset of -32, -32 nodes from the origin.\n- Only groups which are within the map_generation_limit are generated");
gettext("Mapgen flags");
gettext("Global map generation attributes.\nCurrently supported: trees, caves, flat, dungeons, light.\nFlags that are not specified in the flag string are not modified from the default.\nTo explicitly turn off a flag, prepend "no" to the beginning, e.g. nolight.\n'trees' and 'flat' flags only have effect in mgv6.");
gettext("Global map generation attributes.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with "no" are used to explicitly disable them.\n'trees' and 'flat' flags only have effect in mgv6.");
gettext("Advanced");
gettext("Chunk size");
gettext("Size of chunks to be generated, stated in mapblocks (16 nodes).");
gettext("Size of chunks to be generated at once by mapgen, stated in mapblocks (16 nodes).");
gettext("Mapgen debug");
gettext("Dump the mapgen debug infos.");
gettext("Absolute limit of emerge queues");
@ -369,50 +436,48 @@ fake_function() {
gettext("Maximum number of blocks to be queued that are to be generated.\nSet to blank for an appropriate amount to be chosen automatically.");
gettext("Number of emerge threads");
gettext("Number of emerge threads to use. Make this field blank, or increase this number\nto use multiple threads. On multiprocessor systems, this will improve mapgen speed greatly\nat the cost of slightly buggy caves.");
gettext("Mapgen biome heat");
gettext("Mapgen biome heat noise parameters");
gettext("Noise parameters for biome API temperature, humidity and biome blend.");
gettext("Mapgen heat blend");
gettext("Mapgen biome humidity");
gettext("Mapgen biome humidity blend");
gettext("Mapgen heat blend noise parameters");
gettext("Mapgen biome humidity noise parameters");
gettext("Mapgen biome humidity blend noise parameters");
gettext("Mapgen v5");
gettext("Mapgen v5 filler depth");
gettext("Mapgen v5 factor");
gettext("Mapgen v5 height");
gettext("Mapgen v5 cave1");
gettext("Mapgen v5 cave2");
gettext("Mapgen v5 filler depth noise parameters");
gettext("Mapgen v5 factor noise parameters");
gettext("Mapgen v5 height noise parameters");
gettext("Mapgen v5 cave1 noise parameters");
gettext("Mapgen v5 cave2 noise parameters");
gettext("Mapgen v6");
gettext("Mapgen v6 flags");
gettext("Map generation attributes specific to Mapgen V6.\nCurrently supported: jungles, biomeblend, mudflow, snowbiomes.\nWhen snowbiomes are enabled jungles are enabled and the jungles flag is ignored.");
gettext("Map generation attributes specific to Mapgen V6.\nWhen snowbiomes are enabled jungles are enabled and the jungles flag is ignored.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with "no" are used to explicitly disable them.");
gettext("Mapgen v6 desert frequency");
gettext("Controls size of deserts and beaches in Mapgen V6.\nWhen snowbiomes are enabled 'mgv6_freq_desert' is ignored.");
gettext("Mapgen v6 beach frequency");
gettext("Mapgen v6 terrain base");
gettext("Perlin noise attributes for different map generation parameters.\nNoise parameters can be specified as a set of positional values:\nOffset, scale, (spread factors), seed offset, number of octaves, persistence, lacunarity.\nFor example:");
gettext("Mapgen v6 terrain base");
gettext("Mapgen v6 terrain altitude");
gettext("Mapgen v6 steepness");
gettext("Mapgen v6 height select");
gettext("Mapgen v6 mud");
gettext("Mapgen v6 beach");
gettext("Mapgen v6 biome");
gettext("Mapgen v6 cave");
gettext("Mapgen v6 humidity");
gettext("Mapgen v6 trees");
gettext("Mapgen v6 apple trees");
gettext("Mapgen v6 terrain base noise parameters");
gettext("Mapgen v6 terrain altitude noise parameters");
gettext("Mapgen v6 steepness noise parameters");
gettext("Mapgen v6 height select noise parameters");
gettext("Mapgen v6 mud noise parameters");
gettext("Mapgen v6 beach noise parameters");
gettext("Mapgen v6 biome noise parameters");
gettext("Mapgen v6 cave noise parameters");
gettext("Mapgen v6 humidity noise parameters");
gettext("Mapgen v6 trees noise parameters");
gettext("Mapgen v6 apple trees noise parameters");
gettext("Mapgen v7");
gettext("Mapgen v7 flags");
gettext("Map generation attributes specific to Mapgen V7.\nCurrently supported: mountains, ridges.\n'ridges' are the rivers.");
gettext("Mapgen v7 terrain base");
gettext("Mapgen v7 terrain altitude");
gettext("Mapgen v7 terrain persistation");
gettext("Mapgen v7 height select");
gettext("Mapgen v7 filler depth");
gettext("Mapgen v7 mount height");
gettext("Mapgen v7 ridge water");
gettext("Mapgen v7 mountain");
gettext("Mapgen v7 ridge");
gettext("Mapgen v7 cave1");
gettext("Mapgen v7 cave2");
gettext("Map generation attributes specific to Mapgen V7.\n'ridges' are the rivers.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with "no" are used to explicitly disable them.");
gettext("Mapgen v7 terrain base noise parameters");
gettext("Mapgen v7 terrain altitude noise parameters");
gettext("Mapgen v7 terrain persistation noise parameters");
gettext("Mapgen v7 height select noise parameters");
gettext("Mapgen v7 filler depth noise parameters");
gettext("Mapgen v7 mount height noise parameters");
gettext("Mapgen v7 ridge water noise parameters");
gettext("Mapgen v7 mountain noise parameters");
gettext("Mapgen v7 ridge noise parameters");
gettext("Mapgen v7 cave1 noise parameters");
gettext("Mapgen v7 cave2 noise parameters");
gettext("Security");
gettext("Enable mod security");
gettext("Prevent mods from doing insecure things like running shell commands.");
@ -420,23 +485,24 @@ fake_function() {
gettext("Comma-separated list of trusted mods that are allowed to access insecure\nfunctions even when mod security is on (via request_insecure_environment()).");
gettext("Client and Server");
gettext("Player name");
gettext("Name of the player.\nWhen running a server, clients connecting with this name are admins.");
gettext("Name of the player.\nWhen running a server, clients connecting with this name are admins.\nWhen starting from the main menu, this is overridden.");
gettext("Language");
gettext("Override language. When no value is provided (default) system language is used.\nCheck "locale" directory for the list of available translations.");
gettext("Set the language. Leave empty to use the system language.\nA restart is required after changing this.");
gettext("Debug log level");
gettext("Level of logging to be written to debug.txt:\n- <nothing> (no logging)\n- none (messages with no level)\n- error\n- warning\n- action\n- info\n- verbose");
gettext("Level of logging to be written to debug.txt:\n- <nothing> (no logging)\n- none (messages with no level)\n- error\n- warning\n- action\n- info\n- verbose");
gettext("IPv6");
gettext("IPv6 support.");
gettext("Advanced");
gettext("cURL timeout");
gettext("Default timeout for cURL, stated in milliseconds.\nOnly has an effect if compiled with cURL.");
gettext("cURL parallel limit");
gettext("Limits number of parallel HTTP requests. Affects:\n- Media fetch if server uses remote_media setting.\n- Serverlist download and server announcement.\n- Downloads performed by main menu (e.g. mod manager).\nOnly has an effect if compiled with cURL.");
gettext("Limits number of parallel HTTP requests. Affects:\n- Media fetch if server uses remote_media setting.\n- Serverlist download and server announcement.\n- Downloads performed by main menu (e.g. mod manager).\nOnly has an effect if compiled with cURL.");
gettext("cURL file download timeout");
gettext("Maximum time in ms a file download (e.g. a mod download) may take");
gettext("Maximum time in ms a file download (e.g. a mod download) may take.");
gettext("High-precision FPU");
gettext("Makes DirectX work with LuaJIT. Disable if it causes troubles.");
gettext("Main menu script");
gettext("Replaces the default main menu with a custom one.");
gettext("Main menu game manager");
gettext("Main menu mod manager");
gettext("Modstore download URL");