diff --git a/src/devtools/AppScriptsControl.cpp b/src/devtools/AppScriptsControl.cpp index 16c3475d5..bb1a386a2 100644 --- a/src/devtools/AppScriptsControl.cpp +++ b/src/devtools/AppScriptsControl.cpp @@ -57,3 +57,7 @@ void AppScriptsControl::terminate(std::string_view reason) { logger.info() << "script has been terminated due to " << reason; } } + +bool AppScriptsControl::isFinished() const { + return scriptCoroutine == nullptr || !scriptCoroutine->isActive(); +} diff --git a/src/devtools/AppScriptsControl.hpp b/src/devtools/AppScriptsControl.hpp index fb081a986..4e44eef60 100644 --- a/src/devtools/AppScriptsControl.hpp +++ b/src/devtools/AppScriptsControl.hpp @@ -21,6 +21,8 @@ public: void terminate(std::string_view reason); void onScreenChange(const std::string& name, bool show); + + bool isFinished() const; private: const Project& project; std::unique_ptr clientScript; diff --git a/src/engine/Engine.hpp b/src/engine/Engine.hpp index 169631214..153acf4df 100644 --- a/src/engine/Engine.hpp +++ b/src/engine/Engine.hpp @@ -186,5 +186,9 @@ public: return debuggingServer.get(); } + AppScriptsControl& getAppScripts() { + return *appScripts; + } + void detachDebugger(); }; diff --git a/src/engine/Mainloop.cpp b/src/engine/Mainloop.cpp index 241fd6c2e..3a196f522 100644 --- a/src/engine/Mainloop.cpp +++ b/src/engine/Mainloop.cpp @@ -1,16 +1,17 @@ #include "Mainloop.hpp" -#include "Engine.hpp" #include "debug/Logger.hpp" +#include "devtools/AppScriptsControl.hpp" #include "devtools/Project.hpp" -#include "frontend/screens/MenuScreen.hpp" +#include "Engine.hpp" #include "frontend/screens/LevelScreen.hpp" +#include "frontend/screens/MenuScreen.hpp" +#include "graphics/ui/elements/Container.hpp" +#include "graphics/ui/GUI.hpp" +#include "io/path.hpp" +#include "logic/scripting/scripting.hpp" #include "window/Window.hpp" #include "world/Level.hpp" -#include "graphics/ui/GUI.hpp" -#include "graphics/ui/elements/Container.hpp" -#include "logic/scripting/scripting.hpp" -#include "io/path.hpp" static debug::Logger logger("mainloop"); @@ -21,6 +22,7 @@ void Mainloop::run() { auto& time = engine.getTime(); auto& window = engine.getWindow(); auto& settings = engine.getSettings(); + const auto& coreParams = engine.getCoreParameters(); engine.setLevelConsumer([this](auto level, int64_t localPlayer) { if (level == nullptr) { @@ -37,6 +39,8 @@ void Mainloop::run() { logger.info() << "starting menu screen"; engine.setScreen(std::make_shared(engine)); + + auto& appScripts = engine.getAppScripts(); logger.info() << "main loop started"; while (!window.isShouldClose()) { @@ -52,6 +56,10 @@ void Mainloop::run() { settings.display.adaptiveFpsInMenu.get() && dynamic_cast(engine.getScreen().get()) != nullptr ); + if (coreParams.testMode && appScripts.isFinished()) { + logger.info() << "test finished"; + engine.quit(); + } } logger.info() << "main loop stopped"; } diff --git a/src/engine/ServerMainloop.cpp b/src/engine/ServerMainloop.cpp index 7c9970e5e..c1a95330d 100644 --- a/src/engine/ServerMainloop.cpp +++ b/src/engine/ServerMainloop.cpp @@ -1,6 +1,7 @@ #include "ServerMainloop.hpp" #include "Engine.hpp" +#include "devtools/AppScriptsControl.hpp" #include "logic/LevelController.hpp" #include "interfaces/Process.hpp" #include "debug/Logger.hpp" @@ -37,7 +38,7 @@ void ServerMainloop::run() { auto begin = system_clock::now(); auto startupTime = begin; - while (engine.isQuitSignal()) { + while (!engine.isQuitSignal() && !engine.getAppScripts().isFinished()) { if (coreParams.testMode) { time.step(delta); } else {