From 919670a565ca38162346beb77414562d6126273a Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 16 Jun 2019 13:55:41 -0700 Subject: GLK: ADVSYS: Save/load fixes --- engines/glk/advsys/advsys.cpp | 3 +++ engines/glk/glk.cpp | 15 +++++++++++++-- engines/glk/quetzal.cpp | 5 +---- engines/glk/streams.cpp | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/engines/glk/advsys/advsys.cpp b/engines/glk/advsys/advsys.cpp index 51003205b1..ff0bf62116 100644 --- a/engines/glk/advsys/advsys.cpp +++ b/engines/glk/advsys/advsys.cpp @@ -103,6 +103,9 @@ bool AdvSys::singleAction() { } Common::Error AdvSys::readSaveData(Common::SeekableReadStream *rs) { + if ((int)rs->size() != _saveSize) + return Common::kReadingFailed; + rs->read(_saveArea, rs->size()); return Common::kNoError; } diff --git a/engines/glk/glk.cpp b/engines/glk/glk.cpp index b3760cafd4..d154de2d39 100644 --- a/engines/glk/glk.cpp +++ b/engines/glk/glk.cpp @@ -190,11 +190,21 @@ Common::Error GlkEngine::loadGameState(int slot) { // so if present we can validate the save is for this game for (QuetzalReader::Iterator it = r.begin(); it != r.end(); ++it) { if ((*it)._id == ID_SCVM) { + // Skip over date/time & playtime + Common::SeekableReadStream *rs = it.getStream(); + rs->skip(14); + byte interpType = rs->readByte(); + byte language = rs->readByte(); + Common::String md5 = QuetzalReader::readString(rs); + delete rs; + + if (interpType != getInterpreterType() || language != getLanguage() || md5 != getGameMD5()) + errCode = Common::kReadingFailed; } } - if (errCode != Common::kNoError) { + if (errCode == Common::kNoError) { // Scan for an uncompressed memory chunk errCode = Common::kReadingFailed; // Presume we won't find chunk for (QuetzalReader::Iterator it = r.begin(); it != r.end(); ++it) { @@ -202,6 +212,7 @@ Common::Error GlkEngine::loadGameState(int slot) { Common::SeekableReadStream *rs = it.getStream(); errCode = readSaveData(rs).getCode(); delete rs; + break; } } } @@ -228,7 +239,7 @@ Common::Error GlkEngine::saveGameState(int slot, const Common::String &desc) { errCode = writeGameData(&ws).getCode(); } - if (errCode != Common::kNoError) { + if (errCode == Common::kNoError) { w.save(*file, desc); } diff --git a/engines/glk/quetzal.cpp b/engines/glk/quetzal.cpp index ae81d8818d..69b0475b5d 100644 --- a/engines/glk/quetzal.cpp +++ b/engines/glk/quetzal.cpp @@ -45,10 +45,8 @@ bool QuetzalReader::open(Common::SeekableReadStream *stream, uint32 formType) { uint32 size = stream->readUint32BE(); uint32 fileFormType = stream->readUint32BE(); - if (formType != ID_IFSF) - return false; if ((formType != 0 && fileFormType != formType) || - (formType == 0 && (fileFormType == ID_IFZS || fileFormType == ID_IFSF))) + (formType == 0 && fileFormType != ID_IFZS && fileFormType != ID_IFSF)) return false; if ((int)size > stream->size() || (size & 1) || (size < 4)) @@ -112,7 +110,6 @@ bool QuetzalReader::getSavegameMetaInfo(Common::SeekableReadStream *rs, SaveStat ssd.setDescription(readString(s)); delete s; - return true; } else if ((*it)._id == ID_SCVM) { Common::SeekableReadStream *s = it.getStream(); int year = s->readUint16BE(); diff --git a/engines/glk/streams.cpp b/engines/glk/streams.cpp index be8ae24ae7..4d517a2b89 100644 --- a/engines/glk/streams.cpp +++ b/engines/glk/streams.cpp @@ -781,7 +781,7 @@ FileStream::FileStream(Streams *streams, frefid_t fref, uint fmode, uint rock, b Common::String fname = fref->_slotNumber == -1 ? fref->_filename : fref->getSaveName(); if (fmode == filemode_Write || fmode == filemode_ReadWrite || fmode == filemode_WriteAppend) { - _outFile = g_system->getSavefileManager()->openForSaving(fname, fref->_slotNumber != -1 && g_vm->getInterpreterType() != INTERPRETER_FROTZ); + _outFile = g_system->getSavefileManager()->openForSaving(fname, false); if (!_outFile) error("Could open file for writing - %s", fname.c_str()); -- cgit v1.2.3