summaryrefslogtreecommitdiff
path: root/dice/src/main/java/bjc/dicelang/dicev2/ExplodingDieMod.java
diff options
context:
space:
mode:
Diffstat (limited to 'dice/src/main/java/bjc/dicelang/dicev2/ExplodingDieMod.java')
-rw-r--r--dice/src/main/java/bjc/dicelang/dicev2/ExplodingDieMod.java72
1 files changed, 72 insertions, 0 deletions
diff --git a/dice/src/main/java/bjc/dicelang/dicev2/ExplodingDieMod.java b/dice/src/main/java/bjc/dicelang/dicev2/ExplodingDieMod.java
new file mode 100644
index 0000000..885e02d
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/dicev2/ExplodingDieMod.java
@@ -0,0 +1,72 @@
+package bjc.dicelang.dicev2;
+
+import bjc.utils.funcutils.ListUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.LongPredicate;
+
+public class ExplodingDieMod extends Die {
+ public final Die[] dice;
+
+ public final LongPredicate explode;
+
+ public final boolean penetrate;
+
+ public ExplodingDieMod(LongPredicate explode, Die... dice) {
+ this(explode, false, dice);
+ }
+
+ public ExplodingDieMod(LongPredicate explode, boolean penetrate, Die... dice) {
+ super();
+
+ this.dice = dice;
+
+ this.explode = explode;
+
+ this.penetrate = penetrate;
+ }
+
+ public long[] roll() {
+ List<Long> lst = new ArrayList<>(dice.length);
+
+ for(Die die : dice) {
+ for(long val : die.roll()) {
+ lst.add(val);
+
+ long newVal = val;
+
+ while(explode.test(newVal)) {
+ newVal = die.rollSingle();
+
+ if(penetrate) newVal -= 1;
+
+ lst.add(newVal);
+ }
+ }
+ }
+
+ return ListUtils.toPrimitive(lst);
+ }
+
+ /*
+ * @NOTE
+ *
+ * :NoSingleRolls
+ *
+ * It makes no sense to roll a 'single' exploding dice, since it
+ * exploding adds another die. Use compounding dice for that case.
+ */
+ public long rollSingle() {
+ throw new UnsupportedOperationException("Exploding dice can't be rolled singly");
+ }
+
+ /* :UnoptimizableDice */
+ public boolean canOptimize() {
+ return false;
+ }
+
+ public long optimize() {
+ throw new UnsupportedOperationException("Exploding dice can't be optimized");
+ }
+}