Migrated Dwarven cards in set 12 to hjson

This commit is contained in:
MarcinSc
2024-05-18 17:06:27 +07:00
parent 4172e3c565
commit 4b937aeba0
16 changed files with 348 additions and 664 deletions

View File

@@ -1,60 +0,0 @@
package com.gempukku.lotro.cards.set12.dwarven;
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.PlayEventAction;
import com.gempukku.lotro.logic.cardtype.AbstractEvent;
import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect;
import com.gempukku.lotro.logic.effects.DiscardCardsFromPlayEffect;
import com.gempukku.lotro.logic.effects.choose.ChooseOpponentEffect;
import com.gempukku.lotro.logic.timing.PlayConditions;
/**
* Set: Black Rider
* Side: Free
* Culture: Dwarven
* Twilight Cost: 0
* Type: Event • Maneuver
* Game Text: Spot a Dwarf to choose a Shadow player who must spot a race. Discard from play all minions of all other
* races.
*/
public class Card12_001 extends AbstractEvent {
public Card12_001() {
super(Side.FREE_PEOPLE, 0, Culture.DWARVEN, "Argument Ready to Hand", Phase.MANEUVER);
}
@Override
public boolean checkPlayRequirements(LotroGame game, PhysicalCard self) {
return PlayConditions.canSpot(game, Race.DWARF);
}
@Override
public PlayEventAction getPlayEventCardAction(final String playerId, final LotroGame game, final PhysicalCard self) {
final Filter hasRace = new Filter() {
@Override
public boolean accepts(LotroGame game, PhysicalCard physicalCard) {
return physicalCard.getBlueprint().getRace() != null;
}
};
final PlayEventAction action = new PlayEventAction(self);
action.appendEffect(
new ChooseOpponentEffect(playerId) {
@Override
protected void opponentChosen(String opponentId) {
action.insertEffect(
new ChooseActiveCardEffect(self, opponentId, "Choose character with a race you wish to spare", Filters.character, hasRace) {
@Override
protected void cardSelected(LotroGame game, PhysicalCard card) {
action.insertEffect(
new DiscardCardsFromPlayEffect(self.getOwner(), self, hasRace, CardType.MINION, Filters.not(card.getBlueprint().getRace())));
}
});
}
});
return action;
}
}

View File

