diff options
author | Paul Gilbert | 2018-11-25 22:07:10 -0800 |
---|---|---|
committer | Paul Gilbert | 2018-12-08 19:05:59 -0800 |
commit | 6e6b285e83d44e0b35b1c8df3fd5fe325310810e (patch) | |
tree | 90a7c245d478f5792d93259672424467fa902248 | |
parent | 6080a1d09105c8c743d9e739df91109c809fcef1 (diff) | |
download | scummvm-rg350-6e6b285e83d44e0b35b1c8df3fd5fe325310810e.tar.gz scummvm-rg350-6e6b285e83d44e0b35b1c8df3fd5fe325310810e.tar.bz2 scummvm-rg350-6e6b285e83d44e0b35b1c8df3fd5fe325310810e.zip |
GLK: FROTZ: Savegame listing now reads Quetzal savegames
-rw-r--r-- | engines/glk/POTFILES | 1 | ||||
-rw-r--r-- | engines/glk/detection.cpp | 2 | ||||
-rw-r--r-- | engines/glk/frotz/detection.cpp | 33 | ||||
-rw-r--r-- | engines/glk/frotz/detection.h | 6 |
4 files changed, 42 insertions, 0 deletions
diff --git a/engines/glk/POTFILES b/engines/glk/POTFILES index 9caee0eb5f..d672609765 100644 --- a/engines/glk/POTFILES +++ b/engines/glk/POTFILES @@ -1,2 +1,3 @@ engines/glk/streams.cpp engines/glk/scott/scott.cpp +engines/glk/frotz/detection.cpp diff --git a/engines/glk/detection.cpp b/engines/glk/detection.cpp index a91c6033b0..4e9dee32e3 100644 --- a/engines/glk/detection.cpp +++ b/engines/glk/detection.cpp @@ -210,6 +210,8 @@ SaveStateList GlkMetaEngine::listSaves(const char *target) const { if (in) { if (Glk::FileStream::readSavegameHeader(in, header)) saveList.push_back(SaveStateDescriptor(slot, header._saveName)); + else if (Glk::Frotz::FrotzMetaEngine::readSavegameHeader(in, header)) + saveList.push_back(SaveStateDescriptor(slot, header._saveName)); delete in; } diff --git a/engines/glk/frotz/detection.cpp b/engines/glk/frotz/detection.cpp index e1c60bd374..b1d751a313 100644 --- a/engines/glk/frotz/detection.cpp +++ b/engines/glk/frotz/detection.cpp @@ -25,6 +25,7 @@ #include "common/debug.h" #include "common/file.h" #include "common/md5.h" +#include "common/translation.h" namespace Glk { namespace Frotz { @@ -113,5 +114,37 @@ bool FrotzMetaEngine::detectGames(const Common::FSList &fslist, DetectedGames &g return !gameList.empty(); } +bool FrotzMetaEngine::readSavegameHeader(Common::SeekableReadStream *stream, Glk::SavegameHeader &header) { + stream->seek(0); + if (stream->readUint32BE() != MKTAG('F', 'O', 'R', 'M')) + return false; + stream->readUint32BE(); + if (stream->readUint32BE() != MKTAG('I', 'F', 'Z', 'S')) + return false; + + header._saveName = _("Unnamed savegame"); + + while (stream->pos() < stream->size()) { + uint type = stream->readUint32BE(); + size_t len = stream->readUint32BE(); + + if (type == MKTAG('A', 'N', 'N', 'O')) { + // Read savegame name from the annotation chunk + char *buffer = new char[len + 1]; + stream->read(buffer, len); + buffer[len] = '\0'; + header._saveName = Common::String(buffer); + break; + } else { + if (len & 1) + // Length must be even + ++len; + stream->skip(len); + } + } + + return true; +} + } // End of namespace Frotz } // End of namespace Glk diff --git a/engines/glk/frotz/detection.h b/engines/glk/frotz/detection.h index 6c70f98879..4fa555bfa0 100644 --- a/engines/glk/frotz/detection.h +++ b/engines/glk/frotz/detection.h @@ -25,6 +25,7 @@ #include "common/fs.h" #include "engines/game.h" +#include "glk/streams.h" namespace Glk { namespace Frotz { @@ -46,6 +47,11 @@ public: * Detect supported games */ static bool detectGames(const Common::FSList &fslist, DetectedGames &gameList); + + /** + * Check a passed stream for a Quetzal save, and if so, get header information + */ + static bool readSavegameHeader(Common::SeekableReadStream *stream, Glk::SavegameHeader &header); }; } // End of namespace Frotz |