Damage multipliers now compute and show up on the character sheet

This commit is contained in:
Thaum Rystra
2020-05-14 15:22:23 +02:00
parent a4d6adacff
commit cb34363a4e
8 changed files with 167 additions and 16 deletions

View File

@@ -1,13 +1,14 @@
import { ValidatedMethod } from 'meteor/mdg:validated-method';
import SimpleSchema from 'simpl-schema';
import deathSaveSchema from '/imports/api/properties/subSchemas/DeathSavesSchema.js'
import ColorSchema from '/imports/api/properties/subSchemas/ColorSchema.js';
import SharingSchema from '/imports/api/sharing/SharingSchema.js';
import {assertEditPermission, assertOwnership} from '/imports/api/sharing/sharingPermissions.js';
import {assertEditPermission} from '/imports/api/sharing/sharingPermissions.js';
import '/imports/api/creature/removeCreature.js';
//set up the collection for creatures
Creatures = new Mongo.Collection('creatures');
let Creatures = new Mongo.Collection('creatures');
let CreatureSettingsSchema = new SimpleSchema({
//slowed down by carrying too much?
@@ -34,13 +35,6 @@ let CreatureSchema = new SimpleSchema({
defaultValue: '',
optional: true,
},
urlName: {
type: String,
optional: true,
autoValue: function() {
return getSlug(this.field('name').value, {maintainCase: true}) || '-';
},
},
alignment: {
type: String,
optional: true
@@ -76,6 +70,11 @@ let CreatureSchema = new SimpleSchema({
defaultValue: 'pc',
allowedValues: ['pc', 'npc', 'monster'],
},
damageMultipliers: {
type: Object,
blackbox: true,
defaultValue: {}
},
variables: {
type: Object,
blackbox: true,
@@ -118,7 +117,7 @@ const insertCreature = new ValidatedMethod({
const updateCreature = new ValidatedMethod({
name: 'Creatures.methods.update',
validate({_id, path, value}){
validate({_id, path}){
if (!_id) return false;
// Allowed fields
let allowedFields = ['name', 'alignment', 'gender', 'picture', 'settings'];
@@ -137,4 +136,4 @@ const updateCreature = new ValidatedMethod({
});
export default Creatures;
export { CreatureSchema, insertCreature, removeCreature, updateCreature };
export { CreatureSchema, insertCreature, updateCreature };

View File

@@ -1,7 +1,7 @@
import Creatures from '/imports/api/creature/Creatures.js';
import CreatureProperties from '/imports/api/creature/CreatureProperties.js';
export default function getCalculationProperties(creatureId){
export default function getCalculationProperties(creatureId, types){
// First get ids of disabled properties and unequiped items
let disabledAncestorIds = CreatureProperties.find({
'ancestors.id': creatureId,
@@ -30,7 +30,7 @@ export default function getCalculationProperties(creatureId){
$nin: disabledAncestorIds,
},
removed: {$ne: true},
type: {$in: [
type: {$in: types || [
'attribute',
'skill',
'damageMultiplier',

View File

@@ -1,4 +1,3 @@
import { Meteor } from 'meteor/meteor'
import { ValidatedMethod } from 'meteor/mdg:validated-method';
import SimpleSchema from 'simpl-schema';
import { assertEditPermission } from '/imports/api/creature/creaturePermissions.js';
@@ -7,6 +6,7 @@ import computeMemo from '/imports/api/creature/computation/computeMemo.js';
import getCalculationProperties from '/imports/api/creature/computation/getCalculationProperties.js';
import writeAlteredProperties from '/imports/api/creature/computation/writeAlteredProperties.js';
import writeCreatureVariables from '/imports/api/creature/computation/writeCreatureVariables.js';
import { recomputeDamageMultipliersById } from '/imports/api/creature/damageMultiplierDenormalise/recomputeDamageMultipliers.js'
export const recomputeCreature = new ValidatedMethod({
@@ -69,5 +69,6 @@ export function recomputeCreatureById(creatureId){
writeAlteredProperties(computationMemo);
writeCreatureVariables(computationMemo, creatureId);
// if(Meteor.isClient) console.log(computationMemo);
recomputeDamageMultipliersById(creatureId);
return computationMemo;
}

View File

@@ -1,3 +1,4 @@
import Creatures from '/imports/api/creature/Creatures.js';
import {
assertEditPermission as editPermission,
assertViewPermission as viewPermission,

View File

@@ -0,0 +1,64 @@
import { ValidatedMethod } from 'meteor/mdg:validated-method';
import SimpleSchema from 'simpl-schema';
import { assertEditPermission } from '/imports/api/creature/creaturePermissions.js';
import Creatures from '/imports/api/creature/Creatures.js';
import getCalculationProperties from '/imports/api/creature/computation/getCalculationProperties.js'
export const recomputeDamageMultipliers = new ValidatedMethod({
name: 'Creatures.methods.recomputeDamageMultipliers',
validate: new SimpleSchema({
creatureId: { type: String }
}).validator(),
run({creatureId}) {
// Permission
assertEditPermission(creatureId, this.userId);
// Work, call this direcly if you are already in a method that has checked
// for permission to edit a given character
recomputeDamageMultipliersById(creatureId);
},
});
export function recomputeDamageMultipliersById(creatureId){
if (!creatureId) throw 'Creature ID is required';
let props = getCalculationProperties(creatureId, ['damageMultiplier']);
// Count of how many weakness, resistances and immunities each damage type has
let multipliersByName = {};
props.forEach(dm => {
dm.damageTypes.forEach(damageType => {
if (!multipliersByName[damageType]){
multipliersByName[damageType] = {
weaknesses: 0,
resistances: 0,
immunities: 0,
};
}
if (dm.value === 0){
multipliersByName[damageType].immunities++;
} else if (dm.value === 0.5){
multipliersByName[damageType].resistances++;
} else if (dm.value === 2){
multipliersByName[damageType].weaknesses++;
}
});
});
// Make an Object with keys of all the damage types that have a resulting
// immunity, weakness, or resistance
let damageMultipliers = {};
for (let damageType in multipliersByName){
let multiplier = multipliersByName[damageType];
if (multiplier.immunities){
damageMultipliers[damageType] = 0;
} else if (multiplier.resistances && !multiplier.weaknesses){
damageMultipliers[damageType] = 0.5;
} else if (multiplier.weaknesses && !multiplier.resistances){
damageMultipliers[damageType] = 2;
}
}
// Store the Object on the creature document
Creatures.update(creatureId, {$set: {damageMultipliers}});
}

View File

@@ -20,7 +20,6 @@ Meteor.publish('characterList', function(){
}, {
fields: {
name: 1,
urlName: 1,
alignment: 1,
gender: 1,
readers: 1,

View File

@@ -115,6 +115,10 @@
</v-card>
</div>
<div v-if="numKeys(creature.damageMultipliers)">
<damage-multiplier-card :model="creature.damageMultipliers" />
</div>
<div class="saving-throws">
<v-card>
<v-list>
@@ -232,11 +236,13 @@
</template>
<script>
import Creatures from '/imports/api/creature/Creatures.js';
import CreatureProperties, { damageProperty } from '/imports/api/creature/CreatureProperties.js';
import AttributeCard from '/imports/ui/properties/components/attributes/AttributeCard.vue';
import AbilityListTile from '/imports/ui/properties/components/attributes/AbilityListTile.vue';
import ColumnLayout from '/imports/ui/components/ColumnLayout.vue';
import HealthBarCardContainer from '/imports/ui/properties/components/attributes/HealthBarCardContainer.vue';
import DamageMultiplierCard from '/imports/ui/properties/components/damageMultipliers/DamageMultiplierCard.vue';
import HealthBarCardContainer from '/imports/ui/properties/components/attributes/HealthBarCardContainer.vue';
import HitDiceListTile from '/imports/ui/properties/components/attributes/HitDiceListTile.vue';
import SkillListTile from '/imports/ui/properties/components/skills/SkillListTile.vue';
import ResourceCard from '/imports/ui/properties/components/attributes/ResourceCard.vue';
@@ -271,6 +277,7 @@
AbilityListTile,
AttributeCard,
ColumnLayout,
DamageMultiplierCard,
HealthBarCardContainer,
HitDiceListTile,
SkillListTile,
@@ -286,6 +293,9 @@
},
},
meteor: {
creature(){
return Creatures.findOne(this.creatureId);
},
abilities(){
return getAttributeOfType(this.creatureId, 'ability');
},
@@ -345,6 +355,9 @@
damageProperty.call({_id, operation: 'increment' ,value: -value});
}
},
numKeys(obj){
return Object.keys(obj).length;
},
},
};
</script>

View File

@@ -0,0 +1,74 @@
<template lang="html">
<v-card>
<v-list
three-line
>
<v-list-tile v-if="weaknesses.length">
<v-list-tile-content>
<v-list-tile-title>
Vulnerabilities
</v-list-tile-title>
<v-list-tile-sub-title>
{{ weaknesses }}
</v-list-tile-sub-title>
</v-list-tile-content>
</v-list-tile>
<v-list-tile v-if="resistances.length">
<v-list-tile-content>
<v-list-tile-title>
Resistances
</v-list-tile-title>
<v-list-tile-sub-title>
{{ resistances }}
</v-list-tile-sub-title>
</v-list-tile-content>
</v-list-tile>
<v-list-tile v-if="immunities.length">
<v-list-tile-content>
<v-list-tile-title>
Immunities
</v-list-tile-title>
<v-list-tile-sub-title>
{{ immunities }}
</v-list-tile-sub-title>
</v-list-tile-content>
</v-list-tile>
</v-list>
</v-card>
</template>
<script>
export default {
props: {
model:{
type: Object,
required: true,
}
},
computed: {
weaknesses(){
return getKeysOfValue(this.model, 2).join(', ');
},
resistances(){
return getKeysOfValue(this.model, 0.5).join(', ');
},
immunities(){
return getKeysOfValue(this.model, 0).join(', ');
},
}
}
function getKeysOfValue(object, value){
let keys = [];
for (let key in object){
if (object[key] === value){
keys.push(key);
}
}
return keys;
}
</script>
<style lang="css" scoped>
</style>