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 @@ +