private void loadStoryBtn_Click(object sender, EventArgs e) { string extension = Path.GetExtension(storyFilePath.Text)?.ToLower(); switch (extension) { case ".lsv": { var packageReader = new PackageReader(storyFilePath.Text); Package package = packageReader.Read(); AbstractFileInfo abstractFileInfo = package.Files.FirstOrDefault(p => p.Name == "globals.lsf"); if (abstractFileInfo == null) { MessageBox.Show("The specified package is not a valid savegame (globals.lsf not found)", "Load Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } Resource resource; Stream rsrcStream = abstractFileInfo.MakeStream(); try { using (var rsrcReader = new LSFReader(rsrcStream)) { resource = rsrcReader.Read(); } } finally { abstractFileInfo.ReleaseStream(); } LSLib.LS.Node storyNode = resource.Regions["Story"].Children["Story"][0]; var storyStream = new MemoryStream(storyNode.Attributes["Story"].Value as byte[] ?? throw new InvalidOperationException("Cannot proceed with null Story node")); LoadStory(storyStream); MessageBox.Show("Save game database loaded successfully."); break; } case ".osi": { using (var file = new FileStream(storyFilePath.Text, FileMode.Open, FileAccess.Read)) { LoadStory(file); } MessageBox.Show("Story file loaded successfully."); break; } default: { MessageBox.Show($"Unsupported file extension: {extension}", "Load Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); break; } } }
private void loadStoryBtn_Click(object sender, EventArgs e) { if (String.IsNullOrEmpty(storyFilePath.Text)) { MessageBox.Show("Please specify Story/Savegame file path first!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { string extension = Path.GetExtension(storyFilePath.Text)?.ToLower(); switch (extension) { case ".lsv": { var resource = LoadResourceFromSave(storyFilePath.Text); if (resource == null) { return; } LSLib.LS.Node storyNode = resource.Regions["Story"].Children["Story"][0]; var storyStream = new MemoryStream(storyNode.Attributes["Story"].Value as byte[] ?? throw new InvalidOperationException("Cannot proceed with null Story node")); LoadStory(storyStream); MessageBox.Show("Save game database loaded successfully."); break; } case ".osi": { using (var file = new FileStream(storyFilePath.Text, FileMode.Open, FileAccess.Read, FileShare.Read)) { LoadStory(file); } MessageBox.Show("Story file loaded successfully."); break; } default: { MessageBox.Show($"Unsupported file extension: {extension}", "Load Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); break; } } } }
private void SaveSavegameDatabase() { var packageReader = new PackageReader(storyFilePath.Text); Package package = packageReader.Read(); AbstractFileInfo globalsLsf = package.Files.FirstOrDefault(p => p.Name == "globals.lsf"); if (globalsLsf == null) { MessageBox.Show("The specified package is not a valid savegame (globals.lsf not found)", "Load Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // Load globals.lsf Resource resource; Stream rsrcStream = globalsLsf.MakeStream(); try { using (var rsrcReader = new LSFReader(rsrcStream)) { resource = rsrcReader.Read(); } } finally { globalsLsf.ReleaseStream(); } // Save story resource and pack into the Story.Story attribute in globals.lsf using (var storyStream = new MemoryStream()) { var storyWriter = new StoryWriter(); storyWriter.Write(storyStream, _story); LSLib.LS.Node storyNode = resource.Regions["Story"].Children["Story"][0]; storyNode.Attributes["Story"].Value = storyStream.ToArray(); } // Save globals.lsf var rewrittenStream = new MemoryStream(); // TODO: Resave using original version var rsrcWriter = new LSFWriter(rewrittenStream, FileVersion.CurrentVersion); rsrcWriter.Write(resource); rewrittenStream.Seek(0, SeekOrigin.Begin); // Re-package global.lsf var rewrittenPackage = new Package(); StreamFileInfo globalsRepacked = StreamFileInfo.CreateFromStream(rewrittenStream, "globals.lsf"); rewrittenPackage.Files.Add(globalsRepacked); List <AbstractFileInfo> files = package.Files.Where(x => x.Name != "globals.lsf").ToList(); rewrittenPackage.Files.AddRange(files); using (var packageWriter = new PackageWriter(rewrittenPackage, $"{storyFilePath.Text}.tmp")) { // TODO: Resave using original version and flags packageWriter.Version = PackageVersion.V13; packageWriter.Compression = CompressionMethod.Zlib; packageWriter.CompressionLevel = CompressionLevel.DefaultCompression; packageWriter.Write(); } rewrittenStream.Dispose(); packageReader.Dispose(); // Create a backup of the original .lsf string backupPath = $"{storyFilePath.Text}.backup"; if (!File.Exists(backupPath)) { File.Move(storyFilePath.Text, backupPath); } else { File.Delete(storyFilePath.Text); } // Replace original savegame with new one File.Move($"{storyFilePath.Text}.tmp", storyFilePath.Text); }