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 @@
+
+
+
+
+
diff --git a/dataSources/.gitignore b/dataSources/.gitignore
new file mode 100644
index 00000000..83ab52dc
--- /dev/null
+++ b/dataSources/.gitignore
@@ -0,0 +1 @@
+Renders