[Scummvm-cvs-logs] scummvm master -> 3a5b3a514559d952bc0bf6e0bccbf900aa291930

clone2727 clone2727 at gmail.com
Sun Sep 23 03:04:53 CEST 2012


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
3a5b3a5145 PEGASUS: Fix saving while in the space chase


Commit: 3a5b3a514559d952bc0bf6e0bccbf900aa291930
    https://github.com/scummvm/scummvm/commit/3a5b3a514559d952bc0bf6e0bccbf900aa291930
Author: Matthew Hoops (clone2727 at gmail.com)
Date: 2012-09-22T18:03:22-07:00

Commit Message:
PEGASUS: Fix saving while in the space chase

Changed paths:
    engines/pegasus/pegasus.cpp
    engines/pegasus/pegasus.h



diff --git a/engines/pegasus/pegasus.cpp b/engines/pegasus/pegasus.cpp
index 4b1d7d7..29aa8a4 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 d197e9b..b43000a 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();






More information about the Scummvm-git-logs mailing list