From 923cf1e3aca0473f3f839cd541bfcbde441d7e36 Mon Sep 17 00:00:00 2001 From: Daniel Bomar Date: Fri, 1 Jan 2021 11:42:54 -0600 Subject: [PATCH] Allow morph lands to be cast face down at instant speed (#7169) --- .../CastAsThoughItHadFlashAllEffect.java | 22 ++++++++++++++++++- .../main/java/mage/players/PlayerImpl.java | 3 ++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/CastAsThoughItHadFlashAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/CastAsThoughItHadFlashAllEffect.java index 762e6539aef..46398e18350 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/CastAsThoughItHadFlashAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/CastAsThoughItHadFlashAllEffect.java @@ -5,8 +5,10 @@ package mage.abilities.effects.common.continuous; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.AsThoughEffectImpl; +import mage.abilities.keyword.MorphAbility; import mage.cards.Card; import mage.constants.AsThoughEffectType; +import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.filter.FilterCard; @@ -53,7 +55,25 @@ public class CastAsThoughItHadFlashAllEffect extends AsThoughEffectImpl { public boolean applies(UUID affectedSpellId, Ability source, UUID affectedControllerId, Game game) { if (anyPlayer || source.isControlledBy(affectedControllerId)) { Card card = game.getCard(affectedSpellId); - return card != null && filter.match(card, game); + if (card != null) { + //Allow lands with morph to be played at instant speed + if (card.isLand()) { + boolean morphAbility = false; + for (Ability checkAbility : card.getAbilities()) { + if (checkAbility instanceof MorphAbility) { + morphAbility = true; + break; + } + } + if (morphAbility) { + Card cardCopy = card.copy(); + cardCopy.getCardType().clear(); + cardCopy.addCardType(CardType.CREATURE); + return filter.match(cardCopy, game); + } + } + return filter.match(card, game); + } } return false; } diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index 5df372d63b5..851fd14e7c7 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -3387,7 +3387,8 @@ public abstract class PlayerImpl implements Player, Serializable { // Even mana cost can't be checked here without lookahead // So make it available all the time boolean canUse; - if (ability instanceof MorphAbility && object instanceof Card && game.canPlaySorcery(getId())) { + if (ability instanceof MorphAbility && object instanceof Card && (game.canPlaySorcery(getId()) || + (null != game.getContinuousEffects().asThough(object.getId(), AsThoughEffectType.CAST_AS_INSTANT, playAbility, this.getId(), game)))) { canUse = canPlayCardByAlternateCost((Card) object, availableMana, playAbility, game); } else { canUse = canPlay(playAbility, availableMana, object, game); // canPlay already checks alternative source costs and all conditions