Some FotR cards

This commit is contained in:
marcin.sciesinski
2019-09-25 23:41:53 -07:00
parent 51e9728bde
commit 2d8932bd2b
9 changed files with 158 additions and 263 deletions

View File

@@ -671,5 +671,149 @@
}
}
]
},
"1_263": {
"title": "Orc Banner",
"culture": "sauron",
"cost": 1,
"type": "condition",
"keyword": "support area",
"effects": {
"type": "trigger",
"trigger": {
"type": "losesSkirmish",
"filter": "or(companion,ally)",
"against": "culture(sauron),orc"
},
"effect": {
"type": "modifyStrength",
"filter": "all(culture(sauron),orc)",
"amount": 1,
"until": "start(regroup)"
}
}
},
"1_264": {
"title": "Orc Bowmen",
"culture": "sauron",
"cost": 3,
"type": "condition",
"keyword": "support area",
"effects": {
"type": "modifier",
"modifier": {
"type": "modifyArcheryTotal",
"side": "shadow",
"condition": {
"type": "canSpot",
"filter": "culture(sauron),orc"
},
"amount": 1
}
}
},
"1_265": {
"title": "Orc Butchery",
"culture": "sauron",
"cost": 0,
"type": "event",
"keyword": "response",
"condition": {
"type": "canSpot",
"filter": "culture(sauron),orc,inSkirmish"
},
"effects": {
"type": "responseEvent",
"trigger": {
"type": "killed",
"filter": "companion"
},
"effect": {
"type": "discardTopCardsFromDeck",
"deck": "fp",
"forced": true,
"count": {
"type": "forEachInDeadPile",
"multiplier": 3
}
}
}
},
"1_266": {
"title": "Orc Chieftain",
"culture": "sauron",
"cost": 2,
"type": "minion",
"race": "orc",
"strength": 7,
"vitality": 2,
"site": 6,
"effects": {
"type": "trigger",
"trigger": {
"type": "played",
"filter": "your,weapon",
"on": "self"
},
"condition": {
"type": "perTurnLimit",
"limit": 1
},
"effect": [
{
"type": "incrementPerTurnLimit",
"limit": 1
},
{
"type": "addTwilight",
"amount": 2
}
]
}
},
"1_267": {
"title": "Orc Hunters",
"culture": "sauron",
"cost": 3,
"type": "minion",
"race": "orc",
"strength": 9,
"vitality": 2,
"site": 6,
"effects": {
"type": "activated",
"phase": "skirmish",
"cost": {
"type": "exert",
"filter": "self"
},
"effect": {
"type": "wound",
"filter": "choose(character,inSkirmishAgainst(self))"
}
}
},
"1_268": {
"title": "Orc Inquisitor",
"culture": "sauron",
"cost": 3,
"type": "minion",
"race": "orc",
"strength": 9,
"vitality": 3,
"site": 6,
"effects": {
"type": "trigger",
"optional": true,
"trigger": {
"type": "played",
"filter": "self"
},
"effect": {
"type": "discardCardAtRandomFromHand",
"hand": "fp",
"forced": true
}
}
}
}

View File

