summaryrefslogtreecommitdiff
path: root/dice/src/main/java/bjc/dicelang/dicev2/CountDieMod.java
diff options
context:
space:
mode:
Diffstat (limited to 'dice/src/main/java/bjc/dicelang/dicev2/CountDieMod.java')
-rw-r--r--dice/src/main/java/bjc/dicelang/dicev2/CountDieMod.java52
1 files changed, 52 insertions, 0 deletions
diff --git a/dice/src/main/java/bjc/dicelang/dicev2/CountDieMod.java b/dice/src/main/java/bjc/dicelang/dicev2/CountDieMod.java
new file mode 100644
index 0000000..0b5ec5b
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/dicev2/CountDieMod.java
@@ -0,0 +1,52 @@
+package bjc.dicelang.dicev2;
+
+import java.util.function.LongPredicate;
+
+public class CountDieMod extends Die {
+ public final Die[] dice;
+
+ public final LongPredicate success;
+
+ public LongPredicate failure;
+
+ public CountDieMod(LongPredicate success, Die... dice) {
+ this(success, null, dice);
+ }
+
+ public CountDieMod(LongPredicate success, LongPredicate failure, Die... dice) {
+ super();
+
+ this.success = success;
+ this.failure = failure;
+
+ this.dice = dice;
+ }
+
+ public long[] roll() {
+ return new long[] { rollSingle() };
+ }
+
+ public long rollSingle() {
+ long count = 0;
+
+ for(Die die : dice) {
+ for(long val : die.roll()) {
+ if(success.test(val)) count += 1;
+
+ if(failure != null && failure.test(val)) count -= 1;
+ }
+ }
+
+ return count;
+ }
+
+ /* :UnoptimizableDice */
+
+ public boolean canOptimize() {
+ return false;
+ }
+
+ public long optimize() {
+ throw new UnsupportedOperationException("Counted dice can't be optimized");
+ }
+}