private static (ICalculationGraph, ICalculationGraphPruner) CreateCalculationGraph( TransformableNodeFactory nodeFactory, StatRegistry statRegistry, ValueTransformer valueTransformer, IEventBuffer eventBuffer) { var coreGraph = new CoreCalculationGraph( s => CreateStatGraph(nodeFactory, valueTransformer, eventBuffer, s), nodeFactory); var eventGraph = new CalculationGraphWithEvents(coreGraph); var defaultPruningRuleSet = new DefaultPruningRuleSet(statRegistry); var defaultPruner = new CalculationGraphPruner(eventGraph, defaultPruningRuleSet); var userSpecifiedValuePruningRuleSet = new UserSpecifiedValuePruningRuleSet(defaultPruningRuleSet, statRegistry); var userSpecifiedValuePruner = new CalculationGraphPruner(eventGraph, userSpecifiedValuePruningRuleSet); var pruner = new CompositeCalculationGraphPruner(defaultPruner, userSpecifiedValuePruner); eventGraph.StatAdded += StatAdded; eventGraph.StatRemoved += StatRemoved; eventGraph.ModifierAdded += ModifierAdded; eventGraph.ModifierRemoved += ModifierRemoved; return(eventGraph, pruner); void StatAdded(IStat stat) { statRegistry.Add(stat); valueTransformer.AddBehaviors(stat.Behaviors); defaultPruner.StatAdded(stat); userSpecifiedValuePruner.StatAdded(stat); } void StatRemoved(IStat stat) { statRegistry.Remove(stat); valueTransformer.RemoveBehaviors(stat.Behaviors); defaultPruner.StatRemoved(stat); userSpecifiedValuePruner.StatRemoved(stat); } void ModifierAdded(Modifier modifier) { defaultPruner.ModifierAdded(modifier); userSpecifiedValuePruner.ModifierAdded(modifier); } void ModifierRemoved(Modifier modifier) { defaultPruner.ModifierRemoved(modifier); userSpecifiedValuePruner.ModifierRemoved(modifier); } }
private static PrunableCalculationGraph CreateCalculationGraph( TransformableNodeFactory nodeFactory, StatRegistry statRegistry, ValueTransformer valueTransformer) { var coreGraph = new CoreCalculationGraph(s => CreateStatGraph(nodeFactory, valueTransformer, s), nodeFactory); var eventGraph = new CalculationGraphWithEvents(coreGraph, StatAdded, StatRemoved); return(new PrunableCalculationGraph(eventGraph, statRegistry)); void StatAdded(IStat stat) { statRegistry.Add(stat); valueTransformer.AddBehaviors(stat.Behaviors); } void StatRemoved(IStat stat) { statRegistry.Remove(stat); valueTransformer.RemoveBehaviors(stat.Behaviors); } }