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