Grond errata tests

This commit is contained in:
Christian 'ketura' McCarty
2022-12-20 23:49:53 -06:00
parent 80f1cdbf63
commit 1053b91b34
9 changed files with 224 additions and 7 deletions

View File

@@ -121,6 +121,10 @@
count: 2
player: freeps
}
{
type: LookAtDrawDeck
deck: freeps
}
{
type: DiscardCardsFromDrawDeck
filter: choose(side(freeps))

View File

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

View File

@@ -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<? extends PhysicalCard> 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;
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -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<String, String>()
{{
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.<br>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());
}
}

View File

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