diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/draci/draci.cpp | 11 | ||||
-rw-r--r-- | engines/draci/game.cpp | 10 | ||||
-rw-r--r-- | engines/draci/script.cpp | 22 | ||||
-rw-r--r-- | engines/draci/script.h | 7 |
4 files changed, 31 insertions, 19 deletions
diff --git a/engines/draci/draci.cpp b/engines/draci/draci.cpp index 4b93e02ab6..e32a239f94 100644 --- a/engines/draci/draci.cpp +++ b/engines/draci/draci.cpp @@ -231,6 +231,12 @@ void DraciEngine::handleEvents() { _game->scheduleEnteringRoomUsingGate(_game->prevRoomNum(), 0); break; case Common::KEYCODE_ESCAPE: { + if (_game->getLoopStatus() == kStatusInventory && + _game->getLoopSubstatus() == kSubstatusOrdinary) { + _game->inventoryDone(); + break; + } + const int escRoom = _game->getRoomNum() != _game->getMapRoom() ? _game->getEscRoom() : _game->getPreviousRoomNum(); @@ -243,7 +249,7 @@ void DraciEngine::handleEvents() { _game->setExitLoop(true); // End any currently running GPL programs - _script->endCurrentProgram(); + _script->endCurrentProgram(true); } break; } @@ -259,6 +265,9 @@ void DraciEngine::handleEvents() { _showWalkingMap = !_showWalkingMap; break; case Common::KEYCODE_i: + if (_game->getRoomNum() == _game->getMapRoom()) { + break; + } if (_game->getLoopStatus() == kStatusInventory && _game->getLoopSubstatus() == kSubstatusOrdinary) { _game->inventoryDone(); diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp index da94c261d3..f771c564f0 100644 --- a/engines/draci/game.cpp +++ b/engines/draci/game.cpp @@ -144,13 +144,19 @@ void Game::start() { while (!shouldQuit()) { debugC(1, kDraciGeneralDebugLevel, "Game::start()"); - const bool force_reload = shouldExitLoop() > 1; - // Whenever the top-level loop is entered, it should not finish unless // the exit is triggered by a script _shouldExitLoop = false; + _vm->_script->endCurrentProgram(false); + const bool force_reload = shouldExitLoop() > 1; enterNewRoom(force_reload); + + if (_vm->_script->shouldEndProgram()) { + // Room changed during the initialization (intro or Escape pressed). + continue; + } + loop(); } } diff --git a/engines/draci/script.cpp b/engines/draci/script.cpp index 1809695d5b..e5dc28e705 100644 --- a/engines/draci/script.cpp +++ b/engines/draci/script.cpp @@ -850,10 +850,6 @@ void Script::setPalette(Common::Queue<int> ¶ms) { } } -void Script::endCurrentProgram() { - _endProgram = true; -} - void Script::quitGame(Common::Queue<int> ¶ms) { _vm->_game->setQuit(true); } @@ -1057,7 +1053,14 @@ const GPL2Command *Script::findCommand(byte num, byte subnum) const { * value comes from. */ -int Script::run(const GPL2Program &program, uint16 offset) { +void Script::run(const GPL2Program &program, uint16 offset) { + if (shouldEndProgram()) { + // This might get set by some GPL commands via Script::endCurrentProgram() + // if they need a program to stop midway. This flag is sticky until cleared + // at the top level. + return; + } + int oldJump = _jump; // Mark the last animation index before we do anything so a Release command @@ -1108,10 +1111,6 @@ int Script::run(const GPL2Program &program, uint16 offset) { // extract low byte, i.e. the command subnumber byte subnum = cmdpair & 0xFF; - // This might get set by some GPL commands via Script::endCurrentProgram() - // if they need a program to stop midway - _endProgram = false; - if ((cmd = findCommand(num, subnum))) { int tmp; @@ -1142,12 +1141,9 @@ int Script::run(const GPL2Program &program, uint16 offset) { (this->*(cmd->_handler))(params); } - } while (cmd->_number != 0 && !_endProgram); // 0 = gplend and exit + } while (cmd->_number != 0 && !shouldEndProgram()); // 0 = gplend and exit - _endProgram = false; _jump = oldJump; - - return 0; } } // End of namespace Draci diff --git a/engines/draci/script.h b/engines/draci/script.h index 3476dd1116..1073f2c290 100644 --- a/engines/draci/script.h +++ b/engines/draci/script.h @@ -89,11 +89,12 @@ struct GameObject; class Script { public: - Script(DraciEngine *vm) : _vm(vm), _jump(0) { setupCommandList(); }; + Script(DraciEngine *vm) : _vm(vm), _jump(0), _endProgram(false) { setupCommandList(); }; - int run(const GPL2Program &program, uint16 offset); + void run(const GPL2Program &program, uint16 offset); bool testExpression(const GPL2Program &program, uint16 offset) const; - void endCurrentProgram(); + void endCurrentProgram(bool value) { _endProgram = value; } + bool shouldEndProgram() const { return _endProgram; } private: int _jump; |