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; 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 int 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; }
void FileBrowserDialog::updateListing() { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); ListWidget::StringArray list; Common::StringArray filenames = saveFileMan->listSavefiles(_fileMask); Common::sort(filenames.begin(), filenames.end()); for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { list.push_back(file->c_str()); } _fileList->setList(list); _fileList->scrollTo(0); // Finally, redraw draw(); }
void GUI::updateSaveFileList(Common::String targetName, bool excludeQuickSaves) { Common::String pattern = targetName + ".###"; Common::StringArray saveFileList = _vm->_saveFileMan->listSavefiles(pattern); _saveSlots.clear(); for (Common::StringArray::const_iterator i = saveFileList.begin(); i != saveFileList.end(); ++i) { // The last 3 digits of the filename correspond to the save slot. const int slotNum = atoi(i->c_str() + i->size() - 3); if (excludeQuickSaves && slotNum >= 990) continue; _saveSlots.push_back(slotNum); } if (_saveSlots.begin() == _saveSlots.end()) return; sortSaveSlots(); }
SaveStateList ToonMetaEngine::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) { int32 version = file->readSint32BE(); if (version != TOON_SAVEGAME_VERSION) { delete file; continue; } // read name uint16 nameSize = file->readUint16BE(); if (nameSize >= 255) { delete file; continue; } char name[256]; file->read(name, nameSize); name[nameSize] = 0; saveList.push_back(SaveStateDescriptor(slotNum, name)); delete file; } } } 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[128] = {0}; 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) { saveDesc[0] = 0; in->seek(in->size() - 8); uint32 offset = in->readUint32BE(); uint32 type = in->readUint32BE(); if (type == WAGEflag) { in->seek(offset); type = in->readUint32BE(); if (type == WAGEflag) { in->read(saveDesc, 127); } } saveList.push_back(SaveStateDescriptor(slotNum, saveDesc)); delete in; } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
SaveStateDescriptor MacVentureMetaEngine::querySaveMetaInfos(const char *target, int slot) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); SaveStateDescriptor desc; Common::String saveFileName; Common::String pattern = target; pattern += ".###"; Common::StringArray filenames = saveFileMan->listSavefiles(pattern); for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { int slotNum = atoi(file->c_str() + file->size() - 3); if (slotNum == slot) { saveFileName = *file; } } Common::InSaveFile *in = saveFileMan->openForLoading(saveFileName); if (in) { desc = loadMetaData(in, slot); delete in; return desc; } return SaveStateDescriptor(-1, ""); }
SaveStateList SaveFileManager::list(const Common::String &target) { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray files = saveFileMan->listSavefiles(target + ".###"); SaveStateList saveList; for (Common::StringArray::const_iterator fileName = files.begin(); fileName != files.end(); ++fileName) { Common::InSaveFile *saveFile = saveFileMan->openForLoading(*fileName); if (saveFile == nullptr || saveFile->err()) { continue; } BladeRunner::SaveFileHeader header; readHeader(*saveFile, header); int slotNum = atoi(fileName->c_str() + fileName->size() - 3); saveList.push_back(SaveStateDescriptor(slotNum, header._name)); } Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
SaveStateList GrimMetaEngine::listSaves(const char *target) const { Common::String gameId = ConfMan.get("gameid", target); Common::Platform platform = Common::parsePlatform(ConfMan.get("platform", target)); Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String pattern = gameId == "monkey4" ? "efmi###.gsv" : "grim##.gsv"; if (platform == Common::kPlatformPS2) pattern = "efmi###.ps2"; 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()) { if (platform == Common::kPlatformPS2) savedState->beginSection('PS2S'); else 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(), SaveStateDescriptorSlotComparator()); return saveList; }
SaveStateList TitanicMetaEngine::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); Titanic::TitanicSavegameHeader 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 < MAX_SAVES) { Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); if (in) { Titanic::CompressedFile cf; cf.open(in); if (Titanic::CProjectItem::readSavegameHeader(&cf, header)) saveList.push_back(SaveStateDescriptor(slot, header._saveName)); if (header._thumbnail) { header._thumbnail->free(); delete header._thumbnail; } cf.close(); } } } // 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 = 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 = atoi(file->c_str() + file->size() - 2); if (slot >= 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 MacVentureMetaEngine::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; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { int slotNum = atoi(file->c_str() + file->size() - 3); SaveStateDescriptor desc; // Do not allow save slot 0 (used for auto-saving) to be deleted or // overwritten. desc.setDeletableFlag(slotNum != 0); desc.setWriteProtectedFlag(slotNum == 0); if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { desc = loadMetaData(in, slotNum); 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; }
void ToucheEngine::handleOptions(int forceDisplay) { if (_disabledInputCounter == 0 || forceDisplay != 0) { setDefaultCursor(_currentKeyCharNum); _gameState = kGameStateOptionsDialog; MenuData menuData; memset(&menuData, 0, sizeof(MenuData)); menuData.quit = false; menuData.exit = false; menuData.mode = kMenuSettingsMode; int curMode = -1; bool doRedraw = false; while (!menuData.quit) { if (menuData.mode != curMode) { doRedraw = true; setupMenu(menuData.mode, &menuData); curMode = menuData.mode; if (menuData.mode == kMenuLoadStateMode || menuData.mode == kMenuSaveStateMode) { for (int i = 0; i < kMaxSaveStates; ++i) { menuData.saveLoadDescriptionsTable[i][0] = 0; } Common::String gameStateFileName = generateGameStateFileName(_targetName.c_str(), 0, true); Common::StringArray filenames = _saveFileMan->listSavefiles(gameStateFileName); for (Common::StringArray::const_iterator it = filenames.begin(); it != filenames.end(); ++it) { int i = getGameStateFileSlot(it->c_str()); if (i >= 0 && i < kMaxSaveStates) { Common::InSaveFile *f = _saveFileMan->openForLoading(*it); if (f) { readGameStateDescription(f, menuData.saveLoadDescriptionsTable[i], 32); delete f; } } } } } if (doRedraw) { redrawMenu(&menuData); updateScreenArea(90, 102, 460, 196); doRedraw = false; } Common::Event event; while (_eventMan->pollEvent(event)) { const Button *button = 0; switch (event.type) { case Common::EVENT_RTL: case Common::EVENT_QUIT: menuData.quit = true; menuData.exit = true; break; case Common::EVENT_LBUTTONDOWN: button = menuData.findButtonUnderCursor(event.mouse.x, event.mouse.y); if (button) { handleMenuAction(&menuData, button->action); doRedraw = true; } break; case Common::EVENT_KEYDOWN: if (menuData.mode == kMenuSaveStateMode) { if (event.kbd.keycode == Common::KEYCODE_BACKSPACE) { menuData.removeLastCharFromDescription(_saveLoadCurrentSlot); } else { menuData.addCharToDescription(_saveLoadCurrentSlot, (char)event.kbd.ascii); } doRedraw = true; } break; case Common::EVENT_WHEELUP: handleMenuAction(&menuData, kActionScrollUpSaves); doRedraw = true; break; case Common::EVENT_WHEELDOWN: handleMenuAction(&menuData, kActionScrollDownSaves); doRedraw = true; break; default: break; } } _system->updateScreen(); _system->delayMillis(10); } _fullRedrawCounter = 2; if (!menuData.exit && shouldQuit()) { if (displayQuitDialog()) quitGame(); } _gameState = kGameStateGameLoop; } }