diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1.json index d9fc079bf..f6e557880 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set1.json @@ -53,9 +53,12 @@ "filter": "dwarf" }, "effects": { - "type": "modifyStrength", - "filter": "self,inSkirmishAgainst(orc)", - "amount": 2 + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "self,inSkirmishAgainst(orc)", + "amount": 2 + } } }, "1_12": { @@ -128,9 +131,12 @@ "signet": "aragorn", "keyword": "ranger", "effects": { - "type": "modifyStrength", - "amount": 3, - "filter": "self,inSkirmishAgainst(nazgul)" + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "amount": 3, + "filter": "self,inSkirmishAgainst(nazgul)" + } } }, "1_38": { @@ -167,11 +173,14 @@ "filter": "elf" }, "effects": { - "type": "modifyStrength", - "amount": 2, - "condition": { - "type": "location", - "filter": "siteBlock(fellowship),or(siteNumber(6),siteNumber(7),siteNumber(8))" + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "amount": 2, + "condition": { + "type": "location", + "filter": "siteBlock(fellowship),or(siteNumber(6),siteNumber(7),siteNumber(8))" + } } } }, @@ -219,9 +228,12 @@ "signet": "gandalf", "keyword": "archer", "effects": { - "type": "modifyStrength", - "filter": "self,inSkirmishAgainst(nazgul)", - "amount": 3 + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "self,inSkirmishAgainst(nazgul)", + "amount": 3 + } } }, "1_53": { @@ -314,9 +326,12 @@ "keyword": "tracker", "effects": [ { - "type": "modifyRoamingPenalty", - "filter": "culture(sauron),minion,your", - "amount": -1 + "type": "modifier", + "modifier": { + "type": "modifyRoamingPenalty", + "filter": "culture(sauron),minion,your", + "amount": -1 + } }, { "type": "activated", @@ -381,9 +396,12 @@ "resistance": 6, "signet": "aragorn", "effects": { - "type": "modifyStrength", - "filter": "self,hasAttached(weapon)", - "amount": 2 + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "self,hasAttached(weapon)", + "amount": 2 + } } }, "1_306": { @@ -398,8 +416,11 @@ "resistance": 6, "signet": "frodo", "effects": { - "type": "opponentMayNotDiscard", - "filter": "your,culture(shire),tale" + "type": "modifier", + "modifier": { + "type": "opponentMayNotDiscard", + "filter": "your,culture(shire),tale" + } } } } \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set4.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set4.json index f6b907078..7bb60b834 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set4.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set4.json @@ -13,13 +13,16 @@ "damage+1" ], "effects": { - "type": "archeryTotal", - "side": "shadow", - "condition": { - "type": "controlsSite", - "player": "owner" - }, - "amount": 1 + "type": "modifier", + "modifier": { + "type": "archeryTotal", + "side": "shadow", + "condition": { + "type": "controlsSite", + "player": "owner" + }, + "amount": 1 + } } }, "4_218": { @@ -37,31 +40,40 @@ ], "effects": [ { - "type": "modifyStrength", - "condition": { - "type": "canSpotBurdens", - "amount": 4 - }, - "filter": "self", - "amount": 5 - }, - { - "type": "addKeyword", - "condition": { - "type": "canSpotBurdens", + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "condition": { + "type": "canSpotBurdens", + "amount": 4 + }, + "filter": "self", "amount": 5 - }, - "filter": "self", - "keyword": "fierce" + } }, { - "type": "addKeyword", - "condition": { - "type": "canSpotBurdens", - "amount": 6 - }, - "filter": "self", - "keyword": "damage+1" + "type": "modifier", + "modifier": { + "type": "addKeyword", + "condition": { + "type": "canSpotBurdens", + "amount": 5 + }, + "filter": "self", + "keyword": "fierce" + } + }, + { + "type": "modifier", + "modifier": { + "type": "addKeyword", + "condition": { + "type": "canSpotBurdens", + "amount": 6 + }, + "filter": "self", + "keyword": "damage+1" + } } ] } diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-dwarven.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-dwarven.json index f69823113..2d917dd4f 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-dwarven.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-dwarven.json @@ -301,15 +301,18 @@ "type": "condition", "keyword": "support area", "effects": { - "type": "addKeyword", - "filter": "dwarf", - "keyword": "damage", - "amount": { - "type": "limit", - "value": 2, + "type": "modifier", + "modifier": { + "type": "addKeyword", + "filter": "dwarf", + "keyword": "damage", "amount": { - "type": "countStacked", - "on": "self" + "type": "limit", + "value": 2, + "amount": { + "type": "countStacked", + "on": "self" + } } } } @@ -321,15 +324,18 @@ "type": "condition", "keyword": "support area", "effects": { - "type": "modifyStrength", - "condition": { - "type": "canSpot", - "filter": "self,hasStacked(culture(dwarven))" - }, - "filter": "dwarf", - "amount": { - "type": "forEachVitality", - "over": 3 + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "condition": { + "type": "canSpot", + "filter": "self,hasStacked(culture(dwarven))" + }, + "filter": "dwarf", + "amount": { + "type": "forEachVitality", + "over": 3 + } } } }, @@ -446,17 +452,23 @@ "amount": -1 }, { - "type": "modifyStrength", - "condition": { - "type": "location", - "filter": "or(mountain,underground)" - }, - "amount": 2 + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "condition": { + "type": "location", + "filter": "or(mountain,underground)" + }, + "amount": 2 + } }, { - "type": "canttakemorewoundsthan", - "phase": "skirmish", - "amount": 1 + "type": "modifier", + "modifier": { + "type": "canttakemorewoundsthan", + "phase": "skirmish", + "amount": 1 + } } ] }, @@ -471,9 +483,12 @@ "target": "dwarf", "effects": [ { - "type": "addKeyword", - "filter": "bearer,name(Gimli)", - "keyword": "damage+1" + "type": "modifier", + "modifier": { + "type": "addKeyword", + "filter": "bearer,name(Gimli)", + "keyword": "damage+1" + } }, { "type": "trigger", @@ -503,13 +518,16 @@ "keyword": "damage+1", "effects": [ { - "condition": { - "type": "canSpot", - "filter": "name(Gimli)" - }, - "filter": "self", - "type": "modifyStrength", - "amount": 1 + "type": "modifier", + "modifier": { + "condition": { + "type": "canSpot", + "filter": "name(Gimli)" + }, + "filter": "self", + "type": "modifyStrength", + "amount": 1 + } }, { "condition": { @@ -797,13 +815,16 @@ "type": "condition", "keyword": "support area", "effects": { - "type": "cantBeExerted", - "condition": { - "type": "canSpot", - "filter": "self,hasStackedCount(3,any)" - }, - "filter": "dwarf", - "by": "side(shadow)" + "type": "modifier", + "modifier": { + "type": "cantBeExerted", + "condition": { + "type": "canSpot", + "filter": "self,hasStackedCount(3,any)" + }, + "filter": "dwarf", + "by": "side(shadow)" + } } }, "40_30": { @@ -845,12 +866,15 @@ "resistance": 6, "keyword": "damage+1", "effects": { - "type": "modifyStrength", - "filter": "self", - "amount": 2, - "condition": { - "type": "canSpot", - "filter": "culture(dwarven),condition,hasStackedCount(3,culture(dwarven))" + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "self", + "amount": 2, + "condition": { + "type": "canSpot", + "filter": "culture(dwarven),condition,hasStackedCount(3,culture(dwarven))" + } } } }, diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-elven.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-elven.json index f85dcbba2..b2bab49ef 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-elven.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-elven.json @@ -38,12 +38,15 @@ "resistance": 8, "keyword": "ranger", "effects": { - "type": "modifyStrength", - "condition": { - "type": "location", - "filter": "or(river,forest)" - }, - "amount": 3 + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "condition": { + "type": "location", + "filter": "or(river,forest)" + }, + "amount": 3 + } } }, "40_35": { @@ -354,9 +357,12 @@ "possession": "ranged weapon", "target": "elf", "effects": { - "type": "addKeyword", - "filter": "bearer", - "keyword": "archer" + "type": "modifier", + "modifier": { + "type": "addKeyword", + "filter": "bearer", + "keyword": "archer" + } } }, "40_43": { @@ -542,8 +548,11 @@ }, "effects": [ { - "type": "cantBeOverwhelmedMultiplier", - "filter": "self,inSkirmishAgainst(nazgul)" + "type": "modifier", + "modifier": { + "type": "cantBeOverwhelmedMultiplier", + "filter": "self,inSkirmishAgainst(nazgul)" + } }, { "type": "activated", @@ -606,14 +615,20 @@ "target": "elf", "effects": [ { - "type": "addKeyword", - "filter": "bearer,name(Arwen)", - "keyword": "damage+1" + "type": "modifier", + "modifier": { + "type": "addKeyword", + "filter": "bearer,name(Arwen)", + "keyword": "damage+1" + } }, { - "type": "modifyStrength", - "filter": "bearer,inSkirmishAgainst(nazgul)", - "amount": 2 + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "bearer,inSkirmishAgainst(nazgul)", + "amount": 2 + } } ] }, @@ -746,9 +761,12 @@ "strength": 1, "target": "name(Legolas)", "effects": { - "type": "modifyStrength", - "filter": "wounded,minion,inSkirmishAgainst(bearer)", - "amount": -2 + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "wounded,minion,inSkirmishAgainst(bearer)", + "amount": -2 + } } }, "40_55": { diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-gandalf.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-gandalf.json index 5b41ac18b..30c4abd5f 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-gandalf.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-gandalf.json @@ -211,11 +211,14 @@ "vitality": 4, "resistance": 8, "effects": { - "type": "modifyStrength", - "filter": "self", - "amount": { - "type": "forEachYouCanSpot", - "filter": "hobbit,companion" + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "self", + "amount": { + "type": "forEachYouCanSpot", + "filter": "hobbit,companion" + } } } }, @@ -320,14 +323,20 @@ "target": "name(Gandalf)", "effects": [ { - "type": "modifyStrength", - "filter": "name(Gandalf),inSkirmishAgainst(or(orc,goblin))", - "amount": 2 + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "name(Gandalf),inSkirmishAgainst(or(orc,goblin))", + "amount": 2 + } }, { - "type": "addKeyword", - "filter": "name(Gandalf),inSkirmishAgainst(or(orc,goblin))", - "keyword": "damage+1" + "type": "modifier", + "modifier": { + "type": "addKeyword", + "filter": "name(Gandalf),inSkirmishAgainst(or(orc,goblin))", + "keyword": "damage+1" + } } ] }, @@ -341,10 +350,13 @@ "target": "name(Gandalf)", "effects": [ { - "type": "cantTakeMoreWoundsThan", - "filter": "name(Gandalf)", - "amount": 1, - "phase": "skirmish" + "type": "modifier", + "modifier": { + "type": "cantTakeMoreWoundsThan", + "filter": "name(Gandalf)", + "amount": 1, + "phase": "skirmish" + } }, { "type": "trigger", @@ -577,19 +589,22 @@ } }, { - "type": "modifyCost", - "condition": [ - { - "type": "canSpot", - "filter": "name(Gandalf)" - }, - { - "type": "haveInitiative", - "side": "free people" - } - ], - "filter": "side(free people),or(artifact,condition,possession)", - "amount": -1 + "type": "modifier", + "modifier": { + "type": "modifyCost", + "condition": [ + { + "type": "canSpot", + "filter": "name(Gandalf)" + }, + { + "type": "haveInitiative", + "side": "free people" + } + ], + "filter": "side(free people),or(artifact,condition,possession)", + "amount": -1 + } }, { "type": "trigger", @@ -604,6 +619,119 @@ } ] }, + "40_81": { + "title": "*Might of the Maiar", + "culture": "gandalf", + "cost": 1, + "type": "condition", + "strength": 1, + "keyword": "spell", + "target": "name(Gandalf)", + "effects": [ + { + "type": "modifier", + "modifier": { + "type": "addKeyword", + "filter": "bearer", + "keyword": "damage+1" + } + }, + { + "type": "trigger", + "trigger": { + "type": "losesInitiative", + "side": "free people" + }, + "effect": [ + { + "type": "discard", + "filter": "self" + }, + { + "type": "modifyStrength", + "filter": "all(name(Gandalf))", + "amount": -2, + "until": "start(regroup)" + } + ] + } + ] + }, + "40_82": { + "title": "*Mithrandir's Touch", + "culture": "gandalf", + "cost": 1, + "type": "condition", + "vitality": 1, + "condition": { + "type": "canSpot", + "filter": "name(Gandalf)" + }, + "target": "unbound,companion,not(name(Gandalf))", + "effects": { + "type": "activatedTrigger", + "condition": { + "type": "phase", + "phase": "skirmish" + }, + "trigger": { + "type": "aboutToTakeWound", + "filter": "bearer" + }, + "cost": { + "type": "discardFromHand", + "forced": false, + "count": 2, + "filter": "choose(culture(gandalf))" + }, + "effect": { + "type": "preventWound", + "filter": "choose(bearer)" + } + } + }, + "40_83": { + "title": "My Brave Hobbits", + "culture": "gandalf", + "cost": 2, + "type": "event", + "keyword": [ + "maneuver", + "spell" + ], + "condition": { + "type": "canSpot", + "count": 2, + "filter": "hobbit,companion" + }, + "effects": { + "type": "event", + "cost": { + "type": "exert", + "filter": "choose(name(Gandalf))", + "times": 2 + }, + "effect": [ + { + "type": "addModifier", + "modifier": { + "type": "modifyStrength", + "amount": 3, + "filter": "hobbit,companion" + }, + "until": "start(regroup)" + }, + { + "type": "addModifier", + "modifier": { + "type": "cantTakeMoreWoundsThan", + "filter": "hobbit,companion" + }, + "until": "start(regroup)" + } + ] + } + }, "40_86": { "title": "Protector of the West", "culture": "gandalf", diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-sauron.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-sauron.json index 0ac2a98c2..36e144244 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-sauron.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-sauron.json @@ -14,11 +14,14 @@ }, "effects": [ { - "type": "modifyStrength", - "amount": 2, - "condition": { - "type": "cantSpotFPCultures", - "amount": 3 + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "amount": 2, + "condition": { + "type": "cantSpotFPCultures", + "amount": 3 + } } }, { diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-shire.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-shire.json index 45c3684e1..67f9d2bcf 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-shire.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-shire.json @@ -154,13 +154,16 @@ "vitality": 4, "resistance": 8, "effects": { - "type": "modifyStrength", - "condition": { - "type": "location", - "filter": "forest" - }, - "filter": "self", - "amount": 2 + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "condition": { + "type": "location", + "filter": "forest" + }, + "filter": "self", + "amount": 2 + } } }, "40_265": { diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-wraith.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-wraith.json index 2d1518469..3def21a6d 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-wraith.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-wraith.json @@ -9,9 +9,12 @@ "strength": 2, "target": "nazgul", "effects": { - "type": "modifyStrength", - "filter": "bearer,inSkirmishAgainst(companion,resistanceLessThan(4))", - "amount": 2 + "type": "modifier", + "modifier": { + "type": "modifyStrength", + "filter": "bearer,inSkirmishAgainst(companion,resistanceLessThan(4))", + "amount": 2 + } } }, "40_211": { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/CardGenerationEnvironment.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/CardGenerationEnvironment.java index c29776a2f..d451a6790 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/CardGenerationEnvironment.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/CardGenerationEnvironment.java @@ -2,6 +2,7 @@ package com.gempukku.lotro.cards.build; import com.gempukku.lotro.cards.build.field.effect.EffectAppenderFactory; import com.gempukku.lotro.cards.build.field.effect.filter.FilterFactory; +import com.gempukku.lotro.cards.build.field.effect.modifier.ModifierSourceFactory; import com.gempukku.lotro.cards.build.field.effect.requirement.RequirementFactory; import com.gempukku.lotro.cards.build.field.effect.trigger.TriggerCheckerFactory; @@ -13,4 +14,6 @@ public interface CardGenerationEnvironment { RequirementFactory getRequirementFactory(); TriggerCheckerFactory getTriggerCheckerFactory(); + + ModifierSourceFactory getModifierSourceFactory(); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/LotroCardBlueprintBuilder.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/LotroCardBlueprintBuilder.java index 1db7a69ff..d151f438e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/LotroCardBlueprintBuilder.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/LotroCardBlueprintBuilder.java @@ -3,6 +3,7 @@ package com.gempukku.lotro.cards.build; import com.gempukku.lotro.cards.build.field.*; import com.gempukku.lotro.cards.build.field.effect.EffectAppenderFactory; import com.gempukku.lotro.cards.build.field.effect.filter.FilterFactory; +import com.gempukku.lotro.cards.build.field.effect.modifier.ModifierSourceFactory; import com.gempukku.lotro.cards.build.field.effect.requirement.RequirementFactory; import com.gempukku.lotro.cards.build.field.effect.trigger.TriggerCheckerFactory; import com.gempukku.lotro.game.LotroCardBlueprint; @@ -19,6 +20,7 @@ public class LotroCardBlueprintBuilder implements CardGenerationEnvironment { private FilterFactory filterFactory = new FilterFactory(); private RequirementFactory requirementFactory = new RequirementFactory(); private TriggerCheckerFactory triggerCheckerFactory = new TriggerCheckerFactory(); + private ModifierSourceFactory modifierSourceFactory = new ModifierSourceFactory(); public LotroCardBlueprintBuilder() { fieldProcessors.put("title", new TitleFieldProcessor()); @@ -81,4 +83,9 @@ public class LotroCardBlueprintBuilder implements CardGenerationEnvironment { public TriggerCheckerFactory getTriggerCheckerFactory() { return triggerCheckerFactory; } + + @Override + public ModifierSourceFactory getModifierSourceFactory() { + return modifierSourceFactory; + } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/EffectFieldProcessor.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/EffectFieldProcessor.java index 7cb17bc33..988669fc5 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/EffectFieldProcessor.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/EffectFieldProcessor.java @@ -5,7 +5,8 @@ import com.gempukku.lotro.cards.build.CardGenerationEnvironment; import com.gempukku.lotro.cards.build.FieldProcessor; import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; import com.gempukku.lotro.cards.build.field.effect.*; -import com.gempukku.lotro.cards.build.field.effect.modifier.*; +import com.gempukku.lotro.cards.build.field.effect.modifier.Modifier; +import com.gempukku.lotro.cards.build.field.effect.modifier.ModifyOwnCost; import org.json.simple.JSONObject; import java.util.HashMap; @@ -19,17 +20,9 @@ public class EffectFieldProcessor implements FieldProcessor { effectProcessors.put("activatedtrigger", new ActivatedTriggerEffectProcessor()); effectProcessors.put("activated", new ActivatedEffectProcessor()); effectProcessors.put("event", new EventEffectProcessor()); - effectProcessors.put("modifystrength", new ModifyStrength()); - effectProcessors.put("modifyroamingpenalty", new ModifyRoamingPenalty()); - effectProcessors.put("addkeyword", new AddKeyword()); - effectProcessors.put("archerytotal", new ArcheryTotal()); - effectProcessors.put("opponentmaynotdiscard", new OpponentMayNotDiscard()); effectProcessors.put("modifyowncost", new ModifyOwnCost()); - effectProcessors.put("canttakemorewoundsthan", new CantTakeMoreWoundsThan()); - effectProcessors.put("cantbeexerted", new CantBeExerted()); effectProcessors.put("extracost", new ExtraCost()); - effectProcessors.put("cantbeoverwhelmedmultiplier", new CantBeOverwhelmedMultiplier()); - effectProcessors.put("modifycost", new ModifyCost()); + effectProcessors.put("modifier", new Modifier()); } @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java index 8bbcf80e6..ef26755ae 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java @@ -73,6 +73,7 @@ public class EffectAppenderFactory { effectAppenderProducers.put("canparticipateinarcheryfireandskirmishes", new CanParticipateInArcheryFireAndSkirmishes()); effectAppenderProducers.put("revealrandomcardsfromhand", new RevealRandomCardsFromHand()); effectAppenderProducers.put("putcardsfromdeckintohand", new PutCardsFromDeckIntoHand()); + effectAppenderProducers.put("addmodifier", new AddModifier()); } public EffectAppender getEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AddModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AddModifier.java new file mode 100644 index 000000000..23ad786f0 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AddModifier.java @@ -0,0 +1,35 @@ +package com.gempukku.lotro.cards.build.field.effect.appender; + +import com.gempukku.lotro.cards.build.ActionContext; +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.ModifierSource; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.cards.build.field.effect.EffectAppender; +import com.gempukku.lotro.cards.build.field.effect.EffectAppenderProducer; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.TimeResolver; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.effects.AddUntilModifierEffect; +import com.gempukku.lotro.logic.modifiers.Modifier; +import com.gempukku.lotro.logic.timing.Effect; +import org.json.simple.JSONObject; + +public class AddModifier implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "modifier", "until"); + + final JSONObject modifierObj = (JSONObject) effectObject.get("modifier"); + final TimeResolver.Time until = TimeResolver.resolveTime(effectObject.get("until"), "end(current)"); + + ModifierSource modifierSource = environment.getModifierSourceFactory().getModifier(modifierObj, environment); + + return new DelayedAppender() { + @Override + protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { + final Modifier modifier = modifierSource.getModifier(actionContext); + return new AddUntilModifierEffect(modifier, until); + } + }; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/AddKeyword.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/AddKeyword.java index fec399763..30cc7022f 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/AddKeyword.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/AddKeyword.java @@ -1,7 +1,6 @@ package com.gempukku.lotro.cards.build.field.effect.modifier; import com.gempukku.lotro.cards.build.*; -import com.gempukku.lotro.cards.build.field.EffectProcessor; import com.gempukku.lotro.cards.build.field.FieldUtils; import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver; import com.gempukku.lotro.common.Keyword; @@ -10,14 +9,14 @@ import com.gempukku.lotro.logic.modifiers.Modifier; import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator; import org.json.simple.JSONObject; -public class AddKeyword implements EffectProcessor { +public class AddKeyword implements ModifierSourceProducer { @Override - public void processEffect(JSONObject effectObject, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(effectObject, "filter", "condition", "keyword", "amount"); + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter", "condition", "keyword", "amount"); - final JSONObject[] conditionArray = FieldUtils.getObjectArray(effectObject.get("condition"), "condition"); - final String filter = FieldUtils.getString(effectObject.get("filter"), "filter", "self"); - final String keywordString = FieldUtils.getString(effectObject.get("keyword"), "keyword"); + final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition"); + final String filter = FieldUtils.getString(object.get("filter"), "filter", "self"); + final String keywordString = FieldUtils.getString(object.get("keyword"), "keyword"); final String[] keywordSplit = keywordString.split("\\+"); Keyword keyword = FieldUtils.getEnum(Keyword.class, keywordSplit[0], "keyword"); @@ -25,13 +24,12 @@ public class AddKeyword implements EffectProcessor { if (keywordSplit.length == 2) value = Integer.parseInt(keywordSplit[1]); - final ValueSource amount = ValueResolver.resolveEvaluator(effectObject.get("amount"), value, environment); + final ValueSource amount = ValueResolver.resolveEvaluator(object.get("amount"), value, environment); final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); - blueprint.appendInPlayModifier( - new ModifierSource() { + return new ModifierSource() { @Override public Modifier getModifier(ActionContext actionContext) { final Evaluator evaluator = amount.getEvaluator(actionContext); @@ -39,6 +37,6 @@ public class AddKeyword implements EffectProcessor { filterableSource.getFilterable(actionContext), new RequirementCondition(requirements, actionContext), keyword, evaluator); } - }); + }; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ArcheryTotal.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ArcheryTotal.java index 6f687244b..bba9db114 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ArcheryTotal.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ArcheryTotal.java @@ -1,32 +1,30 @@ package com.gempukku.lotro.cards.build.field.effect.modifier; import com.gempukku.lotro.cards.build.*; -import com.gempukku.lotro.cards.build.field.EffectProcessor; import com.gempukku.lotro.cards.build.field.FieldUtils; import com.gempukku.lotro.common.Side; import com.gempukku.lotro.logic.modifiers.ArcheryTotalModifier; import com.gempukku.lotro.logic.modifiers.Modifier; import org.json.simple.JSONObject; -public class ArcheryTotal implements EffectProcessor { +public class ArcheryTotal implements ModifierSourceProducer { @Override - public void processEffect(JSONObject effectObject, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(effectObject, "amount", "condition", "side"); + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "amount", "condition", "side"); - final JSONObject[] conditionArray = FieldUtils.getObjectArray(effectObject.get("condition"), "condition"); - final int amount = FieldUtils.getInteger(effectObject.get("amount"), "amount"); - final Side side = FieldUtils.getEnum(Side.class, effectObject.get("side"), "side"); + final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition"); + final int amount = FieldUtils.getInteger(object.get("amount"), "amount"); + final Side side = FieldUtils.getEnum(Side.class, object.get("side"), "side"); final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); - blueprint.appendInPlayModifier( - new ModifierSource() { + return new ModifierSource() { @Override public Modifier getModifier(ActionContext actionContext) { return new ArcheryTotalModifier(actionContext.getSource(), side, new RequirementCondition(requirements, actionContext), amount); } - }); + }; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantBeExerted.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantBeExerted.java index 1dfaed53c..f11487255 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantBeExerted.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantBeExerted.java @@ -1,31 +1,28 @@ package com.gempukku.lotro.cards.build.field.effect.modifier; import com.gempukku.lotro.cards.build.*; -import com.gempukku.lotro.cards.build.field.EffectProcessor; import com.gempukku.lotro.cards.build.field.FieldUtils; import com.gempukku.lotro.logic.modifiers.CantExertWithCardModifier; import org.json.simple.JSONObject; -public class CantBeExerted implements EffectProcessor { +public class CantBeExerted implements ModifierSourceProducer { @Override - public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(value, "filter", "condition", "by"); + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter", "condition", "by"); - final JSONObject[] conditionArray = FieldUtils.getObjectArray(value.get("condition"), "condition"); - final String filter = FieldUtils.getString(value.get("filter"), "filter", "self"); - final String byFilter = FieldUtils.getString(value.get("by"), "by", "any"); + final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition"); + final String filter = FieldUtils.getString(object.get("filter"), "filter", "self"); + final String byFilter = FieldUtils.getString(object.get("by"), "by", "any"); final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); final FilterableSource byFilterableSource = environment.getFilterFactory().generateFilter(byFilter, environment); final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); - blueprint.appendInPlayModifier( - (actionContext) -> { + return (actionContext) -> { return new CantExertWithCardModifier(actionContext.getSource(), filterableSource.getFilterable(actionContext), new RequirementCondition(requirements, actionContext), byFilterableSource.getFilterable(actionContext)); - }); - + }; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantBeOverwhelmedMultiplier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantBeOverwhelmedMultiplier.java index 810bf40c0..fede81ebe 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantBeOverwhelmedMultiplier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantBeOverwhelmedMultiplier.java @@ -1,31 +1,28 @@ package com.gempukku.lotro.cards.build.field.effect.modifier; import com.gempukku.lotro.cards.build.*; -import com.gempukku.lotro.cards.build.field.EffectProcessor; import com.gempukku.lotro.cards.build.field.FieldUtils; import com.gempukku.lotro.common.Filterable; import com.gempukku.lotro.logic.modifiers.Modifier; import com.gempukku.lotro.logic.modifiers.OverwhelmedByMultiplierModifier; import org.json.simple.JSONObject; -public class CantBeOverwhelmedMultiplier implements EffectProcessor { +public class CantBeOverwhelmedMultiplier implements ModifierSourceProducer { @Override - public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(value, "filter", "multiplier"); + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter", "multiplier"); - final String filter = FieldUtils.getString(value.get("filter"), "filter"); - final int multiplier = FieldUtils.getInteger(value.get("multiplier"), "multiplier", 3); + final String filter = FieldUtils.getString(object.get("filter"), "filter"); + final int multiplier = FieldUtils.getInteger(object.get("multiplier"), "multiplier", 3); final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); - blueprint.appendInPlayModifier( - new ModifierSource() { + return new ModifierSource() { @Override public Modifier getModifier(ActionContext actionContext) { final Filterable filterable = filterableSource.getFilterable(actionContext); return new OverwhelmedByMultiplierModifier(actionContext.getSource(), filterable, multiplier); } - } - ); + }; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantTakeMoreWoundsThan.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantTakeMoreWoundsThan.java index af4d73515..45f2139df 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantTakeMoreWoundsThan.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/CantTakeMoreWoundsThan.java @@ -1,34 +1,31 @@ package com.gempukku.lotro.cards.build.field.effect.modifier; import com.gempukku.lotro.cards.build.*; -import com.gempukku.lotro.cards.build.field.EffectProcessor; import com.gempukku.lotro.cards.build.field.FieldUtils; import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver; import com.gempukku.lotro.common.Phase; import com.gempukku.lotro.logic.modifiers.CantTakeMoreThanXWoundsModifier; import org.json.simple.JSONObject; -public class CantTakeMoreWoundsThan implements EffectProcessor { +public class CantTakeMoreWoundsThan implements ModifierSourceProducer { @Override - public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(value, "filter", "phase", "condition", "amount"); + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter", "phase", "condition", "amount"); - final ValueSource valueSource = ValueResolver.resolveEvaluator(value.get("amount"), 1, environment); - final JSONObject[] conditionArray = FieldUtils.getObjectArray(value.get("condition"), "condition"); - final String filter = FieldUtils.getString(value.get("filter"), "filter", "self"); - final Phase phase = FieldUtils.getEnum(Phase.class, value.get("phase"), "phase"); + final ValueSource objectSource = ValueResolver.resolveEvaluator(object.get("amount"), 1, environment); + final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition"); + final String filter = FieldUtils.getString(object.get("filter"), "filter", "self"); + final Phase phase = FieldUtils.getEnum(Phase.class, object.get("phase"), "phase"); final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); - blueprint.appendInPlayModifier( - (actionContext) -> { + return (actionContext) -> { return new CantTakeMoreThanXWoundsModifier(actionContext.getSource(), phase, - valueSource.getEvaluator(actionContext) + objectSource.getEvaluator(actionContext) .evaluateExpression(actionContext.getGame(), null), new RequirementCondition(requirements, actionContext), filterableSource.getFilterable(actionContext)); - }); - + }; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/Modifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/Modifier.java new file mode 100644 index 000000000..d97bdeae0 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/Modifier.java @@ -0,0 +1,21 @@ +package com.gempukku.lotro.cards.build.field.effect.modifier; + +import com.gempukku.lotro.cards.build.BuiltLotroCardBlueprint; +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.ModifierSource; +import com.gempukku.lotro.cards.build.field.EffectProcessor; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import org.json.simple.JSONObject; + +public class Modifier implements EffectProcessor { + @Override + public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(value, "modifier"); + + JSONObject jsonObject = (JSONObject) value.get("modifier"); + final ModifierSource modifier = environment.getModifierSourceFactory().getModifier(jsonObject, environment); + + blueprint.appendInPlayModifier(modifier); + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java new file mode 100644 index 000000000..ee51027aa --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceFactory.java @@ -0,0 +1,34 @@ +package com.gempukku.lotro.cards.build.field.effect.modifier; + +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.ModifierSource; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import org.json.simple.JSONObject; + +import java.util.HashMap; +import java.util.Map; + +public class ModifierSourceFactory { + private Map modifierProducers = new HashMap<>(); + + public ModifierSourceFactory() { + modifierProducers.put("addkeyword", new AddKeyword()); + modifierProducers.put("archerytotal", new ArcheryTotal()); + modifierProducers.put("cantbeexerted", new CantBeExerted()); + modifierProducers.put("cantbeoverwhelmedmultiplier", new CantBeOverwhelmedMultiplier()); + modifierProducers.put("canttakemorewoundsthan", new CantTakeMoreWoundsThan()); + modifierProducers.put("modifycost", new ModifyCost()); + modifierProducers.put("modifyroamingpenalty", new ModifyRoamingPenalty()); + modifierProducers.put("modifystrength", new ModifyStrength()); + modifierProducers.put("opponentmaynotdiscard", new OpponentMayNotDiscard()); + } + + public ModifierSource getModifier(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + final String type = FieldUtils.getString(object.get("type"), "type"); + final ModifierSourceProducer modifierSourceProducer = modifierProducers.get(type.toLowerCase()); + if (modifierSourceProducer == null) + throw new InvalidCardDefinitionException("Unable to resolve modifier of type: " + type); + return modifierSourceProducer.getModifierSource(object, environment); + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceProducer.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceProducer.java new file mode 100644 index 000000000..5fa1d21bd --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifierSourceProducer.java @@ -0,0 +1,10 @@ +package com.gempukku.lotro.cards.build.field.effect.modifier; + +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.ModifierSource; +import org.json.simple.JSONObject; + +public interface ModifierSourceProducer { + ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException; +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyCost.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyCost.java index 9134f9a31..c82b73b4f 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyCost.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyCost.java @@ -1,7 +1,6 @@ package com.gempukku.lotro.cards.build.field.effect.modifier; import com.gempukku.lotro.cards.build.*; -import com.gempukku.lotro.cards.build.field.EffectProcessor; import com.gempukku.lotro.cards.build.field.FieldUtils; import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver; import com.gempukku.lotro.common.Filterable; @@ -9,24 +8,23 @@ import com.gempukku.lotro.logic.modifiers.TwilightCostModifier; import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator; import org.json.simple.JSONObject; -public class ModifyCost implements EffectProcessor { +public class ModifyCost implements ModifierSourceProducer { @Override - public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(value, "condition", "filter", "amount"); + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "condition", "filter", "amount"); - final JSONObject[] conditionArray = FieldUtils.getObjectArray(value.get("condition"), "condition"); - final String filter = FieldUtils.getString(value.get("filter"), "filter"); + final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition"); + final String filter = FieldUtils.getString(object.get("filter"), "filter"); final Requirement[] conditions = environment.getRequirementFactory().getRequirements(conditionArray, environment); final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); - final ValueSource amountSource = ValueResolver.resolveEvaluator(value.get("amount"), 0, environment); + final ValueSource amountSource = ValueResolver.resolveEvaluator(object.get("amount"), 0, environment); - blueprint.appendInPlayModifier( - actionContext -> { + return actionContext -> { final Filterable filterable = filterableSource.getFilterable(actionContext); final RequirementCondition requirementCondition = new RequirementCondition(conditions, actionContext); final Evaluator evaluator = amountSource.getEvaluator(actionContext); return new TwilightCostModifier(actionContext.getSource(), filterable, requirementCondition, evaluator); - }); + }; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyRoamingPenalty.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyRoamingPenalty.java index 6cfb1488b..77490c3fb 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyRoamingPenalty.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyRoamingPenalty.java @@ -1,32 +1,30 @@ package com.gempukku.lotro.cards.build.field.effect.modifier; import com.gempukku.lotro.cards.build.*; -import com.gempukku.lotro.cards.build.field.EffectProcessor; import com.gempukku.lotro.cards.build.field.FieldUtils; import com.gempukku.lotro.logic.modifiers.Modifier; import com.gempukku.lotro.logic.modifiers.RoamingPenaltyModifier; import org.json.simple.JSONObject; -public class ModifyRoamingPenalty implements EffectProcessor { +public class ModifyRoamingPenalty implements ModifierSourceProducer { @Override - public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(value, "filter", "condition", "amount"); + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter", "condition", "amount"); - final int amount = FieldUtils.getInteger(value.get("amount"), "amount"); - final JSONObject[] conditionArray = FieldUtils.getObjectArray(value.get("condition"), "condition"); - final String filter = FieldUtils.getString(value.get("filter"), "filter", "self"); + final int amount = FieldUtils.getInteger(object.get("amount"), "amount"); + final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition"); + final String filter = FieldUtils.getString(object.get("filter"), "filter", "self"); final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); - blueprint.appendInPlayModifier( - new ModifierSource() { + return new ModifierSource() { @Override public Modifier getModifier(ActionContext actionContext) { return new RoamingPenaltyModifier(actionContext.getSource(), filterableSource.getFilterable(actionContext), new RequirementCondition(requirements, actionContext), amount); } - }); + }; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyStrength.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyStrength.java index fde724a56..11eac37b3 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyStrength.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyStrength.java @@ -1,31 +1,29 @@ package com.gempukku.lotro.cards.build.field.effect.modifier; import com.gempukku.lotro.cards.build.*; -import com.gempukku.lotro.cards.build.field.EffectProcessor; import com.gempukku.lotro.cards.build.field.FieldUtils; import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver; import com.gempukku.lotro.logic.modifiers.StrengthModifier; import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator; import org.json.simple.JSONObject; -public class ModifyStrength implements EffectProcessor { +public class ModifyStrength implements ModifierSourceProducer { @Override - public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(value, "filter", "condition", "amount"); + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter", "condition", "amount"); - final ValueSource valueSource = ValueResolver.resolveEvaluator(value.get("amount"), 1, environment); - final JSONObject[] conditionArray = FieldUtils.getObjectArray(value.get("condition"), "condition"); - final String filter = FieldUtils.getString(value.get("filter"), "filter", "self"); + final ValueSource valueSource = ValueResolver.resolveEvaluator(object.get("amount"), 1, environment); + final JSONObject[] conditionArray = FieldUtils.getObjectArray(object.get("condition"), "condition"); + final String filter = FieldUtils.getString(object.get("filter"), "filter", "self"); final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); - blueprint.appendInPlayModifier( - (actionContext) -> { + return (actionContext) -> { final Evaluator evaluator = valueSource.getEvaluator(actionContext); return new StrengthModifier(actionContext.getSource(), filterableSource.getFilterable(actionContext), new RequirementCondition(requirements, actionContext), evaluator); - }); + }; } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/OpponentMayNotDiscard.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/OpponentMayNotDiscard.java index 05caf88bf..296a6b280 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/OpponentMayNotDiscard.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/OpponentMayNotDiscard.java @@ -1,27 +1,25 @@ package com.gempukku.lotro.cards.build.field.effect.modifier; -import com.gempukku.lotro.cards.build.BuiltLotroCardBlueprint; import com.gempukku.lotro.cards.build.CardGenerationEnvironment; import com.gempukku.lotro.cards.build.FilterableSource; import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; -import com.gempukku.lotro.cards.build.field.EffectProcessor; +import com.gempukku.lotro.cards.build.ModifierSource; import com.gempukku.lotro.cards.build.field.FieldUtils; import com.gempukku.lotro.logic.modifiers.CantDiscardFromPlayByPlayerModifier; import org.json.simple.JSONObject; -public class OpponentMayNotDiscard implements EffectProcessor { +public class OpponentMayNotDiscard implements ModifierSourceProducer { @Override - public void processEffect(JSONObject effectObject, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(effectObject, "filter"); + public ModifierSource getModifierSource(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "filter"); - final String filter = FieldUtils.getString(effectObject.get("filter"), "filter", "self"); + final String filter = FieldUtils.getString(object.get("filter"), "filter", "self"); final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); - blueprint.appendInPlayModifier( - (actionContext) -> { + return (actionContext) -> { return new CantDiscardFromPlayByPlayerModifier(actionContext.getSource(), "Can't be discarded by opponent", filterableSource.getFilterable(actionContext), actionContext.getPerformingPlayer()); - }); + }; } }