diff options
Diffstat (limited to 'engines/tucker/saveload.cpp')
-rw-r--r-- | engines/tucker/saveload.cpp | 86 |
1 files changed, 50 insertions, 36 deletions
diff --git a/engines/tucker/saveload.cpp b/engines/tucker/saveload.cpp index 4e33988ed2..00911b9c44 100644 --- a/engines/tucker/saveload.cpp +++ b/engines/tucker/saveload.cpp @@ -50,36 +50,44 @@ Common::String generateGameStateFileName(const char *target, int slot, bool pref return name; } -static void saveOrLoadInt(Common::WriteStream &stream, int &i) { +static void saveOrLoadVar(Common::WriteStream &stream, int &i) { stream.writeSint32LE(i); } -static void saveOrLoadInt(Common::ReadStream &stream, int &i) { +static void saveOrLoadVar(Common::ReadStream &stream, int &i) { i = stream.readSint32LE(); } +static void saveOrLoadVar(Common::WriteStream &stream, Location &location) { + stream.writeSint32LE((int)location); +} + +static void saveOrLoadVar(Common::ReadStream &stream, Location &location) { + location = (Location)stream.readSint32LE(); +} + template<class S> TuckerEngine::SavegameError TuckerEngine::saveOrLoadGameStateData(S &s) { for (int i = 0; i < kFlagsTableSize; ++i) { - saveOrLoadInt(s, _flagsTable[i]); + saveOrLoadVar(s, _flagsTable[i]); } for (int i = 0; i < 40; ++i) { - saveOrLoadInt(s, _inventoryObjectsList[i]); + saveOrLoadVar(s, _inventoryObjectsList[i]); } for (int i = 0; i < 50; ++i) { - saveOrLoadInt(s, _inventoryItemsState[i]); + saveOrLoadVar(s, _inventoryItemsState[i]); } for (int i = 0; i < 50; ++i) { - saveOrLoadInt(s, _panelObjectsOffsetTable[i]); + saveOrLoadVar(s, _panelObjectsOffsetTable[i]); } - saveOrLoadInt(s, _mainSpritesBaseOffset); - saveOrLoadInt(s, _selectedObject._xPos); - saveOrLoadInt(s, _selectedObject._yPos); - saveOrLoadInt(s, _locationNum); - saveOrLoadInt(s, _xPosCurrent); - saveOrLoadInt(s, _yPosCurrent); - saveOrLoadInt(s, _inventoryObjectsCount); - saveOrLoadInt(s, _inventoryObjectsOffset); + saveOrLoadVar(s, _mainSpritesBaseOffset); + saveOrLoadVar(s, _selectedObject._xPos); + saveOrLoadVar(s, _selectedObject._yPos); + saveOrLoadVar(s, _location); + saveOrLoadVar(s, _xPosCurrent); + saveOrLoadVar(s, _yPosCurrent); + saveOrLoadVar(s, _inventoryObjectsCount); + saveOrLoadVar(s, _inventoryObjectsOffset); return s.err() ? kSavegameIoError : kSavegameNoError; } @@ -101,18 +109,18 @@ Common::Error TuckerEngine::loadGameState(int slot) { if (savegameError) { switch (savegameError) { - case kSavegameInvalidTypeError: - warning("Invalid savegame '%s' (does not look like a ScummVM Tucker-engine savegame)", fileName.c_str()); - break; - - case kSavegameInvalidVersionError: - warning("Invalid savegame '%s' (expected savegame version v%i-v%i, got v%i)", - fileName.c_str(), kSavegameVersionMinimum, kSavegameVersionCurrent, header.version); - break; - - default: - warning("Failed to load savegame '%s'", fileName.c_str()); - break; + case kSavegameInvalidTypeError: + warning("Invalid savegame '%s' (does not look like a ScummVM Tucker-engine savegame)", fileName.c_str()); + break; + + case kSavegameInvalidVersionError: + warning("Invalid savegame '%s' (expected savegame version v%i-v%i, got v%i)", + fileName.c_str(), kSavegameVersionMinimum, kSavegameVersionCurrent, header.version); + break; + + default: + warning("Failed to load savegame '%s'", fileName.c_str()); + break; } delete file; @@ -121,17 +129,19 @@ Common::Error TuckerEngine::loadGameState(int slot) { g_engine->setTotalPlayTime(header.playTime * 1000); - _nextLocationNum = _locationNum; + _nextLocation = _location; setBlackPalette(); loadBudSpr(); _forceRedrawPanelItems = true; + _panelType = kPanelTypeNormal; + setCursorState(kCursorStateNormal); delete file; return Common::kNoError; } -TuckerEngine::SavegameError TuckerEngine::readSavegameHeader(const char *target, int slot, SavegameHeader &header) { +WARN_UNUSED_RESULT TuckerEngine::SavegameError TuckerEngine::readSavegameHeader(const char *target, int slot, SavegameHeader &header) { Common::String fileName = generateGameStateFileName(target, slot); Common::InSaveFile *file = g_system->getSavefileManager()->openForLoading(fileName); @@ -145,8 +155,8 @@ TuckerEngine::SavegameError TuckerEngine::readSavegameHeader(const char *target, return savegameError; } -TuckerEngine::SavegameError TuckerEngine::readSavegameHeader(Common::InSaveFile *file, SavegameHeader &header, bool loadThumbnail) { - header.version = -1; +WARN_UNUSED_RESULT TuckerEngine::SavegameError TuckerEngine::readSavegameHeader(Common::InSaveFile *file, SavegameHeader &header, bool skipThumbnail) { + header.version = 0; header.flags = 0; header.description.clear(); header.saveDate = 0; @@ -186,10 +196,8 @@ TuckerEngine::SavegameError TuckerEngine::readSavegameHeader(Common::InSaveFile header.saveTime = file->readUint32LE(); header.playTime = file->readUint32LE(); - if (loadThumbnail) { - header.thumbnail = Graphics::loadThumbnail(*file); - } else { - Graphics::skipThumbnail(*file); + if (!Graphics::loadThumbnail(*file, header.thumbnail, skipThumbnail)) { + return kSavegameIoError; } } @@ -278,13 +286,19 @@ bool TuckerEngine::isAutosaveAllowed(const char *target) { void TuckerEngine::writeAutosave() { if (canSaveGameStateCurrently()) { + // unconditionally reset last autosave timestamp so we don't start + // hammering the disk in case we can't/don't actually write the file + _lastSaveTime = _system->getMillis(); + if (!isAutosaveAllowed()) { warning("Refusing to overwrite non-autosave savegame in slot %i, skipping autosave", kAutoSaveSlot); return; } - writeSavegame(kAutoSaveSlot, "Autosave", true); - _lastSaveTime = _system->getMillis(); + if (writeSavegame(kAutoSaveSlot, "Autosave", true).getCode() != Common::kNoError) { + warning("Can't create autosave in slot %i, game not saved", kAutoSaveSlot); + return; + } } } |