diff options
author | Bastien Bouclet | 2018-07-13 19:31:56 +0200 |
---|---|---|
committer | Bastien Bouclet | 2018-07-13 19:44:48 +0200 |
commit | d91ac014195dea06e42daa7351c9a3844ef34aec (patch) | |
tree | 8e8c2bd56b169f8f1f1970a48b1b43320954b302 /engines/mohawk | |
parent | 788574e751f89096ba580306818e5d999db9c016 (diff) | |
download | scummvm-rg350-d91ac014195dea06e42daa7351c9a3844ef34aec.tar.gz scummvm-rg350-d91ac014195dea06e42daa7351c9a3844ef34aec.tar.bz2 scummvm-rg350-d91ac014195dea06e42daa7351c9a3844ef34aec.zip |
MOHAWK: RIVEN: Queue opening and closing the main menu as scripts
This way all the other actions are blocked while the card load scripts
are executed. Expecially, it's not possible anymore to open the main
menu while the scripts for returning from the main menu are still
executing.
Fixes Trac#10628.
Diffstat (limited to 'engines/mohawk')
-rw-r--r-- | engines/mohawk/riven.cpp | 11 | ||||
-rw-r--r-- | engines/mohawk/riven_inventory.cpp | 2 | ||||
-rw-r--r-- | engines/mohawk/riven_scripts.cpp | 17 | ||||
-rw-r--r-- | engines/mohawk/riven_scripts.h | 4 | ||||
-rw-r--r-- | engines/mohawk/riven_stacks/aspit.cpp | 2 | ||||
-rw-r--r-- | engines/mohawk/riven_stacks/ospit.cpp | 2 |
6 files changed, 26 insertions, 12 deletions
diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index 5d02317ec0..77d52f9aa5 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -341,15 +341,18 @@ void MohawkEngine_Riven::goToMainMenu() { _menuTumbnail.reset(new Graphics::Surface()); createThumbnailFromScreen(_menuTumbnail.get()); - changeToStack(kStackAspit); - changeToCard(1); + RivenCommand *go = new RivenStackChangeCommand(this, kStackAspit, 1, true, true); + RivenScriptPtr goScript = _scriptMan->createScriptWithCommand(go); + _scriptMan->runScript(goScript, true); } void MohawkEngine_Riven::resumeFromMainMenu() { assert(_menuSavedStack != -1); - changeToStack(_menuSavedStack); - changeToCard(_menuSavedCard); + RivenCommand *resume = new RivenStackChangeCommand(this, _menuSavedStack, _menuSavedCard, true, true); + RivenScriptPtr resumeScript = _scriptMan->createScriptWithCommand(resume); + _scriptMan->runScript(resumeScript, true); + _menuSavedStack = -1; _menuSavedCard = -1; _menuTumbnail.reset(); diff --git a/engines/mohawk/riven_inventory.cpp b/engines/mohawk/riven_inventory.cpp index b4304eceec..7479080685 100644 --- a/engines/mohawk/riven_inventory.cpp +++ b/engines/mohawk/riven_inventory.cpp @@ -167,7 +167,7 @@ void RivenInventory::backFromItemScript() const { uint32 backCardId = _vm->_vars["returncardid"]; // Return to where we were before entering the book - RivenCommand *back = new RivenStackChangeCommand(_vm, backStackId, backCardId, true); + RivenCommand *back = new RivenStackChangeCommand(_vm, backStackId, backCardId, true, false); RivenScriptPtr backScript = _vm->_scriptMan->createScriptWithCommand(back); _vm->_scriptMan->runScript(backScript, true); } diff --git a/engines/mohawk/riven_scripts.cpp b/engines/mohawk/riven_scripts.cpp index 3547302c88..a59850f1ee 100644 --- a/engines/mohawk/riven_scripts.cpp +++ b/engines/mohawk/riven_scripts.cpp @@ -918,11 +918,13 @@ void RivenSwitchCommand::applyCardPatches(uint32 globalId, int scriptType, uint1 } } -RivenStackChangeCommand::RivenStackChangeCommand(MohawkEngine_Riven *vm, uint16 stackId, uint32 globalCardId, bool byStackId) : +RivenStackChangeCommand::RivenStackChangeCommand(MohawkEngine_Riven *vm, uint16 stackId, uint32 globalCardId, + bool byStackId, bool byStackCardId) : RivenCommand(vm), _stackId(stackId), _cardId(globalCardId), - _byStackId(byStackId) { + _byStackId(byStackId), + _byStackCardId(byStackCardId) { } @@ -935,7 +937,7 @@ RivenStackChangeCommand *RivenStackChangeCommand::createFromStream(MohawkEngine_ uint16 stackId = stream->readUint16BE(); uint32 globalCardId = stream->readUint32BE(); - return new RivenStackChangeCommand(vm, stackId, globalCardId, false); + return new RivenStackChangeCommand(vm, stackId, globalCardId, false, false); } void RivenStackChangeCommand::execute() { @@ -954,7 +956,14 @@ void RivenStackChangeCommand::execute() { } _vm->changeToStack(stackID); - uint16 cardID = _vm->getStack()->getCardStackId(_cardId); + + uint16 cardID; + if (_byStackCardId) { + cardID = _cardId; + } else { + cardID = _vm->getStack()->getCardStackId(_cardId); + } + _vm->changeToCard(cardID); } diff --git a/engines/mohawk/riven_scripts.h b/engines/mohawk/riven_scripts.h index 423434fe59..c7c49805b1 100644 --- a/engines/mohawk/riven_scripts.h +++ b/engines/mohawk/riven_scripts.h @@ -387,7 +387,8 @@ private: */ class RivenStackChangeCommand : public RivenCommand { public: - RivenStackChangeCommand(MohawkEngine_Riven *vm, uint16 stackId, uint32 globalCardId, bool byStackId); + RivenStackChangeCommand(MohawkEngine_Riven *vm, uint16 stackId, uint32 globalCardId, + bool byStackId, bool byStackCardId); static RivenStackChangeCommand *createFromStream(MohawkEngine_Riven *vm, Common::ReadStream *stream); virtual ~RivenStackChangeCommand(); @@ -401,6 +402,7 @@ private: uint16 _stackId; uint32 _cardId; bool _byStackId; // Otherwise by stack name id + bool _byStackCardId; // Otherwise by global card id }; /** diff --git a/engines/mohawk/riven_stacks/aspit.cpp b/engines/mohawk/riven_stacks/aspit.cpp index a94b454257..59cc3b9912 100644 --- a/engines/mohawk/riven_stacks/aspit.cpp +++ b/engines/mohawk/riven_stacks/aspit.cpp @@ -424,7 +424,7 @@ void ASpit::xaNewGame(const ArgumentArray &args) { kRivenCommandTransition, 1, kRivenTransitionBlend, kRivenCommandChangeCard, 1, 2); - script->addCommand(RivenCommandPtr(new RivenStackChangeCommand(_vm, 0, 0x6E9A, false))); + script->addCommand(RivenCommandPtr(new RivenStackChangeCommand(_vm, 0, 0x6E9A, false, false))); script += _vm->_scriptMan->createScriptFromData(1, kRivenCommandStopSound, 1, 2); diff --git a/engines/mohawk/riven_stacks/ospit.cpp b/engines/mohawk/riven_stacks/ospit.cpp index d939beacba..f44bc0d8ac 100644 --- a/engines/mohawk/riven_stacks/ospit.cpp +++ b/engines/mohawk/riven_stacks/ospit.cpp @@ -51,7 +51,7 @@ void OSpit::xorollcredittime(const ArgumentArray &args) { // we should be using the Tay end game sequences. if (_vm->_vars["returnstackid"] == kStackRspit) { RivenScriptPtr script = _vm->_scriptMan->createScriptWithCommand( - new RivenStackChangeCommand(_vm, kStackRspit, 0x3338, true)); + new RivenStackChangeCommand(_vm, kStackRspit, 0x3338, true, false)); _vm->_scriptMan->runScript(script, false); return; } |