diff --git a/Mage.Sets/src/mage/cards/a/AvenRiftwatcher.java b/Mage.Sets/src/mage/cards/a/AvenRiftwatcher.java index ff99f4c4958..2b767ca4461 100644 --- a/Mage.Sets/src/mage/cards/a/AvenRiftwatcher.java +++ b/Mage.Sets/src/mage/cards/a/AvenRiftwatcher.java @@ -1,30 +1,24 @@ - package mage.cards.a; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldOrLeavesSourceTriggeredAbility; import mage.abilities.effects.common.GainLifeEffect; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.FlyingAbility; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.counters.CounterType; + +import java.util.UUID; /** - * * @author dustinconrad */ public final class AvenRiftwatcher extends CardImpl { public AvenRiftwatcher(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.subtype.add(SubType.BIRD); this.subtype.add(SubType.REBEL); this.subtype.add(SubType.SOLDIER); @@ -34,12 +28,9 @@ public final class AvenRiftwatcher extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); + // Vanishing 3 - Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3))); - ability.setRuleVisible(false); - this.addAbility(ability); - this.addAbility(new VanishingUpkeepAbility(3)); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(3)); // When Aven Riftwatcher enters the battlefield or leaves the battlefield, you gain 2 life. this.addAbility(new EntersBattlefieldOrLeavesSourceTriggeredAbility(new GainLifeEffect(2), false)); diff --git a/Mage.Sets/src/mage/cards/c/Calciderm.java b/Mage.Sets/src/mage/cards/c/Calciderm.java index 3c685af2308..5d76f2deaa7 100644 --- a/Mage.Sets/src/mage/cards/c/Calciderm.java +++ b/Mage.Sets/src/mage/cards/c/Calciderm.java @@ -1,28 +1,22 @@ - package mage.cards.c; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.ShroudAbility; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.counters.CounterType; + +import java.util.UUID; /** - * * @author Loki */ public final class Calciderm extends CardImpl { public Calciderm(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}"); this.subtype.add(SubType.BEAST); this.power = new MageInt(5); @@ -30,12 +24,9 @@ public final class Calciderm extends CardImpl { // Shroud this.addAbility(ShroudAbility.getInstance()); + // Vanishing 4 - Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(4))); - ability.setRuleVisible(false); - this.addAbility(ability); - this.addAbility(new VanishingUpkeepAbility(4)); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(4)); } private Calciderm(final Calciderm card) { diff --git a/Mage.Sets/src/mage/cards/c/Chronozoa.java b/Mage.Sets/src/mage/cards/c/Chronozoa.java index cdc74e8481e..39edd855a93 100644 --- a/Mage.Sets/src/mage/cards/c/Chronozoa.java +++ b/Mage.Sets/src/mage/cards/c/Chronozoa.java @@ -1,29 +1,23 @@ package mage.cards.c; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.DiesSourceTriggeredAbility; -import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.common.LastTimeCounterRemovedCondition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.CreateTokenCopySourceEffect; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.Effect; import mage.abilities.keyword.FlyingAbility; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.counters.CounterType; + +import java.util.UUID; /** - * * @author Gal Lerman - * */ public final class Chronozoa extends CardImpl { @@ -37,11 +31,7 @@ public final class Chronozoa extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Vanishing 3 (This permanent enters the battlefield with three time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) - Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3))); - ability.setRuleVisible(false); - this.addAbility(ability); - this.addAbility(new VanishingUpkeepAbility(3)); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(3)); // When Chronozoa is put into a graveyard from play, if it had no time counters on it, create two tokens that are copies of it. Effect effect = new CreateTokenCopySourceEffect(2); diff --git a/Mage.Sets/src/mage/cards/d/DeadlyGrub.java b/Mage.Sets/src/mage/cards/d/DeadlyGrub.java index f4b53025735..80e03776e96 100644 --- a/Mage.Sets/src/mage/cards/d/DeadlyGrub.java +++ b/Mage.Sets/src/mage/cards/d/DeadlyGrub.java @@ -1,26 +1,20 @@ - package mage.cards.d; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.DiesSourceTriggeredAbility; -import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.common.LastTimeCounterRemovedCondition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.counters.CounterType; import mage.game.permanent.token.DeadlyGrubInsectToken; +import java.util.UUID; + /** - * * @author LoneFox */ public final class DeadlyGrub extends CardImpl { @@ -32,11 +26,7 @@ public final class DeadlyGrub extends CardImpl { this.toughness = new MageInt(1); // Vanishing 3 - Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3))); - ability.setRuleVisible(false); - this.addAbility(ability); - this.addAbility(new VanishingUpkeepAbility(3)); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(3)); // When Deadly Grub dies, if it had no time counters on it, create a 6/1 green Insect creature token with shroud. this.addAbility(new ConditionalInterveningIfTriggeredAbility(new DiesSourceTriggeredAbility(new CreateTokenEffect(new DeadlyGrubInsectToken(), 1)), diff --git a/Mage.Sets/src/mage/cards/d/DeadwoodTreefolk.java b/Mage.Sets/src/mage/cards/d/DeadwoodTreefolk.java index 6f643a69575..7246a3bea09 100644 --- a/Mage.Sets/src/mage/cards/d/DeadwoodTreefolk.java +++ b/Mage.Sets/src/mage/cards/d/DeadwoodTreefolk.java @@ -1,51 +1,44 @@ - package mage.cards.d; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldOrLeavesSourceTriggeredAbility; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.counters.CounterType; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.AnotherPredicate; import mage.target.Target; import mage.target.common.TargetCardInYourGraveyard; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class DeadwoodTreefolk extends CardImpl { private static final FilterCreatureCard filter = new FilterCreatureCard("another target creature card from your graveyard"); + static { filter.add(AnotherPredicate.instance); } public DeadwoodTreefolk(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{G}"); this.subtype.add(SubType.TREEFOLK); this.power = new MageInt(3); this.toughness = new MageInt(6); // Vanishing 3 - Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3))); - ability.setRuleVisible(false); - this.addAbility(ability); - this.addAbility(new VanishingUpkeepAbility(3)); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(3)); + // When Deadwood Treefolk enters the battlefield or leaves the battlefield, return another target creature card from your graveyard to your hand. - ability = new EntersBattlefieldOrLeavesSourceTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect(), false); + Ability ability = new EntersBattlefieldOrLeavesSourceTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect(), false); Target target = new TargetCardInYourGraveyard(filter); ability.addTarget(target); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/d/DeepForestHermit.java b/Mage.Sets/src/mage/cards/d/DeepForestHermit.java index 135c23cfcd5..d1637eea695 100644 --- a/Mage.Sets/src/mage/cards/d/DeepForestHermit.java +++ b/Mage.Sets/src/mage/cards/d/DeepForestHermit.java @@ -1,21 +1,16 @@ package mage.cards.d; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.counters.CounterType; import mage.filter.common.FilterCreaturePermanent; import mage.game.permanent.token.SquirrelToken; @@ -38,11 +33,7 @@ public final class DeepForestHermit extends CardImpl { this.toughness = new MageInt(1); // Vanishing 3 - Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3))); - ability.setRuleVisible(false); - this.addAbility(ability); - this.addAbility(new VanishingUpkeepAbility(3)); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(3)); // When Deep Forest Hermit enters the battlefield, create four 1/1 green Squirrel creature tokens. this.addAbility(new EntersBattlefieldTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/k/KeldonMarauders.java b/Mage.Sets/src/mage/cards/k/KeldonMarauders.java index fd445434cbf..085888e6561 100644 --- a/Mage.Sets/src/mage/cards/k/KeldonMarauders.java +++ b/Mage.Sets/src/mage/cards/k/KeldonMarauders.java @@ -1,24 +1,19 @@ - package mage.cards.k; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldOrLeavesSourceTriggeredAbility; import mage.abilities.effects.common.DamageTargetEffect; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.counters.CounterType; import mage.target.common.TargetPlayerOrPlaneswalker; +import java.util.UUID; + /** - * * @author jonubuu */ public final class KeldonMarauders extends CardImpl { @@ -32,14 +27,10 @@ public final class KeldonMarauders extends CardImpl { this.toughness = new MageInt(3); // Vanishing 2 - Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(2))); - ability.setRuleVisible(false); - this.addAbility(ability); - this.addAbility(new VanishingUpkeepAbility(2)); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(2)); // When Keldon Marauders enters the battlefield or leaves the battlefield, it deals 1 damage to target player. - ability = new EntersBattlefieldOrLeavesSourceTriggeredAbility(new DamageTargetEffect(1, "it"), false); + Ability ability = new EntersBattlefieldOrLeavesSourceTriggeredAbility(new DamageTargetEffect(1, "it"), false); ability.addTarget(new TargetPlayerOrPlaneswalker()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/l/LavacoreElemental.java b/Mage.Sets/src/mage/cards/l/LavacoreElemental.java index 7166ff87572..484f4f152b1 100644 --- a/Mage.Sets/src/mage/cards/l/LavacoreElemental.java +++ b/Mage.Sets/src/mage/cards/l/LavacoreElemental.java @@ -1,41 +1,33 @@ - package mage.cards.l; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility; -import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.SetTargetPointer; +import mage.constants.SubType; import mage.counters.CounterType; import mage.filter.StaticFilters; +import java.util.UUID; + /** - * * @author fireshoes */ public final class LavacoreElemental extends CardImpl { public LavacoreElemental(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); this.subtype.add(SubType.ELEMENTAL); this.power = new MageInt(5); this.toughness = new MageInt(3); // Vanishing 1 - Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(1))); - ability.setRuleVisible(false); - this.addAbility(ability); - this.addAbility(new VanishingUpkeepAbility(1)); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(1)); // Whenever a creature you control deals combat damage to a player, put a time counter on Lavacore Elemental. Effect effect = new AddCountersSourceEffect(CounterType.TIME.createInstance(1)); diff --git a/Mage.Sets/src/mage/cards/l/LostAuramancers.java b/Mage.Sets/src/mage/cards/l/LostAuramancers.java index 68b695b7a64..c6bac572133 100644 --- a/Mage.Sets/src/mage/cards/l/LostAuramancers.java +++ b/Mage.Sets/src/mage/cards/l/LostAuramancers.java @@ -1,15 +1,9 @@ - package mage.cards.l; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -22,25 +16,22 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.target.common.TargetCardInLibrary; +import java.util.UUID; + /** - * * @author Quercitron */ public final class LostAuramancers extends CardImpl { public LostAuramancers(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); this.power = new MageInt(3); this.toughness = new MageInt(3); // Vanishing 3 - Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3))); - ability.setRuleVisible(false); - this.addAbility(ability); - this.addAbility(new VanishingUpkeepAbility(3)); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(3)); // When Lost Auramancers dies, if it had no time counters on it, you may search your library // for an enchantment card and put it onto the battlefield. If you do, shuffle your library. diff --git a/Mage.Sets/src/mage/cards/m/MaelstromDjinn.java b/Mage.Sets/src/mage/cards/m/MaelstromDjinn.java index 764d3f7406e..2902459ec8e 100644 --- a/Mage.Sets/src/mage/cards/m/MaelstromDjinn.java +++ b/Mage.Sets/src/mage/cards/m/MaelstromDjinn.java @@ -1,49 +1,47 @@ - package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.MorphAbility; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.counters.CounterType; +import java.util.UUID; + /** - * * @author LoneFox */ public final class MaelstromDjinn extends CardImpl { public MaelstromDjinn(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{7}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{7}{U}"); this.subtype.add(SubType.DJINN); this.power = new MageInt(5); this.toughness = new MageInt(6); // Flying this.addAbility(FlyingAbility.getInstance()); + // Morph {2}{U} this.addAbility(new MorphAbility(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); - effect.setText("and it gains vanishing"); - ability.addEffect(effect); - effect = new GainAbilitySourceEffect(new VanishingSacrificeAbility(), Duration.WhileOnBattlefield); - effect.setText(""); - ability.addEffect(effect); + Ability ability = new TurnedFaceUpSourceTriggeredAbility( + new AddCountersSourceEffect(CounterType.TIME.createInstance(2)) + ); + ability.addEffect(new GainAbilitySourceEffect( + new VanishingAbility(0), Duration.WhileOnBattlefield + ).setText("and it gains vanishing")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/o/OutOfTime.java b/Mage.Sets/src/mage/cards/o/OutOfTime.java index 34dc4540538..a696ca65063 100644 --- a/Mage.Sets/src/mage/cards/o/OutOfTime.java +++ b/Mage.Sets/src/mage/cards/o/OutOfTime.java @@ -1,7 +1,5 @@ package mage.cards.o; -import java.util.*; - import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -9,8 +7,7 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.PhaseOutAllEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -24,8 +21,9 @@ import mage.game.events.GameEvent; import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; +import java.util.*; + /** - * * @author weirddan455 */ public final class OutOfTime extends CardImpl { @@ -38,8 +36,7 @@ public final class OutOfTime extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new OutOfTimePhaseOutEffect())); // Vanishing - this.addAbility(new VanishingUpkeepAbility(0, "enchantment")); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(0)); } private OutOfTime(final OutOfTime card) { diff --git a/Mage.Sets/src/mage/cards/r/RavagingRiftwurm.java b/Mage.Sets/src/mage/cards/r/RavagingRiftwurm.java index d2033c8de59..28b89acb8a1 100644 --- a/Mage.Sets/src/mage/cards/r/RavagingRiftwurm.java +++ b/Mage.Sets/src/mage/cards/r/RavagingRiftwurm.java @@ -1,44 +1,40 @@ package mage.cards.r; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.common.KickedCondition; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.KickerAbility; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.counters.CounterType; +import java.util.UUID; + /** - * * @author LoneFox */ public final class RavagingRiftwurm extends CardImpl { public RavagingRiftwurm(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{G}"); this.subtype.add(SubType.WURM); this.power = new MageInt(6); this.toughness = new MageInt(6); // Kicker {4} this.addAbility(new KickerAbility("{4}")); + // Vanishing 2 - Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(2))); - ability.setRuleVisible(false); - this.addAbility(ability); - this.addAbility(new VanishingUpkeepAbility(2)); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(2)); + // If Ravaging Riftwurm was kicked, it enters the battlefield with three additional time counters on it. this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3)), - KickedCondition.ONCE, "If {this} was kicked, it enters the battlefield with three additional time counters on it.", "")); + KickedCondition.ONCE, "If {this} was kicked, it enters the battlefield with three additional time counters on it.", "")); } private RavagingRiftwurm(final RavagingRiftwurm card) { diff --git a/Mage.Sets/src/mage/cards/r/RealityAcid.java b/Mage.Sets/src/mage/cards/r/RealityAcid.java index e1e38c3dc82..46b38a1f437 100644 --- a/Mage.Sets/src/mage/cards/r/RealityAcid.java +++ b/Mage.Sets/src/mage/cards/r/RealityAcid.java @@ -1,38 +1,33 @@ - package mage.cards.r; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.ZoneChangeTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.SacrificeTargetEffect; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.EnchantAbility; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; -import mage.counters.CounterType; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** - * * @author fireshoes */ public final class RealityAcid extends CardImpl { public RealityAcid(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); this.subtype.add(SubType.AURA); // Enchant permanent @@ -43,11 +38,7 @@ public final class RealityAcid extends CardImpl { this.addAbility(ability); // Vanishing 3 - ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3))); - ability.setRuleVisible(false); - this.addAbility(ability); - this.addAbility(new VanishingUpkeepAbility(3, "aura")); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(3)); // When Reality Acid leaves the battlefield, enchanted permanent's controller sacrifices it. Effect effect = new SacrificeTargetEffect("enchanted permanent's controller sacrifices it"); diff --git a/Mage.Sets/src/mage/cards/s/SoultetherGolem.java b/Mage.Sets/src/mage/cards/s/SoultetherGolem.java index 22c9e0fb01d..79380a675a4 100644 --- a/Mage.Sets/src/mage/cards/s/SoultetherGolem.java +++ b/Mage.Sets/src/mage/cards/s/SoultetherGolem.java @@ -1,12 +1,9 @@ package mage.cards.s; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -38,11 +35,7 @@ public final class SoultetherGolem extends CardImpl { this.toughness = new MageInt(3); // Vanishing 1 - Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(1))); - ability.setRuleVisible(false); - this.addAbility(ability); - this.addAbility(new VanishingUpkeepAbility(1)); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(1)); // Whenever another creature enters the battlefield under your control, put a time counter on Soultether Golem. this.addAbility(new EntersBattlefieldControlledTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/t/Tidewalker.java b/Mage.Sets/src/mage/cards/t/Tidewalker.java index 3264ee52c40..355cb9e1a57 100644 --- a/Mage.Sets/src/mage/cards/t/Tidewalker.java +++ b/Mage.Sets/src/mage/cards/t/Tidewalker.java @@ -1,7 +1,5 @@ - package mage.cards.t; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleStaticAbility; @@ -9,8 +7,7 @@ import mage.abilities.dynamicvalue.common.CountersSourceCount; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -19,8 +16,9 @@ import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.common.FilterControlledPermanent; +import java.util.UUID; + /** - * * @author LoneFox */ public final class Tidewalker extends CardImpl { @@ -32,16 +30,17 @@ public final class Tidewalker extends CardImpl { } public Tidewalker(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); this.subtype.add(SubType.ELEMENTAL); this.power = new MageInt(0); this.toughness = new MageInt(0); // Tidewalker enters the battlefield with a time counter on it for each Island you control. this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(0), new PermanentsOnBattlefieldCount(filter), true), "with a time counter on it for each Island you control")); + // Vanishing - this.addAbility(new VanishingUpkeepAbility(0)); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(0)); + // Tidewalker's power and toughness are each equal to the number of time counters on it. this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerToughnessSourceEffect(new CountersSourceCount(CounterType.TIME)))); } diff --git a/Mage.Sets/src/mage/cards/w/WaningWurm.java b/Mage.Sets/src/mage/cards/w/WaningWurm.java index 61550f32675..0d9c89bf8fd 100644 --- a/Mage.Sets/src/mage/cards/w/WaningWurm.java +++ b/Mage.Sets/src/mage/cards/w/WaningWurm.java @@ -1,38 +1,28 @@ - package mage.cards.w; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAbility; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.VanishingSacrificeAbility; -import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.counters.CounterType; + +import java.util.UUID; /** - * * @author LoneFox */ public final class WaningWurm extends CardImpl { public WaningWurm(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); this.subtype.add(SubType.ZOMBIE); this.subtype.add(SubType.WURM); this.power = new MageInt(7); this.toughness = new MageInt(6); // Vanishing 2 - Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(2))); - ability.setRuleVisible(false); - this.addAbility(ability); - this.addAbility(new VanishingUpkeepAbility(2)); - this.addAbility(new VanishingSacrificeAbility()); + this.addAbility(new VanishingAbility(2)); } private WaningWurm(final WaningWurm card) { diff --git a/Mage/src/main/java/mage/abilities/Ability.java b/Mage/src/main/java/mage/abilities/Ability.java index a2753500be9..b89e12a5f6d 100644 --- a/Mage/src/main/java/mage/abilities/Ability.java +++ b/Mage/src/main/java/mage/abilities/Ability.java @@ -428,7 +428,7 @@ public interface Ability extends Controllable, Serializable { * * @param ruleVisible */ - void setRuleVisible(boolean ruleVisible); + Ability setRuleVisible(boolean ruleVisible); /** * Returns true if the additional costs of the abilitiy should be visible on diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index 2f62c532bf6..b503a054116 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -1076,10 +1076,11 @@ public abstract class AbilityImpl implements Ability { } @Override - public void setRuleVisible(boolean ruleVisible) { + public AbilityImpl setRuleVisible(boolean ruleVisible) { if (!(this instanceof MageSingleton)) { // prevent to change singletons this.ruleVisible = ruleVisible; } + return this; } @Override diff --git a/Mage/src/main/java/mage/abilities/keyword/VanishingAbility.java b/Mage/src/main/java/mage/abilities/keyword/VanishingAbility.java new file mode 100644 index 00000000000..6a94262e3a0 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/keyword/VanishingAbility.java @@ -0,0 +1,97 @@ +package mage.abilities.keyword; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.SourceHasCounterCondition; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.util.CardUtil; + +/** + * @author TheElk801 + */ +public class VanishingAbility extends EntersBattlefieldAbility { + + private static final Condition condition = new SourceHasCounterCondition(CounterType.TIME); + private final int amount; + + public VanishingAbility(int amount) { + super(new AddCountersSourceEffect(CounterType.TIME.createInstance(amount))); + this.amount = amount; + this.addSubAbility(new ConditionalInterveningIfTriggeredAbility( + new BeginningOfUpkeepTriggeredAbility( + new RemoveCounterSourceEffect(CounterType.TIME.createInstance()), + TargetController.YOU, false + ), condition, "At the beginning of your upkeep, if this permanent " + + "has a time counter on it, remove a time counter from it." + ).setRuleVisible(false)); + this.addSubAbility(new VanishingTriggeredAbility()); + } + + private VanishingAbility(final VanishingAbility ability) { + super(ability); + this.amount = ability.amount; + } + + @Override + public VanishingAbility copy() { + return new VanishingAbility(this); + } + + @Override + public String getRule() { + if (amount > 0) { + return "Vanishing " + amount + " (This permanent enters the battlefield with " + + CardUtil.numberToText(amount) + " time counters on it. At the beginning of your upkeep, " + + "remove a time counter from it. When the last is removed, sacrifice it.)"; + } + return "Vanishing (At the beginning of your upkeep, remove a time counter " + + "from this permanent. When the last is removed, sacrifice it.)"; + } +} + +class VanishingTriggeredAbility extends TriggeredAbilityImpl { + + VanishingTriggeredAbility() { + super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); + this.setRuleVisible(false); + } + + private VanishingTriggeredAbility(final VanishingTriggeredAbility ability) { + super(ability); + } + + @Override + public VanishingTriggeredAbility copy() { + return new VanishingTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.COUNTERS_REMOVED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (!CounterType.TIME.getName().equals(event.getData())) { + return false; + } + Permanent permanent = getSourcePermanentIfItStillExists(game); + return permanent != null && permanent.getCounters(game).getCount(CounterType.TIME) < 1; + } + + @Override + public String getRule() { + return "When the last time counter is removed from {this}, sacrifice it."; + } +} diff --git a/Mage/src/main/java/mage/abilities/keyword/VanishingSacrificeAbility.java b/Mage/src/main/java/mage/abilities/keyword/VanishingSacrificeAbility.java deleted file mode 100644 index 8239a890cbd..00000000000 --- a/Mage/src/main/java/mage/abilities/keyword/VanishingSacrificeAbility.java +++ /dev/null @@ -1,42 +0,0 @@ -package mage.abilities.keyword; - -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.common.SacrificeSourceEffect; -import mage.constants.Zone; -import mage.counters.CounterType; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; - -public class VanishingSacrificeAbility extends TriggeredAbilityImpl { - public VanishingSacrificeAbility() { - super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); - this.setRuleVisible(false); - } - - protected VanishingSacrificeAbility(final VanishingSacrificeAbility ability) { - super(ability); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.COUNTER_REMOVED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getData().equals(CounterType.TIME.getName()) && event.getTargetId().equals(this.getSourceId())) { - Permanent p = game.getPermanent(this.getSourceId()); - if (p != null) { - return p.getCounters(game).getCount(CounterType.TIME) == 0; - } - } - return false; - } - - @Override - public VanishingSacrificeAbility copy() { - return new VanishingSacrificeAbility(this); - } - -} diff --git a/Mage/src/main/java/mage/abilities/keyword/VanishingUpkeepAbility.java b/Mage/src/main/java/mage/abilities/keyword/VanishingUpkeepAbility.java deleted file mode 100644 index e6097184fb3..00000000000 --- a/Mage/src/main/java/mage/abilities/keyword/VanishingUpkeepAbility.java +++ /dev/null @@ -1,81 +0,0 @@ -package mage.abilities.keyword; - -import mage.abilities.Ability; -import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; -import mage.abilities.effects.OneShotEffect; -import mage.constants.Outcome; -import mage.constants.TargetController; -import mage.counters.CounterType; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.util.CardUtil; - -public class VanishingUpkeepAbility extends BeginningOfUpkeepTriggeredAbility { - - private int vanishingAmount; - private String permanentType; - - public VanishingUpkeepAbility(int vanishingEffect) { - super(new VanishingEffect(), TargetController.YOU, false); - this.vanishingAmount = vanishingEffect; - this.permanentType = "creature"; - } - - public VanishingUpkeepAbility(int vanishingEffect, String permanentType) { - super(new VanishingEffect(), TargetController.YOU, false); - this.vanishingAmount = vanishingEffect; - this.permanentType = permanentType; - } - - protected VanishingUpkeepAbility(final VanishingUpkeepAbility ability) { - super(ability); - this.vanishingAmount = ability.vanishingAmount; - this.permanentType = ability.permanentType; - } - - @Override - public BeginningOfUpkeepTriggeredAbility copy() { - return new VanishingUpkeepAbility(this); - } - - @Override - public String getRule() { - if (vanishingAmount > 0) { - return "Vanishing " + vanishingAmount - + " (This " + permanentType + " enters the battlefield with " + CardUtil.numberToText(vanishingAmount) - + " time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.)"; - } else { - return "Vanishing (At the beginning of your upkeep, remove a time counter from this " + permanentType + ". When the last is removed, sacrifice it.)"; - } - } -} - -class VanishingEffect extends OneShotEffect { - - VanishingEffect() { - super(Outcome.Sacrifice); - } - - VanishingEffect(final VanishingEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent p = game.getPermanent(source.getSourceId()); - if (p != null) { - int amount = p.getCounters(game).getCount(CounterType.TIME); - if (amount > 0) { - p.removeCounters(CounterType.TIME.createInstance(), source, game); - game.informPlayers("Removed a time counter from " + p.getLogName() + " (" + amount + " left)"); - } - return true; - } - return false; - } - - @Override - public VanishingEffect copy() { - return new VanishingEffect(this); - } -} diff --git a/Utils/keywords.txt b/Utils/keywords.txt index ba113c5ea2d..478144d8ebb 100644 --- a/Utils/keywords.txt +++ b/Utils/keywords.txt @@ -127,6 +127,7 @@ Undaunted|new| Undying|new| Unearth|cost| Unleash|new| +Vanishing|number| Vigilance|instance| Ward|cost| Wither|instance|