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 e1d14cf83..5b41ac18b 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 @@ -562,6 +562,48 @@ } ] }, + "40_80": { + "title": "*Keep it Secret, Keep it Safe", + "culture": "gandalf", + "cost": 1, + "type": "condition", + "keyword": "support area", + "effects": [ + { + "type": "extraCost", + "cost": { + "type": "exert", + "filter": "choose(name(Gandalf))" + } + }, + { + "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", + "trigger": { + "type": "losesInitiative", + "side": "free people" + }, + "effect": { + "type": "discard", + "filter": "self" + } + } + ] + }, "40_86": { "title": "Protector of the West", "culture": "gandalf", 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 fb047c440..7cb17bc33 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 @@ -29,6 +29,7 @@ public class EffectFieldProcessor implements FieldProcessor { effectProcessors.put("cantbeexerted", new CantBeExerted()); effectProcessors.put("extracost", new ExtraCost()); effectProcessors.put("cantbeoverwhelmedmultiplier", new CantBeOverwhelmedMultiplier()); + effectProcessors.put("modifycost", new ModifyCost()); } @Override 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 new file mode 100644 index 000000000..9134f9a31 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/modifier/ModifyCost.java @@ -0,0 +1,32 @@ +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; +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 { + @Override + public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(value, "condition", "filter", "amount"); + + final JSONObject[] conditionArray = FieldUtils.getObjectArray(value.get("condition"), "condition"); + final String filter = FieldUtils.getString(value.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); + + blueprint.appendInPlayModifier( + 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/requirement/HaveInitiative.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HaveInitiative.java new file mode 100644 index 000000000..7a65fa3cb --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/HaveInitiative.java @@ -0,0 +1,20 @@ +package com.gempukku.lotro.cards.build.field.effect.requirement; + +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.Requirement; +import com.gempukku.lotro.cards.build.field.FieldUtils; +import com.gempukku.lotro.common.Side; +import com.gempukku.lotro.logic.timing.PlayConditions; +import org.json.simple.JSONObject; + +public class HaveInitiative implements RequirementProducer { + @Override + public Requirement getPlayRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(object, "side"); + + Side side = FieldUtils.getEnum(Side.class, object.get("side"), "side"); + + return (actionContext) -> PlayConditions.hasInitiative(actionContext.getGame(), side); + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/RequirementFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/RequirementFactory.java index ea96fe006..9594ccb18 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/RequirementFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/requirement/RequirementFactory.java @@ -23,6 +23,7 @@ public class RequirementFactory { requirementProducers.put("ringisactive", new RingIsActive()); requirementProducers.put("memorymatches", new MemoryMatches()); requirementProducers.put("cantspotfpcultures", new CantSpotFPCultures()); + requirementProducers.put("haveinitiative", new HaveInitiative()); } public Requirement getRequirement(JSONObject object, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {