From 1793a67268cca6dd1e3ef37e72f685bedfff59cf Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Mon, 22 May 2023 21:23:27 -0500 Subject: [PATCH] Talent for Not Being Seen errata 2 + tests --- .../pc/errata/set01/set01-Shire-errata.hjson | 65 +++++++ .../errata/set01/Card_01_316_ErrataTests.java | 168 ++++++++++-------- .../set01/Card_01_316_ErrataTests.java.old | 108 +++++++++++ 3 files changed, 265 insertions(+), 76 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_316_ErrataTests.java.old diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Shire-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Shire-errata.hjson index 36dba6bfc..0af2b2825 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Shire-errata.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Shire-errata.hjson @@ -317,4 +317,69 @@ } } } + + 71_316: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN01E316.2_card.jpg + //If this is true, then all gameplay-related info outside this cardInfo definition + // will be ignored and the java class loaded instead. + javaClass: false + //This instructs the blueprint generator to insert this card as an alt of the listed + // parent blueprint. Can of course be ommitted if not an errata or promo. + parent: 1_316 + //This is the tree path to use within the alts structure on the parent. + // Can of course be ommitted if parent is null. + parentPath: errata/pc + //Versioning differentiates releases within a particular alt path, such as PC errata + // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. + //Top-level cards should always be version 0. + version: 2 + collInfo: 1U316 + rarity: U + setNum: "1" + cardNum: 316 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: A Talent for Not Being Seen + unique: false + side: Free Peoples + culture: Shire + twilight: 0 + type: Condition + target: or(name(Merry),name(Pippin)),not(hasAttached(name(A Talent for Not Being Seen))) + keyword: [ + stealth + ] + effects: [ + { + type: ExtraCost + cost: { + type: exert + filter: choose(or(title(Merry),title(Pippin))) + } + } + { + type: modifier + modifier: { + type: modifyCost + filter: site + amount: -1 + } + } + ] + gametext: Stealth. To play, exert Merry or Pippin. Bearer must be Merry or Pippin.
Each site's Shadow number is -1. + lore: With their small size, Hobbits use any hole to hide in, and their trail is difficult to detect. + promotext: "" + alts: { + //These are just CardInfo objects + promos: { + } + //These are full card definitions, with redundant info that is the same as the original card ommitted + errata: { + } + } + } + } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_316_ErrataTests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_316_ErrataTests.java index 09558070b..f8f42d1d3 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_316_ErrataTests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_316_ErrataTests.java @@ -1,108 +1,124 @@ package com.gempukku.lotro.cards.unofficial.pc.errata.set01; import com.gempukku.lotro.cards.GenericCardTestHelper; -import com.gempukku.lotro.common.*; +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Side; import com.gempukku.lotro.game.CardNotFoundException; -import com.gempukku.lotro.game.PhysicalCardImpl; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import org.junit.Test; import java.util.HashMap; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; public class Card_01_316_ErrataTests { - protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { - return new GenericCardTestHelper( - new HashMap<>() {{ - put("talent", "51_316"); - put("sam", "1_311"); - put("merry", "1_302"); - put("pippin", "1_307"); - put("boromir", "1_97"); - }} - ); - } - @Test - public void TalentStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap<>() + {{ + put("talent1", "71_316"); + put("talent2", "71_316"); + put("sam", "1_311"); + put("merry", "1_302"); + put("pippin", "1_306"); + }}, + GenericCardTestHelper.FellowshipSites, + GenericCardTestHelper.FOTRFrodo, + GenericCardTestHelper.FOTRRing + ); + } - /** - * Set: 1E - * Title: A Talent for Not Being Seen - * Side: Free Peoples - * Culture: Shire - * Twilight Cost: 0 - * Type: Condition - * Errata Game Text: Stealth. Bearer must be Merry or Pippin. Limit 1 per character. - * Each site's Shadow number is -1. - */ + @Test + public void ATalentforNotBeingSeenStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { - //Pre-game setup - GenericCardTestHelper scn = GetScenario(); + /** + * Set: 1 + * Title: A Talent for Not Being Seen + * Unique: True + * Side: FREE_PEOPLE + * Culture: Shire + * Twilight Cost: 0 + * Type: condition + * Subtype: + * Game Text: Stealth. To play, exert Merry or Pippin. Bearer must be Merry or Pippin. + * Each site's Shadow number is -1. + */ - var talent = scn.GetFreepsCard("talent"); + //Pre-game setup + var scn = GetScenario(); - assertFalse(talent.getBlueprint().isUnique()); - assertEquals(Side.FREE_PEOPLE, talent.getBlueprint().getSide()); - assertEquals(Culture.SHIRE, talent.getBlueprint().getCulture()); - assertEquals(CardType.CONDITION, talent.getBlueprint().getCardType()); - assertEquals(0, talent.getBlueprint().getTwilightCost()); + var card = scn.GetFreepsCard("talent1"); - assertTrue(scn.HasKeyword(talent, Keyword.STEALTH)); - assertFalse(scn.HasKeyword(talent, Keyword.SUPPORT_AREA)); - } + assertFalse(card.getBlueprint().isUnique()); + assertEquals(Side.FREE_PEOPLE, card.getBlueprint().getSide()); + assertEquals(Culture.SHIRE, card.getBlueprint().getCulture()); + assertEquals(CardType.CONDITION, card.getBlueprint().getCardType()); + assertFalse(scn.HasKeyword(card, Keyword.SUPPORT_AREA)); + assertEquals(0, card.getBlueprint().getTwilightCost()); + } - @Test - public void TalentOnlyPlaysOnMerryOrPippin() throws DecisionResultInvalidException, CardNotFoundException { - //Pre-game setup - GenericCardTestHelper scn = GetScenario(); + @Test + public void TalentExertsAndPlaysOnMerryOrPippin() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); - PhysicalCardImpl frodo = scn.GetRingBearer(); - PhysicalCardImpl sam = scn.GetFreepsCard("sam"); - PhysicalCardImpl merry = scn.GetFreepsCard("merry"); - PhysicalCardImpl pippin = scn.GetFreepsCard("pippin"); - PhysicalCardImpl talent = scn.GetFreepsCard("talent"); + var frodo = scn.GetRingBearer(); + var sam = scn.GetFreepsCard("sam"); + var merry = scn.GetFreepsCard("merry"); + var pippin = scn.GetFreepsCard("pippin"); + var talent1 = scn.GetFreepsCard("talent1"); + var talent2 = scn.GetFreepsCard("talent2"); - scn.FreepsMoveCharToTable(sam); - scn.FreepsMoveCharToTable(merry); - scn.FreepsMoveCharToTable(pippin); - scn.FreepsMoveCardToHand(talent); + scn.FreepsMoveCardToHand(talent1,talent2, sam, merry, pippin); - scn.StartGame(); + scn.StartGame(); - scn.FreepsPlayCard(talent); + assertFalse(scn.FreepsPlayAvailable(talent1)); + scn.FreepsPlayCard(sam); + assertFalse(scn.FreepsPlayAvailable(talent1)); - //There are 4 companions in play, but only 2 valid targets - assertEquals(2, scn.FreepsGetADParamAsList("cardId").size()); - } + scn.FreepsPlayCard(merry); + assertTrue(scn.FreepsPlayAvailable(talent1)); + assertEquals(0, scn.GetWoundsOn(merry)); + scn.FreepsPlayCard(talent1); + assertEquals(1, scn.GetWoundsOn(merry)); + assertSame(merry, talent1.getAttachedTo()); + + scn.FreepsPlayCard(pippin); + scn.FreepsPlayCard(talent2); + + //There are 4 companions in play, but only 2 valid targets for the exert + assertEquals(2, scn.GetFreepsCardChoiceCount()); + scn.FreepsChooseCard(merry); + + //plays automatically on pippin, since merry is already bearing one + assertEquals(2, scn.GetWoundsOn(merry)); + assertEquals(0, scn.GetWoundsOn(pippin)); + assertSame(pippin, talent2.getAttachedTo()); + } - @Test - public void TalentReducesTwilightIfOnlyHobbits() throws DecisionResultInvalidException, CardNotFoundException { - //Pre-game setup - GenericCardTestHelper scn = GetScenario(); + @Test + public void TalentReducesShadowBy1() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); - PhysicalCardImpl frodo = scn.GetRingBearer(); - PhysicalCardImpl merry = scn.GetFreepsCard("merry"); - PhysicalCardImpl talent = scn.GetFreepsCard("talent"); + var frodo = scn.GetRingBearer(); + var merry = scn.GetFreepsCard("merry"); + var talent1 = scn.GetFreepsCard("talent1"); - scn.FreepsMoveCharToTable(merry); - scn.FreepsMoveCardToHand(talent); - - scn.StartGame(); - - scn.FreepsPlayCard(talent); - scn.FreepsPassCurrentPhaseAction(); - - // 2 for Frodo/Merry, 1 for the site, -1 for Talent - assertEquals(2, scn.GetTwilight()); - - } + scn.FreepsMoveCharToTable(merry); + scn.FreepsAttachCardsTo(merry, talent1); + scn.StartGame(); + scn.FreepsPassCurrentPhaseAction(); + // 2 for Frodo/Merry, 2 for the site, -1 for Talent + assertEquals(3, scn.GetTwilight()); + } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_316_ErrataTests.java.old b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_316_ErrataTests.java.old new file mode 100644 index 000000000..09558070b --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_316_ErrataTests.java.old @@ -0,0 +1,108 @@ +package com.gempukku.lotro.cards.unofficial.pc.errata.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.DecisionResultInvalidException; +import org.junit.Test; + +import java.util.HashMap; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class Card_01_316_ErrataTests +{ + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap<>() {{ + put("talent", "51_316"); + put("sam", "1_311"); + put("merry", "1_302"); + put("pippin", "1_307"); + put("boromir", "1_97"); + }} + ); + } + + @Test + public void TalentStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + + /** + * Set: 1E + * Title: A Talent for Not Being Seen + * Side: Free Peoples + * Culture: Shire + * Twilight Cost: 0 + * Type: Condition + * Errata Game Text: Stealth. Bearer must be Merry or Pippin. Limit 1 per character. + * Each site's Shadow number is -1. + */ + + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var talent = scn.GetFreepsCard("talent"); + + assertFalse(talent.getBlueprint().isUnique()); + assertEquals(Side.FREE_PEOPLE, talent.getBlueprint().getSide()); + assertEquals(Culture.SHIRE, talent.getBlueprint().getCulture()); + assertEquals(CardType.CONDITION, talent.getBlueprint().getCardType()); + assertEquals(0, talent.getBlueprint().getTwilightCost()); + + assertTrue(scn.HasKeyword(talent, Keyword.STEALTH)); + assertFalse(scn.HasKeyword(talent, Keyword.SUPPORT_AREA)); + } + + @Test + public void TalentOnlyPlaysOnMerryOrPippin() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + PhysicalCardImpl frodo = scn.GetRingBearer(); + PhysicalCardImpl sam = scn.GetFreepsCard("sam"); + PhysicalCardImpl merry = scn.GetFreepsCard("merry"); + PhysicalCardImpl pippin = scn.GetFreepsCard("pippin"); + PhysicalCardImpl talent = scn.GetFreepsCard("talent"); + + scn.FreepsMoveCharToTable(sam); + scn.FreepsMoveCharToTable(merry); + scn.FreepsMoveCharToTable(pippin); + scn.FreepsMoveCardToHand(talent); + + scn.StartGame(); + + scn.FreepsPlayCard(talent); + + //There are 4 companions in play, but only 2 valid targets + assertEquals(2, scn.FreepsGetADParamAsList("cardId").size()); + } + + + @Test + public void TalentReducesTwilightIfOnlyHobbits() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + PhysicalCardImpl frodo = scn.GetRingBearer(); + PhysicalCardImpl merry = scn.GetFreepsCard("merry"); + PhysicalCardImpl talent = scn.GetFreepsCard("talent"); + + scn.FreepsMoveCharToTable(merry); + scn.FreepsMoveCardToHand(talent); + + scn.StartGame(); + + scn.FreepsPlayCard(talent); + scn.FreepsPassCurrentPhaseAction(); + + // 2 for Frodo/Merry, 1 for the site, -1 for Talent + assertEquals(2, scn.GetTwilight()); + + } + + + +}