diff --git a/app/imports/api/engine/actions/applyPropertyByType/shared/applyEffectsToCalculationParseNode.js b/app/imports/api/engine/actions/applyPropertyByType/shared/applyEffectsToCalculationParseNode.js index 0ada4ea1..6ee0a765 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/shared/applyEffectsToCalculationParseNode.js +++ b/app/imports/api/engine/actions/applyPropertyByType/shared/applyEffectsToCalculationParseNode.js @@ -2,9 +2,8 @@ import operator from '/imports/parser/parseTree/operator.js'; import { parse } from '/imports/parser/parser.js'; import logErrors from './logErrors.js'; -export default function applyEffectsToCalculationParseNode(calcObj, actionContext){ - if (!calcObj.effects) return; - calcObj.effects.forEach(effect => { +export default function applyEffectsToCalculationParseNode(calcObj, actionContext) { + calcObj.effects?.forEach(effect => { if (effect.operation !== 'add') return; if (!effect.amount) return; if (effect.amount.value === null) return; @@ -17,8 +16,31 @@ export default function applyEffectsToCalculationParseNode(calcObj, actionContex operator: '+', fn: 'add' }); - } catch (e){ + } catch (e) { logErrors([e], actionContext) } }); + // Add the highest proficiency as well + let highestProficiency; + calcObj.proficiencies?.forEach(proficiency => { + if ( + proficiency.value > highestProficiency + || (highestProficiency === undefined && Number.isFinite(proficiency.value)) + ) { + highestProficiency = proficiency.value; + } + }); + if (highestProficiency) { + try { + let profParseNode = parse(highestProficiency.toString()); + calcObj.parseNode = operator.create({ + left: calcObj.parseNode, + right: profParseNode, + operator: '+', + fn: 'add' + }); + } catch (e) { + logErrors([e], actionContext) + } + } } diff --git a/app/imports/api/engine/actions/applyPropertyByType/shared/recalculateCalculation.js b/app/imports/api/engine/actions/applyPropertyByType/shared/recalculateCalculation.js index 2f484567..16f2cfe3 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/shared/recalculateCalculation.js +++ b/app/imports/api/engine/actions/applyPropertyByType/shared/recalculateCalculation.js @@ -2,7 +2,7 @@ import evaluateCalculation from '/imports/api/engine/computation/utility/evaluat import applyEffectsToCalculationParseNode from '/imports/api/engine/actions/applyPropertyByType/shared/applyEffectsToCalculationParseNode.js'; import logErrors from './logErrors.js'; -export default function recalculateCalculation(calc, actionContext, context){ +export default function recalculateCalculation(calc, actionContext, context) { if (!calc?.parseNode) return; calc._parseLevel = 'reduce'; applyEffectsToCalculationParseNode(calc, actionContext); diff --git a/app/imports/api/engine/computation/utility/evaluateCalculation.js b/app/imports/api/engine/computation/utility/evaluateCalculation.js index 580cafde..6d5f1f82 100644 --- a/app/imports/api/engine/computation/utility/evaluateCalculation.js +++ b/app/imports/api/engine/computation/utility/evaluateCalculation.js @@ -1,14 +1,14 @@ import resolve, { toString } from '/imports/parser/resolve.js'; -export default function evaluateCalculation(calculation, scope, givenContext){ +export default function evaluateCalculation(calculation, scope, givenContext) { const parseNode = calculation.parseNode; const fn = calculation._parseLevel; - const calculationScope = {...calculation._localScope, ...scope}; - const {result: resultNode, context} = resolve(fn, parseNode, calculationScope, givenContext); + const calculationScope = { ...calculation._localScope, ...scope }; + const { result: resultNode, context } = resolve(fn, parseNode, calculationScope, givenContext); calculation.errors = context.errors; - if (resultNode?.parseType === 'constant'){ + if (resultNode?.parseType === 'constant') { calculation.value = resultNode.value; - } else if (resultNode?.parseType === 'error'){ + } else if (resultNode?.parseType === 'error') { calculation.value = null; } else { calculation.value = toString(resultNode);