diff --git a/app/imports/api/engine/actions/applyPropertyByType/applyAction.js b/app/imports/api/engine/actions/applyPropertyByType/applyAction.js index 3aa87df9..4847e91d 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/applyAction.js +++ b/app/imports/api/engine/actions/applyPropertyByType/applyAction.js @@ -3,6 +3,7 @@ import recalculateCalculation from './shared/recalculateCalculation.js'; import rollDice from '/imports/parser/rollDice.js'; import applyProperty from '../applyProperty.js'; import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties.js'; +import applyChildren from '/imports/api/engine/actions/applyPropertyByType/shared/applyChildren.js'; import { adjustQuantityWork } from '/imports/api/creature/creatureProperties/methods/adjustQuantity.js'; import { damagePropertyWork } from '/imports/api/creature/creatureProperties/methods/damageProperty.js'; import numberToSignedString from '/imports/api/utility/numberToSignedString.js'; @@ -187,11 +188,6 @@ function applyCrits(value, scope) { return { criticalHit, criticalMiss }; } -function applyChildren(node, actionContext) { - applyNodeTriggers(node, 'after', actionContext); - node.children.forEach(child => applyProperty(child, actionContext)); -} - function spendResources(prop, actionContext) { // Check Uses if (prop.usesLeft <= 0) { diff --git a/app/imports/api/engine/actions/applyPropertyByType/applyAdjustment.js b/app/imports/api/engine/actions/applyPropertyByType/applyAdjustment.js index ede94665..5ca17972 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/applyAdjustment.js +++ b/app/imports/api/engine/actions/applyPropertyByType/applyAdjustment.js @@ -1,9 +1,9 @@ -import applyProperty from '../applyProperty.js'; +import applyChildren from '/imports/api/engine/actions/applyPropertyByType/shared/applyChildren.js'; import recalculateCalculation from './shared/recalculateCalculation.js'; import { damagePropertyWork } from '/imports/api/creature/creatureProperties/methods/damageProperty.js'; import { applyNodeTriggers } from '/imports/api/engine/actions/applyTriggers.js'; -export default function applyAdjustment(node, actionContext){ +export default function applyAdjustment(node, actionContext) { applyNodeTriggers(node, 'before', actionContext); const prop = node.node; const damageTargets = prop.target === 'self' ? [actionContext.creature] : actionContext.targets; @@ -39,7 +39,7 @@ export default function applyAdjustment(node, actionContext){ if (!prop.silent) actionContext.addLog({ name: 'Attribute damage', value: `${prop.stat}${prop.operation === 'set' ? ' set to' : ''}` + - ` ${value}`, + ` ${value}`, inline: true, }); }); @@ -47,15 +47,10 @@ export default function applyAdjustment(node, actionContext){ if (!prop.silent) actionContext.addLog({ name: 'Attribute damage', value: `${prop.stat}${prop.operation === 'set' ? ' set to' : ''}` + - ` ${value}`, + ` ${value}`, inline: true, }); } return applyChildren(node, actionContext); } - -function applyChildren(node, actionContext){ - applyNodeTriggers(node, 'after', actionContext); - node.children.forEach(child => applyProperty(child, actionContext)); -} diff --git a/app/imports/api/engine/actions/applyPropertyByType/applyBranch.js b/app/imports/api/engine/actions/applyPropertyByType/applyBranch.js index d48ebc01..8888c461 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/applyBranch.js +++ b/app/imports/api/engine/actions/applyPropertyByType/applyBranch.js @@ -1,21 +1,18 @@ import applyProperty from '../applyProperty.js'; import recalculateCalculation from './shared/recalculateCalculation.js'; import rollDice from '/imports/parser/rollDice.js'; +import applyChildren from '/imports/api/engine/actions/applyPropertyByType/shared/applyChildren.js'; import { applyNodeTriggers } from '/imports/api/engine/actions/applyTriggers.js'; export default function applyBranch(node, actionContext) { applyNodeTriggers(node, 'before', actionContext); - const applyChildren = function () { - applyNodeTriggers(node, 'after', actionContext); - node.children.forEach(child => applyProperty(child, actionContext)); - }; const scope = actionContext.scope; const targets = actionContext.targets; const prop = node.node; switch (prop.branchType) { case 'if': recalculateCalculation(prop.condition, actionContext); - if (prop.condition?.value) applyChildren(); + if (prop.condition?.value) applyChildren(node, actionContext); break; case 'index': if (node.children.length) { @@ -32,30 +29,31 @@ export default function applyBranch(node, actionContext) { if (index > node.children.length) index = node.children.length; applyNodeTriggers(node, 'after', actionContext); applyProperty(node.children[index - 1], actionContext); + applyNodeTriggers(node, 'afterChildren', actionContext); } break; case 'hit': if (scope['~attackHit']?.value) { if (!targets.length && !prop.silent) actionContext.addLog({ value: '**On hit**' }); - applyChildren(); + applyChildren(node, actionContext); } break; case 'miss': if (scope['~attackMiss']?.value) { if (!targets.length && !prop.silent) actionContext.addLog({ value: '**On miss**' }); - applyChildren(); + applyChildren(node, actionContext); } break; case 'failedSave': if (scope['~saveFailed']?.value) { if (!targets.length && !prop.silent) actionContext.addLog({ value: '**On failed save**' }); - applyChildren(); + applyChildren(node, actionContext); } break; case 'successfulSave': if (scope['~saveSucceeded']?.value) { if (!targets.length && !prop.silent) actionContext.addLog({ value: '**On save**', }); - applyChildren(); + applyChildren(node, actionContext); } break; case 'random': @@ -63,6 +61,7 @@ export default function applyBranch(node, actionContext) { let index = rollDice(1, node.children.length)[0] - 1; applyNodeTriggers(node, 'after', actionContext); applyProperty(node.children[index], actionContext); + applyNodeTriggers(node, 'afterChildren', actionContext); } break; case 'eachTarget': @@ -71,9 +70,10 @@ export default function applyBranch(node, actionContext) { applyNodeTriggers(node, 'after', actionContext); actionContext.targets = [target] node.children.forEach(child => applyProperty(child, actionContext)); + applyNodeTriggers(node, 'afterChildren', actionContext); }); } else { - applyChildren(); + applyChildren(node, actionContext); } break; } diff --git a/app/imports/api/engine/actions/applyPropertyByType/applyBuff.js b/app/imports/api/engine/actions/applyPropertyByType/applyBuff.js index a755a001..49adf4eb 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/applyBuff.js +++ b/app/imports/api/engine/actions/applyPropertyByType/applyBuff.js @@ -77,6 +77,7 @@ export default function applyBuff(node, actionContext) { } }); applyNodeTriggers(node, 'after', actionContext); + applyNodeTriggers(node, 'afterChildren', actionContext); // Don't apply the children of the buff, they get copied to the target instead } diff --git a/app/imports/api/engine/actions/applyPropertyByType/applyBuffRemover.js b/app/imports/api/engine/actions/applyPropertyByType/applyBuffRemover.js index 86b60949..a9915bdf 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/applyBuffRemover.js +++ b/app/imports/api/engine/actions/applyPropertyByType/applyBuffRemover.js @@ -5,6 +5,7 @@ import { getProperyAncestors, getPropertiesOfType } from '/imports/api/engine/lo import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties.js'; import { softRemove } from '/imports/api/parenting/softRemove.js'; import getEffectivePropTags from '/imports/api/engine/computation/utility/getEffectivePropTags.js'; +import applyChildren from '/imports/api/engine/actions/applyPropertyByType/shared/applyChildren.js'; export default function applyBuffRemover(node, actionContext) { // Apply triggers @@ -13,7 +14,7 @@ export default function applyBuffRemover(node, actionContext) { const prop = node.node; // Log Name - if (prop.name && !prop.silent){ + if (prop.name && !prop.silent) { actionContext.addLog({ name: prop.name }); } @@ -53,11 +54,7 @@ export default function applyBuffRemover(node, actionContext) { } } } - - // Apply triggers - applyNodeTriggers(node, 'after', actionContext); - // Apply children - node.children.forEach(child => applyProperty(child, actionContext)); + applyChildren(node, actionContext); } function removeBuff(buff, actionContext, prop) { diff --git a/app/imports/api/engine/actions/applyPropertyByType/applyDamage.js b/app/imports/api/engine/actions/applyPropertyByType/applyDamage.js index b08e807c..b1923a4d 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/applyDamage.js +++ b/app/imports/api/engine/actions/applyPropertyByType/applyDamage.js @@ -1,5 +1,5 @@ import { some, intersection, difference, remove, includes } from 'lodash'; -import applyProperty from '../applyProperty.js'; +import applyChildren from '/imports/api/engine/actions/applyPropertyByType/shared/applyChildren.js'; import { insertCreatureLog } from '/imports/api/creature/log/CreatureLogs.js'; import resolve, { Context, toString } from '/imports/parser/resolve.js'; import logErrors from './shared/logErrors.js'; @@ -13,10 +13,6 @@ import getEffectivePropTags from '/imports/api/engine/computation/utility/getEff export default function applyDamage(node, actionContext) { applyNodeTriggers(node, 'before', actionContext); - const applyChildren = function () { - applyNodeTriggers(node, 'after', actionContext); - node.children.forEach(child => applyProperty(child, actionContext)); - }; const prop = node.node; const scope = actionContext.scope; @@ -66,7 +62,7 @@ export default function applyDamage(node, actionContext) { // If we didn't end up with a constant of finite amount, give up if (reduced?.parseType !== 'constant' || !isFinite(reduced.value)) { - return applyChildren(); + return applyChildren(node, actionContext); } // Round the damage to a whole number @@ -134,7 +130,7 @@ export default function applyDamage(node, actionContext) { value: logValue.join('\n'), inline: true, }); - return applyChildren(); + return applyChildren(node, actionContext); } function applyDamageMultipliers({ target, damage, damageProp, logValue }) { diff --git a/app/imports/api/engine/actions/applyPropertyByType/applyFolder.js b/app/imports/api/engine/actions/applyPropertyByType/applyFolder.js index 0965f56d..ea216685 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/applyFolder.js +++ b/app/imports/api/engine/actions/applyPropertyByType/applyFolder.js @@ -1,11 +1,9 @@ -import recalculateInlineCalculations from './shared/recalculateInlineCalculations.js'; -import applyProperty from '../applyProperty.js'; +import applyChildren from '/imports/api/engine/actions/applyPropertyByType/shared/applyChildren.js'; import { applyNodeTriggers } from '/imports/api/engine/actions/applyTriggers.js'; export default function applyFolder(node, actionContext) { // Apply triggers applyNodeTriggers(node, 'before', actionContext); - applyNodeTriggers(node, 'after', actionContext); // Apply children - node.children.forEach(child => applyProperty(child, actionContext)); + applyChildren(node, actionContext); } diff --git a/app/imports/api/engine/actions/applyPropertyByType/applyNote.js b/app/imports/api/engine/actions/applyPropertyByType/applyNote.js index 0d5f9e84..332d93dc 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/applyNote.js +++ b/app/imports/api/engine/actions/applyPropertyByType/applyNote.js @@ -1,27 +1,25 @@ import recalculateInlineCalculations from './shared/recalculateInlineCalculations.js'; -import applyProperty from '../applyProperty.js'; +import applyChildren from '/imports/api/engine/actions/applyPropertyByType/shared/applyChildren.js'; import { applyNodeTriggers } from '/imports/api/engine/actions/applyTriggers.js'; -export default function applyNote(node, actionContext){ +export default function applyNote(node, actionContext) { applyNodeTriggers(node, 'before', actionContext); const prop = node.node; // Log Name, summary let content = { name: prop.name }; - if (prop.summary?.text){ + if (prop.summary?.text) { recalculateInlineCalculations(prop.summary, actionContext); content.value = prop.summary.value; } - if (content.name || content.value){ + if (content.name || content.value) { actionContext.addLog(content); } // Log description - if (prop.description?.text){ + if (prop.description?.text) { recalculateInlineCalculations(prop.description, actionContext); - actionContext.addLog({value: prop.description.value}); + actionContext.addLog({ value: prop.description.value }); } - // Apply triggers - applyNodeTriggers(node, 'after', actionContext); // Apply children - node.children.forEach(child => applyProperty(child, actionContext)); + applyChildren(node, actionContext); } diff --git a/app/imports/api/engine/actions/applyPropertyByType/applyRoll.js b/app/imports/api/engine/actions/applyPropertyByType/applyRoll.js index 68892231..d3b7bf12 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/applyRoll.js +++ b/app/imports/api/engine/actions/applyPropertyByType/applyRoll.js @@ -1,4 +1,4 @@ -import applyProperty from '../applyProperty.js'; +import applyChildren from '/imports/api/engine/actions/applyPropertyByType/shared/applyChildren.js'; import logErrors from './shared/logErrors.js'; import applyEffectsToCalculationParseNode from '/imports/api/engine/actions/applyPropertyByType/shared/applyEffectsToCalculationParseNode.js'; import resolve, { toString } from '/imports/parser/resolve.js'; @@ -8,11 +8,6 @@ export default function applyRoll(node, actionContext) { applyNodeTriggers(node, 'before', actionContext); const prop = node.node; - const applyChildren = function () { - applyNodeTriggers(node, 'after', actionContext); - node.children.forEach(child => applyProperty(child, actionContext)); - }; - if (prop.roll?.calculation) { const logValue = []; @@ -42,7 +37,7 @@ export default function applyRoll(node, actionContext) { // If we didn't end up with a constant or a number of finite value, give up if (reduced?.parseType !== 'constant' || (reduced.valueType === 'number' && !isFinite(reduced.value))) { - return applyChildren(); + return applyChildren(node, actionContext); } const value = reduced.value; @@ -57,5 +52,5 @@ export default function applyRoll(node, actionContext) { }); } } - return applyChildren(); + return applyChildren(node, actionContext); } diff --git a/app/imports/api/engine/actions/applyPropertyByType/applySavingThrow.js b/app/imports/api/engine/actions/applyPropertyByType/applySavingThrow.js index e0803109..ae2f878e 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/applySavingThrow.js +++ b/app/imports/api/engine/actions/applyPropertyByType/applySavingThrow.js @@ -2,6 +2,7 @@ import rollDice from '/imports/parser/rollDice.js'; import recalculateCalculation from './shared/recalculateCalculation.js'; import applyProperty from '../applyProperty.js'; import numberToSignedString from '/imports/api/utility/numberToSignedString.js'; +import applyChildren from '/imports/api/engine/actions/applyPropertyByType/shared/applyChildren.js'; import { applyNodeTriggers } from '/imports/api/engine/actions/applyTriggers.js'; import { applyUnresolvedEffects } from '/imports/api/engine/actions/doCheck.js'; @@ -34,8 +35,7 @@ export default function applySavingThrow(node, actionContext) { if (!saveTargets?.length) { scope['~saveFailed'] = { value: true }; scope['~saveSucceeded'] = { value: true }; - applyNodeTriggers(node, 'after', actionContext); - return node.children.forEach(child => applyProperty(child, actionContext)); + return applyChildren(node, actionContext); } // Each target makes the saving throw @@ -45,10 +45,9 @@ export default function applySavingThrow(node, actionContext) { delete scope['~saveDiceRoll']; delete scope['~saveRoll']; - const applyChildren = function () { - actionContext.targets = [target] - applyNodeTriggers(node, 'after', actionContext); - node.children.forEach(child => applyProperty(child, actionContext)); + const applyChildrenToTarget = function () { + actionContext.targets = [target]; + return applyChildren(node, actionContext); }; const save = target.variables[prop.stat]; @@ -58,7 +57,7 @@ export default function applySavingThrow(node, actionContext) { name: 'Saving throw error', value: 'No saving throw found: ' + prop.stat, }); - return applyChildren(); + return applyChildrenToTarget(); } let rollModifierText = numberToSignedString(save.value, true); @@ -105,7 +104,7 @@ export default function applySavingThrow(node, actionContext) { value: resultPrefix + '\n**' + result + '**', inline: true, }); - return applyChildren(); + return applyChildrenToTarget(); }); // reset the targets after the save to each child actionContext.targets = originalTargets; diff --git a/app/imports/api/engine/actions/applyPropertyByType/applyToggle.js b/app/imports/api/engine/actions/applyPropertyByType/applyToggle.js index be80b012..47ec3e08 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/applyToggle.js +++ b/app/imports/api/engine/actions/applyPropertyByType/applyToggle.js @@ -1,13 +1,12 @@ -import applyProperty from '../applyProperty.js'; import recalculateCalculation from './shared/recalculateCalculation.js'; import { applyNodeTriggers } from '/imports/api/engine/actions/applyTriggers.js'; +import applyChildren from '/imports/api/engine/actions/applyPropertyByType/shared/applyChildren.js'; -export default function applyToggle(node, actionContext){ +export default function applyToggle(node, actionContext) { applyNodeTriggers(node, 'before', actionContext); const prop = node.node; recalculateCalculation(prop.condition, actionContext); if (prop.condition?.value) { - applyNodeTriggers(node, 'after', actionContext); - return node.children.forEach(child => applyProperty(child, actionContext)); + return applyChildren(node, actionContext); } } diff --git a/app/imports/api/engine/actions/applyPropertyByType/shared/applyChildren.js b/app/imports/api/engine/actions/applyPropertyByType/shared/applyChildren.js new file mode 100644 index 00000000..9c5c0cbd --- /dev/null +++ b/app/imports/api/engine/actions/applyPropertyByType/shared/applyChildren.js @@ -0,0 +1,8 @@ +import { applyNodeTriggers } from '/imports/api/engine/actions/applyTriggers.js'; +import applyProperty from '/imports/api/engine/actions/applyProperty.js'; + +export default function applyChildren(node, actionContext) { + applyNodeTriggers(node, 'after', actionContext); + node.children.forEach(child => applyProperty(child, actionContext)); + applyNodeTriggers(node, 'afterChildren', actionContext); +} diff --git a/app/imports/api/properties/Triggers.js b/app/imports/api/properties/Triggers.js index 0bfd7d9d..250d6bda 100644 --- a/app/imports/api/properties/Triggers.js +++ b/app/imports/api/properties/Triggers.js @@ -18,6 +18,7 @@ const eventOptions = { const timingOptions = { before: 'Before', after: 'After', + afterChildren: 'After Children', } const actionPropertyTypeOptions = { @@ -91,7 +92,7 @@ let TriggerSchema = createPropertySchema({ 'extraTags.$._id': { type: String, regEx: SimpleSchema.RegEx.Id, - autoValue(){ + autoValue() { if (!this.isSet) return Random.id(); } },