aboutsummaryrefslogtreecommitdiff
path: root/engines/sword25/package/packagemanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sword25/package/packagemanager.cpp')
-rw-r--r--engines/sword25/package/packagemanager.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/engines/sword25/package/packagemanager.cpp b/engines/sword25/package/packagemanager.cpp
index 7a64fe2e29..7c6343a18f 100644
--- a/engines/sword25/package/packagemanager.cpp
+++ b/engines/sword25/package/packagemanager.cpp
@@ -141,6 +141,29 @@ bool PackageManager::loadDirectoryAsPackage(const Common::String &directoryName,
}
}
+// Duplicated from kernel/persistenceservice.cpp
+static Common::String generateSavegameFilename(uint slotID) {
+ char buffer[100];
+ // NOTE: This is hardcoded to sword25
+ snprintf(buffer, 100, "%s.%.3d", "sword25", slotID);
+ return Common::String(buffer);
+}
+
+// Duplicated from kernel/persistenceservice.cpp
+static Common::String loadString(Common::InSaveFile *in, uint maxSize = 999) {
+ Common::String result;
+
+ char ch = (char)in->readByte();
+ while (ch != '\0') {
+ result += ch;
+ if (result.size() >= maxSize)
+ break;
+ ch = (char)in->readByte();
+ }
+
+ return result;
+}
+
byte *PackageManager::getFile(const Common::String &fileName, uint *fileSizePtr) {
const Common::String B25S_EXTENSION(".b25s");
Common::SeekableReadStream *in;
@@ -165,6 +188,40 @@ byte *PackageManager::getFile(const Common::String &fileName, uint *fileSizePtr)
return buffer;
}
+ if (fileName.hasPrefix("/saves")) {
+ // A savegame thumbnail
+ Common::SaveFileManager *sfm = g_system->getSavefileManager();
+ int slotNum = atoi(fileName.c_str() + fileName.size() - 3);
+ Common::InSaveFile *file = sfm->openForLoading(generateSavegameFilename(slotNum));
+
+ if (file) {
+ loadString(file); // storedMarker
+ loadString(file); // storedVersionID
+ loadString(file); // gameDescription
+ int gameDataLength = atoi(loadString(file).c_str());
+ loadString(file); // gamedataUncompressedLength
+ // Skip the savegame data
+ file->skip(gameDataLength);
+
+ int thumbnailSize = file->size() - file->pos();
+
+ if (thumbnailSize <= 0) {
+ warning("Saved game at slot %d does not contain a thumbnail", slotNum);
+ delete file;
+ return 0;
+ }
+
+ if (fileSizePtr)
+ *fileSizePtr = thumbnailSize;
+
+ byte *thumbnail = new byte[thumbnailSize];
+ file->read(thumbnail, thumbnailSize);
+
+ delete file;
+ return thumbnail;
+ }
+ }
+
Common::ArchiveMemberPtr fileNode = getArchiveMember(normalizePath(fileName, _currentDirectory));
if (!fileNode)
return 0;