From b2f89eceee5ac40d43721fa6e2b7d634f39e1008 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Thu, 23 Jun 2022 08:39:48 +0200 Subject: [PATCH] Fixed some bugs with characters not recomputing TODO: remove .variables cache from creature document, it's not viable --- .../actions/applyPropertyByType/applyDamage.js | 3 +-- app/imports/api/engine/actions/doAction.js | 2 +- app/imports/api/engine/actions/doCastSpell.js | 2 +- .../engine/computation/buildCreatureComputation.js | 1 + .../computation/writeComputation/writeScope.js | 12 +++++++++++- app/imports/api/parenting/organizeMethods.js | 4 ++-- 6 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/imports/api/engine/actions/applyPropertyByType/applyDamage.js b/app/imports/api/engine/actions/applyPropertyByType/applyDamage.js index 0978d07a..ebf7448b 100644 --- a/app/imports/api/engine/actions/applyPropertyByType/applyDamage.js +++ b/app/imports/api/engine/actions/applyPropertyByType/applyDamage.js @@ -18,10 +18,9 @@ export default function applyDamage(node, { const prop = node.node; // Skip if there is no parse node to work with - if (!prop.amount.parseNode) return; + if (!prop.amount?.parseNode) return; // Choose target - let damageTargets = prop.target === 'self' ? [creature] : targets; // Determine if the hit is critical let criticalHit = scope['$criticalHit']?.value && diff --git a/app/imports/api/engine/actions/doAction.js b/app/imports/api/engine/actions/doAction.js index a53f628d..7d75fdc5 100644 --- a/app/imports/api/engine/actions/doAction.js +++ b/app/imports/api/engine/actions/doAction.js @@ -79,7 +79,7 @@ const doAction = new ValidatedMethod({ Creatures.update({ _id: { $in: [creature._id, ...targetIds] } }, { - dirty: true + $set: {dirty: true}, }); }, }); diff --git a/app/imports/api/engine/actions/doCastSpell.js b/app/imports/api/engine/actions/doCastSpell.js index 8e0da001..e403e271 100644 --- a/app/imports/api/engine/actions/doCastSpell.js +++ b/app/imports/api/engine/actions/doCastSpell.js @@ -133,7 +133,7 @@ const doAction = new ValidatedMethod({ Creatures.update({ _id: { $in: [creature._id, ...targetIds] } }, { - dirty: true + $set: { dirty: true }, }); }, }); diff --git a/app/imports/api/engine/computation/buildCreatureComputation.js b/app/imports/api/engine/computation/buildCreatureComputation.js index 0da96e21..2fe3c4b2 100644 --- a/app/imports/api/engine/computation/buildCreatureComputation.js +++ b/app/imports/api/engine/computation/buildCreatureComputation.js @@ -67,6 +67,7 @@ function getCreature(creatureId) { const creature = Creatures.findOne(creatureId, { denormalizedStats: 1, variables: 1, + dirty: 1, }); console.timeEnd(`Cache miss on Creature: ${creatureId}`); return creature; diff --git a/app/imports/api/engine/computation/writeComputation/writeScope.js b/app/imports/api/engine/computation/writeComputation/writeScope.js index 3bb550f8..6ab6a1e0 100644 --- a/app/imports/api/engine/computation/writeComputation/writeScope.js +++ b/app/imports/api/engine/computation/writeComputation/writeScope.js @@ -1,11 +1,16 @@ import Creatures from '/imports/api/creature/creatures/Creatures.js'; import { EJSON } from 'meteor/ejson'; +import { omitBy } from 'lodash'; export default function writeScope(creatureId, computation) { const scope = computation.scope; const variables = computation.creature?.variables || {}; let $set, $unset; + if (computation.creature.dirty) { + $unset = { dirty: 1 }; + } + for (const key in scope){ // Remove large properties that aren't likely to be accessed delete scope[key].parent; @@ -22,6 +27,10 @@ export default function writeScope(creatureId, computation) { if (!EJSON.equals(variables[key], scope[key])) { if (!$set) $set = {}; // Set the changed key in the creature variables + const diff = omitBy(variables[key], (v, k) => EJSON.equals(scope[key][k], v)); + for (let subkey in diff) { + console.log(`${key}.${subkey}: ${variables[key][subkey]} => ${scope[key][subkey]}`) + } $set[`variables.${key}`] = scope[key]; } } @@ -35,6 +44,7 @@ export default function writeScope(creatureId, computation) { } if ($set || $unset) { - Creatures.update(creatureId, {$set, $unset}); + const updates = Creatures.update(creatureId, { $set, $unset }); + console.log('wrote scope: ', updates); } } diff --git a/app/imports/api/parenting/organizeMethods.js b/app/imports/api/parenting/organizeMethods.js index c4b822b2..88500085 100644 --- a/app/imports/api/parenting/organizeMethods.js +++ b/app/imports/api/parenting/organizeMethods.js @@ -61,7 +61,7 @@ const organizeDoc = new ValidatedMethod({ Creatures.update({ _id: { $in: creaturesToRecompute } }, { - dirty: true + $set: { dirty: true }, }); } }, @@ -91,7 +91,7 @@ const reorderDoc = new ValidatedMethod({ Creatures.update({ _id: { $in: ancestors } }, { - dirty: true + $set: { dirty: true }, }); } },