mirror of
https://github.com/magefree/mage.git
synced 2025-12-29 23:12:10 -08:00
fix face-down creature spells cost reduction to include disguise (#11962)
This commit is contained in:
parent
d5295b0de3
commit
5df392af64
6 changed files with 77 additions and 41 deletions
|
|
@ -1,7 +1,7 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.common.cost.MorphSpellsCostReductionControllerEffect;
|
||||
import mage.abilities.effects.common.cost.FaceDownSpellsCostReductionControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
|
|
@ -17,7 +17,7 @@ public final class DreamChisel extends CardImpl {
|
|||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
|
||||
|
||||
// Face-down creature spells you cast cost {1} less to cast.
|
||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MorphSpellsCostReductionControllerEffect(1)));
|
||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new FaceDownSpellsCostReductionControllerEffect(1)));
|
||||
}
|
||||
|
||||
private DreamChisel(final DreamChisel card) {
|
||||
|
|
@ -28,4 +28,4 @@ public final class DreamChisel extends CardImpl {
|
|||
public DreamChisel copy() {
|
||||
return new DreamChisel(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import mage.MageInt;
|
|||
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.cost.MorphSpellsCostReductionControllerEffect;
|
||||
import mage.abilities.effects.common.cost.FaceDownSpellsCostReductionControllerEffect;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
|
|
@ -50,7 +50,7 @@ public final class KadenaSlinkingSorcerer extends CardImpl {
|
|||
|
||||
// The first face-down creature spell you cast each turn costs {3} less to cast.
|
||||
this.addAbility(new SimpleStaticAbility(
|
||||
new MorphSpellsCostReductionControllerEffect(filterFirstFaceDownSpell, 3)
|
||||
new FaceDownSpellsCostReductionControllerEffect(filterFirstFaceDownSpell, 3)
|
||||
.setText("The first face-down creature spell you cast each turn costs {3} less to cast.")
|
||||
), new KadenaSlinkingSorcererWatcher());
|
||||
|
||||
|
|
|
|||
|
|
@ -5,13 +5,12 @@ import mage.abilities.common.SimpleStaticAbility;
|
|||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect;
|
||||
import mage.abilities.effects.common.cost.MorphSpellsCostReductionControllerEffect;
|
||||
import mage.abilities.effects.common.cost.FaceDownSpellsCostReductionControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.common.FilterCreatureCard;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
|
|
@ -24,7 +23,7 @@ public final class ObscuringAether extends CardImpl {
|
|||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}");
|
||||
|
||||
// Face-down creature spells you cast cost {1} less to cast.
|
||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MorphSpellsCostReductionControllerEffect(1)));
|
||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new FaceDownSpellsCostReductionControllerEffect(1)));
|
||||
|
||||
// {1}{G}: Turn Obscuring Aether face down.
|
||||
Effect effect = new BecomesFaceDownCreatureEffect(Duration.Custom, BecomesFaceDownCreatureEffect.FaceDownType.MANUAL);
|
||||
|
|
|
|||
|
|
@ -173,4 +173,28 @@ public class DisguiseTest extends CardTestPlayerBase {
|
|||
Assert.assertFalse(info, foundAbility != null);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCostReduction() {
|
||||
String chisel = "Dream Chisel"; // Face-down creature spells you cast cost {1} less to cast.
|
||||
String nightdrinker = "Nightdrinker Moroii";
|
||||
/* Nightdrinker Moroii {3}{B} Creature — Vampire
|
||||
* Flying
|
||||
* When Nightdrinker Moroii enters the battlefield, you lose 3 life.
|
||||
* Disguise {B}{B}
|
||||
*/
|
||||
addCard(Zone.BATTLEFIELD, playerA, chisel);
|
||||
addCard(Zone.HAND, playerA, nightdrinker);
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Wastes", 2);
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, nightdrinker + " using Disguise");
|
||||
|
||||
setStrictChooseMode(true);
|
||||
setStopAt(1, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
assertPowerToughness(playerA, EmptyNames.FACE_DOWN_CREATURE.toString(), 2, 2);
|
||||
assertLife(playerA, 20);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,46 @@
|
|||
package mage.abilities.effects.common.cost;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.SpellAbility;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.common.FilterCreatureCard;
|
||||
import mage.game.Game;
|
||||
|
||||
public class FaceDownSpellsCostReductionControllerEffect extends SpellsCostReductionControllerEffect{
|
||||
|
||||
private static final FilterCreatureCard standardFilter = new FilterCreatureCard("Face-down creature spells");
|
||||
|
||||
/**
|
||||
* Face-down creature spells you cast cost
|
||||
* @param amount less to cast
|
||||
*/
|
||||
public FaceDownSpellsCostReductionControllerEffect(int amount) {
|
||||
super(standardFilter, amount);
|
||||
}
|
||||
|
||||
/**
|
||||
* Face-down spells you cast cost
|
||||
* @param filter with matching characteristics
|
||||
* @param amount less to cast
|
||||
*/
|
||||
public FaceDownSpellsCostReductionControllerEffect(FilterCard filter, int amount) {
|
||||
super(filter, amount);
|
||||
}
|
||||
|
||||
protected FaceDownSpellsCostReductionControllerEffect(final FaceDownSpellsCostReductionControllerEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaceDownSpellsCostReductionControllerEffect copy() {
|
||||
return new FaceDownSpellsCostReductionControllerEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||
if (abilityToModify instanceof SpellAbility && ((SpellAbility) abilityToModify).getSpellAbilityCastMode().isFaceDown()) {
|
||||
return super.applies(abilityToModify, source, game);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
package mage.abilities.effects.common.cost;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.keyword.MorphAbility;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.common.FilterCreatureCard;
|
||||
import mage.game.Game;
|
||||
|
||||
public class MorphSpellsCostReductionControllerEffect extends SpellsCostReductionControllerEffect{
|
||||
private static final FilterCreatureCard standardFilter = new FilterCreatureCard("Face-down creature spells");
|
||||
|
||||
public MorphSpellsCostReductionControllerEffect(int amount) {
|
||||
super(standardFilter, amount);
|
||||
}
|
||||
public MorphSpellsCostReductionControllerEffect(FilterCard filter, int amount) {
|
||||
super(filter, amount);
|
||||
}
|
||||
protected MorphSpellsCostReductionControllerEffect(final MorphSpellsCostReductionControllerEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
@Override
|
||||
public MorphSpellsCostReductionControllerEffect copy() {
|
||||
return new MorphSpellsCostReductionControllerEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||
if (abilityToModify instanceof MorphAbility) {
|
||||
return super.applies(abilityToModify, source, game);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue