diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/TransferToShadowEffect.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/TransferToShadowEffect.java new file mode 100644 index 000000000..c67605a17 --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/effects/TransferToShadowEffect.java @@ -0,0 +1,46 @@ +package com.gempukku.lotro.cards.effects; + +import com.gempukku.lotro.common.Zone; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.timing.AbstractEffect; +import com.gempukku.lotro.logic.timing.Effect; + +import java.util.Collections; + +public class TransferToShadowEffect extends AbstractEffect { + private PhysicalCard _card; + + public TransferToShadowEffect(PhysicalCard card) { + _card = card; + } + + @Override + public boolean isPlayableInFull(LotroGame game) { + return _card.getZone().isInPlay(); + } + + @Override + public String getText(LotroGame game) { + return null; + } + + @Override + public Effect.Type getType() { + return null; + } + + @Override + protected FullEffectResult playEffectReturningResult(LotroGame game) { + if (isPlayableInFull(game)) { + game.getGameState().removeCardsFromZone(_card.getOwner(), Collections.singleton(_card)); + game.getGameState().addCardToZone(game, _card, Zone.SHADOW_CHARACTERS); + cardTransferredCallback(); + return new FullEffectResult(true, true); + } + return new FullEffectResult(false, false); + } + + protected void cardTransferredCallback() { + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/IsAdditionalCardTypeModifier.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/IsAdditionalCardTypeModifier.java new file mode 100644 index 000000000..e3210dc3e --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/modifiers/IsAdditionalCardTypeModifier.java @@ -0,0 +1,28 @@ +package com.gempukku.lotro.cards.modifiers; + +import com.gempukku.lotro.common.CardType; +import com.gempukku.lotro.common.Filterable; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.GameState; +import com.gempukku.lotro.logic.modifiers.AbstractModifier; +import com.gempukku.lotro.logic.modifiers.Condition; +import com.gempukku.lotro.logic.modifiers.ModifierEffect; +import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; + +public class IsAdditionalCardTypeModifier extends AbstractModifier { + private CardType _cardType; + + public IsAdditionalCardTypeModifier(PhysicalCard source, Filterable affectFilter, CardType cardType) { + this(source, affectFilter, null, cardType); + } + + public IsAdditionalCardTypeModifier(PhysicalCard source, Filterable affectFilter, Condition condition, CardType cardType) { + super(source, "Has additional card type - " + cardType.toString(), affectFilter, condition, ModifierEffect.ADDITIONAL_CARD_TYPE); + _cardType = cardType; + } + + @Override + public boolean isAdditionalCardTypeModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, CardType cardType) { + return cardType == _cardType; + } +} diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set11/wraith/Card11_216.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set11/wraith/Card11_216.java new file mode 100644 index 000000000..0255bf96c --- /dev/null +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/set11/wraith/Card11_216.java @@ -0,0 +1,85 @@ +package com.gempukku.lotro.cards.set11.wraith; + +import com.gempukku.lotro.cards.AbstractPermanent; +import com.gempukku.lotro.cards.PlayConditions; +import com.gempukku.lotro.cards.TriggerConditions; +import com.gempukku.lotro.cards.effects.AddUntilStartOfPhaseModifierEffect; +import com.gempukku.lotro.cards.effects.RemoveTwilightEffect; +import com.gempukku.lotro.cards.effects.TransferToShadowEffect; +import com.gempukku.lotro.cards.modifiers.MayNotBearModifier; +import com.gempukku.lotro.common.*; +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.ActivateCardAction; +import com.gempukku.lotro.logic.actions.RequiredTriggerAction; +import com.gempukku.lotro.logic.effects.DiscardCardsFromPlayEffect; +import com.gempukku.lotro.logic.modifiers.KeywordModifier; +import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.EffectResult; +import com.gempukku.lotro.logic.timing.UnrespondableEffect; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class Card11_216 extends AbstractPermanent { + public Card11_216() { + super(Side.SHADOW, 0, CardType.CONDITION, Culture.WRAITH, Zone.SUPPORT, "A Shadow Rises"); + } + + @Override + protected List getExtraPhaseActions(String playerId, LotroGame game, final PhysicalCard self) { + if (PlayConditions.canUseShadowCardDuringPhase(game, Phase.MANEUVER, self, 5) + && self.getZone() == Zone.SUPPORT) { + final ActivateCardAction action = new ActivateCardAction(self); + action.appendCost( + new RemoveTwilightEffect(5)); + action.appendEffect( + new DiscardCardsFromPlayEffect(self, Filters.attachedTo(self))); + action.appendEffect( + new TransferToShadowEffect(self) { + @Override + protected void cardTransferredCallback() { + action.appendEffect( + new AddUntilStartOfPhaseModifierEffect( + new KeywordModifier(self, self, Keyword.FIERCE), Phase.MANEUVER)); + action.appendEffect( + new AddUntilStartOfPhaseModifierEffect( + new MayNotBearModifier(self, self, Filters.any), Phase.MANEUVER)); + } + }); + return Collections.singletonList(action); + } + return null; + } + + @Override + public List getRequiredAfterTriggers(LotroGame game, EffectResult effectResult, final PhysicalCard self) { + if (TriggerConditions.startOfPhase(game, effectResult, Phase.REGROUP)) { + RequiredTriggerAction action = new RequiredTriggerAction(self); + action.appendEffect( + new UnrespondableEffect() { + @Override + protected void doPlayEffect(LotroGame game) { + for (Map.Entry tokenCount : game.getGameState().getTokens(self).entrySet()) { + if (tokenCount.getValue() > 0) + game.getGameState().removeTokens(self, tokenCount.getKey(), tokenCount.getValue()); + } + } + }); + return Collections.singletonList(action); + } + return null; + } + + @Override + public int getStrength() { + return 10; + } + + @Override + public int getVitality() { + return 3; + } +} 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 8328fddc7..8a8ded6c1 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 @@ -634,7 +634,8 @@ public class Filters { return new Filter() { @Override public boolean accepts(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) { - return (physicalCard.getBlueprint().getCardType() == cardType); + return (physicalCard.getBlueprint().getCardType() == cardType) + || modifiersQuerying.isAdditionalCardType(gameState, physicalCard, cardType); } }; } 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 7fd854f78..f0eb122d2 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 @@ -111,6 +111,11 @@ public abstract class AbstractModifier implements Modifier { return 0; } + @Override + public boolean isAdditionalCardTypeModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, CardType cardType) { + return false; + } + @Override public int getTwilightCostModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, boolean ignoreRoamingPenalty) { return 0; 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 8ac36a7fe..c07351bd9 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 @@ -1,9 +1,6 @@ package com.gempukku.lotro.logic.modifiers; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.common.Phase; -import com.gempukku.lotro.common.Side; -import com.gempukku.lotro.common.Signet; +import com.gempukku.lotro.common.*; import com.gempukku.lotro.filters.Filter; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.GameState; @@ -47,6 +44,8 @@ public interface Modifier { public int getMinionSiteNumberModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard); + public boolean isAdditionalCardTypeModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, CardType cardType); + public int getTwilightCostModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, boolean ignoreRoamingPenalty); public int getPlayOnTwilightCostModifier(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, PhysicalCard target); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java index 15f6dd72e..166636cc4 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifierEffect.java @@ -10,5 +10,7 @@ public enum ModifierEffect { SPECIAL_FLAG_MODIFIER, + ADDITIONAL_CARD_TYPE, + REMOVE_KEYWORD_MODIFIER, GIVE_KEYWORD_MODIFIER, CANCEL_KEYWORD_BONUS_MODIFIER } 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 778b62bd3..36847d97d 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 @@ -427,6 +427,19 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { } } + @Override + public boolean isAdditionalCardType(GameState gameState, PhysicalCard card, CardType cardType) { + LoggingThreadLocal.logMethodStart(card, "isAdditionalCardType"); + try { + for (Modifier modifier : getModifiersAffectingCard(gameState, ModifierEffect.ADDITIONAL_CARD_TYPE, card)) + if (modifier.isAdditionalCardTypeModifier(gameState, this, card, cardType)) + return true; + return false; + } finally { + LoggingThreadLocal.logMethodEnd(); + } + } + @Override public boolean canTakeWound(GameState gameState, PhysicalCard card) { LoggingThreadLocal.logMethodStart(card, "canTakeWound"); @@ -453,9 +466,7 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return false; } return true; - } - - finally + } finally { LoggingThreadLocal.logMethodEnd(); 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 8624dc614..fde4c36e7 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 @@ -1,9 +1,6 @@ package com.gempukku.lotro.logic.modifiers; -import com.gempukku.lotro.common.Keyword; -import com.gempukku.lotro.common.Phase; -import com.gempukku.lotro.common.Side; -import com.gempukku.lotro.common.Signet; +import com.gempukku.lotro.common.*; import com.gempukku.lotro.filters.Filter; import com.gempukku.lotro.game.PhysicalCard; import com.gempukku.lotro.game.state.GameState; @@ -53,6 +50,8 @@ public interface ModifiersQuerying { public int getOverwhelmMultiplier(GameState gameState, PhysicalCard card); + public boolean isAdditionalCardType(GameState gameState, PhysicalCard card, CardType cardType); + // Wounds/exertions public boolean canTakeWound(GameState gameState, PhysicalCard card);