From 42b9c57fcaf6d6cee52b4a81b66ed2e359aa8c81 Mon Sep 17 00:00:00 2001 From: Marcin Sciesinski Date: Fri, 18 Oct 2024 22:12:40 +0700 Subject: [PATCH] Added more ATs --- .../cards/official/set04/set04-Dwarven.hjson | 2 + .../cards/official/set13/set13-Men.hjson | 2 +- .../cards/official/set13/set13-Orc.hjson | 2 +- .../appender/resolver/CardResolver.java | 16 ++--- .../gempukku/lotro/at/AssignmentAtTest.java | 24 +++++++ .../lotro/at/ConcealedExposedAtTest.java | 37 +++++++++++ .../lotro/at/IndividualCardAtTest.java | 57 +++++++++++++++++ .../lotro/at/effects/KeywordAtTest.java | 63 +++++++++++++++++++ 8 files changed, 193 insertions(+), 10 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/effects/KeywordAtTest.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Dwarven.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Dwarven.hjson index da3e34879..1d906d988 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Dwarven.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set04/set04-Dwarven.hjson @@ -751,6 +751,7 @@ { type: ShuffleCardsFromPlayIntoDrawDeck select: choose(culture(dwarven),condition) + includeStacked: true count: any } ] @@ -794,6 +795,7 @@ { type: ShuffleCardsFromPlayIntoDrawDeck select: choose(culture(dwarven),condition) + includeStacked: true memorizeStacked: stackedCards } { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set13/set13-Men.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set13/set13-Men.hjson index d9ae11c7f..0e0b00b75 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set13/set13-Men.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set13/set13-Men.hjson @@ -161,7 +161,7 @@ filter: culture(men) } cost: { - type: revealCards + type: revealCardsFromHand select: self } effect: { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set13/set13-Orc.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set13/set13-Orc.hjson index bef77142b..b64a09454 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set13/set13-Orc.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set13/set13-Orc.hjson @@ -606,7 +606,7 @@ against: culture(orc),minion } cost: { - type: revealCards + type: revealCardsFromHand select: self } effect: { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java index d2a71c577..a350afeeb 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/resolver/CardResolver.java @@ -187,9 +187,9 @@ public class CardResolver { } public static EffectAppender resolveCardsInAdventureDeck(String type, FilterableSource additionalFilter, ValueSource countSource, String memory, String adventureDeckPlayer, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - final PlayerSource handSource = PlayerResolver.resolvePlayer(adventureDeckPlayer); + final PlayerSource playerDeckSource = PlayerResolver.resolvePlayer(adventureDeckPlayer); Function> cardSource = actionContext -> { - String handPlayer1 = handSource.getPlayer(actionContext); + String handPlayer1 = playerDeckSource.getPlayer(actionContext); return actionContext.getGame().getGameState().getAdventureDeck(handPlayer1); }; @@ -198,19 +198,19 @@ public class CardResolver { return new DelayedAppender() { @Override public boolean isPlayableInFull(ActionContext actionContext) { - final String handPlayer = handSource.getPlayer(actionContext); - return actionContext.getGame().getGameState().getHand(handPlayer).size() >= count; + final String playerDeck = playerDeckSource.getPlayer(actionContext); + return actionContext.getGame().getGameState().getHand(playerDeck).size() >= count; } @Override protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) { - final String handPlayer = handSource.getPlayer(actionContext); + final String playerDeck = playerDeckSource.getPlayer(actionContext); return new UnrespondableEffect() { @Override protected void doPlayEffect(LotroGame game) { - List hand = game.getGameState().getHand(handPlayer); - List randomCardsFromHand = GameUtils.getRandomCards(hand, 2); - actionContext.setCardMemory(memory, randomCardsFromHand); + List adventureDeck = game.getGameState().getAdventureDeck(playerDeck); + List randomCardsFromAdventureDeck = GameUtils.getRandomCards(adventureDeck, count); + actionContext.setCardMemory(memory, randomCardsFromAdventureDeck); } }; } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/AssignmentAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/AssignmentAtTest.java index 1d2248c74..d88c23c45 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/AssignmentAtTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/AssignmentAtTest.java @@ -672,4 +672,28 @@ public class AssignmentAtTest extends AbstractAtTest { } catch (DecisionResultInvalidException e) { } } + + @Test + public void setupExtraAssignmentAndSkirmishes() throws Exception { + initializeSimplestGame(); + + PhysicalCard witchKing = addToZone(createCard(P2, "12_183"), Zone.SHADOW_CHARACTERS); + PhysicalCard fellBeast = attachTo(createCard(P2, "12_184"), witchKing); + + passUntil(Phase.ASSIGNMENT); + // Normal skirmishes + pass(P1); + pass(P2); + pass(P1); + pass(P2); + // Fierce skirmishes + pass(P1); + pass(P2); + pass(P1); + pass(P2); + selectCardAction(P2, fellBeast); + assertEquals(2, getWounds(witchKing)); + assertEquals(Phase.ASSIGNMENT, getPhase()); + assertTrue(_game.getGameState().isExtraSkirmishes()); + } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/ConcealedExposedAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/ConcealedExposedAtTest.java index 89fc958d1..5bcdc6a2a 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/ConcealedExposedAtTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/ConcealedExposedAtTest.java @@ -16,6 +16,7 @@ import org.junit.Test; import java.util.HashMap; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; public class ConcealedExposedAtTest extends AbstractAtTest { protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { @@ -160,4 +161,40 @@ public class ConcealedExposedAtTest extends AbstractAtTest { selectCardAction(P1, questionsThatNeedAnswering); assertEquals(AwaitingDecisionType.ARBITRARY_CARDS, getAwaitingDecision(P1).getDecisionType()); } + + @Test + public void revealBottomCardsOfDrawDeck() throws Exception { + initializeSimplestGame(); + + PhysicalCard shepherdOfTheTrees = addToZone(createCard(P1, "15_36"), Zone.FREE_CHARACTERS); + PhysicalCard goblinRunner = addToZone(createCard(P2, "1_178"), Zone.SHADOW_CHARACTERS); + + passUntil(Phase.FELLOWSHIP); + PhysicalCard topCard = addToZone(createCard(P1, "1_3"), Zone.DECK); + PhysicalCard middleCard = addToZone(createCard(P1, "1_4"), Zone.DECK); + PhysicalCard bottomCard = addToZone(createCard(P1, "1_5"), Zone.DECK); + + passUntil(Phase.MANEUVER); + selectCardAction(P1, shepherdOfTheTrees); + assertNotNull(getArbitraryCardId(P1, "1_5")); + assertNotNull(getArbitraryCardId(P2, "1_5")); + } + + @Test + public void revealCardsFromAdventureDeck() throws Exception { + initializeSimplestGame(); + + PhysicalCard destroyedHomestead = addToZone(createCard(P2, "15_76"), Zone.HAND); + PhysicalCard easterlingScout1 = addToZone(createCard(P2, "15_77"), Zone.SHADOW_CHARACTERS); + PhysicalCard easterlingScout2 = addToZone(createCard(P2, "15_77"), Zone.SHADOW_CHARACTERS); + + passUntil(Phase.FELLOWSHIP); + setTwilightPool(10); + passUntil(Phase.SHADOW); + selectCardAction(P2, destroyedHomestead); + assertEquals("Revealed card(s)", getAwaitingDecision(P1).getText()); + assertEquals(1, getAwaitingDecision(P1).getDecisionParameters().get("cardId").length); + assertEquals("Revealed card(s)", getAwaitingDecision(P2).getText()); + assertEquals(1, getAwaitingDecision(P2).getDecisionParameters().get("cardId").length); + } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java index a8ad8e69f..94127dc7f 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java @@ -9,6 +9,7 @@ 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.timing.DefaultLotroGame; +import com.gempukku.lotro.logic.timing.RuleUtils; import com.gempukku.lotro.logic.vo.LotroDeck; import org.junit.Test; @@ -1317,4 +1318,60 @@ public class IndividualCardAtTest extends AbstractAtTest { assertTrue(_game.isFinished()); assertEquals(P2, _game.getWinnerPlayerId()); } + + @Test + public void reorderTopCardsOfDrawDeck() throws Exception { + initializeSimplestGame(); + + PhysicalCard gandalf = addToZone(createCard(P1, "1_72"), Zone.FREE_CHARACTERS); + PhysicalCard discoveries = addToZone(createCard(P1, "12_26"), Zone.HAND); + PhysicalCard gimli = addToZone(createCard(P1, "5_7"), Zone.FREE_CHARACTERS); + + passUntil(Phase.FELLOWSHIP); + PhysicalCard topCard = addToZone(createCard(P1, "1_3"), Zone.DECK); + PhysicalCard middleCard = addToZone(createCard(P1, "1_4"), Zone.DECK); + PhysicalCard bottomCard = addToZone(createCard(P1, "1_5"), Zone.DECK); + selectCardAction(P1, discoveries); + pass(P1); + playerDecided(P1, "3"); + selectArbitraryCards(P1, getArbitraryCardId(P1, "1_3")); + + List deck = _game.getGameState().getDeck(P1); + assertEquals(middleCard, deck.get(0)); + assertEquals(topCard, deck.get(1)); + assertEquals(bottomCard, deck.get(2)); + } + + @Test + public void setStrengthOverride() throws Exception { + initializeSimplestGame(); + + PhysicalCard ringBearer = getRingBearer(P1); + PhysicalCard finalTriumph = addToZone(createCard(P2, "18_115"), Zone.HAND); + PhysicalCard whiteHandExorciser = addToZone(createCard(P2, "18_125"), Zone.SHADOW_CHARACTERS); + + passUntil(Phase.ASSIGNMENT); + pass(P1); + pass(P2); + setTwilightPool(4); + playerDecided(P1, ringBearer.getCardId()+" "+whiteHandExorciser.getCardId()); + selectCard(P1, ringBearer); + pass(P1); + selectCardAction(P2, finalTriumph); + assertEquals(4, RuleUtils.getFellowshipSkirmishStrength(_game)); + assertEquals(1, RuleUtils.getShadowSkirmishStrength(_game)); + } + + @Test + public void shuffleCardsFromPlayIntoDrawDeck() throws Exception { + initializeSimplestGame(); + + PhysicalCard restByBlindNight = addToZone(createCard(P1, "4_54"), Zone.HAND); + PhysicalCard stoutAndStrong = addToZone(createCard(P1, "4_57"), Zone.SUPPORT); + + passUntil(Phase.REGROUP); + selectCardAction(P1, restByBlindNight); + selectCard(P1, stoutAndStrong); + assertEquals(Zone.DECK, stoutAndStrong.getZone()); + } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/effects/KeywordAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/effects/KeywordAtTest.java new file mode 100644 index 000000000..eeed70dee --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/effects/KeywordAtTest.java @@ -0,0 +1,63 @@ +package com.gempukku.lotro.at.effects; + +import com.gempukku.lotro.at.AbstractAtTest; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.common.Zone; +import com.gempukku.lotro.game.PhysicalCard; +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class KeywordAtTest extends AbstractAtTest { + @Test + public void removeKeyword() throws Exception{ + initializeSimplestGame(); + + PhysicalCard blendedRace = addToZone(createCard(P1, "2_16"), Zone.SUPPORT); + PhysicalCard lurtz = addToZone(createCard(P2, "1_127"), Zone.SHADOW_CHARACTERS); + + passUntil(Phase.FELLOWSHIP); + assertFalse(hasKeyword(lurtz, Keyword.DAMAGE)); + } + + @Test + public void removeKeywordEffect() throws Exception { + initializeSimplestGame(); + + PhysicalCard merry = addToZone(createCard(P1, "1_302"), Zone.FREE_CHARACTERS); + PhysicalCard seekAndHide = addToZone(createCard(P1, "3_112"), Zone.HAND); + PhysicalCard urukHaiRaidingParty = addToZone(createCard(P2, "1_158"), Zone.SHADOW_CHARACTERS); + + passUntil(Phase.ASSIGNMENT); + pass(P1); + pass(P2); + playerDecided(P1, merry.getCardId()+" "+urukHaiRaidingParty.getCardId()); + selectCard(P1, merry); + + assertTrue(hasKeyword(urukHaiRaidingParty, Keyword.DAMAGE)); + selectCardAction(P1, seekAndHide); + assertFalse(hasKeyword(urukHaiRaidingParty, Keyword.DAMAGE)); + } + + @Test + public void removeGameText() throws Exception { + initializeSimplestGame(); + + PhysicalCard ringBearer = getRingBearer(P1); + PhysicalCard vialOfGaladriel = attachTo(createCard(P1, "10_13"), ringBearer); + + PhysicalCard urukHaiRaidingParty = addToZone(createCard(P2, "1_158"), Zone.SHADOW_CHARACTERS); + + passUntil(Phase.ASSIGNMENT); + pass(P1); + pass(P2); + playerDecided(P1, ringBearer.getCardId()+" "+urukHaiRaidingParty.getCardId()); + selectCard(P1, ringBearer); + + assertTrue(hasKeyword(urukHaiRaidingParty, Keyword.DAMAGE)); + selectCardAction(P1, vialOfGaladriel); + assertFalse(hasKeyword(urukHaiRaidingParty, Keyword.DAMAGE)); + } +}