Explorar o código

Add DDProperty for gaining Skills, such as through the Animal Domain.

Sam Jaffe %!s(int64=8) %!d(string=hai) anos
pai
achega
c4fa7715db

+ 1 - 0
src/main/lombok/org/leumasjaffe/charsheet/config/Constants.java

@@ -9,6 +9,7 @@ public final class Constants {
 	public String PREVIOUS_LOADOUT = "$$PREVIOUS";
 	public String NO_FLAT_FOOTED = "Keeps Dexterity When Flat-footed";
 	public String INITIATIVE = "Character::Initiative";
+	public String GAINSKILL = "Character::ClassSkill";
 	
 	public String K_DISTANCE = "Distance Measurement Unit";
 	public enum DistanceMeasurement {

+ 12 - 2
src/main/lombok/org/leumasjaffe/charsheet/model/DDCharacterClass.java

@@ -3,9 +3,11 @@ package org.leumasjaffe.charsheet.model;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.leumasjaffe.charsheet.config.Constants;
 import org.leumasjaffe.charsheet.model.features.DDProperty;
 import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
 import org.leumasjaffe.charsheet.model.observable.IntValue;
@@ -115,7 +117,9 @@ public class DDCharacterClass extends Observable.Instance implements Comparable<
 	}
 	
 	public boolean isClassSkill(final String skill) {
-		return name.base.isClassSkill(skill);
+		return name.base.isClassSkill(skill) ||
+				DDClass.isClassSkill(skill, getFeatureBonuses(Constants.GAINSKILL).stream()
+						.map(DDProperty::getName).collect(Collectors.toSet()));
 	}
 
 	@JsonIgnore public DDClass getProto() {
@@ -126,7 +130,13 @@ public class DDCharacterClass extends Observable.Instance implements Comparable<
 		return getHighestSpellLevel(getLevel().value());
 	}
 	
-	public int getHighestSpellLevel(int level) {
+	@JsonIgnore public Set<String> getClassSkills() {
+		return Stream.concat(getProto().getSkills().stream(),
+				getFeatureBonuses(Constants.GAINSKILL).stream().map(DDProperty::getName))
+				.collect(Collectors.toSet());
+	}
+	
+	@JsonIgnore public int getHighestSpellLevel(int level) {
 		// TODO: Bonus levels to spellsKnown/spellsPerDay?
 		// TODO: Bonus spellsPerDay for high ability scores
 		if (level == 0) { return -1; }

+ 5 - 1
src/main/lombok/org/leumasjaffe/charsheet/model/DDClass.java

@@ -70,8 +70,12 @@ public class DDClass {
 		List<SpellList> list = spells.get().getSpellList();
 		return list.size() <= level ? Collections.emptySet() : list.get( level ).getSpellList();
 	}
-	
+
 	public boolean isClassSkill(final String skillName) {
+		return isClassSkill(skillName, skills);
+	}
+
+	public static boolean isClassSkill(final String skillName, Set<String> skills) {
 		if (skillName.contains("(")) {
 			return skills.contains(skillName) || skills.contains(skillName.replaceFirst("\\(.*\\)", "(*)"));
 		}

+ 36 - 0
src/main/lombok/org/leumasjaffe/charsheet/model/features/impl/Skill.java

@@ -0,0 +1,36 @@
+package org.leumasjaffe.charsheet.model.features.impl;
+
+import org.leumasjaffe.charsheet.config.Constants;
+import org.leumasjaffe.charsheet.model.features.DDProperty;
+import org.leumasjaffe.charsheet.model.features.DDPropertyChooser;
+import org.leumasjaffe.charsheet.model.features.GroupedBonus;
+import org.leumasjaffe.collections.Tree;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@AllArgsConstructor @Data
+public class Skill implements DDProperty, DDPropertyChooser {
+	String name;
+	
+	@Override
+	public String getDescription() {
+		return "Gain '" + name + "' as a class Skill";
+	}
+	
+	@Override
+	public boolean appliesTo(Object key) {
+		return Constants.GAINSKILL.equals(key);
+	}
+
+	@Override
+	public void accumulate(Tree<String, GroupedBonus> props, Object... data) {}
+	
+	@Override
+	public String getHeader() { return name; }
+
+	@Override
+	public DDProperty get(int selectedIndex) {
+		return new Skill(name);
+	}
+}