From e76e4351739db108b075d9cb7d53e6cd6ded0939 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Wed, 5 Oct 2011 15:41:37 +0000 Subject: [PATCH] "Dunlending Looter" Activating cards stacked on other cards. --- .../cards/AbstractLotroCardBlueprint.java | 4 ++ .../gempukku/lotro/cards/PlayConditions.java | 4 ++ .../lotro/cards/set4/dunland/Card4_011.java | 62 +++++++++++++++++++ .../com/gempukku/lotro/filters/Filters.java | 2 +- .../lotro/game/LotroCardBlueprint.java | 2 + .../com/gempukku/lotro/game/PhysicalCard.java | 2 +- .../gempukku/lotro/game/PhysicalCardImpl.java | 10 +-- .../gempukku/lotro/game/state/GameState.java | 8 +++ ...therPlayableActionsFromStackedVisitor.java | 32 ++++++++++ ...aysPhaseActionsUntilPassesGameProcess.java | 9 +++ ...ersPlayPhaseActionsInOrderGameProcess.java | 9 +++ 11 files changed, 137 insertions(+), 7 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/dunland/Card4_011.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/GatherPlayableActionsFromStackedVisitor.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java index 2c0796cc5..84636f6b8 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java @@ -130,6 +130,10 @@ public abstract class AbstractLotroCardBlueprint implements LotroCardBlueprint { return null; } + public List getPhaseActionsFromStacked(String playerId, LotroGame game, PhysicalCard self) { + return null; + } + @Override public List getRequiredBeforeTriggers(LotroGame game, Effect effect, PhysicalCard self) { return null; diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java index 2cfd8a0cb..5dac4d829 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/PlayConditions.java @@ -133,6 +133,10 @@ public class PlayConditions { return canExert(source, gameState, modifiersQuerying, Filters.sameCard(card)); } + public static boolean controllsSite(GameState gameState, ModifiersQuerying modifiersQuerying, String playerId) { + return Filters.findFirstActive(gameState, modifiersQuerying, Filters.siteControlled(playerId)) != null; + } + public static boolean winsSkirmish(EffectResult effectResult, PhysicalCard character) { EffectResult.Type effectType = effectResult.getType(); if (effectType == EffectResult.Type.RESOLVE_SKIRMISH || effectType == EffectResult.Type.OVERWHELM_IN_SKIRMISH) { diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/dunland/Card4_011.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/dunland/Card4_011.java new file mode 100644 index 000000000..28d606a30 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/dunland/Card4_011.java @@ -0,0 +1,62 @@ +package com.gempukku.lotro.cards.set4.dunland; + +import com.gempukku.lotro.cards.AbstractMinion; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.effects.StackCardFromPlayEffect; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Race; +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.OptionalTriggerAction; +import com.gempukku.lotro.logic.effects.ChooseActiveCardEffect; +import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.EffectResult; + +import java.util.Collections; +import java.util.List; + +/** + * Set: The Two Towers + * Side: Shadow + * Culture: Dunland + * Twilight Cost: 3 + * Type: Minion • Man + * Strength: 9 + * Vitality: 1 + * Site: 3 + * Game Text: When this minion wins a skirmish, you may stack him on a site you control. Shadow: If stacked on a site + * you control, play this minion. His twilight cost is -2. + */ +public class Card4_011 extends AbstractMinion { + public Card4_011() { + super(3, 9, 1, 3, Race.MAN, Culture.DUNLAND, "Dunlending Looter"); + } + + @Override + public List getOptionalAfterTriggers(String playerId, LotroGame game, EffectResult effectResult, final PhysicalCard self) { + if (PlayConditions.winsSkirmish(effectResult, self) + && PlayConditions.controllsSite(game.getGameState(), game.getModifiersQuerying(), playerId)) { + final OptionalTriggerAction action = new OptionalTriggerAction(self); + action.appendEffect( + new ChooseActiveCardEffect(self, playerId, "Choose site you control", Filters.siteControlled(playerId)) { + @Override + protected void cardSelected(PhysicalCard card) { + action.insertEffect( + new StackCardFromPlayEffect(self, card)); + } + }); + return Collections.singletonList(action); + } + return null; + } + + @Override + public List getPhaseActionsFromStacked(String playerId, LotroGame game, PhysicalCard self) { + if (playerId.equals(self.getStackedOn().getSiteController()) + && checkPlayRequirements(playerId, game, self, -2)) { + return Collections.singletonList(getPlayCardAction(playerId, game, self, -2)); + } + return null; + } +} 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 5d6d281b8..b65f9aa7f 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 @@ -363,7 +363,7 @@ public class Filters { return new Filter() { @Override public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return physicalCard.getBlueprint().getCardType() == CardType.SITE && playerId.equals(physicalCard.getController()); + return physicalCard.getBlueprint().getCardType() == CardType.SITE && playerId.equals(physicalCard.getSiteController()); } }; } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprint.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprint.java index 7413d1a8d..6dd4dada3 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprint.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprint.java @@ -46,6 +46,8 @@ public interface LotroCardBlueprint { public List getPhaseActions(String playerId, LotroGame game, PhysicalCard self); + public List getPhaseActionsFromStacked(String playerId, LotroGame game, PhysicalCard self); + public List getRequiredBeforeTriggers(LotroGame game, Effect effect, PhysicalCard self); public List getOptionalBeforeTriggers(String playerId, LotroGame game, Effect effect, PhysicalCard self); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/PhysicalCard.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/PhysicalCard.java index 3fed59d60..3f6348229 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/PhysicalCard.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/PhysicalCard.java @@ -9,7 +9,7 @@ public interface PhysicalCard { public String getOwner(); - public String getController(); + public String getSiteController(); public int getCardId(); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/PhysicalCardImpl.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/PhysicalCardImpl.java index 114b0e687..791d32891 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/PhysicalCardImpl.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/PhysicalCardImpl.java @@ -12,7 +12,7 @@ public class PhysicalCardImpl implements PhysicalCard { private int _cardId; private String _blueprintId; private String _owner; - private String _controller; + private String _siteController; private Zone _zone; private LotroCardBlueprint _blueprint; @@ -50,13 +50,13 @@ public class PhysicalCardImpl implements PhysicalCard { return _owner; } - public void setController(String controller) { - _controller = controller; + public void setSiteController(String siteController) { + _siteController = siteController; } @Override - public String getController() { - return _controller; + public String getSiteController() { + return _siteController; } public void startAffectingGame(ModifiersEnvironment modifiersEnvironment) { 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 5ce02cebb..38b7c7ea0 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 @@ -378,6 +378,14 @@ public class GameState { return false; } + public boolean iterateStackedActivableCards(String player, PhysicalCardVisitor physicalCardVisitor) { + for (PhysicalCardImpl physicalCard : _stacked.get(player)) { + if (physicalCardVisitor.visitPhysicalCard(physicalCard)) + return true; + } + return false; + } + public boolean iterateActiveCards(String player, PhysicalCardVisitor physicalCardVisitor) { for (int i = 1; i <= 9; i++) { PhysicalCard site = getSite(i); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/GatherPlayableActionsFromStackedVisitor.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/GatherPlayableActionsFromStackedVisitor.java new file mode 100644 index 000000000..1987bada8 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/GatherPlayableActionsFromStackedVisitor.java @@ -0,0 +1,32 @@ +package com.gempukku.lotro.logic.timing.processes; + +import com.gempukku.lotro.game.CompletePhysicalCardVisitor; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.timing.Action; + +import java.util.LinkedList; +import java.util.List; + +public class GatherPlayableActionsFromStackedVisitor extends CompletePhysicalCardVisitor { + private LotroGame _game; + private String _playerId; + + private List _actions = new LinkedList(); + + public GatherPlayableActionsFromStackedVisitor(LotroGame game, String playerId) { + _game = game; + _playerId = playerId; + } + + @Override + protected void doVisitPhysicalCard(PhysicalCard physicalCard) { + List list = physicalCard.getBlueprint().getPhaseActionsFromStacked(_playerId, _game, physicalCard); + if (list != null) + _actions.addAll(list); + } + + public List getActions() { + return _actions; + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/general/PlayerPlaysPhaseActionsUntilPassesGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/general/PlayerPlaysPhaseActionsUntilPassesGameProcess.java index 8934fe9f5..60ddd8c4e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/general/PlayerPlaysPhaseActionsUntilPassesGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/general/PlayerPlaysPhaseActionsUntilPassesGameProcess.java @@ -5,6 +5,7 @@ import com.gempukku.lotro.logic.decisions.CardActionSelectionDecision; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import com.gempukku.lotro.logic.timing.Action; import com.gempukku.lotro.logic.timing.processes.GameProcess; +import com.gempukku.lotro.logic.timing.processes.GatherPlayableActionsFromStackedVisitor; import com.gempukku.lotro.logic.timing.processes.GatherPlayableActionsVisitor; import java.util.LinkedList; @@ -28,11 +29,19 @@ public class PlayerPlaysPhaseActionsUntilPassesGameProcess implements GameProces GatherPlayableActionsVisitor visitor = new GatherPlayableActionsVisitor(_game, _playerId); _game.getGameState().iterateActivableCards(_playerId, visitor); + GatherPlayableActionsFromStackedVisitor stackedVisitor = new GatherPlayableActionsFromStackedVisitor(_game, _playerId); + _game.getGameState().iterateStackedActivableCards(_playerId, stackedVisitor); + List playableActions = new LinkedList(); + for (Action action : visitor.getActions()) if (_game.getModifiersQuerying().canPlayAction(_game.getGameState(), action)) playableActions.add(action); + for (Action action : stackedVisitor.getActions()) + if (_game.getModifiersQuerying().canPlayAction(_game.getGameState(), action)) + playableActions.add(action); + _game.getUserFeedback().sendAwaitingDecision(_playerId, new CardActionSelectionDecision(_game, 1, "Choose action to play or Pass", playableActions, true) { @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/general/PlayersPlayPhaseActionsInOrderGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/general/PlayersPlayPhaseActionsInOrderGameProcess.java index d05e24665..241217bfa 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/general/PlayersPlayPhaseActionsInOrderGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/general/PlayersPlayPhaseActionsInOrderGameProcess.java @@ -8,6 +8,7 @@ import com.gempukku.lotro.logic.decisions.CardActionSelectionDecision; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import com.gempukku.lotro.logic.timing.Action; import com.gempukku.lotro.logic.timing.processes.GameProcess; +import com.gempukku.lotro.logic.timing.processes.GatherPlayableActionsFromStackedVisitor; import com.gempukku.lotro.logic.timing.processes.GatherPlayableActionsVisitor; import java.util.LinkedList; @@ -38,9 +39,13 @@ public class PlayersPlayPhaseActionsInOrderGameProcess implements GameProcess { _nextProcess = _followingGameProcess; } else { String playerId = _playOrder.getNextPlayer(); + GatherPlayableActionsVisitor visitor = new GatherPlayableActionsVisitor(_game, playerId); _game.getGameState().iterateActivableCards(playerId, visitor); + GatherPlayableActionsFromStackedVisitor stackedVisitor = new GatherPlayableActionsFromStackedVisitor(_game, playerId); + _game.getGameState().iterateStackedActivableCards(playerId, stackedVisitor); + List actions = visitor.getActions(); List playableActions = new LinkedList(); @@ -48,6 +53,10 @@ public class PlayersPlayPhaseActionsInOrderGameProcess implements GameProcess { if (_game.getModifiersQuerying().canPlayAction(_game.getGameState(), action)) playableActions.add(action); + for (Action action : stackedVisitor.getActions()) + if (_game.getModifiersQuerying().canPlayAction(_game.getGameState(), action)) + playableActions.add(action); + _game.getUserFeedback().sendAwaitingDecision(playerId, new CardActionSelectionDecision(_game, 1, "Choose action to play or Pass", playableActions, true) { @Override