Splitting the discard from play effect result for each card.

This commit is contained in:
marcins78@gmail.com
2011-11-28 18:17:06 +00:00
parent 982a78be5d
commit c845ab95bf
12 changed files with 58 additions and 47 deletions

View File

@@ -136,6 +136,12 @@ public class TriggerConditions {
return false;
}
public static boolean forEachDiscardedFromPlay(LotroGame game, EffectResult effectResult, Filterable... filters) {
if (effectResult.getType() == EffectResult.Type.FOR_EACH_DISCARDED_FROM_PLAY)
return Filters.and(filters).accepts(game.getGameState(), game.getModifiersQuerying(), ((DiscardCardsFromPlayResult) effectResult).getDiscardedCard());
return false;
}
public static boolean forEachWounded(LotroGame game, EffectResult effectResult, Filterable... filters) {
if (effectResult.getType() == EffectResult.Type.FOR_EACH_WOUNDED)
return Filters.and(filters).accepts(game.getGameState(), game.getModifiersQuerying(), ((WoundResult) effectResult).getWoundedCard());

View File

@@ -69,8 +69,9 @@ public class LiberateASiteEffect extends AbstractEffect {
game.getGameState().loseControlOfCard(siteToLiberate, Zone.ADVENTURE_PATH);
if (discardedCards.size() > 0)
game.getActionsEnvironment().emitEffectResult(new DiscardCardsFromPlayResult(discardedCards));
for (PhysicalCard discardedCard : discardedCards)
game.getActionsEnvironment().emitEffectResult(new DiscardCardsFromPlayResult(discardedCard));
return new FullEffectResult(true, true);
}
return new FullEffectResult(false, false);

View File

@@ -77,8 +77,10 @@ public class ReturnCardsToHandEffect extends AbstractEffect {
if (_source != null && cardsToReturnToHand.size() > 0)
game.getGameState().sendMessage(GameUtils.getCardLink(_source) + " returns " + getAppendedNames(cardsToReturnToHand) + " to hand");
if (discardedFromPlay.size() > 0)
game.getActionsEnvironment().emitEffectResult(new DiscardCardsFromPlayResult(discardedFromPlay));
for (PhysicalCard discardedCard : discardedFromPlay)
game.getActionsEnvironment().emitEffectResult(new DiscardCardsFromPlayResult(discardedCard));
return new FullEffectResult(true, true);
}

View File

@@ -66,8 +66,9 @@ public class StackCardFromPlayEffect extends AbstractEffect {
game.getGameState().stackCard(game, _card, _stackOn);
// Send the result (attached cards get discarded)
if (discardedCards.size() > 0)
game.getActionsEnvironment().emitEffectResult(new DiscardCardsFromPlayResult(discardedCards));
for (PhysicalCard discardedCard : discardedCards)
game.getActionsEnvironment().emitEffectResult(new DiscardCardsFromPlayResult(discardedCard));
return new FullEffectResult(true, true);
}
return new FullEffectResult(false, false);

View File

@@ -1,6 +1,7 @@
package com.gempukku.lotro.cards.set1.moria;
import com.gempukku.lotro.cards.AbstractPermanent;
import com.gempukku.lotro.cards.TriggerConditions;
import com.gempukku.lotro.cards.effects.choose.ChooseAndPlayCardFromDiscardEffect;
import com.gempukku.lotro.common.CardType;
import com.gempukku.lotro.common.Culture;
@@ -9,11 +10,11 @@ import com.gempukku.lotro.common.Zone;
import com.gempukku.lotro.filters.Filters;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.GameUtils;
import com.gempukku.lotro.logic.actions.ActivateCardAction;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.results.DiscardCardsFromPlayResult;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -33,20 +34,19 @@ public class Card1_193 extends AbstractPermanent {
@Override
public List<? extends ActivateCardAction> getOptionalInPlayAfterActions(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (effectResult.getType() == EffectResult.Type.DISCARD_FROM_PLAY) {
if (TriggerConditions.forEachDiscardedFromPlay(game, effectResult, Culture.MORIA, Filters.weapon, Zone.DISCARD, Filters.playable(game, -1))) {
DiscardCardsFromPlayResult discardResult = (DiscardCardsFromPlayResult) effectResult;
Collection<PhysicalCard> discardedCards = discardResult.getDiscardedCards();
if (Filters.filter(discardedCards, game.getGameState(), game.getModifiersQuerying(), Zone.DISCARD, Culture.MORIA, Filters.weapon, Filters.playable(game, -1)).size() > 0) {
ActivateCardAction action = new ActivateCardAction(self);
action.appendEffect(
new ChooseAndPlayCardFromDiscardEffect(playerId,
game,
-1, Filters.and(
Culture.MORIA,
Filters.weapon,
Filters.in(discardedCards))));
return Collections.singletonList(action);
}
final PhysicalCard discardedCard = discardResult.getDiscardedCard();
ActivateCardAction action = new ActivateCardAction(self);
action.setText("Play " + GameUtils.getCardLink(discardedCard));
action.appendEffect(
new ChooseAndPlayCardFromDiscardEffect(playerId,
game,
-1, Filters.and(
Culture.MORIA,
Filters.weapon,
discardedCard)));
return Collections.singletonList(action);
}
return null;
}

View File

@@ -32,7 +32,7 @@ public class Card3_111 extends AbstractAlly {
@Override
public List<OptionalTriggerAction> getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, PhysicalCard self) {
if (effectResult.getType() == EffectResult.Type.DISCARD_FROM_HAND) {
if (effectResult.getType() == EffectResult.Type.FOR_EACH_DISCARDED_FROM_HAND) {
DiscardCardFromHandResult discardCardsResult = (DiscardCardFromHandResult) effectResult;
if (discardCardsResult.isForced()) {
OptionalTriggerAction action = new OptionalTriggerAction(self);

View File

@@ -86,6 +86,8 @@ public class DiscardCardsFromPlayEffect extends AbstractPreventableCardEffect {
if (_source != null && discardedCards.size() > 0)
game.getGameState().sendMessage(_source.getOwner() + " discards " + getAppendedNames(discardedCards) + " from play using " + GameUtils.getCardLink(_source));
game.getActionsEnvironment().emitEffectResult(new DiscardCardsFromPlayResult(discardedCards));
for (PhysicalCard discardedCard : discardedCards)
game.getActionsEnvironment().emitEffectResult(new DiscardCardsFromPlayResult(discardedCard));
}
}

View File

@@ -108,13 +108,17 @@ public class KillEffect extends AbstractSuccessfulEffect {
game.getActionsEnvironment().emitEffectResult(new KilledResult(killedCards, _cause));
for (PhysicalCard killedCard : killedCards)
game.getActionsEnvironment().emitEffectResult(new ForEachKilledResult(killedCard, _cause));
game.getActionsEnvironment().emitEffectResult(new DiscardCardsFromPlayResult(discardedCards));
for (PhysicalCard discardedCard : discardedCards)
game.getActionsEnvironment().emitEffectResult(new DiscardCardsFromPlayResult(discardedCard));
} else if (killedCards.size() > 0) {
game.getActionsEnvironment().emitEffectResult(new KilledResult(killedCards, _cause));
for (PhysicalCard killedCard : killedCards)
game.getActionsEnvironment().emitEffectResult(new ForEachKilledResult(killedCard, _cause));
} else if (discardedCards.size() > 0) {
game.getActionsEnvironment().emitEffectResult(new DiscardCardsFromPlayResult(discardedCards));
for (PhysicalCard discardedCard : discardedCards)
game.getActionsEnvironment().emitEffectResult(new DiscardCardsFromPlayResult(discardedCard));
}
}
}

View File

@@ -4,13 +4,15 @@ public abstract class EffectResult {
public enum Type {
// Translated to new format
ANY_NUMBER_KILLED, FOR_EACH_KILLED,
FOR_EACH_WOUNDED, FOR_EACH_EXERTED,
FOR_EACH_WOUNDED, FOR_EACH_EXERTED, FOR_EACH_DISCARDED_FROM_PLAY,
// Old format
DISCARD_FROM_PLAY, DISCARD_FROM_HAND,
FOR_EACH_DISCARDED_FROM_HAND,
FREE_PEOPLE_PLAYER_STARTS_ASSIGNING,
// Old format
ASSIGNMENT, OVERWHELM_IN_SKIRMISH, RESOLVE_SKIRMISH,
START_OF_PHASE,

View File

@@ -9,7 +9,7 @@ public class DiscardCardFromHandResult extends EffectResult {
private boolean _forced;
public DiscardCardFromHandResult(PhysicalCard source, PhysicalCard card, boolean forced) {
super(Type.DISCARD_FROM_HAND);
super(Type.FOR_EACH_DISCARDED_FROM_HAND);
_source = source;
_card = card;
_forced = forced;

View File

@@ -3,17 +3,15 @@ package com.gempukku.lotro.logic.timing.results;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.logic.timing.EffectResult;
import java.util.Set;
public class DiscardCardsFromPlayResult extends EffectResult {
private Set<PhysicalCard> _cards;
private PhysicalCard _card;
public DiscardCardsFromPlayResult(Set<PhysicalCard> cards) {
super(EffectResult.Type.DISCARD_FROM_PLAY);
_cards = cards;
public DiscardCardsFromPlayResult(PhysicalCard card) {
super(EffectResult.Type.FOR_EACH_DISCARDED_FROM_PLAY);
_card = card;
}
public Set<PhysicalCard> getDiscardedCards() {
return _cards;
public PhysicalCard getDiscardedCard() {
return _card;
}
}

View File

@@ -8,8 +8,7 @@ import com.gempukku.lotro.logic.actions.RequiredTriggerAction;
import com.gempukku.lotro.logic.timing.EffectResult;
import com.gempukku.lotro.logic.timing.results.DiscardCardsFromPlayResult;
import java.util.Collection;
import java.util.LinkedList;
import java.util.Collections;
import java.util.List;
public class DiscardedCardRule {
@@ -24,16 +23,12 @@ public class DiscardedCardRule {
new AbstractActionProxy() {
@Override
public List<? extends RequiredTriggerAction> getRequiredAfterTriggers(LotroGame game, EffectResult effectResult) {
if (effectResult.getType() == EffectResult.Type.DISCARD_FROM_PLAY) {
if (effectResult.getType() == EffectResult.Type.FOR_EACH_DISCARDED_FROM_PLAY) {
DiscardCardsFromPlayResult discardResult = (DiscardCardsFromPlayResult) effectResult;
Collection<PhysicalCard> discardedCards = discardResult.getDiscardedCards();
List<RequiredTriggerAction> actions = new LinkedList<RequiredTriggerAction>();
for (PhysicalCard discardedCard : discardedCards) {
RequiredTriggerAction trigger = discardedCard.getBlueprint().getDiscardedFromPlayRequiredTrigger(game, discardedCard);
if (trigger != null)
actions.add(trigger);
}
return actions;
final PhysicalCard discardedCard = discardResult.getDiscardedCard();
RequiredTriggerAction trigger = discardedCard.getBlueprint().getDiscardedFromPlayRequiredTrigger(game, discardedCard);
if (trigger != null)
return Collections.singletonList(trigger);
}
return null;
}