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); 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::ScopedPtr<Common::InSaveFile> in(saveFileMan->openForLoading(*file)); if (in) { Fullpipe::FullpipeSavegameHeader header; if (!Fullpipe::readSavegameHeader(in.get(), header)) { continue; } SaveStateDescriptor desc; parseSavegameHeader(header, desc); desc.setSaveSlot(slotNum); saveList.push_back(desc); } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
SaveStateList DrasculaMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String pattern = target; pattern += ".###"; filenames = saveFileMan->listSavefiles(pattern); 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 <= getMaximumSaveSlot()) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { SaveStateDescriptor desc = loadMetaData(in, slotNum, false); if (desc.getSaveSlot() != slotNum) { // invalid delete in; continue; } saveList.push_back(desc); delete in; } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); 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()); 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; } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
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; }
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]) { Common::String description = Common::String::format("savegm.%02d", slot); saveList.push_back(SaveStateDescriptor(slot, description)); } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
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 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 GrimMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String targetString(target); Common::String pattern = targetString.hasPrefix("monkey4") ? "efmi*.gsv" : "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; }
void Script::o_checkvalidsaves() { debugScript(1, true, "CHECKVALIDSAVES"); // Reset the array of valid saves and the savegame names cache for (int i = 0; i < 10; i++) { setVariable(i, 0); _saveNames[i] = "E M P T Y"; } // Get the list of savefiles SaveStateList list = SaveLoad::listValidSaves(ConfMan.getActiveDomainName()); // Mark the existing savefiles as valid uint count = 0; SaveStateList::iterator it = list.begin(); while (it != list.end()) { int8 slot = it->getSaveSlot(); if (SaveLoad::isSlotValid(slot)) { debugScript(2, true, " Found valid savegame: %s", it->getDescription().c_str()); // Mark this slot as used setVariable(slot, 1); // Cache this slot's description _saveNames[slot] = it->getDescription(); count++; } it++; } // Save the number of valid saves setVariable(0x104, count); debugScript(1, true, " Found %d valid savegames", count); }
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); 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; }
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; }
SaveStateList CProjectItem::getSavegameList(const Common::String &target) { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String saveDesc; Common::String pattern = Common::String::format("%s.0??", target.c_str()); TitanicSavegameHeader 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_SAVEGAME_SLOTS) { Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); if (in) { SimpleFile f; f.open(in); if (!readSavegameHeader(&f, header)) continue; saveList.push_back(SaveStateDescriptor(slot, header._saveName)); header._thumbnail->free(); delete header._thumbnail; delete in; } } } return saveList; }
SaveStateList TinselMetaEngine::listSaves(const char *target) const { Common::String pattern = target; pattern = pattern + ".###"; Common::StringArray files = g_system->getSavefileManager()->listSavefiles(pattern); 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; } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
SaveStateList SwordMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); SaveStateList saveList; char saveName[40]; Common::StringList filenames = saveFileMan->listSavefiles("sword1.???"); sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) int slotNum = 0; for (Common::StringList::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 AgosMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String saveDesc; Common::String pattern = target; pattern += ".???"; 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) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { saveDesc = file->c_str(); saveList.push_back(SaveStateDescriptor(slotNum, saveDesc)); delete in; } } } return saveList; }
SaveStateList AgiMetaEngine::listSaves(const char *target) const { const uint32 AGIflag = MKTAG('A','G','I',':'); Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; char saveDesc[31]; Common::String pattern = target; pattern += ".###"; 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) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { uint32 type = in->readUint32BE(); if (type == AGIflag) in->read(saveDesc, 31); saveList.push_back(SaveStateDescriptor(slotNum, saveDesc)); delete in; } } } return saveList; }
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)); header.thumbnail->free(); delete header.thumbnail; } delete in; } } } return saveList; }
SaveStateList GnapMetaEngine::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); Gnap::GnapSavegameHeader header; filenames = saveFileMan->listSavefiles(pattern); 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 < getMaximumSaveSlot()) { Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); if (in) { Gnap::GnapEngine::readSavegameHeader(in, header); saveList.push_back(SaveStateDescriptor(slot, header._saveName)); if (header._thumbnail) { header._thumbnail->free(); delete header._thumbnail; } delete in; } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
SaveStateList PictureMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Picture::PictureEngine::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 (Picture::PictureEngine::readSaveHeader(in, false, header) == Picture::PictureEngine::kRSHENoError) { saveList.push_back(SaveStateDescriptor(slotNum, header.description)); } delete in; } } } return saveList; }
SaveStateList listSaves(const char *target) const { SaveStateList saves; Wintermute::BasePersistenceManager pm(target, true); for (int i = 0; i < getMaximumSaveSlot(); i++) { if (pm.getSaveExists(i)) { SaveStateDescriptor desc; pm.getSaveStateDesc(i, desc); saves.push_back(desc); } } return saves; }
SaveStateList AvalancheMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String pattern = target; pattern.toUppercase(); pattern += ".???"; filenames = saveFileMan->listSavefiles(pattern); sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) SaveStateList saveList; for (Common::StringArray::const_iterator filename = filenames.begin(); filename != filenames.end(); ++filename) { const Common::String &fname = *filename; int slotNum = atoi(fname.c_str() + fname.size() - 3); if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) { Common::InSaveFile *file = saveFileMan->openForLoading(fname); if (file) { // Check for our signature. uint32 signature = file->readUint32LE(); if (signature != MKTAG('A', 'V', 'A', 'L')) { warning("Savegame of incompatible type!"); delete file; continue; } // Check version. byte saveVersion = file->readByte(); if (saveVersion != kSavegameVersion) { warning("Savegame of incompatible version!"); delete file; continue; } // Read name. uint32 nameSize = file->readUint32LE(); if (nameSize >= 255) { delete file; continue; } char *name = new char[nameSize + 1]; file->read(name, nameSize); name[nameSize] = 0; saveList.push_back(SaveStateDescriptor(slotNum, name)); delete[] name; delete file; } } } return saveList; }
virtual SaveStateList listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::String pattern = Common::String::format("%s??", target); // Get list of savefiles for target game Common::StringArray filenames = saveFileMan->listSavefiles(pattern); Common::Array<int> slots; 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); // Ensure save slot is within valid range if (slotNum >= 1 && slotNum <= 10) { slots.push_back(slotNum); } } // Sort save slot ids Common::sort<int>(slots.begin(), slots.end()); // Load save index Common::String fileEpa = Common::String::format("%s.epa", target); Common::InSaveFile *epa = saveFileMan->openForLoading(fileEpa); // Get savegame names from index Common::String saveDesc; SaveStateList saveList; int line = 1; for (uint i = 0; i < slots.size(); i++) { // ignore lines corresponding to unused saveslots for (; line < slots[i]; line++) epa->readLine(); // copy the name in the line corresponding to the save slot and truncate to 22 characters saveDesc = Common::String(epa->readLine().c_str(), 22); // handle cases where the save directory and save index are detectably out of sync if (saveDesc == "*") saveDesc = "No name specified."; // increment line number to keep it in sync with slot number line++; // Insert savegame name into list saveList.push_back(SaveStateDescriptor(slots[i], saveDesc)); } delete epa; return saveList; }
SaveStateList SkyMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); SaveStateList saveList; // Load the descriptions Common::StringArray savenames; savenames.resize(MAX_SAVE_GAMES+1); Common::InSaveFile *inf; inf = saveFileMan->openForLoading("SKY-VM.SAV"); if (inf != NULL) { char *tmpBuf = new char[MAX_SAVE_GAMES * MAX_TEXT_LEN]; char *tmpPtr = tmpBuf; inf->read(tmpBuf, MAX_SAVE_GAMES * MAX_TEXT_LEN); for (int i = 0; i < MAX_SAVE_GAMES; ++i) { savenames[i] = tmpPtr; tmpPtr += savenames[i].size() + 1; } delete inf; delete[] tmpBuf; } // Find all saves Common::StringArray filenames; filenames = saveFileMan->listSavefiles("SKY-VM.???"); sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) // Slot 0 is the autosave, if it exists. // TODO: Check for the existence of the autosave -- but this require us // to know which SKY variant we are looking at. saveList.insert_at(0, SaveStateDescriptor(0, "*AUTOSAVE*")); // Prepare the list of savestates by looping over all matching savefiles for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Extract the extension Common::String ext = file->c_str() + file->size() - 3; ext.toUppercase(); if (Common::isDigit(ext[0]) && Common::isDigit(ext[1]) && Common::isDigit(ext[2])) { int slotNum = atoi(ext.c_str()); Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { saveList.push_back(SaveStateDescriptor(slotNum+1, savenames[slotNum])); delete in; } } } return saveList; }
SaveStateList CGEMetaEngine::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 filename = filenames.begin(); filename != filenames.end(); ++filename) { // Obtain the last 3 digits of the filename, since they correspond to the save slot slotNum = atoi(filename->c_str() + filename->size() - 3); if (slotNum >= 0 && slotNum <= 99) { Common::InSaveFile *file = saveFileMan->openForLoading(*filename); if (file) { CGE::SavegameHeader header; // Check to see if it's a ScummVM savegame or not char buffer[kSavegameStrSize + 1]; file->read(buffer, kSavegameStrSize + 1); if (!strncmp(buffer, CGE::savegameStr, kSavegameStrSize + 1)) { // Valid savegame if (CGE::CGEEngine::readSavegameHeader(file, header)) { saveList.push_back(SaveStateDescriptor(slotNum, header.saveName)); if (header.thumbnail) { header.thumbnail->free(); delete header.thumbnail; } } } else { // Must be an original format savegame saveList.push_back(SaveStateDescriptor(slotNum, "Unknown")); } delete file; } } } return saveList; }
SaveStateList CineMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); SaveStateList saveList; Common::String pattern = target; pattern += ".?"; Common::StringArray filenames = saveFileMan->listSavefiles(pattern); sort(filenames.begin(), filenames.end()); Common::StringArray::const_iterator file; Common::String filename = target; filename += ".dir"; Common::InSaveFile *in = saveFileMan->openForLoading(filename); if (in) { typedef char CommandeType[20]; CommandeType saveNames[10]; // Initialize all savegames' descriptions to empty strings // so that if the savegames' descriptions can only be partially read from file // then the missing ones are correctly set to empty strings. memset(saveNames, 0, sizeof(saveNames)); in->read(saveNames, 10 * 20); CommandeType saveDesc; for (file = filenames.begin(); file != filenames.end(); ++file) { // Jump over savegame files that don't end with a digit (e.g. "fw.3" is ok, "fw.a" is not). if (!isdigit(file->lastChar())) continue; // Obtain the last digit of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 1); // Copy the savegame description making sure it ends with a trailing zero strncpy(saveDesc, saveNames[slotNum], 20); saveDesc[sizeof(CommandeType) - 1] = 0; saveList.push_back(SaveStateDescriptor(slotNum, saveDesc)); } } delete in; return saveList; }
SaveStateList BuriedMetaEngine::listSaves(const char *target) const { // The original had no pattern, so the user must rename theirs // Note that we ignore the target because saves are compatible between // all versions Common::StringArray fileNames = Buried::BuriedEngine::listSaveFiles(); SaveStateList saveList; for (uint32 i = 0; i < fileNames.size(); i++) { // Isolate the description from the file name Common::String desc = fileNames[i].c_str() + 7; for (int j = 0; j < 4; j++) desc.deleteLastChar(); saveList.push_back(SaveStateDescriptor(i, desc)); } return saveList; }
SaveStateList Sword25MetaEngine::listSaves(const char *target) const { Common::String pattern = target; pattern = pattern + ".???"; SaveStateList saveList; Sword25::PersistenceService ps; Sword25::setGameTarget(target); ps.reloadSlots(); for (uint i = 0; i < ps.getSlotCount(); ++i) { if (ps.isSlotOccupied(i)) { Common::String desc = ps.getSavegameDescription(i); saveList.push_back(SaveStateDescriptor(i, desc)); } } return saveList; }