From b61c734eb03619db1758b1195875aa9dbb5241f4 Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Wed, 4 Sep 2019 22:44:41 -0700 Subject: [PATCH] Discount effects --- .../src/main/web/cards/set40/set40-moria.json | 26 +++++++++++ .../lotro/cards/set40/moria/Card40_157.java | 45 ------------------- .../cards/build/BuiltLotroCardBlueprint.java | 2 +- .../lotro/cards/build/DiscountSource.java | 3 +- .../build/field/effect/PotentialDiscount.java | 36 ++++++++++----- .../appender/resolver/ValueResolver.java | 6 +++ 6 files changed, 60 insertions(+), 58 deletions(-) delete mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/moria/Card40_157.java diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-moria.json b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-moria.json index a4078acc8..c7f18af72 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-moria.json +++ b/gemp-lotr/gemp-lotr-async/src/main/web/cards/set40/set40-moria.json @@ -113,6 +113,32 @@ } } }, + "40_157": { + "title": "*Cave Troll of Moria", + "subtitle": "Monstrous Fiend", + "culture": "moria", + "cost": 10, + "type": "minion", + "race": "troll", + "strength": 15, + "vitality": 4, + "site": 4, + "keyword": [ + "damage+1", + "fierce" + ], + "effects": { + "type": "discount", + "amount": { + "type": "forEachInHand", + "filter": "culture(moria),goblin" + }, + "discount": { + "type": "discardFromHand", + "filter": "culture(moria),goblin" + } + } + }, "40_166": { "title": "*Goblin Ransacker", "culture": "moria", diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/moria/Card40_157.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/moria/Card40_157.java deleted file mode 100644 index cab94c2db..000000000 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set40/moria/Card40_157.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gempukku.lotro.cards.set40.moria; - -import com.gempukku.lotro.common.Culture; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.common.Race; -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.cardtype.AbstractMinion; -import com.gempukku.lotro.logic.effects.discount.DiscardCardFromHandDiscountEffect; - -/** - * Title: *Cave Troll of Moria, Monstrous Fiend - * Set: Second Edition - * Side: Shadow - * Culture: Moria - * Twilight Cost: 10 - * Type: Minion - Troll - * Strength: 15 - * Vitality: 4 - * Home: 4 - * Card Number: 1R157 - * Game Text: Damage +1. Fierce. - * When you play Cave Troll of Moria, you may discard X [MORIA] Goblins from hand; Cave Troll of Moria's twilight cost - * is -1 for each Goblin discarded in this way. - */ -public class Card40_157 extends AbstractMinion { - public Card40_157() { - super(10, 15, 4, 4, Race.TROLL, Culture.MORIA, "Cave Troll of Moria", "Monstrous Fiend", true); - addKeyword(Keyword.DAMAGE, 1); - addKeyword(Keyword.FIERCE); - } - - @Override - public int getPotentialDiscount(LotroGame game, String playerId, PhysicalCard self) { - return Filters.filter(game.getGameState().getHand(playerId), game, Culture.MORIA, Race.GOBLIN).size(); - } - - @Override - public void appendPotentialDiscountEffects(LotroGame game, CostToEffectAction action, String playerId, PhysicalCard self) { - action.appendPotentialDiscount( - new DiscardCardFromHandDiscountEffect(action, playerId, Culture.MORIA, Race.GOBLIN)); - } -} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/BuiltLotroCardBlueprint.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/BuiltLotroCardBlueprint.java index 607a106c5..5b81cdaea 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/BuiltLotroCardBlueprint.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/BuiltLotroCardBlueprint.java @@ -660,7 +660,7 @@ public class BuiltLotroCardBlueprint implements LotroCardBlueprint { if (discountSources != null) { DefaultActionContext actionContext = new DefaultActionContext(playerId, game, self, null, null); for (DiscountSource discountSource : discountSources) { - final DiscountEffect discountEffect = discountSource.getDiscountEffect(actionContext); + final DiscountEffect discountEffect = discountSource.getDiscountEffect(action, actionContext); action.appendPotentialDiscount(discountEffect); } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/DiscountSource.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/DiscountSource.java index 143e19d31..20cfc2d90 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/DiscountSource.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/DiscountSource.java @@ -1,9 +1,10 @@ package com.gempukku.lotro.cards.build; +import com.gempukku.lotro.logic.actions.CostToEffectAction; import com.gempukku.lotro.logic.effects.DiscountEffect; public interface DiscountSource { int getPotentialDiscount(ActionContext actionContext); - DiscountEffect getDiscountEffect(ActionContext actionContext); + DiscountEffect getDiscountEffect(CostToEffectAction action, ActionContext actionContext); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/PotentialDiscount.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/PotentialDiscount.java index bd650c4dc..564b234b9 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/PotentialDiscount.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/PotentialDiscount.java @@ -4,7 +4,10 @@ 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.actions.CostToEffectAction; import com.gempukku.lotro.logic.effects.DiscountEffect; +import com.gempukku.lotro.logic.effects.discount.DiscardCardFromHandDiscountEffect; import org.json.simple.JSONObject; public class PotentialDiscount implements EffectProcessor { @@ -15,17 +18,28 @@ public class PotentialDiscount implements EffectProcessor { final ValueSource amountSource = ValueResolver.resolveEvaluator(value.get("amount"), 0, environment); final JSONObject discount = (JSONObject) value.get("discount"); - blueprint.appendDiscountSource( - new DiscountSource() { - @Override - public int getPotentialDiscount(ActionContext actionContext) { - return amountSource.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), actionContext.getSource()); - } + final String discountType = FieldUtils.getString(discount.get("type"), "type"); + if (discountType.equals("discardFromHand")) { + FieldUtils.validateAllowedFields(discount, "filter"); - @Override - public DiscountEffect getDiscountEffect(ActionContext actionContext) { - return null; - } - }); + final String filter = FieldUtils.getString(discount.get("filter"), "filter", "any"); + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); + + blueprint.appendDiscountSource( + new DiscountSource() { + @Override + public int getPotentialDiscount(ActionContext actionContext) { + return amountSource.getEvaluator(actionContext).evaluateExpression(actionContext.getGame(), actionContext.getSource()); + } + + @Override + public DiscountEffect getDiscountEffect(CostToEffectAction action, ActionContext actionContext) { + final Filterable filterable = filterableSource.getFilterable(actionContext); + return new DiscardCardFromHandDiscountEffect(action, actionContext.getPerformingPlayer(), filterable); + } + }); + } else { + throw new InvalidCardDefinitionException("Unknown type of discount: " + discountType); + } } } 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 7172877d0..e7feafc7a 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 @@ -108,6 +108,12 @@ public class ValueResolver { final String filter = FieldUtils.getString(object.get("filter"), "filter"); final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); return actionContext -> new CountSpottableEvaluator(filterableSource.getFilterable(actionContext)); + } else if (type.equalsIgnoreCase("forEachInHand")) { + final String filter = FieldUtils.getString(object.get("filter"), "filter"); + final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment); + return actionContext -> + (Evaluator) (game, cardAffected) -> Filters.filter(game.getGameState().getHand(actionContext.getPerformingPlayer()), + game, filterableSource.getFilterable(actionContext)).size(); } else if (type.equalsIgnoreCase("fromMemory")) { String memory = FieldUtils.getString(object.get("memory"), "memory"); return (actionContext) -> {