From d3cac8a28db396f9bc6f38600e185266592d12f6 Mon Sep 17 00:00:00 2001 From: PopSlime Date: Fri, 14 Oct 2022 11:18:52 +0800 Subject: [PATCH] Implement input config. --- Assets/Config.unity | Bin 73196 -> 65685 bytes Assets/Cryville/Crtr/Config.meta | 8 ++ Assets/Cryville/Crtr/Config/InputConfig.cs | 105 ++++++++++++++++++ .../Crtr/{ => Config}/InputConfig.cs.meta | 0 .../Cryville/Crtr/Config/InputConfigEntry.cs | 31 ++++++ .../Crtr/Config/InputConfigEntry.cs.meta | 11 ++ Assets/Cryville/Crtr/InputConfig.cs | 49 -------- Assets/Cryville/Crtr/InputProxy.cs | 50 +++++---- Assets/Prefabs/InputConfigEntry.prefab | Bin 0 -> 23740 bytes Assets/Prefabs/InputConfigEntry.prefab.meta | 7 ++ 10 files changed, 192 insertions(+), 69 deletions(-) create mode 100644 Assets/Cryville/Crtr/Config.meta create mode 100644 Assets/Cryville/Crtr/Config/InputConfig.cs rename Assets/Cryville/Crtr/{ => Config}/InputConfig.cs.meta (100%) create mode 100644 Assets/Cryville/Crtr/Config/InputConfigEntry.cs create mode 100644 Assets/Cryville/Crtr/Config/InputConfigEntry.cs.meta delete mode 100644 Assets/Cryville/Crtr/InputConfig.cs create mode 100644 Assets/Prefabs/InputConfigEntry.prefab create mode 100644 Assets/Prefabs/InputConfigEntry.prefab.meta diff --git a/Assets/Config.unity b/Assets/Config.unity index 6a8e2ddbe0dad6f984ce341c6d277b4a92783f7b..46ab3bc9c78b132f66fdc438ecea3308ef909f8b 100644 GIT binary patch delta 1962 zcmYL}4^Y%a6vubrkPG2F5bvKNASZtmk2^%dM7#k@G}IUwJ4X)zfv^!e?HaKZuW}}I z#Hcs&$1yvmsmL+s>}+7hQL#)fL^?o>%#cPaoFRvzW=v9g?|ysTZ|42pzVByuf4lqM z{>IM9j=m{tR2eRoGI}^W>htWPQ}T?Z8`DjO#RikH(zMOQo=ix0aXUl4R_120S`>s6&+h4V_ z>aDh26_urBt7~kp+4Ekhsoeh3vjp8rt2)D7+f*3Fr@OnI1FGO1jJdsEpW=~+@xx(g zuIxNLI+hO&->9`7lJIFq3qkurP#c^_Y7QsH*b=l*wC8_KnNM*o{Ek!}L2bs)qS4s3 zf_6d76}2{b1~JAu(WarT7jy*HBGo8~G1h=4Lpyostwf63VINXQB()jaf<{X?CFlrz zjUc&x!3m3R*KGe`? zUqLd~ioIy%If_HMG{Bq)ClEjMRR&`gl&EaX0>6+1y@)%Lsc)c2a|O1gz!SvnDH47U z9Zep!f5S#n%nQJ9O$GP5m0{6BaxH}7YbxF7LgI}5EAm)0pr=o>(M50svCTk1;JR%T zSd#`95PQ=k?7weyO+%YVksILw;zpx{{bk?~ILiccdk~u>d;lGl_MI<#i%HR>!#c#S zbP59J{IkGSi=hs&CPTvhbG|FEHv>*1meZQ>@mI)4=dBeK*Dir!#71AmF}4pSI;n8S z2_JT4g5o;X*VEJ&>j_PcrVuzT3v#Zj)>yI#GPWI!Mvo5;P?LFtPX8{t*18o3?W9|l z(mRm!*+PG~6pDLsr@q={>;NW#u6vBYS=n#|@p!gx@c)0c(qGoRK}zy+xX`QG|--`V+Xq{dfPeU>@N%-HZ*wsBmaQ5H$WNgVFIhaQW78 z@J{W8+dta%^s_x_RKI)o`*u2CwqKM6)xqB8O6TjBvMf+IoC?kxa(Clx2gk`Ghi6R3 zspIeOmb=F%Iz#ZA@%J}F!9PkE8%lMX9|dtJzA2A#tmx_K$*r%Kf7R1dkXK({p9{{x z42T<$!Puk{WE0Wu&Pj`$M|4EW_<9Z{gK|jzExg$g!b_U7r{R{5KgjRE#^oSdZ^z!J r_&wZAM`<|!kav_s@f{rO6VV+bGkF)sS=wgtNl9_3eM<9AEieBMI$hD@ delta 3670 zcmZve4Nz3q702(BC0UV=w}PxxkWGY0jFDYLz#3r*XxM54D$&hE5CXfvRAAM$=tSKm zV>{H32D!1p)R@?>Y*Qy<9~#??W+h4xp%SSG9gEml$}k#X+Qw89={fJ6%R1A(nX~WS z-~Zlw&iy#|?ZJB8?T>Yh(F;BwXZT2Qx79bhV%FY_rI=GJ3l=W0n4Oj~3wt;*F(DaG z1emq|NT#!iDh29{512R{KSlTl-A zKN!y8gFUZ5h4n^$6VyrrmKj?QhE9%=+QAK{j4^rBQDbZaSUA`#u6DJrk7u7U+RTxt zF(#raB6Wng9W)HBn7B0xTQjyB41;>r+B_HQ9sDTxvd_SBV6<{lW&Sy+mC>3i=IA8V z#HEjnHoH+%#T;{=s+)&ogt#BdxNggc`({D~9x>W-;w8NFBV$Z+jHXt?u1|wvBJZ8A z5`F;GhFO{__Hiz$W_}LUSWOjk>@T*aA(8nwjvS|{et2O#e<2mlz-gmLAFrw641D`$ z&|)N3;s>CNJNS@zKXE@W9BqPlvk5BjxWLp6JgAMMe?r9!_XW2|B3`0#&*b5|c%$dL z*tD5CR6`jZcM{h>iE3c0e!jhB3D*6@#Wox!UN8sMK>K%y>k~9y2rmQkz->T62?=6< z-X%UWQR^U9NMHDMCXxc;!tqq%L&U`i4I$pFo?^x{$FR%D!9N=#K{yVj4nFmu2GVnB z_@3v{@euJtP{tL?B<@W@H8A5W;u%kCTx@}rcq4H1&%~L_CgE%K90yM7^Tb=8(FPJL zVeqV3i)4hjI4jeMd$kihnX8e+GoIDPfeCxm%Oi?}F%pD>8N`zoXdS+xG3iz#00*nIZ?)?ZiFRP{F19B?%oQ2*=aBN7N494D80(PB3gAN}Q>;Mc@k) zM%+id1KR4r!il@oB%ch(!|q<~tpc6-NWcm@7$ZJY&2sqS1B(JHdi_`pyqJ%;2&kBN z(sQT=0@^^lhj*#0HPlxv<_(TsXKv+^%MSz`+o4mW90-6Ao?? z?;$SE)_1ag;>LD*EBs*oi9DV~f)53F#1_O7FUi*UZpeZeP>dr!qTULDy`N3|y&SE* za9sNL@4bekpE&yU;8MRz!nRzL1CGmxo0n-^I4&oCdb!3$Iys2DUeLI39Gaeki^zP$ z#f=%3o>Qy}8F^X|^XzUz zn6BDhb!XnnAHUVUj_q@`2Jua8v-xj6d0UF$+5S0_tT_Bjf}{xL=%?{hpmy%UnkkaR zs|VwGYRBQ=#jPEg5?|FhmzVrGl>7T~`O1s#Py+q-dO-6)w!$9t(WF=Z(BHT?~{3PXSlW_p|}z+ zI_gY?j%{w3xmg{$>3qgBkFKUje2ii8a)2@}+X}~a*oIX)yksUrQYU|+J6-jzD*w-W zycEoDUNG{WOS<4f#}>B<0$8XGBzI*fN&hLAq%dXw{ay(cw)C3^SSxynwSyL^od0#= zaUR<>f3dpP7#chxpRg=)4$C5+upA7wwshlG2k&lQqr+6@@^FUX(M4C!B|mXJ4Y$}J zvK?+I^$F)ieJjH7KcOjTnF@m;@?>qOf{UqYLGcbGNc{S3y$<8xBe!!SLZC;!%TbeC ORl2dZg7GDHZ2tw&gcv&j 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