diff options
author | Johannes Schickel | 2006-05-21 15:41:32 +0000 |
---|---|---|
committer | Johannes Schickel | 2006-05-21 15:41:32 +0000 |
commit | ef6645c5ba9d87e888516df457e4d72cf9b0a2cf (patch) | |
tree | f2a56cc8f26851a7acb5fb9dcf85daebeaf77ed1 /engines | |
parent | c47dadeb1f385df7d8f411f9a2a8c7c26450f739 (diff) | |
download | scummvm-rg350-ef6645c5ba9d87e888516df457e4d72cf9b0a2cf.tar.gz scummvm-rg350-ef6645c5ba9d87e888516df457e4d72cf9b0a2cf.tar.bz2 scummvm-rg350-ef6645c5ba9d87e888516df457e4d72cf9b0a2cf.zip |
- reworks quit handling (no _system->quit() anymore)
- fixes some deinitalization problems
svn-id: r22558
Diffstat (limited to 'engines')
-rw-r--r-- | engines/kyra/gui.cpp | 12 | ||||
-rw-r--r-- | engines/kyra/kyra.cpp | 48 | ||||
-rw-r--r-- | engines/kyra/kyra.h | 2 | ||||
-rw-r--r-- | engines/kyra/script.cpp | 5 | ||||
-rw-r--r-- | engines/kyra/seqplayer.cpp | 2 | ||||
-rw-r--r-- | engines/kyra/sequences_v1.cpp | 1 | ||||
-rw-r--r-- | engines/kyra/text.cpp | 1 | ||||
-rw-r--r-- | engines/kyra/vqa.cpp | 2 |
8 files changed, 43 insertions, 30 deletions
diff --git a/engines/kyra/gui.cpp b/engines/kyra/gui.cpp index c1ac512922..0e2ac3b076 100644 --- a/engines/kyra/gui.cpp +++ b/engines/kyra/gui.cpp @@ -529,7 +529,7 @@ int KyraEngine::buttonMenuCallback(Button *caller) { processAllMenuButtons(); } - while (_displayMenu) { + while (_displayMenu && !_quitFlag) { gui_processHighlights(_menu[_toplevelMenu]); processButtonList(_menuButtonList); gui_getInput(); @@ -830,7 +830,7 @@ int KyraEngine::gui_saveGameMenu(Button *button) { _displaySubMenu = true; _cancelSubMenu = false; - while (_displaySubMenu) { + while (_displaySubMenu && !_quitFlag) { gui_getInput(); gui_processHighlights(_menu[2]); processButtonList(_menuButtonList); @@ -874,7 +874,7 @@ int KyraEngine::gui_loadGameMenu(Button *button) { _displaySubMenu = true; _cancelSubMenu = false; - while (_displaySubMenu) { + while (_displaySubMenu && !_quitFlag) { gui_getInput(); gui_processHighlights(_menu[2]); processButtonList(_menuButtonList); @@ -958,7 +958,7 @@ int KyraEngine::gui_saveGame(Button *button) { } gui_redrawTextfield(); - while (_displaySubMenu) { + while (_displaySubMenu && !_quitFlag) { gui_getInput(); gui_updateSavegameString(); gui_processHighlights(_menu[3]); @@ -1032,7 +1032,7 @@ bool KyraEngine::gui_quitConfirm(const char *str) { _displaySubMenu = true; _cancelSubMenu = true; - while (_displaySubMenu) { + while (_displaySubMenu && !_quitFlag) { gui_getInput(); gui_processHighlights(_menu[1]); processButtonList(_menuButtonList); @@ -1096,7 +1096,7 @@ int KyraEngine::gui_gameControlsMenu(Button *button) { _displaySubMenu = true; _cancelSubMenu = false; - while (_displaySubMenu) { + while (_displaySubMenu && !_quitFlag) { gui_getInput(); gui_processHighlights(_menu[5]); processButtonList(_menuButtonList); diff --git a/engines/kyra/kyra.cpp b/engines/kyra/kyra.cpp index f79d6d45a1..f761efbe30 100644 --- a/engines/kyra/kyra.cpp +++ b/engines/kyra/kyra.cpp @@ -92,6 +92,11 @@ KyraEngine::KyraEngine(OSystem *system) _characterList = 0; _movFacingTable = 0; memset(_shapes, 0, sizeof(_shapes)); + memset(_movieObjects, 0, sizeof(_movieObjects)); + _finalA = _finalB = _finalC = 0; + _endSequenceBackUpRect = 0; + memset(_panPagesTable, 0, sizeof(_panPagesTable)); + _npcScriptData = _scriptClickData = 0; _scrollUpButton.process0PtrShape = _scrollUpButton.process1PtrShape = _scrollUpButton.process2PtrShape = 0; _scrollDownButton.process0PtrShape = _scrollDownButton.process1PtrShape = _scrollDownButton.process2PtrShape = 0; memset(_sceneAnimTable, 0, sizeof(_sceneAnimTable)); @@ -99,11 +104,11 @@ KyraEngine::KyraEngine(OSystem *system) } KyraEngine_v1::KyraEngine_v1(OSystem *system) - :KyraEngine(system) { + : KyraEngine(system) { } KyraEngine_v2::KyraEngine_v2(OSystem *system) - :KyraEngine(system) { + : KyraEngine(system) { } int KyraEngine::init() { @@ -320,6 +325,21 @@ int KyraEngine::init() { } KyraEngine::~KyraEngine() { + for (int i = 0; i < ARRAYSIZE(_movieObjects); ++i) { + if (_movieObjects[i]) + _movieObjects[i]->close(); + delete _movieObjects[i]; + _movieObjects[i] = 0; + } + + closeFinalWsa(); + if (_scriptInterpreter) { + _scriptInterpreter->unloadScript(_npcScriptData); + _scriptInterpreter->unloadScript(_scriptClickData); + } + + Common::clearAllSpecialDebugLevels(); + delete _debugger; delete _sprites; delete _animator; @@ -351,12 +371,12 @@ KyraEngine::~KyraEngine() { for (int i = 0; i < ARRAYSIZE(_shapes); ++i) { if (_shapes[i] != 0) { free(_shapes[i]); - _shapes[i] = 0; for (int i2 = 0; i2 < ARRAYSIZE(_shapes); i2++) { if (_shapes[i2] == _shapes[i] && i2 != i) { _shapes[i2] = 0; } } + _shapes[i] = 0; } } for (int i = 0; i < ARRAYSIZE(_sceneAnimTable); ++i) { @@ -396,13 +416,14 @@ int KyraEngine::go() { setGameFlag(0xFD); setGameFlag(0xEF); seq_intro(); + if (_quitFlag) + return 0; if (_skipIntroFlag && _abortIntroFlag) resetGameFlag(0xEF); startup(); resetGameFlag(0xEF); mainLoop(); } - quitGame(); // FIXME: You shouldn't quit here, just return to the caller! return 0; } @@ -413,7 +434,6 @@ int KyraEngine_v2::go() { loadBitmap("_playfld.cps", 0, 0, 0); _screen->updateScreen(); waitForEvent(); - _system->quit(); return 0; } @@ -549,23 +569,9 @@ void KyraEngine::mainLoop() { } void KyraEngine::quitGame() { - // FIXME: The code of this method should probably be moved to the destructor. debugC(9, kDebugLevelMain, "KyraEngine::quitGame()"); - - for (int i = 0; i < ARRAYSIZE(_movieObjects); ++i) { - _movieObjects[i]->close(); - delete _movieObjects[i]; - _movieObjects[i] = 0; - } - - closeFinalWsa(); - _scriptInterpreter->unloadScript(_npcScriptData); - _scriptInterpreter->unloadScript(_scriptClickData); - - Common::clearAllSpecialDebugLevels(); - - // FIXME: Do not use OSystem::quit() unless you have to ! - _system->quit(); + _quitFlag = true; + // Nothing to do here } void KyraEngine::delayUntil(uint32 timestamp, bool updateTimers, bool update, bool isMainLoop) { diff --git a/engines/kyra/kyra.h b/engines/kyra/kyra.h index 6c03bbeccd..cf30b20c3a 100644 --- a/engines/kyra/kyra.h +++ b/engines/kyra/kyra.h @@ -271,6 +271,8 @@ public: Character *currentCharacter() { return _currentCharacter; } Character *characterList() { return _characterList; } uint16 brandonStatus() { return _brandonStatusBit; } + + bool quit() const { return _quitFlag; } int _paletteChanged; Common::RandomSource _rnd; diff --git a/engines/kyra/script.cpp b/engines/kyra/script.cpp index 2de0668e82..38bfa908a1 100644 --- a/engines/kyra/script.cpp +++ b/engines/kyra/script.cpp @@ -157,6 +157,9 @@ bool ScriptHelper::loadScript(const char *filename, ScriptData *scriptData, Kyra } void ScriptHelper::unloadScript(ScriptData *data) { + if (!data) + return; + if (data->mustBeFreed) { delete [] data->text; delete [] data->ordr; @@ -188,7 +191,7 @@ bool ScriptHelper::startScript(ScriptState *script, int function) { } bool ScriptHelper::validScript(ScriptState *script) { - if (!script->ip || !script->dataPtr) + if (!script->ip || !script->dataPtr || _vm->quit()) return false; return true; } diff --git a/engines/kyra/seqplayer.cpp b/engines/kyra/seqplayer.cpp index a883f4cd70..c9416bf3e7 100644 --- a/engines/kyra/seqplayer.cpp +++ b/engines/kyra/seqplayer.cpp @@ -595,7 +595,7 @@ bool SeqPlayer::playSequence(const uint8 *seqData, bool skipSeq) { memset(_seqMovies, 0, sizeof(_seqMovies)); _screen->_curPage = 0; - while (!_seqQuitFlag) { + while (!_seqQuitFlag && !_vm->quit()) { if (skipSeq && _vm->seq_skipSequence()) { while (1) { uint8 code = *_seqData; diff --git a/engines/kyra/sequences_v1.cpp b/engines/kyra/sequences_v1.cpp index 08bb75b89f..ec735b5f60 100644 --- a/engines/kyra/sequences_v1.cpp +++ b/engines/kyra/sequences_v1.cpp @@ -1131,6 +1131,7 @@ void KyraEngine::seq_playCredits() { break; case OSystem::EVENT_QUIT: quitGame(); + finished = true; break; default: break; diff --git a/engines/kyra/text.cpp b/engines/kyra/text.cpp index 7288b27037..8a84bbe909 100644 --- a/engines/kyra/text.cpp +++ b/engines/kyra/text.cpp @@ -114,6 +114,7 @@ void KyraEngine::waitForChatToFinish(int16 chatDuration, const char *chatStr, ui break; case OSystem::EVENT_QUIT: quitGame(); + runLoop = false; break; case OSystem::EVENT_LBUTTONDOWN: runLoop = false; diff --git a/engines/kyra/vqa.cpp b/engines/kyra/vqa.cpp index b7e3e780db..a794368391 100644 --- a/engines/kyra/vqa.cpp +++ b/engines/kyra/vqa.cpp @@ -703,7 +703,7 @@ void VQAMovie::play() { break; case OSystem::EVENT_QUIT: _vm->quitGame(); - break; + return; default: break; } |