Added more ATs

This commit is contained in:
Marcin Sciesinski
2024-10-17 21:30:56 +07:00
parent c21c31a596
commit 6854cd5bcc
11 changed files with 353 additions and 68 deletions

View File

@@ -1,50 +0,0 @@
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.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.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.logic.actions.CostToEffectAction;
import com.gempukku.lotro.logic.effects.PreventCardEffect;
import com.gempukku.lotro.logic.effects.PreventableCardEffect;
import com.gempukku.lotro.logic.modifiers.evaluator.ConstantEvaluator;
import com.gempukku.lotro.logic.timing.Effect;
import org.json.simple.JSONObject;
import java.util.Collection;
public class PreventExert implements EffectAppenderProducer {
@Override
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "select");
final String select = FieldUtils.getString(effectObject.get("select"), "select", "all(any)");
MultiEffectAppender result = new MultiEffectAppender();
result.addEffectAppender(
CardResolver.resolveCards(select,
(actionContext) -> {
final PreventableCardEffect preventableEffect = (PreventableCardEffect) actionContext.getEffect();
return Filters.in(preventableEffect.getAffectedCardsMinusPrevented(actionContext.getGame()));
}, actionContext -> new ConstantEvaluator(1), "_temp", "you", "Choose characters to prevent effect to", environment));
result.addEffectAppender(
new DelayedAppender() {
@Override
protected Effect createEffect(boolean cost, CostToEffectAction action, ActionContext actionContext) {
final Collection<? extends PhysicalCard> cards = actionContext.getCardsFromMemory("_temp");
final PreventableCardEffect preventableEffect = (PreventableCardEffect) actionContext.getEffect();
return new PreventCardEffect(preventableEffect, Filters.in(cards));
}
});
return result;
}
}

View File

