Browse Source

Make SpellMatcher not awful.
Add smarter way to propagate typed-ish data back to callers.

Sam Jaffe 8 years ago
parent
commit
97ae3aa42f

+ 2 - 1
resources/feats/default.json

@@ -32,11 +32,12 @@
           "@c": ".pred.SpellMatcher",
           "@c": ".pred.SpellMatcher",
           "properties": {
           "properties": {
             "school": "Conjuration",
             "school": "Conjuration",
-            "tags": ["Healing"]
+            "subschool": "Healing"
           }
           }
         },
         },
         "@c": ".impl.PerSpellLevel",
         "@c": ".impl.PerSpellLevel",
         "group": "NONE",
         "group": "NONE",
+        "type": "effect",
         "value": 2
         "value": 2
       }
       }
     ]
     ]

+ 3 - 0
src/main/lombok/org/leumasjaffe/charsheet/model/features/DDProperty.java

@@ -1,5 +1,7 @@
 package org.leumasjaffe.charsheet.model.features;
 package org.leumasjaffe.charsheet.model.features;
 
 
+import java.util.Map;
+
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
 import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
 
 
@@ -10,4 +12,5 @@ public interface DDProperty {
 	}
 	}
 	boolean appliesTo(Object key);
 	boolean appliesTo(Object key);
 	@Deprecated <T> T value();
 	@Deprecated <T> T value();
+	void accumulate(Map<String, Object> props);
 }
 }

+ 8 - 0
src/main/lombok/org/leumasjaffe/charsheet/model/features/impl/Flat.java

@@ -1,5 +1,7 @@
 package org.leumasjaffe.charsheet.model.features.impl;
 package org.leumasjaffe.charsheet.model.features.impl;
 
 
+import java.util.Map;
+
 import org.leumasjaffe.charsheet.model.features.DDFeaturePredicate;
 import org.leumasjaffe.charsheet.model.features.DDFeaturePredicate;
 import org.leumasjaffe.charsheet.model.features.DDProperty;
 import org.leumasjaffe.charsheet.model.features.DDProperty;
 
 
@@ -20,4 +22,10 @@ public class Flat implements DDProperty {
 	public Object value() {
 	public Object value() {
 		return this.value;
 		return this.value;
 	}
 	}
+
+	@Override
+	public void accumulate(Map<String, Object> props) {
+		// TODO: use groups
+		props.compute("value", (k, old) -> old == null ? value : value + (Integer) old);
+	}
 }
 }

+ 14 - 0
src/main/lombok/org/leumasjaffe/charsheet/model/features/impl/PerSpellLevel.java

@@ -1,5 +1,8 @@
 package org.leumasjaffe.charsheet.model.features.impl;
 package org.leumasjaffe.charsheet.model.features.impl;
 
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.leumasjaffe.charsheet.model.features.DDFeaturePredicate;
 import org.leumasjaffe.charsheet.model.features.DDFeaturePredicate;
 import org.leumasjaffe.charsheet.model.features.DDProperty;
 import org.leumasjaffe.charsheet.model.features.DDProperty;
 
 
@@ -9,6 +12,7 @@ import lombok.AllArgsConstructor;
 public class PerSpellLevel implements DDProperty {
 public class PerSpellLevel implements DDProperty {
 	DDFeaturePredicate applies;
 	DDFeaturePredicate applies;
 	Group group;
 	Group group;
+	String type;
 	int value;
 	int value;
 	
 	
 	@Override
 	@Override
@@ -20,4 +24,14 @@ public class PerSpellLevel implements DDProperty {
 	public Object value() {
 	public Object value() {
 		return this.value; // TODO consume spell level information
 		return this.value; // TODO consume spell level information
 	}
 	}
+
+	@Override @SuppressWarnings("unchecked")
+	public void accumulate(Map<String, Object> props) {
+		// TODO: use groups
+		// TODO: allow multiple things
+		// TODO: consume spell level information
+		props.putIfAbsent("effect", new HashMap<>());
+		((Map<String, Integer>) props.get("effect")).compute("value", 
+				(k, old) -> old == null ? value : value + (Integer) old);
+	}
 }
 }

+ 3 - 0
src/main/lombok/org/leumasjaffe/charsheet/model/features/impl/Simple.java

@@ -1,5 +1,7 @@
 package org.leumasjaffe.charsheet.model.features.impl;
 package org.leumasjaffe.charsheet.model.features.impl;
 
 
+import java.util.Map;
+
 import org.leumasjaffe.charsheet.model.features.DDProperty;
 import org.leumasjaffe.charsheet.model.features.DDProperty;
 
 
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
@@ -9,4 +11,5 @@ public class Simple implements DDProperty {
 	String name;
 	String name;
 	@Override public boolean appliesTo(Object key) { return false; }
 	@Override public boolean appliesTo(Object key) { return false; }
 	@Override public <T> T value() { return null; }
 	@Override public <T> T value() { return null; }
+	@Override public void accumulate(Map<String, Object> props) {}
 }
 }

+ 12 - 18
src/main/lombok/org/leumasjaffe/charsheet/model/features/pred/SpellMatcher.java

@@ -6,8 +6,6 @@ import java.util.Map;
 import org.leumasjaffe.charsheet.model.features.DDFeaturePredicate;
 import org.leumasjaffe.charsheet.model.features.DDFeaturePredicate;
 import org.leumasjaffe.charsheet.model.magic.DDSpell;
 import org.leumasjaffe.charsheet.model.magic.DDSpell;
 
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.NonNull;
 import lombok.NonNull;
 import lombok.SneakyThrows;
 import lombok.SneakyThrows;
@@ -19,25 +17,21 @@ public class SpellMatcher implements DDFeaturePredicate {
 	@Override @SneakyThrows
 	@Override @SneakyThrows
 	public boolean accepts(Object value) {
 	public boolean accepts(Object value) {
 		if (!(value instanceof DDSpell)) return false;
 		if (!(value instanceof DDSpell)) return false;
-		final ObjectMapper mapper = new ObjectMapper();
-		@SuppressWarnings("unchecked")
-		Map<String, Object> json = mapper.treeToValue(mapper.valueToTree((DDSpell) value), Map.class);
-		for (final String key : properties.keySet()) {
-			if (!matches(properties.get(key), json.get(key))) {
-				return false;
-			}
-		}
+		DDSpell spell = (DDSpell) value;
+		if (!accepts("school", spell.getSchool())) { return false; }
+		else if (!accepts("subschool", spell.getSubSchool())) { return false; }
+		else if (!accepts("keywords", spell.getKeywords())) { return false; }
 		return true;
 		return true;
 	}
 	}
 
 
-	@SuppressWarnings("unchecked")
-	private boolean matches(Object match, Object json) {
-		if (match instanceof String) {
-			return ((String) json).matches((String) match);
-		} else if (match instanceof Collection) {
-			((Collection<String>) json).containsAll((Collection<String>) match);
-		}
-		return false;
+	
+	private boolean accepts(String key, Collection<String> value) {
+		return !properties.containsKey(key) || value.contains(properties.get(key));
+	}
+
+
+	private boolean accepts(String key, Enum<?> value) {
+		return !properties.containsKey(key) || properties.get(key).equals(value.name());
 	}
 	}
 
 
 }
 }