[Scummvm-cvs-logs] SF.net SVN: scummvm:[53351] scummvm/trunk/engines/sword25/kernel/ persistenceservice.cpp

sev at users.sourceforge.net sev at users.sourceforge.net
Wed Oct 13 01:48:51 CEST 2010


Revision: 53351
          http://scummvm.svn.sourceforge.net/scummvm/?rev=53351&view=rev
Author:   sev
Date:     2010-10-12 23:48:50 +0000 (Tue, 12 Oct 2010)

Log Message:
-----------
SWORD25: Fixes to the savegame saving code

Modified Paths:
--------------
    scummvm/trunk/engines/sword25/kernel/persistenceservice.cpp

Modified: scummvm/trunk/engines/sword25/kernel/persistenceservice.cpp
===================================================================
--- scummvm/trunk/engines/sword25/kernel/persistenceservice.cpp	2010-10-12 23:48:32 UTC (rev 53350)
+++ scummvm/trunk/engines/sword25/kernel/persistenceservice.cpp	2010-10-12 23:48:50 UTC (rev 53351)
@@ -36,6 +36,7 @@
 // Includes
 // -----------------------------------------------------------------------------
 
+#include "common/fs.h"
 #include "common/savefile.h"
 #include "sword25/kernel/kernel.h"
 #include "sword25/kernel/persistenceservice.h"
@@ -61,25 +62,22 @@
 const char         *FILE_MARKER = "BS25SAVEGAME";
 const uint  SLOT_COUNT = 18;
 const uint  FILE_COPY_BUFFER_SIZE = 1024 * 10;
-const char *VERSIONID = "1";
+const char *VERSIONID = "5";
 
 // -------------------------------------------------------------------------
 
-Common::String GenerateSavegameFilename(uint SlotID) {
-	Common::String oss;
-	oss += SlotID;
-	oss += SAVEGAME_EXTENSION;
-	return oss;
+Common::String GenerateSavegameFilename(uint slotID) {
+	char buffer[10];
+	sprintf(buffer, "%d%s", slotID, SAVEGAME_EXTENSION);
+	return Common::String(buffer);
 }
 
 // -------------------------------------------------------------------------
 
 Common::String GenerateSavegamePath(uint SlotID) {
-	Common::String oss;
-	oss = PersistenceService::GetSavegameDirectory();
-	oss += FileSystemUtil::GetInstance().GetPathSeparator();
-	oss += GenerateSavegameFilename(SlotID);
-	return oss;
+	Common::FSNode folder(PersistenceService::GetSavegameDirectory());
+	
+	return folder.getChild(GenerateSavegameFilename(SlotID)).getPath();
 }
 
 // -------------------------------------------------------------------------
@@ -92,7 +90,7 @@
 	};
 	char buffer[100];
 	snprintf(buffer, 100, "%.2d-%s-%.4d %.2d:%.2d:%.2d",
-	         Time.tm_mday, monthList[Time.tm_mon].c_str(), Time.tm_year,
+	         Time.tm_mday, monthList[Time.tm_mon].c_str(), 1900 + Time.tm_year,
 	         Time.tm_hour, Time.tm_min, Time.tm_sec
 	        );
 
