diff options
| -rw-r--r-- | engines/pegasus/pegasus.cpp | 31 | ||||
| -rw-r--r-- | engines/pegasus/pegasus.h | 3 | 
2 files changed, 33 insertions, 1 deletions
diff --git a/engines/pegasus/pegasus.cpp b/engines/pegasus/pegasus.cpp index 4b1d7d73ae..29aa8a440b 100644 --- a/engines/pegasus/pegasus.cpp +++ b/engines/pegasus/pegasus.cpp @@ -527,6 +527,20 @@ bool PegasusEngine::loadFromStream(Common::ReadStream *stream) {  }  bool PegasusEngine::writeToStream(Common::WriteStream *stream, int saveType) { +	// WORKAROUND: If we don't have the interface, we can't actually save. +	// However, we should still have a continue point, so we will just dump that +	// out. This is needed for saving a game while in the space chase. +	if (!g_interface) { +		// Saving a continue stream from a continue stream should +		// never happen. In addition, we do need to have a continue +		// stream for this to work. +		if (saveType != kNormalSave || !_continuePoint) +			return false; + +		writeContinueStream(stream); +		return true; +	} +  	if (g_neighborhood)  		g_neighborhood->flushGameState(); @@ -602,10 +616,27 @@ void PegasusEngine::loadFromContinuePoint() {  	if (!_continuePoint)  		error("Attempting to load from non-existant continue point"); +	_continuePoint->seek(0); +  	if (!loadFromStream(_continuePoint))  		error("Failed loading continue point");  } +void PegasusEngine::writeContinueStream(Common::WriteStream *stream) { +	// We're going to pretty much copy the stream, except for the save type +	_continuePoint->seek(0); +	stream->writeUint32BE(_continuePoint->readUint32BE()); +	_continuePoint->readUint32BE(); // skip the continue type +	stream->writeUint32BE(kPegasusPrimeDisk1GameType + _currentCD - 1); + +	// Now just copy over the rest +	uint32 size = _continuePoint->size() - _continuePoint->pos(); +	byte *data = new byte[size]; +	_continuePoint->read(data, size); +	stream->write(data, size); +	delete[] data; +} +  Common::Error PegasusEngine::loadGameState(int slot) {  	Common::StringArray filenames = _saveFileMan->listSavefiles("pegasus-*.sav");  	Common::InSaveFile *loadFile = _saveFileMan->openForLoading(filenames[slot]); diff --git a/engines/pegasus/pegasus.h b/engines/pegasus/pegasus.h index d197e9b988..b43000a45e 100644 --- a/engines/pegasus/pegasus.h +++ b/engines/pegasus/pegasus.h @@ -246,7 +246,8 @@ private:  	bool loadFromStream(Common::ReadStream *stream);  	bool writeToStream(Common::WriteStream *stream, int saveType);  	void loadFromContinuePoint(); -	Common::ReadStream *_continuePoint; +	void writeContinueStream(Common::WriteStream *stream); +	Common::SeekableReadStream *_continuePoint;  	bool _saveAllowed, _loadAllowed; // It's so nice that this was in the original code already :P  	Common::Error showLoadDialog();  	Common::Error showSaveDialog();  | 
