Exemplo n.º 1
0
        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;
            }
            }
        }
Exemplo n.º 2
0
        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;
                }
                }
            }
        }
Exemplo n.º 3
0
        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);
        }