DDCharacter.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package org.leumasjaffe.charsheet.model;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import java.util.Set;
  7. import java.util.SortedSet;
  8. import java.util.TreeSet;
  9. import java.util.stream.Collectors;
  10. import java.util.stream.Stream;
  11. import org.leumasjaffe.charsheet.model.features.DDFeat;
  12. import org.leumasjaffe.charsheet.model.features.DDProperty;
  13. import org.leumasjaffe.charsheet.model.inventory.DDInventory;
  14. import org.leumasjaffe.charsheet.model.observable.IntValue;
  15. import org.leumasjaffe.charsheet.model.observable.ObjectValue;
  16. import org.leumasjaffe.charsheet.model.skill.DDSkills;
  17. import org.leumasjaffe.observer.Observable;
  18. import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  19. import lombok.AccessLevel;
  20. import lombok.Data;
  21. import lombok.EqualsAndHashCode;
  22. import lombok.Getter;
  23. import lombok.NoArgsConstructor;
  24. import lombok.NonNull;
  25. import lombok.experimental.FieldDefaults;
  26. @NoArgsConstructor
  27. @Data @EqualsAndHashCode(callSuper=false)
  28. @FieldDefaults(level=AccessLevel.PRIVATE)
  29. @JsonIgnoreProperties(ignoreUnknown=true)
  30. public class DDCharacter extends Observable {
  31. @NonNull String name = "";
  32. @NonNull String player = "";
  33. @NonNull @Getter(AccessLevel.NONE) SortedSet<DDCharacterClass> classes = new TreeSet<>();
  34. @NonNull String race = "";
  35. @NonNull Alignment alignment;
  36. @NonNull String deity = "";
  37. @NonNull ObjectValue<SizeClass> size = new ObjectValue<>(SizeClass.M);
  38. int age = -1;
  39. @NonNull Gender gender = Gender.N;
  40. @NonNull String height;
  41. int weight = -1;
  42. @NonNull String eyes = "";
  43. @NonNull String hair = "";
  44. @NonNull String skin = "";
  45. @NonNull IntValue experience = new IntValue();
  46. @NonNull HitPoints health = new HitPoints();
  47. @NonNull Ability abilities = new Ability();
  48. @NonNull DDSkills skills = new DDSkills(Collections.emptyList());
  49. @NonNull List<DDFeat> feats = new ArrayList<>();
  50. @NonNull DDInventory inventory = new DDInventory();
  51. public String getClassAndLevelString() {
  52. final StringBuilder ss = new StringBuilder();
  53. final Iterator<DDCharacterClass> it = classes.iterator();
  54. while (it.hasNext()) {
  55. ss.append(it.next());
  56. if (it.hasNext()) { ss.append(" / "); }
  57. }
  58. return ss.toString();
  59. }
  60. public Set<DDCharacterClass> getClasses() {
  61. return Collections.unmodifiableSet(classes);
  62. }
  63. public int getBaseAttack() {
  64. return classes.stream().mapToInt(c -> c.getBab()).sum();
  65. }
  66. public int getFortSave() {
  67. return classes.stream().mapToInt(c -> c.getFort()).sum();
  68. }
  69. public int getRefSave() {
  70. return classes.stream().mapToInt(c -> c.getRef()).sum();
  71. }
  72. public int getWillSave() {
  73. return classes.stream().mapToInt(c -> c.getWill()).sum();
  74. }
  75. public boolean isClassSkill(final String skillName) {
  76. return classes.stream().anyMatch( cc -> cc.isClassSkill(skillName) );
  77. }
  78. public int getLevel() {
  79. return classes.stream().map(DDCharacterClass::getLevel).mapToInt(IntValue::value).sum();
  80. }
  81. public List<DDProperty> getFeatureBonuses(Object appliesScope) {
  82. return Stream.concat(feats.stream().flatMap(f -> f.getProperties().stream())
  83. .filter(f -> f.appliesTo(appliesScope)),
  84. classes.stream().flatMap(cl -> cl.getFeatureBonuses(appliesScope).stream()))
  85. .collect(Collectors.toList());
  86. }
  87. }