"Shadowfax"

This commit is contained in:
marcins78@gmail.com
2011-10-07 14:51:31 +00:00
parent 865fcb45e7
commit 57d8293439
6 changed files with 122 additions and 28 deletions

View File

@@ -36,7 +36,7 @@ public abstract class AbstractAttachable extends AbstractLotroCardBlueprint {
return false;
}
protected Filter getFullValidTargetFilter(String playerId, final LotroGame game, PhysicalCard self) {
protected Filter getFullValidTargetFilter(String playerId, final LotroGame game, final PhysicalCard self) {
return Filters.and(getValidTargetFilter(playerId, game, self),
new Filter() {
@Override
@@ -57,6 +57,16 @@ public abstract class AbstractAttachable extends AbstractLotroCardBlueprint {
});
}
private Filter getFullAttachValidTargetFilter(String playerId, final LotroGame game, final PhysicalCard self) {
return Filters.and(getFullValidTargetFilter(playerId, game, self),
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return modifiersQuerying.canHavePlayedOn(gameState, self, physicalCard);
}
});
}
protected abstract Filter getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self);
@Override
@@ -67,7 +77,7 @@ public abstract class AbstractAttachable extends AbstractLotroCardBlueprint {
public boolean checkPlayRequirements(String playerId, LotroGame game, PhysicalCard self, Filter additionalAttachmentFilter, int twilightModifier) {
return (self.getBlueprint().getSide() != Side.SHADOW || PlayConditions.canPayForShadowCard(game, self, twilightModifier))
&& PlayConditions.checkUniqueness(game.getGameState(), game.getModifiersQuerying(), self)
&& Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), getFullValidTargetFilter(playerId, game, self), additionalAttachmentFilter);
&& Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), getFullAttachValidTargetFilter(playerId, game, self), additionalAttachmentFilter);
}
@Override
@@ -93,7 +103,7 @@ public abstract class AbstractAttachable extends AbstractLotroCardBlueprint {
}
public AttachPermanentAction getPlayCardAction(String playerId, LotroGame game, PhysicalCard self, Filter additionalAttachmentFilter, int twilightModifier) {
return new AttachPermanentAction(game, self, Filters.and(getFullValidTargetFilter(playerId, game, self), additionalAttachmentFilter), getAttachCostModifiers(playerId, game, self), twilightModifier);
return new AttachPermanentAction(game, self, Filters.and(getFullAttachValidTargetFilter(playerId, game, self), additionalAttachmentFilter), getAttachCostModifiers(playerId, game, self), twilightModifier);
}
protected List<? extends Action> getExtraPhaseActions(String playerId, LotroGame game, PhysicalCard self) {

View File

@@ -11,6 +11,7 @@ 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.modifiers.Modifier;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
import com.gempukku.lotro.logic.timing.Action;
import java.util.LinkedList;
@@ -34,7 +35,7 @@ public abstract class AbstractAttachableFPPossession extends AbstractAttachable
_vitality = vitality;
}
private void appendTransferPossessionAction(List<Action> actions, LotroGame game, PhysicalCard self, Filter validTargetFilter) {
private void appendTransferPossessionAction(List<Action> actions, LotroGame game, final PhysicalCard self, Filter validTargetFilter) {
GameState gameState = game.getGameState();
if (Filters.canSpot(gameState, game.getModifiersQuerying(), validTargetFilter)
&& gameState.getCurrentPhase() == Phase.FELLOWSHIP
@@ -60,6 +61,14 @@ public abstract class AbstractAttachableFPPossession extends AbstractAttachable
);
}
validTransferFilter = Filters.and(validTransferFilter,
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return modifiersQuerying.canHaveTransferredOn(gameState, self, physicalCard);
}
});
if (Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), validTransferFilter))
actions.add(new TransferPermanentAction(self, game, validTransferFilter));
}

View File

