diff options
Diffstat (limited to 'dice/src/main/java/bjc/dicelang/dicev2')
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; + } +} |
