first
This commit is contained in:
169
Runtime/Engine/Code/Services/Console/CVar.cs
Normal file
169
Runtime/Engine/Code/Services/Console/CVar.cs
Normal file
@@ -0,0 +1,169 @@
|
||||
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 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 OnChanged = delegate { };
|
||||
|
||||
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 = "") {
|
||||
Name = name;
|
||||
Description = description;
|
||||
DefaultValue = value;
|
||||
Value = DefaultValue;
|
||||
}
|
||||
|
||||
public CVar(string name, int value, string description = "") {
|
||||
Name = name;
|
||||
Description = description;
|
||||
DefaultValue = new CVarValue(value);
|
||||
Value = DefaultValue;
|
||||
}
|
||||
|
||||
public CVar(string name, float value, string description = "") {
|
||||
Name = name;
|
||||
Description = description;
|
||||
DefaultValue = new CVarValue(value);
|
||||
Value = DefaultValue;
|
||||
}
|
||||
|
||||
public CVar(string name, double value, string description = "") {
|
||||
Name = name;
|
||||
Description = description;
|
||||
DefaultValue = new CVarValue(value);
|
||||
Value = DefaultValue;
|
||||
}
|
||||
|
||||
public CVar(string name, string value, string description = "") {
|
||||
Name = name;
|
||||
Description = description;
|
||||
DefaultValue = new CVarValue(value);
|
||||
Value = DefaultValue;
|
||||
}
|
||||
|
||||
public void Set(int value) {
|
||||
if (Flags.HasFlag(CVarFlags.ReadOnly)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Value = new CVarValue(value);
|
||||
OnChanged?.Invoke();
|
||||
}
|
||||
|
||||
public void Set(float value) {
|
||||
if (Flags.HasFlag(CVarFlags.ReadOnly)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Value = new CVarValue(value);
|
||||
OnChanged?.Invoke();
|
||||
}
|
||||
|
||||
public void Set(string value) {
|
||||
if (Flags.HasFlag(CVarFlags.ReadOnly)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Value = new CVarValue(value);
|
||||
OnChanged?.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;
|
||||
OnChanged?.Invoke();
|
||||
}
|
||||
|
||||
public override string ToString() {
|
||||
return Value.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user