diff --git a/doc/en/scripting/builtins/libworld.md b/doc/en/scripting/builtins/libworld.md index 349e9106..5bf01abb 100644 --- a/doc/en/scripting/builtins/libworld.md +++ b/doc/en/scripting/builtins/libworld.md @@ -10,6 +10,8 @@ world.get_list() -> tables array { name: str, -- world icon/preview (loading automatically) icon: str + -- engine version the world was saved on + version: {int, int} } -- Returns current day time in range \[0.0-1.0\] diff --git a/doc/ru/scripting/builtins/libworld.md b/doc/ru/scripting/builtins/libworld.md index b82f3b53..9d7d635e 100644 --- a/doc/ru/scripting/builtins/libworld.md +++ b/doc/ru/scripting/builtins/libworld.md @@ -9,7 +9,9 @@ world.get_list() -> массив таблиц { -- название мира name: str, -- предпросмотр (автоматически загружаемая текстура) - icon: str + icon: str, + -- версия движка, на которой был сохранен мир + version: {int, int} } -- Возвращает текущее игровое время от 0.0 до 1.0, где 0.0 и 1.0 - полночь, 0.5 - полдень. diff --git a/res/layouts/pages/worlds.xml.lua b/res/layouts/pages/worlds.xml.lua index 37c348a9..1cbcd53d 100644 --- a/res/layouts/pages/worlds.xml.lua +++ b/res/layouts/pages/worlds.xml.lua @@ -1,6 +1,13 @@ function on_open() local worlds = world.get_list() for _, info in ipairs(worlds) do + local major, minor = core.get_version() + if info.version[1] > major or info.version[2] > minor then + info.versionColor = "#A02010" + else + info.versionColor = "#808080" + end + info.versionString = string.format("%s.%s", unpack(info.version)) document.worlds:add(gui.template("world", info)) end end diff --git a/res/layouts/templates/world.xml b/res/layouts/templates/world.xml index c20223fc..a258604b 100644 --- a/res/layouts/templates/world.xml +++ b/res/layouts/templates/world.xml @@ -14,4 +14,5 @@ onclick='core.delete_world("%{name}")'> + diff --git a/src/logic/scripting/lua/libs/libcore.cpp b/src/logic/scripting/lua/libs/libcore.cpp index 5a100b9c..c656d0e6 100644 --- a/src/logic/scripting/lua/libs/libcore.cpp +++ b/src/logic/scripting/lua/libs/libcore.cpp @@ -20,6 +20,12 @@ using namespace scripting; +static int l_get_version(lua::State* L) { + return lua::pushvec_stack( + L, glm::vec2(ENGINE_VERSION_MAJOR, ENGINE_VERSION_MINOR) + ); +} + /// @brief Creating new world /// @param name Name world /// @param seed Seed world @@ -239,6 +245,7 @@ static int l_quit(lua::State*) { } const luaL_Reg corelib[] = { + {"get_version", lua::wrap}, {"new_world", lua::wrap}, {"open_world", lua::wrap}, {"reopen_world", lua::wrap}, diff --git a/src/logic/scripting/lua/libs/libworld.cpp b/src/logic/scripting/lua/libs/libworld.cpp index 06da877c..5422c873 100644 --- a/src/logic/scripting/lua/libs/libworld.cpp +++ b/src/logic/scripting/lua/libs/libworld.cpp @@ -4,7 +4,9 @@ #include "assets/Assets.hpp" #include "assets/AssetsLoader.hpp" +#include "coders/json.hpp" #include "engine.hpp" +#include "files/files.hpp" #include "files/engine_paths.hpp" #include "world/Level.hpp" #include "world/World.hpp" @@ -32,22 +34,34 @@ static int l_get_list(lua::State* L) { for (size_t i = 0; i < worlds.size(); i++) { lua::createtable(L, 0, 1); - auto name = worlds[i].filename().u8string(); + const auto& folder = worlds[i]; + + auto root = json::parse(files::read_string(folder/fs::u8path("world.json"))); + const auto& versionMap = root["version"]; + int versionMajor = versionMap["major"].asInteger(); + int versionMinor = versionMap["minor"].asInteger(); + + + auto name = folder.filename().u8string(); lua::pushstring(L, name); lua::setfield(L, "name"); auto assets = engine->getAssets(); std::string icon = "world#" + name + ".icon"; if (!AssetsLoader::loadExternalTexture( - assets, - icon, - {worlds[i] / fs::path("icon.png"), - worlds[i] / fs::path("preview.png")} - )) { + assets, + icon, + {worlds[i] / fs::path("icon.png"), + worlds[i] / fs::path("preview.png")} + )) { icon = "gui/no_world_icon"; } lua::pushstring(L, icon); lua::setfield(L, "icon"); + + lua::pushvec2(L, {versionMajor, versionMinor}); + lua::setfield(L, "version"); + lua::rawseti(L, i + 1); } return 1;