Reworked all modifiers to use them both as static effects, as well as results of actions

This commit is contained in:
marcin.sciesinski
2019-09-03 16:01:00 -07:00
parent 9f1a467d86
commit 079ac387ef
25 changed files with 562 additions and 267 deletions

View File

@@ -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"
}
}
}
}

View File

@@ -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"
}
}
]
}

View File

@@ -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))"
}
}
}
},

View File

@@ -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": {

View File

@@ -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",

View File

@@ -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
}
}
},
{

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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();
}

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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 {

View File

@@ -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);
}
};
}
}

View File

@@ -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);
}
});
};
}
}

View File

@@ -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);
}
});
};
}
}

View File

@@ -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));
});
};
}
}

View File

@@ -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);
}
}
);
};
}
}

View File

@@ -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));
});
};
}
}

View File

@@ -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);
}
}

View File

@@ -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<String, ModifierSourceProducer> 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);
}
}

View File

@@ -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;
}

View File

@@ -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);
});
};
}
}

View File

@@ -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);
}
});
};
}
}

View File

@@ -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);
});
};
}
}

View File

@@ -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());
});
};
}
}