cvar floats should use invariant culture

This commit is contained in:
2025-05-26 19:57:35 +02:00
parent 4ea7eb9aea
commit 8f11cbe037

View File

@@ -1,174 +1,175 @@
using System; using System;
using System.Globalization;
namespace RebootKit.Engine.Foundation {
public enum CVarValueKind { namespace RebootKit.Engine.Foundation {
Number, String public enum CVarValueKind {
} Number, String
}
[Serializable]
public struct CVarValue { [Serializable]
public CVarValueKind kind; public struct CVarValue {
public CVarValueKind kind;
public double numberValue;
public string stringValue; public double numberValue;
public string stringValue;
public CVarValue(int value) {
kind = CVarValueKind.Number; public CVarValue(int value) {
numberValue = value; kind = CVarValueKind.Number;
stringValue = null; numberValue = value;
} stringValue = null;
}
public CVarValue(float value) {
kind = CVarValueKind.Number; public CVarValue(float value) {
numberValue = value; kind = CVarValueKind.Number;
stringValue = null; numberValue = value;
} stringValue = null;
}
public CVarValue(double value) {
kind = CVarValueKind.Number; public CVarValue(double value) {
numberValue = value; kind = CVarValueKind.Number;
stringValue = null; numberValue = value;
} stringValue = null;
}
public CVarValue(string value) {
kind = CVarValueKind.String; public CVarValue(string value) {
numberValue = 0; kind = CVarValueKind.String;
stringValue = value; numberValue = 0;
} stringValue = value;
}
public void CopyFrom(CVarValue value) {
kind = value.kind; public void CopyFrom(CVarValue value) {
numberValue = value.numberValue; kind = value.kind;
stringValue = value.stringValue; numberValue = value.numberValue;
} stringValue = value.stringValue;
}
public override string ToString() {
return kind switch { public override string ToString() {
CVarValueKind.Number => numberValue.ToString(), return kind switch {
CVarValueKind.String => $"{stringValue}", CVarValueKind.Number => numberValue.ToString(CultureInfo.InvariantCulture),
_ => throw new ArgumentOutOfRangeException() CVarValueKind.String => $"{stringValue}",
}; _ => throw new ArgumentOutOfRangeException()
} };
} }
}
[Flags]
public enum CVarFlags { [Flags]
None = 0, public enum CVarFlags {
Client = 1 << 0, None = 0,
Server = 1 << 1, Client = 1 << 0,
ReadOnly = 1 << 2, Server = 1 << 1,
User = 1 << 3, ReadOnly = 1 << 2,
} User = 1 << 3,
}
[Serializable]
public class ConfigVar { [Serializable]
public CVarFlags flags; public class ConfigVar {
public string name; public CVarFlags flags;
public string description; public string name;
public CVarValue defaultValue; public string description;
public CVarValue defaultValue;
public ConfigVar(ConfigVar other) {
flags = other.flags; public ConfigVar(ConfigVar other) {
name = other.name; flags = other.flags;
description = other.description; name = other.name;
defaultValue = other.defaultValue; description = other.description;
Value = other.Value; defaultValue = other.defaultValue;
} Value = other.Value;
}
public ConfigVar(string name, CVarValue value, string description = "") {
this.name = name; public ConfigVar(string name, CVarValue value, string description = "") {
this.description = description; this.name = name;
defaultValue = value; this.description = description;
Value = defaultValue; defaultValue = value;
} Value = defaultValue;
}
public ConfigVar(string name, int value, string description = "") {
this.name = name; public ConfigVar(string name, int value, string description = "") {
this.description = description; this.name = name;
defaultValue = new CVarValue(value); this.description = description;
Value = defaultValue; defaultValue = new CVarValue(value);
} Value = defaultValue;
}
public ConfigVar(string name, float value, string description = "") {
this.name = name; public ConfigVar(string name, float value, string description = "") {
this.description = description; this.name = name;
defaultValue = new CVarValue(value); this.description = description;
Value = defaultValue; defaultValue = new CVarValue(value);
} Value = defaultValue;
}
public ConfigVar(string name, double value, string description = "") {
this.name = name; public ConfigVar(string name, double value, string description = "") {
this.description = description; this.name = name;
defaultValue = new CVarValue(value); this.description = description;
Value = defaultValue; defaultValue = new CVarValue(value);
} Value = defaultValue;
}
public ConfigVar(string name, string value, string description = "") {
this.name = name; public ConfigVar(string name, string value, string description = "") {
this.description = description; this.name = name;
defaultValue = new CVarValue(value); this.description = description;
Value = defaultValue; defaultValue = new CVarValue(value);
} Value = defaultValue;
}
public CVarValue Value { get; private set; }
public CVarValue Value { get; private set; }
public int IndexValue => (int) Value.numberValue;
public float FloatValue => (float) Value.numberValue; public int IndexValue => (int) Value.numberValue;
public double NumberValue => Value.numberValue; public float FloatValue => (float) Value.numberValue;
public string StringValue => Value.stringValue; public double NumberValue => Value.numberValue;
public string StringValue => Value.stringValue;
public static event Action<ConfigVar> StateChanged = delegate { };
public static event Action<ConfigVar> StateChanged = delegate { };
public void Set(int value) {
if (flags.HasFlag(CVarFlags.ReadOnly)) { public void Set(int value) {
return; if (flags.HasFlag(CVarFlags.ReadOnly)) {
} return;
}
Value = new CVarValue(value);
StateChanged?.Invoke(this); Value = new CVarValue(value);
} StateChanged?.Invoke(this);
}
public void Set(float value) {
if (flags.HasFlag(CVarFlags.ReadOnly)) { public void Set(float value) {
return; if (flags.HasFlag(CVarFlags.ReadOnly)) {
} return;
}
Value = new CVarValue(value);
StateChanged?.Invoke(this); Value = new CVarValue(value);
} StateChanged?.Invoke(this);
}
public void Set(string value) {
if (flags.HasFlag(CVarFlags.ReadOnly)) { public void Set(string value) {
return; if (flags.HasFlag(CVarFlags.ReadOnly)) {
} return;
}
Value = new CVarValue(value);
StateChanged?.Invoke(this); Value = new CVarValue(value);
} StateChanged?.Invoke(this);
}
public void ParseFromString(string str) {
if (flags.HasFlag(CVarFlags.ReadOnly)) { public void ParseFromString(string str) {
return; if (flags.HasFlag(CVarFlags.ReadOnly)) {
} return;
}
if (float.TryParse(str, out float f)) {
Set(f); if (float.TryParse(str, NumberStyles.Float, CultureInfo.InvariantCulture, out float f)) {
} else { Set(f);
Set(str); } else {
} Set(str);
} }
}
public void Reset() {
if (flags.HasFlag(CVarFlags.ReadOnly)) { public void Reset() {
return; if (flags.HasFlag(CVarFlags.ReadOnly)) {
} return;
}
Value = defaultValue;
StateChanged?.Invoke(this); Value = defaultValue;
} StateChanged?.Invoke(this);
}
public override string ToString() {
return Value.ToString(); public override string ToString() {
} return Value.ToString();
} }
}
} }