diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/choose/ChooseAndPlayCardFromDiscardEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/choose/ChooseAndPlayCardFromDiscardEffect.java index 98639174d..53fed64c8 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/choose/ChooseAndPlayCardFromDiscardEffect.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/choose/ChooseAndPlayCardFromDiscardEffect.java @@ -6,11 +6,12 @@ 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.actions.CostToEffectAction; 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 com.gempukku.lotro.logic.timing.UnrespondableEffect; import java.util.Collection; import java.util.LinkedList; @@ -20,7 +21,7 @@ public class ChooseAndPlayCardFromDiscardEffect implements Effect { private String _playerId; private Filter _filter; private int _twilightModifier; - private Action _playCardAction; + private CostToEffectAction _playCardAction; public ChooseAndPlayCardFromDiscardEffect(String playerId, List cardsInDiscardAtStart, Filterable... filter) { this(playerId, cardsInDiscardAtStart, 0, filter); @@ -62,8 +63,15 @@ public class ChooseAndPlayCardFromDiscardEffect implements Effect { public void decisionMade(String result) throws DecisionResultInvalidException { List selectedCards = getSelectedCardsByResponse(result); if (selectedCards.size() > 0) { - PhysicalCard selectedCard = selectedCards.get(0); + final PhysicalCard selectedCard = selectedCards.get(0); _playCardAction = selectedCard.getBlueprint().getPlayCardAction(_playerId, game, selectedCard, _twilightModifier, false); + _playCardAction.appendEffect( + new UnrespondableEffect() { + @Override + protected void doPlayEffect(LotroGame game) { + afterCardPlayed(selectedCard); + } + }); game.getActionsEnvironment().addActionToStack(_playCardAction); } } @@ -72,6 +80,9 @@ public class ChooseAndPlayCardFromDiscardEffect implements Effect { return null; } + protected void afterCardPlayed(PhysicalCard cardPlayed) { + } + @Override public boolean wasSuccessful() { if (_playCardAction == null) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set10/gollum/Card10_019.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set10/gollum/Card10_019.java new file mode 100644 index 000000000..3dbdd9dbf --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set10/gollum/Card10_019.java @@ -0,0 +1,104 @@ +package com.gempukku.lotro.cards.set10.gollum; + +import com.gempukku.lotro.cards.AbstractResponseEvent; +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.choose.ChooseAndPlayCardFromDiscardEffect; +import com.gempukku.lotro.cards.effects.choose.ChooseAndPlayCardFromHandEffect; +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Phase; +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.game.state.Skirmish; +import com.gempukku.lotro.logic.timing.Effect; +import com.gempukku.lotro.logic.timing.EffectResult; +import com.gempukku.lotro.logic.timing.UnrespondableEffect; +import com.gempukku.lotro.logic.timing.actions.SkirmishPhaseAction; +import com.gempukku.lotro.logic.timing.results.PlayCardResult; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +/** + * Set: Mount Doom + * Side: Shadow + * Culture: Gollum + * Twilight Cost: 0 + * Type: Event • Response + * Game Text: If an opponent plays a possession on a companion, play Gollum at twilight cost -2 from your discard pile + * or hand to suspend the current phase. Begin a skirmish phase involving Gollum and that companion. When it ends, + * resume the suspended phase. + */ +public class Card10_019 extends AbstractResponseEvent { + public Card10_019() { + super(Side.SHADOW, 0, Culture.GOLLUM, "A Dark Shape Sprang"); + } + + @Override + public List getOptionalAfterActions(String playerId, final LotroGame game, EffectResult effectResult, PhysicalCard self) { + if (PlayConditions.played(game, effectResult, CardType.POSSESSION) + && (PlayConditions.canPlayFromDiscard(playerId, game, -2, Filters.gollum) || PlayConditions.canPlayFromHand(playerId, game, -2, Filters.gollum))) { + PlayCardResult playResult = (PlayCardResult) effectResult; + if (playResult.getPlayedCard().getOwner().equals(game.getGameState().getCurrentPlayerId())) { + final PhysicalCard playedOn = playResult.getAttachedTo(); + if (playedOn != null && playedOn.getBlueprint().getCardType() == CardType.COMPANION) { + PlayEventAction action = new PlayEventAction(self); + List possibleEffects = new LinkedList(); + possibleEffects.add( + new ChooseAndPlayCardFromDiscardEffect(playerId, game.getGameState().getDiscard(playerId), -2, Filters.gollum) { + @Override + protected void afterCardPlayed(PhysicalCard cardPlayed) { + gollumPlayed(game, playedOn, cardPlayed); + } + }); + possibleEffects.add( + new ChooseAndPlayCardFromHandEffect(playerId, game.getGameState().getHand(playerId), -2, Filters.gollum) { + @Override + protected void afterCardPlayed(PhysicalCard cardPlayed) { + gollumPlayed(game, playedOn, cardPlayed); + } + }); + action.appendEffect( + new ChoiceEffect(action, playerId, possibleEffects)); + return Collections.singletonList(action); + } + } + } + return null; + } + + private void gollumPlayed(LotroGame game, PhysicalCard character, PhysicalCard gollum) { + final Phase currentPhase = game.getGameState().getCurrentPhase(); + final Skirmish skirmish = game.getGameState().getSkirmish(); + if (skirmish != null) + game.getGameState().finishSkirmish(); + + final SkirmishPhaseAction skirmishPhaseAction = new SkirmishPhaseAction(character, Collections.singletonList(gollum)); + // We might have to restart the skirmish, if the possession was played during it + if (skirmish != null) { + skirmishPhaseAction.appendEffect( + new UnrespondableEffect() { + @Override + protected void doPlayEffect(LotroGame game) { + game.getGameState().restartSkirmish(skirmish); + } + }); + } + // We have to reset the phase, to whatever it was before + skirmishPhaseAction.appendEffect( + new UnrespondableEffect() { + @Override + protected void doPlayEffect(LotroGame game) { + game.getGameState().setCurrentPhase(currentPhase); + } + }); + + game.getActionsEnvironment().addActionToStack( + skirmishPhaseAction); + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java index 3c77fe1b1..8d893a8d2 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java @@ -857,10 +857,14 @@ public class GameState { return null; } - public void startSkirmish(PhysicalCard fp) { - Assignment assignment = findAssignment(fp); - removeAssignment(assignment); - _skirmish = new Skirmish(assignment.getFellowshipCharacter(), assignment.getShadowCharacters()); + public void startSkirmish(PhysicalCard fellowshipCharacter, List shadowCharacters) { + _skirmish = new Skirmish(fellowshipCharacter, shadowCharacters); + for (GameStateListener listener : getAllGameStateListeners()) + listener.startSkirmish(_skirmish.getFellowshipCharacter(), _skirmish.getShadowCharacters()); + } + + public void restartSkirmish(Skirmish skirmish) { + _skirmish = skirmish; for (GameStateListener listener : getAllGameStateListeners()) listener.startSkirmish(_skirmish.getFellowshipCharacter(), _skirmish.getShadowCharacters()); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/SkirmishPhaseAction.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/SkirmishPhaseAction.java index 7316c3ee8..199462820 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/SkirmishPhaseAction.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/actions/SkirmishPhaseAction.java @@ -14,13 +14,15 @@ import com.gempukku.lotro.logic.timing.results.EndOfPhaseResult; import com.gempukku.lotro.logic.timing.results.SkirmishAboutToEndResult; import com.gempukku.lotro.logic.timing.results.StartOfPhaseResult; +import java.util.List; + public class SkirmishPhaseAction extends SystemQueueAction { - public SkirmishPhaseAction(final PhysicalCard character) { + public SkirmishPhaseAction(final PhysicalCard fellowshipCharacter, final List shadowCharacters) { appendEffect( new UnrespondableEffect() { @Override protected void doPlayEffect(LotroGame game) { - game.getGameState().startSkirmish(character); + game.getGameState().startSkirmish(fellowshipCharacter, shadowCharacters); ((ModifiersLogic) game.getModifiersEnvironment()).removeStartOfPhase(Phase.SKIRMISH); ((DefaultActionsEnvironment) game.getActionsEnvironment()).removeStartOfPhaseActionProxies(Phase.SKIRMISH); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/skirmish/PlayoutSkirmishesGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/skirmish/PlayoutSkirmishesGameProcess.java index b20393d60..5dbab7f82 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/skirmish/PlayoutSkirmishesGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/skirmish/PlayoutSkirmishesGameProcess.java @@ -33,7 +33,7 @@ public class PlayoutSkirmishesGameProcess implements GameProcess { _nextProcess = _followingGameProcess; } else { final GameState gameState = _game.getGameState(); - List assignments = gameState.getAssignments(); + final List assignments = gameState.getAssignments(); if (assignments.size() > 0) { Set fps = new HashSet(); @@ -49,8 +49,10 @@ public class PlayoutSkirmishesGameProcess implements GameProcess { ChooseActiveCardEffect chooseNextSkirmish = new ChooseActiveCardEffect(null, playerChoosingSkirmishOrder, "Choose next skirmish to resolve", Filters.in(fps)) { @Override protected void cardSelected(LotroGame game, PhysicalCard card) { + final Assignment assignment = findAssignment(assignments, card); + game.getGameState().removeAssignment(assignment); game.getActionsEnvironment().addActionToStack( - new SkirmishPhaseAction(card)); + new SkirmishPhaseAction(assignment.getFellowshipCharacter(), assignment.getShadowCharacters())); } }; chooseNextSkirmish.setUseShortcut(false); @@ -65,6 +67,14 @@ public class PlayoutSkirmishesGameProcess implements GameProcess { } } + private Assignment findAssignment(List assignments, PhysicalCard freePeopleCharacter) { + for (Assignment assignment : assignments) { + if (assignment.getFellowshipCharacter() == freePeopleCharacter) + return assignment; + } + return null; + } + @Override public GameProcess getNextProcess() { return _nextProcess;