diff --git a/Assets/Config.unity b/Assets/Config.unity index 6a8e2dd..46ab3bc 100644 Binary files a/Assets/Config.unity and b/Assets/Config.unity differ diff --git a/Assets/Cryville/Crtr/Config.meta b/Assets/Cryville/Crtr/Config.meta new file mode 100644 index 0000000..28bbb17 --- /dev/null +++ b/Assets/Cryville/Crtr/Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2e030b9eb9f613844a4a302812e517ad +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Crtr/Config/InputConfig.cs b/Assets/Cryville/Crtr/Config/InputConfig.cs new file mode 100644 index 0000000..ed9d02d --- /dev/null +++ b/Assets/Cryville/Crtr/Config/InputConfig.cs @@ -0,0 +1,105 @@ +using Cryville.Common.Unity; +using Cryville.Common.Unity.Input; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using UnityEngine; +using UnityEngine.UI; + +namespace Cryville.Crtr.Config { + public class InputConfig : MonoBehaviour { + [SerializeField] + GameObject m_inputDialog; + + [SerializeField] + Transform m_deviceList; + + [SerializeField] + GameObject m_prefabListItem; + + [SerializeField] + Transform m_entryList; + + [SerializeField] + GameObject m_prefabInputConfigEntry; + + InputProxy _proxy; + Dictionary _entries = new Dictionary(); + + string _sel; + public void OpenDialog(string entry) { + _sel = entry; + m_inputDialog.SetActive(true); + Game.InputManager.Activate(); + CallHelper.Purge(m_deviceList); + _recvsrcs.Clear(); + AddSourceItem(null); + } + + public void CloseDialog() { + m_inputDialog.SetActive(false); + Game.InputManager.Deactivate(); + } + + public void CloseDialog(InputSource? src) { + _proxy.Set(new InputProxyEntry { + Target = _sel, + Source = src, + }); + m_inputDialog.SetActive(false); + Game.InputManager.Deactivate(); + } + + void Start() { + ChartPlayer.etor = new PdtEvaluator(); + FileInfo file = new FileInfo( + Game.GameDataPath + "/rulesets/" + Settings.Default.LoadRuleset + ); + DirectoryInfo dir = file.Directory; + using (StreamReader reader = new StreamReader(file.FullName, Encoding.UTF8)) { + var ruleset = JsonConvert.DeserializeObject(reader.ReadToEnd(), new JsonSerializerSettings() { + MissingMemberHandling = MissingMemberHandling.Error + }); + if (ruleset.format != 1) throw new FormatException("Invalid ruleset file version"); + ruleset.LoadPdt(dir); + _proxy = new InputProxy(ruleset.Root); + foreach (var i in ruleset.Root.inputs) { + var e = GameObject.Instantiate(m_prefabInputConfigEntry).GetComponent(); + e.transform.SetParent(m_entryList.transform); + _entries.Add(i.Key, e); + e.SetKey(this, i.Key); + } + _proxy.ProxyChanged += OnProxyChanged; + } + } + + void OnProxyChanged(object sender, ProxyChangedEventArgs e) { + _entries[e.Name].SetEnabled(!e.Used); + _entries[e.Name].SetValue(e.Proxy == null ? "None" : e.Proxy.Value.Handler.GetTypeName(e.Proxy.Value.Type)); + } + + readonly List _recvsrcs = new List(); + void Update() { + if (m_inputDialog.activeSelf) { + Game.InputManager.EnumerateEvents(ev => { + AddSourceItem(ev.Id.Source); + }); + } + } + + void AddSourceItem(InputSource? src) { + if (_recvsrcs.Contains(src)) return; + _recvsrcs.Add(src); + var obj = Instantiate(m_prefabListItem); + obj.transform.SetParent(m_deviceList); + obj.transform.Find("Text").GetComponent().text = src == null ? "None" : src.Value.Handler.GetTypeName(src.Value.Type); + var btn = obj.GetComponent