diff --git a/Mage.Sets/src/mage/cards/a/AbominationOfGudul.java b/Mage.Sets/src/mage/cards/a/AbominationOfGudul.java index 6dd61ca85e0..dbb8fc51dec 100644 --- a/Mage.Sets/src/mage/cards/a/AbominationOfGudul.java +++ b/Mage.Sets/src/mage/cards/a/AbominationOfGudul.java @@ -35,7 +35,7 @@ public final class AbominationOfGudul extends CardImpl { this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(effect, true)); // Morph 2BGU - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{B}{G}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{B}{G}{U}"))); } private AbominationOfGudul(final AbominationOfGudul card) { diff --git a/Mage.Sets/src/mage/cards/a/AbzanGuide.java b/Mage.Sets/src/mage/cards/a/AbzanGuide.java index 7ea85c0b362..032f72f98dc 100644 --- a/Mage.Sets/src/mage/cards/a/AbzanGuide.java +++ b/Mage.Sets/src/mage/cards/a/AbzanGuide.java @@ -28,7 +28,7 @@ public final class AbzanGuide extends CardImpl { // Lifelink this.addAbility(LifelinkAbility.getInstance()); // Morph {2}{W}{B}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{W}{B}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{W}{B}{G}"))); } private AbzanGuide(final AbzanGuide card) { diff --git a/Mage.Sets/src/mage/cards/a/AcidSpewerDragon.java b/Mage.Sets/src/mage/cards/a/AcidSpewerDragon.java index a1c3acd22a9..59506f8a6cd 100644 --- a/Mage.Sets/src/mage/cards/a/AcidSpewerDragon.java +++ b/Mage.Sets/src/mage/cards/a/AcidSpewerDragon.java @@ -43,7 +43,7 @@ public final class AcidSpewerDragon extends CardImpl { this.addAbility(DeathtouchAbility.getInstance()); // Megamorph {5}{B}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{B}{B}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{B}{B}"), true)); // When Acid-Spewer Dragon is turned face up, put a +1/+1 counter on each other Dragon creature you control. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter), false, false)); diff --git a/Mage.Sets/src/mage/cards/a/ActOfAuthority.java b/Mage.Sets/src/mage/cards/a/ActOfAuthority.java index ece46dd7974..4bb24e7c8ff 100644 --- a/Mage.Sets/src/mage/cards/a/ActOfAuthority.java +++ b/Mage.Sets/src/mage/cards/a/ActOfAuthority.java @@ -66,10 +66,14 @@ class ActOfAuthorityEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Permanent targetPermanent = game.getPermanent(getTargetPointer().getFirst(game, source)); - if (targetPermanent == null) { return false; } + if (targetPermanent == null) { + return false; + } ExileTargetEffect exileTargetEffect = new ExileTargetEffect(); - if (!exileTargetEffect.apply(game, source)) { return false; } + if (!exileTargetEffect.apply(game, source)) { + return false; + } Permanent sourcePermanent = source.getSourcePermanentIfItStillExists(game); if (sourcePermanent == null) { return true; } @@ -111,7 +115,9 @@ class ActOfAuthorityGainControlEffect extends ContinuousEffectImpl { permanent = game.getPermanent(targetPointer.getFirst(game, source)); } - if (permanent == null) { return false; } + if (permanent == null) { + return false; + } return permanent.changeControllerId(controller, game, source); } diff --git a/Mage.Sets/src/mage/cards/a/AerieBowmasters.java b/Mage.Sets/src/mage/cards/a/AerieBowmasters.java index 2974c599e00..87059e1bcb2 100644 --- a/Mage.Sets/src/mage/cards/a/AerieBowmasters.java +++ b/Mage.Sets/src/mage/cards/a/AerieBowmasters.java @@ -28,7 +28,7 @@ public final class AerieBowmasters extends CardImpl { this.addAbility(ReachAbility.getInstance()); // Megamorph {5}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up at any time for its megamorph cost and put a +1/+1 counter on it.)) - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{G}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{G}"), true)); } diff --git a/Mage.Sets/src/mage/cards/a/Aetherspouts.java b/Mage.Sets/src/mage/cards/a/Aetherspouts.java index 3b1ff006ad2..cb7324fd9b8 100644 --- a/Mage.Sets/src/mage/cards/a/Aetherspouts.java +++ b/Mage.Sets/src/mage/cards/a/Aetherspouts.java @@ -72,7 +72,9 @@ class AetherspoutsEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { game.getPlayerList(); Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } PlayerList playerList = game.getState().getPlayersInRange(controller.getId(), game); playerList.setCurrent(game.getActivePlayerId()); diff --git a/Mage.Sets/src/mage/cards/a/AinokSurvivalist.java b/Mage.Sets/src/mage/cards/a/AinokSurvivalist.java index 5bd90d4a037..686b35850a7 100644 --- a/Mage.Sets/src/mage/cards/a/AinokSurvivalist.java +++ b/Mage.Sets/src/mage/cards/a/AinokSurvivalist.java @@ -37,7 +37,7 @@ public final class AinokSurvivalist extends CardImpl { this.toughness = new MageInt(1); // Megamorph {1}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{G}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{G}"), true)); // When Ainok Survivalist is turned face up, destroy target artifact or enchantment an opponent controls. Effect effect = new DestroyTargetEffect(); diff --git a/Mage.Sets/src/mage/cards/a/AinokTracker.java b/Mage.Sets/src/mage/cards/a/AinokTracker.java index 49e46b7ee23..05d2f6f26e2 100644 --- a/Mage.Sets/src/mage/cards/a/AinokTracker.java +++ b/Mage.Sets/src/mage/cards/a/AinokTracker.java @@ -28,7 +28,7 @@ public final class AinokTracker extends CardImpl { // First Strike this.addAbility(FirstStrikeAbility.getInstance()); // Morph 4R - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{R}"))); } private AinokTracker(final AinokTracker card) { diff --git a/Mage.Sets/src/mage/cards/a/AkoumHellkite.java b/Mage.Sets/src/mage/cards/a/AkoumHellkite.java index 7acbb125b48..3a79eb856ab 100644 --- a/Mage.Sets/src/mage/cards/a/AkoumHellkite.java +++ b/Mage.Sets/src/mage/cards/a/AkoumHellkite.java @@ -75,12 +75,18 @@ class AkoumHellkiteTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent == null) { return false; } + if (permanent == null) { + return false; + } - if (!permanent.isLand(game) || !permanent.isControlledBy(getControllerId())) { return false; } + if (!permanent.isLand(game) || !permanent.isControlledBy(getControllerId())) { + return false; + } Permanent sourcePermanent = game.getPermanent(getSourceId()); - if (sourcePermanent == null) { return false; } + if (sourcePermanent == null) { + return false; + } for (Effect effect : getEffects()) { if (effect instanceof AkoumHellkiteDamageEffect) { @@ -118,14 +124,18 @@ class AkoumHellkiteDamageEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Permanent land = getTargetPointer().getFirstTargetPermanentOrLKI(game, source); - if (land == null) { return false; } + if (land == null) { + return false; + } int damage = land.hasSubtype(SubType.MOUNTAIN, game) ? 2 : 1; // Get target for damange Player player = game.getPlayer(source.getFirstTarget()); Permanent permanent = game.getPermanent(source.getFirstTarget()); - if (player == null && permanent == null) { return false; } + if (player == null && permanent == null) { + return false; + } if (player != null) { // Target is a player diff --git a/Mage.Sets/src/mage/cards/a/AkromaAngelOfFury.java b/Mage.Sets/src/mage/cards/a/AkromaAngelOfFury.java index b59f541f47d..c11d159b774 100644 --- a/Mage.Sets/src/mage/cards/a/AkromaAngelOfFury.java +++ b/Mage.Sets/src/mage/cards/a/AkromaAngelOfFury.java @@ -41,7 +41,7 @@ public final class AkromaAngelOfFury extends CardImpl { // {R}: Akroma, Angel of Fury gets +1/+0 until end of turn. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1,0, Duration.EndOfTurn), new ManaCostsImpl<>("{R}"))); // Morph {3}{R}{R}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{R}{R}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{R}{R}{R}"))); } private AkromaAngelOfFury(final AkromaAngelOfFury card) { diff --git a/Mage.Sets/src/mage/cards/a/AlhammarretHighArbiter.java b/Mage.Sets/src/mage/cards/a/AlhammarretHighArbiter.java index f2436efc4e6..f9aa62b2269 100644 --- a/Mage.Sets/src/mage/cards/a/AlhammarretHighArbiter.java +++ b/Mage.Sets/src/mage/cards/a/AlhammarretHighArbiter.java @@ -1,10 +1,10 @@ package mage.cards.a; -import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.EntersBattlefieldEffect; @@ -15,13 +15,14 @@ import mage.constants.*; import mage.filter.common.FilterNonlandCard; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetCard; import mage.util.CardUtil; import mage.util.GameLog; +import java.util.UUID; + /** * * @author LevelX2 @@ -153,10 +154,15 @@ class AlhammarretHighArbiterCantCastEffect extends ContinuousRuleModifyingEffect @Override public boolean applies(GameEvent event, Ability source, Game game) { if (game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) { - MageObject object = game.getObject(event.getSourceId()); - if (object != null && object.getName().equals(cardName)) { - return true; + SpellAbility spellAbility = SpellAbility.getSpellAbilityFromEvent(event, game); + if (spellAbility == null) { + return false; } + Card card = spellAbility.getCharacteristics(game); + if (card == null) { + return false; + } + return CardUtil.haveSameNames(card, cardName, game); } return false; } diff --git a/Mage.Sets/src/mage/cards/a/AliFromCairo.java b/Mage.Sets/src/mage/cards/a/AliFromCairo.java index c3f369db71d..02bd9b5f22f 100644 --- a/Mage.Sets/src/mage/cards/a/AliFromCairo.java +++ b/Mage.Sets/src/mage/cards/a/AliFromCairo.java @@ -65,10 +65,14 @@ class AliFromCairoReplacementEffect extends ReplacementEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent == null) { return false; } + if (permanent == null) { + return false; + } Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } return (controller.getLife() > 0) && (controller.getLife() - event.getAmount()) < 1 && event.getPlayerId().equals(controller.getId()); @@ -77,7 +81,9 @@ class AliFromCairoReplacementEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } // 10/1/2008: The ability doesn't change how much damage is dealt; // it just changes how much life that damage makes you lose. diff --git a/Mage.Sets/src/mage/cards/a/AlignedHedronNetwork.java b/Mage.Sets/src/mage/cards/a/AlignedHedronNetwork.java index 29fda7b4c4a..36d5674c6c6 100644 --- a/Mage.Sets/src/mage/cards/a/AlignedHedronNetwork.java +++ b/Mage.Sets/src/mage/cards/a/AlignedHedronNetwork.java @@ -69,13 +69,19 @@ class AlignedHedronNetworkExileEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false;} + if (controller == null) { + return false; + } Permanent permanent = source.getSourcePermanentIfItStillExists(game); - if (permanent == null) { return false; } + if (permanent == null) { + return false; + } Set toExile = new LinkedHashSet<>(game.getBattlefield().getActivePermanents(filter, controller.getId(), source, game)); - if (toExile.isEmpty()) { return false; } + if (toExile.isEmpty()) { + return false; + } controller.moveCardsToExile(toExile, source, game, true, CardUtil.getCardExileZoneId(game, source), permanent.getIdName()); game.addDelayedTriggeredAbility(new OnLeaveReturnExiledAbility(), source); diff --git a/Mage.Sets/src/mage/cards/a/AllHallowsEve.java b/Mage.Sets/src/mage/cards/a/AllHallowsEve.java index 1b6e2b12496..0cc79d29177 100644 --- a/Mage.Sets/src/mage/cards/a/AllHallowsEve.java +++ b/Mage.Sets/src/mage/cards/a/AllHallowsEve.java @@ -79,11 +79,17 @@ class AllHallowsEveEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Card allHallowsEveCard = (Card) source.getSourceObject(game); - if (allHallowsEveCard == null) { return false; } + if (allHallowsEveCard == null) { + return false; + } Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } - if (allHallowsEveCard.getCounters(game).getCount(CounterType.SCREAM) > 0) { return false; } + if (allHallowsEveCard.getCounters(game).getCount(CounterType.SCREAM) > 0) { + return false; + } controller.moveCards(allHallowsEveCard, Zone.GRAVEYARD, source, game); Cards allCreatureCardsInGraveyards = new CardsImpl(); diff --git a/Mage.Sets/src/mage/cards/a/AnHavvaConstable.java b/Mage.Sets/src/mage/cards/a/AnHavvaConstable.java index 8687a4cbce9..2d8df1c4b73 100644 --- a/Mage.Sets/src/mage/cards/a/AnHavvaConstable.java +++ b/Mage.Sets/src/mage/cards/a/AnHavvaConstable.java @@ -61,10 +61,14 @@ class AnHavvaConstableEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } MageObject mageObject = game.getObject(source.getSourceId()); - if (mageObject == null) { return false; } + if (mageObject == null) { + return false; + } FilterCreaturePermanent filter = new FilterCreaturePermanent("green creatures"); filter.add(new ColorPredicate(ObjectColor.GREEN)); diff --git a/Mage.Sets/src/mage/cards/a/AphettoAlchemist.java b/Mage.Sets/src/mage/cards/a/AphettoAlchemist.java index 65a501c0392..9354278b290 100644 --- a/Mage.Sets/src/mage/cards/a/AphettoAlchemist.java +++ b/Mage.Sets/src/mage/cards/a/AphettoAlchemist.java @@ -45,7 +45,7 @@ public final class AphettoAlchemist extends CardImpl { this.addAbility(ability); // Morph {U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}"))); } private AphettoAlchemist(final AphettoAlchemist card) { diff --git a/Mage.Sets/src/mage/cards/a/AphettoExterminator.java b/Mage.Sets/src/mage/cards/a/AphettoExterminator.java index 8185548195d..ebb397b41a1 100644 --- a/Mage.Sets/src/mage/cards/a/AphettoExterminator.java +++ b/Mage.Sets/src/mage/cards/a/AphettoExterminator.java @@ -30,7 +30,7 @@ public final class AphettoExterminator extends CardImpl { this.toughness = new MageInt(1); // Morph {3}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{B}"))); // When Aphetto Exterminator is turned face up, target creature gets -3/-3 until end of turn. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new BoostTargetEffect(-3,-3,Duration.EndOfTurn)); diff --git a/Mage.Sets/src/mage/cards/a/AquamorphEntity.java b/Mage.Sets/src/mage/cards/a/AquamorphEntity.java index b4075b0fe3f..bab93c72206 100644 --- a/Mage.Sets/src/mage/cards/a/AquamorphEntity.java +++ b/Mage.Sets/src/mage/cards/a/AquamorphEntity.java @@ -38,7 +38,7 @@ public final class AquamorphEntity extends CardImpl { this.addAbility(ability); // Morph {2}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}"))); } private AquamorphEntity(final AquamorphEntity card) { diff --git a/Mage.Sets/src/mage/cards/a/AscendingAven.java b/Mage.Sets/src/mage/cards/a/AscendingAven.java index a05231d03ee..12ed19675e6 100644 --- a/Mage.Sets/src/mage/cards/a/AscendingAven.java +++ b/Mage.Sets/src/mage/cards/a/AscendingAven.java @@ -30,7 +30,7 @@ public final class AscendingAven extends CardImpl { // Ascending Aven can block only creatures with flying. this.addAbility(new CanBlockOnlyFlyingAbility()); // Morph {2}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}"))); } private AscendingAven(final AscendingAven card) { diff --git a/Mage.Sets/src/mage/cards/a/AshcloudPhoenix.java b/Mage.Sets/src/mage/cards/a/AshcloudPhoenix.java index 2eff5551692..63f338ce07a 100644 --- a/Mage.Sets/src/mage/cards/a/AshcloudPhoenix.java +++ b/Mage.Sets/src/mage/cards/a/AshcloudPhoenix.java @@ -39,7 +39,7 @@ public final class AshcloudPhoenix extends CardImpl { this.addAbility(new DiesSourceTriggeredAbility(new AshcloudPhoenixEffect())); // Morph {4}{R}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{R}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{R}{R}"))); // When Ashcloud Phoenix is turned face up, it deals 2 damage to each player. Effect effect = new DamagePlayersEffect(2, TargetController.ANY); diff --git a/Mage.Sets/src/mage/cards/a/AshioksErasure.java b/Mage.Sets/src/mage/cards/a/AshioksErasure.java index a1ff9f4dc41..a8a4273cb13 100644 --- a/Mage.Sets/src/mage/cards/a/AshioksErasure.java +++ b/Mage.Sets/src/mage/cards/a/AshioksErasure.java @@ -2,6 +2,7 @@ package mage.cards.a; import mage.MageObject; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.LeavesBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; @@ -116,7 +117,11 @@ class AshioksErasureReplacementEffect extends ContinuousRuleModifyingEffectImpl if (event.getPlayerId().equals(source.getControllerId())) { return false; } - Card card = game.getCard(event.getSourceId()); + SpellAbility spellAbility = SpellAbility.getSpellAbilityFromEvent(event, game); + if (spellAbility == null) { + return false; + } + Card card = spellAbility.getCharacteristics(game); if (sourcePermanent == null || card == null) { return false; diff --git a/Mage.Sets/src/mage/cards/a/AtarkaEfreet.java b/Mage.Sets/src/mage/cards/a/AtarkaEfreet.java index 03819557126..dc654494ca2 100644 --- a/Mage.Sets/src/mage/cards/a/AtarkaEfreet.java +++ b/Mage.Sets/src/mage/cards/a/AtarkaEfreet.java @@ -29,7 +29,7 @@ public final class AtarkaEfreet extends CardImpl { this.toughness = new MageInt(1); // Megamorph {2}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{R}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{R}"), true)); // When Atarka Efreet is turned face up, it deals 1 damage to any target. Effect effect = new DamageTargetEffect(1, "it"); diff --git a/Mage.Sets/src/mage/cards/a/AuraFinesse.java b/Mage.Sets/src/mage/cards/a/AuraFinesse.java index 8718fe85403..8a3a4413d32 100644 --- a/Mage.Sets/src/mage/cards/a/AuraFinesse.java +++ b/Mage.Sets/src/mage/cards/a/AuraFinesse.java @@ -76,7 +76,9 @@ class AuraFinesseEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } Permanent aura = game.getPermanent(source.getFirstTarget()); Permanent creature = game.getPermanent(source.getTargets().get(1).getFirstTarget()); diff --git a/Mage.Sets/src/mage/cards/a/AutumnWillow.java b/Mage.Sets/src/mage/cards/a/AutumnWillow.java index 5a6173644ac..34f9d8a3530 100644 --- a/Mage.Sets/src/mage/cards/a/AutumnWillow.java +++ b/Mage.Sets/src/mage/cards/a/AutumnWillow.java @@ -70,7 +70,9 @@ class AutumnWillowEffect extends AsThoughEffectImpl { @Override public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) { - if (!affectedControllerId.equals(source.getFirstTarget())) { return false; } + if (!affectedControllerId.equals(source.getFirstTarget())) { + return false; + } Permanent creature = game.getPermanent(sourceId); return creature != null &&sourceId.equals(source.getSourceId()); diff --git a/Mage.Sets/src/mage/cards/a/AvenLiberator.java b/Mage.Sets/src/mage/cards/a/AvenLiberator.java index c61f2d1ed78..69de055a7bb 100644 --- a/Mage.Sets/src/mage/cards/a/AvenLiberator.java +++ b/Mage.Sets/src/mage/cards/a/AvenLiberator.java @@ -32,7 +32,7 @@ public final class AvenLiberator extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Morph {3}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{W}"))); // When Aven Liberator is turned face up, target creature you control gains protection from the color of your choice until end of turn. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new GainProtectionFromColorTargetEffect(Duration.EndOfTurn)); ability.addTarget(new TargetControlledCreaturePermanent()); diff --git a/Mage.Sets/src/mage/cards/a/AvenSunstriker.java b/Mage.Sets/src/mage/cards/a/AvenSunstriker.java index 91ce73b0f08..a3d8b79d447 100644 --- a/Mage.Sets/src/mage/cards/a/AvenSunstriker.java +++ b/Mage.Sets/src/mage/cards/a/AvenSunstriker.java @@ -30,7 +30,7 @@ public final class AvenSunstriker extends CardImpl { // Double strike this.addAbility(DoubleStrikeAbility.getInstance()); // Megamorph {4}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{W}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{W}"), true)); } private AvenSunstriker(final AvenSunstriker card) { diff --git a/Mage.Sets/src/mage/cards/a/AzorsGateway.java b/Mage.Sets/src/mage/cards/a/AzorsGateway.java index a50a20827db..08dacfb1d47 100644 --- a/Mage.Sets/src/mage/cards/a/AzorsGateway.java +++ b/Mage.Sets/src/mage/cards/a/AzorsGateway.java @@ -78,10 +78,14 @@ class AzorsGatewayEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } MageObject sourceObject = source.getSourceObject(game); - if (sourceObject == null) { return false; } + if (sourceObject == null) { + return false; + } UUID exileId = CardUtil.getCardExileZoneId(game, source); diff --git a/Mage.Sets/src/mage/cards/b/BaneOfTheLiving.java b/Mage.Sets/src/mage/cards/b/BaneOfTheLiving.java index 319c5a976a3..87636858b54 100644 --- a/Mage.Sets/src/mage/cards/b/BaneOfTheLiving.java +++ b/Mage.Sets/src/mage/cards/b/BaneOfTheLiving.java @@ -31,7 +31,7 @@ public final class BaneOfTheLiving extends CardImpl { this.toughness = new MageInt(3); // Morph {X}{B}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{X}{B}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{X}{B}{B}"))); // When Bane of the Living is turned face up, all creatures get -X/-X until end of turn. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new BoostAllEffect(morphX, morphX, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_ALL_CREATURES, false, null))); diff --git a/Mage.Sets/src/mage/cards/b/Banefire.java b/Mage.Sets/src/mage/cards/b/Banefire.java index 5a1a3f57856..a28fa7ddd20 100644 --- a/Mage.Sets/src/mage/cards/b/Banefire.java +++ b/Mage.Sets/src/mage/cards/b/Banefire.java @@ -131,10 +131,14 @@ class BanefireCantCounterEffect extends ContinuousRuleModifyingEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { Card card = game.getCard(source.getSourceId()); - if (card == null) { return false; } + if (card == null) { + return false; + } UUID spellId = card.getSpellAbility().getId(); - if (!event.getTargetId().equals(spellId)) { return false; } + if (!event.getTargetId().equals(spellId)) { + return false; + } return condition.apply(game, source); } diff --git a/Mage.Sets/src/mage/cards/b/BanthaHerd.java b/Mage.Sets/src/mage/cards/b/BanthaHerd.java index 6c2411c9868..84a9c99ef79 100644 --- a/Mage.Sets/src/mage/cards/b/BanthaHerd.java +++ b/Mage.Sets/src/mage/cards/b/BanthaHerd.java @@ -65,7 +65,9 @@ class BathaHerdEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } int xValue = ((BecomesMonstrousSourceTriggeredAbility) source).getMonstrosityValue(); diff --git a/Mage.Sets/src/mage/cards/b/BatheInLight.java b/Mage.Sets/src/mage/cards/b/BatheInLight.java index e6fcafbb495..5a9bc5a2822 100644 --- a/Mage.Sets/src/mage/cards/b/BatheInLight.java +++ b/Mage.Sets/src/mage/cards/b/BatheInLight.java @@ -70,13 +70,19 @@ class BatheInLightEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } Permanent target = game.getPermanent(getTargetPointer().getFirst(game, source)); - if (target == null) { return false; } + if (target == null) { + return false; + } ChoiceColor colorChoice = new ChoiceColor(); - if (!controller.choose(Outcome.Benefit, colorChoice, game)) { return false; } + if (!controller.choose(Outcome.Benefit, colorChoice, game)) { + return false; + } game.informPlayers(target.getName() + ": " + controller.getLogName() + " has chosen " + colorChoice.getChoice()); game.getState().setValue(target.getId() + "_color", colorChoice.getColor()); @@ -126,7 +132,9 @@ class ProtectionChosenColorTargetEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); - if (permanent == null) { return false; } + if (permanent == null) { + return false; + } ObjectColor color = (ObjectColor) game.getState().getValue(permanent.getId() + "_color"); if (color != null && (protectionAbility == null || !color.equals(chosenColor))) { diff --git a/Mage.Sets/src/mage/cards/b/BatteringCraghorn.java b/Mage.Sets/src/mage/cards/b/BatteringCraghorn.java index 458d341982b..6d011454100 100644 --- a/Mage.Sets/src/mage/cards/b/BatteringCraghorn.java +++ b/Mage.Sets/src/mage/cards/b/BatteringCraghorn.java @@ -27,7 +27,7 @@ public final class BatteringCraghorn extends CardImpl { // First strike this.addAbility(FirstStrikeAbility.getInstance()); // Morph {1}{R}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{R}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{R}{R}"))); } private BatteringCraghorn(final BatteringCraghorn card) { diff --git a/Mage.Sets/src/mage/cards/b/BelltollDragon.java b/Mage.Sets/src/mage/cards/b/BelltollDragon.java index a8bbb7aebed..eed8a545ed9 100644 --- a/Mage.Sets/src/mage/cards/b/BelltollDragon.java +++ b/Mage.Sets/src/mage/cards/b/BelltollDragon.java @@ -41,7 +41,7 @@ public final class BelltollDragon extends CardImpl { // Hexproof this.addAbility(HexproofAbility.getInstance()); // Megamorph {5}{U}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{U}{U}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{U}{U}"), true)); // When Belltoll Dragon is turned face up, put a +1/+1 counter on each other Dragon creature you control. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter), false, false)); diff --git a/Mage.Sets/src/mage/cards/b/BendOrBreak.java b/Mage.Sets/src/mage/cards/b/BendOrBreak.java index 3eb86922f38..7d5a2527d8b 100644 --- a/Mage.Sets/src/mage/cards/b/BendOrBreak.java +++ b/Mage.Sets/src/mage/cards/b/BendOrBreak.java @@ -64,7 +64,9 @@ class BendOrBreakEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } // Map of players and their piles Map>> playerPermanents = new LinkedHashMap<>(); diff --git a/Mage.Sets/src/mage/cards/b/BenevolentOffering.java b/Mage.Sets/src/mage/cards/b/BenevolentOffering.java index ba3d3199418..61dc75ff803 100644 --- a/Mage.Sets/src/mage/cards/b/BenevolentOffering.java +++ b/Mage.Sets/src/mage/cards/b/BenevolentOffering.java @@ -63,12 +63,16 @@ class BenevolentOfferingEffect1 extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } Target target = new TargetOpponent(true); target.choose(Outcome.Sacrifice, source.getControllerId(), source.getSourceId(), source, game); Player opponent = game.getPlayer(target.getFirstTarget()); - if (opponent == null) { return false; } + if (opponent == null) { + return false; + } Effect effect = new CreateTokenTargetEffect(new SpiritWhiteToken(), 3); effect.setTargetPointer(new FixedTarget(opponent.getId())); @@ -97,12 +101,16 @@ class BenevolentOfferingEffect2 extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } Target target = new TargetOpponent(true); target.choose(Outcome.Sacrifice, source.getControllerId(), source.getSourceId(), source, game); Player opponent = game.getPlayer(target.getFirstTarget()); - if (opponent == null) { return false; } + if (opponent == null) { + return false; + } int count = game.getBattlefield().countAll(StaticFilters.FILTER_PERMANENT_CREATURE, controller.getId(), game) * 2; controller.gainLife(count, game, source); diff --git a/Mage.Sets/src/mage/cards/b/Berserk.java b/Mage.Sets/src/mage/cards/b/Berserk.java index bb68008af78..ec13f4322ae 100644 --- a/Mage.Sets/src/mage/cards/b/Berserk.java +++ b/Mage.Sets/src/mage/cards/b/Berserk.java @@ -127,7 +127,9 @@ class BerserkDestroyEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } //create delayed triggered ability Effect effect = new BerserkDelayedDestroyEffect(); @@ -158,13 +160,19 @@ class BerserkDelayedDestroyEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); - if (permanent == null) { return false; } + if (permanent == null) { + return false; + } AttackedThisTurnWatcher watcher = game.getState().getWatcher(AttackedThisTurnWatcher.class); - if (watcher == null) { return false; } + if (watcher == null) { + return false; + } return watcher.getAttackedThisTurnCreatures().contains(new MageObjectReference(permanent, game)) && permanent.destroy(source, game, false); diff --git a/Mage.Sets/src/mage/cards/b/BiomanticMastery.java b/Mage.Sets/src/mage/cards/b/BiomanticMastery.java index 882fd7e8d7e..1b53e893da6 100644 --- a/Mage.Sets/src/mage/cards/b/BiomanticMastery.java +++ b/Mage.Sets/src/mage/cards/b/BiomanticMastery.java @@ -57,7 +57,9 @@ class BiomanticMasteryEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } for (UUID playerId : getTargetPointer().getTargets(game, source)) { Player player = game.getPlayer(playerId); diff --git a/Mage.Sets/src/mage/cards/b/BirchloreRangers.java b/Mage.Sets/src/mage/cards/b/BirchloreRangers.java index 45a7dc96ae9..0ef117efbe6 100644 --- a/Mage.Sets/src/mage/cards/b/BirchloreRangers.java +++ b/Mage.Sets/src/mage/cards/b/BirchloreRangers.java @@ -45,7 +45,7 @@ public final class BirchloreRangers extends CardImpl { new TapTargetCost(new TargetControlledCreaturePermanent(2, 2, filter, false)))); // Morph {G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{G}"))); } private BirchloreRangers(final BirchloreRangers card) { diff --git a/Mage.Sets/src/mage/cards/b/BitterFeud.java b/Mage.Sets/src/mage/cards/b/BitterFeud.java index f6d768010f0..6474c0ef091 100644 --- a/Mage.Sets/src/mage/cards/b/BitterFeud.java +++ b/Mage.Sets/src/mage/cards/b/BitterFeud.java @@ -63,20 +63,30 @@ class BitterFeudEntersBattlefieldEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } Permanent permanent = game.getPermanentEntering(source.getSourceId()); - if (permanent == null) { return false; } + if (permanent == null) { + return false; + } TargetPlayer target = new TargetPlayer(2, 2, true); controller.chooseTarget(outcome, target, source, game); Player player1 = game.getPlayer(target.getFirstTarget()); - if (player1 == null) { return false; } + if (player1 == null) { + return false; + } - if (target.getTargets().size() <= 1) { return false; } + if (target.getTargets().size() <= 1) { + return false; + } Player player2 = game.getPlayer(target.getTargets().get(1)); - if (player2 == null) { return false; } + if (player2 == null) { + return false; + } game.getState().setValue(source.getSourceId() + "_player1", player1); game.getState().setValue(source.getSourceId() + "_player2", player2); @@ -122,10 +132,14 @@ class BitterFeudEffect extends ReplacementEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { player1 = (Player) game.getState().getValue(source.getSourceId() + "_player1"); - if (player1 == null) { return false; } + if (player1 == null) { + return false; + } player2 = (Player) game.getState().getValue(source.getSourceId() + "_player2"); - if (player2 == null) { return false; } + if (player2 == null) { + return false; + } UUID targetPlayerId; switch (event.getType()) { @@ -134,7 +148,9 @@ class BitterFeudEffect extends ReplacementEffectImpl { break; case DAMAGE_PERMANENT: Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent == null) { return false; } + if (permanent == null) { + return false; + } targetPlayerId = permanent.getControllerId(); break; @@ -142,7 +158,9 @@ class BitterFeudEffect extends ReplacementEffectImpl { return false; } - if (!player1.getId().equals(targetPlayerId) && !player2.getId().equals(targetPlayerId)) { return false; } + if (!player1.getId().equals(targetPlayerId) && !player2.getId().equals(targetPlayerId)) { + return false; + } UUID sourcePlayerId; MageObject damageSource = game.getObject(event.getSourceId()); diff --git a/Mage.Sets/src/mage/cards/b/BlinkmothInfusion.java b/Mage.Sets/src/mage/cards/b/BlinkmothInfusion.java index 90291071c08..22dc499105b 100644 --- a/Mage.Sets/src/mage/cards/b/BlinkmothInfusion.java +++ b/Mage.Sets/src/mage/cards/b/BlinkmothInfusion.java @@ -54,7 +54,9 @@ class UntapAllArtifactsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - if (player == null) { return false; } + if (player == null) { + return false; + } for (Permanent artifact: game.getBattlefield().getAllActivePermanents(new FilterArtifactPermanent(), game)) { artifact.untap(game); diff --git a/Mage.Sets/src/mage/cards/b/BlisteringFirecat.java b/Mage.Sets/src/mage/cards/b/BlisteringFirecat.java index 70db093376a..a614548fed7 100644 --- a/Mage.Sets/src/mage/cards/b/BlisteringFirecat.java +++ b/Mage.Sets/src/mage/cards/b/BlisteringFirecat.java @@ -35,7 +35,7 @@ public final class BlisteringFirecat extends CardImpl { // At the beginning of the end step, sacrifice Blistering Firecat. this.addAbility(new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new SacrificeSourceEffect())); // Morph {R}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{R}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{R}{R}"))); } private BlisteringFirecat(final BlisteringFirecat card) { diff --git a/Mage.Sets/src/mage/cards/b/BloodBaronOfVizkopa.java b/Mage.Sets/src/mage/cards/b/BloodBaronOfVizkopa.java index 0137ca84c6b..800dce00207 100644 --- a/Mage.Sets/src/mage/cards/b/BloodBaronOfVizkopa.java +++ b/Mage.Sets/src/mage/cards/b/BloodBaronOfVizkopa.java @@ -63,10 +63,14 @@ class BloodBaronOfVizkopaEffect extends ContinuousEffectImpl { @Override public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { - if (!conditionState(source, game)) { return false; } + if (!conditionState(source, game)) { + return false; + } Permanent creature = game.getPermanent(source.getSourceId()); - if (creature == null) { return false; } + if (creature == null) { + return false; + } switch (layer) { case PTChangingEffects_7: @@ -89,15 +93,23 @@ class BloodBaronOfVizkopaEffect extends ContinuousEffectImpl { private boolean conditionState(Ability source, Game game) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } - if (controller.getLife() < 30) { return false; } + if (controller.getLife() < 30) { + return false; + } for (UUID opponentId : game.getState().getPlayersInRange(controller.getId(), game)) { - if (!controller.hasOpponent(opponentId, game)) { return false; } + if (!controller.hasOpponent(opponentId, game)) { + return false; + } Player opponent = game.getPlayer(opponentId); - if (opponent == null) { return false; } + if (opponent == null) { + return false; + } return opponent.getLife() < 11; } diff --git a/Mage.Sets/src/mage/cards/b/BloodlineShaman.java b/Mage.Sets/src/mage/cards/b/BloodlineShaman.java index b2d2b8d41f4..afca519fbc8 100644 --- a/Mage.Sets/src/mage/cards/b/BloodlineShaman.java +++ b/Mage.Sets/src/mage/cards/b/BloodlineShaman.java @@ -67,13 +67,19 @@ class BloodlineShamanEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } MageObject sourceObject = game.getObject(source.getSourceId()); - if (sourceObject == null) { return false; } + if (sourceObject == null) { + return false; + } Choice typeChoice = new ChoiceCreatureType(sourceObject); - if (!controller.choose(outcome, typeChoice, game)) { return false; } + if (!controller.choose(outcome, typeChoice, game)) { + return false; + } game.informPlayers(sourceObject.getLogName() + " chosen type: " + typeChoice.getChoice()); FilterCard filterSubtype = new FilterCard(); diff --git a/Mage.Sets/src/mage/cards/b/BloodstokeHowler.java b/Mage.Sets/src/mage/cards/b/BloodstokeHowler.java index 748d0b75137..d049480eb81 100644 --- a/Mage.Sets/src/mage/cards/b/BloodstokeHowler.java +++ b/Mage.Sets/src/mage/cards/b/BloodstokeHowler.java @@ -30,7 +30,7 @@ public final class BloodstokeHowler extends CardImpl { this.toughness = new MageInt(4); // Morph {6}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{6}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{6}{R}"))); // When Bloodstoke Howler is turned face up, Beast creatures you control get +3/+0 until end of turn. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new BoostControlledEffect(3, 0, Duration.EndOfTurn, filter))); diff --git a/Mage.Sets/src/mage/cards/b/Boneknitter.java b/Mage.Sets/src/mage/cards/b/Boneknitter.java index 5bf935c3353..a3136c60f97 100644 --- a/Mage.Sets/src/mage/cards/b/Boneknitter.java +++ b/Mage.Sets/src/mage/cards/b/Boneknitter.java @@ -40,7 +40,7 @@ public final class Boneknitter extends CardImpl { ability.addTarget(new TargetPermanent(filter)); this.addAbility(ability); // Morph {2}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{B}"))); } private Boneknitter(final Boneknitter card) { diff --git a/Mage.Sets/src/mage/cards/b/BoneyardScourge.java b/Mage.Sets/src/mage/cards/b/BoneyardScourge.java index 482c8f968f1..a7386bf56af 100644 --- a/Mage.Sets/src/mage/cards/b/BoneyardScourge.java +++ b/Mage.Sets/src/mage/cards/b/BoneyardScourge.java @@ -90,7 +90,9 @@ class DiesWhileInGraveyardTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (!zEvent.isDiesEvent()) { return false; } + if (!zEvent.isDiesEvent()) { + return false; + } for (Zone z : Zone.values()) { if (game.getShortLivingLKI(sourceId, z) && z != Zone.GRAVEYARD) { diff --git a/Mage.Sets/src/mage/cards/b/BoonweaverGiant.java b/Mage.Sets/src/mage/cards/b/BoonweaverGiant.java index 2edfe6f90b4..0e42b40b395 100644 --- a/Mage.Sets/src/mage/cards/b/BoonweaverGiant.java +++ b/Mage.Sets/src/mage/cards/b/BoonweaverGiant.java @@ -71,7 +71,9 @@ class BoonweaverGiantEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } Permanent sourcePermanent = source.getSourcePermanentIfItStillExists(game); UUID sourcePermanentId = sourcePermanent == null ? null : sourcePermanent.getId(); diff --git a/Mage.Sets/src/mage/cards/b/BosiumStrip.java b/Mage.Sets/src/mage/cards/b/BosiumStrip.java index 37323949c4b..1994017d7cc 100644 --- a/Mage.Sets/src/mage/cards/b/BosiumStrip.java +++ b/Mage.Sets/src/mage/cards/b/BosiumStrip.java @@ -109,10 +109,14 @@ class BosiumStripReplacementEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } Card card = (Card) game.getState().getValue("BosiumStrip"); - if (card == null) { return false; } + if (card == null) { + return false; + } ((ZoneChangeEvent) event).setToZone(Zone.EXILED); return true; @@ -126,12 +130,18 @@ class BosiumStripReplacementEffect extends ReplacementEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getToZone() != Zone.GRAVEYARD) { return false; } + if (zEvent.getToZone() != Zone.GRAVEYARD) { + return false; + } Card card = game.getCard(event.getSourceId()); - if (card == null) { return false; } + if (card == null) { + return false; + } - if (!StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY.match(card, game)) { return false; } + if (!StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY.match(card, game)) { + return false; + } CastFromGraveyardWatcher watcher = game.getState().getWatcher(CastFromGraveyardWatcher.class); return watcher != null diff --git a/Mage.Sets/src/mage/cards/b/BountyOfTheLuxa.java b/Mage.Sets/src/mage/cards/b/BountyOfTheLuxa.java index 0981b8ebe27..3e62a36fd02 100644 --- a/Mage.Sets/src/mage/cards/b/BountyOfTheLuxa.java +++ b/Mage.Sets/src/mage/cards/b/BountyOfTheLuxa.java @@ -68,7 +68,9 @@ class BountyOfTheLuxaEffect extends OneShotEffect { if (bountyOfLuxa != null && bountyOfLuxa.getZoneChangeCounter(game) != source.getSourceObjectZoneChangeCounter()) { bountyOfLuxa = null; } - if (controller == null) { return false; } + if (controller == null) { + return false; + } if (bountyOfLuxa != null && bountyOfLuxa.getCounters(game).getCount(CounterType.FLOOD) > 0) { diff --git a/Mage.Sets/src/mage/cards/b/BraceForImpact.java b/Mage.Sets/src/mage/cards/b/BraceForImpact.java index 1f7727374aa..c2e8024d2ac 100644 --- a/Mage.Sets/src/mage/cards/b/BraceForImpact.java +++ b/Mage.Sets/src/mage/cards/b/BraceForImpact.java @@ -72,7 +72,9 @@ class BraceForImpactPreventDamageTargetEffect extends PreventionEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { GameEvent preventEvent = new PreventDamageEvent(event.getTargetId(), source.getSourceId(), source, source.getControllerId(), event.getAmount(), ((DamageEvent) event).isCombatDamage()); - if (game.replaceEvent(preventEvent)) { return false; } + if (game.replaceEvent(preventEvent)) { + return false; + } int prevented; int damage = event.getAmount(); event.setAmount(0); diff --git a/Mage.Sets/src/mage/cards/b/BranchsnapLorian.java b/Mage.Sets/src/mage/cards/b/BranchsnapLorian.java index 7f04dd442e0..54f21bed30a 100644 --- a/Mage.Sets/src/mage/cards/b/BranchsnapLorian.java +++ b/Mage.Sets/src/mage/cards/b/BranchsnapLorian.java @@ -26,7 +26,7 @@ public final class BranchsnapLorian extends CardImpl { // Trample this.addAbility(TrampleAbility.getInstance()); // Morph {G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{G}"))); } private BranchsnapLorian(final BranchsnapLorian card) { diff --git a/Mage.Sets/src/mage/cards/b/BridgeFromBelow.java b/Mage.Sets/src/mage/cards/b/BridgeFromBelow.java index feda01b40de..dedb23d9374 100644 --- a/Mage.Sets/src/mage/cards/b/BridgeFromBelow.java +++ b/Mage.Sets/src/mage/cards/b/BridgeFromBelow.java @@ -83,10 +83,14 @@ class BridgeFromBelowAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (!zEvent.isDiesEvent()) { return false; } + if (!zEvent.isDiesEvent()) { + return false; + } Permanent permanent = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); - if (permanent == null) { return false; } + if (permanent == null) { + return false; + } return filter.match(permanent, controllerId, this, game); } diff --git a/Mage.Sets/src/mage/cards/b/Brightflame.java b/Mage.Sets/src/mage/cards/b/Brightflame.java index c9e29c28290..4dfbe521dcf 100644 --- a/Mage.Sets/src/mage/cards/b/Brightflame.java +++ b/Mage.Sets/src/mage/cards/b/Brightflame.java @@ -67,7 +67,9 @@ class BrightflameEffect extends OneShotEffect { int damageDealt = 0; Permanent target = game.getPermanent(targetPointer.getFirst(game, source)); - if (target == null) { return false; } + if (target == null) { + return false; + } ObjectColor color = target.getColor(game); damageDealt += target.damage(amount.calculate(game, source, this), source.getSourceId(), source, game); diff --git a/Mage.Sets/src/mage/cards/b/BrimazKingOfOreskos.java b/Mage.Sets/src/mage/cards/b/BrimazKingOfOreskos.java index 63a18263cf3..2e9bc76f106 100644 --- a/Mage.Sets/src/mage/cards/b/BrimazKingOfOreskos.java +++ b/Mage.Sets/src/mage/cards/b/BrimazKingOfOreskos.java @@ -75,7 +75,9 @@ class BrimazKingOfOreskosEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } Token token = new CatSoldierCreatureToken(); token.putOntoBattlefield(1, game, source, source.getControllerId()); diff --git a/Mage.Sets/src/mage/cards/b/BrineElemental.java b/Mage.Sets/src/mage/cards/b/BrineElemental.java index 61ca466a154..ad503122366 100644 --- a/Mage.Sets/src/mage/cards/b/BrineElemental.java +++ b/Mage.Sets/src/mage/cards/b/BrineElemental.java @@ -32,7 +32,7 @@ public final class BrineElemental extends CardImpl { this.toughness = new MageInt(4); // Morph {5}{U}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{U}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{U}{U}"))); // When Brine Elemental is turned face up, each opponent skips their next untap step. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new BrineElementalEffect())); diff --git a/Mage.Sets/src/mage/cards/b/BroodhatchNantuko.java b/Mage.Sets/src/mage/cards/b/BroodhatchNantuko.java index 44c86ea0107..4bf877e1617 100644 --- a/Mage.Sets/src/mage/cards/b/BroodhatchNantuko.java +++ b/Mage.Sets/src/mage/cards/b/BroodhatchNantuko.java @@ -30,7 +30,7 @@ public final class BroodhatchNantuko extends CardImpl { new CreateTokenEffect(new InsectToken(), SavedDamageValue.MANY), true)); // Morph {2}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{G}"))); } private BroodhatchNantuko(final BroodhatchNantuko card) { diff --git a/Mage.Sets/src/mage/cards/b/BrunaLightOfAlabaster.java b/Mage.Sets/src/mage/cards/b/BrunaLightOfAlabaster.java index 0989a34e3bd..75b8a624ed1 100644 --- a/Mage.Sets/src/mage/cards/b/BrunaLightOfAlabaster.java +++ b/Mage.Sets/src/mage/cards/b/BrunaLightOfAlabaster.java @@ -76,7 +76,9 @@ class BrunaLightOfAlabasterEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } UUID bruna = source.getSourceId(); @@ -91,7 +93,9 @@ class BrunaLightOfAlabasterEffect extends OneShotEffect { filterAuraCard.add(new AuraCardCanAttachToPermanentId(bruna)); Permanent sourcePermanent = game.getPermanent(source.getSourceId()); - if (sourcePermanent == null) { return false; } + if (sourcePermanent == null) { + return false; + } List fromBattlefield = new ArrayList<>(); List fromHandGraveyard = new ArrayList<>(); diff --git a/Mage.Sets/src/mage/cards/b/BudokaGardener.java b/Mage.Sets/src/mage/cards/b/BudokaGardener.java index 58880e0e258..f16b53069e7 100644 --- a/Mage.Sets/src/mage/cards/b/BudokaGardener.java +++ b/Mage.Sets/src/mage/cards/b/BudokaGardener.java @@ -72,7 +72,9 @@ class BudokaGardenerEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } if (game.getBattlefield().count(filterLands, source.getControllerId(), source, game) < 10) { return false; } diff --git a/Mage.Sets/src/mage/cards/b/BurnFromWithin.java b/Mage.Sets/src/mage/cards/b/BurnFromWithin.java index fdb36a0c625..12e3befcda8 100644 --- a/Mage.Sets/src/mage/cards/b/BurnFromWithin.java +++ b/Mage.Sets/src/mage/cards/b/BurnFromWithin.java @@ -65,7 +65,9 @@ class BurnFromWithinEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } int amount = source.getManaCostsToPay().getX(); diff --git a/Mage.Sets/src/mage/cards/c/CabalExecutioner.java b/Mage.Sets/src/mage/cards/c/CabalExecutioner.java index da362ef4cf5..f70b2370cc2 100644 --- a/Mage.Sets/src/mage/cards/c/CabalExecutioner.java +++ b/Mage.Sets/src/mage/cards/c/CabalExecutioner.java @@ -29,7 +29,7 @@ public final class CabalExecutioner extends CardImpl { this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new SacrificeEffect(StaticFilters.FILTER_PERMANENT_A_CREATURE, 1, "that player"), false, true)); // Morph {3}{B}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{B}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{B}{B}"))); } private CabalExecutioner(final CabalExecutioner card) { diff --git a/Mage.Sets/src/mage/cards/c/CanyonLurkers.java b/Mage.Sets/src/mage/cards/c/CanyonLurkers.java index e9cc2c3b097..f1d265583a9 100644 --- a/Mage.Sets/src/mage/cards/c/CanyonLurkers.java +++ b/Mage.Sets/src/mage/cards/c/CanyonLurkers.java @@ -25,7 +25,7 @@ public final class CanyonLurkers extends CardImpl { this.toughness = new MageInt(2); // Morph 3R - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{R}"))); } private CanyonLurkers(final CanyonLurkers card) { diff --git a/Mage.Sets/src/mage/cards/c/ChainerNightmareAdept.java b/Mage.Sets/src/mage/cards/c/ChainerNightmareAdept.java index 08dae62107d..2faa3d47b01 100644 --- a/Mage.Sets/src/mage/cards/c/ChainerNightmareAdept.java +++ b/Mage.Sets/src/mage/cards/c/ChainerNightmareAdept.java @@ -3,6 +3,7 @@ package mage.cards.c; import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; import mage.abilities.costs.common.DiscardCardCost; @@ -92,18 +93,21 @@ class ChainerNightmareAdeptContinuousEffect extends AsThoughEffectImpl { } @Override - public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) { + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + throw new IllegalArgumentException("Wrong code usage: can't call applies method on empty affectedAbility"); + } + @Override + public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) { ChainerNightmareAdeptWatcher watcher = game.getState().getWatcher(ChainerNightmareAdeptWatcher.class); if (watcher == null || !watcher.checkPermission( - affectedControllerId, source, game - ) || game.getState().getZone(sourceId) != Zone.GRAVEYARD) { + playerId, source, game + ) || game.getState().getZone(objectId) != Zone.GRAVEYARD) { return false; } - Card card = game.getCard(sourceId); - return card != null - && card.getOwnerId().equals(affectedControllerId) - && card.isCreature(game) - && !card.isLand(game); + Card card = game.getCard(objectId); + return card != null && affectedAbility instanceof SpellAbility + && card.getOwnerId().equals(playerId) + && ((SpellAbility) affectedAbility).getCharacteristics(game).isCreature(); } } diff --git a/Mage.Sets/src/mage/cards/c/ChandraDressedToKill.java b/Mage.Sets/src/mage/cards/c/ChandraDressedToKill.java index f87cbc854dd..f168b6b8e42 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraDressedToKill.java +++ b/Mage.Sets/src/mage/cards/c/ChandraDressedToKill.java @@ -7,6 +7,7 @@ import mage.MageObject; import mage.Mana; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; +import mage.abilities.SpellAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -165,10 +166,10 @@ class ChandraDressedToKillPlayEffect extends PlayFromNotOwnHandZoneTargetEffect @Override public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) { - if (!super.applies(objectId, affectedAbility, source, game, playerId)) { + if (!(super.applies(objectId, affectedAbility, source, game, playerId) && affectedAbility instanceof SpellAbility)) { return false; } - Card card = game.getCard(objectId); + Card card = ((SpellAbility) affectedAbility).getCharacteristics(game); return card != null && card.getColor(game).isRed(); } } diff --git a/Mage.Sets/src/mage/cards/c/ChargingSlateback.java b/Mage.Sets/src/mage/cards/c/ChargingSlateback.java index 1b047d14eae..546e8f54a8e 100644 --- a/Mage.Sets/src/mage/cards/c/ChargingSlateback.java +++ b/Mage.Sets/src/mage/cards/c/ChargingSlateback.java @@ -26,7 +26,7 @@ public final class ChargingSlateback extends CardImpl { // Charging Slateback can't block. this.addAbility(new CantBlockAbility()); // Morph {4}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{R}"))); } private ChargingSlateback(final ChargingSlateback card) { diff --git a/Mage.Sets/src/mage/cards/c/ChromeshellCrab.java b/Mage.Sets/src/mage/cards/c/ChromeshellCrab.java index 1670257145d..582981243d5 100644 --- a/Mage.Sets/src/mage/cards/c/ChromeshellCrab.java +++ b/Mage.Sets/src/mage/cards/c/ChromeshellCrab.java @@ -34,7 +34,7 @@ public final class ChromeshellCrab extends CardImpl { this.toughness = new MageInt(3); // Morph {4}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{U}"))); // When Chromeshell Crab is turned face up, you may exchange control of target creature you control and target creature an opponent controls. Effect effect = new ExchangeControlTargetEffect(Duration.EndOfGame, rule, false, true); diff --git a/Mage.Sets/src/mage/cards/c/CoralTrickster.java b/Mage.Sets/src/mage/cards/c/CoralTrickster.java index f6b755b0a91..3330fe93efc 100644 --- a/Mage.Sets/src/mage/cards/c/CoralTrickster.java +++ b/Mage.Sets/src/mage/cards/c/CoralTrickster.java @@ -28,7 +28,7 @@ public final class CoralTrickster extends CardImpl { this.toughness = new MageInt(1); // Morph {U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}"))); // When Coral Trickster is turned face up, you may tap or untap target permanent. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new MayTapOrUntapTargetEffect()); ability.addTarget(new TargetPermanent()); diff --git a/Mage.Sets/src/mage/cards/c/CorneredMarket.java b/Mage.Sets/src/mage/cards/c/CorneredMarket.java index b5978eea56a..72c7679c0ce 100644 --- a/Mage.Sets/src/mage/cards/c/CorneredMarket.java +++ b/Mage.Sets/src/mage/cards/c/CorneredMarket.java @@ -1,7 +1,7 @@ package mage.cards.c; -import java.util.UUID; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.cards.Card; @@ -19,6 +19,8 @@ import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.util.CardUtil; +import java.util.UUID; + /** * * @author jeffwadsworth @@ -70,7 +72,11 @@ class CorneredMarketReplacementEffect extends ContinuousRuleModifyingEffectImpl @Override public boolean applies(GameEvent event, Ability source, Game game) { - Card card = game.getCard(event.getSourceId()); + SpellAbility spellAbility = SpellAbility.getSpellAbilityFromEvent(event, game); + if (spellAbility == null) { + return false; + } + Card card = spellAbility.getCharacteristics(game); if (card != null) { Spell spell = game.getState().getStack().getSpell(event.getSourceId()); // Face Down cast spell (Morph creature) has no name diff --git a/Mage.Sets/src/mage/cards/c/CrudeRampart.java b/Mage.Sets/src/mage/cards/c/CrudeRampart.java index 49a2a970f36..7c6854caf92 100644 --- a/Mage.Sets/src/mage/cards/c/CrudeRampart.java +++ b/Mage.Sets/src/mage/cards/c/CrudeRampart.java @@ -26,7 +26,7 @@ public final class CrudeRampart extends CardImpl { // Defender this.addAbility(DefenderAbility.getInstance()); // Morph {4}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{W}"))); } private CrudeRampart(final CrudeRampart card) { diff --git a/Mage.Sets/src/mage/cards/c/CryOfTheCarnarium.java b/Mage.Sets/src/mage/cards/c/CryOfTheCarnarium.java index 0079b741b7d..340ef2ed3b5 100644 --- a/Mage.Sets/src/mage/cards/c/CryOfTheCarnarium.java +++ b/Mage.Sets/src/mage/cards/c/CryOfTheCarnarium.java @@ -66,7 +66,9 @@ class CryOfTheCarnariumExileEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); CardsPutIntoGraveyardWatcher watcher = game.getState().getWatcher(CardsPutIntoGraveyardWatcher.class); - if (controller == null || watcher == null) { return false; } + if (controller == null || watcher == null) { + return false; + } Cards cards = new CardsImpl(watcher.getCardsPutIntoGraveyardFromBattlefield(game)); cards.removeIf(uuid -> !game.getCard(uuid).isCreature(game)); diff --git a/Mage.Sets/src/mage/cards/d/DanithaNewBenaliasLight.java b/Mage.Sets/src/mage/cards/d/DanithaNewBenaliasLight.java index c41cc0dffd6..ccb6f61a633 100644 --- a/Mage.Sets/src/mage/cards/d/DanithaNewBenaliasLight.java +++ b/Mage.Sets/src/mage/cards/d/DanithaNewBenaliasLight.java @@ -4,6 +4,7 @@ import mage.MageIdentifier; import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.keyword.LifelinkAbility; @@ -82,18 +83,22 @@ class DanithaNewBenaliasLightCastFromGraveyardEffect extends AsThoughEffectImpl } @Override - public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - if (!source.isControlledBy(affectedControllerId) || game.getState().getZone(objectId) != Zone.GRAVEYARD) { + public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) { + if (!source.isControlledBy(playerId) || game.getState().getZone(objectId) != Zone.GRAVEYARD || !(affectedAbility instanceof SpellAbility)) { return false; } - Card objectCard = game.getCard(objectId); + Card objectCard = ((SpellAbility) affectedAbility).getCharacteristics(game); return objectCard != null && objectCard.isOwnedBy(source.getControllerId()) && (objectCard.hasSubtype(SubType.AURA, game) || objectCard.hasSubtype(SubType.EQUIPMENT, game)) && objectCard.getSpellAbility() != null - && objectCard.getSpellAbility().spellCanBeActivatedRegularlyNow(affectedControllerId, game) + && objectCard.getSpellAbility().spellCanBeActivatedRegularlyNow(playerId, game) && !DanithaNewBenaliasLightWatcher.isAbilityUsed(source, game); } + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + throw new IllegalArgumentException("Wrong code usage: can't call applies method on empty affectedAbility"); + } } class DanithaNewBenaliasLightWatcher extends Watcher { diff --git a/Mage.Sets/src/mage/cards/d/DaruHealer.java b/Mage.Sets/src/mage/cards/d/DaruHealer.java index 3a332154317..7bb3a53d17a 100644 --- a/Mage.Sets/src/mage/cards/d/DaruHealer.java +++ b/Mage.Sets/src/mage/cards/d/DaruHealer.java @@ -37,7 +37,7 @@ public final class DaruHealer extends CardImpl { this.addAbility(ability); // Morph {W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{W}"))); } diff --git a/Mage.Sets/src/mage/cards/d/DaruLancer.java b/Mage.Sets/src/mage/cards/d/DaruLancer.java index aa9019e52b7..ccea07396ee 100644 --- a/Mage.Sets/src/mage/cards/d/DaruLancer.java +++ b/Mage.Sets/src/mage/cards/d/DaruLancer.java @@ -27,7 +27,7 @@ public final class DaruLancer extends CardImpl { // First strike this.addAbility(FirstStrikeAbility.getInstance()); // Morph {2}{W}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{W}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{W}{W}"))); } private DaruLancer(final DaruLancer card) { diff --git a/Mage.Sets/src/mage/cards/d/DaruMender.java b/Mage.Sets/src/mage/cards/d/DaruMender.java index f2b1cc6b190..56b44548486 100644 --- a/Mage.Sets/src/mage/cards/d/DaruMender.java +++ b/Mage.Sets/src/mage/cards/d/DaruMender.java @@ -28,7 +28,7 @@ public final class DaruMender extends CardImpl { this.toughness = new MageInt(1); // Morph {W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{W}"))); // When Daru Mender is turned face up, regenerate target creature. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new RegenerateTargetEffect()); ability.addTarget(new TargetCreaturePermanent()); diff --git a/Mage.Sets/src/mage/cards/d/DaruSanctifier.java b/Mage.Sets/src/mage/cards/d/DaruSanctifier.java index ced12ea8c33..f97d846e7db 100644 --- a/Mage.Sets/src/mage/cards/d/DaruSanctifier.java +++ b/Mage.Sets/src/mage/cards/d/DaruSanctifier.java @@ -28,7 +28,7 @@ public final class DaruSanctifier extends CardImpl { this.toughness = new MageInt(4); // Morph {1}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{W}"))); // When Daru Sanctifier is turned face up, destroy target enchantment. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new DestroyTargetEffect()); ability.addTarget(new TargetEnchantmentPermanent()); diff --git a/Mage.Sets/src/mage/cards/d/DawningPurist.java b/Mage.Sets/src/mage/cards/d/DawningPurist.java index 0b5b6da3aeb..5c3e9bde32f 100644 --- a/Mage.Sets/src/mage/cards/d/DawningPurist.java +++ b/Mage.Sets/src/mage/cards/d/DawningPurist.java @@ -37,7 +37,7 @@ public final class DawningPurist extends CardImpl { this.addAbility(new DawningPuristTriggeredAbility()); // Morph {1}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{W}"))); } private DawningPurist(final DawningPurist card) { diff --git a/Mage.Sets/src/mage/cards/d/DeathmistRaptor.java b/Mage.Sets/src/mage/cards/d/DeathmistRaptor.java index 2e0a5c7eba0..9b6fc27f257 100644 --- a/Mage.Sets/src/mage/cards/d/DeathmistRaptor.java +++ b/Mage.Sets/src/mage/cards/d/DeathmistRaptor.java @@ -41,7 +41,7 @@ public final class DeathmistRaptor extends CardImpl { this.addAbility(new TurnedFaceUpAllTriggeredAbility(Zone.GRAVEYARD, new DeathmistRaptorEffect(), new FilterControlledPermanent("a permanent you control"), false, true)); // Megamorph {4}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{G}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{G}"), true)); } private DeathmistRaptor(final DeathmistRaptor card) { diff --git a/Mage.Sets/src/mage/cards/d/DefenderOfTheOrder.java b/Mage.Sets/src/mage/cards/d/DefenderOfTheOrder.java index e71bd86a121..20983c3f45e 100644 --- a/Mage.Sets/src/mage/cards/d/DefenderOfTheOrder.java +++ b/Mage.Sets/src/mage/cards/d/DefenderOfTheOrder.java @@ -27,7 +27,7 @@ public final class DefenderOfTheOrder extends CardImpl { this.toughness = new MageInt(4); // Morph {W}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{W}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{W}{W}"))); // When Defender of the Order is turned face up, creatures you control get +0/+2 until end of turn. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new BoostControlledEffect(0, 2, Duration.EndOfTurn))); } diff --git a/Mage.Sets/src/mage/cards/d/DenProtector.java b/Mage.Sets/src/mage/cards/d/DenProtector.java index 33c9a8ac8b2..943c41c0ff1 100644 --- a/Mage.Sets/src/mage/cards/d/DenProtector.java +++ b/Mage.Sets/src/mage/cards/d/DenProtector.java @@ -34,7 +34,7 @@ public final class DenProtector extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesWithLessPowerEffect())); // Megamorph {1}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{G}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{G}"), true)); // When Den Protector is turned face up, return target card from your graveyard to your hand. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect()); diff --git a/Mage.Sets/src/mage/cards/d/Dermoplasm.java b/Mage.Sets/src/mage/cards/d/Dermoplasm.java index a3a39c505e3..fe6646612c9 100644 --- a/Mage.Sets/src/mage/cards/d/Dermoplasm.java +++ b/Mage.Sets/src/mage/cards/d/Dermoplasm.java @@ -39,7 +39,7 @@ public final class Dermoplasm extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Morph {2}{U}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}{U}"))); // When Dermoplasm is turned face up, you may put a creature card with a morph ability from your hand onto the battlefield face up. If you do, return Dermoplasm to its owner's hand. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new DermoplasmEffect())); diff --git a/Mage.Sets/src/mage/cards/d/DirgurNemesis.java b/Mage.Sets/src/mage/cards/d/DirgurNemesis.java index d6c0be95587..053e9ff8daa 100644 --- a/Mage.Sets/src/mage/cards/d/DirgurNemesis.java +++ b/Mage.Sets/src/mage/cards/d/DirgurNemesis.java @@ -26,7 +26,7 @@ public final class DirgurNemesis extends CardImpl { // Defender this.addAbility(DefenderAbility.getInstance()); // Megamorph {6}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{6}{U}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{6}{U}"), true)); } private DirgurNemesis(final DirgurNemesis card) { diff --git a/Mage.Sets/src/mage/cards/d/DisruptivePitmage.java b/Mage.Sets/src/mage/cards/d/DisruptivePitmage.java index cd3bcf90823..ef73896f1f6 100644 --- a/Mage.Sets/src/mage/cards/d/DisruptivePitmage.java +++ b/Mage.Sets/src/mage/cards/d/DisruptivePitmage.java @@ -36,7 +36,7 @@ public final class DisruptivePitmage extends CardImpl { this.addAbility(ability); // Morph {U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}"))); } private DisruptivePitmage(final DisruptivePitmage card) { diff --git a/Mage.Sets/src/mage/cards/d/DragonsEyeSavants.java b/Mage.Sets/src/mage/cards/d/DragonsEyeSavants.java index dfbb6bcaca8..c853373c86a 100644 --- a/Mage.Sets/src/mage/cards/d/DragonsEyeSavants.java +++ b/Mage.Sets/src/mage/cards/d/DragonsEyeSavants.java @@ -39,7 +39,7 @@ public final class DragonsEyeSavants extends CardImpl { this.toughness = new MageInt(6); // Morph - Reveal a blue card in your hand. - this.addAbility(new MorphAbility(new RevealTargetFromHandCost(new TargetCardInHand(filter)))); + this.addAbility(new MorphAbility(this, new RevealTargetFromHandCost(new TargetCardInHand(filter)))); // When Dragon's Eye Savants is turned face up, look at target opponent's hand. Effect effect = new LookAtTargetPlayerHandEffect(); 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/d/DulcetSirens.java b/Mage.Sets/src/mage/cards/d/DulcetSirens.java index 376dd7dd065..14f4f81d78c 100644 --- a/Mage.Sets/src/mage/cards/d/DulcetSirens.java +++ b/Mage.Sets/src/mage/cards/d/DulcetSirens.java @@ -38,7 +38,7 @@ public final class DulcetSirens extends CardImpl { this.addAbility(ability); // Morph {U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}"))); } private DulcetSirens(final DulcetSirens card) { diff --git a/Mage.Sets/src/mage/cards/d/DwarvenBlastminer.java b/Mage.Sets/src/mage/cards/d/DwarvenBlastminer.java index 96378d4592f..b4ca46394d8 100644 --- a/Mage.Sets/src/mage/cards/d/DwarvenBlastminer.java +++ b/Mage.Sets/src/mage/cards/d/DwarvenBlastminer.java @@ -34,7 +34,7 @@ public final class DwarvenBlastminer extends CardImpl { this.addAbility(ability); // Morph {R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{R}"))); } private DwarvenBlastminer(final DwarvenBlastminer card) { diff --git a/Mage.Sets/src/mage/cards/e/EbonbladeReaper.java b/Mage.Sets/src/mage/cards/e/EbonbladeReaper.java index 7d7f9e225e7..318ec6de4ee 100644 --- a/Mage.Sets/src/mage/cards/e/EbonbladeReaper.java +++ b/Mage.Sets/src/mage/cards/e/EbonbladeReaper.java @@ -34,7 +34,7 @@ public final class EbonbladeReaper extends CardImpl { this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new LoseHalfLifeTargetEffect(), false, true)); //Morph {3}{B}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{B}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{B}{B}"))); } private EbonbladeReaper(final EbonbladeReaper card) { diff --git a/Mage.Sets/src/mage/cards/e/EchoTracer.java b/Mage.Sets/src/mage/cards/e/EchoTracer.java index ef459dbb95c..473bae2116e 100644 --- a/Mage.Sets/src/mage/cards/e/EchoTracer.java +++ b/Mage.Sets/src/mage/cards/e/EchoTracer.java @@ -28,7 +28,7 @@ public final class EchoTracer extends CardImpl { this.toughness = new MageInt(2); // Morph {2}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}"))); // When Echo Tracer is turned face up, return target creature to its owner's hand. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new ReturnToHandTargetEffect()); ability.addTarget(new TargetCreaturePermanent()); diff --git a/Mage.Sets/src/mage/cards/e/EfreetWeaponmaster.java b/Mage.Sets/src/mage/cards/e/EfreetWeaponmaster.java index 39263bf2cec..7fcb7cd103b 100644 --- a/Mage.Sets/src/mage/cards/e/EfreetWeaponmaster.java +++ b/Mage.Sets/src/mage/cards/e/EfreetWeaponmaster.java @@ -40,7 +40,7 @@ public final class EfreetWeaponmaster extends CardImpl { this.addAbility(new EfreetWeaponmasterAbility()); // Morph {2}{U}{R}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}{R}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}{R}{W}"))); } private EfreetWeaponmaster(final EfreetWeaponmaster card) { diff --git a/Mage.Sets/src/mage/cards/e/ExaltedAngel.java b/Mage.Sets/src/mage/cards/e/ExaltedAngel.java index 7361dd70a11..1722ba88b63 100644 --- a/Mage.Sets/src/mage/cards/e/ExaltedAngel.java +++ b/Mage.Sets/src/mage/cards/e/ExaltedAngel.java @@ -30,7 +30,7 @@ public final class ExaltedAngel extends CardImpl { // Whenever Exalted Angel deals damage, you gain that much life. this.addAbility(new DealsDamageGainLifeSourceTriggeredAbility()); // Morph {2}{W}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{W}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{W}{W}"))); } private ExaltedAngel(final ExaltedAngel card) { diff --git a/Mage.Sets/src/mage/cards/e/ExclusionRitual.java b/Mage.Sets/src/mage/cards/e/ExclusionRitual.java index 17bf0c5d6cf..eb1db60b4a2 100644 --- a/Mage.Sets/src/mage/cards/e/ExclusionRitual.java +++ b/Mage.Sets/src/mage/cards/e/ExclusionRitual.java @@ -1,6 +1,7 @@ package mage.cards.e; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; @@ -100,13 +101,18 @@ class ExclusionRitualReplacementEffect extends ContinuousRuleModifyingEffectImpl @Override public boolean applies(GameEvent event, Ability source, Game game) { Permanent sourcePermanent = game.getPermanent(source.getSourceId()); - Card card = game.getCard(event.getSourceId()); - if (sourcePermanent != null && card != null) { - if (!sourcePermanent.getImprinted().isEmpty()) { - Card imprintedCard = game.getCard(sourcePermanent.getImprinted().get(0)); - if (imprintedCard != null) { - return CardUtil.haveSameNames(card, imprintedCard); - } + SpellAbility spellAbility = SpellAbility.getSpellAbilityFromEvent(event, game); + if (spellAbility == null) { + return false; + } + Card card = spellAbility.getCharacteristics(game); + if (card == null) { + return false; + } + if (sourcePermanent != null && !sourcePermanent.getImprinted().isEmpty()) { + Card imprintedCard = game.getCard(sourcePermanent.getImprinted().get(0)); + if (imprintedCard != null) { + return CardUtil.haveSameNames(spellAbility.getCharacteristics(game), imprintedCard); } } return false; diff --git a/Mage.Sets/src/mage/cards/f/FallenCleric.java b/Mage.Sets/src/mage/cards/f/FallenCleric.java index c8016792426..09e5a7c374a 100644 --- a/Mage.Sets/src/mage/cards/f/FallenCleric.java +++ b/Mage.Sets/src/mage/cards/f/FallenCleric.java @@ -34,7 +34,7 @@ public final class FallenCleric extends CardImpl { // Protection from Clerics this.addAbility(new ProtectionAbility(filter)); // Morph {4}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{B}"))); } private FallenCleric(final FallenCleric card) { diff --git a/Mage.Sets/src/mage/cards/f/FathomSeer.java b/Mage.Sets/src/mage/cards/f/FathomSeer.java index 6daec04409f..bb4b72d591c 100644 --- a/Mage.Sets/src/mage/cards/f/FathomSeer.java +++ b/Mage.Sets/src/mage/cards/f/FathomSeer.java @@ -33,7 +33,7 @@ public final class FathomSeer extends CardImpl { this.toughness = new MageInt(3); // Morph-Return two Islands you control to their owner's hand. - this.addAbility(new MorphAbility(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(2,2, filter, true)))); + this.addAbility(new MorphAbility(this, new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(2,2, filter, true)))); // When Fathom Seer is turned face up, draw two cards. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new DrawCardSourceControllerEffect(2))); } diff --git a/Mage.Sets/src/mage/cards/f/FledglingMawcor.java b/Mage.Sets/src/mage/cards/f/FledglingMawcor.java index d7163898667..40534c951c3 100644 --- a/Mage.Sets/src/mage/cards/f/FledglingMawcor.java +++ b/Mage.Sets/src/mage/cards/f/FledglingMawcor.java @@ -38,7 +38,7 @@ public final class FledglingMawcor extends CardImpl { this.addAbility(ability); // Morph {U}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{U}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}{U}"))); } private FledglingMawcor(final FledglingMawcor card) { diff --git a/Mage.Sets/src/mage/cards/f/FoothillGuide.java b/Mage.Sets/src/mage/cards/f/FoothillGuide.java index efc97cc25fe..b131bb0f4a3 100644 --- a/Mage.Sets/src/mage/cards/f/FoothillGuide.java +++ b/Mage.Sets/src/mage/cards/f/FoothillGuide.java @@ -34,7 +34,7 @@ public final class FoothillGuide extends CardImpl { // Protection from Goblins this.addAbility(new ProtectionAbility(filter)); // Morph {W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{W}"))); } private FoothillGuide(final FoothillGuide card) { diff --git a/Mage.Sets/src/mage/cards/f/FortuneThief.java b/Mage.Sets/src/mage/cards/f/FortuneThief.java index ba3bd056fe0..743274fd6bb 100644 --- a/Mage.Sets/src/mage/cards/f/FortuneThief.java +++ b/Mage.Sets/src/mage/cards/f/FortuneThief.java @@ -37,7 +37,7 @@ public final class FortuneThief extends CardImpl { // Damage that would reduce your life total to less than 1 reduces it to 1 instead. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new FortuneThiefReplacementEffect())); // Morph {R}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{R}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{R}{R}"))); } private FortuneThief(final FortuneThief card) { diff --git a/Mage.Sets/src/mage/cards/f/FrontlineStrategist.java b/Mage.Sets/src/mage/cards/f/FrontlineStrategist.java index ed852f8cd61..673bdc88a75 100644 --- a/Mage.Sets/src/mage/cards/f/FrontlineStrategist.java +++ b/Mage.Sets/src/mage/cards/f/FrontlineStrategist.java @@ -35,7 +35,7 @@ public final class FrontlineStrategist extends CardImpl { this.toughness = new MageInt(1); // Morph {W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{W}"))); // When Frontline Strategist is turned face up, prevent all combat damage non-Soldier creatures would deal this turn. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new PreventAllDamageByAllPermanentsEffect(filter, Duration.EndOfTurn, true).setText("prevent all combat damage non-Soldier creatures would deal this turn"))); } diff --git a/Mage.Sets/src/mage/cards/g/GathanRaiders.java b/Mage.Sets/src/mage/cards/g/GathanRaiders.java index 7436c391235..c5e1678b598 100644 --- a/Mage.Sets/src/mage/cards/g/GathanRaiders.java +++ b/Mage.Sets/src/mage/cards/g/GathanRaiders.java @@ -35,7 +35,7 @@ public final class GathanRaiders extends CardImpl { new BoostSourceEffect(2,2,Duration.WhileOnBattlefield), HellbentCondition.instance, "Hellbent — {this} gets +2/+2 as long as you have no cards in hand"))); // Morph-Discard a card. - this.addAbility(new MorphAbility(new DiscardCardCost())); + this.addAbility(new MorphAbility(this, new DiscardCardCost())); } private GathanRaiders(final GathanRaiders card) { diff --git a/Mage.Sets/src/mage/cards/g/GideonsIntervention.java b/Mage.Sets/src/mage/cards/g/GideonsIntervention.java index b460be33935..8095ffcdc83 100644 --- a/Mage.Sets/src/mage/cards/g/GideonsIntervention.java +++ b/Mage.Sets/src/mage/cards/g/GideonsIntervention.java @@ -2,12 +2,14 @@ package mage.cards.g; import mage.MageObject; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.PreventionEffectImpl; import mage.abilities.effects.common.ChooseACardNameEffect; +import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -90,8 +92,12 @@ class GideonsInterventionCantCastEffect extends ContinuousRuleModifyingEffectImp public boolean applies(GameEvent event, Ability source, Game game) { String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); if (game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) { - MageObject object = game.getObject(event.getSourceId()); - return object != null && object.getName().equals(cardName); + SpellAbility spellAbility = SpellAbility.getSpellAbilityFromEvent(event, game); + if (spellAbility == null) { + return false; + } + Card card = spellAbility.getCharacteristics(game); + return card != null && CardUtil.haveSameNames(card, cardName, game); } return false; } diff --git a/Mage.Sets/src/mage/cards/g/GiftOfDoom.java b/Mage.Sets/src/mage/cards/g/GiftOfDoom.java index 758f280ef50..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); @@ -56,7 +55,7 @@ public final class GiftOfDoom extends CardImpl { this.addAbility(ability2); // Morph—Sacrifice another creature. - this.addAbility(new MorphAbility(new SacrificeTargetCost( + this.addAbility(new MorphAbility(this, new SacrificeTargetCost( new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE) ))); @@ -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/g/GlacialStalker.java b/Mage.Sets/src/mage/cards/g/GlacialStalker.java index 180885fe1a8..ba0eb9810dc 100644 --- a/Mage.Sets/src/mage/cards/g/GlacialStalker.java +++ b/Mage.Sets/src/mage/cards/g/GlacialStalker.java @@ -24,7 +24,7 @@ public final class GlacialStalker extends CardImpl { this.toughness = new MageInt(5); // Morph {4}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{U}"))); } private GlacialStalker(final GlacialStalker card) { diff --git a/Mage.Sets/src/mage/cards/g/GoblinTaskmaster.java b/Mage.Sets/src/mage/cards/g/GoblinTaskmaster.java index e4d0dd54bd5..6e10b260be6 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinTaskmaster.java +++ b/Mage.Sets/src/mage/cards/g/GoblinTaskmaster.java @@ -41,7 +41,7 @@ public final class GoblinTaskmaster extends CardImpl { this.addAbility(ability); // Morph {R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{R}"))); } private GoblinTaskmaster(final GoblinTaskmaster card) { diff --git a/Mage.Sets/src/mage/cards/g/GravelSlinger.java b/Mage.Sets/src/mage/cards/g/GravelSlinger.java index f3f562e83f2..fbb8f00d1bc 100644 --- a/Mage.Sets/src/mage/cards/g/GravelSlinger.java +++ b/Mage.Sets/src/mage/cards/g/GravelSlinger.java @@ -35,7 +35,7 @@ public final class GravelSlinger extends CardImpl { ability.addTarget(new TargetCreaturePermanent(new FilterAttackingOrBlockingCreature())); this.addAbility(ability); // Morph {1}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{W}"))); } private GravelSlinger(final GravelSlinger card) { diff --git a/Mage.Sets/src/mage/cards/g/GrimHaruspex.java b/Mage.Sets/src/mage/cards/g/GrimHaruspex.java index 4edec729c6a..02d74b1d658 100644 --- a/Mage.Sets/src/mage/cards/g/GrimHaruspex.java +++ b/Mage.Sets/src/mage/cards/g/GrimHaruspex.java @@ -39,7 +39,7 @@ public final class GrimHaruspex extends CardImpl { this.toughness = new MageInt(2); // Morph {B} - this.addAbility(new MorphAbility(new ColoredManaCost(ColoredManaSymbol.B))); + this.addAbility(new MorphAbility(this, new ColoredManaCost(ColoredManaSymbol.B))); // Whenever another nontoken creature you control dies, draw a card. this.addAbility(new DiesCreatureTriggeredAbility(new DrawCardSourceControllerEffect(1), false, filter)); diff --git a/Mage.Sets/src/mage/cards/g/GrinningDemon.java b/Mage.Sets/src/mage/cards/g/GrinningDemon.java index 60abbce6cb5..d0a4489e1b4 100644 --- a/Mage.Sets/src/mage/cards/g/GrinningDemon.java +++ b/Mage.Sets/src/mage/cards/g/GrinningDemon.java @@ -28,7 +28,7 @@ public final class GrinningDemon extends CardImpl { // At the beginning of your upkeep, you lose 2 life. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new LoseLifeSourceControllerEffect(2), TargetController.YOU, false)); // Morph {2}{B}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{B}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{B}{B}"))); } private GrinningDemon(final GrinningDemon card) { diff --git a/Mage.Sets/src/mage/cards/g/GuardianShieldBearer.java b/Mage.Sets/src/mage/cards/g/GuardianShieldBearer.java index 60f273d1ca0..949b4d244a8 100644 --- a/Mage.Sets/src/mage/cards/g/GuardianShieldBearer.java +++ b/Mage.Sets/src/mage/cards/g/GuardianShieldBearer.java @@ -29,7 +29,7 @@ public final class GuardianShieldBearer extends CardImpl { this.toughness = new MageInt(1); // Megamorph {3}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{G}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{G}"), true)); // When Guardian Shield-Bearer is turned face up, put a +1/+1 counter on another target creature you control. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), false); diff --git a/Mage.Sets/src/mage/cards/g/GudulLurker.java b/Mage.Sets/src/mage/cards/g/GudulLurker.java index 183dab44bb4..7c6438e38f0 100644 --- a/Mage.Sets/src/mage/cards/g/GudulLurker.java +++ b/Mage.Sets/src/mage/cards/g/GudulLurker.java @@ -27,7 +27,7 @@ public final class GudulLurker extends CardImpl { this.addAbility(new CantBeBlockedSourceAbility()); // Megamorph {U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{U}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}"), true)); } private GudulLurker(final GudulLurker card) { diff --git a/Mage.Sets/src/mage/cards/h/HauntedCadaver.java b/Mage.Sets/src/mage/cards/h/HauntedCadaver.java index 5bef7ac7521..bb978f99f45 100644 --- a/Mage.Sets/src/mage/cards/h/HauntedCadaver.java +++ b/Mage.Sets/src/mage/cards/h/HauntedCadaver.java @@ -31,7 +31,7 @@ public final class HauntedCadaver extends CardImpl { ability.addEffect( new DiscardTargetEffect(3)); this.addAbility(ability); // Morph {1}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{B}"))); } private HauntedCadaver(final HauntedCadaver card) { diff --git a/Mage.Sets/src/mage/cards/h/Headhunter.java b/Mage.Sets/src/mage/cards/h/Headhunter.java index 60437f803cf..f0adab255b1 100644 --- a/Mage.Sets/src/mage/cards/h/Headhunter.java +++ b/Mage.Sets/src/mage/cards/h/Headhunter.java @@ -31,7 +31,7 @@ public final class Headhunter extends CardImpl { this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(1), false, true)); // Morph {B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{B}"))); } diff --git a/Mage.Sets/src/mage/cards/h/HerdchaserDragon.java b/Mage.Sets/src/mage/cards/h/HerdchaserDragon.java index 5ba9a572a06..bc0e2e6e524 100644 --- a/Mage.Sets/src/mage/cards/h/HerdchaserDragon.java +++ b/Mage.Sets/src/mage/cards/h/HerdchaserDragon.java @@ -43,7 +43,7 @@ public final class HerdchaserDragon extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // Megamorph {5}{G}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{G}{G}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{G}{G}"), true)); // When Herdchaser Dragon is turned face up, put a +1/+1 counter on each other Dragon creature you control. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter), false, false)); diff --git a/Mage.Sets/src/mage/cards/h/HiddenDragonslayer.java b/Mage.Sets/src/mage/cards/h/HiddenDragonslayer.java index 21c4a45e286..075c3fe919d 100644 --- a/Mage.Sets/src/mage/cards/h/HiddenDragonslayer.java +++ b/Mage.Sets/src/mage/cards/h/HiddenDragonslayer.java @@ -43,7 +43,7 @@ public final class HiddenDragonslayer extends CardImpl { this.addAbility(LifelinkAbility.getInstance()); // Megamorph {2}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{W}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{W}"), true)); // When Hidden Dragonslayer is turned face up, destroy target creature with power 4 or greater an opponent controls. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new DestroyTargetEffect(), false, false); diff --git a/Mage.Sets/src/mage/cards/h/HoodedHydra.java b/Mage.Sets/src/mage/cards/h/HoodedHydra.java index dcec75ed421..8483de178c7 100644 --- a/Mage.Sets/src/mage/cards/h/HoodedHydra.java +++ b/Mage.Sets/src/mage/cards/h/HoodedHydra.java @@ -44,7 +44,7 @@ public final class HoodedHydra extends CardImpl { this.addAbility(new DiesSourceTriggeredAbility(new CreateTokenEffect(new SnakeToken(), new CountersSourceCount(CounterType.P1P1)), false)); // Morph {3}{G}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{G}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{G}{G}"))); // As Hooded Hydra is turned face up, put five +1/+1 counters on it. Effect effect = new AddCountersSourceEffect(CounterType.P1P1.createInstance(5)); diff --git a/Mage.Sets/src/mage/cards/h/HordeAmbusher.java b/Mage.Sets/src/mage/cards/h/HordeAmbusher.java index ca49ae33106..760a0a24d1c 100644 --- a/Mage.Sets/src/mage/cards/h/HordeAmbusher.java +++ b/Mage.Sets/src/mage/cards/h/HordeAmbusher.java @@ -43,7 +43,7 @@ public final class HordeAmbusher extends CardImpl { this.addAbility(new BlocksSourceTriggeredAbility(new DamageControllerEffect(1, "it"))); // Morph - Reveal a red card in your hand. - this.addAbility(new MorphAbility(new RevealTargetFromHandCost(new TargetCardInHand(filter)))); + this.addAbility(new MorphAbility(this, new RevealTargetFromHandCost(new TargetCardInHand(filter)))); // When Horde Ambusher is turned face up, target creature can't block this turn. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new CantBlockTargetEffect(Duration.EndOfTurn)); diff --git a/Mage.Sets/src/mage/cards/h/Hystrodon.java b/Mage.Sets/src/mage/cards/h/Hystrodon.java index 9e98d691b19..99e7668a12c 100644 --- a/Mage.Sets/src/mage/cards/h/Hystrodon.java +++ b/Mage.Sets/src/mage/cards/h/Hystrodon.java @@ -31,7 +31,7 @@ public final class Hystrodon extends CardImpl { // Whenever Hystrodon deals combat damage to a player, you may draw a card. this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), true)); // Morph {1}{G}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{G}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{G}{G}"))); } private Hystrodon(final Hystrodon card) { diff --git a/Mage.Sets/src/mage/cards/i/IcefeatherAven.java b/Mage.Sets/src/mage/cards/i/IcefeatherAven.java index b3a1a6cb921..17026022fb1 100644 --- a/Mage.Sets/src/mage/cards/i/IcefeatherAven.java +++ b/Mage.Sets/src/mage/cards/i/IcefeatherAven.java @@ -33,7 +33,7 @@ public final class IcefeatherAven extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Morph {1}{G}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{G}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{G}{U}"))); // When Icefeather Aven is turned face up, you may return another target creature to its owner's hand. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new ReturnToHandTargetEffect(), false, true); ability.addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE)); diff --git a/Mage.Sets/src/mage/cards/i/ImperialHellkite.java b/Mage.Sets/src/mage/cards/i/ImperialHellkite.java index d4dbbd9d431..c4582594bff 100644 --- a/Mage.Sets/src/mage/cards/i/ImperialHellkite.java +++ b/Mage.Sets/src/mage/cards/i/ImperialHellkite.java @@ -32,7 +32,7 @@ public final class ImperialHellkite extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Morph {6}{R}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{6}{R}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{6}{R}{R}"))); // When Imperial Hellkite is turned face up, you may search your library for a Dragon card, reveal it, and put it into your hand. If you do, shuffle your library. Effect effect = new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 1, new FilterBySubtypeCard(SubType.DRAGON)), true); diff --git a/Mage.Sets/src/mage/cards/i/InfernalCaretaker.java b/Mage.Sets/src/mage/cards/i/InfernalCaretaker.java index 80f40d24cc7..550e2064979 100644 --- a/Mage.Sets/src/mage/cards/i/InfernalCaretaker.java +++ b/Mage.Sets/src/mage/cards/i/InfernalCaretaker.java @@ -31,7 +31,7 @@ public final class InfernalCaretaker extends CardImpl { this.toughness = new MageInt(2); // Morph {3}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{B}"))); // When Infernal Caretaker is turned face up, return all Zombie cards from all graveyards to their owners' hands. Effect effect = new ReturnToHandFromGraveyardAllEffect(zombieCard); diff --git a/Mage.Sets/src/mage/cards/i/IreShaman.java b/Mage.Sets/src/mage/cards/i/IreShaman.java index 73cce4c1e3f..812e4c6278d 100644 --- a/Mage.Sets/src/mage/cards/i/IreShaman.java +++ b/Mage.Sets/src/mage/cards/i/IreShaman.java @@ -30,7 +30,7 @@ public final class IreShaman extends CardImpl { this.addAbility(new MenaceAbility()); // Megamorph {R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{R}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{R}"), true)); // When Ire Shaman is turned face up, exile the top card of your library. Until end of turn, you may play that card. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new ExileTopXMayPlayUntilEndOfTurnEffect(1), false)); diff --git a/Mage.Sets/src/mage/cards/i/IronfistCrusher.java b/Mage.Sets/src/mage/cards/i/IronfistCrusher.java index 5a4c2c4f118..38481b81afb 100644 --- a/Mage.Sets/src/mage/cards/i/IronfistCrusher.java +++ b/Mage.Sets/src/mage/cards/i/IronfistCrusher.java @@ -30,7 +30,7 @@ public final class IronfistCrusher extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CanBlockAdditionalCreatureEffect(0))); // Morph {3}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{W}"))); } private IronfistCrusher(final IronfistCrusher card) { diff --git a/Mage.Sets/src/mage/cards/i/IxalansBinding.java b/Mage.Sets/src/mage/cards/i/IxalansBinding.java index b4e16cbf8de..38138bc80e2 100644 --- a/Mage.Sets/src/mage/cards/i/IxalansBinding.java +++ b/Mage.Sets/src/mage/cards/i/IxalansBinding.java @@ -1,6 +1,7 @@ package mage.cards.i; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; @@ -8,7 +9,10 @@ import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; import mage.filter.StaticFilters; import mage.game.ExileZone; import mage.game.Game; @@ -68,7 +72,11 @@ class IxalansBindingReplacementEffect extends ContinuousRuleModifyingEffectImpl if (event.getPlayerId().equals(source.getControllerId())) { return false; } - Card card = game.getCard(event.getSourceId()); + SpellAbility spellAbility = SpellAbility.getSpellAbilityFromEvent(event, game); + if (spellAbility == null) { + return false; + } + Card card = spellAbility.getCharacteristics(game); if (sourcePermanent != null && card != null) { UUID exileZone = CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter()); if (exileZone != null) { diff --git a/Mage.Sets/src/mage/cards/j/JeeringInstigator.java b/Mage.Sets/src/mage/cards/j/JeeringInstigator.java index 0801a0884f6..61beb4fa0ec 100644 --- a/Mage.Sets/src/mage/cards/j/JeeringInstigator.java +++ b/Mage.Sets/src/mage/cards/j/JeeringInstigator.java @@ -44,7 +44,7 @@ public final class JeeringInstigator extends CardImpl { this.toughness = new MageInt(1); // Morph {2}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{R}"))); // When Jeering Instigator is turned face up, if it's your turn, gain control of another target creature until end of turn. Untap it. That creature gains haste until end of turn. Ability ability = new ConditionalInterveningIfTriggeredAbility( 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/k/KadenasSilencer.java b/Mage.Sets/src/mage/cards/k/KadenasSilencer.java index 23a99425ae1..e0435e70804 100644 --- a/Mage.Sets/src/mage/cards/k/KadenasSilencer.java +++ b/Mage.Sets/src/mage/cards/k/KadenasSilencer.java @@ -33,7 +33,7 @@ public final class KadenasSilencer extends CardImpl { this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new KadenasSilencerEffect())); // Megamorph {1}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{U}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{U}"), true)); } private KadenasSilencer(final KadenasSilencer card) { diff --git a/Mage.Sets/src/mage/cards/k/KaronasZealot.java b/Mage.Sets/src/mage/cards/k/KaronasZealot.java index ab7fac0f35e..ce4b4c09396 100644 --- a/Mage.Sets/src/mage/cards/k/KaronasZealot.java +++ b/Mage.Sets/src/mage/cards/k/KaronasZealot.java @@ -30,7 +30,7 @@ public final class KaronasZealot extends CardImpl { this.toughness = new MageInt(5); // Morph {3}{W}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{W}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{W}{W}"))); // When Karona's Zealot is turned face up, all damage that would be dealt to it this turn is dealt to target creature instead. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, Integer.MAX_VALUE, RedirectionEffect.UsageType.ACCORDING_DURATION) diff --git a/Mage.Sets/src/mage/cards/k/KheruSpellsnatcher.java b/Mage.Sets/src/mage/cards/k/KheruSpellsnatcher.java index f7b763cd521..98c6be1f7b6 100644 --- a/Mage.Sets/src/mage/cards/k/KheruSpellsnatcher.java +++ b/Mage.Sets/src/mage/cards/k/KheruSpellsnatcher.java @@ -32,7 +32,7 @@ public final class KheruSpellsnatcher extends CardImpl { this.toughness = new MageInt(3); // Morph {4}{U}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{U}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{U}{U}"))); // When Kheru Spellthief is turned face up, counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. You may cast that card without paying its mana cost as long as it remains exiled. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new KheruSpellsnatcherEffect()); diff --git a/Mage.Sets/src/mage/cards/k/KinTreeWarden.java b/Mage.Sets/src/mage/cards/k/KinTreeWarden.java index cd4ad65358a..eb1daf227bf 100644 --- a/Mage.Sets/src/mage/cards/k/KinTreeWarden.java +++ b/Mage.Sets/src/mage/cards/k/KinTreeWarden.java @@ -31,7 +31,7 @@ public final class KinTreeWarden extends CardImpl { // {2}: Regenerate Kin-Tree Warden this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new GenericManaCost(2))); // Morph {G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{G}"))); } private KinTreeWarden(final KinTreeWarden card) { diff --git a/Mage.Sets/src/mage/cards/k/KjeldoranEliteGuard.java b/Mage.Sets/src/mage/cards/k/KjeldoranEliteGuard.java index 3cb23d87240..4620d62c95f 100644 --- a/Mage.Sets/src/mage/cards/k/KjeldoranEliteGuard.java +++ b/Mage.Sets/src/mage/cards/k/KjeldoranEliteGuard.java @@ -63,7 +63,9 @@ class KjeldoranEliteGuardEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - if (game.getPermanent(source.getFirstTarget()) == null) { return false; } + if (game.getPermanent(source.getFirstTarget()) == null) { + return false; + } // Target creature gets +2/+2 until end of turn. BoostTargetEffect buffEffect = new BoostTargetEffect(2, 2, Duration.EndOfTurn); diff --git a/Mage.Sets/src/mage/cards/k/KnowledgePool.java b/Mage.Sets/src/mage/cards/k/KnowledgePool.java index e2977299e4c..fd9fa6ce7cd 100644 --- a/Mage.Sets/src/mage/cards/k/KnowledgePool.java +++ b/Mage.Sets/src/mage/cards/k/KnowledgePool.java @@ -68,10 +68,14 @@ class KnowledgePoolExileThreeCardsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } MageObject sourceObject = game.getObject(source.getSourceId()); - if (sourceObject == null) { return false; } + if (sourceObject == null) { + return false; + } for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { Player player = game.getPlayer(playerId); @@ -117,10 +121,14 @@ class KnowledgePoolWhenCastFromHandAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getZone() != Zone.HAND) { return false; } + if (event.getZone() != Zone.HAND) { + return false; + } Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell == null) { return false; } + if (spell == null) { + return false; + } for (Effect effect : this.getEffects()) { effect.setTargetPointer(new FixedTarget(event.getTargetId())); @@ -143,13 +151,19 @@ class KnowledgePoolExileAndPlayEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Spell spell = game.getStack().getSpell(targetPointer.getFirst(game, source)); - if (spell == null) { return false; } + if (spell == null) { + return false; + } Permanent sourceObject = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (sourceObject == null ) { return false; } + if (sourceObject == null ) { + return false; + } Player spellController = game.getPlayer(spell.getControllerId()); - if (spellController == null) { return false; } + if (spellController == null) { + return false; + } UUID exileZoneId = CardUtil.getExileZoneId(game, source.getSourceId(), sourceObject.getZoneChangeCounter(game)); diff --git a/Mage.Sets/src/mage/cards/k/KolaghanStormsinger.java b/Mage.Sets/src/mage/cards/k/KolaghanStormsinger.java index 66eb63f2daa..c6b5b3beec1 100644 --- a/Mage.Sets/src/mage/cards/k/KolaghanStormsinger.java +++ b/Mage.Sets/src/mage/cards/k/KolaghanStormsinger.java @@ -32,7 +32,7 @@ public final class KolaghanStormsinger extends CardImpl { // Haste this.addAbility(HasteAbility.getInstance()); // Megamorph {R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{R}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{R}"), true)); // When Kolaghan Stormsinger is turned face up, target creature gains haste until end of turn. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn), false); diff --git a/Mage.Sets/src/mage/cards/k/KrosanCloudscraper.java b/Mage.Sets/src/mage/cards/k/KrosanCloudscraper.java index 89039a94e74..b871c4b1f59 100644 --- a/Mage.Sets/src/mage/cards/k/KrosanCloudscraper.java +++ b/Mage.Sets/src/mage/cards/k/KrosanCloudscraper.java @@ -31,7 +31,7 @@ public final class KrosanCloudscraper extends CardImpl { this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ManaCostsImpl<>("{G}{G}")), TargetController.YOU, false)); // Morph {7}{G}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{7}{G}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{7}{G}{G}"))); } private KrosanCloudscraper(final KrosanCloudscraper card) { diff --git a/Mage.Sets/src/mage/cards/k/KrosanColossus.java b/Mage.Sets/src/mage/cards/k/KrosanColossus.java index 6286022a97e..b3377399d09 100644 --- a/Mage.Sets/src/mage/cards/k/KrosanColossus.java +++ b/Mage.Sets/src/mage/cards/k/KrosanColossus.java @@ -23,7 +23,7 @@ public final class KrosanColossus extends CardImpl { this.toughness = new MageInt(9); // Morph {6}{G}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{6}{G}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{6}{G}{G}"))); } private KrosanColossus(final KrosanColossus card) { diff --git a/Mage.Sets/src/mage/cards/k/KrumarBondKin.java b/Mage.Sets/src/mage/cards/k/KrumarBondKin.java index b4a880e7f37..e22173e9617 100644 --- a/Mage.Sets/src/mage/cards/k/KrumarBondKin.java +++ b/Mage.Sets/src/mage/cards/k/KrumarBondKin.java @@ -25,7 +25,7 @@ public final class KrumarBondKin extends CardImpl { this.toughness = new MageInt(3); // Morph {4}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{B}"))); } private KrumarBondKin(final KrumarBondKin card) { diff --git a/Mage.Sets/src/mage/cards/l/LiegeOfTheAxe.java b/Mage.Sets/src/mage/cards/l/LiegeOfTheAxe.java index 62ff09684ab..6f2df9e0168 100644 --- a/Mage.Sets/src/mage/cards/l/LiegeOfTheAxe.java +++ b/Mage.Sets/src/mage/cards/l/LiegeOfTheAxe.java @@ -29,7 +29,7 @@ public final class LiegeOfTheAxe extends CardImpl { // Vigilance this.addAbility(VigilanceAbility.getInstance()); // Morph {1}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{W}"))); // When Liege of the Axe is turned face up, untap it. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new UntapSourceEffect().setText("untap it"))); } diff --git a/Mage.Sets/src/mage/cards/l/LiegeOfThePit.java b/Mage.Sets/src/mage/cards/l/LiegeOfThePit.java index 8b1cbea8b51..04649dab75d 100644 --- a/Mage.Sets/src/mage/cards/l/LiegeOfThePit.java +++ b/Mage.Sets/src/mage/cards/l/LiegeOfThePit.java @@ -39,7 +39,7 @@ public final class LiegeOfThePit extends CardImpl { // At the beginning of your upkeep, sacrifice a creature other than Liege of the Pit. If you can't, Liege of the Pit deals 7 damage to you. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new LiegeOfThePitEffect(), TargetController.YOU, false)); // Morph {B}{B}{B}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{B}{B}{B}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{B}{B}{B}{B}"))); } private LiegeOfThePit(final LiegeOfThePit card) { diff --git a/Mage.Sets/src/mage/cards/l/LumithreadField.java b/Mage.Sets/src/mage/cards/l/LumithreadField.java index 4df5634ea69..b5868a8c5bd 100644 --- a/Mage.Sets/src/mage/cards/l/LumithreadField.java +++ b/Mage.Sets/src/mage/cards/l/LumithreadField.java @@ -25,7 +25,7 @@ public final class LumithreadField extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(0, 1, Duration.WhileOnBattlefield))); // Morph {1}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{W}"))); } private LumithreadField(final LumithreadField card) { diff --git a/Mage.Sets/src/mage/cards/m/MaelstromDjinn.java b/Mage.Sets/src/mage/cards/m/MaelstromDjinn.java index 764d3f7406e..3f9d5583e3b 100644 --- a/Mage.Sets/src/mage/cards/m/MaelstromDjinn.java +++ b/Mage.Sets/src/mage/cards/m/MaelstromDjinn.java @@ -35,7 +35,7 @@ public final class MaelstromDjinn extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Morph {2}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}"))); // When Maelstrom Djinn is turned face up, put two time counters on it and it gains vanishing. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(2))); Effect effect = new GainAbilitySourceEffect(new VanishingUpkeepAbility(0), Duration.WhileOnBattlefield); diff --git a/Mage.Sets/src/mage/cards/m/ManaMaze.java b/Mage.Sets/src/mage/cards/m/ManaMaze.java index 3bbe9415393..7ce36a4fec6 100644 --- a/Mage.Sets/src/mage/cards/m/ManaMaze.java +++ b/Mage.Sets/src/mage/cards/m/ManaMaze.java @@ -1,25 +1,22 @@ package mage.cards.m; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.WatcherScope; -import mage.constants.Zone; +import mage.constants.*; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; import mage.game.stack.Spell; import mage.watchers.Watcher; +import java.util.UUID; + /** * * @author jeffwadsworth @@ -61,7 +58,11 @@ class ManaMazeEffect extends ContinuousRuleModifyingEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { - Card card = game.getCard(event.getSourceId()); + SpellAbility spellAbility = SpellAbility.getSpellAbilityFromEvent(event, game); + if (spellAbility == null) { + return false; + } + Card card = spellAbility.getCharacteristics(game); if (card != null) { LastSpellCastWatcher watcher = game.getState().getWatcher(LastSpellCastWatcher.class); if (watcher != null && watcher.getLastSpellCast() != null) { diff --git a/Mage.Sets/src/mage/cards/m/MarangRiverSkeleton.java b/Mage.Sets/src/mage/cards/m/MarangRiverSkeleton.java index e6eb6efd954..a0172a29d9d 100644 --- a/Mage.Sets/src/mage/cards/m/MarangRiverSkeleton.java +++ b/Mage.Sets/src/mage/cards/m/MarangRiverSkeleton.java @@ -29,7 +29,7 @@ public final class MarangRiverSkeleton extends CardImpl { this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl<>("{B}"))); // Megamorph {3}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{B}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{B}"), true)); } private MarangRiverSkeleton(final MarangRiverSkeleton card) { diff --git a/Mage.Sets/src/mage/cards/m/MarshHulk.java b/Mage.Sets/src/mage/cards/m/MarshHulk.java index e9cd2f32441..240638026cc 100644 --- a/Mage.Sets/src/mage/cards/m/MarshHulk.java +++ b/Mage.Sets/src/mage/cards/m/MarshHulk.java @@ -24,7 +24,7 @@ public final class MarshHulk extends CardImpl { this.toughness = new MageInt(6); // Megamorph {6}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{6}{B}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{6}{B}"), true)); } private MarshHulk(final MarshHulk card) { diff --git a/Mage.Sets/src/mage/cards/m/MasterOfPearls.java b/Mage.Sets/src/mage/cards/m/MasterOfPearls.java index 56cb3da50e8..95e8e4271b2 100644 --- a/Mage.Sets/src/mage/cards/m/MasterOfPearls.java +++ b/Mage.Sets/src/mage/cards/m/MasterOfPearls.java @@ -28,7 +28,7 @@ public final class MasterOfPearls extends CardImpl { this.toughness = new MageInt(2); // Morph {3}{W}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{W}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{W}{W}"))); // When Master of Pearls is turned face up, creatures you control get +2/+2 until end of turn. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new BoostControlledEffect(2, 2, Duration.EndOfTurn))); } diff --git a/Mage.Sets/src/mage/cards/m/MasterOfTheVeil.java b/Mage.Sets/src/mage/cards/m/MasterOfTheVeil.java index be64deda183..583aef98668 100644 --- a/Mage.Sets/src/mage/cards/m/MasterOfTheVeil.java +++ b/Mage.Sets/src/mage/cards/m/MasterOfTheVeil.java @@ -44,7 +44,7 @@ public final class MasterOfTheVeil extends CardImpl { this.toughness = new MageInt(3); // Morph {2}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}"))); // When Master of the Veil is turned face up, you may turn target creature with a morph ability face down. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new MasterOfTheVeilEffect(), false, true); diff --git a/Mage.Sets/src/mage/cards/m/MeddlingMage.java b/Mage.Sets/src/mage/cards/m/MeddlingMage.java index 51d1fc9ef5d..2ae5c9f41e5 100644 --- a/Mage.Sets/src/mage/cards/m/MeddlingMage.java +++ b/Mage.Sets/src/mage/cards/m/MeddlingMage.java @@ -3,16 +3,17 @@ package mage.cards.m; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.common.ChooseACardNameEffect; +import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; import mage.util.CardUtil; import java.util.UUID; @@ -79,9 +80,15 @@ class MeddlingMageReplacementEffect extends ContinuousRuleModifyingEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { - MageObject object = game.getObject(event.getSourceId()); + SpellAbility spellAbility = SpellAbility.getSpellAbilityFromEvent(event, game); + if (spellAbility == null) { + return false; + } + Card card = spellAbility.getCharacteristics(game); + if (card == null) { + return false; + } String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); - return object != null - && CardUtil.haveSameNames(object, cardName, game); + return CardUtil.haveSameNames(card, cardName, game); } } diff --git a/Mage.Sets/src/mage/cards/m/MiragePhalanx.java b/Mage.Sets/src/mage/cards/m/MiragePhalanx.java index d8f889bd9e1..d56ec8d7cbb 100644 --- a/Mage.Sets/src/mage/cards/m/MiragePhalanx.java +++ b/Mage.Sets/src/mage/cards/m/MiragePhalanx.java @@ -70,7 +70,9 @@ class MiragePhalanxEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Permanent permanent = source.getSourcePermanentOrLKI(game); - if (permanent == null) { return false; } + if (permanent == null) { + return false; + } // It has haste CreateTokenCopyTargetEffect tokenCopyEffect = new CreateTokenCopyTargetEffect(source.getControllerId(), null, true); diff --git a/Mage.Sets/src/mage/cards/m/MischievousQuanar.java b/Mage.Sets/src/mage/cards/m/MischievousQuanar.java index 1d8ffccb779..8401d7d74a6 100644 --- a/Mage.Sets/src/mage/cards/m/MischievousQuanar.java +++ b/Mage.Sets/src/mage/cards/m/MischievousQuanar.java @@ -38,7 +38,7 @@ public final class MischievousQuanar extends CardImpl { this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{3}{U}{U}"))); // Morph {1}{U}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{U}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{U}{U}"))); // When Mischievous Quanar is turned face up, copy target instant or sorcery spell. You may choose new targets for that copy. Effect effect2 = new CopyTargetSpellEffect(); diff --git a/Mage.Sets/src/mage/cards/m/MistfireWeaver.java b/Mage.Sets/src/mage/cards/m/MistfireWeaver.java index fc32d61d874..b7abf8876cb 100644 --- a/Mage.Sets/src/mage/cards/m/MistfireWeaver.java +++ b/Mage.Sets/src/mage/cards/m/MistfireWeaver.java @@ -35,7 +35,7 @@ public final class MistfireWeaver extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Morph {2}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}"))); // When Misfire Weaver is turned face up, target creature you control gains hexproof until end of turn Effect effect = new GainAbilityTargetEffect(HexproofAbility.getInstance(), Duration.EndOfTurn); Ability ability = new TurnedFaceUpSourceTriggeredAbility(effect); diff --git a/Mage.Sets/src/mage/cards/m/MistformSeaswift.java b/Mage.Sets/src/mage/cards/m/MistformSeaswift.java index 59f183f4eb0..5bae3c3cc17 100644 --- a/Mage.Sets/src/mage/cards/m/MistformSeaswift.java +++ b/Mage.Sets/src/mage/cards/m/MistformSeaswift.java @@ -34,7 +34,7 @@ public final class MistformSeaswift extends CardImpl { this.addAbility(new SimpleActivatedAbility(new BecomesChosenCreatureTypeSourceEffect(), new GenericManaCost(1))); // Morph {1}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{U}"))); } diff --git a/Mage.Sets/src/mage/cards/m/MistformShrieker.java b/Mage.Sets/src/mage/cards/m/MistformShrieker.java index aa259907fbb..9036916c663 100644 --- a/Mage.Sets/src/mage/cards/m/MistformShrieker.java +++ b/Mage.Sets/src/mage/cards/m/MistformShrieker.java @@ -35,7 +35,7 @@ public final class MistformShrieker extends CardImpl { this.addAbility(new SimpleActivatedAbility(new BecomesChosenCreatureTypeSourceEffect(), new GenericManaCost(1))); // Morph {3}{U}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{U}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{U}{U}"))); } diff --git a/Mage.Sets/src/mage/cards/m/MisthoofKirin.java b/Mage.Sets/src/mage/cards/m/MisthoofKirin.java index ca20a2e8a34..4c488f24ac5 100644 --- a/Mage.Sets/src/mage/cards/m/MisthoofKirin.java +++ b/Mage.Sets/src/mage/cards/m/MisthoofKirin.java @@ -31,7 +31,7 @@ public final class MisthoofKirin extends CardImpl { this.addAbility(VigilanceAbility.getInstance()); // Megamorph {1}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{W}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{W}"), true)); } private MisthoofKirin(final MisthoofKirin card) { diff --git a/Mage.Sets/src/mage/cards/m/MonasteryFlock.java b/Mage.Sets/src/mage/cards/m/MonasteryFlock.java index a69d5848801..f0917620d60 100644 --- a/Mage.Sets/src/mage/cards/m/MonasteryFlock.java +++ b/Mage.Sets/src/mage/cards/m/MonasteryFlock.java @@ -30,7 +30,7 @@ public final class MonasteryFlock extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Morph {U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}"))); } private MonasteryFlock(final MonasteryFlock card) { diff --git a/Mage.Sets/src/mage/cards/m/MonasteryLoremaster.java b/Mage.Sets/src/mage/cards/m/MonasteryLoremaster.java index ddcc26bab0d..cae8834c790 100644 --- a/Mage.Sets/src/mage/cards/m/MonasteryLoremaster.java +++ b/Mage.Sets/src/mage/cards/m/MonasteryLoremaster.java @@ -37,7 +37,7 @@ public final class MonasteryLoremaster extends CardImpl { this.toughness = new MageInt(2); // Megamorph {5}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{U}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{U}"), true)); // When Monastery Loremaster is turned face up, return target noncreature, nonland card from your graveyard to your hand. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect()); diff --git a/Mage.Sets/src/mage/cards/m/MyojinOfGrimBetrayal.java b/Mage.Sets/src/mage/cards/m/MyojinOfGrimBetrayal.java index 8c57b1d4424..b250f75505e 100644 --- a/Mage.Sets/src/mage/cards/m/MyojinOfGrimBetrayal.java +++ b/Mage.Sets/src/mage/cards/m/MyojinOfGrimBetrayal.java @@ -88,7 +88,9 @@ class MyojinOfGrimBetrayalEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); CardsPutIntoGraveyardWatcher watcher = game.getState().getWatcher(CardsPutIntoGraveyardWatcher.class); - if (controller == null || watcher == null) { return false; } + if (controller == null || watcher == null) { + return false; + } Cards cards = new CardsImpl(watcher.getCardsPutIntoGraveyardFromBattlefield(game)); cards.removeIf(uuid -> !game.getCard(uuid).isCreature(game)); diff --git a/Mage.Sets/src/mage/cards/m/MysticOfTheHiddenWay.java b/Mage.Sets/src/mage/cards/m/MysticOfTheHiddenWay.java index 8f3ef96ffd8..908048c2a1b 100644 --- a/Mage.Sets/src/mage/cards/m/MysticOfTheHiddenWay.java +++ b/Mage.Sets/src/mage/cards/m/MysticOfTheHiddenWay.java @@ -28,7 +28,7 @@ public final class MysticOfTheHiddenWay extends CardImpl { // Mystic of the Hidden Way can't be blocked. this.addAbility(new CantBeBlockedSourceAbility()); // Morph {2}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}"))); } private MysticOfTheHiddenWay(final MysticOfTheHiddenWay card) { diff --git a/Mage.Sets/src/mage/cards/n/NamelessOne.java b/Mage.Sets/src/mage/cards/n/NamelessOne.java index 98323e393fe..487895bfea7 100644 --- a/Mage.Sets/src/mage/cards/n/NamelessOne.java +++ b/Mage.Sets/src/mage/cards/n/NamelessOne.java @@ -37,7 +37,7 @@ public final class NamelessOne extends CardImpl { // Nameless One's power and toughness are each equal to the number of Wizards on the battlefield. this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerToughnessSourceEffect(new PermanentsOnBattlefieldCount(filter)))); // Morph {2}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}"))); } private NamelessOne(final NamelessOne card) { diff --git a/Mage.Sets/src/mage/cards/n/NantukoVigilante.java b/Mage.Sets/src/mage/cards/n/NantukoVigilante.java index 3bf4b4da79f..148f0108484 100644 --- a/Mage.Sets/src/mage/cards/n/NantukoVigilante.java +++ b/Mage.Sets/src/mage/cards/n/NantukoVigilante.java @@ -32,7 +32,7 @@ public final class NantukoVigilante extends CardImpl { this.toughness = new MageInt(2); // Morph {1}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{G}"))); // When Nantuko Vigilante is turned face up, destroy target artifact or enchantment. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new DestroyTargetEffect()); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT)); 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.Sets/src/mage/cards/o/OjutaiInterceptor.java b/Mage.Sets/src/mage/cards/o/OjutaiInterceptor.java index 65f5264a008..5506d260bf3 100644 --- a/Mage.Sets/src/mage/cards/o/OjutaiInterceptor.java +++ b/Mage.Sets/src/mage/cards/o/OjutaiInterceptor.java @@ -28,7 +28,7 @@ public final class OjutaiInterceptor extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Megamorph {3}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{U}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{U}"), true)); } diff --git a/Mage.Sets/src/mage/cards/p/PatronOfTheWild.java b/Mage.Sets/src/mage/cards/p/PatronOfTheWild.java index 1fbcbef3f51..60082ba3c18 100644 --- a/Mage.Sets/src/mage/cards/p/PatronOfTheWild.java +++ b/Mage.Sets/src/mage/cards/p/PatronOfTheWild.java @@ -28,7 +28,7 @@ public final class PatronOfTheWild extends CardImpl { this.toughness = new MageInt(1); // Morph {2}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{G}"))); // When Patron of the Wild is turned face up, target creature gets +3/+3 until end of turn. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new BoostTargetEffect(3, 3, Duration.EndOfTurn)); ability.addTarget(new TargetCreaturePermanent()); diff --git a/Mage.Sets/src/mage/cards/p/PineWalker.java b/Mage.Sets/src/mage/cards/p/PineWalker.java index 6357d5cf7eb..1a80aee7bf5 100644 --- a/Mage.Sets/src/mage/cards/p/PineWalker.java +++ b/Mage.Sets/src/mage/cards/p/PineWalker.java @@ -28,7 +28,7 @@ public final class PineWalker extends CardImpl { this.toughness = new MageInt(5); // Morph {4}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{G}"))); // Whenever Pine Walker or another creature you control is turned face up, untap that creature. Effect effect = new UntapTargetEffect(); effect.setText("untap that creature"); diff --git a/Mage.Sets/src/mage/cards/p/PonybackBrigade.java b/Mage.Sets/src/mage/cards/p/PonybackBrigade.java index a6f85c24f0a..b5b7708843b 100644 --- a/Mage.Sets/src/mage/cards/p/PonybackBrigade.java +++ b/Mage.Sets/src/mage/cards/p/PonybackBrigade.java @@ -36,7 +36,7 @@ public final class PonybackBrigade extends CardImpl { this.addAbility(new PonybackBrigadeAbility(new GoblinToken())); // Morph {2}{R}{W}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{R}{W}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{R}{W}{B}"))); } private PonybackBrigade(final PonybackBrigade card) { diff --git a/Mage.Sets/src/mage/cards/p/PossibilityStorm.java b/Mage.Sets/src/mage/cards/p/PossibilityStorm.java index 2fbe2f50e5d..9aae7f00496 100644 --- a/Mage.Sets/src/mage/cards/p/PossibilityStorm.java +++ b/Mage.Sets/src/mage/cards/p/PossibilityStorm.java @@ -71,10 +71,14 @@ class PossibilityStormTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getZone() != Zone.HAND) { return false; } + if (event.getZone() != Zone.HAND) { + return false; + } Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell == null) { return false; } + if (spell == null) { + return false; + } for (Effect effect : this.getEffects()) { effect.setTargetPointer(new FixedTarget(event.getTargetId())); @@ -102,13 +106,19 @@ class PossibilityStormEffect extends OneShotEffect { spell = ((Spell) game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.STACK)); noLongerOnStack = true; } - if (spell == null) { return false; } + if (spell == null) { + return false; + } Player spellController = game.getPlayer(spell.getControllerId()); - if (spellController == null) { return false; } + if (spellController == null) { + return false; + } MageObject sourceObject = source.getSourceObject(game); - if (sourceObject == null) { return false; } + if (sourceObject == null) { + return false; + } if (!noLongerOnStack) { spellController.moveCardsToExile(spell, source, game, true, source.getSourceId(), sourceObject.getIdName()); diff --git a/Mage.Sets/src/mage/cards/p/PredatorsHour.java b/Mage.Sets/src/mage/cards/p/PredatorsHour.java index af1878ddabb..9fd17a67bd4 100644 --- a/Mage.Sets/src/mage/cards/p/PredatorsHour.java +++ b/Mage.Sets/src/mage/cards/p/PredatorsHour.java @@ -84,16 +84,24 @@ class PredatorsHourEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } Player opponent = game.getPlayer(targetPointer.getFirst(game, source)); - if (opponent == null) { return false; } + if (opponent == null) { + return false; + } MageObject sourceObject = source.getSourceObject(game); - if (sourceObject == null) { return false; } + if (sourceObject == null) { + return false; + } Card topCard = opponent.getLibrary().getFromTop(game); - if (topCard == null) { return false; } + if (topCard == null) { + return false; + } UUID exileZoneId = CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter()); topCard.setFaceDown(true, game); @@ -154,7 +162,9 @@ class PredatorsHourPlayFromExileEffect extends AsThoughEffectImpl { return false; } Card theCard = game.getCard(objectId); - if (theCard == null ) { return false; } + if (theCard == null ) { + return false; + } // for split cards objectId = theCard.getMainCard().getId(); @@ -185,7 +195,9 @@ class PredatorsHourSpendAnyManaEffect extends AsThoughEffectImpl implements AsTh @Override public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { Card theCard = game.getCard(objectId); - if (theCard == null) { return false; } + if (theCard == null) { + return false; + } // for split cards objectId = theCard.getMainCard().getId(); diff --git a/Mage.Sets/src/mage/cards/p/PrimalWhisperer.java b/Mage.Sets/src/mage/cards/p/PrimalWhisperer.java index 669552b58b1..22d59d5f5bd 100644 --- a/Mage.Sets/src/mage/cards/p/PrimalWhisperer.java +++ b/Mage.Sets/src/mage/cards/p/PrimalWhisperer.java @@ -40,7 +40,7 @@ public final class PrimalWhisperer extends CardImpl { PermanentsOnBattlefieldCount amount = new PermanentsOnBattlefieldCount(filter, 2); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(amount, amount, Duration.WhileOnBattlefield))); // Morph {3}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{G}"))); } private PrimalWhisperer(final PrimalWhisperer card) { diff --git a/Mage.Sets/src/mage/cards/p/ProteusMachine.java b/Mage.Sets/src/mage/cards/p/ProteusMachine.java index 9c55605dc46..01dbef07295 100644 --- a/Mage.Sets/src/mage/cards/p/ProteusMachine.java +++ b/Mage.Sets/src/mage/cards/p/ProteusMachine.java @@ -26,7 +26,7 @@ public final class ProteusMachine extends CardImpl { this.toughness = new MageInt(2); // Morph {0} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{0}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{0}"))); // When Proteus Machine is turned face up, it becomes the creature type of your choice. (This effect lasts indefinitely.) this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new BecomesChosenCreatureTypeSourceEffect(false, Duration.Custom))); diff --git a/Mage.Sets/src/mage/cards/p/PutridRaptor.java b/Mage.Sets/src/mage/cards/p/PutridRaptor.java index bac4f725919..effdc56764f 100644 --- a/Mage.Sets/src/mage/cards/p/PutridRaptor.java +++ b/Mage.Sets/src/mage/cards/p/PutridRaptor.java @@ -32,7 +32,7 @@ public final class PutridRaptor extends CardImpl { this.toughness = new MageInt(4); // Morph-Discard a Zombie card. - this.addAbility(new MorphAbility(new DiscardCardCost(filter))); + this.addAbility(new MorphAbility(this, new DiscardCardCost(filter))); } private PutridRaptor(final PutridRaptor card) { diff --git a/Mage.Sets/src/mage/cards/q/QuicksilverDragon.java b/Mage.Sets/src/mage/cards/q/QuicksilverDragon.java index 1663c3e9469..610782b724f 100644 --- a/Mage.Sets/src/mage/cards/q/QuicksilverDragon.java +++ b/Mage.Sets/src/mage/cards/q/QuicksilverDragon.java @@ -43,7 +43,7 @@ public final class QuicksilverDragon extends CardImpl { this.addAbility(ability); // Morph {4}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{U}"))); } private QuicksilverDragon(final QuicksilverDragon card) { diff --git a/Mage.Sets/src/mage/cards/r/RattleclawMystic.java b/Mage.Sets/src/mage/cards/r/RattleclawMystic.java index 6c33b7ac8b9..d8ed75e0f44 100644 --- a/Mage.Sets/src/mage/cards/r/RattleclawMystic.java +++ b/Mage.Sets/src/mage/cards/r/RattleclawMystic.java @@ -36,7 +36,7 @@ public final class RattleclawMystic extends CardImpl { this.addAbility(new RedManaAbility()); // Morph {2} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}"))); // When Rattleclaw Mystic is turned face up, add {G}{U}{R}. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new AddManaToManaPoolSourceControllerEffect(new Mana(0, 1, 0, 1,1, 0,0, 0)))); diff --git a/Mage.Sets/src/mage/cards/r/RavenGuildInitiate.java b/Mage.Sets/src/mage/cards/r/RavenGuildInitiate.java index c098c694c7b..9825c9f5475 100644 --- a/Mage.Sets/src/mage/cards/r/RavenGuildInitiate.java +++ b/Mage.Sets/src/mage/cards/r/RavenGuildInitiate.java @@ -33,7 +33,7 @@ public final class RavenGuildInitiate extends CardImpl { this.toughness = new MageInt(4); // Morph-Return a Bird you control to its owner's hand. - this.addAbility(new MorphAbility(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)))); + this.addAbility(new MorphAbility(this, new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)))); } diff --git a/Mage.Sets/src/mage/cards/r/RavenGuildMaster.java b/Mage.Sets/src/mage/cards/r/RavenGuildMaster.java index bc30ea28a14..a57e1d6dab4 100644 --- a/Mage.Sets/src/mage/cards/r/RavenGuildMaster.java +++ b/Mage.Sets/src/mage/cards/r/RavenGuildMaster.java @@ -30,7 +30,7 @@ public final class RavenGuildMaster extends CardImpl { this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new ExileCardsFromTopOfLibraryTargetEffect(10), false, true)); // Morph {2}{U}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}{U}"))); } private RavenGuildMaster(final RavenGuildMaster card) { diff --git a/Mage.Sets/src/mage/cards/r/ReflectorMage.java b/Mage.Sets/src/mage/cards/r/ReflectorMage.java index a98ed69d556..2ff8fe08be0 100644 --- a/Mage.Sets/src/mage/cards/r/ReflectorMage.java +++ b/Mage.Sets/src/mage/cards/r/ReflectorMage.java @@ -2,6 +2,7 @@ package mage.cards.r; import mage.MageInt; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.OneShotEffect; @@ -13,7 +14,6 @@ import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; -import mage.game.stack.Spell; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; import mage.util.CardUtil; @@ -113,15 +113,15 @@ class ExclusionRitualReplacementEffect extends ContinuousRuleModifyingEffectImpl @Override public boolean applies(GameEvent event, Ability source, Game game) { - Card card = game.getCard(event.getSourceId()); - if (card != null) { - Spell spell = game.getState().getStack().getSpell(event.getSourceId()); - if (spell != null && spell.isFaceDown(game)) { - return false; // Face Down cast spell (Morph creature) has no name - } - return CardUtil.haveSameNames(card, creatureName, game) && Objects.equals(ownerId, card.getOwnerId()); + SpellAbility spellAbility = SpellAbility.getSpellAbilityFromEvent(event, game); + if (spellAbility == null) { + return false; } - return false; + Card card = spellAbility.getCharacteristics(game); + if (card == null) { + return false; + } + return CardUtil.haveSameNames(card, creatureName, game) && Objects.equals(ownerId, card.getOwnerId()); } @Override diff --git a/Mage.Sets/src/mage/cards/r/RiptideBiologist.java b/Mage.Sets/src/mage/cards/r/RiptideBiologist.java index cffcd81a23c..6ccae2f4e9d 100644 --- a/Mage.Sets/src/mage/cards/r/RiptideBiologist.java +++ b/Mage.Sets/src/mage/cards/r/RiptideBiologist.java @@ -34,7 +34,7 @@ public final class RiptideBiologist extends CardImpl { // Protection from Beasts this.addAbility(new ProtectionAbility(filter)); // Morph {2}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}"))); } private RiptideBiologist(final RiptideBiologist card) { diff --git a/Mage.Sets/src/mage/cards/r/RiptideEntrancer.java b/Mage.Sets/src/mage/cards/r/RiptideEntrancer.java index c3109f8a47e..d4be40d10c4 100644 --- a/Mage.Sets/src/mage/cards/r/RiptideEntrancer.java +++ b/Mage.Sets/src/mage/cards/r/RiptideEntrancer.java @@ -39,7 +39,7 @@ public final class RiptideEntrancer extends CardImpl { this.addAbility(new RiptideEntrancerTriggeredAbility()); // Morph {U}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{U}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}{U}"))); } private RiptideEntrancer(final RiptideEntrancer card) { diff --git a/Mage.Sets/src/mage/cards/r/RiptidePilferer.java b/Mage.Sets/src/mage/cards/r/RiptidePilferer.java index 5b6def861e0..c9009eb557b 100644 --- a/Mage.Sets/src/mage/cards/r/RiptidePilferer.java +++ b/Mage.Sets/src/mage/cards/r/RiptidePilferer.java @@ -27,7 +27,7 @@ public final class RiptidePilferer extends CardImpl { // Whenever Riptide Pilferer deals combat damage to a player, that player discards a card. this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(1), false, true)); // Morph {U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}"))); } private RiptidePilferer(final RiptidePilferer card) { diff --git a/Mage.Sets/src/mage/cards/r/RiptideSurvivor.java b/Mage.Sets/src/mage/cards/r/RiptideSurvivor.java index 2fab17cfd20..a10c38247fc 100644 --- a/Mage.Sets/src/mage/cards/r/RiptideSurvivor.java +++ b/Mage.Sets/src/mage/cards/r/RiptideSurvivor.java @@ -30,7 +30,7 @@ public final class RiptideSurvivor extends CardImpl { this.toughness = new MageInt(1); // Morph {1}{U}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{U}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{U}{U}"))); // When Riptide Survivor is turned face up, discard two cards, then draw three cards. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new DiscardControllerEffect(2)); Effect effect = new DrawCardSourceControllerEffect(3); diff --git a/Mage.Sets/src/mage/cards/r/RockshardElemental.java b/Mage.Sets/src/mage/cards/r/RockshardElemental.java index e4b52516354..9271e572851 100644 --- a/Mage.Sets/src/mage/cards/r/RockshardElemental.java +++ b/Mage.Sets/src/mage/cards/r/RockshardElemental.java @@ -26,7 +26,7 @@ public final class RockshardElemental extends CardImpl { // Double strike this.addAbility(DoubleStrikeAbility.getInstance()); // Morph {4}{R}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{R}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{R}{R}"))); } private RockshardElemental(final RockshardElemental card) { diff --git a/Mage.Sets/src/mage/cards/r/RootElemental.java b/Mage.Sets/src/mage/cards/r/RootElemental.java index 6f4af3d31af..41bd1c65f77 100644 --- a/Mage.Sets/src/mage/cards/r/RootElemental.java +++ b/Mage.Sets/src/mage/cards/r/RootElemental.java @@ -26,7 +26,7 @@ public final class RootElemental extends CardImpl { this.toughness = new MageInt(5); // Morph {5}{G}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{G}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{G}{G}"))); // When Root Elemental is turned face up, you may put a creature card from your hand onto the battlefield. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_CREATURE_A))); } diff --git a/Mage.Sets/src/mage/cards/r/RuthlessRipper.java b/Mage.Sets/src/mage/cards/r/RuthlessRipper.java index efd680cf517..01f4da08f5a 100644 --- a/Mage.Sets/src/mage/cards/r/RuthlessRipper.java +++ b/Mage.Sets/src/mage/cards/r/RuthlessRipper.java @@ -43,7 +43,7 @@ public final class RuthlessRipper extends CardImpl { this.addAbility(DeathtouchAbility.getInstance()); // Morph - Reveal a black card in your hand. - this.addAbility(new MorphAbility(new RevealTargetFromHandCost(new TargetCardInHand(filter)))); + this.addAbility(new MorphAbility(this, new RevealTargetFromHandCost(new TargetCardInHand(filter)))); // When Ruthless Ripper is turned face up, target player loses 2 life. Effect effect = new LoseLifeTargetEffect(2); diff --git a/Mage.Sets/src/mage/cards/s/SageEyeHarrier.java b/Mage.Sets/src/mage/cards/s/SageEyeHarrier.java index 6e709e39393..d3dd96f0ecc 100644 --- a/Mage.Sets/src/mage/cards/s/SageEyeHarrier.java +++ b/Mage.Sets/src/mage/cards/s/SageEyeHarrier.java @@ -28,7 +28,7 @@ public final class SageEyeHarrier extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Morph {3}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{W}"))); } private SageEyeHarrier(final SageEyeHarrier card) { diff --git a/Mage.Sets/src/mage/cards/s/SaguArcher.java b/Mage.Sets/src/mage/cards/s/SaguArcher.java index 7837e61f10e..10ba311b274 100644 --- a/Mage.Sets/src/mage/cards/s/SaguArcher.java +++ b/Mage.Sets/src/mage/cards/s/SaguArcher.java @@ -28,7 +28,7 @@ public final class SaguArcher extends CardImpl { // Reach this.addAbility(ReachAbility.getInstance()); // Morph {4}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{G}"))); } private SaguArcher(final SaguArcher card) { diff --git a/Mage.Sets/src/mage/cards/s/SaguMauler.java b/Mage.Sets/src/mage/cards/s/SaguMauler.java index 7994e4a2934..177a8682509 100644 --- a/Mage.Sets/src/mage/cards/s/SaguMauler.java +++ b/Mage.Sets/src/mage/cards/s/SaguMauler.java @@ -30,7 +30,7 @@ public final class SaguMauler extends CardImpl { // Hexproof this.addAbility(HexproofAbility.getInstance()); // Morph {3}{G}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{G}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{G}{U}"))); } private SaguMauler(final SaguMauler card) { diff --git a/Mage.Sets/src/mage/cards/s/SaltRoadAmbushers.java b/Mage.Sets/src/mage/cards/s/SaltRoadAmbushers.java index a174228a2e2..44332a5de6d 100644 --- a/Mage.Sets/src/mage/cards/s/SaltRoadAmbushers.java +++ b/Mage.Sets/src/mage/cards/s/SaltRoadAmbushers.java @@ -32,7 +32,7 @@ public final class SaltRoadAmbushers extends CardImpl { this.addAbility(new SaltRoadAmbushersTriggeredAbility()); // Megamorph {3}{G}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{G}{G}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{G}{G}"), true)); } private SaltRoadAmbushers(final SaltRoadAmbushers card) { diff --git a/Mage.Sets/src/mage/cards/s/SandstormCharger.java b/Mage.Sets/src/mage/cards/s/SandstormCharger.java index c3f645b9254..00d9442e215 100644 --- a/Mage.Sets/src/mage/cards/s/SandstormCharger.java +++ b/Mage.Sets/src/mage/cards/s/SandstormCharger.java @@ -23,7 +23,7 @@ public final class SandstormCharger extends CardImpl { this.toughness = new MageInt(4); // Megamorph {4}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{W}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{W}"), true)); } private SandstormCharger(final SandstormCharger card) { diff --git a/Mage.Sets/src/mage/cards/s/ScornfulEgotist.java b/Mage.Sets/src/mage/cards/s/ScornfulEgotist.java index d14005ffc1f..582d7ccacc3 100644 --- a/Mage.Sets/src/mage/cards/s/ScornfulEgotist.java +++ b/Mage.Sets/src/mage/cards/s/ScornfulEgotist.java @@ -24,7 +24,7 @@ public final class ScornfulEgotist extends CardImpl { this.toughness = new MageInt(1); // Morph {U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}"))); } private ScornfulEgotist(final ScornfulEgotist card) { diff --git a/Mage.Sets/src/mage/cards/s/SegmentedKrotiq.java b/Mage.Sets/src/mage/cards/s/SegmentedKrotiq.java index 9b12b9e15bd..3322876e018 100644 --- a/Mage.Sets/src/mage/cards/s/SegmentedKrotiq.java +++ b/Mage.Sets/src/mage/cards/s/SegmentedKrotiq.java @@ -23,7 +23,7 @@ public final class SegmentedKrotiq extends CardImpl { this.toughness = new MageInt(5); // Megamorph {6}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{6}{G}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{6}{G}"), true)); } private SegmentedKrotiq(final SegmentedKrotiq card) { diff --git a/Mage.Sets/src/mage/cards/s/SerpentineBasilisk.java b/Mage.Sets/src/mage/cards/s/SerpentineBasilisk.java index 81cf312cc80..0706d12f851 100644 --- a/Mage.Sets/src/mage/cards/s/SerpentineBasilisk.java +++ b/Mage.Sets/src/mage/cards/s/SerpentineBasilisk.java @@ -32,7 +32,7 @@ public final class SerpentineBasilisk extends CardImpl { new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect("destroy that creature at end of combat")) .setTriggerPhrase(""), true), false, true)); // Morph {1}{G}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{G}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{G}{G}"))); } private SerpentineBasilisk(final SerpentineBasilisk card) { diff --git a/Mage.Sets/src/mage/cards/s/ShadowgrangeArchfiend.java b/Mage.Sets/src/mage/cards/s/ShadowgrangeArchfiend.java index 74faa038b0c..80e1941932a 100644 --- a/Mage.Sets/src/mage/cards/s/ShadowgrangeArchfiend.java +++ b/Mage.Sets/src/mage/cards/s/ShadowgrangeArchfiend.java @@ -69,7 +69,9 @@ class ShadowgrangeArchfiendEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) {return false; } + if (controller == null) { + return false; + } List toSacrifice = new ArrayList<>(); diff --git a/Mage.Sets/src/mage/cards/s/ShaleskinPlower.java b/Mage.Sets/src/mage/cards/s/ShaleskinPlower.java index 1ab4a6cfcda..3b29e025758 100644 --- a/Mage.Sets/src/mage/cards/s/ShaleskinPlower.java +++ b/Mage.Sets/src/mage/cards/s/ShaleskinPlower.java @@ -27,7 +27,7 @@ public final class ShaleskinPlower extends CardImpl { this.toughness = new MageInt(2); // Morph {4}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{R}"))); // When Shaleskin Plower is turned face up, destroy target land. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new DestroyTargetEffect()); ability.addTarget(new TargetLandPermanent()); diff --git a/Mage.Sets/src/mage/cards/s/ShaperParasite.java b/Mage.Sets/src/mage/cards/s/ShaperParasite.java index 7b28e2087ad..badad55be97 100644 --- a/Mage.Sets/src/mage/cards/s/ShaperParasite.java +++ b/Mage.Sets/src/mage/cards/s/ShaperParasite.java @@ -35,7 +35,7 @@ public final class ShaperParasite extends CardImpl { this.toughness = new MageInt(3); // Morph {2}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}"))); // When Shaper Parasite is turned face up, target creature gets +2/-2 or -2/+2 until end of turn. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new ShaperParasiteEffect()); ability.addTarget(new TargetCreaturePermanent()); diff --git a/Mage.Sets/src/mage/cards/s/ShieldhideDragon.java b/Mage.Sets/src/mage/cards/s/ShieldhideDragon.java index 9c7aeb4518d..68bfffe49b5 100644 --- a/Mage.Sets/src/mage/cards/s/ShieldhideDragon.java +++ b/Mage.Sets/src/mage/cards/s/ShieldhideDragon.java @@ -43,7 +43,7 @@ public final class ShieldhideDragon extends CardImpl { this.addAbility(LifelinkAbility.getInstance()); // Megamorph {5}{W}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{W}{W}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{W}{W}"), true)); // When Shieldhide Dragon is turned face up, put a +1/+1 counter on each other Dragon you control. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter), false, false)); diff --git a/Mage.Sets/src/mage/cards/s/ShorecrasherElemental.java b/Mage.Sets/src/mage/cards/s/ShorecrasherElemental.java index c3af682d542..819ceb3470c 100644 --- a/Mage.Sets/src/mage/cards/s/ShorecrasherElemental.java +++ b/Mage.Sets/src/mage/cards/s/ShorecrasherElemental.java @@ -44,7 +44,7 @@ public final class ShorecrasherElemental extends CardImpl { this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ShorecrasherElementalBoostEffect(), new ManaCostsImpl<>("{1}"))); // Megamorph {4}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{U}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{U}"), true)); } diff --git a/Mage.Sets/src/mage/cards/s/SidisisPet.java b/Mage.Sets/src/mage/cards/s/SidisisPet.java index 7872976acc9..3785073bc27 100644 --- a/Mage.Sets/src/mage/cards/s/SidisisPet.java +++ b/Mage.Sets/src/mage/cards/s/SidisisPet.java @@ -29,7 +29,7 @@ public final class SidisisPet extends CardImpl { this.addAbility(LifelinkAbility.getInstance()); // Morph {1}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{B}"))); } private SidisisPet(final SidisisPet card) { diff --git a/Mage.Sets/src/mage/cards/s/SilentSpecter.java b/Mage.Sets/src/mage/cards/s/SilentSpecter.java index 17640647106..23f63fcc71d 100644 --- a/Mage.Sets/src/mage/cards/s/SilentSpecter.java +++ b/Mage.Sets/src/mage/cards/s/SilentSpecter.java @@ -31,7 +31,7 @@ public final class SilentSpecter extends CardImpl { // Whenever Silent Specter deals combat damage to a player, that player discards two cards. this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(2), false, true)); // Morph {3}{B}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{B}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{B}{B}"))); } private SilentSpecter(final SilentSpecter card) { diff --git a/Mage.Sets/src/mage/cards/s/SilumgarAssassin.java b/Mage.Sets/src/mage/cards/s/SilumgarAssassin.java index eb84761c0b3..a91b3a7d476 100644 --- a/Mage.Sets/src/mage/cards/s/SilumgarAssassin.java +++ b/Mage.Sets/src/mage/cards/s/SilumgarAssassin.java @@ -45,7 +45,7 @@ public final class SilumgarAssassin extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesWithGreaterPowerEffect())); // Megamorph {2}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{B}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{B}"), true)); // When Silumgar Assassin is turned face up, destroy target creature with power 3 or less an opponent controls. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new DestroyTargetEffect(), false); diff --git a/Mage.Sets/src/mage/cards/s/SilumgarSpellEater.java b/Mage.Sets/src/mage/cards/s/SilumgarSpellEater.java index ea5b361c521..baf1fb84642 100644 --- a/Mage.Sets/src/mage/cards/s/SilumgarSpellEater.java +++ b/Mage.Sets/src/mage/cards/s/SilumgarSpellEater.java @@ -29,7 +29,7 @@ public final class SilumgarSpellEater extends CardImpl { this.toughness = new MageInt(3); // Megamorph {4}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{U}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{U}"), true)); // When Silumgar Spell-Eater is turned face up, counter target spell unless its controller pays {3}. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new CounterUnlessPaysEffect(new GenericManaCost(3)), false, false); diff --git a/Mage.Sets/src/mage/cards/s/Skinthinner.java b/Mage.Sets/src/mage/cards/s/Skinthinner.java index ce738b65b9f..dda8978f95e 100644 --- a/Mage.Sets/src/mage/cards/s/Skinthinner.java +++ b/Mage.Sets/src/mage/cards/s/Skinthinner.java @@ -27,7 +27,7 @@ public final class Skinthinner extends CardImpl { this.toughness = new MageInt(1); // Morph {3}{B}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{B}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{B}{B}"))); // When Skinthinner is turned face up, destroy target nonblack creature. It can't be regenerated. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new DestroyTargetEffect(true)); ability.addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK)); diff --git a/Mage.Sets/src/mage/cards/s/SkirkCommando.java b/Mage.Sets/src/mage/cards/s/SkirkCommando.java index f3369764f97..335dd0893e1 100644 --- a/Mage.Sets/src/mage/cards/s/SkirkCommando.java +++ b/Mage.Sets/src/mage/cards/s/SkirkCommando.java @@ -35,7 +35,7 @@ public final class SkirkCommando extends CardImpl { this.addAbility(new SkirkCommandoTriggeredAbility()); //Morph {2}{R} (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.) - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{R}"))); } diff --git a/Mage.Sets/src/mage/cards/s/SkirkMarauder.java b/Mage.Sets/src/mage/cards/s/SkirkMarauder.java index a86dcb65afb..0cbe4d84474 100644 --- a/Mage.Sets/src/mage/cards/s/SkirkMarauder.java +++ b/Mage.Sets/src/mage/cards/s/SkirkMarauder.java @@ -27,7 +27,7 @@ public final class SkirkMarauder extends CardImpl { this.toughness = new MageInt(1); // Morph {2}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{R}"))); // When Skirk Marauder is turned face up, it deals 2 damage to any target. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new DamageTargetEffect(2, "it")); diff --git a/Mage.Sets/src/mage/cards/s/SkirkVolcanist.java b/Mage.Sets/src/mage/cards/s/SkirkVolcanist.java index 0d9c5b13e97..d130eeb8114 100644 --- a/Mage.Sets/src/mage/cards/s/SkirkVolcanist.java +++ b/Mage.Sets/src/mage/cards/s/SkirkVolcanist.java @@ -34,7 +34,7 @@ public final class SkirkVolcanist extends CardImpl { this.toughness = new MageInt(1); // Morph-Sacrifice two Mountains. - this.addAbility(new MorphAbility(new SacrificeTargetCost(new TargetControlledPermanent(2, filter)))); + this.addAbility(new MorphAbility(this, new SacrificeTargetCost(new TargetControlledPermanent(2, filter)))); // When Skirk Volcanist is turned face up, it deals 3 damage divided as you choose among one, two, or three target creatures. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new DamageMultiEffect(3, "it")); diff --git a/Mage.Sets/src/mage/cards/s/SkittishValesk.java b/Mage.Sets/src/mage/cards/s/SkittishValesk.java index 492388fe66d..1e60bbb01fd 100644 --- a/Mage.Sets/src/mage/cards/s/SkittishValesk.java +++ b/Mage.Sets/src/mage/cards/s/SkittishValesk.java @@ -35,7 +35,7 @@ public final class SkittishValesk extends CardImpl { this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new SkittishValeskEffect(), TargetController.YOU, false)); // Morph {5}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{R}"))); } private SkittishValesk(final SkittishValesk card) { diff --git a/Mage.Sets/src/mage/cards/s/SlipstreamSerpent.java b/Mage.Sets/src/mage/cards/s/SlipstreamSerpent.java index ef4bbffbf85..a4d53e0547d 100644 --- a/Mage.Sets/src/mage/cards/s/SlipstreamSerpent.java +++ b/Mage.Sets/src/mage/cards/s/SlipstreamSerpent.java @@ -38,7 +38,7 @@ public final class SlipstreamSerpent extends CardImpl { new SacrificeSourceEffect())); // Morph {5}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{U}"))); } private SlipstreamSerpent(final SlipstreamSerpent card) { diff --git a/Mage.Sets/src/mage/cards/s/SnappingThragg.java b/Mage.Sets/src/mage/cards/s/SnappingThragg.java index b044c1d33b1..5809d6322e7 100644 --- a/Mage.Sets/src/mage/cards/s/SnappingThragg.java +++ b/Mage.Sets/src/mage/cards/s/SnappingThragg.java @@ -36,7 +36,7 @@ public final class SnappingThragg extends CardImpl { this.addAbility(new SnappingThraggTriggeredAbility()); // Morph {4}{R}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{R}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{R}{R}"))); } diff --git a/Mage.Sets/src/mage/cards/s/SnarlingUndorak.java b/Mage.Sets/src/mage/cards/s/SnarlingUndorak.java index 41bc9c0c150..4d7d511583d 100644 --- a/Mage.Sets/src/mage/cards/s/SnarlingUndorak.java +++ b/Mage.Sets/src/mage/cards/s/SnarlingUndorak.java @@ -40,7 +40,7 @@ public final class SnarlingUndorak extends CardImpl { ability.addTarget(new TargetCreaturePermanent(filter)); this.addAbility(ability); // Morph {1}{G}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{G}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{G}{G}"))); } private SnarlingUndorak(final SnarlingUndorak card) { diff --git a/Mage.Sets/src/mage/cards/s/SnowhornRider.java b/Mage.Sets/src/mage/cards/s/SnowhornRider.java index b0071652449..400d94e9bd9 100644 --- a/Mage.Sets/src/mage/cards/s/SnowhornRider.java +++ b/Mage.Sets/src/mage/cards/s/SnowhornRider.java @@ -28,7 +28,7 @@ public final class SnowhornRider extends CardImpl { // Trample this.addAbility(TrampleAbility.getInstance()); // Morph {2}{G}{U}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{G}{U}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{G}{U}{R}"))); } private SnowhornRider(final SnowhornRider card) { diff --git a/Mage.Sets/src/mage/cards/s/SootfeatherFlock.java b/Mage.Sets/src/mage/cards/s/SootfeatherFlock.java index 2da0499f1b7..a3b9bae19cf 100644 --- a/Mage.Sets/src/mage/cards/s/SootfeatherFlock.java +++ b/Mage.Sets/src/mage/cards/s/SootfeatherFlock.java @@ -26,7 +26,7 @@ public final class SootfeatherFlock extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Morph {3}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{B}"))); } private SootfeatherFlock(final SootfeatherFlock card) { diff --git a/Mage.Sets/src/mage/cards/s/SoulCollector.java b/Mage.Sets/src/mage/cards/s/SoulCollector.java index 713fc03f0c1..1905e04f15e 100644 --- a/Mage.Sets/src/mage/cards/s/SoulCollector.java +++ b/Mage.Sets/src/mage/cards/s/SoulCollector.java @@ -31,7 +31,7 @@ public final class SoulCollector extends CardImpl { this.addAbility(new DealtDamageAndDiedTriggeredAbility(new ReturnToBattlefieldUnderYourControlTargetEffect())); // Morph {B}{B}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{B}{B}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{B}{B}{B}"))); } private SoulCollector(final SoulCollector card) { diff --git a/Mage.Sets/src/mage/cards/s/SpinedBasher.java b/Mage.Sets/src/mage/cards/s/SpinedBasher.java index c550136e792..63e1fe5b22c 100644 --- a/Mage.Sets/src/mage/cards/s/SpinedBasher.java +++ b/Mage.Sets/src/mage/cards/s/SpinedBasher.java @@ -24,7 +24,7 @@ public final class SpinedBasher extends CardImpl { this.toughness = new MageInt(1); // Morph {2}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{B}"))); } private SpinedBasher(final SpinedBasher card) { diff --git a/Mage.Sets/src/mage/cards/s/SpittingGourna.java b/Mage.Sets/src/mage/cards/s/SpittingGourna.java index fd491fcb8bd..846dc38c1cc 100644 --- a/Mage.Sets/src/mage/cards/s/SpittingGourna.java +++ b/Mage.Sets/src/mage/cards/s/SpittingGourna.java @@ -26,7 +26,7 @@ public final class SpittingGourna extends CardImpl { // Reach this.addAbility(ReachAbility.getInstance()); // Morph {4}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{G}"))); } private SpittingGourna(final SpittingGourna card) { diff --git a/Mage.Sets/src/mage/cards/s/StormcragElemental.java b/Mage.Sets/src/mage/cards/s/StormcragElemental.java index 717b6b270f8..24644b7b221 100644 --- a/Mage.Sets/src/mage/cards/s/StormcragElemental.java +++ b/Mage.Sets/src/mage/cards/s/StormcragElemental.java @@ -27,7 +27,7 @@ public final class StormcragElemental extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // Megamorph {4}{R}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{R}{R}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{R}{R}"), true)); } private StormcragElemental(final StormcragElemental card) { diff --git a/Mage.Sets/src/mage/cards/s/StormwingDragon.java b/Mage.Sets/src/mage/cards/s/StormwingDragon.java index 4d39ce2588e..bf694645749 100644 --- a/Mage.Sets/src/mage/cards/s/StormwingDragon.java +++ b/Mage.Sets/src/mage/cards/s/StormwingDragon.java @@ -43,7 +43,7 @@ public final class StormwingDragon extends CardImpl { this.addAbility(FirstStrikeAbility.getInstance()); // Megamorph {5}{R}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{R}{R}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{R}{R}"), true)); // When Stormwing Dragon is turned face up, put a +1/+1 counter on each other Dragon creature you control. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter), false, false)); diff --git a/Mage.Sets/src/mage/cards/s/StratusDancer.java b/Mage.Sets/src/mage/cards/s/StratusDancer.java index a32d05dd07a..422e1ce0938 100644 --- a/Mage.Sets/src/mage/cards/s/StratusDancer.java +++ b/Mage.Sets/src/mage/cards/s/StratusDancer.java @@ -34,7 +34,7 @@ public final class StratusDancer extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Megamorph {1}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{U}"), true)); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{U}"), true)); // When Stratus Dancer is turned face up, counter target instant or sorcery spell Effect effect = new CounterTargetEffect(); diff --git a/Mage.Sets/src/mage/cards/s/StrefanMaurerProgenitor.java b/Mage.Sets/src/mage/cards/s/StrefanMaurerProgenitor.java index 4e8a566bfca..9c2c08faf3d 100644 --- a/Mage.Sets/src/mage/cards/s/StrefanMaurerProgenitor.java +++ b/Mage.Sets/src/mage/cards/s/StrefanMaurerProgenitor.java @@ -113,18 +113,26 @@ class StrefanMaurerProgenitorPlayVampireEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - if (player == null) { return false; } + if (player == null) { + return false; + } TargetCard target = new TargetCardInHand(0, 1, vampireCardFilter); - if (!player.choose(outcome, player.getHand(), target, source, game)) { return false; } + if (!player.choose(outcome, player.getHand(), target, source, game)) { + return false; + } Card card = game.getCard(target.getFirstTarget()); - if (card == null) { return false; } + if (card == null) { + return false; + } player.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, true, null); Permanent permanent = game.getPermanent(card.getId()); - if (permanent == null) { return false; } + if (permanent == null) { + return false; + } game.getCombat().addAttackingCreature(permanent.getId(), game); diff --git a/Mage.Sets/src/mage/cards/t/TemurCharger.java b/Mage.Sets/src/mage/cards/t/TemurCharger.java index 764118f0bd7..d0df7b38439 100644 --- a/Mage.Sets/src/mage/cards/t/TemurCharger.java +++ b/Mage.Sets/src/mage/cards/t/TemurCharger.java @@ -40,7 +40,7 @@ public final class TemurCharger extends CardImpl { this.toughness = new MageInt(1); // Morph - Reveal a green card in your hand. - this.addAbility(new MorphAbility(new RevealTargetFromHandCost(new TargetCardInHand(filter)))); + this.addAbility(new MorphAbility(this, new RevealTargetFromHandCost(new TargetCardInHand(filter)))); // When Temur Charger is turned face up, target creature gains trample until end of turn. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)); diff --git a/Mage.Sets/src/mage/cards/t/TheloniteHermit.java b/Mage.Sets/src/mage/cards/t/TheloniteHermit.java index e9eb5dbaaa6..e80cf2ccb2d 100644 --- a/Mage.Sets/src/mage/cards/t/TheloniteHermit.java +++ b/Mage.Sets/src/mage/cards/t/TheloniteHermit.java @@ -42,7 +42,7 @@ public final class TheloniteHermit extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, false))); // Morph {3}{G}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{G}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{G}{G}"))); // When Thelonite Hermit is turned face up, create four 1/1 green Saproling creature tokens. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new CreateTokenEffect(new SaprolingToken(), 4))); diff --git a/Mage.Sets/src/mage/cards/t/ThievesAuction.java b/Mage.Sets/src/mage/cards/t/ThievesAuction.java index 2019f0c22e0..4e4ec0794c6 100644 --- a/Mage.Sets/src/mage/cards/t/ThievesAuction.java +++ b/Mage.Sets/src/mage/cards/t/ThievesAuction.java @@ -68,7 +68,9 @@ class ThievesAuctionEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } // Exile all nontoken permanents. Cards exiledCards = new CardsImpl(); diff --git a/Mage.Sets/src/mage/cards/t/ThousandWinds.java b/Mage.Sets/src/mage/cards/t/ThousandWinds.java index 239d7c14a9c..9c9be8b641f 100644 --- a/Mage.Sets/src/mage/cards/t/ThousandWinds.java +++ b/Mage.Sets/src/mage/cards/t/ThousandWinds.java @@ -39,7 +39,7 @@ public final class ThousandWinds extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Morph {5}{U}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{U}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{U}{U}"))); // When Thousand Winds is turned face up, return all other tapped creatures to their owners' hands. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new ReturnToHandFromBattlefieldAllEffect(filter))); } diff --git a/Mage.Sets/src/mage/cards/t/ThrashingMudspawn.java b/Mage.Sets/src/mage/cards/t/ThrashingMudspawn.java index d3d13cb81f9..81124930134 100644 --- a/Mage.Sets/src/mage/cards/t/ThrashingMudspawn.java +++ b/Mage.Sets/src/mage/cards/t/ThrashingMudspawn.java @@ -35,7 +35,7 @@ public final class ThrashingMudspawn extends CardImpl { this.addAbility(ability); // Morph {1}{B}{B} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{B}{B}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{B}{B}"))); } diff --git a/Mage.Sets/src/mage/cards/t/ThrillingEncore.java b/Mage.Sets/src/mage/cards/t/ThrillingEncore.java index 81e837ea137..e03513c498c 100644 --- a/Mage.Sets/src/mage/cards/t/ThrillingEncore.java +++ b/Mage.Sets/src/mage/cards/t/ThrillingEncore.java @@ -68,7 +68,9 @@ class ThrillingEncoreEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); CardsPutIntoGraveyardWatcher watcher = game.getState().getWatcher(CardsPutIntoGraveyardWatcher.class); - if (controller == null || watcher == null) { return false; } + if (controller == null || watcher == null) { + return false; + } Cards cards = new CardsImpl(watcher.getCardsPutIntoGraveyardFromBattlefield(game)); cards.removeIf(uuid -> !game.getCard(uuid).isCreature(game)); diff --git a/Mage.Sets/src/mage/cards/t/Timebender.java b/Mage.Sets/src/mage/cards/t/Timebender.java index 88d9b6aa4b1..73efd25a823 100644 --- a/Mage.Sets/src/mage/cards/t/Timebender.java +++ b/Mage.Sets/src/mage/cards/t/Timebender.java @@ -41,7 +41,7 @@ public final class Timebender extends CardImpl { this.toughness = new MageInt(1); // Morph {U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}"))); // When Timebender is turned face up, choose one — // Remove two time counters from target permanent or suspended card. diff --git a/Mage.Sets/src/mage/cards/t/TimotharBaronOfBats.java b/Mage.Sets/src/mage/cards/t/TimotharBaronOfBats.java index 84e255aa46a..c981650054d 100644 --- a/Mage.Sets/src/mage/cards/t/TimotharBaronOfBats.java +++ b/Mage.Sets/src/mage/cards/t/TimotharBaronOfBats.java @@ -84,11 +84,15 @@ class TimotharBaronOfBatsCreateBatEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { return false; } + if (controller == null) { + return false; + } // Check vampire card still exists and is still in the graveyard Card vampireCard = game.getCard(targetPointer.getFirst(game, source)); - if (vampireCard == null) { return false; } + if (vampireCard == null) { + return false; + } // Create costs ManaCosts costs = new ManaCostsImpl<>("{1}"); @@ -99,9 +103,15 @@ class TimotharBaronOfBatsCreateBatEffect extends OneShotEffect { "sacrifice it and return the exiled card to the battlefield tapped\"."; // Ask player if they wanna pay cost - if (!costs.canPay(source, source, controller.getId(), game)) { return false; } - if (!controller.chooseUse(Outcome.Benefit, costPromptMessage, source, game)) { return false; } - if (!costs.pay(source, game, source, controller.getId(),false)) { return false; } + if (!costs.canPay(source, source, controller.getId(), game)) { + return false; + } + if (!controller.chooseUse(Outcome.Benefit, costPromptMessage, source, game)) { + return false; + } + if (!costs.pay(source, game, source, controller.getId(),false)) { + return false; + } // Exile the card as part of the cost. // Handled this way so that the player doesn't have to dig through their graveyard for the card. controller.moveCards(vampireCard, Zone.EXILED, source, game); @@ -144,10 +154,14 @@ class TimotharBaronOfBatsReturnEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - if (player == null) { return false; } + if (player == null) { + return false; + } Card card = morOfCardToReturn.getCard(game); - if (card == null) { return false; } + if (card == null) { + return false; + } return player.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, true, null); } diff --git a/Mage.Sets/src/mage/cards/t/TitanicBulvox.java b/Mage.Sets/src/mage/cards/t/TitanicBulvox.java index 2e81c03d267..4c1124576e5 100644 --- a/Mage.Sets/src/mage/cards/t/TitanicBulvox.java +++ b/Mage.Sets/src/mage/cards/t/TitanicBulvox.java @@ -26,7 +26,7 @@ public final class TitanicBulvox extends CardImpl { // Trample this.addAbility(TrampleAbility.getInstance()); // Morph {4}{G}{G}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{G}{G}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{G}{G}{G}"))); } private TitanicBulvox(final TitanicBulvox card) { diff --git a/Mage.Sets/src/mage/cards/t/ToweringBaloth.java b/Mage.Sets/src/mage/cards/t/ToweringBaloth.java index 9562dff86a5..f46339d4068 100644 --- a/Mage.Sets/src/mage/cards/t/ToweringBaloth.java +++ b/Mage.Sets/src/mage/cards/t/ToweringBaloth.java @@ -23,7 +23,7 @@ public final class ToweringBaloth extends CardImpl { this.toughness = new MageInt(6); // Morph {6}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{6}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{6}{G}"))); } private ToweringBaloth(final ToweringBaloth card) { diff --git a/Mage.Sets/src/mage/cards/t/TreespringLorian.java b/Mage.Sets/src/mage/cards/t/TreespringLorian.java index f7643496c25..ab7e2c882c2 100644 --- a/Mage.Sets/src/mage/cards/t/TreespringLorian.java +++ b/Mage.Sets/src/mage/cards/t/TreespringLorian.java @@ -23,7 +23,7 @@ public final class TreespringLorian extends CardImpl { this.toughness = new MageInt(4); // Morph {5}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{G}"))); } private TreespringLorian(final TreespringLorian card) { diff --git a/Mage.Sets/src/mage/cards/t/TribalForcemage.java b/Mage.Sets/src/mage/cards/t/TribalForcemage.java index f94bf85abb6..f927109a976 100644 --- a/Mage.Sets/src/mage/cards/t/TribalForcemage.java +++ b/Mage.Sets/src/mage/cards/t/TribalForcemage.java @@ -34,7 +34,7 @@ public final class TribalForcemage extends CardImpl { this.toughness = new MageInt(1); // Morph {1}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{G}"))); // When Tribal Forcemage is turned face up, creatures of the creature type of your choice get +2/+2 and gain trample until end of turn. Effect effect = new ChooseCreatureTypeEffect(Outcome.BoostCreature); diff --git a/Mage.Sets/src/mage/cards/u/UnblinkingBleb.java b/Mage.Sets/src/mage/cards/u/UnblinkingBleb.java index f63c1b7624b..f4c08a3002b 100644 --- a/Mage.Sets/src/mage/cards/u/UnblinkingBleb.java +++ b/Mage.Sets/src/mage/cards/u/UnblinkingBleb.java @@ -28,7 +28,7 @@ public final class UnblinkingBleb extends CardImpl { this.toughness = new MageInt(3); // Morph {2}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}"))); // Whenever Unblinking Bleb or another permanent is turned face up, you may scry 2. this.addAbility(new TurnedFaceUpAllTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/u/UnstableHulk.java b/Mage.Sets/src/mage/cards/u/UnstableHulk.java index a8d47702898..d0f8606ab4a 100644 --- a/Mage.Sets/src/mage/cards/u/UnstableHulk.java +++ b/Mage.Sets/src/mage/cards/u/UnstableHulk.java @@ -31,7 +31,7 @@ public final class UnstableHulk extends CardImpl { this.toughness = new MageInt(2); // Morph {3}{R}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{R}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{R}{R}"))); // When Unstable Hulk is turned face up, it gets +6/+6 and gains trample until end of turn. You skip your next turn. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new BoostSourceEffect(6,6,Duration.EndOfTurn) diff --git a/Mage.Sets/src/mage/cards/v/VenomspoutBrackus.java b/Mage.Sets/src/mage/cards/v/VenomspoutBrackus.java index e314803ec5f..4d9d81ba768 100644 --- a/Mage.Sets/src/mage/cards/v/VenomspoutBrackus.java +++ b/Mage.Sets/src/mage/cards/v/VenomspoutBrackus.java @@ -45,7 +45,7 @@ public final class VenomspoutBrackus extends CardImpl { ability.addTarget(new TargetCreaturePermanent(filter)); this.addAbility(ability); // Morph {3}{G}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{G}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{G}{G}"))); } diff --git a/Mage.Sets/src/mage/cards/v/VesuvanShapeshifter.java b/Mage.Sets/src/mage/cards/v/VesuvanShapeshifter.java index a5126f8a320..93d43cca6a9 100644 --- a/Mage.Sets/src/mage/cards/v/VesuvanShapeshifter.java +++ b/Mage.Sets/src/mage/cards/v/VesuvanShapeshifter.java @@ -58,7 +58,7 @@ public final class VesuvanShapeshifter extends CardImpl { this.addAbility(ability); // Morph {1}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{U}"))); } private VesuvanShapeshifter(final VesuvanShapeshifter card) { diff --git a/Mage.Sets/src/mage/cards/v/VoidmageApprentice.java b/Mage.Sets/src/mage/cards/v/VoidmageApprentice.java index ee13db0676d..f10a23879e6 100644 --- a/Mage.Sets/src/mage/cards/v/VoidmageApprentice.java +++ b/Mage.Sets/src/mage/cards/v/VoidmageApprentice.java @@ -28,7 +28,7 @@ public final class VoidmageApprentice extends CardImpl { this.toughness = new MageInt(1); // Morph {2}{U}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{U}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{U}{U}"))); // When Voidmage Apprentice is turned face up, counter target spell. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new CounterTargetEffect(), false); diff --git a/Mage.Sets/src/mage/cards/v/VoidmageProdigy.java b/Mage.Sets/src/mage/cards/v/VoidmageProdigy.java index adab7d5df9c..4596bea3968 100644 --- a/Mage.Sets/src/mage/cards/v/VoidmageProdigy.java +++ b/Mage.Sets/src/mage/cards/v/VoidmageProdigy.java @@ -47,7 +47,7 @@ public final class VoidmageProdigy extends CardImpl { this.addAbility(ability); // Morph {U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}"))); } private VoidmageProdigy(final VoidmageProdigy card) { diff --git a/Mage.Sets/src/mage/cards/w/WallOfDeceit.java b/Mage.Sets/src/mage/cards/w/WallOfDeceit.java index 92cfa24f77f..45ce228ea82 100644 --- a/Mage.Sets/src/mage/cards/w/WallOfDeceit.java +++ b/Mage.Sets/src/mage/cards/w/WallOfDeceit.java @@ -37,7 +37,7 @@ public final class WallOfDeceit extends CardImpl { this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WallOfDeceitEffect(), new ManaCostsImpl<>("{3}"))); // Morph {U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{U}"))); } private WallOfDeceit(final WallOfDeceit card) { diff --git a/Mage.Sets/src/mage/cards/w/WarBehemoth.java b/Mage.Sets/src/mage/cards/w/WarBehemoth.java index 185faa4c3da..ce6a6dd9369 100644 --- a/Mage.Sets/src/mage/cards/w/WarBehemoth.java +++ b/Mage.Sets/src/mage/cards/w/WarBehemoth.java @@ -24,7 +24,7 @@ public final class WarBehemoth extends CardImpl { this.toughness = new MageInt(6); // Morph {4}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{W}"))); } private WarBehemoth(final WarBehemoth card) { diff --git a/Mage.Sets/src/mage/cards/w/WarbreakTrumpeter.java b/Mage.Sets/src/mage/cards/w/WarbreakTrumpeter.java index 12edcdfe4be..e87a0b9c617 100644 --- a/Mage.Sets/src/mage/cards/w/WarbreakTrumpeter.java +++ b/Mage.Sets/src/mage/cards/w/WarbreakTrumpeter.java @@ -28,7 +28,7 @@ public final class WarbreakTrumpeter extends CardImpl { this.toughness = new MageInt(1); // Morph {X}{X}{R} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{X}{X}{R}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{X}{X}{R}"))); // When Warbreak Trumpeter is turned face up, create X 1/1 red Goblin creature tokens. DynamicValue morphX = MorphManacostVariableValue.instance; diff --git a/Mage.Sets/src/mage/cards/w/WatcherOfTheRoost.java b/Mage.Sets/src/mage/cards/w/WatcherOfTheRoost.java index 306b7903b71..d4b25d76769 100644 --- a/Mage.Sets/src/mage/cards/w/WatcherOfTheRoost.java +++ b/Mage.Sets/src/mage/cards/w/WatcherOfTheRoost.java @@ -41,7 +41,7 @@ public final class WatcherOfTheRoost extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Morph - Reveal a white card in your hand - this.addAbility(new MorphAbility(new RevealTargetFromHandCost(new TargetCardInHand(filter)))); + this.addAbility(new MorphAbility(this, new RevealTargetFromHandCost(new TargetCardInHand(filter)))); // When Watcher of the Roost is turned face up, you gain 2 life. Effect effect = new GainLifeEffect(2); diff --git a/Mage.Sets/src/mage/cards/w/WeatheredBodyguards.java b/Mage.Sets/src/mage/cards/w/WeatheredBodyguards.java index 3914b5607ab..06e1f51e339 100644 --- a/Mage.Sets/src/mage/cards/w/WeatheredBodyguards.java +++ b/Mage.Sets/src/mage/cards/w/WeatheredBodyguards.java @@ -38,7 +38,7 @@ public final class WeatheredBodyguards extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new WeatheredBodyguardsEffect())); // Morph {3}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{W}"))); } diff --git a/Mage.Sets/src/mage/cards/w/WeaverOfLies.java b/Mage.Sets/src/mage/cards/w/WeaverOfLies.java index 8da27492686..e52eacded1b 100644 --- a/Mage.Sets/src/mage/cards/w/WeaverOfLies.java +++ b/Mage.Sets/src/mage/cards/w/WeaverOfLies.java @@ -45,7 +45,7 @@ public final class WeaverOfLies extends CardImpl { this.toughness = new MageInt(4); // Morph {4}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{4}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{4}{U}"))); // When Weaver of Lies is turned face up, turn any number of target creatures with a morph ability other than Weaver of Lies face down. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new WeaverOfLiesEffect(), false, false); diff --git a/Mage.Sets/src/mage/cards/w/Whetwheel.java b/Mage.Sets/src/mage/cards/w/Whetwheel.java index 22d5c0ec047..4766cdaef8f 100644 --- a/Mage.Sets/src/mage/cards/w/Whetwheel.java +++ b/Mage.Sets/src/mage/cards/w/Whetwheel.java @@ -31,7 +31,7 @@ public final class Whetwheel extends CardImpl { ability.addTarget(new TargetPlayer()); this.addAbility(ability); // Morph {3} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{3}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}"))); } private Whetwheel(final Whetwheel card) { diff --git a/Mage.Sets/src/mage/cards/w/WhipSpineDrake.java b/Mage.Sets/src/mage/cards/w/WhipSpineDrake.java index a09150b317b..517d96a4fb1 100644 --- a/Mage.Sets/src/mage/cards/w/WhipSpineDrake.java +++ b/Mage.Sets/src/mage/cards/w/WhipSpineDrake.java @@ -26,7 +26,7 @@ public final class WhipSpineDrake extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Morph {2}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{W}"))); } private WhipSpineDrake(final WhipSpineDrake card) { diff --git a/Mage.Sets/src/mage/cards/w/Whipcorder.java b/Mage.Sets/src/mage/cards/w/Whipcorder.java index df11de17584..a6cac85c4dd 100644 --- a/Mage.Sets/src/mage/cards/w/Whipcorder.java +++ b/Mage.Sets/src/mage/cards/w/Whipcorder.java @@ -37,7 +37,7 @@ public final class Whipcorder extends CardImpl { ability.addCost(new TapSourceCost()); this.addAbility(ability); // Morph {W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{W}"))); } private Whipcorder(final Whipcorder card) { diff --git a/Mage.Sets/src/mage/cards/w/Willbender.java b/Mage.Sets/src/mage/cards/w/Willbender.java index 957c1c58c90..0324c150183 100644 --- a/Mage.Sets/src/mage/cards/w/Willbender.java +++ b/Mage.Sets/src/mage/cards/w/Willbender.java @@ -37,7 +37,7 @@ public final class Willbender extends CardImpl { this.toughness = new MageInt(2); // Morph {1}{U} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{1}{U}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{U}"))); // When Willbender is turned face up, change the target of target spell or ability with a single target. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new ChooseNewTargetsTargetEffect(true, true)); ability.addTarget(new TargetStackObject(FILTER)); diff --git a/Mage.Sets/src/mage/cards/w/WingbeatWarrior.java b/Mage.Sets/src/mage/cards/w/WingbeatWarrior.java index cad31785b89..840d3e759fb 100644 --- a/Mage.Sets/src/mage/cards/w/WingbeatWarrior.java +++ b/Mage.Sets/src/mage/cards/w/WingbeatWarrior.java @@ -34,7 +34,7 @@ public final class WingbeatWarrior extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Morph {2}{W} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{W}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{W}"))); // When Wingbeat Warrior is turned face up, target creature gains first strike until end of turn. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn)); ability.addTarget(new TargetCreaturePermanent()); diff --git a/Mage.Sets/src/mage/cards/w/WitnessOfTheAges.java b/Mage.Sets/src/mage/cards/w/WitnessOfTheAges.java index 08d0589cb8f..07615c14280 100644 --- a/Mage.Sets/src/mage/cards/w/WitnessOfTheAges.java +++ b/Mage.Sets/src/mage/cards/w/WitnessOfTheAges.java @@ -24,7 +24,7 @@ public final class WitnessOfTheAges extends CardImpl { this.toughness = new MageInt(4); // Morph {5} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}"))); } private WitnessOfTheAges(final WitnessOfTheAges card) { diff --git a/Mage.Sets/src/mage/cards/w/Woodcloaker.java b/Mage.Sets/src/mage/cards/w/Woodcloaker.java index 273de715124..654658f3ba3 100644 --- a/Mage.Sets/src/mage/cards/w/Woodcloaker.java +++ b/Mage.Sets/src/mage/cards/w/Woodcloaker.java @@ -29,7 +29,7 @@ public final class Woodcloaker extends CardImpl { this.toughness = new MageInt(3); // Morph {2}{G}{G} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}{G}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{G}{G}"))); // When Woodcloaker is turned face up, target creature gains trample until end of turn. Ability ability = new TurnedFaceUpSourceTriggeredAbility(new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)); ability.addTarget(new TargetCreaturePermanent()); diff --git a/Mage.Sets/src/mage/cards/w/WoollyLoxodon.java b/Mage.Sets/src/mage/cards/w/WoollyLoxodon.java index 0dbcc5e71d3..2d03bca0c33 100644 --- a/Mage.Sets/src/mage/cards/w/WoollyLoxodon.java +++ b/Mage.Sets/src/mage/cards/w/WoollyLoxodon.java @@ -25,7 +25,7 @@ public final class WoollyLoxodon extends CardImpl { this.toughness = new MageInt(7); // Morph 5G - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{5}{G}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{5}{G}"))); } private WoollyLoxodon(final WoollyLoxodon card) { diff --git a/Mage.Sets/src/mage/cards/z/ZoeticCavern.java b/Mage.Sets/src/mage/cards/z/ZoeticCavern.java index d35e2c416c8..ede5506cc96 100644 --- a/Mage.Sets/src/mage/cards/z/ZoeticCavern.java +++ b/Mage.Sets/src/mage/cards/z/ZoeticCavern.java @@ -21,7 +21,7 @@ public final class ZoeticCavern extends CardImpl { // {T}: Add {C}. this.addAbility(new ColorlessManaAbility()); // Morph {2} - this.addAbility(new MorphAbility(new ManaCostsImpl<>("{2}"))); + this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}"))); } private ZoeticCavern(final ZoeticCavern card) { diff --git a/Mage.Sets/src/mage/cards/z/ZombieCutthroat.java b/Mage.Sets/src/mage/cards/z/ZombieCutthroat.java index b78968b5c5e..03e263e2b80 100644 --- a/Mage.Sets/src/mage/cards/z/ZombieCutthroat.java +++ b/Mage.Sets/src/mage/cards/z/ZombieCutthroat.java @@ -23,7 +23,7 @@ public final class ZombieCutthroat extends CardImpl { this.toughness = new MageInt(4); // Morph-Pay 5 life. - this.addAbility(new MorphAbility(new PayLifeCost(5))); + this.addAbility(new MorphAbility(this, new PayLifeCost(5))); } private ZombieCutthroat(final ZombieCutthroat card) { diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/BestowTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/BestowTest.java index b6bf97604df..2f8171a220b 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/BestowTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/BestowTest.java @@ -530,4 +530,22 @@ public class BestowTest extends CardTestPlayerBase { assertType("Nylea's Emissary", CardType.CREATURE, false); assertType("Nylea's Emissary", CardType.ENCHANTMENT, SubType.AURA); } + @Test + public void testCastBestowFlash() { + addCard(Zone.HAND, playerA, "Nylea's Emissary"); // +3/+3, only an aura if cast with bestow + addCard(Zone.BATTLEFIELD, playerA, "Forest", 6); + addCard(Zone.BATTLEFIELD, playerA, "Sigarda's Aid"); //aura spells have flash + addCard(Zone.BATTLEFIELD, playerA, "Memnite", 1); // 1/1 + + castSpell(1, PhaseStep.BEGIN_COMBAT, playerA, "Nylea's Emissary using bestow", "Memnite"); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertPermanentCount(playerA, "Nylea's Emissary", 1); + assertPowerToughness(playerA, "Memnite", 4, 4); + assertType("Nylea's Emissary", CardType.CREATURE, false); + assertType("Nylea's Emissary", CardType.ENCHANTMENT, SubType.AURA); + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MegamorphTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MegamorphTest.java index 6c824e85d65..1178d9f305d 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MegamorphTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MegamorphTest.java @@ -21,8 +21,7 @@ public class MegamorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Aerie Bowmasters", 1); addCard(Zone.BATTLEFIELD, playerA, "Forest", 6); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Aerie Bowmasters"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Aerie Bowmasters using Morph"); activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{5}{G}: Turn"); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java index 856424ceb5c..06b5ab69390 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java @@ -31,7 +31,6 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Forest", 5); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); - setChoice(playerA, false); // cast it normal as 5/5 setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); @@ -49,8 +48,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Pine Walker"); addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker using Morph"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); @@ -68,8 +66,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Pine Walker"); addCard(Zone.BATTLEFIELD, playerA, "Forest", 5); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker using Morph"); attack(3, playerA, EmptyNames.FACE_DOWN_CREATURE.toString()); @@ -99,10 +96,8 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); addCard(Zone.BATTLEFIELD, playerA, "Island", 3); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); - setChoice(playerA, true); // cast it face down as 2/2 creature - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Icefeather Aven", TestPlayer.NO_TARGET, "Pine Walker", StackClause.WHILE_NOT_ON_STACK); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker using Morph"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Icefeather Aven using Morph", TestPlayer.NO_TARGET, "Pine Walker", StackClause.WHILE_NOT_ON_STACK); attack(3, playerA, EmptyNames.FACE_DOWN_CREATURE.toString()); attack(3, playerA, EmptyNames.FACE_DOWN_CREATURE.toString()); @@ -141,8 +136,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerB, "Soldier of the Pantheon", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ponyback Brigade"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ponyback Brigade using Morph"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); @@ -169,7 +163,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Clever Impersonator", 1); addCard(Zone.BATTLEFIELD, playerB, "Island", 4); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker using Morph"); castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Clever Impersonator"); @@ -199,8 +193,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Doomwake Giant", 1); addCard(Zone.BATTLEFIELD, playerB, "Swamp", 5); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker using Morph"); castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Doomwake Giant"); @@ -241,8 +234,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Doomwake Giant", 1); addCard(Zone.BATTLEFIELD, playerB, "Swamp", 5); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ponyback Brigade"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ponyback Brigade using Morph"); castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Doomwake Giant"); @@ -278,8 +270,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Island", 2); addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sagu Mauler"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sagu Mauler using Morph"); activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{3}{G}{U}: Turn this face-down permanent face up."); castSpell(5, PhaseStep.PRECOMBAT_MAIN, playerA, "Clone"); setChoice(playerA, "Sagu Mauler"); @@ -315,8 +306,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Disdainful Stroke"); addCard(Zone.BATTLEFIELD, playerB, "Island", 2); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sagu Mauler"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sagu Mauler using Morph"); checkPlayableAbility("Can't Disdainful Stroke Sagu", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Disdainful", false); @@ -352,10 +342,8 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Echoing Decay"); addCard(Zone.BATTLEFIELD, playerB, "Swamp", 2); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sagu Mauler"); - setChoice(playerA, true); // cast it face down as 2/2 creature - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sagu Mauler", TestPlayer.NO_TARGET, "Sagu Mauler", StackClause.WHILE_NOT_ON_STACK); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sagu Mauler using Morph"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sagu Mauler using Morph", TestPlayer.NO_TARGET, "Sagu Mauler", StackClause.WHILE_NOT_ON_STACK); // showBattlefield("A battle", 1, PhaseStep.POSTCOMBAT_MAIN, playerA); castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Echoing Decay", EmptyNames.FACE_DOWN_CREATURE.toString()); @@ -389,8 +377,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Counterspell", 1); addCard(Zone.BATTLEFIELD, playerB, "Island", 2); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Akroma, Angel of Fury"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Akroma, Angel of Fury using Morph"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Counterspell", "Akroma, Angel of Fury"); setStopAt(1, PhaseStep.BEGIN_COMBAT); @@ -415,8 +402,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Swords to Plowshares", 1); addCard(Zone.BATTLEFIELD, playerB, "Plains", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Birchlore Rangers"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Birchlore Rangers using Morph"); waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Swords to Plowshares", ""); @@ -455,8 +441,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Lightning Bolt", 1); addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ashcloud Phoenix"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ashcloud Phoenix using Morph"); waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", EmptyNames.FACE_DOWN_CREATURE.toString()); @@ -496,8 +481,7 @@ public class MorphTest extends CardTestPlayerBase { // (This creature deals combat damage before creatures without first strike, it can't be blocked as long as defending player controls a Forest, and attacking doesn't cause this creature to tap.) addCard(Zone.BATTLEFIELD, playerB, "Mirri, Cat Warrior"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ashcloud Phoenix"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ashcloud Phoenix using Morph"); attack(2, playerB, "Mirri, Cat Warrior"); block(2, playerA, EmptyNames.FACE_DOWN_CREATURE.toString(), "Mirri, Cat Warrior"); @@ -536,8 +520,7 @@ public class MorphTest extends CardTestPlayerBase { setStrictChooseMode(true); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Akroma, Angel of Fury"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Akroma, Angel of Fury using Morph"); // showBattlefield("A battle", 1, PhaseStep.POSTCOMBAT_MAIN, playerA); // showBattlefield("B battle", 1, PhaseStep.POSTCOMBAT_MAIN, playerB); @@ -576,8 +559,7 @@ public class MorphTest extends CardTestPlayerBase { // Whenever an opponent casts a creature or planeswalker spell with the same name as a card in their graveyard, that player loses 10 life. addCard(Zone.BATTLEFIELD, playerB, "Dragonlord Kolaghan", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Akroma, Angel of Fury"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Akroma, Angel of Fury using Morph"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); @@ -606,8 +588,7 @@ public class MorphTest extends CardTestPlayerBase { */ addCard(Zone.BATTLEFIELD, playerB, "Linvala, Keeper of Silence", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker using Morph"); attack(3, playerA, EmptyNames.FACE_DOWN_CREATURE.toString()); @@ -656,7 +637,6 @@ public class MorphTest extends CardTestPlayerBase { // try cast as normal -- must not work castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Rattleclaw Mystic"); - setChoice(playerB, false); setStopAt(2, PhaseStep.BEGIN_COMBAT); @@ -695,8 +675,7 @@ public class MorphTest extends CardTestPlayerBase { addTarget(playerA, "Rattleclaw Mystic"); // try cast as morph - must work - castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Rattleclaw Mystic"); - setChoice(playerB, true); // try cast as morph + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Rattleclaw Mystic using Morph"); setStrictChooseMode(true); setStopAt(2, PhaseStep.BEGIN_COMBAT); @@ -736,13 +715,11 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerB, "Plains", 2); addCard(Zone.BATTLEFIELD, playerB, "Island", 2); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rattleclaw Mystic"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rattleclaw Mystic using Morph"); castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Reflector Mage"); castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Rattleclaw Mystic"); - setChoice(playerA, false); // cast it face down as 2/2 creature setStopAt(3, PhaseStep.BEGIN_COMBAT); @@ -781,8 +758,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerB, "Island", 5); // 1. Cast Vesuvan as face-down - castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Vesuvan Shapeshifter"); - setChoice(playerB, true); // cast as face-down + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Vesuvan Shapeshifter using Morph"); // 2. Moth Vesuvan and copy brine activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "{1}{U}: Turn this face-down permanent"); @@ -823,8 +799,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Fatal Push"); // Instant {B} addCard(Zone.BATTLEFIELD, playerB, "Swamp", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker using Morph"); castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Fatal Push"); @@ -861,8 +836,7 @@ public class MorphTest extends CardTestPlayerBase { // Whenever one or more Dragons you control attack, draw that many cards, then you may put a permanent card from your hand onto the battlefield addCard(Zone.BATTLEFIELD, playerA, "The Ur-Dragon", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Quicksilver Dragon"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Quicksilver Dragon using Morph"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); @@ -899,8 +873,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Lightning Bolt"); addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Quicksilver Dragon"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Quicksilver Dragon using Morph"); waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", EmptyNames.FACE_DOWN_CREATURE.toString()); @@ -941,8 +914,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Akroma, Angel of Fury"); addCard(Zone.BATTLEFIELD, playerA, "Mountain", 6); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Akroma, Angel of Fury"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Akroma, Angel of Fury using Morph"); activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{3}{R}{R}{R}: Turn this face-down permanent face up."); @@ -962,7 +934,7 @@ public class MorphTest extends CardTestPlayerBase { checkPlayableAbility("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Play Zoetic Cavern", true); playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Zoetic Cavern"); - setChoice(playerA, false); // no morph (canPay for generic/colored mana returns true all the time, so xmage ask about face down cast) + // no morph (canPay for generic/colored mana returns true all the time, so xmage ask about face down cast) setStrictChooseMode(true); setStopAt(1, PhaseStep.END_TURN); @@ -979,8 +951,7 @@ public class MorphTest extends CardTestPlayerBase { checkPlayableAbility("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Play Zoetic Cavern", true); checkPlayableAbility("morph must be replaced by play ability", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Morph", false); - playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Zoetic Cavern"); - setChoice(playerA, true); // morph + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Zoetic Cavern using Morph"); setStrictChooseMode(true); setStopAt(1, PhaseStep.END_TURN); @@ -1000,14 +971,12 @@ public class MorphTest extends CardTestPlayerBase { // addCard(Zone.HAND, playerA, "Island", 1); + checkPlayableAbility("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Play Zoetic Cavern", true); // play land first playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Island"); - // morph ability (play as face down) calls from playLand method, so it visible for play land command - checkPlayableAbility("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Play Zoetic Cavern", true); - checkPlayableAbility("morph must be replaced by play ability", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Morph", false); - playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Zoetic Cavern"); - setChoice(playerA, true); // morph + checkPlayableAbility("after", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Play Zoetic Cavern", false); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Zoetic Cavern using Morph"); setStrictChooseMode(true); setStopAt(1, PhaseStep.END_TURN); @@ -1031,8 +1000,7 @@ public class MorphTest extends CardTestPlayerBase { checkPlayableAbility("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Play Zoetic Cavern", true); checkPlayableAbility("morph must be replaced by play ability", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Morph", false); - playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Zoetic Cavern"); - setChoice(playerA, true); // morph + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Zoetic Cavern using Morph"); setStrictChooseMode(true); setStopAt(1, PhaseStep.END_TURN); @@ -1074,8 +1042,7 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Nylea, Keen-Eyed"); checkPlayableAbility("can", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender", true); - activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender"); - setChoice(playerA, true); // morph + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender using Morph"); setStrictChooseMode(true); setStopAt(1, PhaseStep.END_TURN); @@ -1095,9 +1062,8 @@ public class MorphTest extends CardTestPlayerBase { // Face-down creature spells you cast cost {1} less to cast. addCard(Zone.BATTLEFIELD, playerA, "Dream Chisel"); - checkPlayableAbility("can", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender", true); - activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender"); - setChoice(playerA, true); // morph + checkPlayableAbility("can", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender using Morph", true); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender using Morph"); setStrictChooseMode(true); setStopAt(1, PhaseStep.END_TURN); @@ -1118,17 +1084,16 @@ public class MorphTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Kadena, Slinking Sorcerer"); // creature one - get cost reduce - checkPlayableAbility("can", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender", true); - activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender"); - setChoice(playerA, true); // morph + checkPlayableAbility("can", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender using Morph", true); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender using Morph"); waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); // creature two - do not get cost reduce - checkPlayableAbility("can't by no reduce", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender", false); + checkPlayableAbility("can't by no reduce", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender using Morph", false); // on next turn it can cost reduce again - checkPlayableAbility("can't by not your turn", 2, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender", false); - checkPlayableAbility("can", 3, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender", true); + checkPlayableAbility("can't by not your turn", 2, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender using Morph", false); + checkPlayableAbility("can", 3, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Willbender using Morph", true); setStrictChooseMode(true); setStopAt(3, PhaseStep.END_TURN); @@ -1136,4 +1101,21 @@ public class MorphTest extends CardTestPlayerBase { assertPermanentCount(playerA, EmptyNames.FACE_DOWN_CREATURE.toString(), 1); } + + @Test + public void test_MorphIsColorlessFlash() { + addCard(Zone.HAND, playerA, "Pine Walker", 1); + addCard(Zone.HAND, playerA, "Zoetic Cavern", 1); + addCard(Zone.BATTLEFIELD, playerA, "Liberator, Urza's Battlethopter", 1); + addCard(Zone.BATTLEFIELD, playerA, "Island", 6); + castSpell(1, PhaseStep.BEGIN_COMBAT, playerA, "Pine Walker using Morph"); + castSpell(1, PhaseStep.BEGIN_COMBAT, playerA, "Zoetic Cavern using Morph"); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertPermanentCount(playerA, EmptyNames.FACE_DOWN_CREATURE.toString(), 2); + } + } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RetraceTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RetraceTest.java index f5b1c3b1882..d8244fc0f45 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RetraceTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/RetraceTest.java @@ -30,7 +30,7 @@ public class RetraceTest extends CardTestPlayerBase { addCard(Zone.HAND, playerB, "Silvercoat Lion", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Raven's Crime", playerB); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Raven's Crime with retrace", playerB); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); @@ -82,7 +82,7 @@ public class RetraceTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerB, "Thalia, Guardian of Thraben", 1); addCard(Zone.HAND, playerB, "Silvercoat Lion", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Raven's Crime", playerB); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Raven's Crime with retrace", playerB); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); @@ -110,7 +110,7 @@ public class RetraceTest extends CardTestPlayerBase { // Create a 1/1 black and green Worm creature token for each land card in your graveyard. // Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Worm Harvest"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Worm Harvest with retrace"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SurgeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SurgeTest.java index 98707f1d1f1..df8aa6f667f 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SurgeTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SurgeTest.java @@ -83,7 +83,7 @@ public class SurgeTest extends CardTestPlayerBase { castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB); waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tyrant of Valakut"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tyrant of Valakut with surge"); addTarget(playerA, playerB); setStopAt(1, PhaseStep.BEGIN_COMBAT); @@ -109,7 +109,7 @@ public class SurgeTest extends CardTestPlayerBase { castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB); waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Containment Membrane", "Silvercoat Lion"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Containment Membrane with surge", "Silvercoat Lion"); setStopAt(2, PhaseStep.PRECOMBAT_MAIN); execute(); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/control/ExileAndReturnUnderYourControl.java b/Mage.Tests/src/test/java/org/mage/test/cards/control/ExileAndReturnUnderYourControl.java index 98394859a56..f4c1a116d14 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/control/ExileAndReturnUnderYourControl.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/control/ExileAndReturnUnderYourControl.java @@ -91,8 +91,7 @@ public class ExileAndReturnUnderYourControl extends CardTestPlayerBase { setStrictChooseMode(true); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Master of Pearls", true); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Master of Pearls using Morph", true); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Villainous Wealth", playerB); setChoice(playerA, "X=3"); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/cost/adventure/AdventureCardsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/cost/adventure/AdventureCardsTest.java index a92a9999e58..473f80354d8 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/cost/adventure/AdventureCardsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/cost/adventure/AdventureCardsTest.java @@ -533,7 +533,7 @@ public class AdventureCardsTest extends CardTestPlayerBase { // showAvailableAbilities("abils", 1, PhaseStep.PRECOMBAT_MAIN, playerA); // retrace - You may cast this card from your graveyard by discarding a land card as an additional cost to cast it - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share with retrace"); setChoice(playerA, "Forest"); setStrictChooseMode(true); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/CostModificationTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/CostModificationTest.java index 55307c25d8b..1f0e6467275 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/CostModificationTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/CostModificationTest.java @@ -215,8 +215,7 @@ public class CostModificationTest extends CardTestPlayerBase { castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion", true); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion", true); - playLand(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Zoetic Cavern"); - setChoice(playerA, true); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Zoetic Cavern using Morph"); setStopAt(1, PhaseStep.END_TURN); execute(); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/facedown/GrimHaruspexTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/facedown/GrimHaruspexTest.java index ebc0f594d9c..1977e8e87b3 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/facedown/GrimHaruspexTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/facedown/GrimHaruspexTest.java @@ -16,8 +16,7 @@ public class GrimHaruspexTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Grim Haruspex"); addCard(Zone.BATTLEFIELD, playerA, "Plains", 7); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Grim Haruspex", true); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Grim Haruspex using Morph", true); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Wrath of God"); setStopAt(1, PhaseStep.END_COMBAT); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/facedown/PrimordialMistTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/facedown/PrimordialMistTest.java index de180da3286..bd9cbcca7b9 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/facedown/PrimordialMistTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/facedown/PrimordialMistTest.java @@ -30,8 +30,7 @@ public class PrimordialMistTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Brine Elemental"); // Creature {5}{U}{U} (5/4) addCard(Zone.BATTLEFIELD, playerA, "Island", 9); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Brine Elemental"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Brine Elemental using Morph"); waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, playerA); @@ -39,7 +38,6 @@ public class PrimordialMistTest extends CardTestPlayerBase { setChoice(playerA, EmptyNames.FACE_DOWN_CREATURE.toString()); castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Brine Elemental"); - setChoice(playerA, false); // cast it face down as 2/2 creature setChoice(playerA, true); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/entersBattlefield/PrimalClayTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/entersBattlefield/PrimalClayTest.java index 5a7851df73e..4af7e9f19c1 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/entersBattlefield/PrimalClayTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/entersBattlefield/PrimalClayTest.java @@ -199,7 +199,6 @@ public class PrimalClayTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Island", 4); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, aquamorph); - setChoice(playerA, false); // not using morph setChoice(playerA, "a 5/1 creature"); setStrictChooseMode(true); @@ -218,8 +217,7 @@ public class PrimalClayTest extends CardTestPlayerBase { // Target creature you control gets +2/+2 until end of turn if its power is 2. Then it fights target creature you don’t control. addCard(Zone.BATTLEFIELD, playerB, "Siege Mastodon", 1); // 3/5 creature for fighting - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, aquamorph); - setChoice(playerA, true); // cast facedown as 2/2 + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, aquamorph+" using Morph"); waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Savage Swipe"); addTarget(playerA, ""); // morph diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/restriction/MeddlingMageTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/restriction/MeddlingMageTest.java index 987cad45988..969dd1b8b69 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/restriction/MeddlingMageTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/restriction/MeddlingMageTest.java @@ -82,8 +82,7 @@ public class MeddlingMageTest extends CardTestPlayerBase { setChoice(playerA, "Ainok Tracker"); // name a spell that can't be cast waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ainok Tracker"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ainok Tracker using Morph"); setStrictChooseMode(true); setStopAt(1, PhaseStep.BEGIN_COMBAT); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/rules/CantCastTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/rules/CantCastTest.java index 357b9358907..3bd2bd83a44 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/rules/CantCastTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/rules/CantCastTest.java @@ -124,8 +124,7 @@ public class CantCastTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Pine Walker"); addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker using Morph"); setStopAt(1, PhaseStep.BEGIN_COMBAT); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/rules/NamePredicateTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/rules/NamePredicateTest.java index 2b3e37ada43..ac8037ba789 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/rules/NamePredicateTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/rules/NamePredicateTest.java @@ -26,8 +26,7 @@ public class NamePredicateTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Pine Walker"); // {3}{G}{G} addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker using Morph"); setStrictChooseMode(true); setStopAt(1, PhaseStep.BEGIN_COMBAT); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/fut/MuragandaPetroglyphsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/fut/MuragandaPetroglyphsTest.java index c016b3fcb17..d5fb689cf27 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/fut/MuragandaPetroglyphsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/fut/MuragandaPetroglyphsTest.java @@ -50,8 +50,7 @@ public class MuragandaPetroglyphsTest extends CardTestPlayerBase { // Creatures with no abilities get +2/+2. addCard(Zone.BATTLEFIELD, playerA, "Muraganda Petroglyphs", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker using Morph"); setStrictChooseMode(true); setStopAt(1, PhaseStep.BEGIN_COMBAT); @@ -72,8 +71,7 @@ public class MuragandaPetroglyphsTest extends CardTestPlayerBase { // Creatures with no abilities get +2/+2. addCard(Zone.BATTLEFIELD, playerA, "Muraganda Petroglyphs", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker using Morph"); setStrictChooseMode(true); setStopAt(1, PhaseStep.BEGIN_COMBAT); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/lgn/InfernalCaretakerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/lgn/InfernalCaretakerTest.java index 143f0712988..1f5fdc97b9e 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/lgn/InfernalCaretakerTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/lgn/InfernalCaretakerTest.java @@ -30,8 +30,7 @@ public class InfernalCaretakerTest extends CardTestPlayerBase { addCard(Zone.GRAVEYARD, playerB, "Festering Goblin", 4); addCard(Zone.GRAVEYARD, playerB, "Elvish Visionary", 4); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Infernal Caretaker", true); - setChoice(playerA, true); // Cast as a morph + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Infernal Caretaker using Morph", true); activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{3}{B}: Turn this face-down permanent face up."); setStopAt(1, PhaseStep.END_TURN); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/ths/PurphorosGodOfTheForgeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/ths/PurphorosGodOfTheForgeTest.java index ed0d9baf06a..58478771272 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/ths/PurphorosGodOfTheForgeTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/ths/PurphorosGodOfTheForgeTest.java @@ -73,8 +73,7 @@ public class PurphorosGodOfTheForgeTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Ashcloud Phoenix"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ashcloud Phoenix"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ashcloud Phoenix using Morph"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/EntersTheBattlefieldTriggerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/EntersTheBattlefieldTriggerTest.java index 5ed1cfbc06d..6ab605baecd 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/EntersTheBattlefieldTriggerTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/EntersTheBattlefieldTriggerTest.java @@ -400,7 +400,7 @@ public class EntersTheBattlefieldTriggerTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Island", 2); addCard(Zone.GRAVEYARD, playerA, "Balduvian Bears", 5); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Uro, Titan of Nature's Wrath"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Uro, Titan of Nature's Wrath with Escape"); setChoice(playerA, "Balduvian Bears^Balduvian Bears^Balduvian Bears^Balduvian Bears^Balduvian Bears"); setChoice(playerA, "When {this} enters the battlefield, sacrifice it"); // sacrifice trigger must go first setChoice(playerA, false); // do not put land to battlefield diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/PossibilityStormTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/PossibilityStormTest.java index 16d06e3d88b..e35fc7ab39f 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/PossibilityStormTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/PossibilityStormTest.java @@ -42,8 +42,7 @@ public class PossibilityStormTest extends CardTestPlayerBase { addCard(Zone.LIBRARY, playerA, "Silvercoat Lion"); skipInitShuffling(); - playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Zoetic Cavern"); - setChoice(playerA, true); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Zoetic Cavern using Morph"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ReturnToBattlefieldEffectsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ReturnToBattlefieldEffectsTest.java index 610e810be89..ba897e5a889 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ReturnToBattlefieldEffectsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ReturnToBattlefieldEffectsTest.java @@ -110,8 +110,7 @@ public class ReturnToBattlefieldEffectsTest extends CardTestPlayerBase { // {B}{G}: Exile target creature card from a graveyard. It's owner puts a 1/1 black and green Snake enchantment creature token with deathtouch onto the battlefield. addCard(Zone.BATTLEFIELD, playerB, "Pharika, God of Affliction", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker"); - setChoice(playerA, true); // cast it face down as 2/2 creature + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pine Walker using Morph"); activateAbility(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "{4}{G}: Turn this face-down permanent face up."); activateAbility(3, PhaseStep.POSTCOMBAT_MAIN, playerB, "{B}{G}: Exile target creature card from a graveyard", diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/SpellCastTriggerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/SpellCastTriggerTest.java index 83a8084c4d8..98f88ff8648 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/SpellCastTriggerTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/SpellCastTriggerTest.java @@ -142,7 +142,7 @@ public class SpellCastTriggerTest extends CardTestPlayerBase { castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", playerB); castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Glimpse of Freedom"); - castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Glimpse of Freedom"); + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Glimpse of Freedom with Escape"); setChoice(playerA,"Mountain"); setChoice(playerA,"Mountain"); setChoice(playerA,"Mountain"); diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index b76fd0491b2..89f6f7d5f38 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -391,10 +391,10 @@ public class TestPlayer implements Player { || searchObject.contains("fused ")) { Assert.assertFalse("alternative spell don't support alias", searchObject.startsWith(ALIAS_PREFIX)); foundObject = true; - foundAbility = ability.toString().startsWith(nameOrAlias); + foundAbility = ability.toString().equals(nameOrAlias); } else { foundObject = hasObjectTargetNameOrAlias(game.getObject(ability.getSourceId()), searchObject); - foundAbility = searchObject.startsWith(ALIAS_PREFIX) || ability.toString().startsWith(nameOrAlias); + foundAbility = searchObject.startsWith(ALIAS_PREFIX) || ability.toString().equals(nameOrAlias); } } else if (nameOrAlias.startsWith(ALIAS_PREFIX)) { // object alias with ability text: diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index 295ff3157f4..0a0be725e31 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -281,11 +281,8 @@ public abstract class AbilityImpl implements Ability { // as buyback, kicker, or convoke costs (see rules 117.8 and 117.9), the player announces his // or her intentions to pay any or all of those costs (see rule 601.2e). // A player can't apply two alternative methods of casting or two alternative costs to a single spell. - if (isMainPartAbility && !activateAlternateOrAdditionalCosts(sourceObject, noMana, controller, game)) { - if (getAbilityType() == AbilityType.SPELL - && ((SpellAbility) this).getSpellAbilityType() == SpellAbilityType.FACE_DOWN_CREATURE) { - return false; - } + if (isMainPartAbility) { + activateAlternateOrAdditionalCosts(sourceObject, noMana, controller, game); } // 117.6. Some mana costs contain no mana symbols. This represents an unpayable cost. An ability can @@ -436,6 +433,7 @@ public abstract class AbilityImpl implements Ability { case DISTURB: case MORE_THAN_MEETS_THE_EYE: case BESTOW: + case MORPH: // from Snapcaster Mage: // If you cast a spell from a graveyard using its flashback ability, you can't pay other alternative costs // (such as that of Foil). (2018-12-07) @@ -452,6 +450,12 @@ public abstract class AbilityImpl implements Ability { throw new IllegalArgumentException("Unknown ability cast mode: " + ((SpellAbility) this).getSpellAbilityCastMode()); } } + if (this.getAbilityType() == AbilityType.SPELL && this instanceof SpellAbility + // 117.9a Only one alternative cost can be applied to any one spell as it's being cast. + // So an alternate spell ability can't be paid with Omniscience + && ((SpellAbility) this).getSpellAbilityType() == SpellAbilityType.BASE_ALTERNATE) { + canUseAlternativeCost = false; + } boolean alternativeCostUsed = false; if (sourceObject != null && !(sourceObject instanceof Permanent)) { @@ -475,17 +479,12 @@ public abstract class AbilityImpl implements Ability { } // controller specific alternate spell costs if (canUseAlternativeCost && !noMana && !alternativeCostUsed) { - if (this.getAbilityType() == AbilityType.SPELL - // 117.9a Only one alternative cost can be applied to any one spell as it's being cast. - // So an alternate spell ability can't be paid with Omniscience - && ((SpellAbility) this).getSpellAbilityType() != SpellAbilityType.BASE_ALTERNATE) { - for (AlternativeSourceCosts alternativeSourceCosts : controller.getAlternativeSourceCosts()) { - if (alternativeSourceCosts.isAvailable(this, game)) { - if (alternativeSourceCosts.askToActivateAlternativeCosts(this, game)) { - // only one alternative costs may be activated - alternativeCostUsed = true; - break; - } + for (AlternativeSourceCosts alternativeSourceCosts : controller.getAlternativeSourceCosts()) { + if (alternativeSourceCosts.isAvailable(this, game)) { + if (alternativeSourceCosts.askToActivateAlternativeCosts(this, game)) { + // only one alternative costs may be activated + alternativeCostUsed = true; + break; } } } diff --git a/Mage/src/main/java/mage/abilities/SpellAbility.java b/Mage/src/main/java/mage/abilities/SpellAbility.java index 4424c905ac5..55a30f5cff5 100644 --- a/Mage/src/main/java/mage/abilities/SpellAbility.java +++ b/Mage/src/main/java/mage/abilities/SpellAbility.java @@ -328,8 +328,17 @@ public class SpellAbility extends ActivatedAbilityImpl { return spellCharacteristics; } + /** + * Given a spell cast event, returns the relevant SpellAbility involved + * Currently used to get the characteristics of the spell, specifically + * for "can't cast" effects using CAST_SPELL_LATE events + * + * @param event + * @param game + * @return SpellAbility of the event + */ public static SpellAbility getSpellAbilityFromEvent(GameEvent event, Game game) { - if (event.getType() != GameEvent.EventType.CAST_SPELL) { + if (event.getType() != GameEvent.EventType.CAST_SPELL && event.getType() != GameEvent.EventType.CAST_SPELL_LATE) { return null; } diff --git a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java index 4972061f516..b0562652703 100644 --- a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java @@ -514,14 +514,14 @@ public class ContinuousEffects implements Serializable { // usage check: effect must apply for specific ability only, not to full object (example: PLAY_FROM_NOT_OWN_HAND_ZONE) if (type.needAffectedAbility() && affectedAbility == null) { - throw new IllegalArgumentException("ERROR, you can't call asThough check to whole object, call it with affected ability instead: " + type); + throw new IllegalArgumentException("Wrong code usage: you can't call asThough check to whole object, call it with affected ability instead: " + type); } // usage check: effect must apply to full object, not specific ability (example: ATTACK_AS_HASTE) // P.S. In theory a same AsThough effect can be applied to object or to ability, so if you really, really // need it then disable that check or add extra param to AsThoughEffectType like needAffectedAbilityOrFullObject if (!type.needAffectedAbility() && affectedAbility != null) { - throw new IllegalArgumentException("ERROR, you can't call AsThough check to affected ability, call it with empty affected ability instead: " + type); + throw new IllegalArgumentException("Wrong code usage: you can't call AsThough check to affected ability, call it with empty affected ability instead: " + type); } List asThoughEffectsList = getApplicableAsThoughEffects(type, game); diff --git a/Mage/src/main/java/mage/abilities/effects/common/OpponentsCantCastChosenUntilNextTurnEffect.java b/Mage/src/main/java/mage/abilities/effects/common/OpponentsCantCastChosenUntilNextTurnEffect.java index b9411849ca3..bc0d906f593 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/OpponentsCantCastChosenUntilNextTurnEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/OpponentsCantCastChosenUntilNextTurnEffect.java @@ -2,7 +2,9 @@ package mage.abilities.effects.common; import mage.MageObject; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.cards.Card; import mage.constants.Duration; import mage.constants.Outcome; import mage.game.Game; @@ -45,11 +47,18 @@ public class OpponentsCantCastChosenUntilNextTurnEffect extends ContinuousRuleMo @Override public boolean applies(GameEvent event, Ability source, Game game) { - String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); - if (game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) { - MageObject object = game.getObject(event.getSourceId()); - return object != null && CardUtil.haveSameNames(object, cardName, game); + if (!game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) { + return false; } - return false; + SpellAbility spellAbility = SpellAbility.getSpellAbilityFromEvent(event, game); + if (spellAbility == null) { + return false; + } + Card card = spellAbility.getCharacteristics(game); + if (card == null) { + return false; + } + String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + return CardUtil.haveSameNames(card, cardName, game); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneAllEffect.java index e891e538766..d5476db5e81 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneAllEffect.java @@ -1,6 +1,7 @@ package mage.abilities.effects.common.asthought; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.effects.AsThoughEffectImpl; import mage.cards.Card; import mage.constants.*; @@ -47,16 +48,23 @@ public class PlayFromNotOwnHandZoneAllEffect extends AsThoughEffectImpl { @Override public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + throw new IllegalArgumentException("Wrong code usage: can't call applies method on empty affectedAbility"); + } + @Override + public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) { Card card = game.getCard(objectId); if (card != null) { + if (affectedAbility instanceof SpellAbility) { + card = ((SpellAbility) affectedAbility).getCharacteristics(game); + } switch (allowedCaster) { case YOU: - if (affectedControllerId != source.getControllerId()) { + if (playerId != source.getControllerId()) { return false; } break; case OPPONENT: - if (!game.getOpponents(source.getControllerId()).contains(affectedControllerId)) { + if (!game.getOpponents(source.getControllerId()).contains(playerId)) { return false; } break; diff --git a/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneTargetEffect.java index 8b429005615..81b044ef6aa 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneTargetEffect.java @@ -87,7 +87,7 @@ public class PlayFromNotOwnHandZoneTargetEffect extends AsThoughEffectImpl { // PLAY_FROM_NOT_OWN_HAND_ZONE must applies to affectedAbility only // If you see it then parent conditional effect must override both applies methods to support different // AsThough effect types in one conditional effect - throw new IllegalArgumentException("ERROR, can't call applies method on empty affectedAbility"); + throw new IllegalArgumentException("Wrong code usage: can't call applies method on empty affectedAbility"); } // invalid targets 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 b1835dd09e3..6ee38dd5851 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 @@ -1,11 +1,10 @@ package mage.abilities.effects.common.continuous; import mage.abilities.Ability; +import mage.abilities.SpellAbility; 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; @@ -50,25 +49,19 @@ public class CastAsThoughItHadFlashAllEffect extends AsThoughEffectImpl { } @Override - public boolean applies(UUID affectedSpellId, Ability source, UUID affectedControllerId, Game game) { - if (anyPlayer || source.isControlledBy(affectedControllerId)) { - Card card = game.getCard(affectedSpellId); + public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) { + if (affectedAbility instanceof SpellAbility && (anyPlayer||source.isControlledBy(playerId))) { + Card card = ((SpellAbility) affectedAbility).getCharacteristics(game); if (card != null) { - //Allow lands with morph to be played at instant speed - if (card.isLand(game)) { - boolean morphAbility = card.getAbilities().stream().anyMatch(MorphAbility.class::isInstance); - if (morphAbility) { - Card cardCopy = card.copy(); - cardCopy.removeAllCardTypes(game); - cardCopy.addCardType(game, CardType.CREATURE); - return filter.match(cardCopy, affectedControllerId, source, game); - } - } - return filter.match(card, affectedControllerId, source, game); + return filter.match(card, playerId, source, game); } } return false; } + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + throw new IllegalArgumentException("Wrong code usage: can't call applies method on empty affectedAbility"); + } private String setText() { StringBuilder sb = new StringBuilder(anyPlayer ? "any player" : "you"); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/PlayTheTopCardEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/PlayTheTopCardEffect.java index fd3f9be2d33..ad03af47f5d 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/PlayTheTopCardEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/PlayTheTopCardEffect.java @@ -1,6 +1,7 @@ package mage.abilities.effects.common.continuous; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.effects.AsThoughEffectImpl; import mage.cards.Card; import mage.constants.AsThoughEffectType; @@ -87,6 +88,10 @@ public class PlayTheTopCardEffect extends AsThoughEffectImpl { @Override public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + throw new IllegalArgumentException("Wrong code usage: can't call applies method on empty affectedAbility"); + } + @Override + public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) { // main card and all parts are checks in different calls. // two modes: // * can play cards (must check main card and allows any parts) @@ -101,10 +106,15 @@ public class PlayTheTopCardEffect extends AsThoughEffectImpl { if (this.canPlayCardOnly) { // check whole card instead part cardToCheck = cardToCheck.getMainCard(); + } else if (affectedAbility instanceof SpellAbility) { + SpellAbility spell = (SpellAbility) affectedAbility; + cardToCheck = spell.getCharacteristics(game); + if (spell.getManaCosts().isEmpty()){ + return false; + } } - // must be you - if (!affectedControllerId.equals(source.getControllerId())) { + if (!playerId.equals(source.getControllerId())) { return false; } @@ -154,12 +164,7 @@ public class PlayTheTopCardEffect extends AsThoughEffectImpl { } } - // can't cast without mana cost - if (!cardToCheck.isLand(game) && cardToCheck.getManaCost().isEmpty()) { - return false; - } - // must be correct card - return filter.match(cardToCheck, affectedControllerId, source, game); + return filter.match(cardToCheck, playerId, source, game); } } 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/abilities/effects/common/ruleModifying/PlayLandsFromGraveyardControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/PlayLandsFromGraveyardControllerEffect.java index fe1696a3810..873c3272488 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/PlayLandsFromGraveyardControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/PlayLandsFromGraveyardControllerEffect.java @@ -1,6 +1,7 @@ package mage.abilities.effects.common.ruleModifying; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.effects.AsThoughEffectImpl; import mage.cards.Card; import mage.constants.AsThoughEffectType; @@ -48,6 +49,10 @@ public class PlayLandsFromGraveyardControllerEffect extends AsThoughEffectImpl { @Override public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + throw new IllegalArgumentException("Wrong code usage: can't call applies method on empty affectedAbility"); + } + @Override + public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) { // current card's part Card cardToCheck = game.getCard(objectId); if (cardToCheck == null) { @@ -55,13 +60,13 @@ public class PlayLandsFromGraveyardControllerEffect extends AsThoughEffectImpl { } // must be you - if (!affectedControllerId.equals(source.getControllerId())) { + if (!playerId.equals(source.getControllerId())) { return false; } // must be your card Player player = game.getPlayer(cardToCheck.getOwnerId()); - if (player == null || !player.getId().equals(affectedControllerId)) { + if (player == null || !player.getId().equals(playerId)) { return false; } @@ -75,8 +80,10 @@ public class PlayLandsFromGraveyardControllerEffect extends AsThoughEffectImpl { if (!cardToCheck.isLand(game) && cardToCheck.getManaCost().isEmpty()) { return false; } - + if (affectedAbility instanceof SpellAbility){ + cardToCheck = ((SpellAbility) affectedAbility).getCharacteristics(game); + } // must be correct card - return filter.match(cardToCheck, affectedControllerId, source, game); + return filter.match(cardToCheck, playerId, source, game); } } diff --git a/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java b/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java index c0a0084c2a5..b12f2bd4409 100644 --- a/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java @@ -3,8 +3,8 @@ package mage.abilities.keyword; import mage.MageObject; import mage.ObjectColor; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.AlternativeSourceCostsImpl; import mage.abilities.costs.Cost; import mage.abilities.costs.Costs; import mage.abilities.costs.CostsImpl; @@ -12,13 +12,12 @@ import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.ManaCost; import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect; import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect.FaceDownType; -import mage.constants.CardType; -import mage.constants.Rarity; +import mage.cards.Card; +import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.EmptyToken; import mage.game.permanent.token.Token; -import mage.game.stack.Spell; import mage.util.CardUtil; /** @@ -62,8 +61,7 @@ import mage.util.CardUtil; * * @author LevelX2 */ -public class MorphAbility extends AlternativeSourceCostsImpl { - +public class MorphAbility extends SpellAbility { protected static final String ABILITY_KEYWORD = "Morph"; protected static final String ABILITY_KEYWORD_MEGA = "Megamorph"; protected static final String REMINDER_TEXT = "You may cast this card face down as a " @@ -75,20 +73,22 @@ public class MorphAbility extends AlternativeSourceCostsImpl { // needed to check activation status, if card changes zone after casting it private final boolean megamorph; - public MorphAbility(Cost morphCost) { - this(morphCost, false); + public MorphAbility(Card card, Cost morphCost) { + this(card, morphCost, false); } - public MorphAbility(Cost morphCost, boolean megamorph) { - super(megamorph ? ABILITY_KEYWORD_MEGA : ABILITY_KEYWORD, megamorph ? REMINDER_TEXT_MEGA : REMINDER_TEXT, new GenericManaCost(3)); + public MorphAbility(Card card, Cost morphCost, boolean megamorph) { + super(new GenericManaCost(3), card.getName()); this.morphCosts = new CostsImpl<>(); this.morphCosts.add(morphCost); this.megamorph = megamorph; - this.setWorksFaceDown(true); + this.setSpellAbilityCastMode(SpellAbilityCastMode.MORPH); + this.setSpellAbilityType(SpellAbilityType.BASE_ALTERNATE); Ability ability = new SimpleStaticAbility(new BecomesFaceDownCreatureEffect( morphCosts, (megamorph ? FaceDownType.MEGAMORPHED : FaceDownType.MORPHED))); ability.setWorksFaceDown(true); ability.setRuleVisible(false); + this.timing = TimingRule.SORCERY; addSubAbility(ability); } @@ -103,28 +103,6 @@ public class MorphAbility extends AlternativeSourceCostsImpl { return new MorphAbility(this); } - @Override - public boolean askToActivateAlternativeCosts(Ability ability, Game game) { - switch (ability.getAbilityType()) { - case SPELL: - Spell spell = game.getStack().getSpell(ability.getId()); - if (spell != null) { - spell.setFaceDown(true, game); - if (handleActivatingAlternativeCosts(ability, game)) { - game.getState().setValue("MorphAbility" + ability.getSourceId(), "activated"); - spell.getColor(game).setColor(null); - game.getState().getCreateMageObjectAttribute(spell.getCard(), game).getSubtype().clear(); - } else { - spell.setFaceDown(false, game); - } - } - break; - case PLAY_LAND: - handleActivatingAlternativeCosts(ability, game); - } - return isActivated(ability, game); - } - public Costs getMorphCosts() { return morphCosts; } @@ -132,8 +110,10 @@ public class MorphAbility extends AlternativeSourceCostsImpl { @Override public String getRule() { boolean isMana = morphCosts.get(0) instanceof ManaCost; - return alternativeCost.getName() + (isMana ? " " : "—") + - morphCosts.getText() + (isMana ? ' ' : ". ") + alternativeCost.getReminderText(); + String name = megamorph ? ABILITY_KEYWORD_MEGA : ABILITY_KEYWORD; + String reminder = megamorph ? REMINDER_TEXT_MEGA : REMINDER_TEXT; + return name + (isMana ? " " : "—") + + morphCosts.getText() + (isMana ? ' ' : ". ") + reminder; } /** @@ -169,4 +149,16 @@ public class MorphAbility extends AlternativeSourceCostsImpl { throw new IllegalArgumentException("Wrong code usage: un-supported targetObject in face down method: " + targetObject.getClass().getSimpleName()); } } + public static void setCardToFaceDownCreature(Card targetCard) { + targetCard.getPower().setModifiedBaseValue(2); + targetCard.getToughness().setModifiedBaseValue(2); + targetCard.getAbilities().clear(); + targetCard.getColor().setColor(new ObjectColor()); + targetCard.setName(""); + targetCard.removeAllCardTypes(); + targetCard.addCardType(CardType.CREATURE); + targetCard.getSubtype().clear(); + targetCard.removeAllSuperTypes(); + targetCard.getManaCost().clear(); + } } diff --git a/Mage/src/main/java/mage/constants/SpellAbilityCastMode.java b/Mage/src/main/java/mage/constants/SpellAbilityCastMode.java index 30ed5de09a7..905794d0336 100644 --- a/Mage/src/main/java/mage/constants/SpellAbilityCastMode.java +++ b/Mage/src/main/java/mage/constants/SpellAbilityCastMode.java @@ -1,8 +1,10 @@ package mage.constants; import mage.abilities.keyword.BestowAbility; +import mage.abilities.keyword.MorphAbility; import mage.cards.Card; import mage.game.Game; +import mage.game.stack.Spell; /** * @author LevelX2 @@ -12,6 +14,7 @@ public enum SpellAbilityCastMode { MADNESS("Madness"), FLASHBACK("Flashback"), BESTOW("Bestow"), + MORPH("Morph"), TRANSFORMED("Transformed", true), DISTURB("Disturb", true), MORE_THAN_MEETS_THE_EYE("More than Meets the Eye", true); @@ -44,12 +47,19 @@ 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)) { + if (cardCopy instanceof Spell) { + //Spell doesn't support setName, so make a copy of the card (we're blowing it away anyway) + cardCopy = ((Spell) cardCopy).getCard().copy(); + } + MorphAbility.setCardToFaceDownCreature(cardCopy); + } return cardCopy; } } diff --git a/Mage/src/main/java/mage/constants/SpellAbilityType.java b/Mage/src/main/java/mage/constants/SpellAbilityType.java index f32c86fa516..cb95677e060 100644 --- a/Mage/src/main/java/mage/constants/SpellAbilityType.java +++ b/Mage/src/main/java/mage/constants/SpellAbilityType.java @@ -6,7 +6,6 @@ package mage.constants; public enum SpellAbilityType { BASE("Basic SpellAbility"), BASE_ALTERNATE("Basic SpellAbility Alternate"), // used for Overload, Flashback to know they must be handled as Alternate casting costs - FACE_DOWN_CREATURE("Face down creature"), // used for Lands with Morph to cast as Face Down creature SPLIT("Split SpellAbility"), SPLIT_AFTERMATH("AftermathSplit SpellAbility"), SPLIT_FUSED("Split SpellAbility"), 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/command/Commander.java b/Mage/src/main/java/mage/game/command/Commander.java index c52a32e4e10..27c9c650d88 100644 --- a/Mage/src/main/java/mage/game/command/Commander.java +++ b/Mage/src/main/java/mage/game/command/Commander.java @@ -58,7 +58,6 @@ public class Commander extends CommandObjectImpl { abilities.add(spellAbility.copyWithZone(Zone.COMMAND)); } break; - case FACE_DOWN_CREATURE: // dynamic added spell for alternative cost like cast as face down case SPLICE: // only from hand case SPLIT_AFTERMATH: // only from graveyard // can't use from command zone diff --git a/Mage/src/main/java/mage/game/permanent/PermanentCard.java b/Mage/src/main/java/mage/game/permanent/PermanentCard.java index 24b32f961d8..b6c3642b0ea 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentCard.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentCard.java @@ -50,7 +50,7 @@ public class PermanentCard extends PermanentImpl { } } if (!goodForBattlefield) { - throw new IllegalArgumentException("ERROR, can't create permanent card from split or mdf: " + card.getName()); + throw new IllegalArgumentException("Wrong code usage: can't create permanent card from split or mdf: " + card.getName()); } this.card = card; diff --git a/Mage/src/main/java/mage/game/stack/Spell.java b/Mage/src/main/java/mage/game/stack/Spell.java index bd7c7e6e0c1..221e9b44206 100644 --- a/Mage/src/main/java/mage/game/stack/Spell.java +++ b/Mage/src/main/java/mage/game/stack/Spell.java @@ -5,7 +5,6 @@ import mage.MageObject; import mage.Mana; import mage.ObjectColor; import mage.abilities.*; -import mage.abilities.costs.AlternativeSourceCosts; import mage.abilities.costs.mana.ActivationManaAbilityStep; import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCosts; @@ -91,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) { @@ -182,11 +187,8 @@ public class Spell extends StackObjectImpl implements Card { } public String getSpellCastText(Game game) { - for (Ability spellAbility : getAbilities()) { - if (spellAbility instanceof MorphAbility - && ((AlternativeSourceCosts) spellAbility).isActivated(getSpellAbility(), game)) { - return "a card face down"; - } + if (this.getSpellAbility() instanceof MorphAbility) { + return "a card face down"; } if (card instanceof AdventureCardSpell) { diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index c9573a7a030..e4563a6ec99 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -1267,34 +1267,16 @@ public abstract class PlayerImpl implements Player, Serializable { @Override public boolean playLand(Card card, Game game, boolean ignoreTiming) { - // Check for alternate casting possibilities: e.g. land with Morph if (card == null) { return false; } ActivatedAbility playLandAbility = null; - boolean foundAlternative = false; for (Ability ability : card.getAbilities(game)) { - // if cast for noMana no Alternative costs are allowed - if ((ability instanceof AlternativeSourceCosts) - || (ability instanceof OptionalAdditionalSourceCosts)) { - foundAlternative = true; - } if (ability instanceof PlayLandAbility) { playLandAbility = (ActivatedAbility) ability; } } - // try alternative cast (face down) - if (foundAlternative) { - SpellAbility spellAbility = new SpellAbility(null, "", - game.getState().getZone(card.getId()), SpellAbilityType.FACE_DOWN_CREATURE); - spellAbility.setControllerId(this.getId()); - spellAbility.setSourceId(card.getId()); - if (cast(spellAbility, game, false, null)) { - return true; - } - } - if (playLandAbility == null) { return false; }