@@ -103,14 +101,17 @@
 
 Common::String LoadString(Common::InSaveFile *In, uint MaxSize = 999) {
 	Common::String Result;
-	char ch;
-	while ((ch = (char)In->readByte()) != '\0') {
+
+	char ch = (char)In->readByte();
+	while ((ch != '\0') && (ch != ' ')) {
 		Result += ch;
 		if (Result.size() >= MaxSize) break;
+		ch = (char)In->readByte();
 	}
 
 	return Result;
 }
+
 }
 
 namespace Sword25 {
@@ -167,38 +168,37 @@
 		CurSavegameInfo.Clear();
 
 		// Den Dateinamen f\xFCr den Spielstand des Slots generieren.
-		Common::String Filename = GenerateSavegamePath(SlotID);
+		Common::String Filename = GenerateSavegameFilename(SlotID);
 
-		// Feststellen, ob eine Spielstanddatei dieses Namens existiert.
-		if (FileSystemUtil::GetInstance().FileExists(Filename)) {
-			// Read in the game
-			Common::SaveFileManager *sfm = g_system->getSavefileManager();
-			Common::InSaveFile *File = sfm->openForLoading(Filename);
+		// Try to open the savegame for loading
+		Common::SaveFileManager *sfm = g_system->getSavefileManager();
+		Common::InSaveFile *File = sfm->openForLoading(Filename);
 
-			if (File) {
-				// Read in the header
-				Common::String StoredMarker = LoadString(File);
-				Common::String StoredVersionID = LoadString(File);
-				CurSavegameInfo.GamedataLength = File->readUint32LE();
-				CurSavegameInfo.GamedataUncompressedLength = File->readUint32LE();
+		if (File) {
+			// Read in the header
+			Common::String StoredMarker = LoadString(File);
+			Common::String StoredVersionID = LoadString(File);
+			Common::String gameDataLength = LoadString(File);
+			CurSavegameInfo.GamedataLength = atoi(gameDataLength.c_str());
+			Common::String gamedataUncompressedLength = LoadString(File);
+			CurSavegameInfo.GamedataUncompressedLength = atoi(gamedataUncompressedLength.c_str());
 
-				// If the header can be read in and is detected to be valid, we will have a valid file
-				if (StoredMarker == FILE_MARKER) {
-					// Der Slot wird als belegt markiert.
-					CurSavegameInfo.IsOccupied = true;
-					// Speichern, ob der Spielstand kompatibel mit der aktuellen Engine-Version ist.
-					CurSavegameInfo.IsCompatible = (StoredVersionID == Common::String(VERSIONID));
-					// Dateinamen des Spielstandes speichern.
-					CurSavegameInfo.Filename = GenerateSavegameFilename(SlotID);
-					// Die Beschreibung des Spielstandes besteht aus einer textuellen Darstellung des \xC4nderungsdatums der Spielstanddatei.
-					CurSavegameInfo.Description = FormatTimestamp(FileSystemUtil::GetInstance().GetFileTime(Filename));
-					// Den Offset zu den gespeicherten Spieldaten innerhalb der Datei speichern.
-					// Dieses entspricht der aktuellen Position + 1, da nach der letzten Headerinformation noch ein Leerzeichen als trenner folgt.
-					CurSavegameInfo.GamedataOffset = static_cast<uint>(File->pos()) + 1;
-				}
+			// If the header can be read in and is detected to be valid, we will have a valid file
+			if (StoredMarker == FILE_MARKER) {
+				// Der Slot wird als belegt markiert.
+				CurSavegameInfo.IsOccupied = true;
+				// Speichern, ob der Spielstand kompatibel mit der aktuellen Engine-Version ist.
+				CurSavegameInfo.IsCompatible = (StoredVersionID == Common::String(VERSIONID));
+				// Dateinamen des Spielstandes speichern.
+				CurSavegameInfo.Filename = GenerateSavegameFilename(SlotID);
+				// Die Beschreibung des Spielstandes besteht aus einer textuellen Darstellung des \xC4nderungsdatums der Spielstanddatei.
+				CurSavegameInfo.Description = FormatTimestamp(FileSystemUtil::GetInstance().GetFileTime(Filename));
+				// Den Offset zu den gespeicherten Spieldaten innerhalb der Datei speichern.
+				// Dieses entspricht der aktuellen Position + 1, da nach der letzten Headerinformation noch ein Leerzeichen als trenner folgt.
+				CurSavegameInfo.GamedataOffset = static_cast<uint>(File->pos()) + 1;
+			}
 
-				delete File;
-			}
+			delete File;
 		}
 	}
 };
@@ -240,7 +240,14 @@
 // -----------------------------------------------------------------------------
 
 Common::String PersistenceService::GetSavegameDirectory() {
-	return FileSystemUtil::GetInstance().GetUserdataDirectory() + FileSystemUtil::GetInstance().GetPathSeparator() + SAVEGAME_DIRECTORY;
+	Common::FSNode node(FileSystemUtil::GetInstance().GetUserdataDirectory());
+	Common::FSNode childNode = node.getChild(SAVEGAME_DIRECTORY);
+
+	// Try and return the path using the savegame subfolder. But if doesn't exist, fall back on the data directory
+	if (childNode.exists())
+		return childNode.getPath();
+	
+	return node.getPath();
 }
 
 // -----------------------------------------------------------------------------
@@ -297,7 +304,7 @@
 	}
 
 	// Dateinamen erzeugen.
-	Common::String Filename = GenerateSavegamePath(SlotID).c_str();
+	Common::String Filename = GenerateSavegameFilename(SlotID);
 
 	// Sicherstellen, dass das Verzeichnis f\xFCr die Spielstanddateien existiert.
 	FileSystemUtil::GetInstance().CreateDirectory(GetSavegameDirectory());
@@ -340,7 +347,7 @@
 	snprintf(sBuffer, 10, "%ld", CompressedLength);
 	File->writeString(sBuffer);
 	File->writeByte(' ');
-	snprintf(sBuffer, 10, "%uld", Writer.GetDataSize());
+	snprintf(sBuffer, 10, "%lu", Writer.GetDataSize());
 	File->writeString(sBuffer);
 	File->writeByte(' ');
 
@@ -368,6 +375,8 @@
 	// Savegameinformationen f\xFCr diesen Slot aktualisieren.
 	m_impl->ReadSlotSavegameInformation(SlotID);
 
+	File->finalize();
+	delete File;
 	delete[] CompressionBuffer;
 
 	// Erfolg signalisieren.


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