kingdoms_game/mods/utils/settings.lua
2018-12-07 17:08:09 +00:00

214 lines
6.8 KiB
Lua

--[[
Copyright (c) 2015, Robert 'Bobby' Zenz
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--]]
--- Encapsulates the settings API of minetest and extends it with further
-- functions.
settings = {}
--- Gets a value from the configuration as is.
--
-- @param name The name of the value to get.
-- @param default_value Optional. The default_value to return if the value is
-- not set in the configuration. Can be nil.
-- @param cast_function Optional. The function to apply to the value that is
-- read, for example to convert it into a different type.
-- If this function returns nil, the default value IS
-- returned. Can be nil.
-- @return The value from the configuration with the given name. If the read
-- value is nil, the default value is returned or nil.
function settings.get(name, default_value, cast_function)
local value = minetest.settings:get(name)
if value ~= nil and cast_function ~= nil then
value = cast_function(value)
end
if value ~= nil then
return value
else
return default_value
end
end
--- Gets a boolean from the configuration.
--
-- @param name The name of the value to get.
-- @param default_value Optional. The default value to return if the value is nil.
-- Can be nil.
-- @return The boolean with the given name, or the default value if it is nil,
-- or nil.
function settings.get_bool(name, default_value)
local value = minetest.settings:get_bool(name)
if value ~= nil then
return value
else
return default_value
end
end
--- Gets a list from the configuration.
--
-- @param name The name of the value to get.
-- @param default_value Optional. The default value to return if the value is
-- nil. Can be nil.
-- @return The list with the given name, or the default value if it is nil,
-- or nil.
function settings.get_list(name, default_value)
local value = settings.get(name, nil, tostring)
if value ~= nil then
return stringutil.split(value, ",")
elseif type(default_value) == "string" then
return stringutil.split(default_value, ",")
else
return default_value
end
end
--- Gets a number from the configuration.
--
-- @param name The name of the value to get.
-- @param default_value Optional. The default value to return if the value is nil.
-- Can be nil.
-- @return The number with the given name, or the default value if it is nil,
-- or nil.
function settings.get_number(name, default_value)
return settings.get(name, default_value, tonumber)
end
--- Gets a pos (with x and y values) from the configuration.
--
-- @param name The name of the value to get.
-- @param default_value Optional. The default value to return if the value is nil.
-- Can be nil.
-- @return The pos with the given name, or the default value if it is nil,
-- or nil.
function settings.get_pos2d(name, default_value)
local value = minetest.settings:get(name)
if value ~= nil then
local splitted_value = stringutil.split(value, ",")
if splitted_value:size() == 2 then
local x = tonumber(splitted_value:get(1))
local y = tonumber(splitted_value:get(2))
if x ~= nil and y ~= nil then
return {
x = x,
y = y
}
end
end
end
return default_value
end
--- Gets a pos with (x, y and z values) from the configuration.
--
-- @param name The name of the value to get.
-- @param default_value Optional. The default value to return if the value is nil.
-- Can be nil.
-- @return The pos with the given name, or the default value if it is nil,
-- or nil.
function settings.get_pos3d(name, default_value)
local value = minetest.setting_get_pos(name)
if value ~= nil then
return value
else
return default_value
end
end
--- Gets a string from the configuration.
--
-- @param name The name of the value to get.
-- @param default_value Optional. The default value to return if the value is nil.
-- Can be nil.
-- @return The string with the given name, or the default value if it is nil,
-- or nil.
function settings.get_string(name, default_value)
return settings.get(name, default_value, tostring)
end
--- Gets a table with the given keys form the configuration.
--
-- @param name The name of the value to get.
-- @param default_value The default value to return if the value is nil, can be
-- nil.
-- @param ... The name of the keys.
-- @return The table with the given name and the given keys, or the default
-- value it is nil.
function settings.get_table(name, default_value, ...)
local value = settings.get_list(name, nil)
if value ~= nil then
local table = {}
if ... ~= nil then
for index, key in ipairs({...}) do
table[key] = value:get(index)
end
end
if ... == nil or #{...} < value:size() then
for index = #{...} + 1, value:size(), 1 do
table[index] = value:get(index)
end
end
return table
else
return default_value
end
end
--- Saves all settings to configuration file.
function settings.save()
minetest.settings:write()
end
--- Set a value with the given name into the configuration.
--
-- @param name The name of the value to set. Is not allowed to contain '="#{}'.
-- @param value The value.
function settings.set(name, value)
minetest.settings:set(name, value)
end
--- Gets a pos from the configuration, this is an alias for get_pos3d.
--
-- @param name The name of the value to get.
-- @param default_value Optional. The default value to return if the value is nil.
-- Can be nil.
-- @return The pos with the given name, or the default value if it is nil,
-- or nil.
settings.get_pos = settings.get_pos3d