From d13f3ab4a1ece6de2765d75724699d06694e7a1d Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Mon, 10 Oct 2011 12:54:47 +0000 Subject: [PATCH] "Covering Fire" --- .../lotro/cards/set1/isengard/Card1_138.java | 2 +- .../lotro/cards/set1/site/Card1_329.java | 2 +- .../lotro/cards/set1/site/Card1_363.java | 4 +- .../lotro/cards/set2/wraith/Card2_076.java | 2 +- .../lotro/cards/set2/wraith/Card2_085.java | 2 +- .../lotro/cards/set3/isengard/Card3_061.java | 2 +- .../lotro/cards/set3/site/Card3_117.java | 2 +- .../lotro/cards/set3/site/Card3_118.java | 2 +- .../lotro/cards/set4/gondor/Card4_117.java | 4 +- .../lotro/cards/set4/isengard/Card4_147.java | 74 +++++++++++++++++++ .../logic/modifiers/AbstractModifier.java | 2 +- .../lotro/logic/modifiers/Modifier.java | 2 +- .../lotro/logic/modifiers/ModifiersLogic.java | 4 +- .../logic/modifiers/ModifiersQuerying.java | 2 +- ...aysPhaseActionsUntilPassesGameProcess.java | 4 +- ...ersPlayPhaseActionsInOrderGameProcess.java | 4 +- 16 files changed, 94 insertions(+), 20 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/isengard/Card4_147.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_138.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_138.java index 57dc6e2a8..68a55eaa3 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_138.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/isengard/Card1_138.java @@ -64,7 +64,7 @@ public class Card1_138 extends AbstractAttachable { public Modifier getAlwaysOnModifier(final PhysicalCard self) { return new AbstractModifier(self, "Can't play Skirmish actions", null, new ModifierEffect[]{ModifierEffect.ACTION_MODIFIER}) { @Override - public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result) { + public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action, boolean result) { PhysicalCard actionSource = action.getActionSource(); if ((action.getType() == Keyword.SKIRMISH || (actionSource != null && actionSource.getBlueprint().getCardType() == CardType.EVENT && modifiersQuerying.hasKeyword(gameState, actionSource, Keyword.SKIRMISH))) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_329.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_329.java index 4f6a8d020..485ff4b5b 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_329.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_329.java @@ -29,7 +29,7 @@ public class Card1_329 extends AbstractSite { public Modifier getAlwaysOnModifier(PhysicalCard self) { return new AbstractModifier(self, "Stealth events may not be played", null, new ModifierEffect[]{ModifierEffect.ACTION_MODIFIER}) { @Override - public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result) { + public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action, boolean result) { PhysicalCard actionSourceCard = action.getActionSource(); if (actionSourceCard != null && actionSourceCard.getBlueprint().getCardType() == CardType.EVENT && modifiersQuerying.hasKeyword(gameState, actionSourceCard, Keyword.STEALTH)) return false; diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_363.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_363.java index 6edc921e8..02d4caa8a 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_363.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set1/site/Card1_363.java @@ -89,7 +89,7 @@ public class Card1_363 extends AbstractSite { new AddUntilEndOfPhaseModifierEffect( new AbstractModifier(null, "End Shadow Phase", null, new ModifierEffect[]{ModifierEffect.ACTION_MODIFIER}) { @Override - public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result) { + public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action, boolean result) { return false; } }, Phase.SHADOW @@ -99,7 +99,7 @@ public class Card1_363 extends AbstractSite { new AddUntilEndOfPhaseModifierEffect( new AbstractModifier(null, "End Shadow Phase", null, new ModifierEffect[]{ModifierEffect.ACTION_MODIFIER}) { @Override - public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result) { + public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action, boolean result) { return false; } }, Phase.SHADOW diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/wraith/Card2_076.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/wraith/Card2_076.java index 2931b3676..d3cd897dd 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/wraith/Card2_076.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/wraith/Card2_076.java @@ -49,7 +49,7 @@ public class Card2_076 extends AbstractAttachable { return Collections.singletonList( new AbstractModifier(self, "Sam's game text does not apply", Filters.name("Sam"), new ModifierEffect[]{ModifierEffect.ACTION_MODIFIER}) { @Override - public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result) { + public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action, boolean result) { PhysicalCard actionSource = action.getActionSource(); if (actionSource != null && actionSource.getBlueprint().getName().equals("Sam")) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/wraith/Card2_085.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/wraith/Card2_085.java index c621bad2c..88b57a281 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/wraith/Card2_085.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set2/wraith/Card2_085.java @@ -45,7 +45,7 @@ public class Card2_085 extends AbstractMinion { return Collections.singletonList( new AbstractModifier(self, "Return to Its Master may not be played", Filters.name("Return to Its Master"), new ModifierEffect[]{ModifierEffect.ACTION_MODIFIER}) { @Override - public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result) { + public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action, boolean result) { PhysicalCard actionSource = action.getActionSource(); if (actionSource != null && actionSource.getBlueprint().getName().equals("Return to Its Master")) return false; diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set3/isengard/Card3_061.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set3/isengard/Card3_061.java index a658113c1..582fec4c4 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set3/isengard/Card3_061.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set3/isengard/Card3_061.java @@ -40,7 +40,7 @@ public class Card3_061 extends AbstractMinion { return Collections.singletonList( new AbstractModifier(self, "While you can spot another [ISENGARD] Orc, no player may use archery special abilities.", null, new ModifierEffect[]{ModifierEffect.ACTION_MODIFIER}) { @Override - public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result) { + public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action, boolean result) { if (Filters.canSpot(gameState, modifiersQuerying, Filters.not(Filters.sameCard(self)), Filters.culture(Culture.ISENGARD), Filters.race(Race.ORC))) { PhysicalCard actionSource = action.getActionSource(); if (actionSource != null diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set3/site/Card3_117.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set3/site/Card3_117.java index b651a297f..65cb92bec 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set3/site/Card3_117.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set3/site/Card3_117.java @@ -33,7 +33,7 @@ public class Card3_117 extends AbstractSite { return Collections.singletonList( new AbstractModifier(self, "Maneuver events may not be played", null, new ModifierEffect[]{ModifierEffect.ACTION_MODIFIER}) { @Override - public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result) { + public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action, boolean result) { PhysicalCard source = action.getActionSource(); if (source != null && source.getBlueprint().getCardType() == CardType.EVENT && modifiersQuerying.hasKeyword(gameState, source, Keyword.MANEUVER)) diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set3/site/Card3_118.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set3/site/Card3_118.java index cf8ef9d7f..6069219db 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set3/site/Card3_118.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set3/site/Card3_118.java @@ -34,7 +34,7 @@ public class Card3_118 extends AbstractSite { return Collections.singletonList( new AbstractModifier(self, "Cards may not be played from draw decks or discard piles", null, new ModifierEffect[]{ModifierEffect.ACTION_MODIFIER}) { @Override - public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result) { + public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action, boolean result) { PhysicalCard source = action.getActionSource(); if (source != null && (source.getZone() == Zone.DECK || source.getZone() == Zone.DISCARD)) return false; diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gondor/Card4_117.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gondor/Card4_117.java index 4d00e009b..517d70243 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gondor/Card4_117.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/gondor/Card4_117.java @@ -39,10 +39,10 @@ public class Card4_117 extends AbstractCompanion { return Collections.singletonList( new AbstractModifier(self, "Can't play skimirhs events or skirmish special abilities", null, new ModifierEffect[]{ModifierEffect.ACTION_MODIFIER}) { @Override - public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result) { + public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action, boolean result) { if (!Filters.inSkirmish().accepts(gameState, modifiersQuerying, self)) return result; - if (action.getActionSource() != null && action.getActionSource().getBlueprint().getSide() != Side.SHADOW) + if (performingPlayer != null && performingPlayer.equals(self.getOwner())) return result; if (action.getType() == Keyword.SKIRMISH) return false; diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/isengard/Card4_147.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/isengard/Card4_147.java new file mode 100644 index 000000000..420765bc7 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set4/isengard/Card4_147.java @@ -0,0 +1,74 @@ +package com.gempukku.lotro.cards.set4.isengard; + +import com.gempukku.lotro.cards.AbstractPermanent; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.common.*; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.GameState; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.RequiredTriggerAction; +import com.gempukku.lotro.logic.effects.DiscardCardsFromPlayEffect; +import com.gempukku.lotro.logic.modifiers.AbstractModifier; +import com.gempukku.lotro.logic.modifiers.Modifier; +import com.gempukku.lotro.logic.modifiers.ModifierEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; +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: Isengard + * Twilight Cost: 0 + * Type: Condition + * Game Text: To play, spot 2 [ISENGARD] archers. Plays to your support area. The Free Peoples player may not play + * archery events or use archery special abilities. Discard this condition during the regroup phase. + */ +public class Card4_147 extends AbstractPermanent { + public Card4_147() { + super(Side.SHADOW, 0, CardType.CONDITION, Culture.ISENGARD, Zone.SUPPORT, "Covering Fire"); + } + + @Override + public boolean checkPlayRequirements(String playerId, LotroGame game, PhysicalCard self, int twilightModifier) { + return super.checkPlayRequirements(playerId, game, self, twilightModifier) + && PlayConditions.canSpot(game, 2, Filters.culture(Culture.ISENGARD), Filters.keyword(Keyword.ARCHER)); + } + + @Override + public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, PhysicalCard self) { + if (game.getGameState().getCurrentPhase() == Phase.REGROUP) { + RequiredTriggerAction action = new RequiredTriggerAction(self); + action.appendEffect( + new DiscardCardsFromPlayEffect(self, self)); + return Collections.singletonList(action); + } + return null; + } + + @Override + public List getAlwaysOnModifiers(PhysicalCard self) { + return Collections.singletonList( + new AbstractModifier(self, null, null, new ModifierEffect[]{ModifierEffect.ACTION_MODIFIER}) { + @Override + public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action, boolean result) { + if (!performingPlayer.equals(gameState.getCurrentPlayerId())) + return result; + if (gameState.getCurrentPhase() != Phase.ARCHERY) + return result; + if (action.getType() == Keyword.ARCHERY) + return false; + final PhysicalCard actionSource = action.getActionSource(); + if (actionSource != null && actionSource.getBlueprint().getCardType() == CardType.EVENT && modifiersQuerying.hasKeyword(gameState, actionSource, Keyword.ARCHERY)) + return false; + + return result; + } + } + ) + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java index 798ab50df..fc45b0768 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/AbstractModifier.java @@ -146,7 +146,7 @@ public abstract class AbstractModifier implements Modifier { } @Override - public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result) { + public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action, boolean result) { return result; } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java index c9964d334..4abe5aaa3 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/Modifier.java @@ -60,7 +60,7 @@ public interface Modifier { public boolean addsToArcheryTotal(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, boolean result); - public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, Action action, boolean result); + public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action, boolean result); public boolean canHavePlayedOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java index f1e352234..27a4a8d5e 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java @@ -358,10 +358,10 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { } @Override - public boolean canPlayAction(GameState gameState, Action action) { + public boolean canPlayAction(GameState gameState, String performingPlayer, Action action) { boolean result = true; for (Modifier modifier : getModifiers(ModifierEffect.ACTION_MODIFIER)) - result = modifier.canPlayAction(gameState, this, action, result); + result = modifier.canPlayAction(gameState, this, performingPlayer, action, result); return result; } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java index c184b1b7c..47e3cddba 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java @@ -63,7 +63,7 @@ public interface ModifiersQuerying { public boolean isValidAssignments(GameState gameState, Side side, Map> assignments); // Playing actions - public boolean canPlayAction(GameState gameState, Action action); + public boolean canPlayAction(GameState gameState, String performingPlayer, Action action); public boolean canHavePlayedOn(GameState gameState, PhysicalCard playedCard, PhysicalCard target); 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 60ddd8c4e..5e9453e30 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 @@ -35,11 +35,11 @@ public class PlayerPlaysPhaseActionsUntilPassesGameProcess implements GameProces List playableActions = new LinkedList(); for (Action action : visitor.getActions()) - if (_game.getModifiersQuerying().canPlayAction(_game.getGameState(), action)) + if (_game.getModifiersQuerying().canPlayAction(_game.getGameState(), _playerId, action)) playableActions.add(action); for (Action action : stackedVisitor.getActions()) - if (_game.getModifiersQuerying().canPlayAction(_game.getGameState(), action)) + if (_game.getModifiersQuerying().canPlayAction(_game.getGameState(), _playerId, action)) playableActions.add(action); _game.getUserFeedback().sendAwaitingDecision(_playerId, 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 241217bfa..e008846c2 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 @@ -50,11 +50,11 @@ public class PlayersPlayPhaseActionsInOrderGameProcess implements GameProcess { List playableActions = new LinkedList(); for (Action action : actions) - if (_game.getModifiersQuerying().canPlayAction(_game.getGameState(), action)) + if (_game.getModifiersQuerying().canPlayAction(_game.getGameState(), playerId, action)) playableActions.add(action); for (Action action : stackedVisitor.getActions()) - if (_game.getModifiersQuerying().canPlayAction(_game.getGameState(), action)) + if (_game.getModifiersQuerying().canPlayAction(_game.getGameState(), playerId, action)) playableActions.add(action); _game.getUserFeedback().sendAwaitingDecision(playerId,