瀏覽代碼

Fixing bugs with NPE/AIOOB when generating spell panels. Also, add a String JsonCreator to DDSpell for fluency.
- We went out of bounds computing the highest level spells
- A second bounds error was hidden by the size check in Inspired.java

Sam Jaffe 8 年之前
父節點
當前提交
82db3e2e63

+ 4 - 0
resources/Potato.json

@@ -16,6 +16,10 @@
               "Create Water",
               "Create Water",
               "Create Water"
               "Create Water"
             ]
             ]
+          },
+          "1":{
+            "spellsPerDay":0,
+            "spellsPrepared":[]
           }
           }
         }
         }
       }
       }

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

@@ -4,6 +4,7 @@ import java.util.EnumSet;
 import java.util.List;
 import java.util.List;
 import java.util.Set;
 import java.util.Set;
 
 
+import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 
 
 import lombok.AccessLevel;
 import lombok.AccessLevel;
@@ -69,4 +70,8 @@ public class DDSpell {
 	public String getSpellSchool() {
 	public String getSpellSchool() {
 		return subSchool == null ? school.toString() : school.toString() + " (" + subSchool.toString() + ")";
 		return subSchool == null ? school.toString() : school.toString() + " (" + subSchool.toString() + ")";
 	}
 	}
+	
+	@JsonCreator static DDSpell fromString(String str) { 
+		return DDSpellFactory.loadSpell(str);
+	}
 }
 }

+ 2 - 13
src/org/leumasjaffe/charsheet/model/magic/impl/Inspired.java

@@ -3,16 +3,11 @@ package org.leumasjaffe.charsheet.model.magic.impl;
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 
 import org.leumasjaffe.charsheet.model.DDClass;
 import org.leumasjaffe.charsheet.model.DDClass;
 import org.leumasjaffe.charsheet.model.magic.DDSpell;
 import org.leumasjaffe.charsheet.model.magic.DDSpell;
-import org.leumasjaffe.charsheet.model.magic.DDSpellFactory;
 import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
 import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
 
 
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
 import lombok.AccessLevel;
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.NonNull;
 import lombok.NonNull;
@@ -22,17 +17,11 @@ import lombok.experimental.NonFinal;
 @AllArgsConstructor
 @AllArgsConstructor
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 public class Inspired implements DDSpellbook {
 public class Inspired implements DDSpellbook {
+	@AllArgsConstructor
 	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 	private static class Level {
 	private static class Level {
 		@NonNull List<DDSpell> spellsPrepared;
 		@NonNull List<DDSpell> spellsPrepared;
 		@NonFinal int spellsPerDay;
 		@NonFinal int spellsPerDay;
-		
-		@JsonCreator
-		Level(@JsonProperty("spellsPerDay") int spellsPerDay, 
-				@JsonProperty("spellsPrepared") List<String> spellsPrepared) {
-			this.spellsPerDay = spellsPerDay;
-			this.spellsPrepared = spellsPrepared.stream().map(s -> DDSpellFactory.loadSpell(s)).collect(Collectors.toList());
-		}
 	}
 	}
 	
 	
 	private static class ClassReference {
 	private static class ClassReference {
@@ -63,7 +52,7 @@ public class Inspired implements DDSpellbook {
 
 
 	@Override
 	@Override
 	public List<DDSpell> spellsPreparedAtLevel(int level) {
 	public List<DDSpell> spellsPreparedAtLevel(int level) {
-		return spellInfo.size() <= level ? null : spellInfo.get( level ).spellsPrepared;
+		return spellInfo.get( level ).spellsPrepared;
 	}
 	}
 
 
 	@Override
 	@Override

+ 4 - 6
src/org/leumasjaffe/charsheet/view/magic/SpellPanel.java

@@ -61,13 +61,13 @@ public class SpellPanel extends JPanel {
 		final DDSpellList spellList = DDClass.getFromResource(cclass.getName()).getSpells().get();
 		final DDSpellList spellList = DDClass.getFromResource(cclass.getName()).getSpells().get();
 		final int cLvl = cclass.getLevel();
 		final int cLvl = cclass.getLevel();
 		if (spellList.getKnown().isEmpty()) {
 		if (spellList.getKnown().isEmpty()) {
-			List<Integer> list = spellList.getPerDay().get(cLvl);
+			List<Integer> list = spellList.getPerDay().get(cLvl-1);
 			level = list.size() - 1;
 			level = list.size() - 1;
 			if (list.get(list.size()-1) == 0) {
 			if (list.get(list.size()-1) == 0) {
 				--level;
 				--level;
 			}
 			}
 		} else {
 		} else {
-			level = spellList.getKnown().get(cLvl).size()-1;
+			level = spellList.getKnown().get(cLvl-1).size()-1;
 		}
 		}
 		return level;
 		return level;
 	}
 	}
@@ -77,10 +77,8 @@ public class SpellPanel extends JPanel {
 		JPanel root = new JPanel();
 		JPanel root = new JPanel();
 		root.setLayout(new VerticalLayout());
 		root.setLayout(new VerticalLayout());
 		
 		
-		int i = 0;
-		for (Collection<DDSpell> spells = getSpells.apply(i);
-				spells != null && i < highestSpellLevel; 
-				spells = getSpells.apply(++i)) {
+		for (int i = 0; i < highestSpellLevel; ++i) {
+			Collection<DDSpell> spells = getSpells.apply(i);
 			root.add(new SpellLevelPanel(getPanel.apply(i, spells.size()), spells));
 			root.add(new SpellLevelPanel(getPanel.apply(i, spells.size()), spells));
 		}
 		}