diff --git a/Mage.Sets/src/mage/cards/a/AdaptiveOmnitool.java b/Mage.Sets/src/mage/cards/a/AdaptiveOmnitool.java
index f88856700d9..7e9d1901c0f 100644
--- a/Mage.Sets/src/mage/cards/a/AdaptiveOmnitool.java
+++ b/Mage.Sets/src/mage/cards/a/AdaptiveOmnitool.java
@@ -1,7 +1,5 @@
package mage.cards.a;
-import java.util.UUID;
-
import mage.abilities.common.AttacksAttachedTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
@@ -9,35 +7,35 @@ import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
-import mage.abilities.hint.Hint;
-import mage.abilities.hint.ValueHint;
+import mage.abilities.hint.common.ArtifactYouControlHint;
import mage.abilities.keyword.EquipAbility;
-import mage.constants.Outcome;
-import mage.constants.PutCards;
-import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.PutCards;
+import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledArtifactPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author sobiech
*/
public final class AdaptiveOmnitool extends CardImpl {
+
private final static DynamicValue artifactYouControlCount = new PermanentsOnBattlefieldCount(new FilterControlledArtifactPermanent());
- private final static Hint hint = new ValueHint("Artifacts you control", artifactYouControlCount);
public AdaptiveOmnitool(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
-
+
this.subtype.add(SubType.EQUIPMENT);
// Equipped creature gets +1/+1 for each artifact you control.
this.addAbility(
- new SimpleStaticAbility(new BoostEquippedEffect(artifactYouControlCount, artifactYouControlCount)).addHint(hint)
+ new SimpleStaticAbility(new BoostEquippedEffect(artifactYouControlCount, artifactYouControlCount)).addHint(ArtifactYouControlHint.instance)
);
// Whenever equipped creature attacks, look at the top six cards of your library. You may reveal an artifact card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
diff --git a/Mage.Sets/src/mage/cards/c/ConsulsLieutenant.java b/Mage.Sets/src/mage/cards/c/ConsulsLieutenant.java
index d204a246592..5035bafc11d 100644
--- a/Mage.Sets/src/mage/cards/c/ConsulsLieutenant.java
+++ b/Mage.Sets/src/mage/cards/c/ConsulsLieutenant.java
@@ -37,7 +37,7 @@ public final class ConsulsLieutenant extends CardImpl {
// Whenever Consul's Lieutenant attacks, if it's renowned, other attacking creatures you control get +1/+1 until end of turn.
this.addAbility(new AttacksTriggeredAbility(new BoostControlledEffect(
1, 1, Duration.EndOfTurn, StaticFilters.FILTER_ATTACKING_CREATURES, true
- )).withInterveningIf(RenownedSourceCondition.instance));
+ )).withInterveningIf(RenownedSourceCondition.ITS));
}
private ConsulsLieutenant(final ConsulsLieutenant card) {
diff --git a/Mage.Sets/src/mage/cards/g/GatebreakerRam.java b/Mage.Sets/src/mage/cards/g/GatebreakerRam.java
index 8043d5e2d62..5ada9121c46 100644
--- a/Mage.Sets/src/mage/cards/g/GatebreakerRam.java
+++ b/Mage.Sets/src/mage/cards/g/GatebreakerRam.java
@@ -3,8 +3,7 @@ package mage.cards.g;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.condition.Condition;
-import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.YouControlTwoOrMoreGatesCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
@@ -16,10 +15,8 @@ import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.ComparisonType;
import mage.constants.Duration;
import mage.constants.SubType;
-import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import java.util.UUID;
@@ -29,16 +26,7 @@ import java.util.UUID;
*/
public final class GatebreakerRam extends CardImpl {
- private static final FilterPermanent filter = new FilterControlledPermanent();
-
- static {
- filter.add(SubType.GATE.getPredicate());
- }
-
- private static final DynamicValue xValue
- = new PermanentsOnBattlefieldCount(filter);
- private static final Condition condition
- = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1);
+ private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.GATE));
public GatebreakerRam(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}");
@@ -50,17 +38,16 @@ public final class GatebreakerRam extends CardImpl {
// Gatebreaker Ram gets +1/+1 for each Gate you control.
this.addAbility(new SimpleStaticAbility(
new BoostSourceEffect(xValue, xValue, Duration.WhileOnBattlefield)
- .setText("{this} gets +1/+1 for each Gate you control.")
).addHint(GatesYouControlHint.instance));
// As long as you control two or more Gates, Gatebreaker Ram has vigilance and trample.
Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(VigilanceAbility.getInstance()),
- condition, "As long as you control two or more Gates, {this} has vigilance"
+ YouControlTwoOrMoreGatesCondition.instance, "As long as you control two or more Gates, {this} has vigilance"
));
ability.addEffect(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(TrampleAbility.getInstance()),
- condition, "and trample"
+ YouControlTwoOrMoreGatesCondition.instance, "and trample"
));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/g/GoblinGloryChaser.java b/Mage.Sets/src/mage/cards/g/GoblinGloryChaser.java
index 0f965af1b8d..8444540ca98 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinGloryChaser.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinGloryChaser.java
@@ -1,31 +1,27 @@
-
package mage.cards.g;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.RenownedSourceCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
-import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.MenaceAbility;
import mage.abilities.keyword.RenownAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Duration;
-import mage.constants.Zone;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
- *
* @author fireshoes
*/
public final class GoblinGloryChaser extends CardImpl {
public GoblinGloryChaser(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}");
this.subtype.add(SubType.GOBLIN);
this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(1);
@@ -35,13 +31,11 @@ public final class GoblinGloryChaser extends CardImpl {
this.addAbility(new RenownAbility(1));
// As long as Goblin Glory Chaser is renowned, it has menace.
- Effect effect = new ConditionalContinuousEffect(
+ this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(new MenaceAbility(), Duration.WhileOnBattlefield),
- RenownedSourceCondition.instance,
- "As long as {this} is renowned, it has menace. " +
- "(It can't be blocked except by two or more creatures.)");
- Ability ability = new SimpleStaticAbility(effect);
- this.addAbility(ability);
+ RenownedSourceCondition.THIS, "as long as {this} is renowned, " +
+ "it has menace. (It can't be blocked except by two or more creatures.)"
+ )));
}
private GoblinGloryChaser(final GoblinGloryChaser card) {
diff --git a/Mage.Sets/src/mage/cards/h/HonoredHierarch.java b/Mage.Sets/src/mage/cards/h/HonoredHierarch.java
index ee5d1b50931..ce7bd5aecf2 100644
--- a/Mage.Sets/src/mage/cards/h/HonoredHierarch.java
+++ b/Mage.Sets/src/mage/cards/h/HonoredHierarch.java
@@ -1,13 +1,10 @@
-
package mage.cards.h;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.RenownedSourceCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
-import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.RenownAbility;
import mage.abilities.keyword.VigilanceAbility;
@@ -15,18 +12,18 @@ import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Duration;
-import mage.constants.Zone;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class HonoredHierarch extends CardImpl {
public HonoredHierarch(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.DRUID);
this.power = new MageInt(1);
@@ -36,18 +33,15 @@ public final class HonoredHierarch extends CardImpl {
this.addAbility(new RenownAbility(1));
// As long as Honored Hierarch is renowned, it has vigilance and "{T}: Add one mana of any color."
- Effect effect = new ConditionalContinuousEffect(
+ Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(VigilanceAbility.getInstance(), Duration.WhileOnBattlefield),
- RenownedSourceCondition.instance,
- "As long as {this} is renowned, it has vigilance");
- Ability ability = new SimpleStaticAbility(effect);
- effect = new ConditionalContinuousEffect(
+ RenownedSourceCondition.THIS, "as long as {this} is renowned, it has vigilance"
+ ));
+ ability.addEffect(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(new AnyColorManaAbility(), Duration.WhileOnBattlefield),
- RenownedSourceCondition.instance,
- "and \"{T}: Add one mana of any color.\"");
- ability.addEffect(effect);
- this.addAbility(ability);
-
+ RenownedSourceCondition.THIS, "and \"{T}: Add one mana of any color.\""
+ ));
+ this.addAbility(ability);
}
private HonoredHierarch(final HonoredHierarch card) {
diff --git a/Mage.Sets/src/mage/cards/o/OpalLakeGatekeepers.java b/Mage.Sets/src/mage/cards/o/OpalLakeGatekeepers.java
index 67e8746074b..aa933a62b71 100644
--- a/Mage.Sets/src/mage/cards/o/OpalLakeGatekeepers.java
+++ b/Mage.Sets/src/mage/cards/o/OpalLakeGatekeepers.java
@@ -2,16 +2,13 @@ package mage.cards.o;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.condition.Condition;
-import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.YouControlTwoOrMoreGatesCondition;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.hint.common.GatesYouControlHint;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.ComparisonType;
import mage.constants.SubType;
-import mage.filter.common.FilterControlledPermanent;
import java.util.UUID;
@@ -20,11 +17,6 @@ import java.util.UUID;
*/
public final class OpalLakeGatekeepers extends CardImpl {
- private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
- new FilterControlledPermanent(SubType.GATE, "you control two or more Gates"),
- ComparisonType.MORE_THAN, 1
- );
-
public OpalLakeGatekeepers(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}");
this.subtype.add(SubType.VEDALKEN);
@@ -35,7 +27,7 @@ public final class OpalLakeGatekeepers extends CardImpl {
// When Opal Lake Gatekeepers enters the battlefield, if you control two or more Gates, you may draw a card.
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), true)
- .withInterveningIf(condition).addHint(GatesYouControlHint.instance));
+ .withInterveningIf(YouControlTwoOrMoreGatesCondition.instance).addHint(GatesYouControlHint.instance));
}
private OpalLakeGatekeepers(final OpalLakeGatekeepers card) {
diff --git a/Mage.Sets/src/mage/cards/p/PlazaOfHarmony.java b/Mage.Sets/src/mage/cards/p/PlazaOfHarmony.java
index 9f59bf56dfe..2bc0057e502 100644
--- a/Mage.Sets/src/mage/cards/p/PlazaOfHarmony.java
+++ b/Mage.Sets/src/mage/cards/p/PlazaOfHarmony.java
@@ -1,8 +1,7 @@
package mage.cards.p;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.condition.Condition;
-import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.YouControlTwoOrMoreGatesCondition;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.hint.common.GatesYouControlHint;
import mage.abilities.mana.AnyColorLandsProduceManaAbility;
@@ -10,11 +9,9 @@ import mage.abilities.mana.ColorlessManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.filter.FilterPermanent;
-import mage.filter.common.FilterControlledPermanent;
import java.util.UUID;
@@ -25,17 +22,12 @@ public final class PlazaOfHarmony extends CardImpl {
private static final FilterPermanent filter2 = new FilterPermanent(SubType.GATE, "Gate");
- private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
- new FilterControlledPermanent(SubType.GATE, "you control two or more Gates"),
- ComparisonType.MORE_THAN, 1
- );
-
public PlazaOfHarmony(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// When Plaza of Harmony enters the battlefield, if you control two or more Gates, you gain 3 life.
this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3))
- .withInterveningIf(condition).addHint(GatesYouControlHint.instance));
+ .withInterveningIf(YouControlTwoOrMoreGatesCondition.instance).addHint(GatesYouControlHint.instance));
// {T}: Add {C}.
this.addAbility(new ColorlessManaAbility());
diff --git a/Mage.Sets/src/mage/cards/r/RadiantPerformer.java b/Mage.Sets/src/mage/cards/r/RadiantPerformer.java
index baf97129cec..89ed4ec669d 100644
--- a/Mage.Sets/src/mage/cards/r/RadiantPerformer.java
+++ b/Mage.Sets/src/mage/cards/r/RadiantPerformer.java
@@ -6,7 +6,6 @@ import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.CastFromHandSourcePermanentCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CopySpellForEachItCouldTargetEffect;
import mage.abilities.keyword.FlashAbility;
import mage.cards.CardImpl;
@@ -52,13 +51,8 @@ public final class RadiantPerformer extends CardImpl {
this.addAbility(FlashAbility.getInstance());
// When Radiant Performer enters the battlefield, if you cast it from your hand, choose target spell or ability that targets only a single permanent or player. Copy that spell or ability for each other permanent or player the spell or ability could target. Each copy targets a different one of those permanents and players.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new RadiantPerformerEffect()),
- CastFromHandSourcePermanentCondition.instance, "When {this} enters, " +
- "if you cast it from your hand, choose target spell or ability that targets only " +
- "a single permanent or player. Copy that spell or ability for each other permanent or player " +
- "the spell or ability could target. Each copy targets a different one of those permanents and players."
- );
+ Ability ability = new EntersBattlefieldTriggeredAbility(new RadiantPerformerEffect())
+ .withInterveningIf(CastFromHandSourcePermanentCondition.instance);
ability.addTarget(new TargetStackObject(filter));
this.addAbility(ability, new CastFromHandWatcher());
}
@@ -98,6 +92,7 @@ class RadiantPerformerEffect extends CopySpellForEachItCouldTargetEffect {
RadiantPerformerEffect() {
super();
+ staticText = "choose target spell or ability that targets only a single permanent or player. Copy that spell or ability for each other permanent or player the spell or ability could target. Each copy targets a different one of those permanents and players";
}
private RadiantPerformerEffect(final RadiantPerformerEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/r/RafterDemon.java b/Mage.Sets/src/mage/cards/r/RafterDemon.java
index 9c966444ab6..9bffe4ebf87 100644
--- a/Mage.Sets/src/mage/cards/r/RafterDemon.java
+++ b/Mage.Sets/src/mage/cards/r/RafterDemon.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.SpectacleCondition;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
import mage.abilities.keyword.SpectacleAbility;
@@ -32,14 +31,9 @@ public final class RafterDemon extends CardImpl {
this.addAbility(new SpectacleAbility(this, new ManaCostsImpl<>("{3}{B}{R}")));
// When Rafter Demon enters the battlefield, if its spectacle cost was paid, each opponent discards a card.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new DiscardEachPlayerEffect(
- StaticValue.get(1), false, TargetController.OPPONENT
- )), SpectacleCondition.instance,
- "When {this} enters, " +
- "if its spectacle cost was paid, " +
- "each opponent discards a card."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DiscardEachPlayerEffect(
+ StaticValue.get(1), false, TargetController.OPPONENT
+ )).withInterveningIf(SpectacleCondition.instance));
}
private RafterDemon(final RafterDemon card) {
diff --git a/Mage.Sets/src/mage/cards/r/RagingBattleMouse.java b/Mage.Sets/src/mage/cards/r/RagingBattleMouse.java
index fbd10b2475b..76a043ed272 100644
--- a/Mage.Sets/src/mage/cards/r/RagingBattleMouse.java
+++ b/Mage.Sets/src/mage/cards/r/RagingBattleMouse.java
@@ -2,32 +2,33 @@ package mage.cards.r;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.CelebrationCondition;
+import mage.abilities.condition.common.YouCastExactOneSpellThisTurnCondition;
import mage.abilities.decorator.ConditionalCostModificationEffect;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
+import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.AbilityWord;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.watchers.common.PermanentsEnteredBattlefieldWatcher;
-import mage.abilities.condition.common.YouCastExactOneSpellThisTurnCondition;
import java.util.UUID;
/**
- *
* @author Susucr
*/
public final class RagingBattleMouse extends CardImpl {
public RagingBattleMouse(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
-
+
this.subtype.add(SubType.MOUSE);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
@@ -39,17 +40,11 @@ public final class RagingBattleMouse extends CardImpl {
)));
// Celebration -- At the beginning of combat on your turn, if two or more nonland permanents entered the battlefield under your control this turn, target creature you control gets +1/+1 until end of turn.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfCombatTriggeredAbility(
- new BoostTargetEffect(1, 1, Duration.EndOfTurn)
- ), CelebrationCondition.instance, "At the beginning of combat on your turn, "
- + "if two or more nonland permanents entered the battlefield under your control this turn, "
- + "target creature you control gets +1/+1 until end of turn."
- );
+ Ability ability = new BeginningOfCombatTriggeredAbility(
+ new BoostTargetEffect(1, 1, Duration.EndOfTurn)
+ ).withInterveningIf(CelebrationCondition.instance);
ability.addTarget(new TargetControlledCreaturePermanent());
- ability.setAbilityWord(AbilityWord.CELEBRATION);
- ability.addHint(CelebrationCondition.getHint());
- this.addAbility(ability, new PermanentsEnteredBattlefieldWatcher());
+ this.addAbility(ability.setAbilityWord(AbilityWord.CELEBRATION).addHint(CelebrationCondition.getHint()), new PermanentsEnteredBattlefieldWatcher());
}
private RagingBattleMouse(final RagingBattleMouse card) {
diff --git a/Mage.Sets/src/mage/cards/r/RaidersWake.java b/Mage.Sets/src/mage/cards/r/RaidersWake.java
index d69a9914f2b..0feb1e688ca 100644
--- a/Mage.Sets/src/mage/cards/r/RaidersWake.java
+++ b/Mage.Sets/src/mage/cards/r/RaidersWake.java
@@ -1,13 +1,12 @@
package mage.cards.r;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.DiscardsACardOpponentTriggeredAbility;
import mage.abilities.condition.common.RaidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.abilities.effects.common.discard.DiscardTargetEffect;
import mage.abilities.hint.common.RaidHint;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AbilityWord;
@@ -27,16 +26,15 @@ public final class RaidersWake extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}");
// Whenever an opponent discards a card, that player loses 2 life.
- this.addAbility(new DiscardsACardOpponentTriggeredAbility(new LoseLifeTargetEffect(2), false, SetTargetPointer.PLAYER));
+ this.addAbility(new DiscardsACardOpponentTriggeredAbility(
+ new LoseLifeTargetEffect(2), false, SetTargetPointer.PLAYER
+ ));
// Raid — At the beginning of your end step, if you attacked this turn, target opponent discards a card.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(new DiscardTargetEffect(1)), RaidCondition.instance,
- "At the beginning of your end step, if you attacked this turn, target opponent discards a card.");
+ Ability ability = new BeginningOfEndStepTriggeredAbility(new DiscardTargetEffect(1))
+ .withInterveningIf(RaidCondition.instance);
ability.addTarget(new TargetOpponent());
- ability.setAbilityWord(AbilityWord.RAID);
- ability.addHint(RaidHint.instance);
- this.addAbility(ability, new PlayerAttackedWatcher());
+ this.addAbility(ability.setAbilityWord(AbilityWord.RAID).addHint(RaidHint.instance), new PlayerAttackedWatcher());
}
private RaidersWake(final RaidersWake card) {
diff --git a/Mage.Sets/src/mage/cards/r/RalsStaticaster.java b/Mage.Sets/src/mage/cards/r/RalsStaticaster.java
index d05013c785b..4429d34a0dd 100644
--- a/Mage.Sets/src/mage/cards/r/RalsStaticaster.java
+++ b/Mage.Sets/src/mage/cards/r/RalsStaticaster.java
@@ -1,35 +1,30 @@
package mage.cards.r;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.CardsInControllerHandCount;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
-import mage.constants.SubType;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
-import mage.constants.TargetController;
-import mage.filter.FilterPermanent;
+import mage.constants.SubType;
+import mage.filter.common.FilterControlledPlaneswalkerPermanent;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class RalsStaticaster extends CardImpl {
- private static final FilterPermanent filter = new FilterPermanent("a Ral planeswalker");
-
- static {
- filter.add(TargetController.YOU.getControllerPredicate());
- filter.add(CardType.PLANESWALKER.getPredicate());
- filter.add(SubType.RAL.getPredicate());
- }
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterControlledPlaneswalkerPermanent(SubType.RAL, "you control a Ral planeswalker")
+ );
public RalsStaticaster(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{R}");
@@ -43,14 +38,9 @@ public final class RalsStaticaster extends CardImpl {
this.addAbility(TrampleAbility.getInstance());
// Whenever Ral's Staticaster attacks, if you control a Ral planeswalker, Ral's Staticaster gets +1/+0 for each card in your hand until end of turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new BoostSourceEffect(
- CardsInControllerHandCount.ANY, StaticValue.get(0),
- Duration.EndOfTurn), false),
- new PermanentsOnTheBattlefieldCondition(filter),
- "Whenever {this} attacks, if you control a Ral planeswalker, "
- + "{this} gets +1/+0 for each card in your hand until end of turn."
- ));
+ this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(
+ CardsInControllerHandCount.ANY, StaticValue.get(0), Duration.EndOfTurn
+ )).withInterveningIf(condition));
}
private RalsStaticaster(final RalsStaticaster card) {
diff --git a/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java b/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java
index 1eb28c1e9d6..1aafde868bd 100644
--- a/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java
+++ b/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java
@@ -6,7 +6,6 @@ import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.ChooseABackgroundAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.HaveInitiativeCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessControlledEffect;
@@ -42,11 +41,8 @@ public final class RasaadYnBashir extends CardImpl {
this.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessControlledEffect()));
// Whenever Rasaad yn Bashir attacks, if you have the initiative, double the toughness of each creature you control until end of turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new RasaadYnBashirEffect()),
- HaveInitiativeCondition.instance, "Whenever {this} attacks, if you have the initiative, " +
- "double the toughness of each creature you control until end of turn."
- ).addHint(InitiativeHint.instance));
+ this.addAbility(new AttacksTriggeredAbility(new RasaadYnBashirEffect())
+ .withInterveningIf(HaveInitiativeCondition.instance).addHint(InitiativeHint.instance));
// Choose a Background
this.addAbility(ChooseABackgroundAbility.getInstance());
@@ -66,6 +62,7 @@ class RasaadYnBashirEffect extends OneShotEffect {
RasaadYnBashirEffect() {
super(Outcome.Benefit);
+ staticText = "double the toughness of each creature you control until end of turn";
}
private RasaadYnBashirEffect(final RasaadYnBashirEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/r/RasputinDreamweaver.java b/Mage.Sets/src/mage/cards/r/RasputinDreamweaver.java
index ae03012f912..d499b452b17 100644
--- a/Mage.Sets/src/mage/cards/r/RasputinDreamweaver.java
+++ b/Mage.Sets/src/mage/cards/r/RasputinDreamweaver.java
@@ -1,23 +1,18 @@
-
package mage.cards.r;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
import mage.MageInt;
import mage.Mana;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.CantHaveMoreThanAmountCountersSourceAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.CountersSourceCount;
import mage.abilities.effects.common.PreventDamageToSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.mana.SimpleManaAbility;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@@ -28,6 +23,10 @@ import mage.game.Game;
import mage.game.events.GameEvent;
import mage.watchers.Watcher;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
/**
* @author emerald000
*/
@@ -43,23 +42,29 @@ public final class RasputinDreamweaver extends CardImpl {
this.toughness = new MageInt(1);
// Rasputin Dreamweaver enters the battlefield with seven dream counters on it.
- this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.DREAM.createInstance(7)), "with seven dream counters on it"));
+ this.addAbility(new EntersBattlefieldAbility(
+ new AddCountersSourceEffect(CounterType.DREAM.createInstance(7)),
+ "with seven dream counters on it"
+ ));
// Remove a dream counter from Rasputin: Add {C}.
- this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana(1),
+ this.addAbility(new SimpleManaAbility(
+ Zone.BATTLEFIELD, Mana.ColorlessMana(1),
new RemoveCountersSourceCost(CounterType.DREAM.createInstance()),
- new CountersSourceCount(CounterType.DREAM)));
+ new CountersSourceCount(CounterType.DREAM)
+ ));
// Remove a dream counter from Rasputin: Prevent the next 1 damage that would be dealt to Rasputin this turn.
- this.addAbility(new SimpleActivatedAbility(new PreventDamageToSourceEffect(Duration.EndOfTurn, 1), new RemoveCountersSourceCost(CounterType.DREAM.createInstance())));
+ this.addAbility(new SimpleActivatedAbility(
+ new PreventDamageToSourceEffect(Duration.EndOfTurn, 1),
+ new RemoveCountersSourceCost(CounterType.DREAM.createInstance())
+ ));
// At the beginning of your upkeep, if Rasputin started the turn untapped, put a dream counter on it.
- this.addAbility(
- new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.DREAM.createInstance())),
- RasputinDreamweaverStartedUntappedCondition.instance,
- "At the beginning of your upkeep, if {this} started the turn untapped, put a dream counter on it."),
- new RasputinDreamweaverStartedUntappedWatcher());
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(
+ new AddCountersSourceEffect(CounterType.DREAM.createInstance())
+ .setText("put a dream counter on it")
+ ).withInterveningIf(RasputinDreamweaverCondition.instance), new RasputinDreamweaverWatcher());
// Rasputin can't have more than seven dream counters on it.
this.addAbility(new CantHaveMoreThanAmountCountersSourceAbility(CounterType.DREAM, 7));
@@ -75,17 +80,12 @@ public final class RasputinDreamweaver extends CardImpl {
}
}
-enum RasputinDreamweaverStartedUntappedCondition implements Condition {
-
+enum RasputinDreamweaverCondition implements Condition {
instance;
@Override
public boolean apply(Game game, Ability source) {
- RasputinDreamweaverStartedUntappedWatcher watcher = game.getState().getWatcher(RasputinDreamweaverStartedUntappedWatcher.class);
- if (watcher != null) {
- return watcher.startedUntapped(source.getSourceId());
- }
- return false;
+ return game.getState().getWatcher(RasputinDreamweaverWatcher.class).startedUntapped(source.getSourceId());
}
@Override
@@ -94,9 +94,9 @@ enum RasputinDreamweaverStartedUntappedCondition implements Condition {
}
}
-class RasputinDreamweaverStartedUntappedWatcher extends Watcher {
+class RasputinDreamweaverWatcher extends Watcher {
- private static final FilterPermanent filter = new FilterPermanent("Untapped permanents");
+ private static final FilterPermanent filter = new FilterPermanent();
static {
filter.add(TappedPredicate.UNTAPPED);
@@ -104,7 +104,7 @@ class RasputinDreamweaverStartedUntappedWatcher extends Watcher {
private final Set startedUntapped = new HashSet<>(0);
- RasputinDreamweaverStartedUntappedWatcher() {
+ RasputinDreamweaverWatcher() {
super(WatcherScope.GAME);
}
diff --git a/Mage.Sets/src/mage/cards/r/RavenloftAdventurer.java b/Mage.Sets/src/mage/cards/r/RavenloftAdventurer.java
index 61630d1b877..089f9f62d12 100644
--- a/Mage.Sets/src/mage/cards/r/RavenloftAdventurer.java
+++ b/Mage.Sets/src/mage/cards/r/RavenloftAdventurer.java
@@ -6,7 +6,6 @@ import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.CompletedDungeonCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.TakeTheInitiativeEffect;
@@ -46,12 +45,9 @@ public final class RavenloftAdventurer extends CardImpl {
this.addAbility(new SimpleStaticAbility(new RavenloftAdventurerReplacementEffect()));
// Whenever Ravenloft Adventurer attacks, if you've completed a dungeon, defending player loses 1 life for each card they own in exile with a hit counter on it.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(
- new RavenloftAdventurerLifeEffect(), false, "", SetTargetPointer.PLAYER
- ), CompletedDungeonCondition.instance, "Whenever {this} attacks, if you've completed a dungeon, " +
- "defending player loses 1 life for each card they own in exile with a hit counter on it."
- ).addHint(CompletedDungeonCondition.getHint()), new CompletedDungeonWatcher());
+ this.addAbility(new AttacksTriggeredAbility(
+ new RavenloftAdventurerLifeEffect(), false, "", SetTargetPointer.PLAYER
+ ).withInterveningIf(CompletedDungeonCondition.instance).addHint(CompletedDungeonCondition.getHint()), new CompletedDungeonWatcher());
}
private RavenloftAdventurer(final RavenloftAdventurer card) {
@@ -108,6 +104,7 @@ class RavenloftAdventurerLifeEffect extends OneShotEffect {
RavenloftAdventurerLifeEffect() {
super(Outcome.Benefit);
+ staticText = "defending player loses 1 life for each card they own in exile with a hit counter on it";
}
private RavenloftAdventurerLifeEffect(final RavenloftAdventurerLifeEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/r/RayOfFrost.java b/Mage.Sets/src/mage/cards/r/RayOfFrost.java
index 1fc0da9b8cb..1f5773ee892 100644
--- a/Mage.Sets/src/mage/cards/r/RayOfFrost.java
+++ b/Mage.Sets/src/mage/cards/r/RayOfFrost.java
@@ -1,32 +1,44 @@
package mage.cards.r;
-import java.util.UUID;
-
+import mage.ObjectColor;
+import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
-import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.condition.common.AttachedToMatchesFilterCondition;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect;
import mage.abilities.effects.common.TapEnchantedEffect;
-import mage.constants.*;
-import mage.abilities.keyword.FlashAbility;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.target.common.TargetCreaturePermanent;
-import mage.abilities.Ability;
-import mage.abilities.effects.common.AttachEffect;
-import mage.target.TargetPermanent;
+import mage.abilities.effects.common.continuous.LoseAllAbilitiesAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
+import mage.abilities.keyword.FlashAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
+import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
/**
- *
* @author weirddan455
*/
public final class RayOfFrost extends CardImpl {
+ private static final FilterPermanent filter = new FilterPermanent("enchanted creature is red");
+
+ static {
+ filter.add(new ColorPredicate(ObjectColor.RED));
+ }
+
+ private static final Condition condition = new AttachedToMatchesFilterCondition(filter);
+
public RayOfFrost(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}");
@@ -43,14 +55,15 @@ public final class RayOfFrost extends CardImpl {
this.addAbility(ability);
// When Ray of Frost enters the battlefield, if enchanted creature is red, tap it.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect()),
- RayOfFrostCondition.instance,
- "When {this} enters, if enchanted creature is red, tap it."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new TapEnchantedEffect().setText("tap it")
+ ).withInterveningIf(condition));
// As long as enchanted creature is red, it loses all abilities.
- this.addAbility(new SimpleStaticAbility(new RayOfFrostLoseAbilitiesEffect()));
+ this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
+ new LoseAllAbilitiesAttachedEffect(AttachmentType.AURA), condition,
+ "as long as enchanted creature is red, it loses all abilities"
+ )));
// Enchanted creature doesn't untap during its controller's untap step.
this.addAbility(new SimpleStaticAbility(new DontUntapInControllersUntapStepEnchantedEffect()));
@@ -65,52 +78,3 @@ public final class RayOfFrost extends CardImpl {
return new RayOfFrost(this);
}
}
-
-enum RayOfFrostCondition implements Condition {
- instance;
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent enchantment = source.getSourcePermanentIfItStillExists(game);
- if (enchantment == null) {
- return false;
- }
- Permanent creature = game.getPermanent(enchantment.getAttachedTo());
- return creature != null && creature.getColor(game).isRed();
- }
-
- @Override
- public String toString() {
- return "if enchanted creature is red";
- }
-}
-
-class RayOfFrostLoseAbilitiesEffect extends ContinuousEffectImpl {
-
- RayOfFrostLoseAbilitiesEffect() {
- super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.LoseAbility);
- this.staticText = "As long as enchanted creature is red, it loses all abilities";
- }
-
- private RayOfFrostLoseAbilitiesEffect(final RayOfFrostLoseAbilitiesEffect effect) {
- super(effect);
- }
-
- @Override
- public RayOfFrostLoseAbilitiesEffect copy() {
- return new RayOfFrostLoseAbilitiesEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent enchantment = source.getSourcePermanentIfItStillExists(game);
- if (enchantment != null) {
- Permanent creature = game.getPermanent(enchantment.getAttachedTo());
- if (creature != null && creature.getColor(game).isRed()) {
- creature.removeAllAbilities(source.getSourceId(), game);
- return true;
- }
- }
- return false;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/r/RazorPendulum.java b/Mage.Sets/src/mage/cards/r/RazorPendulum.java
index 238040897a7..573dd36b191 100644
--- a/Mage.Sets/src/mage/cards/r/RazorPendulum.java
+++ b/Mage.Sets/src/mage/cards/r/RazorPendulum.java
@@ -1,17 +1,14 @@
package mage.cards.r;
-import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.condition.common.LifeCompareCondition;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.Outcome;
+import mage.constants.ComparisonType;
import mage.constants.TargetController;
-import mage.game.Game;
-import mage.players.Player;
import java.util.UUID;
@@ -20,17 +17,17 @@ import java.util.UUID;
*/
public final class RazorPendulum extends CardImpl {
+ private static final Condition condition = new LifeCompareCondition(TargetController.ACTIVE, ComparisonType.OR_LESS, 5);
+
public RazorPendulum(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
-
// At the beginning of each player’s end step, if that player has 5 or less life, Razor Pendulum deals 2 damage to that player.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- TargetController.ANY, new RazorPendulumEffect(), false
- ), RazorPendulumCondition.instance, "At the beginning of each player's end step, " +
- "if that player has 5 or less life, {this} deals 2 damage to that player."
- ));
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ TargetController.ANY,
+ new DamageTargetEffect(2, true, "that player"),
+ false, condition
+ ).withTargetPointerSet(true));
}
private RazorPendulum(final RazorPendulum card) {
@@ -42,41 +39,3 @@ public final class RazorPendulum extends CardImpl {
return new RazorPendulum(this);
}
}
-
-class RazorPendulumEffect extends OneShotEffect {
-
- RazorPendulumEffect() {
- super(Outcome.Benefit);
- }
-
- private RazorPendulumEffect(final RazorPendulumEffect effect) {
- super(effect);
- }
-
- @Override
- public RazorPendulumEffect copy() {
- return new RazorPendulumEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(game.getActivePlayerId());
- if (player == null) {
- return false;
- }
- return player.damage(2, source.getSourceId(), source, game) > 0;
- }
-}
-
-enum RazorPendulumCondition implements Condition {
- instance;
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(game.getActivePlayerId());
- if (player == null) {
- return false;
- }
- return player.getLife() < 6;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/r/RealmScorcherHellkite.java b/Mage.Sets/src/mage/cards/r/RealmScorcherHellkite.java
index 979122cd0b7..c50c2dca1cd 100644
--- a/Mage.Sets/src/mage/cards/r/RealmScorcherHellkite.java
+++ b/Mage.Sets/src/mage/cards/r/RealmScorcherHellkite.java
@@ -6,7 +6,6 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.common.BargainedCondition;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.mana.AddManaInAnyCombinationEffect;
import mage.abilities.keyword.BargainAbility;
@@ -42,11 +41,8 @@ public final class RealmScorcherHellkite extends CardImpl {
this.addAbility(HasteAbility.getInstance());
// When Realm-Scorcher Hellkite enters the battlefield, if it was bargained, add four mana in any combination of colors.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new AddManaInAnyCombinationEffect(4)),
- BargainedCondition.instance,
- "When {this} enters, if it was bargained, add four mana in any combination of colors."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new AddManaInAnyCombinationEffect(4))
+ .withInterveningIf(BargainedCondition.instance));
// {1}{R}: Realm-Scorcher Hellkite deals 1 damage to any target.
Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(1), new ManaCostsImpl<>("{1}{R}"));
diff --git a/Mage.Sets/src/mage/cards/r/ReaperOfNight.java b/Mage.Sets/src/mage/cards/r/ReaperOfNight.java
index c65a5f356a9..b36da00f5c6 100644
--- a/Mage.Sets/src/mage/cards/r/ReaperOfNight.java
+++ b/Mage.Sets/src/mage/cards/r/ReaperOfNight.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.effects.common.discard.DiscardTargetEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -32,12 +31,9 @@ public final class ReaperOfNight extends AdventureCard {
this.toughness = new MageInt(5);
// Whenever Reaper of Night attacks, if defending player has two or fewer cards in hand, it gains flying until end of turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new GainAbilitySourceEffect(
- FlyingAbility.getInstance(), Duration.EndOfTurn
- ), false), ReaperOfNightCondition.instance, "Whenever {this} attacks, " +
- "if defending player has two or fewer cards in hand, it gains flying until end of turn."
- ));
+ this.addAbility(new AttacksTriggeredAbility(new GainAbilitySourceEffect(
+ FlyingAbility.getInstance(), Duration.EndOfTurn
+ ).setText("it gains flying until end of turn")).withInterveningIf(ReaperOfNightCondition.instance));
// Harvest Fear
// Target opponent discards two cards.
@@ -65,4 +61,9 @@ enum ReaperOfNightCondition implements Condition {
Player player = game.getPlayer(game.getCombat().getDefendingPlayerId(source.getSourceId(), game));
return player != null && player.getHand().size() <= 2;
}
-}
\ No newline at end of file
+
+ @Override
+ public String toString() {
+ return "defending player has two or fewer cards in hand";
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/r/RecklessBushwhacker.java b/Mage.Sets/src/mage/cards/r/RecklessBushwhacker.java
index c6686dbc3bf..f4d123f0f37 100644
--- a/Mage.Sets/src/mage/cards/r/RecklessBushwhacker.java
+++ b/Mage.Sets/src/mage/cards/r/RecklessBushwhacker.java
@@ -1,10 +1,9 @@
package mage.cards.r;
-import java.util.UUID;
import mage.MageInt;
+import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.SurgedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.HasteAbility;
@@ -12,18 +11,19 @@ import mage.abilities.keyword.SurgeAbility;
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.filter.StaticFilters;
+import java.util.UUID;
+
/**
- *
* @author fireshoes
*/
public final class RecklessBushwhacker extends CardImpl {
public RecklessBushwhacker(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.GOBLIN);
this.subtype.add(SubType.WARRIOR);
this.subtype.add(SubType.ALLY);
@@ -37,11 +37,14 @@ public final class RecklessBushwhacker extends CardImpl {
this.addAbility(HasteAbility.getInstance());
// When Reckless Bushwhacker enters the battlefield, if its surge cost was paid, other creatures you control get +1/+0 and gain haste until end of turn.
- EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new BoostControlledEffect(1, 0, Duration.EndOfTurn, true), false);
- ability.addEffect(new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_OTHER_CONTROLLED_CREATURES, true));
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, SurgedCondition.instance,
- "When {this} enters, if its surge cost was paid, other creatures you control get +1/+0 and gain haste until end of turn."));
-
+ Ability ability = new EntersBattlefieldTriggeredAbility(new BoostControlledEffect(
+ 1, 0, Duration.EndOfTurn, true
+ ).setText("other creatures you control get +1/+0")).withInterveningIf(SurgedCondition.instance);
+ ability.addEffect(new GainAbilityControlledEffect(
+ HasteAbility.getInstance(), Duration.EndOfTurn,
+ StaticFilters.FILTER_PERMANENT_CREATURE, true
+ ).setText("and gain haste until end of turn"));
+ this.addAbility(ability);
}
private RecklessBushwhacker(final RecklessBushwhacker card) {
diff --git a/Mage.Sets/src/mage/cards/r/ReclusiveWight.java b/Mage.Sets/src/mage/cards/r/ReclusiveWight.java
index 13a130eaf55..00fad2016ee 100644
--- a/Mage.Sets/src/mage/cards/r/ReclusiveWight.java
+++ b/Mage.Sets/src/mage/cards/r/ReclusiveWight.java
@@ -1,33 +1,36 @@
package mage.cards.r;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.SacrificeSourceEffect;
-import mage.constants.SubType;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AnotherPredicate;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class ReclusiveWight extends CardImpl {
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("another nonland permanent");
+ private static final FilterPermanent filter = new FilterControlledPermanent("you control another nonland permanent");
static {
filter.add(Predicates.not(CardType.LAND.getPredicate()));
filter.add(AnotherPredicate.instance);
}
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter);
+
public ReclusiveWight(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
@@ -37,11 +40,7 @@ public final class ReclusiveWight extends CardImpl {
this.toughness = new MageInt(4);
// At the beginning of your upkeep, if you control another nonland permanent, sacrifice Reclusive Wight.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceEffect()),
- new PermanentsOnTheBattlefieldCondition(filter),
- "At the beginning of your upkeep, if you control another nonland permanent, sacrifice {this}."
- ));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceEffect()).withInterveningIf(condition));
}
private ReclusiveWight(final ReclusiveWight card) {
diff --git a/Mage.Sets/src/mage/cards/r/RedemptionChoir.java b/Mage.Sets/src/mage/cards/r/RedemptionChoir.java
index 1c3a7ff67b6..84dbd00739b 100644
--- a/Mage.Sets/src/mage/cards/r/RedemptionChoir.java
+++ b/Mage.Sets/src/mage/cards/r/RedemptionChoir.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
import mage.abilities.condition.common.CovenCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.hint.common.CovenHint;
import mage.abilities.keyword.LifelinkAbility;
@@ -25,14 +24,16 @@ import java.util.UUID;
*/
public final class RedemptionChoir extends CardImpl {
- private static final FilterPermanentCard filter = new FilterPermanentCard("permanent card with mana value 3 or less from your graveyard");
+ private static final FilterPermanentCard filter
+ = new FilterPermanentCard("permanent card with mana value 3 or less from your graveyard");
+
static {
filter.add(new ManaValuePredicate(ComparisonType.OR_LESS, 3));
}
public RedemptionChoir(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}");
-
+
this.subtype.add(SubType.VAMPIRE);
this.subtype.add(SubType.CLERIC);
this.power = new MageInt(3);
@@ -42,13 +43,9 @@ public final class RedemptionChoir extends CardImpl {
this.addAbility(LifelinkAbility.getInstance());
// Coven -- Whenever Redemption Choir enters the battlefield or attacks, if you control three or more creatures with different powers, return target permanent card with mana value 3 or less from your graveyard to the battlefield.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldOrAttacksSourceTriggeredAbility(
- new ReturnFromGraveyardToBattlefieldTargetEffect()
- ), CovenCondition.instance, "Whenever {this} enters or attacks, " +
- "if you control three or more creatures with different powers, " +
- "return target permanent card with mana value 3 or less from your graveyard to the battlefield."
- );
+ Ability ability = new EntersBattlefieldOrAttacksSourceTriggeredAbility(
+ new ReturnFromGraveyardToBattlefieldTargetEffect()
+ ).withInterveningIf(CovenCondition.instance);
ability.addTarget(new TargetCardInYourGraveyard(filter));
this.addAbility(ability.addHint(CovenHint.instance).setAbilityWord(AbilityWord.COVEN));
diff --git a/Mage.Sets/src/mage/cards/r/RegalBloodlord.java b/Mage.Sets/src/mage/cards/r/RegalBloodlord.java
index e739b254bfc..6c9483820d7 100644
--- a/Mage.Sets/src/mage/cards/r/RegalBloodlord.java
+++ b/Mage.Sets/src/mage/cards/r/RegalBloodlord.java
@@ -1,12 +1,12 @@
package mage.cards.r;
import mage.MageInt;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.YouGainedLifeCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.ControllerGainedLifeCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -22,6 +22,8 @@ import java.util.UUID;
*/
public final class RegalBloodlord extends CardImpl {
+ private static final Condition condition = new YouGainedLifeCondition();
+
public RegalBloodlord(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{B}");
@@ -34,15 +36,8 @@ public final class RegalBloodlord extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// At the beginning of each end step, if you gained life this turn, create a 1/1 black Bat creature token with flying.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- TargetController.ANY, new CreateTokenEffect(new BatToken()),
- false
- ),
- new YouGainedLifeCondition(),
- "At the beginning of each end step, "
- + "if you gained life this turn, "
- + "create a 1/1 black Bat creature token with flying."
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ TargetController.ANY, new CreateTokenEffect(new BatToken()), false, condition
).addHint(ControllerGainedLifeCount.getHint()), new PlayerGainedLifeWatcher());
}
diff --git a/Mage.Sets/src/mage/cards/r/RegnaTheRedeemer.java b/Mage.Sets/src/mage/cards/r/RegnaTheRedeemer.java
index 794e2187e35..86327b0b9af 100644
--- a/Mage.Sets/src/mage/cards/r/RegnaTheRedeemer.java
+++ b/Mage.Sets/src/mage/cards/r/RegnaTheRedeemer.java
@@ -1,29 +1,25 @@
-
package mage.cards.r;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
-import mage.abilities.condition.IntCompareCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.effects.common.CreateTokenEffect;
-import mage.constants.SubType;
-import mage.constants.SuperType;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.PartnerWithAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.ComparisonType;
+import mage.constants.SubType;
+import mage.constants.SuperType;
import mage.constants.TargetController;
import mage.game.Game;
import mage.game.permanent.token.WarriorToken;
-import mage.players.Player;
import mage.watchers.common.PlayerGainedLifeWatcher;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class RegnaTheRedeemer extends CardImpl {
@@ -43,15 +39,9 @@ public final class RegnaTheRedeemer extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// At the beginning of each end step, if your team gained life this turn, create two 1/1 white Warrior creature tokens.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- TargetController.ANY, new CreateTokenEffect(new WarriorToken(), 2),
- false
- ),
- new RegnaTheRedeemerCondition(),
- "At the beginning of each end step, "
- + "if your team gained life this turn, "
- + "create two 1/1 white Warrior creature tokens"
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ TargetController.ANY, new CreateTokenEffect(new WarriorToken(), 2),
+ false, RegnaTheRedeemerCondition.instance
), new PlayerGainedLifeWatcher());
}
@@ -65,27 +55,20 @@ public final class RegnaTheRedeemer extends CardImpl {
}
}
-class RegnaTheRedeemerCondition extends IntCompareCondition {
+enum RegnaTheRedeemerCondition implements Condition {
+ instance;
- public RegnaTheRedeemerCondition() {
- super(ComparisonType.MORE_THAN, 0);
+ @Override
+ public boolean apply(Game game, Ability source) {
+ // TODO: if teammates are ever implemented this will need to be refactored
+ return game
+ .getState()
+ .getWatcher(PlayerGainedLifeWatcher.class)
+ .getLifeGained(source.getControllerId()) > 0;
}
@Override
- protected int getInputValue(Game game, Ability source) {
- int gainedLife = 0;
- PlayerGainedLifeWatcher watcher = game.getState().getWatcher(PlayerGainedLifeWatcher.class);
- if (watcher != null) {
- for (UUID playerId : game.getPlayerList()) {
- Player player = game.getPlayer(playerId);
- if (player != null && !player.hasOpponent(source.getControllerId(), game)) {
- gainedLife = watcher.getLifeGained(playerId);
- if (gainedLife > 0) {
- break;
- }
- }
- }
- }
- return gainedLife;
+ public String toString() {
+ return "your team gained life this turn";
}
}
diff --git a/Mage.Sets/src/mage/cards/r/ReiverDemon.java b/Mage.Sets/src/mage/cards/r/ReiverDemon.java
index 8f5b71c3f74..7dc7132c13d 100644
--- a/Mage.Sets/src/mage/cards/r/ReiverDemon.java
+++ b/Mage.Sets/src/mage/cards/r/ReiverDemon.java
@@ -1,12 +1,9 @@
-
package mage.cards.r;
-import java.util.UUID;
import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.CastFromHandSourcePermanentCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DestroyAllEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
@@ -18,8 +15,9 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ColorPredicate;
import mage.watchers.common.CastFromHandWatcher;
+import java.util.UUID;
+
/**
- *
* @author daagar
*/
public final class ReiverDemon extends CardImpl {
@@ -32,7 +30,7 @@ public final class ReiverDemon extends CardImpl {
}
public ReiverDemon(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{B}{B}{B}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}{B}{B}{B}");
this.subtype.add(SubType.DEMON);
this.power = new MageInt(6);
this.toughness = new MageInt(6);
@@ -41,11 +39,8 @@ public final class ReiverDemon extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// When Reiver Demon enters the battlefield, if you cast it from your hand, destroy all nonartifact, nonblack creatures. They can't be regenerated.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new DestroyAllEffect(filter, true), false),
- CastFromHandSourcePermanentCondition.instance,
- "When {this} enters, if you cast it from your hand, destroy all nonartifact, nonblack creatures. They can't be regenerated."),
- new CastFromHandWatcher());
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DestroyAllEffect(filter, true))
+ .withInterveningIf(CastFromHandSourcePermanentCondition.instance), new CastFromHandWatcher());
}
private ReiverDemon(final ReiverDemon card) {
diff --git a/Mage.Sets/src/mage/cards/r/RekindledFlame.java b/Mage.Sets/src/mage/cards/r/RekindledFlame.java
index 92115531b71..daaf37c3f6a 100644
--- a/Mage.Sets/src/mage/cards/r/RekindledFlame.java
+++ b/Mage.Sets/src/mage/cards/r/RekindledFlame.java
@@ -1,12 +1,11 @@
package mage.cards.r;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.condition.common.OpponentHasNoCardsInHandCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect;
import mage.abilities.hint.ConditionHint;
import mage.abilities.hint.Hint;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -22,7 +21,7 @@ import java.util.UUID;
public final class RekindledFlame extends CardImpl {
private static final Hint hint = new ConditionHint(
- OpponentHasNoCardsInHandCondition.instance, "Opponent has no cards in hand"
+ OpponentHasNoCardsInHandCondition.instance, "An opponent has no cards in hand"
);
public RekindledFlame(UUID ownerId, CardSetInfo setInfo) {
@@ -33,13 +32,9 @@ public final class RekindledFlame extends CardImpl {
this.getSpellAbility().addTarget(new TargetAnyTarget());
// At the beginning of your upkeep, if an opponent has no cards in hand, you may return Rekindled Flame from your graveyard to your hand.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(
- Zone.GRAVEYARD, TargetController.YOU, new ReturnSourceFromGraveyardToHandEffect(),
- true
- ), OpponentHasNoCardsInHandCondition.instance, "At the beginning of your upkeep, " +
- "if an opponent has no cards in hand, you may return {this} from your graveyard to your hand."
- ).addHint(hint));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(
+ Zone.GRAVEYARD, TargetController.YOU, new ReturnSourceFromGraveyardToHandEffect(), true
+ ).withInterveningIf(OpponentHasNoCardsInHandCondition.instance).addHint(hint));
}
private RekindledFlame(final RekindledFlame card) {
diff --git a/Mage.Sets/src/mage/cards/r/ReservoirKraken.java b/Mage.Sets/src/mage/cards/r/ReservoirKraken.java
index 33a36860b35..01aac060b12 100644
--- a/Mage.Sets/src/mage/cards/r/ReservoirKraken.java
+++ b/Mage.Sets/src/mage/cards/r/ReservoirKraken.java
@@ -1,20 +1,18 @@
package mage.cards.r;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.condition.common.SourceTappedCondition;
import mage.abilities.costs.mana.GenericManaCost;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
-import mage.constants.Outcome;
-import mage.constants.SubType;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.keyword.WardAbility;
+import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.constants.TargetController;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.permanent.TappedPredicate;
@@ -24,8 +22,9 @@ import mage.game.permanent.token.FishToken;
import mage.players.Player;
import mage.target.common.TargetControlledCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author weirddan455
*/
public final class ReservoirKraken extends CardImpl {
@@ -44,11 +43,9 @@ public final class ReservoirKraken extends CardImpl {
this.addAbility(new WardAbility(new GenericManaCost(2), false));
// At the beginning of each combat, if Reservoir Kraken is untapped, any opponent may tap an untapped creature they control. If they do, tap Reservoir Kraken and create a 1/1 blue Fish creature token with "This creature can't be blocked."
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfCombatTriggeredAbility(TargetController.ANY, new ReservoirKrakenEffect(), false),
- SourceTappedCondition.UNTAPPED,
- "At the beginning of each combat, if {this} is untapped, any opponent may tap an untapped creature they control. If they do, tap {this} and create a 1/1 blue Fish creature token with \"This creature can't be blocked.\""
- ));
+ this.addAbility(new BeginningOfCombatTriggeredAbility(
+ TargetController.ANY, new ReservoirKrakenEffect(), false
+ ).withInterveningIf(SourceTappedCondition.UNTAPPED));
}
private ReservoirKraken(final ReservoirKraken card) {
diff --git a/Mage.Sets/src/mage/cards/r/ResistanceSquad.java b/Mage.Sets/src/mage/cards/r/ResistanceSquad.java
index 2ea52a106b3..fe29afaf179 100644
--- a/Mage.Sets/src/mage/cards/r/ResistanceSquad.java
+++ b/Mage.Sets/src/mage/cards/r/ResistanceSquad.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.hint.ConditionHint;
import mage.abilities.hint.Hint;
@@ -23,14 +22,14 @@ import java.util.UUID;
*/
public final class ResistanceSquad extends CardImpl {
- private static final FilterPermanent filter = new FilterControlledPermanent(SubType.HUMAN);
+ private static final FilterPermanent filter = new FilterControlledPermanent(SubType.HUMAN, "you control another Human");
static {
filter.add(AnotherPredicate.instance);
}
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter);
- private static final Hint hint = new ConditionHint(condition, "You control another Human");
+ private static final Hint hint = new ConditionHint(condition);
public ResistanceSquad(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
@@ -41,11 +40,8 @@ public final class ResistanceSquad extends CardImpl {
this.toughness = new MageInt(2);
// When Resistance Squad enters the battlefield, if you control another Human, draw a card.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(new EntersBattlefieldTriggeredAbility(
- new DrawCardSourceControllerEffect(1)),
- condition, "When {this} enters, " +
- "if you control another Human, draw a card."
- ).addHint(hint));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))
+ .withInterveningIf(condition).addHint(hint));
}
private ResistanceSquad(final ResistanceSquad card) {
diff --git a/Mage.Sets/src/mage/cards/r/ResplendentGriffin.java b/Mage.Sets/src/mage/cards/r/ResplendentGriffin.java
index d4a3045b668..2d70a3a082f 100644
--- a/Mage.Sets/src/mage/cards/r/ResplendentGriffin.java
+++ b/Mage.Sets/src/mage/cards/r/ResplendentGriffin.java
@@ -3,7 +3,6 @@ package mage.cards.r;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.condition.common.CitysBlessingCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.hint.common.CitysBlessingHint;
import mage.abilities.keyword.AscendAbility;
@@ -35,10 +34,10 @@ public final class ResplendentGriffin extends CardImpl {
this.addAbility(new AscendAbility());
// Whenever Resplendent Griffin attacks, if you have the city's blessing, put a +1/+1 counter on it.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(new AttacksTriggeredAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false), CitysBlessingCondition.instance,
- "Whenever {this} attacks, if you have the city's blessing, put a +1/+1 counter on it.")
- .addHint(CitysBlessingHint.instance));
+ this.addAbility(new AttacksTriggeredAbility(
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance())
+ .setText("put a +1/+1 counter on it")
+ ).withInterveningIf(CitysBlessingCondition.instance).addHint(CitysBlessingHint.instance));
}
private ResplendentGriffin(final ResplendentGriffin card) {
diff --git a/Mage.Sets/src/mage/cards/r/RetrieverPhoenix.java b/Mage.Sets/src/mage/cards/r/RetrieverPhoenix.java
index 61219940ad9..4cb29f93091 100644
--- a/Mage.Sets/src/mage/cards/r/RetrieverPhoenix.java
+++ b/Mage.Sets/src/mage/cards/r/RetrieverPhoenix.java
@@ -41,10 +41,8 @@ public final class RetrieverPhoenix extends CardImpl {
this.addAbility(HasteAbility.getInstance());
// When Retriever Phoenix enters the battlefield, if you cast it, learn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new LearnEffect()), CastFromEverywhereSourceCondition.instance,
- "When {this} enters, if you cast it, " + LearnEffect.getDefaultText()
- ).addHint(OpenSideboardHint.instance));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new LearnEffect())
+ .withInterveningIf( CastFromEverywhereSourceCondition.instance).addHint(OpenSideboardHint.instance));
// As long as Retriever Phoenix is in your graveyard, if you would learn, you may instead return Retriever Phoenix to the battlefield.
this.addAbility(new SimpleStaticAbility(Zone.GRAVEYARD, new RetrieverPhoenixEffect()));
diff --git a/Mage.Sets/src/mage/cards/r/RevelInRiches.java b/Mage.Sets/src/mage/cards/r/RevelInRiches.java
index 4a98b043e30..34bebbde4e5 100644
--- a/Mage.Sets/src/mage/cards/r/RevelInRiches.java
+++ b/Mage.Sets/src/mage/cards/r/RevelInRiches.java
@@ -1,14 +1,14 @@
package mage.cards.r;
-import mage.abilities.TriggeredAbility;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.DiesCreatureTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.WinGameSourceControllerEffect;
+import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -26,24 +26,22 @@ import java.util.UUID;
*/
public final class RevelInRiches extends CardImpl {
- private static final FilterPermanent filter = new FilterControlledPermanent("Treasures");
-
- static {
- filter.add(SubType.TREASURE.getPredicate());
- }
+ private static final FilterPermanent filter = new FilterControlledPermanent(SubType.TREASURE, "you control ten or more Treasures");
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 9);
+ private static final Hint hint = new ValueHint("Treasures you control", new PermanentsOnBattlefieldCount(filter));
public RevelInRiches(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{B}");
// Whenever a creature an opponent controls dies, create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color."
- this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new TreasureToken()), false, StaticFilters.FILTER_OPPONENTS_PERMANENT_A_CREATURE));
+ this.addAbility(new DiesCreatureTriggeredAbility(
+ new CreateTokenEffect(new TreasureToken()), false,
+ StaticFilters.FILTER_OPPONENTS_PERMANENT_A_CREATURE
+ ));
+
// At the beginning of your upkeep, if you control ten or more Treasures, you win the game.
- TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- ability,
- new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 9),
- "At the beginning of your upkeep, if you control ten or more Treasures, you win the game.")
- .addHint(new ValueHint("Treasures you control", new PermanentsOnBattlefieldCount(filter))));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect())
+ .withInterveningIf(condition).addHint(hint));
}
private RevelInRiches(final RevelInRiches card) {
diff --git a/Mage.Sets/src/mage/cards/r/RevenantPatriarch.java b/Mage.Sets/src/mage/cards/r/RevenantPatriarch.java
index c2da5059104..93ae00b6cb0 100644
--- a/Mage.Sets/src/mage/cards/r/RevenantPatriarch.java
+++ b/Mage.Sets/src/mage/cards/r/RevenantPatriarch.java
@@ -1,27 +1,25 @@
package mage.cards.r;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.CantBlockAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.ManaWasSpentCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.SkipCombatStepEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.ColoredManaSymbol;
import mage.constants.Duration;
+import mage.constants.SubType;
import mage.target.TargetPlayer;
+import java.util.UUID;
+
/**
- *
* @author ilcartographer
*/
public final class RevenantPatriarch extends CardImpl {
-
+
public RevenantPatriarch(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}");
this.subtype.add(SubType.SPIRIT);
@@ -29,18 +27,21 @@ public final class RevenantPatriarch extends CardImpl {
this.toughness = new MageInt(3);
// When Revenant Patriarch enters the battlefield, if {W} was spent to cast it, target player skips their next combat phase.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new SkipCombatStepEffect(Duration.OneUse).setText("target player skips their next combat phase."), false);
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new SkipCombatStepEffect(Duration.OneUse)
+ .setText("target player skips their next combat phase.")
+ ).withInterveningIf(ManaWasSpentCondition.WHITE);
ability.addTarget(new TargetPlayer());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, ManaWasSpentCondition.WHITE,
- "When {this} enters, if {W} was spent to cast it, target player skips their next combat phase."));
+ this.addAbility(ability);
+
// Revenant Patriarch can't block.
this.addAbility(new CantBlockAbility());
}
-
+
private RevenantPatriarch(final RevenantPatriarch card) {
super(card);
}
-
+
@Override
public RevenantPatriarch copy() {
return new RevenantPatriarch(this);
diff --git a/Mage.Sets/src/mage/cards/r/RhoxMeditant.java b/Mage.Sets/src/mage/cards/r/RhoxMeditant.java
index 53565f142e9..81b367df20d 100644
--- a/Mage.Sets/src/mage/cards/r/RhoxMeditant.java
+++ b/Mage.Sets/src/mage/cards/r/RhoxMeditant.java
@@ -1,13 +1,10 @@
-
package mage.cards.r;
-import java.util.UUID;
import mage.MageInt;
import mage.ObjectColor;
-import mage.abilities.TriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -16,22 +13,23 @@ import mage.constants.SubType;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.ColorPredicate;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class RhoxMeditant extends CardImpl {
-
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("green permanent");
-
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control a green permanent");
+
static {
filter.add(new ColorPredicate(ObjectColor.GREEN));
}
-
- private static final String rule = "When {this} enters, if you control a green permanent, draw a card.";
+
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter);
public RhoxMeditant(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
this.subtype.add(SubType.RHINO);
this.subtype.add(SubType.MONK);
@@ -39,9 +37,7 @@ public final class RhoxMeditant extends CardImpl {
this.toughness = new MageInt(4);
// When Rhox Meditant enters the battlefield, if you control a green permanent, draw a card.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false);
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new PermanentsOnTheBattlefieldCondition(filter), rule));
-
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)).withInterveningIf(condition));
}
private RhoxMeditant(final RhoxMeditant card) {
diff --git a/Mage.Sets/src/mage/cards/r/RictusRobber.java b/Mage.Sets/src/mage/cards/r/RictusRobber.java
index caedfac1ebf..b3eca840cf5 100644
--- a/Mage.Sets/src/mage/cards/r/RictusRobber.java
+++ b/Mage.Sets/src/mage/cards/r/RictusRobber.java
@@ -3,7 +3,6 @@ package mage.cards.r;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.MorbidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.hint.common.MorbidHint;
import mage.abilities.keyword.PlotAbility;
@@ -29,11 +28,8 @@ public final class RictusRobber extends CardImpl {
this.toughness = new MageInt(3);
// When Rictus Robber enters the battlefield, if a creature died this turn, create a 2/2 blue and black Zombie Rogue creature token.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieRogueToken())),
- MorbidCondition.instance,
- "When {this} enters, if a creature died this turn, create a 2/2 blue and black Zombie Rogue creature token."
- ).addHint(MorbidHint.instance));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieRogueToken()))
+ .withInterveningIf(MorbidCondition.instance).addHint(MorbidHint.instance));
// Plot {2}{B}
this.addAbility(new PlotAbility("{2}{B}"));
diff --git a/Mage.Sets/src/mage/cards/r/RitualGuardian.java b/Mage.Sets/src/mage/cards/r/RitualGuardian.java
index 4b0e08f5126..df4d4403494 100644
--- a/Mage.Sets/src/mage/cards/r/RitualGuardian.java
+++ b/Mage.Sets/src/mage/cards/r/RitualGuardian.java
@@ -1,15 +1,17 @@
package mage.cards.r;
import mage.MageInt;
-import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.condition.common.CovenCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.hint.common.CovenHint;
import mage.abilities.keyword.LifelinkAbility;
+import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.AbilityWord;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
import java.util.UUID;
@@ -27,14 +29,9 @@ public final class RitualGuardian extends CardImpl {
this.toughness = new MageInt(2);
// Coven — At the beginning of combat on your turn, if you control three or more creatures with different powers, Ritual Guardian gains lifelink until end of turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfCombatTriggeredAbility(
- new GainAbilitySourceEffect(
- LifelinkAbility.getInstance(), Duration.EndOfTurn
- )
- ), CovenCondition.instance, "At the beginning of combat on your turn, if you control three " +
- "or more creatures with different powers, {this} gains lifelink until end of turn."
- ).addHint(CovenHint.instance).setAbilityWord(AbilityWord.COVEN));
+ this.addAbility(new BeginningOfCombatTriggeredAbility(new GainAbilitySourceEffect(
+ LifelinkAbility.getInstance(), Duration.EndOfTurn
+ )).withInterveningIf(CovenCondition.instance).addHint(CovenHint.instance).setAbilityWord(AbilityWord.COVEN));
}
private RitualGuardian(final RitualGuardian card) {
diff --git a/Mage.Sets/src/mage/cards/r/RobberOfTheRich.java b/Mage.Sets/src/mage/cards/r/RobberOfTheRich.java
index 2ab326cebe2..d25678a8721 100644
--- a/Mage.Sets/src/mage/cards/r/RobberOfTheRich.java
+++ b/Mage.Sets/src/mage/cards/r/RobberOfTheRich.java
@@ -4,9 +4,12 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.decorator.ConditionalAsThoughEffect;
import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect;
+import mage.abilities.effects.common.asthought.YouMaySpendManaAsAnyColorToCastTargetEffect;
import mage.abilities.hint.ConditionHint;
+import mage.abilities.hint.Hint;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.ReachAbility;
import mage.cards.Card;
@@ -15,20 +18,20 @@ import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.game.Game;
import mage.players.Player;
+import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;
import mage.watchers.common.AttackedThisTurnWatcher;
+
import java.util.Objects;
import java.util.UUID;
-import mage.abilities.decorator.ConditionalAsThoughEffect;
-import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect;
-import mage.abilities.effects.common.asthought.YouMaySpendManaAsAnyColorToCastTargetEffect;
-import mage.target.targetpointer.FixedTarget;
/**
* @author TheElk801
*/
public final class RobberOfTheRich extends CardImpl {
+ private static final Hint hint = new ConditionHint(new RogueAttackedThisTurnCondition(null));
+
public RobberOfTheRich(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
@@ -45,14 +48,9 @@ public final class RobberOfTheRich extends CardImpl {
this.addAbility(HasteAbility.getInstance());
// Whenever Robber of the Rich attacks, if defending player has more cards in hand than you, exile the top card of their library. During any turn you attacked with a Rogue, you may cast that card and you may spend mana as though it were mana of any color to cast that spell.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(
- new RobberOfTheRichEffect(), false, "", SetTargetPointer.PLAYER
- ), RobberOfTheRichAttacksCondition.instance, "Whenever {this} attacks, " +
- "if defending player has more cards in hand than you, exile the top card of their library. " +
- "During any turn you attacked with a Rogue, you may cast that card and " +
- "you may spend mana as though it were mana of any color to cast that spell."
- ).addHint(new ConditionHint(new RogueAttackedThisTurnCondition(null))));
+ this.addAbility(new AttacksTriggeredAbility(
+ new RobberOfTheRichEffect(), false, "", SetTargetPointer.PLAYER
+ ).withInterveningIf(RobberOfTheRichAttacksCondition.instance).addHint(hint));
}
private RobberOfTheRich(final RobberOfTheRich card) {
@@ -72,16 +70,16 @@ enum RobberOfTheRichAttacksCondition implements Condition {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Player player = game.getPlayer(game.getCombat().getDefendingPlayerId(source.getSourceId(), game));
- return controller != null
- && player != null
+ return controller != null
+ && player != null
&& controller.getHand().size() < player.getHand().size();
}
}
class RogueAttackedThisTurnCondition implements Condition {
-
+
private Ability ability;
-
+
RogueAttackedThisTurnCondition(Ability source) {
this.ability = source;
}
@@ -108,7 +106,7 @@ class RogueAttackedThisTurnCondition implements Condition {
@Override
public String toString() {
- return "During that turn you attacked with a Rogue";
+ return "You attacked with a Rogue this turn";
}
}
@@ -116,6 +114,8 @@ class RobberOfTheRichEffect extends OneShotEffect {
RobberOfTheRichEffect() {
super(Outcome.Benefit);
+ staticText = "exile the top card of their library. During any turn you attacked with a Rogue, " +
+ "you may cast that card and you may spend mana as though it were mana of any color to cast that spell";
}
private RobberOfTheRichEffect(final RobberOfTheRichEffect effect) {
@@ -131,7 +131,7 @@ class RobberOfTheRichEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Player damagedPlayer = game.getPlayer(this.getTargetPointer().getFirst(game, source));
- if (controller == null
+ if (controller == null
|| damagedPlayer == null) {
return false;
}
diff --git a/Mage.Sets/src/mage/cards/r/RoccoCabarettiCaterer.java b/Mage.Sets/src/mage/cards/r/RoccoCabarettiCaterer.java
index 16307357db7..a5cd42f5e3e 100644
--- a/Mage.Sets/src/mage/cards/r/RoccoCabarettiCaterer.java
+++ b/Mage.Sets/src/mage/cards/r/RoccoCabarettiCaterer.java
@@ -3,7 +3,6 @@ package mage.cards.r;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.CastFromEverywhereSourceCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.GetXValue;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.cards.Card;
@@ -42,16 +41,9 @@ public final class RoccoCabarettiCaterer extends CardImpl {
this.toughness = new MageInt(1);
// When Rocco, Cabaretti Caterer enters the battlefield, if you cast it, you may search your library for a creature card with mana value X or less, put it onto the battlefield, then shuffle.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(
- new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter)),
- true
- ),
- CastFromEverywhereSourceCondition.instance,
- "When {this} enters, " +
- "if you cast it, you may search your library for a creature card with mana value X or less, " +
- "put it onto the battlefield, then shuffle.")
- );
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter)), true
+ ).withInterveningIf(CastFromEverywhereSourceCondition.instance));
}
private RoccoCabarettiCaterer(final RoccoCabarettiCaterer card) {
diff --git a/Mage.Sets/src/mage/cards/r/RoostOfDrakes.java b/Mage.Sets/src/mage/cards/r/RoostOfDrakes.java
index ac97dd237b2..adbe06fb6b1 100644
--- a/Mage.Sets/src/mage/cards/r/RoostOfDrakes.java
+++ b/Mage.Sets/src/mage/cards/r/RoostOfDrakes.java
@@ -3,7 +3,6 @@ package mage.cards.r;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.KickerAbility;
import mage.cards.CardImpl;
@@ -26,11 +25,7 @@ public final class RoostOfDrakes extends CardImpl {
this.addAbility(new KickerAbility("{2}{U}"));
// When Roost of Drakes enters the battlefield, if it was kicked, create a 2/2 blue Drake creature token with flying.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new DrakeToken())),
- KickedCondition.ONCE, "When {this} enters, if it was kicked, " +
- "create a 2/2 blue Drake creature token with flying."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new DrakeToken())).withInterveningIf(KickedCondition.ONCE));
// Whenever you cast a kicked spell, create a 2/2 blue Drake creature token with flying.
this.addAbility(new SpellCastControllerTriggeredAbility(
diff --git a/Mage.Sets/src/mage/cards/r/RoseCutthroatRaider.java b/Mage.Sets/src/mage/cards/r/RoseCutthroatRaider.java
index 598e86ea29e..8bd014f9b2c 100644
--- a/Mage.Sets/src/mage/cards/r/RoseCutthroatRaider.java
+++ b/Mage.Sets/src/mage/cards/r/RoseCutthroatRaider.java
@@ -2,21 +2,16 @@ package mage.cards.r;
import mage.MageInt;
import mage.Mana;
-import mage.abilities.Ability;
import mage.abilities.common.EndOfCombatTriggeredAbility;
import mage.abilities.common.SacrificePermanentTriggeredAbility;
import mage.abilities.condition.common.RaidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.AttackedThisTurnOpponentsCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AbilityWord;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.SuperType;
+import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.game.permanent.token.JunkToken;
import mage.watchers.common.PlayerAttackedWatcher;
@@ -47,17 +42,12 @@ public final class RoseCutthroatRaider extends CardImpl {
this.addAbility(FirstStrikeAbility.getInstance());
// Raid -- At end of combat on your turn, if you attacked this turn, create a Junk token for each opponent you attacked.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(new EndOfCombatTriggeredAbility(
- new CreateTokenEffect(new JunkToken(), AttackedThisTurnOpponentsCount.instance), false), RaidCondition.instance,
- "At end of combat on your turn, if you attacked this turn, create a Junk token for each opponent you attacked.");
- ability.setAbilityWord(AbilityWord.RAID);
- ability.addHint(AttackedThisTurnOpponentsCount.getHint());
- ability.addWatcher(new PlayerAttackedWatcher());
- ability.addWatcher(new PlayersAttackedThisTurnWatcher());
- this.addAbility(ability);
+ this.addAbility(new EndOfCombatTriggeredAbility(
+ new CreateTokenEffect(new JunkToken(), AttackedThisTurnOpponentsCount.instance), TargetController.YOU, false
+ ).withInterveningIf(RaidCondition.instance).setAbilityWord(AbilityWord.RAID).addHint(AttackedThisTurnOpponentsCount.getHint()), new PlayersAttackedThisTurnWatcher());
// Whenever you sacrifice a Junk, add {R}.
- this.addAbility(new SacrificePermanentTriggeredAbility(new AddManaToManaPoolSourceControllerEffect(Mana.RedMana(1)), filter));
+ this.addAbility(new SacrificePermanentTriggeredAbility(new AddManaToManaPoolSourceControllerEffect(Mana.RedMana(1)), filter), new PlayerAttackedWatcher());
}
private RoseCutthroatRaider(final RoseCutthroatRaider card) {
diff --git a/Mage.Sets/src/mage/cards/r/RubblebeltBraggart.java b/Mage.Sets/src/mage/cards/r/RubblebeltBraggart.java
index c6a955abe55..b354f3fde00 100644
--- a/Mage.Sets/src/mage/cards/r/RubblebeltBraggart.java
+++ b/Mage.Sets/src/mage/cards/r/RubblebeltBraggart.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.SuspectSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -29,11 +28,8 @@ public final class RubblebeltBraggart extends CardImpl {
this.toughness = new MageInt(5);
// Whenever Rubblebelt Braggart attacks, if it's not suspected, you may suspect it.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new SuspectSourceEffect(), true),
- RubblebeltBraggartCondition.instance, "Whenever {this} attacks, " +
- "if it's not suspected, you may suspect it."
- ));
+ this.addAbility(new AttacksTriggeredAbility(new SuspectSourceEffect(), true)
+ .withInterveningIf(RubblebeltBraggartCondition.instance));
}
private RubblebeltBraggart(final RubblebeltBraggart card) {
@@ -53,7 +49,12 @@ enum RubblebeltBraggartCondition implements Condition {
public boolean apply(Game game, Ability source) {
return Optional
.ofNullable(source.getSourcePermanentIfItStillExists(game))
- .map(permanent -> !permanent.isSuspected())
- .orElse(false);
+ .filter(permanent -> !permanent.isSuspected())
+ .isPresent();
+ }
+
+ @Override
+ public String toString() {
+ return "it's not suspected";
}
}
diff --git a/Mage.Sets/src/mage/cards/r/RuinRaider.java b/Mage.Sets/src/mage/cards/r/RuinRaider.java
index 80449a637c7..dee50a5af80 100644
--- a/Mage.Sets/src/mage/cards/r/RuinRaider.java
+++ b/Mage.Sets/src/mage/cards/r/RuinRaider.java
@@ -1,12 +1,10 @@
package mage.cards.r;
import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.condition.common.RaidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.RevealPutInHandLoseLifeEffect;
import mage.abilities.hint.common.RaidHint;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AbilityWord;
@@ -30,16 +28,8 @@ public final class RuinRaider extends CardImpl {
this.toughness = new MageInt(2);
// Raid — At the beginning of your end step, if you attacked this turn, reveal the top card of your library and put that card into your hand. You lose life equal to the card's converted mana cost.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- new RevealPutInHandLoseLifeEffect()
- ), RaidCondition.instance, "At the beginning of your end step, " +
- "if you attacked this turn, reveal the top card of your library " +
- "and put that card into your hand. You lose life equal to the card's mana value."
- );
- ability.setAbilityWord(AbilityWord.RAID);
- ability.addHint(RaidHint.instance);
- this.addAbility(ability, new PlayerAttackedWatcher());
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(new RevealPutInHandLoseLifeEffect())
+ .withInterveningIf(RaidCondition.instance).setAbilityWord(AbilityWord.RAID).addHint(RaidHint.instance), new PlayerAttackedWatcher());
}
private RuinRaider(final RuinRaider card) {
diff --git a/Mage.Sets/src/mage/cards/r/RushingTideZubera.java b/Mage.Sets/src/mage/cards/r/RushingTideZubera.java
index 5e47d1b2895..059844fd1f5 100644
--- a/Mage.Sets/src/mage/cards/r/RushingTideZubera.java
+++ b/Mage.Sets/src/mage/cards/r/RushingTideZubera.java
@@ -1,23 +1,21 @@
-
package mage.cards.r;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
+import java.util.Optional;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class RushingTideZubera extends CardImpl {
@@ -31,9 +29,7 @@ public final class RushingTideZubera extends CardImpl {
this.toughness = new MageInt(3);
// When Rushing-Tide Zubera dies, if 4 or more damage was dealt to it this turn, draw three cards.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(new DiesSourceTriggeredAbility(new DrawCardSourceControllerEffect(3)), new RushingTideZuberaCondition(),
- "When {this} dies, if 4 or more damage was dealt to it this turn, draw three cards.");
- this.addAbility(ability);
+ this.addAbility(new DiesSourceTriggeredAbility(new DrawCardSourceControllerEffect(3)).withInterveningIf(RushingTideZuberaCondition.instance));
}
private RushingTideZubera(final RushingTideZubera card) {
@@ -46,14 +42,19 @@ public final class RushingTideZubera extends CardImpl {
}
}
-class RushingTideZuberaCondition implements Condition {
+enum RushingTideZuberaCondition implements Condition {
+ instance;
@Override
public boolean apply(Game game, Ability source) {
- Permanent permanent = game.getPermanent(source.getSourceId());
- if (permanent == null) {
- permanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD);
- }
- return permanent.getDamage() > 3;
+ return Optional
+ .ofNullable(source.getSourcePermanentOrLKI(game))
+ .map(Permanent::getDamage)
+ .orElse(0) >= 4;
+ }
+
+ @Override
+ public String toString() {
+ return "4 or more damage was dealt to it this turn";
}
}
diff --git a/Mage.Sets/src/mage/cards/s/SabertoothOutrider.java b/Mage.Sets/src/mage/cards/s/SabertoothOutrider.java
index 3a1b47c49f9..da4f670e711 100644
--- a/Mage.Sets/src/mage/cards/s/SabertoothOutrider.java
+++ b/Mage.Sets/src/mage/cards/s/SabertoothOutrider.java
@@ -1,28 +1,27 @@
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.condition.common.FormidableCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.TrampleAbility;
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 java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class SabertoothOutrider extends CardImpl {
public SabertoothOutrider(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(4);
@@ -32,12 +31,9 @@ public final class SabertoothOutrider extends CardImpl {
this.addAbility(TrampleAbility.getInstance());
// Formidable — Whenever Sabertooth Outrider attacks, if creatures you control have total power 8 or greater, Sabertooth Outrider gains first strike until end of turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn), false),
- FormidableCondition.instance,
- "Formidable — Whenever {this} attacks, if creatures you control have total power 8 or greater, {this} gains first strike until end of turn."
- ));
-
+ this.addAbility(new AttacksTriggeredAbility(new GainAbilitySourceEffect(
+ FirstStrikeAbility.getInstance(), Duration.EndOfTurn
+ )).withInterveningIf(FormidableCondition.instance));
}
private SabertoothOutrider(final SabertoothOutrider card) {
diff --git a/Mage.Sets/src/mage/cards/s/SanctuaryRaptor.java b/Mage.Sets/src/mage/cards/s/SanctuaryRaptor.java
index d42dffaa0b3..864f67a28d2 100644
--- a/Mage.Sets/src/mage/cards/s/SanctuaryRaptor.java
+++ b/Mage.Sets/src/mage/cards/s/SanctuaryRaptor.java
@@ -5,7 +5,6 @@ import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
@@ -30,16 +29,14 @@ import java.util.UUID;
*/
public final class SanctuaryRaptor extends CardImpl {
- private static final FilterPermanent filter = new FilterControlledPermanent();
+ private static final FilterPermanent filter = new FilterControlledPermanent("you control three or more tokens");
static {
filter.add(TokenPredicate.TRUE);
}
- private static final Condition condition
- = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 2);
- private static final Hint hint
- = new ValueHint("Tokens you control", new PermanentsOnBattlefieldCount(filter));
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 2);
+ private static final Hint hint = new ValueHint("Tokens you control", new PermanentsOnBattlefieldCount(filter));
public SanctuaryRaptor(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}");
@@ -52,13 +49,12 @@ public final class SanctuaryRaptor extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Whenever Sanctuary Raptor attacks, if you control three or more tokens, Sanctuary Raptor gets +2/+0 and gains first strike until end of turn.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(
- new BoostSourceEffect(2, 0, Duration.EndOfTurn), false
- ), condition, "Whenever {this} attacks, if you control three or more tokens, " +
- "{this} gets +2/+0 and gains first strike until end of turn."
- );
- ability.addEffect(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn));
+ Ability ability = new AttacksTriggeredAbility(new BoostSourceEffect(
+ 2, 0, Duration.EndOfTurn
+ ).setText("{this} gets +2/+0")).withInterveningIf(condition);
+ ability.addEffect(new GainAbilitySourceEffect(
+ FirstStrikeAbility.getInstance(), Duration.EndOfTurn
+ ).setText("and gains first strike until end of turn"));
this.addAbility(ability.addHint(hint));
}
diff --git a/Mage.Sets/src/mage/cards/s/SandScout.java b/Mage.Sets/src/mage/cards/s/SandScout.java
index 85f28effe3b..950686234b9 100644
--- a/Mage.Sets/src/mage/cards/s/SandScout.java
+++ b/Mage.Sets/src/mage/cards/s/SandScout.java
@@ -5,7 +5,6 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.OpponentControlsMoreCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.cards.CardImpl;
@@ -42,11 +41,7 @@ public final class SandScout extends CardImpl {
this.toughness = new MageInt(2);
// When Sand Scout enters the battlefield, if an opponent controls more lands than you, search your library for a Desert card, put it onto the battlefield tapped, then shuffle.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(new EntersBattlefieldTriggeredAbility(
- new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true)),
- condition, "When {this} enters, if an opponent controls more lands than you, " +
- "search your library for a Desert card, put it onto the battlefield tapped, then shuffle."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true)).withInterveningIf(condition));
// Whenever one or more land cards are put into your graveyard from anywhere, create a 1/1 red, green, and white Sand Warrior creature token. This ability triggers only once each turn.
this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
diff --git a/Mage.Sets/src/mage/cards/s/SandStrangler.java b/Mage.Sets/src/mage/cards/s/SandStrangler.java
index f6244134b8a..e3531ccdda5 100644
--- a/Mage.Sets/src/mage/cards/s/SandStrangler.java
+++ b/Mage.Sets/src/mage/cards/s/SandStrangler.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.DesertControlledOrGraveyardCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -27,11 +26,8 @@ public final class SandStrangler extends CardImpl {
this.toughness = new MageInt(3);
// When Sand Strangler enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you may have Sand Strangler deal 3 damage to target creature.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(3), true),
- DesertControlledOrGraveyardCondition.instance, "When {this} enters, " +
- "if you control a Desert or there is a Desert card in your graveyard, " +
- "you may have {this} deal 3 damage to target creature.");
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(3), true)
+ .withInterveningIf(DesertControlledOrGraveyardCondition.instance);
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability.addHint(DesertControlledOrGraveyardCondition.getHint()));
}
diff --git a/Mage.Sets/src/mage/cards/s/SandstalkerMoloch.java b/Mage.Sets/src/mage/cards/s/SandstalkerMoloch.java
index c8ee8f4d377..a86566afa01 100644
--- a/Mage.Sets/src/mage/cards/s/SandstalkerMoloch.java
+++ b/Mage.Sets/src/mage/cards/s/SandstalkerMoloch.java
@@ -4,7 +4,7 @@ import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.keyword.FlashAbility;
import mage.cards.CardImpl;
@@ -39,17 +39,10 @@ public final class SandstalkerMoloch extends CardImpl {
this.addAbility(FlashAbility.getInstance());
// When Sandstalker Moloch enters the battlefield, if an opponent cast a blue and/or black spell this turn, look at the top four cards of your library. You may reveal a permanent card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(
- new LookLibraryAndPickControllerEffect(
- 4, 1, StaticFilters.FILTER_CARD_A_PERMANENT,
- PutCards.HAND, PutCards.BOTTOM_RANDOM
- )
- ), SandstalkerMolochWatcher::checkPlayer, "When {this} enters, " +
- "if an opponent cast a blue and/or black spell this turn, look at the top four cards " +
- "of your library. You may reveal a permanent card from among them and put it into your hand. " +
- "Put the rest on the bottom of your library in a random order."
- ), new SandstalkerMolochWatcher());
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect(
+ 4, 1, StaticFilters.FILTER_CARD_A_PERMANENT,
+ PutCards.HAND, PutCards.BOTTOM_RANDOM
+ )).withInterveningIf(SandstalkerMolochCondition.instance), new SandstalkerMolochWatcher());
}
private SandstalkerMoloch(final SandstalkerMoloch card) {
@@ -62,6 +55,20 @@ public final class SandstalkerMoloch extends CardImpl {
}
}
+enum SandstalkerMolochCondition implements Condition {
+ instance;
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return SandstalkerMolochWatcher.checkPlayer(game, source);
+ }
+
+ @Override
+ public String toString() {
+ return "an opponent cast a blue and/or black spell this turn";
+ }
+}
+
class SandstalkerMolochWatcher extends Watcher {
private final Set players = new HashSet<>();
diff --git a/Mage.Sets/src/mage/cards/s/SanguineSpy.java b/Mage.Sets/src/mage/cards/s/SanguineSpy.java
index 799e7640e67..d6d98268789 100644
--- a/Mage.Sets/src/mage/cards/s/SanguineSpy.java
+++ b/Mage.Sets/src/mage/cards/s/SanguineSpy.java
@@ -2,19 +2,18 @@ package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.common.DifferentManaValuesInGraveCondition;
import mage.abilities.costs.common.PayLifeCost;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.GenericManaCost;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.keyword.SurveilEffect;
import mage.abilities.hint.common.DifferentManaValuesInGraveHint;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.MenaceAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -48,12 +47,9 @@ public final class SanguineSpy extends CardImpl {
this.addAbility(ability);
// At the beginning of your end step, if there are five or more mana values among cards in your graveyard, you may pay 2 life. If you do, draw a card.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new PayLifeCost(2))
- ), DifferentManaValuesInGraveCondition.FIVE, "At the beginning of your end step, if there are " +
- "five or more mana values among cards in your graveyard, you may pay 2 life. If you do, draw a card."
- ).addHint(DifferentManaValuesInGraveHint.instance));
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new PayLifeCost(2))
+ ).withInterveningIf(DifferentManaValuesInGraveCondition.FIVE).addHint(DifferentManaValuesInGraveHint.instance));
}
private SanguineSpy(final SanguineSpy card) {
diff --git a/Mage.Sets/src/mage/cards/s/Sarcomancy.java b/Mage.Sets/src/mage/cards/s/Sarcomancy.java
index e9d4b223a3e..5e5125e4d15 100644
--- a/Mage.Sets/src/mage/cards/s/Sarcomancy.java
+++ b/Mage.Sets/src/mage/cards/s/Sarcomancy.java
@@ -1,36 +1,39 @@
-
package mage.cards.s;
-import java.util.UUID;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DamageControllerEffect;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.ComparisonType;
+import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.game.permanent.token.ZombieToken;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class Sarcomancy extends CardImpl {
-
- public Sarcomancy(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{B}");
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterPermanent(SubType.ZOMBIE, "there are no Zombies on the battlefield"),
+ ComparisonType.EQUAL_TO, 0, false
+ );
+
+ public Sarcomancy(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}");
// When Sarcomancy enters the battlefield, create a 2/2 black Zombie creature token.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken(), 1), false));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken())));
+
// At the beginning of your upkeep, if there are no Zombies on the battlefield, Sarcomancy deals 1 damage to you.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(new DamageControllerEffect(1)),
- new PermanentsOnTheBattlefieldCondition(new FilterPermanent(SubType.ZOMBIE, "Zombies"), ComparisonType.EQUAL_TO, 0, false),
- "At the beginning of your upkeep, if there are no Zombies on the battlefield, {this} deals 1 damage to you."));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DamageControllerEffect(1)).withInterveningIf(condition));
}
private Sarcomancy(final Sarcomancy card) {
diff --git a/Mage.Sets/src/mage/cards/s/SarulfRealmEater.java b/Mage.Sets/src/mage/cards/s/SarulfRealmEater.java
index 739780fb50b..e54c2d68929 100644
--- a/Mage.Sets/src/mage/cards/s/SarulfRealmEater.java
+++ b/Mage.Sets/src/mage/cards/s/SarulfRealmEater.java
@@ -1,30 +1,28 @@
package mage.cards.s;
import mage.MageInt;
-import mage.MageItem;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldAllTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.cards.Cards;
-import mage.cards.CardsImpl;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.FilterPermanent;
+import mage.filter.StaticFilters;
import mage.filter.common.FilterNonlandPermanent;
-import mage.filter.predicate.mageobject.ManaValuePredicate;
import mage.filter.predicate.mageobject.AnotherPredicate;
+import mage.filter.predicate.mageobject.ManaValuePredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
-import java.util.Objects;
+import java.util.HashSet;
+import java.util.List;
import java.util.UUID;
/**
@@ -32,12 +30,6 @@ import java.util.UUID;
*/
public final class SarulfRealmEater extends CardImpl {
- private static final FilterPermanent filter = new FilterPermanent("a permanent an opponent controls");
-
- static {
- filter.add(TargetController.OPPONENT.getControllerPredicate());
- }
-
private static final Condition condition = new SourceHasCounterCondition(CounterType.P1P1);
public SarulfRealmEater(UUID ownerId, CardSetInfo setInfo) {
@@ -50,18 +42,12 @@ public final class SarulfRealmEater extends CardImpl {
// Whenever a permanent an opponent controls is put into a graveyard from the battlefield, put a +1/+1 counter on Sarulf, Realm Eater.
this.addAbility(new PutIntoGraveFromBattlefieldAllTriggeredAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
- false, filter, false, false
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false,
+ StaticFilters.FILTER_OPPONENTS_PERMANENT, false, false
));
// At the beginning of your upkeep, if Sarulf has one or more +1/+1 counters on it, you may remove all of them. If you do, exile each other nonland permanent with converted mana cost less than or equal to the number of counters removed this way.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(
- new SarulfRealmEaterEffect(), true
- ), condition, "At the beginning of your upkeep, if {this} has one or more +1/+1 counters on it, " +
- "you may remove all of them. If you do, exile each other nonland permanent with mana value " +
- "less than or equal to the number of counters removed this way."
- ));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SarulfRealmEaterEffect(), true).withInterveningIf(condition));
}
private SarulfRealmEater(final SarulfRealmEater card) {
@@ -78,6 +64,8 @@ class SarulfRealmEaterEffect extends OneShotEffect {
SarulfRealmEaterEffect() {
super(Outcome.Benefit);
+ staticText = "remove all of them. If you do, exile each other nonland permanent with mana value " +
+ "less than or equal to the number of counters removed this way";
}
private SarulfRealmEaterEffect(final SarulfRealmEaterEffect effect) {
@@ -100,16 +88,10 @@ class SarulfRealmEaterEffect extends OneShotEffect {
FilterPermanent filter = new FilterNonlandPermanent();
filter.add(new ManaValuePredicate(ComparisonType.OR_LESS, removedThisWay));
filter.add(AnotherPredicate.instance);
- Cards cards = new CardsImpl();
- game.getBattlefield()
- .getActivePermanents(
- filter, source.getControllerId(),
- source, game
- )
- .stream()
- .filter(Objects::nonNull)
- .map(MageItem::getId)
- .forEach(cards::add);
- return player.moveCards(cards, Zone.EXILED, source, game);
+ List permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game);
+ if (!permanents.isEmpty()) {
+ player.moveCards(new HashSet<>(permanents), Zone.EXILED, source, game);
+ }
+ return true;
}
}
diff --git a/Mage.Sets/src/mage/cards/s/SaruliGatekeepers.java b/Mage.Sets/src/mage/cards/s/SaruliGatekeepers.java
index eb63c640225..d48f592f4a1 100644
--- a/Mage.Sets/src/mage/cards/s/SaruliGatekeepers.java
+++ b/Mage.Sets/src/mage/cards/s/SaruliGatekeepers.java
@@ -2,35 +2,21 @@ package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.condition.Condition;
-import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.condition.common.YouControlTwoOrMoreGatesCondition;
import mage.abilities.effects.common.GainLifeEffect;
-import mage.abilities.hint.ConditionHint;
+import mage.abilities.hint.common.GatesYouControlHint;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.ComparisonType;
import mage.constants.SubType;
-import mage.filter.common.FilterControlledPermanent;
import java.util.UUID;
/**
* @author LevelX2
*/
-
-
public final class SaruliGatekeepers extends CardImpl {
- private static final FilterControlledPermanent filter = new FilterControlledPermanent();
-
- static {
- filter.add(SubType.GATE.getPredicate());
- }
-
- private static final Condition gatesCondition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1);
-
public SaruliGatekeepers(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");
this.subtype.add(SubType.ELF);
@@ -40,11 +26,8 @@ public final class SaruliGatekeepers extends CardImpl {
this.toughness = new MageInt(4);
// When Saruli Gatekeepers enters the battlefield, if you control two or more Gates, gain 7 life.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new GainLifeEffect(7)),
- gatesCondition,
- "When {this} enters, if you control two or more Gates, you gain 7 life.")
- .addHint(new ConditionHint(gatesCondition, "You control two or more Gates")));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(7))
+ .withInterveningIf(YouControlTwoOrMoreGatesCondition.instance).addHint(GatesYouControlHint.instance));
}
private SaruliGatekeepers(final SaruliGatekeepers card) {
diff --git a/Mage.Sets/src/mage/cards/s/SavageGorger.java b/Mage.Sets/src/mage/cards/s/SavageGorger.java
index 39ddc7c630f..8dd50f9c39c 100644
--- a/Mage.Sets/src/mage/cards/s/SavageGorger.java
+++ b/Mage.Sets/src/mage/cards/s/SavageGorger.java
@@ -1,12 +1,11 @@
package mage.cards.s;
import mage.MageInt;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.condition.common.OpponentsLostLifeCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.hint.common.OpponentsLostLifeHint;
import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -31,12 +30,8 @@ public final class SavageGorger extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// At the beginning of your upkeep, if an opponent lost life this turn, put a +1/+1 counter on Savage Gorger.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(new AddCountersSourceEffect(
- CounterType.P1P1.createInstance())
- ), OpponentsLostLifeCondition.instance, "At the beginning of your end step, " +
- "if an opponent lost life this turn, put a +1/+1 counter on {this}."
- ).addHint(OpponentsLostLifeHint.instance));
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()))
+ .withInterveningIf(OpponentsLostLifeCondition.instance).addHint(OpponentsLostLifeHint.instance));
}
private SavageGorger(final SavageGorger card) {
diff --git a/Mage.Sets/src/mage/cards/s/ScabClanBerserker.java b/Mage.Sets/src/mage/cards/s/ScabClanBerserker.java
index 52d19755c10..a23859be33c 100644
--- a/Mage.Sets/src/mage/cards/s/ScabClanBerserker.java
+++ b/Mage.Sets/src/mage/cards/s/ScabClanBerserker.java
@@ -1,33 +1,28 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.SpellCastOpponentTriggeredAbility;
import mage.abilities.condition.common.RenownedSourceCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
-import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.RenownAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SetTargetPointer;
import mage.constants.SubType;
import mage.constants.Zone;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.stack.Spell;
-import mage.target.targetpointer.FixedTarget;
+import mage.filter.StaticFilters;
+
+import java.util.UUID;
/**
- *
* @author fireshoes
*/
public final class ScabClanBerserker extends CardImpl {
public ScabClanBerserker(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.BERSERKER);
this.power = new MageInt(2);
@@ -35,15 +30,16 @@ public final class ScabClanBerserker extends CardImpl {
// Haste
this.addAbility(HasteAbility.getInstance());
-
+
// Renown 1
this.addAbility(new RenownAbility(1));
-
+
// Whenever an opponent casts a noncreature spell, if Scab-Clan Berserker is renowned, Scab-Clan Berserker deals 2 damage to that player.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new ScabClanBerserkerTriggeredAbility(),
- RenownedSourceCondition.instance,
- "Whenever an opponent casts a noncreature spell, if Scab-Clan Berserker is renowned, Scab-Clan Berserker deals 2 damage to that player"));
+ this.addAbility(new SpellCastOpponentTriggeredAbility(
+ Zone.BATTLEFIELD,
+ new DamageTargetEffect(2, true, "that player"),
+ StaticFilters.FILTER_SPELL_A, false, SetTargetPointer.PLAYER
+ ).withInterveningIf(RenownedSourceCondition.THIS));
}
private ScabClanBerserker(final ScabClanBerserker card) {
@@ -55,45 +51,3 @@ public final class ScabClanBerserker extends CardImpl {
return new ScabClanBerserker(this);
}
}
-
-class ScabClanBerserkerTriggeredAbility extends TriggeredAbilityImpl {
-
-
- public ScabClanBerserkerTriggeredAbility() {
- super(Zone.BATTLEFIELD, new DamageTargetEffect(2, true, "that player"));
- }
-
-
- private ScabClanBerserkerTriggeredAbility(final ScabClanBerserkerTriggeredAbility abiltity) {
- super(abiltity);
- }
-
- @Override
- public ScabClanBerserkerTriggeredAbility copy() {
- return new ScabClanBerserkerTriggeredAbility(this);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == GameEvent.EventType.SPELL_CAST;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- if (game.getOpponents(controllerId).contains(event.getPlayerId())) {
- Spell spell = game.getStack().getSpell(event.getTargetId());
- if (spell != null && !spell.isCreature(game)){
- for (Effect effect : this.getEffects()) {
- effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
- }
- return true;
- }
- }
- return false;
- }
-
- @Override
- public String getRule() {
- return "Whenever an opponent casts a noncreature spell, if Scab-Clan Berserker is renowned, Scab-Clan Berserker deals 2 damage to that player";
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/s/ScaldingTongs.java b/Mage.Sets/src/mage/cards/s/ScaldingTongs.java
index 9327ff8b01e..3e5edbf3a57 100644
--- a/Mage.Sets/src/mage/cards/s/ScaldingTongs.java
+++ b/Mage.Sets/src/mage/cards/s/ScaldingTongs.java
@@ -1,35 +1,32 @@
-
package mage.cards.s;
-import java.util.UUID;
-import mage.abilities.TriggeredAbility;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.Ability;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.CardsInHandCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.target.common.TargetOpponentOrPlaneswalker;
+import java.util.UUID;
+
/**
* @author fireshoes
*/
public final class ScaldingTongs extends CardImpl {
+ private static final Condition condition = new CardsInHandCondition(ComparisonType.FEWER_THAN, 4);
+
public ScaldingTongs(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
// At the beginning of your upkeep, if you have three or fewer cards in hand, Scalding Tongs deals 1 damage to target opponent.
- TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new DamageTargetEffect(1));
+ Ability ability = new BeginningOfUpkeepTriggeredAbility(new DamageTargetEffect(1)).withInterveningIf(condition);
ability.addTarget(new TargetOpponentOrPlaneswalker());
- CardsInHandCondition condition = new CardsInHandCondition(ComparisonType.FEWER_THAN, 4);
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- ability, condition,
- "At the beginning of your upkeep, if you have three or fewer cards in hand, "
- + "{this} deals 1 damage to target opponent or planeswalker."
- ));
+ this.addAbility(ability);
}
private ScaldingTongs(final ScaldingTongs card) {
diff --git a/Mage.Sets/src/mage/cards/s/ScholarOfStars.java b/Mage.Sets/src/mage/cards/s/ScholarOfStars.java
index 7b1a533be61..db4d8dea6e2 100644
--- a/Mage.Sets/src/mage/cards/s/ScholarOfStars.java
+++ b/Mage.Sets/src/mage/cards/s/ScholarOfStars.java
@@ -1,24 +1,26 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
-import mage.constants.SubType;
+import mage.abilities.hint.common.ArtifactYouControlHint;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.filter.StaticFilters;
+import mage.constants.SubType;
+import mage.filter.common.FilterControlledArtifactPermanent;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class ScholarOfStars extends CardImpl {
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(new FilterControlledArtifactPermanent("you control an artifact"));
+
public ScholarOfStars(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}");
@@ -28,11 +30,8 @@ public final class ScholarOfStars extends CardImpl {
this.toughness = new MageInt(2);
// When Scholar of Stars enters the battlefield, if you control an artifact, draw a card.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false),
- new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT),
- "When {this} enters, if you control an artifact, draw a card."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))
+ .withInterveningIf(condition).addHint(ArtifactYouControlHint.instance));
}
private ScholarOfStars(final ScholarOfStars card) {
diff --git a/Mage.Sets/src/mage/cards/s/ScionOfVituGhazi.java b/Mage.Sets/src/mage/cards/s/ScionOfVituGhazi.java
index 264c1a9efec..b0d117b8a67 100644
--- a/Mage.Sets/src/mage/cards/s/ScionOfVituGhazi.java
+++ b/Mage.Sets/src/mage/cards/s/ScionOfVituGhazi.java
@@ -1,12 +1,9 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.CastFromHandSourcePermanentCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.PopulateEffect;
import mage.cards.CardImpl;
@@ -16,25 +13,25 @@ import mage.constants.SubType;
import mage.game.permanent.token.BirdToken;
import mage.watchers.common.CastFromHandWatcher;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class ScionOfVituGhazi extends CardImpl {
public ScionOfVituGhazi(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}");
this.subtype.add(SubType.ELEMENTAL);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
//When Scion of Vitu-Ghazi enters the battlefield, if you cast it from your hand, create a 1/1 white Bird creature token with flying, then populate.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new BirdToken()), false);
+ Ability ability = new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new BirdToken()))
+ .withInterveningIf(CastFromHandSourcePermanentCondition.instance);
ability.addEffect(new PopulateEffect("then"));
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, CastFromHandSourcePermanentCondition.instance,
- "When {this} enters, if you cast it from your hand, create a 1/1 white Bird creature token with flying, then populate."),
- new CastFromHandWatcher());
+ this.addAbility(ability, new CastFromHandWatcher());
}
private ScionOfVituGhazi(final ScionOfVituGhazi card) {
diff --git a/Mage.Sets/src/mage/cards/s/ScorchRider.java b/Mage.Sets/src/mage/cards/s/ScorchRider.java
index 06e8e6f2abd..466645927df 100644
--- a/Mage.Sets/src/mage/cards/s/ScorchRider.java
+++ b/Mage.Sets/src/mage/cards/s/ScorchRider.java
@@ -3,7 +3,6 @@ package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.KickerAbility;
@@ -32,12 +31,9 @@ public final class ScorchRider extends CardImpl {
this.addAbility(new KickerAbility("{1}{R}"));
// When Scorch Rider enters the battlefield, if it was kicked, it gains haste until end of turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new GainAbilitySourceEffect(
- HasteAbility.getInstance(), Duration.EndOfTurn
- )), KickedCondition.ONCE, "When {this} enters, " +
- "if it was kicked, it gains haste until end of turn."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new GainAbilitySourceEffect(
+ HasteAbility.getInstance(), Duration.EndOfTurn
+ ).setText("it gains haste until end of turn")).withInterveningIf(KickedCondition.ONCE));
}
private ScorchRider(final ScorchRider card) {
diff --git a/Mage.Sets/src/mage/cards/s/ScourgeOfTheSkyclaves.java b/Mage.Sets/src/mage/cards/s/ScourgeOfTheSkyclaves.java
index f2af217e91f..79851881a51 100644
--- a/Mage.Sets/src/mage/cards/s/ScourgeOfTheSkyclaves.java
+++ b/Mage.Sets/src/mage/cards/s/ScourgeOfTheSkyclaves.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
@@ -13,7 +12,10 @@ import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffec
import mage.abilities.keyword.KickerAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
@@ -36,10 +38,7 @@ public final class ScourgeOfTheSkyclaves extends CardImpl {
this.addAbility(new KickerAbility("{4}{B}"));
// When you cast this spell, if it was kicked, each player loses half their life, rounded up.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new CastSourceTriggeredAbility(new ScourgeOfTheSkyclavesEffect()), KickedCondition.ONCE,
- "When you cast this spell, if it was kicked, each player loses half their life, rounded up."
- ));
+ this.addAbility(new CastSourceTriggeredAbility(new ScourgeOfTheSkyclavesEffect()).withInterveningIf(KickedCondition.ONCE));
// Scourge of the Skyclaves's power and toughness are each equal to 20 minus the highest life total among players.
this.addAbility(new SimpleStaticAbility(
@@ -89,6 +88,7 @@ class ScourgeOfTheSkyclavesEffect extends OneShotEffect {
ScourgeOfTheSkyclavesEffect() {
super(Outcome.Benefit);
+ staticText = "each player loses half their life, rounded up";
}
private ScourgeOfTheSkyclavesEffect(final ScourgeOfTheSkyclavesEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/s/ScourgeOfTheThrone.java b/Mage.Sets/src/mage/cards/s/ScourgeOfTheThrone.java
index 6cec7f8d873..856ef512c5b 100644
--- a/Mage.Sets/src/mage/cards/s/ScourgeOfTheThrone.java
+++ b/Mage.Sets/src/mage/cards/s/ScourgeOfTheThrone.java
@@ -1,11 +1,9 @@
-
package mage.cards.s;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.AttacksFirstTimeTriggeredAbility;
import mage.abilities.condition.common.SourceAttackingPlayerWithMostLifeCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.AdditionalCombatPhaseEffect;
import mage.abilities.effects.common.UntapAllControllerEffect;
import mage.abilities.keyword.DethroneAbility;
@@ -32,24 +30,19 @@ public final class ScourgeOfTheThrone extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
+
// Dethrone (Whenever this creature attacks the player with the most life or tied for most life, put a +1/+1 counter on it.)
this.addAbility(new DethroneAbility());
+
// Whenever Scourge of the Throne attacks for the first time each turn, if it's attacking the player with the most life or tied for most life, untap all attacking creatures. After this phase, there is an additional combat phase.
- TriggeredAbility ability = new AttacksFirstTimeTriggeredAbility(
+ Ability ability = new AttacksFirstTimeTriggeredAbility(
new UntapAllControllerEffect(
StaticFilters.FILTER_ATTACKING_CREATURES,
"untap all attacking creatures"
), false
- );
+ ).withInterveningIf(SourceAttackingPlayerWithMostLifeCondition.instance);
ability.addEffect(new AdditionalCombatPhaseEffect());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- ability,
- SourceAttackingPlayerWithMostLifeCondition.instance,
- "Whenever {this} attacks for the first time each turn, "
- + "if it's attacking the player with the most life or tied for most life, "
- + "untap all attacking creatures. After this phase, "
- + "there is an additional combat phase."
- ));
+ this.addAbility(ability);
}
private ScourgeOfTheThrone(final ScourgeOfTheThrone card) {
@@ -60,4 +53,4 @@ public final class ScourgeOfTheThrone extends CardImpl {
public ScourgeOfTheThrone copy() {
return new ScourgeOfTheThrone(this);
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/cards/s/ScoutingHawk.java b/Mage.Sets/src/mage/cards/s/ScoutingHawk.java
index a718a1aca2d..9bebaf9a093 100644
--- a/Mage.Sets/src/mage/cards/s/ScoutingHawk.java
+++ b/Mage.Sets/src/mage/cards/s/ScoutingHawk.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.OpponentControlsMoreCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
@@ -43,11 +42,9 @@ public final class ScoutingHawk extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Keen Sight — When Scouting Hawk enters the battlefield, if an opponent controls more lands than you, search your library for a basic Plains card, put it onto the battlefield tapped, then shuffle.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(new EntersBattlefieldTriggeredAbility(
- new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true)),
- condition, "When {this} enters, if an opponent controls more lands than you, " +
- "search your library for a basic Plains card, put it onto the battlefield tapped, then shuffle."
- ).withFlavorWord("Keen Sight"));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true)
+ ).withInterveningIf(condition).withFlavorWord("Keen Sight"));
}
private ScoutingHawk(final ScoutingHawk card) {
diff --git a/Mage.Sets/src/mage/cards/s/Scrapshooter.java b/Mage.Sets/src/mage/cards/s/Scrapshooter.java
index ff8ecce344d..e222374435e 100644
--- a/Mage.Sets/src/mage/cards/s/Scrapshooter.java
+++ b/Mage.Sets/src/mage/cards/s/Scrapshooter.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.GiftWasPromisedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.keyword.GiftAbility;
import mage.abilities.keyword.ReachAbility;
@@ -47,11 +46,7 @@ public final class Scrapshooter extends CardImpl {
this.addAbility(ReachAbility.getInstance());
// When Scrapshooter enters, if the gift was promised, destroy target artifact or enchantment an opponent controls.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect()),
- GiftWasPromisedCondition.TRUE, "When {this} enters, if the gift was promised, " +
- "destroy target artifact or enchantment an opponent controls."
- );
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect()).withInterveningIf(GiftWasPromisedCondition.TRUE);
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/s/ScreechingSilcaw.java b/Mage.Sets/src/mage/cards/s/ScreechingSilcaw.java
index a65526d9ab0..298bf6f41aa 100644
--- a/Mage.Sets/src/mage/cards/s/ScreechingSilcaw.java
+++ b/Mage.Sets/src/mage/cards/s/ScreechingSilcaw.java
@@ -1,10 +1,8 @@
package mage.cards.s;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.condition.common.MetalcraftCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.MillCardsTargetEffect;
import mage.abilities.hint.common.MetalcraftHint;
import mage.abilities.keyword.FlyingAbility;
@@ -31,15 +29,9 @@ public final class ScreechingSilcaw extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
//"Metalcraft — Whenever Screeching Silcaw deals combat damage to a player, if you control three or more artifacts, that player puts the top four cards of their library into their graveyard.
- TriggeredAbility conditional = new ConditionalInterveningIfTriggeredAbility(
- new DealsCombatDamageToAPlayerTriggeredAbility(
- new MillCardsTargetEffect(4), false, true
- ), MetalcraftCondition.instance, "Whenever {this} " +
- "deals combat damage to a player, if you control three or more artifacts, that player mills four cards."
- );
- conditional.setAbilityWord(AbilityWord.METALCRAFT);
- conditional.addHint(MetalcraftHint.instance);
- this.addAbility(conditional);
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
+ new MillCardsTargetEffect(4), false, true
+ ).withInterveningIf(MetalcraftCondition.instance).setAbilityWord(AbilityWord.METALCRAFT).addHint(MetalcraftHint.instance));
}
private ScreechingSilcaw(final ScreechingSilcaw card) {
diff --git a/Mage.Sets/src/mage/cards/s/ScuttlingButler.java b/Mage.Sets/src/mage/cards/s/ScuttlingButler.java
index ac709ef1e0a..b0016c9c068 100644
--- a/Mage.Sets/src/mage/cards/s/ScuttlingButler.java
+++ b/Mage.Sets/src/mage/cards/s/ScuttlingButler.java
@@ -1,32 +1,38 @@
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.hint.Hint;
+import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.DoubleStrikeAbility;
-import mage.constants.*;
+import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.ComparisonType;
+import mage.constants.Duration;
+import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.predicate.mageobject.MulticoloredPredicate;
+import java.util.UUID;
+
/**
- *
* @author weirddan455
*/
public final class ScuttlingButler extends CardImpl {
- private static final FilterPermanent filter = new FilterPermanent("multicolored permanents");
+ private static final FilterPermanent filter = new FilterPermanent("you control two or more multicolored permanents");
static {
filter.add(MulticoloredPredicate.instance);
}
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1);
+ private static final Hint hint = new ValueHint("Multicolored permanents you control", new PermanentsOnBattlefieldCount(filter));
public ScuttlingButler(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}");
@@ -36,11 +42,9 @@ public final class ScuttlingButler extends CardImpl {
this.toughness = new MageInt(1);
// At the beginning of combat on your turn, if you control two or more multicolored permanents, Scuttling Butler gains double strike until end of turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfCombatTriggeredAbility(new GainAbilitySourceEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn)),
- condition,
- "At the beginning of combat on your turn, if you control two or more multicolored permanents, {this} gains double strike until end of turn."
- ));
+ this.addAbility(new BeginningOfCombatTriggeredAbility(new GainAbilitySourceEffect(
+ DoubleStrikeAbility.getInstance(), Duration.EndOfTurn
+ )).withInterveningIf(condition));
}
private ScuttlingButler(final ScuttlingButler card) {
diff --git a/Mage.Sets/src/mage/cards/s/SecondChance.java b/Mage.Sets/src/mage/cards/s/SecondChance.java
index 5fd611b2534..5d142722089 100644
--- a/Mage.Sets/src/mage/cards/s/SecondChance.java
+++ b/Mage.Sets/src/mage/cards/s/SecondChance.java
@@ -1,11 +1,10 @@
package mage.cards.s;
-import mage.abilities.TriggeredAbility;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.condition.common.FatefulHourCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -13,19 +12,17 @@ import mage.constants.CardType;
import java.util.UUID;
/**
- *
* @author Plopman
*/
public final class SecondChance extends CardImpl {
public SecondChance(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}");
// At the beginning of your upkeep, if you have 5 or less life, sacrifice Second Chance and take an extra turn after this one.
- TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceEffect());
- ability.addEffect(new AddExtraTurnControllerEffect());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, FatefulHourCondition.instance,
- "At the beginning of your upkeep, if you have 5 or less life, sacrifice {this} and take an extra turn after this one"));
+ Ability ability = new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceEffect()).withInterveningIf(FatefulHourCondition.instance);
+ ability.addEffect(new AddExtraTurnControllerEffect().concatBy("and"));
+ this.addAbility(ability);
}
private SecondChance(final SecondChance card) {
@@ -36,6 +33,6 @@ public final class SecondChance extends CardImpl {
public SecondChance copy() {
return new SecondChance(this);
}
-
+
}
diff --git a/Mage.Sets/src/mage/cards/s/SedraxisAlchemist.java b/Mage.Sets/src/mage/cards/s/SedraxisAlchemist.java
index d6f0ddcb1ec..4fc68da827e 100644
--- a/Mage.Sets/src/mage/cards/s/SedraxisAlchemist.java
+++ b/Mage.Sets/src/mage/cards/s/SedraxisAlchemist.java
@@ -1,38 +1,38 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.ObjectColor;
-import mage.abilities.TriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
+import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.ColorPredicate;
import mage.target.common.TargetNonlandPermanent;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class SedraxisAlchemist extends CardImpl {
-
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("blue permanent");
+
+ private static final FilterPermanent filter = new FilterControlledPermanent("you control a blue permanent");
static {
filter.add(new ColorPredicate(ObjectColor.BLUE));
}
-
- private static final String rule = "When {this} enters, if you control a blue permanent, return target nonland permanent to its owner's hand.";
+
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter);
public SedraxisAlchemist(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
this.subtype.add(SubType.ZOMBIE);
this.subtype.add(SubType.WIZARD);
@@ -40,10 +40,9 @@ public final class SedraxisAlchemist extends CardImpl {
this.toughness = new MageInt(2);
// When Sedraxis Alchemist enters the battlefield, if you control a blue permanent, return target nonland permanent to its owner's hand.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), false);
+ Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), false).withInterveningIf(condition);
ability.addTarget(new TargetNonlandPermanent());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new PermanentsOnTheBattlefieldCondition(filter), rule));
-
+ this.addAbility(ability);
}
private SedraxisAlchemist(final SedraxisAlchemist card) {
diff --git a/Mage.Sets/src/mage/cards/s/SeeRed.java b/Mage.Sets/src/mage/cards/s/SeeRed.java
index f0aa47dddde..23b5194723f 100644
--- a/Mage.Sets/src/mage/cards/s/SeeRed.java
+++ b/Mage.Sets/src/mage/cards/s/SeeRed.java
@@ -1,14 +1,10 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.InvertCondition;
import mage.abilities.condition.common.RaidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
-import mage.abilities.effects.Effect;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
@@ -16,24 +12,28 @@ import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.hint.common.RaidHint;
import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.FirstStrikeAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AttachmentType;
import mage.constants.CardType;
-import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SubType;
-import mage.constants.Zone;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.watchers.common.PlayerAttackedWatcher;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class SeeRed extends CardImpl {
+ private static final Condition condition = new InvertCondition(
+ RaidCondition.instance, "you didn't attack with a creature this turn"
+ );
+
public SeeRed(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}");
@@ -43,24 +43,18 @@ public final class SeeRed extends CardImpl {
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
- Ability ability = new EnchantAbility(auraTarget);
- this.addAbility(ability);
+ this.addAbility(new EnchantAbility(auraTarget));
// Enchanted creature gets +2/+1 and has first strike.
- ability = new SimpleStaticAbility(new BoostEnchantedEffect(2, 1, Duration.WhileOnBattlefield));
- Effect effect = new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.AURA);
- effect.setText("and has first strike");
- ability.addEffect(effect);
+ Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect(2, 1));
+ ability.addEffect(new GainAbilityAttachedEffect(
+ FirstStrikeAbility.getInstance(), AttachmentType.AURA
+ ).setText("and has first strike"));
this.addAbility(ability);
// At the beginning of your end step, if you didn't attack with a creature this turn, sacrifice See Red.
- ability = new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(new SacrificeSourceEffect()),
- new InvertCondition(RaidCondition.instance),
- "At the beginning of your end step, if you didn't attack with a creature this turn, sacrifice {this}."
- );
- ability.addHint(RaidHint.instance);
- this.addAbility(ability, new PlayerAttackedWatcher());
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(new SacrificeSourceEffect())
+ .withInterveningIf(condition).addHint(RaidHint.instance), new PlayerAttackedWatcher());
}
private SeeRed(final SeeRed card) {
diff --git a/Mage.Sets/src/mage/cards/s/SelkieHedgeMage.java b/Mage.Sets/src/mage/cards/s/SelkieHedgeMage.java
index ff49fea0ee2..49b6fc221ef 100644
--- a/Mage.Sets/src/mage/cards/s/SelkieHedgeMage.java
+++ b/Mage.Sets/src/mage/cards/s/SelkieHedgeMage.java
@@ -1,12 +1,11 @@
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.cards.CardImpl;
@@ -14,29 +13,33 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledPermanent;
import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.common.FilterLandPermanent;
import mage.filter.predicate.permanent.TappedPredicate;
import mage.target.TargetPermanent;
+import java.util.UUID;
+
/**
* @author jeffwadsworth
*/
public final class SelkieHedgeMage extends CardImpl {
- private static final FilterLandPermanent filter = new FilterLandPermanent("Forests");
- private static final FilterLandPermanent filter2 = new FilterLandPermanent("Islands");
- private static final FilterCreaturePermanent filter3 = new FilterCreaturePermanent("tapped creature");
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterControlledPermanent(SubType.FOREST, "you control two or more Forests"),
+ ComparisonType.MORE_THAN, 1
+ );
+ private static final Condition condition2 = new PermanentsOnTheBattlefieldCondition(
+ new FilterControlledPermanent(SubType.ISLAND, "you control two or more Islands"),
+ ComparisonType.MORE_THAN, 1
+ );
+ private static final FilterPermanent filter = new FilterCreaturePermanent("tapped creature");
static {
- filter.add(SubType.FOREST.getPredicate());
- filter2.add(SubType.ISLAND.getPredicate());
- filter3.add(TappedPredicate.TAPPED);
+ filter.add(TappedPredicate.TAPPED);
}
- private static final String rule1 = "When {this} enters, if you control two or more Forests, you may gain 3 life.";
- private static final String rule2 = "When {this} enters, if you control two or more Islands, you may return target tapped creature to its owner's hand.";
-
public SelkieHedgeMage(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G/U}");
this.subtype.add(SubType.MERFOLK);
@@ -48,14 +51,12 @@ public final class SelkieHedgeMage extends CardImpl {
this.toughness = new MageInt(2);
// When Selkie Hedge-Mage enters the battlefield, if you control two or more Forests, you may gain 3 life.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3), true), new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1), rule1);
- this.addAbility(ability);
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3), true).withInterveningIf(condition));
// When Selkie Hedge-Mage enters the battlefield, if you control two or more Islands, you may return target tapped creature to its owner's hand.
- Ability ability2 = new ConditionalInterveningIfTriggeredAbility(new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), true), new PermanentsOnTheBattlefieldCondition(filter2, ComparisonType.MORE_THAN, 1), rule2);
- ability2.addTarget(new TargetPermanent(filter3));
- this.addAbility(ability2);
-
+ Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), true).withInterveningIf(condition2);
+ ability.addTarget(new TargetPermanent(filter));
+ this.addAbility(ability);
}
private SelkieHedgeMage(final SelkieHedgeMage card) {
diff --git a/Mage.Sets/src/mage/cards/s/SentinelsMark.java b/Mage.Sets/src/mage/cards/s/SentinelsMark.java
index 6598b4ceaa6..faaaa248f20 100644
--- a/Mage.Sets/src/mage/cards/s/SentinelsMark.java
+++ b/Mage.Sets/src/mage/cards/s/SentinelsMark.java
@@ -4,7 +4,6 @@ import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.AddendumCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
@@ -37,23 +36,19 @@ public final class SentinelsMark extends CardImpl {
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
- Ability ability = new EnchantAbility(auraTarget);
- this.addAbility(ability);
+ this.addAbility(new EnchantAbility(auraTarget));
// Enchanted creature gets +1/+2 and has vigilance.
- ability = new SimpleStaticAbility(new BoostEnchantedEffect(1, 2));
+ Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect(1, 2));
ability.addEffect(new GainAbilityAttachedEffect(
VigilanceAbility.getInstance(), AttachmentType.AURA
).setText("and has vigilance"));
this.addAbility(ability);
// Addendum — When Sentinel's Mark enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new GainAbilityAttachedEffect(
- LifelinkAbility.getInstance(), AttachmentType.AURA, Duration.EndOfTurn
- )), AddendumCondition.instance, "
Addendum — When {this} enters, " +
- "if you cast it during your main phase, enchanted creature gains lifelink until end of turn."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new GainAbilityAttachedEffect(
+ LifelinkAbility.getInstance(), AttachmentType.AURA, Duration.EndOfTurn
+ )).withInterveningIf(AddendumCondition.instance).setAbilityWord(AbilityWord.ADDENDUM));
}
private SentinelsMark(final SentinelsMark card) {
diff --git a/Mage.Sets/src/mage/cards/s/SenuKeenEyedProtector.java b/Mage.Sets/src/mage/cards/s/SenuKeenEyedProtector.java
index 9d2dde61317..33f7e4756e8 100644
--- a/Mage.Sets/src/mage/cards/s/SenuKeenEyedProtector.java
+++ b/Mage.Sets/src/mage/cards/s/SenuKeenEyedProtector.java
@@ -7,7 +7,6 @@ import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.common.SourceInExileCondition;
import mage.abilities.costs.common.ExileSourceCost;
import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.keyword.ScryEffect;
@@ -17,8 +16,7 @@ import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
-import mage.filter.FilterPermanent;
-import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@@ -30,13 +28,6 @@ import java.util.UUID;
*/
public final class SenuKeenEyedProtector extends CardImpl {
- private static final FilterPermanent filter =
- new FilterControlledCreaturePermanent("a legendary creature you control");
-
- static {
- filter.add(SuperType.LEGENDARY.getPredicate());
- }
-
public SenuKeenEyedProtector(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
@@ -53,24 +44,15 @@ public final class SenuKeenEyedProtector extends CardImpl {
this.addAbility(VigilanceAbility.getInstance());
// {T}, Exile Senu, Keen-Eyed Protector: You gain 2 life and scry 2.
- Ability ability = new SimpleActivatedAbility(
- new GainLifeEffect(2),
- new TapSourceCost()
- );
+ Ability ability = new SimpleActivatedAbility(new GainLifeEffect(2), new TapSourceCost());
ability.addCost(new ExileSourceCost());
ability.addEffect(new ScryEffect(2).concatBy("and"));
this.addAbility(ability);
// When a legendary creature you control attacks and isn't blocked, if Senu is exiled, put it onto the battlefield attacking.
- this.addAbility(
- new ConditionalInterveningIfTriggeredAbility(
- new AttacksAndIsNotBlockedAllTriggeredAbility(
- Zone.EXILED, new SenuKeenEyedProtectorEffect(), filter
- ), SourceInExileCondition.instance,
- "When a legendary creature you control attacks and isn't blocked, "
- + "if {this} is exiled, put it onto the battlefield attacking"
- )
- );
+ this.addAbility(new AttacksAndIsNotBlockedAllTriggeredAbility(
+ Zone.EXILED, new SenuKeenEyedProtectorEffect(), StaticFilters.FILTER_CONTROLLED_CREATURE_LEGENDARY
+ ).withInterveningIf(SourceInExileCondition.instance).setTriggerPhrase("When a legendary creature you control attacks and isn't blocked, "));
}
private SenuKeenEyedProtector(final SenuKeenEyedProtector card) {
@@ -113,5 +95,4 @@ class SenuKeenEyedProtectorEffect extends OneShotEffect {
}
return true;
}
-
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/cards/s/SergeantAtArms.java b/Mage.Sets/src/mage/cards/s/SergeantAtArms.java
index 2ef8849f74a..22ce6abd788 100644
--- a/Mage.Sets/src/mage/cards/s/SergeantAtArms.java
+++ b/Mage.Sets/src/mage/cards/s/SergeantAtArms.java
@@ -1,11 +1,8 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.KickerAbility;
import mage.cards.CardImpl;
@@ -14,8 +11,9 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.game.permanent.token.SoldierToken;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class SergeantAtArms extends CardImpl {
@@ -32,9 +30,8 @@ public final class SergeantAtArms extends CardImpl {
this.addAbility(new KickerAbility("{2}{W}"));
// When Sergeant-at-Arms enters the battlefield, if it was kicked, create two 1/1 white soldier creature tokens.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new SoldierToken(), 2)), KickedCondition.ONCE,
- "When {this} enters, if it was kicked, create two 1/1 white Soldier creature tokens."));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new SoldierToken(), 2))
+ .withInterveningIf(KickedCondition.ONCE));
}
private SergeantAtArms(final SergeantAtArms card) {
diff --git a/Mage.Sets/src/mage/cards/s/ServantOfTheStinger.java b/Mage.Sets/src/mage/cards/s/ServantOfTheStinger.java
index ce1d397992b..ebd6817ab4f 100644
--- a/Mage.Sets/src/mage/cards/s/ServantOfTheStinger.java
+++ b/Mage.Sets/src/mage/cards/s/ServantOfTheStinger.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.condition.common.CommittedCrimeCondition;
import mage.abilities.costs.common.SacrificeSourceCost;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
import mage.abilities.keyword.DeathtouchAbility;
@@ -34,16 +33,9 @@ public final class ServantOfTheStinger extends CardImpl {
this.addAbility(DeathtouchAbility.getInstance());
// Whenever Servant of the Stinger deals combat damage to a player, if you've committed a crime this turn, you may sacrifice Servant of the Stinger. If you do, search your library for a card, put it into your hand, then shuffle.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new DealsCombatDamageToAPlayerTriggeredAbility(
- new DoIfCostPaid(
- new SearchLibraryPutInHandEffect(new TargetCardInLibrary(), false),
- new SacrificeSourceCost()
- ), false
- ), CommittedCrimeCondition.instance, "Whenever {this} deals combat damage to a player, " +
- "if you've committed a crime this turn, you may sacrifice {this}. If you do, " +
- "search your library for a card, put it into your hand, then shuffle."
- ).addHint(CommittedCrimeCondition.getHint()), new CommittedCrimeWatcher());
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DoIfCostPaid(
+ new SearchLibraryPutInHandEffect(new TargetCardInLibrary(), false), new SacrificeSourceCost()
+ )).withInterveningIf(CommittedCrimeCondition.instance).addHint(CommittedCrimeCondition.getHint()), new CommittedCrimeWatcher());
}
private ServantOfTheStinger(final ServantOfTheStinger card) {
diff --git a/Mage.Sets/src/mage/cards/s/SettlementBlacksmith.java b/Mage.Sets/src/mage/cards/s/SettlementBlacksmith.java
index 08e8d1b21a9..49d8c5862d6 100644
--- a/Mage.Sets/src/mage/cards/s/SettlementBlacksmith.java
+++ b/Mage.Sets/src/mage/cards/s/SettlementBlacksmith.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.hint.ConditionHint;
import mage.abilities.hint.Hint;
@@ -21,8 +20,10 @@ import java.util.UUID;
*/
public final class SettlementBlacksmith extends CardImpl {
- private static final Condition condition = new PermanentsOnTheBattlefieldCondition(new FilterControlledPermanent(SubType.EQUIPMENT));
- private static final Hint hint = new ConditionHint(condition, "You control an Equipment");
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterControlledPermanent(SubType.EQUIPMENT, "you control an Equipment")
+ );
+ private static final Hint hint = new ConditionHint(condition);
public SettlementBlacksmith(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
@@ -33,10 +34,8 @@ public final class SettlementBlacksmith extends CardImpl {
this.toughness = new MageInt(3);
// When Settlement Blacksmith enters the battlefield, if you control an Equipment, draw a card.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)),
- condition, "When {this} enters, if you control an Equipment, draw a card."
- ).addHint(hint));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))
+ .withInterveningIf(condition).addHint(hint));
}
private SettlementBlacksmith(final SettlementBlacksmith card) {
diff --git a/Mage.Sets/src/mage/cards/s/ShadowbornDemon.java b/Mage.Sets/src/mage/cards/s/ShadowbornDemon.java
index 6afac6d2232..e350e6d1288 100644
--- a/Mage.Sets/src/mage/cards/s/ShadowbornDemon.java
+++ b/Mage.Sets/src/mage/cards/s/ShadowbornDemon.java
@@ -1,16 +1,15 @@
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.InvertCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.condition.common.CardsInControllerGraveyardCondition;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.SacrificeControllerEffect;
import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -18,13 +17,11 @@ import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
-import mage.game.Game;
-import mage.players.Player;
-import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class ShadowbornDemon extends CardImpl {
@@ -35,6 +32,11 @@ public final class ShadowbornDemon extends CardImpl {
filter.add(Predicates.not(SubType.DEMON.getPredicate()));
}
+ private static final Condition condition = new InvertCondition(
+ new CardsInControllerGraveyardCondition(6, StaticFilters.FILTER_CARD_CREATURE),
+ "there are fewer than six creature cards in your graveyard"
+ );
+
public ShadowbornDemon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
this.subtype.add(SubType.DEMON);
@@ -44,18 +46,16 @@ public final class ShadowbornDemon extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
+
// When Shadowborn Demon enters the battlefield, destroy target non-Demon creature.
Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(), false);
- Target target = new TargetCreaturePermanent(filter);
- ability.addTarget(target);
+ ability.addTarget(new TargetCreaturePermanent(filter));
this.addAbility(ability);
// At the beginning of your upkeep, if there are fewer than six creature cards in your graveyard, sacrifice a creature.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect(StaticFilters.FILTER_PERMANENT_CREATURE, 1, "")),
- new InvertCondition(new CreatureCardsInControllerGraveyardCondition(6)),
- "At the beginning of your upkeep, if there are fewer than six creature cards in your graveyard, sacrifice a creature"));
-
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect(
+ StaticFilters.FILTER_PERMANENT_CREATURE, 1, ""
+ )).withInterveningIf(condition));
}
private ShadowbornDemon(final ShadowbornDemon card) {
@@ -67,21 +67,3 @@ public final class ShadowbornDemon extends CardImpl {
return new ShadowbornDemon(this);
}
}
-
-class CreatureCardsInControllerGraveyardCondition implements Condition {
-
- private int value;
-
- public CreatureCardsInControllerGraveyardCondition(int value) {
- this.value = value;
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player p = game.getPlayer(source.getControllerId());
- if (p != null && p.getGraveyard().count(StaticFilters.FILTER_CARD_CREATURE, game) >= value) {
- return true;
- }
- return false;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/s/ShardOfTheNightbringer.java b/Mage.Sets/src/mage/cards/s/ShardOfTheNightbringer.java
index 084e52c4b16..04e66dc53b7 100644
--- a/Mage.Sets/src/mage/cards/s/ShardOfTheNightbringer.java
+++ b/Mage.Sets/src/mage/cards/s/ShardOfTheNightbringer.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.CastFromEverywhereSourceCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
@@ -34,12 +33,8 @@ public final class ShardOfTheNightbringer extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Drain Life -- When Shard of the Nightbringer enters the battlefield, if you cast it, target opponent loses half their life, rounded up. You gain life equal to the life lost this way.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new ShardOfTheNightbringerEffect()),
- CastFromEverywhereSourceCondition.instance, "When {this} enters, " +
- "if you cast it, target opponent loses half their life, rounded up. " +
- "You gain life equal to the life lost this way."
- );
+ Ability ability = new EntersBattlefieldTriggeredAbility(new ShardOfTheNightbringerEffect())
+ .withInterveningIf(CastFromEverywhereSourceCondition.instance);
ability.addTarget(new TargetOpponent());
this.addAbility(ability.withFlavorWord("Drain Life"));
}
@@ -58,6 +53,7 @@ class ShardOfTheNightbringerEffect extends OneShotEffect {
ShardOfTheNightbringerEffect() {
super(Outcome.Benefit);
+ staticText = "target opponent loses half their life, rounded up. You gain life equal to the life lost this way";
}
private ShardOfTheNightbringerEffect(final ShardOfTheNightbringerEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/s/ShatterskullCharger.java b/Mage.Sets/src/mage/cards/s/ShatterskullCharger.java
index 626b8bac5a0..2ca8b1bde0f 100644
--- a/Mage.Sets/src/mage/cards/s/ShatterskullCharger.java
+++ b/Mage.Sets/src/mage/cards/s/ShatterskullCharger.java
@@ -1,18 +1,17 @@
package mage.cards.s;
import mage.MageInt;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.InvertCondition;
import mage.abilities.condition.common.KickedCondition;
import mage.abilities.condition.common.SourceHasCounterCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.ReturnToHandSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.KickerAbility;
import mage.abilities.keyword.TrampleAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -26,8 +25,10 @@ import java.util.UUID;
*/
public final class ShatterskullCharger extends CardImpl {
- private static final Condition condition
- = new InvertCondition(new SourceHasCounterCondition(CounterType.P1P1, 1));
+ private static final Condition condition = new InvertCondition(
+ new SourceHasCounterCondition(CounterType.P1P1),
+ "{this} doesn't have a +1/+1 counter on it"
+ );
public ShatterskullCharger(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}");
@@ -53,12 +54,8 @@ public final class ShatterskullCharger extends CardImpl {
));
// At the beginning of your end step, if Shatterskull Charger doesn't have a +1/+1 counter on it, return it to its owner's hand.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- new ReturnToHandSourceEffect(true)
- ), condition, "At the beginning of your end step, " +
- "if {this} doesn't have a +1/+1 counter on it, return it to its owner's hand."
- ));
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(new ReturnToHandSourceEffect(true)
+ .setText("return it to its owner's hand")).withInterveningIf(condition));
}
private ShatterskullCharger(final ShatterskullCharger card) {
diff --git a/Mage.Sets/src/mage/cards/s/ShelteredValley.java b/Mage.Sets/src/mage/cards/s/ShelteredValley.java
index dce04980f72..cbc92e8cb01 100644
--- a/Mage.Sets/src/mage/cards/s/ShelteredValley.java
+++ b/Mage.Sets/src/mage/cards/s/ShelteredValley.java
@@ -1,53 +1,53 @@
-
package mage.cards.s;
-import java.util.UUID;
-import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.common.SacrificeAllCost;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
-import mage.abilities.effects.Effect;
import mage.abilities.effects.common.EnterBattlefieldPayCostOrPutGraveyardEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.mana.ColorlessManaAbility;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Zone;
import mage.filter.FilterPermanent;
-import mage.filter.StaticFilters;
+import mage.filter.common.FilterControlledLandPermanent;
import mage.filter.predicate.mageobject.NamePredicate;
+import java.util.UUID;
+
/**
- *
* @author anonymous
*/
public final class ShelteredValley extends CardImpl {
- private static final FilterPermanent filterShelteredValley = new FilterPermanent("permanent named Sheltered Valley");
+ private static final FilterPermanent filter = new FilterPermanent("permanent named Sheltered Valley");
static {
- filterShelteredValley.add(new NamePredicate("Sheltered Valley"));
+ filter.add(new NamePredicate("Sheltered Valley"));
}
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterControlledLandPermanent("you control three or fewer lands"),
+ ComparisonType.FEWER_THAN, 4
+ );
+
public ShelteredValley(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.LAND},"");
+ super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// If Sheltered Valley would enter the battlefield, instead sacrifice each other permanent named Sheltered Valley you control, then put Sheltered Valley onto the battlefield.
- Effect effect = new EnterBattlefieldPayCostOrPutGraveyardEffect(new SacrificeAllCost(filterShelteredValley));
- effect.setText("If {this} would enter the battlefield, instead sacrifice each other permanent named {this} you control, then put {this} onto the battlefield.");
- Ability ability = new SimpleStaticAbility(Zone.ALL, effect);
- this.addAbility(ability);
+ this.addAbility(new SimpleStaticAbility(
+ Zone.ALL, new EnterBattlefieldPayCostOrPutGraveyardEffect(new SacrificeAllCost(filter))
+ .setText("If {this} would enter the battlefield, instead sacrifice each other " +
+ "permanent named Sheltered Valley you control, then put {this} onto the battlefield.")
+ ));
// At the beginning of your upkeep, if you control three or fewer lands, you gain 1 life.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(new GainLifeEffect(1)),
- new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 4),
- "At the beginning of your upkeep, if you control three or fewer lands, you gain 1 life."
- ));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new GainLifeEffect(1)).withInterveningIf(condition));
+
// {tap}: Add {C}.
this.addAbility(new ColorlessManaAbility());
}
diff --git a/Mage.Sets/src/mage/cards/s/ShimmerDragon.java b/Mage.Sets/src/mage/cards/s/ShimmerDragon.java
index 9ae87af2f08..c081b3b5e3f 100644
--- a/Mage.Sets/src/mage/cards/s/ShimmerDragon.java
+++ b/Mage.Sets/src/mage/cards/s/ShimmerDragon.java
@@ -7,10 +7,9 @@ import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.common.TapTargetCost;
import mage.abilities.decorator.ConditionalContinuousEffect;
-import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
-import mage.abilities.hint.ValueHint;
+import mage.abilities.hint.common.ArtifactYouControlHint;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HexproofAbility;
import mage.cards.CardImpl;
@@ -57,7 +56,7 @@ public final class ShimmerDragon extends CardImpl {
new GainAbilitySourceEffect(
HexproofAbility.getInstance(), Duration.WhileOnBattlefield
), condition, "as long as you control four or more artifacts, {this} has hexproof"
- )).addHint(new ValueHint("Artifacts you control", new PermanentsOnBattlefieldCount(StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT))));
+ )).addHint(ArtifactYouControlHint.instance));
// Tap two untapped artifacts you control: Draw a card.
this.addAbility(new SimpleActivatedAbility(
diff --git a/Mage.Sets/src/mage/cards/s/ShipwreckLooter.java b/Mage.Sets/src/mage/cards/s/ShipwreckLooter.java
index 6554a283d52..ea1566702b3 100644
--- a/Mage.Sets/src/mage/cards/s/ShipwreckLooter.java
+++ b/Mage.Sets/src/mage/cards/s/ShipwreckLooter.java
@@ -1,10 +1,8 @@
package mage.cards.s;
import mage.MageInt;
-import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.RaidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.hint.common.RaidHint;
import mage.cards.CardImpl;
@@ -30,12 +28,9 @@ public final class ShipwreckLooter extends CardImpl {
this.toughness = new MageInt(1);
// Raid - When Shipwreck Looter enters the battlefield,if you attacked this turn, you may draw a card. If you do, discard a card.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new DrawDiscardControllerEffect(1, 1, true)),
- RaidCondition.instance, "When {this} enters, if you attacked this turn, you may draw a card. If you do, discard a card.");
- ability.setAbilityWord(AbilityWord.RAID);
- ability.addHint(RaidHint.instance);
- this.addAbility(ability, new PlayerAttackedWatcher());
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new DrawDiscardControllerEffect(1, 1, true)
+ ).withInterveningIf(RaidCondition.instance).setAbilityWord(AbilityWord.RAID).addHint(RaidHint.instance), new PlayerAttackedWatcher());
}
private ShipwreckLooter(final ShipwreckLooter card) {
diff --git a/Mage.Sets/src/mage/cards/s/ShivanEmissary.java b/Mage.Sets/src/mage/cards/s/ShivanEmissary.java
index 81b3324fd03..25ddd5a3bb3 100644
--- a/Mage.Sets/src/mage/cards/s/ShivanEmissary.java
+++ b/Mage.Sets/src/mage/cards/s/ShivanEmissary.java
@@ -1,11 +1,9 @@
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.keyword.KickerAbility;
import mage.cards.CardImpl;
@@ -15,15 +13,15 @@ import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
-/**
- *
- * @author LoneFox
+import java.util.UUID;
+/**
+ * @author LoneFox
*/
public final class ShivanEmissary extends CardImpl {
public ShivanEmissary(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.HUMAN);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(1);
@@ -31,11 +29,11 @@ public final class ShivanEmissary extends CardImpl {
// Kicker {1}{B}
this.addAbility(new KickerAbility("{1}{B}"));
+
// When Shivan Emissary enters the battlefield, if it was kicked, destroy target nonblack creature. It can't be regenerated.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(true));
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(true)).withInterveningIf(KickedCondition.ONCE);
ability.addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK));
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, KickedCondition.ONCE,
- "When {this} enters, if it was kicked, destroy target nonblack creature. It can't be regenerated."));
+ this.addAbility(ability);
}
private ShivanEmissary(final ShivanEmissary card) {
diff --git a/Mage.Sets/src/mage/cards/s/ShorelineSalvager.java b/Mage.Sets/src/mage/cards/s/ShorelineSalvager.java
index 38ad087b989..9270605cec6 100644
--- a/Mage.Sets/src/mage/cards/s/ShorelineSalvager.java
+++ b/Mage.Sets/src/mage/cards/s/ShorelineSalvager.java
@@ -1,42 +1,38 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.TargetController;
-import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledPermanent;
+
+import java.util.UUID;
/**
- *
* @author jeffwadsworth
*/
public final class ShorelineSalvager extends CardImpl {
- private static final String rule = "Whenever Shoreline Salvager deals combat damage to a player, if you control an Island, you may draw a card.";
- private static final FilterPermanent filter = new FilterPermanent("Island");
-
- static {
- filter.add(TargetController.YOU.getControllerPredicate());
- filter.add(SubType.ISLAND.getPredicate());
- }
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterControlledPermanent(SubType.ISLAND, "you control an Island")
+ );
public ShorelineSalvager(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.SURRAKAR);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// Whenever Shoreline Salvager deals combat damage to a player, if you control an Island, you may draw a card.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), true), new PermanentsOnTheBattlefieldCondition(filter), rule));
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
+ new DrawCardSourceControllerEffect(1), true
+ ).withInterveningIf(condition));
}
private ShorelineSalvager(final ShorelineSalvager card) {
diff --git a/Mage.Sets/src/mage/cards/s/ShriekingAffliction.java b/Mage.Sets/src/mage/cards/s/ShriekingAffliction.java
index 48f03a95d9a..4d05b10c6ed 100644
--- a/Mage.Sets/src/mage/cards/s/ShriekingAffliction.java
+++ b/Mage.Sets/src/mage/cards/s/ShriekingAffliction.java
@@ -1,9 +1,9 @@
package mage.cards.s;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.CardsInHandCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.LoseLifeTargetEffect;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -19,18 +19,15 @@ import java.util.UUID;
public final class ShriekingAffliction extends CardImpl {
+ private static final Condition condition = new CardsInHandCondition(ComparisonType.FEWER_THAN, 2, TargetController.ACTIVE);
+
public ShriekingAffliction(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}");
// At the beginning of each opponent's upkeep, if that player has one or fewer cards in hand, they lose 3 life.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(
- Zone.BATTLEFIELD, TargetController.OPPONENT, new LoseLifeTargetEffect(3),
- false
- ),
- new CardsInHandCondition(ComparisonType.FEWER_THAN, 2, TargetController.ACTIVE),
- "At the beginning of each opponent's upkeep, if that player has one or fewer cards in hand, they lose 3 life."
- ));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(
+ Zone.BATTLEFIELD, TargetController.OPPONENT, new LoseLifeTargetEffect(3), false
+ ).withInterveningIf(condition));
}
private ShriekingAffliction(final ShriekingAffliction card) {
diff --git a/Mage.Sets/src/mage/cards/s/ShriekingGrotesque.java b/Mage.Sets/src/mage/cards/s/ShriekingGrotesque.java
index 6838417befd..7a94f4e5de5 100644
--- a/Mage.Sets/src/mage/cards/s/ShriekingGrotesque.java
+++ b/Mage.Sets/src/mage/cards/s/ShriekingGrotesque.java
@@ -1,41 +1,37 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.ManaWasSpentCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.discard.DiscardTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.ColoredManaSymbol;
import mage.target.TargetPlayer;
-/**
- *
- * @author LoneFox
+import java.util.UUID;
+/**
+ * @author LoneFox
*/
public final class ShriekingGrotesque extends CardImpl {
public ShriekingGrotesque(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.GARGOYLE);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
// Flying
this.addAbility(FlyingAbility.getInstance());
+
// When Shrieking Grotesque enters the battlefield, if {B} was spent to cast it, target player discards a card.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(1), false);
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(1)).withInterveningIf(ManaWasSpentCondition.BLACK);
ability.addTarget(new TargetPlayer());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, ManaWasSpentCondition.BLACK,
- "When {this} enters, if {B} was spent to cast it, target player discards a card."));
+ this.addAbility(ability);
}
private ShriekingGrotesque(final ShriekingGrotesque card) {
diff --git a/Mage.Sets/src/mage/cards/s/ShrikeHarpy.java b/Mage.Sets/src/mage/cards/s/ShrikeHarpy.java
index d42df20b9c5..56e650c90e5 100644
--- a/Mage.Sets/src/mage/cards/s/ShrikeHarpy.java
+++ b/Mage.Sets/src/mage/cards/s/ShrikeHarpy.java
@@ -1,12 +1,9 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.TributeNotPaidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.SacrificeEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TributeAbility;
@@ -17,14 +14,15 @@ import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.target.common.TargetOpponent;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class ShrikeHarpy extends CardImpl {
public ShrikeHarpy(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
this.subtype.add(SubType.HARPY);
this.power = new MageInt(2);
@@ -37,10 +35,11 @@ public final class ShrikeHarpy extends CardImpl {
this.addAbility(new TributeAbility(2));
// When Shrike Harpy enters the battlefield, if tribute wasn't paid, target opponent sacrifices a creature.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new SacrificeEffect(StaticFilters.FILTER_PERMANENT_A_CREATURE, 1, "target opponent"), false);
+ Ability ability = new EntersBattlefieldTriggeredAbility(new SacrificeEffect(
+ StaticFilters.FILTER_PERMANENT_A_CREATURE, 1, "target opponent"
+ )).withInterveningIf(TributeNotPaidCondition.instance);
ability.addTarget(new TargetOpponent());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, TributeNotPaidCondition.instance,
- "When {this} enters, if tribute wasn't paid, target opponent sacrifices a creature."));
+ this.addAbility(ability);
}
private ShrikeHarpy(final ShrikeHarpy card) {
diff --git a/Mage.Sets/src/mage/cards/s/SickleDancer.java b/Mage.Sets/src/mage/cards/s/SickleDancer.java
index ab3a5a2e01e..336cbb92189 100644
--- a/Mage.Sets/src/mage/cards/s/SickleDancer.java
+++ b/Mage.Sets/src/mage/cards/s/SickleDancer.java
@@ -1,32 +1,34 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
-import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
import mage.filter.common.FilterTeamPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class SickleDancer extends CardImpl {
- private static final FilterTeamPermanent filter = new FilterTeamPermanent(SubType.WARRIOR, "Warrior creature");
+ private static final FilterPermanent filter = new FilterTeamPermanent(SubType.WARRIOR, "your team controls another Warrior");
static {
filter.add(AnotherPredicate.instance);
}
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, false);
+
public SickleDancer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
@@ -36,11 +38,7 @@ public final class SickleDancer extends CardImpl {
this.toughness = new MageInt(2);
// Whenever Sickle Dancer attacks, if your team controls another Warrior, Sickle Dancer gets +1/+1 until end of turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), false),
- new PermanentsOnTheBattlefieldCondition(filter),
- "Whenever {this} attacks, if your team controls another Warrior, {this} gets +1/+1 until end of turn."
- ));
+ this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn)).withInterveningIf(condition));
}
private SickleDancer(final SickleDancer card) {
diff --git a/Mage.Sets/src/mage/cards/s/SidarJabariOfZhalfir.java b/Mage.Sets/src/mage/cards/s/SidarJabariOfZhalfir.java
index 4637e7c0c48..d9074173f7c 100644
--- a/Mage.Sets/src/mage/cards/s/SidarJabariOfZhalfir.java
+++ b/Mage.Sets/src/mage/cards/s/SidarJabariOfZhalfir.java
@@ -5,7 +5,6 @@ import mage.abilities.Ability;
import mage.abilities.common.AttacksWithCreaturesTriggeredAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.condition.common.SourceOnBattlefieldOrCommandZoneCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.keyword.FirstStrikeAbility;
@@ -13,6 +12,8 @@ import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
+import mage.filter.FilterCard;
+import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreatureCard;
import mage.filter.common.FilterCreaturePermanent;
import mage.target.common.TargetCardInYourGraveyard;
@@ -24,8 +25,8 @@ import java.util.UUID;
*/
public final class SidarJabariOfZhalfir extends CardImpl {
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.KNIGHT, "Knights");
- private static final FilterCreatureCard filter2 = new FilterCreatureCard("Knight creature card from your graveyard");
+ private static final FilterPermanent filter = new FilterCreaturePermanent(SubType.KNIGHT, "Knights");
+ private static final FilterCard filter2 = new FilterCreatureCard("Knight creature card from your graveyard");
static {
filter2.add(SubType.KNIGHT.getPredicate());
@@ -40,15 +41,9 @@ public final class SidarJabariOfZhalfir extends CardImpl {
// Eminence — Whenever you attack with one or more Knights, if Sidar Jabari of Zhalfir
// is in the command zone or on the battlefield, draw a card, then discard a card.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new AttacksWithCreaturesTriggeredAbility(
- Zone.ALL, new DrawDiscardControllerEffect(), 1, filter
- ), SourceOnBattlefieldOrCommandZoneCondition.instance,
- "Whenever you attack with one or more Knights, if {this} is in the command" +
- " zone or on the battlefield, draw a card, then discard a card"
- );
- ability.setAbilityWord(AbilityWord.EMINENCE);
- this.addAbility(ability);
+ this.addAbility(new AttacksWithCreaturesTriggeredAbility(
+ Zone.ALL, new DrawDiscardControllerEffect(), 1, filter
+ ).withInterveningIf(SourceOnBattlefieldOrCommandZoneCondition.instance).setAbilityWord(AbilityWord.EMINENCE));
// Flying
this.addAbility(FlyingAbility.getInstance());
@@ -58,7 +53,7 @@ public final class SidarJabariOfZhalfir extends CardImpl {
// Whenever Sidar Jabari deals combat damage to a player, return target
// Knight creature card from your graveyard to the battlefield.
- ability = new DealsCombatDamageToAPlayerTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), false);
+ Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect());
ability.addTarget(new TargetCardInYourGraveyard(filter2));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/s/SigardaChampionOfLight.java b/Mage.Sets/src/mage/cards/s/SigardaChampionOfLight.java
index cf5c3ded1d3..ddbd314d2b4 100644
--- a/Mage.Sets/src/mage/cards/s/SigardaChampionOfLight.java
+++ b/Mage.Sets/src/mage/cards/s/SigardaChampionOfLight.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.CovenCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.hint.common.CovenHint;
@@ -53,12 +52,9 @@ public final class SigardaChampionOfLight extends CardImpl {
// Coven — Whenever Sigarda attacks, if you control three or more creatures with different powers,
// look at the top five cards of your library. You may reveal a Human creature card from among them and put it into your hand.
// Put the rest on the bottom of your library in a random order.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new LookLibraryAndPickControllerEffect(5, 1, filter2, PutCards.HAND, PutCards.BOTTOM_RANDOM)), CovenCondition.instance, "Whenever {this} attacks, " +
- "if you control three or more creatures with different powers, look at the top five cards " +
- "of your library. You may reveal a Human creature card from among them and put it into your hand. " +
- "Put the rest on the bottom of your library in a random order."
- ).addHint(CovenHint.instance).setAbilityWord(AbilityWord.COVEN));
+ this.addAbility(new AttacksTriggeredAbility(new LookLibraryAndPickControllerEffect(
+ 5, 1, filter2, PutCards.HAND, PutCards.BOTTOM_RANDOM
+ )).withInterveningIf(CovenCondition.instance).addHint(CovenHint.instance).setAbilityWord(AbilityWord.COVEN));
}
private SigardaChampionOfLight(final SigardaChampionOfLight card) {
diff --git a/Mage.Sets/src/mage/cards/s/SigardianSavior.java b/Mage.Sets/src/mage/cards/s/SigardianSavior.java
index 2537c68fe14..f7329c6df72 100644
--- a/Mage.Sets/src/mage/cards/s/SigardianSavior.java
+++ b/Mage.Sets/src/mage/cards/s/SigardianSavior.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.CastFromEverywhereSourceCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
@@ -42,12 +41,8 @@ public final class SigardianSavior extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// When Sigardian Savior enters the battlefield, if you cast it, return up to two target creature cards with mana value 2 or less from your graveyard to the battlefield.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect()),
- CastFromEverywhereSourceCondition.instance, "When {this} enters, " +
- "if you cast it, return up to two target creature cards with mana value " +
- "2 or less from your graveyard to the battlefield."
- );
+ Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect())
+ .withInterveningIf(CastFromEverywhereSourceCondition.instance);
ability.addTarget(new TargetCardInYourGraveyard(0, 2, filter));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/s/SilversmoteGhoul.java b/Mage.Sets/src/mage/cards/s/SilversmoteGhoul.java
index e9402b91165..2201dc939d1 100644
--- a/Mage.Sets/src/mage/cards/s/SilversmoteGhoul.java
+++ b/Mage.Sets/src/mage/cards/s/SilversmoteGhoul.java
@@ -2,17 +2,16 @@ package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.YouGainedLifeCondition;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect;
import mage.abilities.hint.ConditionHint;
import mage.abilities.hint.Hint;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@@ -26,7 +25,7 @@ import java.util.UUID;
public final class SilversmoteGhoul extends CardImpl {
private static final Condition condition = new YouGainedLifeCondition(ComparisonType.MORE_THAN, 2);
- private static final Hint hint = new ConditionHint(condition, "You gained 3 or more life this turn");
+ private static final Hint hint = new ConditionHint(condition);
public SilversmoteGhoul(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
@@ -37,12 +36,10 @@ public final class SilversmoteGhoul extends CardImpl {
this.toughness = new MageInt(1);
// At the beginning of your end step, if you gained 3 or more life this turn, return Silversmote Ghoul from your graveyard to the battlefield tapped.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- Zone.GRAVEYARD, TargetController.YOU, new ReturnSourceFromGraveyardToBattlefieldEffect(true),
- false, null
- ), condition, "At the beginning of your end step, " +
- "if you gained 3 or more life this turn, return {this} from your graveyard to the battlefield tapped."
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ Zone.GRAVEYARD, TargetController.YOU,
+ new ReturnSourceFromGraveyardToBattlefieldEffect(true),
+ false, condition
).addHint(hint), new PlayerGainedLifeWatcher());
// {1}{B}, Sacrifice Silversmote Ghoul: Draw a card.
diff --git a/Mage.Sets/src/mage/cards/s/SirenOfTheFangedCoast.java b/Mage.Sets/src/mage/cards/s/SirenOfTheFangedCoast.java
index fde54270672..32669c02d3b 100644
--- a/Mage.Sets/src/mage/cards/s/SirenOfTheFangedCoast.java
+++ b/Mage.Sets/src/mage/cards/s/SirenOfTheFangedCoast.java
@@ -1,30 +1,28 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.TributeNotPaidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TributeAbility;
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.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class SirenOfTheFangedCoast extends CardImpl {
public SirenOfTheFangedCoast(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}");
this.subtype.add(SubType.SIREN);
this.power = new MageInt(1);
@@ -32,13 +30,16 @@ public final class SirenOfTheFangedCoast extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
+
// Tribute 3
this.addAbility(new TributeAbility(3));
+
// When Siren of the Fanged Coast enters the battlefield, if tribute wasn't paid, gain control of target creature.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new GainControlTargetEffect(Duration.EndOfGame, true), false);
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new GainControlTargetEffect(Duration.EndOfGame, true)
+ ).withInterveningIf(TributeNotPaidCondition.instance);
ability.addTarget(new TargetCreaturePermanent());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, TributeNotPaidCondition.instance,
- "When {this} enters, if tribute wasn't paid, gain control of target creature."));
+ this.addAbility(ability);
}
private SirenOfTheFangedCoast(final SirenOfTheFangedCoast card) {
diff --git a/Mage.Sets/src/mage/cards/s/SithAssassin.java b/Mage.Sets/src/mage/cards/s/SithAssassin.java
index 1397decf45f..af5f02d43c9 100644
--- a/Mage.Sets/src/mage/cards/s/SithAssassin.java
+++ b/Mage.Sets/src/mage/cards/s/SithAssassin.java
@@ -1,22 +1,22 @@
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.HateCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.constants.AbilityWord;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import mage.watchers.common.LifeLossOtherFromCombatWatcher;
+import java.util.UUID;
+
/**
- *
* @author Styxo
*/
public final class SithAssassin extends CardImpl {
@@ -29,12 +29,9 @@ public final class SithAssassin extends CardImpl {
this.toughness = new MageInt(2);
// Hate — When Sith Assassin enters the battlefield, if opponent lost life from source other than combat damage this turn, you may destroy target nonblack creature.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(), true),
- HateCondition.instance,
- "Hate — When {this} enters, if an opponent lost life from a source other than combat damage this turn, you may destroy target nonblack creature.");
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(), true).withInterveningIf(HateCondition.instance);
ability.addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK));
- this.addAbility(ability, new LifeLossOtherFromCombatWatcher());
+ this.addAbility(ability.setAbilityWord(AbilityWord.HATE), new LifeLossOtherFromCombatWatcher());
}
private SithAssassin(final SithAssassin card) {
diff --git a/Mage.Sets/src/mage/cards/s/SithInquisitor.java b/Mage.Sets/src/mage/cards/s/SithInquisitor.java
index e48e1af2e19..0c2c3782520 100644
--- a/Mage.Sets/src/mage/cards/s/SithInquisitor.java
+++ b/Mage.Sets/src/mage/cards/s/SithInquisitor.java
@@ -1,40 +1,36 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.HateCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.discard.DiscardTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.constants.AbilityWord;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.target.TargetPlayer;
import mage.watchers.common.LifeLossOtherFromCombatWatcher;
+import java.util.UUID;
+
/**
- *
* @author Styxo
*/
public final class SithInquisitor extends CardImpl {
public SithInquisitor(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.HUMAN);
this.subtype.add(SubType.SITH);
this.power = new MageInt(5);
this.toughness = new MageInt(1);
// Hate — When Sith Assassin enters the battlefield, if opponent lost life from source other than combat damage this turn, target player discard a card at random.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(1, true)),
- HateCondition.instance,
- "Hate — When {this} enters, if an opponent lost life from a source other then combat damage this turn, target player discard a card at random.");
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(1, true)).withInterveningIf(HateCondition.instance);
ability.addTarget(new TargetPlayer());
- this.addAbility(ability, new LifeLossOtherFromCombatWatcher());
+ this.addAbility(ability.setAbilityWord(AbilityWord.HATE), new LifeLossOtherFromCombatWatcher());
}
private SithInquisitor(final SithInquisitor card) {
diff --git a/Mage.Sets/src/mage/cards/s/SithMagic.java b/Mage.Sets/src/mage/cards/s/SithMagic.java
index 989072d96ca..90cb27d82ad 100644
--- a/Mage.Sets/src/mage/cards/s/SithMagic.java
+++ b/Mage.Sets/src/mage/cards/s/SithMagic.java
@@ -1,13 +1,9 @@
package mage.cards.s;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
-import mage.abilities.TriggeredAbility;
-import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
import mage.abilities.condition.common.HateCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.ReplacementEffectImpl;
@@ -15,14 +11,11 @@ import mage.abilities.effects.common.ExileTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.LifelinkAbility;
+import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.TargetController;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.GameEvent;
@@ -34,8 +27,9 @@ import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;
import mage.watchers.common.LifeLossOtherFromCombatWatcher;
+import java.util.UUID;
+
/**
- *
* @author Styxo
*/
public final class SithMagic extends CardImpl {
@@ -44,14 +38,10 @@ public final class SithMagic extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}{B}{R}");
// Hate — At the beggining of each combat, if opponent lost life from a source other than combat damage this turn, you may return target card from a graveyard to the battlefield under your control. It gains lifelink and haste. Exile it at the beginning of the next end step or if it would leave the battlefield.
- TriggeredAbility triggeredAbility = new BeginningOfCombatTriggeredAbility(TargetController.ANY, new SithMagicEffect(), true);
- triggeredAbility.addEffect(new SithMagicReplacementEffect());
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- triggeredAbility,
- HateCondition.instance,
- "Hate — At the beggining of each combat, if opponent lost life from a source other than combat damage this turn, you may return target card from a graveyard to the battlefield under your control. It gains lifelink and haste. Exile it at the beginning of the next end step or if it would leave the battlefield.");
+ Ability ability = new BeginningOfCombatTriggeredAbility(TargetController.ANY, new SithMagicEffect(), true).withInterveningIf(HateCondition.instance);
+ ability.addEffect(new SithMagicReplacementEffect());
ability.addTarget(new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURE));
- this.addAbility(ability, new LifeLossOtherFromCombatWatcher());
+ this.addAbility(ability.setAbilityWord(AbilityWord.HATE), new LifeLossOtherFromCombatWatcher());
}
private SithMagic(final SithMagic card) {
diff --git a/Mage.Sets/src/mage/cards/s/SithMarauder.java b/Mage.Sets/src/mage/cards/s/SithMarauder.java
index 0f1f55859d7..1738795c9ff 100644
--- a/Mage.Sets/src/mage/cards/s/SithMarauder.java
+++ b/Mage.Sets/src/mage/cards/s/SithMarauder.java
@@ -1,22 +1,21 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.HateCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.constants.AbilityWord;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.target.common.TargetAnyTarget;
import mage.watchers.common.LifeLossOtherFromCombatWatcher;
+import java.util.UUID;
+
/**
- *
* @author Styxo
*/
public final class SithMarauder extends CardImpl {
@@ -29,12 +28,9 @@ public final class SithMarauder extends CardImpl {
this.toughness = new MageInt(4);
// Hate — When Sith Marauder enters the battlefield, if an opponent lost life from a source other than combat damage this turn, Sith Marauder deals 3 damage to any target.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(3)),
- HateCondition.instance,
- "Hate — When {this} enters, if an opponent lost life from a source other than combat damage this turn, {this} deals 3 damage to any target");
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(3)).withInterveningIf(HateCondition.instance);
ability.addTarget(new TargetAnyTarget());
- this.addAbility(ability, new LifeLossOtherFromCombatWatcher());
+ this.addAbility(ability.setAbilityWord(AbilityWord.HATE), new LifeLossOtherFromCombatWatcher());
}
private SithMarauder(final SithMarauder card) {
diff --git a/Mage.Sets/src/mage/cards/s/SithMindseer.java b/Mage.Sets/src/mage/cards/s/SithMindseer.java
index 34791594942..7d3b67c3cf3 100644
--- a/Mage.Sets/src/mage/cards/s/SithMindseer.java
+++ b/Mage.Sets/src/mage/cards/s/SithMindseer.java
@@ -1,32 +1,28 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.HateCondition;
-import mage.abilities.condition.common.SourceRemainsInZoneCondition;
-import mage.abilities.decorator.ConditionalContinuousEffect;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.constants.AbilityWord;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Duration;
-import mage.constants.Zone;
+import mage.constants.SubType;
import mage.target.common.TargetCreaturePermanent;
import mage.watchers.common.LifeLossOtherFromCombatWatcher;
+import java.util.UUID;
+
/**
- *
* @author Styxo
*/
public final class SithMindseer extends CardImpl {
public SithMindseer(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{U}{B}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}{B}{R}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.SITH);
this.power = new MageInt(3);
@@ -34,16 +30,12 @@ public final class SithMindseer extends CardImpl {
// Hate — When Sith Mindseer enters the battlefield, if an opponent loses life from a source other than combat damage,
// gain control of target creature for as long as Sith Mindseer remains on the battlefield.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new ConditionalContinuousEffect(
- new GainControlTargetEffect(Duration.Custom, true),
- new SourceRemainsInZoneCondition(Zone.BATTLEFIELD),
- "gain control of target creature for as long as {this} remains on the battlefield")),
- HateCondition.instance,
- "Hate — When {this} enters, if an opponent loses life from a source other than combat damage,"
- + " gain control of target creature for as long as {this} remains on the battlefield.");
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new GainControlTargetEffect(Duration.UntilSourceLeavesBattlefield, true)
+ .setText("gain control of target creature for as long as {this} remains on the battlefield")
+ ).withInterveningIf(HateCondition.instance);
ability.addTarget(new TargetCreaturePermanent());
- this.addAbility(ability, new LifeLossOtherFromCombatWatcher());
+ this.addAbility(ability.setAbilityWord(AbilityWord.HATE), new LifeLossOtherFromCombatWatcher());
}
private SithMindseer(final SithMindseer card) {
diff --git a/Mage.Sets/src/mage/cards/s/SithSorcerer.java b/Mage.Sets/src/mage/cards/s/SithSorcerer.java
index 97fad762a32..1b21d145d04 100644
--- a/Mage.Sets/src/mage/cards/s/SithSorcerer.java
+++ b/Mage.Sets/src/mage/cards/s/SithSorcerer.java
@@ -1,28 +1,27 @@
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.Ability;
import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.HateCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.keyword.ScryEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.constants.AbilityWord;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.watchers.common.LifeLossOtherFromCombatWatcher;
+import java.util.UUID;
+
/**
- *
* @author Styxo
*/
public final class SithSorcerer extends CardImpl {
public SithSorcerer(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.HUMAN);
this.subtype.add(SubType.SITH);
this.power = new MageInt(2);
@@ -32,12 +31,8 @@ public final class SithSorcerer extends CardImpl {
this.addAbility(new EntersBattlefieldTriggeredAbility(new ScryEffect(2)));
// Hate — When Sith Sorcerer enters the battlefield, if an opponent lost life from a source other than combat damage this turn, draw a card.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new DiesSourceTriggeredAbility(new DrawCardSourceControllerEffect(1)),
- HateCondition.instance,
- "Hate — When {this} dies, if an opponent lost life from a source other than combat damage this turn, draw a card.");
- this.addAbility(ability, new LifeLossOtherFromCombatWatcher());
-
+ this.addAbility(new DiesSourceTriggeredAbility(new DrawCardSourceControllerEffect(1))
+ .withInterveningIf(HateCondition.instance).setAbilityWord(AbilityWord.HATE), new LifeLossOtherFromCombatWatcher());
}
private SithSorcerer(final SithSorcerer card) {
diff --git a/Mage.Sets/src/mage/cards/s/SkitterbeamBattalion.java b/Mage.Sets/src/mage/cards/s/SkitterbeamBattalion.java
index 97bcaebafba..e63232362d0 100644
--- a/Mage.Sets/src/mage/cards/s/SkitterbeamBattalion.java
+++ b/Mage.Sets/src/mage/cards/s/SkitterbeamBattalion.java
@@ -3,7 +3,6 @@ package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.CastFromEverywhereSourceCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.CreateTokenCopySourceEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.PrototypeAbility;
@@ -37,11 +36,8 @@ public final class SkitterbeamBattalion extends CardImpl {
this.addAbility(HasteAbility.getInstance());
// When Skitterbeam Battalion enters the battlefield, if you cast it, create two tokens that are copies of it.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new CreateTokenCopySourceEffect(2)),
- CastFromEverywhereSourceCondition.instance, "When {this} enters, " +
- "if you cast it, create two tokens that are copies of it."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenCopySourceEffect(2)
+ .setText("create two tokens that are copies of it")).withInterveningIf(CastFromEverywhereSourceCondition.instance));
}
private SkitterbeamBattalion(final SkitterbeamBattalion card) {
diff --git a/Mage.Sets/src/mage/cards/s/Skizzik.java b/Mage.Sets/src/mage/cards/s/Skizzik.java
index ba22598c761..9dce90f4a7a 100644
--- a/Mage.Sets/src/mage/cards/s/Skizzik.java
+++ b/Mage.Sets/src/mage/cards/s/Skizzik.java
@@ -1,14 +1,14 @@
package mage.cards.s;
import mage.MageInt;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.InvertCondition;
import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.KickerAbility;
import mage.abilities.keyword.TrampleAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -18,11 +18,12 @@ import mage.constants.TargetController;
import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class Skizzik extends CardImpl {
+ private static final Condition condition = new InvertCondition(KickedCondition.ONCE, "{this} wasn't kicked");
+
public Skizzik(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
this.subtype.add(SubType.ELEMENTAL);
@@ -40,10 +41,8 @@ public final class Skizzik extends CardImpl {
this.addAbility(HasteAbility.getInstance());
// At the beginning of the end step, if Skizzik wasn't kicked, sacrifice it.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(TargetController.NEXT, new SacrificeSourceEffect(), false),
- new InvertCondition(KickedCondition.ONCE),
- "At the beginning of the end step, if {this} wasn't kicked, sacrifice it"
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ TargetController.NEXT, new SacrificeSourceEffect(), false, condition
));
}
diff --git a/Mage.Sets/src/mage/cards/s/SkyclaveRelic.java b/Mage.Sets/src/mage/cards/s/SkyclaveRelic.java
index cd303bd17a3..bfa00aa64cd 100644
--- a/Mage.Sets/src/mage/cards/s/SkyclaveRelic.java
+++ b/Mage.Sets/src/mage/cards/s/SkyclaveRelic.java
@@ -2,7 +2,6 @@ package mage.cards.s;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.CreateTokenCopySourceEffect;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.keyword.KickerAbility;
@@ -28,11 +27,8 @@ public final class SkyclaveRelic extends CardImpl {
this.addAbility(IndestructibleAbility.getInstance());
// When Skyclave Relic enters the battlefield, if it was kicked, create two tapped tokens that are copies of Skyclave Relic.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new CreateTokenCopySourceEffect(2, true)),
- KickedCondition.ONCE, "When {this} enters, if it was kicked, " +
- "create two tapped tokens that are copies of {this}."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenCopySourceEffect(2, true))
+ .withInterveningIf(KickedCondition.ONCE));
// {T}: Add one mana of any color.
this.addAbility(new AnyColorManaAbility());
diff --git a/Mage.Sets/src/mage/cards/s/SkyclaveShade.java b/Mage.Sets/src/mage/cards/s/SkyclaveShade.java
index 5b830fcf62a..f782c00a4f1 100644
--- a/Mage.Sets/src/mage/cards/s/SkyclaveShade.java
+++ b/Mage.Sets/src/mage/cards/s/SkyclaveShade.java
@@ -7,7 +7,6 @@ import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.LandfallAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.KickerAbility;
@@ -45,12 +44,8 @@ public final class SkyclaveShade extends CardImpl {
));
// Landfall — Whenever a land you control enters, if Skyclave Shade is in your graveyard and it's your turn, you may cast it from your graveyard this turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new LandfallAbility(Zone.GRAVEYARD, new SkyclaveShadeEffect(), false),
- SkyclaveShadeCondition.instance, "Landfall — Whenever a land " +
- "you control enters, if {this} is in your graveyard and it's your turn, " +
- "you may cast it from your graveyard this turn."
- ));
+ this.addAbility(new LandfallAbility(Zone.GRAVEYARD, new SkyclaveShadeEffect(), false)
+ .withInterveningIf(SkyclaveShadeCondition.instance));
}
private SkyclaveShade(final SkyclaveShade card) {
@@ -71,12 +66,18 @@ enum SkyclaveShadeCondition implements Condition {
return game.getActivePlayerId().equals(source.getControllerId())
&& game.getState().getZone(source.getSourceId()) == Zone.GRAVEYARD;
}
+
+ @Override
+ public String toString() {
+ return "{this} is in your graveyard and it's your turn";
+ }
}
class SkyclaveShadeEffect extends AsThoughEffectImpl {
SkyclaveShadeEffect() {
super(AsThoughEffectType.CAST_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit);
+ staticText = "you may cast it from your graveyard this turn";
}
private SkyclaveShadeEffect(final SkyclaveShadeEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/s/SkylineDespot.java b/Mage.Sets/src/mage/cards/s/SkylineDespot.java
index d8d73074e96..99f89a1fa8c 100644
--- a/Mage.Sets/src/mage/cards/s/SkylineDespot.java
+++ b/Mage.Sets/src/mage/cards/s/SkylineDespot.java
@@ -1,14 +1,13 @@
package mage.cards.s;
import mage.MageInt;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.MonarchIsSourceControllerCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.BecomesMonarchSourceEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.hint.common.MonarchHint;
import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -31,17 +30,13 @@ public final class SkylineDespot extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
+
// When Skyline Despot enters the battlefield, you become the monarch.
this.addAbility(new EntersBattlefieldTriggeredAbility(new BecomesMonarchSourceEffect()).addHint(MonarchHint.instance));
// At the beginning of your upkeep, if you're the monarch, put a 5/5 red Dragon creature token with flying onto the battlefield.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(
- new CreateTokenEffect(new DragonToken2()), false
- ), MonarchIsSourceControllerCondition.instance, "At the beginning of your upkeep, " +
- "if you're the monarch, create a 5/5 red Dragon creature token with flying."
- ));
-
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new DragonToken2()))
+ .withInterveningIf(MonarchIsSourceControllerCondition.instance));
}
private SkylineDespot(final SkylineDespot card) {
diff --git a/Mage.Sets/src/mage/cards/s/SlaughterhouseBouncer.java b/Mage.Sets/src/mage/cards/s/SlaughterhouseBouncer.java
index 8627abe95d4..317dd57d256 100644
--- a/Mage.Sets/src/mage/cards/s/SlaughterhouseBouncer.java
+++ b/Mage.Sets/src/mage/cards/s/SlaughterhouseBouncer.java
@@ -1,23 +1,21 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.condition.common.HellbentCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
-import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AbilityWord;
import mage.constants.CardType;
import mage.constants.Duration;
+import mage.constants.SubType;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class SlaughterhouseBouncer extends CardImpl {
@@ -31,13 +29,10 @@ public final class SlaughterhouseBouncer extends CardImpl {
this.toughness = new MageInt(3);
// Hellbent - When Slaughterhouse Bouncer dies, if you have no cards in hand, target creature gets -3/-3 until end of turn.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new DiesSourceTriggeredAbility(new BoostTargetEffect(-3, -3, Duration.EndOfTurn)),
- HellbentCondition.instance,
- AbilityWord.HELLBENT.formatWord() + "When {this} dies, if you have no cards in hand, target creature gets -3/-3 until end of turn."
- );
+ Ability ability = new DiesSourceTriggeredAbility(new BoostTargetEffect(-3, -3, Duration.EndOfTurn))
+ .withInterveningIf(HellbentCondition.instance);
ability.addTarget(new TargetCreaturePermanent());
- this.addAbility(ability);
+ this.addAbility(ability.setAbilityWord(AbilityWord.HELLBENT));
}
private SlaughterhouseBouncer(final SlaughterhouseBouncer card) {
diff --git a/Mage.Sets/src/mage/cards/s/SlinnVodaTheRisingDeep.java b/Mage.Sets/src/mage/cards/s/SlinnVodaTheRisingDeep.java
index 69914bc1fce..598b4389652 100644
--- a/Mage.Sets/src/mage/cards/s/SlinnVodaTheRisingDeep.java
+++ b/Mage.Sets/src/mage/cards/s/SlinnVodaTheRisingDeep.java
@@ -1,11 +1,8 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.ReturnToHandFromBattlefieldAllEffect;
import mage.abilities.keyword.KickerAbility;
import mage.cards.CardImpl;
@@ -16,8 +13,9 @@ import mage.constants.SuperType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class SlinnVodaTheRisingDeep extends CardImpl {
@@ -25,14 +23,11 @@ public final class SlinnVodaTheRisingDeep extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
static {
- filter.add(Predicates.not(
- Predicates.or(
- SubType.KRAKEN.getPredicate(),
- SubType.LEVIATHAN.getPredicate(),
- SubType.OCTOPUS.getPredicate(),
- SubType.MERFOLK.getPredicate(),
- SubType.SERPENT.getPredicate())
- ));
+ filter.add(Predicates.not(SubType.MERFOLK.getPredicate()));
+ filter.add(Predicates.not(SubType.KRAKEN.getPredicate()));
+ filter.add(Predicates.not(SubType.LEVIATHAN.getPredicate()));
+ filter.add(Predicates.not(SubType.OCTOPUS.getPredicate()));
+ filter.add(Predicates.not(SubType.SERPENT.getPredicate()));
}
public SlinnVodaTheRisingDeep(UUID ownerId, CardSetInfo setInfo) {
@@ -47,13 +42,11 @@ public final class SlinnVodaTheRisingDeep extends CardImpl {
this.addAbility(new KickerAbility("{1}{U}"));
// When Slinn Voda, the Rising Deep enters the battlefield, if it was kicked, return all creatures to their owners' hands except for Merfolk, Krakens, Leviathans, Octopuses, and Serpents.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new ReturnToHandFromBattlefieldAllEffect(filter)),
- KickedCondition.ONCE,
- "when {this} enters, if it was kicked, "
- + "return all creatures to their owners' hands except for "
- + "Merfolk, Krakens, Leviathans, Octopuses, and Serpents."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new ReturnToHandFromBattlefieldAllEffect(filter)
+ .setText("return all creatures to their owners' hands except for " +
+ "Merfolk, Krakens, Leviathans, Octopuses, and Serpents")
+ ).withInterveningIf(KickedCondition.ONCE));
}
private SlinnVodaTheRisingDeep(final SlinnVodaTheRisingDeep card) {
diff --git a/Mage.Sets/src/mage/cards/s/SmeltWardGatekeepers.java b/Mage.Sets/src/mage/cards/s/SmeltWardGatekeepers.java
index 1e74e613adc..61544fadbaa 100644
--- a/Mage.Sets/src/mage/cards/s/SmeltWardGatekeepers.java
+++ b/Mage.Sets/src/mage/cards/s/SmeltWardGatekeepers.java
@@ -3,39 +3,26 @@ package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.condition.Condition;
-import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.condition.common.YouControlTwoOrMoreGatesCondition;
import mage.abilities.effects.common.UntapTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
-import mage.abilities.hint.ConditionHint;
+import mage.abilities.hint.common.GatesYouControlHint;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
-import mage.filter.StaticFilters;
-import mage.filter.common.FilterControlledPermanent;
-import mage.target.Target;
-import mage.target.common.TargetCreaturePermanent;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.target.common.TargetOpponentsCreaturePermanent;
import java.util.UUID;
/**
* @author LevelX2
*/
-
-
public final class SmeltWardGatekeepers extends CardImpl {
- private static final FilterControlledPermanent filter = new FilterControlledPermanent();
-
- static {
- filter.add(SubType.GATE.getPredicate());
- }
-
- private static final Condition gatesCondition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1);
-
public SmeltWardGatekeepers(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
this.subtype.add(SubType.HUMAN);
@@ -45,16 +32,14 @@ public final class SmeltWardGatekeepers extends CardImpl {
this.toughness = new MageInt(4);
// When Smelt-Ward Gatekeepers enters the battlefield, if you control two or more Gates, gain control of target creature an opponent controls until end of turn. Untap that creature. That creature gains haste until end of turn.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new GainControlTargetEffect(Duration.EndOfTurn)),
- gatesCondition,
- "When {this} enters, if you control two or more Gates, gain control of target creature an opponent controls until end of turn. Untap that creature. It gains haste until end of turn.");
- ability.addEffect(new UntapTargetEffect());
- ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn));
- Target target = new TargetCreaturePermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE);
- ability.addTarget(target);
- ability.addHint(new ConditionHint(gatesCondition, "You control two or more Gates"));
- this.addAbility(ability);
+ Ability ability = new EntersBattlefieldTriggeredAbility(new GainControlTargetEffect(Duration.EndOfTurn))
+ .withInterveningIf(YouControlTwoOrMoreGatesCondition.instance);
+ ability.addEffect(new UntapTargetEffect().setText("untap that creature"));
+ ability.addEffect(new GainAbilityTargetEffect(
+ HasteAbility.getInstance(), Duration.EndOfTurn
+ ).setText("It gains haste until end of turn"));
+ ability.addTarget(new TargetOpponentsCreaturePermanent());
+ this.addAbility(ability.addHint(GatesYouControlHint.instance));
}
private SmeltWardGatekeepers(final SmeltWardGatekeepers card) {
diff --git a/Mage.Sets/src/mage/cards/s/SmirkingSpelljacker.java b/Mage.Sets/src/mage/cards/s/SmirkingSpelljacker.java
index 47a815e0176..c81d986891e 100644
--- a/Mage.Sets/src/mage/cards/s/SmirkingSpelljacker.java
+++ b/Mage.Sets/src/mage/cards/s/SmirkingSpelljacker.java
@@ -6,7 +6,6 @@ import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ExileTargetEffect;
import mage.abilities.effects.common.MayCastTargetCardEffect;
@@ -60,12 +59,7 @@ public final class SmirkingSpelljacker extends CardImpl {
this.addAbility(ability);
// Whenever Smirking Spelljacker attacks, if a card is exiled with it, you may cast the exiled card without paying its mana cost.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new SmirkingSpelljackerEffect()),
- SmirkingSpelljackerCondition.instance,
- "Whenever {this} attacks, if a card is exiled with it, "
- + "you may cast the exiled card without paying its mana cost."
- ));
+ this.addAbility(new AttacksTriggeredAbility(new SmirkingSpelljackerEffect()).withInterveningIf(SmirkingSpelljackerCondition.instance));
}
private SmirkingSpelljacker(final SmirkingSpelljacker card) {
@@ -90,7 +84,7 @@ enum SmirkingSpelljackerCondition implements Condition {
@Override
public String toString() {
- return "if a card is exiled with it";
+ return "a card is exiled with it";
}
}
@@ -126,4 +120,4 @@ class SmirkingSpelljackerEffect extends OneShotEffect {
return true;
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/cards/s/SnakeOfTheGoldenGrove.java b/Mage.Sets/src/mage/cards/s/SnakeOfTheGoldenGrove.java
index 0ce84366155..a7a4090dcf8 100644
--- a/Mage.Sets/src/mage/cards/s/SnakeOfTheGoldenGrove.java
+++ b/Mage.Sets/src/mage/cards/s/SnakeOfTheGoldenGrove.java
@@ -1,12 +1,8 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.TributeNotPaidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.keyword.TributeAbility;
import mage.cards.CardImpl;
@@ -14,25 +10,25 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class SnakeOfTheGoldenGrove extends CardImpl {
public SnakeOfTheGoldenGrove(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}");
this.subtype.add(SubType.SNAKE);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
- // Tribute 3
+ // Tribute 3
this.addAbility(new TributeAbility(3));
+
// When Snake of the Golden Grove enters the battlefield, if tribute wasn't paid, you gain 4 life.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new GainLifeEffect(4), false);
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, TributeNotPaidCondition.instance,
- "When {this} enters, if tribute wasn't paid, you gain 4 life."));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(4)).withInterveningIf(TributeNotPaidCondition.instance));
}
private SnakeOfTheGoldenGrove(final SnakeOfTheGoldenGrove card) {
diff --git a/Mage.Sets/src/mage/cards/s/SoShiny.java b/Mage.Sets/src/mage/cards/s/SoShiny.java
index b93d68566e8..3dd86bde66f 100644
--- a/Mage.Sets/src/mage/cards/s/SoShiny.java
+++ b/Mage.Sets/src/mage/cards/s/SoShiny.java
@@ -5,7 +5,6 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect;
import mage.abilities.effects.common.TapEnchantedEffect;
@@ -31,14 +30,14 @@ import java.util.UUID;
*/
public final class SoShiny extends CardImpl {
- private static final FilterPermanent filter = new FilterControlledPermanent();
+ private static final FilterPermanent filter = new FilterControlledPermanent("you control a token");
static {
filter.add(TokenPredicate.TRUE);
}
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter);
- private static final Hint hint = new ConditionHint(condition, "You control a token");
+ private static final Hint hint = new ConditionHint(condition);
public SoShiny(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}");
@@ -49,16 +48,11 @@ public final class SoShiny extends CardImpl {
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
- Ability ability = new EnchantAbility(auraTarget);
- this.addAbility(ability);
+ this.addAbility(new EnchantAbility(auraTarget));
// When So Shiny enters the battlefield, if you control a token, tap enchanted creature, then scry 2.
- ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect()),
- condition, "When {this} enters, " +
- "if you control a token, tap enchanted creature, then scry 2."
- );
- ability.addEffect(new ScryEffect(2));
+ Ability ability = new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect()).withInterveningIf(condition);
+ ability.addEffect(new ScryEffect(2).concatBy(", then"));
this.addAbility(ability.addHint(hint));
// Enchanted creature doesn't untap during its controller's untap step.
diff --git a/Mage.Sets/src/mage/cards/s/SokenzanRenegade.java b/Mage.Sets/src/mage/cards/s/SokenzanRenegade.java
index 18a06add7df..3383750f36d 100644
--- a/Mage.Sets/src/mage/cards/s/SokenzanRenegade.java
+++ b/Mage.Sets/src/mage/cards/s/SokenzanRenegade.java
@@ -1,25 +1,27 @@
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.abilities.keyword.BushidoAbility;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class SokenzanRenegade extends CardImpl {
@@ -36,12 +38,8 @@ public final class SokenzanRenegade extends CardImpl {
// At the beginning of your upkeep, if a player has more cards in hand than each other player,
// the player who has the most cards in hand gains control of Sokenzan Renegade.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(new SokenzanRenegadeEffect()),
- OnePlayerHasTheMostCards.instance,
- "At the beginning of your upkeep, if a player has more cards in hand than each other player, the player who has the most cards in hand gains control of {this}"
- ));
-
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SokenzanRenegadeEffect())
+ .withInterveningIf(OnePlayerHasTheMostCards.instance));
}
private SokenzanRenegade(final SokenzanRenegade card) {
diff --git a/Mage.Sets/src/mage/cards/s/SorinOfHouseMarkov.java b/Mage.Sets/src/mage/cards/s/SorinOfHouseMarkov.java
index 9064d66d8b2..42b23b62781 100644
--- a/Mage.Sets/src/mage/cards/s/SorinOfHouseMarkov.java
+++ b/Mage.Sets/src/mage/cards/s/SorinOfHouseMarkov.java
@@ -1,17 +1,15 @@
package mage.cards.s;
import mage.MageInt;
-import mage.constants.Pronoun;
-import mage.abilities.triggers.BeginningOfPostcombatMainTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.YouGainedLifeCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
import mage.abilities.hint.ConditionHint;
import mage.abilities.hint.Hint;
import mage.abilities.keyword.ExtortAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.TransformAbility;
+import mage.abilities.triggers.BeginningOfPostcombatMainTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@@ -25,7 +23,7 @@ import java.util.UUID;
public final class SorinOfHouseMarkov extends CardImpl {
private static final Condition condition = new YouGainedLifeCondition(ComparisonType.OR_GREATER, 3);
- private static final Hint hint = new ConditionHint(condition, "You gained 3 or more life this turn");
+ private static final Hint hint = new ConditionHint(condition);
public SorinOfHouseMarkov(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
@@ -46,14 +44,9 @@ public final class SorinOfHouseMarkov extends CardImpl {
// At the beginning of your postcombat main phase, if you gained 3 or more life this turn, exile Sorin of House Markov, then return him to the battlefield transformed under his owner's control.
this.addAbility(new TransformAbility());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfPostcombatMainTriggeredAbility(
- new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED, Pronoun.SHE),
- false
- ), condition, "At the beginning of your postcombat main phase, "
- + "if you gained 3 or more life this turn, exile {this}, "
- + "then return him to the battlefield transformed under his owner's control."
- ).addHint(hint), new PlayerGainedLifeWatcher());
+ this.addAbility(new BeginningOfPostcombatMainTriggeredAbility(
+ new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED, Pronoun.SHE), false
+ ).withInterveningIf(condition).addHint(hint), new PlayerGainedLifeWatcher());
}
private SorinOfHouseMarkov(final SorinOfHouseMarkov card) {
diff --git a/Mage.Sets/src/mage/cards/s/SoulSwallower.java b/Mage.Sets/src/mage/cards/s/SoulSwallower.java
index 53a2b1ca105..a6968c90ef4 100644
--- a/Mage.Sets/src/mage/cards/s/SoulSwallower.java
+++ b/Mage.Sets/src/mage/cards/s/SoulSwallower.java
@@ -1,20 +1,20 @@
package mage.cards.s;
-import java.util.UUID;
-
import mage.MageInt;
-import mage.abilities.dynamicvalue.common.CardTypesInGraveyardCount;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.condition.common.DeliriumCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.dynamicvalue.common.CardTypesInGraveyardCount;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.TrampleAbility;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.constants.AbilityWord;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.counters.CounterType;
+import java.util.UUID;
+
/**
* @author fireshoes
*/
@@ -30,12 +30,8 @@ public final class SoulSwallower extends CardImpl {
this.addAbility(TrampleAbility.getInstance());
// Delirium — At the beginning of your upkeep, if there are four or more card types among cards in your graveyard, put three +1/+1 counters on Soul Swallower.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(3))),
- DeliriumCondition.instance,
- "Delirium — At the beginning of your upkeep, if there are four or more card types among cards in your graveyard, "
- + "put three +1/+1 counters on Soul Swallower.")
- .addHint(CardTypesInGraveyardCount.YOU.getHint()));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(3)))
+ .withInterveningIf(DeliriumCondition.instance).setAbilityWord(AbilityWord.DELIRIUM).addHint(CardTypesInGraveyardCount.YOU.getHint()));
}
private SoulSwallower(final SoulSwallower card) {
diff --git a/Mage.Sets/src/mage/cards/s/SoulhunterRakshasa.java b/Mage.Sets/src/mage/cards/s/SoulhunterRakshasa.java
index d3b9c723caa..8930584ffee 100644
--- a/Mage.Sets/src/mage/cards/s/SoulhunterRakshasa.java
+++ b/Mage.Sets/src/mage/cards/s/SoulhunterRakshasa.java
@@ -5,17 +5,14 @@ import mage.abilities.Ability;
import mage.abilities.common.CantBlockAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.CastFromEverywhereSourceCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.Outcome;
import mage.constants.SubType;
-import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
-import mage.game.Game;
-import mage.players.Player;
import mage.target.common.TargetOpponent;
import mage.watchers.common.CastFromHandWatcher;
@@ -26,6 +23,8 @@ import java.util.UUID;
*/
public final class SoulhunterRakshasa extends CardImpl {
+ private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.SWAMP));
+
public SoulhunterRakshasa(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
this.subtype.add(SubType.DEMON);
@@ -37,10 +36,8 @@ public final class SoulhunterRakshasa extends CardImpl {
this.addAbility(new CantBlockAbility());
// When Soulhunter Rakshasa enters the battlefield, if you cast it from your hand, it deals 1 damage to target opponent for each Swamp you control.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new SoulhunterRakshasaEffect()),
- CastFromEverywhereSourceCondition.instance,
- "When {this} enters, if you cast it from your hand, it deals 1 damage to target opponent for each Swamp you control.");
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(xValue))
+ .withInterveningIf(CastFromEverywhereSourceCondition.instance);
ability.addTarget(new TargetOpponent());
this.addAbility(ability, new CastFromHandWatcher());
}
@@ -54,35 +51,3 @@ public final class SoulhunterRakshasa extends CardImpl {
return new SoulhunterRakshasa(this);
}
}
-
-class SoulhunterRakshasaEffect extends OneShotEffect {
-
- private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SWAMP);
-
- public SoulhunterRakshasaEffect() {
- super(Outcome.Damage);
- this.staticText = "{this} deals 1 damage to target opponent for each Swamp you control.";
- }
-
- private SoulhunterRakshasaEffect(final SoulhunterRakshasaEffect effect) {
- super(effect);
- }
-
- @Override
- public SoulhunterRakshasaEffect copy() {
- return new SoulhunterRakshasaEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- int amount = game.getBattlefield().count(filter, source.getControllerId(), source, game);
- if (amount > 0) {
- Player player = game.getPlayer(source.getFirstTarget());
- if (player != null) {
- player.damage(amount, source.getSourceId(), source, game);
- return true;
- }
- }
- return false;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/s/SowingMycospawn.java b/Mage.Sets/src/mage/cards/s/SowingMycospawn.java
index dc43d599d5f..ecdd609024b 100644
--- a/Mage.Sets/src/mage/cards/s/SowingMycospawn.java
+++ b/Mage.Sets/src/mage/cards/s/SowingMycospawn.java
@@ -3,7 +3,6 @@ package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CastSourceTriggeredAbility;
import mage.abilities.effects.common.ExileTargetEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
@@ -44,11 +43,7 @@ public final class SowingMycospawn extends CardImpl {
)));
// When you cast this spell, if it was kicked, exile target land.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new CastSourceTriggeredAbility(new ExileTargetEffect()),
- KickedCondition.ONCE, "When you cast this spell, " +
- "if it was kicked, exile target land."
- );
+ Ability ability = new CastSourceTriggeredAbility(new ExileTargetEffect()).withInterveningIf(KickedCondition.ONCE);
ability.addTarget(new TargetLandPermanent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/s/SpaceMarineScout.java b/Mage.Sets/src/mage/cards/s/SpaceMarineScout.java
index 4f87b52b5bf..ba9f9ba53b9 100644
--- a/Mage.Sets/src/mage/cards/s/SpaceMarineScout.java
+++ b/Mage.Sets/src/mage/cards/s/SpaceMarineScout.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.OpponentControlsMoreCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.VigilanceAbility;
@@ -46,12 +45,9 @@ public final class SpaceMarineScout extends CardImpl {
this.addAbility(VigilanceAbility.getInstance());
// Concealed Position -- When Space Marine Scout enters the battlefield, if an opponent controls more lands than you, you may search your library for a Plains card, put it onto the battlefield tapped, then shuffle.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(
- new TargetCardInLibrary(filter), true
- ), true), condition, "When {this} enters, if an opponent controls more lands " +
- "than you, you may search your library for a Plains card, put it onto the battlefield tapped, then shuffle."
- ).withFlavorWord("Concealed Position"));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), true
+ ).withInterveningIf(condition).withFlavorWord("Concealed Position"));
}
private SpaceMarineScout(final SpaceMarineScout card) {
diff --git a/Mage.Sets/src/mage/cards/s/SpinyStarfish.java b/Mage.Sets/src/mage/cards/s/SpinyStarfish.java
index a4b9a5b1f5e..74f9d145ae3 100644
--- a/Mage.Sets/src/mage/cards/s/SpinyStarfish.java
+++ b/Mage.Sets/src/mage/cards/s/SpinyStarfish.java
@@ -1,22 +1,26 @@
package mage.cards.s;
import mage.MageInt;
+import mage.MageObjectReference;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.RegenerateSourceEffect;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.TargetController;
+import mage.constants.WatcherScope;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.token.StarfishToken;
+import mage.util.CardUtil;
import mage.watchers.Watcher;
import java.util.HashMap;
@@ -38,16 +42,9 @@ public final class SpinyStarfish extends CardImpl {
this.addAbility(new SimpleActivatedAbility(new RegenerateSourceEffect(), new ManaCostsImpl<>("{U}")));
// At the beginning of each end step, if Spiny Starfish regenerated this turn, create a 0/1 blue Starfish creature token for each time it regenerated this turn.
- this.addAbility(
- new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- TargetController.ANY, new CreateTokenEffect(
- new StarfishToken(),
- new SpinyStarfishDynamicValue()),
- false),
- SpinyStarfishCondition.instance,
- "At the beginning of each end step, if {this} regenerated this turn, create a 0/1 blue Starfish creature token for each time it regenerated this turn."),
- new SpinyStarfishWatcher());
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ TargetController.ANY, new CreateTokenEffect(new StarfishToken(), SpinyStarfishValue.instance), false
+ ).withInterveningIf(SpinyStarfishCondition.instance), new SpinyStarfishWatcher());
}
private SpinyStarfish(final SpinyStarfish card) {
@@ -66,66 +63,26 @@ enum SpinyStarfishCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- SpinyStarfishWatcher watcher = game.getState().getWatcher(SpinyStarfishWatcher.class);
- return watcher != null && watcher.regeneratedCount(source.getSourceId()) != 0;
+ return SpinyStarfishWatcher.regeneratedCount(game, source) > 0;
}
@Override
public String toString() {
- return "if Spiny Starfish regenerated this turn";
+ return "{this} regenerated this turn";
}
-
}
-class SpinyStarfishWatcher extends Watcher {
-
- // Probably dumb to record all regeneration events, could just record this,
- // but not sure how to know what source this watcher is attached to.
- private final Map regeneratedCount = new HashMap<>();
-
- public SpinyStarfishWatcher() {
- super(WatcherScope.GAME);
- }
-
- @Override
- public void watch(GameEvent event, Game game) {
- if (event.getType() == GameEvent.EventType.REGENERATED) {
- UUID regeneratedId = event.getTargetId();
- Integer count = regeneratedCount.get(regeneratedId);
- if (count == null) {
- count = 0;
- }
- regeneratedCount.put(regeneratedId, ++count);
- }
- }
-
- @Override
- public void reset() {
- super.reset();
- regeneratedCount.clear();
- }
-
- public int regeneratedCount(UUID sourceId) {
- return regeneratedCount.getOrDefault(sourceId, 0);
- }
-
-}
-
-class SpinyStarfishDynamicValue implements DynamicValue {
+enum SpinyStarfishValue implements DynamicValue {
+ instance;
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
- SpinyStarfishWatcher watcher = game.getState().getWatcher(
- SpinyStarfishWatcher.class);
- if (watcher != null) {
- return watcher.regeneratedCount(sourceAbility.getSourceId());
- }
- return 0;
+ return SpinyStarfishWatcher.regeneratedCount(game, sourceAbility);
}
@Override
- public SpinyStarfishDynamicValue copy() {
- return new SpinyStarfishDynamicValue();
+ public SpinyStarfishValue copy() {
+ return this;
}
@Override
@@ -135,6 +92,35 @@ class SpinyStarfishDynamicValue implements DynamicValue {
@Override
public String getMessage() {
- return "time {this} regenerated this turn";
+ return "time it regenerated this turn";
+ }
+}
+
+class SpinyStarfishWatcher extends Watcher {
+
+ private final Map regeneratedCount = new HashMap<>();
+
+ public SpinyStarfishWatcher() {
+ super(WatcherScope.GAME);
+ }
+
+ @Override
+ public void watch(GameEvent event, Game game) {
+ if (event.getType() == GameEvent.EventType.REGENERATED) {
+ regeneratedCount.compute(new MageObjectReference(event.getTargetId(), game), CardUtil::setOrIncrementValue);
+ }
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ regeneratedCount.clear();
+ }
+
+ static int regeneratedCount(Game game, Ability source) {
+ return game.getState()
+ .getWatcher(SpinyStarfishWatcher.class)
+ .regeneratedCount
+ .getOrDefault(new MageObjectReference(source.getSourcePermanentOrLKI(game), game), 0);
}
}
diff --git a/Mage.Sets/src/mage/cards/s/SpiritMirror.java b/Mage.Sets/src/mage/cards/s/SpiritMirror.java
index 27046c43c6f..1e304c1d5e3 100644
--- a/Mage.Sets/src/mage/cards/s/SpiritMirror.java
+++ b/Mage.Sets/src/mage/cards/s/SpiritMirror.java
@@ -1,45 +1,45 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.mana.GenericManaCost;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.ComparisonType;
+import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.permanent.token.ReflectionToken;
import mage.target.TargetPermanent;
+import java.util.UUID;
+
/**
* @author LevelX2
*/
public final class SpiritMirror extends CardImpl {
- private static final FilterPermanent filterToken = new FilterPermanent(SubType.REFLECTION, "Reflection token");
+ private static final FilterPermanent filterToken = new FilterPermanent(SubType.REFLECTION, "there are no Reflection tokens on the battlefield");
private static final FilterPermanent filter = new FilterPermanent("Reflection");
static {
- filterToken.add(SubType.REFLECTION.getPredicate());
filterToken.add(TokenPredicate.TRUE);
filter.add(SubType.REFLECTION.getPredicate());
}
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filterToken, ComparisonType.EQUAL_TO, 0, false);
+
public SpiritMirror(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{W}");
// At the beginning of your upkeep, if there are no Reflection tokens on the battlefield, create a 2/2 white Reflection creature token.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new ReflectionToken())),
- new PermanentsOnTheBattlefieldCondition(filterToken, ComparisonType.EQUAL_TO, 0, false),
- "At the beginning of your upkeep, if there are no Reflection tokens on the battlefield, create a 2/2 white Reflection creature token."));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new ReflectionToken())).withInterveningIf(condition));
// {0}: Destroy target Reflection.
Ability ability = new SimpleActivatedAbility(new DestroyTargetEffect(), new GenericManaCost(0));
diff --git a/Mage.Sets/src/mage/cards/s/SpiritualSanctuary.java b/Mage.Sets/src/mage/cards/s/SpiritualSanctuary.java
index 81619d25157..cfdba3762b8 100644
--- a/Mage.Sets/src/mage/cards/s/SpiritualSanctuary.java
+++ b/Mage.Sets/src/mage/cards/s/SpiritualSanctuary.java
@@ -1,11 +1,9 @@
-
package mage.cards.s;
-import java.util.UUID;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.GainLifeTargetEffect;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -13,32 +11,28 @@ import mage.constants.SubType;
import mage.constants.TargetController;
import mage.filter.FilterPermanent;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class SpiritualSanctuary extends CardImpl {
- private static final FilterPermanent filter = new FilterPermanent();
+ private static final FilterPermanent filter = new FilterPermanent(SubType.PLAINS, "that player controls a Plains");
static {
- filter.add(SubType.PLAINS.getPredicate());
filter.add(TargetController.ACTIVE.getControllerPredicate());
}
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, false);
+
public SpiritualSanctuary(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{W}");
// At the beginning of each player's upkeep, if that player controls a Plains, they gain 1 life.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(
- TargetController.ANY, new GainLifeTargetEffect(1).setText("they gain 1 life"),
- false
- ),
- new PermanentsOnTheBattlefieldCondition(filter),
- "at the beginning of each player's upkeep, "
- + "if that player controls a Plains, they gain 1 life"
- ));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(
+ TargetController.ANY, new GainLifeTargetEffect(1).setText("they gain 1 life"), false
+ ).withInterveningIf(condition));
}
private SpiritualSanctuary(final SpiritualSanctuary card) {
diff --git a/Mage.Sets/src/mage/cards/s/SquadCommander.java b/Mage.Sets/src/mage/cards/s/SquadCommander.java
index a4974b9e741..821fec403b8 100644
--- a/Mage.Sets/src/mage/cards/s/SquadCommander.java
+++ b/Mage.Sets/src/mage/cards/s/SquadCommander.java
@@ -2,16 +2,15 @@ package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.FullPartyCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.PartyCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.hint.common.PartyCountHint;
import mage.abilities.keyword.IndestructibleAbility;
+import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -36,23 +35,19 @@ public final class SquadCommander extends CardImpl {
this.toughness = new MageInt(3);
// When Squad Commander enters the battlefield, create a 1/1 white Kor Warrior creature token for each creature in your party.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(
- new KorWarriorToken(), PartyCount.instance)
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new CreateTokenEffect(new KorWarriorToken(), PartyCount.instance)
).addHint(PartyCountHint.instance));
// At the beginning of combat on your turn, if you have a full party, creatures you control get +1/+0 and gain indestructible until end of turn.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfCombatTriggeredAbility(
- new BoostControlledEffect(
- 1, 0, Duration.EndOfTurn
- )
- ), FullPartyCondition.instance, "At the beginning of combat on your turn, " +
- "if you have a full party, creatures you control get +1/+0 and gain indestructible until end of turn."
- );
+ Ability ability = new BeginningOfCombatTriggeredAbility(
+ new BoostControlledEffect(1, 0, Duration.EndOfTurn)
+ .setText("creatures you control get +1/+0")
+ ).withInterveningIf(FullPartyCondition.instance);
ability.addEffect(new GainAbilityAllEffect(
IndestructibleAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_CONTROLLED_CREATURE
- ));
+ ).setText("and gain indestructible until end of turn"));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/s/StalkingYeti.java b/Mage.Sets/src/mage/cards/s/StalkingYeti.java
index 3a9d6cc6a87..e8a2d84cc3b 100644
--- a/Mage.Sets/src/mage/cards/s/StalkingYeti.java
+++ b/Mage.Sets/src/mage/cards/s/StalkingYeti.java
@@ -1,29 +1,23 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.SourceOnBattlefieldCondition;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ReturnToHandSourceEffect;
-import mage.constants.SubType;
-import mage.constants.SuperType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetOpponentsCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class StalkingYeti extends CardImpl {
@@ -37,18 +31,15 @@ public final class StalkingYeti extends CardImpl {
this.toughness = new MageInt(3);
// When Stalking Yeti enters the battlefield, if it's on the battlefield, it deals damage equal to its power to target creature an opponent controls and that creature deals damage equal to its power to Stalking Yeti.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new StalkingYetiEffect()),
- SourceOnBattlefieldCondition.instance,
- "When {this} enters, if it's on the battlefield, "
- + "it deals damage equal to its power to target creature an opponent controls "
- + "and that creature deals damage equal to its power to {this}."
- );
+ Ability ability = new EntersBattlefieldTriggeredAbility(new StalkingYetiEffect())
+ .withInterveningIf(SourceOnBattlefieldCondition.instance);
ability.addTarget(new TargetOpponentsCreaturePermanent());
this.addAbility(ability);
// {2}{snow}: Return Stalking Yeti to its owner's hand. Activate this ability only any time you could cast a sorcery.
- this.addAbility(new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(true), new ManaCostsImpl<>("{2}{S}")));
+ this.addAbility(new ActivateAsSorceryActivatedAbility(
+ Zone.BATTLEFIELD, new ReturnToHandSourceEffect(true), new ManaCostsImpl<>("{2}{S}")
+ ));
}
private StalkingYeti(final StalkingYeti card) {
@@ -86,6 +77,7 @@ class StalkingYetiEffect extends OneShotEffect {
return false;
}
thatCreature.damage(thisCreature.getPower().getValue(), thisCreature.getId(), source, game, false, true);
+ game.processAction();
thisCreature.damage(thatCreature.getPower().getValue(), thatCreature.getId(), source, game, false, true);
return true;
}
diff --git a/Mage.Sets/src/mage/cards/s/StalwartPathlighter.java b/Mage.Sets/src/mage/cards/s/StalwartPathlighter.java
index 5bc9270cbb8..16291ad8b2c 100644
--- a/Mage.Sets/src/mage/cards/s/StalwartPathlighter.java
+++ b/Mage.Sets/src/mage/cards/s/StalwartPathlighter.java
@@ -1,16 +1,18 @@
package mage.cards.s;
import mage.MageInt;
-import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.condition.common.CovenCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.hint.common.CovenHint;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.keyword.VigilanceAbility;
+import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.AbilityWord;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID;
@@ -32,14 +34,10 @@ public final class StalwartPathlighter extends CardImpl {
this.addAbility(VigilanceAbility.getInstance());
// Coven — At the beginning of combat on your turn, if you control three or more creatures with different powers, creatures you control gain indestructible until end of turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfCombatTriggeredAbility(new GainAbilityControlledEffect(
- IndestructibleAbility.getInstance(), Duration.EndOfTurn,
- StaticFilters.FILTER_CONTROLLED_CREATURE
- )), CovenCondition.instance, "At the beginning " +
- "of combat on your turn, if you control three or more creatures with different powers, " +
- "creatures you control gain indestructible until end of turn."
- ).addHint(CovenHint.instance).setAbilityWord(AbilityWord.COVEN));
+ this.addAbility(new BeginningOfCombatTriggeredAbility(new GainAbilityControlledEffect(
+ IndestructibleAbility.getInstance(), Duration.EndOfTurn,
+ StaticFilters.FILTER_PERMANENT_CREATURES
+ )).withInterveningIf(CovenCondition.instance).addHint(CovenHint.instance).setAbilityWord(AbilityWord.COVEN));
}
private StalwartPathlighter(final StalwartPathlighter card) {
diff --git a/Mage.Sets/src/mage/cards/s/StampedeRider.java b/Mage.Sets/src/mage/cards/s/StampedeRider.java
index b37887a022e..0ab8f2d272e 100644
--- a/Mage.Sets/src/mage/cards/s/StampedeRider.java
+++ b/Mage.Sets/src/mage/cards/s/StampedeRider.java
@@ -1,11 +1,11 @@
package mage.cards.s;
import mage.MageInt;
-import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.condition.common.FerociousCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.hint.common.FerociousHint;
import mage.abilities.keyword.TrampleAbility;
+import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -31,13 +31,9 @@ public final class StampedeRider extends CardImpl {
this.addAbility(TrampleAbility.getInstance());
// At the beginning of each combat, if you control a creature with power 4 or greater, Stampede Rider gets +1/+1 until end of turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfCombatTriggeredAbility(
- TargetController.ANY, new BoostSourceEffect(1, 1, Duration.EndOfTurn),
- false
- ), FerociousCondition.instance, "At the beginning of each combat, " +
- "if you control a creature with power 4 or greater, {this} gets +1/+1 until end of turn."
- ));
+ this.addAbility(new BeginningOfCombatTriggeredAbility(
+ TargetController.ANY, new BoostSourceEffect(1, 1, Duration.EndOfTurn), false
+ ).withInterveningIf(FerociousCondition.instance).addHint(FerociousHint.instance));
}
private StampedeRider(final StampedeRider card) {
diff --git a/Mage.Sets/src/mage/cards/s/StampedingElkHerd.java b/Mage.Sets/src/mage/cards/s/StampedingElkHerd.java
index f5b5a7bc4b7..6c54515a694 100644
--- a/Mage.Sets/src/mage/cards/s/StampedingElkHerd.java
+++ b/Mage.Sets/src/mage/cards/s/StampedingElkHerd.java
@@ -1,38 +1,35 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.condition.common.FormidableCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.constants.AbilityWord;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Duration;
-import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.constants.SubType;
+import mage.filter.StaticFilters;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class StampedingElkHerd extends CardImpl {
public StampedingElkHerd(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{G}");
this.subtype.add(SubType.ELK);
this.power = new MageInt(5);
this.toughness = new MageInt(5);
// Formidable — Whenever Stampeding Elk Herd attacks, if creatures you control have total power 8 or greater, creatures you control gain trample until end of turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent()), false),
- FormidableCondition.instance,
- "Formidable — Whenever {this} attacks, if creatures you control have total power 8 or greater, creatures you control gain trample until end of turn."
- ));
+ this.addAbility(new AttacksTriggeredAbility(new GainAbilityControlledEffect(
+ TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES
+ )).withInterveningIf(FormidableCondition.instance).setAbilityWord(AbilityWord.FORMIDABLE));
}
private StampedingElkHerd(final StampedingElkHerd card) {
diff --git a/Mage.Sets/src/mage/cards/s/StarforgedSword.java b/Mage.Sets/src/mage/cards/s/StarforgedSword.java
index 9f9d50aa5ca..52e1c6bd132 100644
--- a/Mage.Sets/src/mage/cards/s/StarforgedSword.java
+++ b/Mage.Sets/src/mage/cards/s/StarforgedSword.java
@@ -4,7 +4,6 @@ import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAttachToTarget;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.GiftWasPromisedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
import mage.abilities.effects.common.continuous.LoseAbilityAttachedEffect;
import mage.abilities.keyword.EquipAbility;
@@ -33,10 +32,7 @@ public final class StarforgedSword extends CardImpl {
this.addAbility(new GiftAbility(this, GiftType.TAPPED_FISH));
// When Starforged Sword enters, if the gift was promised, attach Starforged Sword to target creature you control.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldAttachToTarget(), GiftWasPromisedCondition.TRUE,
- "When {this} enters, if the gift was promised, attach {this} to target creature you control."
- ));
+ this.addAbility(new EntersBattlefieldAttachToTarget().withInterveningIf(GiftWasPromisedCondition.TRUE));
// Equipped creature gets +3/+3 and loses flying.
Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(3, 3));
diff --git a/Mage.Sets/src/mage/cards/s/StarscreamPowerHungry.java b/Mage.Sets/src/mage/cards/s/StarscreamPowerHungry.java
index 0e847a27e42..9000a352fdb 100644
--- a/Mage.Sets/src/mage/cards/s/StarscreamPowerHungry.java
+++ b/Mage.Sets/src/mage/cards/s/StarscreamPowerHungry.java
@@ -1,11 +1,10 @@
package mage.cards.s;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.CombatDamageDealtToYouTriggeredAbility;
import mage.abilities.common.DrawCardControllerTriggeredAbility;
import mage.abilities.condition.common.MonarchIsSourceControllerCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.hint.common.MonarchHint;
@@ -41,18 +40,14 @@ public final class StarscreamPowerHungry extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Whenever you draw a card, if you're the monarch, target opponent loses 2 life.
- TriggeredAbility trigger = new ConditionalInterveningIfTriggeredAbility(
- new DrawCardControllerTriggeredAbility(new LoseLifeTargetEffect(2), false),
- MonarchIsSourceControllerCondition.instance,
- "Whenever you draw a card, if you're the monarch, target opponent loses 2 life."
- );
- trigger.addTarget(new TargetOpponent());
- trigger.addHint(MonarchHint.instance);
- this.addAbility(trigger);
+ Ability ability = new DrawCardControllerTriggeredAbility(new LoseLifeTargetEffect(2), false)
+ .withInterveningIf(MonarchIsSourceControllerCondition.instance);
+ ability.addTarget(new TargetOpponent());
+ this.addAbility(ability.addHint(MonarchHint.instance));
// Whenever one or more creatures deal combat damage to you, convert Starscream.
this.addAbility(new CombatDamageDealtToYouTriggeredAbility(
- new TransformSourceEffect().setText("convert {this}")
+ new TransformSourceEffect().setText("convert {this}")
));
}
@@ -64,4 +59,4 @@ public final class StarscreamPowerHungry extends CardImpl {
public StarscreamPowerHungry copy() {
return new StarscreamPowerHungry(this);
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/cards/s/StarscreamSeekerLeader.java b/Mage.Sets/src/mage/cards/s/StarscreamSeekerLeader.java
index 094c85c01c4..e8f24856628 100644
--- a/Mage.Sets/src/mage/cards/s/StarscreamSeekerLeader.java
+++ b/Mage.Sets/src/mage/cards/s/StarscreamSeekerLeader.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.common.BecomesMonarchSourceControllerTriggeredAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.condition.common.MonarchIsNotSetCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.BecomesMonarchTargetEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.hint.common.MonarchHint;
@@ -48,15 +47,13 @@ public final class StarscreamSeekerLeader extends CardImpl {
this.addAbility(HasteAbility.getInstance());
// Whenever Starscream deals combat damage to a player, if there is no monarch, that player becomes the monarch.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new DealsCombatDamageToAPlayerTriggeredAbility(new BecomesMonarchTargetEffect(), false, true),
- MonarchIsNotSetCondition.instance,
- "Whenever {this} deals combat damage to a player, if there is no monarch, that player becomes the monarch."
- ).addHint(MonarchHint.instance));
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
+ new BecomesMonarchTargetEffect().setText("that player becomes the monarch"), false, true
+ ).withInterveningIf(MonarchIsNotSetCondition.instance).addHint(MonarchHint.instance));
// Whenever you become the monarch, convert Starscream.
this.addAbility(new BecomesMonarchSourceControllerTriggeredAbility(
- new TransformSourceEffect().setText("convert {this}")
+ new TransformSourceEffect().setText("convert {this}")
));
}
diff --git a/Mage.Sets/src/mage/cards/s/StarseerMentor.java b/Mage.Sets/src/mage/cards/s/StarseerMentor.java
index 5e4c4bb4674..790287eef7d 100644
--- a/Mage.Sets/src/mage/cards/s/StarseerMentor.java
+++ b/Mage.Sets/src/mage/cards/s/StarseerMentor.java
@@ -2,16 +2,15 @@ package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.condition.common.YouGainedOrLostLifeCondition;
import mage.abilities.costs.OrCost;
import mage.abilities.costs.common.DiscardCardCost;
import mage.abilities.costs.common.SacrificeTargetCost;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DoUnlessTargetPlayerOrTargetsControllerPaysEffect;
import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.VigilanceAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -42,24 +41,19 @@ public final class StarseerMentor extends CardImpl {
this.addAbility(VigilanceAbility.getInstance());
// At the beginning of your end step, if you gained or lost life this turn, target opponent loses 3 life unless they sacrifice a nonland permanent or discard a card.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(
- new LoseLifeTargetEffect(3),
- new OrCost(
- "sacrifice a nonland permanent or discard a card",
- new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_NON_LAND),
- new DiscardCardCost()
- ),
- "Sacrifice a nonland permanent or discard a card to prevent losing 3 life?"
- )
- ), YouGainedOrLostLifeCondition.instance, "At the beginning of your end step, if you gained or lost life this turn, "
- + "target opponent loses 3 life unless they sacrifice a nonland permanent of their choice or discard a card."
- );
+ Ability ability = new BeginningOfEndStepTriggeredAbility(
+ new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(
+ new LoseLifeTargetEffect(3),
+ new OrCost(
+ "sacrifice a nonland permanent or discard a card",
+ new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_NON_LAND),
+ new DiscardCardCost()
+ ),
+ "Sacrifice a nonland permanent or discard a card to prevent losing 3 life?"
+ )
+ ).withInterveningIf(YouGainedOrLostLifeCondition.instance);
ability.addTarget(new TargetOpponent());
- ability.addWatcher(new PlayerGainedLifeWatcher());
- ability.addHint(YouGainedOrLostLifeCondition.getHint());
- this.addAbility(ability);
+ this.addAbility(ability.addHint(YouGainedOrLostLifeCondition.getHint()), new PlayerGainedLifeWatcher());
}
private StarseerMentor(final StarseerMentor card) {
diff --git a/Mage.Sets/src/mage/cards/s/StarvingRevenant.java b/Mage.Sets/src/mage/cards/s/StarvingRevenant.java
index 8d0a80c749d..1479337add8 100644
--- a/Mage.Sets/src/mage/cards/s/StarvingRevenant.java
+++ b/Mage.Sets/src/mage/cards/s/StarvingRevenant.java
@@ -5,7 +5,6 @@ import mage.abilities.Ability;
import mage.abilities.common.DrawCardControllerTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.DescendCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeTargetEffect;
@@ -38,13 +37,8 @@ public final class StarvingRevenant extends CardImpl {
this.addAbility(new EntersBattlefieldTriggeredAbility(new StarvingRevenantEffect()));
// Descend 8 -- Whenever you draw a card, if there are eight or more permanent cards in your graveyard, target opponent loses 1 life and you gain 1 life.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new DrawCardControllerTriggeredAbility(new LoseLifeTargetEffect(1), false),
- DescendCondition.EIGHT, "Whenever you draw a card, "
- + "if there are eight or more permanent cards in your graveyard, "
- + "target opponent loses 1 life and you gain 1 life."
- );
- ability.addEffect(new GainLifeEffect(1));
+ Ability ability = new DrawCardControllerTriggeredAbility(new LoseLifeTargetEffect(1), false).withInterveningIf(DescendCondition.EIGHT);
+ ability.addEffect(new GainLifeEffect(1).concatBy("and"));
ability.addTarget(new TargetOpponent());
this.addAbility(ability.addHint(DescendCondition.getHint()).setAbilityWord(AbilityWord.DESCEND_8));
}
@@ -90,4 +84,4 @@ class StarvingRevenantEffect extends OneShotEffect {
return true;
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/cards/s/SteamcoreWeird.java b/Mage.Sets/src/mage/cards/s/SteamcoreWeird.java
index 852c4980643..b11ced49a24 100644
--- a/Mage.Sets/src/mage/cards/s/SteamcoreWeird.java
+++ b/Mage.Sets/src/mage/cards/s/SteamcoreWeird.java
@@ -1,37 +1,34 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.ManaWasSpentCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.ColoredManaSymbol;
import mage.target.common.TargetAnyTarget;
+import java.util.UUID;
+
/**
- *
* @author FenrisulfrX
*/
public final class SteamcoreWeird extends CardImpl {
public SteamcoreWeird(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}");
this.subtype.add(SubType.WEIRD);
this.power = new MageInt(1);
this.toughness = new MageInt(3);
// When Steamcore Weird enters the battlefield, if {R} was spent to cast Steamcore Weird, it deals 2 damage to any target.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2, "it"));
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2, "it"))
+ .withInterveningIf(ManaWasSpentCondition.RED);
ability.addTarget(new TargetAnyTarget());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, ManaWasSpentCondition.RED,
- "When {this} enters, if {R} was spent to cast it, it deals 2 damage to any target."));
+ this.addAbility(ability);
}
private SteamcoreWeird(final SteamcoreWeird card) {
diff --git a/Mage.Sets/src/mage/cards/s/StingingCaveCrawler.java b/Mage.Sets/src/mage/cards/s/StingingCaveCrawler.java
index b24f63945ed..03aa6835d48 100644
--- a/Mage.Sets/src/mage/cards/s/StingingCaveCrawler.java
+++ b/Mage.Sets/src/mage/cards/s/StingingCaveCrawler.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.condition.common.DescendCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.abilities.keyword.DeathtouchAbility;
@@ -33,12 +32,8 @@ public final class StingingCaveCrawler extends CardImpl {
this.addAbility(DeathtouchAbility.getInstance());
// Descend 4 -- Whenever Stinging Cave Crawler attacks, if there are four or more permanent cards in your graveyard, you draw a card and you lose 1 life.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new DrawCardSourceControllerEffect(1)),
- DescendCondition.FOUR, "Whenever {this} attacks, if there are four " +
- "or more permanent cards in your graveyard, you draw a card and you lose 1 life."
- );
- ability.addEffect(new LoseLifeSourceControllerEffect(1));
+ Ability ability = new AttacksTriggeredAbility(new DrawCardSourceControllerEffect(1, true)).withInterveningIf(DescendCondition.FOUR);
+ ability.addEffect(new LoseLifeSourceControllerEffect(1).concatBy("and"));
this.addAbility(ability.setAbilityWord(AbilityWord.DESCEND_4).addHint(DescendCondition.getHint()));
}
diff --git a/Mage.Sets/src/mage/cards/s/StoneHavenPilgrim.java b/Mage.Sets/src/mage/cards/s/StoneHavenPilgrim.java
index f1f2685ffb9..aa066ecc210 100644
--- a/Mage.Sets/src/mage/cards/s/StoneHavenPilgrim.java
+++ b/Mage.Sets/src/mage/cards/s/StoneHavenPilgrim.java
@@ -5,7 +5,6 @@ import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.LifelinkAbility;
@@ -14,7 +13,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
-import mage.filter.StaticFilters;
+import mage.filter.common.FilterArtifactOrEnchantmentPermanent;
import java.util.UUID;
@@ -23,8 +22,9 @@ import java.util.UUID;
*/
public final class StoneHavenPilgrim extends CardImpl {
- private static final Condition condition
- = new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT);
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterArtifactOrEnchantmentPermanent("you control an artifact or enchantment")
+ );
public StoneHavenPilgrim(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
@@ -35,13 +35,12 @@ public final class StoneHavenPilgrim extends CardImpl {
this.toughness = new MageInt(2);
// Whenever Stone Haven Pilgrim attacks, if you control an artifact or enchantment, Stone Haven Pilgrim gets +1/+1 and gains lifelink until end of turn.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(
- new BoostSourceEffect(1, 1, Duration.EndOfTurn), false
- ), condition, "Whenever {this} attacks, if you control an artifact or enchantment, " +
- "{this} gets +1/+1 and gains lifelink until end of turn."
- );
- ability.addEffect(new GainAbilitySourceEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn));
+ Ability ability = new AttacksTriggeredAbility(new BoostSourceEffect(
+ 1, 1, Duration.EndOfTurn
+ ).setText("{this} gets +1/+1")).withInterveningIf(condition);
+ ability.addEffect(new GainAbilitySourceEffect(
+ LifelinkAbility.getInstance(), Duration.EndOfTurn
+ ).setText("and gains lifelink until end of turn"));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/s/StormFleetArsonist.java b/Mage.Sets/src/mage/cards/s/StormFleetArsonist.java
index 48ee6857076..0f9895ad186 100644
--- a/Mage.Sets/src/mage/cards/s/StormFleetArsonist.java
+++ b/Mage.Sets/src/mage/cards/s/StormFleetArsonist.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.RaidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.SacrificeEffect;
import mage.abilities.hint.common.RaidHint;
import mage.cards.CardImpl;
@@ -12,7 +11,7 @@ import mage.cards.CardSetInfo;
import mage.constants.AbilityWord;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.filter.FilterPermanent;
+import mage.filter.StaticFilters;
import mage.target.common.TargetOpponent;
import mage.watchers.common.PlayerAttackedWatcher;
@@ -32,14 +31,11 @@ public final class StormFleetArsonist extends CardImpl {
this.toughness = new MageInt(4);
// Raid - When Storm Fleet Arsonist enters the battlefield, if you attacked this turn, target opponent sacrifices a permanent.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new SacrificeEffect(new FilterPermanent(), 1, "Target opponent")),
- RaidCondition.instance,
- "When {this} enters, if you attacked this turn, target opponent sacrifices a permanent.");
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new SacrificeEffect(StaticFilters.FILTER_PERMANENT_A, 1, "target opponent")
+ ).withInterveningIf(RaidCondition.instance);
ability.addTarget(new TargetOpponent());
- ability.setAbilityWord(AbilityWord.RAID);
- ability.addHint(RaidHint.instance);
- this.addAbility(ability, new PlayerAttackedWatcher());
+ this.addAbility(ability.setAbilityWord(AbilityWord.RAID).addHint(RaidHint.instance), new PlayerAttackedWatcher());
}
private StormFleetArsonist(final StormFleetArsonist card) {
diff --git a/Mage.Sets/src/mage/cards/s/StormFleetPyromancer.java b/Mage.Sets/src/mage/cards/s/StormFleetPyromancer.java
index cc9967b7acf..8ac6ef90b68 100644
--- a/Mage.Sets/src/mage/cards/s/StormFleetPyromancer.java
+++ b/Mage.Sets/src/mage/cards/s/StormFleetPyromancer.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.RaidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.hint.common.RaidHint;
import mage.cards.CardImpl;
@@ -32,14 +31,9 @@ public final class StormFleetPyromancer extends CardImpl {
this.toughness = new MageInt(2);
// Raid - When Storm Fleet Pyromancer enters the battlefield, if you attacked this turn, Storm Fleet Pyromancer deals 2 damage to any target.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2)),
- RaidCondition.instance,
- "When {this} enters, if you attacked this turn, {this} deals 2 damage to any target.");
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2)).withInterveningIf(RaidCondition.instance);
ability.addTarget(new TargetAnyTarget());
- ability.setAbilityWord(AbilityWord.RAID);
- ability.addHint(RaidHint.instance);
- this.addAbility(ability, new PlayerAttackedWatcher());
+ this.addAbility(ability.setAbilityWord(AbilityWord.RAID).addHint(RaidHint.instance), new PlayerAttackedWatcher());
}
private StormFleetPyromancer(final StormFleetPyromancer card) {
diff --git a/Mage.Sets/src/mage/cards/s/StormFleetSpy.java b/Mage.Sets/src/mage/cards/s/StormFleetSpy.java
index cf37d6515c4..ddda8a2da29 100644
--- a/Mage.Sets/src/mage/cards/s/StormFleetSpy.java
+++ b/Mage.Sets/src/mage/cards/s/StormFleetSpy.java
@@ -1,10 +1,8 @@
package mage.cards.s;
import mage.MageInt;
-import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.RaidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.hint.common.RaidHint;
import mage.cards.CardImpl;
@@ -30,13 +28,8 @@ public final class StormFleetSpy extends CardImpl {
this.toughness = new MageInt(2);
// Raid — When this creature enters, if you attacked this turn, draw a card.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)),
- RaidCondition.instance,
- "When this creature enters, if you attacked this turn, draw a card.");
- ability.setAbilityWord(AbilityWord.RAID);
- ability.addHint(RaidHint.instance);
- this.addAbility(ability, new PlayerAttackedWatcher());
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))
+ .withInterveningIf(RaidCondition.instance).setAbilityWord(AbilityWord.RAID).addHint(RaidHint.instance), new PlayerAttackedWatcher());
}
private StormFleetSpy(final StormFleetSpy card) {
diff --git a/Mage.Sets/src/mage/cards/s/StormTheVault.java b/Mage.Sets/src/mage/cards/s/StormTheVault.java
index 11d924c3997..a76502a82c5 100644
--- a/Mage.Sets/src/mage/cards/s/StormTheVault.java
+++ b/Mage.Sets/src/mage/cards/s/StormTheVault.java
@@ -1,30 +1,32 @@
-
package mage.cards.s;
-import java.util.UUID;
-
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.OneOrMoreCombatDamagePlayerTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
-import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.hint.ValueHint;
+import mage.abilities.hint.common.ArtifactYouControlHint;
import mage.abilities.keyword.TransformAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SuperType;
-import mage.filter.StaticFilters;
+import mage.filter.common.FilterControlledArtifactPermanent;
import mage.game.permanent.token.TreasureToken;
+import java.util.UUID;
+
/**
* @author LevelX2
*/
public final class StormTheVault extends CardImpl {
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterControlledArtifactPermanent("you control five or more artifacts"), ComparisonType.MORE_THAN, 4
+ );
+
public StormTheVault(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{R}");
@@ -37,11 +39,8 @@ public final class StormTheVault extends CardImpl {
// At the beginning of your end step, if you control five or more artifacts, transform Storm the Vault.
this.addAbility(new TransformAbility());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect()),
- new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT, ComparisonType.MORE_THAN, 4),
- "At the beginning of your end step, if you control five or more artifacts, transform {this}"
- ).addHint(new ValueHint("Artifacts you control", new PermanentsOnBattlefieldCount(StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT))));
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect())
+ .withInterveningIf(condition).addHint(ArtifactYouControlHint.instance));
}
private StormTheVault(final StormTheVault card) {
diff --git a/Mage.Sets/src/mage/cards/s/StormscapeBattlemage.java b/Mage.Sets/src/mage/cards/s/StormscapeBattlemage.java
index 676e6c643ca..414424d8f18 100644
--- a/Mage.Sets/src/mage/cards/s/StormscapeBattlemage.java
+++ b/Mage.Sets/src/mage/cards/s/StormscapeBattlemage.java
@@ -1,11 +1,10 @@
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.KickedCostCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.keyword.KickerAbility;
@@ -14,16 +13,20 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.StaticFilters;
-import mage.target.common.TargetCreaturePermanent;
+import mage.target.TargetPermanent;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class StormscapeBattlemage extends CardImpl {
+ private static final Condition condition = new KickedCostCondition("{W}");
+ private static final Condition condition2 = new KickedCostCondition("{2}{B}");
+
public StormscapeBattlemage(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.METATHRAN);
this.subtype.add(SubType.WIZARD);
@@ -36,17 +39,14 @@ public final class StormscapeBattlemage extends CardImpl {
this.addAbility(kickerAbility);
// When Stormscape Battlemage enters the battlefield, if it was kicked with its {W} kicker, you gain 3 life.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3),false),
- new KickedCostCondition("{W}"),
- "When Stormscape Battlemage enters the battlefield, if it was kicked with its {W} kicker, you gain 3 life."));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3)).withInterveningIf(condition));
// When Stormscape Battlemage enters the battlefield, if it was kicked with its {2}{B} kicker, destroy target nonblack creature. That creature can't be regenerated.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(true),false);
- ability.addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK));
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- ability, new KickedCostCondition("{2}{B}"),
- "When Stormscape Battlemage enters the battlefield, if it was kicked with its {2}{B} kicker, destroy target nonblack creature. That creature can't be regenerated."));
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(
+ "destroy target nonblack creature. That creature can't be regenerated", true
+ )).withInterveningIf(condition2);
+ ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK));
+ this.addAbility(ability);
}
private StormscapeBattlemage(final StormscapeBattlemage card) {
diff --git a/Mage.Sets/src/mage/cards/s/SunscapeBattlemage.java b/Mage.Sets/src/mage/cards/s/SunscapeBattlemage.java
index 84fde706032..17180abd35d 100644
--- a/Mage.Sets/src/mage/cards/s/SunscapeBattlemage.java
+++ b/Mage.Sets/src/mage/cards/s/SunscapeBattlemage.java
@@ -1,12 +1,10 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.KickedCostCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -17,21 +15,26 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AbilityPredicate;
-import mage.target.common.TargetCreaturePermanent;
+import mage.target.TargetPermanent;
+
+import java.util.UUID;
/**
- *
* @author FenrisulfrX
*/
public final class SunscapeBattlemage extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with flying");
+
static {
filter.add(new AbilityPredicate(FlyingAbility.class));
}
+ private static final Condition condition = new KickedCostCondition("{1}{G}");
+ private static final Condition condition2 = new KickedCostCondition("{2}{U}");
+
public SunscapeBattlemage(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.HUMAN);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(2);
@@ -43,15 +46,12 @@ public final class SunscapeBattlemage extends CardImpl {
this.addAbility(kickerAbility);
// When {this} enters, if it was kicked with its {1}{G} kicker, destroy target creature with flying.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(), false);
- ability.addTarget(new TargetCreaturePermanent(filter));
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new KickedCostCondition("{1}{G}"),
- "When {this} enters, if it was kicked with its {1}{G} kicker, destroy target creature with flying."));
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect()).withInterveningIf(condition);
+ ability.addTarget(new TargetPermanent(filter));
+ this.addAbility(ability);
// When {this} enters, if it was kicked with its {2}{U} kicker, draw two cards.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(new EntersBattlefieldTriggeredAbility(
- new DrawCardSourceControllerEffect(2)), new KickedCostCondition("{2}{U}"),
- "When {this} enters, if it was kicked with its {2}{U} kicker, draw two cards."));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(2)).withInterveningIf(condition2));
}
private SunscapeBattlemage(final SunscapeBattlemage card) {
diff --git a/Mage.Sets/src/mage/cards/s/SunspireGatekeepers.java b/Mage.Sets/src/mage/cards/s/SunspireGatekeepers.java
index 991b66ad310..6b31290ab33 100644
--- a/Mage.Sets/src/mage/cards/s/SunspireGatekeepers.java
+++ b/Mage.Sets/src/mage/cards/s/SunspireGatekeepers.java
@@ -2,17 +2,13 @@ package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.condition.Condition;
-import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.condition.common.YouControlTwoOrMoreGatesCondition;
import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.hint.ConditionHint;
+import mage.abilities.hint.common.GatesYouControlHint;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.ComparisonType;
import mage.constants.SubType;
-import mage.filter.common.FilterControlledPermanent;
import mage.game.permanent.token.KnightToken;
import java.util.UUID;
@@ -20,18 +16,8 @@ import java.util.UUID;
/**
* @author LevelX2
*/
-
-
public final class SunspireGatekeepers extends CardImpl {
- private static final FilterControlledPermanent filter = new FilterControlledPermanent();
-
- static {
- filter.add(SubType.GATE.getPredicate());
- }
-
- private static final Condition gatesCondition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1);
-
public SunspireGatekeepers(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
this.subtype.add(SubType.HUMAN);
@@ -41,11 +27,8 @@ public final class SunspireGatekeepers extends CardImpl {
this.toughness = new MageInt(4);
// When Sunspire Gatekeepers enter the battlefield, if you control two or more Gates, create a 2/2 white Knight creature token with vigilance.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new KnightToken())),
- gatesCondition,
- "When {this} enters, if you control two or more Gates, create a 2/2 white Knight creature token with vigilance.")
- .addHint(new ConditionHint(gatesCondition, "you control two or more Gates")));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new KnightToken()))
+ .withInterveningIf(YouControlTwoOrMoreGatesCondition.instance).addHint(GatesYouControlHint.instance));
}
private SunspireGatekeepers(final SunspireGatekeepers card) {
diff --git a/Mage.Sets/src/mage/cards/s/SupplyCaravan.java b/Mage.Sets/src/mage/cards/s/SupplyCaravan.java
index 432f671342a..d6f488d3d18 100644
--- a/Mage.Sets/src/mage/cards/s/SupplyCaravan.java
+++ b/Mage.Sets/src/mage/cards/s/SupplyCaravan.java
@@ -1,15 +1,15 @@
-
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
+import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.permanent.TappedPredicate;
import mage.game.permanent.token.WarriorVigilantToken;
@@ -17,17 +17,18 @@ import mage.game.permanent.token.WarriorVigilantToken;
import java.util.UUID;
/**
- *
* @author fireshoes
*/
public final class SupplyCaravan extends CardImpl {
- private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a tapped creature");
+ private static final FilterPermanent filter = new FilterControlledCreaturePermanent("you control a tapped creature");
static {
filter.add(TappedPredicate.TAPPED);
}
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter);
+
public SupplyCaravan(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}");
@@ -36,9 +37,7 @@ public final class SupplyCaravan extends CardImpl {
this.toughness = new MageInt(5);
// When Supply Caravan enters the battlefield, if you control a tapped creature, create a 1/1 white Warrior creature token with vigilance.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new WarriorVigilantToken())),
- new PermanentsOnTheBattlefieldCondition(filter),
- "When {this} enters, if you control a tapped creature, create a 1/1 white Warrior creature token with vigilance."));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new WarriorVigilantToken())).withInterveningIf(condition));
}
private SupplyCaravan(final SupplyCaravan card) {
diff --git a/Mage.Sets/src/mage/cards/s/SurrakTheHuntCaller.java b/Mage.Sets/src/mage/cards/s/SurrakTheHuntCaller.java
index 1a604ab6d66..7ba3ed4410c 100644
--- a/Mage.Sets/src/mage/cards/s/SurrakTheHuntCaller.java
+++ b/Mage.Sets/src/mage/cards/s/SurrakTheHuntCaller.java
@@ -1,30 +1,28 @@
-
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.condition.common.FormidableCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.HasteAbility;
+import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
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.constants.SuperType;
import mage.target.common.TargetControlledCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author fireshoes
*/
public final class SurrakTheHuntCaller extends CardImpl {
public SurrakTheHuntCaller(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WARRIOR);
@@ -32,10 +30,9 @@ public final class SurrakTheHuntCaller extends CardImpl {
this.toughness = new MageInt(4);
// Formidable — At the beginning of combat on your turn, if creatures you control have total power 8 or greater, target creature you control gains haste until end of turn.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfCombatTriggeredAbility(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn)),
- FormidableCondition.instance,
- "Formidable — At the beginning of combat on your turn, if creatures you control have total power 8 or greater, target creature you control gains haste until end of turn.");
+ Ability ability = new BeginningOfCombatTriggeredAbility(new GainAbilityTargetEffect(
+ HasteAbility.getInstance(), Duration.EndOfTurn
+ )).withInterveningIf(FormidableCondition.instance);
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/u/UbulSarGatekeepers.java b/Mage.Sets/src/mage/cards/u/UbulSarGatekeepers.java
index 68f61c73924..74d1985a17a 100644
--- a/Mage.Sets/src/mage/cards/u/UbulSarGatekeepers.java
+++ b/Mage.Sets/src/mage/cards/u/UbulSarGatekeepers.java
@@ -3,18 +3,14 @@ package mage.cards.u;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.condition.Condition;
-import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.condition.common.YouControlTwoOrMoreGatesCondition;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
-import mage.abilities.hint.ConditionHint;
+import mage.abilities.hint.common.GatesYouControlHint;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
-import mage.filter.StaticFilters;
-import mage.filter.common.FilterControlledPermanent;
-import mage.target.Target;
-import mage.target.common.TargetCreaturePermanent;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.target.common.TargetOpponentsCreaturePermanent;
import java.util.UUID;
@@ -23,14 +19,6 @@ import java.util.UUID;
*/
public final class UbulSarGatekeepers extends CardImpl {
- private static final FilterControlledPermanent filter = new FilterControlledPermanent();
-
- static {
- filter.add(SubType.GATE.getPredicate());
- }
-
- private static final Condition gatesCondition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1);
-
public UbulSarGatekeepers(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
this.subtype.add(SubType.ZOMBIE);
@@ -40,14 +28,10 @@ public final class UbulSarGatekeepers extends CardImpl {
this.toughness = new MageInt(4);
// Whenever Ubul Sar Gatekeepers enters the battlefield, if you control two or more Gates, target creature an opponent controls gets -2/-2 until end of turn.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(-2, -2, Duration.EndOfTurn)),
- gatesCondition,
- "When {this} enters, if you control two or more Gates, target creature an opponent controls gets -2/-2 until end of turn.");
- Target target = new TargetCreaturePermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE);
- ability.addTarget(target);
- ability.addHint(new ConditionHint(gatesCondition, "You control two or more Gates"));
- this.addAbility(ability);
+ Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(-2, -2))
+ .withInterveningIf(YouControlTwoOrMoreGatesCondition.instance);
+ ability.addTarget(new TargetOpponentsCreaturePermanent());
+ this.addAbility(ability.addHint(GatesYouControlHint.instance));
}
private UbulSarGatekeepers(final UbulSarGatekeepers card) {
diff --git a/Mage/src/main/java/mage/abilities/common/PutIntoGraveFromBattlefieldAllTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/PutIntoGraveFromBattlefieldAllTriggeredAbility.java
index e798718f028..a0d5ac75c7a 100644
--- a/Mage/src/main/java/mage/abilities/common/PutIntoGraveFromBattlefieldAllTriggeredAbility.java
+++ b/Mage/src/main/java/mage/abilities/common/PutIntoGraveFromBattlefieldAllTriggeredAbility.java
@@ -10,6 +10,7 @@ import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.target.targetpointer.FixedTarget;
+import mage.util.CardUtil;
/**
* @author LevelX2
@@ -30,7 +31,7 @@ public class PutIntoGraveFromBattlefieldAllTriggeredAbility extends TriggeredAbi
this.filter = filter;
this.onlyToControllerGraveyard = onlyToControllerGraveyard;
this.setTargetPointer = setTargetPointer;
- setTriggerPhrase("Whenever " + filter.getMessage() + " is put into " +
+ setTriggerPhrase("Whenever " + CardUtil.addArticle(filter.getMessage()) + " is put into " +
(onlyToControllerGraveyard ? "your" : "a") + " graveyard, ");
}
diff --git a/Mage/src/main/java/mage/abilities/condition/common/HaveInitiativeCondition.java b/Mage/src/main/java/mage/abilities/condition/common/HaveInitiativeCondition.java
index 1110482c5a9..0a813233b2f 100644
--- a/Mage/src/main/java/mage/abilities/condition/common/HaveInitiativeCondition.java
+++ b/Mage/src/main/java/mage/abilities/condition/common/HaveInitiativeCondition.java
@@ -17,6 +17,6 @@ public enum HaveInitiativeCondition implements Condition {
@Override
public String toString() {
- return "if you have the initiative";
+ return "you have the initiative";
}
}
diff --git a/Mage/src/main/java/mage/abilities/condition/common/LifeCompareCondition.java b/Mage/src/main/java/mage/abilities/condition/common/LifeCompareCondition.java
index 76be7c9ad27..66b7158a4e7 100644
--- a/Mage/src/main/java/mage/abilities/condition/common/LifeCompareCondition.java
+++ b/Mage/src/main/java/mage/abilities/condition/common/LifeCompareCondition.java
@@ -8,6 +8,7 @@ import mage.game.Game;
import mage.players.Player;
import java.util.Objects;
+import java.util.Optional;
/**
* @author xenohedron
@@ -20,9 +21,10 @@ public class LifeCompareCondition implements Condition {
/**
* "As long as [player] has [number] or [more/less] life"
+ *
* @param targetController YOU, OPPONENT, ANY, EACH_PLAYER
- * @param comparisonType comparison operator
- * @param amount life threshold
+ * @param comparisonType comparison operator
+ * @param amount life threshold
*/
public LifeCompareCondition(TargetController targetController, ComparisonType comparisonType, int amount) {
this.targetController = targetController;
@@ -40,7 +42,8 @@ public class LifeCompareCondition implements Condition {
case YOU:
return ComparisonType.compare(controller.getLife(), comparisonType, amount);
case OPPONENT:
- return game.getOpponents(controller.getId())
+ return game
+ .getOpponents(controller.getId())
.stream()
.map(game::getPlayer)
.filter(Objects::nonNull)
@@ -48,7 +51,9 @@ public class LifeCompareCondition implements Condition {
.map(Player::getLife)
.anyMatch(l -> ComparisonType.compare(l, comparisonType, amount));
case ANY:
- return game.getState().getPlayersInRange(controller.getId(), game)
+ return game
+ .getState()
+ .getPlayersInRange(controller.getId(), game)
.stream()
.map(game::getPlayer)
.filter(Objects::nonNull)
@@ -56,13 +61,23 @@ public class LifeCompareCondition implements Condition {
.map(Player::getLife)
.anyMatch(l -> ComparisonType.compare(l, comparisonType, amount));
case EACH_PLAYER:
- return game.getState().getPlayersInRange(controller.getId(), game)
+ return game
+ .getState()
+ .getPlayersInRange(controller.getId(), game)
.stream()
.map(game::getPlayer)
.filter(Objects::nonNull)
.filter(Player::isInGame)
.map(Player::getLife)
.allMatch(l -> ComparisonType.compare(l, comparisonType, amount));
+ case ACTIVE:
+ return Optional
+ .ofNullable(game)
+ .map(Game::getActivePlayerId)
+ .map(game::getPlayer)
+ .map(Player::getLife)
+ .filter(l -> ComparisonType.compare(l, comparisonType, amount))
+ .isPresent();
default:
throw new IllegalArgumentException("Unsupported TargetController in LifeCompareCondition: " + targetController);
}
@@ -84,27 +99,30 @@ public class LifeCompareCondition implements Condition {
case EACH_PLAYER:
sb.append("each player has ");
break;
+ case ACTIVE:
+ sb.append("that player has ");
+ break;
default:
throw new IllegalArgumentException("Unsupported TargetController in LifeCompareCondition: " + targetController);
}
switch (comparisonType) {
- case MORE_THAN:
- sb.append("more than ").append(amount);
- break;
- case FEWER_THAN:
- sb.append("less than ").append(amount);
- break;
- case EQUAL_TO:
- sb.append("exactly ").append(amount);
- break;
- case OR_GREATER:
- sb.append(amount).append(" or more");
- break;
- case OR_LESS:
- sb.append(amount).append(" or less");
- break;
- default:
- throw new IllegalArgumentException("Unsupported ComparisonType in LifeCompareCondition: " + comparisonType);
+ case MORE_THAN:
+ sb.append("more than ").append(amount);
+ break;
+ case FEWER_THAN:
+ sb.append("less than ").append(amount);
+ break;
+ case EQUAL_TO:
+ sb.append("exactly ").append(amount);
+ break;
+ case OR_GREATER:
+ sb.append(amount).append(" or more");
+ break;
+ case OR_LESS:
+ sb.append(amount).append(" or less");
+ break;
+ default:
+ throw new IllegalArgumentException("Unsupported ComparisonType in LifeCompareCondition: " + comparisonType);
}
sb.append(" life");
return sb.toString();
diff --git a/Mage/src/main/java/mage/abilities/condition/common/MonarchIsNotSetCondition.java b/Mage/src/main/java/mage/abilities/condition/common/MonarchIsNotSetCondition.java
index f489ddfa2e9..e46e06afac8 100644
--- a/Mage/src/main/java/mage/abilities/condition/common/MonarchIsNotSetCondition.java
+++ b/Mage/src/main/java/mage/abilities/condition/common/MonarchIsNotSetCondition.java
@@ -1,4 +1,3 @@
-
package mage.abilities.condition.common;
import mage.abilities.Ability;
@@ -19,6 +18,6 @@ public enum MonarchIsNotSetCondition implements Condition {
@Override
public String toString() {
- return "if there is no monarch";
+ return "there is no monarch";
}
}
diff --git a/Mage/src/main/java/mage/abilities/condition/common/RenownedSourceCondition.java b/Mage/src/main/java/mage/abilities/condition/common/RenownedSourceCondition.java
index 3b49012cfef..03af32c71d4 100644
--- a/Mage/src/main/java/mage/abilities/condition/common/RenownedSourceCondition.java
+++ b/Mage/src/main/java/mage/abilities/condition/common/RenownedSourceCondition.java
@@ -6,27 +6,32 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
/**
- * Checks if a Permanent is renown
+ * Checks if a Permanent is renowned
*
* @author LevelX2
*/
public enum RenownedSourceCondition implements Condition {
- instance;
+ THIS("{this} is"),
+ ITS("it's");
+ private final String name;
+
+ RenownedSourceCondition(String name) {
+ this.name = name;
+ }
+
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- return permanent.isRenowned();
+ return permanent.isRenowned();
}
return false;
}
@Override
public String toString() {
- return "it's renowned";
+ return name + " renowned";
}
-
-
-}
\ No newline at end of file
+}
diff --git a/Mage/src/main/java/mage/abilities/condition/common/SourceInExileCondition.java b/Mage/src/main/java/mage/abilities/condition/common/SourceInExileCondition.java
index 0625f697a11..88c82128151 100644
--- a/Mage/src/main/java/mage/abilities/condition/common/SourceInExileCondition.java
+++ b/Mage/src/main/java/mage/abilities/condition/common/SourceInExileCondition.java
@@ -10,7 +10,6 @@ import mage.game.Game;
*
* @author Susucr
*/
-
public enum SourceInExileCondition implements Condition {
instance;
@@ -18,4 +17,9 @@ public enum SourceInExileCondition implements Condition {
public boolean apply(Game game, Ability source) {
return game.getState().getZone(source.getSourceId()) == Zone.EXILED;
}
+
+ @Override
+ public String toString() {
+ return "{this} is exiled";
+ }
}
diff --git a/Mage/src/main/java/mage/abilities/condition/common/SpectacleCondition.java b/Mage/src/main/java/mage/abilities/condition/common/SpectacleCondition.java
index 5a9370e416b..d97499b4024 100644
--- a/Mage/src/main/java/mage/abilities/condition/common/SpectacleCondition.java
+++ b/Mage/src/main/java/mage/abilities/condition/common/SpectacleCondition.java
@@ -1,4 +1,3 @@
-
package mage.abilities.condition.common;
import mage.abilities.Ability;
@@ -11,11 +10,15 @@ import mage.util.CardUtil;
* @author TheElk801
*/
public enum SpectacleCondition implements Condition {
-
instance;
@Override
public boolean apply(Game game, Ability source) {
return CardUtil.checkSourceCostsTagExists(game, source, SpectacleAbility.SPECTACLE_ACTIVATION_VALUE_KEY);
}
+
+ @Override
+ public String toString() {
+ return "its spectacle cost was paid";
+ }
}
diff --git a/Mage/src/main/java/mage/abilities/condition/common/SurgedCondition.java b/Mage/src/main/java/mage/abilities/condition/common/SurgedCondition.java
index 8b65ebdc690..6ded9090265 100644
--- a/Mage/src/main/java/mage/abilities/condition/common/SurgedCondition.java
+++ b/Mage/src/main/java/mage/abilities/condition/common/SurgedCondition.java
@@ -1,4 +1,3 @@
-
package mage.abilities.condition.common;
import mage.abilities.Ability;
@@ -8,15 +7,18 @@ import mage.game.Game;
import mage.util.CardUtil;
/**
- *
* @author LevelX2
*/
public enum SurgedCondition implements Condition {
-
instance;
@Override
public boolean apply(Game game, Ability source) {
return CardUtil.checkSourceCostsTagExists(game, source, SurgeAbility.SURGE_ACTIVATION_VALUE_KEY);
}
+
+ @Override
+ public String toString() {
+ return "its surge cost was paid";
+ }
}
diff --git a/Mage/src/main/java/mage/abilities/condition/common/YouControlTwoOrMoreGatesCondition.java b/Mage/src/main/java/mage/abilities/condition/common/YouControlTwoOrMoreGatesCondition.java
new file mode 100644
index 00000000000..73b5f2517d8
--- /dev/null
+++ b/Mage/src/main/java/mage/abilities/condition/common/YouControlTwoOrMoreGatesCondition.java
@@ -0,0 +1,26 @@
+package mage.abilities.condition.common;
+
+import mage.abilities.Ability;
+import mage.abilities.condition.Condition;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledPermanent;
+import mage.game.Game;
+
+/**
+ * @author TheElk801
+ */
+public enum YouControlTwoOrMoreGatesCondition implements Condition {
+ instance;
+ private static final FilterPermanent filter = new FilterControlledPermanent(SubType.GATE);
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return game.getBattlefield().count(filter, source.getControllerId(), source, game) >= 2;
+ }
+
+ @Override
+ public String toString() {
+ return "you control two or more Gates";
+ }
+}
diff --git a/Mage/src/main/java/mage/abilities/effects/common/LearnEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LearnEffect.java
index 907eb42bc7e..88e6399b2f9 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/LearnEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/LearnEffect.java
@@ -20,12 +20,11 @@ public class LearnEffect extends OneShotEffect {
filter.add(SubType.LESSON.getPredicate());
}
- private static final String defaultText = "learn. (You may reveal a Lesson card you own from outside the game " +
- "and put it into your hand, or discard a card to draw a card.)";
public LearnEffect() {
super(Outcome.Neutral);
- staticText = defaultText;
+ staticText = "learn. (You may reveal a Lesson card you own " +
+ "from outside the game and put it into your hand, or discard a card to draw a card.)";
}
private LearnEffect(final LearnEffect effect) {
@@ -50,8 +49,4 @@ public class LearnEffect extends OneShotEffect {
public LearnEffect copy() {
return new LearnEffect(this);
}
-
- public static String getDefaultText() {
- return defaultText;
- }
}
diff --git a/Mage/src/main/java/mage/abilities/hint/common/RenownedHint.java b/Mage/src/main/java/mage/abilities/hint/common/RenownedHint.java
index 97e63519f07..5ddd3e5a8f6 100644
--- a/Mage/src/main/java/mage/abilities/hint/common/RenownedHint.java
+++ b/Mage/src/main/java/mage/abilities/hint/common/RenownedHint.java
@@ -8,7 +8,7 @@ import mage.game.Game;
public enum RenownedHint implements Hint {
instance;
- private static final ConditionHint hint = new ConditionHint(RenownedSourceCondition.instance,
+ private static final ConditionHint hint = new ConditionHint(RenownedSourceCondition.THIS,
"{this} is renowned", null,
"{this} isn't renowned", null, true);
diff --git a/Mage/src/main/java/mage/abilities/keyword/RenownAbility.java b/Mage/src/main/java/mage/abilities/keyword/RenownAbility.java
index df811a37cfa..0b93bc9172e 100644
--- a/Mage/src/main/java/mage/abilities/keyword/RenownAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/RenownAbility.java
@@ -15,7 +15,6 @@ import mage.game.permanent.Permanent;
import mage.util.CardUtil;
/**
- *
* @author LevelX2
*/
public class RenownAbility extends TriggeredAbilityImpl {
diff --git a/Mage/src/main/java/mage/target/common/TargetOpponentOrPlaneswalker.java b/Mage/src/main/java/mage/target/common/TargetOpponentOrPlaneswalker.java
index d30b65d64e8..3fc95ab5fc9 100644
--- a/Mage/src/main/java/mage/target/common/TargetOpponentOrPlaneswalker.java
+++ b/Mage/src/main/java/mage/target/common/TargetOpponentOrPlaneswalker.java
@@ -1,25 +1,28 @@
package mage.target.common;
import mage.filter.common.FilterOpponentOrPlaneswalker;
+import mage.filter.common.FilterPermanentOrPlayer;
/**
* @author LevelX2
*/
public class TargetOpponentOrPlaneswalker extends TargetPermanentOrPlayer {
+ private static final FilterPermanentOrPlayer filter = new FilterOpponentOrPlaneswalker();
+
public TargetOpponentOrPlaneswalker() {
this(1);
}
- public TargetOpponentOrPlaneswalker(FilterOpponentOrPlaneswalker filter) {
- this(1, 1, filter, false);
- }
-
public TargetOpponentOrPlaneswalker(int numTargets) {
- this(numTargets, numTargets, new FilterOpponentOrPlaneswalker("opponent or planeswalker"), false);
+ this(numTargets, numTargets);
}
- public TargetOpponentOrPlaneswalker(int minNumTargets, int maxNumTargets, FilterOpponentOrPlaneswalker filter, boolean notTarget) {
+ public TargetOpponentOrPlaneswalker(int minNumTargets, int maxNumTargets) {
+ this(minNumTargets, maxNumTargets, false);
+ }
+
+ public TargetOpponentOrPlaneswalker(int minNumTargets, int maxNumTargets, boolean notTarget) {
super(minNumTargets, maxNumTargets, filter, notTarget);
}