45 lines
1.4 KiB
C#
45 lines
1.4 KiB
C#
using Cryville.Common;
|
|
using Cryville.Common.Collections.Specialized;
|
|
using Cryville.Crtr.Ruleset;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Cryville.Crtr.Config {
|
|
public class RulesetConfigStore {
|
|
readonly IntKeyedDictionary<PropSrc> _srcs = new();
|
|
readonly Dictionary<string, int> _revMap = new();
|
|
readonly Dictionary<string, object> _values;
|
|
public RulesetConfigStore(Dictionary<Identifier, ConfigDefinition> defs, Dictionary<string, object> values) {
|
|
_values = values;
|
|
if (defs == null) return;
|
|
foreach (var def in defs) {
|
|
var key = def.Key.Key;
|
|
var name = (string)def.Key.Name;
|
|
if (!_values.ContainsKey(name)) {
|
|
double value = 0;
|
|
PdtEvaluator.Instance.Evaluate(new PropOp.Float(v => value = v), def.Value.@default);
|
|
_values.Add(name, value);
|
|
}
|
|
_revMap.Add(name, key);
|
|
_srcs.Add(key, new PropSrc.Float(() => {
|
|
float result = 0;
|
|
PdtEvaluator.Instance.ContextSelfValue = new PropSrc.Float(() => Convert.ToSingle(_values[name]));
|
|
PdtEvaluator.Instance.Evaluate(new PropOp.Float(v => result = v), def.Value.value);
|
|
PdtEvaluator.Instance.ContextSelfValue = null;
|
|
return result;
|
|
}));
|
|
}
|
|
}
|
|
public object this[string key] {
|
|
get { return _values[key]; }
|
|
set {
|
|
_values[key] = value;
|
|
_srcs[_revMap[key]].Invalidate();
|
|
}
|
|
}
|
|
public bool TryGetMappedSource(int key, out PropSrc result) {
|
|
return _srcs.TryGetValue(key, out result);
|
|
}
|
|
}
|
|
}
|