From 96b8fe62818102e86777b63efb470ddbbf4b5f3d Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Tue, 1 Oct 2019 15:16:22 -0700 Subject: [PATCH] Extracting rules for playing required triggers --- .../lotro/cards/set11/site/Card11_243.java | 79 +++++++++++-------- .../gempukku/lotro/game/state/GameState.java | 4 + .../actions/DefaultActionsEnvironment.java | 12 +-- .../gempukku/lotro/logic/timing/RuleSet.java | 2 + .../rules/ActivateResponseAbilitiesRule.java | 4 +- .../timing/rules/RequiredTriggersRule.java | 67 ++++++++++++++++ 6 files changed, 123 insertions(+), 45 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/RequiredTriggersRule.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set11/site/Card11_243.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set11/site/Card11_243.java index f739f1955..f3ca40d46 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set11/site/Card11_243.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set11/site/Card11_243.java @@ -1,7 +1,5 @@ package com.gempukku.lotro.cards.set11.site; -import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; -import com.gempukku.lotro.logic.effects.AddUntilStartOfPhaseModifierEffect; import com.gempukku.lotro.common.CardType; import com.gempukku.lotro.common.Culture; import com.gempukku.lotro.common.Keyword; @@ -11,6 +9,8 @@ import com.gempukku.lotro.game.AbstractActionProxy; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.LotroGame; import com.gempukku.lotro.logic.actions.RequiredTriggerAction; +import com.gempukku.lotro.logic.cardtype.AbstractShadowsSite; +import com.gempukku.lotro.logic.effects.AddUntilStartOfPhaseModifierEffect; import com.gempukku.lotro.logic.modifiers.RemoveKeywordModifier; import com.gempukku.lotro.logic.timing.EffectResult; import com.gempukku.lotro.logic.timing.UnrespondableEffect; @@ -37,40 +37,53 @@ public class Card11_243 extends AbstractShadowsSite { public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, final PhysicalCard self) { if (game.getModifiersQuerying().getUntilStartOfPhaseLimitCounter(self, Phase.REGROUP).getUsedLimit() < 1 && !game.getGameState().getCurrentPhase().equals(Phase.REGROUP)) { - game.getActionsEnvironment().addUntilStartOfPhaseActionProxy( - new AbstractActionProxy() { - private Set _minionsMarked = new HashSet(); - + RequiredTriggerAction action = new RequiredTriggerAction(self); + action.appendEffect( + new UnrespondableEffect() { @Override - public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult) { - Set toLose = new HashSet(); - final Set toLoseInts = new HashSet(); - for (PhysicalCard minion : Filters.filterActive(game, Filters.inSkirmishAgainst(Culture.ROHAN, CardType.COMPANION))) { - if (!_minionsMarked.contains(minion.getCardId())) { - toLose.add(minion); - toLoseInts.add(minion.getCardId()); - } - } - - if (toLose.size() > 0) { - RequiredTriggerAction action = new RequiredTriggerAction(self); - action.appendEffect( - new UnrespondableEffect() { - @Override - protected void doPlayEffect(LotroGame game) { - _minionsMarked.addAll(toLoseInts); - } - }); - action.appendEffect( - new AddUntilStartOfPhaseModifierEffect( - new RemoveKeywordModifier(self, Filters.in(toLose), Keyword.FIERCE), Phase.REGROUP)); - return Collections.singletonList(action); - } - return null; + protected void doPlayEffect(LotroGame game) { + game.getModifiersQuerying().getUntilStartOfPhaseLimitCounter(self, Phase.REGROUP).incrementToLimit(1, 1); } - }, Phase.REGROUP); + }); + action.appendEffect( + new UnrespondableEffect() { + @Override + protected void doPlayEffect(LotroGame game) { + game.getActionsEnvironment().addUntilStartOfPhaseActionProxy( + new AbstractActionProxy() { + private Set _minionsMarked = new HashSet(); - game.getModifiersQuerying().getUntilStartOfPhaseLimitCounter(self, Phase.REGROUP).incrementToLimit(1, 1); + @Override + public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult) { + Set toLose = new HashSet(); + final Set toLoseInts = new HashSet(); + for (PhysicalCard minion : Filters.filterActive(game, Filters.inSkirmishAgainst(Culture.ROHAN, CardType.COMPANION))) { + if (!_minionsMarked.contains(minion.getCardId())) { + toLose.add(minion); + toLoseInts.add(minion.getCardId()); + } + } + + if (toLose.size() > 0) { + RequiredTriggerAction action = new RequiredTriggerAction(self); + action.appendEffect( + new UnrespondableEffect() { + @Override + protected void doPlayEffect(LotroGame game) { + _minionsMarked.addAll(toLoseInts); + } + }); + action.appendEffect( + new AddUntilStartOfPhaseModifierEffect( + new RemoveKeywordModifier(self, Filters.in(toLose), Keyword.FIERCE), Phase.REGROUP)); + return Collections.singletonList(action); + } + return null; + } + }, Phase.REGROUP); + } + }); + return Collections.singletonList(action); } return null; } 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 77945257d..8b04e707b 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 @@ -649,6 +649,10 @@ public class GameState { return Collections.unmodifiableList(_adventureDecks.get(playerId)); } + public List getInPlay() { + return Collections.unmodifiableList(_inPlay); + } + public String getCurrentPlayerId() { return _currentPlayerId; } 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 c71e6bbe3..e5e7b4163 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 @@ -123,11 +123,7 @@ public class DefaultActionsEnvironment implements ActionsEnvironment { @Override public List getRequiredBeforeTriggers(Effect effect) { - GatherRequiredBeforeTriggers gatherActions = new GatherRequiredBeforeTriggers(effect); - - _lotroGame.getGameState().iterateActiveTextCards(gatherActions); - - List gatheredActions = gatherActions.getActions(); + List gatheredActions = new LinkedList<>(); for (ActionProxy actionProxy : _actionProxies) { List actions = actionProxy.getRequiredBeforeTriggers(_lotroGame, effect); @@ -180,11 +176,7 @@ public class DefaultActionsEnvironment implements ActionsEnvironment { @Override public List getRequiredAfterTriggers(Collection effectResults) { - GatherRequiredAfterTriggers gatherActions = new GatherRequiredAfterTriggers(effectResults); - - _lotroGame.getGameState().iterateActiveTextCards(gatherActions); - - List gatheredActions = gatherActions.getActions(); + List gatheredActions = new LinkedList<>(); if (effectResults != null) { for (ActionProxy actionProxy : _actionProxies) { diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleSet.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleSet.java index 8899ce150..828c82f3b 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleSet.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleSet.java @@ -57,6 +57,8 @@ public class RuleSet { new ActivateResponseAbilitiesRule(_actionsEnvironment).applyRule(); + new RequiredTriggersRule(_actionsEnvironment).applyRule(); + new TakeOffRingRule(_actionsEnvironment).applyRule(); } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/ActivateResponseAbilitiesRule.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/ActivateResponseAbilitiesRule.java index 4fbfbb735..e7538f922 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/ActivateResponseAbilitiesRule.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/ActivateResponseAbilitiesRule.java @@ -31,7 +31,7 @@ public class ActivateResponseAbilitiesRule { @Override public List getOptionalBeforeActions(String playerId, LotroGame game, Effect effect) { List result = new LinkedList<>(); - for (PhysicalCard activableCard : Filters.filterActive(game, getActivatableCardsFilter(playerId))) { + for (PhysicalCard activableCard : Filters.filter(game.getGameState().getInPlay(), game, getActivatableCardsFilter(playerId))) { if (!game.getModifiersQuerying().hasTextRemoved(game, activableCard)) { final List actions = activableCard.getBlueprint().getOptionalInPlayBeforeActions(playerId, game, effect, activableCard); if (actions != null) @@ -45,7 +45,7 @@ public class ActivateResponseAbilitiesRule { @Override public List getOptionalAfterActions(String playerId, LotroGame game, EffectResult effectResult) { List result = new LinkedList<>(); - for (PhysicalCard activableCard : Filters.filterActive(game, getActivatableCardsFilter(playerId))) { + for (PhysicalCard activableCard : Filters.filter(game.getGameState().getInPlay(), game, getActivatableCardsFilter(playerId))) { if (!game.getModifiersQuerying().hasTextRemoved(game, activableCard)) { final List actions = activableCard.getBlueprint().getOptionalInPlayAfterActions(playerId, game, effectResult, activableCard); if (actions != null) diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/RequiredTriggersRule.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/RequiredTriggersRule.java new file mode 100644 index 000000000..e2acbd49a --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/RequiredTriggersRule.java @@ -0,0 +1,67 @@ +package com.gempukku.lotro.logic.timing.rules; + +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.filters.Filter; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.AbstractActionProxy; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.game.state.actions.DefaultActionsEnvironment; +import com.gempukku.lotro.logic.actions.RequiredTriggerAction; +import com.gempukku.lotro.logic.modifiers.condition.OrCondition; +import com.gempukku.lotro.logic.modifiers.condition.PhaseCondition; +import com.gempukku.lotro.logic.timing.Effect; +import com.gempukku.lotro.logic.timing.EffectResult; + +import java.util.LinkedList; +import java.util.List; + +public class RequiredTriggersRule { + private DefaultActionsEnvironment actionsEnvironment; + + public RequiredTriggersRule(DefaultActionsEnvironment actionsEnvironment) { + this.actionsEnvironment = actionsEnvironment; + } + + public void applyRule() { + actionsEnvironment.addAlwaysOnActionProxy( + new AbstractActionProxy() { + @Override + public List getRequiredBeforeTriggers(LotroGame game, Effect effect) { + List result = new LinkedList<>(); + for (PhysicalCard activableCard : Filters.filter(game.getGameState().getInPlay(), game, getActivatableCardsFilter())) { + if (!game.getModifiersQuerying().hasTextRemoved(game, activableCard)) { + final List actions = activableCard.getBlueprint().getRequiredBeforeTriggers(game, effect, activableCard); + if (actions != null) + result.addAll(actions); + } + } + + return result; + } + + @Override + public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult) { + List result = new LinkedList<>(); + for (PhysicalCard activableCard : Filters.filter(game.getGameState().getInPlay(), game, getActivatableCardsFilter())) { + if (!game.getModifiersQuerying().hasTextRemoved(game, activableCard)) { + final List actions = activableCard.getBlueprint().getRequiredAfterTriggers(game, effectResult, activableCard); + if (actions != null) + result.addAll(actions); + } + } + + return result; + } + } + ); + } + + private Filter getActivatableCardsFilter() { + return Filters.conditionFilter( + Filters.or(Filters.currentSite, Filters.and(Filters.not(CardType.SITE))), + new OrCondition(new PhaseCondition(Phase.PUT_RING_BEARER), new PhaseCondition(Phase.PLAY_STARTING_FELLOWSHIP)), + Filters.and(Filters.not(CardType.SITE))); + } +}