diff --git a/app/imports/api/creature/computation/methods/recomputeCreature.js b/app/imports/api/creature/computation/methods/recomputeCreature.js index 59090621..cb938a96 100644 --- a/app/imports/api/creature/computation/methods/recomputeCreature.js +++ b/app/imports/api/creature/computation/methods/recomputeCreature.js @@ -8,7 +8,6 @@ import computeMemo from '/imports/api/creature/computation/engine/computeMemo.js import writeAlteredProperties from '/imports/api/creature/computation/engine/writeAlteredProperties.js'; import writeCreatureVariables from '/imports/api/creature/computation/engine/writeCreatureVariables.js'; import { recomputeDamageMultipliersById } from '/imports/api/creature/denormalise/recomputeDamageMultipliers.js'; -import recomputeInactiveProperties from '/imports/api/creature/denormalise/recomputeInactiveProperties.js'; import recomputeSlotFullness from '/imports/api/creature/denormalise/recomputeSlotFullness.js'; import getRootCreatureAncestor from '/imports/api/creature/creatureProperties/getRootCreatureAncestor.js'; import getDependentProperties from '/imports/api/creature/computation/engine/getDependentProperties.js'; @@ -82,11 +81,6 @@ export function recomputeCreatureById(creatureId){ */ export function recomputeCreatureByDoc(creature){ const creatureId = creature._id; - - // Make sure the active state of all properties is correct before doing work - // TODO: Separate this into it's own recompute function and only call it - // when things change activation state - recomputeInactiveProperties(creatureId); let props = getComputationProperties(creatureId); let computationMemo = new ComputationMemo(props, creature); computeMemo(computationMemo); @@ -97,7 +91,6 @@ export function recomputeCreatureByDoc(creature){ return computationMemo; } - export function recomputePropertyDependencies(property){ let creature = getRootCreatureAncestor(property); recomputeCreatureByDependencies({ diff --git a/app/imports/api/creature/creatureProperties/methods/insertProperty.js b/app/imports/api/creature/creatureProperties/methods/insertProperty.js index 188cccff..21cf6c71 100644 --- a/app/imports/api/creature/creatureProperties/methods/insertProperty.js +++ b/app/imports/api/creature/creatureProperties/methods/insertProperty.js @@ -4,6 +4,7 @@ import CreatureProperties from '/imports/api/creature/creatureProperties/Creatur import getRootCreatureAncestor from '/imports/api/creature/creatureProperties/getRootCreatureAncestor.js'; import { assertEditPermission } from '/imports/api/sharing/sharingPermissions.js'; import { reorderDocs } from '/imports/api/parenting/order.js'; +import recomputeInactiveProperties from '/imports/api/creature/denormalise/recomputeInactiveProperties.js'; import { recomputeCreatureByDoc } from '/imports/api/creature/computation/methods/recomputeCreature.js'; const insertProperty = new ValidatedMethod({ @@ -32,6 +33,8 @@ export function insertPropertyWork({property, creature}){ collection: CreatureProperties, ancestorId: creature._id, }); + // Inserting the active status of the property needs to be denormalised + recomputeInactiveProperties(creature._id); // Inserting a creature property invalidates dependencies: full recompute recomputeCreatureByDoc(creature); return _id; diff --git a/app/imports/api/creature/creatureProperties/methods/insertPropertyFromLibraryNode.js b/app/imports/api/creature/creatureProperties/methods/insertPropertyFromLibraryNode.js index 5ba1ef65..6628fb7d 100644 --- a/app/imports/api/creature/creatureProperties/methods/insertPropertyFromLibraryNode.js +++ b/app/imports/api/creature/creatureProperties/methods/insertPropertyFromLibraryNode.js @@ -5,6 +5,7 @@ import CreatureProperties from '/imports/api/creature/creatureProperties/Creatur import LibraryNodes from '/imports/api/library/LibraryNodes.js'; import { RefSchema } from '/imports/api/parenting/ChildSchema.js'; import getRootCreatureAncestor from '/imports/api/creature/creatureProperties/getRootCreatureAncestor.js'; +import recomputeInactiveProperties from '/imports/api/creature/denormalise/recomputeInactiveProperties.js'; import { recomputeCreatureByDoc } from '/imports/api/creature/computation/methods/recomputeCreature.js'; import { assertEditPermission } from '/imports/api/sharing/sharingPermissions.js'; import { @@ -92,6 +93,8 @@ const insertPropertyFromLibraryNode = new ValidatedMethod({ ancestorId: rootCreature._id, }); + // The library properties need to denormalise which of them are inactive + recomputeInactiveProperties(rootId); // Inserting a creature property invalidates dependencies: full recompute recomputeCreatureByDoc(rootCreature); diff --git a/app/imports/api/creature/creatureProperties/methods/restoreProperty.js b/app/imports/api/creature/creatureProperties/methods/restoreProperty.js index ee628134..30be2b98 100644 --- a/app/imports/api/creature/creatureProperties/methods/restoreProperty.js +++ b/app/imports/api/creature/creatureProperties/methods/restoreProperty.js @@ -5,6 +5,7 @@ import CreatureProperties from '/imports/api/creature/creatureProperties/Creatur import { assertEditPermission } from '/imports/api/sharing/sharingPermissions.js'; import { restore } from '/imports/api/parenting/softRemove.js'; import getRootCreatureAncestor from '/imports/api/creature/creatureProperties/getRootCreatureAncestor.js'; +import recomputeInactiveProperties from '/imports/api/creature/denormalise/recomputeInactiveProperties.js'; import { recomputeCreatureByDoc } from '/imports/api/creature/computation/methods/recomputeCreature.js'; const restoreProperty = new ValidatedMethod({ @@ -26,7 +27,9 @@ const restoreProperty = new ValidatedMethod({ // Do work restore({_id, collection: CreatureProperties}); - // Changes dependency tree by removing children + // Parents active status may have changed while it was deleted + recomputeInactiveProperties(rootCreature._id); + // Changes dependency tree by restoring children recomputeCreatureByDoc(rootCreature); } }); diff --git a/app/imports/api/creature/creatureProperties/methods/updateCreatureProperty.js b/app/imports/api/creature/creatureProperties/methods/updateCreatureProperty.js index d32d9cc8..e84b73ce 100644 --- a/app/imports/api/creature/creatureProperties/methods/updateCreatureProperty.js +++ b/app/imports/api/creature/creatureProperties/methods/updateCreatureProperty.js @@ -4,6 +4,7 @@ import CreatureProperties from '/imports/api/creature/creatureProperties/Creatur import { assertEditPermission } from '/imports/api/sharing/sharingPermissions.js'; import getRootCreatureAncestor from '/imports/api/creature/creatureProperties/getRootCreatureAncestor.js'; import { recomputeCreatureByDoc } from '/imports/api/creature/computation/methods/recomputeCreature.js'; +import recomputeInactiveProperties from '/imports/api/creature/denormalise/recomputeInactiveProperties.js'; const updateCreatureProperty = new ValidatedMethod({ name: 'creatureProperties.update', @@ -32,7 +33,7 @@ const updateCreatureProperty = new ValidatedMethod({ }); let rootCreature = getRootCreatureAncestor(property); assertEditPermission(rootCreature, this.userId); - + let pathString = path.join('.'); let modifier; // unset empty values @@ -45,8 +46,13 @@ const updateCreatureProperty = new ValidatedMethod({ selector: {type: property.type}, }); - // Updating a property might change dependencies, unless we are certain - // it did not, a full recompute is required + // Some updates might cause other properties to become inactive + if ([ + 'applied', 'equipped', 'prepared', 'alwaysPrepared', 'disabled' + ].includes(path[0])){ + recomputeInactiveProperties(rootCreature._id); + } + // Updating a property is likely to change dependencies, do a full recompute recomputeCreatureByDoc(rootCreature); }, }); diff --git a/app/imports/api/parenting/organizeMethods.js b/app/imports/api/parenting/organizeMethods.js index 36b56873..8b19b718 100644 --- a/app/imports/api/parenting/organizeMethods.js +++ b/app/imports/api/parenting/organizeMethods.js @@ -9,6 +9,7 @@ import { assertDocEditPermission } from '/imports/api/sharing/sharingPermissions import fetchDocByRef from '/imports/api/parenting/fetchDocByRef.js'; import getCollectionByName from '/imports/api/parenting/getCollectionByName.js'; import { recomputeCreatureById } from '/imports/api/creature/computation/methods/recomputeCreature.js'; +import recomputeInactiveProperties from '/imports/api/creature/denormalise/recomputeInactiveProperties.js'; const organizeDoc = new ValidatedMethod({ name: 'organize.organizeDoc', @@ -54,6 +55,10 @@ const organizeDoc = new ValidatedMethod({ let creaturesToRecompute = union(docCreatures, parentCreatures); // Recompute the creatures creaturesToRecompute.forEach(id => { + // The active status of some properties might change due to a change in + // ancestry + recomputeInactiveProperties(id); + // Some Dependencies depend on ancestry, so a full recompute is needed recomputeCreatureById(id); }); },