using System; using UnityEngine; namespace Ironspore { [Serializable] public sealed class GameSettingsData { public int version = 1; public float masterVolume = 1; public int qualityLevel = 2; public int resolutionWidth = 1280; public int resolutionHeight = 720; public bool fullscreen; public float mouseSensitivity = 1; public float aimSensitivity = 1; public string bindingOverrides = ""; public GameSettingsData Copy() => (GameSettingsData)MemberwiseClone(); public GameSettingsData Normalize(int qualityCount) { var copy = Copy(); copy.masterVolume = FiniteClamp(masterVolume, 0, 1, 1); copy.mouseSensitivity = FiniteClamp(mouseSensitivity, .1f, 5, 1); copy.aimSensitivity = FiniteClamp(aimSensitivity, .1f, 2, 1); copy.qualityLevel = Mathf.Clamp(qualityLevel, 0, Mathf.Max(0, qualityCount - 1)); if (resolutionWidth < 640 || resolutionWidth > 16384 || resolutionHeight < 360 || resolutionHeight > 16384) { copy.resolutionWidth = 1280; copy.resolutionHeight = 720; } copy.bindingOverrides = bindingOverrides ?? ""; return copy; } public bool SameDisplay(GameSettingsData other) => resolutionWidth == other.resolutionWidth && resolutionHeight == other.resolutionHeight && fullscreen == other.fullscreen; static float FiniteClamp(float value, float min, float max, float fallback) => float.IsNaN(value) || float.IsInfinity(value) ? fallback : Mathf.Clamp(value, min, max); } }