Set 2 Isengard cards

This commit is contained in:
marcin.sciesinski
2020-03-02 04:04:09 -08:00
parent aa4294d4d9
commit 979505bfc8
14 changed files with 339 additions and 571 deletions

View File

@@ -17,8 +17,8 @@
"type": "modifier",
"modifier": {
"type": "cantLookOrRevealHand",
"player": "owner",
"hand": "shadowPlayer"
"player": "shadowPlayer",
"hand": "owner"
}
}
},

View File

@@ -0,0 +1,323 @@
{
"2_39": {
"side": "shadow",
"cost": 2,
"culture": "Isengard",
"title": "Beyond the Height of Men",
"type": "event",
"keyword": "Maneuver",
"effects": {
"type": "event",
"cost": {
"type": "exert",
"filter": "choose(uruk-hai)"
},
"effect": [
{
"type": "conditional",
"condition": {
"type": "canSpot",
"filter": "companion",
"count": 6
},
"effect": {
"type": "discard",
"filter": "all(side(free people),possession,or(armor,helm,shield))"
}
},
{
"type": "conditional",
"condition": {
"type": "cantSpot",
"filter": "companion",
"count": 6
},
"effect": {
"type": "discard",
"filter": "choose(possession,or(armor,helm,shield))"
}
}
]
}
},
"2_40": {
"side": "shadow",
"cost": 1,
"culture": "Isengard",
"title": "Demands of the Sackville-Bagginses",
"type": "condition",
"keyword": "Support Area",
"condition": {
"type": "canSpot",
"filter": "culture(isengard),minion"
},
"effects": {
"type": "trigger",
"trigger": {
"type": "exerts",
"filter": "culture(shire),ally"
},
"effect": {
"type": "addTwilight",
"amount": 1
}
}
},
"2_41": {
"side": "shadow",
"cost": 0,
"culture": "Isengard",
"title": "Evil Afoot",
"type": "event",
"keyword": "Shadow",
"effects": {
"type": "event",
"cost": [
{
"type": "exert",
"filter": "choose(uruk-hai)"
},
{
"type": "chooseHowManyBurdensToSpot",
"memorize": "spottedBurdens"
}
],
"effect": {
"type": "shuffleCardsFromDiscardIntoDrawDeck",
"count": {
"type": "fromMemory",
"memory": "spottedBurdens"
},
"filter": "choose(minion)"
}
}
},
"2_42": {
"side": "shadow",
"site": 2,
"cost": 2,
"race": "Orc",
"strength": 6,
"culture": "Isengard",
"vitality": 2,
"title": "Goblin Man",
"type": "minion",
"effects": [
{
"type": "trigger",
"trigger": {
"type": "condition",
"condition": {
"type": "location",
"filter": "underground"
}
},
"effect": {
"type": "discard",
"filter": "self"
}
},
{
"type": "activated",
"phase": "shadow",
"cost": {
"type": "exert",
"filter": "self"
},
"effect": {
"type": "lookAtHand",
"hand": "fp"
}
}
]
},
"2_43": {
"side": "shadow",
"cost": 1,
"strength": 2,
"culture": "Isengard",
"possession": "Hand Weapon",
"title": "*Lurtz's Sword",
"type": "possession",
"target": "name(Lurtz)",
"effects": [
{
"type": "modifier",
"modifier": {
"type": "addKeyword",
"filter": "bearer",
"keyword": "damage+1"
}
},
{
"type": "trigger",
"trigger": {
"type": "winsSkirmish",
"filter": "bearer"
},
"effect": {
"type": "discardTopCardsFromDeck",
"count": 2,
"forced": true,
"deck": "fp"
}
}
]
},
"2_44": {
"side": "shadow",
"cost": 0,
"culture": "Isengard",
"title": "No Business of Ours",
"type": "condition",
"keyword": "Support Area",
"condition": {
"type": "canSpot",
"filter": "culture(isengard),minion"
},
"effects": {
"type": "modifier",
"modifier": {
"type": "cantLookOrRevealHand",
"player": "fp",
"hand": "shadowPlayer"
}
}
},
"2_45": {
"side": "shadow",
"cost": 1,
"culture": "Isengard",
"title": "Too Much Attention",
"type": "event",
"keyword": "Response",
"condition": {
"type": "canSpot",
"filter": "culture(isengard),minion"
},
"effects": {
"type": "responseEvent",
"trigger": {
"type": "putsOnRing"
},
"effect": {
"type": "discardTopCardsFromDeck",
"count": 5,
"forced": true,
"deck": "fp"
}
}
},
"2_46": {
"side": "shadow",
"site": 5,
"cost": 3,
"race": "Uruk-Hai",
"strength": 9,
"culture": "Isengard",
"vitality": 2,
"title": "*Uruk Captain",
"type": "minion",
"keyword": "Damage",
"effects": {
"type": "activated",
"phase": "shadow",
"cost": [
{
"type": "removeTwilight",
"amount": 1
},
{
"type": "exert",
"filter": "self"
}
],
"effect": {
"type": "playCardFromDiscard",
"filter": "choose(uruk-hai)"
}
}
},
"2_47": {
"side": "shadow",
"site": 5,
"cost": 3,
"race": "Uruk-Hai",
"strength": 7,
"culture": "Isengard",
"vitality": 2,
"title": "Uruk Scout",
"type": "minion",
"keyword": [
"Damage",
"Tracker"
],
"effects": [
{
"type": "modifier",
"modifier": {
"type": "modifyRoamingPenalty",
"filter": "culture(isengard),minion,your",
"amount": -1
}
},
{
"type": "activatedTrigger",
"trigger": {
"type": "played",
"filter": "event",
"exertsRanger": true
},
"cost": {
"type": "exert",
"filter": "self"
},
"effect": {
"type": "cancelEvent"
}
}
]
},
"2_48": {
"side": "shadow",
"cost": 2,
"culture": "Isengard",
"title": "Wizard Storm",
"type": "condition",
"keyword": [
"Weather",
"Spell"
],
"target": "site,not(hasAttached(name(Wizard Storm)))",
"effects": [
{
"type": "extraCost",
"cost": {
"type": "exert",
"filter": "choose(culture(isengard),minion)"
}
},
{
"type": "trigger",
"trigger": {
"type": "movesFrom",
"filter": "hasAttached(self)"
},
"effect": {
"type": "exert",
"filter": "all(companion)"
}
},
{
"type": "trigger",
"trigger": {
"type": "endOfTurn"
},
"effect": {
"type": "discard",
"filter": "self"
}
}
]
}
}