@@ -1,42 +0,0 @@
package com.gempukku.lotro.cards.set1.sauron;
import com.gempukku.lotro.logic.cardtype.AbstractPermanent;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import com.gempukku.lotro.logic.effects.AddUntilStartOfPhaseModifierEffect;
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.RequiredTriggerAction;
import com.gempukku.lotro.logic.modifiers.StrengthModifier;
import com.gempukku.lotro.logic.timing.EffectResult;
import java.util.Collections;
import java.util.List;
/**
* Set: The Fellowship of the Ring
* Side: Shadow
* Culture: Sauron
* Twilight Cost: 1
* Type: Condition
* Game Text: Plays to your support area. Each time a companion or ally loses a skirmish that involves a [SAURON] Orc,
* each [SAURON] Orc is strength +1 until the regroup phase.
*/
public class Card1_263 extends AbstractPermanent {
public Card1_263() {
super(Side.SHADOW, 1, CardType.CONDITION, Culture.SAURON, "Orc Banner");
}
@Override
public List<RequiredTriggerAction> getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (TriggerConditions.losesSkirmishInvolving(game, effectResult, Filters.or(CardType.ALLY, CardType.COMPANION), Filters.and(Culture.SAURON, Race.ORC))) {
RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(
new AddUntilStartOfPhaseModifierEffect(
new StrengthModifier(self, Filters.and(Culture.SAURON, Race.ORC), 1), Phase.REGROUP));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,34 +0,0 @@
package com.gempukku.lotro.cards.set1.sauron;
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.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.cardtype.AbstractPermanent;
import com.gempukku.lotro.logic.modifiers.ArcheryTotalModifier;
import com.gempukku.lotro.logic.modifiers.Modifier;
import com.gempukku.lotro.logic.modifiers.SpotCondition;
import java.util.Collections;
import java.util.List;
/**
* Set: The Fellowship of the Ring
* Side: Shadow
* Culture: Sauron
* Twilight Cost: 3
* Type: Condition
* Game Text: Plays to your support area. While you can spot a [SAURON] Orc, add 1 to the minion archery total.
*/
public class Card1_264 extends AbstractPermanent {
public Card1_264() {
super(Side.SHADOW, 3, CardType.CONDITION, Culture.SAURON, "Orc Bowmen");
}
@Override
public List<? extends Modifier> getInPlayModifiers(LotroGame game, PhysicalCard self) {
return Collections.singletonList(new ArcheryTotalModifier(self, Side.SHADOW, new SpotCondition(Culture.SAURON, Race.ORC), 1));
}
}

View File

@@ -1,46 +0,0 @@
package com.gempukku.lotro.cards.set1.sauron;
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.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 com.gempukku.lotro.logic.timing.TriggerConditions;
import java.util.Collections;
import java.util.List;
/**
* Set: The Fellowship of the Ring
* Side: Shadow
* Culture: Sauron
* Twilight Cost: 0
* Type: Event
* Game Text: Response: If a companion is killed by a [SAURON] Orc, the Free Peoples player must discard 3 cards from
* the top of his draw deck for each card in the dead pile.
*/
public class Card1_265 extends AbstractResponseEvent {
public Card1_265() {
super(Side.SHADOW, 0, Culture.SAURON, "Orc Butchery");
}
@Override
public List<PlayEventAction> getOptionalInHandAfterActions(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (TriggerConditions.forEachKilledBy(game, effectResult, Filters.and(Culture.SAURON, Race.ORC), CardType.COMPANION)
&& PlayUtils.checkPlayRequirements(game, self, Filters.any, 0, 0, false, false)) {
PlayEventAction action = new PlayEventAction(self);
int deadPileCount = game.getGameState().getDeadPile(game.getGameState().getCurrentPlayerId()).size();
if (deadPileCount > 0)
action.appendEffect(new DiscardTopCardFromDeckEffect(self, game.getGameState().getCurrentPlayerId(), deadPileCount * 3, true));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,47 +0,0 @@
package com.gempukku.lotro.cards.set1.sauron;
import com.gempukku.lotro.logic.cardtype.AbstractMinion;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import com.gempukku.lotro.logic.effects.CheckTurnLimitEffect;
import com.gempukku.lotro.common.Culture;
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.RequiredTriggerAction;
import com.gempukku.lotro.logic.effects.AddTwilightEffect;
import com.gempukku.lotro.logic.timing.EffectResult;
import java.util.Collections;
import java.util.List;
/**
* Set: The Fellowship of the Ring
* Side: Shadow
* Culture: Sauron
* Twilight Cost: 2
* Type: Minion • Orc
* Strength: 7
* Vitality: 2
* Site: 6
* Game Text: When you play a weapon on this minion, add (2) (limit once per turn).
*/
public class Card1_266 extends AbstractMinion {
public Card1_266() {
super(2, 7, 2, 6, Race.ORC, Culture.SAURON, "Orc Chieftain");
}
@Override
public List<RequiredTriggerAction> getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, final PhysicalCard self) {
if (TriggerConditions.playedOn(game, effectResult, self, Filters.owner(self.getOwner()), Filters.weapon)) {
RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(
new CheckTurnLimitEffect(action, self, 1,
new AddTwilightEffect(self, 2)));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,47 +0,0 @@
package com.gempukku.lotro.cards.set1.sauron;
import com.gempukku.lotro.common.Culture;
import com.gempukku.lotro.common.Phase;
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.SelfExertEffect;
import com.gempukku.lotro.logic.effects.WoundCharactersEffect;
import com.gempukku.lotro.logic.timing.PlayConditions;
import java.util.Collections;
import java.util.List;
/**
* Set: The Fellowship of the Ring
* Side: Shadow
* Culture: Sauron
* Twilight Cost: 3
* Type: Minion • Orc
* Strength: 9
* Vitality: 2
* Site: 6
* Game Text: Skirmish: Exert this minion to wound a character he is skirmishing.
*/
public class Card1_267 extends AbstractMinion {
public Card1_267() {
super(3, 9, 2, 6, Race.ORC, Culture.SAURON, "Orc Hunters");
}
@Override
public List<? extends ActivateCardAction> getPhaseActionsInPlay(String playerId, LotroGame game, PhysicalCard self) {
if (PlayConditions.canUseShadowCardDuringPhase(game, Phase.SKIRMISH, self, 0)
&& PlayConditions.canExert(self, game, self)) {
ActivateCardAction action = new ActivateCardAction(self);
action.appendCost(
new SelfExertEffect(action, self));
action.appendEffect(
new WoundCharactersEffect(self, Filters.inSkirmishAgainst(self)));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -1,42 +0,0 @@
package com.gempukku.lotro.cards.set1.sauron;
import com.gempukku.lotro.logic.cardtype.AbstractMinion;
import com.gempukku.lotro.logic.timing.TriggerConditions;
import com.gempukku.lotro.logic.effects.DiscardCardAtRandomFromHandEffect;
import com.gempukku.lotro.common.Culture;
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.OptionalTriggerAction;
import com.gempukku.lotro.logic.timing.EffectResult;
import java.util.Collections;
import java.util.List;
/**
* Set: The Fellowship of the Ring
* Side: Shadow
* Culture: Sauron
* Twilight Cost: 3
* Type: Minion • Orc
* Strength: 9
* Vitality: 3
* Site: 6
* Game Text: When you play this minion, you may make the Free Peoples player discard a card at random from hand.
*/
public class Card1_268 extends AbstractMinion {
public Card1_268() {
super(3, 9, 3, 6, Race.ORC, Culture.SAURON, "Orc Inquisitor");
}
@Override
public List<OptionalTriggerAction> getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (TriggerConditions.played(game, effectResult, self)) {
OptionalTriggerAction action = new OptionalTriggerAction(self);
action.appendEffect(
new DiscardCardAtRandomFromHandEffect(self, game.getGameState().getCurrentPlayerId(), true));
return Collections.singletonList(action);
}
return null;
}
}

View File

@@ -210,11 +210,12 @@ public class ValueResolver {
(Evaluator) (game, cardAffected) -> Filters.filter(game.getGameState().getHand(actionContext.getPerformingPlayer()),
game, filterableSource.getFilterable(actionContext)).size();
} else if (type.equalsIgnoreCase("forEachInDeadPile")) {
FieldUtils.validateAllowedFields(object, "filter");
final String filter = FieldUtils.getString(object.get("filter"), "filter");
FieldUtils.validateAllowedFields(object, "filter", "multiplier");
final String filter = FieldUtils.getString(object.get("filter"), "filter", "any");
final int multiplier = FieldUtils.getInteger(object.get("multiplier"), "multiplier", 1);
final FilterableSource filterableSource = environment.getFilterFactory().generateFilter(filter, environment);
return actionContext ->
(Evaluator) (game, cardAffected) -> Filters.filter(game.getGameState().getDeadPile(actionContext.getPerformingPlayer()),
(Evaluator) (game, cardAffected) -> multiplier * Filters.filter(game.getGameState().getDeadPile(actionContext.getPerformingPlayer()),
game, filterableSource.getFilterable(actionContext)).size();
} else if (type.equalsIgnoreCase("fromMemory")) {
FieldUtils.validateAllowedFields(object, "memory", "multiplier");

View File

@@ -14,16 +14,24 @@ import org.json.simple.JSONObject;
public class PlayedTriggerCheckerProducer implements TriggerCheckerProducer {
@Override
public TriggerChecker getTriggerChecker(JSONObject value, CardGenerationEnvironment environment) throws InvalidCardDefinitionException {
FieldUtils.validateAllowedFields(value, "filter", "memorize");
FieldUtils.validateAllowedFields(value, "filter", "on", "memorize");
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");
final FilterableSource filter = environment.getFilterFactory().generateFilter(filterString, environment);
final FilterableSource onFilter = (onString != null) ? environment.getFilterFactory().generateFilter(filterString, environment) : null;
return new TriggerChecker() {
@Override
public boolean accepts(ActionContext actionContext) {
final Filterable filterable = filter.getFilterable(actionContext);
final boolean played = TriggerConditions.played(actionContext.getGame(), actionContext.getEffectResult(), filterable);
boolean played;
if (onFilter != null) {
final Filterable onFilterable = onFilter.getFilterable(actionContext);
played = TriggerConditions.playedOn(actionContext.getGame(), actionContext.getEffectResult(), onFilterable, filterable);
} else {
played = TriggerConditions.played(actionContext.getGame(), actionContext.getEffectResult(), filterable);
}
if (played && memorize != null) {
PhysicalCard playedCard = ((PlayCardResult) actionContext.getEffectResult()).getPlayedCard();
actionContext.setCardMemory(memorize, playedCard);