Prechádzať zdrojové kódy

Changing DDSpellbook to an interface, determined by one of the fields in the JSON.

Sam Jaffe 8 rokov pred
rodič
commit
959a1d91a0

+ 2 - 0
resources/classes/Bard.json

@@ -15,7 +15,9 @@
     []
   ],
   "spells":{
+    "@type":"Spontaneous",
     "group":"ARCANE",
+    "ability":"CHA",
     "known":[
       [4],
       [5, 2]

+ 2 - 0
resources/classes/Cleric.json

@@ -12,7 +12,9 @@
     ]
   ],
   "spells":{
+    "@type":"Inspired",
     "group":"DIVINE",
+    "ability":"WIS",
     "known":[ ],
     "perDay":[
       [3, 1],

+ 7 - 1
src/org/leumasjaffe/charsheet/model/DDClass.java

@@ -1,9 +1,11 @@
 package org.leumasjaffe.charsheet.model;
 
 import java.io.File;
+import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
 
+import org.leumasjaffe.charsheet.model.magic.DDSpell;
 import org.leumasjaffe.charsheet.model.magic.DDSpellList;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@@ -30,7 +32,7 @@ public class DDClass {
 	
 	@Getter(AccessLevel.NONE) @NonNull List<List<DDFeature>> features;
 	
-	@Getter(AccessLevel.NONE) @NonNull Optional<DDSpellList> spells;
+	@Getter(AccessLevel.PACKAGE) @NonNull Optional<DDSpellList> spells;
 	
 	@SneakyThrows
 	public static DDClass getFromResource(final String name) {
@@ -38,4 +40,8 @@ public class DDClass {
 		mapper.registerModule(new Jdk8Module());
 		return mapper.readValue(new File("resources/classes/" + name + ".json"), DDClass.class);
 	}
+	
+	public Collection<DDSpell> getSpellList( int level ) {
+		return spells.get().getSpellList().get( level ).getSpellList();
+	}
 }

+ 1 - 0
src/org/leumasjaffe/charsheet/model/magic/DDSpellList.java

@@ -16,6 +16,7 @@ import lombok.experimental.FieldDefaults;
 @JsonIgnoreProperties(ignoreUnknown=true)
 public class DDSpellList {
 	@NonNull Source group;
+	@NonNull String ability;
 	
 	@NonNull List<List<Integer>> known;
 	@NonNull List<List<Integer>> perDay;

+ 24 - 10
src/org/leumasjaffe/charsheet/model/magic/DDSpellbook.java

@@ -1,18 +1,32 @@
 package org.leumasjaffe.charsheet.model.magic;
 
+import java.util.Collection;
 import java.util.List;
 
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import org.leumasjaffe.charsheet.model.magic.impl.Inspired;
+import org.leumasjaffe.charsheet.model.magic.impl.Researched;
+import org.leumasjaffe.charsheet.model.magic.impl.Spontaneous;
+
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
-import lombok.AccessLevel;
-import lombok.Data;
 import lombok.NonNull;
-import lombok.experimental.FieldDefaults;
 
-@Data
-@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
-@JsonIgnoreProperties(ignoreUnknown=true)
-public class DDSpellbook {
-	@NonNull List<List<DDSpell>> spellsPrepared;
-	@NonNull List<List<DDSpell>> spellsAtCircle; 
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
+@JsonSubTypes({
+	@JsonSubTypes.Type(value=Spontaneous.class, name="Spontaneous"),
+	@JsonSubTypes.Type(value=Researched.class, name="Researched"),
+	@JsonSubTypes.Type(value=Inspired.class, name="Inspired")
+})
+public interface DDSpellbook {
+	@NonNull Collection<DDSpell> spellsKnownAtLevel( int level );
+	@NonNull List<DDSpell> spellsPreparedAtLevel( int level );
+	
+	default int numSpellsKnownAtLevel( int level ) {
+		return spellsKnownAtLevel( level ).size();
+	}
+	
+	int numSpellsPerDayAtLevel( int level );
+	
+	void castSpell( int level, final DDSpell spell );
 }

+ 60 - 0
src/org/leumasjaffe/charsheet/model/magic/impl/Inspired.java

@@ -0,0 +1,60 @@
+package org.leumasjaffe.charsheet.model.magic.impl;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.leumasjaffe.charsheet.model.DDClass;
+import org.leumasjaffe.charsheet.model.magic.DDSpell;
+import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.NonNull;
+import lombok.experimental.FieldDefaults;
+import lombok.experimental.NonFinal;
+
+@AllArgsConstructor
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+public class Inspired implements DDSpellbook {
+	@AllArgsConstructor
+	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+	private static class Level {
+		@NonNull List<DDSpell> spellsPrepared;
+		@NonFinal int spellsPerDay;
+	}
+	
+	private static class ClassReference {
+		DDClass ref;
+		@SuppressWarnings("unused")
+		public ClassReference(String name) {
+			this.ref = DDClass.getFromResource(name);
+		}
+	}
+	
+	@NonNull Map<Integer, Inspired.Level> spellInfo;
+	@NonNull ClassReference classRef;
+
+	@Override
+	public int numSpellsPerDayAtLevel( int level ) {
+		return spellInfo.get( level ).spellsPerDay;
+	}
+
+	@Override
+	public Collection<DDSpell> spellsKnownAtLevel(int level) {
+		return classRef.ref.getSpellList( level );
+	}
+
+	@Override
+	public List<DDSpell> spellsPreparedAtLevel(int level) {
+		return spellInfo.get( level ).spellsPrepared;
+	}
+
+	@Override
+	public void castSpell(int level, DDSpell spell) {
+		if ( ! spellInfo.get( level ).spellsPrepared.remove( spell ) ) {
+			throw new IllegalStateException("Attempting to cast an unprepared spell");
+		}
+		--spellInfo.get( level ).spellsPerDay;
+	}
+}

+ 51 - 0
src/org/leumasjaffe/charsheet/model/magic/impl/Researched.java

@@ -0,0 +1,51 @@
+package org.leumasjaffe.charsheet.model.magic.impl;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.leumasjaffe.charsheet.model.magic.DDSpell;
+import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.NonNull;
+import lombok.experimental.FieldDefaults;
+import lombok.experimental.NonFinal;
+
+@AllArgsConstructor
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+public class Researched implements DDSpellbook {
+	@AllArgsConstructor
+	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+	private static class Level {
+		@NonNull Collection<DDSpell> spellsKnown;
+		@NonNull List<DDSpell> spellsPrepared;
+		@NonFinal int spellsPerDay;
+	}
+	
+	@NonNull Map<Integer, Researched.Level> spellInfo;
+
+	@Override
+	public int numSpellsPerDayAtLevel( int level ) {
+		return spellInfo.get( level ).spellsPerDay;
+	}
+
+	@Override
+	public Collection<DDSpell> spellsKnownAtLevel(int level) {
+		return spellInfo.get( level ).spellsKnown;
+	}
+
+	@Override
+	public List<DDSpell> spellsPreparedAtLevel(int level) {
+		return spellInfo.get( level ).spellsPrepared;
+	}
+
+	@Override
+	public void castSpell(int level, DDSpell spell) {
+		if ( ! spellInfo.get( level ).spellsPrepared.remove( spell ) ) {
+			throw new IllegalStateException("Attempting to cast an unprepared spell");
+		}
+		--spellInfo.get( level ).spellsPerDay;
+	}
+}

+ 47 - 0
src/org/leumasjaffe/charsheet/model/magic/impl/Spontaneous.java

@@ -0,0 +1,47 @@
+package org.leumasjaffe.charsheet.model.magic.impl;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.leumasjaffe.charsheet.model.magic.DDSpell;
+import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.NonNull;
+import lombok.experimental.FieldDefaults;
+import lombok.experimental.NonFinal;
+
+@AllArgsConstructor
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+public class Spontaneous implements DDSpellbook {
+	@AllArgsConstructor
+	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+	private static class Level {
+		@NonNull List<DDSpell> spellsKnown;
+		@NonFinal int spellsPerDay;
+	}
+	
+	@NonNull Map<Integer, Spontaneous.Level> spellInfo;
+	
+	@Override
+	public int numSpellsPerDayAtLevel( int level ) {
+		return spellInfo.get( level ).spellsPerDay;
+	}
+
+	@Override
+	public Collection<DDSpell> spellsKnownAtLevel(int level) {
+		return spellsPreparedAtLevel( level );
+	}
+
+	@Override
+	public List<DDSpell> spellsPreparedAtLevel(int level) {
+		return spellInfo.get( level ).spellsKnown;
+	}
+
+	@Override
+	public void castSpell(int level, DDSpell spell) {
+		--spellInfo.get( level ).spellsPerDay;
+	}
+}