Fixed And The Red Dawn reversing the freeps/shadow effects. Added copious unit tests for this card.

This commit is contained in:
Christian 'ketura' McCarty
2024-09-24 18:45:50 -05:00
parent cb383ebb4e
commit b0d4792730
2 changed files with 483 additions and 12 deletions

View File

@@ -412,7 +412,7 @@
times: {
type: ForEachInMemory
memory: discardedHand
filter: side(freeps)
filter: side(shadow)
}
effect: {
type: Exert
@@ -424,7 +424,7 @@
times: {
type: ForEachInMemory
memory: discardedHand
filter: side(shadow)
filter: side(freeps)
}
effect: {
type: Heal

View File

@@ -18,8 +18,25 @@ public class Card_V2_048_Tests
return new GenericCardTestHelper(
new HashMap<>()
{{
put("card", "102_48");
// put other cards in here as needed for the test case
put("red", "102_48");
put("velf", "55_10");
put("varagorn", "102_16");
put("vrohan", "7_224");
put("rohan", "12_107");
//Maneuver ability and event
put("albert", "1_69");
put("valor", "1_103");
put("freeps1", "1_70");
put("freeps2", "1_71");
put("freeps3", "1_72");
put("freeps4", "1_73");
put("freeps5", "1_74");
put("uruk1", "5_45");
put("uruk2", "5_46");
put("uruk3", "5_47");
}},
GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo,
@@ -44,7 +61,7 @@ public class Card_V2_048_Tests
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
var card = scn.GetFreepsCard("red");
assertEquals("And the Red Dawn", card.getBlueprint().getTitle());
assertNull(card.getBlueprint().getSubtitle());
@@ -56,18 +73,472 @@ public class Card_V2_048_Tests
assertEquals(2, card.getBlueprint().getTwilightCost());
}
// Uncomment any @Test markers below once this is ready to be used
//@Test
public void AndtheRedDawnTest1() throws DecisionResultInvalidException, CardNotFoundException {
@Test
public void AndtheRedDawnCannotBePlayedWithout3ValiantCompanions() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
scn.FreepsMoveCardToHand(card);
var red = scn.GetFreepsCard("red");
var velf = scn.GetFreepsCard("velf");
var varagorn = scn.GetFreepsCard("varagorn");
var vrohan = scn.GetFreepsCard("vrohan");
var rohan = scn.GetFreepsCard("rohan");
var valor = scn.GetFreepsCard("valor");
scn.FreepsMoveCharToTable(velf, varagorn, rohan);
scn.FreepsMoveCardToHand("albert");
scn.FreepsMoveCardToHand(vrohan, valor);
scn.FreepsMoveCardToSupportArea(red);
scn.ShadowMoveCharToTable("uruk1");
scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(2, scn.GetTwilight());
scn.SkipToPhase(Phase.MANEUVER);
assertFalse(scn.FreepsActionAvailable(red));
scn.FreepsMoveCharToTable(vrohan);
scn.FreepsPlayCard(valor);
scn.ShadowPassCurrentPhaseAction();
assertTrue(scn.FreepsActionAvailable(red));
}
@Test
public void AndtheRedDawnSpots3ValiantCompanionsToDiscardHandAndHaveEffects() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var red = scn.GetFreepsCard("red");
scn.FreepsMoveCardToSupportArea(red);
var frodo = scn.GetRingBearer();
var velf = scn.GetFreepsCard("velf");
var varagorn = scn.GetFreepsCard("varagorn");
var vrohan = scn.GetFreepsCard("vrohan");
var rohan = scn.GetFreepsCard("rohan");
scn.FreepsMoveCharToTable(velf, varagorn, vrohan, rohan);
scn.AddWoundsToChar(velf, 2);
scn.AddWoundsToChar(varagorn, 2);
scn.AddWoundsToChar(vrohan, 2);
scn.AddWoundsToChar(rohan, 2);
scn.AddWoundsToChar(frodo, 2);
var albert = scn.GetFreepsCard("albert");
var valor = scn.GetFreepsCard("valor");
scn.FreepsMoveCharToTable(albert);
scn.FreepsMoveCardToHand(valor);
var freeps1 = scn.GetFreepsCard("freeps1");
var freeps2 = scn.GetFreepsCard("freeps2");
var freeps3 = scn.GetFreepsCard("freeps3");
var freeps4 = scn.GetFreepsCard("freeps4");
var freeps5 = scn.GetFreepsCard("freeps5");
var shadow1 = scn.GetFreepsCard("uruk1");
var shadow2 = scn.GetFreepsCard("uruk2");
var shadow3 = scn.GetFreepsCard("uruk3");
scn.FreepsMoveCardToHand(freeps1, freeps2, freeps3, freeps4, freeps5, shadow1, shadow2, shadow3);
var uruk1 = scn.GetShadowCard("uruk1");
var uruk2 = scn.GetShadowCard("uruk2");
var uruk3 = scn.GetShadowCard("uruk3");
scn.ShadowMoveCharToTable(uruk1, uruk2, uruk3);
scn.StartGame();
scn.SkipToPhase(Phase.MANEUVER);
assertTrue(scn.FreepsActionAvailable(red));
assertTrue(scn.FreepsPlayAvailable(valor));
assertTrue(scn.FreepsActionAvailable(albert));
scn.FreepsMoveCardToDiscard(valor);
assertEquals(Zone.HAND, freeps1.getZone());
assertEquals(Zone.HAND, freeps2.getZone());
assertEquals(Zone.HAND, freeps3.getZone());
assertEquals(Zone.HAND, freeps4.getZone());
assertEquals(Zone.HAND, freeps5.getZone());
assertEquals(Zone.HAND, shadow1.getZone());
assertEquals(Zone.HAND, shadow2.getZone());
assertEquals(Zone.HAND, shadow3.getZone());
assertEquals(2, scn.GetWoundsOn(velf));
assertEquals(2, scn.GetWoundsOn(varagorn));
assertEquals(2, scn.GetWoundsOn(vrohan));
assertEquals(2, scn.GetWoundsOn(rohan));
assertEquals(2, scn.GetWoundsOn(frodo));
assertEquals(0, scn.GetWoundsOn(uruk1));
assertEquals(0, scn.GetWoundsOn(uruk2));
assertEquals(0, scn.GetWoundsOn(uruk3));
scn.FreepsUseCardAction(red);
assertEquals(Zone.DISCARD, freeps1.getZone());
assertEquals(Zone.DISCARD, freeps2.getZone());
assertEquals(Zone.DISCARD, freeps3.getZone());
assertEquals(Zone.DISCARD, freeps4.getZone());
assertEquals(Zone.DISCARD, freeps5.getZone());
assertEquals(Zone.DISCARD, shadow1.getZone());
assertEquals(Zone.DISCARD, shadow2.getZone());
assertEquals(Zone.DISCARD, shadow3.getZone());
//Should have 3 exertions for 3 discarded shadow cards
//1
assertTrue(scn.FreepsDecisionAvailable("exert"));
var choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(uruk1.getCardId())));
assertTrue(choices.contains(String.valueOf(uruk2.getCardId())));
assertTrue(choices.contains(String.valueOf(uruk3.getCardId())));
scn.FreepsChooseCard(uruk1);
assertEquals(1, scn.GetWoundsOn(uruk1));
//2
assertTrue(scn.FreepsDecisionAvailable("exert"));
choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(uruk1.getCardId())));
assertTrue(choices.contains(String.valueOf(uruk2.getCardId())));
assertTrue(choices.contains(String.valueOf(uruk3.getCardId())));
scn.FreepsChooseCard(uruk2);
assertEquals(1, scn.GetWoundsOn(uruk2));
//3
assertTrue(scn.FreepsDecisionAvailable("exert"));
choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(uruk1.getCardId())));
assertTrue(choices.contains(String.valueOf(uruk2.getCardId())));
assertTrue(choices.contains(String.valueOf(uruk3.getCardId())));
scn.FreepsChooseCard(uruk3);
assertEquals(1, scn.GetWoundsOn(uruk3));
//Should have 5 heals for 5 discarded freeps cards
//1
assertTrue(scn.FreepsDecisionAvailable("heal"));
choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(velf.getCardId())));
assertTrue(choices.contains(String.valueOf(varagorn.getCardId())));
assertTrue(choices.contains(String.valueOf(vrohan.getCardId())));
assertTrue(choices.contains(String.valueOf(rohan.getCardId())));
assertFalse(choices.contains(String.valueOf(frodo.getCardId())));
scn.FreepsChooseCard(velf);
assertEquals(1, scn.GetWoundsOn(velf));
//2
assertTrue(scn.FreepsDecisionAvailable("heal"));
choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(velf.getCardId())));
assertTrue(choices.contains(String.valueOf(varagorn.getCardId())));
assertTrue(choices.contains(String.valueOf(vrohan.getCardId())));
assertTrue(choices.contains(String.valueOf(rohan.getCardId())));
assertFalse(choices.contains(String.valueOf(frodo.getCardId())));
scn.FreepsChooseCard(varagorn);
assertEquals(1, scn.GetWoundsOn(varagorn));
//3
assertTrue(scn.FreepsDecisionAvailable("heal"));
choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(velf.getCardId())));
assertTrue(choices.contains(String.valueOf(varagorn.getCardId())));
assertTrue(choices.contains(String.valueOf(vrohan.getCardId())));
assertTrue(choices.contains(String.valueOf(rohan.getCardId())));
assertFalse(choices.contains(String.valueOf(frodo.getCardId())));
scn.FreepsChooseCard(vrohan);
assertEquals(1, scn.GetWoundsOn(vrohan));
//4
assertTrue(scn.FreepsDecisionAvailable("heal"));
choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(velf.getCardId())));
assertTrue(choices.contains(String.valueOf(varagorn.getCardId())));
assertTrue(choices.contains(String.valueOf(vrohan.getCardId())));
assertTrue(choices.contains(String.valueOf(rohan.getCardId())));
assertFalse(choices.contains(String.valueOf(frodo.getCardId())));
scn.FreepsChooseCard(rohan);
assertEquals(1, scn.GetWoundsOn(rohan));
//5
assertTrue(scn.FreepsDecisionAvailable("heal"));
choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(velf.getCardId())));
assertTrue(choices.contains(String.valueOf(varagorn.getCardId())));
assertTrue(choices.contains(String.valueOf(vrohan.getCardId())));
assertTrue(choices.contains(String.valueOf(rohan.getCardId())));
assertFalse(choices.contains(String.valueOf(frodo.getCardId())));
scn.FreepsChooseCard(velf);
assertEquals(0, scn.GetWoundsOn(velf));
scn.FreepsMoveCardToHand(valor);
scn.ShadowPassCurrentPhaseAction();
assertTrue(scn.FreepsDecisionAvailable("maneuver"));
assertFalse(scn.FreepsPlayAvailable(valor));
assertFalse(scn.FreepsActionAvailable(albert));
}
@Test
public void AndtheRedDawnExertAMinionForEachDiscardedShadowCard() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var red = scn.GetFreepsCard("red");
scn.FreepsMoveCardToSupportArea(red);
var frodo = scn.GetRingBearer();
var velf = scn.GetFreepsCard("velf");
var varagorn = scn.GetFreepsCard("varagorn");
var vrohan = scn.GetFreepsCard("vrohan");
var rohan = scn.GetFreepsCard("rohan");
scn.FreepsMoveCharToTable(velf, varagorn, vrohan, rohan);
scn.AddWoundsToChar(velf, 2);
scn.AddWoundsToChar(varagorn, 2);
scn.AddWoundsToChar(vrohan, 2);
scn.AddWoundsToChar(rohan, 2);
scn.AddWoundsToChar(frodo, 2);
var albert = scn.GetFreepsCard("albert");
var valor = scn.GetFreepsCard("valor");
scn.FreepsMoveCharToTable(albert);
scn.FreepsMoveCardToHand(valor);
var freeps1 = scn.GetFreepsCard("freeps1");
var freeps2 = scn.GetFreepsCard("freeps2");
var freeps3 = scn.GetFreepsCard("freeps3");
var freeps4 = scn.GetFreepsCard("freeps4");
var freeps5 = scn.GetFreepsCard("freeps5");
var shadow1 = scn.GetFreepsCard("uruk1");
var shadow2 = scn.GetFreepsCard("uruk2");
var shadow3 = scn.GetFreepsCard("uruk3");
scn.FreepsMoveCardToHand(shadow1, shadow2, shadow3); // no freeps
var uruk1 = scn.GetShadowCard("uruk1");
var uruk2 = scn.GetShadowCard("uruk2");
var uruk3 = scn.GetShadowCard("uruk3");
scn.ShadowMoveCharToTable(uruk1, uruk2, uruk3);
scn.StartGame();
scn.SkipToPhase(Phase.MANEUVER);
assertTrue(scn.FreepsActionAvailable(red));
assertTrue(scn.FreepsPlayAvailable(valor));
assertTrue(scn.FreepsActionAvailable(albert));
scn.FreepsMoveCardToDiscard(valor);
assertEquals(Zone.HAND, shadow1.getZone());
assertEquals(Zone.HAND, shadow2.getZone());
assertEquals(Zone.HAND, shadow3.getZone());
assertEquals(2, scn.GetWoundsOn(velf));
assertEquals(2, scn.GetWoundsOn(varagorn));
assertEquals(2, scn.GetWoundsOn(vrohan));
assertEquals(2, scn.GetWoundsOn(rohan));
assertEquals(2, scn.GetWoundsOn(frodo));
assertEquals(0, scn.GetWoundsOn(uruk1));
assertEquals(0, scn.GetWoundsOn(uruk2));
assertEquals(0, scn.GetWoundsOn(uruk3));
scn.FreepsUseCardAction(red);
assertEquals(Zone.DISCARD, shadow1.getZone());
assertEquals(Zone.DISCARD, shadow2.getZone());
assertEquals(Zone.DISCARD, shadow3.getZone());
//Should have 3 exertions for 3 discarded shadow cards
//1
assertTrue(scn.FreepsDecisionAvailable("exert"));
var choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(uruk1.getCardId())));
assertTrue(choices.contains(String.valueOf(uruk2.getCardId())));
assertTrue(choices.contains(String.valueOf(uruk3.getCardId())));
scn.FreepsChooseCard(uruk1);
assertEquals(1, scn.GetWoundsOn(uruk1));
//2
assertTrue(scn.FreepsDecisionAvailable("exert"));
choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(uruk1.getCardId())));
assertTrue(choices.contains(String.valueOf(uruk2.getCardId())));
assertTrue(choices.contains(String.valueOf(uruk3.getCardId())));
scn.FreepsChooseCard(uruk2);
assertEquals(1, scn.GetWoundsOn(uruk2));
//3
assertTrue(scn.FreepsDecisionAvailable("exert"));
choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(uruk1.getCardId())));
assertTrue(choices.contains(String.valueOf(uruk2.getCardId())));
assertTrue(choices.contains(String.valueOf(uruk3.getCardId())));
scn.FreepsChooseCard(uruk3);
assertEquals(1, scn.GetWoundsOn(uruk3));
assertFalse(scn.FreepsDecisionAvailable("heal"));
scn.FreepsMoveCardToHand(valor);
scn.ShadowPassCurrentPhaseAction();
assertTrue(scn.FreepsDecisionAvailable("maneuver"));
assertFalse(scn.FreepsPlayAvailable(valor));
assertFalse(scn.FreepsActionAvailable(albert));
}
@Test
public void AndtheRedDawnHealsAValiantOrRohanCompanionForEachDiscardedFreepsCard() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var red = scn.GetFreepsCard("red");
scn.FreepsMoveCardToSupportArea(red);
var frodo = scn.GetRingBearer();
var velf = scn.GetFreepsCard("velf");
var varagorn = scn.GetFreepsCard("varagorn");
var vrohan = scn.GetFreepsCard("vrohan");
var rohan = scn.GetFreepsCard("rohan");
scn.FreepsMoveCharToTable(velf, varagorn, vrohan, rohan);
scn.AddWoundsToChar(velf, 2);
scn.AddWoundsToChar(varagorn, 2);
scn.AddWoundsToChar(vrohan, 2);
scn.AddWoundsToChar(rohan, 2);
scn.AddWoundsToChar(frodo, 2);
var albert = scn.GetFreepsCard("albert");
var valor = scn.GetFreepsCard("valor");
scn.FreepsMoveCharToTable(albert);
scn.FreepsMoveCardToHand(valor);
var freeps1 = scn.GetFreepsCard("freeps1");
var freeps2 = scn.GetFreepsCard("freeps2");
var freeps3 = scn.GetFreepsCard("freeps3");
var freeps4 = scn.GetFreepsCard("freeps4");
var freeps5 = scn.GetFreepsCard("freeps5");
var shadow1 = scn.GetFreepsCard("uruk1");
var shadow2 = scn.GetFreepsCard("uruk2");
var shadow3 = scn.GetFreepsCard("uruk3");
scn.FreepsMoveCardToHand(freeps1, freeps2, freeps3, freeps4, freeps5); // no shadow
var uruk1 = scn.GetShadowCard("uruk1");
var uruk2 = scn.GetShadowCard("uruk2");
var uruk3 = scn.GetShadowCard("uruk3");
scn.ShadowMoveCharToTable(uruk1, uruk2, uruk3);
scn.StartGame();
scn.SkipToPhase(Phase.MANEUVER);
assertTrue(scn.FreepsActionAvailable(red));
assertTrue(scn.FreepsPlayAvailable(valor));
assertTrue(scn.FreepsActionAvailable(albert));
scn.FreepsMoveCardToDiscard(valor);
assertEquals(Zone.HAND, freeps1.getZone());
assertEquals(Zone.HAND, freeps2.getZone());
assertEquals(Zone.HAND, freeps3.getZone());
assertEquals(Zone.HAND, freeps4.getZone());
assertEquals(Zone.HAND, freeps5.getZone());
assertEquals(2, scn.GetWoundsOn(velf));
assertEquals(2, scn.GetWoundsOn(varagorn));
assertEquals(2, scn.GetWoundsOn(vrohan));
assertEquals(2, scn.GetWoundsOn(rohan));
assertEquals(2, scn.GetWoundsOn(frodo));
assertEquals(0, scn.GetWoundsOn(uruk1));
assertEquals(0, scn.GetWoundsOn(uruk2));
assertEquals(0, scn.GetWoundsOn(uruk3));
scn.FreepsUseCardAction(red);
assertEquals(Zone.DISCARD, freeps1.getZone());
assertEquals(Zone.DISCARD, freeps2.getZone());
assertEquals(Zone.DISCARD, freeps3.getZone());
assertEquals(Zone.DISCARD, freeps4.getZone());
assertEquals(Zone.DISCARD, freeps5.getZone());
assertFalse(scn.FreepsDecisionAvailable("exert"));
//Should have 5 heals for 5 discarded freeps cards
//1
assertTrue(scn.FreepsDecisionAvailable("heal"));
var choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(velf.getCardId())));
assertTrue(choices.contains(String.valueOf(varagorn.getCardId())));
assertTrue(choices.contains(String.valueOf(vrohan.getCardId())));
assertTrue(choices.contains(String.valueOf(rohan.getCardId())));
assertFalse(choices.contains(String.valueOf(frodo.getCardId())));
scn.FreepsChooseCard(velf);
assertEquals(1, scn.GetWoundsOn(velf));
//2
assertTrue(scn.FreepsDecisionAvailable("heal"));
choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(velf.getCardId())));
assertTrue(choices.contains(String.valueOf(varagorn.getCardId())));
assertTrue(choices.contains(String.valueOf(vrohan.getCardId())));
assertTrue(choices.contains(String.valueOf(rohan.getCardId())));
assertFalse(choices.contains(String.valueOf(frodo.getCardId())));
scn.FreepsChooseCard(varagorn);
assertEquals(1, scn.GetWoundsOn(varagorn));
//3
assertTrue(scn.FreepsDecisionAvailable("heal"));
choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(velf.getCardId())));
assertTrue(choices.contains(String.valueOf(varagorn.getCardId())));
assertTrue(choices.contains(String.valueOf(vrohan.getCardId())));
assertTrue(choices.contains(String.valueOf(rohan.getCardId())));
assertFalse(choices.contains(String.valueOf(frodo.getCardId())));
scn.FreepsChooseCard(vrohan);
assertEquals(1, scn.GetWoundsOn(vrohan));
//4
assertTrue(scn.FreepsDecisionAvailable("heal"));
choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(velf.getCardId())));
assertTrue(choices.contains(String.valueOf(varagorn.getCardId())));
assertTrue(choices.contains(String.valueOf(vrohan.getCardId())));
assertTrue(choices.contains(String.valueOf(rohan.getCardId())));
assertFalse(choices.contains(String.valueOf(frodo.getCardId())));
scn.FreepsChooseCard(rohan);
assertEquals(1, scn.GetWoundsOn(rohan));
//5
assertTrue(scn.FreepsDecisionAvailable("heal"));
choices = scn.FreepsGetCardChoices();
assertTrue(choices.contains(String.valueOf(velf.getCardId())));
assertTrue(choices.contains(String.valueOf(varagorn.getCardId())));
assertTrue(choices.contains(String.valueOf(vrohan.getCardId())));
assertTrue(choices.contains(String.valueOf(rohan.getCardId())));
assertFalse(choices.contains(String.valueOf(frodo.getCardId())));
scn.FreepsChooseCard(velf);
assertEquals(0, scn.GetWoundsOn(velf));
scn.FreepsMoveCardToHand(valor);
scn.ShadowPassCurrentPhaseAction();
assertTrue(scn.FreepsDecisionAvailable("maneuver"));
assertFalse(scn.FreepsPlayAvailable(valor));
assertFalse(scn.FreepsActionAvailable(albert));
}
}