diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40.json index 07764561d..4a95502d9 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40.json @@ -445,6 +445,82 @@ } } }, + "40_14": { + "title": "Dwarven Vigor", + "unique": true, + "side": "free people", + "culture": "dwarven", + "cost": 1, + "type": "condition", + "keyword": "support area", + "effects": { + "type": "modifyStrength", + "condition": { + "type": "canSpot", + "filter": "self,hasStacked(culture(dwarven))" + }, + "filter": "dwarf", + "amount": { + "type": "forEachVitality", + "over": 3 + } + } + }, + "40_15": { + "title": "Endurance of Dwarves", + "side": "free people", + "culture": "dwarven", + "cost": 1, + "type": "condition", + "vitality": 1, + "target": "dwarf", + "effects": { + "type": "activated", + "phase": "skirmish", + "cost": [ + { + "type": "memorize", + "filter": "hasAttached(self)", + "memory": "bearer" + }, + { + "type": "discard", + "filter": "self" + } + ], + "effect": { + "type": "modifyStrength", + "filter": "memory(bearer)", + "amount": 1 + } + } + }, + "40_16": { + "title": "Festive Folk", + "side": "free people", + "culture": "dwarven", + "cost": 1, + "type": "event", + "keyword": "fellowship", + "effects": { + "type": "event", + "cost": [ + { + "type": "exert", + "filter": "choose(dwarf)" + }, + { + "type": "discardStackedCards", + "count": 1, + "on": "culture(dwarven),condition" + } + ], + "effect": { + "type": "removeBurdens", + "amount": 1 + } + } + }, "40_184": { "title": "Black Steed", "subtitle": "Bred to Serve", 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 88ee879af..ba7bc3aab 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 @@ -41,6 +41,7 @@ public class EffectAppenderFactory { effectAppenderProducers.put("putstackedcardsintohand", new PutStackedCardsIntoHand()); effectAppenderProducers.put("condition", new ConditionEffect()); effectAppenderProducers.put("drawcards", new DrawCards()); + effectAppenderProducers.put("removeburdens", new RemoveBurdens()); } 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/RemoveBurdens.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RemoveBurdens.java new file mode 100644 index 000000000..64648aace --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/RemoveBurdens.java @@ -0,0 +1,58 @@ +package com.gempukku.lotro.cards.build.field.effect.appender; + +import com.gempukku.lotro.cards.build.*; +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.PlayerResolver; +import com.gempukku.lotro.cards.build.field.effect.appender.resolver.ValueResolver; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.effects.RemoveBurdenEffect; +import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator; +import com.gempukku.lotro.logic.timing.Effect; +import com.gempukku.lotro.logic.timing.EffectResult; +import org.json.simple.JSONObject; + +public class RemoveBurdens implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "player", "amount"); + + final String player = FieldUtils.getString(effectObject.get("player"), "player", "owner"); + final PlayerSource playerSource = PlayerResolver.resolvePlayer(player, environment); + final ValueSource valueSource = ValueResolver.resolveEvaluator(effectObject.get("amount"), 1, environment); + + return new DelayedAppender() { + @Override + protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { + final String removingPlayer = playerSource.getPlayer(playerId, game, self, effectResult, effect); + final Evaluator evaluator = valueSource.getEvaluator(null, playerId, game, self, effectResult, effect); + return new RemoveBurdenEffect(removingPlayer, self, evaluator.evaluateExpression(game, null)); + } + + @Override + public boolean isPlayableInFull(String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { + final Evaluator evaluator = valueSource.getEvaluator(null, playerId, game, self, effectResult, effect); + final int burdens = evaluator.evaluateExpression(game, null); + return game.getModifiersQuerying().canRemoveBurden(game, self) + && game.getGameState().getBurdens() >= burdens; + } + }; + } + + @Override + public Requirement createCostRequirement(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "player", "amount"); + + final ValueSource valueSource = ValueResolver.resolveEvaluator(effectObject.get("amount"), 1, environment); + + return (action, playerId, game, self, effectResult, effect) -> { + final Evaluator evaluator = valueSource.getEvaluator(null, playerId, game, self, effectResult, effect); + final int burdens = evaluator.evaluateExpression(game, null); + return game.getModifiersQuerying().canRemoveBurden(game, self) + && game.getGameState().getBurdens() >= burdens; + }; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java index 3cf35046b..da99fe089 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/ValueResolver.java @@ -83,6 +83,9 @@ public class ValueResolver { final Filterable on1 = onFilter.getFilterable(playerId, game, self, effectResult, effect); return new CountStackedEvaluator(on1, Filters.any); }; + } else if (type.equalsIgnoreCase("forEachVitality")) { + final int over = FieldUtils.getInteger(object.get("over"), "over", 0); + return (action, playerId, game, self, effectResult, effect) -> (game1, cardAffected) -> Math.max(0, game1.getModifiersQuerying().getVitality(game1, cardAffected) - over); } throw new InvalidCardDefinitionException("Unrecognized type of an evaluator " + type); } 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 89ddead4c..d2e5402a8 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 @@ -3,10 +3,9 @@ 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.game.PhysicalCard; -import com.gempukku.lotro.game.state.LotroGame; -import com.gempukku.lotro.logic.modifiers.Modifier; +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 { @@ -14,7 +13,7 @@ public class ModifyStrength implements EffectProcessor { public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { FieldUtils.validateAllowedFields(value, "filter", "condition", "amount"); - final int amount = FieldUtils.getInteger(value.get("amount"), "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"); @@ -22,13 +21,11 @@ public class ModifyStrength implements EffectProcessor { final Requirement[] requirements = environment.getRequirementFactory().getRequirements(conditionArray, environment); blueprint.appendInPlayModifier( - new ModifierSource() { - @Override - public Modifier getModifier(LotroGame game, PhysicalCard self) { - return new StrengthModifier(self, - filterableSource.getFilterable(null, game, self, null, null), - new RequirementCondition(requirements, null, self, null, null), amount); - } + (game, self) -> { + final Evaluator evaluator = valueSource.getEvaluator(null, null, game, self, null, null); + return new StrengthModifier(self, + filterableSource.getFilterable(null, game, self, null, null), + new RequirementCondition(requirements, null, self, null, null), evaluator); }); } }