diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/saga/saveload.cpp | 41 | ||||
-rw-r--r-- | engines/scumm/saveload.cpp | 40 |
2 files changed, 47 insertions, 34 deletions
diff --git a/engines/saga/saveload.cpp b/engines/saga/saveload.cpp index 761ae49521..d9eb7cc4d4 100644 --- a/engines/saga/saveload.cpp +++ b/engines/saga/saveload.cpp @@ -135,9 +135,12 @@ void SagaEngine::fillSaveList() { if (_saveMarks[i]) { name = calcSaveFileName(i); if ((in = _saveFileMan->openForLoading(name)) != NULL) { - in->read(&_saveHeader, sizeof(_saveHeader)); + _saveHeader.type = in->readUint32BE(); + _saveHeader.size = in->readUint32LE(); + _saveHeader.version = in->readUint32LE(); + in->read(_saveHeader.name, sizeof(_saveHeader.name)); - if (_saveHeader.type != MKID('SAGA')) { + if (_saveHeader.type != MKID_BE('SAGA')) { error("SagaEngine::load wrong format"); } strcpy(_saveFiles[_saveFilesCount].name, _saveHeader.name); @@ -168,13 +171,18 @@ void SagaEngine::save(const char *fileName, const char *saveName) { return; } - _saveHeader.type = MKID('SAGA'); + _saveHeader.type = MKID_BE('SAGA'); _saveHeader.size = 0; - _saveHeader.version = TO_LE_32(CURRENT_SAGA_VER); + _saveHeader.version = CURRENT_SAGA_VER; strncpy(_saveHeader.name, saveName, SAVE_TITLE_SIZE); out->write(&_saveHeader, sizeof(_saveHeader)); + out->writeUint32BE(_saveHeader.type); + out->writeUint32LE(_saveHeader.size); + out->writeUint32LE(_saveHeader.version); + out->write(_saveHeader.name, sizeof(_saveHeader.name)); + // Original game title memset(title, 0, TITLESIZE); strncpy(title, getGameDescription()->title, TITLESIZE); @@ -221,18 +229,17 @@ void SagaEngine::load(const char *fileName) { return; } - in->read(&_saveHeader, sizeof(_saveHeader)); - - _saveHeader.size = FROM_LE_32(_saveHeader.size); - _saveHeader.version = FROM_LE_32(_saveHeader.version); - - // This save was written in native endianness (fix that, so warning will show up) - if (_saveHeader.version > CURRENT_SAGA_VER) { -#ifdef SCUMM_LITTLE_ENDIAN - _saveHeader.version = TO_BE_32(_saveHeader.version); -#else - _saveHeader.version = TO_LE_32(_saveHeader.version); -#endif + _saveHeader.type = in->readUint32BE(); + _saveHeader.size = in->readUint32LE(); + _saveHeader.version = in->readUint32LE(); + in->read(_saveHeader.name, sizeof(_saveHeader.name)); + + // Some older saves were not written in an endian safe fashion. + // We try to detect this here by checking for extremly high version values. + // If found, we retry with the data swapped. + // FIXME: Maybe display a warning/error message instead? + if (_saveHeader.version > 0xFFFFFF) { + _saveHeader.version = SWAP_BYTES_32(_saveHeader.version); } debug(2, "Save version: %x", _saveHeader.version); @@ -240,7 +247,7 @@ void SagaEngine::load(const char *fileName) { if (_saveHeader.version < 4) warning("This savegame is not endian-safe. There may be problems"); - if (_saveHeader.type != MKID('SAGA')) { + if (_saveHeader.type != MKID_BE('SAGA')) { error("SagaEngine::load wrong format"); } diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp index 80d309bacf..8a6bd17089 100644 --- a/engines/scumm/saveload.cpp +++ b/engines/scumm/saveload.cpp @@ -102,11 +102,14 @@ bool ScummEngine::saveState(int slot, bool compat) { memcpy(hdr.name, _saveLoadName, sizeof(hdr.name)); - hdr.type = MKID('SCVM'); + hdr.type = MKID_BE('SCVM'); hdr.size = 0; - hdr.ver = TO_LE_32(CURRENT_VER); + hdr.ver = CURRENT_VER; - out->write(&hdr, sizeof(hdr)); + out->writeUint32BE(hdr.type); + out->writeUint32LE(hdr.size); + out->writeUint32LE(hdr.ver); + out->write(hdr.name, sizeof(hdr.name)); saveThumbnail(out); saveInfos(out); @@ -123,6 +126,14 @@ bool ScummEngine::saveState(int slot, bool compat) { return true; } +static bool loadSaveGameHeader(Common::InSaveFile *in, SaveGameHeader &hdr) { + hdr.type = in->readUint32BE(); + hdr.size = in->readUint32LE(); + hdr.ver = in->readUint32LE(); + in->read(hdr.name, sizeof(hdr.name)); + return !in->ioFailed() && hdr.type == MKID_BE('SCVM'); +} + bool ScummEngine::loadState(int slot, bool compat) { char filename[256]; Common::InSaveFile *in; @@ -134,16 +145,16 @@ bool ScummEngine::loadState(int slot, bool compat) { if (!(in = _saveFileMan->openForLoading(filename))) return false; - in->read(&hdr, sizeof(hdr)); - if (hdr.type != MKID('SCVM')) { + if (!loadSaveGameHeader(in, hdr)) { warning("Invalid savegame '%s'", filename); delete in; return false; } // In older versions of ScummVM, the header version was not endian safe. - // We account for that by retrying once with swapped byte order. - if (hdr.ver > CURRENT_VER) + // We account for that by retrying once with swapped byte order in case + // we see a version that is higher than anything we'd expect... + if (hdr.ver > 0xFFFFFF) hdr.ver = SWAP_BYTES_32(hdr.ver); // Reject save games which are too old or too new. Note that @@ -432,20 +443,19 @@ bool ScummEngine::getSavegameName(int slot, char *desc) { char filename[256]; Common::InSaveFile *in; SaveGameHeader hdr; - int len; makeSavegameName(filename, slot, false); if (!(in = _saveFileMan->openForLoading(filename))) { strcpy(desc, ""); return false; } - len = in->read(&hdr, sizeof(hdr)); - delete in; - if (len != sizeof(hdr) || hdr.type != MKID('SCVM')) { + if (!loadSaveGameHeader(in, hdr)) { + delete in; strcpy(desc, "Invalid savegame"); return false; } + delete in; if (hdr.ver > CURRENT_VER) hdr.ver = TO_LE_32(hdr.ver); @@ -469,15 +479,13 @@ Graphics::Surface *ScummEngine::loadThumbnailFromSlot(int slot) { char filename[256]; Common::InSaveFile *in; SaveGameHeader hdr; - int len; makeSavegameName(filename, slot, false); if (!(in = _saveFileMan->openForLoading(filename))) { return 0; } - len = in->read(&hdr, sizeof(hdr)); - if (len != sizeof(hdr) || hdr.type != MKID('SCVM')) { + if (!loadSaveGameHeader(in, hdr)) { delete in; return 0; } @@ -499,15 +507,13 @@ bool ScummEngine::loadInfosFromSlot(int slot, InfoStuff *stuff) { char filename[256]; Common::InSaveFile *in; SaveGameHeader hdr; - int len; makeSavegameName(filename, slot, false); if (!(in = _saveFileMan->openForLoading(filename))) { return false; } - len = in->read(&hdr, sizeof(hdr)); - if (len != sizeof(hdr) || hdr.type != MKID('SCVM')) { + if (!loadSaveGameHeader(in, hdr)) { delete in; return false; } |