|
@@ -1,39 +1,92 @@
|
|
|
package org.leumasjaffe.charsheet.model.magic.dimension;
|
|
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.charsheet.util.StringHelper;
|
|
|
import org.leumasjaffe.format.Named;
|
|
import org.leumasjaffe.format.Named;
|
|
|
|
|
|
|
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
|
|
|
|
|
|
|
import lombok.AccessLevel;
|
|
import lombok.AccessLevel;
|
|
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
|
|
+import lombok.Getter;
|
|
|
import lombok.NonNull;
|
|
import lombok.NonNull;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.experimental.FieldDefaults;
|
|
import lombok.experimental.FieldDefaults;
|
|
|
import lombok.experimental.NonFinal;
|
|
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();
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|