From e27ec86e853ad0f24c524e8fc8a5139e8f86f908 Mon Sep 17 00:00:00 2001 From: Lwmte <3331699+Lwmte@users.noreply.github.com> Date: Sat, 22 Mar 2025 10:28:12 +0100 Subject: [PATCH] Allow to run console input in freeze modes as well --- .../Scripting/Include/ScriptInterfaceGame.h | 1 + .../Internal/TEN/Logic/LogicHandler.cpp | 26 +++++++++++++++++++ .../Internal/TEN/Logic/LogicHandler.h | 5 +++- TombEngine/Specific/winmain.cpp | 13 +--------- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/TombEngine/Scripting/Include/ScriptInterfaceGame.h b/TombEngine/Scripting/Include/ScriptInterfaceGame.h index 73b0be0ee..121cbe2f2 100644 --- a/TombEngine/Scripting/Include/ScriptInterfaceGame.h +++ b/TombEngine/Scripting/Include/ScriptInterfaceGame.h @@ -62,6 +62,7 @@ public: virtual void OnUseItem(GAME_OBJECT_ID objectNumber) = 0; virtual void OnFreeze() = 0; + virtual void AddConsoleInput(const std::string& input) = 0; virtual void ShortenTENCalls() = 0; virtual void FreeLevelScripts() = 0; virtual void ResetScripts(bool clearGameVars) = 0; diff --git a/TombEngine/Scripting/Internal/TEN/Logic/LogicHandler.cpp b/TombEngine/Scripting/Internal/TEN/Logic/LogicHandler.cpp index e85c98ce5..e1cf4ed6b 100644 --- a/TombEngine/Scripting/Internal/TEN/Logic/LogicHandler.cpp +++ b/TombEngine/Scripting/Internal/TEN/Logic/LogicHandler.cpp @@ -620,6 +620,28 @@ int Handle(TypeFrom& var, MapType& varsMap, size_t& numVars, std::vectorsecond; } +void LogicHandler::AddConsoleInput(const std::string& input) +{ + _consoleInput = input; +} + +void LogicHandler::PerformConsoleInput() +{ + if (!_consoleInput.empty()) + { + try + { + ExecuteString(_consoleInput); + } + catch (const std::exception& ex) + { + TENLog("Error executing " + _consoleInput + ": " + ex.what(), LogLevel::Error); + } + + _consoleInput.clear(); + } +} + std::string LogicHandler::GetRequestedPath() const { auto path = std::string(); @@ -1027,6 +1049,8 @@ void LogicHandler::OnLoop(float deltaTime, bool postLoop) for (const auto& name : _callbacksPreLoop) CallLevelFuncByName(name, deltaTime); + PerformConsoleInput(); + lua_gc(_handler.GetState()->lua_state(), LUA_GCCOLLECT, 0); if (_onLoop.valid()) CallLevelFunc(_onLoop, deltaTime); @@ -1099,6 +1123,8 @@ void LogicHandler::OnFreeze() for (const auto& name : _callbacksPreFreeze) CallLevelFuncByName(name); + PerformConsoleInput(); + if (_onFreeze.valid()) CallLevelFunc(_onFreeze); diff --git a/TombEngine/Scripting/Internal/TEN/Logic/LogicHandler.h b/TombEngine/Scripting/Internal/TEN/Logic/LogicHandler.h index f4f7ff481..8ff7be4e2 100644 --- a/TombEngine/Scripting/Internal/TEN/Logic/LogicHandler.h +++ b/TombEngine/Scripting/Internal/TEN/Logic/LogicHandler.h @@ -75,11 +75,13 @@ private: sol::protected_function _onFreeze = {}; std::unordered_map*> _callbacks; - std::vector> _savedVarPath; bool _shortenedCalls = false; + std::string _consoleInput = ""; + void PerformConsoleInput(); + std::string GetRequestedPath() const; void ResetLevelTables(); @@ -132,6 +134,7 @@ public: void HandleEvent(const std::string& name, EventType type, sol::optional activator); void EnableEvent(const std::string& name, EventType type); void DisableEvent(const std::string& name, EventType type); + void AddConsoleInput(const std::string& input); void ResetScripts(bool clearGameVars) override; void ShortenTENCalls() override; diff --git a/TombEngine/Specific/winmain.cpp b/TombEngine/Specific/winmain.cpp index 01d13bf8c..f4cf4d9da 100644 --- a/TombEngine/Specific/winmain.cpp +++ b/TombEngine/Specific/winmain.cpp @@ -24,10 +24,6 @@ using namespace TEN::Renderer; using namespace TEN::Input; using namespace TEN::Utils; -using std::exception; -using std::string; -using std::cout; -using std::endl; WINAPP App; unsigned int ThreadID, ConsoleThreadID; @@ -261,14 +257,7 @@ unsigned CALLBACK ConsoleInput(void*) } else { - try - { - g_GameScript->ExecuteString(input); - } - catch (const exception& ex) - { - TENLog("Error executing " + input + ": " + ex.what(), LogLevel::Error); - } + g_GameScript->AddConsoleInput(input); } }