From bc5c465a323e562cbc539be2f15eb1f7ae56d719 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Fri, 18 Sep 2020 14:00:29 +0200 Subject: [PATCH] Started work on checks --- app/imports/api/creature/actions/doCheck.js | 40 +++++++++++++++++++++ app/imports/parser/parseTree/RollNode.js | 8 ++--- app/imports/parser/roll.js | 9 +++++ app/imports/ui/components/rolls/check.vue | 9 +++++ dataSources/.gitignore | 1 + 5 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 app/imports/api/creature/actions/doCheck.js create mode 100644 app/imports/parser/roll.js create mode 100644 app/imports/ui/components/rolls/check.vue create mode 100644 dataSources/.gitignore diff --git a/app/imports/api/creature/actions/doCheck.js b/app/imports/api/creature/actions/doCheck.js new file mode 100644 index 00000000..f4f2182c --- /dev/null +++ b/app/imports/api/creature/actions/doCheck.js @@ -0,0 +1,40 @@ +import SimpleSchema from 'simpl-schema'; +import { ValidatedMethod } from 'meteor/mdg:validated-method'; +import { RateLimiterMixin } from 'ddp-rate-limiter-mixin'; +import Creatures from '/imports/api/creature/Creatures.js'; +import { assertEditPermission } from '/imports/api/creature/creaturePermissions.js'; +import roll from '/imports/parser/roll.js'; + +const doAction = new ValidatedMethod({ + name: 'creature.doCheck', + validate: new SimpleSchema({ + actionId: SimpleSchema.RegEx.Id, + targetId: { + type: String, + regEx: SimpleSchema.RegEx.Id, + optional: true, + }, + }).validator(), + mixins: [RateLimiterMixin], + rateLimit: { + numRequests: 10, + timeInterval: 5000, + }, + run({creatureId, attributeName}) { + let creature = Creatures.findOne(creatureId); + assertEditPermission(creature, this.userId); + return doCheckWork({attributeName, creature}); + }, +}); + +function doCheckWork({attributeName, creature}){ + let att = creature.variables[attributeName]; + if (!att) throw new Meteor.Error('No such attribute', + `This creature does not have a ${attributeName} property`); + let bonus = att.attributeType === 'ability'? att.modifier : att.value; + //Always roll 2d20 and let the advantage be decided in UI + let rolls = roll(2,20); + return {rolls, bonus}; +} + +export default doAction; diff --git a/app/imports/parser/parseTree/RollNode.js b/app/imports/parser/parseTree/RollNode.js index ab3f62e8..d59b900f 100644 --- a/app/imports/parser/parseTree/RollNode.js +++ b/app/imports/parser/parseTree/RollNode.js @@ -1,6 +1,7 @@ import ParseNode from '/imports/parser/parseTree/ParseNode.js'; import RollArrayNode from '/imports/parser/parseTree/RollArrayNode.js'; import ErrorNode from '/imports/parser/parseTree/ErrorNode.js'; +import roll from '/imports/parser/roll.js'; export default class RollNode extends ParseNode { constructor({left, right}) { @@ -49,12 +50,7 @@ export default class RollNode extends ParseNode { context, }); let diceSize = right.value; - let randomSrc = DDP.randomStream('diceRoller'); - let values = []; - for (let i = 0; i < number; i++){ - let roll = ~~(randomSrc.fraction() * diceSize) + 1 - values.push(roll); - } + let values = roll(number, diceSize); if (context){ context.storeRoll({number, diceSize, values}); } diff --git a/app/imports/parser/roll.js b/app/imports/parser/roll.js new file mode 100644 index 00000000..382a4cad --- /dev/null +++ b/app/imports/parser/roll.js @@ -0,0 +1,9 @@ +export default function roll(number, diceSize){ + let values = []; + let randomSrc = DDP.randomStream('diceRoller'); + for (let i = 0; i < number; i++){ + let roll = ~~(randomSrc.fraction() * diceSize) + 1 + values.push(roll); + } + return values; +} diff --git a/app/imports/ui/components/rolls/check.vue b/app/imports/ui/components/rolls/check.vue new file mode 100644 index 00000000..3abdba55 --- /dev/null +++ b/app/imports/ui/components/rolls/check.vue @@ -0,0 +1,9 @@ +