diff options
Diffstat (limited to 'dice/src/main/java/bjc/dicelang/dicev2/CompositeDie.java')
| -rw-r--r-- | dice/src/main/java/bjc/dicelang/dicev2/CompositeDie.java | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/dice/src/main/java/bjc/dicelang/dicev2/CompositeDie.java b/dice/src/main/java/bjc/dicelang/dicev2/CompositeDie.java new file mode 100644 index 0000000..e9bb585 --- /dev/null +++ b/dice/src/main/java/bjc/dicelang/dicev2/CompositeDie.java @@ -0,0 +1,78 @@ +package bjc.dicelang.dicev2; + +import java.util.Random; + +public class CompositeDie extends Die { + public final Die numDice; + public final Die numSides; + + public final boolean rerollSides; + + public CompositeDie(Die numDice, Die numSides) { + this(numDice, numSides, false); + } + + public CompositeDie(Die numDice, Die numSides, boolean rerollSides) { + super(); + + this.numDice = numDice; + this.numSides = numSides; + + this.rerollSides = rerollSides; + } + + public CompositeDie(Random rnd, Die numDice, Die numSides) { + this(rnd, numDice, numSides, false); + } + + public CompositeDie(Random rnd, Die numDice, Die numSides, boolean rerollSides) { + super(rnd); + + this.numDice = numDice; + this.numSides = numSides; + + this.rerollSides = rerollSides; + } + + public long[] roll() { + int target = (int)numDice.rollSingle(); + int sides = (int)numSides.rollSingle(); + + long[] res = new long[target]; + + for(int i = 0; i < target; i++) { + res[i] = rng.nextInt(sides) + 1; + + if(rerollSides) sides = (int)numSides.rollSingle(); + } + + return res; + } + + public long rollSingle() { + return rng.nextInt((int)numSides.rollSingle()); + } + + public boolean canOptimize() { + if(numSides.canOptimize()) { + if(numSides.optimize() <= 1) { + return true; + } + } + + if(numDice.canOptimize()) { + if(numDice.optimize() == 0) { + return true; + } + } + + return false; + } + + public long optimize() { + if(numDice.canOptimize()) return 0; + if(numSides.canOptimize() && numSides.optimize() == 0) return 0; + + return numDice.rollSingle(); + } +} |
