diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 2c103cbd7d7..784703b9aed 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -94,14 +94,10 @@ public class CardFactoryUtil { @Override public boolean canPlay() { - //Lands do not have SpellPermanents. - if (sourceCard.isLand()) { - return (sourceCard.getGame().getZoneOf(sourceCard).is(ZoneType.Hand) || sourceCard.hasKeyword("May be played")) - && sourceCard.getController().canCastSorcery(); - } - else { - return sourceCard.getSpellPermanent().canPlay(); - } + sourceCard.setState(CardCharacteristicName.FaceDown); + boolean success = super.canPlay(); + sourceCard.setState(CardCharacteristicName.Original); + return success; } }; diff --git a/forge-game/src/main/java/forge/game/mana/ManaCostAdjustment.java b/forge-game/src/main/java/forge/game/mana/ManaCostAdjustment.java index 3fe8077fc03..9fda95d2745 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaCostAdjustment.java +++ b/forge-game/src/main/java/forge/game/mana/ManaCostAdjustment.java @@ -9,6 +9,7 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Lists; +import forge.card.CardCharacteristicName; import forge.card.mana.ManaCostShard; import forge.game.Game; import forge.game.ability.AbilityUtils; @@ -38,6 +39,7 @@ public class ManaCostAdjustment { return; } + boolean isStateChangeToFaceDown = false; if (sa.isSpell()) { if (sa.isDelve()) { final Player pc = originalCard.getController(); @@ -52,6 +54,10 @@ public class ManaCostAdjustment { } else if (sa.getHostCard().hasKeyword("Convoke")) { adjustCostByConvoke(cost, sa); + } else if (((Spell) sa).isCastFaceDown()) { + // Turn face down to apply cost modifiers correctly + originalCard.setState(CardCharacteristicName.FaceDown); + isStateChangeToFaceDown = true; } } // isSpell @@ -97,7 +103,13 @@ public class ManaCostAdjustment { for (final StaticAbility stAb : setAbilities) { applyAbility(stAb, "SetCost", sa, cost); } - } // GetSpellCostChange + + // Reset card state (if changed) + if (isStateChangeToFaceDown) { + originalCard.setState(CardCharacteristicName.Original); + } + } + // GetSpellCostChange /** diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index 15b5f352089..952c6e82bb6 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -89,8 +89,8 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable return false; } - // for uncastables like lotus bloom, check if manaCost is blank - if (isBasicSpell() && card.getManaCost().isNoCost()) { + // for uncastables like lotus bloom, check if manaCost is blank (except for morph spells) + if (!isCastFaceDown() && isBasicSpell() && card.getManaCost().isNoCost()) { return false; }