aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2019-06-16 13:55:41 -0700
committerPaul Gilbert2019-06-16 14:59:26 -0700
commit919670a565ca38162346beb77414562d6126273a (patch)
treebb62b351f017fec80c2fc74202dd0cabe1cdd0fa
parent553bb74f8c380ee31fb771c6619dad8e83fed8ce (diff)
downloadscummvm-rg350-919670a565ca38162346beb77414562d6126273a.tar.gz
scummvm-rg350-919670a565ca38162346beb77414562d6126273a.tar.bz2
scummvm-rg350-919670a565ca38162346beb77414562d6126273a.zip
GLK: ADVSYS: Save/load fixes
-rw-r--r--engines/glk/advsys/advsys.cpp3
-rw-r--r--engines/glk/glk.cpp15
-rw-r--r--engines/glk/quetzal.cpp5
-rw-r--r--engines/glk/streams.cpp2
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());