30 lines
1.2 KiB
JavaScript
30 lines
1.2 KiB
JavaScript
import combineStat from '/imports/api/creature/computation/combineStat.js';
|
|
import computeEffect from '/imports/api/creature/computation/computeEffect.js';
|
|
import EffectAggregator from '/imports/api/creature/computation/EffectAggregator.js';
|
|
import { each } from 'lodash';
|
|
|
|
export default function computeStat(stat, memo){
|
|
// If the stat is already computed, skip it
|
|
if (stat.computationDetails.computed) return;
|
|
if (stat.computationDetails.busyComputing){
|
|
// Trying to compute this stat again while it is already computing.
|
|
// We must be in a dependency loop.
|
|
stat.computationDetails.computed = true;
|
|
stat.value = NaN;
|
|
stat.computationDetails.busyComputing = false;
|
|
stat.computationDetails.error = 'dependencyLoop';
|
|
return;
|
|
}
|
|
// Compute and aggregate all the effects
|
|
let aggregator = new EffectAggregator(stat)
|
|
each(stat.computationDetails.effects, (effect) => {
|
|
computeEffect(effect, memo);
|
|
aggregator.addEffect(effect);
|
|
});
|
|
// Conglomerate all the effects to compute the final stat values
|
|
combineStat(stat, aggregator, memo);
|
|
// Mark the attribute as computed
|
|
stat.computationDetails.computed = true;
|
|
stat.computationDetails.busyComputing = false;
|
|
}
|