"A Dark Shape Sprang"
This commit is contained in:
@@ -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<? extends PhysicalCard> 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<PhysicalCard> 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)
|
||||
|
||||
@@ -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<PlayEventAction> 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<Effect> possibleEffects = new LinkedList<Effect>();
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -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<PhysicalCard> 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());
|
||||
}
|
||||
|
||||
@@ -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<PhysicalCard> 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);
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ public class PlayoutSkirmishesGameProcess implements GameProcess {
|
||||
_nextProcess = _followingGameProcess;
|
||||
} else {
|
||||
final GameState gameState = _game.getGameState();
|
||||
List<Assignment> assignments = gameState.getAssignments();
|
||||
final List<Assignment> assignments = gameState.getAssignments();
|
||||
|
||||
if (assignments.size() > 0) {
|
||||
Set<PhysicalCard> fps = new HashSet<PhysicalCard>();
|
||||
@@ -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<Assignment> assignments, PhysicalCard freePeopleCharacter) {
|
||||
for (Assignment assignment : assignments) {
|
||||
if (assignment.getFellowshipCharacter() == freePeopleCharacter)
|
||||
return assignment;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameProcess getNextProcess() {
|
||||
return _nextProcess;
|
||||
|
||||
Reference in New Issue
Block a user