Fixed Terribla as the Dawn errata (and any other card that triggers on special abilities) triggering on discard-to-heal.

This commit is contained in:
Christian 'ketura' McCarty
2024-12-18 17:22:51 -06:00
parent 03f8797334
commit 4b72cb8d02
8 changed files with 93 additions and 25 deletions

View File

@@ -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;

View File

@@ -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());
}
}

View File

@@ -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());
}
}

View File

@@ -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;

View File

@@ -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.";
}
}

View File

@@ -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);
}
}

View File

@@ -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() {

View File

@@ -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());
}
}