Changing the "can't play card from deck or discard" effect.

This commit is contained in:
marcins78@gmail.com
2011-11-03 15:10:49 +00:00
parent 2953b90bac
commit ea33d6dc56
22 changed files with 70 additions and 65 deletions

View File

@@ -12,6 +12,7 @@ import com.gempukku.lotro.game.PhysicalCardVisitor;
import com.gempukku.lotro.game.state.GameState;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.effects.*;
import com.gempukku.lotro.logic.modifiers.ModifierFlag;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.EffectResult;
@@ -192,10 +193,14 @@ public class PlayConditions {
}
public static boolean canPlayFromDiscard(String playerId, LotroGame game, Filterable... filters) {
if (game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.CANT_PLAY_FROM_DISCARD_OR_DECK))
return false;
return Filters.filter(game.getGameState().getDiscard(playerId), game.getGameState(), game.getModifiersQuerying(), Filters.and(filters, Filters.playable(game))).size() > 0;
}
public static boolean canPlayFromDiscard(String playerId, LotroGame game, int modifier, Filterable... filters) {
if (game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.CANT_PLAY_FROM_DISCARD_OR_DECK))
return false;
return Filters.filter(game.getGameState().getDiscard(playerId), game.getGameState(), game.getModifiersQuerying(), Filters.and(filters, Filters.playable(game, modifier))).size() > 0;
}

View File