@@ -1,56 +0,0 @@
package com.gempukku.lotro.cards.set12.dwarven;
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.ActivateCardAction;
import com.gempukku.lotro.logic.cardtype.AbstractAttachableFPPossession;
import com.gempukku.lotro.logic.effects.SelfDiscardEffect;
import com.gempukku.lotro.logic.effects.choose.ChooseAndTransferAttachableEffect;
import com.gempukku.lotro.logic.modifiers.Modifier;
import com.gempukku.lotro.logic.modifiers.RemoveKeywordModifier;
import com.gempukku.lotro.logic.timing.PlayConditions;
import java.util.Collections;
import java.util.List;
/**
* Set: Black Rider
* Side: Free
* Culture: Dwarven
* Twilight Cost: 0
* Type: Possession • Armor
* Game Text: Bearer must be a Dwarf. Each minion skirmishing bearer loses all damage bonus. Skirmish: Discard this
* possession to transfer one of bearer's possessions to another eligible bearer.
*/
public class Card12_002 extends AbstractAttachableFPPossession {
public Card12_002() {
super(0, 0, 0, Culture.DWARVEN, PossessionClass.ARMOR, "Belt of Erebor");
}
@Override
public Filterable getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) {
return Race.DWARF;
}
@Override
public List<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
return Collections.singletonList(
new RemoveKeywordModifier(self, Filters.inSkirmishAgainst(Filters.hasAttached(self)), Keyword.DAMAGE));
}
@Override
public List<? extends ActivateCardAction> getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) {
if (PlayConditions.canUseFPCardDuringPhase(game, Phase.SKIRMISH, self)
&& PlayConditions.canSelfDiscard(self, game)) {
ActivateCardAction action = new ActivateCardAction(self);
action.appendCost(
new SelfDiscardEffect(self));
action.appendEffect(
new ChooseAndTransferAttachableEffect(action, playerId, CardType.POSSESSION, self.getAttachedTo(), Filters.any));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,44 +0,0 @@
package com.gempukku.lotro.cards.set12.dwarven;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Race;
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.OptionalTriggerAction;
import com.gempukku.lotro.logic.cardtype.AbstractPermanent;
import com.gempukku.lotro.logic.effects.DrawCardsEffect;
import com.gempukku.lotro.logic.modifiers.condition.CardPlayedInCurrentPhaseCondition;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import java.util.Collections;
import java.util.List;
/**
* Set: Black Rider
* Side: Free
* Culture: Dwarven
* Twilight Cost: 2
* Type: Condition • Support Area
* Game Text: Each time a Dwarf wins a skirmish in which you played a [DWARVEN] event, you may draw a card.
*/
public class Card12_003 extends AbstractPermanent {
public Card12_003() {
super(Side.FREE_PEOPLE, 2, CardType.CONDITION, Culture.DWARVEN, "A Clamour of Many Voices");
}
@Override
public List<OptionalTriggerAction> getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (TriggerConditions.winsSkirmish(game, effectResult, Race.DWARF)
&& new CardPlayedInCurrentPhaseCondition(Filters.owner(playerId), Culture.DWARVEN, CardType.EVENT).isFullfilled(game)) {
OptionalTriggerAction action = new OptionalTriggerAction(self);
action.appendEffect(
new DrawCardsEffect(action, playerId, 1));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,36 +0,0 @@
package com.gempukku.lotro.cards.set12.dwarven;
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.DrawCardsEffect;
import com.gempukku.lotro.logic.effects.choose.ChooseAndAddUntilEOPStrengthBonusEffect;
import com.gempukku.lotro.logic.timing.PlayConditions;
/**
* Set: Black Rider
* Side: Free
* Culture: Dwarven
* Twilight Cost: 0
* Type: Event • Skirmish
* Game Text: Make a Dwarf strength +2. Then, if that Dwarf is at a battleground or mountain site, draw a card.
*/
public class Card12_004 extends AbstractEvent {
public Card12_004() {
super(Side.FREE_PEOPLE, 0, Culture.DWARVEN, "Durability", Phase.SKIRMISH);
}
@Override
public PlayEventAction getPlayEventCardAction(String playerId, LotroGame game, PhysicalCard self) {
PlayEventAction action = new PlayEventAction(self);
action.appendEffect(
new ChooseAndAddUntilEOPStrengthBonusEffect(action, self, playerId, 2, Race.DWARF));
if (PlayConditions.location(game, Filters.or(Keyword.BATTLEGROUND, Keyword.MOUNTAIN)))
action.appendEffect(
new DrawCardsEffect(action, playerId, 1));
return action;
}
}

View File

@@ -1,45 +0,0 @@
package com.gempukku.lotro.cards.set12.dwarven;
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.ActivateCardAction;
import com.gempukku.lotro.logic.cardtype.AbstractPermanent;
import com.gempukku.lotro.logic.effects.SelfDiscardEffect;
import com.gempukku.lotro.logic.effects.choose.ChooseAndAddUntilEOPStrengthBonusEffect;
import com.gempukku.lotro.logic.modifiers.evaluator.CardMatchesEvaluator;
import com.gempukku.lotro.logic.timing.PlayConditions;
import java.util.Collections;
import java.util.List;
/**
* Set: Black Rider
* Side: Free
* Culture: Dwarven
* Twilight Cost: 3
* Type: Condition • Support Area
* Game Text: Toil 2. (For each [DWARVEN] character you exert when playing this, its twilight cost is -2)
* Skirmish: Discard this condition to make a Dwarf strength +3 (or +4 if he has resistance 4 or more).
*/
public class Card12_006 extends AbstractPermanent {
public Card12_006() {
super(Side.FREE_PEOPLE, 3, CardType.CONDITION, Culture.DWARVEN, "Dwarven Skill");
addKeyword(Keyword.TOIL, 2);
}
@Override
public List<? extends ActivateCardAction> getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) {
if (PlayConditions.canUseFPCardDuringPhase(game, Phase.SKIRMISH, self)
&& PlayConditions.canSelfDiscard(self, game)) {
ActivateCardAction action = new ActivateCardAction(self);
action.appendCost(
new SelfDiscardEffect(self));
action.appendEffect(
new ChooseAndAddUntilEOPStrengthBonusEffect(action, self, playerId, new CardMatchesEvaluator(3, 4, Filters.minResistance(4)), Race.DWARF));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,53 +0,0 @@
package com.gempukku.lotro.cards.set12.dwarven;
import com.gempukku.lotro.logic.cardtype.AbstractCompanion;
import com.gempukku.lotro.logic.timing.PlayConditions;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import com.gempukku.lotro.logic.effects.DiscardTopCardFromDeckEffect;
import com.gempukku.lotro.logic.effects.choose.ChooseOpponentEffect;
import com.gempukku.lotro.common.Culture;
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.RequiredTriggerAction;
import com.gempukku.lotro.logic.timing.EffectResult;
import java.util.Collections;
import java.util.List;
/**
* Set: Black Rider
* Side: Free
* Culture: Dwarven
* Twilight Cost: 2
* Type: Companion • Dwarf
* Strength: 6
* Vitality: 3
* Resistance: 6
* Game Text: When you play this companion during the fellowship phase, choose a Shadow player who must discard the
* top 2 cards of his or her draw deck.
*/
public class Card12_007 extends AbstractCompanion {
public Card12_007() {
super(2, 6, 3, 6, Culture.DWARVEN, Race.DWARF, null, "Dwarven Warrior");
}
@Override
public List<RequiredTriggerAction> getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, final PhysicalCard self) {
if (TriggerConditions.played(game, effectResult, self)
&& PlayConditions.isPhase(game, Phase.FELLOWSHIP)) {
final RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(
new ChooseOpponentEffect(game.getGameState().getCurrentPlayerId()) {
@Override
protected void opponentChosen(String opponentId) {
action.appendEffect(
new DiscardTopCardFromDeckEffect(self, opponentId, 2, true));
}
});
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,60 +0,0 @@
package com.gempukku.lotro.cards.set12.dwarven;
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.ActivateCardAction;
import com.gempukku.lotro.logic.cardtype.AbstractPermanent;
import com.gempukku.lotro.logic.effects.SelfDiscardEffect;
import com.gempukku.lotro.logic.effects.choose.ChooseAndAddUntilEOPStrengthBonusEffect;
import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator;
import com.gempukku.lotro.logic.timing.PlayConditions;
import java.util.Collections;
import java.util.List;
/**
* Set: Black Rider
* Side: Free
* Culture: Dwarven
* Twilight Cost: 1
* Type: Condition • Support Area
* Game Text: Skirmish: Discard this condition to make a Dwarf strength +1 for each of the following that is true:
* he is at a mountain or underground site; he has resistance 3 or more; he is bearing a possession; he is skirmishing
* a fierce minion.
*/
public class Card12_008 extends AbstractPermanent {
public Card12_008() {
super(Side.FREE_PEOPLE, 1, CardType.CONDITION, Culture.DWARVEN, "His Father's Charge");
}
@Override
public List<? extends ActivateCardAction> getPhaseActionsInPlay(String playerId, final LotroGame game, PhysicalCard self) {
if (PlayConditions.canUseFPCardDuringPhase(game, Phase.SKIRMISH, self)
&& PlayConditions.canSelfDiscard(self, game)) {
ActivateCardAction action = new ActivateCardAction(self);
action.appendCost(
new SelfDiscardEffect(self));
action.appendEffect(
new ChooseAndAddUntilEOPStrengthBonusEffect(action, self, playerId,
new Evaluator() {
@Override
public int evaluateExpression(LotroGame game, PhysicalCard cardAffected) {
int bonus = 0;
if (PlayConditions.location(game, Filters.or(Keyword.MOUNTAIN, Keyword.UNDERGROUND)))
bonus++;
if (Filters.minResistance(3).accepts(game, cardAffected))
bonus++;
if (Filters.hasAttached(CardType.POSSESSION).accepts(game, cardAffected))
bonus++;
if (Filters.inSkirmishAgainst(CardType.MINION, Keyword.FIERCE).accepts(game, cardAffected))
bonus++;
return bonus;
}
}, Race.DWARF));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,53 +0,0 @@
package com.gempukku.lotro.cards.set12.dwarven;
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.ActivateCardAction;
import com.gempukku.lotro.logic.cardtype.AbstractPermanent;
import com.gempukku.lotro.logic.effects.AddUntilStartOfPhaseModifierEffect;
import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect;
import com.gempukku.lotro.logic.effects.ChooseAndDiscardCardsFromHandEffect;
import com.gempukku.lotro.logic.modifiers.KeywordModifier;
import com.gempukku.lotro.logic.timing.PlayConditions;
import java.util.Collections;
import java.util.List;
/**
* Set: Black Rider
* Side: Free
* Culture: Dwarven
* Twilight Cost: 1
* Type: Condition • Support Area
* Game Text: Skirmish: Discard a [DWARVEN] card from hand and spot a minion skirmishing a Dwarf to make that minion
* fierce until the regroup phase.
*/
public class Card12_009 extends AbstractPermanent {
public Card12_009() {
super(Side.FREE_PEOPLE, 1, CardType.CONDITION, Culture.DWARVEN, "Loud and Strong");
}
@Override
public List<? extends ActivateCardAction> getPhaseActionsInPlay(String playerId, LotroGame game, final PhysicalCard self) {
if (PlayConditions.canUseFPCardDuringPhase(game, Phase.SKIRMISH, self)
&& PlayConditions.canDiscardFromHand(game, playerId, 1, Culture.DWARVEN)
&& PlayConditions.canSpot(game, CardType.MINION, Filters.inSkirmishAgainst(Race.DWARF))) {
final ActivateCardAction action = new ActivateCardAction(self);
action.appendCost(
new ChooseAndDiscardCardsFromHandEffect(action, playerId, false, 1, Culture.DWARVEN));
action.appendEffect(
new ChooseActiveCardEffect(self, playerId, "Choose a minion", CardType.MINION, Filters.inSkirmishAgainst(Race.DWARF)) {
@Override
protected void cardSelected(LotroGame game, PhysicalCard card) {
action.appendEffect(
new AddUntilStartOfPhaseModifierEffect(
new KeywordModifier(self, card, Keyword.FIERCE), Phase.REGROUP));
}
});
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,49 +0,0 @@
package com.gempukku.lotro.cards.set12.dwarven;
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.decisions.DecisionResultInvalidException;
import com.gempukku.lotro.logic.decisions.IntegerAwaitingDecision;
import com.gempukku.lotro.logic.effects.DrawCardsEffect;
import com.gempukku.lotro.logic.effects.PlayoutDecisionEffect;
import com.gempukku.lotro.logic.timing.PlayConditions;
/**
* Set: Black Rider
* Side: Free
* Culture: Dwarven
* Twilight Cost: 4
* Type: Event • Fellowship
* Game Text: Toil 2. (For each [DWARVEN] character you exert when playing this, its twilight cost is -2) Spot 2 Dwarves
* to draw up to 4 cards.
*/
public class Card12_010 extends AbstractEvent {
public Card12_010() {
super(Side.FREE_PEOPLE, 4, Culture.DWARVEN, "No Pauses, No Spills", Phase.FELLOWSHIP);
addKeyword(Keyword.TOIL, 2);
}
@Override
public boolean checkPlayRequirements(LotroGame game, PhysicalCard self) {
return PlayConditions.canSpot(game, 2, Race.DWARF);
}
@Override
public PlayEventAction getPlayEventCardAction(final String playerId, LotroGame game, PhysicalCard self) {
final PlayEventAction action = new PlayEventAction(self);
action.appendEffect(
new PlayoutDecisionEffect(playerId,
new IntegerAwaitingDecision(1, "Choose number of cards to draw", 1, 4, 4) {
@Override
public void decisionMade(String result) throws DecisionResultInvalidException {
int count = getValidatedResult(result);
action.appendEffect(
new DrawCardsEffect(action, playerId, count));
}
}));
return action;
}
}

View File

@@ -1,58 +0,0 @@
package com.gempukku.lotro.cards.set12.dwarven;
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.ActivateCardAction;
import com.gempukku.lotro.logic.cardtype.AbstractPermanent;
import com.gempukku.lotro.logic.effects.SelfDiscardEffect;
import com.gempukku.lotro.logic.effects.choose.ChooseAndPlayCardFromDiscardEffect;
import com.gempukku.lotro.logic.modifiers.KeywordModifier;
import com.gempukku.lotro.logic.modifiers.Modifier;
import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator;
import com.gempukku.lotro.logic.timing.PlayConditions;
import java.util.Collections;
import java.util.List;
/**
* Set: Black Rider
* Side: Free
* Culture: Dwarven
* Twilight Cost: 2
* Type: Condition • Support Area
* Game Text: Each Dwarf is damage +1 for each possession he bears. Fellowship: Discard this condition to play
* a [DWARVEN] possession from your discard pile.
*/
public class Card12_012 extends AbstractPermanent {
public Card12_012() {
super(Side.FREE_PEOPLE, 2, CardType.CONDITION, Culture.DWARVEN, "Proud and Able", null, true);
}
@Override
public java.util.List<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
return java.util.Collections.singletonList(new KeywordModifier(self, Race.DWARF, null, Keyword.DAMAGE,
new Evaluator() {
@Override
public int evaluateExpression(LotroGame game, PhysicalCard cardAffected) {
return Filters.countActive(game, CardType.POSSESSION, Filters.attachedTo(cardAffected));
}
}));
}
@Override
public List<? extends ActivateCardAction> getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) {
if (PlayConditions.canUseFPCardDuringPhase(game, Phase.FELLOWSHIP, self)
&& PlayConditions.canSelfDiscard(self, game)
&& PlayConditions.canPlayFromDiscard(playerId, game, Culture.DWARVEN, CardType.POSSESSION)) {
ActivateCardAction action = new ActivateCardAction(self);
action.appendCost(
new SelfDiscardEffect(self));
action.appendEffect(
new ChooseAndPlayCardFromDiscardEffect(playerId, game, Culture.DWARVEN, CardType.POSSESSION));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,42 +0,0 @@
package com.gempukku.lotro.cards.set12.dwarven;
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.choose.ChooseAndAddUntilEOPStrengthBonusEffect;
import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator;
/**
* Set: Black Rider
* Side: Free
* Culture: Dwarven
* Twilight Cost: 0
* Type: Event • Skirmish
* Game Text: Make a Dwarf strength +2 (or +2 for each possession he bears if he has resistance 4 or more).
*/
public class Card12_013 extends AbstractEvent {
public Card12_013() {
super(Side.FREE_PEOPLE, 0, Culture.DWARVEN, "Sharp Defense", Phase.SKIRMISH);
}
@Override
public PlayEventAction getPlayEventCardAction(String playerId, LotroGame game, PhysicalCard self) {
PlayEventAction action = new PlayEventAction(self);
action.appendEffect(
new ChooseAndAddUntilEOPStrengthBonusEffect(action, self, playerId,
new Evaluator() {
@Override
public int evaluateExpression(LotroGame game, PhysicalCard cardAffected) {
if (game.getModifiersQuerying().getResistance(game, cardAffected) >= 4) {
return 2 * Filters.countActive(game, CardType.POSSESSION, Filters.attachedTo(cardAffected));
} else {
return 2;
}
}
}, Race.DWARF));
return action;
}
}

View File

@@ -1,46 +0,0 @@
package com.gempukku.lotro.cards.set12.dwarven;
import com.gempukku.lotro.common.*;
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.ChooseAndDiscardCardsFromHandEffect;
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.List;
/**
* Set: Black Rider
* Side: Free
* Culture: Dwarven
* Twilight Cost: 0
* Type: Condition • Support Area
* Game Text: Each Dwarf gains muster. (At the start of the regroup phase, you may discard a card from hand to draw
* a card.) Each time the fellowship moves from a plains site, discard a card from your hand.
*/
public class Card12_014 extends AbstractPermanent {
public Card12_014() {
super(Side.FREE_PEOPLE, 0, CardType.CONDITION, Culture.DWARVEN, "Stalwart Support");
}
@Override
public List<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
return Collections.singletonList(new KeywordModifier(self, Race.DWARF, Keyword.MUSTER));
}
@Override
public List<RequiredTriggerAction> getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (TriggerConditions.movesFrom(game, effectResult, Keyword.PLAINS)) {
RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(
new ChooseAndDiscardCardsFromHandEffect(action, self.getOwner(), true, 1));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,38 +0,0 @@
package com.gempukku.lotro.cards.set12.dwarven;
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.cardtype.AbstractCompanion;
import com.gempukku.lotro.logic.modifiers.KeywordModifier;
import com.gempukku.lotro.logic.modifiers.Modifier;
import com.gempukku.lotro.logic.modifiers.evaluator.CountActiveEvaluator;
import java.util.Collections;
import java.util.List;
/**
* Set: Black Rider
* Side: Free
* Culture: Dwarven
* Twilight Cost: 3
* Type: Companion • Dwarf
* Strength: 7
* Vitality: 3
* Resistance: 6
* Game Text: For each artifact and possession Thrarin bears, he is damage +1.
*/
public class Card12_015 extends AbstractCompanion {
public Card12_015() {
super(3, 7, 3, 6, Culture.DWARVEN, Race.DWARF, null, "Thrarin", "Smith of Erebor", true);
}
@Override
public List<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
return Collections.singletonList(new KeywordModifier(self, self, null, Keyword.DAMAGE, new CountActiveEvaluator(Filters.or(CardType.POSSESSION, CardType.ARTIFACT), Filters.attachedTo(self))));
}
}

View File

@@ -22,13 +22,22 @@
twilight: 0
type: Event
keywords: Maneuver
effects: {
type: event
cost: {
requires: {
type: canSpot
filter: dwarf
},
effect: [
{
type: chooseActiveCards
text: Choose a race to spare, all other will be discarded
filter: choose(minion,hasRace)
memorize: chosenMinion
}
{
type: discard
filter: all(minion,not(raceInMemory(chosenMinion)))
}
]
}
@@ -65,8 +74,37 @@
twilight: 0
type: Possession
itemclass: Armor
#target: a Dwarf
target: dwarf
effects: [
{
type: modifier
modifier: {
type: removeKeyword
filter: minion,inSkirmishAgainst(bearer)
keyword: damage
}
}
{
type: activated
phase: skirmish
cost: [
{
type: memorizeActive
filter: bearer
memory: bearer
}
{
type: discard
filter: self
}
]
effect: {
type: transfer
filter: choose(possession,attachedTo(memory(bearer)))
where: choose(character)
checkTarget: true
}
}
]
gametext: Bearer must be a Dwarf.<br>Each minion skirmishing bearer loses all <b>damage</b> bonuses.<br><b>Skirmish:</b> Discard this possession to transfer one of bearer's possessions to another eligible bearer.
lore: We make good armour and keen swords....'
@@ -102,6 +140,21 @@
type: Condition
keywords: Support Area
effects: [
{
type: trigger
optional: true
trigger: {
type: winsSkirmish
filter: dwarf
}
requires: {
type: playedCardThisPhase
filter: your,culture(dwarven),event
}
effect: {
type: drawCards
}
}
]
gametext: Each time a Dwarf wins a skirmish in which you played a [dwarven] event, you may draw a card.
lore: ...crying strange news in the dawn.
@@ -136,13 +189,23 @@
twilight: 0
type: Event
keywords: Skirmish
effects: {
type: event
cost: {
},
effect: [
{
type: modifyStrength
filter: choose(dwarf)
amount: 2
}
{
type: conditional
requires: {
type: location
filter: or(battleground,mountain)
}
effect: {
type: drawCards
}
}
]
}
@@ -180,8 +243,30 @@
type: Possession
strength: 1
itemclass: Bracers
#target: a Dwarf
target: dwarf
effects: [
{
type: activatedTrigger
trigger: {
type: aboutToTakeWound
filter: bearer
}
cost: [
{
type: memorizeActive
filter: bearer
memory: bearer
}
{
type: discard
filter: self
}
]
effect: {
type: preventWound
filter: memory(bearer)
}
}
]
gametext: Bearer must be a Dwarf.<br><b>Response:</b> If bearer is about to take a wound, discard this possession to prevent that wound.
lore: Dwarven-smiths forge bracers for fit and agility.
@@ -220,6 +305,28 @@
Support Area
]
effects: [
{
type: activated
phase: skirmish
cost: {
type: discard
filter: self
}
effect: {
type: modifyStrength
filter: choose(dwarf)
memorize: chosenDwarf
amount: {
type: condition
condition: {
type: memoryMatches
filter: minResistance(4)
}
true: 4
false: 3
}
}
}
]
gametext: <b>Toil 2</b>. <helper>(For each [dwarven] character you exert when playing this, its twilight cost is -2.)</helper><br><b>Skirmish:</b> Discard this condition to make a Dwarf strength +3 (or +4 if he has resistance 4 or more).
lore: Gimli's axe-work on the Amon Hen hewed a mighty path through the Uruk-hai.
@@ -258,6 +365,23 @@
vitality: 3
resistance: 6
effects: [
{
type: trigger
trigger: {
type: played
filter: self
}
requires: {
type: phase
phase: fellowship
}
effect: {
type: discardTopCardsFromDeck
forced: true
deck: shadow
count: 2
}
}
]
gametext: When you play this companion during the fellowship phase, choose a Shadow player who must discard the top 2 cards of his or her draw deck.
lore: Though Dáin rules Erebor as King Under the Mountain, many of his kindred continue to dwell in the Iron Hills.
@@ -293,6 +417,63 @@
type: Condition
keywords: Support Area
effects: [
{
type: activated
phase: skirmish
cost: {
type: discard
filter: self
}
effect: {
type: modifyStrength
filter: choose(dwarf)
memorize: chosenDwarf
amount: {
type: sum
source: [
{
type: condition
condition: {
type: location
filter: or(mountain,underground)
}
true: 1
false: 0
}
{
type: condition
condition: {
type: memoryMatches
memory: chosenDwarf
filter: minResistance(3)
}
true: 1
false: 0
}
{
type: condition
condition: {
type: memoryMatches
memory: chosenDwarf
filter: hasAttached(possession)
}
true: 1
false: 0
}
{
type: condition
condition: {
type: memoryMatches
memory: chosenDwarf
filter: inSkirmishAgainst(fierce,minion)
}
true: 1
false: 0
}
]
}
}
}
]
gametext: <b>Skirmish:</b> Discard this condition to make a Dwarf strength +1 for each of the following that is true: he is at a mountain or underground site; he has resistance 3 or more; he is bearing a possession; he is skirmishing a fierce minion.
lore: A sharpened axe does well to protect Dwarven honor.
@@ -328,6 +509,25 @@
type: Condition
keywords: Support Area
effects: [
{
type: activated
phase: skirmish
cost: {
type: discardFromHand
forced: false
filter: choose(culture(dwarven))
}
requires: {
type: canSpot
filter: minion,inSkirmishAgainst(dwarf)
}
effect: {
type: addKeyword
filter: choose(minion,inSkirmishAgainst(dwarf))
keyword: fierce
until: regroup
}
}
]
gametext: <b>Skirmish:</b> Discard a [dwarven] card from hand and spot a minion skirmishing a Dwarf to make that minion <b>fierce</b> until the regroup phase.
lore: Alas! My axe is notched: the forty-second had an iron collar on his neck.'
@@ -365,13 +565,27 @@
Toil 2
Fellowship
]
effects: {
type: event
cost: {
},
requires: {
type: canSpot
filter: dwarf
count: 2
}
effect: [
{
type: chooseANumber
text: Choose how many cards to draw
from: 0
to: 4
memorize: chosenNumber
}
{
type: drawCards
count: {
type: fromMemory
memory: chosenNumber
}
}
]
}
@@ -386,7 +600,7 @@
}
}
12_11: {
12_11: {
cardInfo: {
imagePath: decipher/LOTR12011.jpg
javaClass: true
@@ -408,19 +622,21 @@
twilight: 0
type: Event
keywords: Response
effects: {
type: responseEvent
trigger: {
}
cost: {
type: winsSkirmish
filter: dwarf
}
effect: [
{
type: discardTopCardsFromDeck
forced: true
deck: shadow
count: 3
}
]
]
}
gametext: If a Dwarf wins a skirmish, make an opponent discard 3 cards from the top of his or her draw deck.
lore: My folk have never had dealings with any of the servants of the Enemy.'
promotext: ""
@@ -455,6 +671,30 @@
type: Condition
keywords: Support Area
effects: [
{
type: modifier
modifier: {
type: addKeyword
filter: dwarf
keyword: damage
amount: {
type: forEachHasAttached
filter: possession
}
}
}
{
type: activated
phase: fellowship
cost: {
type: discard
filter: self
}
effect: {
type: playCardFromDiscard
filter: choose(culture(dwarven),possession)
}
}
]
gametext: Each Dwarf is <b>damage +1</b> for each possession he bears.<br><b>Fellowship:</b> Discard this condition to play a [dwarven] possession from your discard pile.
lore: Dwarves' tongues run on when speaking of their handiwork, they say.'
@@ -489,13 +729,27 @@
twilight: 0
type: Event
keywords: Skirmish
effects: {
type: event
cost: {
},
effect: [
{
type: modifyStrength
filter: choose(dwarf)
memorize: chosenDwarf
amount: {
type: condition
condition: {
type: memoryMatches
memory: chosenDwarf
filter: minResistance(4)
}
true: {
type: forEachHasAttached
filter: possession
multiplier: 2
}
false: 2
}
}
]
}
@@ -533,6 +787,25 @@
type: Condition
keywords: Support Area
effects: [
{
type: modifier
modifier: {
type: addKeyword
filter: dwarf
keyword: muster
}
}
{
type: trigger
trigger: {
type: movesFrom
filter: plains
}
effect: {
type: discardFromHand
forced: true
}
}
]
gametext: Each Dwarf gains <b>muster</b>. <helper>(At the start of the regroup phase, you may discard a card from hand to draw a card.)</helper><br>Each time the fellowship moves from a plains site, discard a card from your hand.
lore: ...I am glad to have you standing nigh....'
@@ -572,6 +845,18 @@
vitality: 3
resistance: 6
effects: [
{
type: modifier
modifier: {
type: addKeyword
filter: self
keyword: damage
amount: {
type: forEachHasAttached
filter: or(artifact,possession)
}
}
}
]
gametext: For each artifact and possession Thrarin bears, he is <b>damage +1</b>.
lore: Like many other representatives who have come to Rivendell, Thrarin the smith brings troubling news from the East.

View File

@@ -248,18 +248,37 @@ public class ValueResolver {
final Filterable on1 = onFilter.getFilterable(actionContext);
return new MultiplyEvaluator(multiplier.getEvaluator(actionContext), new CountStackedEvaluator(on1, filterableSource.getFilterable(actionContext)));
};
} else if (type.equalsIgnoreCase("forEachHasAttached")) {
FieldUtils.validateAllowedFields(object, "filter", "over", "limit", "multiplier", "divider");
final String filter = FieldUtils.getString(object.get("filter"), "filter");
final ValueSource overSource = resolveEvaluator(object.get("over"), 0, environment);
final ValueSource limitSource = resolveEvaluator(object.get("limit"), Integer.MAX_VALUE, environment);
final ValueSource multiplier = resolveEvaluator(object.get("multiplier"), 1, environment);
final ValueSource divider = resolveEvaluator(object.get("divider"), 1, environment);
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment);
return actionContext ->
(Evaluator) (game, cardAffected) -> {
Filterable filterable = filterableSource.getFilterable(actionContext);
return evaluateNumber(
Filters.countActive(game, Filters.attachedTo(cardAffected), filterable),
overSource.getEvaluator(actionContext), limitSource.getEvaluator(actionContext),
multiplier.getEvaluator(actionContext), divider.getEvaluator(actionContext),
game, cardAffected);
};
} else if (type.equalsIgnoreCase("forEachYouCanSpot")) {
FieldUtils.validateAllowedFields(object, "filter", "over", "limit", "multiplier", "divider");
final String filter = FieldUtils.getString(object.get("filter"), "filter");
final ValueSource overSource = resolveEvaluator(object.get("over"), 0, environment);
final ValueSource limitSource = resolveEvaluator(object.get("limit"), Integer.MAX_VALUE, environment);
final ValueSource multiplier = resolveEvaluator(object.get("multiplier"), 1, environment);
final int divider = FieldUtils.getInteger(object.get("divider"), "divider", 1);
final ValueSource divider = resolveEvaluator(object.get("divider"), 1, environment);
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment);
return actionContext -> new DivideEvaluator(divider,
new MultiplyEvaluator(multiplier.getEvaluator(actionContext),
new CountSpottableEvaluator(overSource.getEvaluator(actionContext), limitSource.getEvaluator(actionContext),
filterableSource.getFilterable(actionContext))));
return actionContext ->
(Evaluator) (game, cardAffected) -> evaluateNumber(
Filters.countSpottable(game, filterableSource.getFilterable(actionContext)),
overSource.getEvaluator(actionContext), limitSource.getEvaluator(actionContext),
multiplier.getEvaluator(actionContext), divider.getEvaluator(actionContext),
game, cardAffected);
} else if (type.equalsIgnoreCase("forEachInDiscard")) {
FieldUtils.validateAllowedFields(object, "filter", "multiplier", "limit");
final String filter = FieldUtils.getString(object.get("filter"), "filter");
@@ -570,4 +589,13 @@ public class ValueResolver {
}
throw new InvalidCardDefinitionException("Unable to resolve an evaluator");
}
private static int evaluateNumber(int value, Evaluator over, Evaluator limit, Evaluator multiplier, Evaluator divider,
LotroGame game, PhysicalCard cardAffected) {
int result = Math.max(0, value - over.evaluateExpression(game, cardAffected));
result = Math.min(limit.evaluateExpression(game, cardAffected), result);
result *= multiplier.evaluateExpression(game, cardAffected);
result /= divider.evaluateExpression(game, cardAffected);
return result;
}
}

View File

@@ -14,8 +14,11 @@ import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.SingleMemoryEvaluator;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.results.CharacterLostSkirmishResult;
import com.google.common.base.Predicates;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
public class FilterFactory {
private final Map<String, FilterableSource> simpleFilters = new HashMap<>();
@@ -99,6 +102,8 @@ public class FilterFactory {
}
return Filters.none;
}));
simpleFilters.put("hasrace",
(actionContext -> (Filter) (game, physicalCard) -> physicalCard.getBlueprint().getRace() != null));
simpleFilters.put("idinstored",
(actionContext ->
(Filter) (game, physicalCard) -> {
@@ -425,6 +430,12 @@ public class FilterFactory {
throw new InvalidCardDefinitionException("Unknown race definition in filter: " + parameter
+ ". Do not use race() for races; instead just list the race by itself.");
});
parameterFilters.put("raceinmemory",
(parameter, environment) -> actionContext -> {
Set<Race> races = actionContext.getCardsFromMemory(parameter).stream().map(
(Function<PhysicalCard, Race>) physicalCard -> physicalCard.getBlueprint().getRace()).filter(Predicates.notNull()).collect(Collectors.toSet());
return (Filter) (game, physicalCard) -> races.contains(physicalCard.getBlueprint().getRace());
});
parameterFilters.put("regionnumber",
(parameter, environment) -> {
int min, max;