@@ -5,14 +5,12 @@ import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Zone;
import com.gempukku.lotro.filters.Filter;
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.GameUtils;
import com.gempukku.lotro.logic.actions.AbstractCostToEffectAction;
import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect;
import com.gempukku.lotro.logic.effects.PlayCardEffect;
import com.gempukku.lotro.logic.effects.SendMessageEffect;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
import com.gempukku.lotro.logic.timing.Effect;
import java.util.Iterator;
@@ -46,13 +44,7 @@ public class AttachPermanentAction extends AbstractCostToEffectAction {
_removeCardEffect = new RemoveCardFromZoneEffect(card);
_chooseTargetEffect =
new ChooseActiveCardEffect(null, card.getOwner(), "Attach " + card.getBlueprint().getName() + ". Choose target to attach to", filter,
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return modifiersQuerying.canHavePlayedOn(gameState, card, physicalCard);
}
}) {
new ChooseActiveCardEffect(null, card.getOwner(), "Attach " + card.getBlueprint().getName() + ". Choose target to attach to", filter) {
@Override
protected void cardSelected(PhysicalCard target) {
_putCardIntoPlayEffect = new AttachCardEffect(_source, target);

View File

@@ -4,11 +4,9 @@ import com.gempukku.lotro.cards.effects.PayTwilightCostEffect;
import com.gempukku.lotro.cards.effects.TransferPermanentEffect;
import com.gempukku.lotro.filters.Filter;
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.ActivateCardAction;
import com.gempukku.lotro.logic.effects.ChooseActiveCardsEffect;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
import java.util.Collection;
@@ -18,13 +16,7 @@ public class TransferPermanentAction extends ActivateCardAction {
appendCost(new PayTwilightCostEffect(card));
appendEffect(
new ChooseActiveCardsEffect(null, card.getOwner(), "Choose target to attach to", 1, 1, filter,
new Filter() {
@Override
public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return modifiersQuerying.canHaveTransferredOn(gameState, card, physicalCard);
}
}) {
new ChooseActiveCardsEffect(null, card.getOwner(), "Choose target to attach to", 1, 1, filter) {
@Override
protected void cardsSelected(LotroGame game, Collection<PhysicalCard> target) {
if (target.size() > 0) {

View File

@@ -1,11 +1,13 @@
package com.gempukku.lotro.cards.effects;
import com.gempukku.lotro.cards.PlayConditions;
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.timing.UnrespondableEffect;
import com.gempukku.lotro.logic.timing.AbstractEffect;
import com.gempukku.lotro.logic.timing.EffectResult;
public class AttachCardEffect extends UnrespondableEffect {
public class AttachCardEffect extends AbstractEffect {
private PhysicalCard _physicalCard;
private PhysicalCard _targetCard;
@@ -15,9 +17,29 @@ public class AttachCardEffect extends UnrespondableEffect {
}
@Override
public void doPlayEffect(LotroGame game) {
GameState gameState = game.getGameState();
gameState.attachCard(_physicalCard, _targetCard);
gameState.startAffecting(_physicalCard, game.getModifiersEnvironment());
public boolean isPlayableInFull(LotroGame game) {
return !PlayConditions.nonPlayZone(_targetCard.getZone())
&& game.getModifiersQuerying().canHavePlayedOn(game.getGameState(), _physicalCard, _targetCard);
}
@Override
public String getText(LotroGame game) {
return null;
}
@Override
public EffectResult.Type getType() {
return null;
}
@Override
protected FullEffectResult playEffectReturningResult(LotroGame game) {
if (isPlayableInFull(game)) {
GameState gameState = game.getGameState();
gameState.attachCard(_physicalCard, _targetCard);
gameState.startAffecting(_physicalCard, game.getModifiersEnvironment());
return new FullEffectResult(null, true, true);
}
return new FullEffectResult(null, false, false);
}
}

View File

@@ -0,0 +1,69 @@
package com.gempukku.lotro.cards.set4.gandalf;
import com.gempukku.lotro.cards.AbstractAttachableFPPossession;
import com.gempukku.lotro.cards.PlayConditions;
import com.gempukku.lotro.cards.effects.ExertCharactersEffect;
import com.gempukku.lotro.cards.modifiers.MayNotBearModifier;
import com.gempukku.lotro.common.Culture;
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.LotroGame;
import com.gempukku.lotro.game.state.Skirmish;
import com.gempukku.lotro.logic.actions.RequiredTriggerAction;
import com.gempukku.lotro.logic.effects.DiscardCardsFromPlayEffect;
import com.gempukku.lotro.logic.modifiers.Modifier;
import com.gempukku.lotro.logic.timing.EffectResult;
import java.util.Collections;
import java.util.List;
/**
* Set: The Two Towers
* Side: Free
* Culture: Gandalf
* Twilight Cost: 2
* Type: Possession • Mount
* Strength: +2
* Game Text: Bearer must be Gandalf. Discard any hand weapon he bears. Gandalf may not bear a hand weapon.
* At the start of each skirmish involving Gandalf, each minion skirmishing him must exert.
*/
public class Card4_100 extends AbstractAttachableFPPossession {
public Card4_100() {
super(2, 2, 0, Culture.GANDALF, Keyword.MOUNT, "Shadowfax", true);
}
@Override
protected Filter getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) {
return Filters.name("Gandalf");
}
@Override
protected List<? extends Modifier> getNonBasicStatsModifiers(PhysicalCard self) {
return Collections.singletonList(
new MayNotBearModifier(self, Filters.hasAttached(self), Filters.keyword(Keyword.HAND_WEAPON)));
}
@Override
public List<RequiredTriggerAction> getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (PlayConditions.played(game.getGameState(), game.getModifiersQuerying(), effectResult, Filters.sameCard(self))) {
RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(
new DiscardCardsFromPlayEffect(self, Filters.and(Filters.attachedTo(Filters.hasAttached(self)), Filters.keyword(Keyword.HAND_WEAPON))));
return Collections.singletonList(action);
}
if (effectResult.getType() == EffectResult.Type.START_OF_PHASE
&& game.getGameState().getCurrentPhase() == Phase.SKIRMISH) {
final Skirmish skirmish = game.getGameState().getSkirmish();
if (skirmish != null && skirmish.getFellowshipCharacter() != null && skirmish.getFellowshipCharacter().getBlueprint().getName().equals("Gandalf")) {
RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(
new ExertCharactersEffect(self, Filters.inSkirmishAgainst(Filters.name("Gandalf"))));
return Collections.singletonList(action);
}
}
return null;
}
}