diff --git a/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js b/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js index 0acaf4cc..72add806 100644 --- a/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js +++ b/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js @@ -14,7 +14,7 @@ const linkDependenciesByType = { effect: linkEffects, proficiency: linkProficiencies, roll: linkRoll, - slot: linkSlot, + propertySlot: linkSlot, skill: linkSkill, spell: linkAction, spellList: linkSpellList, diff --git a/app/imports/api/engine/computation/computeComputation/computeByType.js b/app/imports/api/engine/computation/computeComputation/computeByType.js index cba44f28..b6ccff38 100644 --- a/app/imports/api/engine/computation/computeComputation/computeByType.js +++ b/app/imports/api/engine/computation/computeComputation/computeByType.js @@ -2,7 +2,7 @@ import _variable from './computeByType/computeVariable.js'; import action from './computeByType/computeAction.js'; import attribute from './computeByType/computeAttribute.js'; import skill from './computeByType/computeSkill.js'; -import slot from './computeByType/computeSlot.js'; +import propertySlot from './computeByType/computeSlot.js'; import container from './computeByType/computeContainer.js'; import _calculation from './computeByType/computeCalculation.js'; @@ -13,6 +13,6 @@ export default Object.freeze({ attribute, container, skill, - slot, + propertySlot, spell: action, }); diff --git a/app/imports/api/engine/computation/computeComputation/computeByType/computeSlot.js b/app/imports/api/engine/computation/computeComputation/computeByType/computeSlot.js index 654655ba..9e9dc07b 100644 --- a/app/imports/api/engine/computation/computeComputation/computeByType/computeSlot.js +++ b/app/imports/api/engine/computation/computeComputation/computeByType/computeSlot.js @@ -1,6 +1,6 @@ export default function computSlot(computation, node){ const prop = node.data; - if (prop.quantityExpected){ - prop.spaceLeft = prop.quantityExpected - prop.totalFilled; + if (prop.quantityExpected && prop.quantityExpected.value){ + prop.spaceLeft = prop.quantityExpected.value - prop.totalFilled; } } diff --git a/app/imports/ui/creature/slots/SlotFillDialog.vue b/app/imports/ui/creature/slots/SlotFillDialog.vue index 6d67cc21..c5c0180d 100644 --- a/app/imports/ui/creature/slots/SlotFillDialog.vue +++ b/app/imports/ui/creature/slots/SlotFillDialog.vue @@ -188,6 +188,8 @@ import LibraryNodes from '/imports/api/library/LibraryNodes.js'; import DialogBase from '/imports/ui/dialogStack/DialogBase.vue'; import TreeNodeView from '/imports/ui/properties/treeNodeViews/TreeNodeView.vue'; import PropertyDescription from '/imports/ui/properties/viewers/shared/PropertyDescription.vue' +import resolve, { toString } from '/imports/parser/resolve.js'; +import { prettifyParseError, parse } from '/imports/parser/parser.js'; // import evaluateString from '/imports/api/creature/computation/afterComputation/evaluateString.js'; import getSlotFillFilter from '/imports/api/creature/creatureProperties/methods/getSlotFillFilter.js' import Libraries from '/imports/api/library/Libraries.js'; @@ -291,8 +293,9 @@ export default { return CreatureProperties.findOne(this.slotId); } else if (this.dummySlot) { let model = clone(this.dummySlot) - model.quantityExpectedResult = +model.quantityExpected; - model.spaceLeft = model.quantityExpectedResult; + if (!model.quantityExpected) model.quantityExpected = {}; + model.quantityExpected.value = +model.quantityExpected.calculation; + model.spaceLeft = model.quantityExpected.value; return model; } }, @@ -342,7 +345,7 @@ export default { return quantitySelected; }, spaceLeft(){ - if (this.model.quantityExpectedResult === 0) return undefined; + if (!this.model.quantityExpected || this.model.quantityExpected.value === 0) return undefined; return this.model.spaceLeft - this.totalQuantitySelected; }, libraryNames(){ @@ -360,13 +363,23 @@ export default { // the quantity to fill nodes.forEach(node => { if (node.slotFillerCondition){ - let {result} = evaluateString({ - string: node.slotFillerCondition, - scope: this.creature.variables, - fn: 'reduce', - }); - if (!result.value){ + try { + let parseNode = parse(node.slotFillerCondition); + const {result: resultNode} = resolve('reduce', parseNode, this.creature.variables); + if (resultNode?.parseType === 'constant'){ + if (!resultNode.value){ + node._disabledBySlotFillerCondition = true; + disabledNodeCount += 1; + } + } else { + node._disabledBySlotFillerCondition = true; + node._conditionError = toString(resultNode); + disabledNodeCount += 1; + } + } catch (e){ + let error = prettifyParseError(e); node._disabledBySlotFillerCondition = true; + node._conditionError = error; disabledNodeCount += 1; } } diff --git a/app/imports/ui/creature/slots/Slots.vue b/app/imports/ui/creature/slots/Slots.vue index 3b505451..cf5570d9 100644 --- a/app/imports/ui/creature/slots/Slots.vue +++ b/app/imports/ui/creature/slots/Slots.vue @@ -8,8 +8,8 @@

{{ slot.name }} - - {{ slot.totalFilled }} / {{ slot.quantityExpectedResult }} + + {{ slot.totalFilled }} / {{ slot.quantityExpected.value }}

@@ -37,7 +37,7 @@ { if ( !this.showHiddenSlots && - slot.quantityExpectedResult === 0 && + (slot.quantityExpected && slot.quantityExpected.value) === 0 && slot.hideWhenFull ){ slot.children = [] @@ -146,7 +146,7 @@ export default { }).filter(slot => !( // Hide full and ignored slots !this.showHiddenSlots && ( slot.hideWhenFull && - slot.quantityExpectedResult > 0 && + (slot.quantityExpected && slot.quantityExpected.value) > 0 && slot.spaceLeft <= 0 || slot.ignored ) diff --git a/app/imports/ui/properties/viewers/shared/PropertyDescription.vue b/app/imports/ui/properties/viewers/shared/PropertyDescription.vue index d70969f1..5763d24d 100644 --- a/app/imports/ui/properties/viewers/shared/PropertyDescription.vue +++ b/app/imports/ui/properties/viewers/shared/PropertyDescription.vue @@ -1,6 +1,6 @@