"Above the Battlement"
This commit is contained in:
@@ -18,6 +18,7 @@ import com.gempukku.lotro.logic.timing.Effect;
|
|||||||
import com.gempukku.lotro.logic.timing.EffectResult;
|
import com.gempukku.lotro.logic.timing.EffectResult;
|
||||||
import com.gempukku.lotro.logic.timing.results.*;
|
import com.gempukku.lotro.logic.timing.results.*;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -213,6 +214,16 @@ public class PlayConditions {
|
|||||||
return Filters.filter(game.getGameState().getDeadPile(playerId), game.getGameState(), game.getModifiersQuerying(), Filters.and(filters, Filters.playable(game))).size() > 0;
|
return Filters.filter(game.getGameState().getDeadPile(playerId), game.getGameState(), game.getModifiersQuerying(), Filters.and(filters, Filters.playable(game))).size() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean canPlayFromStacked(String playerId, LotroGame game, Filterable stackedOn, Filterable... filters) {
|
||||||
|
final Collection<PhysicalCard> matchingStackedOn = Filters.filterActive(game.getGameState(), game.getModifiersQuerying(), stackedOn);
|
||||||
|
for (PhysicalCard stackedOnCard : matchingStackedOn) {
|
||||||
|
if (Filters.filter(game.getGameState().getStackedCards(stackedOnCard), game.getGameState(), game.getModifiersQuerying(), Filters.and(filters, Filters.playable(game))).size() > 0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean canPlayFromDiscard(String playerId, LotroGame game, Filterable... filters) {
|
public static boolean canPlayFromDiscard(String playerId, LotroGame game, Filterable... filters) {
|
||||||
if (game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.CANT_PLAY_FROM_DISCARD_OR_DECK))
|
if (game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.CANT_PLAY_FROM_DISCARD_OR_DECK))
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
package com.gempukku.lotro.cards.effects.choose;
|
||||||
|
|
||||||
|
import com.gempukku.lotro.cards.actions.PlayPermanentAction;
|
||||||
|
import com.gempukku.lotro.common.Filterable;
|
||||||
|
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.decisions.ArbitraryCardsSelectionDecision;
|
||||||
|
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
|
||||||
|
import com.gempukku.lotro.logic.timing.Action;
|
||||||
|
import com.gempukku.lotro.logic.timing.Effect;
|
||||||
|
import com.gempukku.lotro.logic.timing.EffectResult;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class ChooseAndPlayCardFromStackedEffect implements Effect {
|
||||||
|
private String _playerId;
|
||||||
|
private Filterable _stackedOn;
|
||||||
|
private Filter _filter;
|
||||||
|
private int _twilightModifier;
|
||||||
|
private Action _playCardAction;
|
||||||
|
|
||||||
|
public ChooseAndPlayCardFromStackedEffect(String playerId, Filterable stackedOn, Filterable... filter) {
|
||||||
|
this(playerId, stackedOn, 0, filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChooseAndPlayCardFromStackedEffect(String playerId, Filterable stackedOn, int twilightModifier, Filterable... filter) {
|
||||||
|
_playerId = playerId;
|
||||||
|
_stackedOn = stackedOn;
|
||||||
|
_filter = Filters.and(filter);
|
||||||
|
_twilightModifier = twilightModifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getText(LotroGame game) {
|
||||||
|
return "Play card from stacked";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPlayableInFull(LotroGame game) {
|
||||||
|
return getPlayableFromStacked(game).size() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Type getType() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Collection<PhysicalCard> getPlayableFromStacked(LotroGame game) {
|
||||||
|
Set<PhysicalCard> possibleCards = new HashSet<PhysicalCard>();
|
||||||
|
for (PhysicalCard stackedOnCard : Filters.filterActive(game.getGameState(), game.getModifiersQuerying(), _stackedOn))
|
||||||
|
possibleCards.addAll(Filters.filter(game.getGameState().getStackedCards(stackedOnCard), game.getGameState(), game.getModifiersQuerying(), _filter, Filters.playable(game, _twilightModifier)));
|
||||||
|
|
||||||
|
return possibleCards;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<? extends EffectResult> playEffect(final LotroGame game) {
|
||||||
|
Collection<PhysicalCard> playableFromStacked = getPlayableFromStacked(game);
|
||||||
|
if (playableFromStacked.size() > 0) {
|
||||||
|
game.getUserFeedback().sendAwaitingDecision(_playerId,
|
||||||
|
new ArbitraryCardsSelectionDecision(1, "Choose a card to play", new LinkedList<PhysicalCard>(playableFromStacked), 1, 1) {
|
||||||
|
@Override
|
||||||
|
public void decisionMade(String result) throws DecisionResultInvalidException {
|
||||||
|
List<PhysicalCard> selectedCards = getSelectedCardsByResponse(result);
|
||||||
|
if (selectedCards.size() > 0) {
|
||||||
|
PhysicalCard selectedCard = selectedCards.get(0);
|
||||||
|
_playCardAction = selectedCard.getBlueprint().getPlayCardAction(_playerId, game, selectedCard, _twilightModifier);
|
||||||
|
game.getActionsEnvironment().addActionToStack(_playCardAction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean wasSuccessful() {
|
||||||
|
if (_playCardAction == null)
|
||||||
|
return false;
|
||||||
|
if (_playCardAction instanceof PlayPermanentAction)
|
||||||
|
return ((PlayPermanentAction) _playCardAction).wasSuccessful();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean wasCarriedOut() {
|
||||||
|
if (_playCardAction == null)
|
||||||
|
return false;
|
||||||
|
if (_playCardAction instanceof PlayPermanentAction)
|
||||||
|
return ((PlayPermanentAction) _playCardAction).wasCarriedOut();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
package com.gempukku.lotro.cards.set7.sauron;
|
||||||
|
|
||||||
|
import com.gempukku.lotro.cards.AbstractEvent;
|
||||||
|
import com.gempukku.lotro.cards.PlayConditions;
|
||||||
|
import com.gempukku.lotro.cards.actions.PlayEventAction;
|
||||||
|
import com.gempukku.lotro.cards.effects.ChoiceEffect;
|
||||||
|
import com.gempukku.lotro.cards.effects.RemoveBurdenEffect;
|
||||||
|
import com.gempukku.lotro.cards.effects.choose.ChooseAndPlayCardFromDiscardEffect;
|
||||||
|
import com.gempukku.lotro.cards.effects.choose.ChooseAndPlayCardFromStackedEffect;
|
||||||
|
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.timing.Effect;
|
||||||
|
import com.gempukku.lotro.logic.timing.UnrespondableEffect;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set: The Return of the King
|
||||||
|
* Side: Shadow
|
||||||
|
* Culture: Sauron
|
||||||
|
* Twilight Cost: 0
|
||||||
|
* Type: Event • Shadow
|
||||||
|
* Game Text: Play a bieseger stacked on a site you control or remove a burden to play a [SAURON] Orc from your discard
|
||||||
|
* pile.
|
||||||
|
*/
|
||||||
|
public class Card7_262 extends AbstractEvent {
|
||||||
|
public Card7_262() {
|
||||||
|
super(Side.SHADOW, 0, Culture.SAURON, "Above the Battlement", Phase.SHADOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checkPlayRequirements(String playerId, LotroGame game, PhysicalCard self, int twilightModifier) {
|
||||||
|
return super.checkPlayRequirements(playerId, game, self, twilightModifier)
|
||||||
|
&& (
|
||||||
|
(PlayConditions.canRemoveBurdens(game, self, 1)
|
||||||
|
&& PlayConditions.canPlayFromDiscard(playerId, game, Culture.SAURON, Race.ORC)
|
||||||
|
)
|
||||||
|
|| PlayConditions.canPlayFromStacked(playerId, game, Filters.siteControlled(playerId), Keyword.BESIEGER));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlayEventAction getPlayCardAction(final String playerId, LotroGame game, final PhysicalCard self, int twilightModifier) {
|
||||||
|
final PlayEventAction action = new PlayEventAction(self);
|
||||||
|
List<Effect> possibleCosts = new LinkedList<Effect>();
|
||||||
|
if (PlayConditions.canPlayFromStacked(playerId, game, Filters.siteControlled(playerId), Keyword.BESIEGER))
|
||||||
|
possibleCosts.add(
|
||||||
|
new UnrespondableEffect() {
|
||||||
|
@Override
|
||||||
|
public String getText(LotroGame game) {
|
||||||
|
return "Play a besieger stacked on a site you control";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doPlayEffect(LotroGame game) {
|
||||||
|
action.appendEffect(
|
||||||
|
new ChooseAndPlayCardFromStackedEffect(playerId, Filters.siteControlled(playerId), Keyword.BESIEGER));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (PlayConditions.canRemoveBurdens(game, self, 1)
|
||||||
|
&& PlayConditions.canPlayFromDiscard(playerId, game, Culture.SAURON, Race.ORC))
|
||||||
|
possibleCosts.add(
|
||||||
|
new UnrespondableEffect() {
|
||||||
|
@Override
|
||||||
|
public String getText(LotroGame game) {
|
||||||
|
return "Remove a burden to play a SAURON Orc from your discard pile";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doPlayEffect(LotroGame game) {
|
||||||
|
action.insertCost(
|
||||||
|
new RemoveBurdenEffect(self));
|
||||||
|
action.appendEffect(
|
||||||
|
new ChooseAndPlayCardFromDiscardEffect(playerId, game.getGameState().getDiscard(playerId), Culture.SAURON, Race.ORC));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
action.appendCost(
|
||||||
|
new ChoiceEffect(action, playerId, possibleCosts));
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,7 +19,7 @@ public enum Keyword implements Filterable {
|
|||||||
DAMAGE("Damage", true, true), DEFENDER("Defender", true, true), AMBUSH("Ambush", true, true), FIERCE("Fierce", true), ARCHER("Archer", true),
|
DAMAGE("Damage", true, true), DEFENDER("Defender", true, true), AMBUSH("Ambush", true, true), FIERCE("Fierce", true), ARCHER("Archer", true),
|
||||||
UNHASTY("Unhasty", true), RANGER("Ranger", true), TRACKER("Tracker", true), VILLAGER("Villager", true), MACHINE("Machine", true), ENGINE("Engine", true),
|
UNHASTY("Unhasty", true), RANGER("Ranger", true), TRACKER("Tracker", true), VILLAGER("Villager", true), MACHINE("Machine", true), ENGINE("Engine", true),
|
||||||
SOUTHRON("Southron", true), EASTERLING("Easterling", true), VALIANT("Valiant", true), KNIGHT("Knight", true), FORTIFICATION("Fortification", true),
|
SOUTHRON("Southron", true), EASTERLING("Easterling", true), VALIANT("Valiant", true), KNIGHT("Knight", true), FORTIFICATION("Fortification", true),
|
||||||
WARG_RIDER("Warg-rider", true);
|
WARG_RIDER("Warg-rider", true), BESIEGER("Besieger", true);
|
||||||
|
|
||||||
private String _humanReadable;
|
private String _humanReadable;
|
||||||
private boolean _infoDisplayable;
|
private boolean _infoDisplayable;
|
||||||
|
|||||||
Reference in New Issue
Block a user