52 lines
1.7 KiB
JavaScript
52 lines
1.7 KiB
JavaScript
import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties.js';
|
|
import { union } from 'lodash';
|
|
|
|
export default function getDependentProperties({
|
|
creatureId,
|
|
propertyIds,
|
|
propertiesDependedAponIds,
|
|
}){
|
|
// find ids of all dependant toggles that have conditions, even if inactive
|
|
let toggleIds = CreatureProperties.find({
|
|
'ancestors.id': creatureId,
|
|
type: 'toggle',
|
|
removed: {$ne: true},
|
|
condition: { $exists: true },
|
|
dependencies: {$in: propertyIds},
|
|
}, {
|
|
fields: {_id: 1},
|
|
}).map(t => t._id);
|
|
// Find all the dependant properties
|
|
let props = CreatureProperties.find({
|
|
'ancestors.id': creatureId,
|
|
removed: {$ne: true},
|
|
dependencies: {$in: propertyIds},
|
|
$or: [
|
|
// All active properties
|
|
{inactive: {$ne: true}},
|
|
// All active and inactive toggles with conditions
|
|
// Same as {$in: toggleIds}, but should be slightly faster
|
|
{type: 'toggle', condition: { $exists: true }},
|
|
// All decendents of the above toggles
|
|
{'ancestors.id': {$in: toggleIds}},
|
|
]
|
|
}, { fields: {_id: 1, dependencies: 1} }).fetch();
|
|
// Add all the properties that changing props depend on, but haven't yet been
|
|
// included to make an array of every property we need
|
|
let allConnectedPropIds = [...propertyIds, ...propertiesDependedAponIds];
|
|
props.forEach(prop => {
|
|
allConnectedPropIds = union(
|
|
allConnectedPropIds,
|
|
prop.dependencies,
|
|
[prop._id]);
|
|
});
|
|
// Add on all the properties and the objects they depend apon
|
|
return CreatureProperties.find({
|
|
_id: {$in: allConnectedPropIds}
|
|
}, {
|
|
// Ignore fields not used in computations
|
|
fields: {icon: 0},
|
|
sort: {order: 1},
|
|
}).fetch();
|
|
}
|