DDCharacterClass.java 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package org.leumasjaffe.charsheet.model;
  2. import java.util.List;
  3. import java.util.Optional;
  4. import java.util.stream.Collectors;
  5. import java.util.stream.IntStream;
  6. import java.util.stream.Stream;
  7. import org.leumasjaffe.charsheet.model.features.DDProperty;
  8. import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
  9. import org.leumasjaffe.charsheet.model.observable.IntValue;
  10. import org.leumasjaffe.observer.Observable;
  11. import com.fasterxml.jackson.annotation.JsonIgnore;
  12. import lombok.AccessLevel;
  13. import lombok.AllArgsConstructor;
  14. import lombok.Data;
  15. import lombok.EqualsAndHashCode;
  16. import lombok.Getter;
  17. import lombok.experimental.Delegate;
  18. import lombok.experimental.FieldDefaults;
  19. @Data @AllArgsConstructor
  20. @EqualsAndHashCode(callSuper=false)
  21. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  22. public class DDCharacterClass extends Observable.Instance implements Comparable<DDCharacterClass> {
  23. private static final class Reference {
  24. DDClass base;
  25. public boolean equals(Object o) {
  26. return this == o || base.equals(o);
  27. }
  28. public String getName() {
  29. return base.getName();
  30. }
  31. public int hashCode() {
  32. return base.hashCode();
  33. }
  34. public String toString() {
  35. return base.toString();
  36. }
  37. public Reference(final String name) {
  38. this.base = DDClass.getFromResource(name);
  39. }
  40. }
  41. IntValue level;
  42. // @NonNull List<Integer> healthRolls;
  43. @Delegate @Getter(AccessLevel.NONE) Reference name;
  44. Optional<DDSpellbook> spellBook;
  45. public DDCharacterClass(String name) {
  46. this.level = new IntValue(0);
  47. this.name = new Reference(name);
  48. this.spellBook = getProto().createNewSpellBook();
  49. }
  50. public String toString() {
  51. return getName() + " " + getLevel();
  52. }
  53. @JsonIgnore public int getSkillPoints() {
  54. return name.base.getSkillPoints();
  55. }
  56. @JsonIgnore public int getBab() {
  57. return name.base.getBab().getBonus(level.value());
  58. }
  59. @JsonIgnore public int getFort() {
  60. return name.base.getFort().getBonus(level.value());
  61. }
  62. @JsonIgnore public int getRef() {
  63. return name.base.getRef().getBonus(level.value());
  64. }
  65. @JsonIgnore public int getWill() {
  66. return name.base.getWill().getBonus(level.value());
  67. }
  68. public boolean isClassSkill(final String skill) {
  69. return name.base.isClassSkill(skill);
  70. }
  71. @JsonIgnore public DDClass getProto() {
  72. return name.base;
  73. }
  74. @JsonIgnore public int getHighestSpellLevel() {
  75. return getHighestSpellLevel(getLevel().value());
  76. }
  77. public int getHighestSpellLevel(int level) {
  78. // TODO: Bonus levels to spellsKnown/spellsPerDay?
  79. // TODO: Bonus spellsPerDay for high ability scores
  80. if (level == 0) { return -1; }
  81. final List<Integer> list = getProto().getSpells().get().getPerDay().get(level-1);
  82. level = list.size() - 1;
  83. return list.get(level) == 0 ? level : level + 1;
  84. }
  85. @Override
  86. public int compareTo(DDCharacterClass o) {
  87. return getName().compareTo(o.getName());
  88. }
  89. public List<DDProperty> getFeatureBonuses(Object appliesScope) {
  90. return IntStream.rangeClosed(1, level.value())
  91. .mapToObj(level -> name.base.getFeatures(level).stream())
  92. .reduce(Stream.empty(), (l, r) -> Stream.concat(l, r))
  93. .filter(p -> p.appliesTo(appliesScope)).collect(Collectors.toList());
  94. }
  95. }