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);
+ }
+}