diff options
Diffstat (limited to 'dice/src/main/java/bjc/dicelang/neodice/diepool')
8 files changed, 465 insertions, 0 deletions
diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/DropFirstPool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/DropFirstPool.java new file mode 100644 index 0000000..959678b --- /dev/null +++ b/dice/src/main/java/bjc/dicelang/neodice/diepool/DropFirstPool.java @@ -0,0 +1,58 @@ +package bjc.dicelang.neodice.diepool; + +import java.util.*; + +import bjc.dicelang.neodice.*; + +public class DropFirstPool implements DiePool { + private final int number; + private final DiePool pool; + + public DropFirstPool(DiePool pool, int number) { + this.pool = pool; + this.number = number; + } + + @Override + public int[] roll(Random rng) { + int[] rolls = pool.roll(rng); + + if (number >= rolls.length) { + return new int[0]; + } else { + int[] newRolls = new int[rolls.length - number]; + + for (int index = number - 1; index < rolls.length; index++) { + newRolls[index - number] = rolls[index]; + } + + return newRolls; + } + } + + @Override + public Die[] contained() { + return pool.contained(); + } + + @Override + public String toString() { + return String.format("%sdF%d", pool, number); + } + + @Override + public int hashCode() { + return Objects.hash(number, pool); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + + DropFirstPool other = (DropFirstPool) obj; + + return number == other.number && Objects.equals(pool, other.pool); + } +}
\ No newline at end of file diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/DropLastPool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/DropLastPool.java new file mode 100644 index 0000000..9503e8f --- /dev/null +++ b/dice/src/main/java/bjc/dicelang/neodice/diepool/DropLastPool.java @@ -0,0 +1,58 @@ +package bjc.dicelang.neodice.diepool; + +import java.util.*; + +import bjc.dicelang.neodice.*; + +public class DropLastPool implements DiePool { + private final int number; + private final DiePool pool; + + public DropLastPool(DiePool pool, int number) { + this.pool = pool; + this.number = number; + } + + @Override + public int[] roll(Random rng) { + int[] rolls = pool.roll(rng); + + if (number >= rolls.length) { + return new int[0]; + } else { + int[] newRolls = new int[rolls.length - number]; + + for (int index = 0; index < rolls.length - number; index++) { + newRolls[index] = rolls[index]; + } + + return newRolls; + } + } + + @Override + public Die[] contained() { + return pool.contained(); + } + + @Override + public String toString() { + return String.format("%sdL%d", pool, number); + } + + @Override + public int hashCode() { + return Objects.hash(number, pool); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + + DropLastPool other = (DropLastPool) obj; + + return number == other.number && Objects.equals(pool, other.pool); + } +}
\ No newline at end of file diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/FilteredDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/FilteredDiePool.java new file mode 100644 index 0000000..34d274f --- /dev/null +++ b/dice/src/main/java/bjc/dicelang/neodice/diepool/FilteredDiePool.java @@ -0,0 +1,47 @@ +package bjc.dicelang.neodice.diepool; + +import java.util.*; +import java.util.function.*; + +import bjc.dicelang.neodice.*; + +public class FilteredDiePool implements DiePool { + private final DiePool pool; + private final IntPredicate filter; + + public FilteredDiePool(DiePool pool, IntPredicate filter) { + this.pool = pool; + this.filter = filter; + } + + @Override + public int[] roll(Random rng) { + int[] rolls = pool.roll(rng); + + return Arrays.stream(rolls).filter(filter).toArray(); + } + + @Override + public Die[] contained() { + return pool.contained(); + } + + // No toString, since there isn't any sensible to output the filter + + @Override + public int hashCode() { + return Objects.hash(filter, pool); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + + FilteredDiePool other = (FilteredDiePool) obj; + + return Objects.equals(filter, other.filter) + && Objects.equals(pool, other.pool); + } +}
\ No newline at end of file diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/FixedDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/FixedDiePool.java new file mode 100644 index 0000000..c60b88a --- /dev/null +++ b/dice/src/main/java/bjc/dicelang/neodice/diepool/FixedDiePool.java @@ -0,0 +1,65 @@ +package bjc.dicelang.neodice.diepool; + +import java.util.*; + +import bjc.dicelang.neodice.*; + +public class FixedDiePool implements DiePool { + private final Die[] dice; + + public FixedDiePool(Die[] dice) { + this.dice = dice; + } + + @Override + public int[] roll(Random rng) { + int[] results = new int[dice.length]; + + for (int index = 0; index < dice.length; index++) { + results[index] = dice[index].roll(rng); + } + + return results; + } + + @Override + public Die[] contained() { + return dice; + } + + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + + for (int i = 0; i < dice.length; i++) { + Die die = dice[i]; + + builder.append(die); + + // Don't add an extra trailing comma + if (i < dice.length - 1) builder.append(", "); + } + + return builder.toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + Arrays.hashCode(dice); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + + FixedDiePool other = (FixedDiePool) obj; + + return Arrays.equals(dice, other.dice); + } +}
\ No newline at end of file diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/KeepFirstDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/KeepFirstDiePool.java new file mode 100644 index 0000000..d31f104 --- /dev/null +++ b/dice/src/main/java/bjc/dicelang/neodice/diepool/KeepFirstDiePool.java @@ -0,0 +1,58 @@ +package bjc.dicelang.neodice.diepool; + +import java.util.*; + +import bjc.dicelang.neodice.*; + +public class KeepFirstDiePool implements DiePool { + private final int number; + private final DiePool pool; + + public KeepFirstDiePool(DiePool pool, int number) { + this.pool = pool; + this.number = number; + } + + @Override + public int[] roll(Random rng) { + int[] rolls = pool.roll(rng); + + if (rolls.length >= number) { + return rolls; + } else { + int[] newRolls = new int[number]; + + for (int index = 0; index < number; index++) { + newRolls[index] = rolls[index]; + } + + return newRolls; + } + } + + @Override + public Die[] contained() { + return pool.contained(); + } + + @Override + public String toString() { + return String.format("%skF%d", pool, number); + } + + @Override + public int hashCode() { + return Objects.hash(number, pool); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + + KeepFirstDiePool other = (KeepFirstDiePool) obj; + + return number == other.number && Objects.equals(pool, other.pool); + } +}
\ No newline at end of file diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/KeepLastDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/KeepLastDiePool.java new file mode 100644 index 0000000..1e2d1ae --- /dev/null +++ b/dice/src/main/java/bjc/dicelang/neodice/diepool/KeepLastDiePool.java @@ -0,0 +1,58 @@ +package bjc.dicelang.neodice.diepool; + +import java.util.*; + +import bjc.dicelang.neodice.*; + +public class KeepLastDiePool implements DiePool { + private final int number; + private final DiePool pool; + + public KeepLastDiePool(DiePool pool, int number) { + this.pool = pool; + this.number = number; + } + + @Override + public int[] roll(Random rng) { + int[] rolls = pool.roll(rng); + + if (rolls.length >= number) { + return rolls; + } else { + int[] newRolls = new int[number]; + + for (int index = number; index > index; index--) { + newRolls[index] = rolls[rolls.length - index]; + } + + return newRolls; + } + } + + @Override + public Die[] contained() { + return pool.contained(); + } + + @Override + public String toString() { + return String.format("%skL%d", pool, number); + } + + @Override + public int hashCode() { + return Objects.hash(number, pool); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + + KeepLastDiePool other = (KeepLastDiePool) obj; + + return number == other.number && Objects.equals(pool, other.pool); + } +}
\ No newline at end of file diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/SortedDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/SortedDiePool.java new file mode 100644 index 0000000..79599c1 --- /dev/null +++ b/dice/src/main/java/bjc/dicelang/neodice/diepool/SortedDiePool.java @@ -0,0 +1,63 @@ +package bjc.dicelang.neodice.diepool; + +import java.util.*; + +import bjc.dicelang.neodice.*; + +public class SortedDiePool implements DiePool { + private final boolean isDescending; + private final DiePool pool; + + public SortedDiePool(DiePool pool, boolean isDescending) { + this.pool = pool; + this.isDescending = isDescending; + } + + @Override + public int[] roll(Random rng) { + int[] rolls = pool.roll(rng); + + Arrays.sort(rolls); + + if (isDescending) { + int[] newRolls = new int[rolls.length]; + + int newIndex = newRolls.length; + for (int index = 0; index < rolls.length; index++) { + newRolls[newIndex--] = rolls[index]; + } + + return newRolls; + } else { + return rolls; + } + } + + @Override + public Die[] contained() { + return pool.contained(); + } + + @Override + public String toString() { + return String.format("%s (sorted %s)", pool, + isDescending ? " descending" : "ascending"); + } + + @Override + public int hashCode() { + return Objects.hash(isDescending, pool); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + + SortedDiePool other = (SortedDiePool) obj; + + return isDescending == other.isDescending + && Objects.equals(pool, other.pool); + } +}
\ No newline at end of file diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/TimesDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/TimesDiePool.java new file mode 100644 index 0000000..1b34247 --- /dev/null +++ b/dice/src/main/java/bjc/dicelang/neodice/diepool/TimesDiePool.java @@ -0,0 +1,58 @@ +package bjc.dicelang.neodice.diepool; + +import java.util.*; + +import bjc.dicelang.neodice.*; + +public class TimesDiePool implements DiePool { + private final Die contained; + private final int numDice; + + public TimesDiePool(Die contained, int numDice) { + this.contained = contained; + this.numDice = numDice; + } + + @Override + public int[] roll(Random rng) { + int[] results = new int[numDice]; + + for (int index = 0; index < numDice; index++) { + results[index] = contained.roll(rng); + } + + return results; + } + + @Override + public Die[] contained() { + Die[] results = new Die[numDice]; + + for (int index = 0; index < numDice; index++) { + results[index] = contained; + } + + return results; + } + + @Override + public String toString() { + return String.format("%d%s", numDice, contained); + } + + @Override + public int hashCode() { + return Objects.hash(contained, numDice); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + + TimesDiePool other = (TimesDiePool) obj; + + return Objects.equals(contained, other.contained) && numDice == other.numDice; + } +}
\ No newline at end of file |
