diff --git a/app/imports/api/creature/CreatureProperties.js b/app/imports/api/creature/CreatureProperties.js index 6eb1211a..4e5b90de 100644 --- a/app/imports/api/creature/CreatureProperties.js +++ b/app/imports/api/creature/CreatureProperties.js @@ -44,7 +44,13 @@ let CreaturePropertySchema = new SimpleSchema({ icon: { type: storedIconsSchema, optional: true, - } + }, + // Denormalised flag if this property is inactive on the sheet for any reason + // Including being disabled, or a decendent of a disabled property + inactive: { + type: Boolean, + optional: true, + }, }); for (let key in propertySchemasIndex){ diff --git a/app/imports/api/creature/computation/computeToggle.js b/app/imports/api/creature/computation/computeToggle.js index 69cbbbb1..c766b012 100644 --- a/app/imports/api/creature/computation/computeToggle.js +++ b/app/imports/api/creature/computation/computeToggle.js @@ -27,7 +27,7 @@ export default function computeToggle(toggle, memo){ toggle.toggleResult = !!+toggle.condition; } else { let {value, errors} = evaluateCalculation(toggle.condition, memo); - toggle.toggleResult = value; + toggle.toggleResult = !!value; if (errors.length){ toggle.errors = errors; } diff --git a/app/imports/api/creature/computation/recomputeCreature.js b/app/imports/api/creature/computation/recomputeCreature.js index 088a9a7f..6e81836b 100644 --- a/app/imports/api/creature/computation/recomputeCreature.js +++ b/app/imports/api/creature/computation/recomputeCreature.js @@ -3,11 +3,13 @@ import { RateLimiterMixin } from 'ddp-rate-limiter-mixin'; import SimpleSchema from 'simpl-schema'; import { assertEditPermission } from '/imports/api/creature/creaturePermissions.js'; import ComputationMemo from '/imports/api/creature/computation/ComputationMemo.js'; +import CreatureProperties from '/imports/api/creature/CreatureProperties.js'; import computeMemo from '/imports/api/creature/computation/computeMemo.js'; import getActiveProperties from '/imports/api/creature/getActiveProperties.js'; import writeAlteredProperties from '/imports/api/creature/computation/writeAlteredProperties.js'; import writeCreatureVariables from '/imports/api/creature/computation/writeCreatureVariables.js'; -import { recomputeDamageMultipliersById } from '/imports/api/creature/damageMultiplierDenormalise/recomputeDamageMultipliers.js'; +import { recomputeDamageMultipliersById } from '/imports/api/creature/denormalise/recomputeDamageMultipliers.js'; +import recomputeInactiveProperties from '/imports/api/creature/denormalise/recomputeInactiveProperties.js'; import Creatures from '/imports/api/creature/Creatures.js'; export const recomputeCreature = new ValidatedMethod({ @@ -95,12 +97,18 @@ export function recomputeCreatureById(creatureId){ */ export function recomputeCreatureByDoc(creature){ const creatureId = creature._id; - let props = getActiveProperties({ + recomputeInactiveProperties(creatureId); + let props = CreatureProperties.find({ + 'ancestors.id': creatureId, + inactive: {$ne: true}, + type: {$in: calculationPropertyTypes}, + }).fetch(); + /*getActiveProperties({ ancestorId: creatureId, filter: {type: {$in: calculationPropertyTypes}}, includeUntoggled: true, // TODO filter out expensive fields, particularly icon field - }); + });*/ let computationMemo = new ComputationMemo(props, creature); computeMemo(computationMemo); writeAlteredProperties(computationMemo); diff --git a/app/imports/api/creature/damageMultiplierDenormalise/recomputeDamageMultipliers.js b/app/imports/api/creature/denormalise/recomputeDamageMultipliers.js similarity index 100% rename from app/imports/api/creature/damageMultiplierDenormalise/recomputeDamageMultipliers.js rename to app/imports/api/creature/denormalise/recomputeDamageMultipliers.js diff --git a/app/imports/api/creature/denormalise/recomputeInactiveProperties.js b/app/imports/api/creature/denormalise/recomputeInactiveProperties.js new file mode 100644 index 00000000..eb988f8b --- /dev/null +++ b/app/imports/api/creature/denormalise/recomputeInactiveProperties.js @@ -0,0 +1,44 @@ +import CreatureProperties from '/imports/api/creature/CreatureProperties.js'; + +export default function recomputeInactiveProperties(ancestorId){ + let disabledFilter = { + 'ancestors.id': ancestorId, + $or: [ + {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}}, + ], + }; + let disabledIds = CreatureProperties.find(disabledFilter, { + fields: {_id: 1}, + }).map(prop => prop._id); + + // Set all the properties inactive that aren't already inactive but should be + CreatureProperties.update({ + 'ancestors.id': ancestorId, + $or: [{ + '_id': {$in: disabledIds} + }, { + 'ancestors.id': {$in: disabledIds} + }], + inactive: {$ne: true}, + }, { + $set: {inactive: true}, + }, { + multi: true, + selector: {type: 'any'}, + }); + // Remove inactive from all the properties that are inactive but shouldn't be + CreatureProperties.update({ + 'ancestors.id': {$eq: ancestorId, $nin: disabledIds}, + '_id': {$nin: disabledIds}, + inactive: true, + }, { + $unset: {inactive: 1}, + }, { + multi: true, + selector: {type: 'any'}, + }); +} diff --git a/app/imports/api/properties/Toggles.js b/app/imports/api/properties/Toggles.js index 65efad65..9af7e9c4 100644 --- a/app/imports/api/properties/Toggles.js +++ b/app/imports/api/properties/Toggles.js @@ -25,7 +25,7 @@ const ToggleSchema = new SimpleSchema({ const ComputedOnlyToggleSchema = new SimpleSchema({ // The computed result of the effect toggleResult: { - type: SimpleSchema.oneOf(Number, String, Boolean), + type: Boolean, optional: true, }, // The errors encountered while computing the result diff --git a/app/imports/server/publications/slotFillers.js b/app/imports/server/publications/slotFillers.js index e7dd0029..27b5b185 100644 --- a/app/imports/server/publications/slotFillers.js +++ b/app/imports/server/publications/slotFillers.js @@ -34,7 +34,7 @@ Meteor.publish('slotFillers', function(slotId){ let filter = { 'ancestors.id': {$in: libraryIds}, }; - if (slot.slotTags.length){ + if (slot.slotTags && slot.slotTags.length){ filter.tags = {$all: slot.slotTags}; } if (slot.slotType){ diff --git a/app/imports/ui/creature/slots/SlotDetailsDialog.vue b/app/imports/ui/creature/slots/SlotDetailsDialog.vue new file mode 100644 index 00000000..14aad531 --- /dev/null +++ b/app/imports/ui/creature/slots/SlotDetailsDialog.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/app/imports/ui/creature/slots/SlotFillDialog.vue b/app/imports/ui/creature/slots/SlotFillDialog.vue index ed084875..dfb71e7b 100644 --- a/app/imports/ui/creature/slots/SlotFillDialog.vue +++ b/app/imports/ui/creature/slots/SlotFillDialog.vue @@ -8,7 +8,7 @@