From ca5ded7dedd3680cf4dad3eb7f2af1adb7ef033a Mon Sep 17 00:00:00 2001 From: Thaum Rystra Date: Sat, 16 May 2020 22:51:17 +0200 Subject: [PATCH] Class levels now recompute properly --- .../creature/computation/ComputationMemo.js | 1 + .../api/creature/computation/computeLevels.js | 44 +++++++++++++++++++ .../api/creature/computation/computeMemo.js | 3 ++ .../api/creature/computation/computeToggle.js | 2 + app/imports/api/properties/ClassLevels.js | 6 --- .../ui/properties/forms/ClassLevelForm.vue | 13 +----- 6 files changed, 52 insertions(+), 17 deletions(-) create mode 100644 app/imports/api/creature/computation/computeLevels.js diff --git a/app/imports/api/creature/computation/ComputationMemo.js b/app/imports/api/creature/computation/ComputationMemo.js index d2f15ca0..fc5e4dd3 100644 --- a/app/imports/api/creature/computation/ComputationMemo.js +++ b/app/imports/api/creature/computation/ComputationMemo.js @@ -12,6 +12,7 @@ export default class ComputationMemo { this.skillsByAbility = {}; this.unassignedEffects = []; this.classLevelsById = {}; + this.classes = {}; this.togglesById = {}; this.toggleIds = new Set(); // First note all the ids of all the toggles diff --git a/app/imports/api/creature/computation/computeLevels.js b/app/imports/api/creature/computation/computeLevels.js new file mode 100644 index 00000000..81e1dd4d --- /dev/null +++ b/app/imports/api/creature/computation/computeLevels.js @@ -0,0 +1,44 @@ +import { forOwn, has } from 'lodash'; + +export default function computeLevels(memo){ + computeClassLevels(memo); + computeTotalLevel(memo); +} + +function computeClassLevels(memo){ + forOwn(memo.classLevelsById, classLevel => { + let name = classLevel.variableName; + let stat = memo.statsByVariableName[name]; + if (!stat){ + memo.statsByVariableName[name] = classLevel; + memo.classes[name] = classLevel; + } else if (!has(stat, 'level')){ + // Stat is overriden by an attribute + return; + } else if (stat.level < classLevel.level) { + memo.statsByVariableName[name] = classLevel; + memo.classes[name] = classLevel; + } + }); +} + +function computeTotalLevel(memo){ + let currentLevel = memo.statsByVariableName['level']; + if (!currentLevel){ + currentLevel = { + value: 0, + computationDetails: { + builtIn: true, + computed: true, + } + }; + memo.statsByVariableName['level'] = currentLevel; + } + // bail out if overriden by an attribute + if (!currentLevel.computationDetails.builtIn) return; + let level = 0; + for (let name in memo.classes){ + level += memo.classes[name].level || 0; + } + memo.statsByVariableName['level'].value = level; +} diff --git a/app/imports/api/creature/computation/computeMemo.js b/app/imports/api/creature/computation/computeMemo.js index bd7f1384..635d8090 100644 --- a/app/imports/api/creature/computation/computeMemo.js +++ b/app/imports/api/creature/computation/computeMemo.js @@ -1,9 +1,12 @@ 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'; export default function computeMemo(memo){ + // Compute level + computeLevels(memo); // Compute all stats, even if they are overriden forOwn(memo.statsById, stat => { computeStat (stat, memo); diff --git a/app/imports/api/creature/computation/computeToggle.js b/app/imports/api/creature/computation/computeToggle.js index a1689262..a8a68ca4 100644 --- a/app/imports/api/creature/computation/computeToggle.js +++ b/app/imports/api/creature/computation/computeToggle.js @@ -18,6 +18,8 @@ export default function computeToggle(toggle, memo){ // Do work if (toggle.enabled){ toggle.toggleResult = true; + } else if (toggle.disabled){ + toggle.toggleResult = false; } else if (!toggle.condition){ toggle.toggleResult = false; } else if (Number.isFinite(+toggle.condition)){ diff --git a/app/imports/api/properties/ClassLevels.js b/app/imports/api/properties/ClassLevels.js index 86e3654f..a4d46c60 100644 --- a/app/imports/api/properties/ClassLevels.js +++ b/app/imports/api/properties/ClassLevels.js @@ -11,12 +11,6 @@ let ClassLevelSchema = new SimpleSchema({ type: String, regEx: VARIABLE_NAME_REGEX, }, - // The variable name of the base class this level is attached to - baseClass: { - type: String, - regEx: VARIABLE_NAME_REGEX, - optional: true, - }, level: { type: SimpleSchema.Integer, defaultValue: 1, diff --git a/app/imports/ui/properties/forms/ClassLevelForm.vue b/app/imports/ui/properties/forms/ClassLevelForm.vue index 683ee3c9..23167891 100644 --- a/app/imports/ui/properties/forms/ClassLevelForm.vue +++ b/app/imports/ui/properties/forms/ClassLevelForm.vue @@ -20,23 +20,14 @@ @change="(value, ack) => $emit('change', {path: ['name'], value, ack})" /> -