diff --git a/dev/tests/example.lua b/dev/tests/example.lua index 6c9546a8..8baf6afb 100644 --- a/dev/tests/example.lua +++ b/dev/tests/example.lua @@ -1,2 +1,4 @@ test.new_world("demo", "2019", "core:default") -print(world.get_generator()) +assert(world.get_generator() == "core:default") +test.close_world(true) +assert(not world.is_open()) diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index d8a593b0..451f07c8 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -13,6 +13,7 @@ if test then test.sleep = sleep test.name = __VC_TEST_NAME test.new_world = core.new_world + test.close_world = core.close_world end ------------------------------------------------ diff --git a/src/Mainloop.cpp b/src/Mainloop.cpp index 102aa7cd..eae4c501 100644 --- a/src/Mainloop.cpp +++ b/src/Mainloop.cpp @@ -16,7 +16,14 @@ void Mainloop::run() { auto& time = engine.getTime(); engine.setLevelConsumer([this](auto level) { - engine.setScreen(std::make_shared(&engine, std::move(level))); + if (level == nullptr) { + // destroy LevelScreen and run quit callbacks + engine.setScreen(nullptr); + // create and go to menu screen + engine.setScreen(std::make_shared(&engine)); + } else { + engine.setScreen(std::make_shared(&engine, std::move(level))); + } }); logger.info() << "starting menu screen"; diff --git a/src/TestMainloop.cpp b/src/TestMainloop.cpp index 955f4b26..32f31627 100644 --- a/src/TestMainloop.cpp +++ b/src/TestMainloop.cpp @@ -38,5 +38,11 @@ void TestMainloop::run() { } void TestMainloop::setLevel(std::unique_ptr level) { - this->controller = std::make_unique(&engine, std::move(level)); + if (level == nullptr) { + controller->onWorldQuit(); + engine.getPaths()->setCurrentWorldFolder(fs::path()); + controller = nullptr; + } else { + controller = std::make_unique(&engine, std::move(level)); + } } diff --git a/src/engine.cpp b/src/engine.cpp index 072bd5f6..3c7d4bb5 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -18,8 +18,6 @@ #include "frontend/locale.hpp" #include "frontend/menu.hpp" #include "frontend/screens/Screen.hpp" -#include "frontend/screens/MenuScreen.hpp" -#include "frontend/screens/LevelScreen.hpp" #include "graphics/render/ModelsGenerator.hpp" #include "graphics/core/DrawContext.hpp" #include "graphics/core/ImageData.hpp" @@ -454,9 +452,15 @@ void Engine::setLanguage(std::string locale) { } void Engine::onWorldOpen(std::unique_ptr level) { + logger.info() << "world open"; levelConsumer(std::move(level)); } +void Engine::onWorldClosed() { + logger.info() << "world closed"; + levelConsumer(nullptr); +} + gui::GUI* Engine::getGUI() { return gui.get(); } diff --git a/src/engine.hpp b/src/engine.hpp index 55104cb1..63a78084 100644 --- a/src/engine.hpp +++ b/src/engine.hpp @@ -135,6 +135,7 @@ public: ResPaths* getResPaths(); void onWorldOpen(std::unique_ptr level); + void onWorldClosed(); /// @brief Get current Content instance const Content* getContent() const; diff --git a/src/logic/LevelController.cpp b/src/logic/LevelController.cpp index 5d2ddd9b..5b24bbbb 100644 --- a/src/logic/LevelController.cpp +++ b/src/logic/LevelController.cpp @@ -54,8 +54,9 @@ void LevelController::update(float delta, bool input, bool pause) { } void LevelController::saveWorld() { - level->getWorld()->wfile->createDirectories(); - logger.info() << "writing world"; + auto world = level->getWorld(); + logger.info() << "writing world '" << world->getName() << "'"; + world->wfile->createDirectories(); scripting::on_world_save(); level->onSave(); level->getWorld()->write(level.get()); diff --git a/src/logic/scripting/lua/libs/libcore.cpp b/src/logic/scripting/lua/libs/libcore.cpp index 9b048e44..811b8d53 100644 --- a/src/logic/scripting/lua/libs/libcore.cpp +++ b/src/logic/scripting/lua/libs/libcore.cpp @@ -69,10 +69,7 @@ static int l_close_world(lua::State* L) { if (save_world) { controller->saveWorld(); } - // destroy LevelScreen and run quit callbacks - engine->setScreen(nullptr); - // create and go to menu screen - engine->setScreen(std::make_shared(engine)); + engine->onWorldClosed(); return 0; }