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/Creatures.js'; import { assertEditPermission } from '/imports/api/creature/creatures/creaturePermissions.js'; import roll from '/imports/parser/roll.js'; const doCheck = new ValidatedMethod({ name: 'creature.doCheck', validate: new SimpleSchema({ creatureId: { type: String, regEx: SimpleSchema.RegEx.Id, optional: true, }, attributeName: { type: String, optional: true, }, }).validator(), mixins: [RateLimiterMixin], rateLimit: { numRequests: 10, timeInterval: 5000, }, run({creatureId, attributeName}) { let creature = Creatures.findOne(creatureId); assertEditPermission(creature, this.userId); let bonus = getAttributeValue({creature, attributeName}) return doCheckWork({bonus}); }, }); function getAttributeValue({creature, attributeName}){ 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; return bonus || 0; } export function doCheckWork({bonus, advantage = 0}){ let rolls = roll(2,20); let chosenRoll; if (advantage === 1){ chosenRoll = Math.max.apply(rolls); } else if (advantage === -1){ chosenRoll = Math.min.apply(rolls); } else { chosenRoll = rolls[0]; } let result = chosenRoll + bonus; return {rolls, bonus, chosenRoll, result}; } export default doCheck;