COMMON: Fix multiple engines asserting in querySaveMetaInfos for empty save slots
This commit is contained in:
parent
8465f9f99f
commit
9bb978486b
4 changed files with 79 additions and 67 deletions
|
@ -189,38 +189,41 @@ SaveStateList CGEMetaEngine::listSaves(const char *target) const {
|
|||
SaveStateDescriptor CGEMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
|
||||
Common::String fileName = Common::String::format("%s.%03d", target, slot);
|
||||
Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(fileName);
|
||||
assert(f);
|
||||
|
||||
if (f) {
|
||||
CGE::SavegameHeader header;
|
||||
|
||||
CGE::SavegameHeader header;
|
||||
// Check to see if it's a ScummVM savegame or not
|
||||
char buffer[kSavegameStrSize + 1];
|
||||
f->read(buffer, kSavegameStrSize + 1);
|
||||
|
||||
// Check to see if it's a ScummVM savegame or not
|
||||
char buffer[kSavegameStrSize + 1];
|
||||
f->read(buffer, kSavegameStrSize + 1);
|
||||
bool hasHeader = !strncmp(buffer, CGE::savegameStr, kSavegameStrSize + 1) &&
|
||||
CGE::CGEEngine::readSavegameHeader(f, header);
|
||||
delete f;
|
||||
|
||||
bool hasHeader = !strncmp(buffer, CGE::savegameStr, kSavegameStrSize + 1) &&
|
||||
CGE::CGEEngine::readSavegameHeader(f, header);
|
||||
delete f;
|
||||
if (!hasHeader) {
|
||||
// Original savegame perhaps?
|
||||
SaveStateDescriptor desc(slot, "Unknown");
|
||||
return desc;
|
||||
} else {
|
||||
// Create the return descriptor
|
||||
SaveStateDescriptor desc(slot, header.saveName);
|
||||
desc.setDeletableFlag(true);
|
||||
desc.setWriteProtectedFlag(false);
|
||||
desc.setThumbnail(header.thumbnail);
|
||||
desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay);
|
||||
desc.setSaveTime(header.saveHour, header.saveMinutes);
|
||||
|
||||
if (!hasHeader) {
|
||||
// Original savegame perhaps?
|
||||
SaveStateDescriptor desc(slot, "Unknown");
|
||||
return desc;
|
||||
} else {
|
||||
// Create the return descriptor
|
||||
SaveStateDescriptor desc(slot, header.saveName);
|
||||
desc.setDeletableFlag(true);
|
||||
desc.setWriteProtectedFlag(false);
|
||||
desc.setThumbnail(header.thumbnail);
|
||||
desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay);
|
||||
desc.setSaveTime(header.saveHour, header.saveMinutes);
|
||||
// Slot 0 is used for the 'automatic save on exit' save in Soltys, thus
|
||||
// we prevent it from being deleted or overwritten by accident.
|
||||
desc.setDeletableFlag(slot != 0);
|
||||
desc.setWriteProtectedFlag(slot == 0);
|
||||
|
||||
// Slot 0 is used for the 'automatic save on exit' save in Soltys, thus
|
||||
// we prevent it from being deleted or overwritten by accident.
|
||||
desc.setDeletableFlag(slot != 0);
|
||||
desc.setWriteProtectedFlag(slot == 0);
|
||||
|
||||
return desc;
|
||||
return desc;
|
||||
}
|
||||
}
|
||||
|
||||
return SaveStateDescriptor();
|
||||
}
|
||||
|
||||
bool CGEMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
|
||||
|
|
|
@ -284,19 +284,22 @@ void CruiseMetaEngine::removeSaveState(const char *target, int slot) const {
|
|||
SaveStateDescriptor CruiseMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
|
||||
Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(
|
||||
Cruise::CruiseEngine::getSavegameFile(slot));
|
||||
assert(f);
|
||||
|
||||
if (f) {
|
||||
Cruise::CruiseSavegameHeader header;
|
||||
Cruise::readSavegameHeader(f, header);
|
||||
delete f;
|
||||
|
||||
Cruise::CruiseSavegameHeader header;
|
||||
Cruise::readSavegameHeader(f, header);
|
||||
delete f;
|
||||
// Create the return descriptor
|
||||
SaveStateDescriptor desc(slot, header.saveName);
|
||||
desc.setDeletableFlag(true);
|
||||
desc.setWriteProtectedFlag(false);
|
||||
desc.setThumbnail(header.thumbnail);
|
||||
|
||||
// Create the return descriptor
|
||||
SaveStateDescriptor desc(slot, header.saveName);
|
||||
desc.setDeletableFlag(true);
|
||||
desc.setWriteProtectedFlag(false);
|
||||
desc.setThumbnail(header.thumbnail);
|
||||
return desc;
|
||||
}
|
||||
|
||||
return desc;
|
||||
return SaveStateDescriptor();
|
||||
}
|
||||
|
||||
bool CruiseMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
|
||||
|
|
|
@ -155,30 +155,33 @@ void DraciMetaEngine::removeSaveState(const char *target, int slot) const {
|
|||
SaveStateDescriptor DraciMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
|
||||
Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(
|
||||
Draci::DraciEngine::getSavegameFile(slot));
|
||||
assert(f);
|
||||
|
||||
if (f) {
|
||||
Draci::DraciSavegameHeader header;
|
||||
Draci::readSavegameHeader(f, header);
|
||||
delete f;
|
||||
|
||||
Draci::DraciSavegameHeader header;
|
||||
Draci::readSavegameHeader(f, header);
|
||||
delete f;
|
||||
// Create the return descriptor
|
||||
SaveStateDescriptor desc(slot, header.saveName);
|
||||
desc.setDeletableFlag(true);
|
||||
desc.setWriteProtectedFlag(false);
|
||||
desc.setThumbnail(header.thumbnail);
|
||||
|
||||
// Create the return descriptor
|
||||
SaveStateDescriptor desc(slot, header.saveName);
|
||||
desc.setDeletableFlag(true);
|
||||
desc.setWriteProtectedFlag(false);
|
||||
desc.setThumbnail(header.thumbnail);
|
||||
int day = (header.date >> 24) & 0xFF;
|
||||
int month = (header.date >> 16) & 0xFF;
|
||||
int year = header.date & 0xFFFF;
|
||||
desc.setSaveDate(year, month, day);
|
||||
|
||||
int day = (header.date >> 24) & 0xFF;
|
||||
int month = (header.date >> 16) & 0xFF;
|
||||
int year = header.date & 0xFFFF;
|
||||
desc.setSaveDate(year, month, day);
|
||||
int hour = (header.time >> 8) & 0xFF;
|
||||
int minutes = header.time & 0xFF;
|
||||
desc.setSaveTime(hour, minutes);
|
||||
|
||||
int hour = (header.time >> 8) & 0xFF;
|
||||
int minutes = header.time & 0xFF;
|
||||
desc.setSaveTime(hour, minutes);
|
||||
desc.setPlayTime(header.playtime * 1000);
|
||||
|
||||
desc.setPlayTime(header.playtime * 1000);
|
||||
return desc;
|
||||
}
|
||||
|
||||
return desc;
|
||||
return SaveStateDescriptor();
|
||||
}
|
||||
|
||||
bool DraciMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
|
||||
|
|
|
@ -156,22 +156,25 @@ public:
|
|||
SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const {
|
||||
Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(
|
||||
generateGameStateFileName(target, slot));
|
||||
assert(f);
|
||||
|
||||
if (f) {
|
||||
TsAGE::tSageSavegameHeader header;
|
||||
TsAGE::Saver::readSavegameHeader(f, header);
|
||||
delete f;
|
||||
|
||||
TsAGE::tSageSavegameHeader header;
|
||||
TsAGE::Saver::readSavegameHeader(f, header);
|
||||
delete f;
|
||||
// Create the return descriptor
|
||||
SaveStateDescriptor desc(slot, header.saveName);
|
||||
desc.setDeletableFlag(true);
|
||||
desc.setWriteProtectedFlag(false);
|
||||
desc.setThumbnail(header.thumbnail);
|
||||
desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay);
|
||||
desc.setSaveTime(header.saveHour, header.saveMinutes);
|
||||
desc.setPlayTime(header.totalFrames * GAME_FRAME_TIME);
|
||||
|
||||
// Create the return descriptor
|
||||
SaveStateDescriptor desc(slot, header.saveName);
|
||||
desc.setDeletableFlag(true);
|
||||
desc.setWriteProtectedFlag(false);
|
||||
desc.setThumbnail(header.thumbnail);
|
||||
desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay);
|
||||
desc.setSaveTime(header.saveHour, header.saveMinutes);
|
||||
desc.setPlayTime(header.totalFrames * GAME_FRAME_TIME);
|
||||
return desc;
|
||||
}
|
||||
|
||||
return desc;
|
||||
return SaveStateDescriptor();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue