diff options
| author | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-06-02 17:32:24 -0300 |
|---|---|---|
| committer | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-06-02 17:32:24 -0300 |
| commit | 775394cf6b4a3c6a7e7345affeb45bb34f6e4517 (patch) | |
| tree | a193472620f796b3701fa979cba84d4361eef0c0 /dice/src/main/java/bjc/dicelang/dicev2/CompositeDie.java | |
| parent | 09f161528619f9396aa07c784c15bc1d33f5c047 (diff) | |
Finish die rewrite
This adds all of the remaining missing die modifiers, as well as a few
base die types that were missing.
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(); + } +} |
