diff options
| -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;  				} | 
