diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Elven-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Elven-errata.hjson
index 2b6b8271e..320ca85a8 100644
--- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Elven-errata.hjson
+++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Elven-errata.hjson
@@ -545,6 +545,95 @@
}
}
+ 71_59: {
+ cardInfo: {
+ //Either a full URL, or a subpath for the PC image server
+ imagePath: errata/LOTR-EN01E059.1_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_59
+ //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: 1
+ collInfo: 1C59
+ rarity: C
+ setNum: "1"
+ cardNum: 59
+ // Standard, Masterwork, Tengwar, FullArt, etc. Top-level cards are always Standard.
+ style: Standard
+ }
+ title: Shoulder to Shoulder
+ unique: false
+ side: Free Peoples
+ culture: Elven
+ twilight: 1
+ type: Condition
+ keyword: support area
+ effects: {
+ type: activated
+ phase: fellowship
+ effect: {
+ type: choice
+ texts: [
+ Exert a Dwarf to heal an Elf
+ Exert an Elf to heal a Dwarf
+ ]
+ effects: [
+ {
+ type: costToEffect
+ cost: [
+ {
+ type: addTwilight
+ }
+ {
+ type: exert
+ filter: choose(dwarf)
+ }
+ ]
+ effect: {
+ type: heal
+ filter: choose(elf)
+ }
+ }
+ {
+ type: costToEffect
+ cost: [
+ {
+ type: addTwilight
+ }
+ {
+ type: exert
+ filter: choose(elf)
+ }
+ ]
+ effect: {
+ type: heal
+ filter: choose(dwarf)
+ }
+ }
+ ]
+ }
+ }
+ gametext: Fellowship: Add (1) and exert a Dwarf to heal an Elf, or add (1) and exert an Elf to heal a Dwarf.
+ lore: “‘May it be a sign that though the world is now dark better days are at hand, and that friendship shall be renewed between our peoples.'”
+ 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_68: {
cardInfo: {
//Either a full URL, or a subpath for the PC image server
diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_059_ErrataTests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_059_ErrataTests.java
new file mode 100644
index 000000000..9fe4d4d56
--- /dev/null
+++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set01/Card_01_059_ErrataTests.java
@@ -0,0 +1,184 @@
+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_059_ErrataTests
+{
+
+ protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException {
+ return new GenericCardTestHelper(
+ new HashMap<>()
+ {{
+ put("sts", "71_59");
+ put("legolas", "1_50");
+ put("gimli", "1_13");
+ put("rumil", "1_57");
+ put("grimir", "1_17");
+
+ put("runner", "1_178");
+ }},
+ GenericCardTestHelper.FellowshipSites,
+ GenericCardTestHelper.FOTRFrodo,
+ GenericCardTestHelper.FOTRRing
+ );
+ }
+
+ @Test
+ public void ShouldertoShoulderStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException {
+
+ /**
+ * Set: 1
+ * Title: Shoulder to Shoulder
+ * Unique: False
+ * Side: FREE_PEOPLE
+ * Culture: Elven
+ * Twilight Cost: 1
+ * Type: condition
+ * Subtype: Support Area
+ * Game Text: Fellowship: Add (1) and exert a Dwarf to heal an Elf, or add (1) and exert an Elf to heal a Dwarf.
+ */
+
+ //Pre-game setup
+ var scn = GetScenario();
+
+ var sts = scn.GetFreepsCard("sts");
+
+ assertFalse(sts.getBlueprint().isUnique());
+ assertEquals(Side.FREE_PEOPLE, sts.getBlueprint().getSide());
+ assertEquals(Culture.ELVEN, sts.getBlueprint().getCulture());
+ assertEquals(CardType.CONDITION, sts.getBlueprint().getCardType());
+ assertTrue(scn.HasKeyword(sts, Keyword.SUPPORT_AREA));
+ assertEquals(1, sts.getBlueprint().getTwilightCost());
+ }
+
+ @Test
+ public void FellowshipActionWorksOnDwarves() throws DecisionResultInvalidException, CardNotFoundException {
+ //Pre-game setup
+ var scn = GetScenario();
+
+ var sts = scn.GetFreepsCard("sts");
+ var legolas = scn.GetFreepsCard("legolas");
+ var gimli = scn.GetFreepsCard("gimli");
+ var rumil = scn.GetFreepsCard("rumil");
+ var grimir = scn.GetFreepsCard("grimir");
+ scn.FreepsMoveCharToTable(legolas, gimli);
+ scn.FreepsMoveCardToSupportArea(rumil, grimir, sts);
+
+ scn.StartGame();
+
+ scn.AddWoundsToChar(legolas, 1);
+ scn.AddWoundsToChar(gimli, 1);
+ scn.AddWoundsToChar(rumil, 1);
+ scn.AddWoundsToChar(grimir, 1);
+
+ assertEquals(0, scn.GetTwilight());
+ assertEquals(1, scn.GetWoundsOn(legolas));
+ assertEquals(1, scn.GetWoundsOn(gimli));
+ assertEquals(1, scn.GetWoundsOn(rumil));
+ assertEquals(1, scn.GetWoundsOn(grimir));
+
+ assertTrue(scn.FreepsActionAvailable(sts));
+ scn.FreepsUseCardAction(sts);
+ assertEquals(2, scn.FreepsGetMultipleChoices().size());
+ scn.FreepsChooseMultipleChoiceOption("Exert a Dwarf to heal an Elf");
+
+ assertEquals(2, scn.GetFreepsCardChoiceCount());
+ scn.FreepsChooseCard(gimli);
+ scn.FreepsChooseCard(rumil);
+ assertEquals(1, scn.GetTwilight());
+ assertEquals(2, scn.GetWoundsOn(gimli));
+ assertEquals(0, scn.GetWoundsOn(rumil));
+
+ assertTrue(scn.FreepsActionAvailable(sts));
+ scn.FreepsUseCardAction(sts);
+ assertEquals(2, scn.FreepsGetMultipleChoices().size());
+ scn.FreepsChooseMultipleChoiceOption("Exert a Dwarf to heal an Elf");
+
+ assertEquals(2, scn.GetFreepsCardChoiceCount());
+ //only one choice of each left
+ assertEquals(2, scn.GetTwilight());
+ assertEquals(2, scn.GetWoundsOn(grimir));
+ assertEquals(0, scn.GetWoundsOn(legolas));
+ }
+
+ @Test
+ public void FellowshipActionWorksOnElves() throws DecisionResultInvalidException, CardNotFoundException {
+ //Pre-game setup
+ var scn = GetScenario();
+
+ var sts = scn.GetFreepsCard("sts");
+ var legolas = scn.GetFreepsCard("legolas");
+ var gimli = scn.GetFreepsCard("gimli");
+ var rumil = scn.GetFreepsCard("rumil");
+ var grimir = scn.GetFreepsCard("grimir");
+ scn.FreepsMoveCharToTable(legolas, gimli);
+ scn.FreepsMoveCardToSupportArea(rumil, grimir, sts);
+
+ scn.StartGame();
+
+ scn.AddWoundsToChar(legolas, 1);
+ scn.AddWoundsToChar(gimli, 1);
+ scn.AddWoundsToChar(rumil, 1);
+ scn.AddWoundsToChar(grimir, 1);
+
+ assertEquals(0, scn.GetTwilight());
+ assertEquals(1, scn.GetWoundsOn(legolas));
+ assertEquals(1, scn.GetWoundsOn(gimli));
+ assertEquals(1, scn.GetWoundsOn(rumil));
+ assertEquals(1, scn.GetWoundsOn(grimir));
+
+ assertTrue(scn.FreepsActionAvailable(sts));
+ scn.FreepsUseCardAction(sts);
+ assertEquals(2, scn.FreepsGetMultipleChoices().size());
+ scn.FreepsChooseMultipleChoiceOption("Exert an Elf to heal a Dwarf");
+
+ assertEquals(2, scn.GetFreepsCardChoiceCount());
+ scn.FreepsChooseCard(legolas);
+ scn.FreepsChooseCard(gimli);
+ assertEquals(1, scn.GetTwilight());
+ assertEquals(2, scn.GetWoundsOn(legolas));
+ assertEquals(0, scn.GetWoundsOn(gimli));
+
+ assertTrue(scn.FreepsActionAvailable(sts));
+ scn.FreepsUseCardAction(sts);
+ assertEquals(2, scn.FreepsGetMultipleChoices().size());
+ scn.FreepsChooseMultipleChoiceOption("Exert an Elf to heal a Dwarf");
+
+ assertEquals(2, scn.GetFreepsCardChoiceCount());
+ //only one choice of each left
+ assertEquals(2, scn.GetTwilight());
+ assertEquals(2, scn.GetWoundsOn(rumil));
+ assertEquals(0, scn.GetWoundsOn(grimir));
+ }
+
+ @Test
+ public void NoManeuverAction() throws DecisionResultInvalidException, CardNotFoundException {
+ //Pre-game setup
+ var scn = GetScenario();
+
+ var sts = scn.GetFreepsCard("sts");
+ var legolas = scn.GetFreepsCard("legolas");
+ var gimli = scn.GetFreepsCard("gimli");
+ var rumil = scn.GetFreepsCard("rumil");
+ var grimir = scn.GetFreepsCard("grimir");
+ scn.FreepsMoveCharToTable(legolas, gimli);
+ scn.FreepsMoveCardToSupportArea(rumil, grimir, sts);
+
+ var runner = scn.GetShadowCard("runner");
+ scn.ShadowMoveCharToTable(runner);
+
+ scn.StartGame();
+
+ scn.SkipToPhase(Phase.MANEUVER);
+ assertTrue(scn.FreepsAnyDecisionsAvailable());
+ assertFalse(scn.FreepsAnyActionsAvailable());
+ }
+}