From 5505bd346ede0ba2fc4f978aacacd40c77ed75bf Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Thu, 17 Oct 2024 22:19:22 -0500 Subject: [PATCH 1/8] Fixed Ulaire Nertea causing Ford of Bruinen to apply its discount to all Nazgul played by Nertea's ability --- .../cards/official/set01/set1-wraith.hjson | 102 ++++++------ .../resources/cards/official/set01/set1.hjson | 76 ++------- .../set01/set01-Ringwraith-errata.hjson | 102 ++++++------ .../official/set01/Card_01_234_Tests.java | 8 + .../official/set01/Card_01_338_Tests.java | 152 ++++++++++++++++++ .../errata/set01/Card_01_234_ErrataTests.java | 8 + 6 files changed, 281 insertions(+), 167 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_338_Tests.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1-wraith.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1-wraith.hjson index 744747fd2..53513a22d 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1-wraith.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1-wraith.hjson @@ -978,10 +978,22 @@ site: 3 effects: { type: trigger + optional: true trigger: { type: played filter: self } + requires: [ + { + type: CanSpot + filter: companion + count: 5 + } + { + type: PlayableFromDiscard + filter: minion + } + ] effect: [ { type: MemorizeValue @@ -989,61 +1001,47 @@ value: yes } { - type: conditional - requires: [ - { - type: CanSpot - filter: companion - count: 5 - } - { - type: PlayableFromDiscard - filter: minion - } - ] + type: Repeat + amount: { + type: forEachYouCanSpot + filter: companion + over: 4 + } effect: { - type: Repeat - amount: { - type: forEachYouCanSpot - filter: companion - over: 4 - } - effect: { - type: conditional - requires: [ - { - type: MemoryIs - memory: choice - value: yes - } - { - type: HasCardInDiscard - filter: playable,minion - } - ] - effect: [ - { - type: chooseYesOrNo - player: you - text: Would you like to play a minion from your discard? - memorize: choice - } - { - type: conditional - requires: [ - { - type: MemoryIs - memory: choice - value: yes - } - ] - effect: { - type: playCardFromDiscard - filter: choose(minion) + type: conditional + requires: [ + { + type: MemoryIs + memory: choice + value: yes + } + { + type: HasCardInDiscard + filter: playable,minion + } + ] + effect: [ + { + type: chooseYesOrNo + player: you + text: Would you like to play a minion from your discard? + memorize: choice + } + { + type: conditional + requires: [ + { + type: MemoryIs + memory: choice + value: yes } + ] + effect: { + type: playCardFromDiscard + filter: choose(minion) } - ] - } + } + ] } } ] diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1.hjson index 9437e663f..ad963c84e 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1.hjson @@ -526,7 +526,10 @@ type: site site: 3 block: fellowship - keyword: river + keywords: [ + river + Sanctuary + ] direction: right effects: [ { @@ -534,11 +537,8 @@ modifier: { type: modifyCost requires: { - type: not - requires: { - type: hasInZoneData - filter: self - } + type: perTurnLimit + limit: 1 } filter: nazgul amount: -5 @@ -549,41 +549,10 @@ trigger: { type: played filter: nazgul - memorize: playedNazgul - } - requires: { - type: not - requires: { - type: hasInZoneData - filter: self - } } effect: { - type: appendCardIdsToWhileInZone - memory: playedNazgul - } - } - { - type: trigger - trigger: { - type: endOfTurn - } - effect: { - type: resetWhileInZoneData - } - } - { - type: trigger - trigger: { - type: movesFrom - filter: self - } - requires: { - type: phase - phase: regroup - } - effect: { - type: resetWhileInZoneData + type: incrementPerTurnLimit + limit: 1 } } ] @@ -900,17 +869,15 @@ site: 6 block: fellowship direction: left + keywords: Sanctuary effects: [ { type: modifier modifier: { type: modifyCost requires: { - type: not - requires: { - type: hasInZoneData - filter: self - } + type: perPhaseLimit + limit: 1 } filter: culture(moria),orc amount: -2 @@ -923,26 +890,9 @@ filter: culture(moria),orc memorize: playedOrc } - requires: { - type: not - requires: { - type: hasInZoneData - filter: self - } - } effect: { - type: appendCardIdsToWhileInZone - memory: playedOrc - } - } - { - type: trigger - trigger: { - type: endOfPhase - phase: shadow - } - effect: { - type: resetWhileInZoneData + type: incrementPerPhaseLimit + limit: 1 } } ] diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Ringwraith-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Ringwraith-errata.hjson index 90f35f81d..b6214aa1a 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Ringwraith-errata.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Ringwraith-errata.hjson @@ -26,10 +26,22 @@ site: 3 effects: { type: trigger + optional: true trigger: { type: played filter: self } + requires: [ + { + type: CanSpot + filter: companion + count: 5 + } + { + type: PlayableFromDiscard + filter: minion + } + ] effect: [ { type: MemorizeValue @@ -37,61 +49,47 @@ value: yes } { - type: conditional - requires: [ - { - type: CanSpot - filter: companion - count: 5 - } - { - type: PlayableFromDiscard - filter: unique,culture(wraith),minion - } - ] + type: Repeat + amount: { + type: forEachYouCanSpot + filter: companion + over: 4 + } effect: { - type: Repeat - amount: { - type: forEachYouCanSpot - filter: companion - over: 4 - } - effect: { - type: conditional - requires: [ - { - type: MemoryIs - memory: choice - value: yes - } - { - type: HasCardInDiscard - filter: playable,unique,culture(wraith),minion - } - ] - effect: [ - { - type: chooseYesOrNo - player: you - text: Would you like to play a unique WRAITH minion from your discard? - memorize: choice - } - { - type: conditional - requires: [ - { - type: MemoryIs - memory: choice - value: yes - } - ] - effect: { - type: playCardFromDiscard - filter: choose(unique,culture(wraith),minion) + type: conditional + requires: [ + { + type: MemoryIs + memory: choice + value: yes + } + { + type: HasCardInDiscard + filter: playable,unique,culture(wraith),minion + } + ] + effect: [ + { + type: chooseYesOrNo + player: you + text: Would you like to play a unique WRAITH minion from your discard? + memorize: choice + } + { + type: conditional + requires: [ + { + type: MemoryIs + memory: choice + value: yes } + ] + effect: { + type: playCardFromDiscard + filter: choose(unique,culture(wraith),minion) } - ] - } + } + ] } } ] diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_234_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_234_Tests.java index b22006981..4f0f57c32 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_234_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_234_Tests.java @@ -108,6 +108,8 @@ public class Card_01_234_Tests scn.FreepsPassCurrentPhaseAction(); scn.ShadowPlayCard(nertea); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); assertTrue(scn.ShadowDecisionAvailable("play a minion")); scn.ShadowChooseYes(); //twk, attea, rit, and runner @@ -139,6 +141,8 @@ public class Card_01_234_Tests scn.FreepsPassCurrentPhaseAction(); scn.ShadowPlayCard(nertea); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); assertTrue(scn.ShadowDecisionAvailable("play a minion")); scn.ShadowChooseYes(); //twk, attea, rit, and runner @@ -176,6 +180,8 @@ public class Card_01_234_Tests scn.FreepsPassCurrentPhaseAction(); scn.ShadowPlayCard(nertea); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); assertTrue(scn.ShadowDecisionAvailable("play a minion")); scn.ShadowChooseNo(); @@ -201,6 +207,8 @@ public class Card_01_234_Tests scn.FreepsPassCurrentPhaseAction(); scn.ShadowPlayCard(nertea); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); assertTrue(scn.ShadowDecisionAvailable("play a minion")); scn.ShadowChooseYes(); assertEquals(4, scn.GetShadowCardChoiceCount()); diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_338_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_338_Tests.java new file mode 100644 index 000000000..4a7530d8a --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_338_Tests.java @@ -0,0 +1,152 @@ +package com.gempukku.lotro.cards.official.set01; + +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.HashMap; + +import static org.junit.Assert.*; + +public class Card_01_338_Tests +{ + + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap<>() + {{ + put("twk", "1_237"); + put("lemenya", "1_232"); + put("nertea", "1_234"); + + put("guard1", "1_7"); + put("guard2", "1_7"); + put("guard3", "1_7"); + put("guard4", "1_7"); + }}, + new HashMap<>() {{ + put("site1", "1_319"); + put("site2", "1_327"); + put("site3", "1_338"); + put("site4", "1_343"); + put("site5", "1_349"); + put("site6", "1_351"); + put("site7", "1_353"); + put("site8", "1_356"); + put("site9", "1_360"); + }}, + GenericCardTestHelper.FOTRFrodo, + GenericCardTestHelper.RulingRing + ); + } + + @Test + public void FordofBruinenStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + + /** + * Set: 1 + * Name: Ford of Bruinen + * Unique: False + * Side: + * Culture: + * Shadow Number: 0 + * Type: Sanctuary + * Subtype: + * Site Number: 3 + * Game Text: River. Sanctuary. The twilight cost of the first Nazgûl played to Ford of Bruinen each turn is -5. + */ + + var scn = GetScenario(); + + var card = scn.GetFreepsSite(3); + + assertEquals("Ford of Bruinen", card.getBlueprint().getTitle()); + assertNull(card.getBlueprint().getSubtitle()); + assertFalse(card.getBlueprint().isUnique()); + assertEquals(CardType.SITE, card.getBlueprint().getCardType()); + assertTrue(scn.HasKeyword(card, Keyword.RIVER)); + assertTrue(scn.HasKeyword(card, Keyword.SANCTUARY)); + assertEquals(0, card.getBlueprint().getTwilightCost()); + assertEquals(3, card.getBlueprint().getSiteNumber()); + } + + @Test + public void FordofBruinenOnlyDiscountsTheFirstNazgul() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var ford = scn.GetShadowSite(3); + + var twk = scn.GetShadowCard("twk"); + var lemenya = scn.GetShadowCard("lemenya"); + scn.ShadowMoveCardToHand(twk, lemenya); + + scn.StartGame(); + //Start our test on 2 so that moving to 3 is the first thing we do + scn.SkipToSite(2); + + scn.SetTwilight(9); + scn.FreepsPassCurrentPhaseAction(); + + assertEquals(ford, scn.GetCurrentSite()); + + //9 manual + 1 from the fellowship moving + assertEquals(10, scn.GetTwilight()); + + scn.ShadowPlayCard(twk); + //TWK costs 8 (no roaming), discounted by 5 to 3 total + //10 - 3 + assertEquals(7, scn.GetTwilight()); + + scn.ShadowPlayCard(lemenya); + //Lemenya costs 4, should have no discount + //7 - 4 + assertEquals(3, scn.GetTwilight()); + } + + @Test + public void FordDiscountsNerteaButNotNerteasTrigger() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var ford = scn.GetShadowSite(3); + + var twk = scn.GetShadowCard("twk"); + var nertea = scn.GetShadowCard("nertea"); + scn.ShadowMoveCardToHand(nertea); + scn.ShadowMoveCardToDiscard(twk); + + scn.FreepsMoveCharToTable("guard1", "guard2", "guard3", "guard4"); + + scn.StartGame(); + //Start our test on 2 so that moving to 3 is the first thing we do + scn.SkipToSite(2); + + scn.SetTwilight(5); + scn.FreepsPassCurrentPhaseAction(); + + assertEquals(ford, scn.GetCurrentSite()); + + //5 manual + 5 from the fellowship moving + assertEquals(10, scn.GetTwilight()); + + scn.ShadowPlayCard(nertea); + //Nertea costs 4 (no roaming), discounted by 5 to 0 total + //10 - 0 + assertEquals(10, scn.GetTwilight()); + + //Nertea pulls a minion from discard, which should not get discounted + // as Nertea should have consumed the only discount + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); + assertTrue(scn.ShadowDecisionAvailable("play a minion")); + scn.ShadowChooseYes(); + + scn.ShadowChooseCardBPFromSelection(twk); + //TWK costs 8, should not be discounted + //10 - 8 + assertEquals(2, scn.GetTwilight()); + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_234_ErrataTests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_234_ErrataTests.java index 128efe00c..501d2d6ce 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_234_ErrataTests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_234_ErrataTests.java @@ -108,6 +108,8 @@ public class Card_01_234_ErrataTests scn.FreepsPassCurrentPhaseAction(); scn.ShadowPlayCard(nertea); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); assertTrue(scn.ShadowDecisionAvailable("play a unique WRAITH minion")); scn.ShadowChooseYes(); //twk and attea, but not rit or runner @@ -138,6 +140,8 @@ public class Card_01_234_ErrataTests scn.FreepsPassCurrentPhaseAction(); scn.ShadowPlayCard(nertea); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); assertTrue(scn.ShadowDecisionAvailable("play a unique WRAITH minion")); scn.ShadowChooseYes(); //twk and attea, but not rit or runner @@ -174,6 +178,8 @@ public class Card_01_234_ErrataTests scn.FreepsPassCurrentPhaseAction(); scn.ShadowPlayCard(nertea); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); assertTrue(scn.ShadowDecisionAvailable("play a unique WRAITH minion")); scn.ShadowChooseNo(); @@ -199,6 +205,8 @@ public class Card_01_234_ErrataTests scn.FreepsPassCurrentPhaseAction(); scn.ShadowPlayCard(nertea); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); assertTrue(scn.ShadowDecisionAvailable("play a unique WRAITH minion")); scn.ShadowChooseYes(); //twk and attea, but not rit or runner From 66fa538dbc3fbea4b2fdf3721e46799d18c11507 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Fri, 18 Oct 2024 00:37:18 -0500 Subject: [PATCH 2/8] Updating WC Swiss rounds from 8 to 10 --- .../src/main/java/com/gempukku/lotro/tournament/Tournament.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java index 3e0009063..290b0062a 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java @@ -132,7 +132,7 @@ public interface Tournament { return new SwissPairingMechanism(PairingType.SWISS_3.name(), 3); } case WC_SWISS -> { - return new ChampionshipSwissPairingMechanism(PairingType.WC_SWISS.name(), 8); + return new ChampionshipSwissPairingMechanism(PairingType.WC_SWISS.name(), 10); } } From 6dda33292b5b235124930ef2a76fca554cadda51 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Fri, 18 Oct 2024 00:41:25 -0500 Subject: [PATCH 3/8] Added unit tests to attempt and fix a bug with Return to its Master --- .../lotro/at/IndividualCardAtTest.java | 84 -------- .../lotro/cards/GenericCardTestHelper.java | 12 ++ .../official/set01/Card_01_224_Tests.java | 203 ++++++++++++++++++ 3 files changed, 215 insertions(+), 84 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_224_Tests.java 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 58d3fb4b3..8801f3ccc 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 @@ -521,90 +521,6 @@ public class IndividualCardAtTest extends AbstractAtTest { assertEquals(1, _game.getGameState().getTokenCount(corsairWarGalley, Token.RAIDER)); } - @Test - public void returnToItsMaster() throws DecisionResultInvalidException, CardNotFoundException { - LotroDeck p1Deck = createSimplestDeck(); - p1Deck.setRing("4_1"); - LotroDeck p2Deck = createSimplestDeck(); - - Map decks = new HashMap<>(); - decks.put(P1, p1Deck); - decks.put(P2, p2Deck); - - initializeGameWithDecks(decks); - - skipMulligans(); - - PhysicalCardImpl returnToItsMaster = new PhysicalCardImpl(102, "1_224", P2, _cardLibrary.getLotroCardBlueprint("1_224")); - _game.getGameState().addCardToZone(_game, returnToItsMaster, Zone.HAND); - - PhysicalCardImpl nelya = new PhysicalCardImpl(102, "1_233", P2, _cardLibrary.getLotroCardBlueprint("1_233")); - _game.getGameState().addCardToZone(_game, nelya, Zone.SHADOW_CHARACTERS); - - PhysicalCardImpl hobbitSword = new PhysicalCardImpl(102, "1_299", P1, _cardLibrary.getLotroCardBlueprint("1_299")); - _game.getGameState().attachCard(_game, hobbitSword, _game.getGameState().getRingBearer(P1)); - - // End fellowship - playerDecided(P1, ""); - - // End shadow - playerDecided(P2, ""); - - // End maneuvers phase - playerDecided(P1, ""); - playerDecided(P2, ""); - - // End archery phase - playerDecided(P1, ""); - playerDecided(P2, ""); - - // End assignment phase - playerDecided(P1, ""); - playerDecided(P2, ""); - - // Assign - playerDecided(P1, _game.getGameState().getRingBearer(P1).getCardId() + " " + nelya.getCardId()); - - // Choose skirmish to resolve - playerDecided(P1, "" + _game.getGameState().getRingBearer(P1).getCardId()); - - // Skirmish phase - AwaitingDecision skirmishAction = _userFeedback.getAwaitingDecision(P1); - playerDecided(P1, getCardActionId(skirmishAction, "Use The One")); - - assertTrue(_game.getGameState().isWearingRing()); - - // End skirmish phase - playerDecided(P2, ""); - playerDecided(P1, ""); - - // Don't use Return to Its Master - playerDecided(P2, ""); - - // End assignment phase - playerDecided(P1, ""); - playerDecided(P2, ""); - - // Assign - playerDecided(P1, _game.getGameState().getRingBearer(P1).getCardId() + " " + nelya.getCardId()); - - // Choose skirmish to resolve - playerDecided(P1, "" + _game.getGameState().getRingBearer(P1).getCardId()); - - // End fierce skirmish phase - playerDecided(P1, ""); - playerDecided(P2, ""); - - AwaitingDecision playeReturnDecision = _userFeedback.getAwaitingDecision(P2); - playerDecided(P2, getCardActionId(playeReturnDecision, "Play Return")); - - // Choose skirmish to resolve - playerDecided(P1, "" + _game.getGameState().getRingBearer(P1).getCardId()); - - assertEquals(_game.getGameState().getRingBearer(P1), _game.getGameState().getSkirmish().getFellowshipCharacter()); - assertEquals(1, _game.getGameState().getSkirmish().getShadowCharacters().size()); - assertEquals(nelya, _game.getGameState().getSkirmish().getShadowCharacters().iterator().next()); - } @Test public void moreYetToComeWorks() throws DecisionResultInvalidException, CardNotFoundException { diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java index f8fcf2fa9..2261c3dc0 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java @@ -268,6 +268,12 @@ public class GenericCardTestHelper extends AbstractAtTest { public List ShadowGetBPChoices() { return GetADParamAsList(P2, "blueprintId"); } public List FreepsGetMultipleChoices() { return GetADParamAsList(P1, "results"); } public List ShadowGetMultipleChoices() { return GetADParamAsList(P2, "results"); } + + public List FreepsGetFreepsAssignmentTargets() { return GetADParamAsList(P1, "freeCharacters"); } + public List FreepsGetShadowAssignmentTargets() { return GetADParamAsList(P1, "minions"); } + + public List ShadowGetFreepsAssignmentTargets() { return GetADParamAsList(P2, "freeCharacters"); } + public List ShadowGetShadowAssignmentTargets() { return GetADParamAsList(P2, "minions"); } public List FreepsGetADParamAsList(String paramName) { return GetADParamAsList(P1, paramName); } public List ShadowGetADParamAsList(String paramName) { return GetADParamAsList(P2, paramName); } public List GetADParamAsList(String playerID, String paramName) { return Arrays.asList(GetAwaitingDecisionParam(playerID, paramName)); } @@ -629,6 +635,7 @@ public class GenericCardTestHelper extends AbstractAtTest { public int GetMoveCount() { return _game.getGameState().getMoveCount(); } public PhysicalCardImpl GetRingBearer() { return (PhysicalCardImpl)_game.getGameState().getRingBearer(P1); } + public PhysicalCardImpl GetOneRing() { return (PhysicalCardImpl)_game.getGameState().getRing(P1); } public boolean RBWearingOneRing() { return _game.getGameState().isWearingRing(); } public PhysicalCardImpl GetCurrentSite() { return (PhysicalCardImpl)_game.getGameState().getCurrentSite(); } @@ -796,6 +803,11 @@ public class GenericCardTestHelper extends AbstractAtTest { public int GetFreepsCardChoiceCount() { return FreepsGetCardChoices().size(); } public int GetShadowCardChoiceCount() { return ShadowGetCardChoices().size(); } + public int FreepsGetFreepsAssignmentTargetCount() { return FreepsGetFreepsAssignmentTargets().size(); } + public int FreepsGetShadowAssignmentTargetCount() { return FreepsGetShadowAssignmentTargets().size(); } + public int ShadowGetFreepsAssignmentTargetCount() { return ShadowGetFreepsAssignmentTargets().size(); } + public int ShadowGetShadowAssignmentTargetCount() { return ShadowGetShadowAssignmentTargets().size(); } + public void FreepsChooseCardBPFromSelection(PhysicalCardImpl...cards) throws DecisionResultInvalidException { ChooseCardBPFromSelection(P1, cards);} public void ShadowChooseCardBPFromSelection(PhysicalCardImpl...cards) throws DecisionResultInvalidException { ChooseCardBPFromSelection(P2, cards);} diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_224_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_224_Tests.java new file mode 100644 index 000000000..6f5fd1bfc --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_224_Tests.java @@ -0,0 +1,203 @@ +package com.gempukku.lotro.cards.official.set01; + +import com.gempukku.lotro.cards.GenericCardTestHelper; +import com.gempukku.lotro.common.*; +import com.gempukku.lotro.game.CardNotFoundException; +import com.gempukku.lotro.game.PhysicalCardImpl; +import com.gempukku.lotro.logic.decisions.AwaitingDecision; +import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import com.gempukku.lotro.logic.vo.LotroDeck; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.*; + +public class Card_01_224_Tests +{ + + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap<>() + {{ + put("rtim", "1_224"); + put("enquea", "2_83"); + put("twk", "1_237"); + + put("guard", "1_7"); + }}, + GenericCardTestHelper.FellowshipSites, + GenericCardTestHelper.FOTRFrodo, + GenericCardTestHelper.ATARRing + ); + } + + @Test + public void ReturntoItsMasterStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + + /** + * Set: 1 + * Name: Return to Its Master + * Unique: False + * Side: Shadow + * Culture: Wraith + * Twilight Cost: 0 + * Type: Event + * Subtype: + * Game Text: Response: If the Ring-bearer wears The One Ring at the end of a skirmish phase, cancel all remaining assignments and assign a Nazgûl to skirmish the Ring-bearer; The One Ring's game text does not apply during this skirmish. + */ + + var scn = GetScenario(); + + var card = scn.GetFreepsCard("rtim"); + + assertEquals("Return to Its Master", card.getBlueprint().getTitle()); + assertNull(card.getBlueprint().getSubtitle()); + assertFalse(card.getBlueprint().isUnique()); + assertEquals(Side.SHADOW, card.getBlueprint().getSide()); + assertEquals(Culture.WRAITH, card.getBlueprint().getCulture()); + assertEquals(CardType.EVENT, card.getBlueprint().getCardType()); + assertTrue(scn.HasKeyword(card, Keyword.RESPONSE)); + assertEquals(0, card.getBlueprint().getTwilightCost()); + } + + @Test + public void ReturntoItsMasterPermitsAssigningOfNonFierceNazgulWhenUsedDuringFierceSkirmish() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var rtim = scn.GetShadowCard("rtim"); + var enquea = scn.GetShadowCard("enquea"); + var twk = scn.GetShadowCard("twk"); + scn.ShadowMoveCardToHand(rtim); + scn.ShadowMoveCharToTable(enquea, twk); + + var frodo = scn.GetRingBearer(); + var onering = scn.GetOneRing(); + var guard = scn.GetFreepsCard("guard"); + scn.FreepsMoveCharToTable(guard); + + scn.StartGame(); + + //Enquea is the twilight version, who is not fierce. He should still be a valid target + // when RTIM triggers during a fierce skirmish. + + scn.SkipToAssignments(); + //We will skip the non-fierce skirmishes + scn.FreepsDeclineAssignments(); + assertEquals(2, scn.ShadowGetShadowAssignmentTargetCount()); // both enquea and TWK + scn.ShadowDeclineAssignments(); + + //Fierce skirmish assignment phase + scn.PassCurrentPhaseActions(); + scn.FreepsDeclineAssignments(); + assertEquals(1, scn.ShadowGetShadowAssignmentTargetCount()); // TWK, but not enquea + scn.ShadowAssignToMinions(guard, twk); + scn.FreepsResolveSkirmish(guard); + + //Need the One Ring to be worn + scn.FreepsUseCardAction(onering); + scn.ShadowPassCurrentPhaseAction(); + scn.FreepsPassCurrentPhaseAction(); + + assertTrue(scn.ShadowPlayAvailable(rtim)); + scn.ShadowPlayCard(rtim); + + //Can't quite get the rest + + //assertEquals(2, scn.GetShadowCardChoiceCount()); // both enquea and TWK + //scn.ShadowChooseCard(enquea); + //We should now be asking freeps to choose the next skirmish to resolve and in a skirmish phase + } + + + //Legacy AT test + @Test + public void returnToItsMaster() throws DecisionResultInvalidException, CardNotFoundException { + var scn = GetScenario(); + + var p1Deck = scn.createSimplestDeck(); + p1Deck.setRing("4_1"); + var p2Deck = scn.createSimplestDeck(); + + Map decks = new HashMap<>(); + decks.put(scn.P1, p1Deck); + decks.put(scn.P2, p2Deck); + + scn.initializeGameWithDecks(decks); + + scn.skipMulligans(); + + PhysicalCardImpl returnToItsMaster = new PhysicalCardImpl(102, "1_224", scn.P2, scn._cardLibrary.getLotroCardBlueprint("1_224")); + scn._game.getGameState().addCardToZone(scn._game, returnToItsMaster, Zone.HAND); + + PhysicalCardImpl nelya = new PhysicalCardImpl(102, "1_233", scn.P2, scn._cardLibrary.getLotroCardBlueprint("1_233")); + scn._game.getGameState().addCardToZone(scn._game, nelya, Zone.SHADOW_CHARACTERS); + + PhysicalCardImpl hobbitSword = new PhysicalCardImpl(102, "1_299", scn.P1, scn._cardLibrary.getLotroCardBlueprint("1_299")); + scn._game.getGameState().attachCard(scn._game, hobbitSword, scn._game.getGameState().getRingBearer(scn.P1)); + + // End fellowship + scn.playerDecided(scn.P1, ""); + + // End shadow + scn.playerDecided(scn.P2, ""); + + // End maneuvers phase + scn.playerDecided(scn.P1, ""); + scn.playerDecided(scn.P2, ""); + + // End archery phase + scn.playerDecided(scn.P1, ""); + scn.playerDecided(scn.P2, ""); + + // End assignment phase + scn.playerDecided(scn.P1, ""); + scn.playerDecided(scn.P2, ""); + + // Assign + scn.playerDecided(scn.P1, scn._game.getGameState().getRingBearer(scn.P1).getCardId() + " " + nelya.getCardId()); + + // Choose skirmish to resolve + scn.playerDecided(scn.P1, "" + scn._game.getGameState().getRingBearer(scn.P1).getCardId()); + + // Skirmish phase + AwaitingDecision skirmishAction = scn._userFeedback.getAwaitingDecision(scn.P1); + scn.playerDecided(scn.P1, scn.getCardActionId(skirmishAction, "Use The One")); + + assertTrue(scn._game.getGameState().isWearingRing()); + + // End skirmish phase + scn.playerDecided(scn.P2, ""); + scn.playerDecided(scn.P1, ""); + + // Don't use Return to Its Master + scn.playerDecided(scn.P2, ""); + + // End assignment phase + scn.playerDecided(scn.P1, ""); + scn.playerDecided(scn.P2, ""); + + // Assign + scn.playerDecided(scn.P1, scn._game.getGameState().getRingBearer(scn.P1).getCardId() + " " + nelya.getCardId()); + + // Choose skirmish to resolve + scn.playerDecided(scn.P1, "" + scn._game.getGameState().getRingBearer(scn.P1).getCardId()); + + // End fierce skirmish phase + scn.playerDecided(scn.P1, ""); + scn.playerDecided(scn.P2, ""); + + AwaitingDecision playeReturnDecision = scn._userFeedback.getAwaitingDecision(scn.P2); + scn.playerDecided(scn.P2, scn.getCardActionId(playeReturnDecision, "Play Return")); + + // Choose skirmish to resolve + scn.playerDecided(scn.P1, "" + scn._game.getGameState().getRingBearer(scn.P1).getCardId()); + + assertEquals(scn._game.getGameState().getRingBearer(scn.P1), scn._game.getGameState().getSkirmish().getFellowshipCharacter()); + assertEquals(1, scn._game.getGameState().getSkirmish().getShadowCharacters().size()); + assertEquals(nelya, scn._game.getGameState().getSkirmish().getShadowCharacters().iterator().next()); + } + +} From 35ea56778af0ed3fad25738cd04a5c9dc5074050 Mon Sep 17 00:00:00 2001 From: Marcin Sciesinski Date: Fri, 18 Oct 2024 13:23:32 +0700 Subject: [PATCH 4/8] Fixed issue with cards creating assignments --- .../lotro/cards/set7/wraith/Card7_174.java | 4 +- .../cards/official/set01/set1-wraith.hjson | 1 + .../appender/AssignFpCharacterToSkirmish.java | 7 +- .../com/gempukku/lotro/filters/Filters.java | 16 +- .../lotro/logic/effects/AssignmentEffect.java | 2 +- ...hooseAndAssignCharacterToMinionEffect.java | 2 +- ...hooseAndAssignMinionToCompanionEffect.java | 2 +- .../choose/ChooseAndDoAssignmentEffect.java | 4 +- .../ai/AIPlayerAssignsMinionsGameProcess.java | 2 +- ...PeoplePlayerAssignsMinionsGameProcess.java | 4 +- ...dowPlayerAssignsHisMinionsGameProcess.java | 4 +- .../lotro/at/IndividualCardAtTest.java | 160 +++++++++++++++++- .../official/set01/Card_01_224_Tests.java | 5 +- 13 files changed, 185 insertions(+), 28 deletions(-) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/wraith/Card7_174.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/wraith/Card7_174.java index 20608af36..dbace6db2 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/wraith/Card7_174.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/wraith/Card7_174.java @@ -36,11 +36,11 @@ public class Card7_174 extends AbstractPermanent { action.appendCost( new RemoveThreatsEffect(self, 5)); action.appendEffect( - new ChooseActiveCardEffect(self, playerId, "Choose a Nazgul", Race.NAZGUL, Filters.assignableToSkirmishAgainst(Side.SHADOW, Filters.and(CardType.COMPANION, Filters.not(Filters.ringBearer)), false, false)) { + new ChooseActiveCardEffect(self, playerId, "Choose a Nazgul", Race.NAZGUL, Filters.assignableToSkirmishAgainst(Side.SHADOW, Filters.and(CardType.COMPANION, Filters.not(Filters.ringBearer)), true, false, false)) { @Override protected void cardSelected(LotroGame game, final PhysicalCard nazgul) { action.insertEffect( - new ChooseActiveCardEffect(self, playerId, "Choose a companion", CardType.COMPANION, Filters.not(Filters.ringBearer), Filters.assignableToSkirmishAgainst(Side.SHADOW, nazgul, false, false)) { + new ChooseActiveCardEffect(self, playerId, "Choose a companion", CardType.COMPANION, Filters.not(Filters.ringBearer), Filters.assignableToSkirmishAgainst(Side.SHADOW, nazgul)) { @Override protected void cardSelected(final LotroGame game, final PhysicalCard card) { action.appendEffect( diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1-wraith.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1-wraith.hjson index 53513a22d..c79556469 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1-wraith.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1-wraith.hjson @@ -695,6 +695,7 @@ type: assignFpCharacterToSkirmish fpCharacter: choose(ring bearer) against: choose(nazgul) + ignoreFierce: true } { type: addTrigger diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AssignFpCharacterToSkirmish.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AssignFpCharacterToSkirmish.java index 612d28c2f..db39a3d89 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AssignFpCharacterToSkirmish.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AssignFpCharacterToSkirmish.java @@ -23,11 +23,12 @@ import java.util.List; public class AssignFpCharacterToSkirmish implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(effectObject, "player", "fpCharacter", "against"); + FieldUtils.validateAllowedFields(effectObject, "player", "fpCharacter", "against", "ignoreFierce"); final String player = FieldUtils.getString(effectObject.get("player"), "player", "you"); final String fpCharacter = FieldUtils.getString(effectObject.get("fpCharacter"), "fpCharacter"); final String against = FieldUtils.getString(effectObject.get("against"), "against"); + final boolean ignoreFierce = FieldUtils.getBoolean(effectObject.get("ignoreFierce"), "ignoreFierce", false); final PlayerSource playerSource = PlayerResolver.resolvePlayer(player, environment); @@ -41,7 +42,7 @@ public class AssignFpCharacterToSkirmish implements EffectAppenderProducer { final String assigningPlayer = playerSource.getPlayer(actionContext); Side assigningSide = GameUtils.getSide(actionContext.getGame(), assigningPlayer); final Filterable filter = minionFilter.getFilterable(actionContext); - return Filters.assignableToSkirmishAgainst(assigningSide, filter); + return Filters.assignableToSkirmishAgainst(assigningSide, filter, ignoreFierce); }, "_tempFpCharacter", player, "Choose character to assign to skirmish", environment)); result.addEffectAppender( CardResolver.resolveCard(against, @@ -49,7 +50,7 @@ public class AssignFpCharacterToSkirmish implements EffectAppenderProducer { final String assigningPlayer = playerSource.getPlayer(actionContext); Side assigningSide = GameUtils.getSide(actionContext.getGame(), assigningPlayer); final Collection fpChar = actionContext.getCardsFromMemory("_tempFpCharacter"); - return Filters.assignableToSkirmishAgainst(assigningSide, Filters.in(fpChar)); + return Filters.assignableToSkirmishAgainst(assigningSide, Filters.in(fpChar), ignoreFierce); }, "_tempMinion", player, "Choose minion to assign to character", environment)); result.addEffectAppender( new DelayedAppender() { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java index 905b1d7b8..d7d76850e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java @@ -282,7 +282,11 @@ public class Filters { } public static Filter assignableToSkirmishAgainst(final Side assignedBySide, final Filterable againstFilter) { - return assignableToSkirmishAgainst(assignedBySide, againstFilter, false, false); + return assignableToSkirmishAgainst(assignedBySide, againstFilter, false); + } + + public static Filter assignableToSkirmishAgainst(final Side assignedBySide, final Filterable againstFilter, boolean ignoreFierce) { + return assignableToSkirmishAgainst(assignedBySide, againstFilter, ignoreFierce, false, false); } public static Filter notPreventedByEffectToAssign(final Side assignedBySide, final PhysicalCard againstCard) { @@ -302,15 +306,15 @@ public class Filters { }; } - public static Filter assignableToSkirmishAgainst(final Side assignedBySide, final Filterable againstFilter, final boolean ignoreUnassigned, final boolean allowAllyToSkirmish) { + public static Filter assignableToSkirmishAgainst(final Side assignedBySide, final Filterable againstFilter, final boolean ignoreFierce, final boolean ignoreUnassigned, final boolean allowAllyToSkirmish) { return Filters.and( - assignableToSkirmish(assignedBySide, ignoreUnassigned, allowAllyToSkirmish), + assignableToSkirmish(assignedBySide, ignoreFierce, ignoreUnassigned, allowAllyToSkirmish), new Filter() { @Override public boolean accepts(LotroGame game, PhysicalCard physicalCard) { for (PhysicalCard card : Filters.filterActive(game, againstFilter)) { if (card.getBlueprint().getSide() != physicalCard.getBlueprint().getSide() - && Filters.assignableToSkirmish(assignedBySide, ignoreUnassigned, allowAllyToSkirmish).accepts(game, card)) { + && Filters.assignableToSkirmish(assignedBySide, ignoreFierce, ignoreUnassigned, allowAllyToSkirmish).accepts(game, card)) { Map> thisAssignment = new HashMap<>(); if (card.getBlueprint().getSide() == Side.FREE_PEOPLE) { if (thisAssignment.containsKey(card)) @@ -333,7 +337,7 @@ public class Filters { }); } - public static Filter assignableToSkirmish(final Side assignedBySide, final boolean ignoreUnassigned, final boolean allowAllyToSkirmish) { + public static Filter assignableToSkirmish(final Side assignedBySide, final boolean ignoreFierce, final boolean ignoreUnassigned, final boolean allowAllyToSkirmish) { Filter assignableFilter = Filters.or( Filters.and( CardType.ALLY, @@ -366,7 +370,7 @@ public class Filters { new Filter() { @Override public boolean accepts(LotroGame game, PhysicalCard physicalCard) { - return (!game.getGameState().isFierceSkirmishes()) || game.getModifiersQuerying().hasKeyword(game, physicalCard, Keyword.FIERCE); + return (ignoreFierce || !game.getGameState().isFierceSkirmishes()) || game.getModifiersQuerying().hasKeyword(game, physicalCard, Keyword.FIERCE); } })); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/AssignmentEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/AssignmentEffect.java index da0c31aab..8e7d16919 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/AssignmentEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/AssignmentEffect.java @@ -47,7 +47,7 @@ public class AssignmentEffect extends AbstractEffect { @Override public boolean isPlayableInFull(LotroGame game) { Side side = _playerId.equals(game.getGameState().getCurrentPlayerId()) ? Side.FREE_PEOPLE : Side.SHADOW; - return Filters.assignableToSkirmishAgainst(side, _fpChar, _ignoreSingleMinionRestriction, _skipAllyLocationCheck).accepts(game, _minion); + return Filters.assignableToSkirmishAgainst(side, _fpChar, false, _ignoreSingleMinionRestriction, _skipAllyLocationCheck).accepts(game, _minion); } @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignCharacterToMinionEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignCharacterToMinionEffect.java index 32e590e8c..23d7c5c17 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignCharacterToMinionEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignCharacterToMinionEffect.java @@ -33,7 +33,7 @@ public class ChooseAndAssignCharacterToMinionEffect extends ChooseActiveCardEffe @Override protected Filter getExtraFilterForPlaying(final LotroGame game) { final Side side = game.getGameState().getCurrentPlayerId().equals(_playerId) ? Side.FREE_PEOPLE : Side.SHADOW; - return Filters.assignableToSkirmishAgainst(side, _minion, false, _skipAllyLocationCheck); + return Filters.assignableToSkirmishAgainst(side, _minion, false, false, _skipAllyLocationCheck); } @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignMinionToCompanionEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignMinionToCompanionEffect.java index dc2f935fc..2d182218a 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignMinionToCompanionEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignMinionToCompanionEffect.java @@ -27,7 +27,7 @@ public class ChooseAndAssignMinionToCompanionEffect extends ChooseActiveCardEffe @Override protected Filter getExtraFilterForPlaying(final LotroGame game) { final Side side = game.getGameState().getCurrentPlayerId().equals(_playerId) ? Side.FREE_PEOPLE : Side.SHADOW; - return Filters.assignableToSkirmishAgainst(side, _companion, false, false); + return Filters.assignableToSkirmishAgainst(side, _companion); } @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndDoAssignmentEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndDoAssignmentEffect.java index 4221e64b5..e3d029176 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndDoAssignmentEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndDoAssignmentEffect.java @@ -49,7 +49,7 @@ public class ChooseAndDoAssignmentEffect extends AbstractSubActionEffect { } private Collection getAssignableMinions(LotroGame game) { - return Filters.filterActive(game, CardType.MINION, _minionFilter, Filters.assignableToSkirmishAgainst(getDecidingPlayerSide(game), _fpFilter, false, false)); + return Filters.filterActive(game, CardType.MINION, _minionFilter, Filters.assignableToSkirmishAgainst(getDecidingPlayerSide(game), _fpFilter)); } @Override @@ -70,7 +70,7 @@ public class ChooseAndDoAssignmentEffect extends AbstractSubActionEffect { } private void minionSelected(final LotroGame game, final PhysicalCard minion) { - Collection assignableFpCharacters = Filters.filterActive(game, Filters.or(CardType.COMPANION, CardType.ALLY), _fpFilter, Filters.assignableToSkirmishAgainst(getDecidingPlayerSide(game), minion, false, false)); + Collection assignableFpCharacters = Filters.filterActive(game, Filters.or(CardType.COMPANION, CardType.ALLY), _fpFilter, Filters.assignableToSkirmishAgainst(getDecidingPlayerSide(game), minion)); if (assignableFpCharacters.size() == 1) assignmentSelected(game, assignableFpCharacters.iterator().next(), minion); else diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/ai/AIPlayerAssignsMinionsGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/ai/AIPlayerAssignsMinionsGameProcess.java index 06f769a88..6d88809da 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/ai/AIPlayerAssignsMinionsGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/ai/AIPlayerAssignsMinionsGameProcess.java @@ -30,7 +30,7 @@ public class AIPlayerAssignsMinionsGameProcess implements GameProcess { GameState gameState = game.getGameState(); Filter minionFilter = Filters.and(CardType.MINION, Filters.owner("AI"), Filters.in(_leftoverMinions)); - final Set minions = new HashSet<>(Filters.filterActive(game, minionFilter, Filters.assignableToSkirmish(Side.SHADOW, true, false))); + final Set minions = new HashSet<>(Filters.filterActive(game, minionFilter, Filters.assignableToSkirmish(Side.SHADOW, false, true, false))); if (minions.size() > 0) { final PhysicalCard ringBearer = game.getGameState().getRingBearer(game.getGameState().getCurrentPlayerId()); Map> assignments = Collections.singletonMap(ringBearer, minions); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/FreePeoplePlayerAssignsMinionsGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/FreePeoplePlayerAssignsMinionsGameProcess.java index e5a6ad38e..b16a0be78 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/FreePeoplePlayerAssignsMinionsGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/FreePeoplePlayerAssignsMinionsGameProcess.java @@ -44,14 +44,14 @@ public class FreePeoplePlayerAssignsMinionsGameProcess implements GameProcess { protected void doPlayEffect(final LotroGame game) { final GameState gameState = game.getGameState(); - final Collection minions = Filters.filterActive(game, CardType.MINION, Filters.assignableToSkirmish(Side.FREE_PEOPLE, true, false)); + final Collection minions = Filters.filterActive(game, CardType.MINION, Filters.assignableToSkirmish(Side.FREE_PEOPLE, false, true, false)); if (minions.size() > 0) { final Collection freePeopleTargets = Filters.filterActive(game, Filters.and( Filters.or( CardType.COMPANION, CardType.ALLY), - Filters.assignableToSkirmish(Side.FREE_PEOPLE, true, false))); + Filters.assignableToSkirmish(Side.FREE_PEOPLE, false, true, false))); game.getUserFeedback().sendAwaitingDecision(gameState.getCurrentPlayerId(), diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/ShadowPlayerAssignsHisMinionsGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/ShadowPlayerAssignsHisMinionsGameProcess.java index 188456da7..ff37c74f7 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/ShadowPlayerAssignsHisMinionsGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/ShadowPlayerAssignsHisMinionsGameProcess.java @@ -36,14 +36,14 @@ public class ShadowPlayerAssignsHisMinionsGameProcess implements GameProcess { GameState gameState = game.getGameState(); Filter minionFilter = Filters.and(CardType.MINION, Filters.owner(_playerId), Filters.in(_leftoverMinions)); - final Collection minions = Filters.filterActive(game, minionFilter, Filters.assignableToSkirmish(Side.SHADOW, true, false)); + final Collection minions = Filters.filterActive(game, minionFilter, Filters.assignableToSkirmish(Side.SHADOW, false, true, false)); if (minions.size() > 0) { final Collection freePeopleTargets = Filters.filterActive(game, Filters.and( Filters.or( CardType.COMPANION, CardType.ALLY), - Filters.assignableToSkirmish(Side.SHADOW, true, false))); + Filters.assignableToSkirmish(Side.SHADOW, false, true, false))); game.getUserFeedback().sendAwaitingDecision(_playerId, new PlayerAssignMinionsDecision(1, "Assign minions to companions or allies at home", freePeopleTargets, minions) { 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 8801f3ccc..8e6e82ee1 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 @@ -14,10 +14,7 @@ import org.junit.Test; import java.util.*; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; +import static org.junit.Assert.*; public class IndividualCardAtTest extends AbstractAtTest { @@ -1203,4 +1200,159 @@ public class IndividualCardAtTest extends AbstractAtTest { assertEquals(Zone.DISCARD, morgulBlade.getZone()); assertEquals(Zone.ATTACHED, bladeTip.getZone()); } + + @Test + public void returnToItsMaster() throws DecisionResultInvalidException, CardNotFoundException { + LotroDeck p1Deck = createSimplestDeck(); + p1Deck.setRing("4_1"); + LotroDeck p2Deck = createSimplestDeck(); + + Map decks = new HashMap<>(); + decks.put(P1, p1Deck); + decks.put(P2, p2Deck); + + initializeGameWithDecks(decks); + + skipMulligans(); + + PhysicalCardImpl returnToItsMaster = new PhysicalCardImpl(102, "1_224", P2, _cardLibrary.getLotroCardBlueprint("1_224")); + _game.getGameState().addCardToZone(_game, returnToItsMaster, Zone.HAND); + + PhysicalCardImpl nelya = new PhysicalCardImpl(102, "1_233", P2, _cardLibrary.getLotroCardBlueprint("1_233")); + _game.getGameState().addCardToZone(_game, nelya, Zone.SHADOW_CHARACTERS); + + PhysicalCardImpl hobbitSword = new PhysicalCardImpl(102, "1_299", P1, _cardLibrary.getLotroCardBlueprint("1_299")); + _game.getGameState().attachCard(_game, hobbitSword, _game.getGameState().getRingBearer(P1)); + + // End fellowship + playerDecided(P1, ""); + + // End shadow + playerDecided(P2, ""); + + // End maneuvers phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + // End archery phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + // End assignment phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + // Assign + playerDecided(P1, _game.getGameState().getRingBearer(P1).getCardId() + " " + nelya.getCardId()); + + // Choose skirmish to resolve + playerDecided(P1, "" + _game.getGameState().getRingBearer(P1).getCardId()); + + // Skirmish phase + AwaitingDecision skirmishAction = _userFeedback.getAwaitingDecision(P1); + playerDecided(P1, getCardActionId(skirmishAction, "Use The One")); + + assertTrue(_game.getGameState().isWearingRing()); + + // End skirmish phase + playerDecided(P2, ""); + playerDecided(P1, ""); + + // Don't use Return to Its Master + playerDecided(P2, ""); + + // End assignment phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + // Assign + playerDecided(P1, _game.getGameState().getRingBearer(P1).getCardId() + " " + nelya.getCardId()); + + // Choose skirmish to resolve + playerDecided(P1, "" + _game.getGameState().getRingBearer(P1).getCardId()); + + // End fierce skirmish phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + AwaitingDecision playeReturnDecision = _userFeedback.getAwaitingDecision(P2); + playerDecided(P2, getCardActionId(playeReturnDecision, "Play Return")); + + // Choose skirmish to resolve + playerDecided(P1, "" + _game.getGameState().getRingBearer(P1).getCardId()); + + assertEquals(_game.getGameState().getRingBearer(P1), _game.getGameState().getSkirmish().getFellowshipCharacter()); + assertEquals(1, _game.getGameState().getSkirmish().getShadowCharacters().size()); + assertEquals(nelya, _game.getGameState().getSkirmish().getShadowCharacters().iterator().next()); + } + + + @Test + public void returnToItsMasterNonFierceNazgul() throws DecisionResultInvalidException, CardNotFoundException { + LotroDeck p1Deck = createSimplestDeck(); + p1Deck.setRing("4_1"); + LotroDeck p2Deck = createSimplestDeck(); + + Map decks = new HashMap<>(); + decks.put(P1, p1Deck); + decks.put(P2, p2Deck); + + initializeGameWithDecks(decks); + + skipMulligans(); + + PhysicalCardImpl returnToItsMaster = new PhysicalCardImpl(102, "1_224", P2, _cardLibrary.getLotroCardBlueprint("1_224")); + _game.getGameState().addCardToZone(_game, returnToItsMaster, Zone.HAND); + + PhysicalCardImpl nonFierceNazgul = new PhysicalCardImpl(102, "2_83", P2, _cardLibrary.getLotroCardBlueprint("1_233")); + _game.getGameState().addCardToZone(_game, nonFierceNazgul, Zone.SHADOW_CHARACTERS); + + PhysicalCardImpl hobbitSword = new PhysicalCardImpl(102, "1_299", P1, _cardLibrary.getLotroCardBlueprint("1_299")); + _game.getGameState().attachCard(_game, hobbitSword, _game.getGameState().getRingBearer(P1)); + + // End fellowship + playerDecided(P1, ""); + + // End shadow + playerDecided(P2, ""); + + // End maneuvers phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + // End archery phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + // End assignment phase + playerDecided(P1, ""); + playerDecided(P2, ""); + + // Assign + playerDecided(P1, _game.getGameState().getRingBearer(P1).getCardId() + " " + nonFierceNazgul.getCardId()); + + // Choose skirmish to resolve + playerDecided(P1, "" + _game.getGameState().getRingBearer(P1).getCardId()); + + // Skirmish phase + AwaitingDecision skirmishAction = _userFeedback.getAwaitingDecision(P1); + playerDecided(P1, getCardActionId(skirmishAction, "Use The One")); + + assertTrue(_game.getGameState().isWearingRing()); + + // End skirmish phase + playerDecided(P2, ""); + playerDecided(P1, ""); + + AwaitingDecision playeReturnDecision = _userFeedback.getAwaitingDecision(P2); + playerDecided(P2, getCardActionId(playeReturnDecision, "Play Return")); + + // Choose skirmish to resolve + playerDecided(P1, "" + _game.getGameState().getRingBearer(P1).getCardId()); + + assertEquals(_game.getGameState().getRingBearer(P1), _game.getGameState().getSkirmish().getFellowshipCharacter()); + assertEquals(1, _game.getGameState().getSkirmish().getShadowCharacters().size()); + assertEquals(nonFierceNazgul, _game.getGameState().getSkirmish().getShadowCharacters().iterator().next()); + } + } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_224_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_224_Tests.java index 6f5fd1bfc..eb1787c1a 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_224_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_224_Tests.java @@ -106,9 +106,8 @@ public class Card_01_224_Tests //Can't quite get the rest - //assertEquals(2, scn.GetShadowCardChoiceCount()); // both enquea and TWK - //scn.ShadowChooseCard(enquea); - //We should now be asking freeps to choose the next skirmish to resolve and in a skirmish phase + assertEquals(2, scn.GetShadowCardChoiceCount()); // both enquea and TWK + scn.ShadowChooseCard(enquea); } From 010401554fc3360f637fdcfd2302327a32823e94 Mon Sep 17 00:00:00 2001 From: Marcin Sciesinski Date: Fri, 18 Oct 2024 13:28:54 +0700 Subject: [PATCH 5/8] Fixed issue with cards creating assignments --- .../lotro/cards/set7/wraith/Card7_174.java | 2 +- .../cards/official/set01/set1-wraith.hjson | 1 - .../appender/AssignFpCharacterToSkirmish.java | 7 +++---- .../java/com/gempukku/lotro/filters/Filters.java | 16 ++++++---------- .../lotro/logic/effects/AssignmentEffect.java | 2 +- .../ChooseAndAssignCharacterToMinionEffect.java | 2 +- .../ai/AIPlayerAssignsMinionsGameProcess.java | 2 +- ...reePeoplePlayerAssignsMinionsGameProcess.java | 4 ++-- ...ShadowPlayerAssignsHisMinionsGameProcess.java | 4 ++-- 9 files changed, 17 insertions(+), 23 deletions(-) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/wraith/Card7_174.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/wraith/Card7_174.java index dbace6db2..3d37d7817 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/wraith/Card7_174.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/wraith/Card7_174.java @@ -36,7 +36,7 @@ public class Card7_174 extends AbstractPermanent { action.appendCost( new RemoveThreatsEffect(self, 5)); action.appendEffect( - new ChooseActiveCardEffect(self, playerId, "Choose a Nazgul", Race.NAZGUL, Filters.assignableToSkirmishAgainst(Side.SHADOW, Filters.and(CardType.COMPANION, Filters.not(Filters.ringBearer)), true, false, false)) { + new ChooseActiveCardEffect(self, playerId, "Choose a Nazgul", Race.NAZGUL, Filters.assignableToSkirmishAgainst(Side.SHADOW, Filters.and(CardType.COMPANION, Filters.not(Filters.ringBearer)), false, false)) { @Override protected void cardSelected(LotroGame game, final PhysicalCard nazgul) { action.insertEffect( diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1-wraith.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1-wraith.hjson index c79556469..53513a22d 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1-wraith.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/official/set01/set1-wraith.hjson @@ -695,7 +695,6 @@ type: assignFpCharacterToSkirmish fpCharacter: choose(ring bearer) against: choose(nazgul) - ignoreFierce: true } { type: addTrigger diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AssignFpCharacterToSkirmish.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AssignFpCharacterToSkirmish.java index db39a3d89..612d28c2f 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AssignFpCharacterToSkirmish.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/cards/build/field/effect/appender/AssignFpCharacterToSkirmish.java @@ -23,12 +23,11 @@ import java.util.List; public class AssignFpCharacterToSkirmish implements EffectAppenderProducer { @Override public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { - FieldUtils.validateAllowedFields(effectObject, "player", "fpCharacter", "against", "ignoreFierce"); + FieldUtils.validateAllowedFields(effectObject, "player", "fpCharacter", "against"); final String player = FieldUtils.getString(effectObject.get("player"), "player", "you"); final String fpCharacter = FieldUtils.getString(effectObject.get("fpCharacter"), "fpCharacter"); final String against = FieldUtils.getString(effectObject.get("against"), "against"); - final boolean ignoreFierce = FieldUtils.getBoolean(effectObject.get("ignoreFierce"), "ignoreFierce", false); final PlayerSource playerSource = PlayerResolver.resolvePlayer(player, environment); @@ -42,7 +41,7 @@ public class AssignFpCharacterToSkirmish implements EffectAppenderProducer { final String assigningPlayer = playerSource.getPlayer(actionContext); Side assigningSide = GameUtils.getSide(actionContext.getGame(), assigningPlayer); final Filterable filter = minionFilter.getFilterable(actionContext); - return Filters.assignableToSkirmishAgainst(assigningSide, filter, ignoreFierce); + return Filters.assignableToSkirmishAgainst(assigningSide, filter); }, "_tempFpCharacter", player, "Choose character to assign to skirmish", environment)); result.addEffectAppender( CardResolver.resolveCard(against, @@ -50,7 +49,7 @@ public class AssignFpCharacterToSkirmish implements EffectAppenderProducer { final String assigningPlayer = playerSource.getPlayer(actionContext); Side assigningSide = GameUtils.getSide(actionContext.getGame(), assigningPlayer); final Collection fpChar = actionContext.getCardsFromMemory("_tempFpCharacter"); - return Filters.assignableToSkirmishAgainst(assigningSide, Filters.in(fpChar), ignoreFierce); + return Filters.assignableToSkirmishAgainst(assigningSide, Filters.in(fpChar)); }, "_tempMinion", player, "Choose minion to assign to character", environment)); result.addEffectAppender( new DelayedAppender() { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java index d7d76850e..14f161963 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java @@ -282,11 +282,7 @@ public class Filters { } public static Filter assignableToSkirmishAgainst(final Side assignedBySide, final Filterable againstFilter) { - return assignableToSkirmishAgainst(assignedBySide, againstFilter, false); - } - - public static Filter assignableToSkirmishAgainst(final Side assignedBySide, final Filterable againstFilter, boolean ignoreFierce) { - return assignableToSkirmishAgainst(assignedBySide, againstFilter, ignoreFierce, false, false); + return assignableToSkirmishAgainst(assignedBySide, againstFilter, false, false); } public static Filter notPreventedByEffectToAssign(final Side assignedBySide, final PhysicalCard againstCard) { @@ -306,15 +302,15 @@ public class Filters { }; } - public static Filter assignableToSkirmishAgainst(final Side assignedBySide, final Filterable againstFilter, final boolean ignoreFierce, final boolean ignoreUnassigned, final boolean allowAllyToSkirmish) { + public static Filter assignableToSkirmishAgainst(final Side assignedBySide, final Filterable againstFilter, final boolean ignoreUnassigned, final boolean allowAllyToSkirmish) { return Filters.and( - assignableToSkirmish(assignedBySide, ignoreFierce, ignoreUnassigned, allowAllyToSkirmish), + assignableToSkirmish(assignedBySide, ignoreUnassigned, allowAllyToSkirmish), new Filter() { @Override public boolean accepts(LotroGame game, PhysicalCard physicalCard) { for (PhysicalCard card : Filters.filterActive(game, againstFilter)) { if (card.getBlueprint().getSide() != physicalCard.getBlueprint().getSide() - && Filters.assignableToSkirmish(assignedBySide, ignoreFierce, ignoreUnassigned, allowAllyToSkirmish).accepts(game, card)) { + && Filters.assignableToSkirmish(assignedBySide, ignoreUnassigned, allowAllyToSkirmish).accepts(game, card)) { Map> thisAssignment = new HashMap<>(); if (card.getBlueprint().getSide() == Side.FREE_PEOPLE) { if (thisAssignment.containsKey(card)) @@ -337,7 +333,7 @@ public class Filters { }); } - public static Filter assignableToSkirmish(final Side assignedBySide, final boolean ignoreFierce, final boolean ignoreUnassigned, final boolean allowAllyToSkirmish) { + public static Filter assignableToSkirmish(final Side assignedBySide, final boolean ignoreUnassigned, final boolean allowAllyToSkirmish) { Filter assignableFilter = Filters.or( Filters.and( CardType.ALLY, @@ -370,7 +366,7 @@ public class Filters { new Filter() { @Override public boolean accepts(LotroGame game, PhysicalCard physicalCard) { - return (ignoreFierce || !game.getGameState().isFierceSkirmishes()) || game.getModifiersQuerying().hasKeyword(game, physicalCard, Keyword.FIERCE); + return (game.getGameState().getCurrentPhase() != Phase.ASSIGNMENT || !game.getGameState().isFierceSkirmishes()) || game.getModifiersQuerying().hasKeyword(game, physicalCard, Keyword.FIERCE); } })); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/AssignmentEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/AssignmentEffect.java index 8e7d16919..da0c31aab 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/AssignmentEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/AssignmentEffect.java @@ -47,7 +47,7 @@ public class AssignmentEffect extends AbstractEffect { @Override public boolean isPlayableInFull(LotroGame game) { Side side = _playerId.equals(game.getGameState().getCurrentPlayerId()) ? Side.FREE_PEOPLE : Side.SHADOW; - return Filters.assignableToSkirmishAgainst(side, _fpChar, false, _ignoreSingleMinionRestriction, _skipAllyLocationCheck).accepts(game, _minion); + return Filters.assignableToSkirmishAgainst(side, _fpChar, _ignoreSingleMinionRestriction, _skipAllyLocationCheck).accepts(game, _minion); } @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignCharacterToMinionEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignCharacterToMinionEffect.java index 23d7c5c17..32e590e8c 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignCharacterToMinionEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignCharacterToMinionEffect.java @@ -33,7 +33,7 @@ public class ChooseAndAssignCharacterToMinionEffect extends ChooseActiveCardEffe @Override protected Filter getExtraFilterForPlaying(final LotroGame game) { final Side side = game.getGameState().getCurrentPlayerId().equals(_playerId) ? Side.FREE_PEOPLE : Side.SHADOW; - return Filters.assignableToSkirmishAgainst(side, _minion, false, false, _skipAllyLocationCheck); + return Filters.assignableToSkirmishAgainst(side, _minion, false, _skipAllyLocationCheck); } @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/ai/AIPlayerAssignsMinionsGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/ai/AIPlayerAssignsMinionsGameProcess.java index 6d88809da..06f769a88 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/ai/AIPlayerAssignsMinionsGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/ai/AIPlayerAssignsMinionsGameProcess.java @@ -30,7 +30,7 @@ public class AIPlayerAssignsMinionsGameProcess implements GameProcess { GameState gameState = game.getGameState(); Filter minionFilter = Filters.and(CardType.MINION, Filters.owner("AI"), Filters.in(_leftoverMinions)); - final Set minions = new HashSet<>(Filters.filterActive(game, minionFilter, Filters.assignableToSkirmish(Side.SHADOW, false, true, false))); + final Set minions = new HashSet<>(Filters.filterActive(game, minionFilter, Filters.assignableToSkirmish(Side.SHADOW, true, false))); if (minions.size() > 0) { final PhysicalCard ringBearer = game.getGameState().getRingBearer(game.getGameState().getCurrentPlayerId()); Map> assignments = Collections.singletonMap(ringBearer, minions); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/FreePeoplePlayerAssignsMinionsGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/FreePeoplePlayerAssignsMinionsGameProcess.java index b16a0be78..e5a6ad38e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/FreePeoplePlayerAssignsMinionsGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/FreePeoplePlayerAssignsMinionsGameProcess.java @@ -44,14 +44,14 @@ public class FreePeoplePlayerAssignsMinionsGameProcess implements GameProcess { protected void doPlayEffect(final LotroGame game) { final GameState gameState = game.getGameState(); - final Collection minions = Filters.filterActive(game, CardType.MINION, Filters.assignableToSkirmish(Side.FREE_PEOPLE, false, true, false)); + final Collection minions = Filters.filterActive(game, CardType.MINION, Filters.assignableToSkirmish(Side.FREE_PEOPLE, true, false)); if (minions.size() > 0) { final Collection freePeopleTargets = Filters.filterActive(game, Filters.and( Filters.or( CardType.COMPANION, CardType.ALLY), - Filters.assignableToSkirmish(Side.FREE_PEOPLE, false, true, false))); + Filters.assignableToSkirmish(Side.FREE_PEOPLE, true, false))); game.getUserFeedback().sendAwaitingDecision(gameState.getCurrentPlayerId(), diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/ShadowPlayerAssignsHisMinionsGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/ShadowPlayerAssignsHisMinionsGameProcess.java index ff37c74f7..188456da7 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/ShadowPlayerAssignsHisMinionsGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/assign/ShadowPlayerAssignsHisMinionsGameProcess.java @@ -36,14 +36,14 @@ public class ShadowPlayerAssignsHisMinionsGameProcess implements GameProcess { GameState gameState = game.getGameState(); Filter minionFilter = Filters.and(CardType.MINION, Filters.owner(_playerId), Filters.in(_leftoverMinions)); - final Collection minions = Filters.filterActive(game, minionFilter, Filters.assignableToSkirmish(Side.SHADOW, false, true, false)); + final Collection minions = Filters.filterActive(game, minionFilter, Filters.assignableToSkirmish(Side.SHADOW, true, false)); if (minions.size() > 0) { final Collection freePeopleTargets = Filters.filterActive(game, Filters.and( Filters.or( CardType.COMPANION, CardType.ALLY), - Filters.assignableToSkirmish(Side.SHADOW, false, true, false))); + Filters.assignableToSkirmish(Side.SHADOW, true, false))); game.getUserFeedback().sendAwaitingDecision(_playerId, new PlayerAssignMinionsDecision(1, "Assign minions to companions or allies at home", freePeopleTargets, minions) { From 13fe76fcb9c9b0c7e4860f81753aee9623a57b1f Mon Sep 17 00:00:00 2001 From: Marcin Sciesinski Date: Fri, 18 Oct 2024 13:31:24 +0700 Subject: [PATCH 6/8] Fixed issue with cards creating assignments --- .../lotro/cards/set7/wraith/Card7_174.java | 2 +- ...hooseAndAssignMinionToCompanionEffect.java | 2 +- .../choose/ChooseAndDoAssignmentEffect.java | 4 +- .../lotro/at/IndividualCardAtTest.java | 155 ------------------ 4 files changed, 4 insertions(+), 159 deletions(-) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/wraith/Card7_174.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/wraith/Card7_174.java index 3d37d7817..20608af36 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/wraith/Card7_174.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set7/wraith/Card7_174.java @@ -40,7 +40,7 @@ public class Card7_174 extends AbstractPermanent { @Override protected void cardSelected(LotroGame game, final PhysicalCard nazgul) { action.insertEffect( - new ChooseActiveCardEffect(self, playerId, "Choose a companion", CardType.COMPANION, Filters.not(Filters.ringBearer), Filters.assignableToSkirmishAgainst(Side.SHADOW, nazgul)) { + new ChooseActiveCardEffect(self, playerId, "Choose a companion", CardType.COMPANION, Filters.not(Filters.ringBearer), Filters.assignableToSkirmishAgainst(Side.SHADOW, nazgul, false, false)) { @Override protected void cardSelected(final LotroGame game, final PhysicalCard card) { action.appendEffect( diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignMinionToCompanionEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignMinionToCompanionEffect.java index 2d182218a..dc2f935fc 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignMinionToCompanionEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndAssignMinionToCompanionEffect.java @@ -27,7 +27,7 @@ public class ChooseAndAssignMinionToCompanionEffect extends ChooseActiveCardEffe @Override protected Filter getExtraFilterForPlaying(final LotroGame game) { final Side side = game.getGameState().getCurrentPlayerId().equals(_playerId) ? Side.FREE_PEOPLE : Side.SHADOW; - return Filters.assignableToSkirmishAgainst(side, _companion); + return Filters.assignableToSkirmishAgainst(side, _companion, false, false); } @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndDoAssignmentEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndDoAssignmentEffect.java index e3d029176..4221e64b5 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndDoAssignmentEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/effects/choose/ChooseAndDoAssignmentEffect.java @@ -49,7 +49,7 @@ public class ChooseAndDoAssignmentEffect extends AbstractSubActionEffect { } private Collection getAssignableMinions(LotroGame game) { - return Filters.filterActive(game, CardType.MINION, _minionFilter, Filters.assignableToSkirmishAgainst(getDecidingPlayerSide(game), _fpFilter)); + return Filters.filterActive(game, CardType.MINION, _minionFilter, Filters.assignableToSkirmishAgainst(getDecidingPlayerSide(game), _fpFilter, false, false)); } @Override @@ -70,7 +70,7 @@ public class ChooseAndDoAssignmentEffect extends AbstractSubActionEffect { } private void minionSelected(final LotroGame game, final PhysicalCard minion) { - Collection assignableFpCharacters = Filters.filterActive(game, Filters.or(CardType.COMPANION, CardType.ALLY), _fpFilter, Filters.assignableToSkirmishAgainst(getDecidingPlayerSide(game), minion)); + Collection assignableFpCharacters = Filters.filterActive(game, Filters.or(CardType.COMPANION, CardType.ALLY), _fpFilter, Filters.assignableToSkirmishAgainst(getDecidingPlayerSide(game), minion, false, false)); if (assignableFpCharacters.size() == 1) assignmentSelected(game, assignableFpCharacters.iterator().next(), minion); else 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 8e6e82ee1..66424fca7 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 @@ -1200,159 +1200,4 @@ public class IndividualCardAtTest extends AbstractAtTest { assertEquals(Zone.DISCARD, morgulBlade.getZone()); assertEquals(Zone.ATTACHED, bladeTip.getZone()); } - - @Test - public void returnToItsMaster() throws DecisionResultInvalidException, CardNotFoundException { - LotroDeck p1Deck = createSimplestDeck(); - p1Deck.setRing("4_1"); - LotroDeck p2Deck = createSimplestDeck(); - - Map decks = new HashMap<>(); - decks.put(P1, p1Deck); - decks.put(P2, p2Deck); - - initializeGameWithDecks(decks); - - skipMulligans(); - - PhysicalCardImpl returnToItsMaster = new PhysicalCardImpl(102, "1_224", P2, _cardLibrary.getLotroCardBlueprint("1_224")); - _game.getGameState().addCardToZone(_game, returnToItsMaster, Zone.HAND); - - PhysicalCardImpl nelya = new PhysicalCardImpl(102, "1_233", P2, _cardLibrary.getLotroCardBlueprint("1_233")); - _game.getGameState().addCardToZone(_game, nelya, Zone.SHADOW_CHARACTERS); - - PhysicalCardImpl hobbitSword = new PhysicalCardImpl(102, "1_299", P1, _cardLibrary.getLotroCardBlueprint("1_299")); - _game.getGameState().attachCard(_game, hobbitSword, _game.getGameState().getRingBearer(P1)); - - // End fellowship - playerDecided(P1, ""); - - // End shadow - playerDecided(P2, ""); - - // End maneuvers phase - playerDecided(P1, ""); - playerDecided(P2, ""); - - // End archery phase - playerDecided(P1, ""); - playerDecided(P2, ""); - - // End assignment phase - playerDecided(P1, ""); - playerDecided(P2, ""); - - // Assign - playerDecided(P1, _game.getGameState().getRingBearer(P1).getCardId() + " " + nelya.getCardId()); - - // Choose skirmish to resolve - playerDecided(P1, "" + _game.getGameState().getRingBearer(P1).getCardId()); - - // Skirmish phase - AwaitingDecision skirmishAction = _userFeedback.getAwaitingDecision(P1); - playerDecided(P1, getCardActionId(skirmishAction, "Use The One")); - - assertTrue(_game.getGameState().isWearingRing()); - - // End skirmish phase - playerDecided(P2, ""); - playerDecided(P1, ""); - - // Don't use Return to Its Master - playerDecided(P2, ""); - - // End assignment phase - playerDecided(P1, ""); - playerDecided(P2, ""); - - // Assign - playerDecided(P1, _game.getGameState().getRingBearer(P1).getCardId() + " " + nelya.getCardId()); - - // Choose skirmish to resolve - playerDecided(P1, "" + _game.getGameState().getRingBearer(P1).getCardId()); - - // End fierce skirmish phase - playerDecided(P1, ""); - playerDecided(P2, ""); - - AwaitingDecision playeReturnDecision = _userFeedback.getAwaitingDecision(P2); - playerDecided(P2, getCardActionId(playeReturnDecision, "Play Return")); - - // Choose skirmish to resolve - playerDecided(P1, "" + _game.getGameState().getRingBearer(P1).getCardId()); - - assertEquals(_game.getGameState().getRingBearer(P1), _game.getGameState().getSkirmish().getFellowshipCharacter()); - assertEquals(1, _game.getGameState().getSkirmish().getShadowCharacters().size()); - assertEquals(nelya, _game.getGameState().getSkirmish().getShadowCharacters().iterator().next()); - } - - - @Test - public void returnToItsMasterNonFierceNazgul() throws DecisionResultInvalidException, CardNotFoundException { - LotroDeck p1Deck = createSimplestDeck(); - p1Deck.setRing("4_1"); - LotroDeck p2Deck = createSimplestDeck(); - - Map decks = new HashMap<>(); - decks.put(P1, p1Deck); - decks.put(P2, p2Deck); - - initializeGameWithDecks(decks); - - skipMulligans(); - - PhysicalCardImpl returnToItsMaster = new PhysicalCardImpl(102, "1_224", P2, _cardLibrary.getLotroCardBlueprint("1_224")); - _game.getGameState().addCardToZone(_game, returnToItsMaster, Zone.HAND); - - PhysicalCardImpl nonFierceNazgul = new PhysicalCardImpl(102, "2_83", P2, _cardLibrary.getLotroCardBlueprint("1_233")); - _game.getGameState().addCardToZone(_game, nonFierceNazgul, Zone.SHADOW_CHARACTERS); - - PhysicalCardImpl hobbitSword = new PhysicalCardImpl(102, "1_299", P1, _cardLibrary.getLotroCardBlueprint("1_299")); - _game.getGameState().attachCard(_game, hobbitSword, _game.getGameState().getRingBearer(P1)); - - // End fellowship - playerDecided(P1, ""); - - // End shadow - playerDecided(P2, ""); - - // End maneuvers phase - playerDecided(P1, ""); - playerDecided(P2, ""); - - // End archery phase - playerDecided(P1, ""); - playerDecided(P2, ""); - - // End assignment phase - playerDecided(P1, ""); - playerDecided(P2, ""); - - // Assign - playerDecided(P1, _game.getGameState().getRingBearer(P1).getCardId() + " " + nonFierceNazgul.getCardId()); - - // Choose skirmish to resolve - playerDecided(P1, "" + _game.getGameState().getRingBearer(P1).getCardId()); - - // Skirmish phase - AwaitingDecision skirmishAction = _userFeedback.getAwaitingDecision(P1); - playerDecided(P1, getCardActionId(skirmishAction, "Use The One")); - - assertTrue(_game.getGameState().isWearingRing()); - - // End skirmish phase - playerDecided(P2, ""); - playerDecided(P1, ""); - - AwaitingDecision playeReturnDecision = _userFeedback.getAwaitingDecision(P2); - playerDecided(P2, getCardActionId(playeReturnDecision, "Play Return")); - - // Choose skirmish to resolve - playerDecided(P1, "" + _game.getGameState().getRingBearer(P1).getCardId()); - - assertEquals(_game.getGameState().getRingBearer(P1), _game.getGameState().getSkirmish().getFellowshipCharacter()); - assertEquals(1, _game.getGameState().getSkirmish().getShadowCharacters().size()); - assertEquals(nonFierceNazgul, _game.getGameState().getSkirmish().getShadowCharacters().iterator().next()); - } - } From f4ce01fc125de34046264b23326df939cc0b2339 Mon Sep 17 00:00:00 2001 From: Marcin Sciesinski Date: Fri, 18 Oct 2024 13:32:04 +0700 Subject: [PATCH 7/8] Fixed issue with cards creating assignments --- .../java/com/gempukku/lotro/at/IndividualCardAtTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 66424fca7..8801f3ccc 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 @@ -14,7 +14,10 @@ import org.junit.Test; import java.util.*; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; public class IndividualCardAtTest extends AbstractAtTest { From 9e6ebda4ed3bdc7b398d389d28cdff7f5d5301e7 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Fri, 18 Oct 2024 07:47:22 -0500 Subject: [PATCH 8/8] Fleshing out RTIM test conclusion --- .../gempukku/lotro/cards/GenericCardTestHelper.java | 5 +++++ .../cards/official/set01/Card_01_224_Tests.java | 13 ++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java index 2261c3dc0..123af1818 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java @@ -644,6 +644,11 @@ public class GenericCardTestHelper extends AbstractAtTest { SkipToPhase(Phase.ASSIGNMENT); PassCurrentPhaseActions(); } + + public void SkipToShadowAssignments() throws DecisionResultInvalidException { + SkipToAssignments(); + FreepsDeclineAssignments(); + } public void SkipToMovementDecision() throws DecisionResultInvalidException { SkipToPhase(Phase.REGROUP); PassCurrentPhaseActions(); diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_224_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_224_Tests.java index eb1787c1a..4be72feb4 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_224_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_224_Tests.java @@ -83,15 +83,13 @@ public class Card_01_224_Tests //Enquea is the twilight version, who is not fierce. He should still be a valid target // when RTIM triggers during a fierce skirmish. - scn.SkipToAssignments(); - //We will skip the non-fierce skirmishes - scn.FreepsDeclineAssignments(); + scn.SkipToShadowAssignments(); assertEquals(2, scn.ShadowGetShadowAssignmentTargetCount()); // both enquea and TWK + //We will skip the non-fierce skirmishes scn.ShadowDeclineAssignments(); //Fierce skirmish assignment phase - scn.PassCurrentPhaseActions(); - scn.FreepsDeclineAssignments(); + scn.SkipToShadowAssignments(); assertEquals(1, scn.ShadowGetShadowAssignmentTargetCount()); // TWK, but not enquea scn.ShadowAssignToMinions(guard, twk); scn.FreepsResolveSkirmish(guard); @@ -104,10 +102,11 @@ public class Card_01_224_Tests assertTrue(scn.ShadowPlayAvailable(rtim)); scn.ShadowPlayCard(rtim); - //Can't quite get the rest - assertEquals(2, scn.GetShadowCardChoiceCount()); // both enquea and TWK scn.ShadowChooseCard(enquea); + + assertEquals(Phase.SKIRMISH, scn.GetCurrentPhase()); + assertTrue(scn.IsCharAssigned(enquea)); }