From d4e0907bfb2b7510c0c4bea39cdeddc9095b0f82 Mon Sep 17 00:00:00 2001 From: marcins78 Date: Fri, 9 Nov 2012 16:14:46 +0000 Subject: [PATCH] - "Return to Its Master" now creates an additional Skirmish Phase. --- .../AdditionalSkirmishPhaseEffect.java | 51 +++++++++++++++++++ .../lotro/cards/set1/wraith/Card1_224.java | 13 ++--- .../lotro/cards/set10/gollum/Card10_019.java | 43 +++------------- .../com/gempukku/lotro/filters/Filters.java | 17 +++++++ .../lotro/at/IndividualCardAtTest.java | 3 -- .../src/main/webapp/includes/changeLog.html | 3 ++ 6 files changed, 82 insertions(+), 48 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/AdditionalSkirmishPhaseEffect.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/AdditionalSkirmishPhaseEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/AdditionalSkirmishPhaseEffect.java new file mode 100644 index 000000000..69a605c66 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/AdditionalSkirmishPhaseEffect.java @@ -0,0 +1,51 @@ +package com.gempukku.lotro.cards.effects; + +import com.gempukku.lotro.common.Phase; +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.UnrespondableEffect; +import com.gempukku.lotro.logic.timing.actions.SkirmishPhaseAction; + +import java.util.Set; + +public class AdditionalSkirmishPhaseEffect extends UnrespondableEffect { + private PhysicalCard _fpCard; + private Set _shadowCards; + + public AdditionalSkirmishPhaseEffect(PhysicalCard fpCard, Set shadowCards) { + _fpCard = fpCard; + _shadowCards = shadowCards; + } + + @Override + protected void doPlayEffect(LotroGame game) { + final Phase currentPhase = game.getGameState().getCurrentPhase(); + final Skirmish skirmish = game.getGameState().getSkirmish(); + final boolean fierce = game.getGameState().isFierceSkirmishes(); + final boolean extra = game.getGameState().isExtraSkirmishes(); + + if (skirmish != null) + game.getGameState().finishSkirmish(); + + final SkirmishPhaseAction skirmishPhaseAction = new SkirmishPhaseAction(_fpCard, _shadowCards); + // We have to reset the phase, to whatever it was before + skirmishPhaseAction.appendEffect( + new UnrespondableEffect() { + @Override + protected void doPlayEffect(LotroGame game) { + // We might have to restart an existing skirmish + if (skirmish != null) + game.getGameState().restartSkirmish(skirmish); + game.getGameState().setCurrentPhase(currentPhase); + game.getGameState().setFierceSkirmishes(fierce); + game.getGameState().setExtraSkirmishes(extra); + } + }); + + game.getGameState().setFierceSkirmishes(false); + game.getGameState().setExtraSkirmishes(true); + game.getActionsEnvironment().addActionToStack( + skirmishPhaseAction); + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/wraith/Card1_224.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/wraith/Card1_224.java index 541a705e8..72020e22c 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/wraith/Card1_224.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/wraith/Card1_224.java @@ -5,7 +5,7 @@ import com.gempukku.lotro.cards.TriggerConditions; import com.gempukku.lotro.cards.actions.PlayEventAction; import com.gempukku.lotro.cards.effects.AddUntilEndOfPhaseModifierEffect; import com.gempukku.lotro.cards.effects.AddUntilStartOfPhaseActionProxyEffect; -import com.gempukku.lotro.cards.effects.choose.ChooseAndAssignMinionToCompanionEffect; +import com.gempukku.lotro.cards.effects.AdditionalSkirmishPhaseEffect; import com.gempukku.lotro.common.Culture; import com.gempukku.lotro.common.Phase; import com.gempukku.lotro.common.Race; @@ -53,17 +53,12 @@ public class Card1_224 extends AbstractResponseOldEvent { List assignments = new LinkedList(game.getGameState().getAssignments()); for (Assignment assignment : assignments) game.getGameState().removeAssignment(assignment); - game.getGameState().finishSkirmish(); - - PhysicalCard ringBearer = game.getGameState().getRingBearer(game.getGameState().getCurrentPlayerId()); + final PhysicalCard ringBearer = game.getGameState().getRingBearer(game.getGameState().getCurrentPlayerId()); action.appendEffect( - new ChooseActiveCardEffect(self, playerId, "Choose a Nazgul to skirmish the Ring-Bearer", Race.NAZGUL, Filters.assignableToSkirmishAgainst(Side.SHADOW, ringBearer)) { + new ChooseActiveCardEffect(self, playerId, "Choose a Nazgul to skirmish the Ring-Bearer", Race.NAZGUL, Filters.notPreventedByEffectToAssign(Side.SHADOW, ringBearer)) { @Override protected void cardSelected(LotroGame game, PhysicalCard nazgul) { - PhysicalCard ringBearer = game.getGameState().getRingBearer(game.getGameState().getCurrentPlayerId()); - action.appendEffect( - new ChooseAndAssignMinionToCompanionEffect(action, playerId, ringBearer, Race.NAZGUL)); action.appendEffect( new AddUntilStartOfPhaseActionProxyEffect( new AbstractActionProxy() { @@ -79,6 +74,8 @@ public class Card1_224 extends AbstractResponseOldEvent { return null; } }, Phase.SKIRMISH)); + action.appendEffect( + new AdditionalSkirmishPhaseEffect(ringBearer, Collections.singleton(nazgul))); } }); } 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 index 352d47c7b..cf4752d4d 100644 --- 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 @@ -4,21 +4,18 @@ import com.gempukku.lotro.cards.AbstractResponseEvent; import com.gempukku.lotro.cards.PlayConditions; import com.gempukku.lotro.cards.TriggerConditions; import com.gempukku.lotro.cards.actions.PlayEventAction; +import com.gempukku.lotro.cards.effects.AdditionalSkirmishPhaseEffect; 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; @@ -49,20 +46,22 @@ public class Card10_019 extends AbstractResponseEvent { 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); + final PlayEventAction action = new PlayEventAction(self); List possibleEffects = new LinkedList(); possibleEffects.add( new ChooseAndPlayCardFromDiscardEffect(playerId, game, -2, Filters.gollum) { @Override protected void afterCardPlayed(PhysicalCard cardPlayed) { - gollumPlayed(game, playedOn, cardPlayed); + action.appendEffect( + new AdditionalSkirmishPhaseEffect(playedOn, Collections.singleton(cardPlayed))); } }); possibleEffects.add( new ChooseAndPlayCardFromHandEffect(playerId, game, -2, Filters.gollum) { @Override protected void afterCardPlayed(PhysicalCard cardPlayed) { - gollumPlayed(game, playedOn, cardPlayed); + action.appendEffect( + new AdditionalSkirmishPhaseEffect(playedOn, Collections.singleton(cardPlayed))); } }); action.appendEffect( @@ -73,34 +72,4 @@ public class Card10_019 extends AbstractResponseEvent { } 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.singleton(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/filters/Filters.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java index d51b31a89..35e94a0c5 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/filters/Filters.java @@ -251,6 +251,23 @@ public class Filters { return assignableToSkirmishAgainst(assignedBySide, againstFilter, false, false); } + public static Filter notPreventedByEffectToAssign(final Side assignedBySide, final PhysicalCard againstCard) { + return new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + if (againstCard.getBlueprint().getSide() == Side.FREE_PEOPLE) { + Map> assignment = new HashMap>(); + assignment.put(againstCard, Collections.singleton(physicalCard)); + return modifiersQuerying.isValidAssignments(gameState, assignedBySide, assignment); + } else { + Map> assignment = new HashMap>(); + assignment.put(physicalCard, Collections.singleton(againstCard)); + return modifiersQuerying.isValidAssignments(gameState, assignedBySide, assignment); + } + } + }; + } + public static Filter assignableToSkirmishAgainst(final Side assignedBySide, final Filterable againstFilter, final boolean ignoreUnassigned, final boolean allowAllyToSkirmish) { return Filters.and( assignableToSkirmish(assignedBySide, ignoreUnassigned, allowAllyToSkirmish), diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java index d53438469..800ad6ee5 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java @@ -704,9 +704,6 @@ public class IndividualCardAtTest extends AbstractAtTest { AwaitingDecision playeReturnDecision = _userFeedback.getAwaitingDecision(P2); playerDecided(P2, getCardActionId(playeReturnDecision, "Play Return")); - // Choose skirmish to resolve - playerDecided(P1, ""+_game.getGameState().getRingBearer(P1).getCardId()); - assertEquals(_game.getGameState().getRingBearer(P1), _game.getGameState().getSkirmish().getFellowshipCharacter()); assertEquals(1, _game.getGameState().getSkirmish().getShadowCharacters().size()); assertEquals(nelya, _game.getGameState().getSkirmish().getShadowCharacters().iterator().next()); diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/includes/changeLog.html b/gemp-lotr/gemp-lotr-web/src/main/webapp/includes/changeLog.html index 079982831..e6412c465 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/includes/changeLog.html +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/includes/changeLog.html @@ -1,4 +1,7 @@
+9 Nov. 2012
+- "Return to Its Master" now creates an additional Skirmish Phase.
+
 7 Nov. 2012
 - "King's Board" now correctly allows to exert the named characters for the effect, if you do not control Eomer.
 - Another change to Muster. Now to USE Muster, you have to click the card shadow showing above the panel used to drive