Переглянути джерело

Automatically resolve the range of a spell in the SpellInfoPanel's display

Sam Jaffe 8 роки тому
батько
коміт
0029232607

+ 4 - 0
src/org/leumasjaffe/charsheet/model/DDCharacterClass.java

@@ -72,4 +72,8 @@ public class DDCharacterClass {
 	public boolean isClassSkill(final String skill) {
 		return name.base.isClassSkill(skill);
 	}
+
+	public DDClass getProto() {
+		return name.base;
+	}
 }

+ 10 - 0
src/org/leumasjaffe/charsheet/model/magic/DDSpell.java

@@ -2,6 +2,7 @@ package org.leumasjaffe.charsheet.model.magic;
 
 import java.util.EnumSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -9,8 +10,10 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 
 import lombok.AccessLevel;
 import lombok.Data;
+import lombok.Getter;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
+import lombok.Setter;
 import lombok.experimental.FieldDefaults;
 
 @Data
@@ -41,6 +44,8 @@ public class DDSpell {
 		S("Somatic"),
 		M("Material"), 
 		F("Focus"),
+		M_DF("Material/Divine Focus"),
+		F_DF("Focus/Divine Focus"),
 		DF("Divine Focus"),
 		XP("Experience Point");
 		
@@ -52,6 +57,7 @@ public class DDSpell {
 	}
 	
 	@NonNull String name;
+	@NonNull @Getter(AccessLevel.NONE) @Setter(AccessLevel.NONE) Map<String, Integer> classToLevel;
 	@NonNull School school;
 	SubSchool subSchool;
 	@NonNull Set<String> keywords;
@@ -71,6 +77,10 @@ public class DDSpell {
 		return subSchool == null ? school.toString() : school.toString() + " (" + subSchool.toString() + ")";
 	}
 	
+	public int getClassLevel(final String clas) {
+		return classToLevel.get(clas);
+	}
+	
 	@JsonCreator static DDSpell fromString(String str) { 
 		return DDSpellFactory.loadSpell(str);
 	}

+ 9 - 1
src/org/leumasjaffe/charsheet/model/magic/Range.java

@@ -19,7 +19,8 @@ public interface Range {
 			Unlimited = new Basic("Unlimited");
 	
 	public String getName();
-	
+	public default String getResolved(int level) { return toString(); }
+
 	@JsonCreator
 	public static Range select(final String name) {
 		switch (name.toLowerCase()) {
@@ -76,6 +77,13 @@ public interface Range {
 		int per;
 		int step;
 		
+		@Override
+		public String getResolved(int level) {
+			final StringBuilder str = new StringBuilder();
+			str.append(range + (per * (level / step))).append(" ft.");
+			return str.toString();
+		}
+		
 		public String toString() {
 			final StringBuilder str = new StringBuilder(name);
 			str.append(" (").append(range).append(" ft.");

+ 14 - 7
src/org/leumasjaffe/charsheet/view/magic/SpellInfoPanel.java

@@ -11,6 +11,7 @@ import javax.swing.JTextArea;
 import org.leumasjaffe.charsheet.model.DDCharacterClass;
 import org.leumasjaffe.charsheet.model.magic.DDSpell;
 import org.leumasjaffe.charsheet.model.magic.DDSpell.Component;
+import org.leumasjaffe.charsheet.model.magic.Source;
 
 import javax.swing.JScrollPane;
 import javax.swing.JLabel;
@@ -19,6 +20,8 @@ import java.awt.Font;
 import java.awt.FlowLayout;
 import javax.swing.JCheckBox;
 
+import static org.leumasjaffe.charsheet.model.magic.DDSpell.Component.*; 
+
 public class SpellInfoPanel extends JPanel {
 
 	/**
@@ -130,34 +133,37 @@ public class SpellInfoPanel extends JPanel {
 		panel.add(panel_1, gbc_panel_1);
 		panel_1.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
 		
+		final Set<Component> comps = spell.getComponents();
+		final Source src = dclass.getProto().getSpells().get().getGroup();
+		
 		JCheckBox chckbxVerbal = new JCheckBox("Verbal");
 		chckbxVerbal.setEnabled(false);
-		chckbxVerbal.setSelected(spell.getComponents().contains(Component.V));
+		chckbxVerbal.setSelected(comps.contains(V));
 		panel_1.add(chckbxVerbal);
 		
 		JCheckBox chckbxSomatic = new JCheckBox("Somatic");
 		chckbxSomatic.setEnabled(false);
-		chckbxSomatic.setSelected(spell.getComponents().contains(Component.S));
+		chckbxSomatic.setSelected(comps.contains(S));
 		panel_1.add(chckbxSomatic);
 		
 		JCheckBox chckbxMaterial = new JCheckBox("Material");
 		chckbxMaterial.setEnabled(false);
-		chckbxMaterial.setSelected(spell.getComponents().contains(Component.M));
+		chckbxMaterial.setSelected(comps.contains(M) || (comps.contains(M_DF) && src == Source.ARCANE));
 		panel_1.add(chckbxMaterial);
 		
 		JCheckBox chckbxFocus = new JCheckBox("Focus");
 		chckbxFocus.setEnabled(false);
-		chckbxFocus.setSelected(spell.getComponents().contains(Component.F));
+		chckbxFocus.setSelected(comps.contains(F) || (comps.contains(F_DF) && src == Source.ARCANE));
 		panel_1.add(chckbxFocus);
 		
 		JCheckBox chckbxDivineFocus = new JCheckBox("Divine Focus");
 		chckbxDivineFocus.setEnabled(false);
-		chckbxDivineFocus.setSelected(spell.getComponents().contains(Component.DF));
+		chckbxDivineFocus.setSelected(comps.contains(DF) || ((comps.contains(M_DF) || comps.contains(F_DF)) && src == Source.DIVINE));
 		panel_1.add(chckbxDivineFocus);
 		
 		JCheckBox chckbxExperience = new JCheckBox("Experience");
 		chckbxExperience.setEnabled(false);
-		chckbxExperience.setSelected(spell.getComponents().contains(Component.XP));
+		chckbxExperience.setSelected(comps.contains(XP));
 		panel_1.add(chckbxExperience);
 		
 		JLabel lblCastingTime = new JLabel("Casting Time:");
@@ -188,7 +194,8 @@ public class SpellInfoPanel extends JPanel {
 		gbc_lblRange.gridy = 3;
 		panel.add(lblRange, gbc_lblRange);
 		
-		range = new JTextField(spell.getRange().toString());
+		range = new JTextField(spell.getRange().getResolved(dclass.getLevel()));
+		range.setToolTipText(spell.getRange().toString());
 		range.setEditable(false);
 		range.setColumns(10);
 		GridBagConstraints gbc_range = new GridBagConstraints();