From 3a5b3a514559d952bc0bf6e0bccbf900aa291930 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 22 Sep 2012 21:03:22 -0400 Subject: PEGASUS: Fix saving while in the space chase --- engines/pegasus/pegasus.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'engines/pegasus/pegasus.cpp') 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]); -- cgit v1.2.3