diff --git a/Mage.Sets/src/mage/cards/a/AvenRiftwatcher.java b/Mage.Sets/src/mage/cards/a/AvenRiftwatcher.java index 2b767ca4461..ff99f4c4958 100644 --- a/Mage.Sets/src/mage/cards/a/AvenRiftwatcher.java +++ b/Mage.Sets/src/mage/cards/a/AvenRiftwatcher.java @@ -1,24 +1,30 @@ + 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.VanishingAbility; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; - -import java.util.UUID; +import mage.counters.CounterType; /** + * * @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); @@ -28,9 +34,12 @@ public final class AvenRiftwatcher extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - // Vanishing 3 - this.addAbility(new VanishingAbility(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()); // 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 5d76f2deaa7..3c685af2308 100644 --- a/Mage.Sets/src/mage/cards/c/Calciderm.java +++ b/Mage.Sets/src/mage/cards/c/Calciderm.java @@ -1,22 +1,28 @@ + 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.VanishingAbility; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; - -import java.util.UUID; +import mage.counters.CounterType; /** + * * @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); @@ -24,9 +30,12 @@ public final class Calciderm extends CardImpl { // Shroud this.addAbility(ShroudAbility.getInstance()); - // Vanishing 4 - this.addAbility(new VanishingAbility(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()); } 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 39edd855a93..cdc74e8481e 100644 --- a/Mage.Sets/src/mage/cards/c/Chronozoa.java +++ b/Mage.Sets/src/mage/cards/c/Chronozoa.java @@ -1,23 +1,29 @@ 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.CreateTokenCopySourceEffect; import mage.abilities.effects.Effect; +import mage.abilities.effects.CreateTokenCopySourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.FlyingAbility; -import mage.abilities.keyword.VanishingAbility; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; - -import java.util.UUID; +import mage.counters.CounterType; /** + * * @author Gal Lerman + * */ public final class Chronozoa extends CardImpl { @@ -31,7 +37,11 @@ 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.) - this.addAbility(new VanishingAbility(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()); // 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 80e03776e96..f4b53025735 100644 --- a/Mage.Sets/src/mage/cards/d/DeadlyGrub.java +++ b/Mage.Sets/src/mage/cards/d/DeadlyGrub.java @@ -1,20 +1,26 @@ + 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.keyword.VanishingAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; 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 { @@ -26,7 +32,11 @@ public final class DeadlyGrub extends CardImpl { this.toughness = new MageInt(1); // Vanishing 3 - this.addAbility(new VanishingAbility(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()); // 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 7246a3bea09..6f643a69575 100644 --- a/Mage.Sets/src/mage/cards/d/DeadwoodTreefolk.java +++ b/Mage.Sets/src/mage/cards/d/DeadwoodTreefolk.java @@ -1,44 +1,51 @@ + 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.keyword.VanishingAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; 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 - this.addAbility(new VanishingAbility(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()); // When Deadwood Treefolk enters the battlefield or leaves the battlefield, return another target creature card from your graveyard to your hand. - Ability ability = new EntersBattlefieldOrLeavesSourceTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect(), false); + 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 d1637eea695..135c23cfcd5 100644 --- a/Mage.Sets/src/mage/cards/d/DeepForestHermit.java +++ b/Mage.Sets/src/mage/cards/d/DeepForestHermit.java @@ -1,16 +1,21 @@ 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.keyword.VanishingAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; 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; @@ -33,7 +38,11 @@ public final class DeepForestHermit extends CardImpl { this.toughness = new MageInt(1); // Vanishing 3 - this.addAbility(new VanishingAbility(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()); // 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 085888e6561..fd445434cbf 100644 --- a/Mage.Sets/src/mage/cards/k/KeldonMarauders.java +++ b/Mage.Sets/src/mage/cards/k/KeldonMarauders.java @@ -1,19 +1,24 @@ + 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.keyword.VanishingAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; 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 { @@ -27,10 +32,14 @@ public final class KeldonMarauders extends CardImpl { this.toughness = new MageInt(3); // Vanishing 2 - this.addAbility(new VanishingAbility(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()); // When Keldon Marauders enters the battlefield or leaves the battlefield, it deals 1 damage to target player. - Ability ability = new EntersBattlefieldOrLeavesSourceTriggeredAbility(new DamageTargetEffect(1, "it"), false); + 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 484f4f152b1..7166ff87572 100644 --- a/Mage.Sets/src/mage/cards/l/LavacoreElemental.java +++ b/Mage.Sets/src/mage/cards/l/LavacoreElemental.java @@ -1,33 +1,41 @@ + 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.VanishingAbility; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SetTargetPointer; import mage.constants.SubType; +import mage.constants.SetTargetPointer; 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 - this.addAbility(new VanishingAbility(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()); // 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 c6bac572133..68b695b7a64 100644 --- a/Mage.Sets/src/mage/cards/l/LostAuramancers.java +++ b/Mage.Sets/src/mage/cards/l/LostAuramancers.java @@ -1,9 +1,15 @@ + 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.VanishingAbility; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -16,22 +22,25 @@ 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 - this.addAbility(new VanishingAbility(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()); // 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 2902459ec8e..764d3f7406e 100644 --- a/Mage.Sets/src/mage/cards/m/MaelstromDjinn.java +++ b/Mage.Sets/src/mage/cards/m/MaelstromDjinn.java @@ -1,47 +1,49 @@ + 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.VanishingAbility; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; import mage.constants.SubType; +import mage.constants.Duration; 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)) - ); - ability.addEffect(new GainAbilitySourceEffect( - new VanishingAbility(0), Duration.WhileOnBattlefield - ).setText("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); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/o/OutOfTime.java b/Mage.Sets/src/mage/cards/o/OutOfTime.java index a696ca65063..34dc4540538 100644 --- a/Mage.Sets/src/mage/cards/o/OutOfTime.java +++ b/Mage.Sets/src/mage/cards/o/OutOfTime.java @@ -1,5 +1,7 @@ package mage.cards.o; +import java.util.*; + import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -7,7 +9,8 @@ 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.VanishingAbility; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -21,9 +24,8 @@ 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 { @@ -36,7 +38,8 @@ public final class OutOfTime extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new OutOfTimePhaseOutEffect())); // Vanishing - this.addAbility(new VanishingAbility(0)); + this.addAbility(new VanishingUpkeepAbility(0, "enchantment")); + this.addAbility(new VanishingSacrificeAbility()); } 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 28b89acb8a1..d2033c8de59 100644 --- a/Mage.Sets/src/mage/cards/r/RavagingRiftwurm.java +++ b/Mage.Sets/src/mage/cards/r/RavagingRiftwurm.java @@ -1,40 +1,44 @@ 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.VanishingAbility; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; 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 - this.addAbility(new VanishingAbility(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()); // 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 46b38a1f437..e1e38c3dc82 100644 --- a/Mage.Sets/src/mage/cards/r/RealityAcid.java +++ b/Mage.Sets/src/mage/cards/r/RealityAcid.java @@ -1,33 +1,38 @@ + 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.VanishingAbility; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; +import mage.constants.Outcome; 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 @@ -38,7 +43,11 @@ public final class RealityAcid extends CardImpl { this.addAbility(ability); // Vanishing 3 - this.addAbility(new VanishingAbility(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()); // 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 79380a675a4..22c9e0fb01d 100644 --- a/Mage.Sets/src/mage/cards/s/SoultetherGolem.java +++ b/Mage.Sets/src/mage/cards/s/SoultetherGolem.java @@ -1,9 +1,12 @@ 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.VanishingAbility; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -35,7 +38,11 @@ public final class SoultetherGolem extends CardImpl { this.toughness = new MageInt(3); // Vanishing 1 - this.addAbility(new VanishingAbility(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()); // 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 355cb9e1a57..3264ee52c40 100644 --- a/Mage.Sets/src/mage/cards/t/Tidewalker.java +++ b/Mage.Sets/src/mage/cards/t/Tidewalker.java @@ -1,5 +1,7 @@ + package mage.cards.t; +import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleStaticAbility; @@ -7,7 +9,8 @@ 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.VanishingAbility; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -16,9 +19,8 @@ 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 { @@ -30,17 +32,16 @@ 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 VanishingAbility(0)); - + this.addAbility(new VanishingUpkeepAbility(0)); + this.addAbility(new VanishingSacrificeAbility()); // 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 0d9c89bf8fd..61550f32675 100644 --- a/Mage.Sets/src/mage/cards/w/WaningWurm.java +++ b/Mage.Sets/src/mage/cards/w/WaningWurm.java @@ -1,28 +1,38 @@ + package mage.cards.w; +import java.util.UUID; import mage.MageInt; -import mage.abilities.keyword.VanishingAbility; +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.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; - -import java.util.UUID; +import mage.counters.CounterType; /** + * * @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 - this.addAbility(new VanishingAbility(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()); } 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 b89e12a5f6d..a2753500be9 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 */ - Ability setRuleVisible(boolean ruleVisible); + void 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 b503a054116..2f62c532bf6 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -1076,11 +1076,10 @@ public abstract class AbilityImpl implements Ability { } @Override - public AbilityImpl setRuleVisible(boolean ruleVisible) { + public void 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 deleted file mode 100644 index 6a94262e3a0..00000000000 --- a/Mage/src/main/java/mage/abilities/keyword/VanishingAbility.java +++ /dev/null @@ -1,97 +0,0 @@ -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 new file mode 100644 index 00000000000..8239a890cbd --- /dev/null +++ b/Mage/src/main/java/mage/abilities/keyword/VanishingSacrificeAbility.java @@ -0,0 +1,42 @@ +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 new file mode 100644 index 00000000000..e6097184fb3 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/keyword/VanishingUpkeepAbility.java @@ -0,0 +1,81 @@ +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 478144d8ebb..ba113c5ea2d 100644 --- a/Utils/keywords.txt +++ b/Utils/keywords.txt @@ -127,7 +127,6 @@ Undaunted|new| Undying|new| Unearth|cost| Unleash|new| -Vanishing|number| Vigilance|instance| Ward|cost| Wither|instance|