diff options
| -rw-r--r-- | engines/sci/console.cpp | 15 | ||||
| -rw-r--r-- | engines/sci/detection.cpp | 10 | ||||
| -rw-r--r-- | engines/sci/engine/kfile.cpp | 10 | ||||
| -rw-r--r-- | engines/sci/engine/savegame.cpp | 25 | ||||
| -rw-r--r-- | engines/sci/engine/savegame.h | 3 | 
5 files changed, 18 insertions, 45 deletions
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 9d12d4386f..ab4d13e630 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -893,26 +893,17 @@ bool Console::cmdRestoreGame(int argc, const char **argv) {  		return true;  	} -	EngineState *newstate = NULL; -  	Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();  	Common::SeekableReadStream *in = saveFileMan->openForLoading(argv[1]);  	if (in) {  		// found a savegame file -		newstate = gamestate_restore(_vm->_gamestate, in); +		gamestate_restore(_vm->_gamestate, in);  		delete in;  	} -	if (newstate) { -		_vm->_gamestate->successor = newstate; // Set successor - -		script_abort_flag = 2; // Abort current game with replay - -		shrink_execution_stack(_vm->_gamestate, _vm->_gamestate->execution_stack_base + 1); -		return 0; -	} else { +	if (_vm->_gamestate->r_acc == make_reg(0, 1)) {  		DebugPrintf("Restoring gamestate '%s' failed.\n", argv[1]); -		return 1; +		return true;  	}  	return false; diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 30b5f00964..cfa81ed6e1 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -475,23 +475,17 @@ void SciMetaEngine::removeSaveState(const char *target, int slot) const {  }  Common::Error SciEngine::loadGameState(int slot) { -	EngineState *newstate = NULL;  	Common::String fileName = Common::String::printf("%s.%03d", _targetName.c_str(), slot);  	Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();  	Common::SeekableReadStream *in = saveFileMan->openForLoading(fileName);  	if (in) {  		// found a savegame file -		newstate = gamestate_restore(_gamestate, in); +		gamestate_restore(_gamestate, in);  		delete in;  	} -	if (newstate) { -		_gamestate->successor = newstate; // Set successor - -		script_abort_flag = 2; // Abort current game with replay - -		shrink_execution_stack(_gamestate, _gamestate->execution_stack_base + 1); +	if (_gamestate->r_acc != make_reg(0, 1)) {  		return Common::kNoError;  	} else {  		warning("Restoring gamestate '%s' failed", fileName.c_str()); diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 0860466d32..216a543aa8 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -618,17 +618,9 @@ reg_t kRestoreGame(EngineState *s, int argc, reg_t *argv) {  		if ((in = saveFileMan->openForLoading(filename))) {  			// found a savegame file -			EngineState *newstate = gamestate_restore(s, in); +			gamestate_restore(s, in);  			delete in; -			if (newstate) { -				s->successor = newstate; -				script_abort_flag = 2; // Abort current game with replay -				shrink_execution_stack(s, s->execution_stack_base + 1); -			} else { -				s->r_acc = make_reg(0, 1); -				warning("Restoring failed (game_id = '%s')", game_id.c_str()); -			}  			return s->r_acc;  		}  	} diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index f8eddcdaa2..bf0f11c3a6 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -903,28 +903,21 @@ static void reconstruct_sounds(EngineState *s) {  }  #endif -EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { +void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {  	EngineState *retval;  #ifdef USE_OLD_MUSIC_FUNCTIONS  	SongLibrary temp;  #endif -/* -	if (s->sound_server) { -		if ((s->sound_server->restore)(s, dirname)) { -			warning("Restoring failed for the sound subsystem"); -			return NULL; -		} -	} -*/ -  	SavegameMetadata meta;  	Common::Serializer ser(fh, 0);  	sync_SavegameMetadata(ser, meta); -	if (fh->eos()) -		return false; +	if (fh->eos()) { +		s->r_acc = make_reg(0, 1);	// signal failure +		return; +	}  	if ((meta.savegame_version < MINIMUM_SAVEGAME_VERSION) ||  	    (meta.savegame_version > CURRENT_SAVEGAME_VERSION)) { @@ -933,7 +926,8 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {  		else  			warning("Savegame version is %d- maximum supported is %0d", meta.savegame_version, CURRENT_SAVEGAME_VERSION); -		return NULL; +		s->r_acc = make_reg(0, 1);	// signal failure +		return;  	}  	if (meta.savegame_version >= 12) { @@ -1027,7 +1021,10 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {  	}  #endif -	return retval; + +	s->successor = retval; // Set successor +	script_abort_flag = 2; // Abort current game with replay +	shrink_execution_stack(s, s->execution_stack_base + 1);  }  bool get_savegame_metadata(Common::SeekableReadStream *stream, SavegameMetadata *meta) { diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h index a5828bbd8e..2df7c7836d 100644 --- a/engines/sci/engine/savegame.h +++ b/engines/sci/engine/savegame.h @@ -63,9 +63,8 @@ int gamestate_save(EngineState *s, Common::WriteStream *save, const char *savena   * Restores a game state from a directory.   * @param s			An older state from the same game   * @param dirname	The subdirectory to restore from - * @return NULL on failure, a pointer to a valid EngineState otherwise   */ -EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *save); +void gamestate_restore(EngineState *s, Common::SeekableReadStream *save);  /**   * Read the header from a savegame.  | 