@@ -7,6 +7,7 @@ import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.game.state.LotroGame;
import com.gempukku.lotro.logic.decisions.ArbitraryCardsSelectionDecision;
import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException;
import com.gempukku.lotro.logic.modifiers.ModifierFlag;
import com.gempukku.lotro.logic.timing.Action;
import com.gempukku.lotro.logic.timing.Effect;
import com.gempukku.lotro.logic.timing.EffectResult;
@@ -38,7 +39,7 @@ public class ChooseAndPlayCardFromDeckEffect implements Effect {
@Override
public boolean isPlayableInFull(LotroGame game) {
return true;
return !game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.CANT_PLAY_FROM_DISCARD_OR_DECK);
}
@Override
@@ -48,19 +49,21 @@ public class ChooseAndPlayCardFromDeckEffect implements Effect {
@Override
public Collection<? extends EffectResult> playEffect(final LotroGame game) {
Collection<PhysicalCard> deck = Filters.filter(game.getGameState().getDeck(_playerId), game.getGameState(), game.getModifiersQuerying(), Filters.and(_filter, Filters.playable(game, _twilightModifier)));
game.getUserFeedback().sendAwaitingDecision(_playerId,
new ArbitraryCardsSelectionDecision(1, "Choose a card to play", new LinkedList<PhysicalCard>(deck), 0, 1) {
@Override
public void decisionMade(String result) throws DecisionResultInvalidException {
List<PhysicalCard> selectedCards = getSelectedCardsByResponse(result);
if (selectedCards.size() > 0) {
PhysicalCard selectedCard = selectedCards.get(0);
_playCardAction = selectedCard.getBlueprint().getPlayCardAction(_playerId, game, selectedCard, _twilightModifier);
game.getActionsEnvironment().addActionToStack(_playCardAction);
if (isPlayableInFull(game)) {
Collection<PhysicalCard> deck = Filters.filter(game.getGameState().getDeck(_playerId), game.getGameState(), game.getModifiersQuerying(), Filters.and(_filter, Filters.playable(game, _twilightModifier)));
game.getUserFeedback().sendAwaitingDecision(_playerId,
new ArbitraryCardsSelectionDecision(1, "Choose a card to play", new LinkedList<PhysicalCard>(deck), 0, 1) {
@Override
public void decisionMade(String result) throws DecisionResultInvalidException {
List<PhysicalCard> selectedCards = getSelectedCardsByResponse(result);
if (selectedCards.size() > 0) {
PhysicalCard selectedCard = selectedCards.get(0);
_playCardAction = selectedCard.getBlueprint().getPlayCardAction(_playerId, game, selectedCard, _twilightModifier);
game.getActionsEnvironment().addActionToStack(_playCardAction);
}
}
}
});
});
}
return null;
}

View File

@@ -1,20 +1,27 @@
package com.gempukku.lotro.cards.modifiers;
import com.gempukku.lotro.game.PhysicalCard;
import com.gempukku.lotro.logic.modifiers.AbstractModifier;
import com.gempukku.lotro.logic.modifiers.ModifierEffect;
import com.gempukku.lotro.logic.modifiers.ModifierFlag;
import com.gempukku.lotro.game.state.GameState;
import com.gempukku.lotro.logic.modifiers.*;
public class SpecialFlagModifier extends AbstractModifier {
private Condition _condition;
private ModifierFlag _modifierFlag;
public SpecialFlagModifier(PhysicalCard source, ModifierFlag modifierFlag) {
this(source, null, modifierFlag);
}
public SpecialFlagModifier(PhysicalCard source, Condition condition, ModifierFlag modifierFlag) {
super(source, "Special flag set", null, ModifierEffect.SPECIAL_FLAG_MODIFIER);
_condition = condition;
_modifierFlag = modifierFlag;
}
@Override
public boolean hasFlagActive(ModifierFlag modifierFlag) {
return modifierFlag == _modifierFlag;
public boolean hasFlagActive(GameState gameState, ModifiersQuerying modifiersQuerying, ModifierFlag modifierFlag) {
if (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
return modifierFlag == _modifierFlag;
return false;
}
}

View File

@@ -60,7 +60,7 @@ public class Card1_001 extends AbstractAttachable {
@Override
public List<? extends Action> getOptionalInPlayBeforeActions(final String playerId, LotroGame game, Effect effect, final PhysicalCard self) {
if (PlayConditions.isGettingWounded(effect, game, Filters.hasAttached(self))
&& !game.getModifiersQuerying().hasFlagActive(ModifierFlag.RING_TEXT_INACTIVE)) {
&& !game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.RING_TEXT_INACTIVE)) {
WoundCharactersEffect woundEffect = (WoundCharactersEffect) effect;
List<Action> actions = new LinkedList<Action>();
@@ -79,7 +79,7 @@ public class Card1_001 extends AbstractAttachable {
public List<RequiredTriggerAction> getRequiredBeforeTriggers(LotroGame game, Effect effect, PhysicalCard self) {
if (PlayConditions.isGettingWounded(effect, game, Filters.hasAttached(self))
&& game.getGameState().isWearingRing()
&& !game.getModifiersQuerying().hasFlagActive(ModifierFlag.RING_TEXT_INACTIVE)) {
&& !game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.RING_TEXT_INACTIVE)) {
WoundCharactersEffect woundEffect = (WoundCharactersEffect) effect;
if (woundEffect.getAffectedCardsMinusPrevented(game).contains(self.getAttachedTo())) {
RequiredTriggerAction action = new RequiredTriggerAction(self);

View File

@@ -59,7 +59,7 @@ public class Card1_002 extends AbstractAttachable {
public List<? extends Action> getOptionalInPlayBeforeActions(final String playerId, LotroGame game, Effect effect, final PhysicalCard self) {
if (game.getGameState().getCurrentPhase() == Phase.SKIRMISH
&& PlayConditions.isGettingWounded(effect, game, Filters.hasAttached(self))
&& !game.getModifiersQuerying().hasFlagActive(ModifierFlag.RING_TEXT_INACTIVE)) {
&& !game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.RING_TEXT_INACTIVE)) {
WoundCharactersEffect woundEffect = (WoundCharactersEffect) effect;
if (woundEffect.getAffectedCardsMinusPrevented(game).contains(self.getAttachedTo())) {
List<Action> actions = new LinkedList<Action>();
@@ -80,7 +80,7 @@ public class Card1_002 extends AbstractAttachable {
public List<RequiredTriggerAction> getRequiredBeforeTriggers(LotroGame game, Effect effect, PhysicalCard self) {
if (PlayConditions.isGettingWounded(effect, game, Filters.hasAttached(self))
&& game.getGameState().isWearingRing()
&& !game.getModifiersQuerying().hasFlagActive(ModifierFlag.RING_TEXT_INACTIVE)) {
&& !game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.RING_TEXT_INACTIVE)) {
WoundCharactersEffect woundEffect = (WoundCharactersEffect) effect;
if (woundEffect.getAffectedCardsMinusPrevented(game).contains(self.getAttachedTo())) {
List<RequiredTriggerAction> actions = new LinkedList<RequiredTriggerAction>();

View File

@@ -50,7 +50,7 @@ public class Card3_068 extends AbstractMinion {
new Condition() {
@Override
public boolean isFullfilled(GameState gameState, ModifiersQuerying modifiersQuerying) {
return !modifiersQuerying.hasFlagActive(ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
return !modifiersQuerying.hasFlagActive(gameState, ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
}
},
Filters.and(
@@ -66,7 +66,7 @@ public class Card3_068 extends AbstractMinion {
new Condition() {
@Override
public boolean isFullfilled(GameState gameState, ModifiersQuerying modifiersQuerying) {
return !modifiersQuerying.hasFlagActive(ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
return !modifiersQuerying.hasFlagActive(gameState, ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
}
},
Filters.sameCard(self)));

View File

@@ -53,7 +53,7 @@ public class Card3_069 extends AbstractMinion {
new Condition() {
@Override
public boolean isFullfilled(GameState gameState, ModifiersQuerying modifiersQuerying) {
return !modifiersQuerying.hasFlagActive(ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
return !modifiersQuerying.hasFlagActive(gameState, ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
}
},
Filters.and(
@@ -69,7 +69,7 @@ public class Card3_069 extends AbstractMinion {
new Condition() {
@Override
public boolean isFullfilled(GameState gameState, ModifiersQuerying modifiersQuerying) {
return !modifiersQuerying.hasFlagActive(ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
return !modifiersQuerying.hasFlagActive(gameState, ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
}
},
Filters.sameCard(self)));

View File

@@ -1,17 +1,14 @@
package com.gempukku.lotro.cards.set3.site;
import com.gempukku.lotro.cards.AbstractSite;
import com.gempukku.lotro.cards.modifiers.SpecialFlagModifier;
import com.gempukku.lotro.cards.modifiers.conditions.LocationCondition;
import com.gempukku.lotro.common.Block;
import com.gempukku.lotro.common.Keyword;
import com.gempukku.lotro.common.Zone;
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 com.gempukku.lotro.logic.modifiers.ModifierFlag;
import java.util.Collections;
import java.util.List;
@@ -32,14 +29,6 @@ public class Card3_118 extends AbstractSite {
@Override
public List<? extends Modifier> getAlwaysOnModifiers(LotroGame game, PhysicalCard self) {
return Collections.singletonList(
new AbstractModifier(self, "Cards may not be played from draw decks or discard piles", null, ModifierEffect.ACTION_MODIFIER) {
@Override
public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action) {
PhysicalCard source = action.getActionSource();
if (source != null && (source.getZone() == Zone.DECK || source.getZone() == Zone.DISCARD))
return false;
return true;
}
});
new SpecialFlagModifier(self, new LocationCondition(self), ModifierFlag.CANT_PLAY_FROM_DISCARD_OR_DECK));
}
}

View File

@@ -56,7 +56,7 @@ public class Card4_001 extends AbstractAttachable {
new Condition() {
@Override
public boolean isFullfilled(GameState gameState, ModifiersQuerying modifiersQuerying) {
return !modifiersQuerying.hasFlagActive(ModifierFlag.RING_TEXT_INACTIVE) && gameState.isWearingRing();
return !modifiersQuerying.hasFlagActive(gameState, ModifierFlag.RING_TEXT_INACTIVE) && gameState.isWearingRing();
}
}, 2));
@@ -66,7 +66,7 @@ public class Card4_001 extends AbstractAttachable {
@Override
protected List<? extends Action> getExtraPhaseActions(String playerId, LotroGame game, final PhysicalCard self) {
if (PlayConditions.canUseFPCardDuringPhase(game.getGameState(), Phase.SKIRMISH, self)
&& !game.getModifiersQuerying().hasFlagActive(ModifierFlag.RING_TEXT_INACTIVE)) {
&& !game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.RING_TEXT_INACTIVE)) {
ActivateCardAction action = new ActivateCardAction(self);
action.appendCost(
new AddBurdenEffect(self, 1));
@@ -81,7 +81,7 @@ public class Card4_001 extends AbstractAttachable {
public List<RequiredTriggerAction> getRequiredBeforeTriggers(LotroGame game, Effect effect, PhysicalCard self) {
if (PlayConditions.isGettingWounded(effect, game, Filters.hasAttached(self))
&& game.getGameState().isWearingRing()
&& !game.getModifiersQuerying().hasFlagActive(ModifierFlag.RING_TEXT_INACTIVE)) {
&& !game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.RING_TEXT_INACTIVE)) {
WoundCharactersEffect woundEffect = (WoundCharactersEffect) effect;
RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(new PreventCardEffect(woundEffect, self.getAttachedTo()));

View File

@@ -48,7 +48,7 @@ public class Card4_033 extends AbstractMinion {
new Condition() {
@Override
public boolean isFullfilled(GameState gameState, ModifiersQuerying modifiersQuerying) {
return !modifiersQuerying.hasFlagActive(ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
return !modifiersQuerying.hasFlagActive(gameState, ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
}
},
Filters.sameCard(self)));

View File

@@ -53,7 +53,7 @@ public class Card4_173 extends AbstractMinion {
new Condition() {
@Override
public boolean isFullfilled(GameState gameState, ModifiersQuerying modifiersQuerying) {
return gameState.getCurrentPhase() == Phase.ARCHERY && !modifiersQuerying.hasFlagActive(ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
return gameState.getCurrentPhase() == Phase.ARCHERY && !modifiersQuerying.hasFlagActive(gameState, ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
}
}, Filters.sameCard(self)));
modifiers.add(
@@ -61,7 +61,7 @@ public class Card4_173 extends AbstractMinion {
new Condition() {
@Override
public boolean isFullfilled(GameState gameState, ModifiersQuerying modifiersQuerying) {
return !modifiersQuerying.hasFlagActive(ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
return !modifiersQuerying.hasFlagActive(gameState, ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
}
},
Filters.sameCard(self)));

View File

@@ -55,7 +55,7 @@ public class Card4_174 extends AbstractAttachable {
@Override
protected List<? extends Action> getExtraPhaseActions(String playerId, LotroGame game, PhysicalCard self) {
if (PlayConditions.canUseShadowCardDuringPhase(game.getGameState(), Phase.MANEUVER, self, 0)
&& !game.getModifiersQuerying().hasFlagActive(ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE)) {
&& !game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE)) {
ActivateCardAction action = new ActivateCardAction(self);
action.appendEffect(
new AddUntilStartOfPhaseModifierEffect(

View File

@@ -55,7 +55,7 @@ public class Card5_056 extends AbstractMinion {
new Condition() {
@Override
public boolean isFullfilled(GameState gameState, ModifiersQuerying modifiersQuerying) {
return !modifiersQuerying.hasFlagActive(ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
return !modifiersQuerying.hasFlagActive(gameState, ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
}
},
Filters.and(
@@ -71,7 +71,7 @@ public class Card5_056 extends AbstractMinion {
new Condition() {
@Override
public boolean isFullfilled(GameState gameState, ModifiersQuerying modifiersQuerying) {
return !modifiersQuerying.hasFlagActive(ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
return !modifiersQuerying.hasFlagActive(gameState, ModifierFlag.SARUMAN_FIRST_SENTENCE_INACTIVE);
}
},
Filters.sameCard(self)));

View File

@@ -59,7 +59,7 @@ public class Card7_002 extends AbstractAttachable {
@Override
protected List<? extends Action> getExtraPhaseActions(String playerId, LotroGame game, final PhysicalCard self) {
if (PlayConditions.canUseFPCardDuringPhase(game.getGameState(), Phase.MANEUVER, self)
&& !game.getModifiersQuerying().hasFlagActive(ModifierFlag.RING_TEXT_INACTIVE)) {
&& !game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.RING_TEXT_INACTIVE)) {
ActivateCardAction action = new ActivateCardAction(self);
action.appendCost(
new AddBurdenEffect(self, 1));
@@ -74,7 +74,7 @@ public class Card7_002 extends AbstractAttachable {
public List<RequiredTriggerAction> getRequiredBeforeTriggers(LotroGame game, Effect effect, PhysicalCard self) {
if (PlayConditions.isGettingWounded(effect, game, Filters.hasAttached(self))
&& game.getGameState().isWearingRing()
&& !game.getModifiersQuerying().hasFlagActive(ModifierFlag.RING_TEXT_INACTIVE)) {
&& !game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.RING_TEXT_INACTIVE)) {
WoundCharactersEffect woundEffect = (WoundCharactersEffect) effect;
RequiredTriggerAction action = new RequiredTriggerAction(self);
action.appendEffect(new PreventCardEffect(woundEffect, self.getAttachedTo()));

View File

@@ -239,7 +239,7 @@ public abstract class AbstractModifier implements Modifier {
}
@Override
public boolean hasFlagActive(ModifierFlag modifierFlag) {
public boolean hasFlagActive(GameState gameState, ModifiersQuerying modifiersQuerying, ModifierFlag modifierFlag) {
return false;
}
}

View File

@@ -95,5 +95,5 @@ public interface Modifier {
public int getSpotCountModifier(GameState gameState, ModifiersQuerying modifiersQuerying, Filter filter);
public boolean hasFlagActive(ModifierFlag modifierFlag);
public boolean hasFlagActive(GameState gameState, ModifiersQuerying modifiersQuerying, ModifierFlag modifierFlag);
}

View File

@@ -1,5 +1,6 @@
package com.gempukku.lotro.logic.modifiers;
public enum ModifierFlag {
HAS_TO_MOVE_IF_POSSIBLE, RING_TEXT_INACTIVE, SARUMAN_FIRST_SENTENCE_INACTIVE, WIN_CHECK_AFTER_SHADOW_RECONCILE
HAS_TO_MOVE_IF_POSSIBLE, RING_TEXT_INACTIVE, SARUMAN_FIRST_SENTENCE_INACTIVE, WIN_CHECK_AFTER_SHADOW_RECONCILE,
CANT_PLAY_FROM_DISCARD_OR_DECK
}

View File

@@ -562,9 +562,9 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
}
@Override
public boolean hasFlagActive(ModifierFlag modifierFlag) {
public boolean hasFlagActive(GameState gameState, ModifierFlag modifierFlag) {
for (Modifier modifier : getModifiers(ModifierEffect.SPECIAL_FLAG_MODIFIER))
if (modifier.hasFlagActive(modifierFlag))
if (modifier.hasFlagActive(gameState, this, modifierFlag))
return true;
return false;

View File

@@ -95,5 +95,5 @@ public interface ModifiersQuerying {
public int getSpotCount(GameState gameState, Filter filter, int inPlayCount);
public boolean hasFlagActive(ModifierFlag modifierFlag);
public boolean hasFlagActive(GameState gameState, ModifierFlag modifierFlag);
}

View File

@@ -40,7 +40,7 @@ public class RegroupGameProcess implements GameProcess {
@Override
public void process() {
if (_game.getGameState().getCurrentSiteNumber() == 9
&& _game.getModifiersQuerying().hasFlagActive(ModifierFlag.WIN_CHECK_AFTER_SHADOW_RECONCILE)) {
&& _game.getModifiersQuerying().hasFlagActive(_game.getGameState(), ModifierFlag.WIN_CHECK_AFTER_SHADOW_RECONCILE)) {
_game.playerWon(_game.getGameState().getCurrentPlayerId(), "Surviving to Shadow Reconcile on site 9");
}
}

View File

@@ -24,7 +24,7 @@ public class FellowshipPlayerChoosesToMoveOrStayGameProcess implements GameProce
public void process() {
final GameState gameState = _game.getGameState();
if (gameState.getMoveCount() < RuleUtils.calculateMoveLimit(_game)) {
if (_game.getModifiersQuerying().hasFlagActive(ModifierFlag.HAS_TO_MOVE_IF_POSSIBLE)) {
if (_game.getModifiersQuerying().hasFlagActive(_game.getGameState(), ModifierFlag.HAS_TO_MOVE_IF_POSSIBLE)) {
_nextProcess = new MovementGameProcess(_game,
new EndOfPhaseGameProcess(_game, Phase.REGROUP,
new ShadowPhasesGameProcess(_game)));

View File

@@ -21,12 +21,12 @@ public class WinConditionRule {
_actionsEnvironment.addAlwaysOnActionProxy(
new AbstractActionProxy() {
@Override
public List<? extends Action> getRequiredAfterTriggers(LotroGame lotroGame, EffectResult effectResults) {
public List<? extends Action> getRequiredAfterTriggers(LotroGame game, EffectResult effectResults) {
if (effectResults.getType() == EffectResult.Type.START_OF_PHASE
&& lotroGame.getGameState().getCurrentPhase() == Phase.REGROUP
&& lotroGame.getGameState().getCurrentSiteNumber() == 9
&& !lotroGame.getModifiersQuerying().hasFlagActive(ModifierFlag.WIN_CHECK_AFTER_SHADOW_RECONCILE))
lotroGame.playerWon(lotroGame.getGameState().getCurrentPlayerId(), "Surviving to Regroup phase on site 9");
&& game.getGameState().getCurrentPhase() == Phase.REGROUP
&& game.getGameState().getCurrentSiteNumber() == 9
&& !game.getModifiersQuerying().hasFlagActive(game.getGameState(), ModifierFlag.WIN_CHECK_AFTER_SHADOW_RECONCILE))
game.playerWon(game.getGameState().getCurrentPlayerId(), "Surviving to Regroup phase on site 9");
return null;
}
});