From ee6a9305a1009e6f1e3e99d5de3cfba5305a5d1b Mon Sep 17 00:00:00 2001 From: Ben Culkin Date: Sat, 13 Mar 2021 10:13:01 -0500 Subject: Update documentation Also, did the same thing for Die I did for DiePool, where I moved the specific classes to the same file as the interface. --- dice/src/main/java/bjc/dicelang/neodice/Die.java | 126 ++++++++++++++++++++++- 1 file changed, 125 insertions(+), 1 deletion(-) (limited to 'dice/src/main/java/bjc/dicelang/neodice/Die.java') diff --git a/dice/src/main/java/bjc/dicelang/neodice/Die.java b/dice/src/main/java/bjc/dicelang/neodice/Die.java index 9d1ac4b..56e4327 100644 --- a/dice/src/main/java/bjc/dicelang/neodice/Die.java +++ b/dice/src/main/java/bjc/dicelang/neodice/Die.java @@ -4,7 +4,7 @@ import java.util.*; import java.util.function.*; import java.util.stream.*; -import bjc.dicelang.neodice.die.*; +import bjc.esodata.*; /** * Represents a single polyhedral die. @@ -105,4 +105,128 @@ public interface Die { static Die polyhedral(int sides) { return new PolyhedralDie(sides); } +} + +class PolyhedralDie implements Die { + private final int sides; + + public PolyhedralDie(int sides) { + this.sides = sides; + } + + @Override + public Integer roll(Random rng) { + // Dice are one-based, not zero-based. + return rng.nextInt(sides) + 1; + } + + @Override + public String toString() { + return String.format("d%d", sides); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + sides; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + + PolyhedralDie other = (PolyhedralDie) obj; + + if (sides != other.sides) return false; + else return true; + } +} + +class RerollDie implements Die { + private final Die contained; + + private final Predicate condition; + private final Function, SideType> chooser; + + private final Comparator comparer; + + private int limit = Integer.MAX_VALUE; + + private RerollDie( + Comparator comparer, + Die contained, + Predicate condition, + Function, SideType> chooser) { + this.comparer = comparer; + + this.contained = contained; + + this.condition = condition; + this.chooser = chooser; + } + + private RerollDie( + Comparator comparer, + Die contained, + Predicate condition, + Function, SideType> chooser, + int limit) { + this(comparer, contained, condition, chooser); + + this.limit = limit; + } + + @Override + public SideType roll(Random rng) { + SideType roll = contained.roll(rng); + + MinMaxList newRolls = new MinMaxList<>(comparer, roll); + + int rerollCount = 0; + while (condition.test(roll) && rerollCount < limit) { + roll = contained.roll(rng); + newRolls.add(roll); + + rerollCount += 1; + } + + return chooser.apply(newRolls); + } + + public static > Die create( + Die contained, + Predicate condition, + Function, Side> chooser) { + return new RerollDie<>(Comparator.naturalOrder(), contained, condition, chooser); + } + + public static > Die create( + Die contained, + Predicate condition, + Function, Side> chooser, + int limit) { + return new RerollDie<>(Comparator.naturalOrder(), contained, condition, chooser, limit); + } + + + public static Die create( + Comparator comparer, + Die contained, + Predicate condition, + Function, Side> chooser) { + return new RerollDie<>(comparer, contained, condition, chooser); + } + + public static Die create( + Comparator comparer, + Die contained, + Predicate condition, + Function, Side> chooser, + int limit) { + return new RerollDie<>(comparer, contained, condition, chooser, limit); + } } \ No newline at end of file -- cgit v1.2.3