159 lines
4.4 KiB
C#
159 lines
4.4 KiB
C#
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();
|
|
}
|
|
}
|
|
} |