diff --git a/Assets/Scripts/Options.cs b/Assets/Scripts/Options.cs index ab954aa..1f92f03 100644 --- a/Assets/Scripts/Options.cs +++ b/Assets/Scripts/Options.cs @@ -1,19 +1,46 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; +using UnityEngine; +using System.IO; +using System; +using System.Xml.Serialization; namespace NeonTea.Quakeball { /// Container for user-selected options. + [XmlRootAttribute("Options")] public class OptionsData { + // DO NOT REMOVE OR CHANGE EXISTING FIELDS AFTER RELEASE TO AVOID BREAKING EXISTING CONFIGURATIONS + // New fields are fine though, the defaults will be used. public bool InvertVerticalLook = false; - public float LookSensitivity = 0.15f; + public float LookSensitivity = 0.1f; } - public class Options : MonoBehaviour { - private static OptionsData Singleton = new OptionsData(); + /// A collection of functions to access user-specific configuration. + public static class Options { + private static string OptionsDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Quakeball"); + private static string OptionsPath = Path.Combine(OptionsDirectory, "Config.xml"); + private static OptionsData Singleton = Load(); public static OptionsData Get() { return Singleton; } + + public static void Save(OptionsData options) { + XmlSerializer Serializer = new XmlSerializer(typeof(OptionsData)); + Directory.CreateDirectory(OptionsDirectory); + FileStream OptionsFile = File.Create(OptionsPath); + Serializer.Serialize(OptionsFile, options); + OptionsFile.Close(); + } + + public static OptionsData Load() { + try { + XmlSerializer Serializer = new XmlSerializer(typeof(OptionsData)); + FileStream OptionsFile = File.OpenRead(OptionsPath); + OptionsData Options = (OptionsData)Serializer.Deserialize(OptionsFile); + OptionsFile.Close(); + return Options; + } catch (Exception) { + return new OptionsData(); + } + } } }