diff options
| author | Max Horn | 2009-03-16 04:45:12 +0000 | 
|---|---|---|
| committer | Max Horn | 2009-03-16 04:45:12 +0000 | 
| commit | e44f07f988ee6a2a7574a42169d08b3d7a112eba (patch) | |
| tree | 56ba5688d855def4850a890029ef1805db9cc576 /engines/scumm/saveload.cpp | |
| parent | ffa97e6626e43adf9c94de9a7322138e46436af4 (diff) | |
| download | scummvm-rg350-e44f07f988ee6a2a7574a42169d08b3d7a112eba.tar.gz scummvm-rg350-e44f07f988ee6a2a7574a42169d08b3d7a112eba.tar.bz2 scummvm-rg350-e44f07f988ee6a2a7574a42169d08b3d7a112eba.zip | |
SCUMM: Modified version of patch #1687041 (Scumm: Load-/Save-support for the original save-dialog)
svn-id: r39438
Diffstat (limited to 'engines/scumm/saveload.cpp')
| -rw-r--r-- | engines/scumm/saveload.cpp | 124 | 
1 files changed, 112 insertions, 12 deletions
| diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp index 577c465bdd..55880766d9 100644 --- a/engines/scumm/saveload.cpp +++ b/engines/scumm/saveload.cpp @@ -28,6 +28,7 @@  #include "common/config-manager.h"  #include "common/savefile.h"  #include "common/system.h" +#include "common/zlib.h"  #include "scumm/actor.h"  #include "scumm/charset.h" @@ -129,10 +130,27 @@ static bool saveSaveGameHeader(Common::OutSaveFile *out, SaveGameHeader &hdr) {  	return true;  } +bool ScummEngine::saveState(Common::OutSaveFile *out, bool writeHeader) { +	SaveGameHeader hdr; + +	if (writeHeader) { +		memcpy(hdr.name, _saveLoadName, sizeof(hdr.name)); +		saveSaveGameHeader(out, hdr); +	} +#if !defined(__DS__) +	Graphics::saveThumbnail(*out); +#endif +	saveInfos(out); + +	Serializer ser(0, out, CURRENT_VER); +	saveOrLoad(&ser); +	return true; +} +  bool ScummEngine::saveState(int slot, bool compat) { +	bool saveFailed;  	Common::String filename;  	Common::OutSaveFile *out; -	SaveGameHeader hdr;  	if (_saveLoadSlot == 255) {  		// Allow custom filenames for save game system in HE Games @@ -143,26 +161,108 @@ bool ScummEngine::saveState(int slot, bool compat) {  	if (!(out = _saveFileMan->openForSaving(filename.c_str())))  		return false; -	memcpy(hdr.name, _saveLoadName, sizeof(hdr.name)); -	saveSaveGameHeader(out, hdr); -#if !defined(__DS__) -	Graphics::saveThumbnail(*out); -#endif -	saveInfos(out); +	saveFailed = false; +	if (!saveState(out)) +		saveFailed = true; -	Serializer ser(0, out, CURRENT_VER); -	saveOrLoad(&ser);  	out->finalize(); -	if (out->err()) { -		delete out; +	if (out->err()) +		saveFailed = true; +	delete out; + +	if (saveFailed) {  		debug(1, "State save as '%s' FAILED", filename.c_str());  		return false;  	} -	delete out;  	debug(1, "State saved as '%s'", filename.c_str());  	return true;  } + +void ScummEngine_v3::prepareSavegame() { +	Common::MemoryWriteStreamDynamic *memStream; +	Common::WriteStream *writeStream; + +	// free memory of the last prepared savegame +	delete _savePreparedSavegame; +	_savePreparedSavegame = NULL; + +	// store headerless savegame in a compressed memory stream +	memStream = new Common::MemoryWriteStreamDynamic(); +	writeStream = Common::wrapCompressedWriteStream(memStream); +	if (saveState(writeStream, false)) { +		// we have to finalize the compression-stream first, otherwise the internal +		// memory-stream pointer will be zero (Important: flush() does not work here!). +		writeStream->finalize(); +		if (!writeStream->err()) { +			// wrap uncompressing MemoryReadStream around the savegame data +			_savePreparedSavegame = Common::wrapCompressedReadStream( +				new Common::MemoryReadStream(memStream->getData(), memStream->size(), true)); +		} +	} +	// free the CompressedWriteStream and MemoryWriteStreamDynamic +	// but not the memory stream's internal buffer +	delete writeStream; +} + +bool ScummEngine_v3::savePreparedSavegame(int slot, char *desc) { +	bool success; +	Common::String filename; +	Common::OutSaveFile *out; +	SaveGameHeader hdr; +	uint32 nread, nwritten; + +	out = 0; +	success = true; + +	// check if savegame was successfully stored in memory +	if (!_savePreparedSavegame) +		success = false; + +	// open savegame file +	if (success) { +		filename = makeSavegameName(slot, false); +		if (!(out = _saveFileMan->openForSaving(filename.c_str()))) { +			success = false; +		} +	} + +	// write header to file +	if (success) { +		memset(hdr.name, 0, sizeof(hdr.name)); +		strncpy(hdr.name, desc, sizeof(hdr.name)-1); +		success = saveSaveGameHeader(out, hdr); +	} + +	// copy savegame from memory-stream to file +	if (success) { +		_savePreparedSavegame->seek(0, SEEK_SET); +		byte buffer[1024]; +		while ((nread = _savePreparedSavegame->read(buffer, sizeof(buffer)))) { +			nwritten = out->write(buffer, nread); +			if (nwritten < nread) { +				success = false; +				break; +			} +		} +	} + +	if (out) { +		out->finalize(); +		if (out->err()) +			success = false; +		delete out; +	} + +	if (!success) { +		debug(1, "State save as '%s' FAILED", filename.c_str()); +		return false; +	} else { +		debug(1, "State saved as '%s'", filename.c_str()); +		return true; +	} +} +  static bool loadSaveGameHeader(Common::SeekableReadStream *in, SaveGameHeader &hdr) {  	hdr.type = in->readUint32BE();  	hdr.size = in->readUint32LE(); | 
