Pārlūkot izejas kodu

Enhance Predicate system for matching based on psuedo-complex criteria.

Sam Jaffe 8 gadi atpakaļ
vecāks
revīzija
229575e01d

+ 11 - 2
resources/feats/default.json

@@ -6,7 +6,10 @@
     "prerequisites": [],
     "properties": [
       {
-        "applies": "Character::Initiative",
+        "applies": { 
+          "@c": ".DDFeaturePredicate", 
+          "value": "Character::Initiative"
+        },
         "@c": ".impl.Flat",
         "group": "NONE",
         "value": 4
@@ -25,7 +28,13 @@
     ],
     "properties": [
       {
-        "applies": "Spell::Conjuration::Healing",
+        "applies": {
+          "@c": ".pred.SpellMatcher",
+          "properties": {
+            "school": "Conjuration",
+            "tags": ["Healing"]
+          }
+        },
         "@c": ".impl.PerSpellLevel",
         "group": "NONE",
         "value": 2

+ 6 - 2
src/main/lombok/org/leumasjaffe/charsheet/model/features/DDFeaturePredicate.java

@@ -1,15 +1,19 @@
 package org.leumasjaffe.charsheet.model.features;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
 
 import lombok.NonNull;
 
 @FunctionalInterface
+@JsonTypeInfo(use=Id.MINIMAL_CLASS)
 public interface DDFeaturePredicate {
-	boolean accepts(String value);
+	boolean accepts(Object value);
 	
 	@JsonCreator
-	public static DDFeaturePredicate of(@NonNull String name) {
+	public static DDFeaturePredicate of(@JsonProperty("value") @NonNull String name) {
 		return v -> name.equals(v);
 	}
 }

+ 1 - 1
src/main/lombok/org/leumasjaffe/charsheet/model/features/DDPrerequisite.java

@@ -4,6 +4,6 @@ import lombok.AllArgsConstructor;
 
 @AllArgsConstructor
 class DDPrerequisite {
-	DDFeaturePredicate applies;
+	String applies;
 	int value;
 }

+ 43 - 0
src/main/lombok/org/leumasjaffe/charsheet/model/features/pred/SpellMatcher.java

@@ -0,0 +1,43 @@
+package org.leumasjaffe.charsheet.model.features.pred;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.leumasjaffe.charsheet.model.features.DDFeaturePredicate;
+import org.leumasjaffe.charsheet.model.magic.DDSpell;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import lombok.AllArgsConstructor;
+import lombok.NonNull;
+import lombok.SneakyThrows;
+
+@AllArgsConstructor
+public class SpellMatcher implements DDFeaturePredicate {
+	@NonNull Map<String, Object> properties;
+
+	@Override @SneakyThrows
+	public boolean accepts(Object value) {
+		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;
+			}
+		}
+		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;
+	}
+
+}