listening to Pet Sounds on repeat while I refactor ConditionalInterveningIfTriggeredAbility

This commit is contained in:
theelk801 2025-06-12 12:39:13 -04:00
parent cdcda710c8
commit 79a2f80563
151 changed files with 1189 additions and 1889 deletions

View file

@ -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.

View file

@ -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) {

View file

@ -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);
}

View file

@ -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. " +
"<i>(It can't be blocked except by two or more creatures.)</i>");
Ability ability = new SimpleStaticAbility(effect);
this.addAbility(ability);
RenownedSourceCondition.THIS, "as long as {this} is renowned, " +
"it has menace. <i>(It can't be blocked except by two or more creatures.)</i>"
)));
}
private GoblinGloryChaser(final GoblinGloryChaser card) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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());

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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<UUID> startedUntapped = new HashSet<>(0);
RasputinDreamweaverStartedUntappedWatcher() {
RasputinDreamweaverWatcher() {
super(WatcherScope.GAME);
}

View file

@ -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) {

View file

@ -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;
}
}

View file

@ -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 players 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;
}
}

View file

@ -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}"));

View file

@ -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;
}
}
@Override
public String toString() {
return "defending player has two or fewer cards in hand";
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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));

View file

@ -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());
}

View file

@ -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";
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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()));

View file

@ -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) {

View file

@ -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);

View file

@ -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) {

View file

@ -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}"));

View file

@ -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) {

View file

@ -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;
}

View file

@ -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) {

View file

@ -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(

View file

@ -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) {

View file

@ -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";
}
}

View file

@ -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);
// <i>Raid</i> &mdash; 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) {

View file

@ -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";
}
}

View file

@ -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());
// <i>Formidable</i> &mdash; 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,
"<i>Formidable</i> &mdash; 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) {

View file

@ -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));
}

View file

@ -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(

View file

@ -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()));
}

View file

@ -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<UUID> players = new HashSet<>();

View file

@ -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) {

View file

@ -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) {

View file

@ -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<Permanent> permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game);
if (!permanents.isEmpty()) {
player.moveCards(new HashSet<>(permanents), Zone.EXILED, source, game);
}
return true;
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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";
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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);
}
}
}

View file

@ -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) {

View file

@ -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);
}

View file

@ -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());
//"<i>Metalcraft</i> &mdash; 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) {

View file

@ -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) {

View file

@ -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);
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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, "<br><i>Addendum</i> &mdash; 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) {

View file

@ -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;
}
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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;
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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());
}

View file

@ -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(

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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);
}

View file

@ -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) {

View file

@ -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);
}

View file

@ -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.

View file

@ -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) {

View file

@ -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);
// <i>Hate</i> &mdash; 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,
"<i>Hate</i> &mdash; 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) {

View file

@ -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);
// <i>Hate</i> &mdash; 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,
"<i>Hate</i> &mdash; 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) {

View file

@ -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}");
// <i>Hate</i> &mdash; 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,
"<i>Hate</i> &mdash; 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) {

View file

@ -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);
// <i>Hate</i> &mdash; 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,
"<i>Hate</i> &mdash; 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) {

View file

@ -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 {
// <i>Hate</i> &mdash; 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,
"<i>Hate</i> &mdash; 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) {

View file

@ -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)));
// <i>Hate</i> &mdash; 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,
"<i>Hate</i> &mdash; 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) {

View file

@ -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) {

View file

@ -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
));
}

View file

@ -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());

View file

@ -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, "<i>Landfall</i> &mdash; 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) {

View file

@ -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) {

Some files were not shown because too many files have changed in this diff Show more