View File

@@ -1,61 +0,0 @@
package com.gempukku.lotro.cards.set2.isengard;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.PlayEventAction;
import com.gempukku.lotro.logic.cardtype.AbstractEvent;
import com.gempukku.lotro.logic.effects.DiscardCardsFromPlayEffect;
import com.gempukku.lotro.logic.effects.choose.ChooseAndDiscardCardsFromPlayEffect;
import com.gempukku.lotro.logic.effects.choose.ChooseAndExertCharactersEffect;
import com.gempukku.lotro.logic.timing.PlayConditions;
/**
* Set: Mines of Moria
* Side: Shadow
* Culture: Isengard
* Twilight Cost: 2
* Type: Event
* Game Text: Maneuver: Exert an Uruk-hai to discard an armor possession, helm possession, or shield possession (or all
* such Free Peoples possessions if you can spot 6 companions).
*/
public class Card2_039 extends AbstractEvent {
public Card2_039() {
super(Side.SHADOW, 2, Culture.ISENGARD, "Beyond the Height of Men", Phase.MANEUVER);
}
@Override
public boolean checkPlayRequirements(LotroGame game, PhysicalCard self) {
return PlayConditions.canExert(self, game, Race.URUK_HAI);
}
@Override
public PlayEventAction getPlayEventCardAction(String playerId, LotroGame game, PhysicalCard self) {
PlayEventAction action = new PlayEventAction(self);
action.appendCost(
new ChooseAndExertCharactersEffect(action, playerId, 1, 1, Race.URUK_HAI));
if (PlayConditions.canSpot(game, 6, CardType.COMPANION))
action.appendEffect(
new DiscardCardsFromPlayEffect(self.getOwner(), self,
Filters.and(
Side.FREE_PEOPLE,
CardType.POSSESSION,
Filters.or(
PossessionClass.ARMOR,
PossessionClass.HELM,
PossessionClass.SHIELD
))));
else
action.appendEffect(
new ChooseAndDiscardCardsFromPlayEffect(
action, playerId, 1, 1,
CardType.POSSESSION,
Filters.or(
PossessionClass.ARMOR,
PossessionClass.HELM,
PossessionClass.SHIELD
)));
return action;
}
}

