From 4b72cb8d0205e5c9b590487925e3518eff6eed44 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Wed, 18 Dec 2024 17:22:51 -0600 Subject: [PATCH] Fixed Terribla as the Dawn errata (and any other card that triggers on special abilities) triggering on discard-to-heal. --- .../effect/trigger/UsesSpecialAbility.java | 4 +++ .../logic/actions/ActivateCardAction.java | 18 ++++++---- .../logic/actions/DiscardToHealAction.java | 21 +++++++++++ .../logic/effects/ActivateCardEffect.java | 6 ++-- .../logic/effects/DiscardToHealEffect.java | 19 ++++++++++ .../timing/results/DiscardToHealResult.java | 10 ++++++ .../logic/timing/rules/HealByDiscardRule.java | 5 ++- .../errata/set03/Card_03_103_ErrataTests.java | 35 ++++++++++++------- 8 files changed, 93 insertions(+), 25 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/DiscardToHealAction.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardToHealEffect.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/DiscardToHealResult.java diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/UsesSpecialAbility.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/UsesSpecialAbility.java index 8af3ca2b6..7fc547504 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/UsesSpecialAbility.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/trigger/UsesSpecialAbility.java @@ -9,6 +9,7 @@ import com.gempukku.lotro.common.Timeword; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.logic.timing.TriggerConditions; import com.gempukku.lotro.logic.timing.results.ActivateCardResult; +import com.gempukku.lotro.logic.timing.results.DiscardToHealResult; import org.json.simple.JSONObject; public class UsesSpecialAbility implements TriggerCheckerProducer { @@ -33,6 +34,9 @@ public class UsesSpecialAbility implements TriggerCheckerProducer { if (activated) { ActivateCardResult activateCardResult = (ActivateCardResult) actionContext.getEffectResult(); + if(activateCardResult instanceof DiscardToHealResult) + return false; + if (timeword != null) { if (activateCardResult.getActionTimeword() != timeword) return false; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/ActivateCardAction.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/ActivateCardAction.java index 942fb2693..d7edeaf11 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/ActivateCardAction.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/ActivateCardAction.java @@ -7,16 +7,16 @@ import com.gempukku.lotro.logic.effects.ActivateCardEffect; import com.gempukku.lotro.logic.timing.Effect; public class ActivateCardAction extends AbstractCostToEffectAction { - private final PhysicalCard _physicalCard; + protected final PhysicalCard _physicalCard; - private ActivateCardEffect _activateCardEffect; + protected ActivateCardEffect _activateCardEffect; - private final String _message; + protected final String _message; - private boolean _sentMessage; - private boolean _activated; + protected boolean _sentMessage; + protected boolean _activated; - private boolean _prevented; + protected boolean _prevented; public ActivateCardAction(PhysicalCard physicalCard) { _physicalCard = physicalCard; @@ -60,7 +60,7 @@ public class ActivateCardAction extends AbstractCostToEffectAction { if (!_activated) { _activated = true; - _activateCardEffect = new ActivateCardEffect(_physicalCard, getActionTimeword()); + generateCardEffect(); return _activateCardEffect; } @@ -72,4 +72,8 @@ public class ActivateCardAction extends AbstractCostToEffectAction { } return null; } + + protected void generateCardEffect() { + _activateCardEffect = new ActivateCardEffect(_physicalCard, getActionTimeword()); + } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/DiscardToHealAction.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/DiscardToHealAction.java new file mode 100644 index 000000000..f7e0e8eb3 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/actions/DiscardToHealAction.java @@ -0,0 +1,21 @@ +package com.gempukku.lotro.logic.actions; + +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.logic.effects.DiscardToHealEffect; + +public class DiscardToHealAction extends ActivateCardAction { + public DiscardToHealAction(PhysicalCard physicalCard) { + super(physicalCard); + setText("Heal by discarding"); + } + + @Override + public Type getType() { + return Type.OTHER; + } + + @Override + protected void generateCardEffect() { + _activateCardEffect = new DiscardToHealEffect(_physicalCard, getActionTimeword()); + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ActivateCardEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ActivateCardEffect.java index e5e84d34c..76420f515 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ActivateCardEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ActivateCardEffect.java @@ -9,10 +9,10 @@ import com.gempukku.lotro.logic.timing.Effect; import com.gempukku.lotro.logic.timing.results.ActivateCardResult; public class ActivateCardEffect extends AbstractEffect { - private final PhysicalCard _source; - private final Timeword _actionTimeword; + protected final PhysicalCard _source; + protected final Timeword _actionTimeword; - private final ActivateCardResult _activateCardResult; + protected ActivateCardResult _activateCardResult; public ActivateCardEffect(PhysicalCard source, Timeword actionTimeword) { _source = source; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardToHealEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardToHealEffect.java new file mode 100644 index 000000000..408426b28 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/DiscardToHealEffect.java @@ -0,0 +1,19 @@ +package com.gempukku.lotro.logic.effects; + +import com.gempukku.lotro.common.Timeword; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.GameUtils; +import com.gempukku.lotro.logic.timing.results.DiscardToHealResult; + +public class DiscardToHealEffect extends ActivateCardEffect { + public DiscardToHealEffect(PhysicalCard source, Timeword actionTimeword) { + super(source, actionTimeword); + _activateCardResult = new DiscardToHealResult(_source, _actionTimeword); + } + + @Override + public String getText(LotroGame game) { + return "Discarded " + GameUtils.getCardLink(_source) + " to heal."; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/DiscardToHealResult.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/DiscardToHealResult.java new file mode 100644 index 000000000..bc1d473d7 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/results/DiscardToHealResult.java @@ -0,0 +1,10 @@ +package com.gempukku.lotro.logic.timing.results; + +import com.gempukku.lotro.common.Timeword; +import com.gempukku.lotro.game.PhysicalCard; + +public class DiscardToHealResult extends ActivateCardResult { + public DiscardToHealResult(PhysicalCard source, Timeword actionTimeword) { + super(source, actionTimeword); + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/HealByDiscardRule.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/HealByDiscardRule.java index 2f1de30eb..ad2c3ecea 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/HealByDiscardRule.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/HealByDiscardRule.java @@ -8,7 +8,7 @@ import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.game.state.actions.DefaultActionsEnvironment; import com.gempukku.lotro.logic.GameUtils; -import com.gempukku.lotro.logic.actions.ActivateCardAction; +import com.gempukku.lotro.logic.actions.DiscardToHealAction; import com.gempukku.lotro.logic.effects.DiscardCardsFromHandEffect; import com.gempukku.lotro.logic.effects.HealCharactersEffect; import com.gempukku.lotro.logic.timing.Action; @@ -36,8 +36,7 @@ public class HealByDiscardRule { for (PhysicalCard card : Filters.filter(game, game.getGameState().getHand(playerId), Filters.or(CardType.COMPANION, CardType.ALLY), Filters.unique)) { PhysicalCard active = Filters.findFirstActive(game, Filters.name(card.getBlueprint().getTitle())); if (active != null && game.getGameState().getWounds(active) > 0) { - ActivateCardAction action = new ActivateCardAction(card); - action.setText("Heal by discarding"); + var action = new DiscardToHealAction(card); action.appendCost(new DiscardCardsFromHandEffect(null, card.getOwner(), Collections.singleton(card), false)); action.appendCost( new UnrespondableEffect() { diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set03/Card_03_103_ErrataTests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set03/Card_03_103_ErrataTests.java index b686dc776..88b077405 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set03/Card_03_103_ErrataTests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set03/Card_03_103_ErrataTests.java @@ -1,9 +1,11 @@ package com.gempukku.lotro.cards.unofficial.pc.errata.set03; import com.gempukku.lotro.cards.GenericCardTestHelper; -import com.gempukku.lotro.common.*; +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Side; +import com.gempukku.lotro.common.Timeword; import com.gempukku.lotro.game.CardNotFoundException; -import com.gempukku.lotro.game.PhysicalCardImpl; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import org.junit.Test; @@ -18,8 +20,10 @@ public class Card_03_103_ErrataTests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "53_103"); - // put other cards in here as needed for the test case + put("dawn", "53_103"); + put("ithil", "9_47"); + + put("otherfrodo", "1_290"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -44,7 +48,7 @@ public class Card_03_103_ErrataTests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("dawn"); assertEquals("Terrible as the Dawn", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -56,18 +60,25 @@ public class Card_03_103_ErrataTests assertEquals(0, card.getBlueprint().getTwilightCost()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void TerribleastheDawnTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void TerribleastheDawnDoesNotTriggerOnDiscardToHeal() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var dawn = scn.GetShadowCard("dawn"); + scn.ShadowMoveCardToHand(dawn); + scn.ShadowMoveCardToSupportArea("ithil"); //For spot requirement + var frodo = scn.GetRingBearer(); + var otherfrodo = scn.GetFreepsCard("otherfrodo"); + scn.FreepsMoveCardToHand(otherfrodo); + + scn.AddWoundsToChar(frodo, 1); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(0, scn.GetTwilight()); + assertTrue(scn.FreepsActionAvailable("heal by discard")); + scn.FreepsPlayCard(otherfrodo); + + assertFalse(scn.ShadowHasOptionalTriggerAvailable()); } }