summaryrefslogtreecommitdiff
path: root/dice/src/main/java/bjc/dicelang/neodice/diepool
diff options
context:
space:
mode:
Diffstat (limited to 'dice/src/main/java/bjc/dicelang/neodice/diepool')
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/DropFirstPool.java58
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/DropLastPool.java58
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/FilteredDiePool.java47
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/FixedDiePool.java65
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/KeepFirstDiePool.java58
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/KeepLastDiePool.java58
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/SortedDiePool.java63
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/TimesDiePool.java58
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