Refactored computation into folders

This commit is contained in:
Stefan Zermatten
2021-02-04 13:33:20 +02:00
parent 87fa941f63
commit 326d1bd165
41 changed files with 115 additions and 67 deletions

View File

@@ -1,5 +1,5 @@
import { includes, cloneDeep } from 'lodash';
import findAncestorByType from '/imports/api/creature/computation/findAncestorByType.js';
import findAncestorByType from '/imports/api/creature/computation/engine/findAncestorByType.js';
// The computation memo is an in-memory data structure used only during the
// computation process

View File

@@ -1,4 +1,4 @@
import evaluateCalculation from '/imports/api/creature/computation/evaluateCalculation.js';
import evaluateCalculation from '/imports/api/creature/computation/engine/evaluateCalculation.js';
export default class EffectAggregator{
constructor(stat, memo){

View File

@@ -1,4 +1,4 @@
import computeToggle from '/imports/api/creature/computation/computeToggle.js';
import computeToggle from '/imports/api/creature/computation/engine/computeToggle.js';
export default function applyToggles(prop, memo){
prop.computationDetails.toggleAncestors.forEach(toggleId => {

View File

@@ -1,6 +1,6 @@
import computeStat from '/imports/api/creature/computation/computeStat.js';
import applyToggles from '/imports/api/creature/computation/applyToggles.js';
import evaluateCalculation from '/imports/api/creature/computation/evaluateCalculation.js';
import computeStat from '/imports/api/creature/computation/engine/computeStat.js';
import applyToggles from '/imports/api/creature/computation/engine/applyToggles.js';
import evaluateCalculation from '/imports/api/creature/computation/engine/evaluateCalculation.js';
export default function combineStat(stat, aggregator, memo){
if (stat.type === 'attribute'){

View File

@@ -1,5 +1,5 @@
import evaluateCalculation from '/imports/api/creature/computation/evaluateCalculation.js';
import applyToggles from '/imports/api/creature/computation/applyToggles.js';
import evaluateCalculation from '/imports/api/creature/computation/engine/evaluateCalculation.js';
import applyToggles from '/imports/api/creature/computation/engine/applyToggles.js';
export default function computeEffect(effect, memo){
if (effect.computationDetails.computed) return;

View File

@@ -1,4 +1,4 @@
import evaluateCalculation from '/imports/api/creature/computation/evaluateCalculation.js';
import evaluateCalculation from '/imports/api/creature/computation/engine/evaluateCalculation.js';
import ConstantNode from '/imports/parser/parseTree/ConstantNode.js';
export default function computeEndStepProperty(prop, memo){

View File

@@ -1,4 +1,4 @@
import evaluateCalculation from '/imports/api/creature/computation/evaluateCalculation.js';
import evaluateCalculation from '/imports/api/creature/computation/engine/evaluateCalculation.js';
export default function computeInlineCalculations(prop, memo){
if (prop.summary){

View File

@@ -1,10 +1,10 @@
import { each, forOwn } from 'lodash';
import computeLevels from '/imports/api/creature/computation/computeLevels.js';
import computeStat from '/imports/api/creature/computation/computeStat.js';
import computeEffect from '/imports/api/creature/computation/computeEffect.js';
import computeToggle from '/imports/api/creature/computation/computeToggle.js';
import computeEndStepProperty from '/imports/api/creature/computation/computeEndStepProperty.js';
import computeInlineCalculations from '/imports/api/creature/computation/computeInlineCalculations.js';
import computeLevels from '/imports/api/creature/computation/engine/computeLevels.js';
import computeStat from '/imports/api/creature/computation/engine/computeStat.js';
import computeEffect from '/imports/api/creature/computation/engine/computeEffect.js';
import computeToggle from '/imports/api/creature/computation/engine/computeToggle.js';
import computeEndStepProperty from '/imports/api/creature/computation/engine/computeEndStepProperty.js';
import computeInlineCalculations from '/imports/api/creature/computation/engine/computeInlineCalculations.js';
export default function computeMemo(memo){
// Compute level

View File

@@ -1,7 +1,7 @@
import combineStat from '/imports/api/creature/computation/combineStat.js';
import computeEffect from '/imports/api/creature/computation/computeEffect.js';
import EffectAggregator from '/imports/api/creature/computation/EffectAggregator.js';
import applyToggles from '/imports/api/creature/computation/applyToggles.js';
import combineStat from '/imports/api/creature/computation/engine/combineStat.js';
import computeEffect from '/imports/api/creature/computation/engine/computeEffect.js';
import EffectAggregator from '/imports/api/creature/computation/engine/EffectAggregator.js';
import applyToggles from '/imports/api/creature/computation/engine/applyToggles.js';
import { each } from 'lodash';
export default function computeStat(stat, memo){

View File

@@ -1,4 +1,4 @@
import evaluateCalculation from '/imports/api/creature/computation/evaluateCalculation.js';
import evaluateCalculation from '/imports/api/creature/computation/engine/evaluateCalculation.js';
export default function computeToggle(toggle, memo){
if (toggle.computationDetails.computed) return;

View File

@@ -1,9 +1,9 @@
import computeStat from '/imports/api/creature/computation/computeStat.js';
import computeStat from '/imports/api/creature/computation/engine/computeStat.js';
import { parse, CompilationContext } from '/imports/parser/parser.js';
import SymbolNode from '/imports/parser/parseTree/SymbolNode.js';
import AccessorNode from '/imports/parser/parseTree/AccessorNode.js';
import ConstantNode from '/imports/parser/parseTree/ConstantNode.js';
import findAncestorByType from '/imports/api/creature/computation/findAncestorByType.js';
import findAncestorByType from '/imports/api/creature/computation/engine/findAncestorByType.js';
/* Convert a calculation into a constant output and errors*/
export default function evaluateCalculation({

View File

@@ -0,0 +1,42 @@
import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties.js';
export default function getDependentProperties({creatureId, dependencies}){
// 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: dependencies},
}, {
fields: {_id: 1},
}).map(t => t._id);
// Find all the dependant properties
let props = CreatureProperties.find({
'ancestors.id': creatureId,
removed: {$ne: true},
dependencies: {$in: dependencies},
$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}},
]
}, {
// Filter out fields never used by calculations
fields: {
icon: 0,
},
sort: {
order: 1,
}
}).fetch();
// Add on all the properties th
CreatureProperties.find({_id: {$in: dependencies}}).forEach(prop => {
props.push(prop)
});
return props;
}

View File

@@ -79,7 +79,9 @@ function addUnsetOp(op, key){
function bulkWriteProperties(bulkWriteOps){
if (!bulkWriteOps.length) return;
if (Meteor.isServer){
// Only use bulk writing if there are many writes to do
// it makes latency compensation janky, so we avoid it for smaller writes
if (Meteor.isServer && bulkWriteOps.length > 16){
CreatureProperties.rawCollection().bulkWrite(
bulkWriteOps,
{ordered : false},
@@ -94,10 +96,8 @@ function bulkWriteProperties(bulkWriteOps){
bulkWriteOps.forEach(op => {
let updateOneOrMany = op.updateOne || op.updateMany;
CreatureProperties.update(updateOneOrMany.filter, updateOneOrMany.update, {
// The server code is bypassing collection 2 validation, so do the same
// on the client
// include this if bypass is off:
// selector: {type: op.type}
// The bulk code is bypassing validation, so do the same here
// selector: {type: op.type} // include this if bypass is off
bypassCollection2: true,
});
});

View File

@@ -2,14 +2,16 @@ import { ValidatedMethod } from 'meteor/mdg:validated-method';
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 getComputationProperties from '/imports/api/creature/computation/getComputationProperties.js';
import computeMemo from '/imports/api/creature/computation/computeMemo.js';
import writeAlteredProperties from '/imports/api/creature/computation/writeAlteredProperties.js';
import writeCreatureVariables from '/imports/api/creature/computation/writeCreatureVariables.js';
import ComputationMemo from '/imports/api/creature/computation/engine/ComputationMemo.js';
import getComputationProperties from '/imports/api/creature/computation/engine/getComputationProperties.js';
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';
import Creatures from '/imports/api/creature/Creatures.js';
export const recomputeCreature = new ValidatedMethod({
@@ -95,16 +97,22 @@ export function recomputeCreatureByDoc(creature){
return computationMemo;
}
// TODO
export function recomputePropertyDependencies(property){
// Placeholder functionality, just recompute the whole creature
let creature = Creatures.findOne(property.ancestors[0].id);
recomputeCreatureByDoc(creature);
let creature = getRootCreatureAncestor(property);
recomputeCreatureByDependencies({
creature,
dependencies: [property._id],
});
}
// TODO
export function recomputeCreatureByIdAndDependencies({creatureId, dependencies}){
// Placeholder functionality, just recompute the whole creature
let creature = Creatures.findOne(creatureId);
recomputeCreatureByDoc(creature);
export function recomputeCreatureByDependencies({creature, dependencies}){
let props = getDependentProperties({
creatureId: creature._id,
dependencies,
});
let computationMemo = new ComputationMemo(props, creature);
computeMemo(computationMemo);
writeAlteredProperties(computationMemo);
return computationMemo;
}