From e7927cb50f3fc97cd1e344bf0d9eaf336802d748 Mon Sep 17 00:00:00 2001 From: Steven Knipe Date: Mon, 18 Sep 2023 03:33:20 -0700 Subject: [PATCH] make Morph cost reduction a separate class (and fix to work with new system) --- Mage.Sets/src/mage/cards/d/DreamChisel.java | 15 ++------- Mage.Sets/src/mage/cards/g/GiftOfDoom.java | 13 -------- .../mage/cards/k/KadenaSlinkingSorcerer.java | 8 ++--- .../src/mage/cards/o/ObscuringAether.java | 11 ++----- ...phSpellsCostReductionControllerEffect.java | 33 +++++++++++++++++++ .../mage/constants/SpellAbilityCastMode.java | 3 +- .../card/FaceDownCastablePredicate.java | 24 -------------- Mage/src/main/java/mage/game/stack/Spell.java | 9 +++-- 8 files changed, 49 insertions(+), 67 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/effects/common/cost/MorphSpellsCostReductionControllerEffect.java delete mode 100644 Mage/src/main/java/mage/filter/predicate/card/FaceDownCastablePredicate.java diff --git a/Mage.Sets/src/mage/cards/d/DreamChisel.java b/Mage.Sets/src/mage/cards/d/DreamChisel.java index f9fdf124c7f..86db355d011 100644 --- a/Mage.Sets/src/mage/cards/d/DreamChisel.java +++ b/Mage.Sets/src/mage/cards/d/DreamChisel.java @@ -1,13 +1,11 @@ package mage.cards.d; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect; +import mage.abilities.effects.common.cost.MorphSpellsCostReductionControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.card.FaceDownCastablePredicate; import java.util.UUID; @@ -15,18 +13,11 @@ import java.util.UUID; * @author North */ public final class DreamChisel extends CardImpl { - - private static final FilterCreatureCard filter = new FilterCreatureCard("Face-down creature spells"); - - static { - filter.add(FaceDownCastablePredicate.instance); - } - public DreamChisel(UUID ownerId, CardSetInfo setInfo) { 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 SpellsCostReductionControllerEffect(filter, 1))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MorphSpellsCostReductionControllerEffect(1))); } private DreamChisel(final DreamChisel card) { @@ -37,4 +28,4 @@ public final class DreamChisel extends CardImpl { public DreamChisel copy() { return new DreamChisel(this); } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/g/GiftOfDoom.java b/Mage.Sets/src/mage/cards/g/GiftOfDoom.java index 498551ad311..3452516fb4c 100644 --- a/Mage.Sets/src/mage/cards/g/GiftOfDoom.java +++ b/Mage.Sets/src/mage/cards/g/GiftOfDoom.java @@ -42,7 +42,6 @@ public final class GiftOfDoom extends CardImpl { TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); - this.getSpellAbility().setTargetAdjuster(GiftOfDoomAdjuster.instance); // to remove the target set if Morph casting cost is paid Ability ability = new EnchantAbility(auraTarget); this.addAbility(ability); @@ -77,18 +76,6 @@ public final class GiftOfDoom extends CardImpl { } } -enum GiftOfDoomAdjuster implements TargetAdjuster { - instance; - - @Override - public void adjustTargets(Ability ability, Game game) { - // if the Morph casting cost is paid, clear the target of Enchant Creature - if (game.getState().getValue("MorphAbility" + ability.getSourceId()) == "activated") { - ability.getTargets().clear(); - } - } -} - class GiftOfDoomEffect extends OneShotEffect { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); diff --git a/Mage.Sets/src/mage/cards/k/KadenaSlinkingSorcerer.java b/Mage.Sets/src/mage/cards/k/KadenaSlinkingSorcerer.java index 8e2945c355a..72c80abcbf2 100644 --- a/Mage.Sets/src/mage/cards/k/KadenaSlinkingSorcerer.java +++ b/Mage.Sets/src/mage/cards/k/KadenaSlinkingSorcerer.java @@ -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.SpellsCostReductionControllerEffect; +import mage.abilities.effects.common.cost.MorphSpellsCostReductionControllerEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -16,7 +16,6 @@ import mage.filter.FilterCard; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.Predicate; -import mage.filter.predicate.card.FaceDownCastablePredicate; import mage.filter.predicate.card.FaceDownPredicate; import mage.game.Game; import mage.game.events.GameEvent; @@ -51,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 SpellsCostReductionControllerEffect(filterFirstFaceDownSpell, 3) + new MorphSpellsCostReductionControllerEffect(filterFirstFaceDownSpell, 3) .setText("The first face-down creature spell you cast each turn costs {3} less to cast.") ), new KadenaSlinkingSorcererWatcher()); @@ -78,8 +77,7 @@ enum KadenaSlinkingSorcererPredicate implements Predicate { public boolean apply(Card input, Game game) { KadenaSlinkingSorcererWatcher watcher = game.getState().getWatcher(KadenaSlinkingSorcererWatcher.class); if (watcher != null) { - return FaceDownCastablePredicate.instance.apply(input, game) - && !watcher.castFaceDownThisTurn(input.getOwnerId()); + return !watcher.castFaceDownThisTurn(input.getOwnerId()); } return false; } diff --git a/Mage.Sets/src/mage/cards/o/ObscuringAether.java b/Mage.Sets/src/mage/cards/o/ObscuringAether.java index c72a91df644..294312f385b 100644 --- a/Mage.Sets/src/mage/cards/o/ObscuringAether.java +++ b/Mage.Sets/src/mage/cards/o/ObscuringAether.java @@ -5,14 +5,13 @@ 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.SpellsCostReductionControllerEffect; +import mage.abilities.effects.common.cost.MorphSpellsCostReductionControllerEffect; 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 mage.filter.predicate.card.FaceDownCastablePredicate; import java.util.UUID; @@ -21,17 +20,11 @@ import java.util.UUID; */ public final class ObscuringAether extends CardImpl { - private static final FilterCreatureCard filter = new FilterCreatureCard("Face-down creature spells"); - - static { - filter.add(FaceDownCastablePredicate.instance); - } - public ObscuringAether(UUID ownerId, CardSetInfo setInfo) { 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 SpellsCostReductionControllerEffect(filter, 1))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MorphSpellsCostReductionControllerEffect(1))); // {1}{G}: Turn Obscuring Aether face down. Effect effect = new BecomesFaceDownCreatureEffect(Duration.Custom, BecomesFaceDownCreatureEffect.FaceDownType.MANUAL); diff --git a/Mage/src/main/java/mage/abilities/effects/common/cost/MorphSpellsCostReductionControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/cost/MorphSpellsCostReductionControllerEffect.java new file mode 100644 index 00000000000..ffe11991641 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/cost/MorphSpellsCostReductionControllerEffect.java @@ -0,0 +1,33 @@ +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; + } +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/constants/SpellAbilityCastMode.java b/Mage/src/main/java/mage/constants/SpellAbilityCastMode.java index 1f4515f88d5..1401682d421 100644 --- a/Mage/src/main/java/mage/constants/SpellAbilityCastMode.java +++ b/Mage/src/main/java/mage/constants/SpellAbilityCastMode.java @@ -46,11 +46,12 @@ public enum SpellAbilityCastMode { if (this.equals(BESTOW)) { BestowAbility.becomeAura(cardCopy); } - if (this.isTransformed){ + if (this.isTransformed) { Card tmp = card.getSecondCardFace(); if (tmp != null) { cardCopy = tmp.copy(); } + } if (this.equals(MORPH)) { MorphAbility.setObjectToFaceDownCreature(cardCopy, game); } diff --git a/Mage/src/main/java/mage/filter/predicate/card/FaceDownCastablePredicate.java b/Mage/src/main/java/mage/filter/predicate/card/FaceDownCastablePredicate.java deleted file mode 100644 index 61f7fee6605..00000000000 --- a/Mage/src/main/java/mage/filter/predicate/card/FaceDownCastablePredicate.java +++ /dev/null @@ -1,24 +0,0 @@ -package mage.filter.predicate.card; - -import mage.abilities.keyword.MorphAbility; -import mage.cards.Card; -import mage.filter.predicate.Predicate; -import mage.game.Game; - -/** - * @author JayDi85 - */ -public enum FaceDownCastablePredicate implements Predicate { - instance; - - @Override - public boolean apply(Card input, Game game) { - // is card able to cast as face down - return input.getAbilities(game).containsClass(MorphAbility.class); - } - - @Override - public String toString() { - return "Face-down"; - } -} diff --git a/Mage/src/main/java/mage/game/stack/Spell.java b/Mage/src/main/java/mage/game/stack/Spell.java index 7bc08303fb3..221e9b44206 100644 --- a/Mage/src/main/java/mage/game/stack/Spell.java +++ b/Mage/src/main/java/mage/game/stack/Spell.java @@ -79,9 +79,6 @@ public class Spell extends StackObjectImpl implements Card { // simulate another side as new card (another code part in continues effect from disturb ability) affectedCard = TransformAbility.transformCardSpellStatic(card, card.getSecondCardFace(), game); } - if (ability.getSpellAbilityCastMode() == SpellAbilityCastMode.MORPH){ - this.faceDown = true; - } this.card = affectedCard; this.color = affectedCard.getColor(null).copy(); @@ -93,6 +90,12 @@ public class Spell extends StackObjectImpl implements Card { this.zoneChangeCounter = affectedCard.getZoneChangeCounter(game); // sync card's ZCC with spell (copy spell settings) this.ability = ability; this.ability.setControllerId(controllerId); + + if (ability.getSpellAbilityCastMode() == SpellAbilityCastMode.MORPH){ + this.faceDown = true; + this.getColor(game).setColor(null); + game.getState().getCreateMageObjectAttribute(this.getCard(), game).getSubtype().clear(); + } if (ability.getSpellAbilityType() == SpellAbilityType.SPLIT_FUSED) { // if this spell is going to be a copy, these abilities will be copied in copySpell if (!isCopy) {