예제 #1
0
        public void Save()
        {
            Trace.WriteLine($"Saving settings at '{path}'");

            using (var stream = new SafeWriteStream(path))
                using (var writer = new StreamWriter(stream, System.Text.Encoding.UTF8))
                {
                    foreach (var field in GetType().GetFields())
                    {
                        if (!field.FieldType.IsGenericType || !typeof(Setting).IsAssignableFrom(field.FieldType.GetGenericTypeDefinition()))
                        {
                            continue;
                        }

                        var setting = (Setting)field.GetValue(this);
                        writer.WriteLine($"{field.Name}: {setting}");
                    }
                    stream.Commit();
                }
        }
예제 #2
0
        /// <summary>
        /// Doesn't run in the main thread
        /// </summary>
        public void ExportToOsb()
        {
            if (disposedValue)
            {
                throw new ObjectDisposedException(nameof(Project));
            }

            string osuPath = null, osbPath = null;
            List <EditorStoryboardLayer> localLayers = null;

            Program.RunMainThread(() =>
            {
                osuPath = MainBeatmap.Path;
                osbPath = OsbPath;

                if (!OwnsOsb && File.Exists(osbPath))
                {
                    File.Copy(osbPath, $"{osbPath}.bak");
                }
                OwnsOsb = true;

                localLayers = new List <EditorStoryboardLayer>(layerManager.FindLayers(l => l.Visible));
            });

            var exportSettings = new ExportSettings();

            if (!string.IsNullOrEmpty(osuPath))
            {
                Debug.Print($"Exporting diff specific events to {osuPath}");
                using (var stream = new SafeWriteStream(osuPath))
                    using (var writer = new StreamWriter(stream, Encoding.UTF8))
                        using (var fileStream = new FileStream(osuPath, FileMode.Open, FileAccess.Read, FileShare.Read))
                            using (var reader = new StreamReader(fileStream, Encoding.UTF8))
                            {
                                string line;
                                var    inEvents     = false;
                                var    inStoryboard = false;
                                while ((line = reader.ReadLine()) != null)
                                {
                                    var trimmedLine = line.Trim();
                                    if (!inEvents && trimmedLine == "[Events]")
                                    {
                                        inEvents = true;
                                    }
                                    else if (trimmedLine.Length == 0)
                                    {
                                        inEvents = false;
                                    }

                                    if (inEvents)
                                    {
                                        if (trimmedLine.StartsWith("//Storyboard Layer"))
                                        {
                                            if (!inStoryboard)
                                            {
                                                foreach (var osbLayer in OsbLayers)
                                                {
                                                    writer.WriteLine($"//Storyboard Layer {(int)osbLayer} ({osbLayer})");
                                                    foreach (var layer in localLayers)
                                                    {
                                                        if (layer.OsbLayer == osbLayer && layer.DiffSpecific)
                                                        {
                                                            layer.WriteOsbSprites(writer, exportSettings);
                                                        }
                                                    }
                                                }
                                                inStoryboard = true;
                                            }
                                        }
                                        else if (inStoryboard && trimmedLine.StartsWith("//"))
                                        {
                                            inStoryboard = false;
                                        }

                                        if (inStoryboard)
                                        {
                                            continue;
                                        }
                                    }
                                    writer.WriteLine(line);
                                }
                                stream.Commit();
                            }
            }

            Debug.Print($"Exporting osb to {osbPath}");
            using (var stream = new SafeWriteStream(osbPath))
                using (var writer = new StreamWriter(stream, Encoding.UTF8))
                {
                    writer.WriteLine("[Events]");
                    writer.WriteLine("//Background and Video events");
                    foreach (var osbLayer in OsbLayers)
                    {
                        writer.WriteLine($"//Storyboard Layer {(int)osbLayer} ({osbLayer})");
                        foreach (var layer in localLayers)
                        {
                            if (layer.OsbLayer == osbLayer && !layer.DiffSpecific)
                            {
                                layer.WriteOsbSprites(writer, exportSettings);
                            }
                        }
                    }
                    writer.WriteLine("//Storyboard Sound Samples");
                    stream.Commit();
                }
        }
예제 #3
0
        public void Save()
        {
            if (disposedValue)
            {
                throw new ObjectDisposedException(nameof(Project));
            }

            using (var stream = new SafeWriteStream(projectPath))
                using (var w = new BinaryWriter(stream, Encoding.UTF8))
                {
                    w.Write(Version);
                    w.Write(Program.FullName);

                    w.Write(MapsetPath);
                    w.Write(MainBeatmap.Id);
                    w.Write(MainBeatmap.Name);

                    w.Write(OwnsOsb);

                    w.Write(effects.Count);
                    foreach (var effect in effects)
                    {
                        w.Write(effect.BaseName);
                        w.Write(effect.Name);

                        var config = effect.Config;
                        w.Write(config.FieldCount);
                        foreach (var field in config.SortedFields)
                        {
                            w.Write(field.Name);
                            w.Write(field.DisplayName);
                            ObjectSerializer.Write(w, field.Value);

                            w.Write(field.AllowedValues?.Length ?? 0);
                            if (field.AllowedValues != null)
                            {
                                foreach (var allowedValue in field.AllowedValues)
                                {
                                    w.Write(allowedValue.Name);
                                    ObjectSerializer.Write(w, allowedValue.Value);
                                }
                            }
                        }
                    }

                    w.Write(layerManager.LayersCount);
                    foreach (var layer in layerManager.Layers)
                    {
                        w.Write(layer.Identifier);
                        w.Write(effects.IndexOf(layer.Effect));
                        w.Write(layer.DiffSpecific);
                        w.Write((int)layer.OsbLayer);
                        w.Write(layer.Visible);
                    }

                    w.Write(importedAssemblies.Count);
                    foreach (var assembly in importedAssemblies)
                    {
                        w.Write(assembly);
                    }

                    stream.Commit();
                    changed = false;
                }
        }