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|