SaveStateList DraciMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String pattern("draci.s##"); filenames = saveFileMan->listSavefiles(pattern); SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 2 digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 2); if (slotNum >= 0 && slotNum <= 99) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { Draci::DraciSavegameHeader header; if (Draci::readSavegameHeader(in, header)) { saveList.push_back(SaveStateDescriptor(slotNum, header.saveName)); } delete in; } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
SaveStateList listSaves(const char *target) const override { Common::String pattern = Common::String::format("%s-###.tlj", target); Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles(pattern); int targetLen = strlen(target); SaveStateList saveList; for (Common::StringArray::const_iterator filename = filenames.begin(); filename != filenames.end(); ++filename) { // Extract the slot number from the filename char slot[4]; slot[0] = (*filename)[targetLen + 1]; slot[1] = (*filename)[targetLen + 2]; slot[2] = (*filename)[targetLen + 3]; slot[3] = '\0'; // Read the description from the save Common::String description; Common::InSaveFile *save = g_system->getSavefileManager()->openForLoading(*filename); if (save) { StateReadStream *stream = new StateReadStream(save); description = stream->readString(); delete stream; } saveList.push_back(SaveStateDescriptor(atoi(slot), description)); } Common::sort(saveList.begin(), saveList.end(), cmpSave); return saveList; }
SaveStateList ToltecsMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Toltecs::ToltecsEngine::SaveHeader header; Common::String pattern = target; pattern += ".???"; Common::StringArray filenames; filenames = saveFileMan->listSavefiles(pattern.c_str()); Common::sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 3 digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 3); if (slotNum >= 0 && slotNum <= 999) { Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str()); if (in) { if (Toltecs::ToltecsEngine::readSaveHeader(in, false, header) == Toltecs::ToltecsEngine::kRSHENoError) { saveList.push_back(SaveStateDescriptor(slotNum, header.description)); } delete in; } } } return saveList; }
SaveStateList AccessMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String saveDesc; Common::String pattern = Common::String::format("%s.0##", target); Access::AccessSavegameHeader header; filenames = saveFileMan->listSavefiles(pattern); sort(filenames.begin(), filenames.end()); // Sort to get the files in numerical order SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { const char *ext = strrchr(file->c_str(), '.'); int slot = ext ? atoi(ext + 1) : -1; if (slot >= 0 && slot < MAX_SAVES) { Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); if (in) { Access::AccessEngine::readSavegameHeader(in, header); saveList.push_back(SaveStateDescriptor(slot, header._saveName)); header._thumbnail->free(); delete header._thumbnail; delete in; } } } return saveList; }
SaveStateList SwordMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); SaveStateList saveList; char saveName[40]; Common::StringArray filenames = saveFileMan->listSavefiles("sword1.???"); sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) int slotNum = 0; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 3 digits of the filename, since they correspond to the save slot slotNum = atoi(file->c_str() + file->size() - 3); if (slotNum >= 0 && slotNum <= 999) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { in->readUint32LE(); // header in->read(saveName, 40); saveList.push_back(SaveStateDescriptor(slotNum, saveName)); delete in; } } } return saveList; }
virtual SaveStateList listSaves(const char *target) const { Common::String pattern = target; pattern += ".*"; Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles(pattern); Common::sort(filenames.begin(), filenames.end()); SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { int slot; const char *ext = strrchr(file->c_str(), '.'); if (ext && (slot = atoi(ext + 1)) >= 0 && slot < MAX_SAVES) { Common::ScopedPtr<Common::InSaveFile> in(g_system->getSavefileManager()->openForLoading(*file)); if (!in) continue; char buf[25]; in->seek(0); in->read(buf, 24); buf[24] = 0; saveList.push_back(SaveStateDescriptor(slot, buf)); } } return saveList; }
SaveStateList NeverhoodMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Neverhood::NeverhoodEngine::SaveHeader header; Common::String pattern = target; pattern += ".###"; Common::StringArray filenames; filenames = saveFileMan->listSavefiles(pattern.c_str()); SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); file++) { // Obtain the last 3 digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 3); if (slotNum >= 0 && slotNum <= 999) { Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str()); if (in) { if (Neverhood::NeverhoodEngine::readSaveHeader(in, false, header) == Neverhood::NeverhoodEngine::kRSHENoError) { saveList.push_back(SaveStateDescriptor(slotNum, header.description)); } delete in; } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
SaveStateDescriptor TonyMetaEngine::querySaveMetaInfos(const char *target, int slot) const { Common::String saveName; byte difficulty; byte thumbData[160 * 120 * 2]; if (Tony::RMOptionScreen::loadThumbnailFromSaveState(slot, thumbData, saveName, difficulty)) { // Convert the 565 thumbnail data to the needed overlay format Common::MemoryReadStream thumbStream(thumbData, 160 * 120 * 2); Graphics::PixelFormat destFormat = g_system->getOverlayFormat(); Graphics::Surface *to = new Graphics::Surface(); to->create(160, 120, destFormat); OverlayColor *pixels = (OverlayColor *)to->pixels; for (int y = 0; y < to->h; ++y) { for (int x = 0; x < to->w; ++x) { uint8 r, g, b; Graphics::colorToRGB<Graphics::ColorMasks<555> >(thumbStream.readUint16LE(), r, g, b); // converting to current OSystem Color *pixels++ = destFormat.RGBToColor(r, g, b); } } // Create the return descriptor SaveStateDescriptor desc(slot, saveName); desc.setDeletableFlag(true); desc.setWriteProtectedFlag(false); desc.setThumbnail(to); return desc; } return SaveStateDescriptor(); }
SaveStateList LureMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String saveDesc; Common::String pattern = "lure.###"; filenames = saveFileMan->listSavefiles(pattern); SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 3 digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 3); if (slotNum >= 0 && slotNum <= 999) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { saveDesc = Lure::getSaveName(in); saveList.push_back(SaveStateDescriptor(slotNum, saveDesc)); delete in; } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
SaveStateList TinselMetaEngine::listSaves(const char *target) const { Common::String pattern = target; pattern = pattern + ".???"; Common::StringArray files = g_system->getSavefileManager()->listSavefiles(pattern); sort(files.begin(), files.end()); // Sort (hopefully ensuring we are sorted numerically..) SaveStateList saveList; int slotNum = 0; for (Common::StringArray::const_iterator file = files.begin(); file != files.end(); ++file) { // Obtain the last 3 digits of the filename, since they correspond to the save slot slotNum = atoi(file->c_str() + file->size() - 3); const Common::String &fname = *file; Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(fname); if (in) { in->readUint32LE(); // skip id in->readUint32LE(); // skip size in->readUint32LE(); // skip version char saveDesc[Tinsel::SG_DESC_LEN]; in->read(saveDesc, sizeof(saveDesc)); saveDesc[Tinsel::SG_DESC_LEN - 1] = 0; saveList.push_back(SaveStateDescriptor(slotNum, saveDesc)); delete in; } } return saveList; }
SaveStateList TonyMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String saveDesc; Common::String pattern = "tony.0??"; filenames = saveFileMan->listSavefiles(pattern); sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 3 digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 3); if (slotNum >= 0 && slotNum <= 999) { byte thumbnailData[160 * 120 * 2]; Common::String saveName; byte difficulty; if (Tony::RMOptionScreen::loadThumbnailFromSaveState(slotNum, thumbnailData, saveName, difficulty)) { // Add the save name to the savegame list saveList.push_back(SaveStateDescriptor(slotNum, saveName)); } } } return saveList; }
SaveStateDescriptor DraciMetaEngine::querySaveMetaInfos(const char *target, int slot) const { Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading( Draci::DraciEngine::getSavegameFile(slot)); if (f) { Draci::DraciSavegameHeader header; Draci::readSavegameHeader(f, header); delete f; // Create the return descriptor SaveStateDescriptor desc(slot, header.saveName); 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 hour = (header.time >> 8) & 0xFF; int minutes = header.time & 0xFF; desc.setSaveTime(hour, minutes); desc.setPlayTime(header.playtime * 1000); return desc; } return SaveStateDescriptor(); }
SaveStateDescriptor TitanicMetaEngine::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); if (f) { Titanic::CompressedFile file; file.open(f); Titanic::TitanicSavegameHeader header; Titanic::CProjectItem::readSavegameHeader(&file, header); file.close(); // Create the return descriptor SaveStateDescriptor desc(slot, header._saveName); desc.setThumbnail(header._thumbnail); desc.setSaveDate(header._year, header._month, header._day); desc.setSaveTime(header._hour, header._minute); desc.setPlayTime(header._totalFrames * GAME_FRAME_TIME); return desc; } return SaveStateDescriptor(); }
SaveStateList SagaMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; char saveDesc[SAVE_TITLE_SIZE]; Common::String pattern = target; pattern += ".s##"; filenames = saveFileMan->listSavefiles(pattern); SaveStateList saveList; int slotNum = 0; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 2 digits of the filename, since they correspond to the save slot slotNum = atoi(file->c_str() + file->size() - 2); if (slotNum >= 0 && slotNum < MAX_SAVES) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { for (int i = 0; i < 3; i++) in->readUint32BE(); in->read(saveDesc, SAVE_TITLE_SIZE); saveList.push_back(SaveStateDescriptor(slotNum, saveDesc)); delete in; } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
SaveStateDescriptor DreamWebMetaEngine::querySaveMetaInfos(const char *target, int slot) const { Common::String filename = Common::String::format("DREAMWEB.D%02d", slot); Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(filename.c_str()); if (in) { DreamWeb::FileHeader header; in->read((uint8 *)&header, sizeof(DreamWeb::FileHeader)); Common::String saveName; byte descSize = header.len(0); byte i; for (i = 0; i < descSize; i++) saveName += (char)in->readByte(); SaveStateDescriptor desc(slot, saveName); // Check if there is a ScummVM data block if (header.len(6) == SCUMMVM_BLOCK_MAGIC_SIZE) { // Skip the game data for (i = 1; i <= 5; i++) in->skip(header.len(i)); uint32 tag = in->readUint32BE(); if (tag != SCUMMVM_HEADER) { warning("ScummVM data block found, but the block header is incorrect - skipping"); delete in; return desc; } byte version = in->readByte(); if (version > SAVEGAME_VERSION) { warning("ScummVM data block found, but it has been saved with a newer version of ScummVM - skipping"); delete in; return desc; } uint32 saveDate = in->readUint32LE(); uint32 saveTime = in->readUint32LE(); uint32 playTime = in->readUint32LE(); Graphics::Surface *thumbnail = Graphics::loadThumbnail(*in); int day = (saveDate >> 24) & 0xFF; int month = (saveDate >> 16) & 0xFF; int year = saveDate & 0xFFFF; int hour = (saveTime >> 16) & 0xFF; int minutes = (saveTime >> 8) & 0xFF; desc.setSaveDate(year, month, day); desc.setSaveTime(hour, minutes); desc.setPlayTime(playTime * 1000); desc.setThumbnail(thumbnail); } delete in; return desc; } return SaveStateDescriptor(); }
SaveStateList LabMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Lab::SaveGameHeader header; Common::String pattern = target; pattern += ".###"; Common::StringArray filenames; filenames = saveFileMan->listSavefiles(pattern.c_str()); Common::sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)*/ SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 3 digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 3); if ((slotNum >= 0) && (slotNum <= 999)) { Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str()); if (in) { if (Lab::readSaveGameHeader(in, header)) saveList.push_back(SaveStateDescriptor(slotNum, header._descr.getDescription())); delete in; } } } return saveList; }
SaveStateList QueenMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; char saveDesc[32]; Common::String pattern("queen.s??"); filenames = saveFileMan->listSavefiles(pattern); sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 2 digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 2); if (slotNum >= 0 && slotNum <= 99) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { for (int i = 0; i < 4; i++) in->readUint32BE(); in->read(saveDesc, 32); saveList.push_back(SaveStateDescriptor(slotNum, saveDesc)); delete in; } } } return saveList; }
virtual SaveStateList listSaves(const char *target) const { Common::String pattern = Tucker::generateGameStateFileName(target, 0, true); Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles(pattern); bool slotsTable[Tucker::kLastSaveSlot + 1]; memset(slotsTable, 0, sizeof(slotsTable)); SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { int slot; const char *ext = strrchr(file->c_str(), '.'); if (ext && (slot = atoi(ext + 1)) >= 0 && slot <= Tucker::kLastSaveSlot) { Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); if (in) { slotsTable[slot] = true; delete in; } } } for (int slot = 0; slot <= Tucker::kLastSaveSlot; ++slot) { if (slotsTable[slot]) { char description[64]; snprintf(description, sizeof(description), "savegm.%02d", slot); saveList.push_back(SaveStateDescriptor(slot, description)); } } return saveList; }
SaveStateList GrimMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String pattern = "grim*.gsv"; filenames = saveFileMan->listSavefiles(pattern); SaveStateList saveList; char str[256]; int32 strSize; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + 4); if (slotNum >= 0) { SaveGame *savedState = SaveGame::openForLoading(*file); if (savedState && savedState->isCompatible()) { savedState->beginSection('SUBS'); strSize = savedState->readLESint32(); savedState->read(str, strSize); savedState->endSection(); saveList.push_back(SaveStateDescriptor(slotNum, str)); } delete savedState; } } Common::sort(saveList.begin(), saveList.end(), cmpSave); return saveList; }
SaveStateDescriptor MohawkMetaEngine::querySaveMetaInfos(const char *target, int slot) const { #ifdef ENABLE_MYST if (strstr(target, "myst")) { Common::StringArray filenames = Mohawk::MystGameState::generateSaveGameList(); if (slot >= (int) filenames.size()) { return SaveStateDescriptor(); } return Mohawk::MystGameState::querySaveMetaInfos(filenames[slot]); } else #endif { return SaveStateDescriptor(); } }
SaveStateList VoyeurMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String saveDesc; Common::String pattern = Common::String::format("%s.0##", target); filenames = saveFileMan->listSavefiles(pattern); SaveStateList saveList; Voyeur::VoyeurSavegameHeader header; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { const char *ext = strrchr(file->c_str(), '.'); int slot = ext ? atoi(ext + 1) : -1; if (slot >= 0 && slot <= MAX_SAVES) { Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); if (in) { if (header.read(in)) { saveList.push_back(SaveStateDescriptor(slot, header._saveName)); header._thumbnail->free(); } delete in; } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
SaveStateDescriptor DrasculaMetaEngine::querySaveMetaInfos(const char *target, int slot) const { Common::String fileName = Common::String::format("%s.%03d", target, slot); Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(fileName); SaveStateDescriptor desc; // Do not allow save slot 0 (used for auto-saving) to be deleted or // overwritten. desc.setDeletableFlag(slot != 0); desc.setWriteProtectedFlag(slot == 0); if (in) { desc = Drascula::loadMetaData(in, slot, false); if (desc.getSaveSlot() != slot) { delete in; return SaveStateDescriptor(); } Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*in); desc.setThumbnail(thumbnail); delete in; } return desc; }
SaveStateList WageMetaEngine::listSaves(const char *target) const { const uint32 WAGEflag = MKTAG('W','A','G','E'); Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; char saveDesc[31]; Common::String pattern = target; pattern += ".###"; filenames = saveFileMan->listSavefiles(pattern); SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 3 digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 3); if (slotNum >= 0 && slotNum <= 999) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { uint32 type = in->readUint32BE(); if (type == WAGEflag) in->read(saveDesc, 31); saveList.push_back(SaveStateDescriptor(slotNum, saveDesc)); delete in; } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
SaveStateList ToucheMetaEngine::listSaves(const char *target) const { Common::String pattern = Touche::generateGameStateFileName(target, 0, true); Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles(pattern); bool slotsTable[Touche::kMaxSaveStates]; memset(slotsTable, 0, sizeof(slotsTable)); SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { int slot = Touche::getGameStateFileSlot(file->c_str()); if (slot >= 0 && slot < Touche::kMaxSaveStates) { slotsTable[slot] = true; } } for (int slot = 0; slot < Touche::kMaxSaveStates; ++slot) { if (slotsTable[slot]) { Common::String file = Touche::generateGameStateFileName(target, slot); Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(file); if (in) { char description[64]; Touche::readGameStateDescription(in, description, sizeof(description) - 1); if (description[0]) { saveList.push_back(SaveStateDescriptor(slot, description)); } delete in; } } } return saveList; }
SaveStateList FullpipeMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String pattern("fullpipe.s##"); filenames = saveFileMan->listSavefiles(pattern); sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 2 digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 2); if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { Fullpipe::FullpipeSavegameHeader header; Fullpipe::readSavegameHeader(in, header); saveList.push_back(SaveStateDescriptor(slotNum, header.saveName)); delete header.thumbnail; delete in; } } } return saveList; }
SaveStateList KyraMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Kyra::KyraEngine_v1::SaveHeader header; Common::String pattern = target; pattern += ".???"; Common::StringArray filenames; filenames = saveFileMan->listSavefiles(pattern); Common::sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 3 digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 3); if (slotNum >= 0 && slotNum <= 999) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { if (Kyra::KyraEngine_v1::readSaveHeader(in, false, header) == Kyra::KyraEngine_v1::kRSHENoError) { // WORKAROUND: Old savegames are using 'German' as description for kyra3 restart game save (slot 0), // since that looks odd we replace it by "New Game". if (slotNum == 0 && header.gameID == Kyra::GI_KYRA3) header.description = "New Game"; saveList.push_back(SaveStateDescriptor(slotNum, header.description)); } delete in; } } } return saveList; }
SaveStateList SciMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String pattern = target; pattern += ".???"; filenames = saveFileMan->listSavefiles(pattern); sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) SaveStateList saveList; int slotNum = 0; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 3 digits of the filename, since they correspond to the save slot slotNum = atoi(file->c_str() + file->size() - 3); if (slotNum >= 0 && slotNum <= 99) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { SavegameMetadata meta; if (!get_savegame_metadata(in, &meta)) { // invalid delete in; continue; } saveList.push_back(SaveStateDescriptor(slotNum, meta.name)); delete in; } } } return saveList; }
SaveStateDescriptor KyraMetaEngine::querySaveMetaInfos(const char *target, int slot) const { Common::String filename = Kyra::KyraEngine_v1::getSavegameFilename(target, slot); Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(filename); if (in) { Kyra::KyraEngine_v1::SaveHeader header; Kyra::KyraEngine_v1::kReadSaveHeaderError error; error = Kyra::KyraEngine_v1::readSaveHeader(in, true, header); delete in; if (error == Kyra::KyraEngine_v1::kRSHENoError) { SaveStateDescriptor desc(slot, header.description); bool lolGame = ConfMan.getDomain(target)->getVal("gameid").equalsIgnoreCase("lol"); // Slot 0 is used for the 'restart game' save in all three Kyrandia games, thus // we prevent it from being deleted. desc.setDeletableFlag(slot != 0 || lolGame); // We don't allow quick saves (slot 990 till 998) to be overwritten. // The same goes for the 'Autosave', which is slot 999. desc.setWriteProtectedFlag((slot == 0 && !lolGame) || slot >= 990); desc.setThumbnail(header.thumbnail); return desc; } } return SaveStateDescriptor(); }
virtual SaveStateList listSaves(const char *target) const { Common::String pattern = target; pattern += ".???"; Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles(pattern); sort(filenames.begin(), filenames.end()); tSage::tSageSavegameHeader header; SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { const char *ext = strrchr(file->c_str(), '.'); int slot = ext ? atoi(ext + 1) : -1; if (slot >= 0 && slot < MAX_SAVES) { Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); if (in) { if (tSage::Saver::readSavegameHeader(in, header)) { saveList.push_back(SaveStateDescriptor(slot, header.saveName)); delete header.thumbnail; } delete in; } } } return saveList; }
virtual SaveStateList listSaves(const char *target) const { Common::String pattern = Tucker::generateGameStateFileName(target, 0, true); Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles(pattern); Tucker::TuckerEngine::SavegameHeader header; SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { int slot; const char *ext = strrchr(file->c_str(), '.'); if (ext && (slot = atoi(ext + 1)) >= 0 && slot <= Tucker::kLastSaveSlot) { Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); if (in) { if (Tucker::TuckerEngine::readSavegameHeader(in, header) == Tucker::TuckerEngine::kSavegameNoError) { saveList.push_back(SaveStateDescriptor(slot, header.description)); } delete in; } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }