This commit is contained in:
2025-03-30 16:06:57 +02:00
parent e62bd2aa6d
commit 623ba3f621
148 changed files with 2773 additions and 1441 deletions

View File

@@ -7,45 +7,45 @@ namespace RebootKit.Engine.Services.Console {
[Serializable]
public struct CVarValue {
public CVarValueKind Kind;
public CVarValueKind kind;
public double NumberValue;
public string StringValue;
public double numberValue;
public string stringValue;
public CVarValue(int value) {
Kind = CVarValueKind.Number;
NumberValue = value;
StringValue = null;
kind = CVarValueKind.Number;
numberValue = value;
stringValue = null;
}
public CVarValue(float value) {
Kind = CVarValueKind.Number;
NumberValue = value;
StringValue = null;
kind = CVarValueKind.Number;
numberValue = value;
stringValue = null;
}
public CVarValue(double value) {
Kind = CVarValueKind.Number;
NumberValue = value;
StringValue = null;
kind = CVarValueKind.Number;
numberValue = value;
stringValue = null;
}
public CVarValue(string value) {
Kind = CVarValueKind.String;
NumberValue = 0;
StringValue = value;
kind = CVarValueKind.String;
numberValue = 0;
stringValue = value;
}
public void CopyFrom(CVarValue value) {
Kind = value.Kind;
NumberValue = value.NumberValue;
StringValue = value.StringValue;
kind = value.kind;
numberValue = value.numberValue;
stringValue = value.stringValue;
}
public override string ToString() {
return Kind switch {
CVarValueKind.Number => NumberValue.ToString(),
CVarValueKind.String => $"\"{StringValue}\"",
return kind switch {
CVarValueKind.Number => numberValue.ToString(),
CVarValueKind.String => $"\"{stringValue}\"",
_ => throw new ArgumentOutOfRangeException()
};
}
@@ -58,108 +58,98 @@ namespace RebootKit.Engine.Services.Console {
[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 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;
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;
this.name = name;
this.description = description;
defaultValue = value;
Value = defaultValue;
}
public CVar(string name, int value, string description = "") {
Name = name;
Description = description;
DefaultValue = new CVarValue(value);
Value = DefaultValue;
this.name = name;
this.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;
this.name = name;
this.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;
this.name = name;
this.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;
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;
}
if (flags.HasFlag(CVarFlags.ReadOnly)) return;
Value = new CVarValue(value);
OnChanged?.Invoke();
StateChanged?.Invoke();
}
public void Set(float value) {
if (Flags.HasFlag(CVarFlags.ReadOnly)) {
return;
}
if (flags.HasFlag(CVarFlags.ReadOnly)) return;
Value = new CVarValue(value);
OnChanged?.Invoke();
StateChanged?.Invoke();
}
public void Set(string value) {
if (Flags.HasFlag(CVarFlags.ReadOnly)) {
return;
}
if (flags.HasFlag(CVarFlags.ReadOnly)) return;
Value = new CVarValue(value);
OnChanged?.Invoke();
StateChanged?.Invoke();
}
public void ParseFromString(string str) {
if (Flags.HasFlag(CVarFlags.ReadOnly)) {
return;
}
if (flags.HasFlag(CVarFlags.ReadOnly)) return;
if (float.TryParse(str, out float f)) {
if (float.TryParse(str, out float f))
Set(f);
} else {
else
Set(str);
}
}
public void Reset() {
if (Flags.HasFlag(CVarFlags.ReadOnly)) {
return;
}
if (flags.HasFlag(CVarFlags.ReadOnly)) return;
Value = DefaultValue;
OnChanged?.Invoke();
Value = defaultValue;
StateChanged?.Invoke();
}
public override string ToString() {

View File

@@ -1,17 +1,14 @@
using UnityEngine;
namespace RebootKit.Engine.Services.Console {
[CreateAssetMenu(menuName = RConsts.AssetMenu + "cvar", fileName = "cvar")]
[CreateAssetMenu(menuName = RConsts.k_AddComponentMenu + "cvar", fileName = "cvar")]
public class CVarAsset : ScriptableObject {
[SerializeField]
private CVar _cvar;
[SerializeField] CVar m_CVar;
public CVar Create(string cvarName = null) {
CVar cvar = new(_cvar);
CVar cvar = new(m_CVar);
if (cvarName != null) {
cvar.Name = cvarName;
}
if (cvarName != null) cvar.name = cvarName;
return cvar;
}

View File

@@ -5,9 +5,6 @@ using RebootKit.Engine.Foundation;
namespace RebootKit.Engine.Services.Console {
[AttributeUsage(AttributeTargets.Field)]
public class CVarAttribute : Attribute {
public string Name { get; }
public CVarValue Value { get; }
public CVarAttribute(string name, float defaultValue) {
Name = name;
Value = new CVarValue(defaultValue);
@@ -27,19 +24,20 @@ namespace RebootKit.Engine.Services.Console {
Name = name;
Value = new CVarValue(defaultValue);
}
public string Name { get; }
public CVarValue Value { get; }
}
public class CVarFieldInjector : DIContext.IFieldInjector {
private static readonly Logger Logger = new(nameof(CVarFieldInjector));
static readonly Logger s_logger = new(nameof(CVarFieldInjector));
public bool Inject(FieldInfo field, object target, DIContext context) {
if (!Attribute.IsDefined(field, typeof(CVarAttribute))) {
return false;
}
if (!Attribute.IsDefined(field, typeof(CVarAttribute))) return false;
ConsoleService console = context.Resolve<ConsoleService>();
if (console == null) {
Logger.Error($"Cannot inject field because cannot resolve `{nameof(ConsoleService)}`");
s_logger.Error($"Cannot inject field because cannot resolve `{nameof(ConsoleService)}`");
return false;
}

View File

@@ -2,11 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Cysharp.Threading.Tasks;
using RebootKit.Engine.Foundation;
using RebootKit.Engine.Services.Input;
using UnityEngine.InputSystem;
using Logger = RebootKit.Engine.Foundation.Logger;
namespace RebootKit.Engine.Services.Console {
@@ -21,144 +17,91 @@ namespace RebootKit.Engine.Services.Console {
public string Description { get; } = "Prints available commands/cvars and their descriptions.";
public void Execute(string[] args) {
RR.Console().PrintHelp();
RR.Console.PrintHelp();
}
}
public class ConsoleService : IService {
private static readonly Logger _logger = new(nameof(ConsoleService));
static readonly Logger _logger = new(nameof(ConsoleService));
[Serializable]
public class Config {
public ConsoleUI ConsoleUIPrefab;
public ScriptableInputAction ToggleAction;
}
readonly List<IConsoleCommand> _commands = new();
readonly List<CVar> _cvars = new();
private ConsoleUI _ui;
private Config _config;
private List<IConsoleCommand> _commands = new();
private List<CVar> _cvars = new();
public bool IsVisible => _ui.IsVisible;
public ConsoleService(Config config) {
_config = config;
public ConsoleService() {
_logger.Info("Waking up");
_ui = UnityEngine.Object.Instantiate(_config.ConsoleUIPrefab);
UnityEngine.Object.DontDestroyOnLoad(_ui.gameObject);
_config.ToggleAction.Action.Enable();
_config.ToggleAction.Action.performed += OnToggleAction;
RegisterCommand(new HelpCommand());
_ui.SetVisibility(false);
_ui.Clear();
_ui.Write("Hello shelf\n");
}
public void Dispose() {
if (_ui != null) {
UnityEngine.Object.Destroy(_ui);
_ui = null;
}
}
_config.ToggleAction.Action.performed -= OnToggleAction;
public event Action<string> OnOutputMessage = _ => { };
public void WriteToOutput(string message) {
OnOutputMessage?.Invoke(message);
}
public bool CVarExists(string name) {
foreach (CVar cvar in _cvars) {
if (cvar.Name.Equals(name)) {
foreach (CVar cvar in _cvars)
if (cvar.name.Equals(name))
return true;
}
}
return false;
}
public CVar GetCVar(string name) {
foreach (CVar cvar in _cvars) {
if (cvar.Name.Equals(name)) {
foreach (CVar cvar in _cvars)
if (cvar.name.Equals(name))
return cvar;
}
}
return null;
}
public CVar ReplaceOrDefault(CVar cvar) {
CVar foundCVar = GetCVar(cvar.Name);
if (foundCVar != null) {
return foundCVar;
}
CVar foundCVar = GetCVar(cvar.name);
if (foundCVar != null) return foundCVar;
_cvars.Add(cvar);
return cvar;
}
public void Replace(CVar cvar) {
CVar foundCVar = GetCVar(cvar.Name);
if (foundCVar != null) {
_cvars.Remove(foundCVar);
}
CVar foundCVar = GetCVar(cvar.name);
if (foundCVar != null) _cvars.Remove(foundCVar);
_cvars.Add(cvar);
}
private string[] ParseCommandInputArguments(string text) {
if (text.Length == 0) {
return Array.Empty<string>();
}
string[] ParseCommandInputArguments(string text) {
if (text.Length == 0) return Array.Empty<string>();
return new string[] {text};
return new[] {text};
}
public void Execute(string input) {
if (input.Length == 0) {
return;
}
if (input.Length == 0) return;
string commandName = input;
if (input.IndexOf(' ') != -1) {
commandName = input.Substring(0, input.IndexOf(' '));
}
if (input.IndexOf(' ') != -1) commandName = input.Substring(0, input.IndexOf(' '));
string[] arguments = ParseCommandInputArguments(input.Substring(commandName.Length));
foreach (IConsoleCommand command in _commands) {
foreach (IConsoleCommand command in _commands)
if (command.Name.Equals(commandName)) {
command.Execute(arguments);
return;
}
}
foreach (CVar cvar in _cvars) {
if (cvar.Name.Equals(commandName)) {
if (arguments.Length == 1) {
cvar.ParseFromString(arguments[0]);
}
foreach (CVar cvar in _cvars)
if (cvar.name.Equals(commandName)) {
if (arguments.Length == 1) cvar.ParseFromString(arguments[0]);
_ui.Write($"<b>{cvar.Name}</b> - {cvar.ToString()}\n");
WriteToOutput($"<b>{cvar.name}</b> - {cvar}\n");
return;
}
}
_ui.Write($"ERROR: Command/CVar `{commandName}` not found.");
}
public void ToggleVisibility() {
_ui.SetVisibility(!_ui.IsVisible);
if (_ui.IsVisible) {
RR.Input().DisableControls();
RR.Input().UnlockCursor();
} else {
RR.Input().EnableControls();
RR.Input().LockCursor();
}
WriteToOutput($"ERROR: Command/CVar `{commandName}` not found.");
}
public void RegisterCommand(IConsoleCommand command) {
@@ -186,17 +129,13 @@ namespace RebootKit.Engine.Services.Console {
message.AppendLine("Available cvars:");
foreach (CVar cvar in _cvars) {
message.Append(" ");
message.Append(cvar.Name);
message.Append(cvar.name);
message.Append(" - ");
message.Append(cvar.Description);
message.Append(cvar.description);
message.AppendLine();
}
_ui.Write(message.ToString());
}
private void OnToggleAction(InputAction.CallbackContext obj) {
ToggleVisibility();
WriteToOutput(message.ToString());
}
}
}

View File

@@ -2,19 +2,14 @@
using UnityEngine;
namespace RebootKit.Engine.Services.Console {
[CreateAssetMenu(menuName = RConsts.ServiceAssetMenu + "Console")]
[CreateAssetMenu(menuName = RConsts.k_ServiceAssetMenu + "Console")]
public class ConsoleServiceAsset : ServiceAsset<ConsoleService> {
[SerializeField]
private ConsoleService.Config _config;
[SerializeField] CVar[] _initialCVars;
[SerializeField]
private CVar[] _initialCVars;
[SerializeField]
private bool _loadCVarsFromResources = true;
[SerializeField] bool _loadCVarsFromResources = true;
public override ConsoleService Create(DIContext context) {
ConsoleService service = new(_config);
ConsoleService service = new();
context.Inject(service);
foreach (CVar cvar in _initialCVars) {

View File

@@ -1,63 +0,0 @@
using System.Text;
using UnityEngine;
using UnityEngine.UIElements;
using Logger = RebootKit.Engine.Foundation.Logger;
namespace RebootKit.Engine.Services.Console {
public class ConsoleUI : MonoBehaviour {
private static readonly Logger Logger = new(nameof(ConsoleUI));
private StringBuilder _content = new();
[SerializeField]
private UIDocument _document;
private Label _labelMessage;
private TextField _textField;
private Button _submitButton;
public bool IsVisible { get; private set; }
private void OnEnable() {
IsVisible = _document.enabled;
VisualElement root = _document.rootVisualElement;
_labelMessage = root.Q<Label>("console-window-message");
_labelMessage.text = "SIEMA";
_textField = root.Q<TextField>("console-text-field");
_submitButton = root.Q<Button>("console-btn-submit");
_submitButton.clicked += OnSubmitButtonClicked;
}
private void OnSubmit(string input) {
RR.Console().Execute(input);
_textField.value = input;
}
public void SetVisibility(bool visible) {
_document.enabled = visible;
IsVisible = visible;
}
public void Write(string message) {
_content.Append(message);
_labelMessage.text = _content.ToString();
_labelMessage.MarkDirtyRepaint();
}
public void Clear() {
_content.Clear();
_labelMessage.text = "";
if (_textField != null) {
_textField.label = "";
}
}
private void OnSubmitButtonClicked() {
Logger.Info("Submit");
OnSubmit(_textField.value);
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: ca844a0157054677b2f129fdbf6ddc45
timeCreated: 1740780314