From 1053b91b348b92ba80e35b5940563d209cb3fb5f Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Tue, 20 Dec 2022 23:49:53 -0600 Subject: [PATCH] Grond errata tests --- .../pc/errata/set18/set18-Orc-errata.hjson | 4 + .../field/effect/EffectAppenderFactory.java | 1 + .../field/effect/appender/LookAtDrawDeck.java | 61 +++++++ .../ShuffleCardsFromHandIntoDrawDeck.java | 2 +- .../effects/LookAtTopCardOfADeckEffect.java | 6 +- .../RevealTopCardsOfDrawDeckEffect.java | 3 +- .../ShuffleCardsFromHandIntoDeckEffect.java | 2 +- .../errata/set18/Card_18_082_ErrataTests.java | 150 ++++++++++++++++++ .../pc/vsets/set_v01/Card_V1_032_Tests.java | 2 +- 9 files changed, 224 insertions(+), 7 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/LookAtDrawDeck.java create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set18/Card_18_082_ErrataTests.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set18/set18-Orc-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set18/set18-Orc-errata.hjson index 2c12cf3ba..2a229eac1 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set18/set18-Orc-errata.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set18/set18-Orc-errata.hjson @@ -121,6 +121,10 @@ count: 2 player: freeps } + { + type: LookAtDrawDeck + deck: freeps + } { type: DiscardCardsFromDrawDeck filter: choose(side(freeps)) diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java index 7ef0a1a4c..9485bc466 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/EffectAppenderFactory.java @@ -70,6 +70,7 @@ public class EffectAppenderFactory { effectAppenderProducers.put("incrementperturnlimit", new IncrementPerTurnLimit()); effectAppenderProducers.put("kill", new Kill()); effectAppenderProducers.put("liberatesite", new LiberateSite()); + effectAppenderProducers.put("lookatdrawdeck", new LookAtDrawDeck()); effectAppenderProducers.put("lookathand", new LookAtHand()); effectAppenderProducers.put("lookattopcardsofdrawdeck", new LookAtTopCardsOfDrawDeck()); effectAppenderProducers.put("makeselfringbearer", new MakeSelfRingBearer()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/LookAtDrawDeck.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/LookAtDrawDeck.java new file mode 100644 index 000000000..13929cddc --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/LookAtDrawDeck.java @@ -0,0 +1,61 @@ +package com.gempukku.lotro.cards.build.field.effect.appender; + +import com.gempukku.lotro.cards.build.ActionContext; +import com.gempukku.lotro.cards.build.CardGenerationEnvironment; +import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; +import com.gempukku.lotro.cards.build.PlayerSource; +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.PlayerResolver; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.effects.LookAtTopCardOfADeckEffect; +import com.gempukku.lotro.logic.effects.ShuffleDeckEffect; +import com.gempukku.lotro.logic.timing.Effect; +import org.json.simple.JSONObject; + +import java.util.List; + +public class LookAtDrawDeck implements EffectAppenderProducer { + @Override + public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { + FieldUtils.validateAllowedFields(effectObject, "deck", "memorize"); + + final String deck = FieldUtils.getString(effectObject.get("deck"), "deck", "you"); + final String memorize = FieldUtils.getString(effectObject.get("memorize"), "memorize"); + + final PlayerSource playerSource = PlayerResolver.resolvePlayer(deck, environment); + + MultiEffectAppender result = new MultiEffectAppender(); + + result.addEffectAppender(new DelayedAppender() { + @Override + public boolean isPlayableInFull(ActionContext actionContext) { + return true; + } + + @Override + protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { + final String deckId = playerSource.getPlayer(actionContext); + final int count = actionContext.getGame().getGameState().getDeck(deckId).size(); + + return new LookAtTopCardOfADeckEffect(actionContext.getPerformingPlayer(), count, deckId) { + @Override + protected void cardsLookedAt(List cards) { + if (memorize != null) + actionContext.setCardMemory(memorize, cards); + } + }; + } + }); + result.addEffectAppender(new DelayedAppender() { + @Override + protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { + return new ShuffleDeckEffect(playerSource.getPlayer(actionContext)); + } + }); + + return result; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ShuffleCardsFromHandIntoDrawDeck.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ShuffleCardsFromHandIntoDrawDeck.java index b5a9aa65e..1b1d541aa 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ShuffleCardsFromHandIntoDrawDeck.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/ShuffleCardsFromHandIntoDrawDeck.java @@ -29,7 +29,7 @@ public class ShuffleCardsFromHandIntoDrawDeck implements EffectAppenderProducer MultiEffectAppender result = new MultiEffectAppender(); result.addEffectAppender( - CardResolver.resolveCards(filter, valueSource, memorize, player, "Choose cards to shuffle into your deck", environment)); + CardResolver.resolveCardsInHand(filter, valueSource, memorize, player, player, "Choose cards to shuffle into the draw deck", environment)); result.addEffectAppender( new DelayedAppender() { @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/LookAtTopCardOfADeckEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/LookAtTopCardOfADeckEffect.java index 894b0e613..d84fcfea7 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/LookAtTopCardOfADeckEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/LookAtTopCardOfADeckEffect.java @@ -3,7 +3,6 @@ package com.gempukku.lotro.logic.effects; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.decisions.ArbitraryCardsSelectionDecision; -import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.Effect; @@ -23,7 +22,10 @@ public class LookAtTopCardOfADeckEffect extends AbstractEffect { @Override public String getText(LotroGame game) { - return null; + if(_count == game.getGameState().getDeck(_playerDeckId).size()) + return _playerId + " looks at " + _playerDeckId + "'s draw deck."; + + return _playerId + " looks at the top " + _count + " cards of " + _playerDeckId + "'s draw deck."; } @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/RevealTopCardsOfDrawDeckEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/RevealTopCardsOfDrawDeckEffect.java index bd1433489..51cb1e151 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/RevealTopCardsOfDrawDeckEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/RevealTopCardsOfDrawDeckEffect.java @@ -5,7 +5,6 @@ import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.GameUtils; import com.gempukku.lotro.logic.PlayOrder; import com.gempukku.lotro.logic.decisions.ArbitraryCardsSelectionDecision; -import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import com.gempukku.lotro.logic.timing.AbstractEffect; import com.gempukku.lotro.logic.timing.Effect; import com.gempukku.lotro.logic.timing.results.RevealCardFromTopOfDeckResult; @@ -51,7 +50,7 @@ public abstract class RevealTopCardsOfDrawDeckEffect extends AbstractEffect { String nextPlayer; while ((nextPlayer = playerOrder.getNextPlayer()) != null) { game.getUserFeedback().sendAwaitingDecision(nextPlayer, - new ArbitraryCardsSelectionDecision(1, _playerId + " revealed card(s) from hand top of deck", topCards, Collections.emptySet(), 0, 0) { + new ArbitraryCardsSelectionDecision(1, _playerId + " revealed card(s) from top of deck", topCards, Collections.emptySet(), 0, 0) { @Override public void decisionMade(String result) { } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ShuffleCardsFromHandIntoDeckEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ShuffleCardsFromHandIntoDeckEffect.java index ef4f68a9b..9896039af 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ShuffleCardsFromHandIntoDeckEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ShuffleCardsFromHandIntoDeckEffect.java @@ -53,7 +53,7 @@ public class ShuffleCardsFromHandIntoDeckEffect extends AbstractEffect { game.getGameState().shuffleCardsIntoDeck(toShuffleIn, _playerDeck); - game.getGameState().sendMessage(getAppendedNames(toShuffleIn) + " shuffled cards from hand into " + _playerDeck + " deck"); + game.getGameState().sendMessage(getAppendedNames(toShuffleIn) + " shuffled cards from hand into " + _playerDeck + "'s deck"); } return new FullEffectResult(toShuffleIn.size() == _cards.size()); diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set18/Card_18_082_ErrataTests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set18/Card_18_082_ErrataTests.java new file mode 100644 index 000000000..cfd018109 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set18/Card_18_082_ErrataTests.java @@ -0,0 +1,150 @@ +package com.gempukku.lotro.cards.unofficial.pc.errata.set18; + +import com.gempukku.lotro.cards.GenericCardTestHelper; +import com.gempukku.lotro.common.*; +import com.gempukku.lotro.game.CardNotFoundException; +import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import org.junit.Test; + +import java.util.Arrays; +import java.util.HashMap; + +import static org.junit.Assert.*; + +public class Card_18_082_ErrataTests +{ + + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap() + {{ + put("grond", "88_82"); + put("goblin", "11_137"); + + put("chaff1", "1_89"); + put("chaff2", "1_365"); + put("chaff3", "3_38"); + put("chaff4", "4_109"); + put("chaff5", "4_364"); + }}, + GenericCardTestHelper.FellowshipSites, + GenericCardTestHelper.FOTRFrodo, + GenericCardTestHelper.FOTRRing + ); + } + + @Test + public void GrondStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + + /** + * Set: 18 + * Title: Grond, Forged With Black Steel + * Unique: True + * Side: SHADOW + * Culture: Orc + * Twilight Cost: 3 + * Type: possession + * Subtype: Support Area + * Game Text: To play, spot an [orc] minion.
Each time the fellowship moves during the regroup phase, you may discard this possession to make the Free Peoples player shuffle 2 cards from their hand into their draw deck. Search that deck and discard 2 Free Peoples cards from it. + */ + + //Pre-game setup + var scn = GetScenario(); + + var grond = scn.GetFreepsCard("grond"); + + assertTrue(grond.getBlueprint().isUnique()); + assertEquals(Side.SHADOW, grond.getBlueprint().getSide()); + assertEquals(Culture.ORC, grond.getBlueprint().getCulture()); + assertEquals(CardType.POSSESSION, grond.getBlueprint().getCardType()); + assertTrue(scn.HasKeyword(grond, Keyword.SUPPORT_AREA)); + assertEquals(3, grond.getBlueprint().getTwilightCost()); + } + + @Test + public void GrondRequiresOrcMinionToPlay() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var grond = scn.GetShadowCard("grond"); + var goblin = scn.GetShadowCard("goblin"); + scn.ShadowMoveCardToHand(grond, goblin); + + scn.StartGame(); + scn.SetTwilight(20); + scn.FreepsPassCurrentPhaseAction(); + + assertFalse(scn.ShadowPlayAvailable(grond)); + scn.ShadowPlayCard(goblin); + assertTrue(scn.ShadowPlayAvailable(grond)); + } + + @Test + public void GrondTriggersDuringRegroupMove() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var grond = scn.GetShadowCard("grond"); + scn.ShadowMoveCardToSupportArea(grond); + + scn.StartGame(); + scn.FreepsPassCurrentPhaseAction(); + + assertFalse(scn.ShadowHasOptionalTriggerAvailable()); + scn.SkipToPhase(Phase.REGROUP); + scn.PassCurrentPhaseActions(); + scn.FreepsChooseToMove(); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + } + + @Test + public void GrondTriggerShuffles2CardsAndSearchesFreepsDeckToDiscard2() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var chaff1 = scn.GetFreepsCard("chaff1"); + var chaff2 = scn.GetFreepsCard("chaff2"); + var chaff3 = scn.GetFreepsCard("chaff3"); + var chaff4 = scn.GetFreepsCard("chaff4"); + var chaff5 = scn.GetFreepsCard("chaff5"); + var shadow1 = scn.GetFreepsCard("grond"); + var shadow2 = scn.GetFreepsCard("goblin"); + scn.FreepsMoveCardToHand(chaff1, chaff2, shadow1); + + var grond = scn.GetShadowCard("grond"); + scn.ShadowMoveCardToSupportArea(grond); + + scn.StartGame(); + scn.FreepsPassCurrentPhaseAction(); + + scn.SkipToPhase(Phase.REGROUP); + scn.PassCurrentPhaseActions(); + scn.FreepsChooseToMove(); + + assertEquals(Zone.SUPPORT, grond.getZone()); + scn.ShadowAcceptOptionalTrigger(); + assertEquals(Zone.DISCARD, grond.getZone()); + + assertTrue(scn.FreepsDecisionAvailable("choose cards to shuffle")); + assertEquals("2", Arrays.stream(scn.FreepsGetADParam("max")).findFirst().get()); + assertEquals(Zone.HAND, chaff1.getZone()); + assertEquals(Zone.HAND, shadow1.getZone()); + scn.FreepsChooseCardIDFromSelection(chaff1, shadow1); + assertEquals(Zone.DECK, chaff1.getZone()); + assertEquals(Zone.DECK, shadow1.getZone()); + + //7 cards in starting deck - 3 placed in hand + 2 shuffled in from hand + assertEquals(6, scn.ShadowGetADParamAsList("blueprintId").size()); + assertTrue(scn.ShadowDecisionAvailable("Cards in deck")); + + scn.ShadowDismissRevealedCards(); + assertTrue(scn.ShadowDecisionAvailable("Choose card")); + // 5 starting freeps cards - 2 put in hand + 1 shuffled into deck + assertEquals(4, scn.ShadowGetADParamAsList("blueprintId").size()); + assertEquals(Zone.DECK, chaff3.getZone()); + assertEquals(Zone.DECK, chaff4.getZone()); + scn.ShadowChooseCardBPFromSelection(chaff3, chaff4); + assertEquals(Zone.DISCARD, chaff3.getZone()); + assertEquals(Zone.DISCARD, chaff4.getZone()); + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v01/Card_V1_032_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v01/Card_V1_032_Tests.java index 0ff221ccb..edeb1986f 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v01/Card_V1_032_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/vsets/set_v01/Card_V1_032_Tests.java @@ -86,7 +86,7 @@ public class Card_V1_032_Tests assertEquals(0, scn.GetTwilight()); assertTrue(scn.ShadowHasOptionalTriggerAvailable()); scn.ShadowAcceptOptionalTrigger(); - scn.FreepsPassCurrentPhaseAction(); + scn.FreepsDismissRevealedCards(); // 2 for the site, 1 for companions, 2 for Terror assertEquals(5, scn.GetTwilight()); }