100 lines
2.9 KiB
C#
100 lines
2.9 KiB
C#
using Cryville.Common;
|
|
using Cryville.Common.Pdt;
|
|
using Cryville.Crtr.Ruleset;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Cryville.Crtr.Config {
|
|
internal class RulesetConfigPropertyMasterAdapter : IPropertyMasterAdapter {
|
|
readonly List<RulesetConfigPropertyAdapter> _props = new();
|
|
readonly RulesetConfigStore _store;
|
|
public PdtEvaluator Evaluator { get; private set; }
|
|
|
|
public RulesetConfigPropertyMasterAdapter(Dictionary<Identifier, ConfigDefinition> defs, Dictionary<string, object> values) {
|
|
_store = new RulesetConfigStore(defs, values);
|
|
Evaluator = new PdtEvaluator() { ContextRulesetConfig = _store };
|
|
if (defs == null) return;
|
|
foreach (var def in defs) {
|
|
_props.Add(new RulesetConfigPropertyAdapter(def.Key, def.Value, this));
|
|
}
|
|
}
|
|
|
|
public string DefaultCategory { get { return "miscellaneous"; } }
|
|
|
|
public IEnumerable<IPropertyAdapter> GetProperties() { return _props; }
|
|
|
|
public object GetValue(string key) {
|
|
return _store[key];
|
|
}
|
|
|
|
public void SetValue(string key, object value) {
|
|
_store[key] = value;
|
|
foreach (var prop in _props) {
|
|
prop.Invalidate();
|
|
}
|
|
}
|
|
}
|
|
|
|
internal class RulesetConfigPropertyAdapter : IPropertyAdapter {
|
|
readonly RulesetConfigPropertyMasterAdapter _master;
|
|
readonly ConfigDefinition _def;
|
|
|
|
public RulesetConfigPropertyAdapter(Identifier key, ConfigDefinition def, RulesetConfigPropertyMasterAdapter master) {
|
|
_master = master;
|
|
_def = def;
|
|
Name = (string)key.Name;
|
|
Type = _def.type switch {
|
|
ConfigType.number => PropertyType.Number,
|
|
ConfigType.number_stepped => PropertyType.NumberStepped,
|
|
_ => PropertyType.Unknown,
|
|
};
|
|
_rangeOp = new PropOp.Clip(v => {
|
|
m_range[0] = (double)v.Behind;
|
|
m_range[1] = (double)v.Ahead;
|
|
});
|
|
}
|
|
|
|
public string Category { get { return _def.category; } }
|
|
public string Name { get; private set; }
|
|
public string Description { get { return null; } }
|
|
|
|
public PropertyType Type { get; private set; }
|
|
|
|
readonly PdtOperator _rangeOp;
|
|
readonly object[] m_range = new object[] { double.NegativeInfinity, double.PositiveInfinity };
|
|
public object[] Range {
|
|
get {
|
|
if (_def.range != null)
|
|
_master.Evaluator.Evaluate(_rangeOp, _def.range);
|
|
return m_range;
|
|
}
|
|
}
|
|
|
|
public object GetValue() {
|
|
return _master.GetValue(Name);
|
|
}
|
|
|
|
public void SetValue(object value) {
|
|
_master.SetValue(Name, value);
|
|
}
|
|
|
|
public event Action ValueChanged;
|
|
public void Invalidate() {
|
|
ValueChanged?.Invoke();
|
|
}
|
|
|
|
public bool SetMapped { get { return false; } }
|
|
|
|
readonly PropStores.Float _numst = new();
|
|
public object MapValue(object value) {
|
|
_numst.Value = (float)(double)value;
|
|
if (_def.value == null) return _numst.Value;
|
|
_master.Evaluator.ContextSelfValue = _numst.Source;
|
|
_master.Evaluator.Evaluate(_numst.Target, _def.value);
|
|
_master.Evaluator.ContextSelfValue = null;
|
|
return _numst.Value;
|
|
}
|
|
|
|
public object MapValueInverse(object value) { throw new NotSupportedException(); }
|
|
}
|
|
} |