diff --git a/app/imports/api/creature/denormalise/recomputeDamageMultipliers.js b/app/imports/api/creature/denormalise/recomputeDamageMultipliers.js index 515fb9a4..ca722736 100644 --- a/app/imports/api/creature/denormalise/recomputeDamageMultipliers.js +++ b/app/imports/api/creature/denormalise/recomputeDamageMultipliers.js @@ -3,7 +3,7 @@ import { RateLimiterMixin } from 'ddp-rate-limiter-mixin'; import SimpleSchema from 'simpl-schema'; import { assertEditPermission } from '/imports/api/creature/creaturePermissions.js'; import Creatures from '/imports/api/creature/Creatures.js'; -import getActiveProperties from '/imports/api/creature/getActiveProperties.js'; +import CreatureProperties from '/imports/api/creature/CreatureProperties.js'; export const recomputeDamageMultipliers = new ValidatedMethod({ @@ -31,9 +31,13 @@ export const recomputeDamageMultipliers = new ValidatedMethod({ export function recomputeDamageMultipliersById(creatureId){ if (!creatureId) throw 'Creature ID is required'; - let props = getActiveProperties({ - ancestorId: creatureId, - filter: {type: 'damageMultiplier'}, + let props = CreatureProperties.find({ + 'ancestors.id': creatureId, + type: 'damageMultiplier', + removed: {$ne: true}, + inactive: {$ne: true}, + }, { + sort: {order: 1} }); // Count of how many weakness, resistances and immunities each damage type has diff --git a/app/imports/api/creature/getActiveProperties.js b/app/imports/api/creature/getActiveProperties.js deleted file mode 100644 index d4c7d7ac..00000000 --- a/app/imports/api/creature/getActiveProperties.js +++ /dev/null @@ -1,86 +0,0 @@ -import Creatures from '/imports/api/creature/Creatures.js'; -import CreatureProperties from '/imports/api/creature/CreatureProperties.js'; - -export default function getActiveProperties({ - ancestorId, - filter = {}, - options = {sort: {order: 1}}, - includeUntoggled = false, - includeUnprepared = false, - includeUnequipped = false, - excludeAncestors, -}){ - filter = getActivePropertyFilter({ - ancestorId, - filter, - includeUntoggled, - includeUnprepared, - includeUnequipped, - excludeAncestors, - }); - return CreatureProperties.find(filter, options).fetch(); -} - -export function getActivePropertyFilter({ - ancestorId, - filter = {}, - includeUntoggled = false, - includeUnprepared = false, - includeUnequipped = false, - excludeAncestors = [], -}){ - if (!ancestorId){ - throw 'Ancestor Id is required to get active properties' - } - // First get ids of disabled properties, unequiped items, unapplied buffs - let disabledAncestorsFilter = { - 'ancestors.id': ancestorId, - $or: [ - {disabled: true}, // Everything can be disabled - {applied: false}, // Buffs can be applied - ], - }; - if (!includeUnequipped){ - disabledAncestorsFilter.$or.push({type: 'item', equipped: {$ne: true}}); - } - if (!includeUntoggled){ - disabledAncestorsFilter.$or.push({toggleResult: false}); - } - if (!includeUnprepared){ - disabledAncestorsFilter.$or.push({ - type: 'spell', - prepared: {$ne: true}, - alwaysPrepared: {$ne: true} - }); - } - let disabledAncestorIds = CreatureProperties.find(disabledAncestorsFilter, { - fields: {_id: 1}, - }).map(prop => prop._id); - - // Then get the ids of creatures that are children of this creature - // to isolate their decendent properties - Creatures.find({ - 'ancestors.id': ancestorId, - }, { - fields: {_id: 1}, - }).forEach(subCreature => { - disabledAncestorIds.push(subCreature._id); - }); - - // Get all the properties that are decendents of the ancestor of interest but - // aren't from the excluded decendents - if (filter['ancestors.id'] && Meteor.isClient){ - console.warn('Filtering on ancestor id is ignored') - } - filter['ancestors.id'] = { - $eq: ancestorId, - $nin: disabledAncestorIds.concat(excludeAncestors), - }; - // Get properties that aren't removed - filter.removed = {$ne: true}; - // Don't include the disabled ancestors themselves either - filter._id = { - $nin: disabledAncestorIds, - } - return filter; -} diff --git a/app/imports/api/creature/restCreature.js b/app/imports/api/creature/restCreature.js index 1f8a5fa9..e8897c5a 100644 --- a/app/imports/api/creature/restCreature.js +++ b/app/imports/api/creature/restCreature.js @@ -3,7 +3,6 @@ import { ValidatedMethod } from 'meteor/mdg:validated-method'; import { RateLimiterMixin } from 'ddp-rate-limiter-mixin'; import Creatures from '/imports/api/creature/Creatures.js'; import CreatureProperties from '/imports/api/creature/CreatureProperties.js'; -import getActiveProperties, { getActivePropertyFilter } from '/imports/api/creature/getActiveProperties.js'; import { assertEditPermission } from '/imports/api/creature/creaturePermissions.js'; import { recomputeCreatureById } from '/imports/api/creature/computation/recomputeCreature.js'; @@ -43,11 +42,12 @@ const restCreature = new ValidatedMethod({ resetFilter = {$in: ['shortRest', 'longRest']} } // Only apply to active properties - let filter = getActivePropertyFilter({ - filter: {reset: resetFilter}, - ancestorId: creatureId, - includeUntoggled: true, - }); + let filter = { + 'ancestors.id': creatureId, + reset: resetFilter, + removed: {$ne: true}, + inactive: {$ne: true}, + }; // update all attribute's damage filter.type = 'attribute'; CreatureProperties.update(filter, { @@ -70,14 +70,18 @@ const restCreature = new ValidatedMethod({ }); // Reset half hit dice on a long rest, starting with the highest dice if (restType === 'longRest'){ - let hitDice = getActiveProperties({ - ancestorId: creatureId, - filter: {type: 'attribute', attributeType: 'hitDice'}, - options: {fields: { + let hitDice = CreatureProperties.find({ + 'ancestors.id': creatureId, + type: 'attribute', + attributeType: 'hitDice', + removed: {$ne: true}, + inactive: {$ne: true}, + }, { + fields: { hitDiceSize: 1, damage: 1, value: 1, - }}, + } }); // Use a collator to do sorting in natural order let collator = new Intl.Collator('en', { diff --git a/app/imports/ui/creature/character/CharacterDeleteDialog.vue b/app/imports/ui/creature/character/CharacterDeleteDialog.vue index 90dae5d1..b91b0095 100644 --- a/app/imports/ui/creature/character/CharacterDeleteDialog.vue +++ b/app/imports/ui/creature/character/CharacterDeleteDialog.vue @@ -55,7 +55,7 @@ export default { }, meteor: { name(){ - let creature = Creatures.findOne(this.id); + let creature = Creatures.findOne(this.id, {fields: {name: 1}}); return creature && creature.name; }, }, diff --git a/app/imports/ui/creature/character/characterSheetTabs/CharacterTab.vue b/app/imports/ui/creature/character/characterSheetTabs/CharacterTab.vue index f45d8cb1..97be825b 100644 --- a/app/imports/ui/creature/character/characterSheetTabs/CharacterTab.vue +++ b/app/imports/ui/creature/character/characterSheetTabs/CharacterTab.vue @@ -114,7 +114,6 @@ import Creatures from '/imports/api/creature/Creatures.js'; import CreatureProperties from '/imports/api/creature/CreatureProperties.js'; import ColumnLayout from '/imports/ui/components/ColumnLayout.vue'; import NoteCard from '/imports/ui/properties/components/persona/NoteCard.vue'; -import getActiveProperties from '/imports/api/creature/getActiveProperties.js'; import Slots from '/imports/ui/creature/slots/Slots.vue'; import ToolbarCard from '/imports/ui/components/ToolbarCard.vue'; @@ -171,9 +170,13 @@ export default { return Creatures.findOne(this.creatureId); }, classLevels(){ - return getActiveProperties({ - ancestorId: this.creatureId, - filter: {type: 'classLevel'}, + return CreatureProperties.find({ + 'ancestors.id': this.creatureId, + type: 'classLevel', + removed: {$ne: true}, + inactive: {$ne: true}, + }, { + sort: {order: 1} }); }, }, diff --git a/app/imports/ui/creature/character/characterSheetTabs/FeaturesTab.vue b/app/imports/ui/creature/character/characterSheetTabs/FeaturesTab.vue index 76667bc8..a60c4b2b 100644 --- a/app/imports/ui/creature/character/characterSheetTabs/FeaturesTab.vue +++ b/app/imports/ui/creature/character/characterSheetTabs/FeaturesTab.vue @@ -16,7 +16,7 @@