VPack1 Gondor Implementation

The five gondor cards are now implemented.  Lords of Gondor requires additional development to be complete (see commented out failing test).  Added ReplaceInAssignment effect.  Updated DiscardFromHand effect to be sensitive to the side performing the discarding.
This commit is contained in:
Christian 'ketura' McCarty
2021-03-13 02:36:56 -06:00
parent 769badd132
commit f8d7c6b5a3
11 changed files with 785 additions and 129 deletions

View File

@@ -1,5 +1,5 @@
{
"101_1001": {
"101_001": {
"side": "free_people",
"culture": "Gondor",
"title": "*The Lords of Gondor Have Returned",
@@ -41,55 +41,50 @@
]
},
"101_1002": {
"101_002": {
"side": "free_people",
"culture": "Gondor",
"title": "*I Will not Let the White City Fall",
"title": "*I Will Not Let the White City Fall",
"type": "condition",
"cost": 2,
"keyword": "support area",
"effects": [
{
"type": "activated",
"phase": "skirmish",
"condition": {
"type": "canSpot",
"filter": "bearer,inSkirmishAgainst(Nazgul)",
"type": "trigger",
"trigger": {
"type": "losesSkirmish",
"filter": "name(Boromir)"
},
"effect": {
"type": "modifyStrength",
"filter": "choose(name(Aragorn))",
"amount": 2,
"until": "start(regroup)"
},
"cost": [
{
"type": "memorize",
"filter": "bearer",
"memory": "bearer"
},
{
"type": "discard",
"filter": "self"
}
],
"effect":[
{
"type": "modifyStrength",
"filter": "memory(bearer)",
"amount": 3
},
{
"type": "addKeyword",
"filter": "memory(bearer)",
"keyword": "damage+1"
}
]
},
{
"type": "trigger",
"trigger": {
"type": "losesSkirmish",
"filter": "name(Aragorn)"
},
"effect": {
"type": "modifyStrength",
"filter": "choose(name(Boromir))",
"amount": 2,
"until": "start(regroup)"
},
}
]
},
"101_1003": {
"101_003": {
"side": "free_people",
"culture": "Gondor",
"title": "*Boromir",
"subtitle": "The Redeemed",
"type": "companion",
"cost": 2,
"cost": 3,
"race": "man",
"strength": 7,
"vitality": 3,
@@ -97,40 +92,49 @@
"signet": "aragorn",
"effects": [
{
"type": "activated",
"phase": "skirmish",
"condition": {
"type": "canSpot",
"filter": "bearer,inSkirmishAgainst(Nazgul)",
},
"cost": [
{
"type": "memorize",
"filter": "bearer",
"memory": "bearer"
},
{
"type": "discard",
"filter": "self"
"type": "modifier",
"modifier": {
"type": "addKeyword",
"filter": "self",
"keyword": "defender+1",
"condition": {
"type": "canSpot",
"filter": "companion,culture(shire)",
"count": 2
}
],
"effect":[
{
"type": "modifyStrength",
"filter": "memory(bearer)",
"amount": 3
},
{
"type": "addKeyword",
"filter": "memory(bearer)",
"keyword": "damage+1"
}
]
}
},
{
"type": "modifier",
"modifier": {
"type": "modifyStrength",
"filter": "self",
"amount": 1,
"condition": {
"type": "canSpot",
"filter": "companion,culture(shire)",
"count": 4
}
}
},
{
"type": "modifier",
"modifier": {
"type": "addKeyword",
"filter": "self",
"keyword": "damage+1",
"condition": {
"type": "canSpot",
"filter": "companion,culture(shire)",
"count": 4
}
}
},
]
},
"101_1004": {
"101_004": {
"side": "free_people",
"culture": "Gondor",
"title": "*Loud and Clear It Sounds",
@@ -139,82 +143,68 @@
"keyword": "support area",
"effects": [
{
"type": "activated",
"phase": "skirmish",
"condition": {
"type": "canSpot",
"filter": "bearer,inSkirmishAgainst(Nazgul)",
"type": "trigger",
"optional": true,
"trigger": {
"type": "assignedToSkirmish",
"filter": "companion,culture(shire)",
"side": "shadow",
"memorizeAssigned": "assignedHobbit",
"memorizeAgainst": "assignedMinion"
},
"cost": [
{
"type": "memorize",
"filter": "bearer",
"memory": "bearer"
},
"type": "exert",
"count": 1,
"filter": "choose(companion,culture(gondor))",
"memorize": "newAssignee"
},
{
"type": "discard",
"filter": "self"
}
],
"effect":[
{
"type": "modifyStrength",
"filter": "memory(bearer)",
"amount": 3
},
{
"type": "addKeyword",
"filter": "memory(bearer)",
"keyword": "damage+1"
}
]
},
"effect": {
"type": "replaceInAssignment",
"filter": "memory(assignedHobbit)",
"with": "memory(newAssignee)"
}
}
]
},
"101_1005": {
"101_005": {
"side": "free_people",
"culture": "Gondor",
"title": "Remnant of Numenor",
"type": "condition",
"cost": 1,
"keyword": "support area",
"effects": [
{
"type": "activated",
"phase": "skirmish",
"condition": {
"type": "canSpot",
"filter": "bearer,inSkirmishAgainst(Nazgul)",
},
"cost": [
{
"type": "memorize",
"filter": "bearer",
"memory": "bearer"
},
{
"type": "discard",
"filter": "self"
}
],
"effect":[
{
"type": "modifyStrength",
"filter": "memory(bearer)",
"amount": 3
},
{
"type": "addKeyword",
"filter": "memory(bearer)",
"keyword": "damage+1"
}
]
"condition": {
"type": "canSpot",
"filter": "companion,culture(gondor)"
},
"effects": {
"type": "trigger",
"optional": true,
"trigger": {
"type": "discardFromHand",
"filter": "any",
"player": "shadowPlayer"
},
]
"cost": {
"type": "addTwilight",
"amount": 1
},
"effect": {
"type": "shuffleCardsFromDiscardIntoDrawDeck",
"filter": "choose(culture(gondor))",
"count": 1
}
}
},
"101_1006": {
"101_006": {
"side": "shadow",
"culture": "Sauron",
"title": "*Great Wolf Chief",
@@ -263,7 +253,7 @@
]
},
"101_1007": {
"101_007": {
"side": "shadow",
"culture": "Sauron",
"title": "Hollin Snarler",
@@ -312,7 +302,7 @@
]
},
"101_1008": {
"101_008": {
"side": "shadow",
"culture": "Sauron",
"title": "Hound of Sauron",
@@ -361,7 +351,7 @@
]
},
"101_1009": {
"101_009": {
"side": "shadow",
"culture": "Sauron",
"title": "*The Hunt is Up!",
@@ -403,7 +393,7 @@
]
},
"101_1010": {
"101_010": {
"side": "shadow",
"culture": "Sauron",
"title": "I See You",

View File

@@ -201,7 +201,7 @@
{
"type": "conditional",
"condition": {
"type": "chooseHowManyToSpot",
"type": "canSpot",
"count": 5,
"filter": "companion"
},

View File

@@ -29,6 +29,7 @@ public class EffectAppenderFactory {
effectAppenderProducers.put("wound", new Wound());
effectAppenderProducers.put("heal", new Heal());
effectAppenderProducers.put("replaceinskirmish", new ReplaceInSkirmish());
effectAppenderProducers.put("replaceinassignment", new ReplaceInAssignment());
effectAppenderProducers.put("canttakemorewoundsthan", new CantTakeMoreWoundsThan());
effectAppenderProducers.put("canttakewounds", new CantTakeWounds());
effectAppenderProducers.put("choice", new Choice());

View File

@@ -0,0 +1,47 @@
package com.gempukku.lotro.cards.build.field.effect.appender;
import com.gempukku.lotro.cards.build.ActionContext;
import com.gempukku.lotro.cards.build.CardGenerationEnvironment;
import com.gempukku.lotro.cards.build.FilterableSource;
import com.gempukku.lotro.cards.build.InvalidCardDefinitionException;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import com.gempukku.lotro.cards.build.field.effect.EffectAppender;
import com.gempukku.lotro.cards.build.field.effect.EffectAppenderProducer;
import com.gempukku.lotro.cards.build.field.effect.appender.resolver.CardResolver;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.logic.actions.CostToEffectAction;
import com.gempukku.lotro.logic.effects.ReplaceFpCharacterInAssignmentEffect;
import com.gempukku.lotro.logic.timing.DoNothingEffect;
import com.gempukku.lotro.logic.timing.Effect;
import org.json.simple.JSONObject;
public class ReplaceInAssignment implements EffectAppenderProducer {
@Override
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "filter", "with");
final String filter = FieldUtils.getString(effectObject.get("filter"), "filter");
final String with = FieldUtils.getString(effectObject.get("with"), "with");
MultiEffectAppender result = new MultiEffectAppender();
result.addEffectAppender(
CardResolver.resolveCard(filter, "_oldAssignee", "you", "Choose assigned character to replace", environment));
result.addEffectAppender(
CardResolver.resolveCard(with, "_newAssignee", "you", "Choose character to replace with in assignment", environment));
result.addEffectAppender(
new DelayedAppender() {
@Override
protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) {
final PhysicalCard oldCard = actionContext.getCardFromMemory("_oldAssignee");
final PhysicalCard newCard = actionContext.getCardFromMemory("_newAssignee");
if (oldCard != null && newCard != null)
return new ReplaceFpCharacterInAssignmentEffect(newCard, oldCard);
else
return new DoNothingEffect();
}
});
return result;
}
}

View File

@@ -1,22 +1,23 @@
package com.gempukku.lotro.cards.build.field.effect.trigger;
import com.gempukku.lotro.cards.build.ActionContext;
import com.gempukku.lotro.cards.build.CardGenerationEnvironment;
import com.gempukku.lotro.cards.build.FilterableSource;
import com.gempukku.lotro.cards.build.InvalidCardDefinitionException;
import com.gempukku.lotro.cards.build.*;
import com.gempukku.lotro.cards.build.field.FieldUtils;
import com.gempukku.lotro.cards.build.field.effect.appender.resolver.PlayerResolver;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import com.gempukku.lotro.logic.timing.results.DiscardCardFromHandResult;
import com.gempukku.lotro.logic.timing.results.DiscardCardsFromPlayResult;
import org.json.simple.JSONObject;
public class DiscardFromHand implements TriggerCheckerProducer {
@Override
public TriggerChecker getTriggerChecker(JSONObject value, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(value, "filter", "memorize");
FieldUtils.validateAllowedFields(value, "filter", "memorize", "player");
final String filter = FieldUtils.getString(value.get("filter"), "filter", "any");
final String memorize = FieldUtils.getString(value.get("memorize"), "memorize");
final String player = FieldUtils.getString(value.get("player"), "player");
PlayerSource playerSource = (player != null) ? PlayerResolver.resolvePlayer(player, environment) : null;
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment);
return new TriggerChecker() {
@@ -27,8 +28,14 @@ public class DiscardFromHand implements TriggerCheckerProducer {
@Override
public boolean accepts(ActionContext actionContext) {
final boolean result = TriggerConditions.forEachDiscardedFromHand(actionContext.getGame(), actionContext.getEffectResult(),
boolean result = TriggerConditions.forEachDiscardedFromHand(actionContext.getGame(), actionContext.getEffectResult(),
filterableSource.getFilterable(actionContext));
if (result && playerSource != null) {
// Need to check if it was that player discarding the card
final String performingPlayer = ((DiscardCardFromHandResult) actionContext.getEffectResult()).getSource().getOwner();
if (performingPlayer == null || !performingPlayer.equals(playerSource.getPlayer(actionContext)))
result = false;
}
if (result && memorize != null) {
actionContext.setCardMemory(memorize, ((DiscardCardFromHandResult) actionContext.getEffectResult()).getDiscardedCard());
}

View File

@@ -270,6 +270,15 @@ public class GenericCardTestHelper extends AbstractAtTest {
Arrays.stream(cards).forEach(card -> MoveCardToZone(P1, card, Zone.SUPPORT));
}
public void FreepsMoveCardToDiscard(String cardName) { FreepsMoveCardToSupportArea(GetFreepsCard(cardName)); }
public void FreepsMoveCardToDiscard(PhysicalCardImpl...cards) {
Arrays.stream(cards).forEach(card -> MoveCardToZone(P1, card, Zone.DISCARD));
}
public void ShadowMoveCardToDiscard(String cardName) { ShadowMoveCardToSupportArea(GetShadowCard(cardName)); }
public void ShadowMoveCardToDiscard(PhysicalCardImpl...cards) {
Arrays.stream(cards).forEach(card -> MoveCardToZone(P1, card, Zone.DISCARD));
}
public void MoveCardToZone(String player, PhysicalCardImpl card, Zone zone) {
if(card.getZone() != null)
{
@@ -409,6 +418,9 @@ public class GenericCardTestHelper extends AbstractAtTest {
_game.getModifiersEnvironment().addUntilEndOfTurnModifier(mod);
}
public void FreepsChoose(String choice) throws DecisionResultInvalidException { playerDecided(P1, choice); }
public void ShadowChoose(String choice) throws DecisionResultInvalidException { playerDecided(P2, choice); }
public void FreepsChooseToMove() throws DecisionResultInvalidException { playerDecided(P1, "0"); }
public void FreepsChooseToStay() throws DecisionResultInvalidException { playerDecided(P1, "1"); }

View File

@@ -0,0 +1,147 @@
package com.gempukku.lotro.cards.unofficial.pc.vset1.vpack1;
import com.gempukku.lotro.cards.GenericCardTestHelper;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.PhysicalCardImpl;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Test;
import java.util.HashMap;
import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class Card_V1_001Tests
{
protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException {
return new GenericCardTestHelper(
new HashMap<String, String>()
{{
put("aragorn", "1_89");
put("boromir", "1_97");
put("lords", "101_001");
put("runner1", "1_178");
put("runner2", "1_178");
}}
);
}
@Test
public void LordsStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException {
/**
* Set: VSet1, VPack1
* Title: The Lords of Gondor Have Returned
* Side: Free Peoples
* Culture: Gondor
* Twilight Cost: 2
* Type: Condition
* Subtype: Support Area
* Game Text: While Boromir is assigned to skirmish more than one minion, Aragorn is strength +3.
* While Aragorn is assigned to skirmish more than one minion, Boromir is strength +3.
*/
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl lords = scn.GetFreepsCard("lords");
assertTrue(scn.HasKeyword(lords, Keyword.SUPPORT_AREA));
assertEquals(2, lords.getBlueprint().getTwilightCost());
assertTrue(lords.getBlueprint().isUnique());
}
// @Test
// public void OneIsBuffedWhenOtherAssignedMultiple() throws DecisionResultInvalidException, CardNotFoundException {
// //Pre-game setup
// GenericCardTestHelper scn = GetScenario();
//
// PhysicalCardImpl aragorn = scn.GetFreepsCard("aragorn");
// PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
// PhysicalCardImpl lords = scn.GetFreepsCard("lords");
//
// scn.FreepsMoveCharToTable(aragorn);
// scn.FreepsMoveCharToTable(boromir);
// scn.FreepsMoveCardToHand(lords);
//
// PhysicalCardImpl runner1 = scn.GetShadowCard("runner1");
// PhysicalCardImpl runner2 = scn.GetShadowCard("runner2");
//
// scn.ShadowMoveCharToTable(runner1);
// scn.ShadowMoveCharToTable(runner2);
//
// scn.StartGame();
// scn.FreepsPlayCard(lords);
// scn.SkipToPhase(Phase.ASSIGNMENT);
//
// assertEquals(7, scn.GetStrength(boromir));
// assertEquals(8, scn.GetStrength(aragorn));
//
// scn.FreepsSkipCurrentPhaseAction();
// scn.ShadowSkipCurrentPhaseAction();
//
// //Let shadow assign so we don't have to worry about defender bonuses
// scn.FreepsSkipCurrentPhaseAction();
// scn.ShadowAssignToMinions(boromir, runner1, runner2);
//
// assertEquals(7, scn.GetStrength(boromir));
// assertEquals(11, scn.GetStrength(aragorn));
//
// scn.FreepsResolveSkirmish(boromir);
//
// scn.SkipToPhase(Phase.REGROUP);
// scn.SkipCurrentPhaseActions();
// scn.ShadowSkipCurrentPhaseAction();
// scn.FreepsChooseToMove();
//
// scn.SkipToPhase(Phase.ASSIGNMENT);
//
// //Let shadow assign so we don't have to worry about defender bonuses
// scn.FreepsSkipCurrentPhaseAction();
// scn.ShadowAssignToMinions(aragorn, runner1, runner2);
//
// assertEquals(10, scn.GetStrength(boromir));
// assertEquals(8, scn.GetStrength(aragorn));
// }
@Test
public void NoBuffsWhenAssignedSingle() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl aragorn = scn.GetFreepsCard("aragorn");
PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
PhysicalCardImpl lords = scn.GetFreepsCard("lords");
scn.FreepsMoveCharToTable(aragorn);
scn.FreepsMoveCharToTable(boromir);
scn.FreepsMoveCardToHand(lords);
PhysicalCardImpl runner1 = scn.GetShadowCard("runner1");
PhysicalCardImpl runner2 = scn.GetShadowCard("runner2");
scn.ShadowMoveCharToTable(runner1);
scn.ShadowMoveCharToTable(runner2);
scn.StartGame();
scn.FreepsPlayCard(lords);
scn.SkipToPhase(Phase.ASSIGNMENT);
assertEquals(7, scn.GetStrength(boromir));
assertEquals(8, scn.GetStrength(aragorn));
scn.SkipCurrentPhaseActions();
scn.FreepsAssignToMinions(new PhysicalCardImpl[]{ boromir, runner1 }, new PhysicalCardImpl[]{ aragorn, runner2 });
assertEquals(7, scn.GetStrength(boromir));
assertEquals(8, scn.GetStrength(aragorn));
}
}

View File

@@ -0,0 +1,125 @@
package com.gempukku.lotro.cards.unofficial.pc.vset1.vpack1;
import com.gempukku.lotro.cards.GenericCardTestHelper;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.PhysicalCardImpl;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Test;
import java.util.HashMap;
import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class Card_V1_002Tests
{
protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException {
return new GenericCardTestHelper(
new HashMap<String, String>()
{{
put("aragorn", "1_89");
put("boromir", "1_97");
put("whitecity", "101_002");
put("attea", "1_229");
put("cantea", "1_230");
}}
);
}
@Test
public void WhiteCityStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException {
/**
* Set: VSet1, VPack1
* Title: *I Will Not Let the White City Fall
* Side: Free Peoples
* Culture: Gondor
* Twilight Cost: 2
* Type: Condition
* Subtype: Support Area
* Game Text: Each time Boromir loses a skirmish, make Aragorn strength +2 until the regroup phase.
* Each time Aragorn loses a skirmish, make Boromir strength +2 until the regroup phase.
*/
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl whitecity = scn.GetFreepsCard("whitecity");
assertTrue(scn.HasKeyword(whitecity, Keyword.SUPPORT_AREA));
assertEquals(2, whitecity.getBlueprint().getTwilightCost());
assertTrue(whitecity.getBlueprint().isUnique());
}
@Test
public void OneIsBuffedWhenOtherLosesSkirmish() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl aragorn = scn.GetFreepsCard("aragorn");
PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
PhysicalCardImpl whitecity = scn.GetFreepsCard("whitecity");
scn.FreepsMoveCharToTable(aragorn);
scn.FreepsMoveCharToTable(boromir);
scn.FreepsMoveCardToHand(whitecity);
PhysicalCardImpl cantea = scn.GetShadowCard("cantea");
PhysicalCardImpl attea = scn.GetShadowCard("attea");
scn.ShadowMoveCharToTable(cantea, attea);
scn.StartGame();
scn.FreepsPlayCard(whitecity);
scn.SkipToPhase(Phase.ASSIGNMENT);
assertEquals(7, scn.GetStrength(boromir));
assertEquals(8, scn.GetStrength(aragorn));
scn.SkipCurrentPhaseActions();
//Standard assignment
scn.FreepsAssignToMinions(new PhysicalCardImpl[] { aragorn, cantea}, new PhysicalCardImpl[] { boromir, attea});
scn.FreepsResolveSkirmish(aragorn);
scn.SkipCurrentPhaseActions();
scn.FreepsAcceptOptionalTrigger(); //Have to resolve the skirmish and the condition trigger
// 14 > 8, Aragorn lost, Boromir should be buffed
assertEquals(9, scn.GetStrength(boromir));
assertEquals(8, scn.GetStrength(aragorn));
scn.FreepsResolveSkirmish(boromir);
scn.SkipCurrentPhaseActions();
scn.FreepsAcceptOptionalTrigger(); //Have to resolve the skirmish and the condition trigger
// 12 > 9, Boromir lost, Aragorn should be buffed
assertEquals(9, scn.GetStrength(boromir));
assertEquals(10, scn.GetStrength(aragorn));
//Fierce assignment
scn.FreepsSkipCurrentPhaseAction();
scn.ShadowSkipCurrentPhaseAction();
scn.FreepsAssignToMinions(new PhysicalCardImpl[] { aragorn, cantea}, new PhysicalCardImpl[] { boromir, attea});
scn.FreepsResolveSkirmish(boromir);
scn.SkipCurrentPhaseActions();
scn.FreepsAcceptOptionalTrigger(); //Have to resolve the skirmish and the condition trigger
// 10 > 9, Boromir lost again, Aragorn should be buffed again
assertEquals(9, scn.GetStrength(boromir));
assertEquals(12, scn.GetStrength(aragorn));
scn.FreepsResolveSkirmish(aragorn);
//Aragorn now wins his skirmish, so there's no loss trigger to evaluate
scn.SkipToPhase(Phase.REGROUP);
//strength should be back to normal
assertEquals(7, scn.GetStrength(boromir));
assertEquals(8, scn.GetStrength(aragorn));
}
}

View File

@@ -0,0 +1,95 @@
package com.gempukku.lotro.cards.unofficial.pc.vset1.vpack1;
import com.gempukku.lotro.cards.GenericCardTestHelper;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Signet;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.PhysicalCardImpl;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Test;
import java.util.HashMap;
import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class Card_V1_003Tests
{
protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException {
return new GenericCardTestHelper(
new HashMap<String, String>()
{{
put("boromir", "101_003");
put("sam", "1_311");
put("merry", "1_302");
put("pippin", "1_307");
}}
);
}
@Test
public void BoromirStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException {
/**
* Set: VSet1, VPack1
* Title: *Boromir
* Subtitle: The Redeemed
* Side: Free Peoples
* Culture: Gondor
* Twilight Cost: 3
* Type: Companion
* Subtype: Man
* Strength: 7
* Vitality: 3
* Signet: Aragorn
* Game Text: While you can spot 2 [shire] companions, Boromir is defender +1.
* While you can spot 4 [shire] companions, Boromir is strength +2 and damage +1.
*/
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
assertTrue(boromir.getBlueprint().isUnique());
assertEquals(3, boromir.getBlueprint().getTwilightCost());
assertEquals(7, boromir.getBlueprint().getStrength());
assertEquals(3, boromir.getBlueprint().getVitality());
assertEquals(Signet.ARAGORN, boromir.getBlueprint().getSignet());
}
@Test
public void TwoAndFourHobbitsTriggerBuffs() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
PhysicalCardImpl sam = scn.GetFreepsCard("sam");
PhysicalCardImpl merry = scn.GetFreepsCard("merry");
PhysicalCardImpl pippin = scn.GetFreepsCard("pippin");
scn.FreepsMoveCardToHand(sam, merry, pippin);
scn.FreepsMoveCharToTable(boromir);
scn.StartGame();
assertFalse(scn.HasKeyword(boromir, Keyword.DEFENDER));
assertFalse(scn.HasKeyword(boromir, Keyword.DAMAGE));
assertEquals(7, scn.GetStrength(boromir));
scn.FreepsPlayCard(sam);
assertTrue(scn.HasKeyword(boromir, Keyword.DEFENDER));
assertEquals(7, scn.GetStrength(boromir));
scn.FreepsPlayCard(merry);
scn.FreepsPlayCard(pippin);
assertTrue(scn.HasKeyword(boromir, Keyword.DAMAGE));
assertEquals(9, scn.GetStrength(boromir));
}
}

View File

@@ -0,0 +1,106 @@
package com.gempukku.lotro.cards.unofficial.pc.vset1.vpack1;
import com.gempukku.lotro.cards.GenericCardTestHelper;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Zone;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.PhysicalCardImpl;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Test;
import java.util.HashMap;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class Card_V1_004Tests
{
protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException {
return new GenericCardTestHelper(
new HashMap<String, String>()
{{
put("aragorn", "1_89");
put("boromir", "1_97");
put("loud", "101_004");
put("attea", "1_229");
}}
);
}
@Test
public void LoudAndClearStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException {
/**
* Set: VSet1, VPack1
* Title: *Loud and Clear It Sounds
* Side: Free Peoples
* Culture: Gondor
* Twilight Cost: 1
* Type: Condition
* Subtype: Support Area
* Game Text: Each time the Shadow player assigns as minion to a [shire] companion, you may exert a [gondor] companion and discard this condition to assign that minion to that [gondor] companion instead.
*/
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl loud = scn.GetFreepsCard("loud");
assertTrue(scn.HasKeyword(loud, Keyword.SUPPORT_AREA));
assertEquals(1, loud.getBlueprint().getTwilightCost());
assertTrue(loud.getBlueprint().isUnique());
}
@Test
public void LoudAndClearInterceptsShadowAssignment() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl frodo = scn.GetRingBearer();
PhysicalCardImpl aragorn = scn.GetFreepsCard("aragorn");
PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
PhysicalCardImpl loud = scn.GetFreepsCard("loud");
scn.FreepsMoveCharToTable(boromir, aragorn);
scn.FreepsMoveCardToSupportArea(loud);
PhysicalCardImpl attea = scn.GetShadowCard("attea");
scn.ShadowMoveCharToTable(attea);
scn.StartGame();
scn.SkipToPhase(Phase.ASSIGNMENT);
//Assignment actions
scn.SkipCurrentPhaseActions();
//Skip standard assignment so shadow assigns
scn.FreepsSkipCurrentPhaseAction();
scn.ShadowAssignToMinions(frodo, attea);
assertTrue(scn.FreepsHasOptionalTriggerAvailable());
scn.FreepsAcceptOptionalTrigger();
scn.FreepsChooseCard(boromir);
assertTrue(loud.getZone() == Zone.DISCARD);
assertTrue(scn.IsCharAssigned(boromir));
assertEquals(1, scn.GetWoundsOn(boromir));
assertFalse(scn.IsCharAssigned(frodo));
scn.FreepsResolveSkirmish(boromir);
scn.SkipCurrentPhaseActions();
//fierce skirmish
scn.SkipCurrentPhaseActions();
scn.FreepsAssignToMinions(frodo, attea);
//should only trigger if shadow assigns
assertFalse(scn.FreepsHasOptionalTriggerAvailable());
}
}

View File

@@ -0,0 +1,126 @@
package com.gempukku.lotro.cards.unofficial.pc.vset1.vpack1;
import com.gempukku.lotro.cards.GenericCardTestHelper;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Zone;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.PhysicalCardImpl;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import org.junit.Assert;
import org.junit.Test;
import java.util.HashMap;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class Card_V1_005Tests
{
protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException {
return new GenericCardTestHelper(
new HashMap<String, String>()
{{
put("aragorn", "1_89");
put("boromir", "1_97");
put("remnant", "101_005");
put("inquisitor", "1_268");
}}
);
}
@Test
public void RemnantStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException {
/**
* Set: VSet1, VPack1
* Title: *Remnant of Numenor
* Side: Free Peoples
* Culture: Gondor
* Twilight Cost: 1
* Type: Condition
* Subtype: Support Area
* Game Text: To play, spot a [gondor] companion.
* Each time a card is discarded from your hand by a Shadow card, you may add (1) to shuffle a [gondor] card from your discard pile into your draw deck.
*/
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl remnant = scn.GetFreepsCard("remnant");
assertTrue(scn.HasKeyword(remnant, Keyword.SUPPORT_AREA));
assertEquals(1, remnant.getBlueprint().getTwilightCost());
}
@Test
public void RemnantSpotsAGondorCompanionToPlay() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl aragorn = scn.GetFreepsCard("aragorn");
PhysicalCardImpl remnant = scn.GetFreepsCard("remnant");
scn.FreepsMoveCardToHand(aragorn, remnant);
scn.StartGame();
assertEquals(Phase.FELLOWSHIP, scn.GetCurrentPhase());
Assert.assertFalse(scn.FreepsCardPlayAvailable(remnant));
scn.FreepsPlayCard(aragorn);
assertTrue(scn.FreepsCardPlayAvailable(remnant));
}
@Test
public void RemnantTriggersOnShadowDiscardFromHand() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
GenericCardTestHelper scn = GetScenario();
PhysicalCardImpl frodo = scn.GetRingBearer();
PhysicalCardImpl aragorn = scn.GetFreepsCard("aragorn");
PhysicalCardImpl boromir = scn.GetFreepsCard("boromir");
PhysicalCardImpl remnant = scn.GetFreepsCard("remnant");
scn.FreepsMoveCardToDiscard(boromir);
scn.FreepsMoveCardToHand(aragorn);
scn.FreepsMoveCardToSupportArea(remnant);
PhysicalCardImpl inquisitor = scn.GetShadowCard("inquisitor");
scn.ShadowMoveCardToHand(inquisitor);
scn.StartGame();
scn.SetTwilight(10);
scn.FreepsSkipCurrentPhaseAction();
assertEquals(1, scn.GetFreepsHandCount());
assertEquals(1, scn.GetFreepsDeckCount()); //the orc is also in the deck
assertEquals(1, scn.GetFreepsDiscardCount());
scn.ShadowPlayCard(inquisitor);
scn.ShadowAcceptOptionalTrigger();
assertTrue(scn.FreepsHasOptionalTriggerAvailable());
scn.FreepsAcceptOptionalTrigger();
//scn.FreepsGetADParamAsList()
scn.FreepsChoose("temp0");
//Card from hand was discarded, one of the two cards in the discard was shuffled in with the orc
assertEquals(0, scn.GetFreepsHandCount());
assertEquals(2, scn.GetFreepsDeckCount());
assertEquals(1, scn.GetFreepsDiscardCount());
// 10 starting + 2 for moving - 5 for the orc + 1 for Remnant triggering
assertEquals(8, scn.GetTwilight());
}
}