From 9b9fa7e0a5f92c1b3b3a1252af5ed82a5911505d Mon Sep 17 00:00:00 2001 From: Bastien Bouclet Date: Tue, 2 Aug 2016 18:56:55 +0200 Subject: MOHAWK: Refactor the script manager to read data to Command classes --- engines/mohawk/riven_scripts.h | 129 ++++++++++++++++++++++++++++------------- 1 file changed, 89 insertions(+), 40 deletions(-) (limited to 'engines/mohawk/riven_scripts.h') diff --git a/engines/mohawk/riven_scripts.h b/engines/mohawk/riven_scripts.h index b669cd5081..9163345a64 100644 --- a/engines/mohawk/riven_scripts.h +++ b/engines/mohawk/riven_scripts.h @@ -49,25 +49,93 @@ enum { }; class MohawkEngine_Riven; -class RivenScript; +class RivenCommand; class RivenScript { public: - RivenScript(MohawkEngine_Riven *vm, Common::SeekableReadStream *stream, uint16 scriptType, uint16 parentStack, uint16 parentCard); + RivenScript(MohawkEngine_Riven *vm, uint16 scriptType); ~RivenScript(); + void addCommand(RivenCommand *command); + void runScript(); void dumpScript(const Common::StringArray &varNames, const Common::StringArray &xNames, byte tabs); uint16 getScriptType() { return _scriptType; } - uint16 getParentStack() { return _parentStack; } - uint16 getParentCard() { return _parentCard; } - bool isRunning() { return _isRunning; } void stopRunning() { _continueRunning = false; } - static uint32 calculateScriptSize(Common::SeekableReadStream *script); +private: + MohawkEngine_Riven *_vm; + + Common::Array _commands; + uint16 _scriptType; + bool _continueRunning; + + void dumpCommands(const Common::StringArray &varNames, const Common::StringArray &xNames, byte tabs); +}; + +typedef Common::SharedPtr RivenScriptPtr; +typedef Common::Array RivenScriptList; + +class RivenScriptManager { +public: + RivenScriptManager(MohawkEngine_Riven *vm); + ~RivenScriptManager(); + + RivenScriptPtr readScript(Common::ReadStream *stream, uint16 scriptType); + RivenScriptList readScripts(Common::ReadStream *stream); + void stopAllScripts(); + + struct StoredMovieOpcode { + RivenScriptPtr script; + uint32 time; + uint16 id; + }; + + uint16 getStoredMovieOpcodeID() { return _storedMovieOpcode.id; } + uint32 getStoredMovieOpcodeTime() { return _storedMovieOpcode.time; } + void setStoredMovieOpcode(const StoredMovieOpcode &op); + void runStoredMovieOpcode(); + void clearStoredMovieOpcode(); private: - typedef void (RivenScript::*OpcodeProcRiven)(uint16 op, uint16 argc, uint16 *argv); + MohawkEngine_Riven *_vm; + + StoredMovieOpcode _storedMovieOpcode; + + RivenCommand *readCommand(Common::ReadStream *stream); +}; + +class RivenCommand { +public: + RivenCommand(MohawkEngine_Riven *vm); + virtual ~RivenCommand(); + + virtual void dump(const Common::StringArray &varNames, const Common::StringArray &xNames, byte tabs) = 0; + + virtual void execute() = 0; + +protected: + MohawkEngine_Riven *_vm; +}; + +class RivenSimpleCommand : public RivenCommand { +public: + static RivenSimpleCommand *createFromStream(MohawkEngine_Riven *vm, int type, Common::ReadStream *stream); + virtual ~RivenSimpleCommand(); + + // RivenCommand API + virtual void dump(const Common::StringArray &varNames, const Common::StringArray &xNames, byte tabs) override; + virtual void execute() override; + +private: + typedef Common::Array ArgumentArray; + + RivenSimpleCommand(MohawkEngine_Riven *vm, int type, const ArgumentArray &arguments); + + int _type; + ArgumentArray _arguments; + + typedef void (RivenSimpleCommand::*OpcodeProcRiven)(uint16 op, uint16 argc, uint16 *argv); struct RivenOpcode { OpcodeProcRiven proc; const char *desc; @@ -75,16 +143,6 @@ private: const RivenOpcode *_opcodes; void setupOpcodes(); - MohawkEngine_Riven *_vm; - Common::SeekableReadStream *_stream; - uint16 _scriptType, _parentStack, _parentCard; - bool _isRunning, _continueRunning; - - void dumpCommands(const Common::StringArray &varNames, const Common::StringArray &xNames, byte tabs); - void processCommands(bool runCommands); - - static uint32 calculateCommandSize(Common::SeekableReadStream *script); - DECLARE_OPCODE(empty) { warning ("Unknown Opcode %04x", op); } //Opcodes @@ -124,34 +182,25 @@ private: DECLARE_OPCODE(activateMLST); }; -typedef Common::Array RivenScriptList; - -class RivenScriptManager { +class RivenSwitchCommand : public RivenCommand { public: - RivenScriptManager(MohawkEngine_Riven *vm); - ~RivenScriptManager(); + static RivenSwitchCommand *createFromStream(MohawkEngine_Riven *vm, int type, Common::ReadStream *stream); + virtual ~RivenSwitchCommand(); - RivenScriptList readScripts(Common::SeekableReadStream *stream, bool garbageCollect = true); - void stopAllScripts(); - - struct StoredMovieOpcode { - RivenScript *script; - uint32 time; - uint16 id; - }; - - uint16 getStoredMovieOpcodeID() { return _storedMovieOpcode.id; } - uint32 getStoredMovieOpcodeTime() { return _storedMovieOpcode.time; } - void setStoredMovieOpcode(const StoredMovieOpcode &op); - void runStoredMovieOpcode(); - void clearStoredMovieOpcode(); + // RivenCommand API + virtual void dump(const Common::StringArray &varNames, const Common::StringArray &xNames, byte tabs) override; + virtual void execute() override; private: - void unloadUnusedScripts(); - RivenScriptList _currentScripts; - MohawkEngine_Riven *_vm; + RivenSwitchCommand(MohawkEngine_Riven *vm); - StoredMovieOpcode _storedMovieOpcode; + struct Branch { + uint16 value; + RivenScriptPtr script; + }; + + uint16 _variableId; + Common::Array _branches; }; } // End of namespace Mohawk -- cgit v1.2.3