From 0a49c5f71ef91a646ab730df1784e6c0659eeaf0 Mon Sep 17 00:00:00 2001 From: Kindi Date: Fri, 4 Apr 2025 15:36:01 +0800 Subject: [PATCH 1/4] show global script variables in showVars --- apps/openmw/mwscript/globalscripts.hpp | 2 ++ apps/openmw/mwscript/miscextensions.cpp | 45 +++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/apps/openmw/mwscript/globalscripts.hpp b/apps/openmw/mwscript/globalscripts.hpp index 083695b51b..47c3f1ef6c 100644 --- a/apps/openmw/mwscript/globalscripts.hpp +++ b/apps/openmw/mwscript/globalscripts.hpp @@ -64,6 +64,8 @@ namespace MWScript void removeScript(const ESM::RefId& name); + const std::unordered_map>& getScripts() const { return mScripts; } + bool isRunning(const ESM::RefId& name) const; void run(); diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index ed2ef756e6..42e556c982 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -1223,6 +1223,50 @@ namespace MWScript runtime.getContext().report(str.str()); } + void printGlobalScriptsVars(Interpreter::Runtime& runtime) + { + std::stringstream str; + str << std::endl << "Global Scripts:"; + + const auto& scripts = MWBase::Environment::get().getScriptManager()->getGlobalScripts().getScripts(); + + // sort for user convenience + std::map> globalScripts(scripts.begin(), scripts.end()); + + auto printVariables = [&str](std::string_view scptName, const auto& names, const auto& values, + std::string_view type) { + size_t size = std::min(names.size(), values.size()); + for (size_t i = 0; i < size; ++i) + { + str << std::endl << scptName << "->" << names[i] << " = " << values[i] << " (" << type << ")"; + } + }; + + for (const auto& [refId, script] : globalScripts) + { + // Skip dormant global scripts + if (!script->mRunning) + continue; + + const std::string scptName = refId.serializeText(); + const Compiler::Locals& complocals + = MWBase::Environment::get().getScriptManager()->getLocals(refId); + const Locals& locals + = MWBase::Environment::get().getScriptManager()->getGlobalScripts().getLocals(refId); + + if (locals.isEmpty()) + str << std::endl << "No variables in script " << scptName; + else + { + printVariables(scptName, complocals.get('s'), locals.mShorts, "short"); + printVariables(scptName, complocals.get('l'), locals.mLongs, "long"); + printVariables(scptName, complocals.get('f'), locals.mFloats, "float"); + } + } + + runtime.getContext().report(str.str()); + } + public: void execute(Interpreter::Runtime& runtime) override { @@ -1233,6 +1277,7 @@ namespace MWScript { // No reference, no problem. printGlobalVars(runtime); + printGlobalScriptsVars(runtime) } } }; From 71a6b26b4fbc69a4568049c62b65e4e5e946619d Mon Sep 17 00:00:00 2001 From: Kindi Date: Fri, 4 Apr 2025 19:36:06 +0800 Subject: [PATCH 2/4] add missing semicolon, add leading whitespace, --- apps/openmw/mwscript/miscextensions.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index 42e556c982..04d7fb8f2a 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -1192,6 +1192,10 @@ namespace MWScript MWBase::World* world = MWBase::Environment::get().getWorld(); std::vector names = runtime.getContext().getGlobals(); + + // sort for user convenience + std::sort(names.begin(), names.end()); + for (size_t i = 0; i < names.size(); ++i) { char type = world->getGlobalVariableType(names[i]); @@ -1238,7 +1242,7 @@ namespace MWScript size_t size = std::min(names.size(), values.size()); for (size_t i = 0; i < size; ++i) { - str << std::endl << scptName << "->" << names[i] << " = " << values[i] << " (" << type << ")"; + str << std::endl << " " << scptName << "->" << names[i] << " = " << values[i] << " (" << type << ")"; } }; @@ -1255,7 +1259,7 @@ namespace MWScript = MWBase::Environment::get().getScriptManager()->getGlobalScripts().getLocals(refId); if (locals.isEmpty()) - str << std::endl << "No variables in script " << scptName; + str << std::endl << " No variables in script " << scptName; else { printVariables(scptName, complocals.get('s'), locals.mShorts, "short"); @@ -1277,7 +1281,7 @@ namespace MWScript { // No reference, no problem. printGlobalVars(runtime); - printGlobalScriptsVars(runtime) + printGlobalScriptsVars(runtime); } } }; From a5580718f7078cc9e082188052274c27dfc87b27 Mon Sep 17 00:00:00 2001 From: Kindi Date: Sat, 5 Apr 2025 11:26:34 +0800 Subject: [PATCH 3/4] clangformat --- apps/openmw/mwscript/miscextensions.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index 04d7fb8f2a..bdab10b084 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -1237,14 +1237,15 @@ namespace MWScript // sort for user convenience std::map> globalScripts(scripts.begin(), scripts.end()); - auto printVariables = [&str](std::string_view scptName, const auto& names, const auto& values, - std::string_view type) { - size_t size = std::min(names.size(), values.size()); - for (size_t i = 0; i < size; ++i) - { - str << std::endl << " " << scptName << "->" << names[i] << " = " << values[i] << " (" << type << ")"; - } - }; + auto printVariables + = [&str](std::string_view scptName, const auto& names, const auto& values, std::string_view type) { + size_t size = std::min(names.size(), values.size()); + for (size_t i = 0; i < size; ++i) + { + str << std::endl + << " " << scptName << "->" << names[i] << " = " << values[i] << " (" << type << ")"; + } + }; for (const auto& [refId, script] : globalScripts) { From 2dc0d8abcafe1daa4bcdfda26545d0b9156550b5 Mon Sep 17 00:00:00 2001 From: Kuyondo Date: Wed, 2 Jul 2025 23:47:27 +0800 Subject: [PATCH 4/4] use << --- apps/openmw/mwscript/miscextensions.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index bdab10b084..d01ce8eb72 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -1238,7 +1238,7 @@ namespace MWScript std::map> globalScripts(scripts.begin(), scripts.end()); auto printVariables - = [&str](std::string_view scptName, const auto& names, const auto& values, std::string_view type) { + = [&str](const ESM::RefId& scptName, const auto& names, const auto& values, std::string_view type) { size_t size = std::min(names.size(), values.size()); for (size_t i = 0; i < size; ++i) { @@ -1253,19 +1253,18 @@ namespace MWScript if (!script->mRunning) continue; - const std::string scptName = refId.serializeText(); const Compiler::Locals& complocals = MWBase::Environment::get().getScriptManager()->getLocals(refId); const Locals& locals = MWBase::Environment::get().getScriptManager()->getGlobalScripts().getLocals(refId); if (locals.isEmpty()) - str << std::endl << " No variables in script " << scptName; + str << std::endl << " No variables in script " << refId; else { - printVariables(scptName, complocals.get('s'), locals.mShorts, "short"); - printVariables(scptName, complocals.get('l'), locals.mLongs, "long"); - printVariables(scptName, complocals.get('f'), locals.mFloats, "float"); + printVariables(refId, complocals.get('s'), locals.mShorts, "short"); + printVariables(refId, complocals.get('l'), locals.mLongs, "long"); + printVariables(refId, complocals.get('f'), locals.mFloats, "float"); } }