diff --git a/Mage.Sets/src/mage/cards/a/AgentOfTreachery.java b/Mage.Sets/src/mage/cards/a/AgentOfTreachery.java
index 4931519eaac..8c34c1dd047 100644
--- a/Mage.Sets/src/mage/cards/a/AgentOfTreachery.java
+++ b/Mage.Sets/src/mage/cards/a/AgentOfTreachery.java
@@ -2,14 +2,15 @@ package mage.cards.a;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+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.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
+import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@@ -24,12 +25,15 @@ import java.util.UUID;
*/
public final class AgentOfTreachery extends CardImpl {
- private static final FilterPermanent filter = new FilterControlledPermanent();
+ private static final FilterPermanent filter = new FilterControlledPermanent("you control three or more permanents you don't own");
static {
filter.add(TargetController.NOT_YOU.getOwnerPredicate());
}
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 2);
+ private static final Hint hint = new ValueHint("Permanents you control but don't own", new PermanentsOnBattlefieldCount(filter));
+
public AgentOfTreachery(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{U}{U}");
@@ -44,12 +48,7 @@ public final class AgentOfTreachery extends CardImpl {
this.addAbility(ability);
// At the beginning of your end step, if you control three or more permanents you don't own, draw three cards.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- new DrawCardSourceControllerEffect(3)
- ), new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 2), "At the beginning of your end step, " +
- "if you control three or more permanents you don't own, draw three cards."
- ).addHint(new ValueHint("Permanents you control but don't own", new PermanentsOnBattlefieldCount(filter))));
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(new DrawCardSourceControllerEffect(3)).withInterveningIf(condition).addHint(hint));
}
private AgentOfTreachery(final AgentOfTreachery card) {
diff --git a/Mage.Sets/src/mage/cards/a/AjanisComrade.java b/Mage.Sets/src/mage/cards/a/AjanisComrade.java
index fa08f8af6f3..e00d50924a9 100644
--- a/Mage.Sets/src/mage/cards/a/AjanisComrade.java
+++ b/Mage.Sets/src/mage/cards/a/AjanisComrade.java
@@ -1,32 +1,28 @@
-
package mage.cards.a;
-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.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.TrampleAbility;
+import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.counters.CounterType;
-import mage.filter.common.FilterControlledPermanent;
+import mage.filter.common.FilterControlledPlaneswalkerPermanent;
+
+import java.util.UUID;
/**
- *
* @author fireshoes
*/
public final class AjanisComrade extends CardImpl {
- private static final FilterControlledPermanent filter = new FilterControlledPermanent();
-
- static {
- filter.add(CardType.PLANESWALKER.getPredicate());
- filter.add(SubType.AJANI.getPredicate());
- }
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterControlledPlaneswalkerPermanent(SubType.AJANI, "you control an Ajani planeswalker")
+ );
public AjanisComrade(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
@@ -40,10 +36,7 @@ public final class AjanisComrade extends CardImpl {
this.addAbility(TrampleAbility.getInstance());
// At the beginning of combat on your turn, if you control an Ajani planeswalker, put a +1/+1 counter on Ajani's Comrade.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfCombatTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance())),
- new PermanentsOnTheBattlefieldCondition(filter),
- "At the beginning of combat on your turn, if you control an Ajani planeswalker, put a +1/+1 counter on {this}."));
+ this.addAbility(new BeginningOfCombatTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance())).withInterveningIf(condition));
}
private AjanisComrade(final AjanisComrade card) {
diff --git a/Mage.Sets/src/mage/cards/a/AjanisLastStand.java b/Mage.Sets/src/mage/cards/a/AjanisLastStand.java
index a2697f89c90..e6137f7e1d3 100644
--- a/Mage.Sets/src/mage/cards/a/AjanisLastStand.java
+++ b/Mage.Sets/src/mage/cards/a/AjanisLastStand.java
@@ -1,51 +1,42 @@
package mage.cards.a;
-import java.util.UUID;
-
-import mage.MageObject;
-import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.common.DiscardedByOpponentTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.common.SacrificeSourceCost;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.Zone;
+import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.events.ZoneChangeEvent;
import mage.game.permanent.token.AvatarToken2;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class AjanisLastStand extends CardImpl {
- private static final FilterControlledPermanent filter = new FilterControlledPermanent();
-
- static {
- filter.add(SubType.PLAINS.getPredicate());
- }
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterControlledPermanent(SubType.PLAINS, "you control a Plains")
+ );
public AjanisLastStand(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{W}");
// Whenever a creature or planeswalker you control dies, you may sacrifice Ajani's Last Stand. If you do, create a 4/4 white Avatar creature token with flying.
- this.addAbility(new AjanisLastStandTriggeredAbility());
+ this.addAbility(new DiesCreatureTriggeredAbility(
+ new DoIfCostPaid(new CreateTokenEffect(new AvatarToken2()), new SacrificeSourceCost()),
+ false, StaticFilters.FILTER_CONTROLLED_PERMANENT_CREATURE_OR_PLANESWALKER
+ ));
// When a spell or ability an opponent controls causes you to discard this card, if you control a Plains, create a 4/4 white Avatar creature token with flying.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new DiscardedByOpponentTriggeredAbility(new CreateTokenEffect(new AvatarToken2())),
- new PermanentsOnTheBattlefieldCondition(filter),
- "When a spell or ability an opponent controls causes you to discard this card, "
- + "if you control a Plains, create a 4/4 white Avatar creature token with flying."
- ));
+ this.addAbility(new DiscardedByOpponentTriggeredAbility(new CreateTokenEffect(new AvatarToken2())).withInterveningIf(condition));
}
private AjanisLastStand(final AjanisLastStand card) {
@@ -57,53 +48,3 @@ public final class AjanisLastStand extends CardImpl {
return new AjanisLastStand(this);
}
}
-
-class AjanisLastStandTriggeredAbility extends TriggeredAbilityImpl {
-
- public AjanisLastStandTriggeredAbility() {
- super(Zone.BATTLEFIELD, new DoIfCostPaid(
- new CreateTokenEffect(new AvatarToken2()),
- new SacrificeSourceCost()
- ), false);
- setLeavesTheBattlefieldTrigger(true);
- }
-
- private AjanisLastStandTriggeredAbility(final AjanisLastStandTriggeredAbility ability) {
- super(ability);
- }
-
- @Override
- public AjanisLastStandTriggeredAbility copy() {
- return new AjanisLastStandTriggeredAbility(this);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == GameEvent.EventType.ZONE_CHANGE;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
- if (zEvent.isDiesEvent()) {
- if (zEvent.getTarget().isControlledBy(controllerId)
- && (zEvent.getTarget().isCreature(game)
- || zEvent.getTarget().isPlaneswalker(game))) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public String getRule() {
- return "Whenever a creature or planeswalker you control dies, "
- + "you may sacrifice {this}. "
- + "If you do, create a 4/4 white Avatar creature token with flying.";
- }
-
- @Override
- public boolean isInUseableZone(Game game, MageObject sourceObject, GameEvent event) {
- return TriggeredAbilityImpl.isInUseableZoneDiesTrigger(this, sourceObject, event, game);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/a/AlchemistsTalent.java b/Mage.Sets/src/mage/cards/a/AlchemistsTalent.java
index 606b16c5bb1..65dfb59a6c2 100644
--- a/Mage.Sets/src/mage/cards/a/AlchemistsTalent.java
+++ b/Mage.Sets/src/mage/cards/a/AlchemistsTalent.java
@@ -7,7 +7,6 @@ import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateTokenEffect;
@@ -52,18 +51,24 @@ public final class AlchemistsTalent extends CardImpl {
// Treasures you control have "{T}, Sacrifice this artifact: Add two mana of any one color."
Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(2), new TapSourceCost());
ability.addCost(new SacrificeSourceCost().setText("sacrifice this artifact"));
- this.addAbility(new SimpleStaticAbility(new GainClassAbilitySourceEffect(new GainAbilityControlledEffect(ability, Duration.WhileOnBattlefield, new FilterPermanent(SubType.TREASURE, "Treasures")), 2)));
+ this.addAbility(new SimpleStaticAbility(new GainClassAbilitySourceEffect(
+ new GainAbilityControlledEffect(
+ ability, Duration.WhileOnBattlefield,
+ new FilterPermanent(SubType.TREASURE, "Treasures")
+ ), 2
+ )));
// {4}{R}: Level 3
this.addAbility(new ClassLevelAbility(3, "{4}{R}"));
// Whenever you cast a spell, if mana from a Treasure was spent to cast it, this Class deals damage equal to that spell's mana value to each opponent.
- this.addAbility(new SimpleStaticAbility(new GainClassAbilitySourceEffect(new ConditionalInterveningIfTriggeredAbility(
+ this.addAbility(new SimpleStaticAbility(new GainClassAbilitySourceEffect(
new SpellCastControllerTriggeredAbility(
- new DamagePlayersEffect(AlchemistsTalentValue.instance, TargetController.OPPONENT), StaticFilters.FILTER_SPELL, false, SetTargetPointer.SPELL
- ), AlchemistsTalentCondition.instance, "Whenever you cast a spell, if mana from a Treasure " +
- "was spent to cast it, this Class deals damage equal to that spell's mana value to each opponent"
- ), 3)));
+ new DamagePlayersEffect(AlchemistsTalentValue.instance, TargetController.OPPONENT)
+ .setText("{this} deals damage equal to that spell's mana value to each opponent"),
+ StaticFilters.FILTER_SPELL, false, SetTargetPointer.SPELL
+ ).withInterveningIf(AlchemistsTalentCondition.instance), 3
+ )));
}
private AlchemistsTalent(final AlchemistsTalent card) {
@@ -84,6 +89,11 @@ enum AlchemistsTalentCondition implements Condition {
Spell spell = (Spell) source.getEffects().get(0).getValue("spellCast");
return spell != null && ManaPaidSourceWatcher.getTreasurePaid(spell.getSourceId(), game) > 0;
}
+
+ @Override
+ public String toString() {
+ return "mana from a Treasure was spent to cast it";
+ }
}
enum AlchemistsTalentValue implements DynamicValue {
@@ -111,6 +121,6 @@ enum AlchemistsTalentValue implements DynamicValue {
@Override
public String toString() {
- return "";
+ return "1";
}
}
diff --git a/Mage.Sets/src/mage/cards/a/AnaBattlemage.java b/Mage.Sets/src/mage/cards/a/AnaBattlemage.java
index 42bbe7073ef..f33df1df178 100644
--- a/Mage.Sets/src/mage/cards/a/AnaBattlemage.java
+++ b/Mage.Sets/src/mage/cards/a/AnaBattlemage.java
@@ -2,11 +2,11 @@ package mage.cards.a;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.TriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.KickedCostCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.TapTargetEffect;
import mage.abilities.effects.common.discard.DiscardTargetEffect;
import mage.abilities.keyword.KickerAbility;
import mage.cards.CardImpl;
@@ -35,6 +35,9 @@ public final class AnaBattlemage extends CardImpl {
filter.add(TappedPredicate.UNTAPPED);
}
+ private static final Condition condition = new KickedCostCondition("{2}{U}");
+ private static final Condition condition2 = new KickedCostCondition("{1}{B}");
+
public AnaBattlemage(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}");
this.subtype.add(SubType.HUMAN);
@@ -46,16 +49,17 @@ public final class AnaBattlemage extends CardImpl {
KickerAbility kickerAbility = new KickerAbility("{2}{U}");
kickerAbility.addKickerCost("{1}{B}");
this.addAbility(kickerAbility);
+
// When Ana Battlemage enters the battlefield, if it was kicked with its {2}{U} kicker, target player discards three cards.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(3));
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(3)).withInterveningIf(condition);
ability.addTarget(new TargetPlayer());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new KickedCostCondition("{2}{U}"),
- "When {this} enters, if it was kicked with its {2}{U} kicker, target player discards three cards."));
+ this.addAbility(ability);
+
// When Ana Battlemage enters the battlefield, if it was kicked with its {1}{B} kicker, tap target untapped creature and that creature deals damage equal to its power to its controller.
- ability = new EntersBattlefieldTriggeredAbility(new AnaBattlemageKickerEffect());
+ ability = new EntersBattlefieldTriggeredAbility(new TapTargetEffect()).withInterveningIf(condition2);
+ ability.addEffect(new AnaBattlemageEffect());
ability.addTarget(new TargetCreaturePermanent(filter));
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new KickedCostCondition("{1}{B}"),
- "When {this} enters, if it was kicked with its {1}{B} kicker, tap target untapped creature and that creature deals damage equal to its power to its controller."));
+ this.addAbility(ability);
}
private AnaBattlemage(final AnaBattlemage card) {
@@ -68,34 +72,31 @@ public final class AnaBattlemage extends CardImpl {
}
}
-class AnaBattlemageKickerEffect extends OneShotEffect {
+class AnaBattlemageEffect extends OneShotEffect {
- AnaBattlemageKickerEffect() {
+ AnaBattlemageEffect() {
super(Outcome.Detriment);
- this.staticText = "tap target untapped creature and it deals damage equal to its power to its controller";
+ this.staticText = "and it deals damage equal to its power to its controller";
}
- private AnaBattlemageKickerEffect(final AnaBattlemageKickerEffect effect) {
+ private AnaBattlemageEffect(final AnaBattlemageEffect effect) {
super(effect);
}
@Override
- public AnaBattlemageKickerEffect copy() {
- return new AnaBattlemageKickerEffect(this);
+ public AnaBattlemageEffect copy() {
+ return new AnaBattlemageEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
- boolean applied = false;
Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
- if (targetCreature != null) {
- applied = targetCreature.tap(source, game);
- Player controller = game.getPlayer(targetCreature.getControllerId());
- if (controller != null) {
- controller.damage(targetCreature.getPower().getValue(), source.getSourceId(), source, game);
- applied = true;
- }
+ if (targetCreature == null) {
+ return false;
}
- return applied;
+ Player controller = game.getPlayer(targetCreature.getControllerId());
+ return controller != null && controller.damage(
+ targetCreature.getPower().getValue(), source.getSourceId(), source, game
+ ) > 0;
}
}
diff --git a/Mage.Sets/src/mage/cards/a/AngelOfDestiny.java b/Mage.Sets/src/mage/cards/a/AngelOfDestiny.java
index c1c14a34957..bf0df6ed71b 100644
--- a/Mage.Sets/src/mage/cards/a/AngelOfDestiny.java
+++ b/Mage.Sets/src/mage/cards/a/AngelOfDestiny.java
@@ -3,13 +3,12 @@ package mage.cards.a;
import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility;
import mage.abilities.condition.common.MoreThanStartingLifeTotalCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@@ -47,13 +46,8 @@ public final class AngelOfDestiny extends CardImpl {
));
// At the beginning of your end step, if you have at least 15 life more than your starting life total, each player Angel of Destiny attacked this turn loses the game.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- new AngelOfDestinyLoseEffect()
- ), MoreThanStartingLifeTotalCondition.FIFTEEN, "At the beginning of your end step, " +
- "if you have at least 15 life more than your starting life total, " +
- "each player {this} attacked this turn loses the game."
- ), new AngelOfDestinyWatcher());
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(new AngelOfDestinyLoseEffect())
+ .withInterveningIf(MoreThanStartingLifeTotalCondition.FIFTEEN), new AngelOfDestinyWatcher());
}
private AngelOfDestiny(final AngelOfDestiny card) {
@@ -101,6 +95,7 @@ class AngelOfDestinyLoseEffect extends OneShotEffect {
AngelOfDestinyLoseEffect() {
super(Outcome.Benefit);
+ staticText = "each player {this} attacked this turn loses the game";
}
private AngelOfDestinyLoseEffect(final AngelOfDestinyLoseEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/a/AngelicSellSword.java b/Mage.Sets/src/mage/cards/a/AngelicSellSword.java
index b7028153417..380bf6633cf 100644
--- a/Mage.Sets/src/mage/cards/a/AngelicSellSword.java
+++ b/Mage.Sets/src/mage/cards/a/AngelicSellSword.java
@@ -6,7 +6,6 @@ import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.EntersBattlefieldThisOrAnotherTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -48,11 +47,8 @@ public final class AngelicSellSword extends CardImpl {
));
// Whenever Angelic Sell-Sword attacks, if its power is 6 or greater, draw a card.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new DrawCardSourceControllerEffect(1)),
- AngelicSellSwordCondition.instance, "Whenever {this} attacks, " +
- "if its power is 6 or greater, draw a card."
- ));
+ this.addAbility(new AttacksTriggeredAbility(new DrawCardSourceControllerEffect(1))
+ .withInterveningIf(AngelicSellSwordCondition.instance));
}
private AngelicSellSword(final AngelicSellSword card) {
@@ -76,4 +72,9 @@ enum AngelicSellSwordCondition implements Condition {
.map(MageInt::getValue)
.orElse(0) >= 6;
}
+
+ @Override
+ public String toString() {
+ return "its power is 6 or greater";
+ }
}
diff --git a/Mage.Sets/src/mage/cards/a/ApothecaryGeist.java b/Mage.Sets/src/mage/cards/a/ApothecaryGeist.java
index 42571f0ebf6..9f4ae930dc2 100644
--- a/Mage.Sets/src/mage/cards/a/ApothecaryGeist.java
+++ b/Mage.Sets/src/mage/cards/a/ApothecaryGeist.java
@@ -1,50 +1,45 @@
-
package mage.cards.a;
import mage.MageInt;
-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.GainLifeEffect;
import mage.abilities.keyword.FlyingAbility;
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.AnotherPredicate;
import java.util.UUID;
/**
- *
* @author escplan9 (Derek Monturo - dmontur1 at gmail dot com)
*/
public final class ApothecaryGeist extends CardImpl {
-
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Elf");
+
+ private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SPIRIT, "you control another Spirit");
static {
filter.add(AnotherPredicate.instance);
- filter.add(SubType.SPIRIT.getPredicate());
}
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter);
+
public ApothecaryGeist(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.SPIRIT);
this.power = new MageInt(2);
this.toughness = new MageInt(3);
// Flying
this.addAbility(FlyingAbility.getInstance());
-
+
// When Apothecary Geist enters the battlefield, if you control another Spirit, you gain 3 life.
- TriggeredAbility triggeredAbility = new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3));
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- triggeredAbility,
- new PermanentsOnTheBattlefieldCondition(filter),
- "When {this} enters, if you control another Spirit, you gain 3 life."));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3)).withInterveningIf(condition));
}
private ApothecaryGeist(final ApothecaryGeist card) {
diff --git a/Mage.Sets/src/mage/cards/a/ArcaneProxy.java b/Mage.Sets/src/mage/cards/a/ArcaneProxy.java
index 60319104e0f..c986b141b14 100644
--- a/Mage.Sets/src/mage/cards/a/ArcaneProxy.java
+++ b/Mage.Sets/src/mage/cards/a/ArcaneProxy.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.CastFromEverywhereSourceCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.ExileTargetCardCopyAndCastEffect;
import mage.abilities.keyword.PrototypeAbility;
import mage.cards.CardImpl;
@@ -42,12 +41,11 @@ public final class ArcaneProxy extends CardImpl {
this.addAbility(new PrototypeAbility(this, "{1}{U}{U}", 2, 1));
// When Arcane Proxy enters the battlefield, if you cast it, exile target instant or sorcery card with mana value less than or equal to Arcane Proxy's power from your graveyard. Copy that card. You may cast the copy without paying its mana cost.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new ExileTargetCardCopyAndCastEffect(true)),
- CastFromEverywhereSourceCondition.instance, "When {this} enters, " +
- "if you cast it, exile target instant or sorcery card with mana value less than or equal to {this}'s " +
- "power from your graveyard. Copy that card. You may cast the copy without paying its mana cost."
- );
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new ExileTargetCardCopyAndCastEffect(true)
+ .setText("exile target instant or sorcery card with mana value less than or equal to {this}'s " +
+ "power from your graveyard. Copy that card. You may cast the copy without paying its mana cost")
+ ).withInterveningIf(CastFromEverywhereSourceCondition.instance);
ability.addTarget(new TargetCardInYourGraveyard(filter));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/a/ArchangelOfWrath.java b/Mage.Sets/src/mage/cards/a/ArchangelOfWrath.java
index aa663cf4f2f..f472cff0b5a 100644
--- a/Mage.Sets/src/mage/cards/a/ArchangelOfWrath.java
+++ b/Mage.Sets/src/mage/cards/a/ArchangelOfWrath.java
@@ -1,10 +1,9 @@
package mage.cards.a;
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.DamageTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.KickerAbility;
@@ -40,19 +39,19 @@ public final class ArchangelOfWrath extends CardImpl {
// Lifelink
this.addAbility(LifelinkAbility.getInstance());
- TriggeredAbility triggeredAbility = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2));
- triggeredAbility.addTarget(new TargetAnyTarget());
// When Archangel of Wrath enters the battlefield, if it was kicked, it deals 2 damage to any target.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- triggeredAbility, KickedCondition.ONCE, "When {this} enters, " +
- "if it was kicked, it deals 2 damage to any target."
- ));
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new DamageTargetEffect(2, "it")
+ ).withInterveningIf(KickedCondition.ONCE);
+ ability.addTarget(new TargetAnyTarget());
+ this.addAbility(ability);
// When Archangel of Wrath enters the battlefield, if it was kicked twice, it deals 2 damage to any target.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- triggeredAbility.copy(), KickedCondition.TWICE, "When {this} enters, " +
- "if it was kicked twice, it deals 2 damage to any target."
- ));
+ ability = new EntersBattlefieldTriggeredAbility(
+ new DamageTargetEffect(2, "it")
+ ).withInterveningIf(KickedCondition.TWICE);
+ ability.addTarget(new TargetAnyTarget());
+ this.addAbility(ability);
}
private ArchangelOfWrath(final ArchangelOfWrath card) {
diff --git a/Mage.Sets/src/mage/cards/a/ArchivistOfGondor.java b/Mage.Sets/src/mage/cards/a/ArchivistOfGondor.java
index dc042152bab..14b7f10242a 100644
--- a/Mage.Sets/src/mage/cards/a/ArchivistOfGondor.java
+++ b/Mage.Sets/src/mage/cards/a/ArchivistOfGondor.java
@@ -1,12 +1,13 @@
package mage.cards.a;
import mage.MageInt;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.effects.common.BecomesMonarchSourceEffect;
import mage.abilities.effects.common.DrawCardTargetEffect;
import mage.abilities.hint.common.MonarchHint;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -15,6 +16,7 @@ import mage.constants.SubType;
import mage.constants.TargetController;
import mage.filter.FilterPermanent;
import mage.filter.predicate.mageobject.CommanderPredicate;
+import mage.game.Game;
import java.util.UUID;
@@ -39,13 +41,11 @@ public final class ArchivistOfGondor extends CardImpl {
this.toughness = new MageInt(3);
// When your commander deals combat damage to a player, if there is no monarch, you become the monarch.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new DealsDamageToAPlayerAllTriggeredAbility(
- new BecomesMonarchSourceEffect(), filter, false,
- SetTargetPointer.NONE, true
- ), (game, source) -> game.getMonarchId() == null, "When your commander " +
- "deals combat damage to a player, if there is no monarch, you become the monarch."
- ).addHint(MonarchHint.instance));
+ this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility(
+ new BecomesMonarchSourceEffect(), filter, false,
+ SetTargetPointer.NONE, true
+ ).setTriggerPhrase("When your commander deals combat damage to a player, ")
+ .withInterveningIf(ArchivistOfGondorCondition.instance).addHint(MonarchHint.instance));
// At the beginning of the monarch's end step, that player draws a card.
this.addAbility(new BeginningOfEndStepTriggeredAbility(
@@ -62,3 +62,17 @@ public final class ArchivistOfGondor extends CardImpl {
return new ArchivistOfGondor(this);
}
}
+
+enum ArchivistOfGondorCondition implements Condition {
+ instance;
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return game.getMonarchId() == null;
+ }
+
+ @Override
+ public String toString() {
+ return "there is no monarch";
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/a/ArchmageAscension.java b/Mage.Sets/src/mage/cards/a/ArchmageAscension.java
index 76c4e4c2f31..2ae3ec86cfd 100644
--- a/Mage.Sets/src/mage/cards/a/ArchmageAscension.java
+++ b/Mage.Sets/src/mage/cards/a/ArchmageAscension.java
@@ -1,12 +1,11 @@
package mage.cards.a;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -30,12 +29,9 @@ public final class ArchmageAscension extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}");
// At the beginning of each end step, if you drew two or more cards this turn, you may put a quest counter on Archmage Ascension.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- TargetController.EACH_PLAYER, new AddCountersSourceEffect(CounterType.QUEST.createInstance(1)),
- true
- ), ArchmageAscensionCondition.instance, "At the beginning of each end step, " +
- "if you drew two or more cards this turn, you may put a quest counter on {this}."
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ TargetController.EACH_PLAYER, new AddCountersSourceEffect(CounterType.QUEST.createInstance()),
+ true, ArchmageAscensionCondition.instance
), new CardsAmountDrawnThisTurnWatcher());
// As long as Archmage Ascension has six or more quest counters on it, if you would draw a card,
@@ -61,6 +57,11 @@ enum ArchmageAscensionCondition implements Condition {
CardsAmountDrawnThisTurnWatcher watcher = game.getState().getWatcher(CardsAmountDrawnThisTurnWatcher.class);
return watcher != null && watcher.getAmountCardsDrawn(source.getControllerId()) >= 2;
}
+
+ @Override
+ public String toString() {
+ return "you drew two or more cards this turn";
+ }
}
class ArchmageAscensionReplacementEffect extends ReplacementEffectImpl {
diff --git a/Mage.Sets/src/mage/cards/a/ArchpriestOfIona.java b/Mage.Sets/src/mage/cards/a/ArchpriestOfIona.java
index dc165494fb4..8409984d5d9 100644
--- a/Mage.Sets/src/mage/cards/a/ArchpriestOfIona.java
+++ b/Mage.Sets/src/mage/cards/a/ArchpriestOfIona.java
@@ -2,19 +2,20 @@ package mage.cards.a;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.FullPartyCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.PartyCount;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.continuous.SetBasePowerSourceEffect;
import mage.abilities.hint.common.PartyCountHint;
import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.Zone;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@@ -35,19 +36,16 @@ public final class ArchpriestOfIona extends CardImpl {
// Archpriest of Iona's power is equal to the number of creatures in your party.
this.addAbility(new SimpleStaticAbility(
Zone.ALL,
- new SetBasePowerSourceEffect(
- PartyCount.instance
- ).setText("{this}'s power is equal to the number of creatures in your party. " + PartyCount.getReminder())
+ new SetBasePowerSourceEffect(PartyCount.instance)
+ .setText("{this}'s power is equal to the number of creatures in your party. " + PartyCount.getReminder())
).addHint(PartyCountHint.instance));
// At the beginning of combat on your turn, if you have a full party, target creature gets +1/+1 and gains flying until end of turn.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfCombatTriggeredAbility(
- new BoostTargetEffect(1, 1, Duration.EndOfTurn)
- ), FullPartyCondition.instance, "At the beginning of combat on your turn, " +
- "if you have a full party, target creature gets +1/+1 and gains flying until end of turn."
- );
- ability.addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn));
+ Ability ability = new BeginningOfCombatTriggeredAbility(
+ new BoostTargetEffect(1, 1).setText("target creature gets +1/+1")
+ ).withInterveningIf(FullPartyCondition.instance);
+ ability.addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance())
+ .setText("and gains flying until end of turn"));
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/a/ArrogantOutlaw.java b/Mage.Sets/src/mage/cards/a/ArrogantOutlaw.java
index fd815efc8d8..434a8048025 100644
--- a/Mage.Sets/src/mage/cards/a/ArrogantOutlaw.java
+++ b/Mage.Sets/src/mage/cards/a/ArrogantOutlaw.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.OpponentsLostLifeCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.abilities.hint.common.OpponentsLostLifeHint;
@@ -29,13 +28,10 @@ public final class ArrogantOutlaw extends CardImpl {
this.toughness = new MageInt(2);
// When Arrogant Outlaw enters the battlefield, if an opponent lost life this turn, each opponent loses 2 life and you gain 2 life.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(
- new LoseLifeOpponentsEffect(2), false
- ), OpponentsLostLifeCondition.instance, "When {this} enters, " +
- "if an opponent lost life this turn, each opponent loses 2 life and you gain 2 life."
- );
- ability.addEffect(new GainLifeEffect(2));
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new LoseLifeOpponentsEffect(2), false
+ ).withInterveningIf(OpponentsLostLifeCondition.instance);
+ ability.addEffect(new GainLifeEffect(2).concatBy("and"));
this.addAbility(ability.addHint(OpponentsLostLifeHint.instance));
}
diff --git a/Mage.Sets/src/mage/cards/a/AsajjVentress.java b/Mage.Sets/src/mage/cards/a/AsajjVentress.java
index 139d20b5f30..4384a66cd0b 100644
--- a/Mage.Sets/src/mage/cards/a/AsajjVentress.java
+++ b/Mage.Sets/src/mage/cards/a/AsajjVentress.java
@@ -1,13 +1,11 @@
package mage.cards.a;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.BecomesBlockedSourceTriggeredAbility;
import mage.abilities.condition.common.HateCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.BlockingCreatureCount;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.combat.BlocksIfAbleTargetEffect;
@@ -15,13 +13,12 @@ import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.SubType;
-import mage.constants.SuperType;
+import mage.constants.*;
import mage.target.common.TargetCreaturePermanent;
import mage.watchers.common.LifeLossOtherFromCombatWatcher;
+import java.util.UUID;
+
/**
* @author Styxo
*/
@@ -43,10 +40,8 @@ public final class AsajjVentress extends CardImpl {
this.addAbility(new BecomesBlockedSourceTriggeredAbility(effect, false));
// Hate — Whenever Asajj Ventress attacks, if an opponent lost life from a source other than combat damage this turn, target creature blocks this turn if able.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new BlocksIfAbleTargetEffect(Duration.EndOfTurn), false),
- HateCondition.instance,
- "Hate — Whenever Asajj Ventress attacks, if an opponent lost life from a source other than combat damage this turn, target creature blocks this turn if able");
+ Ability ability = new AttacksTriggeredAbility(new BlocksIfAbleTargetEffect(Duration.EndOfTurn), false)
+ .withInterveningIf(HateCondition.instance).setAbilityWord(AbilityWord.HATE);
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability, new LifeLossOtherFromCombatWatcher());
}
diff --git a/Mage.Sets/src/mage/cards/a/AshPartyCrasher.java b/Mage.Sets/src/mage/cards/a/AshPartyCrasher.java
index 7deb6eea062..6736bad9f80 100644
--- a/Mage.Sets/src/mage/cards/a/AshPartyCrasher.java
+++ b/Mage.Sets/src/mage/cards/a/AshPartyCrasher.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.condition.common.CelebrationCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
@@ -36,11 +35,8 @@ public final class AshPartyCrasher extends CardImpl {
this.addAbility(HasteAbility.getInstance());
// Celebration -- Whenever Ash, Party Crasher attacks, if two or more nonland permanents entered the battlefield under your control this turn, put a +1/+1 counter on Ash.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)), false),
- CelebrationCondition.instance, "Whenever {this} attacks, if two or more nonland permanents " +
- "entered the battlefield under your control this turn, put a +1/+1 counter on {this}."
- );
+ Ability ability = new AttacksTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)), false)
+ .withInterveningIf(CelebrationCondition.instance);
ability.setAbilityWord(AbilityWord.CELEBRATION);
ability.addHint(CelebrationCondition.getHint());
this.addAbility(ability, new PermanentsEnteredBattlefieldWatcher());
diff --git a/Mage.Sets/src/mage/cards/a/AsylumVisitor.java b/Mage.Sets/src/mage/cards/a/AsylumVisitor.java
index 558a2ecc4bf..3d01de1043e 100644
--- a/Mage.Sets/src/mage/cards/a/AsylumVisitor.java
+++ b/Mage.Sets/src/mage/cards/a/AsylumVisitor.java
@@ -2,14 +2,13 @@ package mage.cards.a;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.CardsInHandCondition;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
-import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.abilities.keyword.MadnessAbility;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -24,6 +23,8 @@ import java.util.UUID;
*/
public final class AsylumVisitor extends CardImpl {
+ private static final Condition condition = new CardsInHandCondition(ComparisonType.EQUAL_TO, 0, TargetController.ACTIVE);
+
public AsylumVisitor(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
this.subtype.add(SubType.VAMPIRE);
@@ -32,12 +33,10 @@ public final class AsylumVisitor extends CardImpl {
this.toughness = new MageInt(1);
// At the beginning of each player's upkeep, if that player has no cards in hand, you draw a card and you lose 1 life.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(TargetController.ANY, new DrawCardSourceControllerEffect(1, true), false),
- new CardsInHandCondition(ComparisonType.EQUAL_TO, 0, TargetController.ACTIVE),
- "At the beginning of each player's upkeep, if that player has no cards in hand, you draw a card and you lose 1 life.");
- Effect effect = new LoseLifeSourceControllerEffect(1);
- ability.addEffect(effect);
+ Ability ability = new BeginningOfUpkeepTriggeredAbility(
+ TargetController.ANY, new DrawCardSourceControllerEffect(1, true), false
+ ).withInterveningIf(condition);
+ ability.addEffect(new LoseLifeSourceControllerEffect(1).concatBy("and"));
this.addAbility(ability);
// Madness {1}{B}
diff --git a/Mage.Sets/src/mage/cards/a/AttendantOfVraska.java b/Mage.Sets/src/mage/cards/a/AttendantOfVraska.java
index d4f6dd732c7..fd25f2b0cc8 100644
--- a/Mage.Sets/src/mage/cards/a/AttendantOfVraska.java
+++ b/Mage.Sets/src/mage/cards/a/AttendantOfVraska.java
@@ -2,32 +2,26 @@ package mage.cards.a;
import mage.MageInt;
import mage.abilities.common.DiesSourceTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.SourcePermanentPowerValue;
import mage.abilities.effects.common.GainLifeEffect;
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.FilterControlledPlaneswalkerPermanent;
import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class AttendantOfVraska extends CardImpl {
- private static final FilterPermanent filter = new FilterPermanent("a Vraska planeswalker");
-
- static {
- filter.add(TargetController.YOU.getControllerPredicate());
- filter.add(CardType.PLANESWALKER.getPredicate());
- filter.add(SubType.VRASKA.getPredicate());
- }
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterControlledPlaneswalkerPermanent(SubType.VRASKA, "you control a Vraska planeswalker")
+ );
public AttendantOfVraska(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{G}");
@@ -38,13 +32,8 @@ public final class AttendantOfVraska extends CardImpl {
this.toughness = new MageInt(3);
// When Attendant of Vraska dies, if you control a Vraska planeswalker, you gain life equal to Attendant of Vraska's power.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new DiesSourceTriggeredAbility(new GainLifeEffect(
- SourcePermanentPowerValue.NOT_NEGATIVE
- ), false), new PermanentsOnTheBattlefieldCondition(filter),
- "When {this} dies, if you control a Vraska planeswalker, "
- + "you gain life equal to {this}'s power."
- ));
+ this.addAbility(new DiesSourceTriggeredAbility(new GainLifeEffect(SourcePermanentPowerValue.NOT_NEGATIVE)
+ .setText("you gain life equal to {this}'s power"), false).withInterveningIf(condition));
}
private AttendantOfVraska(final AttendantOfVraska card) {
diff --git a/Mage.Sets/src/mage/cards/a/AuroraChampion.java b/Mage.Sets/src/mage/cards/a/AuroraChampion.java
index c21eefb425c..d712378e719 100644
--- a/Mage.Sets/src/mage/cards/a/AuroraChampion.java
+++ b/Mage.Sets/src/mage/cards/a/AuroraChampion.java
@@ -1,33 +1,35 @@
-
package mage.cards.a;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.TapTargetEffect;
-import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
import mage.filter.common.FilterTeamPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class AuroraChampion extends CardImpl {
- private static final FilterTeamPermanent filter = new FilterTeamPermanent(SubType.WARRIOR, "another Warrior");
+ 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 AuroraChampion(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
@@ -37,11 +39,7 @@ public final class AuroraChampion extends CardImpl {
this.toughness = new MageInt(2);
// Whenever Aurora Champion attacks, if your team controls another Warrior, tap target creature.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new TapTargetEffect(), false),
- new PermanentsOnTheBattlefieldCondition(filter),
- "Whenever {this} attacks, if your team controls another Warrior, tap target creature."
- );
+ Ability ability = new AttacksTriggeredAbility(new TapTargetEffect(), false).withInterveningIf(condition);
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/m/MangarasBlessing.java b/Mage.Sets/src/mage/cards/m/MangarasBlessing.java
index 9fc0f218eaf..9ea2945fb29 100644
--- a/Mage.Sets/src/mage/cards/m/MangarasBlessing.java
+++ b/Mage.Sets/src/mage/cards/m/MangarasBlessing.java
@@ -26,7 +26,7 @@ public final class MangarasBlessing extends CardImpl {
// When a spell or ability an opponent controls causes you to discard Mangara's Blessing,
// you gain 2 life, and you return Mangara's Blessing from your graveyard to your hand at the beginning of the next end step.
- Ability ability = new DiscardedByOpponentTriggeredAbility(new GainLifeEffect(2), true);
+ Ability ability = new DiscardedByOpponentTriggeredAbility(new GainLifeEffect(2));
Effect graveyardReturnNextEndEffect = new CreateDelayedTriggeredAbilityEffect(
new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnSourceFromGraveyardToHandEffect()));
diff --git a/Mage.Sets/src/mage/cards/m/Metrognome.java b/Mage.Sets/src/mage/cards/m/Metrognome.java
index 012cb2271c0..4c11c7b397c 100644
--- a/Mage.Sets/src/mage/cards/m/Metrognome.java
+++ b/Mage.Sets/src/mage/cards/m/Metrognome.java
@@ -10,7 +10,6 @@ import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.Zone;
import mage.game.permanent.token.GnomeToken;
/**
@@ -23,7 +22,7 @@ public final class Metrognome extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
// When a spell or ability an opponent controls causes you to discard Metrognome, create four 1/1 colorless Gnome artifact creature tokens.
- this.addAbility(new DiscardedByOpponentTriggeredAbility(new CreateTokenEffect(new GnomeToken(), 4), true));
+ this.addAbility(new DiscardedByOpponentTriggeredAbility(new CreateTokenEffect(new GnomeToken(), 4)));
// {4}, {tap}: Create a 1/1 colorless Gnome artifact creature token.
Ability ability = new SimpleActivatedAbility(new CreateTokenEffect(new GnomeToken()), new ManaCostsImpl<>("{4}"));
diff --git a/Mage.Sets/src/mage/cards/q/Quagnoth.java b/Mage.Sets/src/mage/cards/q/Quagnoth.java
index aeaad7a581c..b9819c458f0 100644
--- a/Mage.Sets/src/mage/cards/q/Quagnoth.java
+++ b/Mage.Sets/src/mage/cards/q/Quagnoth.java
@@ -31,7 +31,7 @@ public final class Quagnoth extends CardImpl {
// When a spell or ability an opponent controls causes you to discard Quagnoth, return it to your hand.
this.addAbility(new DiscardedByOpponentTriggeredAbility(new ReturnToHandSourceEffect()
- .setText("return it to your hand"), true));
+ .setText("return it to your hand")));
}
private Quagnoth(final Quagnoth card) {
diff --git a/Mage.Sets/src/mage/cards/s/SandGolem.java b/Mage.Sets/src/mage/cards/s/SandGolem.java
index c54428fb8e6..cba5c7b495b 100644
--- a/Mage.Sets/src/mage/cards/s/SandGolem.java
+++ b/Mage.Sets/src/mage/cards/s/SandGolem.java
@@ -32,7 +32,7 @@ public final class SandGolem extends CardImpl {
new ReturnSourceFromGraveyardToBattlefieldWithCounterEffect(CounterType.P1P1.createInstance(), false)));
effect.setText("return {this} from your graveyard to the battlefield with a +1/+1 counter on it at the beginning of the next end step");
- this.addAbility(new DiscardedByOpponentTriggeredAbility(effect, true));
+ this.addAbility(new DiscardedByOpponentTriggeredAbility(effect));
}
private SandGolem(final SandGolem card) {
diff --git a/Mage/src/main/java/mage/abilities/common/DiscardedByOpponentTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DiscardedByOpponentTriggeredAbility.java
index 75e3df42573..0d86a1058c2 100644
--- a/Mage/src/main/java/mage/abilities/common/DiscardedByOpponentTriggeredAbility.java
+++ b/Mage/src/main/java/mage/abilities/common/DiscardedByOpponentTriggeredAbility.java
@@ -13,13 +13,8 @@ import mage.game.stack.StackObject;
public class DiscardedByOpponentTriggeredAbility extends TriggeredAbilityImpl {
public DiscardedByOpponentTriggeredAbility(Effect effect) {
- this(effect, false);
- }
-
- public DiscardedByOpponentTriggeredAbility(Effect effect, boolean textCardName) {
super(Zone.GRAVEYARD, effect, false);
- setTriggerPhrase("When a spell or ability an opponent controls causes you to discard "
- + (textCardName ? "{this}, " : "this card, "));
+ setTriggerPhrase("When a spell or ability an opponent controls causes you to discard this card");
}
protected DiscardedByOpponentTriggeredAbility(final DiscardedByOpponentTriggeredAbility ability) {
@@ -38,12 +33,10 @@ public class DiscardedByOpponentTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- if (getSourceId().equals(event.getTargetId())) {
- StackObject stackObject = game.getStack().getStackObject(event.getSourceId());
- if (stackObject != null) {
- return game.getOpponents(this.getControllerId()).contains(stackObject.getControllerId());
- }
+ if (!getSourceId().equals(event.getTargetId())) {
+ return false;
}
- return false;
+ StackObject stackObject = game.getStack().getStackObject(event.getSourceId());
+ return stackObject != null && game.getOpponents(this.getControllerId()).contains(stackObject.getControllerId());
}
}
diff --git a/Mage/src/main/java/mage/abilities/condition/common/FullPartyCondition.java b/Mage/src/main/java/mage/abilities/condition/common/FullPartyCondition.java
index 885640c2caa..362b89881ce 100644
--- a/Mage/src/main/java/mage/abilities/condition/common/FullPartyCondition.java
+++ b/Mage/src/main/java/mage/abilities/condition/common/FullPartyCondition.java
@@ -8,7 +8,6 @@ import mage.game.Game;
/**
* @author TheElk801
*/
-
public enum FullPartyCondition implements Condition {
instance;
@@ -16,4 +15,9 @@ public enum FullPartyCondition implements Condition {
public boolean apply(Game game, Ability source) {
return PartyCount.instance.calculate(game, source, null) >= 4;
}
+
+ @Override
+ public String toString() {
+ return "you have a full party";
+ }
}
diff --git a/Mage/src/main/java/mage/abilities/condition/common/KickedCostCondition.java b/Mage/src/main/java/mage/abilities/condition/common/KickedCostCondition.java
index b3dcf1ee4d4..3ee36b76a1a 100644
--- a/Mage/src/main/java/mage/abilities/condition/common/KickedCostCondition.java
+++ b/Mage/src/main/java/mage/abilities/condition/common/KickedCostCondition.java
@@ -12,9 +12,9 @@ import mage.game.Game;
*/
public class KickedCostCondition implements Condition {
- protected String kickerCostText;
+ protected final String kickerCostText;
- public KickedCostCondition(String kickerCostText) {
+ public KickedCostCondition(String kickerCostText) {
this.kickerCostText = kickerCostText;
}
@@ -22,4 +22,9 @@ public class KickedCostCondition implements Condition {
public boolean apply(Game game, Ability source) {
return KickerAbility.getKickedCounterStrict(game, source, kickerCostText) > 0;
}
+
+ @Override
+ public String toString() {
+ return "it was kicked with its " + kickerCostText + " kicker";
+ }
}