From 96e868388c7617136e916c27ddd90694c0bb8356 Mon Sep 17 00:00:00 2001 From: bjculkin Date: Mon, 27 Feb 2017 10:34:25 -0500 Subject: More refactoring --- .../src/bjc/dicelang/v2/dice/ExplodingDice.java | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 dice-lang/src/bjc/dicelang/v2/dice/ExplodingDice.java (limited to 'dice-lang/src/bjc/dicelang/v2/dice/ExplodingDice.java') diff --git a/dice-lang/src/bjc/dicelang/v2/dice/ExplodingDice.java b/dice-lang/src/bjc/dicelang/v2/dice/ExplodingDice.java new file mode 100644 index 0000000..40ff1e0 --- /dev/null +++ b/dice-lang/src/bjc/dicelang/v2/dice/ExplodingDice.java @@ -0,0 +1,70 @@ +package bjc.dicelang.v2.dice; + +import java.util.LinkedList; +import java.util.List; +import java.util.function.Predicate; + +public class ExplodingDice implements DieList { + private Die source; + + private Predicate explodeOn; + private String explodePattern; + private boolean explodePenetrates; + + public ExplodingDice(Die src, Predicate explode) { + this(src, explode, null, false); + } + + public ExplodingDice(Die src, Predicate explode, boolean penetrate) { + this(src, explode, null, penetrate); + } + + public ExplodingDice(Die src, Predicate explode, String patt, + boolean penetrate) { + source = src; + explodeOn = explode; + explodePattern = patt; + explodePenetrates = penetrate; + } + + public boolean canOptimize() { + return false; + } + + public long[] optimize() { + return new long[0]; + } + + public long[] roll() { + long res = source.roll(); + long oldRes = res; + + List resList = new LinkedList<>(); + + while(explodeOn.test(oldRes)) { + oldRes = source.rollSingle(); + + if(explodePenetrates) oldRes -= 1; + resList.add(oldRes); + } + + long[] newRes = new long[resList.size() + 1]; + newRes[0] = res; + + int i = 1; + for(long rll : resList) { + newRes[i] = rll; + i += 1; + } + + return newRes; + } + + public String toString() { + if(explodePattern == null) { + return source + (explodePenetrates ? "p" : "") + "!"; + } else { + return source + (explodePenetrates ? "p" : "") + "!" + explodePattern; + } + } +} \ No newline at end of file -- cgit v1.2.3