32 lines
1.0 KiB
JavaScript
32 lines
1.0 KiB
JavaScript
import bareSymbolSubtitutor from '/imports/api/creature/computation/utility/bareSymbolSubtitutor.js';
|
|
import computeStat from '/imports/api/creature/computation/computeStat.js';
|
|
import math from '/imports/math.js';
|
|
|
|
export default function evaluateCalculation(string, memo){
|
|
if (!string) return string;
|
|
// Parse the string using mathjs
|
|
let calc;
|
|
try {
|
|
calc = math.parse(string);
|
|
} catch (e) {
|
|
return string;
|
|
}
|
|
// Ensure all symbol nodes are defined and coputed
|
|
calc.traverse(node => {
|
|
if (node.isSymbolNode){
|
|
let stat = memo.statsByVariableName[node.name];
|
|
if (stat && !stat.computationDetails.computed){
|
|
computeStat(stat, memo);
|
|
}
|
|
}
|
|
});
|
|
// Ensure any bare symbols are value accessors instead
|
|
let substitutedCalc = calc.transform(bareSymbolSubtitutor(memo.statsByVariableName));
|
|
// Evaluate the expression to a number or return with substitutions
|
|
try {
|
|
return substitutedCalc.evaluate(memo.statsByVariableName);
|
|
} catch (e){
|
|
return substitutedCalc.toString();
|
|
}
|
|
}
|