diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set9/dwarven/Card9_010.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set9/dwarven/Card9_010.java new file mode 100644 index 000000000..27e8ff13f --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set9/dwarven/Card9_010.java @@ -0,0 +1,50 @@ +package com.gempukku.lotro.cards.set9.dwarven; + +import com.gempukku.lotro.cards.AbstractCompanion; +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Culture; +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.common.Race; +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.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 java.util.Collections; +import java.util.List; + +/** + * Set: Reflections + * Side: Free + * Culture: Dwarven + * Twilight Cost: 2 + * Type: Companion • Dwarf + * Strength: 6 + * Vitality: 3 + * Resistance: 6 + * Game Text: You may play [DWARVEN] skirmish events stacked on [DWARVEN] conditions as if from hand. + */ +public class Card9_010 extends AbstractCompanion { + public Card9_010() { + super(2, 6, 3, Culture.DWARVEN, Race.DWARF, null, "Sindri", true); + } + + @Override + public List getAlwaysOnModifiers(final LotroGame game, PhysicalCard self) { + return Collections.singletonList( + new AbstractModifier(self, null, Filters.and(Culture.DWARVEN, CardType.EVENT, Keyword.SKIRMISH, Filters.stackedOn(Culture.DWARVEN, CardType.CONDITION)), ModifierEffect.EXTRA_ACTION_MODIFIER) { + @Override + public List getExtraPhaseActionFromStacked(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card) { + if (card.getBlueprint().checkPlayRequirements(card.getOwner(), game, card, 0, false)) + return Collections.singletonList( + card.getBlueprint().getPlayCardAction(card.getOwner(), game, card, 0, false)); + 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 0b306d3aa..6f13c643a 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 @@ -580,6 +580,15 @@ public class Filters { }; } + public static Filter stackedOn(final Filterable... filters) { + return new Filter() { + @Override + public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { + return physicalCard.getStackedOn() != null && Filters.and(filters).accepts(gameState, modifiersQuerying, physicalCard.getStackedOn()); + } + }; + } + public static Filter siteControlledByShadowPlayer(final String fellowshipPlayer) { return new Filter() { @Override diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/actions/DefaultActionsEnvironment.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/actions/DefaultActionsEnvironment.java index b59984cb6..dfb6b55ad 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/actions/DefaultActionsEnvironment.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/actions/DefaultActionsEnvironment.java @@ -11,7 +11,6 @@ import com.gempukku.lotro.logic.timing.ActionStack; import com.gempukku.lotro.logic.timing.Effect; import com.gempukku.lotro.logic.timing.EffectResult; import com.gempukku.lotro.logic.timing.processes.GatherPlayableActionsFromDiscardVisitor; -import com.gempukku.lotro.logic.timing.processes.GatherPlayableActionsFromStackedVisitor; import com.gempukku.lotro.logic.timing.results.PlayCardResult; import com.gempukku.lotro.logic.timing.rules.CharacterDeathRule; @@ -445,4 +444,37 @@ public class DefaultActionsEnvironment implements ActionsEnvironment { return _actions; } } + + private 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); + final List extraActions = _game.getModifiersQuerying().getExtraPhaseActionsFromStacked(_game.getGameState(), physicalCard); + if (extraActions != null) { + for (Action action : extraActions) { + if (action != null) + _actions.add(action); + else + System.out.println("Null action from: " + physicalCard.getBlueprint().getName()); + } + } + } + + public List getActions() { + return _actions; + } + } + } 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 bc91180cb..4048113c2 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 @@ -178,6 +178,11 @@ public abstract class AbstractModifier implements Modifier { return null; } + @Override + public List getExtraPhaseActionFromStacked(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card) { + return null; + } + @Override public boolean canHavePlayedOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target) { return true; 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 cdc9e128b..537f71da4 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 @@ -73,6 +73,8 @@ public interface Modifier { public List getExtraPhaseAction(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card); + public List getExtraPhaseActionFromStacked(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card); + public boolean canHavePlayedOn(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard playedCard, PhysicalCard target); public boolean canHaveTransferredOn(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 f366114b8..b6b2d96e5 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 @@ -572,6 +572,21 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return activateCardActions; } + @Override + public List getExtraPhaseActionsFromStacked(GameState gameState, PhysicalCard target) { + List activateCardActions = new LinkedList(); + + for (Modifier modifier : getModifiers(gameState, ModifierEffect.EXTRA_ACTION_MODIFIER)) { + if (affectsCardWithSkipSet(gameState, target, modifier)) { + List actions = modifier.getExtraPhaseActionFromStacked(gameState, this, target); + if (actions != null) + activateCardActions.addAll(actions); + } + } + + return activateCardActions; + } + @Override public boolean isValidAssignments(GameState gameState, Side side, Map> assignments) { 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 35b3081b9..5041bc028 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 @@ -86,6 +86,8 @@ public interface ModifiersQuerying { public List getExtraPhaseActions(GameState gameState, PhysicalCard target); + public List getExtraPhaseActionsFromStacked(GameState gameState, PhysicalCard target); + // Others public boolean canBeDiscardedFromPlay(GameState gameState, PhysicalCard card, PhysicalCard source); 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 deleted file mode 100644 index 1987bada8..000000000 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/GatherPlayableActionsFromStackedVisitor.java +++ /dev/null @@ -1,32 +0,0 @@ -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; - } -}