From ac3bd38590482c0ae0e3e128104b39aad6baf4dc Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Wed, 4 Sep 2019 22:31:29 -0700 Subject: [PATCH] Discount wiring --- .../cards/build/BuiltLotroCardBlueprint.java | 26 ++++++++++++++-- .../lotro/cards/build/DiscountSource.java | 9 ++++++ .../build/field/EffectFieldProcessor.java | 1 + .../build/field/effect/PotentialDiscount.java | 31 +++++++++++++++++++ 4 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/DiscountSource.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/PotentialDiscount.java 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 a80a287b2..607a106c5 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 @@ -8,6 +8,7 @@ import com.gempukku.lotro.game.LotroCardBlueprint; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.actions.*; +import com.gempukku.lotro.logic.effects.DiscountEffect; import com.gempukku.lotro.logic.modifiers.Modifier; import com.gempukku.lotro.logic.timing.Action; import com.gempukku.lotro.logic.timing.Effect; @@ -61,6 +62,7 @@ public class BuiltLotroCardBlueprint implements LotroCardBlueprint { private List twilightCostModifiers; private List extraPlayCosts; + private List discountSources; private ActionSource playEventAction; @@ -77,6 +79,12 @@ public class BuiltLotroCardBlueprint implements LotroCardBlueprint { this.extraPossessionClassTest = extraPossessionClassTest; } + public void appendDiscountSource(DiscountSource discountSource) { + if (discountSources == null) + discountSources = new LinkedList<>(); + discountSources.add(discountSource); + } + public void appendOptionalInHandBeforeAction(ActionSource actionSource) { if (optionalInHandBeforeActions == null) optionalInHandBeforeActions = new LinkedList<>(); @@ -636,12 +644,26 @@ public class BuiltLotroCardBlueprint implements LotroCardBlueprint { @Override public int getPotentialDiscount(LotroGame game, String playerId, PhysicalCard self) { - return 0; + if (discountSources == null) + return 0; + + int result = 0; + DefaultActionContext actionContext = new DefaultActionContext(playerId, game, self, null, null); + for (DiscountSource discountSource : discountSources) + result += discountSource.getPotentialDiscount(actionContext); + + return result; } @Override public void appendPotentialDiscountEffects(LotroGame game, CostToEffectAction action, String playerId, PhysicalCard self) { - + if (discountSources != null) { + DefaultActionContext actionContext = new DefaultActionContext(playerId, game, self, null, null); + for (DiscountSource discountSource : discountSources) { + final DiscountEffect discountEffect = discountSource.getDiscountEffect(actionContext); + action.appendPotentialDiscount(discountEffect); + } + } } @Override 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 new file mode 100644 index 000000000..143e19d31 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/DiscountSource.java @@ -0,0 +1,9 @@ +package com.gempukku.lotro.cards.build; + +import com.gempukku.lotro.logic.effects.DiscountEffect; + +public interface DiscountSource { + int getPotentialDiscount(ActionContext actionContext); + + DiscountEffect getDiscountEffect(ActionContext actionContext); +} 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 0f35e18ab..0c3fde3d2 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 @@ -25,6 +25,7 @@ public class EffectFieldProcessor implements FieldProcessor { effectProcessors.put("extracost", new ExtraCost()); effectProcessors.put("modifier", new Modifier()); effectProcessors.put("extrapossessionclass", new ExtraPossessionClassEffectProcessor()); + effectProcessors.put("discount", new PotentialDiscount()); } @Override 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 new file mode 100644 index 000000000..bd650c4dc --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/PotentialDiscount.java @@ -0,0 +1,31 @@ +package com.gempukku.lotro.cards.build.field.effect; + +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.effects.DiscountEffect; +import org.json.simple.JSONObject; + +public class PotentialDiscount implements EffectProcessor { + @Override + public void processEffect(JSONObject value, BuiltLotroCardBlueprint blueprint, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(value, "amount", "discount"); + + 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()); + } + + @Override + public DiscountEffect getDiscountEffect(ActionContext actionContext) { + return null; + } + }); + } +}