summaryrefslogtreecommitdiff
path: root/dice
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-05-30 15:57:41 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-05-30 16:23:46 -0300
commit09f161528619f9396aa07c784c15bc1d33f5c047 (patch)
treea74b440865d4861a850f515f35e6f256217183e4 /dice
parent0029bfc3cf4fdee2bcd86689a8d9a2a8f4dd553a (diff)
Start work on dice rewrite
This starts work on a rewrite of the dice rolling system to better adapt it for more features
Diffstat (limited to 'dice')
-rw-r--r--dice/src/main/java/bjc/dicelang/dicev2/ComparePoints.java17
-rw-r--r--dice/src/main/java/bjc/dicelang/dicev2/Die.java27
-rw-r--r--dice/src/main/java/bjc/dicelang/dicev2/DieMods.java7
-rw-r--r--dice/src/main/java/bjc/dicelang/dicev2/Dies.java29
-rw-r--r--dice/src/main/java/bjc/dicelang/dicev2/FudgeDie.java42
-rw-r--r--dice/src/main/java/bjc/dicelang/dicev2/PolyhedralDie.java47
-rw-r--r--dice/src/main/java/bjc/dicelang/dicev2/ScalarDie.java35
-rw-r--r--dice/src/main/java/bjc/dicelang/dicev2/SumDieMod.java45
8 files changed, 249 insertions, 0 deletions
diff --git a/dice/src/main/java/bjc/dicelang/dicev2/ComparePoints.java b/dice/src/main/java/bjc/dicelang/dicev2/ComparePoints.java
new file mode 100644
index 0000000..4e08c3e
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/dicev2/ComparePoints.java
@@ -0,0 +1,17 @@
+package bjc.dicelang.dicev2;
+
+import java.util.function.LongPredicate;
+
+public class ComparePoints {
+ public static LongPredicate isLess(long val) {
+ return (arg) -> arg < val;
+ }
+
+ public static LongPredicate isEqual(long val) {
+ return (arg) -> arg == val;
+ }
+
+ public static LongPredicate isGreater(long val) {
+ return (arg) -> arg > val;
+ }
+}
diff --git a/dice/src/main/java/bjc/dicelang/dicev2/Die.java b/dice/src/main/java/bjc/dicelang/dicev2/Die.java
new file mode 100644
index 0000000..d688cfa
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/dicev2/Die.java
@@ -0,0 +1,27 @@
+package bjc.dicelang.dicev2;
+
+import java.util.Random;
+
+public abstract class Die {
+ private static final Random BASE = new Random();
+
+ protected Random rng;
+
+ protected Die() {
+ rng = BASE;
+ }
+
+ protected Die(Random rnd) {
+ rng = rnd;
+ }
+
+ public void setRandom(Random rnd) {
+ rng = rnd;
+ }
+
+ public abstract long[] roll();
+ public abstract long rollSingle();
+
+ public abstract boolean canOptimize();
+ public abstract long optimize();
+}
diff --git a/dice/src/main/java/bjc/dicelang/dicev2/DieMods.java b/dice/src/main/java/bjc/dicelang/dicev2/DieMods.java
new file mode 100644
index 0000000..afdb604
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/dicev2/DieMods.java
@@ -0,0 +1,7 @@
+package bjc.dicelang.dicev2;
+
+public class DieMods {
+ public Die sum(Die... dice) {
+ return new SumDieMod(dice);
+ }
+}
diff --git a/dice/src/main/java/bjc/dicelang/dicev2/Dies.java b/dice/src/main/java/bjc/dicelang/dicev2/Dies.java
new file mode 100644
index 0000000..98ffbaa
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/dicev2/Dies.java
@@ -0,0 +1,29 @@
+package bjc.dicelang.dicev2;
+
+import java.util.Random;
+
+public class Dies {
+ public static Die scalar(int val) {
+ return new ScalarDie(val);
+ }
+
+ public static Die scalar(Random rnd, int val) {
+ return new ScalarDie(rnd, val);
+ }
+
+ public static Die polyhedral(int dice, int sides) {
+ return new PolyhedralDie(dice, sides);
+ }
+
+ public static Die polyhedral(Random rnd, int dice, int sides) {
+ return new PolyhedralDie(rnd, dice, sides);
+ }
+
+ public static Die fudge(int dice) {
+ return new FudgeDie(dice);
+ }
+
+ public static Die fudge(Random rnd, int dice) {
+ return new FudgeDie(rnd, dice);
+ }
+}
diff --git a/dice/src/main/java/bjc/dicelang/dicev2/FudgeDie.java b/dice/src/main/java/bjc/dicelang/dicev2/FudgeDie.java
new file mode 100644
index 0000000..21fca1d
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/dicev2/FudgeDie.java
@@ -0,0 +1,42 @@
+package bjc.dicelang.dicev2;
+
+import java.util.Random;
+
+public class FudgeDie extends Die {
+ public final int numDice;
+
+ public FudgeDie(int numDice) {
+ super();
+
+ this.numDice = numDice;
+ }
+
+ public FudgeDie(Random rnd, int numDice) {
+ super(rnd);
+
+ this.numDice = numDice;
+ }
+
+ public long[] roll() {
+ long[] res = new long[numDice];
+
+ for(int i = 0; i < numDice; i++) {
+ res[i] = rollSingle();
+ }
+
+ return res;
+ }
+
+ public long rollSingle() {
+ /* Return an int in the range [-1, 1] */
+ return rng.nextInt(3) - 1;
+ }
+
+ public boolean canOptimize() {
+ return numDice == 0;
+ }
+
+ public long optimize() {
+ return 0;
+ }
+}
diff --git a/dice/src/main/java/bjc/dicelang/dicev2/PolyhedralDie.java b/dice/src/main/java/bjc/dicelang/dicev2/PolyhedralDie.java
new file mode 100644
index 0000000..be78279
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/dicev2/PolyhedralDie.java
@@ -0,0 +1,47 @@
+package bjc.dicelang.dicev2;
+
+import java.util.Random;
+
+public class PolyhedralDie extends Die {
+ public final int numDice;
+ public final int numSides;
+
+ public PolyhedralDie(int numDice, int numSides) {
+ super();
+
+ this.numDice = numDice;
+ this.numSides = numSides;
+ }
+
+ public PolyhedralDie(Random rnd, int numDice, int numSides) {
+ super(rnd);
+
+ this.numDice = numDice;
+ this.numSides = numSides;
+ }
+
+ public long[] roll() {
+ long[] res = new long[numDice];
+
+ for(int i = 0; i < numDice; i++) {
+ res[i] = rollSingle();
+ }
+
+ return res;
+ }
+
+ public long rollSingle() {
+ /* nextInt is from 0 (inclusive) to numSides (exclusive) */
+ return rng.nextInt(numSides) + 1;
+ }
+
+ public boolean canOptimize() {
+ return numSides <= 1 || numDice == 0;
+ }
+
+ public long optimize() {
+ if(numDice == 0 || numSides == 0) return 0;
+
+ return numDice;
+ }
+}
diff --git a/dice/src/main/java/bjc/dicelang/dicev2/ScalarDie.java b/dice/src/main/java/bjc/dicelang/dicev2/ScalarDie.java
new file mode 100644
index 0000000..548b4e9
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/dicev2/ScalarDie.java
@@ -0,0 +1,35 @@
+package bjc.dicelang.dicev2;
+
+import java.util.Random;
+
+public class ScalarDie extends Die {
+ public final long val;
+
+ public ScalarDie(long val) {
+ super();
+
+ this.val = val;
+ }
+
+ public ScalarDie(Random rnd, long val) {
+ super(rnd);
+
+ this.val = val;
+ }
+
+ public long[] roll() {
+ return new long[] { val };
+ }
+
+ public long rollSingle() {
+ return val;
+ }
+
+ public boolean canOptimize() {
+ return true;
+ }
+
+ public long optimize() {
+ return val;
+ }
+}
diff --git a/dice/src/main/java/bjc/dicelang/dicev2/SumDieMod.java b/dice/src/main/java/bjc/dicelang/dicev2/SumDieMod.java
new file mode 100644
index 0000000..54ae3d0
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/dicev2/SumDieMod.java
@@ -0,0 +1,45 @@
+package bjc.dicelang.dicev2;
+
+public class SumDieMod extends Die {
+ public final Die[] dice;
+
+ public SumDieMod(Die... dice) {
+ super();
+
+ this.dice = dice;
+ }
+
+ public long[] roll() {
+ return new long[] { rollSingle() };
+ }
+
+ public long rollSingle() {
+ long res = 0;
+
+ for(Die die : dice) {
+ for(long val : die.roll()) {
+ res += val;
+ }
+ }
+
+ return res;
+ }
+
+ public boolean canOptimize() {
+ for(Die die : dice) {
+ if(!die.canOptimize()) return false;
+ }
+
+ return true;
+ }
+
+ public long optimize() {
+ long res = 0;
+
+ for(Die die : dice) {
+ res += die.optimize();
+ }
+
+ return res;
+ }
+}