From 0c495726baa383bdf957ba609d6d09809566619b Mon Sep 17 00:00:00 2001 From: Thaum Rystra <9525416+ThaumRystra@users.noreply.github.com> Date: Wed, 15 Nov 2023 15:42:09 +0200 Subject: [PATCH] Added compute triggers to store trigger ids on their targeted props. Needs testing --- .../creatureProperties/CreatureProperties.js | 30 +++++++++++++++++++ .../computeComputation/computeByType.js | 2 ++ .../computeByType/computeTrigger.js | 24 +++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 app/imports/api/engine/computation/computeComputation/computeByType/computeTrigger.js diff --git a/app/imports/api/creature/creatureProperties/CreatureProperties.js b/app/imports/api/creature/creatureProperties/CreatureProperties.js index b451dd1d..81fc8ffc 100644 --- a/app/imports/api/creature/creatureProperties/CreatureProperties.js +++ b/app/imports/api/creature/creatureProperties/CreatureProperties.js @@ -94,6 +94,36 @@ const DenormalisedOnlyCreaturePropertySchema = new SimpleSchema({ optional: true, removeBeforeCompute: true, }, + // Triggers that fire when this property is applied + 'triggerIds': { + type: Object, + optional: true, + removeBeforeCompute: true, + }, + 'triggerIds.before': { + type: Array, + optional: true, + }, + 'triggerIds.before.$': { + type: String, + regEx: SimpleSchema.RegEx.Id, + }, + 'triggerIds.after': { + type: Array, + optional: true, + }, + 'triggerIds.after.$': { + type: String, + regEx: SimpleSchema.RegEx.Id, + }, + 'triggerIds.afterChildren': { + type: Array, + optional: true, + }, + 'triggerIds.afterChildren.$': { + type: String, + regEx: SimpleSchema.RegEx.Id, + }, // When this is true on any property, the creature needs to be recomputed dirty: { type: Boolean, diff --git a/app/imports/api/engine/computation/computeComputation/computeByType.js b/app/imports/api/engine/computation/computeComputation/computeByType.js index 0f3d5436..6d6e8c53 100644 --- a/app/imports/api/engine/computation/computeComputation/computeByType.js +++ b/app/imports/api/engine/computation/computeComputation/computeByType.js @@ -7,6 +7,7 @@ import propertySlot from './computeByType/computeSlot.js'; import container from './computeByType/computeContainer.js'; import spellList from './computeByType/computeSpellList.js'; import toggle from './computeByType/computeToggle.js'; +import trigger from './computeByType/computeTrigger.js' import _calculation from './computeByType/computeCalculation.js'; export default Object.freeze({ @@ -21,4 +22,5 @@ export default Object.freeze({ spell: action, spellList, toggle, + trigger, }); diff --git a/app/imports/api/engine/computation/computeComputation/computeByType/computeTrigger.js b/app/imports/api/engine/computation/computeComputation/computeByType/computeTrigger.js new file mode 100644 index 00000000..b1e696ef --- /dev/null +++ b/app/imports/api/engine/computation/computeComputation/computeByType/computeTrigger.js @@ -0,0 +1,24 @@ +import { get, set } from 'lodash'; +import { getEffectTagTargets } from '/imports/api/engine/computation/buildComputation/linkTypeDependencies'; + +export default function computeTrigger(computation, node) { + const prop = node.data; + + // Triggers that aren't active aren't linked to properties + if (prop.inactive) return; + + // Link triggers to all the properties that would fire them when applied + if (prop.event === 'doActionProperty') { + getEffectTagTargets(prop, computation).forEach(targetId => { + const targetProp = computation.propsById[targetId]; + // Only apply if the trigger matches this property type + if (targetProp.type !== prop.actionPropertyType) return; + let triggerIdArray = get(targetProp, `triggerIds.${prop.timing}`); + if (!triggerIdArray) { + triggerIdArray = []; + set(targetProp, `triggerIds.${prop.timing}`, triggerIdArray); + } + triggerIdArray.push(prop._id); + }); + } +}