diff --git a/src/data/setting.hpp b/src/data/setting.hpp index 2053254a..7068ebf7 100644 --- a/src/data/setting.hpp +++ b/src/data/setting.hpp @@ -57,6 +57,10 @@ public: return value; } + const T& getDefault() const { + return initial; + } + T& operator*() { return value; } diff --git a/src/files/settings_io.cpp b/src/files/settings_io.cpp index 7d04d693..eb81f3db 100644 --- a/src/files/settings_io.cpp +++ b/src/files/settings_io.cpp @@ -102,6 +102,26 @@ dv::value SettingsHandler::getValue(const std::string& name) const { } } +dv::value SettingsHandler::getDefault(const std::string& name) const { + auto found = map.find(name); + if (found == map.end()) { + throw std::runtime_error("setting '" + name + "' does not exist"); + } + auto setting = found->second; + + if (auto number = dynamic_cast(setting)) { + return static_cast(number->getDefault()); + } else if (auto integer = dynamic_cast(setting)) { + return static_cast(integer->getDefault()); + } else if (auto flag = dynamic_cast(setting)) { + return flag->getDefault(); + } else if (auto string = dynamic_cast(setting)) { + return string->getDefault(); + } else { + throw std::runtime_error("type is not implemented for '" + name + "'"); + } +} + std::string SettingsHandler::toString(const std::string& name) const { auto found = map.find(name); if (found == map.end()) { diff --git a/src/files/settings_io.hpp b/src/files/settings_io.hpp index b5d17df6..cc5b33c9 100644 --- a/src/files/settings_io.hpp +++ b/src/files/settings_io.hpp @@ -22,6 +22,7 @@ public: SettingsHandler(EngineSettings& settings); dv::value getValue(const std::string& name) const; + dv::value getDefault(const std::string& name) const; void setValue(const std::string& name, const dv::value& value); std::string toString(const std::string& name) const; Setting* getSetting(const std::string& name) const; diff --git a/src/logic/scripting/lua/libs/libcore.cpp b/src/logic/scripting/lua/libs/libcore.cpp index b0a960b2..ee611b63 100644 --- a/src/logic/scripting/lua/libs/libcore.cpp +++ b/src/logic/scripting/lua/libs/libcore.cpp @@ -154,6 +154,8 @@ static int l_get_setting_info(lua::State* L) { lua::setfield(L, "min"); lua::pushnumber(L, number->getMax()); lua::setfield(L, "max"); + lua::pushnumber(L, number->getDefault()); + lua::setfield(L, "def"); return 1; } if (auto integer = dynamic_cast(setting)) { @@ -161,6 +163,18 @@ static int l_get_setting_info(lua::State* L) { lua::setfield(L, "min"); lua::pushinteger(L, integer->getMax()); lua::setfield(L, "max"); + lua::pushinteger(L, integer->getDefault()); + lua::setfield(L, "def"); + return 1; + } + if (auto boolean = dynamic_cast(setting)) { + lua::pushboolean(L, boolean->getDefault()); + lua::setfield(L, "def"); + return 1; + } + if (auto string = dynamic_cast(setting)) { + lua::pushstring(L, string->getDefault()); + lua::setfield(L, "def"); return 1; } lua::pop(L);