aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorJohannes Schickel2006-05-21 15:41:32 +0000
committerJohannes Schickel2006-05-21 15:41:32 +0000
commitef6645c5ba9d87e888516df457e4d72cf9b0a2cf (patch)
treef2a56cc8f26851a7acb5fb9dcf85daebeaf77ed1 /engines
parentc47dadeb1f385df7d8f411f9a2a8c7c26450f739 (diff)
downloadscummvm-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.cpp12
-rw-r--r--engines/kyra/kyra.cpp48
-rw-r--r--engines/kyra/kyra.h2
-rw-r--r--engines/kyra/script.cpp5
-rw-r--r--engines/kyra/seqplayer.cpp2
-rw-r--r--engines/kyra/sequences_v1.cpp1
-rw-r--r--engines/kyra/text.cpp1
-rw-r--r--engines/kyra/vqa.cpp2
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;
}