Merge branch 'grand-card-rework' into v2-cards

This commit is contained in:
Christian 'ketura' McCarty
2024-09-11 21:19:12 -05:00
3 changed files with 134 additions and 23 deletions

View File

@@ -73,8 +73,14 @@ public class CardResolver {
public static EffectAppender resolveStackedCards(String type, FilterableSource choiceFilter, FilterableSource playabilityFilter, ValueSource countSource, FilterableSource stackedOn, public static EffectAppender resolveStackedCards(String type, FilterableSource choiceFilter, FilterableSource playabilityFilter, ValueSource countSource, FilterableSource stackedOn,
String memory, String choicePlayer, String choiceText, CardGenerationEnvironment environment) throws InvalidCardDefinitionException { String memory, String choicePlayer, String choiceText, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
Function<ActionContext, Iterable<? extends PhysicalCard>> cardSource = actionContext -> { Function<ActionContext, Iterable<? extends PhysicalCard>> cardSource = actionContext -> {
final Filterable stackedOnFilter = stackedOn.getFilterable(actionContext); if(stackedOn != null) {
return Filters.filter(actionContext.getGame(), actionContext.getGame().getGameState().getAllCards(), Filters.stackedOn(stackedOnFilter)); final Filterable stackedOnFilter = stackedOn.getFilterable(actionContext);
return Filters.filter(actionContext.getGame(), actionContext.getGame().getGameState().getAllCards(), Filters.stackedOn(stackedOnFilter));
}
else {
return Filters.filter(actionContext.getGame(), actionContext.getGame().getGameState().getAllCards(), Filters.stackedOn(Filters.any));
}
}; };
if (type.startsWith("memory(") && type.endsWith(")")) { if (type.startsWith("memory(") && type.endsWith(")")) {

View File

@@ -17,8 +17,8 @@ public class Card_04_199_Tests
return new GenericCardTestHelper( return new GenericCardTestHelper(
new HashMap<>() new HashMap<>()
{{ {{
put("card", "4_199"); put("trooper", "4_199");
// put other cards in here as needed for the test case put("child", "4_148"); // source of easy site control
}}, }},
GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo, GenericCardTestHelper.FOTRFrodo,
@@ -41,12 +41,13 @@ public class Card_04_199_Tests
* Strength: 9 * Strength: 9
* Vitality: 2 * Vitality: 2
* Site Number: 5 * Site Number: 5
* Game Text: <b>Damage +1</b>.<br><b>Regroup:</b> Stack this minion on a site you control.<br><b>Shadow:</b> If stacked on a site you control, play this minion. Its twilight cost is -1. * Game Text: <b>Damage +1</b>.<br><b>Regroup:</b> Stack this minion on a site you control.
* <b>Shadow:</b> If stacked on a site you control, play this minion. Its twilight cost is -1.
*/ */
var scn = GetScenario(); var scn = GetScenario();
var card = scn.GetFreepsCard("card"); var card = scn.GetFreepsCard("trooper");
assertEquals("Uruk Trooper", card.getBlueprint().getTitle()); assertEquals("Uruk Trooper", card.getBlueprint().getTitle());
assertNull(card.getBlueprint().getSubtitle()); assertNull(card.getBlueprint().getSubtitle());
@@ -63,18 +64,70 @@ public class Card_04_199_Tests
assertEquals(5, card.getBlueprint().getSiteNumber()); assertEquals(5, card.getBlueprint().getSiteNumber());
} }
// Uncomment any @Test markers below once this is ready to be used @Test
//@Test public void UrukTrooperRegroupActionStacksSelfOnControlledSite() throws DecisionResultInvalidException, CardNotFoundException {
public void UrukTrooperTest1() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup //Pre-game setup
var scn = GetScenario(); var scn = GetScenario();
var card = scn.GetFreepsCard("card"); var trooper = scn.GetShadowCard("trooper");
scn.FreepsMoveCardToHand(card); var child = scn.GetShadowCard("child");
scn.ShadowMoveCardToHand(child, trooper);
scn.StartGame(); scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(4, scn.GetTwilight()); scn.SkipToSite(2);
scn.ShadowMoveCardToSupportArea(child);
scn.AddTokensToCard(child, 2);
scn.FreepsPassCurrentPhaseAction();
scn.ShadowUseCardAction(child); //should take control of site
scn.ShadowMoveCharToTable(trooper);
scn.SkipToPhase(Phase.REGROUP);
scn.FreepsPassCurrentPhaseAction();
var controlledSite = scn.GetFreepsSite(1);
assertTrue(scn.IsSiteControlled(controlledSite));
assertTrue(scn.ShadowActionAvailable(trooper));
scn.ShadowUseCardAction(trooper);
assertEquals(controlledSite, trooper.getStackedOn());
assertEquals(Zone.STACKED, trooper.getZone());
}
@Test
public void UrukTrooperShadowActionPlaysSelfFromControlledSite() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var trooper = scn.GetShadowCard("trooper");
var child = scn.GetShadowCard("child");
scn.ShadowMoveCardToHand(child, trooper);
scn.StartGame();
scn.SkipToSite(2);
scn.ShadowMoveCardToSupportArea(child);
scn.AddTokensToCard(child, 2);
scn.FreepsPassCurrentPhaseAction();
scn.ShadowUseCardAction(child); //should take control of site
scn.SkipToSite(4);
var controlledSite = scn.GetFreepsSite(1);
assertTrue(scn.IsSiteControlled(controlledSite));
scn.StackCardsOn(controlledSite, trooper);
scn.SetTwilight(48);
scn.FreepsPassCurrentPhaseAction();
assertEquals(controlledSite, trooper.getStackedOn());
assertEquals(Zone.STACKED, trooper.getZone());
assertTrue(scn.ShadowActionAvailable(trooper));
assertEquals(50, scn.GetTwilight());
scn.ShadowUseCardAction(trooper);
assertEquals(Zone.SHADOW_CHARACTERS, trooper.getZone());
// Trooper cost 4, but should have a -1 discount, so costs 3 + 2 for roaming
assertEquals(45, scn.GetTwilight());
} }
} }

