107 lines
3.3 KiB
C#
107 lines
3.3 KiB
C#
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<RulesetConfig> 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<RulesetDefinition>(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<RulesetConfig>(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() { }
|
|
}
|
|
}
|