diff --git a/engines/pegasus/pegasus.cpp b/engines/pegasus/pegasus.cpp index 4b1d7d73aee7..29aa8a440b73 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 d197e9b98830..b43000a45eff 100644 --- a/engines/pegasus/pegasus.h +++ b/engines/pegasus/pegasus.h @@ -246,7 +246,8 @@ friend class InputHandler; 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();