"A Dark Shape Sprang"

This commit is contained in:
marcins78@gmail.com
2011-11-16 12:52:03 +00:00
parent aee6c58848
commit 060363b01a
5 changed files with 142 additions and 11 deletions

View File

@@ -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)

View File

@@ -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);
}
}

View File

@@ -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());
}

View File

@@ -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);
}

View File

@@ -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;