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 _props = new(); readonly RulesetConfigStore _store; public PdtEvaluator Evaluator { get; private set; } public RulesetConfigPropertyMasterAdapter(Dictionary defs, Dictionary 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 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(); } } }