diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/RoamingPenaltyModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/RoamingPenaltyModifier.java index 109b6ddcb..ea8e4965b 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/RoamingPenaltyModifier.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/RoamingPenaltyModifier.java @@ -1,6 +1,6 @@ package com.gempukku.lotro.cards.modifiers; -import com.gempukku.lotro.filters.Filter; +import com.gempukku.lotro.common.Filterable; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.GameState; import com.gempukku.lotro.logic.modifiers.AbstractModifier; @@ -10,7 +10,7 @@ import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; public class RoamingPenaltyModifier extends AbstractModifier { private int _modifier; - public RoamingPenaltyModifier(PhysicalCard source, Filter affectFilter, int modifier) { + public RoamingPenaltyModifier(PhysicalCard source, Filterable affectFilter, int modifier) { super(source, "Roaming penalty " + ((modifier > 0) ? ("+" + modifier) : modifier), affectFilter, ModifierEffect.TWILIGHT_COST_MODIFIER); _modifier = modifier; } 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 ad11990d6..3dc3749ea 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,12 +7,11 @@ 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; @@ -118,7 +117,7 @@ public abstract class AbstractAtTest { lotroDeck.setRing("1_2"); // 7_330,7_336,8_117,7_342,7_345,7_350,8_120,10_120,7_360 lotroDeck.addSite("7_330"); - lotroDeck.addSite("7_336"); + lotroDeck.addSite("7_335"); lotroDeck.addSite("8_117"); lotroDeck.addSite("7_342"); lotroDeck.addSite("7_345"); diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/RoamingAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/RoamingAtTest.java new file mode 100644 index 000000000..6b3770e24 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/RoamingAtTest.java @@ -0,0 +1,199 @@ +package com.gempukku.lotro.at; + +import com.gempukku.lotro.cards.modifiers.MinionSiteNumberModifier; +import com.gempukku.lotro.cards.modifiers.RoamingPenaltyModifier; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Keyword; +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.RemoveKeywordModifier; +import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class RoamingAtTest extends AbstractAtTest { + @Test + public void cantPlayRoamingMinionIfNotEnoughTwilight() throws DecisionResultInvalidException { + Map> extraCards = new HashMap>(); + initializeSimplestGame(extraCards); + + PhysicalCardImpl orcChieftain = new PhysicalCardImpl(100, "1_266", P2, _library.getLotroCardBlueprint("1_266")); + + skipMulligans(); + + _game.getGameState().addCardToZone(_game, orcChieftain, Zone.HAND); + + // End fellowship phase + playerDecided(P1, ""); + + assertEquals(2, _game.getGameState().getTwilightPool()); + // Can't play the Orc Chieftain + AwaitingDecision shadowPhaseDecision = _userFeedback.getAwaitingDecision(P2); + assertEquals(AwaitingDecisionType.CARD_ACTION_CHOICE, shadowPhaseDecision.getDecisionType()); + validateContents(new String[0], (String[]) shadowPhaseDecision.getDecisionParameters().get("actionId")); + + // Orc Chieftain still in hand + assertEquals(Zone.HAND, orcChieftain.getZone()); + } + + @Test + public void payingForRoamingMinionDefaultRoamingPenalty() throws DecisionResultInvalidException { + Map> extraCards = new HashMap>(); + initializeSimplestGame(extraCards); + + PhysicalCardImpl orcChieftain = new PhysicalCardImpl(100, "1_266", P2, _library.getLotroCardBlueprint("1_266")); + + skipMulligans(); + + _game.getGameState().addCardToZone(_game, orcChieftain, Zone.HAND); + _game.getGameState().addTwilight(2); + + // End fellowship phase + playerDecided(P1, ""); + + assertEquals(4, _game.getGameState().getTwilightPool()); + // Can't play the Orc Chieftain + AwaitingDecision shadowPhaseDecision = _userFeedback.getAwaitingDecision(P2); + assertEquals(AwaitingDecisionType.CARD_ACTION_CHOICE, shadowPhaseDecision.getDecisionType()); + validateContents(new String[]{"" + orcChieftain.getCardId()}, (String[]) shadowPhaseDecision.getDecisionParameters().get("cardId")); + + playerDecided(P2, getCardActionId(shadowPhaseDecision, "Play ")); + + // Orc Chieftain in play + assertEquals(Zone.SHADOW_CHARACTERS, orcChieftain.getZone()); + assertEquals(0, _game.getGameState().getTwilightPool()); + assertTrue(_game.getModifiersQuerying().hasKeyword(_game.getGameState(), orcChieftain, Keyword.ROAMING)); + } + + @Test + public void payingForRoamingMinionDiscountRoamingPenalty() throws DecisionResultInvalidException { + Map> extraCards = new HashMap>(); + initializeSimplestGame(extraCards); + + PhysicalCardImpl orcChieftain = new PhysicalCardImpl(100, "1_266", P2, _library.getLotroCardBlueprint("1_266")); + + skipMulligans(); + + _game.getGameState().addCardToZone(_game, orcChieftain, Zone.HAND); + _game.getModifiersEnvironment().addUntilEndOfTurnModifier( + new RoamingPenaltyModifier(orcChieftain, Culture.SAURON, -1)); + _game.getGameState().addTwilight(2); + + // End fellowship phase + playerDecided(P1, ""); + + assertEquals(4, _game.getGameState().getTwilightPool()); + // Can't play the Orc Chieftain + AwaitingDecision shadowPhaseDecision = _userFeedback.getAwaitingDecision(P2); + assertEquals(AwaitingDecisionType.CARD_ACTION_CHOICE, shadowPhaseDecision.getDecisionType()); + validateContents(new String[]{"" + orcChieftain.getCardId()}, (String[]) shadowPhaseDecision.getDecisionParameters().get("cardId")); + + playerDecided(P2, getCardActionId(shadowPhaseDecision, "Play ")); + + // Orc Chieftain in play + assertEquals(Zone.SHADOW_CHARACTERS, orcChieftain.getZone()); + assertEquals(1, _game.getGameState().getTwilightPool()); + assertTrue(_game.getModifiersQuerying().hasKeyword(_game.getGameState(), orcChieftain, Keyword.ROAMING)); + } + + @Test + public void payingForRoamingMinionNotRoamingModifier() throws DecisionResultInvalidException { + Map> extraCards = new HashMap>(); + initializeSimplestGame(extraCards); + + PhysicalCardImpl orcChieftain = new PhysicalCardImpl(100, "1_266", P2, _library.getLotroCardBlueprint("1_266")); + + skipMulligans(); + + _game.getGameState().addCardToZone(_game, orcChieftain, Zone.HAND); + _game.getModifiersEnvironment().addUntilEndOfTurnModifier( + new RemoveKeywordModifier(orcChieftain, Culture.SAURON, Keyword.ROAMING)); + _game.getGameState().addTwilight(2); + + // End fellowship phase + playerDecided(P1, ""); + + assertEquals(4, _game.getGameState().getTwilightPool()); + // Can't play the Orc Chieftain + AwaitingDecision shadowPhaseDecision = _userFeedback.getAwaitingDecision(P2); + assertEquals(AwaitingDecisionType.CARD_ACTION_CHOICE, shadowPhaseDecision.getDecisionType()); + validateContents(new String[]{"" + orcChieftain.getCardId()}, (String[]) shadowPhaseDecision.getDecisionParameters().get("cardId")); + + playerDecided(P2, getCardActionId(shadowPhaseDecision, "Play ")); + + // Orc Chieftain in play + assertEquals(Zone.SHADOW_CHARACTERS, orcChieftain.getZone()); + assertEquals(2, _game.getGameState().getTwilightPool()); + assertFalse(_game.getModifiersQuerying().hasKeyword(_game.getGameState(), orcChieftain, Keyword.ROAMING)); + } + + @Test + public void payingForRoamingMinionSiteNumberModifier() throws DecisionResultInvalidException { + Map> extraCards = new HashMap>(); + initializeSimplestGame(extraCards); + + PhysicalCardImpl orcChieftain = new PhysicalCardImpl(100, "1_266", P2, _library.getLotroCardBlueprint("1_266")); + + skipMulligans(); + + _game.getGameState().addCardToZone(_game, orcChieftain, Zone.HAND); + _game.getModifiersEnvironment().addUntilEndOfTurnModifier( + new MinionSiteNumberModifier(orcChieftain, Culture.SAURON, null, -4)); + _game.getGameState().addTwilight(2); + + // End fellowship phase + playerDecided(P1, ""); + + assertEquals(4, _game.getGameState().getTwilightPool()); + // Can't play the Orc Chieftain + AwaitingDecision shadowPhaseDecision = _userFeedback.getAwaitingDecision(P2); + assertEquals(AwaitingDecisionType.CARD_ACTION_CHOICE, shadowPhaseDecision.getDecisionType()); + validateContents(new String[]{"" + orcChieftain.getCardId()}, (String[]) shadowPhaseDecision.getDecisionParameters().get("cardId")); + + playerDecided(P2, getCardActionId(shadowPhaseDecision, "Play ")); + + // Orc Chieftain in play + assertEquals(Zone.SHADOW_CHARACTERS, orcChieftain.getZone()); + assertEquals(2, _game.getGameState().getTwilightPool()); + assertFalse(_game.getModifiersQuerying().hasKeyword(_game.getGameState(), orcChieftain, Keyword.ROAMING)); + } + + @Test + public void payingForRoamingMinionSiteNumberModifierNotEnough() throws DecisionResultInvalidException { + Map> extraCards = new HashMap>(); + initializeSimplestGame(extraCards); + + PhysicalCardImpl orcChieftain = new PhysicalCardImpl(100, "1_266", P2, _library.getLotroCardBlueprint("1_266")); + + skipMulligans(); + + _game.getGameState().addCardToZone(_game, orcChieftain, Zone.HAND); + _game.getModifiersEnvironment().addUntilEndOfTurnModifier( + new MinionSiteNumberModifier(orcChieftain, Culture.SAURON, null, -3)); + _game.getGameState().addTwilight(2); + + // End fellowship phase + playerDecided(P1, ""); + + assertEquals(4, _game.getGameState().getTwilightPool()); + // Can't play the Orc Chieftain + AwaitingDecision shadowPhaseDecision = _userFeedback.getAwaitingDecision(P2); + assertEquals(AwaitingDecisionType.CARD_ACTION_CHOICE, shadowPhaseDecision.getDecisionType()); + validateContents(new String[]{"" + orcChieftain.getCardId()}, (String[]) shadowPhaseDecision.getDecisionParameters().get("cardId")); + + playerDecided(P2, getCardActionId(shadowPhaseDecision, "Play ")); + + // Orc Chieftain in play + assertEquals(Zone.SHADOW_CHARACTERS, orcChieftain.getZone()); + assertEquals(0, _game.getGameState().getTwilightPool()); + assertTrue(_game.getModifiersQuerying().hasKeyword(_game.getGameState(), orcChieftain, Keyword.ROAMING)); + } +}