Duration.java 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package org.leumasjaffe.charsheet.model.magic.dimension;
  2. import static org.leumasjaffe.charsheet.config.Constants.K_DURATION;
  3. import static org.leumasjaffe.charsheet.config.Constants.DurationMeasurement.*;
  4. import org.leumasjaffe.charsheet.config.Config;
  5. import org.leumasjaffe.charsheet.util.StringHelper;
  6. import com.fasterxml.jackson.annotation.JsonCreator;
  7. import com.fasterxml.jackson.annotation.JsonProperty;
  8. import lombok.AccessLevel;
  9. import lombok.AllArgsConstructor;
  10. import lombok.NonNull;
  11. import lombok.RequiredArgsConstructor;
  12. import lombok.experimental.FieldDefaults;
  13. public interface Duration {
  14. @AllArgsConstructor
  15. public static enum Measure {
  16. round(1), minute(10), hour(600), day(14400);
  17. int rounds;
  18. }
  19. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  20. public static final class __Pair {
  21. int[] value;
  22. Measure measure;
  23. private __Pair(Measure def, int... times) {
  24. value = new int[times.length];
  25. final int div;
  26. if (Config.get(K_DURATION, NATURAL) == ROUNDS) {
  27. div = def.rounds;
  28. measure = Measure.round;
  29. } else {
  30. div = 1;
  31. measure = def;
  32. }
  33. for (int i = 0; i < times.length; ++i) {
  34. value[i] = times[i] / div;
  35. }
  36. }
  37. }
  38. public default String getResolved(int level) { return toString(); }
  39. @JsonCreator
  40. public static Duration create(String name) {
  41. return new Basic(name);
  42. }
  43. @JsonCreator
  44. public static Duration create(@JsonProperty("unit") Measure meas,
  45. @JsonProperty("duration") int min,
  46. @JsonProperty("per") int per,
  47. @JsonProperty("step") int step) {
  48. return new WithLevelGrowth(meas, min, per, step);
  49. }
  50. @RequiredArgsConstructor
  51. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  52. public static class Basic implements Duration {
  53. @NonNull String name;
  54. public String toString() {
  55. return name;
  56. }
  57. }
  58. @RequiredArgsConstructor
  59. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  60. public static class WithLevelGrowth implements Duration {
  61. @NonNull Measure measure;
  62. int length, per, step;
  63. @Override
  64. public String getResolved(int level) {
  65. final __Pair p = new __Pair(measure, length + (per * (level / step)));
  66. return StringHelper.format("{} {}{0>1?s:}", p.value[0], p.measure);
  67. }
  68. public String toString() {
  69. final __Pair p = new __Pair(measure, length, per);
  70. final StringBuilder str = new StringBuilder(StringHelper.format("{} {3}{0>1?s:} + {} {}{1>1?s:}/{?level:{} levels}",
  71. p.value[0], p.value[1], p.measure, step));
  72. return str.toString();
  73. }
  74. }
  75. }