diff options
author | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2017-08-30 16:30:23 -0400 |
---|---|---|
committer | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2017-08-30 16:30:23 -0400 |
commit | 5b77a409c912f7251da8c170bd4a3aa8826d989b (patch) | |
tree | 0b3131a6a1c87b7a3af3537d4d548392866bb812 /src | |
parent | 7efea0582dda35cd7dc0c370ef3b56c84b2f2291 (diff) |
Implement again under
Diffstat (limited to 'src')
-rw-r--r-- | src/dice.js | 37 | ||||
-rw-r--r-- | src/lexer.js | 1 | ||||
-rw-r--r-- | src/parser.js | 1 |
3 files changed, 39 insertions, 0 deletions
diff --git a/src/dice.js b/src/dice.js index e96aca9..e580c9d 100644 --- a/src/dice.js +++ b/src/dice.js @@ -162,6 +162,42 @@ const again = (die1, die2) => { } } +const againUnder = (die1, die2) => { + return () => { + const againOn = roll(die1) + let rolls = [] + let rollAgain = [] + + const rollDie = (die) => { + const roll = die() + + if (roll <= againOn) { + rollAgain.push(die) + } + + let returnedOriginal = false + rolls.push(() => { + if (!returnedOriginal) { + returnedOriginal = true + return roll + } else { + return die() + } + }) + } + + die2().forEach(rollDie) + + while (rollAgain.length > 0) { + const oldRollAgain = rollAgain + rollAgain = [] + oldRollAgain.forEach(rollDie) + } + + return rolls + } +} + const threshold = (die1, die2) => { return () => { const cutoff = roll(die1) @@ -193,4 +229,5 @@ exports.explodeUnder = explodeUnder exports.keepHigh = keepHigh exports.keepLow = keepLow exports.again = again +exports.againUnder = againUnder exports.threshold = threshold diff --git a/src/lexer.js b/src/lexer.js index 7eb95b0..f33dc87 100644 --- a/src/lexer.js +++ b/src/lexer.js @@ -27,6 +27,7 @@ newLexemeType('e', 'e') newLexemeType('K', 'K') newLexemeType('k', 'k') newLexemeType('A', 'A') +newLexemeType('a', 'a') newLexemeType('T', 'T') const lex = (expressionString) => { diff --git a/src/parser.js b/src/parser.js index 124d686..f8e2a5b 100644 --- a/src/parser.js +++ b/src/parser.js @@ -65,6 +65,7 @@ newDieOperation('e') newDieOperation('K') newDieOperation('k') newDieOperation('A') +newDieOperation('a') newDieOperation('T') newInfix('bigPlus', 20, { type: 'add' }) |