diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Sites.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Sites.hjson index b61791734..9c3fbf188 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Sites.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Sites.hjson @@ -753,6 +753,13 @@ { type: activated phase: fellowship + requires: { + type: IsGreaterThan + firstNumber: { + type: ForEachInHand + } + secondNumber: 0 + } effect: [ { type: putCardsFromHandOnBottomOfDeck 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 539f323fb..0b5e71137 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 @@ -83,7 +83,6 @@ public class EffectAppenderFactory { effectAppenderProducers.put("filtercardsinmemory", new FilterCardsInMemory()); effectAppenderProducers.put("getcardsfromtopofdeck", new GetCardsFromTopOfDeck()); effectAppenderProducers.put("heal", new Heal()); - effectAppenderProducers.put("if", new IfEffect()); effectAppenderProducers.put("incrementperphaselimit", new IncrementPerPhaseLimit()); effectAppenderProducers.put("incrementperturnlimit", new IncrementPerTurnLimit()); effectAppenderProducers.put("incrementtoil", new IncrementToil()); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDeckOnBottomOfDeck.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDeckOnBottomOfDeck.java index d90233189..ee61b63f0 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDeckOnBottomOfDeck.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDeckOnBottomOfDeck.java @@ -47,7 +47,9 @@ public class PutCardsFromDeckOnBottomOfDeck implements EffectAppenderProducer { protected void cardsSelected(LotroGame game, Collection selectedCards) { PhysicalCard card = selectedCards.iterator().next(); // Removed from remaining - cards.remove(card); + for(var effect : result) { + ((ChooseArbitraryCardsEffect)effect).removeCard(card); + } GameState gameState = game.getGameState(); if (reveal) { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDeckOnTopOfDeck.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDeckOnTopOfDeck.java index 5be3b3dcc..d25857f9c 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDeckOnTopOfDeck.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDeckOnTopOfDeck.java @@ -47,7 +47,9 @@ public class PutCardsFromDeckOnTopOfDeck implements EffectAppenderProducer { protected void cardsSelected(LotroGame game, Collection selectedCards) { PhysicalCard card = selectedCards.iterator().next(); // Removed from remaining - cards.remove(card); + for(var effect : result) { + ((ChooseArbitraryCardsEffect)effect).removeCard(card); + } GameState gameState = game.getGameState(); if (reveal) { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDiscardOnBottomOfDeck.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDiscardOnBottomOfDeck.java index b5db28ec0..f3368636f 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDiscardOnBottomOfDeck.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDiscardOnBottomOfDeck.java @@ -46,7 +46,9 @@ public class PutCardsFromDiscardOnBottomOfDeck implements EffectAppenderProducer protected void cardsSelected(LotroGame game, Collection selectedCards) { PhysicalCard card = selectedCards.iterator().next(); // Removed from remaining - cards.remove(card); + for(var effect : result) { + ((ChooseArbitraryCardsEffect)effect).removeCard(card); + } GameState gameState = game.getGameState(); gameState.sendMessage(card.getOwner() + " puts " + GameUtils.getCardLink(card) + " from discard on the bottom of deck"); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDiscardOnTopOfDeck.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDiscardOnTopOfDeck.java index 84432bdeb..e5824e923 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDiscardOnTopOfDeck.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromDiscardOnTopOfDeck.java @@ -46,7 +46,9 @@ public class PutCardsFromDiscardOnTopOfDeck implements EffectAppenderProducer { protected void cardsSelected(LotroGame game, Collection selectedCards) { PhysicalCard card = selectedCards.iterator().next(); // Removed from remaining - cards.remove(card); + for(var effect : result) { + ((ChooseArbitraryCardsEffect)effect).removeCard(card); + } GameState gameState = game.getGameState(); gameState.sendMessage(card.getOwner() + " puts " + GameUtils.getCardLink(card) + " from discard on the top of deck"); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromHandOnBottomOfDeck.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromHandOnBottomOfDeck.java index 13caa5ee8..2dcf21807 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromHandOnBottomOfDeck.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromHandOnBottomOfDeck.java @@ -49,7 +49,9 @@ public class PutCardsFromHandOnBottomOfDeck implements EffectAppenderProducer { protected void cardsSelected(LotroGame game, Collection selectedCards) { PhysicalCard card = selectedCards.iterator().next(); // Removed from remaining - cards.remove(card); + for(var effect : result) { + ((ChooseArbitraryCardsEffect)effect).removeCard(card); + } GameState gameState = game.getGameState(); if (reveal) { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromHandOnTopOfDeck.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromHandOnTopOfDeck.java index 518239524..90df9220d 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromHandOnTopOfDeck.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromHandOnTopOfDeck.java @@ -50,7 +50,9 @@ public class PutCardsFromHandOnTopOfDeck implements EffectAppenderProducer { protected void cardsSelected(LotroGame game, Collection selectedCards) { PhysicalCard card = selectedCards.iterator().next(); // Removed from remaining - cards.remove(card); + for(var effect : result) { + ((ChooseArbitraryCardsEffect)effect).removeCard(card); + } GameState gameState = game.getGameState(); if (reveal) { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromPlayOnBottomOfDeck.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromPlayOnBottomOfDeck.java index 5a6ae65e0..bbecbe2a4 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromPlayOnBottomOfDeck.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromPlayOnBottomOfDeck.java @@ -47,7 +47,9 @@ public class PutCardsFromPlayOnBottomOfDeck implements EffectAppenderProducer { protected void cardsSelected(LotroGame game, Collection selectedCards) { PhysicalCard card = selectedCards.iterator().next(); // Removed from remaining - cards.remove(card); + for(var effect : result) { + ((ChooseArbitraryCardsEffect)effect).removeCard(card); + } GameState gameState = game.getGameState(); gameState.sendMessage(card.getOwner() + " puts " + GameUtils.getCardLink(card) + " from play on the bottom of deck"); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromPlayOnTopOfDeck.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromPlayOnTopOfDeck.java index 0a63b8ab3..9b2a53ee9 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromPlayOnTopOfDeck.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/PutCardsFromPlayOnTopOfDeck.java @@ -47,7 +47,9 @@ public class PutCardsFromPlayOnTopOfDeck implements EffectAppenderProducer { protected void cardsSelected(LotroGame game, Collection selectedCards) { PhysicalCard card = selectedCards.iterator().next(); // Removed from remaining - cards.remove(card); + for(var effect : result) { + ((ChooseArbitraryCardsEffect)effect).removeCard(card); + } GameState gameState = game.getGameState(); gameState.sendMessage(card.getOwner() + " puts " + GameUtils.getCardLink(card) + " from play on the top of deck"); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java index 4b9a8254c..2d490a149 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java @@ -497,7 +497,7 @@ public class GameState { if (assignment.getFellowshipCharacter() == card) removeAssignment(assignment); if (assignment.getShadowCharacters().remove(card)) - if (assignment.getShadowCharacters().size() == 0) + if (assignment.getShadowCharacters().isEmpty()) removeAssignment(assignment); } @@ -534,7 +534,7 @@ public class GameState { if (end) zoneCards.add((PhysicalCardImpl) card); else - zoneCards.add(0, (PhysicalCardImpl) card); + zoneCards.addFirst((PhysicalCardImpl) card); if (card.getZone() != null) _log.error("Card was in " + card.getZone() + " when tried to add to zone: " + zone); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ChooseArbitraryCardsEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ChooseArbitraryCardsEffect.java index 40cec2ddc..ea6bfaac3 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ChooseArbitraryCardsEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/ChooseArbitraryCardsEffect.java @@ -87,5 +87,9 @@ public abstract class ChooseArbitraryCardsEffect extends AbstractEffect { return new FullEffectResult(success); } + public void removeCard(PhysicalCard card) { + _cards.remove(card); + } + protected abstract void cardsSelected(LotroGame game, Collection selectedCards); } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_337_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_337_Tests.java index 5174ebdce..f27e381b5 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_337_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_337_Tests.java @@ -17,10 +17,38 @@ public class Card_04_337_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "4_337"); - // put other cards in here as needed for the test case + put("fodder01", "5_1"); + put("fodder02", "5_2"); + put("fodder03", "5_3"); + put("fodder04", "5_4"); + put("fodder05", "5_5"); + put("fodder06", "5_6"); + put("fodder07", "5_7"); + put("fodder08", "5_8"); + put("fodder09", "5_9"); + put("fodder10", "5_10"); + put("fodder11", "5_11"); + put("fodder12", "5_12"); + put("fodder13", "5_13"); + put("fodder14", "5_14"); + put("fodder15", "5_15"); + put("fodder16", "5_16"); + put("fodder17", "5_17"); + put("fodder18", "5_18"); + put("fodder19", "5_19"); + put("fodder20", "5_20"); + }}, + new HashMap<>() {{ + put("site1", "1_319"); + put("site2", "1_327"); + put("site3", "4_337"); + put("site4", "1_343"); + put("site5", "1_349"); + put("site6", "101_61"); + put("site7", "3_118"); + put("site8", "1_356"); + put("site9", "1_360"); }}, - GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, GenericCardTestHelper.RulingRing ); @@ -45,8 +73,8 @@ public class Card_04_337_Tests var scn = GetScenario(); //Use this once you have set the deck up properly - //var card = scn.GetFreepsSite(3); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsSite(3); + //var card = scn.GetFreepsCard("barrows"); assertEquals("Barrows of Edoras", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -57,18 +85,93 @@ public class Card_04_337_Tests assertEquals(3, card.getBlueprint().getSiteNumber()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void BarrowsofEdorasTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void BarrowsofEdorasAbilityPutsCardsOnBottomOfDeckAndDraws4TheFirstTimeItIsActivated() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var barrows = scn.GetShadowSite(3); + + var fodder01 = scn.GetFreepsCard("fodder01"); + var fodder02 = scn.GetFreepsCard("fodder02"); + var fodder03 = scn.GetFreepsCard("fodder03"); + var fodder04 = scn.GetFreepsCard("fodder04"); + var fodder05 = scn.GetFreepsCard("fodder05"); + var fodder06 = scn.GetFreepsCard("fodder06"); + var fodder07 = scn.GetFreepsCard("fodder07"); + var fodder08 = scn.GetFreepsCard("fodder08"); + var fodder09 = scn.GetFreepsCard("fodder09"); + var fodder10 = scn.GetFreepsCard("fodder10"); + var fodder11 = scn.GetFreepsCard("fodder11"); + var fodder12 = scn.GetFreepsCard("fodder12"); + var fodder13 = scn.GetFreepsCard("fodder13"); + var fodder14 = scn.GetFreepsCard("fodder14"); + var fodder15 = scn.GetFreepsCard("fodder15"); + var fodder16 = scn.GetFreepsCard("fodder16"); + var fodder17 = scn.GetFreepsCard("fodder17"); + var fodder18 = scn.GetFreepsCard("fodder18"); + var fodder19 = scn.GetFreepsCard("fodder19"); + var fodder20 = scn.GetFreepsCard("fodder20"); + + scn.FreepsMoveCardToHand(fodder01, fodder02, fodder03, fodder04, fodder05, fodder06, fodder07, fodder08); + scn.FreepsMoveCardsToTopOfDeck(fodder20, fodder19, fodder18, fodder17, fodder16, fodder15, fodder14, fodder13, fodder12, fodder11, fodder10, fodder09); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(0, scn.GetTwilight()); + assertEquals(8, scn.GetFreepsHandCount()); + + scn.SkipToSite(3); + + assertEquals(Phase.FELLOWSHIP, scn.GetCurrentPhase()); + assertEquals(3, (long)scn.GetCurrentSite().getSiteNumber()); + + assertTrue(scn.FreepsActionAvailable(barrows)); + + scn.FreepsUseCardAction(barrows); + + scn.FreepsChooseCardBPFromSelection(fodder08); + scn.FreepsChooseCardBPFromSelection(fodder07); + scn.FreepsChooseCardBPFromSelection(fodder06); + scn.FreepsChooseCardBPFromSelection(fodder05); + scn.FreepsChooseCardBPFromSelection(fodder04); + scn.FreepsChooseCardBPFromSelection(fodder03); + scn.FreepsChooseCardBPFromSelection(fodder02); + //No player choice for the last card as Gemp performs a choice of 1 automatically + + assertEquals(scn.GetFromBottomOfFreepsDeck(1), fodder01); + assertEquals(scn.GetFromBottomOfFreepsDeck(2), fodder02); + assertEquals(scn.GetFromBottomOfFreepsDeck(3), fodder03); + assertEquals(scn.GetFromBottomOfFreepsDeck(4), fodder04); + assertEquals(scn.GetFromBottomOfFreepsDeck(5), fodder05); + assertEquals(scn.GetFromBottomOfFreepsDeck(6), fodder06); + assertEquals(scn.GetFromBottomOfFreepsDeck(7), fodder07); + assertEquals(scn.GetFromBottomOfFreepsDeck(8), fodder08); + + assertEquals(4, scn.GetFreepsHandCount()); + assertEquals(Zone.HAND, fodder09.getZone()); + assertEquals(Zone.HAND, fodder10.getZone()); + assertEquals(Zone.HAND, fodder11.getZone()); + assertEquals(Zone.HAND, fodder12.getZone()); + + //Do it again, Sam + + assertTrue(scn.FreepsActionAvailable(barrows)); + + scn.FreepsUseCardAction(barrows); + + scn.FreepsChooseCardBPFromSelection(fodder12); + scn.FreepsChooseCardBPFromSelection(fodder11); + scn.FreepsChooseCardBPFromSelection(fodder10); + //No player choice for the last card as Gemp performs a choice of 1 automatically + + assertEquals(scn.GetFromBottomOfFreepsDeck(1), fodder09); + assertEquals(scn.GetFromBottomOfFreepsDeck(2), fodder10); + assertEquals(scn.GetFromBottomOfFreepsDeck(3), fodder11); + assertEquals(scn.GetFromBottomOfFreepsDeck(4), fodder12); + + //Psyche! Rule of 4 means you can only really do this once + assertEquals(0, scn.GetFreepsHandCount()); + + assertFalse(scn.FreepsActionAvailable(barrows)); } }