diff --git a/Assets/Cryville/Common/ReflectionHelper.cs b/Assets/Cryville/Common/ReflectionHelper.cs index cfc2741..f532002 100644 --- a/Assets/Cryville/Common/ReflectionHelper.cs +++ b/Assets/Cryville/Common/ReflectionHelper.cs @@ -168,5 +168,19 @@ namespace Cryville.Common { } return result; } + + /// + /// Gets the namespace qualified name of a type. + /// + /// The type. + /// The namespace qualified name of the class. + public static string GetNamespaceQualifiedName(Type type) { + string result = type.Namespace + "." + type.Name; + var typeargs = type.GetGenericArguments(); + if (typeargs.Length > 0) { + result = string.Format("{0}[{1}]", result, string.Join(",", from a in typeargs select GetNamespaceQualifiedName(a))); + } + return result; + } } } diff --git a/Assets/Cryville/Common/Unity/Input/InputManager.cs b/Assets/Cryville/Common/Unity/Input/InputManager.cs index 9de48a9..1e03c0b 100644 --- a/Assets/Cryville/Common/Unity/Input/InputManager.cs +++ b/Assets/Cryville/Common/Unity/Input/InputManager.cs @@ -13,6 +13,7 @@ namespace Cryville.Common.Unity.Input { }; // TODO set private public readonly List _handlers = new List(); + readonly Dictionary _typemap = new Dictionary(); readonly Dictionary _timeOrigins = new Dictionary(); readonly object _lock = new object(); readonly Dictionary _vectors = new Dictionary(); @@ -22,6 +23,7 @@ namespace Cryville.Common.Unity.Input { try { if (!typeof(InputHandler).IsAssignableFrom(t)) continue; var h = (InputHandler)ReflectionHelper.InvokeEmptyConstructor(t); + _typemap.Add(t, h); h.OnInput += OnInput; _handlers.Add(h); _timeOrigins.Add(h, 0); @@ -32,6 +34,9 @@ namespace Cryville.Common.Unity.Input { } } } + public InputHandler GetHandler(string name) { + return _typemap[Type.GetType(name)]; + } public void Activate() { lock (_lock) { _events.Clear(); diff --git a/Assets/Cryville/Crtr/ChartPlayer.cs b/Assets/Cryville/Crtr/ChartPlayer.cs index 16f9621..f250f69 100644 --- a/Assets/Cryville/Crtr/ChartPlayer.cs +++ b/Assets/Cryville/Crtr/ChartPlayer.cs @@ -487,6 +487,11 @@ namespace Cryville.Crtr { etor.ContextJudge = judge; inputProxy = new InputProxy(pruleset, judge); + inputProxy.LoadFrom(_rscfg.inputs); + if (!inputProxy.IsCompleted) { + throw new ArgumentException("Input config not completed\nPlease complete the input settings"); + } + cbus.AttachSystems(pskin, judge); Logger.Log("main", 0, "Load/WorkerThread", "Attaching handlers"); var ch = new ChartHandler(chart, dir); diff --git a/Assets/Cryville/Crtr/InputProxy.cs b/Assets/Cryville/Crtr/InputProxy.cs index 81a1020..2e73cba 100644 --- a/Assets/Cryville/Crtr/InputProxy.cs +++ b/Assets/Cryville/Crtr/InputProxy.cs @@ -1,6 +1,7 @@ using Cryville.Common; using Cryville.Common.Pdt; using Cryville.Common.Unity.Input; +using Cryville.Crtr.Config; using System; using System.Collections.Generic; using UnityEngine; @@ -37,9 +38,29 @@ namespace Cryville.Crtr { readonly Dictionary _use = new Dictionary(); readonly Dictionary> _rev = new Dictionary>(); public event EventHandler ProxyChanged; + public void LoadFrom(Dictionary config) { + foreach (var cfg in config) { + Set(new InputProxyEntry { + Target = cfg.Key, + Source = new InputSource { + Handler = Game.InputManager.GetHandler(cfg.Value.handler), + Type = cfg.Value.type + } + }); + } + } + public void SaveTo(Dictionary config) { + config.Clear(); + foreach (var p in _tproxies) { + config.Add(p.Key, new InputConfigEntry { + handler = ReflectionHelper.GetNamespaceQualifiedName(p.Value.Source.Value.Handler.GetType()), + type = p.Value.Source.Value.Type + }); + } + } public void Set(InputProxyEntry proxy) { var name = proxy.Target; - if (_tproxies.ContainsKey(name)) Remove(proxy); + if (!_ruleset.inputs.ContainsKey(name)) throw new ArgumentException("Invalid input name"); if (_use[proxy.Target] > 0) throw new InvalidOperationException("Input already assigned"); if (proxy.Source != null) { @@ -64,6 +85,13 @@ namespace Cryville.Crtr { public bool IsUsed(InputSource src) { return _sproxies.ContainsKey(src); } + public bool IsCompleted { + get { + foreach (var i in _use) + if (i.Value == 0 && !_tproxies.ContainsKey(i.Key)) return false; + return true; + } + } void IncrementUseRecursive(string name) { BroadcastProxyChanged(name); var passes = _ruleset.inputs[name].pass; @@ -100,7 +128,12 @@ namespace Cryville.Crtr { } void BroadcastProxyChanged(string name) { var del = ProxyChanged; - if (del != null) del(this, new ProxyChangedEventArgs(name, _tproxies.ContainsKey(name) ? _tproxies[name].Source : null, _use[name] > 0)); + if (del != null) del(this, this[name]); + } + public ProxyChangedEventArgs this[string name] { + get { + return new ProxyChangedEventArgs(name, _tproxies.ContainsKey(name) ? _tproxies[name].Source : null, _use[name] > 0); + } } #endregion