From 3517636b8b196ea538fe72bf6b9962453915584b Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 1 Mar 2021 11:41:59 +0200 Subject: [PATCH] Reworked toggles, again, to try and catch more edge cases. Made toggles set the inactive status of their property children in the compute step instead of the inactive denormalisation step --- app/imports/api/creature/actions/applyProperties.js | 4 ++-- app/imports/api/creature/actions/spendResources.js | 4 ++-- .../api/creature/computation/engine/ComputationMemo.js | 8 -------- .../api/creature/computation/engine/applyToggles.js | 4 +++- .../api/creature/computation/engine/combineStat.js | 2 +- .../api/creature/computation/engine/computeStat.js | 4 ++-- .../api/creature/computation/engine/computeToggle.js | 9 +++++++++ .../computation/engine/writeAlteredProperties.js | 9 ++++++++- .../creature/computation/methods/recomputeCreature.js | 1 - .../creature/creatureProperties/CreatureProperties.js | 7 +++++++ .../creature/denormalise/recomputeInactiveProperties.js | 3 ++- 11 files changed, 36 insertions(+), 19 deletions(-) diff --git a/app/imports/api/creature/actions/applyProperties.js b/app/imports/api/creature/actions/applyProperties.js index a1f69b74..fadde1ae 100644 --- a/app/imports/api/creature/actions/applyProperties.js +++ b/app/imports/api/creature/actions/applyProperties.js @@ -10,7 +10,7 @@ import applySave from '/imports/api/creature/actions/applySave.js'; function applyProperty(options){ let prop = options.prop; if (prop.type === 'buff'){ - // ignore only applied buffs + // ignore only applied buffs, don't apply them again if (prop.applied === true){ return false; } @@ -40,7 +40,7 @@ function applyProperty(options){ break; case 'buff': applyBuff(options); - break; + return false; case 'toggle': return applyToggle(options); case 'roll': diff --git a/app/imports/api/creature/actions/spendResources.js b/app/imports/api/creature/actions/spendResources.js index d8c05094..da8dc653 100644 --- a/app/imports/api/creature/actions/spendResources.js +++ b/app/imports/api/creature/actions/spendResources.js @@ -51,7 +51,7 @@ export default function spendResources({prop, log}){ // Now that we have confirmed that there are no errors, do actual work //Items itemQuantityAdjustments.forEach(adjustQuantityWork); - + // Use uses if (prop.usesResult){ CreatureProperties.update(prop._id, { @@ -61,7 +61,7 @@ export default function spendResources({prop, log}){ }); log.content.push({ name: 'Uses left', - result: prop.usesResult - prop.usesUsed - 1, + result: prop.usesResult - (prop.usesUsed || 0) - 1, }); } diff --git a/app/imports/api/creature/computation/engine/ComputationMemo.js b/app/imports/api/creature/computation/engine/ComputationMemo.js index 4fd412a3..a907fce7 100644 --- a/app/imports/api/creature/computation/engine/ComputationMemo.js +++ b/app/imports/api/creature/computation/engine/ComputationMemo.js @@ -256,7 +256,6 @@ const propDetailsByType = { default(){ return { toggleAncestors: [], - disabledByToggle: false, }; }, toggle(){ @@ -264,7 +263,6 @@ const propDetailsByType = { computed: false, busyComputing: false, toggleAncestors: [], - disabledByToggle: false, }; }, attribute(){ @@ -273,7 +271,6 @@ const propDetailsByType = { busyComputing: false, effects: [], toggleAncestors: [], - disabledByToggle: false, idsOfSameName: [], }; }, @@ -284,7 +281,6 @@ const propDetailsByType = { effects: [], proficiencies: [], toggleAncestors: [], - disabledByToggle: false, idsOfSameName: [], }; }, @@ -293,26 +289,22 @@ const propDetailsByType = { computed: false, busyComputing: false, toggleAncestors: [], - disabledByToggle: false, }; }, classLevel(){ return { computed: true, toggleAncestors: [], - disabledByToggle: false, }; }, proficiency(){ return { toggleAncestors: [], - disabledByToggle: false, }; }, denormalizedStat(){ return { toggleAncestors: [], - disabledByToggle: false, }; } } diff --git a/app/imports/api/creature/computation/engine/applyToggles.js b/app/imports/api/creature/computation/engine/applyToggles.js index 926531a7..d1e53233 100644 --- a/app/imports/api/creature/computation/engine/applyToggles.js +++ b/app/imports/api/creature/computation/engine/applyToggles.js @@ -11,7 +11,9 @@ export default function applyToggles(prop, memo){ toggle.dependencies, ); if (!toggle.toggleResult){ - prop.computationDetails.disabledByToggle = true; + prop.inactive = true; + prop.deactivatedByAncestor = true; + prop.deactivatedByToggle = true; } }); } diff --git a/app/imports/api/creature/computation/engine/combineStat.js b/app/imports/api/creature/computation/engine/combineStat.js index d6a53929..7d480f49 100644 --- a/app/imports/api/creature/computation/engine/combineStat.js +++ b/app/imports/api/creature/computation/engine/combineStat.js @@ -96,7 +96,7 @@ function combineSkill(stat, aggregator, memo){ let prof = stat.computationDetails.proficiencies[i]; applyToggles(prof, memo); if ( - !prof.computationDetails.disabledByToggle && + !prof.deactivatedByToggle && prof.value > stat.proficiency ){ stat.proficiency = prof.value; diff --git a/app/imports/api/creature/computation/engine/computeStat.js b/app/imports/api/creature/computation/engine/computeStat.js index b981a311..2444c316 100644 --- a/app/imports/api/creature/computation/engine/computeStat.js +++ b/app/imports/api/creature/computation/engine/computeStat.js @@ -22,7 +22,7 @@ export default function computeStat(stat, memo){ // Apply any toggles applyToggles(stat, memo); - if (!stat.computationDetails.disabledByToggle){ + if (!stat.deactivatedByToggle){ // Compute and aggregate all the effects let aggregator = new EffectAggregator(stat, memo) each(stat.computationDetails.effects, (effect) => { @@ -37,7 +37,7 @@ export default function computeStat(stat, memo){ stat.dependencies, effect.dependencies ) - if (!effect.computationDetails.disabledByToggle){ + if (!effect.deactivatedByToggle){ aggregator.addEffect(effect); } }); diff --git a/app/imports/api/creature/computation/engine/computeToggle.js b/app/imports/api/creature/computation/engine/computeToggle.js index 672f87ea..dad8174b 100644 --- a/app/imports/api/creature/computation/engine/computeToggle.js +++ b/app/imports/api/creature/computation/engine/computeToggle.js @@ -1,4 +1,5 @@ import evaluateCalculation from '/imports/api/creature/computation/engine/evaluateCalculation.js'; +import applyToggles from '/imports/api/creature/computation/engine/applyToggles.js'; import { union } from 'lodash'; export default function computeToggle(toggle, memo){ @@ -16,6 +17,9 @@ export default function computeToggle(toggle, memo){ // Before doing any work, mark this toggle as busy toggle.computationDetails.busyComputing = true; + // Apply any parent toggles + applyToggles(toggle, memo); + // Do work delete toggle.errors; if (toggle.enabled){ @@ -41,6 +45,11 @@ export default function computeToggle(toggle, memo){ toggle.errors = context.errors; } } + if (!toggle.toggleResult){ + toggle.inactive = true; + toggle.deactivatedBySelf = true; + toggle.deactivatedByToggle = true; + } toggle.computationDetails.computed = true; toggle.computationDetails.busyComputing = false; } diff --git a/app/imports/api/creature/computation/engine/writeAlteredProperties.js b/app/imports/api/creature/computation/engine/writeAlteredProperties.js index 5ffef21e..7f61ef58 100644 --- a/app/imports/api/creature/computation/engine/writeAlteredProperties.js +++ b/app/imports/api/creature/computation/engine/writeAlteredProperties.js @@ -19,7 +19,14 @@ export default function writeAlteredProperties(memo){ ids.forEach(id => { let op = undefined; let original = memo.originalPropsById[id]; - let keys = ['dependencies', ...schema.objectKeys()]; + let keys = [ + 'dependencies', + 'inactive', + 'deactivatedBySelf', + 'deactivatedByAncestor', + 'deactivatedByToggle', + ...schema.objectKeys(), + ]; op = addChangedKeysToOp(op, keys, original, changed); if (op){ bulkWriteOperations.push(op); diff --git a/app/imports/api/creature/computation/methods/recomputeCreature.js b/app/imports/api/creature/computation/methods/recomputeCreature.js index 411fbcb5..74e78ba5 100644 --- a/app/imports/api/creature/computation/methods/recomputeCreature.js +++ b/app/imports/api/creature/computation/methods/recomputeCreature.js @@ -89,7 +89,6 @@ export function recomputeCreatureByDoc(creature){ writeCreatureVariables(computationMemo, creatureId); recomputeDamageMultipliersById(creatureId); recomputeSlotFullness(creatureId); - recomputeInactiveProperties(creatureId); return computationMemo; } diff --git a/app/imports/api/creature/creatureProperties/CreatureProperties.js b/app/imports/api/creature/creatureProperties/CreatureProperties.js index f12916c9..102c8e8c 100644 --- a/app/imports/api/creature/creatureProperties/CreatureProperties.js +++ b/app/imports/api/creature/creatureProperties/CreatureProperties.js @@ -50,6 +50,13 @@ let CreaturePropertySchema = new SimpleSchema({ optional: true, index: 1, }, + // Denormalised flag if this property was made inactive because of a toggle + // calculation. Either an ancestor toggle calculation or its own. + deactivatedByToggle: { + type: Boolean, + optional: true, + index: 1, + }, // Denormalised list of all properties or creatures this property depends on dependencies: { type: Array, diff --git a/app/imports/api/creature/denormalise/recomputeInactiveProperties.js b/app/imports/api/creature/denormalise/recomputeInactiveProperties.js index d719e096..891050d9 100644 --- a/app/imports/api/creature/denormalise/recomputeInactiveProperties.js +++ b/app/imports/api/creature/denormalise/recomputeInactiveProperties.js @@ -7,7 +7,6 @@ export default function recomputeInactiveProperties(ancestorId){ {disabled: true}, // Everything can be disabled {type: 'buff', applied: false}, // Buffs can be applied {type: 'item', equipped: {$ne: true}}, - {type: 'toggle', toggleResult: false}, {type: 'spell', prepared: {$ne: true}, alwaysPrepared: {$ne: true}}, ], }; @@ -56,6 +55,8 @@ export default function recomputeInactiveProperties(ancestorId){ CreatureProperties.update({ 'ancestors.id': {$eq: ancestorId, $nin: disabledIds}, '_id': {$nin: disabledIds}, + // if it was a toggle responsible, we leave it alone + deactivatedByToggle: {$ne: true}, $or: [ {inactive: true}, {deactivatedByAncestor: true},