diff --git a/Mage.Sets/src/mage/cards/j/JaceMirrorMage.java b/Mage.Sets/src/mage/cards/j/JaceMirrorMage.java
index cfb398ddb63..f221f75e324 100644
--- a/Mage.Sets/src/mage/cards/j/JaceMirrorMage.java
+++ b/Mage.Sets/src/mage/cards/j/JaceMirrorMage.java
@@ -4,7 +4,6 @@ import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenCopyTargetEffect;
import mage.abilities.effects.keyword.ScryEffect;
@@ -41,11 +40,7 @@ public final class JaceMirrorMage extends CardImpl {
this.addAbility(new KickerAbility("{2}"));
// When Jace, Mirror Mage enters the battlefield, if Jace was kicked, create a token that's a copy of Jace, Mirror Mage except it's not legendary and its starting loyalty is 1.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new JaceMirrorMageCopyEffect()),
- KickedCondition.ONCE, "When {this} enters, if {this} was kicked, " +
- "create a token that's a copy of {this}, except it's not legendary and its starting loyalty is 1."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new JaceMirrorMageCopyEffect()).withInterveningIf(KickedCondition.ONCE));
// +1: Scry 2.
this.addAbility(new LoyaltyAbility(new ScryEffect(2), 1));
@@ -68,6 +63,7 @@ class JaceMirrorMageCopyEffect extends OneShotEffect {
JaceMirrorMageCopyEffect() {
super(Outcome.Benefit);
+ staticText = "create a token that's a copy of {this}, except it's not legendary and its starting loyalty is 1.";
}
private JaceMirrorMageCopyEffect(final JaceMirrorMageCopyEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/j/JadedSellSword.java b/Mage.Sets/src/mage/cards/j/JadedSellSword.java
index 1baeb5240f7..29cf15c604d 100644
--- a/Mage.Sets/src/mage/cards/j/JadedSellSword.java
+++ b/Mage.Sets/src/mage/cards/j/JadedSellSword.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.TreasureSpentToCastCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.HasteAbility;
@@ -13,7 +12,6 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
-import mage.watchers.common.ManaPaidSourceWatcher;
import java.util.UUID;
@@ -31,15 +29,12 @@ public final class JadedSellSword extends CardImpl {
this.toughness = new MageInt(3);
// When Jaded Sell-Sword enters the battlefield, if mana from a Treasure was spent to cast it, it gains first strike and haste until end of turn.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new GainAbilitySourceEffect(
- FirstStrikeAbility.getInstance(), Duration.EndOfTurn
- )), TreasureSpentToCastCondition.instance, "When {this} enters, " +
- "if mana from a Treasure was spent to cast it, it gains first strike and haste until end of turn."
- );
+ Ability ability = new EntersBattlefieldTriggeredAbility(new GainAbilitySourceEffect(
+ FirstStrikeAbility.getInstance(), Duration.EndOfTurn
+ ).setText("it gains first strike")).withInterveningIf(TreasureSpentToCastCondition.instance);
ability.addEffect(new GainAbilitySourceEffect(
HasteAbility.getInstance(), Duration.EndOfTurn
- ));
+ ).setText("and haste until end of turn"));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/j/JaggedPoppet.java b/Mage.Sets/src/mage/cards/j/JaggedPoppet.java
index ce1ca657e24..e01eeb0da47 100644
--- a/Mage.Sets/src/mage/cards/j/JaggedPoppet.java
+++ b/Mage.Sets/src/mage/cards/j/JaggedPoppet.java
@@ -1,12 +1,9 @@
package mage.cards.j;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.Ability;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.common.DealtDamageToSourceTriggeredAbility;
import mage.abilities.condition.common.HellbentCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.SavedDamageValue;
import mage.abilities.effects.common.discard.DiscardControllerEffect;
import mage.abilities.effects.common.discard.DiscardTargetEffect;
@@ -16,8 +13,9 @@ import mage.constants.AbilityWord;
import mage.constants.CardType;
import mage.constants.SubType;
+import java.util.UUID;
+
/**
- *
* @author jerekwilson
*/
public final class JaggedPoppet extends CardImpl {
@@ -31,15 +29,16 @@ public final class JaggedPoppet extends CardImpl {
this.toughness = new MageInt(4);
// Whenever Jagged Poppet is dealt damage, discard that many cards.
- this.addAbility(new DealtDamageToSourceTriggeredAbility(new DiscardControllerEffect(SavedDamageValue.MANY), false));
+ this.addAbility(new DealtDamageToSourceTriggeredAbility(
+ new DiscardControllerEffect(SavedDamageValue.MANY), false
+ ));
// Hellbent - Whenever Jagged Poppet deals combat damage to a player, if you have no cards in hand, that player discards cards equal to the damage.
- Ability hellbentAbility = new ConditionalInterveningIfTriggeredAbility(
- new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(SavedDamageValue.MANY), false, true),
- HellbentCondition.instance,
- "Whenever {this} deals combat damage to a player, if you have no cards in hand, that player discards cards equal to the damage.");
- hellbentAbility.setAbilityWord(AbilityWord.HELLBENT);
- this.addAbility(hellbentAbility);
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
+ new DiscardTargetEffect(SavedDamageValue.MANY)
+ .setText("that player discards cards equal to the damage"),
+ false, true
+ ).withInterveningIf(HellbentCondition.instance).setAbilityWord(AbilityWord.HELLBENT));
}
private JaggedPoppet(final JaggedPoppet card) {
diff --git a/Mage.Sets/src/mage/cards/j/JeeringInstigator.java b/Mage.Sets/src/mage/cards/j/JeeringInstigator.java
index 61beb4fa0ec..08b77a67d25 100644
--- a/Mage.Sets/src/mage/cards/j/JeeringInstigator.java
+++ b/Mage.Sets/src/mage/cards/j/JeeringInstigator.java
@@ -3,10 +3,10 @@ package mage.cards.j;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility;
-import mage.abilities.condition.common.MyTurnCondition;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.InvertCondition;
+import mage.abilities.condition.common.NotMyTurnCondition;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
-import mage.abilities.effects.Effect;
import mage.abilities.effects.common.UntapTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
@@ -18,9 +18,8 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.mageobject.AnotherPredicate;
-import mage.target.common.TargetCreaturePermanent;
+import mage.filter.StaticFilters;
+import mage.target.TargetPermanent;
import java.util.UUID;
@@ -29,11 +28,7 @@ import java.util.UUID;
*/
public final class JeeringInstigator extends CardImpl {
- static final private FilterCreaturePermanent filter = new FilterCreaturePermanent();
-
- static {
- filter.add(AnotherPredicate.instance);
- }
+ private static final Condition condition = new InvertCondition(NotMyTurnCondition.instance, "it's your turn");
public JeeringInstigator(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
@@ -47,20 +42,16 @@ public final class JeeringInstigator extends CardImpl {
this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{2}{R}")));
// When Jeering Instigator is turned face up, if it's your turn, gain control of another target creature until end of turn. Untap it. That creature gains haste until end of turn.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new TurnedFaceUpSourceTriggeredAbility(new GainControlTargetEffect(Duration.EndOfTurn), false, false),
- MyTurnCondition.instance,
- "When {this} is turned face up, if it's your turn, gain control of another target creature until end of turn. Untap that creature. It gains haste until end of turn.");
+ Ability ability = new TurnedFaceUpSourceTriggeredAbility(
+ new GainControlTargetEffect(Duration.EndOfTurn), false, false
+ ).withInterveningIf(condition);
+ ability.addEffect(new UntapTargetEffect().setText("Untap that creature"));
+ ability.addEffect(new GainAbilityTargetEffect(
+ HasteAbility.getInstance(), Duration.EndOfTurn
+ ).setText("It gains haste until end of turn"));
+ ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE));
ability.setWorksFaceDown(true);
- Effect effect = new UntapTargetEffect();
- effect.setText("Untap that creature");
- ability.addEffect(effect);
- effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn);
- effect.setText("It gains haste until end of turn");
- ability.addEffect(effect);
- ability.addTarget(new TargetCreaturePermanent(filter));
- ability.addHint(MyTurnHint.instance);
- this.addAbility(ability);
+ this.addAbility(ability.addHint(MyTurnHint.instance));
}
private JeeringInstigator(final JeeringInstigator card) {
diff --git a/Mage.Sets/src/mage/cards/j/JosuVessLichKnight.java b/Mage.Sets/src/mage/cards/j/JosuVessLichKnight.java
index c5397acc96a..016e8be553d 100644
--- a/Mage.Sets/src/mage/cards/j/JosuVessLichKnight.java
+++ b/Mage.Sets/src/mage/cards/j/JosuVessLichKnight.java
@@ -3,7 +3,6 @@ package mage.cards.j;
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.abilities.keyword.MenaceAbility;
@@ -18,7 +17,7 @@ import java.util.UUID;
public final class JosuVessLichKnight extends CardImpl {
- public JosuVessLichKnight(UUID ownerID, CardSetInfo cardSetInfo){
+ public JosuVessLichKnight(UUID ownerID, CardSetInfo cardSetInfo) {
super(ownerID, cardSetInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ZOMBIE, SubType.KNIGHT);
@@ -32,12 +31,12 @@ public final class JosuVessLichKnight extends CardImpl {
this.addAbility(new MenaceAbility(false));
//When Josu Vess, Lich Knight enters the battlefield, if it was kicked, create eight 2/2 black Zombie Knight creature tokens with menace.
- EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieKnightToken(), 8));
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, KickedCondition.ONCE,
- "When {this} enters, if it was kicked, create eight 2/2 black Zombie Knight creature tokens with menace."));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new CreateTokenEffect(new ZombieKnightToken(), 8)
+ ).withInterveningIf(KickedCondition.ONCE));
}
- private JosuVessLichKnight(final JosuVessLichKnight card){
+ private JosuVessLichKnight(final JosuVessLichKnight card) {
super(card);
}
diff --git a/Mage.Sets/src/mage/cards/j/JuniperOrderRootweaver.java b/Mage.Sets/src/mage/cards/j/JuniperOrderRootweaver.java
index 0e22e065f99..3c3beccdc97 100644
--- a/Mage.Sets/src/mage/cards/j/JuniperOrderRootweaver.java
+++ b/Mage.Sets/src/mage/cards/j/JuniperOrderRootweaver.java
@@ -4,7 +4,6 @@ import mage.MageInt;
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.counter.AddCountersTargetEffect;
import mage.abilities.keyword.KickerAbility;
import mage.cards.CardImpl;
@@ -33,11 +32,9 @@ public final class JuniperOrderRootweaver extends CardImpl {
this.addAbility(new KickerAbility("{G}"));
// When Juniper Order Rootweaver enters the battlefield, if it was kicked, put a +1/+1 counter on target creature you control.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(
- new AddCountersTargetEffect(CounterType.P1P1.createInstance())
- ), KickedCondition.ONCE, "When {this} enters, " +
- "if it was kicked, put a +1/+1 counter on target creature you control.");
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new AddCountersTargetEffect(CounterType.P1P1.createInstance())
+ ).withInterveningIf(KickedCondition.ONCE);
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/k/KangeeAerieKeeper.java b/Mage.Sets/src/mage/cards/k/KangeeAerieKeeper.java
index f33970abf0a..3da23f749cc 100644
--- a/Mage.Sets/src/mage/cards/k/KangeeAerieKeeper.java
+++ b/Mage.Sets/src/mage/cards/k/KangeeAerieKeeper.java
@@ -1,11 +1,10 @@
package mage.cards.k;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.CountersSourceCount;
import mage.abilities.dynamicvalue.common.GetXValue;
import mage.abilities.effects.common.continuous.BoostAllEffect;
@@ -14,7 +13,10 @@ import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.KickerAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.constants.SuperType;
import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
@@ -33,6 +35,8 @@ public final class KangeeAerieKeeper extends CardImpl {
filter.add(AnotherPredicate.instance);
}
+ private static final DynamicValue xValue = new CountersSourceCount(CounterType.FEATHER);
+
public KangeeAerieKeeper(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{U}");
this.supertype.add(SuperType.LEGENDARY);
@@ -49,11 +53,15 @@ public final class KangeeAerieKeeper extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// When Kangee, Aerie Keeper enters the battlefield, if it was kicked, put X feather counters on it.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new AddCountersSourceEffect(CounterType.FEATHER.createInstance(), GetXValue.instance, true));
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, KickedCondition.ONCE, "When {this} enters, if it was kicked, put X feather counters on it."));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new AddCountersSourceEffect(
+ CounterType.FEATHER.createInstance(), GetXValue.instance, true
+ )).withInterveningIf(KickedCondition.ONCE));
// Other Bird creatures get +1/+1 for each feather counter on Kangee, Aerie Keeper.
- this.addAbility(new SimpleStaticAbility(new BoostAllEffect(new CountersSourceCount(CounterType.FEATHER), new CountersSourceCount(CounterType.FEATHER), Duration.WhileOnBattlefield, filter, true, "Other Bird creatures get +1/+1 for each feather counter on {this}.")));
+ this.addAbility(new SimpleStaticAbility(new BoostAllEffect(
+ xValue, xValue, Duration.WhileOnBattlefield, filter, true,
+ "Other Bird creatures get +1/+1 for each feather counter on {this}."
+ )));
}
private KangeeAerieKeeper(final KangeeAerieKeeper card) {
diff --git a/Mage.Sets/src/mage/cards/k/KarlachFuryOfAvernus.java b/Mage.Sets/src/mage/cards/k/KarlachFuryOfAvernus.java
index a606bfc31e4..0effa284293 100644
--- a/Mage.Sets/src/mage/cards/k/KarlachFuryOfAvernus.java
+++ b/Mage.Sets/src/mage/cards/k/KarlachFuryOfAvernus.java
@@ -5,16 +5,17 @@ import mage.abilities.Ability;
import mage.abilities.common.AttacksWithCreaturesTriggeredAbility;
import mage.abilities.common.ChooseABackgroundAbility;
import mage.abilities.condition.common.FirstCombatPhaseCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.AdditionalCombatPhaseEffect;
import mage.abilities.effects.common.UntapAllEffect;
import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.constants.SuperType;
import mage.filter.StaticFilters;
-import mage.game.Game;
import java.util.UUID;
@@ -33,17 +34,13 @@ public final class KarlachFuryOfAvernus extends CardImpl {
this.toughness = new MageInt(4);
// Whenever you attack, if it's the first combat phase of the turn, untap all attacking creatures. They gain first strike until end of turn. After this phase, there is an additional combat phase.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new AttacksWithCreaturesTriggeredAbility(
- new UntapAllEffect(StaticFilters.FILTER_ATTACKING_CREATURES), 1
- ), FirstCombatPhaseCondition.instance, "Whenever you attack, if it's the first " +
- "combat phase of the turn, untap all attacking creatures. They gain first strike " +
- "until end of turn. After this phase, there is an additional combat phase."
- );
+ Ability ability = new AttacksWithCreaturesTriggeredAbility(
+ new UntapAllEffect(StaticFilters.FILTER_ATTACKING_CREATURES), 1
+ ).withInterveningIf(FirstCombatPhaseCondition.instance);
ability.addEffect(new GainAbilityAllEffect(
FirstStrikeAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_ATTACKING_CREATURES
- ));
+ ).setText("They gain first strike until end of turn"));
ability.addEffect(new AdditionalCombatPhaseEffect());
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/k/KarplusanHound.java b/Mage.Sets/src/mage/cards/k/KarplusanHound.java
index cfd0c78ea9d..39ef5994d2c 100644
--- a/Mage.Sets/src/mage/cards/k/KarplusanHound.java
+++ b/Mage.Sets/src/mage/cards/k/KarplusanHound.java
@@ -1,11 +1,10 @@
package mage.cards.k;
-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.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -14,27 +13,26 @@ import mage.constants.SubType;
import mage.filter.common.FilterPlaneswalkerPermanent;
import mage.target.common.TargetAnyTarget;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class KarplusanHound extends CardImpl {
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterPlaneswalkerPermanent(SubType.CHANDRA, "you control a Chandra planeswalker")
+ );
+
public KarplusanHound(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
this.subtype.add(SubType.DOG);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
- FilterPlaneswalkerPermanent filter = new FilterPlaneswalkerPermanent("a Chandra planeswalker");
- filter.add(SubType.CHANDRA.getPredicate());
+
// Whenever Karplusan Hound attacks, if you control a Chandra planeswalker, this creature deals 2 damage to any target.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new DamageTargetEffect(2), false),
- new PermanentsOnTheBattlefieldCondition(filter),
- "Whenever {this} attacks, if you control a Chandra planeswalker, "
- + "this creature deals 2 damage to any target"
- );
+ Ability ability = new AttacksTriggeredAbility(new DamageTargetEffect(2)).withInterveningIf(condition);
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/k/KeeperOfKeys.java b/Mage.Sets/src/mage/cards/k/KeeperOfKeys.java
index a35271883d5..86b92e316aa 100644
--- a/Mage.Sets/src/mage/cards/k/KeeperOfKeys.java
+++ b/Mage.Sets/src/mage/cards/k/KeeperOfKeys.java
@@ -1,24 +1,23 @@
package mage.cards.k;
-import java.util.UUID;
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.combat.CantBeBlockedAllEffect;
import mage.abilities.hint.common.MonarchHint;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
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 LevelX2
*/
public final class KeeperOfKeys extends CardImpl {
@@ -36,10 +35,9 @@ public final class KeeperOfKeys extends CardImpl {
this.addAbility(new EntersBattlefieldTriggeredAbility(new BecomesMonarchSourceEffect()).addHint(MonarchHint.instance));
// At the beginning of your upkeep, if you're the monarch, creatures you control can't be blocked this turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(new BeginningOfUpkeepTriggeredAbility(
- new CantBeBlockedAllEffect(StaticFilters.FILTER_CONTROLLED_CREATURES, Duration.EndOfTurn)
- ), MonarchIsSourceControllerCondition.instance,
- "At the beginning of your upkeep, if you're the monarch, creatures you control can't be blocked this turn."));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CantBeBlockedAllEffect(
+ StaticFilters.FILTER_CONTROLLED_CREATURES, Duration.EndOfTurn
+ )).withInterveningIf(MonarchIsSourceControllerCondition.instance));
}
private KeeperOfKeys(final KeeperOfKeys card) {
diff --git a/Mage.Sets/src/mage/cards/k/KeeperOfTheAccord.java b/Mage.Sets/src/mage/cards/k/KeeperOfTheAccord.java
index 1c90188f3da..71a7c7c5ff1 100644
--- a/Mage.Sets/src/mage/cards/k/KeeperOfTheAccord.java
+++ b/Mage.Sets/src/mage/cards/k/KeeperOfTheAccord.java
@@ -2,11 +2,10 @@ package mage.cards.k;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -43,22 +42,14 @@ public final class KeeperOfTheAccord extends CardImpl {
this.toughness = new MageInt(4);
// At the beginning of each opponent's end step, if that player controls more creatures than you, create a 1/1 white Soldier creature token.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- TargetController.OPPONENT, new CreateTokenEffect(new SoldierToken()), false
- ), KeeperOfTheAccordCondition.CREATURES, "At the beginning of each opponent's end step, " +
- "if that player controls more creatures than you, create a 1/1 white Soldier creature token."
- ));
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ TargetController.OPPONENT, new CreateTokenEffect(new SoldierToken()), false
+ ).withInterveningIf(KeeperOfTheAccordCondition.CREATURES));
// At the beginning of each opponent's end step, if that player controls more lands than you, you may search your library for a basic Plains card, put it onto the battlefield tapped, then shuffle your library.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(TargetController.OPPONENT, new SearchLibraryPutInPlayEffect(
- new TargetCardInLibrary(filter), true
- ), true),
- KeeperOfTheAccordCondition.LANDS, "At the beginning of each opponent's end step, " +
- "if that player controls more lands than you, you may search your library for a basic Plains card, " +
- "put it onto the battlefield tapped, then shuffle."
- ));
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ TargetController.OPPONENT, new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), true
+ ).withInterveningIf(KeeperOfTheAccordCondition.LANDS));
}
private KeeperOfTheAccord(final KeeperOfTheAccord card) {
@@ -87,4 +78,9 @@ enum KeeperOfTheAccordCondition implements Condition {
return game.getBattlefield().countAll(filter, source.getControllerId(), game)
< game.getBattlefield().countAll(filter, game.getActivePlayerId(), game);
}
+
+ @Override
+ public String toString() {
+ return "that player controls more " + filter.getMessage() + " than you";
+ }
}
diff --git a/Mage.Sets/src/mage/cards/k/KeldonBerserker.java b/Mage.Sets/src/mage/cards/k/KeldonBerserker.java
index 59237df12a6..a94521f8c77 100644
--- a/Mage.Sets/src/mage/cards/k/KeldonBerserker.java
+++ b/Mage.Sets/src/mage/cards/k/KeldonBerserker.java
@@ -1,33 +1,36 @@
package mage.cards.k;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
-import mage.abilities.condition.InvertCondition;
+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.ComparisonType;
import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledLandPermanent;
import mage.filter.predicate.permanent.TappedPredicate;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class KeldonBerserker extends CardImpl {
- private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("untapped lands");
+ private static final FilterPermanent filter = new FilterControlledLandPermanent("you control no untapped lands");
static {
filter.add(TappedPredicate.UNTAPPED);
}
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0);
+
public KeldonBerserker(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
@@ -38,11 +41,9 @@ public final class KeldonBerserker extends CardImpl {
this.toughness = new MageInt(3);
// Whenever Keldon Berserker attacks, if you control no untapped lands, it gets +3/+0 until end of turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new BoostSourceEffect(3, 0, Duration.EndOfTurn), false),
- new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter)),
- "Whenever {this} attacks, if you control no untapped lands, it gets +3/+0 until end of turn."
- ));
+ this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(
+ 3, 0, Duration.EndOfTurn, "it"
+ )).withInterveningIf(condition));
}
private KeldonBerserker(final KeldonBerserker card) {
diff --git a/Mage.Sets/src/mage/cards/k/KeldonOverseer.java b/Mage.Sets/src/mage/cards/k/KeldonOverseer.java
index 7634b4ec17e..17ea8c590b9 100644
--- a/Mage.Sets/src/mage/cards/k/KeldonOverseer.java
+++ b/Mage.Sets/src/mage/cards/k/KeldonOverseer.java
@@ -1,12 +1,9 @@
-
package mage.cards.k;
-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.UntapTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
@@ -19,8 +16,9 @@ import mage.constants.Duration;
import mage.constants.SubType;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class KeldonOverseer extends CardImpl {
@@ -40,12 +38,15 @@ public final class KeldonOverseer extends CardImpl {
this.addAbility(HasteAbility.getInstance());
// When Keldon Overseer enters the battlefield, if it was kicked, gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn.
- TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new GainControlTargetEffect(Duration.EndOfTurn, true));
- ability.addEffect(new UntapTargetEffect());
- ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn));
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new GainControlTargetEffect(Duration.EndOfTurn)
+ ).withInterveningIf(KickedCondition.ONCE);
+ ability.addEffect(new UntapTargetEffect("Untap that creature"));
+ ability.addEffect(new GainAbilityTargetEffect(
+ HasteAbility.getInstance(), Duration.EndOfTurn
+ ).setText("It gains haste until end of turn"));
ability.addTarget(new TargetCreaturePermanent());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, KickedCondition.ONCE,
- "When {this} enters, if it was kicked, gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn."));
+ this.addAbility(ability);
}
private KeldonOverseer(final KeldonOverseer card) {
diff --git a/Mage.Sets/src/mage/cards/k/KeldonStrikeTeam.java b/Mage.Sets/src/mage/cards/k/KeldonStrikeTeam.java
index d718011d349..df094b0a56a 100644
--- a/Mage.Sets/src/mage/cards/k/KeldonStrikeTeam.java
+++ b/Mage.Sets/src/mage/cards/k/KeldonStrikeTeam.java
@@ -6,7 +6,6 @@ import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.KickedCondition;
import mage.abilities.condition.common.SourceEnteredThisTurnCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.HasteAbility;
@@ -38,11 +37,9 @@ public final class KeldonStrikeTeam extends CardImpl {
this.addAbility(new KickerAbility("{1}{W}"));
// When Keldon Strike Team 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));
// As long as Keldon Strike Team entered the battlefield this turn, creatures you control have haste.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
diff --git a/Mage.Sets/src/mage/cards/k/Kezzerdrix.java b/Mage.Sets/src/mage/cards/k/Kezzerdrix.java
index 2e4e111d1f2..f4fc06f471d 100644
--- a/Mage.Sets/src/mage/cards/k/Kezzerdrix.java
+++ b/Mage.Sets/src/mage/cards/k/Kezzerdrix.java
@@ -1,27 +1,31 @@
-
package mage.cards.k;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
-import mage.abilities.condition.common.CreatureCountCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.effects.common.DamageControllerEffect;
import mage.abilities.keyword.FirstStrikeAbility;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
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.common.FilterOpponentsCreaturePermanent;
+
+import java.util.UUID;
/**
- *
* @author jeffwadsworth
*/
public final class Kezzerdrix extends CardImpl {
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterOpponentsCreaturePermanent("your opponents control no creatures"), ComparisonType.EQUAL_TO, 0
+ );
+
public Kezzerdrix(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
this.subtype.add(SubType.RABBIT);
this.subtype.add(SubType.BEAST);
@@ -32,10 +36,7 @@ public final class Kezzerdrix extends CardImpl {
this.addAbility(FirstStrikeAbility.getInstance());
// At the beginning of your upkeep, if your opponents control no creatures, Kezzerdrix deals 4 damage to you.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(new DamageControllerEffect(4)),
- new CreatureCountCondition(0, TargetController.OPPONENT),
- "At the beginning of your upkeep, if your opponents control no creatures, {this} deals 4 damage to you."));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DamageControllerEffect(4)).withInterveningIf(condition));
}
private Kezzerdrix(final Kezzerdrix card) {
diff --git a/Mage.Sets/src/mage/cards/k/KioraTheRisingTide.java b/Mage.Sets/src/mage/cards/k/KioraTheRisingTide.java
index 8d47f26d2b2..1c7450de867 100644
--- a/Mage.Sets/src/mage/cards/k/KioraTheRisingTide.java
+++ b/Mage.Sets/src/mage/cards/k/KioraTheRisingTide.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.ThresholdCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.cards.CardImpl;
@@ -18,14 +17,13 @@ import mage.game.permanent.token.ScionOfTheDeepToken;
import java.util.UUID;
/**
- *
* @author ciaccona007
*/
public final class KioraTheRisingTide extends CardImpl {
public KioraTheRisingTide(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
-
+
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.MERFOLK);
this.subtype.add(SubType.NOBLE);
@@ -38,13 +36,8 @@ public final class KioraTheRisingTide extends CardImpl {
));
// Threshold -- Whenever Kiora attacks, if there are seven or more cards in your graveyard, you may create Scion of the Deep, a legendary 8/8 blue Octopus creature token.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new CreateTokenEffect(new ScionOfTheDeepToken()), true),
- ThresholdCondition.instance, "Whenever {this} attacks, if there are seven "
- + "or more cards in your graveyard, you may create "
- + "Scion of the Deep, a legendary 8/8 blue Octopus creature token."
- ).setAbilityWord(AbilityWord.THRESHOLD));
-
+ this.addAbility(new AttacksTriggeredAbility(new CreateTokenEffect(new ScionOfTheDeepToken()), true)
+ .withInterveningIf(ThresholdCondition.instance).setAbilityWord(AbilityWord.THRESHOLD));
}
private KioraTheRisingTide(final KioraTheRisingTide card) {
diff --git a/Mage.Sets/src/mage/cards/k/KitesailCleric.java b/Mage.Sets/src/mage/cards/k/KitesailCleric.java
index 3a98a3682fb..558468dbcd0 100644
--- a/Mage.Sets/src/mage/cards/k/KitesailCleric.java
+++ b/Mage.Sets/src/mage/cards/k/KitesailCleric.java
@@ -4,7 +4,6 @@ import mage.MageInt;
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.TapTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.KickerAbility;
@@ -36,11 +35,7 @@ public final class KitesailCleric extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// When Kitesail Cleric enters the battelfield, if it was kicked, tap up to two target creatures.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new TapTargetEffect()),
- KickedCondition.ONCE, "When {this} enters, " +
- "if it was kicked, tap up to two target creatures."
- );
+ Ability ability = new EntersBattlefieldTriggeredAbility(new TapTargetEffect()).withInterveningIf(KickedCondition.ONCE);
ability.addTarget(new TargetCreaturePermanent(0, 2));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/k/KitsuneMystic.java b/Mage.Sets/src/mage/cards/k/KitsuneMystic.java
index dc71085527f..f84edc36e94 100644
--- a/Mage.Sets/src/mage/cards/k/KitsuneMystic.java
+++ b/Mage.Sets/src/mage/cards/k/KitsuneMystic.java
@@ -1,36 +1,42 @@
-
package mage.cards.k;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.common.OnEventTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.EnchantedSourceCondition;
import mage.abilities.costs.mana.GenericManaCost;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.FlipSourceEffect;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
import mage.filter.common.FilterEnchantmentPermanent;
+import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.AttachmentAttachedToCardTypePredicate;
+import mage.filter.predicate.permanent.PermanentIdPredicate;
import mage.game.Game;
-import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.TokenImpl;
+import mage.players.Player;
+import mage.target.TargetImpl;
import mage.target.TargetPermanent;
-import mage.target.common.TargetCreaturePermanent;
+
+import java.util.Optional;
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class KitsuneMystic extends CardImpl {
+ private static final Condition condition = new EnchantedSourceCondition(2);
+
public KitsuneMystic(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.FOX);
this.subtype.add(SubType.WIZARD);
@@ -40,9 +46,9 @@ public final class KitsuneMystic extends CardImpl {
this.flipCardName = "Autumn-Tail, Kitsune Sage";
// At the beginning of the end step, if Kitsune Mystic is enchanted by two or more Auras, flip it.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new AutumnTailKitsuneSage())),
- new EnchantedSourceCondition(2), "At the beginning of the end step, if {this} is enchanted by two or more Auras, flip it."));
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ TargetController.NEXT, new FlipSourceEffect(new AutumnTailKitsuneSage()).setText("flip it"), false, condition
+ ));
}
private KitsuneMystic(final KitsuneMystic card) {
@@ -77,9 +83,9 @@ class AutumnTailKitsuneSage extends TokenImpl {
// {1}: Attach target Aura attached to a creature to another creature.
Ability ability = new SimpleActivatedAbility(new AutumnTailEffect(), new GenericManaCost(1));
ability.addTarget(new TargetPermanent(filter));
- ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
+
private AutumnTailKitsuneSage(final AutumnTailKitsuneSage token) {
super(token);
}
@@ -93,7 +99,7 @@ class AutumnTailEffect extends OneShotEffect {
AutumnTailEffect() {
super(Outcome.BoostCreature);
- this.staticText = "Attach target Aura attached to a creature to another creature";
+ this.staticText = "attach target Aura attached to a creature to another creature";
}
private AutumnTailEffect(final AutumnTailEffect effect) {
@@ -107,17 +113,24 @@ class AutumnTailEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Permanent aura = game.getPermanent(source.getFirstTarget());
- Permanent creature = game.getPermanent(source.getTargets().get(1).getFirstTarget());
- if (aura != null && creature != null) {
- Permanent oldCreature = game.getPermanent(aura.getAttachedTo());
- if (oldCreature == null || oldCreature.equals(creature)) {
- return false;
- }
- if (oldCreature.removeAttachment(aura.getId(), source, game)) {
- return creature.addAttachment(aura.getId(), source, game);
- }
+ Player player = game.getPlayer(source.getControllerId());
+ Permanent aura = game.getPermanent(getTargetPointer().getFirst(game, source));
+ if (player == null || aura == null) {
+ return false;
}
- return false;
+ FilterPermanent filter = new FilterCreaturePermanent();
+ filter.add(Predicates.not(new PermanentIdPredicate(aura.getAttachedTo())));
+ if (!game.getBattlefield().contains(filter, source.getControllerId(), source, game, 1)) {
+ return false;
+ }
+ TargetPermanent target = new TargetPermanent(filter);
+ target.withNotTarget(true);
+ player.choose(outcome, target, source, game);
+ return Optional
+ .ofNullable(target)
+ .map(TargetImpl::getFirstTarget)
+ .map(game::getPermanent)
+ .filter(permanent -> permanent.addAttachment(aura.getId(), source, game))
+ .isPresent();
}
}
diff --git a/Mage.Sets/src/mage/cards/k/KjeldoranHomeGuard.java b/Mage.Sets/src/mage/cards/k/KjeldoranHomeGuard.java
index 86a203e97b4..94204017100 100644
--- a/Mage.Sets/src/mage/cards/k/KjeldoranHomeGuard.java
+++ b/Mage.Sets/src/mage/cards/k/KjeldoranHomeGuard.java
@@ -1,24 +1,22 @@
-
package mage.cards.k;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EndOfCombatTriggeredAbility;
import mage.abilities.condition.common.AttackedOrBlockedThisCombatSourceCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
-import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
import mage.counters.CounterType;
import mage.game.permanent.token.DeserterToken;
import mage.watchers.common.AttackedOrBlockedThisCombatWatcher;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class KjeldoranHomeGuard extends CardImpl {
@@ -32,11 +30,11 @@ public final class KjeldoranHomeGuard extends CardImpl {
this.toughness = new MageInt(6);
// At end of combat, if Kjeldoran Home Guard attacked or blocked this combat, put a -0/-1 counter on Kjeldoran Home Guard and put a 0/1 white Deserter creature token onto the battlefield.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EndOfCombatTriggeredAbility(new AddCountersSourceEffect(CounterType.M0M1.createInstance()), false),
- AttackedOrBlockedThisCombatSourceCondition.instance,
- "At end of combat, if {this} attacked or blocked this combat, put a -0/-1 counter on {this} and create a 0/1 white Deserter creature token.");
- ability.addEffect(new CreateTokenEffect(new DeserterToken()).setText("and create a 0/1 white Deserter creature token."));
+ Ability ability = new EndOfCombatTriggeredAbility(
+ new AddCountersSourceEffect(CounterType.M0M1.createInstance()), false
+ ).withInterveningIf(AttackedOrBlockedThisCombatSourceCondition.instance);
+ ability.addEffect(new CreateTokenEffect(new DeserterToken())
+ .setText("and create a 0/1 white Deserter creature token."));
this.addAbility(ability, new AttackedOrBlockedThisCombatWatcher());
}
diff --git a/Mage.Sets/src/mage/cards/k/KnightOfTheEbonLegion.java b/Mage.Sets/src/mage/cards/k/KnightOfTheEbonLegion.java
index 73aed41bc7c..d21814bed29 100644
--- a/Mage.Sets/src/mage/cards/k/KnightOfTheEbonLegion.java
+++ b/Mage.Sets/src/mage/cards/k/KnightOfTheEbonLegion.java
@@ -2,16 +2,16 @@ package mage.cards.k;
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.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.hint.ConditionHint;
+import mage.abilities.hint.Hint;
import mage.abilities.keyword.DeathtouchAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -46,12 +46,8 @@ public final class KnightOfTheEbonLegion extends CardImpl {
this.addAbility(ability);
// At the beginning of your end step, if a player lost 4 or more life this turn, put a +1/+1 counter on Knight of the Ebon Legion.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance())
- ), KnightOfTheEbonLegionCondition.instance, "At the beginning of your end step, " +
- "if a player lost 4 or more life this turn, put a +1/+1 counter on {this}."
- ).addHint(new ConditionHint(KnightOfTheEbonLegionCondition.instance, "A player lost 4 or more life this turn")));
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()))
+ .withInterveningIf(KnightOfTheEbonLegionCondition.instance).addHint(KnightOfTheEbonLegionCondition.getHint()));
}
private KnightOfTheEbonLegion(final KnightOfTheEbonLegion card) {
@@ -66,6 +62,11 @@ public final class KnightOfTheEbonLegion extends CardImpl {
enum KnightOfTheEbonLegionCondition implements Condition {
instance;
+ private static final Hint hint = new ConditionHint(instance);
+
+ public static Hint getHint() {
+ return hint;
+ }
@Override
public boolean apply(Game game, Ability source) {
@@ -79,4 +80,9 @@ enum KnightOfTheEbonLegionCondition implements Condition {
.stream()
.anyMatch(uuid -> watcher.getLifeLost(uuid) > 3);
}
+
+ @Override
+ public String toString() {
+ return "a player lost 4 or more life this turn";
+ }
}
diff --git a/Mage.Sets/src/mage/cards/k/KnightOfTheWhiteOrchid.java b/Mage.Sets/src/mage/cards/k/KnightOfTheWhiteOrchid.java
index 699ae51f03a..aeac56a3b82 100644
--- a/Mage.Sets/src/mage/cards/k/KnightOfTheWhiteOrchid.java
+++ b/Mage.Sets/src/mage/cards/k/KnightOfTheWhiteOrchid.java
@@ -1,30 +1,32 @@
-
-
package mage.cards.k;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.OpponentControlsMoreCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
+import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.filter.common.FilterBySubtypeCard;
import mage.target.common.TargetCardInLibrary;
+import java.util.UUID;
+
/**
- *
* @author BetaSteward_at_googlemail.com
*/
public final class KnightOfTheWhiteOrchid extends CardImpl {
+ private static final FilterCard filter = new FilterBySubtypeCard(SubType.PLAINS);
+ private static final Condition condition = new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS);
+
public KnightOfTheWhiteOrchid(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{W}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.KNIGHT);
@@ -33,13 +35,11 @@ public final class KnightOfTheWhiteOrchid extends CardImpl {
// First strike
this.addAbility(FirstStrikeAbility.getInstance());
-
+
// When Knight of the White Orchid enters the battlefield, if an opponent controls more lands than you, you may search your library for a Plains card, put it onto the battlefield, then shuffle your library.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(0, 1, new FilterBySubtypeCard(SubType.PLAINS)), false), true),
- new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS),
- "When {this} enters, if an opponent controls more lands than you, you may search your library for a Plains card, put it onto the battlefield, then shuffle."));
-
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter)), true
+ ).withInterveningIf(condition));
}
private KnightOfTheWhiteOrchid(final KnightOfTheWhiteOrchid card) {
diff --git a/Mage.Sets/src/mage/cards/k/KnightsOfRen.java b/Mage.Sets/src/mage/cards/k/KnightsOfRen.java
index 7a97cc53d6f..302f74fa37b 100644
--- a/Mage.Sets/src/mage/cards/k/KnightsOfRen.java
+++ b/Mage.Sets/src/mage/cards/k/KnightsOfRen.java
@@ -1,15 +1,13 @@
package mage.cards.k;
import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.AttacksTriggeredAbility;
-import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
import mage.abilities.condition.common.HateCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.SacrificeAllEffect;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.constants.AbilityWord;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
@@ -35,18 +33,9 @@ public class KnightsOfRen extends CardImpl {
//Hate — Whenever Knights of Ren enters the battlefield or attacks, if an opponent lost life from a source other
//than combat damage this turn, you may have each player sacrifice a creature.
- Ability abilityEnterBattlefield = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(
- new SacrificeAllEffect(StaticFilters.FILTER_PERMANENT_CREATURE), true),
- HateCondition.instance,
- "Hate — When {this} enters, if an opponent lost life from a source other than combat damage this turn, you may have each player sacrifice a creature");
- Ability abilityAttacks = new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(
- new SacrificeAllEffect(StaticFilters.FILTER_PERMANENT_CREATURE), true),
- HateCondition.instance,
- "Hate — When {this} attacks, if an opponent lost life from a source other than combat damage this turn, you may have each player sacrifice a creature");
- this.addAbility(abilityEnterBattlefield, new LifeLossOtherFromCombatWatcher());
- this.addAbility(abilityAttacks, new LifeLossOtherFromCombatWatcher());
+ this.addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(
+ new SacrificeAllEffect(StaticFilters.FILTER_PERMANENT_CREATURE).setText("have each player sacrifice a creature")
+ ).withInterveningIf(HateCondition.instance).setAbilityWord(AbilityWord.HATE), new LifeLossOtherFromCombatWatcher());
}
private KnightsOfRen(final KnightsOfRen card) {
diff --git a/Mage.Sets/src/mage/cards/k/KodamaOfTheEastTree.java b/Mage.Sets/src/mage/cards/k/KodamaOfTheEastTree.java
index a012f1f02d9..6cb836f93b0 100644
--- a/Mage.Sets/src/mage/cards/k/KodamaOfTheEastTree.java
+++ b/Mage.Sets/src/mage/cards/k/KodamaOfTheEastTree.java
@@ -5,7 +5,6 @@ import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.PartnerAbility;
@@ -18,8 +17,8 @@ import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.common.FilterPermanentCard;
-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.events.GameEvent;
import mage.game.permanent.Permanent;
@@ -53,12 +52,8 @@ public final class KodamaOfTheEastTree extends CardImpl {
this.addAbility(ReachAbility.getInstance());
// Whenever another permanent you control enters, if it wasn't put onto the battlefield with this ability, you may put a permanent card with equal or lesser converted mana cost from your hand onto the battlefield.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldAllTriggeredAbility(new KodamaOfTheEastTreeEffect(), filter),
- KodamaOfTheEastTreeCondition.instance, "Whenever another permanent enters the battlefield " +
- "under your control, if it wasn't put onto the battlefield with this ability, you may put " +
- "a permanent card with equal or lesser mana value from your hand onto the battlefield."
- ), new KodamaOfTheEastTreeWatcher());
+ this.addAbility(new EntersBattlefieldAllTriggeredAbility(new KodamaOfTheEastTreeEffect(), filter)
+ .withInterveningIf(KodamaOfTheEastTreeCondition.instance), new KodamaOfTheEastTreeWatcher());
// Partner
this.addAbility(PartnerAbility.getInstance());
@@ -90,12 +85,18 @@ enum KodamaOfTheEastTreeCondition implements Condition {
KodamaOfTheEastTreeWatcher watcher = game.getState().getWatcher(KodamaOfTheEastTreeWatcher.class);
return watcher != null && !watcher.checkPermanent(permanent, source, game);
}
+
+ @Override
+ public String toString() {
+ return "it wasn't put onto the battlefield with this ability";
+ }
}
class KodamaOfTheEastTreeEffect extends OneShotEffect {
KodamaOfTheEastTreeEffect() {
super(Outcome.Benefit);
+ staticText = "you may put a permanent card with equal or lesser mana value from your hand onto the battlefield";
}
private KodamaOfTheEastTreeEffect(final KodamaOfTheEastTreeEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/k/Kookus.java b/Mage.Sets/src/mage/cards/k/Kookus.java
index 58f55d78a1a..ddb80115dea 100644
--- a/Mage.Sets/src/mage/cards/k/Kookus.java
+++ b/Mage.Sets/src/mage/cards/k/Kookus.java
@@ -1,41 +1,40 @@
-
package mage.cards.k;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.condition.InvertCondition;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.costs.mana.ColoredManaCost;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DamageControllerEffect;
import mage.abilities.effects.common.combat.AttacksIfAbleSourceEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
-import mage.constants.SubType;
import mage.abilities.keyword.TrampleAbility;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.ColoredManaSymbol;
+import mage.constants.ComparisonType;
import mage.constants.Duration;
-import mage.constants.Zone;
+import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.NamePredicate;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class Kookus extends CardImpl {
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("you don't control a creature named Keeper of Kookus");
static {
filter.add(new NamePredicate("Keeper of Kookus"));
}
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0);
+
public Kookus(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{R}");
@@ -47,18 +46,16 @@ public final class Kookus extends CardImpl {
this.addAbility(TrampleAbility.getInstance());
// At the beginning of your upkeep, if you don't control a creature named Keeper of Kookus, Kookus deals 3 damage to you and attacks this turn if able.
- TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new DamageControllerEffect(3));
- ability.addEffect(new AttacksIfAbleSourceEffect(Duration.EndOfTurn, false));
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- ability,
- new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter)),
- "At the beginning of your upkeep, "
- + "if you don't control a creature named Keeper of Kookus, "
- + "{this} deals 3 damage to you and attacks this turn if able"
- ));
+ Ability ability = new BeginningOfUpkeepTriggeredAbility(new DamageControllerEffect(3)).withInterveningIf(condition);
+ ability.addEffect(new AttacksIfAbleSourceEffect(
+ Duration.EndOfTurn, false
+ ).setText("and attacks this turn if able"));
+ this.addAbility(ability);
// {R}: Kookus gets +1/+0 until end of turn.
- this.addAbility(new SimpleActivatedAbility(new BoostSourceEffect(1, 0, Duration.EndOfTurn), new ColoredManaCost(ColoredManaSymbol.R)));
+ this.addAbility(new SimpleActivatedAbility(
+ new BoostSourceEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl<>("{R}")
+ ));
}
private Kookus(final Kookus card) {
diff --git a/Mage.Sets/src/mage/cards/k/KorAeronaut.java b/Mage.Sets/src/mage/cards/k/KorAeronaut.java
index 2743ee1b975..8f893a15e17 100644
--- a/Mage.Sets/src/mage/cards/k/KorAeronaut.java
+++ b/Mage.Sets/src/mage/cards/k/KorAeronaut.java
@@ -1,11 +1,9 @@
-
package mage.cards.k;
-import java.util.UUID;
import mage.MageInt;
+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.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.KickerAbility;
@@ -13,17 +11,17 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.Duration;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author North
*/
public final class KorAeronaut extends CardImpl {
public KorAeronaut(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{W}");
this.subtype.add(SubType.KOR);
this.subtype.add(SubType.SOLDIER);
@@ -37,9 +35,11 @@ public final class KorAeronaut extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
//When Kor Aeronaut enters the battlefield, if it was kicked, target creature gains flying until end of turn.
- EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), false);
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new GainAbilityTargetEffect(FlyingAbility.getInstance())
+ ).withInterveningIf(KickedCondition.ONCE);
ability.addTarget(new TargetCreaturePermanent());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, KickedCondition.ONCE, "When {this} enters, if it was kicked, target creature gains flying until end of turn."));
+ this.addAbility(ability);
}
private KorAeronaut(final KorAeronaut card) {
diff --git a/Mage.Sets/src/mage/cards/k/KorSanctifiers.java b/Mage.Sets/src/mage/cards/k/KorSanctifiers.java
index a994489cd4e..91f211ac78f 100644
--- a/Mage.Sets/src/mage/cards/k/KorSanctifiers.java
+++ b/Mage.Sets/src/mage/cards/k/KorSanctifiers.java
@@ -1,10 +1,9 @@
-
package mage.cards.k;
import mage.MageInt;
+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;
@@ -17,13 +16,12 @@ import mage.target.TargetPermanent;
import java.util.UUID;
/**
- *
* @author Loki
*/
public final class KorSanctifiers extends CardImpl {
- public KorSanctifiers (UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}");
+ public KorSanctifiers(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
this.subtype.add(SubType.KOR);
this.subtype.add(SubType.CLERIC);
@@ -34,9 +32,9 @@ public final class KorSanctifiers extends CardImpl {
this.addAbility(new KickerAbility("{W}"));
// When Kor Sanctifiers enters the battlefield, if it was kicked, destroy target artifact or enchantment.
- EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(), false);
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect()).withInterveningIf(KickedCondition.ONCE);
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT));
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, KickedCondition.ONCE, "When {this} enters, if it was kicked, destroy target artifact or enchantment."));
+ this.addAbility(ability);
}
private KorSanctifiers(final KorSanctifiers card) {
diff --git a/Mage.Sets/src/mage/cards/k/KozilekTheGreatDistortion.java b/Mage.Sets/src/mage/cards/k/KozilekTheGreatDistortion.java
index a23bd556cb5..b8842f6f4b9 100644
--- a/Mage.Sets/src/mage/cards/k/KozilekTheGreatDistortion.java
+++ b/Mage.Sets/src/mage/cards/k/KozilekTheGreatDistortion.java
@@ -1,16 +1,12 @@
-
package mage.cards.k;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.CardsInHandCondition;
import mage.abilities.costs.Cost;
import mage.abilities.costs.CostImpl;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CastSourceTriggeredAbility;
import mage.abilities.effects.common.CounterTargetEffect;
@@ -18,12 +14,7 @@ import mage.abilities.keyword.MenaceAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.ComparisonType;
-import mage.constants.Outcome;
-import mage.constants.SuperType;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.FilterSpell;
import mage.filter.predicate.mageobject.ManaValuePredicate;
@@ -34,24 +25,27 @@ import mage.players.Player;
import mage.target.TargetSpell;
import mage.target.common.TargetCardInHand;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class KozilekTheGreatDistortion extends CardImpl {
+ private static final Condition condition = new CardsInHandCondition(ComparisonType.FEWER_THAN, 7);
+
public KozilekTheGreatDistortion(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{8}{C}{C}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{8}{C}{C}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ELDRAZI);
this.power = new MageInt(12);
this.toughness = new MageInt(12);
// When you cast Kozilek, the Great Distortion, if you have fewer than seven cards in hand, draw cards equal to the difference.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new CastSourceTriggeredAbility(new KozilekDrawEffect(), false),
- new CardsInHandCondition(ComparisonType.FEWER_THAN, 7),
- "When you cast this spell, if you have fewer than seven cards in hand, draw cards equal to the difference."));
+ this.addAbility(new CastSourceTriggeredAbility(new KozilekDrawEffect(), false).withInterveningIf(condition));
+
// Menace
this.addAbility(new MenaceAbility(false));
@@ -75,7 +69,7 @@ class KozilekDrawEffect extends OneShotEffect {
KozilekDrawEffect() {
super(Outcome.DrawCard);
- this.staticText = "if you have fewer than seven cards in hand, draw cards equal to the difference";
+ this.staticText = "draw cards equal to the difference";
}
private KozilekDrawEffect(final KozilekDrawEffect effect) {
@@ -148,7 +142,7 @@ class KozilekDiscardCost extends CostImpl {
}
}
Player controller = game.getPlayer(ability.getControllerId());
- if(controller != null) {
+ if (controller != null) {
for (Card card : controller.getHand().getCards(game)) {
if (stackCMC.contains(card.getManaValue())) {
return true;
diff --git a/Mage.Sets/src/mage/cards/k/KrondTheDawnClad.java b/Mage.Sets/src/mage/cards/k/KrondTheDawnClad.java
index f9b705c9a23..9670de309dd 100644
--- a/Mage.Sets/src/mage/cards/k/KrondTheDawnClad.java
+++ b/Mage.Sets/src/mage/cards/k/KrondTheDawnClad.java
@@ -1,12 +1,10 @@
-
package mage.cards.k;
-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.EnchantedSourceCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.ExileTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.VigilanceAbility;
@@ -17,14 +15,17 @@ import mage.constants.SubType;
import mage.constants.SuperType;
import mage.target.TargetPermanent;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class KrondTheDawnClad extends CardImpl {
+ private static final Condition condition = new EnchantedSourceCondition();
+
public KrondTheDawnClad(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}{G}{G}{W}{W}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{G}{G}{W}{W}{W}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ARCHON);
@@ -36,10 +37,7 @@ public final class KrondTheDawnClad extends CardImpl {
this.addAbility(VigilanceAbility.getInstance());
// Whenever Krond the Dawn-Clad attacks, if it's enchanted, exile target permanent.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new AttacksTriggeredAbility(new ExileTargetEffect(), false),
- new EnchantedSourceCondition(),
- "Whenever {this} attacks, if it's enchanted, exile target permanent.");
+ Ability ability = new AttacksTriggeredAbility(new ExileTargetEffect(), false).withInterveningIf(condition);
ability.addTarget(new TargetPermanent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/k/KrosanDruid.java b/Mage.Sets/src/mage/cards/k/KrosanDruid.java
index 1cfa762d0fc..9e13a8c6738 100644
--- a/Mage.Sets/src/mage/cards/k/KrosanDruid.java
+++ b/Mage.Sets/src/mage/cards/k/KrosanDruid.java
@@ -1,20 +1,18 @@
-
package mage.cards.k;
-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.GainLifeEffect;
import mage.abilities.keyword.KickerAbility;
-import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class KrosanDruid extends CardImpl {
@@ -31,11 +29,7 @@ public final class KrosanDruid extends CardImpl {
this.addAbility(new KickerAbility("{4}{G}"));
// When Krosan Druid enters the battlefield, if it was kicked, you gain 10 life.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new GainLifeEffect(10)),
- KickedCondition.ONCE,
- "When {this} enters, if it was kicked, you gain 10 life"
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(10)).withInterveningIf(KickedCondition.ONCE));
}
private KrosanDruid(final KrosanDruid card) {
diff --git a/Mage.Sets/src/mage/cards/k/KytheonHeroOfAkros.java b/Mage.Sets/src/mage/cards/k/KytheonHeroOfAkros.java
index 7e0f854d9b6..56c4872994e 100644
--- a/Mage.Sets/src/mage/cards/k/KytheonHeroOfAkros.java
+++ b/Mage.Sets/src/mage/cards/k/KytheonHeroOfAkros.java
@@ -1,17 +1,11 @@
-
package mage.cards.k;
-import java.util.UUID;
-
import mage.MageInt;
-import mage.MageObjectReference;
import mage.abilities.Ability;
-import mage.constants.Pronoun;
import mage.abilities.common.EndOfCombatTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.IndestructibleAbility;
@@ -20,9 +14,10 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.game.Game;
-import mage.game.permanent.Permanent;
import mage.watchers.common.AttackedOrBlockedThisCombatWatcher;
+import java.util.UUID;
+
/**
* @author LevelX2
*/
@@ -41,12 +36,14 @@ public final class KytheonHeroOfAkros extends CardImpl {
// At end of combat, if Kytheon, Hero of Akros and at least two other creatures attacked this combat, exile Kytheon,
// then return him to the battlefield transformed under his owner's control.
this.addAbility(new TransformAbility());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(new EndOfCombatTriggeredAbility(new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED,Pronoun.HE), false),
- new KytheonHeroOfAkrosCondition(), "At end of combat, if {this} and at least two other creatures attacked this combat, exile {this}, "
- + "then return him to the battlefield transformed under his owner's control."), new AttackedOrBlockedThisCombatWatcher());
+ this.addAbility(new EndOfCombatTriggeredAbility(
+ new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED, Pronoun.HE), false
+ ).withInterveningIf(KytheonHeroOfAkrosCondition.instance), new AttackedOrBlockedThisCombatWatcher());
// {2}{W}: Kytheon gains indestructible until end of turn.
- this.addAbility(new SimpleActivatedAbility(new GainAbilitySourceEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl<>("{2}{W}")));
+ this.addAbility(new SimpleActivatedAbility(new GainAbilitySourceEffect(
+ IndestructibleAbility.getInstance(), Duration.EndOfTurn
+ ), new ManaCostsImpl<>("{2}{W}")));
}
@@ -60,27 +57,20 @@ public final class KytheonHeroOfAkros extends CardImpl {
}
}
-class KytheonHeroOfAkrosCondition implements Condition {
+enum KytheonHeroOfAkrosCondition implements Condition {
+ instance;
@Override
public boolean apply(Game game, Ability source) {
- Permanent sourceObject = game.getPermanent(source.getSourceId());
- if (sourceObject != null) {
- AttackedOrBlockedThisCombatWatcher watcher = game.getState().getWatcher(AttackedOrBlockedThisCombatWatcher.class);
- if (watcher != null) {
- boolean sourceFound = false;
- int number = 0;
- for (MageObjectReference mor : watcher.getAttackedThisTurnCreatures()) {
- if (mor.refersTo(sourceObject, game)) {
- sourceFound = true;
- } else {
- number++;
- }
- }
- return sourceFound && number >= 2;
- }
- }
- return false;
+ AttackedOrBlockedThisCombatWatcher watcher = game.getState().getWatcher(AttackedOrBlockedThisCombatWatcher.class);
+ return watcher != null
+ && watcher
+ .getAttackedThisTurnCreatures()
+ .stream()
+ .anyMatch(mor -> mor.refersTo(source, game))
+ && watcher
+ .getAttackedThisTurnCreatures()
+ .size() >= 3;
}
@Override
diff --git a/Mage.Sets/src/mage/cards/l/LagonnaBandElder.java b/Mage.Sets/src/mage/cards/l/LagonnaBandElder.java
index 2c6fba72e17..ac751cbcbe9 100644
--- a/Mage.Sets/src/mage/cards/l/LagonnaBandElder.java
+++ b/Mage.Sets/src/mage/cards/l/LagonnaBandElder.java
@@ -1,17 +1,15 @@
-
package mage.cards.l;
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.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.filter.StaticFilters;
+import mage.filter.common.FilterControlledEnchantmentPermanent;
import java.util.UUID;
@@ -20,6 +18,10 @@ import java.util.UUID;
*/
public final class LagonnaBandElder extends CardImpl {
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterControlledEnchantmentPermanent("you control an enchantment")
+ );
+
public LagonnaBandElder(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
this.subtype.add(SubType.CENTAUR);
@@ -29,11 +31,7 @@ public final class LagonnaBandElder extends CardImpl {
this.toughness = new MageInt(2);
// When Lagonna-Band Elder enters the battlefield, if you control an enchantment, you gain 3 life.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3), false),
- new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_PERMANENT_ENCHANTMENT),
- "When Lagonna-Band Elder enters the battlefield, if you control an enchantment, you gain 3 life");
- this.addAbility(ability);
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3), false).withInterveningIf(condition));
}
private LagonnaBandElder(final LagonnaBandElder card) {
diff --git a/Mage.Sets/src/mage/cards/l/LamplighterOfSelhoff.java b/Mage.Sets/src/mage/cards/l/LamplighterOfSelhoff.java
index ba96ccaa275..400d96dcb94 100644
--- a/Mage.Sets/src/mage/cards/l/LamplighterOfSelhoff.java
+++ b/Mage.Sets/src/mage/cards/l/LamplighterOfSelhoff.java
@@ -1,47 +1,45 @@
-
package mage.cards.l;
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.DrawDiscardControllerEffect;
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 fireshoes
*/
public final class LamplighterOfSelhoff extends CardImpl {
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Zombie");
+ private static final FilterPermanent filter
+ = new FilterControlledPermanent(SubType.ZOMBIE, "you control another Zombie");
static {
filter.add(AnotherPredicate.instance);
- filter.add(SubType.ZOMBIE.getPredicate());
}
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter);
+
public LamplighterOfSelhoff(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}");
this.subtype.add(SubType.ZOMBIE);
this.subtype.add(SubType.HORROR);
this.power = new MageInt(3);
this.toughness = new MageInt(5);
// When Lamplighter of Selhoff enters the battlefield, if you control another Zombie, you may a draw card. If you do, discard a card.
- TriggeredAbility triggeredAbility = new EntersBattlefieldTriggeredAbility(new DrawDiscardControllerEffect(1,1,true));
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- triggeredAbility,
- new PermanentsOnTheBattlefieldCondition(filter),
- "When {this} enters, if you control another Zombie, you may draw a card. If you do, discard a card."));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new DrawDiscardControllerEffect(1, 1, true)
+ ).withInterveningIf(condition));
}
private LamplighterOfSelhoff(final LamplighterOfSelhoff card) {
diff --git a/Mage.Sets/src/mage/cards/l/LandTax.java b/Mage.Sets/src/mage/cards/l/LandTax.java
index 8c31da5582c..381fb71876b 100644
--- a/Mage.Sets/src/mage/cards/l/LandTax.java
+++ b/Mage.Sets/src/mage/cards/l/LandTax.java
@@ -1,10 +1,9 @@
-
package mage.cards.l;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.OpponentControlsMoreCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -14,21 +13,19 @@ import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class LandTax extends CardImpl {
+ private static final Condition condition = new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS);
+
public LandTax(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}");
// At the beginning of your upkeep, if an opponent controls more lands than you, you may search your library for up to three basic land cards, reveal them, and put them into your hand. If you do, shuffle your library.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 3, StaticFilters.FILTER_CARD_BASIC_LAND), true), true),
- new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS),
- "At the beginning of your upkeep, if an opponent controls more lands than you, you may search your library for up to three basic land cards, reveal them, put them into your hand, then shuffle."
- ));
-
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SearchLibraryPutInHandEffect(
+ new TargetCardInLibrary(3, StaticFilters.FILTER_CARD_BASIC_LANDS), true
+ ), true).withInterveningIf(condition));
}
private LandTax(final LandTax card) {
diff --git a/Mage.Sets/src/mage/cards/l/LatchkeyFaerie.java b/Mage.Sets/src/mage/cards/l/LatchkeyFaerie.java
index 7773d7ee2c8..d6bc12909d0 100644
--- a/Mage.Sets/src/mage/cards/l/LatchkeyFaerie.java
+++ b/Mage.Sets/src/mage/cards/l/LatchkeyFaerie.java
@@ -3,7 +3,6 @@ package mage.cards.l;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.ProwlCostWasPaidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.hint.common.ProwlCostWasPaidHint;
import mage.abilities.keyword.FlyingAbility;
@@ -35,11 +34,8 @@ public final class LatchkeyFaerie extends CardImpl {
this.addAbility(new ProwlAbility("{2}{U}"));
// When Latchkey Faerie enters the battlefield, if its prowl cost was paid, draw a card.
- EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false);
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, ProwlCostWasPaidCondition.instance,
- "When {this} enters, if its prowl cost was paid, draw a card.")
- .addHint(ProwlCostWasPaidHint.instance));
-
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false)
+ .withInterveningIf(ProwlCostWasPaidCondition.instance).addHint(ProwlCostWasPaidHint.instance));
}
private LatchkeyFaerie(final LatchkeyFaerie card) {
diff --git a/Mage.Sets/src/mage/cards/l/LathielTheBounteousDawn.java b/Mage.Sets/src/mage/cards/l/LathielTheBounteousDawn.java
index 20e73478ede..60cbe63c923 100644
--- a/Mage.Sets/src/mage/cards/l/LathielTheBounteousDawn.java
+++ b/Mage.Sets/src/mage/cards/l/LathielTheBounteousDawn.java
@@ -2,21 +2,19 @@ package mage.cards.l;
import mage.MageInt;
import mage.abilities.Ability;
-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.DynamicValue;
-import mage.abilities.effects.Effect;
+import mage.abilities.dynamicvalue.common.ControllerGainedLifeCount;
import mage.abilities.effects.common.counter.DistributeCountersEffect;
-import mage.abilities.hint.Hint;
-import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.LifelinkAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.SuperType;
+import mage.constants.TargetController;
import mage.filter.StaticFilters;
-import mage.game.Game;
import mage.target.common.TargetCreaturePermanentAmount;
import mage.watchers.common.PlayerGainedLifeWatcher;
@@ -41,15 +39,17 @@ public final class LathielTheBounteousDawn extends CardImpl {
this.addAbility(LifelinkAbility.getInstance());
// At the beginning of each end step, if you gained life this turn, distribute up to that many +1/+1 counters among any number of other target creatures.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(TargetController.ANY, new DistributeCountersEffect(), false),
- condition, "At the beginning of each end step, if you gained life this turn, " +
- "distribute up to that many +1/+1 counters among any number of other target creatures."
- );
+ Ability ability = new BeginningOfEndStepTriggeredAbility(
+ TargetController.ANY, new DistributeCountersEffect()
+ .setText("distribute up to that many +1/+1 counters " +
+ "among any number of other target creatures"),
+ false
+ ).withInterveningIf(condition);
ability.addTarget(new TargetCreaturePermanentAmount(
- LathielTheBounteousDawnValue.instance,
- StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE));
- this.addAbility(ability.addHint(LathielTheBounteousDawnValue.getHint()), new PlayerGainedLifeWatcher());
+ ControllerGainedLifeCount.instance,
+ StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE
+ ));
+ this.addAbility(ability.addHint(ControllerGainedLifeCount.getHint()), new PlayerGainedLifeWatcher());
}
private LathielTheBounteousDawn(final LathielTheBounteousDawn card) {
@@ -61,28 +61,3 @@ public final class LathielTheBounteousDawn extends CardImpl {
return new LathielTheBounteousDawn(this);
}
}
-
-enum LathielTheBounteousDawnValue implements DynamicValue {
- instance;
- private static final Hint hint = new ValueHint("Life gained this turn", instance);
-
- @Override
- public int calculate(Game game, Ability sourceAbility, Effect effect) {
- PlayerGainedLifeWatcher watcher = game.getState().getWatcher(PlayerGainedLifeWatcher.class);
- return watcher == null ? 0 : watcher.getLifeGained(sourceAbility.getControllerId());
- }
-
- @Override
- public LathielTheBounteousDawnValue copy() {
- return instance;
- }
-
- @Override
- public String getMessage() {
- return "";
- }
-
- public static Hint getHint() {
- return hint;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/l/LavabornMuse.java b/Mage.Sets/src/mage/cards/l/LavabornMuse.java
index 13808b30afe..e63bccc138b 100644
--- a/Mage.Sets/src/mage/cards/l/LavabornMuse.java
+++ b/Mage.Sets/src/mage/cards/l/LavabornMuse.java
@@ -1,13 +1,10 @@
-
package mage.cards.l;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
-import mage.abilities.condition.common.CardsInHandCondition;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.condition.common.CardsInHandCondition;
import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -15,23 +12,27 @@ import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.constants.TargetController;
+import java.util.UUID;
+
/**
- *
* @author ilcartographer
*/
public final class LavabornMuse extends CardImpl {
+ private static final Condition condition = new CardsInHandCondition(ComparisonType.FEWER_THAN, 3, TargetController.ACTIVE);
+
public LavabornMuse(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.SPIRIT);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, Lavaborn Muse deals 3 damage to that player.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(TargetController.OPPONENT, new DamageTargetEffect(3), false),
- (Condition)new CardsInHandCondition(ComparisonType.FEWER_THAN, 3, TargetController.ACTIVE),
- "At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, {this} deals 3 damage to that player."));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(
+ TargetController.OPPONENT,
+ new DamageTargetEffect(3, true, "that player"),
+ false
+ ).withInterveningIf(condition));
}
private LavabornMuse(final LavabornMuse card) {
diff --git a/Mage.Sets/src/mage/cards/l/LegolasCounterOfKills.java b/Mage.Sets/src/mage/cards/l/LegolasCounterOfKills.java
index 272ea6fb749..cf3119e5f00 100644
--- a/Mage.Sets/src/mage/cards/l/LegolasCounterOfKills.java
+++ b/Mage.Sets/src/mage/cards/l/LegolasCounterOfKills.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.common.ScryTriggeredAbility;
import mage.abilities.condition.common.SourceTappedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.UntapSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.ReachAbility;
@@ -36,10 +35,8 @@ public final class LegolasCounterOfKills extends CardImpl {
this.addAbility(ReachAbility.getInstance());
// Whenever you scry, if Legolas, Counter of Kills is tapped, you may untap it. Do this only once each turn.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new ScryTriggeredAbility(new UntapSourceEffect()).setDoOnlyOnceEachTurn(true), SourceTappedCondition.TAPPED,
- "Whenever you scry, if {this} is tapped, you may untap it. Do this only once each turn."
- ));
+ this.addAbility(new ScryTriggeredAbility(new UntapSourceEffect().setText("untap it"), true)
+ .withInterveningIf(SourceTappedCondition.TAPPED).setDoOnlyOnceEachTurn(true));
// Whenever a creature an opponent controls dies, put a +1/+1 counter on Legolas.
this.addAbility(new DiesCreatureTriggeredAbility(
diff --git a/Mage.Sets/src/mage/cards/l/LeoninVanguard.java b/Mage.Sets/src/mage/cards/l/LeoninVanguard.java
index 7809d688a1c..8c36c632504 100644
--- a/Mage.Sets/src/mage/cards/l/LeoninVanguard.java
+++ b/Mage.Sets/src/mage/cards/l/LeoninVanguard.java
@@ -1,27 +1,32 @@
package mage.cards.l;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-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.GainLifeEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
-import mage.constants.SubType;
+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.filter.StaticFilters;
+import mage.constants.SubType;
+import mage.filter.common.FilterControlledCreaturePermanent;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class LeoninVanguard extends CardImpl {
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterControlledCreaturePermanent("you control three or more creatures"),
+ ComparisonType.MORE_THAN, 2
+ );
+
public LeoninVanguard(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}");
@@ -31,19 +36,10 @@ public final class LeoninVanguard extends CardImpl {
this.toughness = new MageInt(1);
// At the beginning of combat on your turn, if you control three or more creatures, Leonin Vanguard gets +1/+1 until end of turn and you gain 1 life.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfCombatTriggeredAbility(
- new BoostSourceEffect(1, 1, Duration.EndOfTurn)
- ),
- new PermanentsOnTheBattlefieldCondition(
- StaticFilters.FILTER_CONTROLLED_CREATURES,
- ComparisonType.MORE_THAN, 2
- ),
- "At the beginning of combat on your turn, "
- + "if you control three or more creatures, "
- + "{this} gets +1/+1 until end of turn and you gain 1 life."
- );
- ability.addEffect(new GainLifeEffect(1));
+ Ability ability = new BeginningOfCombatTriggeredAbility(
+ new BoostSourceEffect(1, 1, Duration.EndOfTurn)
+ ).withInterveningIf(condition);
+ ability.addEffect(new GainLifeEffect(1).concatBy("and"));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/l/LiberatorUrzasBattlethopter.java b/Mage.Sets/src/mage/cards/l/LiberatorUrzasBattlethopter.java
index bca173b619d..1fdd65cf3dd 100644
--- a/Mage.Sets/src/mage/cards/l/LiberatorUrzasBattlethopter.java
+++ b/Mage.Sets/src/mage/cards/l/LiberatorUrzasBattlethopter.java
@@ -1,12 +1,13 @@
package mage.cards.l;
import mage.MageInt;
+import mage.Mana;
import mage.abilities.Ability;
+import mage.abilities.AbilityImpl;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
-import mage.abilities.effects.Effects;
+import mage.abilities.costs.mana.ManaCost;
import mage.abilities.effects.common.continuous.CastAsThoughItHadFlashAllEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.FlashAbility;
@@ -22,7 +23,7 @@ import mage.filter.predicate.mageobject.ColorlessPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.stack.Spell;
-import mage.watchers.common.ManaPaidSourceWatcher;
+import mage.util.CardUtil;
import java.util.UUID;
@@ -60,15 +61,10 @@ public final class LiberatorUrzasBattlethopter extends CardImpl {
// Whenever you cast a spell, if the amount of mana spent to cast that spell is greater
// than Liberator, Urza's Battlethopter's power, put a +1/+1 counter on Liberator.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new SpellCastControllerTriggeredAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
- StaticFilters.FILTER_SPELL_A, false, SetTargetPointer.SPELL
- ),
- LiberatorUrzasBattlethopterCondition.instance,
- "Whenever you cast a spell, if the amount of mana spent to cast "
- + "that spell is greater than {this}'s power, put a +1/+1 counter on {this}"
- ));
+ this.addAbility(new SpellCastControllerTriggeredAbility(
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
+ StaticFilters.FILTER_SPELL_A, false, SetTargetPointer.SPELL
+ ).withInterveningIf(LiberatorUrzasBattlethopterCondition.instance));
}
private LiberatorUrzasBattlethopter(final LiberatorUrzasBattlethopter card) {
@@ -87,17 +83,19 @@ enum LiberatorUrzasBattlethopterCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = source.getSourcePermanentIfItStillExists(game);
- if (permanent == null) {
- return false;
- }
- Effects effects = source.getEffects();
- if (effects.isEmpty()) {
- return false;
- }
- Object spell = effects.get(0).getValue("spellCast");
- if (spell instanceof Spell) {
- return (ManaPaidSourceWatcher.getTotalPaid(((Spell) spell).getId(), game) > permanent.getPower().getValue());
- }
- return false;
+ return permanent != null
+ && CardUtil
+ .getEffectValueFromAbility(source, "spellCast", Spell.class)
+ .map(Spell::getSpellAbility)
+ .map(AbilityImpl::getManaCostsToPay)
+ .map(ManaCost::getUsedManaToPay)
+ .map(Mana::count)
+ .filter(x -> x > permanent.getPower().getValue())
+ .isPresent();
+ }
+
+ @Override
+ public String toString() {
+ return "the amount of mana spent to cast that spell is greater than {this}'s power";
}
}
diff --git a/Mage.Sets/src/mage/cards/l/Lictor.java b/Mage.Sets/src/mage/cards/l/Lictor.java
index 2ae66495dfb..6a066125e72 100644
--- a/Mage.Sets/src/mage/cards/l/Lictor.java
+++ b/Mage.Sets/src/mage/cards/l/Lictor.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.FlashAbility;
import mage.cards.CardImpl;
@@ -12,7 +11,6 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.game.Game;
-import mage.game.permanent.token.TyranidToken;
import mage.game.permanent.token.TyranidWarriorToken;
import mage.watchers.common.CreatureEnteredControllerWatcher;
@@ -34,12 +32,8 @@ public final class Lictor extends CardImpl {
this.addAbility(FlashAbility.getInstance());
// Pheromone Trail -- When Lictor enters the battlefield, if a creature entered the battlefield under an opponent's control this turn, create a 3/3 green Tyranid Warrior creature token with trample.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new TyranidWarriorToken())),
- LictorCondition.instance, "When {this} enters, " +
- "if a creature entered the battlefield under an opponent's control this turn, " +
- "create a 3/3 green Tyranid Warrior creature token with trample."
- ).withFlavorWord("Pheromone Trail"), new CreatureEnteredControllerWatcher());
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new TyranidWarriorToken()))
+ .withInterveningIf(LictorCondition.instance).withFlavorWord("Pheromone Trail"), new CreatureEnteredControllerWatcher());
}
private Lictor(final Lictor card) {
@@ -62,4 +56,9 @@ enum LictorCondition implements Condition {
.stream()
.anyMatch(uuid -> CreatureEnteredControllerWatcher.enteredCreatureForPlayer(uuid, game));
}
+
+ @Override
+ public String toString() {
+ return "a creature entered the battlefield under an opponent's control this turn";
+ }
}
diff --git a/Mage.Sets/src/mage/cards/l/Lifeline.java b/Mage.Sets/src/mage/cards/l/Lifeline.java
index cbdfb9b0447..0d4bf1e822c 100644
--- a/Mage.Sets/src/mage/cards/l/Lifeline.java
+++ b/Mage.Sets/src/mage/cards/l/Lifeline.java
@@ -3,16 +3,19 @@ package mage.cards.l;
import mage.abilities.Ability;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ReturnToBattlefieldUnderOwnerControlTargetEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.TargetController;
import mage.filter.StaticFilters;
+import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.target.targetpointer.FixedTarget;
@@ -23,17 +26,18 @@ import java.util.UUID;
*/
public final class Lifeline extends CardImpl {
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
+ new FilterCreaturePermanent("another creature is on the battlefield"), false
+ );
public Lifeline(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{5}");
-
// Whenever a creature dies, if another creature is on the battlefield, return the first card to the battlefield under its owner's control at the beginning of the next end step.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new DiesCreatureTriggeredAbility(new LifelineEffect(), false, StaticFilters.FILTER_PERMANENT_CREATURE, true),
- new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_PERMANENT_CREATURE, false),
- "Whenever a creature dies, if another creature is on the battlefield, return the first card to the battlefield under its owner's control at the beginning of the next end step.");
- this.addAbility(ability);
+ this.addAbility(new DiesCreatureTriggeredAbility(
+ new LifelineEffect(), false,
+ StaticFilters.FILTER_PERMANENT_CREATURE, true
+ ).withInterveningIf(condition));
}
private Lifeline(final Lifeline card) {
@@ -50,7 +54,7 @@ class LifelineEffect extends OneShotEffect {
LifelineEffect() {
super(Outcome.PutCardInPlay);
- this.staticText = "";
+ this.staticText = "return the first card to the battlefield under its owner's control at the beginning of the next end step";
}
private LifelineEffect(final LifelineEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/l/LightningPhoenix.java b/Mage.Sets/src/mage/cards/l/LightningPhoenix.java
index 8a849151d89..efc41e9c2e0 100644
--- a/Mage.Sets/src/mage/cards/l/LightningPhoenix.java
+++ b/Mage.Sets/src/mage/cards/l/LightningPhoenix.java
@@ -2,15 +2,14 @@ package mage.cards.l;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.CantBlockAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HasteAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@@ -44,15 +43,11 @@ public final class LightningPhoenix extends CardImpl {
this.addAbility(new CantBlockAbility());
// At the beginning of your end step, if an opponent was dealt 3 or more damage this turn, you may pay {R}. If you do, return Lightning Phoenix from your graveyard to the battlefield.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- Zone.GRAVEYARD,
- TargetController.YOU, new DoIfCostPaid(
- new ReturnSourceFromGraveyardToBattlefieldEffect(), new ManaCostsImpl<>("{R}")
- ), false, null
- ), LightningPhoenixCondition.instance, "At the beginning of your end step, " +
- "if an opponent was dealt 3 or more damage this turn, you may pay {R}. " +
- "If you do, return {this} from your graveyard to the battlefield."
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ Zone.GRAVEYARD, TargetController.YOU,
+ new DoIfCostPaid(
+ new ReturnSourceFromGraveyardToBattlefieldEffect(), new ManaCostsImpl<>("{R}")
+ ), false, LightningPhoenixCondition.instance
), new LightningPhoenixWatcher());
}
@@ -74,6 +69,11 @@ enum LightningPhoenixCondition implements Condition {
LightningPhoenixWatcher watcher = game.getState().getWatcher(LightningPhoenixWatcher.class);
return watcher != null && watcher.checkDamage(source.getControllerId());
}
+
+ @Override
+ public String toString() {
+ return "an opponent was dealt 3 or more damage this turn";
+ }
}
class LightningPhoenixWatcher extends Watcher {
diff --git a/Mage.Sets/src/mage/cards/l/LilianasContract.java b/Mage.Sets/src/mage/cards/l/LilianasContract.java
index ef6b3616681..77f572540c3 100644
--- a/Mage.Sets/src/mage/cards/l/LilianasContract.java
+++ b/Mage.Sets/src/mage/cards/l/LilianasContract.java
@@ -1,16 +1,12 @@
package mage.cards.l;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.abilities.effects.common.WinGameSourceControllerEffect;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -18,8 +14,11 @@ import mage.constants.SubType;
import mage.game.Game;
import mage.game.permanent.Permanent;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class LilianasContract extends CardImpl {
@@ -28,25 +27,13 @@ public final class LilianasContract extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}");
// When Liliana's Contract enters the battlefield, you draw four cards and you lose 4 life.
- Ability ability = new EntersBattlefieldTriggeredAbility(
- new DrawCardSourceControllerEffect(4)
- .setText("you draw four cards")
- );
- ability.addEffect(
- new LoseLifeSourceControllerEffect(4)
- .setText("and you lose 4 life")
- );
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(4, true));
+ ability.addEffect(new LoseLifeSourceControllerEffect(4).setText("and you lose 4 life"));
this.addAbility(ability);
// At the beginning of your upkeep, if you control four or more Demons with different names, you win the game.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(
- new WinGameSourceControllerEffect(), false
- ), LilianasContractCondition.instance,
- "At the beginning of your upkeep, "
- + "if you control four or more Demons with different names, "
- + "you win the game."
- ));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect())
+ .withInterveningIf(LilianasContractCondition.instance));
}
private LilianasContract(final LilianasContract card) {
diff --git a/Mage.Sets/src/mage/cards/l/LilianasScrounger.java b/Mage.Sets/src/mage/cards/l/LilianasScrounger.java
index 3def5d14982..30825b347fe 100644
--- a/Mage.Sets/src/mage/cards/l/LilianasScrounger.java
+++ b/Mage.Sets/src/mage/cards/l/LilianasScrounger.java
@@ -2,11 +2,10 @@ package mage.cards.l;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.condition.common.MorbidCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.hint.common.MorbidHint;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -37,10 +36,9 @@ public final class LilianasScrounger extends CardImpl {
this.toughness = new MageInt(2);
// At the beginning of each end step, if a creature died this turn, you may put a loyalty counter on a Liliana planeswalker you control.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(new BeginningOfEndStepTriggeredAbility(
- TargetController.ANY, new LilianasScroungerEffect(), false
- ), MorbidCondition.instance, "At the beginning of each end step, " +
- "if a creature died this turn, you may put a loyalty counter on a Liliana planeswalker you control."
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ TargetController.ANY, new LilianasScroungerEffect(),
+ false, MorbidCondition.instance
).addHint(MorbidHint.instance));
}
@@ -61,6 +59,7 @@ class LilianasScroungerEffect extends OneShotEffect {
LilianasScroungerEffect() {
super(Outcome.Benefit);
+ staticText = "you may put a loyalty counter on a Liliana planeswalker you control";
}
private LilianasScroungerEffect(final LilianasScroungerEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/l/LinvalaShieldOfSeaGate.java b/Mage.Sets/src/mage/cards/l/LinvalaShieldOfSeaGate.java
index dafe59292ad..3b5928755c2 100644
--- a/Mage.Sets/src/mage/cards/l/LinvalaShieldOfSeaGate.java
+++ b/Mage.Sets/src/mage/cards/l/LinvalaShieldOfSeaGate.java
@@ -2,11 +2,9 @@ package mage.cards.l;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.common.FullPartyCondition;
import mage.abilities.costs.common.SacrificeSourceCost;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.RestrictionEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
@@ -14,6 +12,7 @@ import mage.abilities.hint.common.PartyCountHint;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HexproofAbility;
import mage.abilities.keyword.IndestructibleAbility;
+import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@@ -52,13 +51,8 @@ public final class LinvalaShieldOfSeaGate extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// At the beginning of combat on your turn, if you have a full party, choose target nonland permanent an opponent controls. Until your next turn, it can't attack or block, and its activated abilities can't be activated.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfCombatTriggeredAbility(
- new LinvalaShieldOfSeaGateRestrictionEffect()
- ), FullPartyCondition.instance, "At the beginning of combat on your turn, " +
- "if you have a full party, choose target nonland permanent an opponent controls. " +
- "Until your next turn, it can't attack or block, and its activated abilities can't be activated."
- );
+ Ability ability = new BeginningOfCombatTriggeredAbility(new LinvalaShieldOfSeaGateRestrictionEffect())
+ .withInterveningIf(FullPartyCondition.instance);
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability.addHint(PartyCountHint.instance));
@@ -80,6 +74,8 @@ class LinvalaShieldOfSeaGateRestrictionEffect extends RestrictionEffect {
LinvalaShieldOfSeaGateRestrictionEffect() {
super(Duration.UntilYourNextTurn, Outcome.UnboostCreature);
+ staticText = "choose target nonland permanent an opponent controls. Until your next turn, " +
+ "it can't attack or block, and its activated abilities can't be activated";
}
private LinvalaShieldOfSeaGateRestrictionEffect(final LinvalaShieldOfSeaGateRestrictionEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/l/LinvalaThePreserver.java b/Mage.Sets/src/mage/cards/l/LinvalaThePreserver.java
index b63ee29897c..ec96f5c4b89 100644
--- a/Mage.Sets/src/mage/cards/l/LinvalaThePreserver.java
+++ b/Mage.Sets/src/mage/cards/l/LinvalaThePreserver.java
@@ -1,12 +1,10 @@
-
package mage.cards.l;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.OpponentControlsMoreCondition;
import mage.abilities.condition.common.OpponentHasMoreLifeCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -15,15 +13,18 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
-import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.StaticFilters;
import mage.game.permanent.token.Angel33Token;
+import java.util.UUID;
+
/**
- *
* @author fireshoes
*/
public final class LinvalaThePreserver extends CardImpl {
+ private static final Condition condition = new OpponentControlsMoreCondition(StaticFilters.FILTER_PERMANENT_CREATURES);
+
public LinvalaThePreserver(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}{W}");
this.supertype.add(SuperType.LEGENDARY);
@@ -35,14 +36,12 @@ public final class LinvalaThePreserver extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// When Linvala, the Preserver enters the battlefield, if an opponent has more life than you, you gain 5 life.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(5), false),
- OpponentHasMoreLifeCondition.instance,
- "When {this} enters, if an opponent has more life than you, you gain 5 life."));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(5))
+ .withInterveningIf(OpponentHasMoreLifeCondition.instance));
// When Linvala enters the battlefield, if an opponent controls more creatures than you, create a 3/3 white Angel creature token with flying.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new Angel33Token()), false),
- new OpponentControlsMoreCondition(new FilterCreaturePermanent()),
- "When {this} enters, if an opponent controls more creatures than you, create a 3/3 white Angel creature token with flying."));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new Angel33Token()))
+ .withInterveningIf(condition));
}
private LinvalaThePreserver(final LinvalaThePreserver card) {
diff --git a/Mage.Sets/src/mage/cards/l/LittjaraKinseekers.java b/Mage.Sets/src/mage/cards/l/LittjaraKinseekers.java
index 285066909de..cd8f520cf49 100644
--- a/Mage.Sets/src/mage/cards/l/LittjaraKinseekers.java
+++ b/Mage.Sets/src/mage/cards/l/LittjaraKinseekers.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.GreatestSharedCreatureTypeCount;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.keyword.ScryEffect;
@@ -34,14 +33,9 @@ public final class LittjaraKinseekers extends CardImpl {
this.addAbility(new ChangelingAbility());
// When Littjara Kinseekers enters the battlefield, if you control three or more creatures that share a creature type, put a +1/+1 counter on Littjara Kinseekers, then scry 1.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance())
- ), LittjaraKinseekersCondition.instance, "When {this} enters, " +
- "if you control three or more creatures that share a creature type, " +
- "put a +1/+1 counter on {this}, then scry 1."
- );
- ability.addEffect(new ScryEffect(1));
+ Ability ability = new EntersBattlefieldTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()))
+ .withInterveningIf(LittjaraKinseekersCondition.instance);
+ ability.addEffect(new ScryEffect(1).concatBy(", then"));
this.addAbility(ability.addHint(GreatestSharedCreatureTypeCount.getHint()));
}
@@ -62,4 +56,9 @@ enum LittjaraKinseekersCondition implements Condition {
public boolean apply(Game game, Ability source) {
return GreatestSharedCreatureTypeCount.instance.calculate(game, source, null) >= 3;
}
+
+ @Override
+ public String toString() {
+ return "you control three or more creatures that share a creature type";
+ }
}
diff --git a/Mage.Sets/src/mage/cards/l/LoanShark.java b/Mage.Sets/src/mage/cards/l/LoanShark.java
index ed4334b58a6..0165297bc9f 100644
--- a/Mage.Sets/src/mage/cards/l/LoanShark.java
+++ b/Mage.Sets/src/mage/cards/l/LoanShark.java
@@ -4,7 +4,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.keyword.PlotAbility;
import mage.abilities.keyword.StormAbility;
@@ -31,11 +30,8 @@ public final class LoanShark extends CardImpl {
this.toughness = new MageInt(4);
// When Loan Shark enters the battlefield, if you've cast two or more spells this turn, draw a card.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)),
- LoanSharkCondition.instance, "When {this} enters, " +
- "if you've cast two or more spells this turn, draw a card."
- ).addHint(StormAbility.getHint()));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))
+ .withInterveningIf(LoanSharkCondition.instance).addHint(StormAbility.getHint()));
// Plot {3}{U}
this.addAbility(new PlotAbility("{3}{U}"));
@@ -61,4 +57,9 @@ enum LoanSharkCondition implements Condition {
.getWatcher(SpellsCastWatcher.class)
.getCount(source.getControllerId()) >= 2;
}
+
+ @Override
+ public String toString() {
+ return "you've cast two or more spells this turn";
+ }
}
diff --git a/Mage.Sets/src/mage/cards/l/LockedInTheCemetery.java b/Mage.Sets/src/mage/cards/l/LockedInTheCemetery.java
index dc64fd80d07..219754fee65 100644
--- a/Mage.Sets/src/mage/cards/l/LockedInTheCemetery.java
+++ b/Mage.Sets/src/mage/cards/l/LockedInTheCemetery.java
@@ -1,11 +1,9 @@
package mage.cards.l;
-import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.CardsInControllerGraveyardCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect;
import mage.abilities.effects.common.TapEnchantedEffect;
@@ -36,15 +34,10 @@ public final class LockedInTheCemetery extends CardImpl {
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
- Ability ability = new EnchantAbility(auraTarget);
- this.addAbility(ability);
+ this.addAbility(new EnchantAbility(auraTarget));
// When Locked in the Cemetery enters the battlefield, if there are five or more cards in your graveyard, tap enchanted creature.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect()),
- condition, "When {this} enters, if there are " +
- "five or more cards in your graveyard, tap enchanted creature."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect()).withInterveningIf(condition));
// Enchanted creature doesn't untap during its controller's untap step.
this.addAbility(new SimpleStaticAbility(new DontUntapInControllersUntapStepEnchantedEffect()));
diff --git a/Mage.Sets/src/mage/cards/l/LoneRevenant.java b/Mage.Sets/src/mage/cards/l/LoneRevenant.java
index 3250bcab753..3d35cf453fb 100644
--- a/Mage.Sets/src/mage/cards/l/LoneRevenant.java
+++ b/Mage.Sets/src/mage/cards/l/LoneRevenant.java
@@ -1,11 +1,9 @@
package mage.cards.l;
-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.LookLibraryAndPickControllerEffect;
import mage.abilities.keyword.HexproofAbility;
import mage.cards.CardImpl;
@@ -14,19 +12,27 @@ import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.PutCards;
import mage.constants.SubType;
-import mage.filter.StaticFilters;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.mageobject.AnotherPredicate;
+
+import java.util.UUID;
/**
- *
* @author awjackson
*/
public final class LoneRevenant extends CardImpl {
- private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
- StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, ComparisonType.EQUAL_TO, 0);
+ private static final FilterPermanent filter = new FilterControlledCreaturePermanent("you control no other creatures");
+
+ static {
+ filter.add(AnotherPredicate.instance);
+ }
+
+ private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0);
public LoneRevenant(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.SPIRIT);
this.power = new MageInt(4);
@@ -37,14 +43,9 @@ public final class LoneRevenant extends CardImpl {
// Whenever Lone Revenant deals combat damage to a player,
// if you control no other creatures, look at the top four cards of your library.
// Put one of them into your hand and the rest on the bottom of your library in any order.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new DealsCombatDamageToAPlayerTriggeredAbility(
- new LookLibraryAndPickControllerEffect(4, 1, PutCards.HAND, PutCards.BOTTOM_ANY),
- false
- ), condition, "Whenever {this} deals combat damage to a player, " +
- "if you control no other creatures, look at the top four cards of your library. " +
- "Put one of them into your hand and the rest on the bottom of your library in any order."
- ));
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new LookLibraryAndPickControllerEffect(
+ 4, 1, PutCards.HAND, PutCards.BOTTOM_ANY
+ )).withInterveningIf(condition));
}
private LoneRevenant(final LoneRevenant card) {
diff --git a/Mage.Sets/src/mage/cards/l/LoneRider.java b/Mage.Sets/src/mage/cards/l/LoneRider.java
index 1d2c7db5c86..4043af88cec 100644
--- a/Mage.Sets/src/mage/cards/l/LoneRider.java
+++ b/Mage.Sets/src/mage/cards/l/LoneRider.java
@@ -1,16 +1,15 @@
package mage.cards.l;
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.effects.common.TransformSourceEffect;
import mage.abilities.hint.ConditionHint;
import mage.abilities.hint.Hint;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.TransformAbility;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -26,9 +25,8 @@ import java.util.UUID;
*/
public final class LoneRider extends CardImpl {
- private static final String ruleText = "At the beginning of the end step, if you gained 3 or more life this turn, transform {this}";
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 LoneRider(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
@@ -47,11 +45,9 @@ public final class LoneRider extends CardImpl {
// At the beginning of the end step, if you gained 3 or more life this turn, transform Lone Rider.
this.addAbility(new TransformAbility());
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- TargetController.NEXT, new TransformSourceEffect(), false
- ), condition, ruleText
- ).addHint(hint), new PlayerGainedLifeWatcher());
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ TargetController.NEXT, new TransformSourceEffect(), false
+ ).withInterveningIf(condition).addHint(hint), new PlayerGainedLifeWatcher());
}
private LoneRider(final LoneRider card) {
diff --git a/Mage.Sets/src/mage/cards/l/LordSkittersBlessing.java b/Mage.Sets/src/mage/cards/l/LordSkittersBlessing.java
index dc87fa4fd3a..facdafff66a 100644
--- a/Mage.Sets/src/mage/cards/l/LordSkittersBlessing.java
+++ b/Mage.Sets/src/mage/cards/l/LordSkittersBlessing.java
@@ -1,16 +1,15 @@
package mage.cards.l;
import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfDrawTriggeredAbility;
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.CreateRoleAttachedTargetEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.abilities.hint.ConditionHint;
import mage.abilities.hint.Hint;
+import mage.abilities.triggers.BeginningOfDrawTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -28,14 +27,14 @@ import java.util.UUID;
*/
public final class LordSkittersBlessing extends CardImpl {
- private static final FilterPermanent filter = new FilterControlledCreaturePermanent();
+ private static final FilterPermanent filter = new FilterControlledCreaturePermanent("you control an enchanted creature");
static {
filter.add(EnchantedPredicate.instance);
}
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter);
- private static final Hint hint = new ConditionHint(condition, "You control an enchanted creature");
+ private static final Hint hint = new ConditionHint(condition);
public LordSkittersBlessing(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
@@ -46,13 +45,10 @@ public final class LordSkittersBlessing extends CardImpl {
this.addAbility(ability);
// At the beginning of your draw step, if you control an enchanted creature, you lose 1 life and you draw an additional card.
- ability = new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfDrawTriggeredAbility(
- TargetController.YOU, new LoseLifeSourceControllerEffect(1), false
- ), condition, "At the beginning of your draw step, if you control " +
- "an enchanted creature, you lose 1 life and you draw an additional card."
- );
- ability.addEffect(new DrawCardSourceControllerEffect(1));
+ ability = new BeginningOfDrawTriggeredAbility(
+ TargetController.YOU, new LoseLifeSourceControllerEffect(1), false
+ ).withInterveningIf(condition);
+ ability.addEffect(new DrawCardSourceControllerEffect(1).setText("and you draw an additional card"));
this.addAbility(ability.addHint(hint));
}
diff --git a/Mage.Sets/src/mage/cards/l/LostMonarchOfIfnir.java b/Mage.Sets/src/mage/cards/l/LostMonarchOfIfnir.java
index 68b5d63384f..31bd9c446bd 100644
--- a/Mage.Sets/src/mage/cards/l/LostMonarchOfIfnir.java
+++ b/Mage.Sets/src/mage/cards/l/LostMonarchOfIfnir.java
@@ -1,26 +1,22 @@
package mage.cards.l;
-import java.util.Optional;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.TriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.MillCardsControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.hint.ConditionHint;
import mage.abilities.hint.Hint;
+import mage.abilities.keyword.AfflictAbility;
import mage.abilities.triggers.BeginningOfSecondMainTriggeredAbility;
import mage.cards.Card;
-import mage.constants.*;
-import mage.abilities.keyword.AfflictAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.filter.FilterCard;
-import mage.filter.common.FilterCreatureCard;
+import mage.constants.*;
+import mage.filter.FilterPermanent;
+import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.events.DamagedEvent;
@@ -31,17 +27,20 @@ import mage.target.TargetCard;
import mage.target.common.TargetCardInYourGraveyard;
import mage.watchers.Watcher;
+import java.util.Optional;
+import java.util.UUID;
+
/**
* @author sobiech
*/
public final class LostMonarchOfIfnir extends CardImpl {
- private final static Hint hint = new ConditionHint(LostMonarchOfIfnirCondition.instance, "Player was dealt combat damage by a Zombie this turn");
- private final static FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.ZOMBIE, "Zombies");
+ private final static FilterPermanent filter = new FilterCreaturePermanent(SubType.ZOMBIE, "Zombies");
+ private final static Hint hint = new ConditionHint(LostMonarchOfIfnirCondition.instance);
public LostMonarchOfIfnir(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
-
+
this.subtype.add(SubType.ZOMBIE);
this.subtype.add(SubType.NOBLE);
this.power = new MageInt(4);
@@ -52,28 +51,15 @@ public final class LostMonarchOfIfnir extends CardImpl {
// Other Zombies you control have afflict 3.
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
- new AfflictAbility(3),
- Duration.WhileOnBattlefield,
- filter,
- true
+ new AfflictAbility(3), Duration.WhileOnBattlefield, filter, true
)));
- final TriggeredAbility ability = new BeginningOfSecondMainTriggeredAbility(
- Zone.BATTLEFIELD,
- TargetController.YOU,
- new LostMonarchOfIfnirEffect(),
- false
- );
- ability.addHint(hint);
-
// At the beginning of your second main phase, if a player was dealt combat damage by a Zombie this turn, mill three cards, then you may return a creature card from your graveyard to your hand.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- ability,
- LostMonarchOfIfnirCondition.instance,
- "at the beginning of your second main phase, " +
- "if a player was dealt combat damage by a Zombie this turn, " +
- "mill three cards, then you may return a creature card from your graveyard to your hand"
- ), new LostMonarchOfIfnirWatcher());
+ Ability ability = new BeginningOfSecondMainTriggeredAbility(
+ new MillCardsControllerEffect(3), false
+ ).withInterveningIf(LostMonarchOfIfnirCondition.instance);
+ ability.addEffect(new LostMonarchOfIfnirEffect());
+ this.addAbility(ability.addHint(hint), new LostMonarchOfIfnirWatcher());
}
private LostMonarchOfIfnir(final LostMonarchOfIfnir card) {
@@ -87,38 +73,28 @@ public final class LostMonarchOfIfnir extends CardImpl {
}
class LostMonarchOfIfnirEffect extends OneShotEffect {
- private static final FilterCard filter = new FilterCreatureCard();
LostMonarchOfIfnirEffect() {
super(Outcome.Benefit);
+ staticText = ", then you may return a creature card from your graveyard to your hand";
}
- private LostMonarchOfIfnirEffect(OneShotEffect effect){
+
+ private LostMonarchOfIfnirEffect(LostMonarchOfIfnirEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
- new MillCardsControllerEffect(3).apply(game, source);
-
- final TargetCard target = new TargetCardInYourGraveyard(0, 1, filter, true);
- final Player player = game.getPlayer(source.getControllerId());
-
+ Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
-
- if (!player.choose(Outcome.ReturnToHand, target, source, game)) {
- return true;
- }
-
- final Card card = game.getCard(target.getFirstTarget());
- if (card == null) {
- return true;
- }
-
- player.moveCards(card, Zone.HAND, source, game);
-
- return true;
+ TargetCard target = new TargetCardInYourGraveyard(
+ 0, 1, StaticFilters.FILTER_CARD_CREATURE, true
+ );
+ player.choose(Outcome.ReturnToHand, target, source, game);
+ Card card = game.getCard(target.getFirstTarget());
+ return card != null && player.moveCards(card, Zone.HAND, source, game);
}
@Override
@@ -132,39 +108,34 @@ enum LostMonarchOfIfnirCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- final LostMonarchOfIfnirWatcher watcher = game.getState().getWatcher(LostMonarchOfIfnirWatcher.class);
- return watcher != null && watcher.wasDealtDamage();
+ return game
+ .getState()
+ .getWatcher(LostMonarchOfIfnirWatcher.class)
+ .conditionMet();
+ }
+
+ @Override
+ public String toString() {
+ return "a player was dealt combat damage by a Zombie this turn";
}
}
class LostMonarchOfIfnirWatcher extends Watcher {
- private boolean dealtDamage; //by a zombie this turn
- LostMonarchOfIfnirWatcher() {
- super(WatcherScope.GAME);
- this.dealtDamage = false;
+ LostMonarchOfIfnirWatcher() {
+ super(WatcherScope.GAME);
}
@Override
public void watch(GameEvent event, Game game) {
Optional.of(event)
.filter(e -> e.getType() == GameEvent.EventType.DAMAGED_PLAYER)
- .filter(e -> e instanceof DamagedPlayerEvent)
+ .filter(DamagedPlayerEvent.class::isInstance)
.map(DamagedPlayerEvent.class::cast)
.filter(DamagedEvent::isCombatDamage)
- .map(damagedPlayerEvent -> game.getPermanentOrLKIBattlefield(event.getSourceId()))
+ .map(GameEvent::getSourceId)
+ .map(game::getPermanentOrLKIBattlefield)
.filter(permanent -> permanent.hasSubtype(SubType.ZOMBIE, game))
- .ifPresent(ignored -> this.dealtDamage = true);
- }
-
- @Override
- public void reset() {
- super.reset();
- this.dealtDamage = false;
- }
-
- boolean wasDealtDamage() {
- return this.dealtDamage;
+ .ifPresent(ignored -> this.condition = true);
}
}
-
diff --git a/Mage.Sets/src/mage/cards/l/LoyalWarhound.java b/Mage.Sets/src/mage/cards/l/LoyalWarhound.java
index 9f2162ccca8..b4939d4e19e 100644
--- a/Mage.Sets/src/mage/cards/l/LoyalWarhound.java
+++ b/Mage.Sets/src/mage/cards/l/LoyalWarhound.java
@@ -1,33 +1,29 @@
package mage.cards.l;
-import java.util.UUID;
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.constants.SubType;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SuperType;
+import mage.constants.SubType;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
+import mage.filter.common.FilterBasicLandCard;
import mage.target.common.TargetCardInLibrary;
+import java.util.UUID;
+
/**
- *
* @author weirddan455
*/
public final class LoyalWarhound extends CardImpl {
- private static final FilterCard filter = new FilterCard("basic Plains card");
-
- static {
- filter.add(SuperType.BASIC.getPredicate());
- filter.add(SubType.PLAINS.getPredicate());
- }
+ private static final FilterCard filter = new FilterBasicLandCard(SubType.PLAINS);
+ private static final Condition condition = new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS);
public LoyalWarhound(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
@@ -41,12 +37,9 @@ public final class LoyalWarhound extends CardImpl {
// When Loyal Warhound 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)),
- new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS),
- "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."
- ));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true)
+ ).withInterveningIf(condition));
}
private LoyalWarhound(final LoyalWarhound card) {
diff --git a/Mage.Sets/src/mage/cards/l/LumengridDrake.java b/Mage.Sets/src/mage/cards/l/LumengridDrake.java
index 4b2bc03fc9e..459fd8f5923 100644
--- a/Mage.Sets/src/mage/cards/l/LumengridDrake.java
+++ b/Mage.Sets/src/mage/cards/l/LumengridDrake.java
@@ -1,10 +1,9 @@
package mage.cards.l;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
+import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.MetalcraftCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.abilities.hint.common.MetalcraftHint;
import mage.abilities.keyword.FlyingAbility;
@@ -22,8 +21,6 @@ import java.util.UUID;
*/
public final class LumengridDrake extends CardImpl {
- private static final String ruleText = "When {this} enters, if you control three or more artifacts, return target creature to its owner's hand.";
-
public LumengridDrake(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}");
this.subtype.add(SubType.DRAKE);
@@ -36,12 +33,10 @@ public final class LumengridDrake extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Metalcraft — When Lumengrid Drake enters the battlefield, if you control three or more artifacts, return target creature to its owner's hand.
- TriggeredAbility conditional = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect()), MetalcraftCondition.instance, ruleText);
- conditional.addTarget(new TargetCreaturePermanent());
- conditional.setAbilityWord(AbilityWord.METALCRAFT);
- conditional.addHint(MetalcraftHint.instance);
- this.addAbility(conditional);
+ Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect())
+ .withInterveningIf(MetalcraftCondition.instance);
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability.setAbilityWord(AbilityWord.METALCRAFT).addHint(MetalcraftHint.instance));
}
private LumengridDrake(final LumengridDrake card) {
diff --git a/Mage.Sets/src/mage/cards/l/LuminarchAscension.java b/Mage.Sets/src/mage/cards/l/LuminarchAscension.java
index fdef9d188a2..de60e8cf98d 100644
--- a/Mage.Sets/src/mage/cards/l/LuminarchAscension.java
+++ b/Mage.Sets/src/mage/cards/l/LuminarchAscension.java
@@ -1,15 +1,13 @@
-
package mage.cards.l;
import mage.abilities.Ability;
import mage.abilities.common.ActivateIfConditionActivatedAbility;
-import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -27,19 +25,16 @@ import java.util.UUID;
*/
public final class LuminarchAscension extends CardImpl {
- private static final String rule = "At the beginning of each opponent's end step, " +
- "if you didn't lose life this turn, you may put a quest counter on {this}.";
private static final Condition condition = new SourceHasCounterCondition(CounterType.QUEST, 4);
public LuminarchAscension(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");
// At the beginning of each opponent's end step, if you didn't lose life this turn, you may put a quest counter on Luminarch Ascension.
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new BeginningOfEndStepTriggeredAbility(
- TargetController.OPPONENT, new AddCountersSourceEffect(CounterType.QUEST.createInstance()),
- true
- ), LuminarchAscensionCondition.instance, rule
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ TargetController.OPPONENT,
+ new AddCountersSourceEffect(CounterType.QUEST.createInstance()),
+ true, LuminarchAscensionCondition.instance
));
// {1}{W}: Create a 4/4 white Angel creature token with flying. Activate this ability only if Luminarch Ascension has four or more quest counters on it.
@@ -64,10 +59,14 @@ enum LuminarchAscensionCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- PlayerLostLifeWatcher watcher = game.getState().getWatcher(PlayerLostLifeWatcher.class);
- if (watcher != null) {
- return (watcher.getLifeLost(source.getControllerId()) == 0);
- }
- return false;
+ return game
+ .getState()
+ .getWatcher(PlayerLostLifeWatcher.class)
+ .getLifeLost(source.getControllerId()) == 0;
+ }
+
+ @Override
+ public String toString() {
+ return "you didn't lose life this turn";
}
}
diff --git a/Mage.Sets/src/mage/cards/l/LurkingSkirge.java b/Mage.Sets/src/mage/cards/l/LurkingSkirge.java
index e1ed2ce781a..654264e37be 100644
--- a/Mage.Sets/src/mage/cards/l/LurkingSkirge.java
+++ b/Mage.Sets/src/mage/cards/l/LurkingSkirge.java
@@ -1,11 +1,9 @@
package mage.cards.l;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldAllTriggeredAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceMatchesFilterCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
@@ -14,29 +12,33 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.TargetController;
-import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.common.FilterEnchantmentPermanent;
import mage.game.permanent.token.TokenImpl;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class LurkingSkirge extends CardImpl {
-
+
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
-
+
static {
filter.add(TargetController.OPPONENT.getOwnerPredicate());
}
+ private static final Condition condition = new SourceMatchesFilterCondition(new FilterEnchantmentPermanent("{this} is an enchantment"));
+
public LurkingSkirge(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
// When a creature is put into an opponent's graveyard from the battlefield, if Lurking Skirge is an enchantment, Lurking Skirge becomes a 3/2 Imp creature with flying.
- TriggeredAbility ability = new PutIntoGraveFromBattlefieldAllTriggeredAbility(new BecomesCreatureSourceEffect(new LurkingSkirgeToken(), null, Duration.WhileOnBattlefield), false, filter, false);
- this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new SourceMatchesFilterCondition(StaticFilters.FILTER_PERMANENT_ENCHANTMENT),
- "When a creature is put into an opponent's graveyard from the battlefield, if {this} is an enchantment, {this} becomes a 3/2 Phyrexian Imp creature with flying."));
+ this.addAbility(new PutIntoGraveFromBattlefieldAllTriggeredAbility(new BecomesCreatureSourceEffect(
+ new LurkingSkirgeToken(), null, Duration.WhileOnBattlefield
+ ), false, filter, false).withInterveningIf(condition)
+ .setTriggerPhrase("When a creature is put into an opponent's graveyard from the battlefield, "));
}
private LurkingSkirge(final LurkingSkirge card) {
diff --git a/Mage.Sets/src/mage/cards/l/LutriTheSpellchaser.java b/Mage.Sets/src/mage/cards/l/LutriTheSpellchaser.java
index 818845b3be4..8d0c7c65af5 100644
--- a/Mage.Sets/src/mage/cards/l/LutriTheSpellchaser.java
+++ b/Mage.Sets/src/mage/cards/l/LutriTheSpellchaser.java
@@ -5,7 +5,6 @@ import mage.MageObject;
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.CopyTargetStackObjectEffect;
import mage.abilities.keyword.CompanionAbility;
import mage.abilities.keyword.CompanionCondition;
@@ -54,12 +53,8 @@ public final class LutriTheSpellchaser extends CardImpl {
this.addAbility(FlashAbility.getInstance());
// When Lutri, the Spellchaser enters the battlefield, if you cast it, copy target instant or sorcery spell you control. You may choose new targets for the copy.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new CopyTargetStackObjectEffect(), false),
- CastFromEverywhereSourceCondition.instance, "When {this} enters, " +
- "if you cast it, copy target instant or sorcery spell you control. " +
- "You may choose new targets for the copy."
- );
+ Ability ability = new EntersBattlefieldTriggeredAbility(new CopyTargetStackObjectEffect())
+ .withInterveningIf(CastFromEverywhereSourceCondition.instance);
ability.addTarget(new TargetSpell(filter));
this.addAbility(ability);
}
diff --git a/Mage/src/main/java/mage/abilities/condition/common/EnchantedSourceCondition.java b/Mage/src/main/java/mage/abilities/condition/common/EnchantedSourceCondition.java
index 28e4fb3db24..4921b46aa38 100644
--- a/Mage/src/main/java/mage/abilities/condition/common/EnchantedSourceCondition.java
+++ b/Mage/src/main/java/mage/abilities/condition/common/EnchantedSourceCondition.java
@@ -7,6 +7,7 @@ import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.game.Game;
import mage.game.permanent.Permanent;
+import mage.util.CardUtil;
import java.util.UUID;
@@ -50,6 +51,6 @@ public class EnchantedSourceCondition implements Condition {
@Override
public String toString() {
- return "{this} is enchanted";
+ return "{this} is enchanted" + (numberOfEnchantments > 1 ? " by " + CardUtil.numberToText(numberOfEnchantments) + " or more Auras" : "");
}
}
diff --git a/Mage/src/main/java/mage/abilities/condition/common/OpponentHasMoreLifeCondition.java b/Mage/src/main/java/mage/abilities/condition/common/OpponentHasMoreLifeCondition.java
index 5ea4d9a6131..d4db69c9a0e 100644
--- a/Mage/src/main/java/mage/abilities/condition/common/OpponentHasMoreLifeCondition.java
+++ b/Mage/src/main/java/mage/abilities/condition/common/OpponentHasMoreLifeCondition.java
@@ -1,5 +1,3 @@
-
-
package mage.abilities.condition.common;
import mage.abilities.Ability;
@@ -10,25 +8,23 @@ import mage.players.Player;
import java.util.UUID;
/**
- *
* @author fireshoes
*/
public enum OpponentHasMoreLifeCondition implements Condition {
instance;
-
+
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
- if (controller != null) {
- for (UUID uuid : game.getOpponents(controller.getId())) {
- Player opponent = game.getPlayer(uuid);
- if (opponent != null) {
- if (opponent.getLife() > controller.getLife()) {
- return true;
- }
- }
+ if (controller == null) {
+ return false;
+ }
+ for (UUID uuid : game.getOpponents(controller.getId())) {
+ Player opponent = game.getPlayer(uuid);
+ if (opponent != null && opponent.getLife() > controller.getLife()) {
+ return true;
}
}
return false;
diff --git a/Mage/src/main/java/mage/filter/common/FilterPlaneswalkerPermanent.java b/Mage/src/main/java/mage/filter/common/FilterPlaneswalkerPermanent.java
index eedc09a699b..638bf60a323 100644
--- a/Mage/src/main/java/mage/filter/common/FilterPlaneswalkerPermanent.java
+++ b/Mage/src/main/java/mage/filter/common/FilterPlaneswalkerPermanent.java
@@ -1,5 +1,3 @@
-
-
package mage.filter.common;
import mage.constants.CardType;
@@ -16,7 +14,11 @@ public class FilterPlaneswalkerPermanent extends FilterPermanent {
}
public FilterPlaneswalkerPermanent(SubType subType) {
- this(subType.getDescription() + " planeswalker");
+ this(subType, subType.getDescription() + " planeswalker");
+ }
+
+ public FilterPlaneswalkerPermanent(SubType subType, String name) {
+ this(name);
this.add(subType.getPredicate());
}