View File

@@ -1,46 +0,0 @@
package com.gempukku.lotro.cards.set2.isengard;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.RequiredTriggerAction;
import com.gempukku.lotro.logic.cardtype.AbstractPermanent;
import com.gempukku.lotro.logic.effects.AddTwilightEffect;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import java.util.Collections;
import java.util.List;
/**
* Set: Mines of Moria
* Side: Shadow
* Culture: Isengard
* Twilight Cost: 1
* Type: Condition
* Game Text: To play, spot an [ISENGARD] minion. Plays to your support area. Each time a [SHIRE] ally exerts, add (1).
*/
public class Card2_040 extends AbstractPermanent {
public Card2_040() {
super(Side.SHADOW, 1, CardType.CONDITION, Culture.ISENGARD, "Demands of the Sackville-Bagginses");
}
@Override
public boolean checkPlayRequirements(LotroGame game, PhysicalCard self) {
return Filters.canSpot(game, Culture.ISENGARD, CardType.MINION);
}
@Override
public List<RequiredTriggerAction> getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (TriggerConditions.forEachExerted(game, effectResult, Culture.SHIRE, CardType.ALLY)) {
RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(
new AddTwilightEffect(self, 1));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,56 +0,0 @@
package com.gempukku.lotro.cards.set2.isengard;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.PlayEventAction;
import com.gempukku.lotro.logic.cardtype.AbstractEvent;
import com.gempukku.lotro.logic.effects.ForEachBurdenYouSpotEffect;
import com.gempukku.lotro.logic.effects.ShuffleCardsFromDiscardIntoDeckEffect;
import com.gempukku.lotro.logic.effects.choose.ChooseAndExertCharactersEffect;
import com.gempukku.lotro.logic.effects.choose.ChooseCardsFromDiscardEffect;
import com.gempukku.lotro.logic.timing.PlayConditions;
import java.util.Collection;
/**
* Set: Mines of Moria
* Side: Shadow
* Culture: Isengard
* Twilight Cost: 0
* Type: Event
* Game Text: Shadow: Exert an Uruk-hai and spot X burdens to shuffle X minions from your discard pile into your draw
* deck.
*/
public class Card2_041 extends AbstractEvent {
public Card2_041() {
super(Side.SHADOW, 0, Culture.ISENGARD, "Evil Afoot", Phase.SHADOW);
}
@Override
public boolean checkPlayRequirements(LotroGame game, PhysicalCard self) {
return PlayConditions.canExert(self, game, Race.URUK_HAI);
}
@Override
public PlayEventAction getPlayEventCardAction(final String playerId, LotroGame game, final PhysicalCard self) {
final PlayEventAction action = new PlayEventAction(self);
action.appendCost(
new ChooseAndExertCharactersEffect(action, playerId, 1, 1, Race.URUK_HAI));
action.appendEffect(
new ForEachBurdenYouSpotEffect(playerId) {
@Override
protected void burdensSpotted(int burdensSpotted) {
action.insertEffect(
new ChooseCardsFromDiscardEffect(playerId, burdensSpotted, burdensSpotted, CardType.MINION) {
@Override
protected void cardsSelected(LotroGame game, Collection<PhysicalCard> cards) {
action.insertEffect(
new ShuffleCardsFromDiscardIntoDeckEffect(self, playerId, cards));
}
});
}
});
return action;
}
}

View File

@@ -1,62 +0,0 @@
package com.gempukku.lotro.cards.set2.isengard;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Race;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.ActivateCardAction;
import com.gempukku.lotro.logic.actions.RequiredTriggerAction;
import com.gempukku.lotro.logic.cardtype.AbstractMinion;
import com.gempukku.lotro.logic.effects.LookAtOpponentsHandEffect;
import com.gempukku.lotro.logic.effects.SelfDiscardEffect;
import com.gempukku.lotro.logic.effects.SelfExertEffect;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.PlayConditions;
import java.util.Collections;
import java.util.List;
/**
* Set: Mines of Moria
* Side: Shadow
* Culture: Isengard
* Twilight Cost: 2
* Type: Minion • Orc
* Strength: 6
* Vitality: 2
* Site: 2
* Game Text: Discard this minion if underground. Shadow: Exert this minion to look at the Free Peoples player's hand.
*/
public class Card2_042 extends AbstractMinion {
public Card2_042() {
super(2, 6, 2, 2, Race.ORC, Culture.ISENGARD, "Goblin Man");
}
@Override
public List<RequiredTriggerAction> getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (game.getModifiersQuerying().hasKeyword(game, game.getGameState().getCurrentSite(), Keyword.UNDERGROUND)) {
RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(
new SelfDiscardEffect(self));
return Collections.singletonList(action);
}
return null;
}
@Override
public List<? extends ActivateCardAction> getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) {
if (PlayConditions.canUseShadowCardDuringPhase(game, Phase.SHADOW, self, 0)
&& PlayConditions.canExert(self, game, self)) {
ActivateCardAction action = new ActivateCardAction(self);
action.appendCost(
new SelfExertEffect(action, self));
action.appendEffect(
new LookAtOpponentsHandEffect(playerId, game.getGameState().getCurrentPlayerId()));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,63 +0,0 @@
package com.gempukku.lotro.cards.set2.isengard;
import com.gempukku.lotro.common.*;
import com.gempukku.lotro.filters.Filter;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.RequiredTriggerAction;
import com.gempukku.lotro.logic.cardtype.AbstractAttachable;
import com.gempukku.lotro.logic.effects.DiscardTopCardFromDeckEffect;
import com.gempukku.lotro.logic.modifiers.KeywordModifier;
import com.gempukku.lotro.logic.modifiers.Modifier;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* Set: Mines of Moria
* Side: Shadow
* Culture: Isengard
* Twilight Cost: 1
* Type: Possession • Hand Weapon
* Strength: +2
* Game Text: Bearer must be Lurtz. He is damage +1. Each time Lurtz wins a skirmish, the Free Peoples player must
* discard the top 2 cards of his or her draw deck.
*/
public class Card2_043 extends AbstractAttachable {
public Card2_043() {
super(Side.SHADOW, CardType.POSSESSION, 1, Culture.ISENGARD, PossessionClass.HAND_WEAPON, "Lurtz's Sword", null, true);
}
@Override
public Filter getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) {
return Filters.name("Lurtz");
}
@Override
public int getStrength() {
return 2;
}
@Override
public List<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
List<Modifier> modifiers = new LinkedList<Modifier>();
modifiers.add(
new KeywordModifier(self, Filters.hasAttached(self), Keyword.DAMAGE));
return modifiers;
}
@Override
public List<RequiredTriggerAction> getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (TriggerConditions.winsSkirmish(game, effectResult, Filters.name("Lurtz"))) {
RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(
new DiscardTopCardFromDeckEffect(self, game.getGameState().getCurrentPlayerId(), 2, true));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,39 +0,0 @@
package com.gempukku.lotro.cards.set2.isengard;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.cardtype.AbstractPermanent;
import com.gempukku.lotro.logic.modifiers.FPPlayerCantLookAtShadowPlayersHandModifier;
import com.gempukku.lotro.logic.modifiers.Modifier;
import java.util.Collections;
import java.util.List;
/**
* Set: Mines of Moria
* Side: Shadow
* Culture: Isengard
* Twilight Cost: 0
* Type: Condition
* Game Text: To play, spot an [ISENGARD] minion. Plays to your support area. The Free Peoples player may not look at
* or reveal cards in any Shadow player's hand.
*/
public class Card2_044 extends AbstractPermanent {
public Card2_044() {
super(Side.SHADOW, 0, CardType.CONDITION, Culture.ISENGARD, "No Business of Ours");
}
@Override
public boolean checkPlayRequirements(LotroGame game, PhysicalCard self) {
return Filters.canSpot(game, Culture.ISENGARD, CardType.MINION);
}
@Override
public List<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
return Collections.singletonList(new FPPlayerCantLookAtShadowPlayersHandModifier(self));
}
}

View File

@@ -1,45 +0,0 @@
package com.gempukku.lotro.cards.set2.isengard;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.PlayUtils;
import com.gempukku.lotro.logic.actions.PlayEventAction;
import com.gempukku.lotro.logic.cardtype.AbstractResponseEvent;
import com.gempukku.lotro.logic.effects.DiscardTopCardFromDeckEffect;
import com.gempukku.lotro.logic.timing.EffectResult;
import java.util.Collections;
import java.util.List;
/**
* Set: Mines of Moria
* Side: Shadow
* Culture: Isengard
* Twilight Cost: 1
* Type: Event
* Game Text: Response: If the Ring-bearer puts on The One Ring, spot an [ISENGARD] minion to make the Free Peoples
* player discard the top 5 cards of his or her draw deck.
*/
public class Card2_045 extends AbstractResponseEvent {
public Card2_045() {
super(Side.SHADOW, 1, Culture.ISENGARD, "Too Much Attention");
}
@Override
public List<PlayEventAction> getPlayResponseEventAfterActions(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (effectResult.getType() == EffectResult.Type.PUT_ON_THE_ONE_RING
&& Filters.canSpot(game, Culture.ISENGARD, CardType.MINION)
&& PlayUtils.checkPlayRequirements(game, self, Filters.any, 0, 0, false, false)) {
PlayEventAction action = new PlayEventAction(self);
action.appendEffect(
new DiscardTopCardFromDeckEffect(self, game.getGameState().getCurrentPlayerId(), 5, true));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,53 +0,0 @@
package com.gempukku.lotro.cards.set2.isengard;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.common.Race;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.ActivateCardAction;
import com.gempukku.lotro.logic.cardtype.AbstractMinion;
import com.gempukku.lotro.logic.effects.RemoveTwilightEffect;
import com.gempukku.lotro.logic.effects.SelfExertEffect;
import com.gempukku.lotro.logic.effects.choose.ChooseAndPlayCardFromDiscardEffect;
import com.gempukku.lotro.logic.timing.PlayConditions;
import java.util.Collections;
import java.util.List;
/**
* Set: Mines of Moria
* Side: Shadow
* Culture: Isengard
* Twilight Cost: 3
* Type: Minion • Uruk-Hai
* Strength: 9
* Vitality: 2
* Site: 5
* Game Text: Damage +1. Shadow: Remove (1) and exert Uruk Captain to play an Uruk-hai from your discard pile.
*/
public class Card2_046 extends AbstractMinion {
public Card2_046() {
super(3, 9, 2, 5, Race.URUK_HAI, Culture.ISENGARD, "Uruk Captain", null, true);
addKeyword(Keyword.DAMAGE);
}
@Override
public List<? extends ActivateCardAction> getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) {
if (PlayConditions.canUseShadowCardDuringPhase(game, Phase.SHADOW, self, 1)
&& PlayConditions.canExert(self, game, self)
// There has to be playable Uruk-hai in discard pile
&& PlayConditions.canPlayFromDiscard(playerId, game, 1, 0, Race.URUK_HAI)) {
ActivateCardAction action = new ActivateCardAction(self);
action.appendCost(
new RemoveTwilightEffect(1));
action.appendCost(
new SelfExertEffect(action, self));
action.appendEffect(
new ChooseAndPlayCardFromDiscardEffect(playerId, game, Race.URUK_HAI));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,65 +0,0 @@
package com.gempukku.lotro.cards.set2.isengard;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Race;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.ActivateCardAction;
import com.gempukku.lotro.logic.cardtype.AbstractMinion;
import com.gempukku.lotro.logic.effects.CancelEventEffect;
import com.gempukku.lotro.logic.effects.SelfExertEffect;
import com.gempukku.lotro.logic.modifiers.Modifier;
import com.gempukku.lotro.logic.modifiers.RoamingPenaltyModifier;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.PlayConditions;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import com.gempukku.lotro.logic.timing.results.PlayEventResult;
import java.util.Collections;
import java.util.List;
/**
* Set: Mines of Moria
* Side: Shadow
* Culture: Isengard
* Twilight Cost: 3
* Type: Minion • Uruk-Hai
* Strength: 7
* Vitality: 2
* Site: 5
* Game Text: Tracker. Damage +1. The roaming penalty for each [ISENGARD] minion you play is -1. Response: If an event
* is played that spots or exerts a ranger, exert this minion to cancel that event.
*/
public class Card2_047 extends AbstractMinion {
public Card2_047() {
super(3, 7, 2, 5, Race.URUK_HAI, Culture.ISENGARD, "Uruk Scout");
addKeyword(Keyword.TRACKER);
addKeyword(Keyword.DAMAGE);
}
@Override
public List<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
return Collections.singletonList(
new RoamingPenaltyModifier(self, Filters.and(Culture.ISENGARD, CardType.MINION), -1));
}
@Override
public List<? extends ActivateCardAction> getOptionalInPlayAfterActions(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (TriggerConditions.played(game, effectResult, CardType.EVENT)
&& PlayConditions.canExert(self, game, self)) {
PlayEventResult playEffect = (PlayEventResult) effectResult;
if (playEffect.isRequiresRanger()) {
ActivateCardAction action = new ActivateCardAction(self);
action.appendCost(
new SelfExertEffect(action, self));
action.appendEffect(
new CancelEventEffect(self, playEffect));
return Collections.singletonList(action);
}
}
return null;
}
}

View File

@@ -1,74 +0,0 @@
package com.gempukku.lotro.cards.set2.isengard;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Side;
import com.gempukku.lotro.filters.Filter;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.RequiredTriggerAction;
import com.gempukku.lotro.logic.cardtype.AbstractAttachable;
import com.gempukku.lotro.logic.effects.ExertCharactersEffect;
import com.gempukku.lotro.logic.effects.SelfDiscardEffect;
import com.gempukku.lotro.logic.modifiers.AbstractExtraPlayCostModifier;
import com.gempukku.lotro.logic.modifiers.cost.ExertExtraPlayCostModifier;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.PlayConditions;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import java.util.Collections;
import java.util.List;
/**
* Set: Mines of Moria
* Side: Shadow
* Culture: Isengard
* Twilight Cost: 2
* Type: Condition
* Game Text: Spell. Weather. To play, exert an [ISENGARD] minion. Plays on a site. Limit 1 per site. When
* the fellowship moves from this site, every companion must exert. Discard this condition at the end of the turn.
*/
public class Card2_048 extends AbstractAttachable {
public Card2_048() {
super(Side.SHADOW, CardType.CONDITION, 2, Culture.ISENGARD, null, "Wizard Storm");
addKeyword(Keyword.SPELL);
addKeyword(Keyword.WEATHER);
}
@Override
public Filter getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) {
return Filters.and(CardType.SITE, Filters.not(Filters.hasAttached(Filters.name(getTitle()))));
}
@Override
public boolean checkPlayRequirements(LotroGame game, PhysicalCard self) {
return PlayConditions.canExert(self, game, Culture.ISENGARD, CardType.MINION);
}
@Override
public List<? extends AbstractExtraPlayCostModifier> getExtraCostToPlay(LotroGame game, PhysicalCard self) {
return Collections.singletonList(
new ExertExtraPlayCostModifier(self, self, null, Culture.ISENGARD, CardType.MINION));
}
@Override
public List<RequiredTriggerAction> getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (TriggerConditions.movesFrom(game, effectResult, self.getAttachedTo())) {
RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(
new ExertCharactersEffect(action, self, CardType.COMPANION));
return Collections.singletonList(action);
}
if (TriggerConditions.endOfTurn(game, effectResult)) {
RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(new SelfDiscardEffect(self));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -20,7 +20,7 @@ import java.util.Collection;
public class ShuffleCardsFromDiscardIntoDrawDeck implements EffectAppenderProducer {
@Override
public EffectAppender createEffectAppender(JSONObject effectObject, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(effectObject, "filter", "where", "count");
FieldUtils.validateAllowedFields(effectObject, "filter", "count");
final String filter = FieldUtils.getString(effectObject.get("filter"), "filter", "choose(any)");
final ValueSource valueSource = ValueResolver.resolveEvaluator(effectObject.get("count"), 1, environment);

View File

@@ -9,16 +9,18 @@ import com.gempukku.lotro.common.Filterable;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import com.gempukku.lotro.logic.timing.results.PlayCardResult;
import com.gempukku.lotro.logic.timing.results.PlayEventResult;
import org.json.simple.JSONObject;
public class PlayedTriggerCheckerProducer implements TriggerCheckerProducer {
@Override
public TriggerChecker getTriggerChecker(JSONObject value, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(value, "filter", "on", "memorize");
FieldUtils.validateAllowedFields(value, "filter", "on", "memorize", "exertsRanger");
final String filterString = FieldUtils.getString(value.get("filter"), "filter");
final String onString = FieldUtils.getString(value.get("on"), "on");
final String memorize = FieldUtils.getString(value.get("memorize"), "memorize");
boolean exertsRanger = FieldUtils.getBoolean(value.get("exertsRanger"), "exertsRanger", false);
final FilterableSource filter = environment.getFilterFactory().generateFilter(filterString, environment);
final FilterableSource onFilter = (onString != null) ? environment.getFilterFactory().generateFilter(onString, environment) : null;
return new TriggerChecker() {
@@ -32,9 +34,16 @@ public class PlayedTriggerCheckerProducer implements TriggerCheckerProducer {
} else {
played = TriggerConditions.played(actionContext.getGame(), actionContext.getEffectResult(), filterable);
}
if (played && memorize != null) {
PhysicalCard playedCard = ((PlayCardResult) actionContext.getEffectResult()).getPlayedCard();
actionContext.setCardMemory(memorize, playedCard);
if (played) {
PlayCardResult playCardResult = (PlayCardResult) actionContext.getEffectResult();
if (exertsRanger && playCardResult instanceof PlayEventResult && !((PlayEventResult) playCardResult).isRequiresRanger())
return false;
if (memorize != null) {
PhysicalCard playedCard = playCardResult.getPlayedCard();
actionContext.setCardMemory(memorize, playedCard);
}
}
return played;
}