[Scummvm-cvs-logs] SF.net SVN: scummvm:[53847] scummvm/trunk/engines/lastexpress/game

littleboy at users.sourceforge.net littleboy at users.sourceforge.net
Tue Oct 26 14:10:38 CEST 2010


Revision: 53847
          http://scummvm.svn.sourceforge.net/scummvm/?rev=53847&view=rev
Author:   littleboy
Date:     2010-10-26 12:10:38 +0000 (Tue, 26 Oct 2010)

Log Message:
-----------
LASTEXPRESS: Implement loading of savegame entry headers

Modified Paths:
--------------
    scummvm/trunk/engines/lastexpress/game/savegame.cpp
    scummvm/trunk/engines/lastexpress/game/savegame.h

Modified: scummvm/trunk/engines/lastexpress/game/savegame.cpp
===================================================================
--- scummvm/trunk/engines/lastexpress/game/savegame.cpp	2010-10-26 12:09:38 UTC (rev 53846)
+++ scummvm/trunk/engines/lastexpress/game/savegame.cpp	2010-10-26 12:10:38 UTC (rev 53847)
@@ -101,7 +101,7 @@
 uint32 SaveLoad::init(GameId id, bool resetHeaders) {
 	initStream();
 
-	// Open savegame
+	// Open savegame and check size
 	Common::InSaveFile *save = openForLoading(id);
 	if (save->size() < 32)
 		error("SaveLoad::init - Savegame seems to be corrupted (not enough data: %i bytes)", save->size());
@@ -111,7 +111,7 @@
 		_savegame->writeByte(save->readByte());
 	_savegame->seek(0);
 
-	delete save;
+	SAFE_DELETE(save);
 
 	// Load the main header
 	Common::Serializer ser(_savegame, NULL);
@@ -131,10 +131,27 @@
 		_gameHeaders.push_back(entryHeader);
 	}
 
-	warning("SaveLoad::initSavegame: not implemented!");
+	// Read the list of entry headers
+	if (_savegame->size() > 32) {
+		while (!_savegame->eos() && !_savegame->err()) {
 
+			// Update sound queue while we go through the savegame
+			getSound()->updateQueue();
+
+			SavegameEntryHeader *entry = new SavegameEntryHeader();
+			entry->saveLoadWithSerializer(ser);
+
+			if (!entry->isValid())
+				break;
+
+			_gameHeaders.push_back(entry);
+
+			_savegame->seek(entry->offset, SEEK_CUR);
+		}
+	}
+
 	// return the index to the current save game entry (we store count + 1 entries, so we're good)
-	return 0; //header.count;
+	return mainHeader.count;
 }
 
 void SaveLoad::clear() {
@@ -314,13 +331,13 @@
 	header.value = value;
 
 	// Save position
-	uint32 pos = _savegame->pos();
+	uint32 originalPosition = _savegame->pos();
 
 	// Write header
 	Common::Serializer ser(NULL, _savegame);
 	header.saveLoadWithSerializer(ser);
 
-	computePadding();
+	computeOffset();
 
 	// Write game data
 	WRITE_ENTRY("entity index", ser.syncAsUint32LE(entity), 4);
@@ -336,21 +353,27 @@
 	WRITE_ENTRY("sound", getSound()->saveLoadWithSerializer(ser), 0);
 	WRITE_ENTRY("savepoints", getSavePoints()->saveLoadWithSerializer(ser), 0);
 
-	header.padding = computePadding();
+	header.offset = computeOffset(originalPosition);
 
+	// Add padding if necessary
+	while (header.offset & 0xF) {
+		_savegame->writeByte(0);
+		header.offset++;
+	}
+
 	// Save end position
-	uint32 endpos = _savegame->pos();
+	uint32 endPosition = _savegame->pos();
 
 	// Validate entry header
 	if (!header.isValid())
 		error("SaveLoad::writeEntry: entry header is invalid");
 
 	// Save the header with the updated info
-	_savegame->seek(pos);
+	_savegame->seek(originalPosition);
 	header.saveLoadWithSerializer(ser);
 
 	// Move back to the end of the entry
-	_savegame->seek(endpos);
+	_savegame->seek(endPosition);
 }
 
 void SaveLoad::readEntry(SavegameType type, EntityIndex entity, uint32 value) {
@@ -364,14 +387,10 @@
 	return _gameHeaders[index];
 }
 
-uint32 SaveLoad::computePadding() {
+uint32 SaveLoad::computeOffset(uint32 originalPosition) {
 	warning("SaveLoad::computePadding: not implemented!");
 
-	// Hack
-	while (_savegame->pos() & 15)
-		_savegame->writeByte(0);
-
-	return _savegame->pos();
+	return (_savegame->pos() - originalPosition - 32);
 }
 
 //////////////////////////////////////////////////////////////////////////

Modified: scummvm/trunk/engines/lastexpress/game/savegame.h
===================================================================
--- scummvm/trunk/engines/lastexpress/game/savegame.h	2010-10-26 12:09:38 UTC (rev 53846)
+++ scummvm/trunk/engines/lastexpress/game/savegame.h	2010-10-26 12:10:38 UTC (rev 53847)
@@ -209,7 +209,7 @@
 		uint32 signature;
 		SavegameType type;
 		TimeValue time;
-		int padding;
+		int offset;
 		ChapterIndex chapter;
 		uint32 value;
 		int field_18;
@@ -219,7 +219,7 @@
 			signature = SAVEGAME_ENTRY_SIGNATURE;
 			type = kSavegameTypeIndex;
 			time = kTimeNone;
-			padding = 0;
+			offset = 0;
 			chapter = kChapterAll;
 			value = 0;
 			field_18 = 0;
@@ -230,7 +230,7 @@
 			s.syncAsUint32LE(signature);
 			s.syncAsUint32LE(type);
 			s.syncAsUint32LE(time);
-			s.syncAsUint32LE(padding);
+			s.syncAsUint32LE(offset);
 			s.syncAsUint32LE(chapter);
 			s.syncAsUint32LE(value);
 			s.syncAsUint32LE(field_18);
@@ -247,7 +247,7 @@
 			if (time < kTimeStartGame || time > kTimeCityConstantinople)
 				return false;
 
-			if (padding <= 0 || padding & 15)
+			if (offset <= 0 || offset & 15)
 				return false;
 
 			/* No check for < 0, as it cannot happen normaly */
@@ -269,7 +269,7 @@
 	void writeEntry(SavegameType type, EntityIndex entity, uint32 value);
 	void readEntry(SavegameType type, EntityIndex entity, uint32 value);
 	SavegameEntryHeader *getEntry(uint32 index);
-	uint32 computePadding();
+	uint32 computeOffset(uint32 originalPosition = 0);
 
 	// Opening save files
 	static Common::String getFilename(GameId id);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list