Browse Source

Rename Duration->Target. Adding new Duration class more in line with what was implemented in Range

Sam Jaffe 8 years ago
parent
commit
7b059a1183

+ 5 - 0
src/org/leumasjaffe/charsheet/config/Constants.java

@@ -13,4 +13,9 @@ public final class Constants {
 	public enum DistanceMeasurement {
 		FEET, SQUARES
 	}
+	
+	String K_DURATION = "Duration Display Unit";
+	public enum DurationMeasurement {
+		NATURAL, ROUNDS
+	}
 }

+ 2 - 2
src/org/leumasjaffe/charsheet/model/magic/DDSpell.java

@@ -9,6 +9,7 @@ import org.leumasjaffe.charsheet.model.magic.dimension.Area;
 import org.leumasjaffe.charsheet.model.magic.dimension.Duration;
 import org.leumasjaffe.charsheet.model.magic.dimension.Effect;
 import org.leumasjaffe.charsheet.model.magic.dimension.Range;
+import org.leumasjaffe.charsheet.model.magic.dimension.Target;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@@ -72,8 +73,7 @@ public class DDSpell {
 	@NonNull Range range;
 	Optional<Effect> effect;
 	Area area;
-	// TODO: Either rename Duration to something common, or refactor a copy and make duration have time-based controls
-	Duration target;
+	Target target;
 	@NonNull Duration duration;
 	@NonNull String savingThrow; // TODO
 	boolean allowsSpellResistance;

+ 72 - 19
src/org/leumasjaffe/charsheet/model/magic/dimension/Duration.java

@@ -1,39 +1,92 @@
 package org.leumasjaffe.charsheet.model.magic.dimension;
 
+import static org.leumasjaffe.charsheet.config.Constants.K_DURATION;
+import static org.leumasjaffe.charsheet.config.Constants.DurationMeasurement.*;
+
+import org.leumasjaffe.charsheet.config.Config;
+import org.leumasjaffe.charsheet.model.magic.dimension.Range.__Pair;
 import org.leumasjaffe.charsheet.util.StringHelper;
 import org.leumasjaffe.format.Named;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 
 import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.experimental.FieldDefaults;
 import lombok.experimental.NonFinal;
 
-@RequiredArgsConstructor
-@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
-public class Duration {
-	@NonNull String format;
-	String resolved;
-	int count, perlevel;
-	@NonFinal int step = 1;
+public interface Duration {
+	@AllArgsConstructor
+	public static enum Measure {
+		round(1), minute(10), hour(600), day(14400);
+		int rounds;
+	}
 	
-	@JsonCreator
-	public Duration(final String descr) {
-		this.format = descr;
-		this.resolved = null;
-		this.count = this.perlevel = 0;
+	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+	public static final class __Pair {
+		int[] value;
+		Measure measure;
+		
+		private __Pair(Measure def, int... times) {
+			value = new int[times.length];
+			final int div;
+			if (Config.get(K_DURATION, NATURAL) == ROUNDS) {
+				div = def.rounds;
+				measure = Measure.round;
+			} else {
+				div = 1;
+				measure = def;
+			}
+			for (int i = 0; i < times.length; ++i) {
+				value[i] = times[i] / div;
+			}
+		}
+	}
+
+	public default String getResolved(int level) { return toString(); }
+
+	@RequiredArgsConstructor
+	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+	public static class Basic implements Duration {
+		@NonNull String name;
+		
+		public String toString() {
+			return name;
+		}
 	}
 	
-	public String getResolved(int level) {
-		final int result = count + perlevel * (level / step);
-		return resolved == null ? toString() :
-			StringHelper.format(resolved, new Named("atlevel", result));
+	@RequiredArgsConstructor
+	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+	public static class WithDistance implements Duration {
+		@NonNull Measure measure; 
+		int range;
+		
+		public String toString() {
+			final __Pair p = new __Pair(measure, range);
+			return StringHelper.format("{} {}{0>1?s:}", p.value[0], p.measure);
+		}
 	}
 	
-	public String toString() {
-		return StringHelper.format(format, new Named("count", count), 
-				new Named("perlevel", perlevel), new Named("step", step));
+	@RequiredArgsConstructor
+	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+	public static class WithLevelGrowth implements Duration {
+		@NonNull Measure measure; 
+		int range, per, step;
+		
+		@Override
+		public String getResolved(int level) {
+			final __Pair p = new __Pair(measure, range + (per * (level / step)));
+			return StringHelper.format("{} {}{0>1?s:}", p.value[0], p.measure);
+		}
+		
+		public String toString() {
+			final __Pair p = new __Pair(measure, range, per);
+			final StringBuilder str = new StringBuilder(StringHelper.format("{} {3}{0>1?s:} + {} {}{1>1?s:}/{?level:{} levels}",
+					p.value[0], p.value[1], p.measure, step == 1, step));
+			return str.toString();
+		}
 	}
 }

+ 39 - 0
src/org/leumasjaffe/charsheet/model/magic/dimension/Target.java

@@ -0,0 +1,39 @@
+package org.leumasjaffe.charsheet.model.magic.dimension;
+
+import org.leumasjaffe.charsheet.util.StringHelper;
+import org.leumasjaffe.format.Named;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+
+import lombok.AccessLevel;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import lombok.experimental.FieldDefaults;
+import lombok.experimental.NonFinal;
+
+@RequiredArgsConstructor
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+public class Target {
+	@NonNull String format;
+	String resolved;
+	int count, perlevel;
+	@NonFinal int step = 1;
+	
+	@JsonCreator
+	public Target(final String descr) {
+		this.format = descr;
+		this.resolved = null;
+		this.count = this.perlevel = 0;
+	}
+	
+	public String getResolved(int level) {
+		final int result = count + perlevel * (level / step);
+		return resolved == null ? toString() :
+			StringHelper.format(resolved, new Named("atlevel", result));
+	}
+	
+	public String toString() {
+		return StringHelper.format(format, new Named("count", count), 
+				new Named("perlevel", perlevel), new Named("step", step));
+	}
+}