ENGINES: Streamline auto-save write/delete protection

Some engines call setAutosave and some don't. isAutosave is used to
determine if a saved game is an autosave, but in fact, on most cases it
just falls back to comparing the name to "Autosave".

This is wrong for several reasons:
* Older versions of ScummVM used Autosave 0.
* The name "Autosave" is translated, so if you change the language, it
  won't be detected.

Instead of relying on the name, use the well-known getAutosaveSlot() from
Engine/MetaEngine.

Fixes #12735.
This commit is contained in:
Orgad Shaneh 2021-08-10 23:34:51 +03:00 committed by Eugene Sandulenko
parent c4e58093d7
commit 7adad5aaf5
27 changed files with 45 additions and 177 deletions

View file

@ -331,21 +331,14 @@ SaveStateList MetaEngine::listSaves(const char *target, bool saveMode) const {
// Check to see if an autosave is present
for (SaveStateList::iterator it = saveList.begin(); it != saveList.end(); ++it) {
int slot = it->getSaveSlot();
if (slot == autosaveSlot) {
// It has an autosave
it->setWriteProtectedFlag(true);
// It has an autosave
if (it->isAutosave())
return saveList;
}
}
// No autosave yet. We want to add a dummy one in so that it can be marked as'
// write protected, and thus be prevented from being saved in
SaveStateDescriptor desc;
desc.setDescription(_("Autosave"));
desc.setSaveSlot(autosaveSlot);
desc.setWriteProtectedFlag(true);
SaveStateDescriptor desc(autosaveSlot, _("Autosave"));
saveList.push_back(desc);
Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator());
@ -393,16 +386,9 @@ SaveStateDescriptor MetaEngine::querySaveMetaInfos(const char *target, int slot)
}
// Create the return descriptor
SaveStateDescriptor desc;
SaveStateDescriptor desc(slot, Common::U32String());
parseSavegameHeader(&header, &desc);
desc.setSaveSlot(slot);
desc.setThumbnail(header.thumbnail);
desc.setAutosave(header.isAutosave);
if (slot == getAutosaveSlot())
desc.setWriteProtectedFlag(true);
return desc;
}