diff options
author | md5 | 2011-05-05 18:33:22 +0300 |
---|---|---|
committer | md5 | 2011-05-05 18:33:22 +0300 |
commit | 921030f4ef9ff41ff3387ac8c61ffd1f6e709611 (patch) | |
tree | 61d0487d78d9b5508ec69905b6f7833dcc3932a0 /engines/sword25/package/packagemanager.cpp | |
parent | dee398ad6caf741d1bcd81d1a32b26d08ad066d7 (diff) | |
download | scummvm-rg350-921030f4ef9ff41ff3387ac8c61ffd1f6e709611.tar.gz scummvm-rg350-921030f4ef9ff41ff3387ac8c61ffd1f6e709611.tar.bz2 scummvm-rg350-921030f4ef9ff41ff3387ac8c61ffd1f6e709611.zip |
SWORD25: Initial code for showing savegame thumbnails
There is currently a bug and only the thumbnail of the first save slot is
shown
Diffstat (limited to 'engines/sword25/package/packagemanager.cpp')
-rw-r--r-- | engines/sword25/package/packagemanager.cpp | 57 |
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; |