View File

@@ -17,8 +17,8 @@ public class Card_04_201_Tests
return new GenericCardTestHelper( return new GenericCardTestHelper(
new HashMap<>() new HashMap<>()
{{ {{
put("card", "4_201"); put("veteran", "4_201");
// put other cards in here as needed for the test case put("child", "4_148"); // source of easy site control
}}, }},
GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo, GenericCardTestHelper.FOTRFrodo,
@@ -46,7 +46,7 @@ public class Card_04_201_Tests
var scn = GetScenario(); var scn = GetScenario();
var card = scn.GetFreepsCard("card"); var card = scn.GetFreepsCard("veteran");
assertEquals("Uruk Veteran", card.getBlueprint().getTitle()); assertEquals("Uruk Veteran", card.getBlueprint().getTitle());
assertNull(card.getBlueprint().getSubtitle()); assertNull(card.getBlueprint().getSubtitle());
@@ -63,18 +63,70 @@ public class Card_04_201_Tests
assertEquals(5, card.getBlueprint().getSiteNumber()); assertEquals(5, card.getBlueprint().getSiteNumber());
} }
// Uncomment any @Test markers below once this is ready to be used @Test
//@Test public void UrukVeteranRegroupActionStacksSelfOnControlledSite() throws DecisionResultInvalidException, CardNotFoundException {
public void UrukVeteranTest1() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup //Pre-game setup
var scn = GetScenario(); var scn = GetScenario();
var card = scn.GetFreepsCard("card"); var veteran = scn.GetShadowCard("veteran");
scn.FreepsMoveCardToHand(card); var child = scn.GetShadowCard("child");
scn.ShadowMoveCardToHand(child, veteran);
scn.StartGame(); scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(3, scn.GetTwilight()); scn.SkipToSite(2);
scn.ShadowMoveCardToSupportArea(child);
scn.AddTokensToCard(child, 2);
scn.FreepsPassCurrentPhaseAction();
scn.ShadowUseCardAction(child); //should take control of site
scn.ShadowMoveCharToTable(veteran);
scn.SkipToPhase(Phase.REGROUP);
scn.FreepsPassCurrentPhaseAction();
var controlledSite = scn.GetFreepsSite(1);
assertTrue(scn.IsSiteControlled(controlledSite));
assertTrue(scn.ShadowActionAvailable(veteran));
scn.ShadowUseCardAction(veteran);
assertEquals(controlledSite, veteran.getStackedOn());
assertEquals(Zone.STACKED, veteran.getZone());
}
@Test
public void UrukVeteranShadowActionPlaysSelfFromControlledSite() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var veteran = scn.GetShadowCard("veteran");
var child = scn.GetShadowCard("child");
scn.ShadowMoveCardToHand(child, veteran);
scn.StartGame();
scn.SkipToSite(2);
scn.ShadowMoveCardToSupportArea(child);
scn.AddTokensToCard(child, 2);
scn.FreepsPassCurrentPhaseAction();
scn.ShadowUseCardAction(child); //should take control of site
scn.SkipToSite(4);
var controlledSite = scn.GetFreepsSite(1);
assertTrue(scn.IsSiteControlled(controlledSite));
scn.StackCardsOn(controlledSite, veteran);
scn.SetTwilight(48);
scn.FreepsPassCurrentPhaseAction();
assertEquals(controlledSite, veteran.getStackedOn());
assertEquals(Zone.STACKED, veteran.getZone());
assertTrue(scn.ShadowActionAvailable(veteran));
assertEquals(50, scn.GetTwilight());
scn.ShadowUseCardAction(veteran);
assertEquals(Zone.SHADOW_CHARACTERS, veteran.getZone());
// Trooper cost 3, but should have a -1 discount, so costs 2 + 2 for roaming
assertEquals(46, scn.GetTwilight());
} }
} }