int32 NotesHandler::getSize() { Common::String fileName = _file->build(); if (fileName.empty()) return -1; Common::InSaveFile *saveFile; SaveConverter_Notes converter(_vm, _notesSize, fileName); if (converter.isOldSave(&saveFile)) { // Old save, get the size olden-style int32 size = saveFile->size(); delete saveFile; return size; } SaveReader reader(1, 0, fileName); SaveHeader header; if (!reader.load()) return -1; if (!reader.readPartHeader(0, &header)) return -1; // Return the part's size return header.getSize(); }
Common::Error MutationOfJBEngine::saveGameState(int slot, const Common::String &desc) { const Common::String saveName = Common::String::format("%s.%03d", _targetName.c_str(), slot); Common::OutSaveFile *const saveFile = g_system->getSavefileManager()->openForSaving(saveName); Common::Serializer sz(nullptr, saveFile); SaveHeader saveHdr; saveHdr._description = desc; saveHdr.sync(sz); _game->getGameData().saveLoadWithSerializer(sz); saveFile->finalize(); delete saveFile; return Common::kNoError; }
bool SaveContainer::isSave(Common::SeekableReadStream &stream) { // Remember the stream's position to seek back to uint32 startPos = stream.pos(); SaveHeader header; header.setType(kID); header.setVersion(kVersion); bool result = header.verifyReadSize(stream); // Seek back stream.seek(startPos); return result; }
Common::Error MutationOfJBEngine::loadGameState(int slot) { const Common::String saveName = Common::String::format("%s.%03d", _targetName.c_str(), slot); Common::InSaveFile *const saveFile = g_system->getSavefileManager()->openForLoading(saveName); Common::Serializer sz(saveFile, nullptr); SaveHeader saveHdr; saveHdr.sync(sz); _game->getGameData().saveLoadWithSerializer(sz); delete saveFile; _game->changeScene(_game->getGameData()._currentScene, _game->getGameData()._partB); _game->getGui().markDirty(); return Common::kNoError; }
int32 SaveLoad_v6::AutoHandler::getSize() { Common::String fileName = _file.build(); if (fileName.empty()) return -1; SaveReader reader(1, 0, fileName); SaveHeader header; if (!reader.load()) return -1; if (!reader.readPartHeader(0, &header)) return -1; // Return the part's size return header.getSize() + 2900; }
bool SavePartSprite::read(Common::ReadStream &stream) { SaveHeader header; header.read(stream); if (_header != header) { if (!_trueColor) { // Header validation failed, trying again with the old version _header.setVersion(1); _header.setSize(_header.getSize() - 1); if (_header != header) // Nope, isn't it either return false; _oldFormat = true; _header.setVersion(kVersion); _header.setSize(_header.getSize() + 1); } else return false; } // The sprite's dimensions have to fit if (stream.readUint32LE() != _width) return false; if (stream.readUint32LE() != _height) return false; // If it's in the current format, the true color flag has to be the same too if (!_oldFormat) if ((stream.readByte() != 0) != _trueColor) return false; // Sprite data if (stream.read(_dataSprite, _spriteSize) != _spriteSize) return false; // Palette data if (stream.read(_dataPalette, 768) != 768) return false; return !stream.err(); }
bool SaveLoad_v6::AutoHandler::load(int16 dataVar, int32 size, int32 offset) { uint32 varSize = SaveHandler::getVarSize(_vm); if (varSize == 0) return false; if ((size != 0) || (offset != 2900)) { warning("Invalid autoloading procedure (%d, %d, %d)", dataVar, size, offset); return false; } Common::String fileName = _file.build(); if (fileName.empty()) return false; SaveReader reader(1, 0, fileName); SaveHeader header; SavePartVars vars(_vm, varSize); if (!reader.load()) return false; if (!reader.readPartHeader(0, &header)) return false; if (header.getSize() != varSize) { warning("Autosave mismatch (%d, %d)", header.getSize(), varSize); return false; } if (!reader.readPart(0, &vars)) return false; if (!vars.writeInto(0, 0, varSize)) return false; return true; }
Common::Array<SaveContainer::PartInfo> *SaveContainer::getPartsInfo(Common::SeekableReadStream &stream) { Common::Array<PartInfo> *parts = 0; // Remember the stream's position to seek back to uint32 startPos = stream.pos(); SaveHeader header; header.setType(kID); header.setVersion(kVersion); // Verify the header if (!header.verifyReadSize(stream)) { // Seek back stream.seek(startPos); return 0; } // Read the part count uint32 partCount = stream.readUint32LE(); // Create a part information array parts = new Common::Array<PartInfo>; parts->resize(partCount); // Read all part sizes for (uint32 i = 0; i < partCount; i++) (*parts)[i].size = stream.readUint32LE(); // Iterate over all parts for (uint32 i = 0; i < partCount; i++) { // The part's offset (from the starting point of the stream) (*parts)[i].offset = stream.pos() - startPos; SaveHeader partHeader; // Read the header if (!partHeader.read(stream)) { // Seek back stream.seek(startPos); delete parts; return 0; } // Fill in the ID (*parts)[i].id = partHeader.getType(); // Skip the part's content stream.skip(partHeader.getSize()); } if (stream.err()) { delete parts; parts = 0; } // Seek back stream.seek(startPos); return parts; }