From 41028ac8d406458cd0ba33d2f72ebc8497c2bf18 Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Thu, 29 Aug 2019 21:21:27 -0700 Subject: [PATCH] Multiply ValueSource --- .../src/main/web/cards/set40.json | 28 +++++++++++++++++++ .../effect/appender/DiscardFromPlay.java | 13 ++++++++- .../field/effect/appender/DrawCards.java | 3 +- .../effect/appender/ModifyArcheryTotal.java | 7 ++++- .../appender/resolver/ValueResolver.java | 9 +++--- 5 files changed, 53 insertions(+), 7 deletions(-) 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 718632698..5593c17a0 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 @@ -857,6 +857,34 @@ "by": "side(shadow)" } }, + "40_30": { + "title": "Take Cover!", + "side": "free people", + "culture": "dwarven", + "cost": 2, + "type": "event", + "keyword": "archery", + "effects": { + "type": "event", + "cost": { + "type": "discard", + "filter": "choose(culture(dwarven),condition)", + "memorizeStackedCards": "stackedCards" + }, + "effect": { + "type": "modifyArcheryTotal", + "side": "shadow", + "amount": { + "type": "multiply", + "source": { + "type": "forEachInMemory", + "memory": "stackedCards" + }, + "multiplier": -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/appender/DiscardFromPlay.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardFromPlay.java index eb5675d56..c3506659a 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardFromPlay.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DiscardFromPlay.java @@ -18,15 +18,18 @@ import com.gempukku.lotro.logic.timing.EffectResult; import org.json.simple.JSONObject; import java.util.Collection; +import java.util.LinkedList; +import java.util.List; public class DiscardFromPlay implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(effectObject, "count", "filter", "memorize"); + FieldUtils.validateAllowedFields(effectObject, "count", "filter", "memorize", "memorizeStackedCards"); final ValueSource valueSource = ValueResolver.resolveEvaluator(effectObject.get("count"), 1, environment); final String filter = FieldUtils.getString(effectObject.get("filter"), "filter"); final String memory = FieldUtils.getString(effectObject.get("memorize"), "memorize", "_temp"); + final String stackedCardsMemory = FieldUtils.getString(effectObject.get("memorizeStackedCards"), "memorizeStackedCards"); MultiEffectAppender result = new MultiEffectAppender(); @@ -39,6 +42,14 @@ public class DiscardFromPlay implements EffectAppenderProducer { @Override protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { final Collection cardsFromMemory = action.getCardsFromMemory(memory); + if (stackedCardsMemory != null) { + List stackedCards = new LinkedList<>(); + for (PhysicalCard physicalCard : cardsFromMemory) { + stackedCards.addAll(game.getGameState().getStackedCards(physicalCard)); + } + + action.setCardMemory(stackedCardsMemory, stackedCards); + } return new DiscardCardsFromPlayEffect(playerId, self, Filters.in(cardsFromMemory)); } }); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DrawCards.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DrawCards.java index 065417b5e..b3abd8229 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DrawCards.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/DrawCards.java @@ -41,7 +41,8 @@ public class DrawCards implements EffectAppenderProducer { protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { final String drawPlayer = playerSource.getPlayer(playerId, game, self, effectResult, effect); final Evaluator evaluator = count.getEvaluator(action, playerId, game, self, effectResult, effect); - return new DrawCardsEffect(action, drawPlayer, evaluator); + final int cardsDrawn = evaluator.evaluateExpression(game, null); + return new DrawCardsEffect(action, drawPlayer, cardsDrawn); } }; } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ModifyArcheryTotal.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ModifyArcheryTotal.java index debbd4750..a6a619bab 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ModifyArcheryTotal.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ModifyArcheryTotal.java @@ -2,15 +2,18 @@ package com.gempukku.lotro.cards.build.field.effect.appender; import com.gempukku.lotro.cards.build.CardGenerationEnvironment; import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.ValueSource; 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.ValueResolver; import com.gempukku.lotro.common.Side; 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.AddUntilEndOfPhaseModifierEffect; import com.gempukku.lotro.logic.modifiers.ArcheryTotalModifier; +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; @@ -20,12 +23,14 @@ public class ModifyArcheryTotal implements EffectAppenderProducer { public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { FieldUtils.validateAllowedFields(effectObject, "amount", "side"); - final int amount = FieldUtils.getInteger(effectObject.get("amount"), "amount"); + final ValueSource valueSource = ValueResolver.resolveEvaluator(effectObject.get("amount"), 0, environment); final Side side = FieldUtils.getEnum(Side.class, effectObject.get("side"), "side"); return new DelayedAppender() { @Override protected Effect createEffect(CostToEffectAction action, String playerId, LotroGame game, PhysicalCard self, EffectResult effectResult, Effect effect) { + final Evaluator evaluator = valueSource.getEvaluator(action, playerId, game, self, effectResult, effect); + final int amount = evaluator.evaluateExpression(game, null); return new AddUntilEndOfPhaseModifierEffect( new ArcheryTotalModifier(self, side, amount)); } 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 acee4ecad..9853ea490 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 @@ -8,10 +8,7 @@ import com.gempukku.lotro.filters.Filters; 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.modifiers.evaluator.ConstantEvaluator; -import com.gempukku.lotro.logic.modifiers.evaluator.CountStackedEvaluator; -import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator; -import com.gempukku.lotro.logic.modifiers.evaluator.LimitEvaluator; +import com.gempukku.lotro.logic.modifiers.evaluator.*; import com.gempukku.lotro.logic.timing.Effect; import com.gempukku.lotro.logic.timing.EffectResult; import org.json.simple.JSONObject; @@ -91,6 +88,10 @@ public class ValueResolver { final Filterable on1 = onFilter.getFilterable(playerId, game, self, effectResult, effect); return new CountStackedEvaluator(on1, Filters.any); }; + } else if (type.equalsIgnoreCase("multiply")) { + final int multiplier = FieldUtils.getInteger(object.get("multiplier"), "multiplier"); + final ValueSource valueSource = ValueResolver.resolveEvaluator(object.get("source"), 0, environment); + return (action, playerId, game, self, effectResult, effect) -> new MultiplyEvaluator(multiplier, valueSource.getEvaluator(action, playerId, game, self, effectResult, effect)); } 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);