Implement ruleset config browser.

This commit is contained in:
2023-11-30 21:25:38 +08:00
parent 05db2cc32e
commit 091d6307d1
12 changed files with 2336 additions and 136 deletions

View File

@@ -8,10 +8,11 @@ namespace Cryville.Crtr.Config {
internal class RulesetConfigPropertyMasterAdapter : IPropertyMasterAdapter {
readonly List<RulesetConfigPropertyAdapter> _props = new List<RulesetConfigPropertyAdapter>();
readonly RulesetConfigStore _store;
public PdtEvaluator Evaluator { get; private set; }
public RulesetConfigPropertyMasterAdapter(Dictionary<Identifier, ConfigDefinition> defs, Dictionary<string, object> values) {
_store = new RulesetConfigStore(defs, values);
PdtEvaluator.Instance.ContextRulesetConfig = _store;
Evaluator = new PdtEvaluator() { ContextRulesetConfig = _store };
if (defs == null) return;
foreach (var def in defs) {
_props.Add(new RulesetConfigPropertyAdapter(def.Key, def.Value, this));
@@ -64,7 +65,7 @@ namespace Cryville.Crtr.Config {
public object[] Range {
get {
if (_def.range != null)
PdtEvaluator.Instance.Evaluate(_rangeOp, _def.range);
_master.Evaluator.Evaluate(_rangeOp, _def.range);
return m_range;
}
}
@@ -89,9 +90,9 @@ namespace Cryville.Crtr.Config {
public object MapValue(object value) {
_numst.Value = (float)(double)value;
if (_def.value == null) return _numst.Value;
PdtEvaluator.Instance.ContextSelfValue = _numst.Source;
PdtEvaluator.Instance.Evaluate(_numst.Target, _def.value);
PdtEvaluator.Instance.ContextSelfValue = null;
_master.Evaluator.ContextSelfValue = _numst.Source;
_master.Evaluator.Evaluate(_numst.Target, _def.value);
_master.Evaluator.ContextSelfValue = null;
return _numst.Value;
}

View File

@@ -1,103 +0,0 @@
using Cryville.Crtr.Ruleset;
using Cryville.Crtr.UI;
using Newtonsoft.Json;
using System;
using System.IO;
using System.Text;
using UnityEngine;
namespace Cryville.Crtr.Config.UI {
public class ConfigPanelMaster : MonoBehaviour {
[SerializeField]
Menu m_menu;
[SerializeField]
Transform m_content;
[SerializeField]
PropertyMasterPanel m_genericConfigPanel;
[SerializeField]
PropertyMasterPanel m_rulesetConfigPanel;
[SerializeField]
InputConfigPanel m_inputConfigPanel;
public RulesetDefinition ruleset;
RulesetConfig _rscfg;
bool _loaded;
void OnEnable() {
try {
PdtEvaluator.Instance.Reset();
FileInfo file = new FileInfo(Path.Combine(
Game.GameDataPath, "rulesets", Settings.Default.LoadRuleset
));
if (!file.Exists) {
throw new FileNotFoundException("Ruleset for the chart not found\nMake sure you have imported the ruleset");
}
DirectoryInfo dir = file.Directory;
using (StreamReader reader = new StreamReader(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 FileInfo(Path.Combine(
Game.GameDataPath, "config", "rulesets", Settings.Default.LoadRulesetConfig
));
if (!cfgfile.Exists) {
if (!cfgfile.Directory.Exists) cfgfile.Directory.Create();
_rscfg = new RulesetConfig();
}
else {
using (StreamReader cfgreader = new StreamReader(cfgfile.FullName, Encoding.UTF8)) {
_rscfg = JsonConvert.DeserializeObject<RulesetConfig>(cfgreader.ReadToEnd(), new JsonSerializerSettings() {
MissingMemberHandling = MissingMemberHandling.Error
});
}
}
m_genericConfigPanel.Adapter = new DefaultPropertyMasterAdapter(_rscfg.generic);
m_rulesetConfigPanel.Adapter = new RulesetConfigPropertyMasterAdapter(ruleset.Root.configs, _rscfg.configs);
var proxy = new InputProxy(ruleset.Root, null, new Vector2(Screen.width, Screen.height));
proxy.LoadFrom(_rscfg.inputs);
m_inputConfigPanel.proxy = proxy;
m_inputConfigPanel.OnConfigEnable();
_loaded = true;
}
catch (Exception ex) {
Popup.CreateException(ex);
Game.MainLogger.Log(4, "Config", "An error occurred while loading the config: {0}", ex);
m_menu.Back();
}
}
public void SwitchCategory(GameObject cat) {
foreach (Transform c in m_content) {
c.gameObject.SetActive(false);
}
cat.SetActive(true);
}
void OnDisable() {
if (_loaded) {
_loaded = false;
m_inputConfigPanel.proxy.SaveTo(_rscfg.inputs);
m_inputConfigPanel.proxy.Dispose();
FileInfo cfgfile = new FileInfo(Path.Combine(
Game.GameDataPath, "config", "rulesets", Settings.Default.LoadRulesetConfig
));
using (StreamWriter cfgwriter = new StreamWriter(cfgfile.FullName, false, Encoding.UTF8)) {
cfgwriter.Write(JsonConvert.SerializeObject(_rscfg, Game.GlobalJsonSerializerSettings));
}
m_inputConfigPanel.OnConfigDisable();
}
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: bad1f43573d4f1143a94fddddd30fb81
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: