From eced6f2126d30e1987149a12d7eeb666896bed7f Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Wed, 7 Jul 2021 18:48:25 +0200 Subject: [PATCH] Implement the help command --- CHANGELOG.md | 1 + apps/openmw/mwbase/scriptmanager.hpp | 3 +++ apps/openmw/mwbase/windowmanager.hpp | 2 ++ apps/openmw/mwgui/windowmanagerimp.cpp | 5 +++++ apps/openmw/mwgui/windowmanagerimp.hpp | 2 ++ apps/openmw/mwscript/docs/vmformat.txt | 3 ++- apps/openmw/mwscript/miscextensions.cpp | 18 ++++++++++++++++++ apps/openmw/mwscript/scriptmanagerimp.cpp | 5 +++++ apps/openmw/mwscript/scriptmanagerimp.hpp | 2 ++ components/compiler/extensions0.cpp | 1 + components/compiler/opcodes.hpp | 1 + files/mygui/openmw_console.layout | 1 + 12 files changed, 43 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d00d576eec..5c3b4e3354 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ Bug #6129: Player avatar not displayed correctly for large window sizes when GUI scaling active Bug #6131: Item selection in the avatar window not working correctly for large window sizes Bug #6133: Cannot reliably sneak or steal in the sight of the NPCs siding with player + Feature #2780: A way to see current OpenMW version in the console Feature #5489: MCP: Telekinesis fix for activators Feature #6017: Separate persistent and temporary cell references when saving diff --git a/apps/openmw/mwbase/scriptmanager.hpp b/apps/openmw/mwbase/scriptmanager.hpp index ac8333ed10..c7717cfb05 100644 --- a/apps/openmw/mwbase/scriptmanager.hpp +++ b/apps/openmw/mwbase/scriptmanager.hpp @@ -10,6 +10,7 @@ namespace Interpreter namespace Compiler { + class Extensions; class Locals; } @@ -52,6 +53,8 @@ namespace MWBase ///< Return locals for script \a name. virtual MWScript::GlobalScripts& getGlobalScripts() = 0; + + virtual const Compiler::Extensions& getExtensions() const = 0; }; } diff --git a/apps/openmw/mwbase/windowmanager.hpp b/apps/openmw/mwbase/windowmanager.hpp index dde470b119..6e3c615de3 100644 --- a/apps/openmw/mwbase/windowmanager.hpp +++ b/apps/openmw/mwbase/windowmanager.hpp @@ -349,6 +349,8 @@ namespace MWBase virtual void watchActor(const MWWorld::Ptr& ptr) = 0; virtual MWWorld::Ptr getWatchedActor() const = 0; + + virtual const std::string& getVersionDescription() const = 0; }; } diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index 521d247cff..1694206504 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -2199,4 +2199,9 @@ namespace MWGui { return mStatsWatcher->getWatchedActor(); } + + const std::string& WindowManager::getVersionDescription() const + { + return mVersionDescription; + } } diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index c5b2b93826..ef411a39df 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -383,6 +383,8 @@ namespace MWGui bool injectKeyPress(MyGUI::KeyCode key, unsigned int text, bool repeat=false) override; bool injectKeyRelease(MyGUI::KeyCode key) override; + const std::string& getVersionDescription() const override; + private: unsigned int mOldUpdateMask; unsigned int mOldCullMask; diff --git a/apps/openmw/mwscript/docs/vmformat.txt b/apps/openmw/mwscript/docs/vmformat.txt index ccc579b30d..7c470fe413 100644 --- a/apps/openmw/mwscript/docs/vmformat.txt +++ b/apps/openmw/mwscript/docs/vmformat.txt @@ -479,5 +479,6 @@ op 0x200031c: GetDisabled, explicit op 0x200031d: StartScript, explicit op 0x200031e: GetDistance op 0x200031f: GetDistance, explicit +op 0x2000320: Help -opcodes 0x2000320-0x3ffffff unused +opcodes 0x2000321-0x3ffffff unused diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index c28f2b8951..ca9bcbe002 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -1582,6 +1583,22 @@ namespace MWScript } }; + class OpHelp : public Interpreter::Opcode0 + { + public: + + void execute(Interpreter::Runtime& runtime) override + { + std::stringstream message; + message << MWBase::Environment::get().getWindowManager()->getVersionDescription() << "\n\n"; + std::vector commands; + MWBase::Environment::get().getScriptManager()->getExtensions().listKeywords(commands); + for(const auto& command : commands) + message << command << "\n"; + runtime.getContext().report(message.str()); + } + }; + void installOpcodes (Interpreter::Interpreter& interpreter) { interpreter.installSegment5 (Compiler::Misc::opcodeMenuMode, new OpMenuMode); @@ -1701,6 +1718,7 @@ namespace MWScript interpreter.installSegment5 (Compiler::Misc::opcodeRepairedOnMe, new OpRepairedOnMe); interpreter.installSegment5 (Compiler::Misc::opcodeRepairedOnMeExplicit, new OpRepairedOnMe); interpreter.installSegment5 (Compiler::Misc::opcodeToggleRecastMesh, new OpToggleRecastMesh); + interpreter.installSegment5 (Compiler::Misc::opcodeHelp, new OpHelp); } } } diff --git a/apps/openmw/mwscript/scriptmanagerimp.cpp b/apps/openmw/mwscript/scriptmanagerimp.cpp index 15b416fd04..51e4762613 100644 --- a/apps/openmw/mwscript/scriptmanagerimp.cpp +++ b/apps/openmw/mwscript/scriptmanagerimp.cpp @@ -207,4 +207,9 @@ namespace MWScript { return mGlobalScripts; } + + const Compiler::Extensions& ScriptManager::getExtensions() const + { + return *mCompilerContext.getExtensions(); + } } diff --git a/apps/openmw/mwscript/scriptmanagerimp.hpp b/apps/openmw/mwscript/scriptmanagerimp.hpp index aff8318f72..a82e3f92e8 100644 --- a/apps/openmw/mwscript/scriptmanagerimp.hpp +++ b/apps/openmw/mwscript/scriptmanagerimp.hpp @@ -83,6 +83,8 @@ namespace MWScript ///< Return locals for script \a name. GlobalScripts& getGlobalScripts() override; + + const Compiler::Extensions& getExtensions() const override; }; } diff --git a/components/compiler/extensions0.cpp b/components/compiler/extensions0.cpp index 3989ef0f4f..6de35d7137 100644 --- a/components/compiler/extensions0.cpp +++ b/components/compiler/extensions0.cpp @@ -337,6 +337,7 @@ namespace Compiler extensions.registerInstruction ("setnavmeshnumber", "l", opcodeSetNavMeshNumberToRender); extensions.registerFunction ("repairedonme", 'l', "S", opcodeRepairedOnMe, opcodeRepairedOnMeExplicit); extensions.registerInstruction ("togglerecastmesh", "", opcodeToggleRecastMesh); + extensions.registerInstruction ("help", "", opcodeHelp); } } diff --git a/components/compiler/opcodes.hpp b/components/compiler/opcodes.hpp index fdc3e0eabd..46ee31133c 100644 --- a/components/compiler/opcodes.hpp +++ b/components/compiler/opcodes.hpp @@ -318,6 +318,7 @@ namespace Compiler const int opcodeDisableExplicit = 0x200031b; const int opcodeGetDisabledExplicit = 0x200031c; const int opcodeStartScriptExplicit = 0x200031d; + const int opcodeHelp = 0x2000320; } namespace Sky diff --git a/files/mygui/openmw_console.layout b/files/mygui/openmw_console.layout index 6ab65d21da..7dba079eed 100644 --- a/files/mygui/openmw_console.layout +++ b/files/mygui/openmw_console.layout @@ -14,6 +14,7 @@ +