diff options
| author | Ben Culkin <scorpress@gmail.com> | 2020-11-21 18:10:30 -0500 |
|---|---|---|
| committer | Ben Culkin <scorpress@gmail.com> | 2020-11-21 18:10:30 -0500 |
| commit | b5c2fb1ed923d43412694729b4445a66fa9f47fc (patch) | |
| tree | 2b9dc847976f3a5f7d7a2d48cff0a50e962efeb0 /dice/src/main/java/bjc/dicelang/neodice/die/RerollDie.java | |
| parent | 785a1ed2437d9810b39deb376c163e0e3e73160f (diff) | |
Restructure new die implementation
Diffstat (limited to 'dice/src/main/java/bjc/dicelang/neodice/die/RerollDie.java')
| -rw-r--r-- | dice/src/main/java/bjc/dicelang/neodice/die/RerollDie.java | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/dice/src/main/java/bjc/dicelang/neodice/die/RerollDie.java b/dice/src/main/java/bjc/dicelang/neodice/die/RerollDie.java new file mode 100644 index 0000000..3cd369f --- /dev/null +++ b/dice/src/main/java/bjc/dicelang/neodice/die/RerollDie.java @@ -0,0 +1,55 @@ +package bjc.dicelang.neodice.die; + +import java.util.*; +import java.util.function.*; + +import bjc.dicelang.neodice.*; +import bjc.esodata.*; + +public class RerollDie implements Die { + private final Die contained; + + private final IntPredicate condition; + private final Function<MinMaxList<Integer>, Integer> chooser; + + private int limit = Integer.MAX_VALUE; + + + public RerollDie(Die contained, IntPredicate condition, + Function<MinMaxList<Integer>, Integer> chooser) { + this.contained = contained; + + this.condition = condition; + this.chooser = chooser; + } + + public RerollDie(Die contained, IntPredicate condition, + Function<MinMaxList<Integer>, Integer> chooser, int limit) { + this.contained = contained; + + this.condition = condition; + this.chooser = chooser; + + this.limit = limit; + } + + @Override + public int roll(Random rng) { + int roll = contained.roll(rng); + + MinMaxList<Integer> newRolls = new MinMaxList<Integer>( + Comparator.naturalOrder(), roll); + + int rerollCount = 0; + while (condition.test(roll) && rerollCount < limit) { + roll = contained.roll(rng); + newRolls.add(roll); + + rerollCount += 1; + } + + return chooser.apply(newRolls); + } + + // No toString, because IntPredicate can't be converted to a string +}
\ No newline at end of file |
