using Cryville.Crtr.Browsing.Actions; using Cryville.Crtr.Config; using Cryville.Crtr.Config.UI; using Cryville.Crtr.Ruleset; using Newtonsoft.Json; using System; using System.IO; using System.Text; using UnityEngine; namespace Cryville.Crtr.Browsing.UI { internal class RulesetConfigBrowser : ResourceBrowser { [SerializeField] Transform m_content; [SerializeField] PropertyMasterPanel m_genericConfigPanel; [SerializeField] PropertyMasterPanel m_rulesetConfigPanel; [SerializeField] InputConfigPanel m_inputConfigPanel; RulesetDefinition _ruleset; RulesetConfig _rscfg; public string RulesetName { get; private set; } UseSkinAction _useSkinAction; bool _loaded; public void Load(string rulesetName, Action overrides = null) { RulesetName = rulesetName; FileInfo file = new(Path.Combine( Game.GameDataPath, "rulesets", rulesetName, ".umgr" )); if (!file.Exists) { throw new FileNotFoundException("Ruleset for the resource not found\nMake sure you have imported the ruleset"); } DirectoryInfo dir = file.Directory; using (StreamReader reader = new(file.FullName, Encoding.UTF8)) { _ruleset = JsonConvert.DeserializeObject(reader.ReadToEnd(), new JsonSerializerSettings() { MissingMemberHandling = MissingMemberHandling.Error }); if (_ruleset.format != RulesetDefinition.CURRENT_FORMAT) throw new FormatException("Invalid ruleset file version"); _ruleset.LoadPdt(dir); } FileInfo cfgfile = new(Path.Combine( Game.GameDataPath, "config", "rulesets", rulesetName + ".json" )); if (!cfgfile.Exists) { if (!cfgfile.Directory.Exists) cfgfile.Directory.Create(); _rscfg = new RulesetConfig(); } else { using StreamReader cfgreader = new(cfgfile.FullName, Encoding.UTF8); _rscfg = JsonConvert.DeserializeObject(cfgreader.ReadToEnd(), new JsonSerializerSettings() { MissingMemberHandling = MissingMemberHandling.Error }); } overrides?.Invoke(_rscfg); m_genericConfigPanel.Adapter = new DefaultPropertyMasterAdapter(_rscfg.generic); m_rulesetConfigPanel.Adapter = new RulesetConfigPropertyMasterAdapter(_ruleset.Root.configs, _rscfg.configs); m_inputConfigPanel.Load(_ruleset.Root, _rscfg); _loaded = true; } public void InitAction() { Master.Actions.Register(_useSkinAction = new UseSkinAction(this)); } void OnDestroy() { if (_loaded) Master.Actions.Unregister(_useSkinAction); } public void SetSkin(string skin) { _rscfg.generic.Skin = skin; } public void SwitchCategory(GameObject cat) { foreach (Transform c in m_content) { c.gameObject.SetActive(false); } cat.SetActive(true); } void OnEnable() { m_genericConfigPanel.InvalidatePropertyValues(); } void OnDisable() { if (_loaded) { m_inputConfigPanel.SaveTo(_rscfg.inputs); FileInfo cfgFile = new(Path.Combine( Game.GameDataPath, "config", "rulesets", RulesetName + ".json" )); using StreamWriter cfgWriter = new(cfgFile.FullName, false, Encoding.UTF8); cfgWriter.Write(JsonConvert.SerializeObject(_rscfg, Game.GlobalJsonSerializerSettings)); } } public override void OnItemClicked(int index) { } public override void InvokeAction(IResourceAction action) { } internal override void OnActionsChanged() { } } }