aboutsummaryrefslogtreecommitdiff
path: root/engines/tucker/saveload.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/tucker/saveload.cpp')
-rw-r--r--engines/tucker/saveload.cpp86
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;
+ }
}
}