@@ -152,25 +152,31 @@ public class FilterFactory {
return lostSkirmish.getLoser();
});
simpleFilters.put("storedculture",
(actionContext) -> {
(actionContext) -> (Filter) (game, physicalCard) -> {
PhysicalCard.WhileInZoneData data = actionContext.getSource().getWhileInZoneData();
if (data == null)
return Filters.none;
return Culture.valueOf(data.getValue());
if (data != null) {
return physicalCard.getBlueprint().getCulture() == Culture.findCultureByHumanReadable(data.getHumanReadable());
}
return false;
});
simpleFilters.put("storedkeyword",
(actionContext) -> {
(actionContext) -> (Filter) (game, physicalCard) -> {
PhysicalCard.WhileInZoneData data = actionContext.getSource().getWhileInZoneData();
if (data == null)
return Filters.none;
return Keyword.valueOf(data.getValue());
if (data != null) {
Keyword keyword = Keyword.valueOf(data.getValue());
if (keyword != null) {
return game.getModifiersQuerying().hasKeyword(game, physicalCard, keyword);
}
}
return false;
});
simpleFilters.put("storedtitle",
(actionContext) -> {
(actionContext) -> (Filter) (game, physicalCard) -> {
PhysicalCard.WhileInZoneData data = actionContext.getSource().getWhileInZoneData();
if (data == null)
return Filters.none;
return Filters.name(data.getValue());
if (data != null) {
return physicalCard.getBlueprint().getTitle().equals(data.getValue());
}
return false;
});
simpleFilters.put("unbound",
(actionContext) -> Filters.unboundCompanion);
@@ -182,7 +188,6 @@ public class FilterFactory {
simpleFilters.put("wounded", (actionContext) -> Filters.wounded);
simpleFilters.put("your", (actionContext) -> Filters.owner(actionContext.getPerformingPlayer()));
parameterFilters.put("and",
(parameter, environment) -> {
final String[] filters = splitIntoFilters(parameter);

View File

@@ -68,6 +68,10 @@ public abstract class AbstractAtTest {
return _game.getGameState().getRing(player);
}
public PhysicalCard getSite(int siteNumber) {
return _game.getGameState().getSite(siteNumber);
}
public PhysicalCard addToZone(PhysicalCard card, Zone zone) {
_game.getGameState().addCardToZone(_game, card, zone);
return card;
@@ -191,6 +195,10 @@ public abstract class AbstractAtTest {
return _game.getModifiersQuerying().getStrength(_game, card);
}
public int getResistance(PhysicalCard card) {
return _game.getModifiersQuerying().getResistance(_game, card);
}
public void initializeSimplestGame() throws DecisionResultInvalidException {
this.initializeSimplestGame(null);
}

View File

@@ -648,4 +648,28 @@ public class AssignmentAtTest extends AbstractAtTest {
selectNo(P1);
validateContents(new String[]{String.valueOf(attea.getCardId())}, getAwaitingDecision(P1).getDecisionParameters().get("minions"));
}
@Test
public void toldeaDarkShadowCantBeAssignedTwiceToSameCompanion() throws Exception {
initializeSimplestGame();
PhysicalCard toldeaDarkShadow = addToZone(createCard(P2, "19_39"), Zone.SHADOW_CHARACTERS);
PhysicalCard aragorn = addToZone(createCard(P1, "1_89"), Zone.FREE_CHARACTERS);
passUntil(Phase.ASSIGNMENT);
pass(P1);
pass(P2);
playerDecided(P1, aragorn.getCardId() + " " + toldeaDarkShadow.getCardId());
selectCard(P1, aragorn);
pass(P1);
pass(P2);
// Fierce assignment
pass(P1);
pass(P2);
try {
playerDecided(P1, aragorn.getCardId() + " " + toldeaDarkShadow.getCardId());
fail();
} catch (DecisionResultInvalidException e) {
}
}
}

View File

@@ -0,0 +1,92 @@
package com.gempukku.lotro.at;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Zone;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.logic.decisions.AwaitingDecision;
import com.gempukku.lotro.logic.decisions.AwaitingDecisionType;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ChooseAtTest extends AbstractAtTest {
@Test
public void chooseHowManyBurdensToSpot() throws Exception {
initializeSimplestGame();
PhysicalCard enduringEvil = addToZone(createCard(P2, "1_246"), Zone.HAND);
PhysicalCard orgInquisitor = addToZone(createCard(P2, "1_268"), Zone.SHADOW_CHARACTERS);
PhysicalCard ringBearer = getRingBearer(P1);
passUntil(Phase.ASSIGNMENT);
pass(P1);
pass(P2);
playerDecided(P1, ringBearer.getCardId() + " " + orgInquisitor.getCardId());
selectCard(P1, ringBearer);
pass(P1);
selectCardAction(P2, enduringEvil);
AwaitingDecision awaitingDecision = getAwaitingDecision(P2);
assertEquals(AwaitingDecisionType.INTEGER, awaitingDecision.getDecisionType());
validateContents(new String[]{"0"}, awaitingDecision.getDecisionParameters().get("min"));
validateContents(new String[]{"1"}, awaitingDecision.getDecisionParameters().get("max"));
playerDecided(P2, "1");
}
@Test
public void chooseHowManyFPCulturesToSpot() throws Exception {
initializeSimplestGame();
PhysicalCard mercilessBerserker = addToZone(createCard(P2, "15_165"), Zone.SHADOW_CHARACTERS);
passUntil(Phase.SHADOW);
selectCardAction(P2, mercilessBerserker);
AwaitingDecision awaitingDecision = getAwaitingDecision(P2);
assertEquals(AwaitingDecisionType.INTEGER, awaitingDecision.getDecisionType());
validateContents(new String[]{"0"}, awaitingDecision.getDecisionParameters().get("min"));
validateContents(new String[]{"1"}, awaitingDecision.getDecisionParameters().get("max"));
playerDecided(P2, "1");
}
@Test
public void chooseHowManyThreatsToSpot() throws Exception {
initializeSimplestGame();
PhysicalCard gollum = addToZone(createCard(P2, "7_58"), Zone.DISCARD);
PhysicalCard soPolite = addToZone(createCard(P2, "7_74"), Zone.HAND);
addThreats(P1, 1);
passUntil(Phase.FELLOWSHIP);
setTwilightPool(10);
passUntil(Phase.SHADOW);
selectCardAction(P2, soPolite);
AwaitingDecision awaitingDecision = getAwaitingDecision(P2);
assertEquals(AwaitingDecisionType.INTEGER, awaitingDecision.getDecisionType());
validateContents(new String[]{"0"}, awaitingDecision.getDecisionParameters().get("min"));
validateContents(new String[]{"1"}, awaitingDecision.getDecisionParameters().get("max"));
playerDecided(P2, "1");
}
@Test
public void chooseHowManyTwilightTokensToSpot() throws Exception {
initializeSimplestGame();
PhysicalCard underTheLivingEarth = addToZone(createCard(P1, "4_105"), Zone.HAND);
PhysicalCard gandalf = addToZone(createCard(P1, "1_72"), Zone.FREE_CHARACTERS);
PhysicalCard goblinRunner = addToZone(createCard(P2, "1_178"), Zone.SHADOW_CHARACTERS);
passUntil(Phase.ASSIGNMENT);
pass(P1);
pass(P2);
playerDecided(P1, gandalf.getCardId() + " " + goblinRunner.getCardId());
selectCard(P1, gandalf);
selectCardAction(P1, underTheLivingEarth);
AwaitingDecision awaitingDecision = getAwaitingDecision(P1);
assertEquals(AwaitingDecisionType.INTEGER, awaitingDecision.getDecisionType());
validateContents(new String[]{"0"}, awaitingDecision.getDecisionParameters().get("min"));
validateContents(new String[]{"4"}, awaitingDecision.getDecisionParameters().get("max"));
playerDecided(P1, "4");
}
}

View File

@@ -3,8 +3,12 @@ package com.gempukku.lotro.at;
import com.gempukku.lotro.cards.GenericCardTestHelper;
import com.gempukku.lotro.common.CardType;
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.PhysicalCard;
import com.gempukku.lotro.game.PhysicalCardImpl;
import com.gempukku.lotro.logic.decisions.AwaitingDecisionType;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import com.gempukku.lotro.logic.modifiers.AddKeywordModifier;
import org.junit.Test;
@@ -115,4 +119,45 @@ public class ConcealedExposedAtTest extends AbstractAtTest {
//4 from playing aragorn, 1 for the ring-bearer, 1 for aragorn, 1 for the site (King's Tent), 0 for exposed concealed
assertEquals(7, scn.GetTwilight());
}
@Test
public void lookAtHand() throws Exception {
initializeSimplestGame();
PhysicalCard goblinMan = addToZone(createCard(P2, "2_42"), Zone.SHADOW_CHARACTERS);
PhysicalCard goblinManInHand = addToZone(createCard(P1, "2_42"), Zone.HAND);
passUntil(Phase.SHADOW);
selectCardAction(P2, goblinMan);
assertEquals(AwaitingDecisionType.ARBITRARY_CARDS, getAwaitingDecision(P2).getDecisionType());
}
@Test
public void lookAtRandomCardsFromHand() throws Exception {
initializeSimplestGame();
PhysicalCard goblinMan = addToZone(createCard(P2, "2_42"), Zone.SHADOW_CHARACTERS);
PhysicalCard galadriel = addToZone(createCard(P1, "1_45"), Zone.SUPPORT);
PhysicalCard mirrorOfGaladriel = addToZone(createCard(P1, "1_55"), Zone.SUPPORT);
for (int i = 0; i < 7; i++) {
addToZone(createCard(P2, "2_42"), Zone.HAND);
}
passUntil(Phase.MANEUVER);
selectCardAction(P1, mirrorOfGaladriel);
assertEquals(AwaitingDecisionType.ARBITRARY_CARDS, getAwaitingDecision(P1).getDecisionType());
}
@Test
public void lookAtTopCardsOfDrawDeck() throws Exception {
initializeSimplestGame();
PhysicalCard gandalf = addToZone(createCard(P1, "1_364"), Zone.FREE_CHARACTERS);
PhysicalCard questionsThatNeedAnswering = addToZone(createCard(P1, "1_81"), Zone.HAND);
passUntil(Phase.FELLOWSHIP);
selectCardAction(P1, questionsThatNeedAnswering);
assertEquals(AwaitingDecisionType.ARBITRARY_CARDS, getAwaitingDecision(P1).getDecisionType());
}
}

View File

@@ -0,0 +1,45 @@
package com.gempukku.lotro.at;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Zone;
import com.gempukku.lotro.game.PhysicalCard;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public class EventAtTest extends AbstractAtTest {
@Test
public void cancelEvent() throws Exception {
initializeSimplestGame();
PhysicalCard aragorn = addToZone(createCard(P1, "1_89"), Zone.FREE_CHARACTERS);
PhysicalCard goblinRunner = addToZone(createCard(P2, "1_178"), Zone.SHADOW_CHARACTERS);
PhysicalCard strengthOfKings = addToZone(createCard(P1, "1_115"), Zone.HAND);
PhysicalCard unfamiliarTerritory = addToZone(createCard(P2, "1_201"), Zone.HAND);
passUntil(Phase.ASSIGNMENT);
pass(P1);
pass(P2);
playerDecided(P1, aragorn.getCardId() + " " + goblinRunner.getCardId());
selectCard(P1, aragorn);
pass(P1);
assertEquals(5, getStrength(goblinRunner));
selectCardAction(P2, unfamiliarTerritory);
selectCardAction(P1, strengthOfKings);
assertEquals(5, getStrength(goblinRunner));
}
@Test
public void canPlayNextAction() throws Exception {
initializeSimplestGame();
PhysicalCard gimli = addToZone(createCard(P1, "5_7"), Zone.FREE_CHARACTERS);
PhysicalCard barukKhazad = addToZone(createCard(P1, "5_5"), Zone.HAND);
PhysicalCard goblinRunner = addToZone(createCard(P2, "1_178"), Zone.SHADOW_CHARACTERS);
passUntil(Phase.MANEUVER);
selectCardAction(P1, barukKhazad);
assertNotNull(getAwaitingDecision(P1));
}
}

View File

@@ -17,10 +17,6 @@ import java.util.*;
import static org.junit.Assert.*;
public class IndividualCardAtTest extends AbstractAtTest {
@Test
public void bilboRingBearerWithConsortingAndMorgulBrute() throws DecisionResultInvalidException, CardNotFoundException {
Map<String, LotroDeck> decks = new HashMap<>();
@@ -1284,4 +1280,41 @@ public class IndividualCardAtTest extends AbstractAtTest {
assertEquals(Zone.DISCARD, morgulBlade.getZone());
assertEquals(Zone.ATTACHED, bladeTip.getZone());
}
@Test
public void sarumanOfManyColors() throws Exception {
initializeSimplestGame();
PhysicalCard sarumanOfManyColors = addToZone(createCard(P2, "12_54"), Zone.HAND);
PhysicalCard ringBearer = getRingBearer(P1);
passUntil(Phase.FELLOWSHIP);
setTwilightPool(10);
passUntil(Phase.SHADOW);
assertEquals(4, getStrength(ringBearer));
selectCardAction(P2, sarumanOfManyColors);
playerDecided(P2, getMultipleDecisionIndex(getAwaitingDecision(P2), "Shire"));
assertEquals(3, getStrength(ringBearer));
}
@Test
public void putForthItsStrength() throws Exception {
initializeSimplestGame();
PhysicalCard putForthHisStrength = addToZone(createCard(P2, "7_205"), Zone.SUPPORT);
PhysicalCard attea = addToZone(createCard(P2, "1_229"), Zone.SHADOW_CHARACTERS);
for (int i = 0; i < 3; i++) {
addToZone(createCard(P1, "1_12"), Zone.DEAD);
}
passUntil(Phase.FELLOWSHIP);
addBurdens(3);
addThreats(P1, 3);
passUntil(Phase.SHADOW);
selectCardAction(P2, putForthHisStrength);
assertTrue(_game.isFinished());
assertEquals(P2, _game.getWinnerPlayerId());
}
}

View File

@@ -377,4 +377,19 @@ public class ModifiersAtTest extends AbstractAtTest {
addModifier(modifierSource.getModifier(actionContext));
assertTrue(Filters.assignableToSkirmish(Side.FREE_PEOPLE, false, false).accepts(_game, birchseed));
}
@Test
public void modifyResistance() throws Exception {
initializeSimplestGame();
PhysicalCard ringBearer = getRingBearer(P1);
PhysicalCard stingWeaponOfHeritage = attachTo(createCard(P1, "11_173"), ringBearer);
PhysicalCard gimli = addToZone(createCard(P1, "5_7"), Zone.FREE_CHARACTERS);
PhysicalCard goblinRunner = addToZone(createCard(P2, "1_178"), Zone.SHADOW_CHARACTERS);
passUntil(Phase.MANEUVER);
assertEquals(5, getResistance(gimli));
selectCardAction(P1, stingWeaponOfHeritage);
assertEquals(7, getResistance(gimli));
}
}

View File

@@ -1,9 +1,11 @@
package com.gempukku.lotro.at.effects;
import com.gempukku.lotro.at.AbstractAtTest;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Zone;
import com.gempukku.lotro.game.AbstractActionProxy;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.PhysicalCardImpl;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.RequiredTriggerAction;
@@ -13,10 +15,14 @@ import com.gempukku.lotro.logic.effects.PreventEffect;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.Preventable;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import com.gempukku.lotro.logic.vo.LotroDeck;
import org.junit.Test;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import static org.junit.Assert.*;
@@ -190,4 +196,37 @@ public class DrawEffectAtTest extends AbstractAtTest {
assertEquals(0, triggerCount.get());
assertEquals(1, preventCount.get());
}
@Test
public void forEachPlayer() throws Exception {
Map<String, LotroDeck> decks = new HashMap<>();
decks.put(P1, createDeckWithIsengardRuined());
decks.put(P2, createDeckWithIsengardRuined());
initializeGameWithDecks(decks);
PhysicalCard gandalf = addToZone(createCard(P1, "1_72"), Zone.FREE_CHARACTERS);
passUntil(Phase.FELLOWSHIP);
selectCardAction(P1, getSite(1));
selectNo(P1);
selectNo(P2);
}
private LotroDeck createDeckWithIsengardRuined() {
LotroDeck lotroDeck = new LotroDeck("Some deck");
// 10_121,1_2
lotroDeck.setRingBearer("10_121");
lotroDeck.setRing("1_2");
// 7_330,7_336,8_117,7_342,7_345,7_350,8_120,10_120,7_360
lotroDeck.addSite("7_331");
lotroDeck.addSite("7_335");
lotroDeck.addSite("8_117");
lotroDeck.addSite("7_342");
lotroDeck.addSite("7_345");
lotroDeck.addSite("7_350");
lotroDeck.addSite("8_120");
lotroDeck.addSite("10_120");
lotroDeck.addSite("7_360");
return lotroDeck;
}
}

View File

@@ -1,9 +1,11 @@
package com.gempukku.lotro.at.effects;
import com.gempukku.lotro.at.AbstractAtTest;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Zone;
import com.gempukku.lotro.game.AbstractActionProxy;
import com.gempukku.lotro.game.CardNotFoundException;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.PhysicalCardImpl;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.RequiredTriggerAction;
@@ -258,4 +260,31 @@ public class WoundEffectAtTest extends AbstractAtTest {
assertEquals(1, triggerCount.get());
assertEquals(1, preventCount.get());
}
@Test
public void disableWoundsOver() throws Exception {
initializeSimplestGame();
PhysicalCard valiantManOfTheWest = addToZone(createCard(P1, "1_118"), Zone.HAND);
PhysicalCard aragorn = addToZone(createCard(P1, "1_89"), Zone.FREE_CHARACTERS);
PhysicalCard lurtz = addToZone(createCard(P2, "1_127"), Zone.SHADOW_CHARACTERS);
passUntil(Phase.MANEUVER);
selectCardAction(P1, valiantManOfTheWest);
pass(P2);
pass(P1);
passUntil(Phase.ARCHERY);
pass(P1);
pass(P2);
selectCard(P1, aragorn);
passUntil(Phase.ASSIGNMENT);
pass(P1);
pass(P2);
playerDecided(P1, aragorn.getCardId() + " " + lurtz.getCardId());
selectCard(P1, aragorn);
pass(P1);
assertEquals(1, getWounds(aragorn));
pass(P2);
assertEquals(2, getWounds(aragorn));
}
}