"Tol Brandir"

This commit is contained in:
marcins78@gmail.com
2011-09-01 01:33:44 +00:00
parent b6e54f1e03
commit 9a64fb17fc
3 changed files with 109 additions and 3 deletions

View File

@@ -0,0 +1,98 @@
package com.gempukku.lotro.cards.set1.site;
import com.gempukku.lotro.cards.AbstractSite;
import com.gempukku.lotro.cards.PlayConditions;
import com.gempukku.lotro.cards.effects.AddUntilEndOfPhaseModifierEffect;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Phase;
import com.gempukku.lotro.filters.Filter;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.GameState;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.actions.CostToEffectAction;
import com.gempukku.lotro.logic.effects.ChooseArbitraryCardsEffect;
import com.gempukku.lotro.logic.modifiers.AbstractModifier;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
import com.gempukku.lotro.logic.timing.Action;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* Set: The Fellowship of the Ring
* Twilight Cost: 9
* Type: Site
* Site: 9
* Game Text: River. Shadow: Play up to 3 trackers from your discard pile; end your Shadow phase.
*/
public class Card1_363 extends AbstractSite {
public Card1_363() {
super("Tol Brandir", 9, 9, Direction.LEFT);
addKeyword(Keyword.RIVER);
}
@Override
public List<? extends Action> getPlayablePhaseActions(final String playerId, final LotroGame game, PhysicalCard self) {
if (PlayConditions.canUseSiteDuringPhase(game.getGameState(), Phase.SHADOW, self)) {
final CostToEffectAction action = new CostToEffectAction(self, Keyword.SHADOW, "Play up to 3 trackers from your discard pile; end your Shadow phase.");
action.addEffect(
new ChooseTrackerToPlay(action, game, 1, playerId, "Choose tracker to play",
new LinkedList<PhysicalCard>(game.getGameState().getDiscard(playerId)),
Filters.and(
Filters.keyword(Keyword.TRACKER),
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
List<? extends Action> playableActions = physicalCard.getBlueprint().getPlayablePhaseActions(playerId, game, physicalCard);
return (playableActions != null && playableActions.size() > 0);
}
}), 0, 1));
return Collections.singletonList(action);
}
return null;
}
private class ChooseTrackerToPlay extends ChooseArbitraryCardsEffect {
private CostToEffectAction _action;
private LotroGame _game;
private int _count;
private String _playerId;
private String _choiceText;
private Filter _filter;
private ChooseTrackerToPlay(CostToEffectAction action, LotroGame game, int count, String playerId, String choiceText, List<PhysicalCard> cards, Filter filter, int minimum, int maximum) {
super(playerId, choiceText, cards, filter, minimum, maximum);
_action = action;
_game = game;
_count = count;
_playerId = playerId;
_choiceText = choiceText;
_filter = filter;
}
@Override
protected void cardsSelected(List<PhysicalCard> selectedCards) {
if (selectedCards.size() > 0) {
PhysicalCard selectedCard = selectedCards.get(0);
_game.getActionsEnvironment().addActionToStack(selectedCard.getBlueprint().getPlayablePhaseActions(_playerId, _game, selectedCard).get(0));
LinkedList<PhysicalCard> remainingCards = new LinkedList<PhysicalCard>(_game.getGameState().getDiscard(_playerId));
remainingCards.remove(selectedCard);
if (_count < 3)
_action.addEffect(new ChooseTrackerToPlay(_action, _game, _count + 1, _playerId, _choiceText, remainingCards, _filter, 0, 1));
else
_action.addEffect(
new AddUntilEndOfPhaseModifierEffect(
new AbstractModifier(null, "End Shadow Phase", null) {
@Override
public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result) {
return false;
}
}, Phase.SHADOW
));
}
}
}
}

View File

@@ -16,7 +16,7 @@ public enum Keyword {
RIVER("River"), PLAINS("Plains"), UNDERGROUND("Underground"), SANCTUARY("Sanctuary"), FOREST("Forest"), MARSH("Marsh"), MOUNTAIN("Mountain"),
DAMAGE("Damage"), DEFENDER("Defender"), FIERCE("Fierce"), ARCHER("Archer"), RANGER("Ranger"),
DAMAGE("Damage"), DEFENDER("Defender"), FIERCE("Fierce"), ARCHER("Archer"), RANGER("Ranger"), TRACKER("Tracker"),
HAND_WEAPON("Hand Weapon"), ARMOR("Armor"), HELM("Helm"), MOUNT("Mount"), RANGED_WEAPON("Ranged Weapon"), CLOAK("Cloak");

View File

@@ -1,5 +1,7 @@
package com.gempukku.lotro.logic.effects;
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;
@@ -12,26 +14,32 @@ public abstract class ChooseArbitraryCardsEffect extends UnrespondableEffect {
private String _playerId;
private String _choiceText;
private List<PhysicalCard> _cards;
private Filter _filter;
private int _minimum;
private int _maximum;
public ChooseArbitraryCardsEffect(String playerId, String choiceText, List<PhysicalCard> cards, int minimum, int maximum) {
this(playerId, choiceText, cards, Filters.any(), minimum, maximum);
}
public ChooseArbitraryCardsEffect(String playerId, String choiceText, List<PhysicalCard> cards, Filter filter, int minimum, int maximum) {
_playerId = playerId;
_choiceText = choiceText;
_cards = cards;
_filter = filter;
_minimum = minimum;
_maximum = maximum;
}
@Override
public boolean canPlayEffect(LotroGame game) {
return (_cards.size() >= _minimum);
return (Filters.filter(_cards, game.getGameState(), game.getModifiersQuerying(), _filter).size() >= _minimum);
}
@Override
public void playEffect(LotroGame game) {
game.getUserFeedback().sendAwaitingDecision(_playerId,
new ArbitraryCardsSelectionDecision(1, _choiceText, _cards, _minimum, _maximum) {
new ArbitraryCardsSelectionDecision(1, _choiceText, Filters.filter(_cards, game.getGameState(), game.getModifiersQuerying(), _filter), _minimum, _maximum) {
@Override
public void decisionMade(String result) throws DecisionResultInvalidException {
cardsSelected(getSelectedCardsByResponse(result));