summaryrefslogtreecommitdiff
path: root/dice/src/main/java/bjc/dicelang/dicev2/DieMods.java
diff options
context:
space:
mode:
Diffstat (limited to 'dice/src/main/java/bjc/dicelang/dicev2/DieMods.java')
-rw-r--r--dice/src/main/java/bjc/dicelang/dicev2/DieMods.java193
1 files changed, 187 insertions, 6 deletions
diff --git a/dice/src/main/java/bjc/dicelang/dicev2/DieMods.java b/dice/src/main/java/bjc/dicelang/dicev2/DieMods.java
index 8a951a9..5e82097 100644
--- a/dice/src/main/java/bjc/dicelang/dicev2/DieMods.java
+++ b/dice/src/main/java/bjc/dicelang/dicev2/DieMods.java
@@ -17,81 +17,237 @@ import java.util.function.LongUnaryOperator;
* performance issues, replace these with custom classes.
*/
+/**
+ * Utility constructor class for die mods.
+ *
+ * @author Ben Culkin
+ *
+ */
public class DieMods {
+ /**
+ * Return a die pool that performs a reduction over a given pool.
+ *
+ * @param fold
+ * The fold to use.
+ * @param initial
+ * The initial value for the fold.
+ * @param dice
+ * The die pool.
+ * @return A die that performs a reduction over the pool.
+ */
public Die reduce(LongBinaryOperator fold, long initial, Die... dice) {
return new ReduceDieMod(fold, initial, dice);
}
+ /**
+ * Create a concatenative die.
+ *
+ * @param dice
+ * The input die pool.
+ * @return A die that concatenates the provided pool.
+ */
public Die concat(Die... dice) {
return new ConcatDieMod(dice);
}
+ /**
+ * Create a die pool for tracking successes.
+ *
+ * @param success
+ * The threshold for success.
+ * @param dice
+ * The input die pool.
+ * @return A die that counts the successes.
+ */
public Die counted(LongPredicate success, Die... dice) {
return new CountDieMod(success, dice);
}
+ /**
+ * Create a die pool for tracking successes/failures.
+ *
+ * @param success
+ * The threshold for success.
+ * @param failure
+ * The threshold for failure.
+ * @param dice
+ * The input die pool.
+ * @return A die that counts the successes.
+ */
public Die counted(LongPredicate success, LongPredicate failure, Die... dice) {
return new CountDieMod(success, failure, dice);
}
+ /**
+ * Create an exploding die pool.
+ *
+ * @param explode
+ * The criteria to explode on.
+ * @param dice
+ * The input die pool.
+ * @return An exploding variant of the die pool.
+ */
public Die explode(LongPredicate explode, Die... dice) {
return new ExplodingDieMod(explode, dice);
}
+ /**
+ * Create an exploding die pool.
+ *
+ * @param explode
+ * The criteria to explode on.
+ * @param penetrate
+ * Whether the explosions should penetrate.
+ * @param dice
+ * The input die pool.
+ * @return An exploding variant of the die pool.
+ */
public Die explode(LongPredicate explode, boolean penetrate, Die... dice) {
return new ExplodingDieMod(explode, penetrate, dice);
}
+ /**
+ * Create an compounding die pool.
+ *
+ * @param compound
+ * The criteria to compound on.
+ * @param dice
+ * The input die pool.
+ * @return An compounding variant of the die pool.
+ */
public Die compound(LongPredicate compound, Die... dice) {
return new CompoundDieMod(compound, dice);
}
+ /**
+ * Create an compounding die pool.
+ *
+ * @param compound
+ * The criteria to compound on.
+ * @param penetrate
+ * Whether the compounding should penetrate.
+ * @param dice
+ * The input die pool.
+ * @return An compounding variant of the die pool.
+ */
public Die compound(LongPredicate compound, boolean penetrate, Die... dice) {
return new CompoundDieMod(compound, penetrate, dice);
}
+ /**
+ * Gather a series of dice together into a pool.
+ *
+ * @param dice
+ * The die that will form the pool.
+ * @return A pooled variant of the dice.
+ */
public Die pool(Die... dice) {
return new PoolDiceMod(dice);
}
+ /**
+ * Filter out certain dice from the pool.
+ *
+ * @param filter
+ * The criteria to filter on.
+ * @param dice
+ * The input die pool.
+ * @return The die pool with certain dice filtered out.
+ */
public Die filter(LongPredicate filter, Die... dice) {
return new FilterDieMod(filter, dice);
}
+ /**
+ * Create a sorted variant of a die pool.
+ *
+ * @param sorter
+ * A sorted variant of a die pool.
+ * @param die
+ * The input die pool.
+ * @return A sorted die pool.
+ */
public Die sort(Comparator<Long> sorter, Die die) {
return new SortDieMod(sorter, die);
}
+ /**
+ * Create a die pool that applies a given transform.
+ *
+ * @param map
+ * The transform to apply.
+ * @param die
+ * The input die pool.
+ * @return The die pool with the transform applied.
+ */
public Die map(LongUnaryOperator map, Die die) {
return new MapDieMod(map, die);
}
/* :SyntheticMod */
+ /**
+ * Perform a summation over a die pool.
+ *
+ * @param dice
+ * The input die pool.
+ * @return A die that sums the input dice.
+ */
public Die sum(Die... dice) {
return reduce((l, r) -> l + r, 0, dice);
}
/* :SyntheticMod */
+ /**
+ * Perform a subtraction over a die pool.
+ *
+ * @param dice
+ * The input die pool.
+ * @return A die that subtracts the input dice.
+ */
public Die subtract(Die... dice) {
return reduce((l, r) -> l - r, 0, dice);
}
/* :SyntheticMod */
+ /**
+ * Perform a multiplication over a die pool.
+ *
+ * @param dice
+ * The input die pool.
+ * @return A die that multiplies the input dice.
+ */
public Die multiply(Die... dice) {
return reduce((l, r) -> l * r, 1, dice);
}
/* :SyntheticMod */
+ /**
+ * Perform a division over a die pool.
+ *
+ * @param dice
+ * The input die pool.
+ * @return A die that divides the input dice.
+ */
public Die divide(Die... dice) {
return reduce((l, r) -> l / r, 1, dice);
}
/* :SyntheticMod */
+ /**
+ * Create a die pool that sorts the dice in ascending order.
+ * @param die The input die pool.
+ * @return A die pool that sorts in ascending order.
+ */
public Die ascending(Die die) {
return new SortDieMod(Comparator.naturalOrder(), die);
}
/* :SyntheticMod */
+ /**
+ * Create a die pool that sorts the dice in descending order.
+ * @param die The input die pool.
+ * @return A die pool that sorts in descending order.
+ */
public Die descending(Die die) {
return new SortDieMod((v1, v2) -> {
return Long.compare(v1, v2);
@@ -99,13 +255,19 @@ public class DieMods {
}
/* :SyntheticMod */
+ /**
+ * Create a die pool that takes the first n dice.
+ * @param num The number of dice to take.
+ * @param die The input die pool.
+ * @return The die pool that takes the first n dice.
+ */
public Die take(int num, Die die) {
GeneratingIterator<Integer> itr = new GeneratingIterator<>(num, (val) -> {
return val - 1;
- }, (val) -> val == 0);
+ }, (val) -> val == 0);
return filter((val) -> {
- if(itr.hasNext()) {
+ if (itr.hasNext()) {
itr.next();
return true;
}
@@ -115,13 +277,19 @@ public class DieMods {
}
/* :SyntheticMod */
+ /**
+ * Create a die pool that drops the first n dice.
+ * @param num The number of dice to drops.
+ * @param die The input die pool.
+ * @return The die pool that drops the first n dice.
+ */
public Die drop(int num, Die die) {
GeneratingIterator<Integer> itr = new GeneratingIterator<>(num, (val) -> {
return val - 1;
- }, (val) -> val == 0);
+ }, (val) -> val == 0);
return filter((val) -> {
- if(itr.hasNext()) {
+ if (itr.hasNext()) {
itr.next();
return false;
}
@@ -131,20 +299,33 @@ public class DieMods {
}
/* :SyntheticMod */
+ /**
+ * Create a die pool that rerolls dice once if they are below a given threshold.
+ * @param reroll The point at which to reload.
+ * @param die The input die pool.
+ * @return A die pool that rerolls certain dice once.
+ */
public Die rerollOnce(LongPredicate reroll, Die die) {
return map((val) -> {
- if(reroll.test(val)) return die.rollSingle();
+ if (reroll.test(val))
+ return die.rollSingle();
return val;
}, die);
}
/* :SyntheticMod */
+ /**
+ * Create a die pool that rerolls dice if they are below a given threshold.
+ * @param reroll The point at which to reload.
+ * @param die The input die pool.
+ * @return A die pool that rerolls certain dice.
+ */
public Die reroll(LongPredicate reroll, Die die) {
return map((val) -> {
long nVal = val;
- while(reroll.test(nVal)) {
+ while (reroll.test(nVal)) {
nVal = die.rollSingle();
}