Grond errata tests
This commit is contained in:
@@ -121,6 +121,10 @@
|
||||
count: 2
|
||||
player: freeps
|
||||
}
|
||||
{
|
||||
type: LookAtDrawDeck
|
||||
deck: freeps
|
||||
}
|
||||
{
|
||||
type: DiscardCardsFromDrawDeck
|
||||
filter: choose(side(freeps))
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user