using Cryville.Common.ComponentModel; using System.ComponentModel; using UnityEngine; using RangeAttribute = Cryville.Common.ComponentModel.RangeAttribute; namespace Cryville.Crtr { public class Settings { static readonly Settings _default = new(); [Browsable(false)] public static Settings Default { get { return _default; } } [Category("gameplay")] [Range(0, 10)][Precision(1)] public int AreaJudgePrecision { get { return PlayerPrefs.GetInt("AreaJudgePrecision", 4); } set { PlayerPrefs.SetInt("AreaJudgePrecision", value); } } [Category("gameplay")] [Range(-1, 30)] public int ForceSyncFrames { get { return PlayerPrefs.GetInt("ForceSyncFrames", 6); } set { PlayerPrefs.SetInt("ForceSyncFrames", value); } } [Category("gameplay")] [Step(0.02)][Precision(1e-3)] public float GraphicalOffset { get { return PlayerPrefs.GetFloat("GraphicalOffset", 0); } set { PlayerPrefs.SetFloat("GraphicalOffset", value); } } [Category("gameplay")] [Step(0.1)][Precision(1e-3)] public float SoundOffset { get { return PlayerPrefs.GetFloat("SoundOffset", 0); } set { PlayerPrefs.SetFloat("SoundOffset", value); } } [Category("gameplay")] [Range(0, double.PositiveInfinity)][Step(60)][Precision(1e-1)] public float StartOffset { get { return PlayerPrefs.GetFloat("StartOffset", 0); } set { PlayerPrefs.SetFloat("StartOffset", value); } } [Browsable(false)] public string LastRunVersion { get { return PlayerPrefs.GetString("LastRunVersion", "0.0"); } set { PlayerPrefs.SetString("LastRunVersion", value); } } [Browsable(false)] [Category("data")] [Description("The directory where the game files are stored.")] public string GameDataPath { get { string dataPath = Application.persistentDataPath; #if UNITY_ANDROID && !UNITY_EDITOR dataPath = "/storage/emulated/0/data/crtr"; #endif return PlayerPrefs.GetString("GameDataPath", dataPath); } set { PlayerPrefs.SetString("GameDataPath", value); } } [Browsable(false)] [Category("data")] [Description("The chart file to load.")] public string LoadChart { get { return PlayerPrefs.GetString("LoadChart", ""); } set { PlayerPrefs.SetString("LoadChart", value); } } [Browsable(false)] [Category("data")] [Description("The ruleset file to load.")] public string LoadRuleset { get { return PlayerPrefs.GetString("LoadRuleset", ""); } set { PlayerPrefs.SetString("LoadRuleset", value); } } [Browsable(false)] [Category("data")] [Description("The ruleset config file to load.")] public string LoadRulesetConfig { get { return PlayerPrefs.GetString("LoadRulesetConfig", ""); } set { PlayerPrefs.SetString("LoadRulesetConfig", value); } } [Browsable(false)] [Category("data")] [Description("The skin file to load.")] public string LoadSkin { get { return PlayerPrefs.GetString("LoadSkin", ""); } set { PlayerPrefs.SetString("LoadSkin", value); } } [Category("graphics")] [LogarithmicScale][Range(-4.6, 3)][Step(1)][Precision(1e-2)] public float BackwardRenderDistance { get { return PlayerPrefs.GetFloat("BackwardClippingDistance", 0.2f); } set { PlayerPrefs.SetFloat("BackwardClippingDistance", value); } } [Category("graphics")] [LogarithmicScale][Range(-2.3, 6)][Step(1)][Precision(1e-1)] public float ForwardRenderDistance { get { return PlayerPrefs.GetFloat("RenderDistance", 4); } set { PlayerPrefs.SetFloat("RenderDistance", value); } } [Category("graphics")] [Description("The span before the renderer fetches the object data again. Smaller value generates more detailed objects while increasing CPU load. Leave 0 to let the game decides the value automatically.")] [Range(0, 0.1)][Precision(1e-3)] public float RenderStep { get { return PlayerPrefs.GetFloat("RenderStep", 0f); } set { PlayerPrefs.SetFloat("RenderStep", value); } } [Category("graphics")] [LogarithmicScale][Range(1.15, 3.5)][Step(2)] public int TargetFrameRate { get { return PlayerPrefs.GetInt("TargetFrameRate", 60); } set { PlayerPrefs.SetInt("TargetFrameRate", value); } } [Category("graphics")] public bool VSync { get { return PlayerPrefs.GetInt("VSync", 0) == 1; } set { PlayerPrefs.SetInt("VSync", value ? 1 : 0); } } [Category("debug")] public bool ClearLogOnPlay { get { return PlayerPrefs.GetInt("ClearLogOnPlay", 1) == 1; } set { PlayerPrefs.SetInt("ClearLogOnPlay", value ? 1 : 0); } } [Category("debug")] public bool HideLogOnPlay { get { return PlayerPrefs.GetInt("HideLogOnPlay", 1) == 1; } set { PlayerPrefs.SetInt("HideLogOnPlay", value ? 1 : 0); } } [Category("debug")] public bool DisableGC { get { return PlayerPrefs.GetInt("DisableGC", 1) == 1; } set { PlayerPrefs.SetInt("DisableGC", value ? 1 : 0); } } public void Save() { PlayerPrefs.Save(); } public void Reset() { PlayerPrefs.DeleteAll(); } } }