fix face-down creature spells cost reduction to include disguise (#11962)

This commit is contained in:
xenohedron 2024-03-18 23:09:52 -04:00 committed by GitHub
parent d5295b0de3
commit 5df392af64
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 77 additions and 41 deletions

View file

@ -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);
}
}
}

View file

@ -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());

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}