diff --git a/Mage.Sets/src/mage/cards/a/AnaSanctuary.java b/Mage.Sets/src/mage/cards/a/AnaSanctuary.java index 0b18e54890b..0c6a8f9ae49 100644 --- a/Mage.Sets/src/mage/cards/a/AnaSanctuary.java +++ b/Mage.Sets/src/mage/cards/a/AnaSanctuary.java @@ -1,24 +1,18 @@ - package mage.cards.a; -import java.util.UUID; import mage.ObjectColor; import mage.abilities.Ability; -import mage.abilities.common.SanctuaryInterveningIfTriggeredAbility; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.SanctuaryTriggeredAbility; +import mage.abilities.effects.common.AddContinuousEffectToGame; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; /** - * * @author TheElk801 */ public final class AnaSanctuary extends CardImpl { @@ -27,10 +21,11 @@ public final class AnaSanctuary extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); // At the beginning of your upkeep, if you control a blue or black permanent, target creature gets +1/+1 until end of turn. If you control a blue permanent and a black permanent, that creature gets +5/+5 until end of turn instead. - Ability ability = new SanctuaryInterveningIfTriggeredAbility( - new BoostEffect(1), new BoostEffect(5), ObjectColor.BLACK, ObjectColor.BLUE, - "At the beginning of your upkeep, if you control a blue or black permanent, " - + "target creature gets +1/+1 until end of turn. If you control a blue permanent and a black permanent, that creature gets +5/+5 until end of turn instead." + Ability ability = new SanctuaryTriggeredAbility( + new AddContinuousEffectToGame(new BoostTargetEffect(1, 1)), + new AddContinuousEffectToGame(new BoostTargetEffect(5, 5)), + ObjectColor.BLACK, ObjectColor.BLUE, "target creature gets +1/+1 until end of turn. " + + "If you control a blue permanent and a black permanent, that creature gets +5/+5 until end of turn instead." ); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); @@ -45,31 +40,3 @@ public final class AnaSanctuary extends CardImpl { return new AnaSanctuary(this); } } - -class BoostEffect extends OneShotEffect { - - private final int amount; - - BoostEffect(int amount) { - super(Outcome.Benefit); - this.amount = amount; - } - - private BoostEffect(final BoostEffect effect) { - super(effect); - this.amount = effect.amount; - } - - @Override - public BoostEffect copy() { - return new BoostEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - ContinuousEffect effect = new BoostTargetEffect(amount, amount, Duration.EndOfTurn); - effect.setTargetPointer(new FixedTarget(source.getFirstTarget(), game)); - game.addEffect(effect, source); - return true; - } -} diff --git a/Mage.Sets/src/mage/cards/c/CetaSanctuary.java b/Mage.Sets/src/mage/cards/c/CetaSanctuary.java index d995234fe7f..a5f2d20753e 100644 --- a/Mage.Sets/src/mage/cards/c/CetaSanctuary.java +++ b/Mage.Sets/src/mage/cards/c/CetaSanctuary.java @@ -1,17 +1,16 @@ package mage.cards.c; -import java.util.UUID; import mage.ObjectColor; -import mage.abilities.Ability; -import mage.abilities.common.SanctuaryInterveningIfTriggeredAbility; +import mage.abilities.common.SanctuaryTriggeredAbility; import mage.abilities.effects.common.DrawDiscardControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class CetaSanctuary extends CardImpl { @@ -20,12 +19,12 @@ public final class CetaSanctuary extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); // At the beginning of your upkeep, if you control a red or green permanent, draw a card, then discard a card. If you control a red permanent and a green permanent, instead draw two cards, then discard a card. - Ability ability = new SanctuaryInterveningIfTriggeredAbility( - new DrawDiscardControllerEffect(1, 1), new DrawDiscardControllerEffect(2, 1), ObjectColor.GREEN, ObjectColor.RED, - "At the beginning of your upkeep, if you control a red or green permanent, draw a card, then discard a card. " - + "If you control a red permanent and a green permanent, instead draw two cards, then discard a card." - ); - this.addAbility(ability); + this.addAbility(new SanctuaryTriggeredAbility( + new DrawDiscardControllerEffect(1, 1), + new DrawDiscardControllerEffect(2, 1), + ObjectColor.GREEN, ObjectColor.RED, "draw a card, then discard a card. " + + "If you control a red permanent and a green permanent, instead draw two cards, then discard a card." + )); } private CetaSanctuary(final CetaSanctuary card) { diff --git a/Mage.Sets/src/mage/cards/c/CurseOfTheCabal.java b/Mage.Sets/src/mage/cards/c/CurseOfTheCabal.java index 179dd87f298..9cb6f270e1e 100644 --- a/Mage.Sets/src/mage/cards/c/CurseOfTheCabal.java +++ b/Mage.Sets/src/mage/cards/c/CurseOfTheCabal.java @@ -1,16 +1,15 @@ package mage.cards.c; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.condition.common.SuspendedCondition; import mage.abilities.costs.Cost; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.SuspendAbility; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -44,8 +43,9 @@ public final class CurseOfTheCabal extends CardImpl { this.addAbility(new SuspendAbility(2, new ManaCostsImpl<>("{2}{B}{B}"), this)); // At the beginning of each player's upkeep, if Curse of the Cabal is suspended, that player may sacrifice a permanent. If they do, put two time counters on Curse of the Cabal. - this.addAbility(new CurseOfTheCabalInterveningIfTriggeredAbility()); - + this.addAbility(new BeginningOfUpkeepTriggeredAbility( + Zone.EXILED, TargetController.ANY, new CurseOfTheCabalTriggeredAbilityConditionalDelay(), false + ).withInterveningIf(SuspendedCondition.instance)); } private CurseOfTheCabal(final CurseOfTheCabal card) { @@ -100,36 +100,11 @@ class CurseOfTheCabalSacrificeEffect extends OneShotEffect { } } -class CurseOfTheCabalInterveningIfTriggeredAbility extends ConditionalInterveningIfTriggeredAbility { - - public CurseOfTheCabalInterveningIfTriggeredAbility() { - super(new BeginningOfUpkeepTriggeredAbility( - Zone.EXILED, TargetController.ANY, new CurseOfTheCabalTriggeredAbilityConditionalDelay(), - false - ), - SuspendedCondition.instance, - "At the beginning of each player's upkeep, if {this} is suspended, " - + "that player may sacrifice a permanent. If the player does, " - + "put two time counters on {this}." - ); - // controller has to sac a permanent - // counters aren't placed - } - - private CurseOfTheCabalInterveningIfTriggeredAbility(final CurseOfTheCabalInterveningIfTriggeredAbility effect) { - super(effect); - } - - @Override - public CurseOfTheCabalInterveningIfTriggeredAbility copy() { - return new CurseOfTheCabalInterveningIfTriggeredAbility(this); - } -} - class CurseOfTheCabalTriggeredAbilityConditionalDelay extends AddCountersSourceEffect { public CurseOfTheCabalTriggeredAbilityConditionalDelay() { super(CounterType.TIME.createInstance(), StaticValue.get(2), false, true); + staticText = "that player may sacrifice a permanent. If the player does, put two time counters on {this}"; } @Override diff --git a/Mage.Sets/src/mage/cards/d/DarigaazReincarnated.java b/Mage.Sets/src/mage/cards/d/DarigaazReincarnated.java index 5a05b6caaee..822e14cdd9e 100644 --- a/Mage.Sets/src/mage/cards/d/DarigaazReincarnated.java +++ b/Mage.Sets/src/mage/cards/d/DarigaazReincarnated.java @@ -2,16 +2,15 @@ package mage.cards.d; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.TrampleAbility; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -52,7 +51,9 @@ public final class DarigaazReincarnated extends CardImpl { this.addAbility(new SimpleStaticAbility(new DarigaazReincarnatedDiesEffect())); // At the beginning of your upkeep, if Darigaaz is exiled with an egg counter on it, remove an egg counter from it. Then if Darigaaz has no egg counters on it, return it to the battlefield. - this.addAbility(new DarigaazReincarnatedInterveningIfTriggeredAbility()); + Ability ability = new BeginningOfUpkeepTriggeredAbility( + Zone.EXILED, TargetController.YOU, new DarigaazReincarnatedReturnEffect(), false + ).withInterveningIf(DarigaazReincarnatedCondition.instance); } private DarigaazReincarnated(final DarigaazReincarnated card) { @@ -108,30 +109,11 @@ class DarigaazReincarnatedDiesEffect extends ReplacementEffectImpl { } -class DarigaazReincarnatedInterveningIfTriggeredAbility extends ConditionalInterveningIfTriggeredAbility { - - public DarigaazReincarnatedInterveningIfTriggeredAbility() { - super(new BeginningOfUpkeepTriggeredAbility(Zone.EXILED, TargetController.YOU, new DarigaazReincarnatedReturnEffect(), false), - DarigaazReincarnatedCondition.instance, - "At the beginning of your upkeep, if {this} is exiled with an egg counter on it, " - + "remove an egg counter from it. Then if {this} has no egg counters on it, return it to the battlefield"); - } - - private DarigaazReincarnatedInterveningIfTriggeredAbility(final DarigaazReincarnatedInterveningIfTriggeredAbility effect) { - super(effect); - } - - @Override - public DarigaazReincarnatedInterveningIfTriggeredAbility copy() { - return new DarigaazReincarnatedInterveningIfTriggeredAbility(this); - } -} - class DarigaazReincarnatedReturnEffect extends OneShotEffect { DarigaazReincarnatedReturnEffect() { super(Outcome.Benefit); - this.staticText = ""; + this.staticText = "remove an egg counter from it. Then if {this} has no egg counters on it, return it to the battlefield"; } private DarigaazReincarnatedReturnEffect(final DarigaazReincarnatedReturnEffect effect) { @@ -165,10 +147,13 @@ enum DarigaazReincarnatedCondition implements Condition { @Override public boolean apply(Game game, Ability source) { Card card = game.getCard(source.getSourceId()); - if (card != null) { - return game.getState().getZone(card.getId()) == Zone.EXILED - && card.getCounters(game).getCount(CounterType.EGG) > 0; - } - return false; + return card != null + && game.getState().getZone(card.getId()) == Zone.EXILED + && card.getCounters(game).getCount(CounterType.EGG) > 0; + } + + @Override + public String toString() { + return "{this} is exiled with an egg counter on it"; } } diff --git a/Mage.Sets/src/mage/cards/d/DegaSanctuary.java b/Mage.Sets/src/mage/cards/d/DegaSanctuary.java index 6d1b49c3aee..c127a371083 100644 --- a/Mage.Sets/src/mage/cards/d/DegaSanctuary.java +++ b/Mage.Sets/src/mage/cards/d/DegaSanctuary.java @@ -1,17 +1,15 @@ - package mage.cards.d; -import java.util.UUID; import mage.ObjectColor; -import mage.abilities.Ability; -import mage.abilities.common.SanctuaryInterveningIfTriggeredAbility; +import mage.abilities.common.SanctuaryTriggeredAbility; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class DegaSanctuary extends CardImpl { @@ -20,12 +18,10 @@ public final class DegaSanctuary extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); // At the beginning of your upkeep, if you control a black or red permanent, you gain 2 life. If you control a black permanent and a red permanent, you gain 4 life instead. - Ability ability = new SanctuaryInterveningIfTriggeredAbility( + this.addAbility(new SanctuaryTriggeredAbility( new GainLifeEffect(2), new GainLifeEffect(4), ObjectColor.BLACK, ObjectColor.RED, - "At the beginning of your upkeep, if you control a black or red permanent, you gain 2 life. " - + "If you control a black permanent and a red permanent, you gain 4 life instead." - ); - this.addAbility(ability); + "you gain 2 life. If you control a black permanent and a red permanent, you gain 4 life instead." + )); } private DegaSanctuary(final DegaSanctuary card) { diff --git a/Mage.Sets/src/mage/cards/f/FaeOffering.java b/Mage.Sets/src/mage/cards/f/FaeOffering.java index 9bde1f335e5..3b5afcea5ce 100644 --- a/Mage.Sets/src/mage/cards/f/FaeOffering.java +++ b/Mage.Sets/src/mage/cards/f/FaeOffering.java @@ -1,11 +1,10 @@ package mage.cards.f; 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.hint.Hint; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -31,13 +30,10 @@ public final class FaeOffering extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); // At the beginning of each end step, if you've cast both a creature spell and a noncreature spell this turn, create a Clue token, a Food token, and a Treasure token. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfEndStepTriggeredAbility( - TargetController.ANY, new CreateTokenEffect(new ClueArtifactToken()).withAdditionalTokens(new FoodToken(), new TreasureToken()), - false - ), FaeOfferingCondition.instance, "At the beginning of each end step, " + - "if you've cast both a creature spell and a noncreature spell this turn, " + - "create a Clue token, a Food token, and a Treasure token." + this.addAbility(new BeginningOfEndStepTriggeredAbility( + TargetController.ANY, new CreateTokenEffect(new ClueArtifactToken()) + .withAdditionalTokens(new FoodToken(), new TreasureToken()), + false, FaeOfferingCondition.instance ).addHint(FaeOfferingHint.instance)); } @@ -68,6 +64,11 @@ enum FaeOfferingCondition implements Condition { .distinct() .count() == 2; } + + @Override + public String toString() { + return "you've cast both a creature spell and a noncreature spell this turn"; + } } enum FaeOfferingHint implements Hint { diff --git a/Mage.Sets/src/mage/cards/f/FaerieMiscreant.java b/Mage.Sets/src/mage/cards/f/FaerieMiscreant.java index 420ad7e05e1..e94401382b3 100644 --- a/Mage.Sets/src/mage/cards/f/FaerieMiscreant.java +++ b/Mage.Sets/src/mage/cards/f/FaerieMiscreant.java @@ -4,17 +4,16 @@ import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.TargetController; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.NamePredicate; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.filter.predicate.mageobject.NamePredicate; import java.util.UUID; @@ -23,12 +22,12 @@ import java.util.UUID; */ public final class FaerieMiscreant extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + private static final FilterPermanent filter + = new FilterControlledCreaturePermanent("you control another creature named Faerie Miscreant"); static { filter.add(new NamePredicate("Faerie Miscreant")); filter.add(AnotherPredicate.instance); - filter.add(TargetController.YOU.getControllerPredicate()); } private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter); @@ -44,12 +43,9 @@ public final class FaerieMiscreant extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When Faerie Miscreant enters the battlefield, if you control another creature named Faerie Miscreant, draw a card. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility( - new DrawCardSourceControllerEffect(1), false - ), condition, "When {this} enters, " + - "if you control another creature named Faerie Miscreant, draw a card." - )); + this.addAbility(new EntersBattlefieldTriggeredAbility( + new DrawCardSourceControllerEffect(1), false + ).withInterveningIf(condition)); } private FaerieMiscreant(final FaerieMiscreant card) { diff --git a/Mage.Sets/src/mage/cards/f/FairgroundsTrumpeter.java b/Mage.Sets/src/mage/cards/f/FairgroundsTrumpeter.java index 7af99a34ab5..1d76e291772 100644 --- a/Mage.Sets/src/mage/cards/f/FairgroundsTrumpeter.java +++ b/Mage.Sets/src/mage/cards/f/FairgroundsTrumpeter.java @@ -1,15 +1,10 @@ - package mage.cards.f; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; 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.counter.AddCountersSourceEffect; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -22,6 +17,10 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.watchers.Watcher; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + /** * @author spjspj */ @@ -34,11 +33,10 @@ public final class FairgroundsTrumpeter extends CardImpl { this.toughness = new MageInt(2); // At the beginning of each end step, if a +1/+1 counter was put on a permanent under your control this turn, put a +1/+1 counter on Fairgrounds Trumpeter. - this.addAbility(new ConditionalInterveningIfTriggeredAbility(new BeginningOfEndStepTriggeredAbility( - TargetController.ANY, new AddCountersSourceEffect(CounterType.P1P1.createInstance()), - false), FairgroundsTrumpeterCondition.instance, - "At the beginning of each end step, if a +1/+1 counter was put on a permanent under your control this turn, put a +1/+1 counter on {this}."), - new FairgroundsTrumpeterWatcher()); + this.addAbility(new BeginningOfEndStepTriggeredAbility( + TargetController.ANY, new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + false, FairgroundsTrumpeterCondition.instance + ), new FairgroundsTrumpeterWatcher()); } private FairgroundsTrumpeter(final FairgroundsTrumpeter card) { @@ -52,7 +50,6 @@ public final class FairgroundsTrumpeter extends CardImpl { } enum FairgroundsTrumpeterCondition implements Condition { - instance; @Override @@ -63,7 +60,7 @@ enum FairgroundsTrumpeterCondition implements Condition { @Override public String toString() { - return "if a +1/+1 counter was put on a permanent under your control this turn"; + return "a +1/+1 counter was put on a permanent under your control this turn"; } } @@ -97,5 +94,4 @@ class FairgroundsTrumpeterWatcher extends Watcher { public boolean p1p1AddedToPermanent(UUID playerId) { return players.contains(playerId); } - } diff --git a/Mage.Sets/src/mage/cards/f/FamishedForagers.java b/Mage.Sets/src/mage/cards/f/FamishedForagers.java index 0caf83609e8..63a0547c5f1 100644 --- a/Mage.Sets/src/mage/cards/f/FamishedForagers.java +++ b/Mage.Sets/src/mage/cards/f/FamishedForagers.java @@ -8,7 +8,6 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.condition.common.OpponentsLostLifeCondition; import mage.abilities.costs.common.DiscardCardCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.hint.common.OpponentsLostLifeHint; @@ -32,11 +31,8 @@ public final class FamishedForagers extends CardImpl { this.toughness = new MageInt(3); // When Famished Foragers enters the battlefield, if an opponent lost life this turn, add {R}{R}{R}. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new BasicManaEffect(Mana.RedMana(3))), - OpponentsLostLifeCondition.instance, "When {this} enters, " + - "if an opponent lost life this turn, add {R}{R}{R}." - ).addHint(OpponentsLostLifeHint.instance)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new BasicManaEffect(Mana.RedMana(3))) + .withInterveningIf(OpponentsLostLifeCondition.instance).addHint(OpponentsLostLifeHint.instance)); // {2}{R}, Discard a card: Draw a card. Ability ability = new SimpleActivatedAbility( diff --git a/Mage.Sets/src/mage/cards/f/FanaticOfXenagos.java b/Mage.Sets/src/mage/cards/f/FanaticOfXenagos.java index c46bc90550b..8644f5854a2 100644 --- a/Mage.Sets/src/mage/cards/f/FanaticOfXenagos.java +++ b/Mage.Sets/src/mage/cards/f/FanaticOfXenagos.java @@ -1,11 +1,9 @@ - package mage.cards.f; import mage.MageInt; -import mage.abilities.TriggeredAbility; +import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.TributeNotPaidCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.HasteAbility; @@ -34,13 +32,18 @@ public final class FanaticOfXenagos extends CardImpl { // Trample this.addAbility(TrampleAbility.getInstance()); + // Tribute 1 this.addAbility(new TributeAbility(1)); + // When Fanatic of Xenagos enters the battlefield, if tribute wasn't paid, it gets +1/+1 and gains haste until end of turn. - TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn)); - ability.addEffect(new GainAbilitySourceEffect(HasteAbility.getInstance(), Duration.EndOfTurn)); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, TributeNotPaidCondition.instance, - "When {this} enters, if tribute wasn't paid, it gets +1/+1 and gains haste until end of turn.")); + Ability ability = new EntersBattlefieldTriggeredAbility( + new BoostSourceEffect(1, 1, Duration.EndOfTurn).setText("it gets +1/+1") + ).withInterveningIf(TributeNotPaidCondition.instance); + ability.addEffect(new GainAbilitySourceEffect( + HasteAbility.getInstance(), Duration.EndOfTurn + ).setText("and gains haste until end of turn")); + this.addAbility(ability); } private FanaticOfXenagos(final FanaticOfXenagos card) { diff --git a/Mage.Sets/src/mage/cards/f/FarsightMask.java b/Mage.Sets/src/mage/cards/f/FarsightMask.java index 16b3ee4835f..fe103a80d18 100644 --- a/Mage.Sets/src/mage/cards/f/FarsightMask.java +++ b/Mage.Sets/src/mage/cards/f/FarsightMask.java @@ -2,7 +2,6 @@ package mage.cards.f; import mage.abilities.common.SourceDealsDamageToYouTriggeredAbility; import mage.abilities.condition.common.SourceTappedCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -15,15 +14,13 @@ import java.util.UUID; */ public final class FarsightMask extends CardImpl { - private static final String rule = "Whenever a source an opponent controls deals damage to you, if {this} is untapped, you may draw a card."; - public FarsightMask(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{5}"); // Whenever a source an opponent controls deals damage to you, if Farsight Mask is untapped, you may draw a card. - this.addAbility(new ConditionalInterveningIfTriggeredAbility(new SourceDealsDamageToYouTriggeredAbility( + this.addAbility(new SourceDealsDamageToYouTriggeredAbility( new DrawCardSourceControllerEffect(1), true - ), SourceTappedCondition.UNTAPPED, rule)); + ).withInterveningIf(SourceTappedCondition.UNTAPPED)); } private FarsightMask(final FarsightMask card) { diff --git a/Mage.Sets/src/mage/cards/f/FathomFleetCaptain.java b/Mage.Sets/src/mage/cards/f/FathomFleetCaptain.java index b90388e91cf..43ce66c3a56 100644 --- a/Mage.Sets/src/mage/cards/f/FathomFleetCaptain.java +++ b/Mage.Sets/src/mage/cards/f/FathomFleetCaptain.java @@ -1,12 +1,11 @@ package mage.cards.f; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.keyword.MenaceAbility; @@ -15,24 +14,27 @@ 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 mage.filter.predicate.permanent.TokenPredicate; import mage.game.permanent.token.PirateToken; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class FathomFleetCaptain extends CardImpl { - private static final FilterPermanent filter = new FilterPermanent("another nontoken Pirate"); + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.PIRATE, "you control another nontoken Pirate"); static { - filter.add(SubType.PIRATE.getPredicate()); filter.add(AnotherPredicate.instance); filter.add(TokenPredicate.FALSE); } + private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter); + public FathomFleetCaptain(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); @@ -45,10 +47,9 @@ public final class FathomFleetCaptain extends CardImpl { this.addAbility(new MenaceAbility(false)); // Whenever Fathom Fleet Captain attacks, if you control another nontoken Pirate, you may pay {2}. If you do, creature a 2/2 black Pirate creature token with menace. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new AttacksTriggeredAbility(new DoIfCostPaid(new CreateTokenEffect(new PirateToken()), new GenericManaCost(2)), false), - new PermanentsOnTheBattlefieldCondition(filter), - "Whenever {this} attacks, if you control another nontoken Pirate, you may pay {2}. If you do, create a 2/2 black Pirate creature token with menace")); + this.addAbility(new AttacksTriggeredAbility( + new DoIfCostPaid(new CreateTokenEffect(new PirateToken()), new GenericManaCost(2)) + ).withInterveningIf(condition)); } private FathomFleetCaptain(final FathomFleetCaptain card) { diff --git a/Mage.Sets/src/mage/cards/f/FearOfMissingOut.java b/Mage.Sets/src/mage/cards/f/FearOfMissingOut.java index fc56747b5da..a7618ef6afb 100644 --- a/Mage.Sets/src/mage/cards/f/FearOfMissingOut.java +++ b/Mage.Sets/src/mage/cards/f/FearOfMissingOut.java @@ -5,7 +5,6 @@ import mage.abilities.Ability; import mage.abilities.common.AttacksFirstTimeTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.DeliriumCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.dynamicvalue.common.CardTypesInGraveyardCount; import mage.abilities.effects.common.AdditionalCombatPhaseEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -37,12 +36,7 @@ public final class FearOfMissingOut extends CardImpl { this.addAbility(ability); // Delirium -- Whenever Fear of Missing Out attacks for the first time each turn, if there are four or more card types among cards in your graveyard, untap target creature. After this phase, there is an additional combat phase. - ability = new ConditionalInterveningIfTriggeredAbility( - new AttacksFirstTimeTriggeredAbility(new UntapTargetEffect(), false), - DeliriumCondition.instance, "Delirium — Whenever {this} attacks for the first time each turn, " - + "if there are four or more card types among cards in your graveyard, untap target creature. " - + "After this phase, there is an additional combat phase." - ); + ability = new AttacksFirstTimeTriggeredAbility(new UntapTargetEffect(), false).withInterveningIf(DeliriumCondition.instance); ability.addTarget(new TargetCreaturePermanent()); ability.addEffect(new AdditionalCombatPhaseEffect()); ability.addHint(CardTypesInGraveyardCount.YOU.getHint()); diff --git a/Mage.Sets/src/mage/cards/f/FearOfTheDark.java b/Mage.Sets/src/mage/cards/f/FearOfTheDark.java index f316b1b50a2..f7af03b0178 100644 --- a/Mage.Sets/src/mage/cards/f/FearOfTheDark.java +++ b/Mage.Sets/src/mage/cards/f/FearOfTheDark.java @@ -5,7 +5,6 @@ import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.keyword.MenaceAbility; @@ -26,7 +25,7 @@ import java.util.UUID; */ public final class FearOfTheDark extends CardImpl { - private static final FilterPermanent filter = new FilterCreaturePermanent(SubType.GLIMMER, ""); + private static final FilterPermanent filter = new FilterCreaturePermanent(SubType.GLIMMER, "defending player controls no Glimmer creatures"); static { filter.add(DefendingPlayerControlsSourceAttackingPredicate.instance); @@ -44,12 +43,12 @@ public final class FearOfTheDark extends CardImpl { this.toughness = new MageInt(5); // Whenever Fear of the Dark attacks, if defending player controls no Glimmer creatures, it gains menace and deathtouch until end of turn. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new AttacksTriggeredAbility(new GainAbilitySourceEffect(new MenaceAbility(), Duration.EndOfTurn)), - condition, "Whenever {this} attacks, if defending player controls no Glimmer " + - "creatures, it gains menace and deathtouch until end of turn." - ); - ability.addEffect(new GainAbilitySourceEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn)); + Ability ability = new AttacksTriggeredAbility(new GainAbilitySourceEffect( + new MenaceAbility(), Duration.EndOfTurn + ).setText("it gains menace")).withInterveningIf(condition); + ability.addEffect(new GainAbilitySourceEffect( + DeathtouchAbility.getInstance(), Duration.EndOfTurn + ).setText("and deathtouch until end of turn")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/f/FeastOnTheFallen.java b/Mage.Sets/src/mage/cards/f/FeastOnTheFallen.java index 01cd22fba5c..8a1c24b7920 100644 --- a/Mage.Sets/src/mage/cards/f/FeastOnTheFallen.java +++ b/Mage.Sets/src/mage/cards/f/FeastOnTheFallen.java @@ -1,12 +1,9 @@ - package mage.cards.f; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -16,23 +13,20 @@ import mage.game.Game; import mage.target.common.TargetControlledCreaturePermanent; import mage.watchers.common.PlayerLostLifeWatcher; +import java.util.UUID; + /** - * * @author emerald000 */ public final class FeastOnTheFallen extends CardImpl { public FeastOnTheFallen(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{B}"); - + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); // At the beginning of each upkeep, if an opponent lost life last turn, put a +1/+1 counter on target creature you control. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new BeginningOfUpkeepTriggeredAbility( - TargetController.ANY, new AddCountersTargetEffect(CounterType.P1P1.createInstance()), - false), - FeastOnTheFallenCondition.instance, - "At the beginning of each upkeep, if an opponent lost life last turn, put a +1/+1 counter on target creature you control."); + Ability ability = new BeginningOfUpkeepTriggeredAbility( + TargetController.ANY, new AddCountersTargetEffect(CounterType.P1P1.createInstance()), false + ).withInterveningIf(FeastOnTheFallenCondition.instance); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); } @@ -54,13 +48,16 @@ enum FeastOnTheFallenCondition implements Condition { @Override public boolean apply(Game game, Ability source) { PlayerLostLifeWatcher watcher = game.getState().getWatcher(PlayerLostLifeWatcher.class); - if (watcher != null) { - for (UUID opponentId : game.getOpponents(source.getControllerId())) { - if (watcher.getLifeLostLastTurn(opponentId) > 0) { - return true; - } - } - } - return false; + return watcher != null + && game + .getOpponents(source.getControllerId()) + .stream() + .mapToInt(watcher::getLifeLostLastTurn) + .anyMatch(x -> x > 0); + } + + @Override + public String toString() { + return "an opponent lost life last turn"; } } diff --git a/Mage.Sets/src/mage/cards/f/FeastingTrollKing.java b/Mage.Sets/src/mage/cards/f/FeastingTrollKing.java index 8000de84d1c..29aa0be0ed2 100644 --- a/Mage.Sets/src/mage/cards/f/FeastingTrollKing.java +++ b/Mage.Sets/src/mage/cards/f/FeastingTrollKing.java @@ -6,7 +6,6 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.CastFromHandSourcePermanentCondition; import mage.abilities.condition.common.MyTurnCondition; import mage.abilities.costs.common.SacrificeTargetCost; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; import mage.abilities.hint.common.MyTurnHint; @@ -19,7 +18,6 @@ import mage.constants.SubType; import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; import mage.game.permanent.token.FoodToken; -import mage.target.common.TargetControlledPermanent; import mage.watchers.common.CastFromHandWatcher; import java.util.UUID; @@ -46,11 +44,8 @@ public final class FeastingTrollKing extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // When Feasting Troll King enters the battlefield, if you cast it from your hand, create three Food tokens. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new FoodToken(), 3)), - CastFromHandSourcePermanentCondition.instance, "When {this} enters, " + - "if you cast it from your hand, create three Food tokens." - ), new CastFromHandWatcher()); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new FoodToken(), 3)) + .withInterveningIf(CastFromHandSourcePermanentCondition.instance), new CastFromHandWatcher()); // Sacrifice three Foods: Return Feasting Troll King from your graveyard to the battlefield. Activate this ability only during your turn. this.addAbility(new ActivateIfConditionActivatedAbility( diff --git a/Mage.Sets/src/mage/cards/f/FieldOfTheDead.java b/Mage.Sets/src/mage/cards/f/FieldOfTheDead.java index 92c7fdadf5c..448e161a1ad 100644 --- a/Mage.Sets/src/mage/cards/f/FieldOfTheDead.java +++ b/Mage.Sets/src/mage/cards/f/FieldOfTheDead.java @@ -4,7 +4,6 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldThisOrAnotherTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; @@ -32,13 +31,9 @@ public final class FieldOfTheDead extends CardImpl { this.addAbility(new ColorlessManaAbility()); // Whenever Field of the Dead or another land you control enters, if you control seven or more lands with different names, create a 2/2 black Zombie creature token. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldThisOrAnotherTriggeredAbility( - new CreateTokenEffect(new ZombieToken()), StaticFilters.FILTER_LAND, false, true - ), FieldOfTheDeadCondition.instance, "Whenever {this} or another land " + - "you control enters, if you control seven or more lands with different names, " + - "create a 2/2 black Zombie creature token." - )); + this.addAbility(new EntersBattlefieldThisOrAnotherTriggeredAbility( + new CreateTokenEffect(new ZombieToken()), StaticFilters.FILTER_LAND, false, true + ).withInterveningIf(FieldOfTheDeadCondition.instance)); } private FieldOfTheDead(final FieldOfTheDead card) { @@ -69,4 +64,9 @@ enum FieldOfTheDeadCondition implements Condition { .distinct() .count() > 6; } + + @Override + public String toString() { + return "you control seven or more lands with different names"; + } } diff --git a/Mage.Sets/src/mage/cards/f/FinestHour.java b/Mage.Sets/src/mage/cards/f/FinestHour.java index b594c923a25..6b000b1adad 100644 --- a/Mage.Sets/src/mage/cards/f/FinestHour.java +++ b/Mage.Sets/src/mage/cards/f/FinestHour.java @@ -1,19 +1,18 @@ package mage.cards.f; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.AttacksAloneControlledTriggeredAbility; import mage.abilities.condition.common.FirstCombatPhaseCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.effects.common.AdditionalCombatPhaseEffect; +import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.keyword.ExaltedAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import java.util.UUID; + /** - * * @author awjackson */ public final class FinestHour extends CardImpl { @@ -26,12 +25,9 @@ public final class FinestHour extends CardImpl { // Whenever a creature you control attacks alone, if it's the first combat phase of the turn, untap that // creature. After this phase, there is an additional combat phase. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new AttacksAloneControlledTriggeredAbility(new UntapTargetEffect("untap that creature"), true, false), - FirstCombatPhaseCondition.instance, - "Whenever a creature you control attacks alone, if it's the first combat phase of the turn, " + - "untap that creature. After this phase, there is an additional combat phase." - ); + Ability ability = new AttacksAloneControlledTriggeredAbility( + new UntapTargetEffect("untap that creature"), true, false + ).withInterveningIf(FirstCombatPhaseCondition.instance); ability.addEffect(new AdditionalCombatPhaseEffect()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/f/FiremaneAngel.java b/Mage.Sets/src/mage/cards/f/FiremaneAngel.java index 4a290c38a90..45fb83b87d0 100644 --- a/Mage.Sets/src/mage/cards/f/FiremaneAngel.java +++ b/Mage.Sets/src/mage/cards/f/FiremaneAngel.java @@ -1,36 +1,30 @@ - package mage.cards.f; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.IsStepCondition; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalActivatedAbility; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; import mage.abilities.keyword.FirstStrikeAbility; import mage.abilities.keyword.FlyingAbility; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.PhaseStep; -import mage.constants.TargetController; -import mage.constants.Zone; +import mage.constants.*; import mage.game.Game; +import java.util.UUID; + /** - * * @author Loki */ public final class FiremaneAngel extends CardImpl { public FiremaneAngel(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{W}{W}"); this.subtype.add(SubType.ANGEL); this.power = new MageInt(4); @@ -38,17 +32,20 @@ public final class FiremaneAngel extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); + // Firststrike this.addAbility(FirstStrikeAbility.getInstance()); + // At the beginning of your upkeep, if Firemane Angel is in your graveyard or on the battlefield, you may gain 1 life. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new BeginningOfUpkeepTriggeredAbility(Zone.ALL, TargetController.YOU, new GainLifeEffect(1), true), - SourceOnBattlefieldOrGraveyardCondition.instance, - "At the beginning of your upkeep, if {this} is in your graveyard or on the battlefield, you may gain 1 life."); - this.addAbility(ability); + this.addAbility(new BeginningOfUpkeepTriggeredAbility( + Zone.ALL, TargetController.YOU, new GainLifeEffect(1), true + ).withInterveningIf(FiremaneAngelCondition.instance)); + // {6}{R}{R}{W}{W}: Return Firemane Angel from your graveyard to the battlefield. Activate this ability only during your upkeep. - this.addAbility(new ConditionalActivatedAbility(Zone.GRAVEYARD, - new ReturnSourceFromGraveyardToBattlefieldEffect(false, false), new ManaCostsImpl<>("{6}{R}{R}{W}{W}"), new IsStepCondition(PhaseStep.UPKEEP), null)); + this.addAbility(new ConditionalActivatedAbility( + Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(false, false), + new ManaCostsImpl<>("{6}{R}{R}{W}{W}"), new IsStepCondition(PhaseStep.UPKEEP), null + )); } private FiremaneAngel(final FiremaneAngel card) { @@ -61,8 +58,7 @@ public final class FiremaneAngel extends CardImpl { } } -enum SourceOnBattlefieldOrGraveyardCondition implements Condition { - +enum FiremaneAngelCondition implements Condition { instance; @Override @@ -73,7 +69,6 @@ enum SourceOnBattlefieldOrGraveyardCondition implements Condition { @Override public String toString() { - return "if {this} is in your graveyard or on the battlefield"; + return "{this} is in your graveyard or on the battlefield"; } - } diff --git a/Mage.Sets/src/mage/cards/f/FirstResponse.java b/Mage.Sets/src/mage/cards/f/FirstResponse.java index 593558d1870..90dc5d591dd 100644 --- a/Mage.Sets/src/mage/cards/f/FirstResponse.java +++ b/Mage.Sets/src/mage/cards/f/FirstResponse.java @@ -1,19 +1,17 @@ - package mage.cards.f; -import java.util.UUID; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.condition.common.LiveLostLastTurnCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.TargetController; import mage.game.permanent.token.SoldierToken; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class FirstResponse extends CardImpl { @@ -22,10 +20,9 @@ public final class FirstResponse extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); // At the beginning of each upkeep, if you lost life last turn, create a 1/1 white Soldier creature token. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfUpkeepTriggeredAbility(TargetController.ANY, new CreateTokenEffect(new SoldierToken()), false), - LiveLostLastTurnCondition.instance, - "At the beginning of each upkeep, if you lost life last turn, create a 1/1 white Soldier creature token.")); + this.addAbility(new BeginningOfUpkeepTriggeredAbility( + TargetController.ANY, new CreateTokenEffect(new SoldierToken()), false + ).withInterveningIf(LiveLostLastTurnCondition.instance)); } private FirstResponse(final FirstResponse card) { diff --git a/Mage.Sets/src/mage/cards/f/FlameWreathedPhoenix.java b/Mage.Sets/src/mage/cards/f/FlameWreathedPhoenix.java index 7dc266963c0..869683d3ddc 100644 --- a/Mage.Sets/src/mage/cards/f/FlameWreathedPhoenix.java +++ b/Mage.Sets/src/mage/cards/f/FlameWreathedPhoenix.java @@ -1,14 +1,10 @@ - package mage.cards.f; -import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbility; +import mage.abilities.Ability; import mage.abilities.common.DiesSourceTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.TributeNotPaidCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.ReturnToHandSourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FlyingAbility; @@ -17,17 +13,18 @@ import mage.abilities.keyword.TributeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; + +import java.util.UUID; /** - * * @author LevelX2 */ public final class FlameWreathedPhoenix extends CardImpl { public FlameWreathedPhoenix(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); this.subtype.add(SubType.PHOENIX); this.power = new MageInt(3); @@ -35,15 +32,18 @@ public final class FlameWreathedPhoenix extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); + // Tribute 2 (As this creature enters the battlefield, an opponent of your choice may put 2 +1/+1 counter on it.) this.addAbility(new TributeAbility(2)); - // When Flame-Wreathed Phoenix enters the battlefield, if tribute wasn't paid, it gains haste and "When this creature dies, return it to its owner's hand." - TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new GainAbilitySourceEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield)); - Effect effect = new GainAbilitySourceEffect(new DiesSourceTriggeredAbility(new ReturnToHandSourceEffect())); - ability.addEffect(effect); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, TributeNotPaidCondition.instance, - "When {this} enters, if tribute wasn't paid, it gains haste and \"When this creature dies, return it to its owner's hand.\"")); + // When Flame-Wreathed Phoenix enters the battlefield, if tribute wasn't paid, it gains haste and "When this creature dies, return it to its owner's hand." + Ability ability = new EntersBattlefieldTriggeredAbility( + new GainAbilitySourceEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield).setText("it gains haste") + ).withInterveningIf(TributeNotPaidCondition.instance); + ability.addEffect(new GainAbilitySourceEffect( + new DiesSourceTriggeredAbility(new ReturnToHandSourceEffect()) + ).setText("and \"When this creature dies, return it to its owner's hand.\"")); + this.addAbility(ability); } private FlameWreathedPhoenix(final FlameWreathedPhoenix card) { diff --git a/Mage.Sets/src/mage/cards/f/FlamecacheGecko.java b/Mage.Sets/src/mage/cards/f/FlamecacheGecko.java index e1557767dfb..8b46cdf87ef 100644 --- a/Mage.Sets/src/mage/cards/f/FlamecacheGecko.java +++ b/Mage.Sets/src/mage/cards/f/FlamecacheGecko.java @@ -8,7 +8,6 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.condition.common.OpponentsLostLifeCondition; import mage.abilities.costs.common.DiscardCardCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; @@ -32,14 +31,9 @@ public final class FlamecacheGecko extends CardImpl { this.toughness = new MageInt(2); // When Flamecache Gecko enters, if an opponent lost life this turn, add {B}{R}. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility( - new BasicManaEffect(new Mana( - 0, 0, 1, 1, 0, 0, 0, 0 - )) - ), OpponentsLostLifeCondition.instance, "When {this} enters, " + - "if an opponent lost life this turn, add {B}{R}." - )); + this.addAbility(new EntersBattlefieldTriggeredAbility( + new BasicManaEffect(new Mana(0, 0, 1, 1, 0, 0, 0, 0)) + ).withInterveningIf(OpponentsLostLifeCondition.instance)); // {1}{R}, Discard a card: Draw a card. Ability ability = new SimpleActivatedAbility( diff --git a/Mage.Sets/src/mage/cards/f/FoundryHornet.java b/Mage.Sets/src/mage/cards/f/FoundryHornet.java index df6e2b9cccf..b4d791fe5ce 100644 --- a/Mage.Sets/src/mage/cards/f/FoundryHornet.java +++ b/Mage.Sets/src/mage/cards/f/FoundryHornet.java @@ -1,28 +1,36 @@ package mage.cards.f; -import java.util.UUID; 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.continuous.BoostAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledCreaturePermanent; + +import java.util.UUID; /** - * * @author LevelX2 */ public final class FoundryHornet extends CardImpl { - private static final String rule = "When {this} enters, if you control a creature with a +1/+1 counter on it, creatures your opponents control get -1/-1 until end of turn."; + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("you control a creature with a +1/+1 counter on it"); + + static { + filter.add(CounterType.P1P1.getPredicate()); + } + + private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter); public FoundryHornet(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); @@ -35,8 +43,10 @@ public final class FoundryHornet extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When Foundry Hornet enters the battlefield, if you control a creature with a +1/+1 counter on it, creatures your opponents control get -1/-1 until end of turn. - TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new BoostAllEffect(-1, -1, Duration.EndOfTurn, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, false), false); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_A_CREATURE_P1P1), rule)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new BoostAllEffect( + -1, -1, Duration.EndOfTurn, + StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, false + ), false).withInterveningIf(condition)); } private FoundryHornet(final FoundryHornet card) { diff --git a/Mage.Sets/src/mage/cards/f/FrodoAdventurousHobbit.java b/Mage.Sets/src/mage/cards/f/FrodoAdventurousHobbit.java index 09d3789d3a9..13541c46e6e 100644 --- a/Mage.Sets/src/mage/cards/f/FrodoAdventurousHobbit.java +++ b/Mage.Sets/src/mage/cards/f/FrodoAdventurousHobbit.java @@ -6,7 +6,6 @@ import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.SourceIsRingBearerCondition; import mage.abilities.condition.common.YouGainedLifeCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.common.ControllerGainedLifeCount; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -48,15 +47,10 @@ public final class FrodoAdventurousHobbit extends CardImpl { this.addAbility(VigilanceAbility.getInstance()); // Whenever Frodo, Adventurous Hobbit attacks, if you gained 3 or more life this turn, the Ring tempts you. Then if Frodo is your Ring-bearer and the Ring has tempted you two or more times this game, draw a card. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new AttacksTriggeredAbility(new TheRingTemptsYouEffect()), - condition, "Whenever {this} attacks, if you gained 3 or more life this turn, " + - "the Ring tempts you. Then if {this} is your Ring-bearer and the Ring " + - "has tempted you two or more times this game, draw a card." - ); + Ability ability = new AttacksTriggeredAbility(new TheRingTemptsYouEffect()).withInterveningIf(condition); ability.addEffect(new ConditionalOneShotEffect( - new DrawCardSourceControllerEffect(1), - FrodoAdventurousHobbitCondition.instance + new DrawCardSourceControllerEffect(1), FrodoAdventurousHobbitCondition.instance, + "Then if {this} is your Ring-bearer and the Ring has tempted you two or more times this game, draw a card." )); this.addAbility(ability.addHint(ControllerGainedLifeCount.getHint()), new PlayerGainedLifeWatcher()); } diff --git a/Mage.Sets/src/mage/cards/f/FunnelWebRecluse.java b/Mage.Sets/src/mage/cards/f/FunnelWebRecluse.java index 30d29cc8ed1..0a5080f6a9a 100644 --- a/Mage.Sets/src/mage/cards/f/FunnelWebRecluse.java +++ b/Mage.Sets/src/mage/cards/f/FunnelWebRecluse.java @@ -3,7 +3,6 @@ package mage.cards.f; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.MorbidCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.keyword.InvestigateEffect; import mage.abilities.hint.common.MorbidHint; import mage.abilities.keyword.ReachAbility; @@ -30,12 +29,8 @@ public final class FunnelWebRecluse extends CardImpl { this.addAbility(ReachAbility.getInstance()); // Morbid — When Funnel-Web Recluse enters the battlefield, if a creature died this turn, investigate. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new InvestigateEffect()), - MorbidCondition.instance, "Morbid — When {this} enters, " + - "if a creature died this turn, investigate. (Create a colorless Clue artifact token " + - "with \"{2}, Sacrifice this artifact: Draw a card.\")" - ).addHint(MorbidHint.instance)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new InvestigateEffect()) + .withInterveningIf(MorbidCondition.instance).addHint(MorbidHint.instance)); } private FunnelWebRecluse(final FunnelWebRecluse card) { diff --git a/Mage.Sets/src/mage/cards/f/FuriousRise.java b/Mage.Sets/src/mage/cards/f/FuriousRise.java index 74e1cb4d663..76265389d70 100644 --- a/Mage.Sets/src/mage/cards/f/FuriousRise.java +++ b/Mage.Sets/src/mage/cards/f/FuriousRise.java @@ -2,17 +2,20 @@ package mage.cards.f; import mage.MageObject; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; import mage.abilities.condition.common.FerociousCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.AsThoughEffect; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.hint.common.FerociousHint; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.AsThoughEffectType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; import mage.target.targetpointer.FixedTarget; @@ -31,9 +34,8 @@ public final class FuriousRise extends CardImpl { // At the beginning of your end step, if you control a creature with power 4 or greater, exile the top card of your library. // You may play that card until you exile another card with Furious Rise. - this.addAbility(new ConditionalInterveningIfTriggeredAbility(new BeginningOfEndStepTriggeredAbility( - new FuriousRiseEffect()), FerociousCondition.instance, - "At the beginning of your end step, if you control a creature with power 4 or greater, exile the top card of your library. You may play that card until you exile another card with {this}.")); + this.addAbility(new BeginningOfEndStepTriggeredAbility(new FuriousRiseEffect()) + .withInterveningIf(FerociousCondition.instance).addHint(FerociousHint.instance)); } private FuriousRise(final FuriousRise card) { @@ -50,7 +52,7 @@ class FuriousRiseEffect extends OneShotEffect { FuriousRiseEffect() { super(Outcome.Benefit); - this.staticText = "exile the top card of your library. You may play that card until you exile another card with Furious Rise"; + this.staticText = "exile the top card of your library. You may play that card until you exile another card with {this}"; } private FuriousRiseEffect(final FuriousRiseEffect effect) { diff --git a/Mage.Sets/src/mage/cards/f/FurnaceDragon.java b/Mage.Sets/src/mage/cards/f/FurnaceDragon.java index 7a95df32bb3..126f065c409 100644 --- a/Mage.Sets/src/mage/cards/f/FurnaceDragon.java +++ b/Mage.Sets/src/mage/cards/f/FurnaceDragon.java @@ -1,11 +1,8 @@ - package mage.cards.f; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.CastFromHandSourcePermanentCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.ExileAllEffect; import mage.abilities.keyword.AffinityForArtifactsAbility; import mage.abilities.keyword.FlyingAbility; @@ -13,23 +10,18 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; import mage.watchers.common.CastFromHandWatcher; +import java.util.UUID; + /** - * * @author fireshoes */ public final class FurnaceDragon extends CardImpl { - private static final FilterPermanent filter = new FilterPermanent("artifacts"); - - static { - filter.add(CardType.ARTIFACT.getPredicate()); - } - public FurnaceDragon(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{6}{R}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{6}{R}{R}{R}"); this.subtype.add(SubType.DRAGON); this.power = new MageInt(5); this.toughness = new MageInt(5); @@ -41,11 +33,9 @@ public final class FurnaceDragon extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When Furnace Dragon enters the battlefield, if you cast it from your hand, exile all artifacts. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new ExileAllEffect(filter), false), - CastFromHandSourcePermanentCondition.instance, - "When {this} enters, if you cast it from your hand, exile all artifacts."), - new CastFromHandWatcher()); + this.addAbility(new EntersBattlefieldTriggeredAbility( + new ExileAllEffect(StaticFilters.FILTER_PERMANENT_ARTIFACTS) + ).withInterveningIf(CastFromHandSourcePermanentCondition.instance), new CastFromHandWatcher()); } private FurnaceDragon(final FurnaceDragon card) { diff --git a/Mage.Sets/src/mage/cards/f/FyndhornDruid.java b/Mage.Sets/src/mage/cards/f/FyndhornDruid.java index c02c7dbc05e..89d02d9a0f4 100644 --- a/Mage.Sets/src/mage/cards/f/FyndhornDruid.java +++ b/Mage.Sets/src/mage/cards/f/FyndhornDruid.java @@ -1,13 +1,11 @@ package mage.cards.f; -import java.util.UUID; import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.common.DiesSourceTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -17,22 +15,23 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.watchers.common.WasBlockedThisTurnWatcher; +import java.util.UUID; + /** - * * @author L_J */ public final class FyndhornDruid extends CardImpl { public FyndhornDruid(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); this.subtype.add(SubType.ELF); this.subtype.add(SubType.DRUID); this.power = new MageInt(2); this.toughness = new MageInt(2); // When Fyndhorn Druid dies, if it was blocked this turn, you gain 4 life. - this.addAbility(new ConditionalInterveningIfTriggeredAbility(new DiesSourceTriggeredAbility(new GainLifeEffect(4)), new SourceWasBlockedThisTurnCondition(), - "When {this} dies, if it was blocked this turn, you gain 4 life."), new WasBlockedThisTurnWatcher()); + this.addAbility(new DiesSourceTriggeredAbility(new GainLifeEffect(4)) + .withInterveningIf(FyndhornDruidCondition.instance), new WasBlockedThisTurnWatcher()); } private FyndhornDruid(final FyndhornDruid card) { @@ -45,7 +44,8 @@ public final class FyndhornDruid extends CardImpl { } } -class SourceWasBlockedThisTurnCondition implements Condition { +enum FyndhornDruidCondition implements Condition { + instance; @Override public boolean apply(Game game, Ability source) { @@ -53,4 +53,9 @@ class SourceWasBlockedThisTurnCondition implements Condition { WasBlockedThisTurnWatcher watcher = game.getState().getWatcher(WasBlockedThisTurnWatcher.class); return sourcePermanent != null && watcher != null && watcher.getWasBlockedThisTurnCreatures().contains(new MageObjectReference(sourcePermanent, game)); } + + @Override + public String toString() { + return "it was blocked this turn"; + } } diff --git a/Mage.Sets/src/mage/cards/g/GaeasCourser.java b/Mage.Sets/src/mage/cards/g/GaeasCourser.java index 977999527ad..485f935d89f 100644 --- a/Mage.Sets/src/mage/cards/g/GaeasCourser.java +++ b/Mage.Sets/src/mage/cards/g/GaeasCourser.java @@ -1,20 +1,19 @@ package mage.cards.g; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.CardsInControllerGraveyardCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.filter.StaticFilters; +import java.util.UUID; + /** - * * @author weirddan455 */ public final class GaeasCourser extends CardImpl { @@ -31,11 +30,7 @@ public final class GaeasCourser extends CardImpl { this.toughness = new MageInt(5); // Whenever Gaea's Courser attacks, if there are three or more creature cards in your graveyard, draw a card. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new AttacksTriggeredAbility(new DrawCardSourceControllerEffect(1)), - condition, - "Whenever {this} attacks, if there are three or more creature cards in your graveyard, draw a card." - )); + this.addAbility(new AttacksTriggeredAbility(new DrawCardSourceControllerEffect(1)).withInterveningIf(condition)); } private GaeasCourser(final GaeasCourser card) { diff --git a/Mage.Sets/src/mage/cards/g/GaladrielElvenQueen.java b/Mage.Sets/src/mage/cards/g/GaladrielElvenQueen.java index 27298b87bae..eda2d229fa6 100644 --- a/Mage.Sets/src/mage/cards/g/GaladrielElvenQueen.java +++ b/Mage.Sets/src/mage/cards/g/GaladrielElvenQueen.java @@ -3,10 +3,9 @@ package mage.cards.g; import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.TwoChoiceVote; @@ -35,18 +34,9 @@ public final class GaladrielElvenQueen extends CardImpl { this.toughness = new MageInt(5); // Will of the council -- At the beginning of combat on your turn, if another Elf entered the battlefield under your control this turn, starting with you, each player votes for dominion or guidance. If dominion gets more votes, the Ring tempts you, then you put a +1/+1 counter on your Ring-bearer. If guidance gets more votes or the vote is tied, draw a card. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfCombatTriggeredAbility( - Zone.BATTLEFIELD, - TargetController.YOU, new GaladrielElvenQueenEffect(), - false - ), - GaladrielElvenQueenCondition.instance, - "At the beginning of combat on your turn, if another Elf entered the battlefield under " - + "your control this turn, starting with you, each player votes for dominion or guidance. " - + "If dominion gets more votes, the Ring tempts you, then you put a +1/+1 counter on your " - + "Ring-bearer. If guidance gets more votes or the vote is tied, draw a card." - ).setAbilityWord(AbilityWord.WILL_OF_THE_COUNCIL), new GaladrielElvenQueenWatcher()); + this.addAbility(new BeginningOfCombatTriggeredAbility( + Zone.BATTLEFIELD, TargetController.YOU, new GaladrielElvenQueenEffect(), false + ).withInterveningIf(GaladrielElvenQueenCondition.instance).setAbilityWord(AbilityWord.WILL_OF_THE_COUNCIL), new GaladrielElvenQueenWatcher()); } private GaladrielElvenQueen(final GaladrielElvenQueen card) { @@ -73,6 +63,11 @@ enum GaladrielElvenQueenCondition implements Condition { source.getControllerId() ); } + + @Override + public String toString() { + return "another Elf entered the battlefield under your control this turn"; + } } class GaladrielElvenQueenWatcher extends Watcher { diff --git a/Mage.Sets/src/mage/cards/g/GatewatchBeacon.java b/Mage.Sets/src/mage/cards/g/GatewatchBeacon.java index d3d4f66a06c..a9b7e1b14f3 100644 --- a/Mage.Sets/src/mage/cards/g/GatewatchBeacon.java +++ b/Mage.Sets/src/mage/cards/g/GatewatchBeacon.java @@ -4,8 +4,6 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.effects.Effects; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.WhiteManaAbility; @@ -40,15 +38,10 @@ public final class GatewatchBeacon extends CardImpl { // Whenever a planeswalker you control enters, if Gatewatch Beacon has loyalty // counters on it, you may move a loyalty counter from Gatewatch Beacon onto that planeswalker. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldControlledTriggeredAbility( - Zone.BATTLEFIELD, - new GatewatchBeaconMoveCounterEffect(), - StaticFilters.FILTER_PERMANENT_PLANESWALKER, - true - ), GatewatchBeaconCondition.instance, "Whenever a planeswalker you control enters, if {this} has " + - "loyalty counters on it, you may move a loyalty counter from {this} onto that planeswalker" - )); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility( + Zone.BATTLEFIELD, new GatewatchBeaconMoveCounterEffect(), + StaticFilters.FILTER_PERMANENT_PLANESWALKER, true + ).withInterveningIf(GatewatchBeaconCondition.instance)); } private GatewatchBeacon(final GatewatchBeacon card) { @@ -67,15 +60,12 @@ enum GatewatchBeaconCondition 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; - } + return permanent != null && permanent.getCounters(game).getCount(CounterType.LOYALTY) > 0; + } - return permanent.getCounters(game).getCount(CounterType.LOYALTY) > 0; + @Override + public String toString() { + return "{this} has loyalty counters on it"; } } diff --git a/Mage.Sets/src/mage/cards/g/GenesisChamber.java b/Mage.Sets/src/mage/cards/g/GenesisChamber.java index 8a008b95dd0..1f9524e8727 100644 --- a/Mage.Sets/src/mage/cards/g/GenesisChamber.java +++ b/Mage.Sets/src/mage/cards/g/GenesisChamber.java @@ -1,10 +1,8 @@ package mage.cards.g; import mage.abilities.Ability; -import mage.abilities.TriggeredAbility; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.condition.common.SourceTappedCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -28,12 +26,11 @@ public final class GenesisChamber extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); // Whenever a nontoken creature enters the battlefield, if Genesis Chamber is untapped, that creature's controller creates a 1/1 colorless Myr artifact creature token. - TriggeredAbility ability = new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new GenesisChamberEffect(), StaticFilters.FILTER_CREATURE_NON_TOKEN, false, SetTargetPointer.PERMANENT); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, - SourceTappedCondition.UNTAPPED, - "Whenever a nontoken creature enters, " - + "if {this} is untapped, " - + "that creature's controller creates a 1/1 colorless Myr artifact creature token")); + this.addAbility(new EntersBattlefieldAllTriggeredAbility( + Zone.BATTLEFIELD, new GenesisChamberEffect(), + StaticFilters.FILTER_CREATURE_NON_TOKEN, + false, SetTargetPointer.PERMANENT + ).withInterveningIf(SourceTappedCondition.UNTAPPED)); } private GenesisChamber(final GenesisChamber card) { diff --git a/Mage.Sets/src/mage/cards/g/GeologicalAppraiser.java b/Mage.Sets/src/mage/cards/g/GeologicalAppraiser.java index 14d9e76c83b..d330e3772a9 100644 --- a/Mage.Sets/src/mage/cards/g/GeologicalAppraiser.java +++ b/Mage.Sets/src/mage/cards/g/GeologicalAppraiser.java @@ -3,7 +3,6 @@ package mage.cards.g; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.CastFromEverywhereSourceCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.keyword.DiscoverEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -26,11 +25,7 @@ public final class GeologicalAppraiser extends CardImpl { this.toughness = new MageInt(2); // When Geological Appraiser enters the battlefield, if you cast it, discover 3. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new DiscoverEffect(3)), - CastFromEverywhereSourceCondition.instance, - "When {this} enters, if you cast it, discover 3." - )); + this.addAbility(new EntersBattlefieldTriggeredAbility(new DiscoverEffect(3)).withInterveningIf(CastFromEverywhereSourceCondition.instance)); } private GeologicalAppraiser(final GeologicalAppraiser card) { diff --git a/Mage.Sets/src/mage/cards/g/GhirapurOrrery.java b/Mage.Sets/src/mage/cards/g/GhirapurOrrery.java index 6236d92407c..5b58c128ad2 100644 --- a/Mage.Sets/src/mage/cards/g/GhirapurOrrery.java +++ b/Mage.Sets/src/mage/cards/g/GhirapurOrrery.java @@ -1,40 +1,36 @@ - package mage.cards.g; -import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.IntCompareCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.CardsInHandCondition; import mage.abilities.effects.common.DrawCardTargetEffect; import mage.abilities.effects.common.continuous.PlayAdditionalLandsAllEffect; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.TargetController; -import mage.constants.Zone; -import mage.game.Game; -import mage.players.Player; + +import java.util.UUID; /** - * * @author emerald000 */ public final class GhirapurOrrery extends CardImpl { + private static final Condition condition = new CardsInHandCondition(ComparisonType.EQUAL_TO, 0, TargetController.ACTIVE); + public GhirapurOrrery(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); // Each player may play an additional land on each of their turns. this.addAbility(new SimpleStaticAbility(new PlayAdditionalLandsAllEffect())); // At the beginning of each player's upkeep, if that player has no cards in hand, that player draws three cards. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfUpkeepTriggeredAbility(TargetController.ANY, new DrawCardTargetEffect(3), false), - new GhirapurOrreryCondition(), - "At the beginning of each player's upkeep, if that player has no cards in hand, that player draws three cards.")); + this.addAbility(new BeginningOfUpkeepTriggeredAbility( + TargetController.ANY, new DrawCardTargetEffect(3), false).withInterveningIf(condition) + ); } private GhirapurOrrery(final GhirapurOrrery card) { @@ -46,19 +42,3 @@ public final class GhirapurOrrery extends CardImpl { return new GhirapurOrrery(this); } } - -class GhirapurOrreryCondition extends IntCompareCondition { - - GhirapurOrreryCondition() { - super(ComparisonType.EQUAL_TO, 0); - } - - @Override - protected int getInputValue(Game game, Ability source) { - Player activePlayer = game.getPlayer(game.getActivePlayerId()); - if (activePlayer != null) { - return activePlayer.getHand().size(); - } - return 0; - } -} diff --git a/Mage.Sets/src/mage/cards/g/GhituAmplifier.java b/Mage.Sets/src/mage/cards/g/GhituAmplifier.java index 19273d99cb8..5a65b5b9370 100644 --- a/Mage.Sets/src/mage/cards/g/GhituAmplifier.java +++ b/Mage.Sets/src/mage/cards/g/GhituAmplifier.java @@ -5,7 +5,6 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.condition.common.KickedCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.KickerAbility; @@ -36,11 +35,7 @@ public final class GhituAmplifier extends CardImpl { this.addAbility(new KickerAbility("{2}{U}")); // When Ghitu Amplifier enters the battlefield, if it was kicked, return target creature an opponent controls to its owner's hand. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect()), - KickedCondition.ONCE, "When {this} enters, " + - "if it was kicked, return target creature an opponent controls to its owner's hand." - ); + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect()).withInterveningIf(KickedCondition.ONCE); ability.addTarget(new TargetOpponentsCreaturePermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/g/GhituChronicler.java b/Mage.Sets/src/mage/cards/g/GhituChronicler.java index 3ef095a1821..158eeb7c6c2 100644 --- a/Mage.Sets/src/mage/cards/g/GhituChronicler.java +++ b/Mage.Sets/src/mage/cards/g/GhituChronicler.java @@ -1,19 +1,16 @@ - package mage.cards.g; 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.ReturnToHandTargetEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.abilities.keyword.KickerAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.filter.FilterCard; -import mage.filter.common.FilterInstantOrSorceryCard; +import mage.filter.StaticFilters; import mage.target.common.TargetCardInYourGraveyard; import java.util.UUID; @@ -23,9 +20,6 @@ import java.util.UUID; */ public final class GhituChronicler extends CardImpl { - private static final FilterCard filter - = new FilterInstantOrSorceryCard("instant or sorcery card from your graveyard"); - public GhituChronicler(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); @@ -38,12 +32,8 @@ public final class GhituChronicler extends CardImpl { this.addAbility(new KickerAbility("{3}{R}")); // When Ghitu Chronicler enters the battlefield, if it was kicked, return target instant or sorcery card from your graveyard to your hand. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), false), - KickedCondition.ONCE, "When {this} enters, if it was kicked, " + - "return target instant or sorcery card from your graveyard to your hand." - ); - ability.addTarget(new TargetCardInYourGraveyard(filter)); + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect()).withInterveningIf(KickedCondition.ONCE); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY_FROM_YOUR_GRAVEYARD)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GhituJourneymage.java b/Mage.Sets/src/mage/cards/g/GhituJourneymage.java index 14249b36e39..5763d4c75ea 100644 --- a/Mage.Sets/src/mage/cards/g/GhituJourneymage.java +++ b/Mage.Sets/src/mage/cards/g/GhituJourneymage.java @@ -1,34 +1,35 @@ package mage.cards.g; -import java.util.UUID; 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.DamagePlayersEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.constants.TargetController; +import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.AnotherPredicate; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class GhituJourneymage extends CardImpl { - private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Wizard"); + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.WIZARD, "you control another Wizard"); static { filter.add(AnotherPredicate.instance); - filter.add(SubType.WIZARD.getPredicate()); } + private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter); + public GhituJourneymage(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); @@ -38,12 +39,7 @@ public final class GhituJourneymage extends CardImpl { this.toughness = new MageInt(2); // When Ghitu Journeymage enters the battlefield, if you control another Wizard, Ghitu Journeymage deals 2 damage to each opponent. - TriggeredAbility triggeredAbility = new EntersBattlefieldTriggeredAbility(new DamagePlayersEffect(2, TargetController.OPPONENT)); - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - triggeredAbility, - new PermanentsOnTheBattlefieldCondition(filter), - "When {this} enters, if you control another Wizard, {this} deals 2 damage to each opponent." - )); + this.addAbility(new EntersBattlefieldTriggeredAbility(new DamagePlayersEffect(2, TargetController.OPPONENT)).withInterveningIf(condition)); } private GhituJourneymage(final GhituJourneymage card) { diff --git a/Mage.Sets/src/mage/cards/g/GibberingFiend.java b/Mage.Sets/src/mage/cards/g/GibberingFiend.java index 4ff11c3ffdf..0fe87e51653 100644 --- a/Mage.Sets/src/mage/cards/g/GibberingFiend.java +++ b/Mage.Sets/src/mage/cards/g/GibberingFiend.java @@ -1,21 +1,21 @@ package mage.cards.g; -import java.util.UUID; - import mage.MageInt; -import mage.abilities.dynamicvalue.common.CardTypesInGraveyardCount; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.DeliriumCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.dynamicvalue.common.CardTypesInGraveyardCount; import mage.abilities.effects.common.DamagePlayersEffect; import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.AbilityWord; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; +import java.util.UUID; + /** * @author fireshoes */ @@ -28,16 +28,15 @@ public final class GibberingFiend extends CardImpl { this.toughness = new MageInt(1); // When Gibbering Fiend enters the battlefield, it deals 1 damage to each opponent. - this.addAbility(new EntersBattlefieldTriggeredAbility(new DamagePlayersEffect(1, TargetController.OPPONENT, "it"), false)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new DamagePlayersEffect( + 1, TargetController.OPPONENT, "it" + ), false)); // Delirium — At the beginning of each opponent's upkeep, if there are four or more card types among cards in your graveyard, // Gibbering Fiend deals 1 damage to that player. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfUpkeepTriggeredAbility(TargetController.OPPONENT, new DamageTargetEffect(1), false), - DeliriumCondition.instance, - "Delirium — At the beginning of each opponent's upkeep, if there are four or more card types among cards in your graveyard, " - + "{this} deals 1 damage to that player.") - .addHint(CardTypesInGraveyardCount.YOU.getHint())); + this.addAbility(new BeginningOfUpkeepTriggeredAbility( + TargetController.OPPONENT, new DamageTargetEffect(1, true, "that player"), false + ).withInterveningIf(DeliriumCondition.instance).setAbilityWord(AbilityWord.DELIRIUM).addHint(CardTypesInGraveyardCount.YOU.getHint())); } private GibberingFiend(final GibberingFiend card) { diff --git a/Mage.Sets/src/mage/cards/g/Gigantiform.java b/Mage.Sets/src/mage/cards/g/Gigantiform.java index feb60a03ab0..9cd8967cd05 100644 --- a/Mage.Sets/src/mage/cards/g/Gigantiform.java +++ b/Mage.Sets/src/mage/cards/g/Gigantiform.java @@ -1,40 +1,43 @@ - package mage.cards.g; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.StaticAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.KickedCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; -import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect; +import mage.abilities.effects.common.continuous.SetBasePowerToughnessAttachedEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.KickerAbility; import mage.abilities.keyword.TrampleAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.NamePredicate; -import mage.game.Game; -import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author North */ public final class Gigantiform extends CardImpl { + private static final FilterCard filter = new FilterCard("card named Gigantiform"); + + static { + filter.add(new NamePredicate("Gigantiform")); + } + public Gigantiform(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}{G}"); this.subtype.add(SubType.AURA); // Kicker {4} @@ -44,15 +47,21 @@ public final class Gigantiform extends CardImpl { TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); - Ability ability = new EnchantAbility(auraTarget); - this.addAbility(ability); + this.addAbility(new EnchantAbility(auraTarget)); + // Enchanted creature has base power and toughness 8/8 and has trample. - this.addAbility(new GigantiformAbility()); + Ability ability = new SimpleStaticAbility( + new SetBasePowerToughnessAttachedEffect(8, 8, AttachmentType.AURA) + ); + ability.addEffect(new GainAbilityAttachedEffect( + TrampleAbility.getInstance(), AttachmentType.AURA + ).setText("and has trample")); + this.addAbility(ability); + // When Gigantiform enters the battlefield, if it was kicked, you may search your library for a card named Gigantiform, put it onto the battlefield, then shuffle your library. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new GigantiformEffect(), true), - KickedCondition.ONCE, - "When {this} enters, if it was kicked, you may search your library for a card named Gigantiform, put it onto the battlefield, then shuffle.")); + this.addAbility(new EntersBattlefieldTriggeredAbility( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter)), true + ).withInterveningIf(KickedCondition.ONCE)); } private Gigantiform(final Gigantiform card) { @@ -64,65 +73,3 @@ public final class Gigantiform extends CardImpl { return new Gigantiform(this); } } - -class GigantiformAbility extends StaticAbility { - - public GigantiformAbility() { - super(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.AURA)); - Ability ability = new SimpleStaticAbility( - new SetBasePowerToughnessSourceEffect(8, 8, Duration.WhileOnBattlefield) - ); - this.addEffect(new GainAbilityAttachedEffect(ability, AttachmentType.AURA)); - } - - private GigantiformAbility(final GigantiformAbility ability) { - super(ability); - } - - @Override - public GigantiformAbility copy() { - return new GigantiformAbility(this); - } - - @Override - public String getRule() { - return "Enchanted creature has base power and toughness 8/8 and has trample."; - } -} - -class GigantiformEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterCard("card named Gigantiform"); - - static { - filter.add(new NamePredicate("Gigantiform")); - } - - public GigantiformEffect() { - super(Outcome.PutCardInPlay); - } - - private GigantiformEffect(final GigantiformEffect effect) { - super(effect); - } - - @Override - public GigantiformEffect copy() { - return new GigantiformEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - TargetCardInLibrary target = new TargetCardInLibrary(filter); - if (controller != null && controller.searchLibrary(target, source, game)) { - Card card = controller.getLibrary().getCard(target.getFirstTarget(), game); - if (card != null) { - controller.moveCards(card, Zone.BATTLEFIELD, source, game); - } - controller.shuffleLibrary(source, game); - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/g/GildedCerodon.java b/Mage.Sets/src/mage/cards/g/GildedCerodon.java index 40d5fec95c6..e9ca33a3c48 100644 --- a/Mage.Sets/src/mage/cards/g/GildedCerodon.java +++ b/Mage.Sets/src/mage/cards/g/GildedCerodon.java @@ -4,7 +4,6 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.condition.common.DesertControlledOrGraveyardCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.combat.CantBlockTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -20,8 +19,6 @@ import java.util.UUID; */ public final class GildedCerodon extends CardImpl { - private static final String rule = "Whenever {this} attacks, if you control a Desert or there is a Desert card in your graveyard, target creature can't block this turn."; - public GildedCerodon(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}"); @@ -31,13 +28,10 @@ public final class GildedCerodon extends CardImpl { this.toughness = new MageInt(4); // Whenever Gilded Cerodon attacks, if you control a Desert or there is a Desert card in your graveyard, target creature can't block this turn. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new AttacksTriggeredAbility(new CantBlockTargetEffect(Duration.EndOfTurn), false), - DesertControlledOrGraveyardCondition.instance, rule - ); + Ability ability = new AttacksTriggeredAbility(new CantBlockTargetEffect(Duration.EndOfTurn)) + .withInterveningIf(DesertControlledOrGraveyardCondition.instance); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability.addHint(DesertControlledOrGraveyardCondition.getHint())); - } private GildedCerodon(final GildedCerodon card) { diff --git a/Mage.Sets/src/mage/cards/g/GimlisRecklessMight.java b/Mage.Sets/src/mage/cards/g/GimlisRecklessMight.java index 8ad1f100229..824bf4b2c6e 100644 --- a/Mage.Sets/src/mage/cards/g/GimlisRecklessMight.java +++ b/Mage.Sets/src/mage/cards/g/GimlisRecklessMight.java @@ -1,30 +1,31 @@ package mage.cards.g; -import mage.abilities.TriggeredAbility; +import mage.abilities.Ability; import mage.abilities.common.AttacksWithCreaturesTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.FormidableCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.FightTargetsEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.AbilityWord; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.TargetController; +import mage.filter.FilterPermanent; import mage.filter.StaticFilters; import mage.filter.common.FilterAttackingCreature; -import mage.filter.common.FilterCreaturePermanent; import mage.target.TargetPermanent; import java.util.UUID; /** - * * @author notgreat */ public final class GimlisRecklessMight extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterAttackingCreature("attacking creature you control"); + private static final FilterPermanent filter = new FilterAttackingCreature("attacking creature you control"); static { filter.add(TargetController.YOU.getControllerPredicate()); @@ -35,14 +36,15 @@ public final class GimlisRecklessMight extends CardImpl { // Creatures you control have haste. this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( - HasteAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); + HasteAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES + ))); + // Formidable -- Whenever you attack, if creatures you control have total power 8 or greater, target attacking creature you control fights up to one target creature you don't control. - TriggeredAbility ability = new AttacksWithCreaturesTriggeredAbility(new FightTargetsEffect(),1); + Ability ability = new AttacksWithCreaturesTriggeredAbility(new FightTargetsEffect(), 1) + .withInterveningIf(FormidableCondition.instance); ability.addTarget(new TargetPermanent(filter)); ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL)); - ability.setAbilityWord(AbilityWord.FORMIDABLE); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, FormidableCondition.instance, - "Formidable — Whenever you attack, if creatures you control have total power 8 or greater, target attacking creature you control fights up to one target creature you don't control.")); + this.addAbility(ability.setAbilityWord(AbilityWord.FORMIDABLE)); } private GimlisRecklessMight(final GimlisRecklessMight card) { diff --git a/Mage.Sets/src/mage/cards/g/GixianSkullflayer.java b/Mage.Sets/src/mage/cards/g/GixianSkullflayer.java index 17f6c723062..b8d4ab3d6de 100644 --- a/Mage.Sets/src/mage/cards/g/GixianSkullflayer.java +++ b/Mage.Sets/src/mage/cards/g/GixianSkullflayer.java @@ -1,26 +1,25 @@ package mage.cards.g; -import java.util.UUID; import mage.MageInt; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.Condition; import mage.abilities.condition.common.CardsInControllerGraveyardCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.constants.SubType; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.counters.CounterType; import mage.filter.StaticFilters; +import java.util.UUID; + /** - * * @author weirddan455 */ public final class GixianSkullflayer extends CardImpl { - private static final CardsInControllerGraveyardCondition condition - = new CardsInControllerGraveyardCondition(3, StaticFilters.FILTER_CARD_CREATURES); + private static final Condition condition = new CardsInControllerGraveyardCondition(3, StaticFilters.FILTER_CARD_CREATURES); public GixianSkullflayer(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); @@ -32,11 +31,7 @@ public final class GixianSkullflayer extends CardImpl { this.toughness = new MageInt(3); // At the beginning of your upkeep, if there are three or more creature cards in your graveyard, put a +1/+1 counter on Gixian Skullflayer. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance())), - condition, - "At the beginning of your upkeep, if there are three or more creature cards in your graveyard, put a +1/+1 counter on {this}." - )); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance())).withInterveningIf(condition)); } private GixianSkullflayer(final GixianSkullflayer card) { diff --git a/Mage.Sets/src/mage/cards/g/Glimmervoid.java b/Mage.Sets/src/mage/cards/g/Glimmervoid.java index 496eb6510e7..6d7d609e923 100644 --- a/Mage.Sets/src/mage/cards/g/Glimmervoid.java +++ b/Mage.Sets/src/mage/cards/g/Glimmervoid.java @@ -1,33 +1,36 @@ - package mage.cards.g; -import java.util.UUID; -import mage.abilities.TriggeredAbility; -import mage.abilities.common.OnEventTriggeredAbility; +import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.mana.AnyColorManaAbility; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; +import mage.constants.TargetController; import mage.filter.common.FilterControlledArtifactPermanent; -import mage.game.events.GameEvent; + +import java.util.UUID; /** - * * @author jonubuu */ public final class Glimmervoid extends CardImpl { + private static final Condition condition = new PermanentsOnTheBattlefieldCondition( + new FilterControlledArtifactPermanent("you control no artifacts"), ComparisonType.EQUAL_TO, 0 + ); + public Glimmervoid(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // At the beginning of the end step, if you control no artifacts, sacrifice Glimmervoid. - TriggeredAbility triggered = new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new SacrificeSourceEffect()); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(triggered, new PermanentsOnTheBattlefieldCondition(new FilterControlledArtifactPermanent(), ComparisonType.FEWER_THAN, 1), - "At the beginning of the end step, if you control no artifacts, sacrifice {this}.")); + this.addAbility(new BeginningOfEndStepTriggeredAbility( + TargetController.NEXT, new SacrificeSourceEffect(), false, condition + )); + // {tap}: Add one mana of any color. this.addAbility(new AnyColorManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/g/GloriousEnforcer.java b/Mage.Sets/src/mage/cards/g/GloriousEnforcer.java index 9073f354890..815cd12948d 100644 --- a/Mage.Sets/src/mage/cards/g/GloriousEnforcer.java +++ b/Mage.Sets/src/mage/cards/g/GloriousEnforcer.java @@ -1,26 +1,25 @@ package mage.cards.g; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.DoubleStrikeAbility; -import mage.constants.Duration; -import mage.constants.SubType; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.LifelinkAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.TargetController; import mage.game.Game; import mage.players.Player; +import java.util.UUID; + /** - * * @author weirddan455 */ public final class GloriousEnforcer extends CardImpl { @@ -39,14 +38,12 @@ public final class GloriousEnforcer extends CardImpl { this.addAbility(LifelinkAbility.getInstance()); // At the beginning of each combat, if you have more life than an opponent, Glorious Enforcer gains double strike until end of turn. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfCombatTriggeredAbility( - TargetController.ANY, new GainAbilitySourceEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn), - false - ), - GloriousEnforcerCondition.instance, - "At the beginning of each combat, if you have more life than an opponent, {this} gains double strike until end of turn." - )); + this.addAbility(new BeginningOfCombatTriggeredAbility( + TargetController.ANY, + new GainAbilitySourceEffect( + DoubleStrikeAbility.getInstance(), Duration.EndOfTurn + ), false + ).withInterveningIf(GloriousEnforcerCondition.instance)); } private GloriousEnforcer(final GloriousEnforcer card) { @@ -66,14 +63,20 @@ enum GloriousEnforcerCondition implements Condition { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - for (UUID opponentId : game.getOpponents(source.getControllerId())) { - Player opponent = game.getPlayer(opponentId); - if (opponent != null && controller.getLife() > opponent.getLife()) { - return true; - } + if (controller == null) { + return false; + } + for (UUID opponentId : game.getOpponents(source.getControllerId())) { + Player opponent = game.getPlayer(opponentId); + if (opponent != null && controller.getLife() > opponent.getLife()) { + return true; } } return false; } + + @Override + public String toString() { + return "you have more life than an opponent"; + } } diff --git a/Mage.Sets/src/mage/cards/g/GoblinBushwhacker.java b/Mage.Sets/src/mage/cards/g/GoblinBushwhacker.java index aee5bf27ee4..f200e9172b6 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinBushwhacker.java +++ b/Mage.Sets/src/mage/cards/g/GoblinBushwhacker.java @@ -1,11 +1,9 @@ - package mage.cards.g; -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.BoostControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.HasteAbility; @@ -13,12 +11,13 @@ import mage.abilities.keyword.KickerAbility; 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 North */ public final class GoblinBushwhacker extends CardImpl { @@ -35,19 +34,14 @@ public final class GoblinBushwhacker extends CardImpl { this.addAbility(new KickerAbility("{R}")); // When this creature enters, if it was kicked, creatures you control get +1/+0 and gain haste until end of turn. - EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new BoostControlledEffect(1, 0, Duration.EndOfTurn), false); + Ability ability = new EntersBattlefieldTriggeredAbility( + new BoostControlledEffect(1, 0, Duration.EndOfTurn) + .setText("creatures you control get +1/+0")).withInterveningIf(KickedCondition.ONCE); ability.addEffect(new GainAbilityControlledEffect( - HasteAbility.getInstance(), - Duration.EndOfTurn, + HasteAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES - )); - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - ability, - KickedCondition.ONCE, - "When this creature enters, " - + "if it was kicked, " - + "creatures you control get +1/+0 and gain haste until end of turn." - )); + ).setText("and gain haste until end of turn")); + this.addAbility(ability); } private GoblinBushwhacker(final GoblinBushwhacker card) { diff --git a/Mage.Sets/src/mage/cards/g/GoblinRuinblaster.java b/Mage.Sets/src/mage/cards/g/GoblinRuinblaster.java index ef91213e832..b1d434bc76d 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinRuinblaster.java +++ b/Mage.Sets/src/mage/cards/g/GoblinRuinblaster.java @@ -2,11 +2,10 @@ package mage.cards.g; -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.DestroyTargetEffect; import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.KickerAbility; @@ -16,14 +15,15 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.target.common.TargetNonBasicLandPermanent; +import java.util.UUID; + /** - * * @author BetaSteward_at_googlemail.com */ public final class GoblinRuinblaster extends CardImpl { public GoblinRuinblaster(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); this.subtype.add(SubType.GOBLIN); this.subtype.add(SubType.SHAMAN); @@ -33,14 +33,13 @@ public final class GoblinRuinblaster extends CardImpl { // Kicker {R} (You may pay an additional {R} as you cast this spell.) this.addAbility(new KickerAbility("{R}")); - // Haste this.addAbility(HasteAbility.getInstance()); // When Goblin Ruinblaster enters the battlefield, if it was kicked, destroy target nonbasic land. - EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(), false); + Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect()).withInterveningIf(KickedCondition.ONCE); ability.addTarget(new TargetNonBasicLandPermanent()); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, KickedCondition.ONCE, "When {this} enters, if it was kicked, destroy target nonbasic land.")); + this.addAbility(ability); } private GoblinRuinblaster(final GoblinRuinblaster card) { diff --git a/Mage.Sets/src/mage/cards/g/GoliathHatchery.java b/Mage.Sets/src/mage/cards/g/GoliathHatchery.java index 2cfe4da6bb4..a1449663878 100644 --- a/Mage.Sets/src/mage/cards/g/GoliathHatchery.java +++ b/Mage.Sets/src/mage/cards/g/GoliathHatchery.java @@ -1,13 +1,12 @@ package mage.cards.g; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.CorruptedCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.ToxicAbility; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.AbilityWord; @@ -38,11 +37,10 @@ public final class GoliathHatchery extends CardImpl { )); // Corrupted -- At the beginning of your upkeep, if an opponent has three or more poison counters, choose a creature you control, then draw cards equal to its total toxic value. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfUpkeepTriggeredAbility( - new GoliathHatcheryEffect(), false - ).setAbilityWord(AbilityWord.CORRUPTED), CorruptedCondition.instance, null - ).addHint(CorruptedCondition.getHint())); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new GoliathHatcheryEffect()) + .withInterveningIf(CorruptedCondition.instance) + .setAbilityWord(AbilityWord.CORRUPTED) + .addHint(CorruptedCondition.getHint())); } private GoliathHatchery(final GoliathHatchery card) { @@ -59,8 +57,7 @@ class GoliathHatcheryEffect extends OneShotEffect { GoliathHatcheryEffect() { super(Outcome.Benefit); - staticText = "if an opponent has three or more poison counters, " + - "choose a creature you control, then draw cards equal to its total toxic value"; + staticText = "choose a creature you control, then draw cards equal to its total toxic value"; } private GoliathHatcheryEffect(final GoliathHatcheryEffect effect) { diff --git a/Mage.Sets/src/mage/cards/g/GougedZealot.java b/Mage.Sets/src/mage/cards/g/GougedZealot.java index e0bb7822c98..a5fb308bfce 100644 --- a/Mage.Sets/src/mage/cards/g/GougedZealot.java +++ b/Mage.Sets/src/mage/cards/g/GougedZealot.java @@ -3,7 +3,6 @@ package mage.cards.g; import mage.MageInt; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.condition.common.DeliriumCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.dynamicvalue.common.CardTypesInGraveyardCount; import mage.abilities.effects.common.DamageAllControlledTargetEffect; import mage.abilities.keyword.ReachAbility; @@ -16,7 +15,6 @@ import mage.constants.SubType; import java.util.UUID; /** - * * @author weirddan455 */ public final class GougedZealot extends CardImpl { @@ -33,11 +31,11 @@ public final class GougedZealot extends CardImpl { this.addAbility(ReachAbility.getInstance()); // Delirium — Whenever Gouged Zealot attacks, if there are four or more card types among cards in your graveyard, Gouged Zealot deals 1 damage to each creature defending player controls. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new AttacksTriggeredAbility(new DamageAllControlledTargetEffect(1), false, null, SetTargetPointer.PLAYER), - DeliriumCondition.instance, - "Delirium — Whenever {this} attacks, if there are four or more card types among cards in your graveyard, {this} deals 1 damage to each creature defending player controls." - ).addHint(CardTypesInGraveyardCount.YOU.getHint())); + this.addAbility(new AttacksTriggeredAbility( + new DamageAllControlledTargetEffect(1) + .setText("{this} deals 1 damage to each creature defending player controls"), + false, null, SetTargetPointer.PLAYER + ).withInterveningIf(DeliriumCondition.instance).addHint(CardTypesInGraveyardCount.YOU.getHint())); } private GougedZealot(final GougedZealot card) { diff --git a/Mage.Sets/src/mage/cards/g/GrafRats.java b/Mage.Sets/src/mage/cards/g/GrafRats.java index 5b37662a5df..6715c1b3c80 100644 --- a/Mage.Sets/src/mage/cards/g/GrafRats.java +++ b/Mage.Sets/src/mage/cards/g/GrafRats.java @@ -1,11 +1,10 @@ package mage.cards.g; import mage.MageInt; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.MeldCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.MeldEffect; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -30,13 +29,9 @@ public final class GrafRats extends CardImpl { this.meldsToClazz = mage.cards.c.ChitteringHost.class; // At the beginning of combat on your turn, if you both own and control Graf Rats and a creature named Midnight Scavengers, exile them, then meld them into Chittering Host. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfCombatTriggeredAbility(new MeldEffect( - "Midnight Scavengers", "Chittering Host" - )), condition, "At the beginning " + - "of combat on your turn, if you both own and control {this} and a creature " + - "named Midnight Scavengers, exile them, then meld them into Chittering Host." - )); + this.addAbility(new BeginningOfCombatTriggeredAbility(new MeldEffect( + "Midnight Scavengers", "Chittering Host" + )).withInterveningIf(condition)); } private GrafRats(final GrafRats card) { diff --git a/Mage.Sets/src/mage/cards/g/GraveScrabbler.java b/Mage.Sets/src/mage/cards/g/GraveScrabbler.java index 2eb04dcdb6b..d03ead0c285 100644 --- a/Mage.Sets/src/mage/cards/g/GraveScrabbler.java +++ b/Mage.Sets/src/mage/cards/g/GraveScrabbler.java @@ -1,22 +1,25 @@ package mage.cards.g; -import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbility; +import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.keyword.MadnessAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; +import mage.filter.FilterCard; import mage.filter.common.FilterCreatureCard; import mage.target.common.TargetCardInGraveyard; +import java.util.UUID; + public final class GraveScrabbler extends CardImpl { + private static final FilterCard filter = new FilterCreatureCard("creature card from a graveyard"); + public GraveScrabbler(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); this.subtype.add(SubType.ZOMBIE); @@ -24,15 +27,14 @@ public final class GraveScrabbler extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); - //Madness {1}{B} + // Madness {1}{B} this.addAbility(new MadnessAbility(new ManaCostsImpl<>("{1}{B}"))); - //When Grave Scrabbler enters the battlefield, if its madness cost was paid, - //you may return target creature card from a graveyard to its owner's hand. - TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), true); - ability.addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card in a graveyard"))); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, MadnessAbility.getCondition(), - "When {this} enters, if its madness cost was paid, you may return target creature card from a graveyard to its owner's hand.")); + // When Grave Scrabbler enters the battlefield, if its madness cost was paid, you may return target creature card from a graveyard to its owner's hand. + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), true) + .withInterveningIf(MadnessAbility.getCondition()); + ability.addTarget(new TargetCardInGraveyard(filter)); + this.addAbility(ability); } private GraveScrabbler(final GraveScrabbler card) { diff --git a/Mage.Sets/src/mage/cards/g/GriffinAerie.java b/Mage.Sets/src/mage/cards/g/GriffinAerie.java index 2c23807b080..95c852f9c70 100644 --- a/Mage.Sets/src/mage/cards/g/GriffinAerie.java +++ b/Mage.Sets/src/mage/cards/g/GriffinAerie.java @@ -1,12 +1,10 @@ package mage.cards.g; -import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.YouGainedLifeCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.dynamicvalue.common.ControllerGainedLifeCount; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.hint.ConditionHint; -import mage.abilities.hint.Hint; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -22,18 +20,13 @@ import java.util.UUID; public final class GriffinAerie extends CardImpl { private static final Condition condition = new YouGainedLifeCondition(ComparisonType.MORE_THAN, 2); - private static final Hint hint = new ConditionHint(condition, "You gained 3 or more life this turn"); public GriffinAerie(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); // At the beginning of your end step, if you gained 3 or more life this turn, create a 2/2 white Griffin creature token with flying. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfEndStepTriggeredAbility( - new CreateTokenEffect(new GriffinToken()) - ), condition, "At the beginning of your end step, " + - "if you gained 3 or more life this turn, create a 2/2 white Griffin creature token with flying." - ).addHint(hint), new PlayerGainedLifeWatcher()); + this.addAbility(new BeginningOfEndStepTriggeredAbility(new CreateTokenEffect(new GriffinToken())) + .withInterveningIf(condition).addHint(ControllerGainedLifeCount.getHint()), new PlayerGainedLifeWatcher()); } private GriffinAerie(final GriffinAerie card) { diff --git a/Mage.Sets/src/mage/cards/g/GrowingRitesOfItlimoc.java b/Mage.Sets/src/mage/cards/g/GrowingRitesOfItlimoc.java index e4f6c554687..cbc80fc495e 100644 --- a/Mage.Sets/src/mage/cards/g/GrowingRitesOfItlimoc.java +++ b/Mage.Sets/src/mage/cards/g/GrowingRitesOfItlimoc.java @@ -1,24 +1,34 @@ package mage.cards.g; -import java.util.UUID; - -import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.hint.common.CreaturesYouControlHint; import mage.abilities.keyword.TransformAbility; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.PutCards; +import mage.constants.SuperType; import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledCreaturePermanent; + +import java.util.UUID; /** * @author JRHerlehy */ public final class GrowingRitesOfItlimoc extends CardImpl { + private static final Condition condition = new PermanentsOnTheBattlefieldCondition( + new FilterControlledCreaturePermanent("you control four or more creatures"), + ComparisonType.MORE_THAN, 3 + ); + public GrowingRitesOfItlimoc(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); @@ -30,14 +40,13 @@ public final class GrowingRitesOfItlimoc extends CardImpl { // You may reveal a creature card from among them and put it into your hand. // Put the rest on the bottom of your library in any order. this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( - 4, 1, StaticFilters.FILTER_CARD_CREATURE_A, PutCards.HAND, PutCards.BOTTOM_ANY))); + 4, 1, StaticFilters.FILTER_CARD_CREATURE_A, PutCards.HAND, PutCards.BOTTOM_ANY + ))); // At the beginning of your end step, if you control four or more creatures, transform Growing Rites of Itlimoc. this.addAbility(new TransformAbility()); - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect()), - new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_CONTROLLED_A_CREATURE, ComparisonType.MORE_THAN, 3), - "At the beginning of your end step, if you control four or more creatures, transform {this}")); + this.addAbility(new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect()) + .withInterveningIf(condition).addHint(CreaturesYouControlHint.instance)); } private GrowingRitesOfItlimoc(final GrowingRitesOfItlimoc card) { diff --git a/Mage.Sets/src/mage/cards/g/GruffTriplets.java b/Mage.Sets/src/mage/cards/g/GruffTriplets.java index 3cc9396f980..134ab775e69 100644 --- a/Mage.Sets/src/mage/cards/g/GruffTriplets.java +++ b/Mage.Sets/src/mage/cards/g/GruffTriplets.java @@ -3,8 +3,8 @@ package mage.cards.g; import mage.MageInt; import mage.abilities.common.DiesSourceTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.Condition; import mage.abilities.condition.common.SourceMatchesFilterCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.dynamicvalue.common.SourcePermanentPowerValue; import mage.abilities.effects.CreateTokenCopySourceEffect; import mage.abilities.effects.common.counter.AddCountersAllEffect; @@ -26,14 +26,16 @@ import java.util.UUID; */ public final class GruffTriplets extends CardImpl { - private static final FilterPermanent filterNonToken = new FilterPermanent("non-token permanent"); - private static final FilterControlledPermanent filterNamedGruffTriplets = new FilterControlledPermanent("creature you control named Gruff Triplets"); + private static final FilterPermanent filterNonToken = new FilterPermanent("it isn't a token"); + private static final FilterPermanent filterNamedGruffTriplets = new FilterControlledPermanent("creature you control named Gruff Triplets"); static { filterNonToken.add(TokenPredicate.FALSE); filterNamedGruffTriplets.add(new NamePredicate("Gruff Triplets")); } + private static final Condition condition = new SourceMatchesFilterCondition(filterNonToken); + public GruffTriplets(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{G}{G}"); @@ -46,20 +48,13 @@ public final class GruffTriplets extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // When Gruff Triplets enters the battlefield, if it isn't a token, create two tokens that are copies of it. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new CreateTokenCopySourceEffect(2)), - new SourceMatchesFilterCondition(filterNonToken), - "When {this} enters, if it isn't a token, create two tokens that are copies of it." - )); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenCopySourceEffect(2) + .setText("create two tokens that are copies of it")).withInterveningIf(condition)); // When Gruff Triplets dies, put a number of +1/+1 counters equal to its power on each creature you control named Gruff Triplets. - this.addAbility(new DiesSourceTriggeredAbility( - new AddCountersAllEffect( - CounterType.P1P1.createInstance(), - SourcePermanentPowerValue.NOT_NEGATIVE, - filterNamedGruffTriplets - ).setText("put a number of +1/+1 counters equal to its power on each creature you control named Gruff Triplets.") - )); + this.addAbility(new DiesSourceTriggeredAbility(new AddCountersAllEffect( + CounterType.P1P1.createInstance(), SourcePermanentPowerValue.NOT_NEGATIVE, filterNamedGruffTriplets + ).setText("put a number of +1/+1 counters equal to its power on each creature you control named Gruff Triplets"))); } private GruffTriplets(final GruffTriplets card) { diff --git a/Mage.Sets/src/mage/cards/g/GuildswornProwler.java b/Mage.Sets/src/mage/cards/g/GuildswornProwler.java index a7d63dbdbdc..6bafc744f30 100644 --- a/Mage.Sets/src/mage/cards/g/GuildswornProwler.java +++ b/Mage.Sets/src/mage/cards/g/GuildswornProwler.java @@ -4,7 +4,6 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.DiesSourceTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.DeathtouchAbility; import mage.cards.CardImpl; @@ -35,10 +34,8 @@ public final class GuildswornProwler extends CardImpl { this.addAbility(DeathtouchAbility.getInstance()); // When Guildsworn Prowler dies, if it wasn't blocking, draw a card. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new DiesSourceTriggeredAbility(new DrawCardSourceControllerEffect(1)), - GuildswornProwlerCondition.instance, "When {this} dies, if it wasn't blocking, draw a card." - )); + this.addAbility(new DiesSourceTriggeredAbility(new DrawCardSourceControllerEffect(1)) + .withInterveningIf(GuildswornProwlerCondition.instance)); } private GuildswornProwler(final GuildswornProwler card) { @@ -61,4 +58,9 @@ enum GuildswornProwlerCondition implements Condition { .map(permanent -> !BlockingOrBlockedWatcher.check(permanent, game)) .orElse(false); } -} \ No newline at end of file + + @Override + public String toString() { + return "it wasn't blocking"; + } +} diff --git a/Mage.Sets/src/mage/cards/g/GunnerConscript.java b/Mage.Sets/src/mage/cards/g/GunnerConscript.java index ecc84b5ad1a..a7f254b25e2 100644 --- a/Mage.Sets/src/mage/cards/g/GunnerConscript.java +++ b/Mage.Sets/src/mage/cards/g/GunnerConscript.java @@ -5,11 +5,8 @@ import mage.abilities.Ability; import mage.abilities.common.DiesSourceTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.dynamicvalue.AdditiveDynamicValue; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.AuraAttachedCount; -import mage.abilities.dynamicvalue.common.EquipmentAttachedCount; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.TrampleAbility; @@ -18,7 +15,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.AttachedToSourcePredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.JunkToken; @@ -31,6 +30,18 @@ import java.util.UUID; */ public final class GunnerConscript extends CardImpl { + private static final FilterPermanent filter = new FilterPermanent("Aura and Equipment attached to it"); + + static { + filter.add(Predicates.or( + SubType.AURA.getPredicate(), + SubType.EQUIPMENT.getPredicate() + )); + filter.add(AttachedToSourcePredicate.instance); + } + + private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter); + public GunnerConscript(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); @@ -43,20 +54,15 @@ public final class GunnerConscript extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // Gunner Conscript gets +1/+1 for each Aura and Equipment attached to it. - DynamicValue totalAmount = new AdditiveDynamicValue(new AuraAttachedCount(), new EquipmentAttachedCount()); - this.addAbility(new SimpleStaticAbility( - new BoostSourceEffect(totalAmount, totalAmount, Duration.WhileOnBattlefield) - .setText("{this} gets +1/+1 for each Aura and Equipment attached to it"))); + this.addAbility(new SimpleStaticAbility(new BoostSourceEffect(xValue, xValue, Duration.WhileOnBattlefield))); // When Gunner Conscript dies, if it was enchanted, create a Junk token. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new DiesSourceTriggeredAbility(new CreateTokenEffect(new JunkToken())), GunnerConscriptEnchantedCondition.instance, - "When Gunner Conscript dies, if it was enchanted, create a Junk token.")); + this.addAbility(new DiesSourceTriggeredAbility(new CreateTokenEffect(new JunkToken())) + .withInterveningIf(GunnerConscriptEnchantedCondition.instance)); // When Gunner Conscript dies, if it was equipped, create a Junk token. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new DiesSourceTriggeredAbility(new CreateTokenEffect(new JunkToken())), GunnerConscriptEquippedCondition.instance, - "When Gunner Conscript dies, if it was equipped, create a Junk token.")); + this.addAbility(new DiesSourceTriggeredAbility(new CreateTokenEffect(new JunkToken())) + .withInterveningIf(GunnerConscriptEquippedCondition.instance)); } private GunnerConscript(final GunnerConscript card) { @@ -84,6 +90,11 @@ enum GunnerConscriptEnchantedCondition implements Condition { .filter(Objects::nonNull) .anyMatch(permanent -> permanent.isEnchantment(game)); } + + @Override + public String toString() { + return "it was enchanted"; + } } enum GunnerConscriptEquippedCondition implements Condition { @@ -98,4 +109,9 @@ enum GunnerConscriptEquippedCondition implements Condition { .filter(Objects::nonNull) .anyMatch(attachment -> attachment.hasSubtype(SubType.EQUIPMENT, game)); } + + @Override + public String toString() { + return "it was equipped"; + } } diff --git a/Mage.Sets/src/mage/cards/g/GutlessPlunderer.java b/Mage.Sets/src/mage/cards/g/GutlessPlunderer.java index 8614b3d54cf..7f89a39080e 100644 --- a/Mage.Sets/src/mage/cards/g/GutlessPlunderer.java +++ b/Mage.Sets/src/mage/cards/g/GutlessPlunderer.java @@ -1,10 +1,8 @@ package mage.cards.g; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.RaidCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.hint.common.RaidHint; import mage.abilities.keyword.DeathtouchAbility; @@ -19,14 +17,13 @@ import mage.watchers.common.PlayerAttackedWatcher; import java.util.UUID; /** - * * @author ciaccona007 */ public final class GutlessPlunderer extends CardImpl { public GutlessPlunderer(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); - + this.subtype.add(SubType.SKELETON); this.subtype.add(SubType.PIRATE); this.power = new MageInt(2); @@ -36,17 +33,9 @@ public final class GutlessPlunderer extends CardImpl { this.addAbility(DeathtouchAbility.getInstance()); // Raid -- When this creature enters, if you attacked this turn, look at the top three cards of your library. You may put one of those cards back on top of your library. Put the rest into your graveyard. - Ability ability = new ConditionalInterveningIfTriggeredAbility(new EntersBattlefieldTriggeredAbility( - new LookLibraryAndPickControllerEffect( - 3, 1, PutCards.TOP_ANY, PutCards.GRAVEYARD, true - ) - ), RaidCondition.instance, "When this creature enters, if you attacked this turn, " - + "look at the top three cards of your library. You may " - + "put one of those cards back on top of your library. Put the rest into your graveyard." - ); - ability.setAbilityWord(AbilityWord.RAID); - ability.addHint(RaidHint.instance); - this.addAbility(ability, new PlayerAttackedWatcher()); + this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( + 3, 1, PutCards.TOP_ANY, PutCards.GRAVEYARD, true + )).withInterveningIf(RaidCondition.instance).setAbilityWord(AbilityWord.RAID).addHint(RaidHint.instance), new PlayerAttackedWatcher()); } private GutlessPlunderer(final GutlessPlunderer card) { diff --git a/Mage.Sets/src/mage/cards/g/GwyllionHedgeMage.java b/Mage.Sets/src/mage/cards/g/GwyllionHedgeMage.java index 06071cbaadd..5c79ce47c72 100644 --- a/Mage.Sets/src/mage/cards/g/GwyllionHedgeMage.java +++ b/Mage.Sets/src/mage/cards/g/GwyllionHedgeMage.java @@ -3,8 +3,8 @@ package mage.cards.g; 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.CreateTokenEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.cards.CardImpl; @@ -13,7 +13,7 @@ import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.SubType; import mage.counters.CounterType; -import mage.filter.common.FilterLandPermanent; +import mage.filter.common.FilterControlledPermanent; import mage.game.permanent.token.KithkinSoldierToken; import mage.target.common.TargetCreaturePermanent; @@ -24,16 +24,14 @@ import java.util.UUID; */ public final class GwyllionHedgeMage extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent("Plains"); - private static final FilterLandPermanent filter2 = new FilterLandPermanent("Swamps"); - - static { - filter.add(SubType.PLAINS.getPredicate()); - filter2.add(SubType.SWAMP.getPredicate()); - } - - private static final String rule1 = "When {this} enters, if you control two or more Plains, you may create a 1/1 white Kithkin Soldier creature token."; - private static final String rule2 = "When {this} enters, if you control two or more Swamps, you may put a -1/-1 counter on target creature."; + private static final Condition condition = new PermanentsOnTheBattlefieldCondition( + new FilterControlledPermanent(SubType.PLAINS, "you control two or more Plains"), + ComparisonType.MORE_THAN, 1 + ); + private static final Condition condition2 = new PermanentsOnTheBattlefieldCondition( + new FilterControlledPermanent(SubType.SWAMP, "you control two or more Swamps"), + ComparisonType.MORE_THAN, 1 + ); public GwyllionHedgeMage(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W/B}"); @@ -44,16 +42,12 @@ public final class GwyllionHedgeMage extends CardImpl { this.toughness = new MageInt(2); // When Gwyllion Hedge-Mage enters the battlefield, if you control two or more Plains, you may create a 1/1 white Kithkin Soldier creature token. - Ability ability = new ConditionalInterveningIfTriggeredAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new KithkinSoldierToken()), true), new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1), rule1); - this.addAbility(ability); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new KithkinSoldierToken()), true).withInterveningIf(condition)); // When Gwyllion Hedge-Mage enters the battlefield, if you control two or more Swamps, you may put a -1/-1 counter on target creature. - Ability ability2 = new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new AddCountersTargetEffect(CounterType.M1M1.createInstance()), true), - new PermanentsOnTheBattlefieldCondition(filter2, ComparisonType.MORE_THAN, 1), - rule2); - ability2.addTarget(new TargetCreaturePermanent()); - this.addAbility(ability2); + Ability ability = new EntersBattlefieldTriggeredAbility(new AddCountersTargetEffect(CounterType.M1M1.createInstance()), true).withInterveningIf(condition2); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/i/ItlimocCradleOfTheSun.java b/Mage.Sets/src/mage/cards/i/ItlimocCradleOfTheSun.java index a1140a281d8..a9f5a6dffcc 100644 --- a/Mage.Sets/src/mage/cards/i/ItlimocCradleOfTheSun.java +++ b/Mage.Sets/src/mage/cards/i/ItlimocCradleOfTheSun.java @@ -1,11 +1,8 @@ package mage.cards.i; -import java.util.UUID; - import mage.Mana; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.hint.Hint; -import mage.abilities.hint.ValueHint; +import mage.abilities.hint.common.CreaturesYouControlHint; import mage.abilities.mana.DynamicManaAbility; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; @@ -14,19 +11,16 @@ import mage.constants.CardType; import mage.constants.SuperType; import mage.filter.StaticFilters; +import java.util.UUID; + /** - * * @author JRHerlehy */ public final class ItlimocCradleOfTheSun extends CardImpl { - private static final Hint hint = new ValueHint( - "Number of creatures you control", new PermanentsOnBattlefieldCount(StaticFilters.FILTER_PERMANENT_CREATURE_CONTROLLED) - ); - public ItlimocCradleOfTheSun(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); - + this.supertype.add(SuperType.LEGENDARY); // (Transforms from Growing Rites of Itlimoc.)/ @@ -36,7 +30,7 @@ public final class ItlimocCradleOfTheSun extends CardImpl { this.addAbility(new GreenManaAbility()); // {T}: Add {G} for each creature you control. - this.addAbility(new DynamicManaAbility(Mana.GreenMana(1), new PermanentsOnBattlefieldCount(StaticFilters.FILTER_PERMANENT_CREATURE_CONTROLLED)).addHint(hint)); + this.addAbility(new DynamicManaAbility(Mana.GreenMana(1), new PermanentsOnBattlefieldCount(StaticFilters.FILTER_PERMANENT_CREATURE_CONTROLLED)).addHint(CreaturesYouControlHint.instance)); } private ItlimocCradleOfTheSun(final ItlimocCradleOfTheSun card) { diff --git a/Mage.Sets/src/mage/cards/n/NecraSanctuary.java b/Mage.Sets/src/mage/cards/n/NecraSanctuary.java index 4696cd265c8..c998f69081c 100644 --- a/Mage.Sets/src/mage/cards/n/NecraSanctuary.java +++ b/Mage.Sets/src/mage/cards/n/NecraSanctuary.java @@ -1,18 +1,17 @@ - package mage.cards.n; -import java.util.UUID; import mage.ObjectColor; import mage.abilities.Ability; -import mage.abilities.common.SanctuaryInterveningIfTriggeredAbility; +import mage.abilities.common.SanctuaryTriggeredAbility; import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.target.TargetPlayer; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class NecraSanctuary extends CardImpl { @@ -21,10 +20,9 @@ public final class NecraSanctuary extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); // At the beginning of your upkeep, if you control a green or white permanent, target player loses 1 life. If you control a green permanent and a white permanent, that player loses 3 life instead. - Ability ability = new SanctuaryInterveningIfTriggeredAbility( + Ability ability = new SanctuaryTriggeredAbility( new LoseLifeTargetEffect(1), new LoseLifeTargetEffect(3), ObjectColor.GREEN, ObjectColor.WHITE, - "At the beginning of your upkeep, if you control a green or white permanent, " - + "target player loses 1 life. If you control a green permanent and a white permanent, that player loses 3 life instead." + "target player loses 1 life. If you control a green permanent and a white permanent, that player loses 3 life instead." ); ability.addTarget(new TargetPlayer()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/r/RakaSanctuary.java b/Mage.Sets/src/mage/cards/r/RakaSanctuary.java index 5e06e5d7a2b..ebaa5bf0a34 100644 --- a/Mage.Sets/src/mage/cards/r/RakaSanctuary.java +++ b/Mage.Sets/src/mage/cards/r/RakaSanctuary.java @@ -1,18 +1,17 @@ - package mage.cards.r; -import java.util.UUID; import mage.ObjectColor; import mage.abilities.Ability; -import mage.abilities.common.SanctuaryInterveningIfTriggeredAbility; +import mage.abilities.common.SanctuaryTriggeredAbility; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class RakaSanctuary extends CardImpl { @@ -21,10 +20,10 @@ public final class RakaSanctuary extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); // At the beginning of your upkeep, if you control a white or blue permanent, Raka Sanctuary deals 1 damage to target creature. If you control a white permanent and a blue permanent, Raka Sanctuary deals 3 damage to that creature instead. - Ability ability = new SanctuaryInterveningIfTriggeredAbility( - new DamageTargetEffect(1), new DamageTargetEffect(3), ObjectColor.WHITE, ObjectColor.BLUE, - "At the beginning of your upkeep, if you control a white or blue permanent, Raka Sanctuary deals 1 damage to target creature. " - + "If you control a white permanent and a blue permanent, Raka Sanctuary deals 3 damage to that creature instead." + Ability ability = new SanctuaryTriggeredAbility( + new DamageTargetEffect(1), new DamageTargetEffect(3), + ObjectColor.WHITE, ObjectColor.BLUE, "{this} deals 1 damage to target creature. " + + "If you control a white permanent and a blue permanent, {this} deals 3 damage to that creature instead." ); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); diff --git a/Mage/src/main/java/mage/abilities/common/SanctuaryInterveningIfTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/SanctuaryTriggeredAbility.java similarity index 53% rename from Mage/src/main/java/mage/abilities/common/SanctuaryInterveningIfTriggeredAbility.java rename to Mage/src/main/java/mage/abilities/common/SanctuaryTriggeredAbility.java index 450811e56c1..f91dd75d01c 100644 --- a/Mage/src/main/java/mage/abilities/common/SanctuaryInterveningIfTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/SanctuaryTriggeredAbility.java @@ -1,14 +1,10 @@ - package mage.abilities.common; import mage.ObjectColor; -import mage.abilities.TriggeredAbility; import mage.abilities.condition.CompoundCondition; import mage.abilities.condition.Condition; -import mage.abilities.condition.InvertCondition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.filter.FilterPermanent; @@ -18,10 +14,10 @@ import mage.filter.predicate.mageobject.ColorPredicate; /** * @author TheElk801 */ -public class SanctuaryInterveningIfTriggeredAbility extends ConditionalInterveningIfTriggeredAbility { +public class SanctuaryTriggeredAbility extends BeginningOfUpkeepTriggeredAbility { private static Condition makeOrCondition(ObjectColor color1, ObjectColor color2) { - FilterPermanent filter = new FilterPermanent(); + FilterPermanent filter = new FilterPermanent("you control a " + color1.getDescription() + " or " + color2.getDescription() + " permanent"); filter.add(Predicates.or( new ColorPredicate(color1), new ColorPredicate(color2) @@ -39,24 +35,17 @@ public class SanctuaryInterveningIfTriggeredAbility extends ConditionalInterveni return new CompoundCondition(condition1, condition2); } - private static TriggeredAbility makeTrigger(OneShotEffect effect1, OneShotEffect effect2, ObjectColor color1, ObjectColor color2) { - TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility( - new ConditionalOneShotEffect(effect1, new InvertCondition(makeAndCondition(color1, color2))) - ); - ability.addEffect(new ConditionalOneShotEffect(effect2, makeAndCondition(color1, color2))); - return ability; + public SanctuaryTriggeredAbility(OneShotEffect effect1, OneShotEffect effect2, ObjectColor color1, ObjectColor color2, String text) { + super(new ConditionalOneShotEffect(effect2, effect1, makeAndCondition(color1, color2), text)); + this.withInterveningIf(makeOrCondition(color1, color2)); } - public SanctuaryInterveningIfTriggeredAbility(OneShotEffect effect1, OneShotEffect effect2, ObjectColor color1, ObjectColor color2, String text) { - super(makeTrigger(effect1, effect2, color1, color2), makeOrCondition(color1, color2), text); - } - - protected SanctuaryInterveningIfTriggeredAbility(final SanctuaryInterveningIfTriggeredAbility ability) { + protected SanctuaryTriggeredAbility(final SanctuaryTriggeredAbility ability) { super(ability); } @Override - public SanctuaryInterveningIfTriggeredAbility copy() { - return new SanctuaryInterveningIfTriggeredAbility(this); + public SanctuaryTriggeredAbility copy() { + return new SanctuaryTriggeredAbility(this); } } diff --git a/Mage/src/main/java/mage/abilities/condition/common/LiveLostLastTurnCondition.java b/Mage/src/main/java/mage/abilities/condition/common/LiveLostLastTurnCondition.java index fc625230ab8..fde812b4aab 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/LiveLostLastTurnCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/LiveLostLastTurnCondition.java @@ -1,28 +1,24 @@ - package mage.abilities.condition.common; import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.game.Game; -import mage.watchers.WatcherUtils; import mage.watchers.common.PlayerLostLifeWatcher; /** - * * @author LevelX */ public enum LiveLostLastTurnCondition implements Condition { - instance; @Override public boolean apply(Game game, Ability source) { PlayerLostLifeWatcher watcher = game.getState().getWatcher(PlayerLostLifeWatcher.class); - if (watcher != null) { - return watcher.getLifeLostLastTurn(source.getControllerId()) > 0; - } else { - WatcherUtils.logMissingWatcher(game, source, PlayerLostLifeWatcher.class, this.getClass()); - } - return false; + return watcher != null && watcher.getLifeLostLastTurn(source.getControllerId()) > 0; + } + + @Override + public String toString() { + return "you lost life last turn"; } } diff --git a/Mage/src/main/java/mage/abilities/condition/common/TributeNotPaidCondition.java b/Mage/src/main/java/mage/abilities/condition/common/TributeNotPaidCondition.java index b6da7a564fd..1c972e33416 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/TributeNotPaidCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/TributeNotPaidCondition.java @@ -1,4 +1,3 @@ - package mage.abilities.condition.common; import mage.abilities.Ability; @@ -11,8 +10,7 @@ import mage.game.Game; * @author LevelX2 */ public enum TributeNotPaidCondition implements Condition { - - instance; + instance; @Override public boolean apply(Game game, Ability source) { @@ -22,4 +20,9 @@ public enum TributeNotPaidCondition implements Condition { } return false; } + + @Override + public String toString() { + return "tribute wasn't paid"; + } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/MeldEffect.java b/Mage/src/main/java/mage/abilities/effects/common/MeldEffect.java index 60e54932be2..420f8af1044 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/MeldEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/MeldEffect.java @@ -41,6 +41,7 @@ public class MeldEffect extends OneShotEffect { this.meldWithName = meldWithName; this.meldIntoName = meldIntoName; this.attacking = attacking; + this.staticText = "exile them, then meld them into " + meldWithName; } protected MeldEffect(final MeldEffect effect) { diff --git a/Mage/src/main/java/mage/abilities/keyword/MadnessAbility.java b/Mage/src/main/java/mage/abilities/keyword/MadnessAbility.java index b1c532974e2..7297698bac1 100644 --- a/Mage/src/main/java/mage/abilities/keyword/MadnessAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/MadnessAbility.java @@ -291,4 +291,9 @@ enum MadnessCondition implements Condition { return ((Spell) madnessSpell).getSpellAbility().getSpellAbilityCastMode() == SpellAbilityCastMode.MADNESS; } + + @Override + public String toString() { + return "its madness cost was paid"; + } } diff --git a/Mage/src/main/java/mage/abilities/keyword/SuspendAbility.java b/Mage/src/main/java/mage/abilities/keyword/SuspendAbility.java index 86b584fddf3..f69518cf516 100644 --- a/Mage/src/main/java/mage/abilities/keyword/SuspendAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/SuspendAbility.java @@ -10,7 +10,6 @@ import mage.abilities.costs.VariableCostType; import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.VariableManaCost; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.OneShotEffect; @@ -147,7 +146,7 @@ public class SuspendAbility extends SpecialAction { if (card.getManaCost().isEmpty()) { setRuleAtTheTop(true); } - addSubAbility(new SuspendBeginningOfUpkeepInterveningIfTriggeredAbility()); + addSubAbility(new SuspendUpkeepAbility()); addSubAbility(new SuspendPlayCardAbility()); } else { ruleText = "Suspend"; @@ -188,8 +187,7 @@ public class SuspendAbility extends SpecialAction { ability.setControllerId(card.getOwnerId()); game.getState().addOtherAbility(card, ability); - SuspendBeginningOfUpkeepInterveningIfTriggeredAbility ability1 - = new SuspendBeginningOfUpkeepInterveningIfTriggeredAbility(); + SuspendUpkeepAbility ability1 = new SuspendUpkeepAbility(); ability1.setSourceId(card.getId()); ability1.setControllerId(card.getOwnerId()); game.getState().addOtherAbility(card, ability1); @@ -434,23 +432,20 @@ class GainHasteEffect extends ContinuousEffectImpl { } -class SuspendBeginningOfUpkeepInterveningIfTriggeredAbility extends ConditionalInterveningIfTriggeredAbility { +class SuspendUpkeepAbility extends BeginningOfUpkeepTriggeredAbility { - SuspendBeginningOfUpkeepInterveningIfTriggeredAbility() { - super(new BeginningOfUpkeepTriggeredAbility(Zone.EXILED, TargetController.YOU, new RemoveCounterSourceEffect(CounterType.TIME.createInstance()), - false), - SuspendedCondition.instance, - "At the beginning of your upkeep, if {this} is suspended, remove a time counter from it."); + SuspendUpkeepAbility() { + super(Zone.EXILED, TargetController.YOU, new RemoveCounterSourceEffect(CounterType.TIME.createInstance()).setText("remove a time counter from it"), false); + this.withInterveningIf(SuspendedCondition.instance); this.setRuleVisible(false); - } - private SuspendBeginningOfUpkeepInterveningIfTriggeredAbility(final SuspendBeginningOfUpkeepInterveningIfTriggeredAbility effect) { + private SuspendUpkeepAbility(final SuspendUpkeepAbility effect) { super(effect); } @Override - public SuspendBeginningOfUpkeepInterveningIfTriggeredAbility copy() { - return new SuspendBeginningOfUpkeepInterveningIfTriggeredAbility(this); + public SuspendUpkeepAbility copy() { + return new SuspendUpkeepAbility(this); } } diff --git a/Mage/src/main/java/mage/watchers/WatcherUtils.java b/Mage/src/main/java/mage/watchers/WatcherUtils.java deleted file mode 100644 index b90425706c6..00000000000 --- a/Mage/src/main/java/mage/watchers/WatcherUtils.java +++ /dev/null @@ -1,20 +0,0 @@ - -package mage.watchers; - -import mage.MageObject; -import mage.abilities.Ability; -import mage.game.Game; -import org.apache.log4j.Logger; - -/** - * - * @author LevelX2 - */ -public final class WatcherUtils { - - public static void logMissingWatcher(Game game, Ability source, Class watcherClass, Class usingClass) { - MageObject sourceObject = source.getSourceObject(game); - Logger.getLogger(usingClass).error("Needed watcher is not started " + watcherClass.getSimpleName() - + " - " + (sourceObject == null ? " no source object" : sourceObject.getName())); - } -}