From c9f696f838a9abcf8deefe826b60db79bee1169b Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Thu, 1 Dec 2011 16:51:51 +0000 Subject: [PATCH] Optional triggers on one effect affect each other in playability. --- .../lotro/logic/timing/rules/MusterRule.java | 1 + .../com/gempukku/lotro/at/AbstractAtTest.java | 11 +- .../com/gempukku/lotro/at/TriggersAtTest.java | 132 ++++++++++++++++++ 3 files changed, 143 insertions(+), 1 deletion(-) diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/MusterRule.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/MusterRule.java index 7f3f9f4e2..a19d869f7 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/MusterRule.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/MusterRule.java @@ -33,6 +33,7 @@ public class MusterRule { List actions = new LinkedList(); for (PhysicalCard musterCard : Filters.filterActive(game.getGameState(), game.getModifiersQuerying(), Keyword.MUSTER)) { OptionalTriggerAction action = new OptionalTriggerAction("muster" + musterCard.getCardId(), musterCard); + action.setText("Use Muster"); action.appendCost( new ChooseAndDiscardCardsFromHandEffect(action, playerId, false, 1)); action.appendEffect( diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/AbstractAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/AbstractAtTest.java index 8fd2dc2c3..ad11990d6 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/AbstractAtTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/AbstractAtTest.java @@ -7,11 +7,12 @@ import com.gempukku.lotro.logic.decisions.AwaitingDecision; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import com.gempukku.lotro.logic.timing.DefaultLotroGame; import com.gempukku.lotro.logic.vo.LotroDeck; -import static org.junit.Assert.fail; import org.junit.BeforeClass; import java.util.*; +import static org.junit.Assert.fail; + public abstract class AbstractAtTest { protected static LotroCardBlueprintLibrary _library; @@ -84,6 +85,14 @@ public abstract class AbstractAtTest { return null; } + protected String getCardActionId(AwaitingDecision awaitingDecision, String actionTextStart) { + String[] actionTexts = (String[]) awaitingDecision.getDecisionParameters().get("actionText"); + for (int i = 0; i < actionTexts.length; i++) + if (actionTexts[i].startsWith(actionTextStart)) + return ((String[]) awaitingDecision.getDecisionParameters().get("actionId"))[i]; + return null; + } + private void addPlayerDeck(String player, Map decks, Map> additionalCardsInDeck) { LotroDeck deck = createSimplestDeck(); if (additionalCardsInDeck != null) { diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/TriggersAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/TriggersAtTest.java index 96b7440cd..a149cfd19 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/TriggersAtTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/TriggersAtTest.java @@ -1,11 +1,13 @@ package com.gempukku.lotro.at; +import com.gempukku.lotro.common.Keyword; import com.gempukku.lotro.common.Phase; import com.gempukku.lotro.common.Zone; import com.gempukku.lotro.game.PhysicalCardImpl; import com.gempukku.lotro.logic.decisions.AwaitingDecision; import com.gempukku.lotro.logic.decisions.AwaitingDecisionType; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import com.gempukku.lotro.logic.modifiers.KeywordModifier; import org.junit.Test; import java.util.Collection; @@ -13,6 +15,7 @@ import java.util.HashMap; import java.util.Map; import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertTrue; public class TriggersAtTest extends AbstractAtTest { @Test @@ -66,5 +69,134 @@ public class TriggersAtTest extends AbstractAtTest { validateContents(new String[]{"" + gimli.getCardId(), "" + stoutAndStrong.getCardId()}, (String[]) chooseTriggersDecision.getDecisionParameters().get("cardId")); } + @Test + public void musterWorkingWithOtherOptionalStartOfRegroupTrigger() throws DecisionResultInvalidException { + Map> extraCards = new HashMap>(); + initializeSimplestGame(extraCards); + PhysicalCardImpl dervorin = new PhysicalCardImpl(100, "7_88", P1, _library.getLotroCardBlueprint("7_88")); + PhysicalCardImpl boromir = new PhysicalCardImpl(101, "1_96", P1, _library.getLotroCardBlueprint("1_96")); + PhysicalCardImpl cardInHand1 = new PhysicalCardImpl(102, "4_57", P1, _library.getLotroCardBlueprint("4_57")); + PhysicalCardImpl cardInHand2 = new PhysicalCardImpl(103, "4_57", P1, _library.getLotroCardBlueprint("4_57")); + PhysicalCardImpl cardInHand3 = new PhysicalCardImpl(104, "4_57", P1, _library.getLotroCardBlueprint("4_57")); + PhysicalCardImpl cardInHand4 = new PhysicalCardImpl(105, "4_57", P1, _library.getLotroCardBlueprint("4_57")); + + skipMulligans(); + + _game.getGameState().addCardToZone(_game, dervorin, Zone.FREE_CHARACTERS); + _game.getGameState().addCardToZone(_game, boromir, Zone.FREE_CHARACTERS); + _game.getModifiersEnvironment().addUntilEndOfTurnModifier( + new KeywordModifier(dervorin, dervorin, Keyword.MUSTER)); + + _game.getGameState().addCardToZone(_game, cardInHand1, Zone.HAND); + _game.getGameState().addCardToZone(_game, cardInHand2, Zone.HAND); + _game.getGameState().addCardToZone(_game, cardInHand3, Zone.HAND); + _game.getGameState().addCardToZone(_game, cardInHand4, Zone.HAND); + + // End fellowship phase + playerDecided(P1, ""); + + // End shadow phase + playerDecided(P2, ""); + + final AwaitingDecision optionalStartOfRegroupDecision = _userFeedback.getAwaitingDecision(P1); + assertEquals(AwaitingDecisionType.CARD_ACTION_CHOICE, optionalStartOfRegroupDecision.getDecisionType()); + validateContents(new String[]{"" + dervorin.getCardId(), "" + dervorin.getCardId()}, (String[]) optionalStartOfRegroupDecision.getDecisionParameters().get("cardId")); + + playerDecided(P1, getCardActionId(optionalStartOfRegroupDecision, "Optional ")); + + final AwaitingDecision optionalSecondStartOfRegroupDecision = _userFeedback.getAwaitingDecision(P1); + assertEquals(AwaitingDecisionType.CARD_ACTION_CHOICE, optionalSecondStartOfRegroupDecision.getDecisionType()); + validateContents(new String[]{"" + dervorin.getCardId()}, (String[]) optionalSecondStartOfRegroupDecision.getDecisionParameters().get("cardId")); + } + + @Test + public void userOfMusterAllowsUseOfOtherOptionalStartOfRegroupTrigger() throws DecisionResultInvalidException { + Map> extraCards = new HashMap>(); + initializeSimplestGame(extraCards); + + PhysicalCardImpl dervorin = new PhysicalCardImpl(100, "7_88", P1, _library.getLotroCardBlueprint("7_88")); + PhysicalCardImpl boromir = new PhysicalCardImpl(101, "1_96", P1, _library.getLotroCardBlueprint("1_96")); + PhysicalCardImpl cardInHand1 = new PhysicalCardImpl(102, "4_57", P1, _library.getLotroCardBlueprint("4_57")); + PhysicalCardImpl cardInHand2 = new PhysicalCardImpl(103, "4_57", P1, _library.getLotroCardBlueprint("4_57")); + PhysicalCardImpl cardInHand3 = new PhysicalCardImpl(104, "4_57", P1, _library.getLotroCardBlueprint("4_57")); + PhysicalCardImpl cardInHand4 = new PhysicalCardImpl(105, "4_57", P1, _library.getLotroCardBlueprint("4_57")); + PhysicalCardImpl cardInHand5 = new PhysicalCardImpl(106, "4_57", P1, _library.getLotroCardBlueprint("4_57")); + + skipMulligans(); + + _game.getGameState().addCardToZone(_game, dervorin, Zone.FREE_CHARACTERS); + _game.getGameState().addCardToZone(_game, boromir, Zone.FREE_CHARACTERS); + _game.getModifiersEnvironment().addUntilEndOfTurnModifier( + new KeywordModifier(dervorin, dervorin, Keyword.MUSTER)); + + _game.getGameState().addCardToZone(_game, cardInHand1, Zone.HAND); + _game.getGameState().addCardToZone(_game, cardInHand2, Zone.HAND); + _game.getGameState().addCardToZone(_game, cardInHand3, Zone.HAND); + _game.getGameState().addCardToZone(_game, cardInHand4, Zone.HAND); + _game.getGameState().addCardToZone(_game, cardInHand5, Zone.HAND); + + // End fellowship phase + playerDecided(P1, ""); + + // End shadow phase + playerDecided(P2, ""); + + final AwaitingDecision optionalStartOfRegroupDecision = _userFeedback.getAwaitingDecision(P1); + assertEquals(AwaitingDecisionType.CARD_ACTION_CHOICE, optionalStartOfRegroupDecision.getDecisionType()); + validateContents(new String[]{"" + dervorin.getCardId()}, (String[]) optionalStartOfRegroupDecision.getDecisionParameters().get("cardId")); + + playerDecided(P1, getCardActionId(optionalStartOfRegroupDecision, "Use ")); + + playerDecided(P1, String.valueOf(cardInHand1.getCardId())); + + final AwaitingDecision optionalSecondStartOfRegroupDecision = _userFeedback.getAwaitingDecision(P1); + assertEquals(AwaitingDecisionType.CARD_ACTION_CHOICE, optionalSecondStartOfRegroupDecision.getDecisionType()); + validateContents(new String[]{"" + dervorin.getCardId()}, (String[]) optionalSecondStartOfRegroupDecision.getDecisionParameters().get("cardId")); + assertTrue(((String[]) optionalSecondStartOfRegroupDecision.getDecisionParameters().get("actionText"))[0].startsWith("Optional ")); + } + + @Test + public void userOfMusterDisablesUseOfOtherOptionalStartOfRegroupTrigger() throws DecisionResultInvalidException { + Map> extraCards = new HashMap>(); + initializeSimplestGame(extraCards); + + PhysicalCardImpl dervorin = new PhysicalCardImpl(100, "7_88", P1, _library.getLotroCardBlueprint("7_88")); + PhysicalCardImpl boromir = new PhysicalCardImpl(101, "1_96", P1, _library.getLotroCardBlueprint("1_96")); + PhysicalCardImpl cardInHand1 = new PhysicalCardImpl(102, "4_57", P1, _library.getLotroCardBlueprint("4_57")); + PhysicalCardImpl cardInHand2 = new PhysicalCardImpl(103, "4_57", P1, _library.getLotroCardBlueprint("4_57")); + PhysicalCardImpl cardInHand3 = new PhysicalCardImpl(104, "4_57", P1, _library.getLotroCardBlueprint("4_57")); + PhysicalCardImpl cardInHand4 = new PhysicalCardImpl(105, "4_57", P1, _library.getLotroCardBlueprint("4_57")); + + skipMulligans(); + + _game.getGameState().addCardToZone(_game, dervorin, Zone.FREE_CHARACTERS); + _game.getGameState().addCardToZone(_game, boromir, Zone.FREE_CHARACTERS); + _game.getModifiersEnvironment().addUntilEndOfTurnModifier( + new KeywordModifier(dervorin, dervorin, Keyword.MUSTER)); + + _game.getGameState().addCardToZone(_game, cardInHand1, Zone.HAND); + _game.getGameState().addCardToZone(_game, cardInHand2, Zone.HAND); + _game.getGameState().addCardToZone(_game, cardInHand3, Zone.HAND); + _game.getGameState().addCardToZone(_game, cardInHand4, Zone.HAND); + + // End fellowship phase + playerDecided(P1, ""); + + // End shadow phase + playerDecided(P2, ""); + + final AwaitingDecision optionalStartOfRegroupDecision = _userFeedback.getAwaitingDecision(P1); + assertEquals(AwaitingDecisionType.CARD_ACTION_CHOICE, optionalStartOfRegroupDecision.getDecisionType()); + validateContents(new String[]{"" + dervorin.getCardId(), "" + dervorin.getCardId()}, (String[]) optionalStartOfRegroupDecision.getDecisionParameters().get("cardId")); + + playerDecided(P1, getCardActionId(optionalStartOfRegroupDecision, "Use ")); + playerDecided(P1, String.valueOf(cardInHand1.getCardId())); + + final AwaitingDecision regroupPhaseActionDecision = _userFeedback.getAwaitingDecision(P1); + assertEquals(AwaitingDecisionType.CARD_ACTION_CHOICE, regroupPhaseActionDecision.getDecisionType()); + validateContents(new String[]{}, (String[]) regroupPhaseActionDecision.getDecisionParameters().get("cardId")); + + assertEquals(Phase.REGROUP, _game.getGameState().getCurrentPhase()); + } }