Common::String *LureEngine::detectSave(int slotNumber) { Common::ReadStream *f = this->_saveFileMan->openForLoading( generateSaveName(slotNumber)); if (f == NULL) return NULL; Common::String *result = NULL; // Check for header char buffer[5]; f->read(&buffer[0], 5); if (memcmp(&buffer[0], "lure", 5) == 0) { // Check language version uint8 language = f->readByte(); uint8 version = f->readByte(); if ((language == getLanguage()) && (version >= LURE_MIN_SAVEGAME_MINOR)) { // Read in the savegame title char saveName[MAX_DESC_SIZE]; char *p = saveName; int decCtr = MAX_DESC_SIZE - 1; while ((decCtr > 0) && ((*p++ = f->readByte()) != 0)) --decCtr; *p = '\0'; result = new Common::String(saveName); } } delete f; return result; }
CString TitanicEngine::getSavegameName(int slot) { // Try and open up the savegame for access Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading( generateSaveName(slot)); if (in) { // Read in the savegame header data CompressedFile file; file.open(in); TitanicSavegameHeader header; bool isValid = CProjectItem::readSavegameHeader(&file, header); if (header._thumbnail) { header._thumbnail->free(); delete header._thumbnail; } file.close(); if (isValid) // Set the name text return header._saveName; } return CString(); }
Common::Error SavesManager::saveGameState(int slot, const Common::String &desc) { Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving( generateSaveName(slot)); if (!out) return Common::kCreatingFileFailed; // Push map and party data to the save archives Map &map = *g_vm->_map; map.saveMaze(); // Write the savegame header XeenSavegameHeader header; header._saveName = desc; writeSavegameHeader(out, header); // Loop through saving the sides' save archives SaveArchive *archives[2] = { File::_xeenSave, File::_darkSave }; for (int idx = 0; idx < 2; ++idx) { if (archives[idx]) { archives[idx]->save(*out); } else { // Side isn't present out->writeUint32LE(0); } } // Write out miscellaneous FileManager &files = *g_vm->_files; files.save(*out); out->finalize(); delete out; return Common::kNoError; }
/** * Returns true if a given savegame exists */ bool CGEEngine::savegameExists(int slotNumber) { Common::String slotName = generateSaveName(slotNumber); Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(slotName); bool result = saveFile != NULL; delete saveFile; return result; }
Common::Error SavesManager::loadGameState(int slot) { Combat &combat = *g_vm->_combat; EventsManager &events = *g_vm->_events; FileManager &files = *g_vm->_files; Map &map = *g_vm->_map; Party &party = *g_vm->_party; Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading( generateSaveName(slot)); if (!saveFile) return Common::kReadingFailed; // Load the savaegame header XeenSavegameHeader header; if (!readSavegameHeader(saveFile, header)) error("Invalid savegame"); // Set the total play time events.setPlayTime(header._totalFrames); // Loop through loading the sides' save archives SaveArchive *archives[2] = { File::_xeenSave, File::_darkSave }; for (int idx = 0; idx < 2; ++idx) { uint fileSize = saveFile->readUint32LE(); if (archives[idx]) { if (fileSize) { Common::SeekableSubReadStream arcStream(saveFile, saveFile->pos(), saveFile->pos() + fileSize); archives[idx]->load(arcStream); } else { archives[idx]->reset((idx == 1) ? File::_darkCc : File::_xeenCc); } } else { assert(!fileSize); } } // Read in miscellaneous files.load(*saveFile); // Load the character roster and party File::_currentSave->loadParty(); // Reset any combat information from the previous game combat.reset(); party._treasure.reset(); // Load the new map map.clearMaze(); map._loadCcNum = files._ccNum; map.load(party._mazeId); delete saveFile; return Common::kNoError; }
void CGEEngine::saveGame(int slotNumber, const Common::String &desc) { // Set up the serializer Common::String slotName = generateSaveName(slotNumber); Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(slotName); // Write out the ScummVM savegame header SavegameHeader header; header.saveName = desc; header.version = kSavegameVersion; writeSavegameHeader(saveFile, header); // Write out the data of the savegame syncGame(NULL, saveFile, false); // Finish writing out game data saveFile->finalize(); delete saveFile; }
Common::Error XeenEngine::saveGameState(int slot, const Common::String &desc) { Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving( generateSaveName(slot)); if (!out) return Common::kCreatingFileFailed; XeenSavegameHeader header; header._saveName = desc; writeSavegameHeader(out, header); Common::Serializer s(nullptr, out); synchronize(s); out->finalize(); delete out; return Common::kNoError; }
bool CGE2Engine::loadGame(int slotNumber) { Common::MemoryReadStream *readStream; // Open up the savegame file Common::String slotName = generateSaveName(slotNumber); Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(slotName); // Read the data into a data buffer int size = saveFile->size(); byte *dataBuffer = (byte *)malloc(size); saveFile->read(dataBuffer, size); readStream = new Common::MemoryReadStream(dataBuffer, size, DisposeAfterUse::YES); delete saveFile; // Check to see if it's a ScummVM savegame or not char buffer[kSavegameStrSize + 1]; readStream->read(buffer, kSavegameStrSize + 1); if (strncmp(buffer, kSavegameStr, kSavegameStrSize + 1) != 0) { delete readStream; return false; } else { SavegameHeader saveHeader; if (!readSavegameHeader(readStream, saveHeader)) { delete readStream; return false; } // Delete the thumbnail saveHeader.thumbnail->free(); delete saveHeader.thumbnail; } resetGame(); // Get in the savegame syncGame(readStream, nullptr); delete readStream; loadHeroes(); return true; }
bool LureEngine::saveGame(uint8 slotNumber, Common::String &caption) { Common::WriteStream *f = this->_saveFileMan->openForSaving( generateSaveName(slotNumber)); if (f == NULL) return false; f->write("lure", 5); f->writeByte(getLanguage()); f->writeByte(LURE_SAVEGAME_MINOR); f->writeString(caption); f->writeByte(0); // End of string terminator Resources::getReference().saveToStream(f); Game::getReference().saveToStream(f); Sound.saveToStream(f); Fights.saveToStream(f); Room::getReference().saveToStream(f); delete f; return true; }
bool LureEngine::loadGame(uint8 slotNumber) { Common::ReadStream *f = this->_saveFileMan->openForLoading( generateSaveName(slotNumber)); if (f == NULL) return false; // Check for header char buffer[5]; f->read(buffer, 5); if (memcmp(buffer, "lure", 5) != 0) { warning(FAILED_MSG, slotNumber); delete f; return false; } // Check language version uint8 language = f->readByte(); _saveVersion = f->readByte(); if ((language != getLureLanguage()) || (_saveVersion < LURE_MIN_SAVEGAME_MINOR)) { warning("loadGame: Failed to load slot %d - incorrect version", slotNumber); delete f; return false; } // Read in and discard the savegame caption while (f->readByte() != 0) ; // Load in the data Resources::getReference().loadFromStream(f); Game::getReference().loadFromStream(f); Sound.loadFromStream(f); Fights.loadFromStream(f); Room::getReference().loadFromStream(f); delete f; return true; }
Common::Error XeenEngine::loadGameState(int slot) { Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading( generateSaveName(slot)); if (!saveFile) return Common::kReadingFailed; Common::Serializer s(saveFile, nullptr); // Load the savaegame header XeenSavegameHeader header; if (!readSavegameHeader(saveFile, header)) error("Invalid savegame"); if (header._thumbnail) { header._thumbnail->free(); delete header._thumbnail; } // Load most of the savegame data synchronize(s); delete saveFile; return Common::kNoError; }
bool CGEEngine::loadGame(int slotNumber, SavegameHeader *header, bool tiny) { debugC(1, kCGEDebugEngine, "CGEEngine::loadgame(%d, header, %s)", slotNumber, tiny ? "true" : "false"); Common::MemoryReadStream *readStream; SavegameHeader saveHeader; if (slotNumber == -1) { // Loading the data for the initial game state EncryptedStream file = EncryptedStream(this, kSavegame0Name); int size = file.size(); byte *dataBuffer = (byte *)malloc(size); file.read(dataBuffer, size); readStream = new Common::MemoryReadStream(dataBuffer, size, DisposeAfterUse::YES); } else { // Open up the savegame file Common::String slotName = generateSaveName(slotNumber); Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(slotName); // Read the data into a data buffer int size = saveFile->size(); byte *dataBuffer = (byte *)malloc(size); saveFile->read(dataBuffer, size); readStream = new Common::MemoryReadStream(dataBuffer, size, DisposeAfterUse::YES); delete saveFile; } // Check to see if it's a ScummVM savegame or not char buffer[kSavegameStrSize + 1]; readStream->read(buffer, kSavegameStrSize + 1); if (strncmp(buffer, savegameStr, kSavegameStrSize + 1) != 0) { // It's not, so rewind back to the start readStream->seek(0); if (header) // Header wanted where none exists, so return false return false; } else { // Found header if (!readSavegameHeader(readStream, saveHeader)) { delete readStream; return false; } if (header) { *header = saveHeader; delete readStream; return true; } // Delete the thumbnail saveHeader.thumbnail->free(); delete saveHeader.thumbnail; } // Get in the savegame syncGame(readStream, NULL, tiny); delete readStream; return true; }