From e4a0702bb49566225225bf25dbfbec1afe7111a5 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Mon, 4 Apr 2011 14:49:26 +0200 Subject: [PATCH] added journal-related script instructions --- apps/openmw/CMakeLists.txt | 2 + apps/openmw/mwscript/dialogueextensions.cpp | 94 +++++++++++++++++++++ apps/openmw/mwscript/dialogueextensions.hpp | 25 ++++++ apps/openmw/mwscript/docs/vmformat.txt | 5 +- apps/openmw/mwscript/extensions.cpp | 3 + apps/openmw/mwscript/interpretercontext.cpp | 5 ++ apps/openmw/mwscript/interpretercontext.hpp | 4 + 7 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 apps/openmw/mwscript/dialogueextensions.cpp create mode 100644 apps/openmw/mwscript/dialogueextensions.hpp diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index bdc018c10..3cb08b5f7 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -93,6 +93,7 @@ set(GAMESCRIPT mwscript/controlextensions.cpp mwscript/extensions.cpp mwscript/globalscripts.cpp + mwscript/dialogueextensions.cpp ) set(GAMESCRIPT_HEADER mwscript/locals.hpp @@ -111,6 +112,7 @@ set(GAMESCRIPT_HEADER mwscript/extensions.hpp mwscript/globalscripts.hpp mwscript/ref.hpp + mwscript/dialogueextensions.hpp ) source_group(apps\\openmw\\mwscript FILES ${GAMESCRIPT} ${GAMESCRIPT_HEADER}) diff --git a/apps/openmw/mwscript/dialogueextensions.cpp b/apps/openmw/mwscript/dialogueextensions.cpp new file mode 100644 index 000000000..c2ff9ed8b --- /dev/null +++ b/apps/openmw/mwscript/dialogueextensions.cpp @@ -0,0 +1,94 @@ + +#include "dialogueextensions.hpp" + +#include + +#include +#include +#include + +#include "../mwdialogue/journal.hpp" + +#include "interpretercontext.hpp" + +namespace MWScript +{ + namespace Dialogue + { + class OpJournal : public Interpreter::Opcode0 + { + public: + + virtual void execute (Interpreter::Runtime& runtime) + { + MWScript::InterpreterContext& context + = static_cast (runtime.getContext()); + + std::string quest = runtime.getStringLiteral (runtime[0].mInteger); + runtime.pop(); + + Interpreter::Type_Integer index = runtime[0].mInteger; + runtime.pop(); + + context.getEnvironment().mJournal->addEntry (quest, index); + } + }; + + class OpSetJournalIndex : public Interpreter::Opcode0 + { + public: + + virtual void execute (Interpreter::Runtime& runtime) + { + MWScript::InterpreterContext& context + = static_cast (runtime.getContext()); + + std::string quest = runtime.getStringLiteral (runtime[0].mInteger); + runtime.pop(); + + Interpreter::Type_Integer index = runtime[0].mInteger; + runtime.pop(); + + context.getEnvironment().mJournal->setJournalIndex (quest, index); + } + }; + + class OpGetJournalIndex : public Interpreter::Opcode0 + { + public: + + virtual void execute (Interpreter::Runtime& runtime) + { + MWScript::InterpreterContext& context + = static_cast (runtime.getContext()); + + std::string quest = runtime.getStringLiteral (runtime[0].mInteger); + runtime.pop(); + + int index = context.getEnvironment().mJournal->getJournalIndex (quest); + + runtime.push (index); + + } + }; + + const int opcodeJournal = 0x2000133; + const int opcodeSetJournalIndex = 0x2000134; + const int opcodeGetJournalIndex = 0x2000135; + + void registerExtensions (Compiler::Extensions& extensions) + { + extensions.registerInstruction ("journal", "cl", opcodeJournal); + extensions.registerInstruction ("setjournalindex", "cl", opcodeSetJournalIndex); + extensions.registerFunction ("getjournalindex", 'l', "c", opcodeGetJournalIndex); + } + + void installOpcodes (Interpreter::Interpreter& interpreter) + { + interpreter.installSegment5 (opcodeJournal, new OpJournal); + interpreter.installSegment5 (opcodeSetJournalIndex, new OpSetJournalIndex); + interpreter.installSegment5 (opcodeGetJournalIndex, new OpGetJournalIndex); + } + } + +} diff --git a/apps/openmw/mwscript/dialogueextensions.hpp b/apps/openmw/mwscript/dialogueextensions.hpp new file mode 100644 index 000000000..ece7d62ce --- /dev/null +++ b/apps/openmw/mwscript/dialogueextensions.hpp @@ -0,0 +1,25 @@ +#ifndef GAME_SCRIPT_DIALOGUEEXTENSIONS_H +#define GAME_SCRIPT_DIALOGUEEXTENSIONS_H + +namespace Compiler +{ + class Extensions; +} + +namespace Interpreter +{ + class Interpreter; +} + +namespace MWScript +{ + /// \brief Dialogue/Journal-related script functionality + namespace Dialogue + { + void registerExtensions (Compiler::Extensions& extensions); + + void installOpcodes (Interpreter::Interpreter& interpreter); + } +} + +#endif diff --git a/apps/openmw/mwscript/docs/vmformat.txt b/apps/openmw/mwscript/docs/vmformat.txt index d803d0bac..90962f56b 100644 --- a/apps/openmw/mwscript/docs/vmformat.txt +++ b/apps/openmw/mwscript/docs/vmformat.txt @@ -104,4 +104,7 @@ op 0x2000115-0x200012f: ModSKill, explicit reference op 0x2000130: ToggleCollision op 0x2000131: GetInterior op 0x2000132: ToggleCollsionDebug -opcodes 0x2000133-0x3ffffff unused +op 0x2000133: Journal +op 0x2000134: SetJournalIndex +op 0x2000135: GetJournalIndex +opcodes 0x2000136-0x3ffffff unused diff --git a/apps/openmw/mwscript/extensions.cpp b/apps/openmw/mwscript/extensions.cpp index 15d482fc1..86161d2b1 100644 --- a/apps/openmw/mwscript/extensions.cpp +++ b/apps/openmw/mwscript/extensions.cpp @@ -13,6 +13,7 @@ #include "containerextensions.hpp" #include "aiextensions.hpp" #include "controlextensions.hpp" +#include "dialogueextensions.hpp" namespace MWScript { @@ -27,6 +28,7 @@ namespace MWScript Container::registerExtensions (extensions); Ai::registerExtensions (extensions); Control::registerExtensions (extensions); + Dialogue::registerExtensions (extensions); } void installOpcodes (Interpreter::Interpreter& interpreter) @@ -41,5 +43,6 @@ namespace MWScript Container::installOpcodes (interpreter); Ai::installOpcodes (interpreter); Control::installOpcodes (interpreter); + Dialogue::installOpcodes (interpreter); } } diff --git a/apps/openmw/mwscript/interpretercontext.cpp b/apps/openmw/mwscript/interpretercontext.cpp index f2f1e6e10..cb6ecb218 100644 --- a/apps/openmw/mwscript/interpretercontext.cpp +++ b/apps/openmw/mwscript/interpretercontext.cpp @@ -260,6 +260,11 @@ namespace MWScript mEnvironment.mWorld->disable (ref); } + MWWorld::Environment& InterpreterContext::getEnvironment() + { + return mEnvironment; + } + MWGui::WindowManager& InterpreterContext::getWindowManager() { return *mEnvironment.mWindowManager; diff --git a/apps/openmw/mwscript/interpretercontext.hpp b/apps/openmw/mwscript/interpretercontext.hpp index 031820d5d..aebfc620e 100644 --- a/apps/openmw/mwscript/interpretercontext.hpp +++ b/apps/openmw/mwscript/interpretercontext.hpp @@ -106,6 +106,10 @@ namespace MWScript virtual void disable (const std::string& id = ""); + MWWorld::Environment& getEnvironment(); + + /// \todo remove the following functions (extentions should use getEnvironment instead) + MWWorld::World& getWorld(); MWSound::SoundManager& getSoundManager();