Fixed Cavern Entrance automatically exerting the site owner's character in the skirmish, and added extensive unit tests for this card.

This commit is contained in:
Christian 'ketura' McCarty
2022-12-28 01:37:19 -06:00
parent 1647e5f159
commit 21dfcc3a0a
2 changed files with 389 additions and 59 deletions

View File

@@ -94,37 +94,70 @@
type: Site
block: Shadows
direction: Left
effects: [
{
type: trigger
trigger: {
type: startOfPhase
phase: skirmish
}
cost: {
type: exert
filter: choose(your,character,InSkirmish)
}
effect: [
{
type: addmodifier
modifier: {
type: cantUseSpecialAbilities
filter: side(freeps)
}
until: end(skirmish)
}
{
type: addmodifier
modifier: {
type: cantUseSpecialAbilities
filter: side(shadow)
}
until: end(skirmish)
}
]
}
keywords: [
underground
]
effects: {
type: trigger
trigger: {
type: startOfPhase
phase: skirmish
}
effect: [
{
type: ForEachPlayer
effect: [
{
type: conditional
requires: {
type: CanSpot
filter: your,InSkirmish,character,not(exhausted)
}
effect: [
{
type: chooseYesOrNo
text: Would you like to exert your skirmishing character to prevent all special abilities from being used this skirmish?
memorize: choice
}
{
type: conditional
requires: {
type: memoryIs
memory: choice
value: yes
}
effect: {
type: CostToEffect
cost: {
type: exert
filter: choose(your,character,InSkirmish)
}
effect: [
{
type: addmodifier
modifier: {
type: cantUseSpecialAbilities
filter: side(freeps)
}
until: end(skirmish)
}
{
type: addmodifier
modifier: {
type: cantUseSpecialAbilities
filter: side(shadow)
}
until: end(skirmish)
}
]
}
}
]
}
]
}
]
}
gametext: <b>Underground.</b> At the start of each skirmish, you may exert your character in that skirmish to prevent special abilities being used.
lore: ""
promotext: ""

View File

@@ -1,18 +1,18 @@
package com.gempukku.lotro.cards.unofficial.pc.errata.set11;
import com.gempukku.lotro.cards.GenericCardTestHelper;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.SitesBlock;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.PhysicalCardImpl;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import com.gempukku.lotro.logic.modifiers.MoveLimitModifier;
import org.junit.Test;
import java.util.HashMap;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.*;
public class Card_11_232_ErrataTests
{
@@ -21,18 +21,30 @@ public class Card_11_232_ErrataTests
return new GenericCardTestHelper(
new HashMap<String, String>()
{{
put("card", "81_232");
// put other cards in here as needed for the test case
put("gimli", "1_13");
put("boromir", "1_97");
put("soldier1", "1_271");
put("soldier2", "1_271");
}},
new HashMap<>() {{
put("cavern", "81_232");
put("site2", "11_237");
put("site3", "11_237");
put("site4", "11_237");
put("site5", "11_237");
put("site6", "11_237");
put("site7", "11_237");
put("site8", "11_237");
put("site9", "11_237");
}},
GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo,
GenericCardTestHelper.FOTRRing
GenericCardTestHelper.ATARRing,
"open"
);
}
// Uncomment both @Test markers below once this is ready to be used
//@Test
@Test
public void CavernEntranceStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException {
/**
@@ -49,34 +61,319 @@ public class Card_11_232_ErrataTests
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl card = scn.GetFreepsCard("card");
PhysicalCardImpl card = scn.GetFreepsSite("Cavern Entrance");
assertFalse(card.getBlueprint().isUnique());
//assertEquals(Side., card.getBlueprint().getSide());
//assertEquals(Culture., card.getBlueprint().getCulture());
assertEquals(CardType.SITE, card.getBlueprint().getCardType());
//assertEquals(Race.CREATURE, card.getBlueprint().getRace());
assertTrue(scn.HasKeyword(card, Keyword.SUPPORT_AREA));
assertTrue(scn.HasKeyword(card, Keyword.UNDERGROUND));
assertEquals(SitesBlock.SHADOWS, card.getBlueprint().getSiteBlock());
assertEquals(1, card.getBlueprint().getTwilightCost());
//assertEquals(, card.getBlueprint().getStrength());
//assertEquals(, card.getBlueprint().getVitality());
//assertEquals(, card.getBlueprint().getResistance());
//assertEquals(Signet., card.getBlueprint().getSignet());
//assertEquals(, card.getBlueprint().getSiteNumber()); // Change this to getAllyHomeSiteNumbers for allies
}
//@Test
public void CavernEntranceTest1() throws DecisionResultInvalidException, CardNotFoundException {
@Test
public void CavernEntranceDoesNotBlockIfBothDecline() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl card = scn.GetFreepsCard("card");
scn.FreepsMoveCardToHand(card);
PhysicalCardImpl gimli = scn.GetFreepsCard("gimli");
PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
PhysicalCardImpl cavern = scn.GetShadowSite("Cavern Entrance");
PhysicalCardImpl site1 = scn.GetFreepsSite("Ettenmoors");
scn.FreepsMoveCharToTable(gimli, boromir);
PhysicalCardImpl soldier1 = scn.GetShadowCard("soldier1");
PhysicalCardImpl soldier2 = scn.GetShadowCard("soldier2");
scn.ShadowMoveCharToTable(soldier1, soldier2);
scn.FreepsChooseCardBPFromSelection(site1);
scn.SkipStartingFellowships();
scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(1, scn.GetTwilight());
scn.FreepsPassCurrentPhaseAction();
scn.ShadowChooseCardBPFromSelection(cavern);
scn.SkipToPhase(Phase.ASSIGNMENT);
scn.PassCurrentPhaseActions();
scn.FreepsAssignToMinions(gimli, soldier1);
scn.ShadowDeclineAssignments();
scn.FreepsResolveSkirmish(gimli);
assertTrue(scn.FreepsDecisionAvailable("prevent all special abilities"));
scn.FreepsChooseNo();
assertTrue(scn.ShadowDecisionAvailable("prevent all special abilities"));
scn.ShadowChooseNo();
assertTrue(scn.FreepsActionAvailable(gimli));
assertTrue(scn.FreepsActionAvailable(boromir));
scn.FreepsPassCurrentPhaseAction();
assertTrue(scn.ShadowActionAvailable(soldier1));
assertTrue(scn.ShadowActionAvailable(soldier2));
}
@Test
public void CavernEntranceDoesNotBlockOrOfferIfBothExhausted() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl gimli = scn.GetFreepsCard("gimli");
PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
PhysicalCardImpl cavern = scn.GetShadowSite("Cavern Entrance");
PhysicalCardImpl site1 = scn.GetFreepsSite("Ettenmoors");
scn.FreepsMoveCharToTable(gimli, boromir);
PhysicalCardImpl soldier1 = scn.GetShadowCard("soldier1");
PhysicalCardImpl soldier2 = scn.GetShadowCard("soldier2");
scn.ShadowMoveCharToTable(soldier1, soldier2);
scn.AddWoundsToChar(gimli, 2);
scn.AddWoundsToChar(soldier1, 1);
scn.FreepsChooseCardBPFromSelection(site1);
scn.SkipStartingFellowships();
scn.StartGame();
scn.FreepsPassCurrentPhaseAction();
scn.ShadowChooseCardBPFromSelection(cavern);
scn.SkipToPhase(Phase.ASSIGNMENT);
scn.PassCurrentPhaseActions();
scn.FreepsAssignToMinions(gimli, soldier1);
scn.ShadowDeclineAssignments();
scn.FreepsResolveSkirmish(gimli);
assertFalse(scn.FreepsDecisionAvailable("prevent all special abilities"));
assertFalse(scn.ShadowDecisionAvailable("prevent all special abilities"));
assertFalse(scn.FreepsActionAvailable(gimli));
assertTrue(scn.FreepsActionAvailable(boromir));
scn.FreepsPassCurrentPhaseAction();
assertTrue(scn.ShadowActionAvailable(soldier2));
var choices = scn.ShadowGetCardChoices();
assertEquals(1, choices.size()); // soldier2 but not soldier1
assertEquals("" + soldier2.getCardId(), choices.get(0));
assertTrue(scn.ShadowActionAvailable(soldier2));
}
@Test
public void CavernEntranceBlocksIfFreepsExhaustedButShadowAccepts() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl gimli = scn.GetFreepsCard("gimli");
PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
PhysicalCardImpl cavern = scn.GetShadowSite("Cavern Entrance");
PhysicalCardImpl site1 = scn.GetFreepsSite("Ettenmoors");
scn.FreepsMoveCharToTable(gimli, boromir);
PhysicalCardImpl soldier1 = scn.GetShadowCard("soldier1");
PhysicalCardImpl soldier2 = scn.GetShadowCard("soldier2");
scn.ShadowMoveCharToTable(soldier1, soldier2);
scn.AddWoundsToChar(gimli, 2);
scn.FreepsChooseCardBPFromSelection(site1);
scn.SkipStartingFellowships();
scn.StartGame();
scn.FreepsPassCurrentPhaseAction();
scn.ShadowChooseCardBPFromSelection(cavern);
scn.SkipToPhase(Phase.ASSIGNMENT);
scn.PassCurrentPhaseActions();
scn.FreepsAssignToMinions(gimli, soldier1);
scn.ShadowDeclineAssignments();
scn.FreepsResolveSkirmish(gimli);
assertFalse(scn.FreepsDecisionAvailable("prevent all special abilities"));
assertTrue(scn.ShadowDecisionAvailable("prevent all special abilities"));
assertEquals(0, scn.GetWoundsOn(soldier1));
scn.ShadowChooseYes();
assertEquals(1, scn.GetWoundsOn(soldier1));
assertEquals(2, scn.GetWoundsOn(gimli));
assertFalse(scn.FreepsActionAvailable(gimli));
assertFalse(scn.FreepsActionAvailable(boromir));
scn.FreepsPassCurrentPhaseAction();
assertFalse(scn.ShadowActionAvailable(soldier1));
assertFalse(scn.ShadowActionAvailable(soldier2));
}
@Test
public void CavernEntranceBlocksIfShadowExhaustedButFreepsAccepts() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl gimli = scn.GetFreepsCard("gimli");
PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
PhysicalCardImpl cavern = scn.GetShadowSite("Cavern Entrance");
PhysicalCardImpl site1 = scn.GetFreepsSite("Ettenmoors");
scn.FreepsMoveCharToTable(gimli, boromir);
PhysicalCardImpl soldier1 = scn.GetShadowCard("soldier1");
PhysicalCardImpl soldier2 = scn.GetShadowCard("soldier2");
scn.ShadowMoveCharToTable(soldier1, soldier2);
scn.AddWoundsToChar(soldier1, 1);
scn.FreepsChooseCardBPFromSelection(site1);
scn.SkipStartingFellowships();
scn.StartGame();
scn.FreepsPassCurrentPhaseAction();
scn.ShadowChooseCardBPFromSelection(cavern);
scn.SkipToPhase(Phase.ASSIGNMENT);
scn.PassCurrentPhaseActions();
scn.FreepsAssignToMinions(gimli, soldier1);
scn.ShadowDeclineAssignments();
scn.FreepsResolveSkirmish(gimli);
assertTrue(scn.FreepsDecisionAvailable("prevent all special abilities"));
assertEquals(0, scn.GetWoundsOn(gimli));
scn.FreepsChooseYes();
assertEquals(1, scn.GetWoundsOn(gimli));
assertFalse(scn.ShadowDecisionAvailable("prevent all special abilities"));
assertEquals(1, scn.GetWoundsOn(soldier1));
assertFalse(scn.FreepsActionAvailable(gimli));
assertFalse(scn.FreepsActionAvailable(boromir));
scn.FreepsPassCurrentPhaseAction();
assertFalse(scn.ShadowActionAvailable(soldier1));
assertFalse(scn.ShadowActionAvailable(soldier2));
}
@Test
public void CavernEntranceBlocksIfFreepsAcceptsButNotShadow() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl gimli = scn.GetFreepsCard("gimli");
PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
PhysicalCardImpl cavern = scn.GetShadowSite("Cavern Entrance");
PhysicalCardImpl site1 = scn.GetFreepsSite("Ettenmoors");
scn.FreepsMoveCharToTable(gimli, boromir);
PhysicalCardImpl soldier1 = scn.GetShadowCard("soldier1");
PhysicalCardImpl soldier2 = scn.GetShadowCard("soldier2");
scn.ShadowMoveCharToTable(soldier1, soldier2);
scn.FreepsChooseCardBPFromSelection(site1);
scn.SkipStartingFellowships();
scn.StartGame();
scn.FreepsPassCurrentPhaseAction();
scn.ShadowChooseCardBPFromSelection(cavern);
scn.SkipToPhase(Phase.ASSIGNMENT);
scn.PassCurrentPhaseActions();
scn.FreepsAssignToMinions(gimli, soldier1);
scn.ShadowDeclineAssignments();
scn.FreepsResolveSkirmish(gimli);
assertTrue(scn.FreepsDecisionAvailable("prevent all special abilities"));
assertEquals(0, scn.GetWoundsOn(gimli));
scn.FreepsChooseYes();
assertEquals(1, scn.GetWoundsOn(gimli));
assertTrue(scn.ShadowDecisionAvailable("prevent all special abilities"));
scn.ShadowChooseNo();
assertEquals(0, scn.GetWoundsOn(soldier1));
assertFalse(scn.FreepsActionAvailable(gimli));
assertFalse(scn.FreepsActionAvailable(boromir));
scn.FreepsPassCurrentPhaseAction();
assertFalse(scn.ShadowActionAvailable(soldier1));
assertFalse(scn.ShadowActionAvailable(soldier2));
}
@Test
public void CavernEntranceBlocksIfShadowAcceptsButNotFreeps() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl gimli = scn.GetFreepsCard("gimli");
PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
PhysicalCardImpl cavern = scn.GetShadowSite("Cavern Entrance");
PhysicalCardImpl site1 = scn.GetFreepsSite("Ettenmoors");
scn.FreepsMoveCharToTable(gimli, boromir);
PhysicalCardImpl soldier1 = scn.GetShadowCard("soldier1");
PhysicalCardImpl soldier2 = scn.GetShadowCard("soldier2");
scn.ShadowMoveCharToTable(soldier1, soldier2);
scn.FreepsChooseCardBPFromSelection(site1);
scn.SkipStartingFellowships();
scn.StartGame();
scn.FreepsPassCurrentPhaseAction();
scn.ShadowChooseCardBPFromSelection(cavern);
scn.SkipToPhase(Phase.ASSIGNMENT);
scn.PassCurrentPhaseActions();
scn.FreepsAssignToMinions(gimli, soldier1);
scn.ShadowDeclineAssignments();
scn.FreepsResolveSkirmish(gimli);
assertTrue(scn.FreepsDecisionAvailable("prevent all special abilities"));
scn.FreepsChooseNo();
assertTrue(scn.ShadowDecisionAvailable("prevent all special abilities"));
assertEquals(0, scn.GetWoundsOn(soldier1));
scn.ShadowChooseYes();
assertEquals(1, scn.GetWoundsOn(soldier1));
assertEquals(0, scn.GetWoundsOn(gimli));
assertFalse(scn.FreepsActionAvailable(gimli));
assertFalse(scn.FreepsActionAvailable(boromir));
scn.FreepsPassCurrentPhaseAction();
assertFalse(scn.ShadowActionAvailable(soldier1));
assertFalse(scn.ShadowActionAvailable(soldier2));
}
@Test
public void CavernEntranceStillOffersIfFreepsAccepts() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl gimli = scn.GetFreepsCard("gimli");
PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
PhysicalCardImpl cavern = scn.GetShadowSite("Cavern Entrance");
PhysicalCardImpl site1 = scn.GetFreepsSite("Ettenmoors");
scn.FreepsMoveCharToTable(gimli, boromir);
PhysicalCardImpl soldier1 = scn.GetShadowCard("soldier1");
PhysicalCardImpl soldier2 = scn.GetShadowCard("soldier2");
scn.ShadowMoveCharToTable(soldier1, soldier2);
scn.FreepsChooseCardBPFromSelection(site1);
scn.SkipStartingFellowships();
scn.StartGame();
scn.FreepsPassCurrentPhaseAction();
scn.ShadowChooseCardBPFromSelection(cavern);
scn.SkipToPhase(Phase.ASSIGNMENT);
scn.PassCurrentPhaseActions();
scn.FreepsAssignToMinions(gimli, soldier1);
scn.ShadowDeclineAssignments();
scn.FreepsResolveSkirmish(gimli);
assertTrue(scn.FreepsDecisionAvailable("prevent all special abilities"));
scn.FreepsChooseYes();
assertTrue(scn.ShadowDecisionAvailable("prevent all special abilities"));
assertEquals(0, scn.GetWoundsOn(soldier1));
scn.ShadowChooseYes();
assertEquals(1, scn.GetWoundsOn(soldier1));
assertFalse(scn.FreepsActionAvailable(gimli));
assertFalse(scn.FreepsActionAvailable(boromir));
scn.FreepsPassCurrentPhaseAction();
assertFalse(scn.ShadowActionAvailable(soldier1));
assertFalse(scn.ShadowActionAvailable(soldier2));
}
}