From 49e43da522af8d53267b9a7dfc692d68829fc133 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Mon, 22 May 2023 20:54:51 -0500 Subject: [PATCH] New Sam, Son of Hamfast errata + tests --- .../pc/errata/set01/set01-Shire-errata.hjson | 108 +++++++++ .../errata/set01/Card_01_311_ErrataTests.java | 206 ++++++++++++------ .../set01/Card_01_311_ErrataTests.java.old | 107 +++++++++ 3 files changed, 349 insertions(+), 72 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_311_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 40ebe9f61..36dba6bfc 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 @@ -78,6 +78,114 @@ } } } + + 71_311: { + cardInfo: { + //Either a full URL, or a subpath for the PC image server + imagePath: errata/LOTR-EN01S311.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_311 + //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: 1C311 + rarity: C + setNum: "1" + cardNum: 311 + // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard. + style: Standard + } + title: Sam + subtitle: Son of Hamfast + unique: true + side: Free Peoples + culture: Shire + twilight: 2 + type: Companion + race: Hobbit + #keyword: damage+1 + strength: 3 + vitality: 4 + signet: aragorn + resistance: 5 + effects: [ + { + type: activated + phase: fellowship + cost: [ + { + type: exert + filter: self + } + { + type: exert + filter: choose(another,companion) + } + ] + effect: [ + { + type: removeBurdens + amount: 1 + } + { + type: conditional + requires: { + type: not + requires: { + type: or + requires: [ + { + type: CanSpot + count: 2 + filter: culture(shire),ally + } + { + type: CanSpot + count: 1 + filter: title(Rosie Cotton) + } + ] + } + } + effect: { + type: exert + filter: self + } + } + ] + } + { + type: trigger + optional: true + trigger: { + type: killed + filter: name(Frodo),ring bearer + } + effect: { + type: makeSelfRingBearer + } + } + ] + gametext: Fellowship: Exert Sam and another companion to remove a burden. Then, exert Sam again unless you can spot 2 [shire] allies (or Rosie Cotton).
Response: If Frodo dies, make Sam the Ring-bearer (resistance 5). + lore: “‘Oh, I've never held a girl's hand before. I... I think I might just have myself another ale.'” + 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: { + } + } + } 51_313: { cardInfo: { diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_311_ErrataTests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_311_ErrataTests.java index 6f7b52911..763dccbbf 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_311_ErrataTests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_311_ErrataTests.java @@ -12,96 +12,158 @@ import static org.junit.Assert.*; public class Card_01_311_ErrataTests { - protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { - return new GenericCardTestHelper( - new HashMap<>() {{ - put("sam", "51_311"); - put("orc", "1_272"); - }} - ); - } + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap<>() {{ + put("sam", "71_311"); + put("rosie", "1_309"); + put("proudfoot", "1_301"); + put("gaffer", "1_291"); - @Test - public void SamStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + put("orc", "1_272"); + }}, + GenericCardTestHelper.FellowshipSites, + GenericCardTestHelper.FOTRFrodo, + GenericCardTestHelper.FOTRRing + ); + } - /** - * Set: 1E - * Title: *Sam - * Subtitle: Son of Hamfast - * Side: Free Peoples - * Culture: Shire - * Twilight Cost: 2 - * Type: Companion - * Subtype: Hobbit - * Strength: 3 - * Vitality: 4 - * Signet: Aragorn - * Errata Game Text: Fellowship: Exert Sam and another companion to remove a burden. - * Response: If Frodo dies, make Sam the Ring-bearer (resistance 5). - */ + @Test + public void SamStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { - //Pre-game setup - GenericCardTestHelper scn = GetScenario(); + /** + * Set: 1 + * Title: Sam, Son of Hamfast + * Unique: True + * Side: FREE_PEOPLE + * Culture: Shire + * Twilight Cost: 2 + * Type: companion + * Subtype: Hobbit + * Strength: 3 + * Vitality: 4 + * Signet: Aragorn + * Game Text: Fellowship: Exert Sam and another companion to remove a burden. Then, exert Sam again unless you can spot 2 [shire] allies (or Rosie Cotton). + * Response: If Frodo dies, make Sam the Ring-bearer (resistance 5). + */ - var sam = scn.GetFreepsCard("sam"); + //Pre-game setup + var scn = GetScenario(); - assertTrue(sam.getBlueprint().isUnique()); - assertEquals(Side.FREE_PEOPLE, sam.getBlueprint().getSide()); - assertEquals(Culture.SHIRE, sam.getBlueprint().getCulture()); - assertEquals(CardType.COMPANION, sam.getBlueprint().getCardType()); - assertEquals(Race.HOBBIT, sam.getBlueprint().getRace()); - assertEquals(2, sam.getBlueprint().getTwilightCost()); - assertEquals(3, sam.getBlueprint().getStrength()); - assertEquals(4, sam.getBlueprint().getVitality()); - assertEquals(Signet.ARAGORN, sam.getBlueprint().getSignet()); - } + var sam = scn.GetFreepsCard("sam"); - @Test - public void FellowshipActionExertsTwiceToRemoveABurden() throws DecisionResultInvalidException, CardNotFoundException { - //Pre-game setup - GenericCardTestHelper scn = GetScenario(); + assertTrue(sam.getBlueprint().isUnique()); + assertEquals(Side.FREE_PEOPLE, sam.getBlueprint().getSide()); + assertEquals(Culture.SHIRE, sam.getBlueprint().getCulture()); + assertEquals(CardType.COMPANION, sam.getBlueprint().getCardType()); + assertEquals(Race.HOBBIT, sam.getBlueprint().getRace()); + assertEquals(2, sam.getBlueprint().getTwilightCost()); + assertEquals(3, sam.getBlueprint().getStrength()); + assertEquals(4, sam.getBlueprint().getVitality()); + assertEquals(5, sam.getBlueprint().getResistance()); + assertEquals(Signet.ARAGORN, sam.getBlueprint().getSignet()); + } - var frodo = scn.GetRingBearer(); - var sam = scn.GetFreepsCard("sam"); - scn.FreepsMoveCharToTable(sam); + @Test + public void FellowshipActionExertsTwicePlusOneToRemoveABurden() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); - scn.StartGame(); + var frodo = scn.GetRingBearer(); + var sam = scn.GetFreepsCard("sam"); + scn.FreepsMoveCharToTable(sam); - assertEquals(Phase.FELLOWSHIP, scn.GetCurrentPhase()); - assertTrue(scn.FreepsActionAvailable(sam)); + scn.StartGame(); - assertEquals(0, scn.GetWoundsOn(sam)); - assertEquals(0, scn.GetWoundsOn(frodo)); - assertEquals(1, scn.GetBurdens()); + assertEquals(Phase.FELLOWSHIP, scn.GetCurrentPhase()); + assertTrue(scn.FreepsActionAvailable(sam)); - scn.FreepsUseCardAction(sam); + assertEquals(0, scn.GetWoundsOn(sam)); + assertEquals(0, scn.GetWoundsOn(frodo)); + assertEquals(1, scn.GetBurdens()); - assertEquals(1, scn.GetWoundsOn(sam)); - assertEquals(1, scn.GetWoundsOn(frodo)); - assertEquals(0, scn.GetBurdens()); - } + scn.FreepsUseCardAction(sam); + + assertEquals(2, scn.GetWoundsOn(sam)); + assertEquals(1, scn.GetWoundsOn(frodo)); + assertEquals(0, scn.GetBurdens()); + } + + @Test + public void FellowshipActionExertsTwiceToRemoveABurdenIf2ShireAllies() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var frodo = scn.GetRingBearer(); + var sam = scn.GetFreepsCard("sam"); + var proudfoot = scn.GetFreepsCard("proudfoot"); + var gaffer = scn.GetFreepsCard("gaffer"); + scn.FreepsMoveCharToTable(sam); + scn.FreepsMoveCardToSupportArea(proudfoot, gaffer); + + scn.StartGame(); + + assertEquals(Phase.FELLOWSHIP, scn.GetCurrentPhase()); + assertTrue(scn.FreepsActionAvailable(sam)); + + assertEquals(0, scn.GetWoundsOn(sam)); + assertEquals(0, scn.GetWoundsOn(frodo)); + assertEquals(1, scn.GetBurdens()); + + scn.FreepsUseCardAction(sam); + + assertEquals(1, scn.GetWoundsOn(sam)); + assertEquals(1, scn.GetWoundsOn(frodo)); + assertEquals(0, scn.GetBurdens()); + } + + @Test + public void FellowshipActionExertsTwiceToRemoveABurdenIfRosie() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var frodo = scn.GetRingBearer(); + var sam = scn.GetFreepsCard("sam"); + var rosie = scn.GetFreepsCard("rosie"); + scn.FreepsMoveCharToTable(sam); + scn.FreepsMoveCardToSupportArea(rosie); + + scn.StartGame(); + + assertEquals(Phase.FELLOWSHIP, scn.GetCurrentPhase()); + assertTrue(scn.FreepsActionAvailable(sam)); + + assertEquals(0, scn.GetWoundsOn(sam)); + assertEquals(0, scn.GetWoundsOn(frodo)); + assertEquals(1, scn.GetBurdens()); + + scn.FreepsUseCardAction(sam); + + assertEquals(1, scn.GetWoundsOn(sam)); + assertEquals(1, scn.GetWoundsOn(frodo)); + assertEquals(0, scn.GetBurdens()); + } - @Test - public void RBDeathMakesSamTheRB() throws DecisionResultInvalidException, CardNotFoundException { - //Pre-game setup - GenericCardTestHelper scn = GetScenario(); + @Test + public void RBDeathMakesSamTheRB() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); - var frodo = scn.GetRingBearer(); - var sam = scn.GetFreepsCard("sam"); - var orc = scn.GetShadowCard("orc"); - scn.FreepsMoveCharToTable(sam); + var frodo = scn.GetRingBearer(); + var sam = scn.GetFreepsCard("sam"); + scn.FreepsMoveCharToTable(sam); - scn.StartGame(); + scn.StartGame(); - assertNotSame(scn.GetRingBearer(), sam); - scn.AddWoundsToChar(frodo, 4); + assertNotSame(scn.GetRingBearer(), sam); + scn.AddWoundsToChar(frodo, 4); - scn.PassCurrentPhaseActions(); + scn.PassCurrentPhaseActions(); - assertTrue(scn.FreepsActionAvailable("Optional Trigger")); - scn.FreepsAcceptOptionalTrigger(); - assertSame(scn.GetRingBearer(), sam); - } + assertTrue(scn.FreepsActionAvailable("Optional Trigger")); + scn.FreepsAcceptOptionalTrigger(); + assertSame(scn.GetRingBearer(), sam); + } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_311_ErrataTests.java.old b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_311_ErrataTests.java.old new file mode 100644 index 000000000..6f7b52911 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_311_ErrataTests.java.old @@ -0,0 +1,107 @@ +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.logic.decisions.DecisionResultInvalidException; +import org.junit.Test; + +import java.util.HashMap; + +import static org.junit.Assert.*; + +public class Card_01_311_ErrataTests +{ + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap<>() {{ + put("sam", "51_311"); + + put("orc", "1_272"); + }} + ); + } + + @Test + public void SamStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + + /** + * Set: 1E + * Title: *Sam + * Subtitle: Son of Hamfast + * Side: Free Peoples + * Culture: Shire + * Twilight Cost: 2 + * Type: Companion + * Subtype: Hobbit + * Strength: 3 + * Vitality: 4 + * Signet: Aragorn + * Errata Game Text: Fellowship: Exert Sam and another companion to remove a burden. + * Response: If Frodo dies, make Sam the Ring-bearer (resistance 5). + */ + + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var sam = scn.GetFreepsCard("sam"); + + assertTrue(sam.getBlueprint().isUnique()); + assertEquals(Side.FREE_PEOPLE, sam.getBlueprint().getSide()); + assertEquals(Culture.SHIRE, sam.getBlueprint().getCulture()); + assertEquals(CardType.COMPANION, sam.getBlueprint().getCardType()); + assertEquals(Race.HOBBIT, sam.getBlueprint().getRace()); + assertEquals(2, sam.getBlueprint().getTwilightCost()); + assertEquals(3, sam.getBlueprint().getStrength()); + assertEquals(4, sam.getBlueprint().getVitality()); + assertEquals(Signet.ARAGORN, sam.getBlueprint().getSignet()); + } + + @Test + public void FellowshipActionExertsTwiceToRemoveABurden() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var frodo = scn.GetRingBearer(); + var sam = scn.GetFreepsCard("sam"); + scn.FreepsMoveCharToTable(sam); + + scn.StartGame(); + + assertEquals(Phase.FELLOWSHIP, scn.GetCurrentPhase()); + assertTrue(scn.FreepsActionAvailable(sam)); + + assertEquals(0, scn.GetWoundsOn(sam)); + assertEquals(0, scn.GetWoundsOn(frodo)); + assertEquals(1, scn.GetBurdens()); + + scn.FreepsUseCardAction(sam); + + assertEquals(1, scn.GetWoundsOn(sam)); + assertEquals(1, scn.GetWoundsOn(frodo)); + assertEquals(0, scn.GetBurdens()); + } + + + @Test + public void RBDeathMakesSamTheRB() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + GenericCardTestHelper scn = GetScenario(); + + var frodo = scn.GetRingBearer(); + var sam = scn.GetFreepsCard("sam"); + var orc = scn.GetShadowCard("orc"); + scn.FreepsMoveCharToTable(sam); + + scn.StartGame(); + + assertNotSame(scn.GetRingBearer(), sam); + scn.AddWoundsToChar(frodo, 4); + + scn.PassCurrentPhaseActions(); + + assertTrue(scn.FreepsActionAvailable("Optional Trigger")); + scn.FreepsAcceptOptionalTrigger(); + assertSame(scn.GetRingBearer(), sam); + } +}