diff --git a/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js b/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js index 4a83ab62..85a7b551 100644 --- a/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js +++ b/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js @@ -80,6 +80,15 @@ function linkAction(dependencyGraph, prop, { propsById }) { key: `resources.attributesConsumed[${index}].quantity`, }); }); + // Link conditions + prop.resources.conditions?.forEach((con, index) => { + // Link the property to its condition calculation + dependOnCalc({ + dependencyGraph, + prop, + key: `resources.conditions[${index}].condition`, + }); + }); } function linkAdjustment(dependencyGraph, prop) { diff --git a/app/imports/api/engine/computation/computeComputation/computeByType/computeAction.js b/app/imports/api/engine/computation/computeComputation/computeByType/computeAction.js index 646bd97c..a8243f40 100644 --- a/app/imports/api/engine/computation/computeComputation/computeByType/computeAction.js +++ b/app/imports/api/engine/computation/computeComputation/computeByType/computeAction.js @@ -8,13 +8,20 @@ export default function computeAction(computation, node) { } computeResources(computation, node); if (!prop.resources) return; - prop.resources.itemsConsumed.forEach(itemConsumed => { + prop.resources.conditions?.forEach(conObj => { + const condition = conObj.condition; + if (!condition) return; + if (condition.calculation && !condition.value) { + prop.insufficientResources = true; + } + }); + prop.resources.itemsConsumed?.forEach(itemConsumed => { if (!itemConsumed.itemId) return; if (itemConsumed.available < itemConsumed.quantity?.value) { prop.insufficientResources = true; } }); - prop.resources.attributesConsumed.forEach(attConsumed => { + prop.resources.attributesConsumed?.forEach(attConsumed => { if (!attConsumed.variableName) return; if (!(attConsumed.available >= attConsumed.quantity?.value)) { prop.insufficientResources = true; diff --git a/app/imports/api/properties/Actions.js b/app/imports/api/properties/Actions.js index 3de84914..163d938d 100644 --- a/app/imports/api/properties/Actions.js +++ b/app/imports/api/properties/Actions.js @@ -77,6 +77,7 @@ let ActionSchema = createPropertySchema({ 'resources.itemsConsumed': { type: Array, defaultValue: [], + max: 32, }, 'resources.itemsConsumed.$': { type: Object, @@ -104,6 +105,7 @@ let ActionSchema = createPropertySchema({ 'resources.attributesConsumed': { type: Array, defaultValue: [], + max: 32, }, 'resources.attributesConsumed.$': { type: Object, @@ -124,6 +126,30 @@ let ActionSchema = createPropertySchema({ type: 'fieldToCompute', optional: true, }, + 'resources.conditions': { + type: Array, + defaultValue: [], + max: 32, + }, + 'resources.conditions.$': { + type: Object, + }, + 'resources.conditions.$._id': { + type: String, + regEx: SimpleSchema.RegEx.Id, + autoValue() { + if (!this.isSet) return Random.id(); + } + }, + 'resources.conditions.$.condition': { + type: 'fieldToCompute', + optional: true, + }, + 'resources.conditions.$.conditionNote': { + type: String, + optional: true, + max: STORAGE_LIMITS.calculation, + }, // Prevent the property from showing up in the log silent: { type: Boolean, diff --git a/app/imports/client/ui/properties/components/actions/ActionCard.vue b/app/imports/client/ui/properties/components/actions/ActionCard.vue index 9565868f..fd568b69 100644 --- a/app/imports/client/ui/properties/components/actions/ActionCard.vue +++ b/app/imports/client/ui/properties/components/actions/ActionCard.vue @@ -63,9 +63,14 @@