using System; namespace RebootKit.Engine.Services.Console { public enum CVarValueKind { Number, String } [Serializable] public struct CVarValue { public CVarValueKind kind; public double numberValue; public string stringValue; public CVarValue(int value) { kind = CVarValueKind.Number; numberValue = value; stringValue = null; } public CVarValue(float value) { kind = CVarValueKind.Number; numberValue = value; stringValue = null; } public CVarValue(double value) { kind = CVarValueKind.Number; numberValue = value; stringValue = null; } public CVarValue(string value) { kind = CVarValueKind.String; numberValue = 0; stringValue = value; } public void CopyFrom(CVarValue value) { kind = value.kind; numberValue = value.numberValue; stringValue = value.stringValue; } public override string ToString() { return kind switch { CVarValueKind.Number => numberValue.ToString(), CVarValueKind.String => $"\"{stringValue}\"", _ => throw new ArgumentOutOfRangeException() }; } } [Flags] public enum CVarFlags { None, Persistent, ReadOnly } [Serializable] public class CVar { public CVarFlags flags; public string name; public string description; public CVarValue defaultValue; public CVar(CVar other) { flags = other.flags; name = other.name; description = other.description; defaultValue = other.defaultValue; Value = other.Value; } public CVar(string name, CVarValue value, string description = "") { this.name = name; this.description = description; defaultValue = value; Value = defaultValue; } public CVar(string name, int value, string description = "") { this.name = name; this.description = description; defaultValue = new CVarValue(value); Value = defaultValue; } public CVar(string name, float value, string description = "") { this.name = name; this.description = description; defaultValue = new CVarValue(value); Value = defaultValue; } public CVar(string name, double value, string description = "") { this.name = name; this.description = description; defaultValue = new CVarValue(value); Value = defaultValue; } public CVar(string name, string value, string description = "") { this.name = name; this.description = description; defaultValue = new CVarValue(value); Value = defaultValue; } public CVarValue Value { get; private set; } public int IndexValue => (int) Value.numberValue; public float FloatValue => (float) Value.numberValue; public double NumberValue => Value.numberValue; public string StringValue => Value.stringValue; public event Action StateChanged = delegate { }; public void Set(int value) { if (flags.HasFlag(CVarFlags.ReadOnly)) return; Value = new CVarValue(value); StateChanged?.Invoke(); } public void Set(float value) { if (flags.HasFlag(CVarFlags.ReadOnly)) return; Value = new CVarValue(value); StateChanged?.Invoke(); } public void Set(string value) { if (flags.HasFlag(CVarFlags.ReadOnly)) return; Value = new CVarValue(value); StateChanged?.Invoke(); } public void ParseFromString(string str) { if (flags.HasFlag(CVarFlags.ReadOnly)) return; if (float.TryParse(str, out float f)) Set(f); else Set(str); } public void Reset() { if (flags.HasFlag(CVarFlags.ReadOnly)) return; Value = defaultValue; StateChanged?.Invoke(); } public override string ToString() { return Value.ToString(); } } }