void SaveDataWidget::loadSaveDataElements() { Common::String filename = StarkEngine::formatSaveName(ConfMan.getActiveDomainName().c_str(), _slot); Common::InSaveFile *save = g_system->getSavefileManager()->openForLoading(filename); if (save) { _hasSave = true; SaveMetadata metadata; StateReadStream stream(save); Common::ErrorCode metadataErrorCode = metadata.read(&stream, filename); if (metadataErrorCode != Common::kNoError) { error("Unable to read save metadata with error code %d.", metadataErrorCode); } // Obtain the thumbnail if (metadata.version >= 9) { Graphics::Surface *thumb = metadata.readGameScreenThumbnail(&stream); _texture->update(thumb); thumb->free(); delete thumb; } // Obtain the text Common::String desc = metadata.description; Common::String time = Common::String::format("%02d:%02d:%02d %02d/%02d/%02d", metadata.saveHour, metadata.saveMinute, metadata.saveSecond, metadata.saveMonth, metadata.saveDay, metadata.saveYear % 100); _textDesc.setText(desc); _textTime.setText(time); _name = desc + " " + time; } else { _hasSave = false; setVisible(_screen->isSaveMenu()); } }
SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override { SaveStateDescriptor descriptor; if (slot == 0) { descriptor.setWriteProtectedFlag(true); descriptor.setDeletableFlag(false); } Common::String filename = StarkEngine::formatSaveName(target, slot); Common::InSaveFile *save = g_system->getSavefileManager()->openForLoading(filename); if (!save) { return descriptor; } SaveMetadata metadata; Common::ErrorCode readError = metadata.read(save, filename); if (readError != Common::kNoError) { delete save; return descriptor; } descriptor.setDescription(metadata.description); if (metadata.version >= 9) { Graphics::Surface *thumb = metadata.readGameScreenThumbnail(save); descriptor.setThumbnail(thumb); descriptor.setPlayTime(metadata.totalPlayTime); descriptor.setSaveDate(metadata.saveYear, metadata.saveMonth, metadata.saveDay); descriptor.setSaveTime(metadata.saveHour, metadata.saveMinute); } delete save; return descriptor; }
Common::Error StarkEngine::loadGameState(int slot) { // Open the save file Common::String filename = formatSaveName(_targetName.c_str(), slot); Common::InSaveFile *save = _saveFileMan->openForLoading(filename); if (!save) { return _saveFileMan->getError(); } StateReadStream stream(save); // Read the header SaveMetadata metadata; Common::ErrorCode metadataErrorCode = metadata.read(&stream, filename); if (metadataErrorCode != Common::kNoError) { return metadataErrorCode; } // Reset the UI _userInterface->skipFMV(); _userInterface->clearLocationDependentState(); _userInterface->setInteractive(true); _userInterface->changeScreen(Screen::kScreenGame); _userInterface->restoreScreenHistory(); // Clear the previous world resources _resourceProvider->shutdown(); if (metadata.version >= 9) { metadata.skipGameScreenThumbnail(&stream); } // Read the resource trees state _stateProvider->readStateFromStream(&stream, metadata.version); // Read the diary state _diary->readStateFromStream(&stream, metadata.version); if (stream.eos()) { warning("Unexpected end of file reached when reading '%s'", filename.c_str()); return Common::kReadingFailed; } // Initialize the world resources with the loaded state _resourceProvider->initGlobal(); _resourceProvider->setShouldRestoreCurrentState(); _resourceProvider->requestLocationChange(metadata.levelIndex, metadata.locationIndex); if (metadata.version >= 9) { setTotalPlayTime(metadata.totalPlayTime); } return Common::kNoError; }
Common::Error StarkEngine::saveGameState(int slot, const Common::String &desc) { // Ensure the state store is up to date _resourceProvider->commitActiveLocationsState(); // Open the save file Common::String filename = formatSaveName(_targetName.c_str(), slot); Common::OutSaveFile *save = _saveFileMan->openForSaving(filename); if (!save) { return _saveFileMan->getError(); } // 1. Write the header SaveMetadata metadata; metadata.description = desc; metadata.version = StateProvider::kSaveVersion; metadata.levelIndex = _global->getCurrent()->getLevel()->getIndex(); metadata.locationIndex = _global->getCurrent()->getLocation()->getIndex(); metadata.totalPlayTime = getTotalPlayTime(); metadata.gameWindowThumbnail = _userInterface->getGameWindowThumbnail(); TimeDate timeDate; _system->getTimeAndDate(timeDate); metadata.setSaveTime(timeDate); metadata.write(save); metadata.writeGameScreenThumbnail(save); // 2. Write the resource trees state _stateProvider->writeStateToStream(save); // 3. Write the diary state _diary->writeStateToStream(save); delete save; return Common::kNoError; }