From a895ac9803b8d3f4198f3c1ab75a75d7c33ea8af Mon Sep 17 00:00:00 2001 From: theelk801 Date: Mon, 9 Jun 2025 12:06:11 -0400 Subject: [PATCH] some more refactoring of ConditionalInterveningIfTriggeredAbility --- .../src/mage/cards/a/AyarasOathsworn.java | 16 +++-- .../src/mage/cards/b/BeastbondOutcaster.java | 8 +-- .../src/mage/cards/b/BrinkOfMadness.java | 17 +++-- .../src/mage/cards/b/BrotherhoodSpy.java | 27 ++++---- .../src/mage/cards/b/BullRushBruiser.java | 25 ++++---- .../src/mage/cards/b/BurningEyeZubera.java | 30 +++++---- Mage.Sets/src/mage/cards/b/BygoneMarvels.java | 11 ++-- .../src/mage/cards/c/CacophonyUnleashed.java | 19 ++---- .../src/mage/cards/c/CaligoSkinWitch.java | 17 ++--- .../src/mage/cards/c/CallOfTheFullMoon.java | 33 +++++----- .../src/mage/cards/c/CallToTheGrave.java | 30 ++++----- .../src/mage/cards/c/CandlegroveWitch.java | 19 +++--- .../src/mage/cards/c/CandlelitCavalry.java | 19 +++--- .../src/mage/cards/c/CatapultFodder.java | 62 ++++++++----------- .../mage/cards/c/ChevillBaneOfMonsters.java | 15 ++--- .../src/mage/cards/c/ChromeReplicator.java | 13 ++-- Mage.Sets/src/mage/cards/c/Chronozoa.java | 12 ++-- .../src/mage/cards/c/CitanulWoodreaders.java | 13 ++-- Mage.Sets/src/mage/cards/c/ClaimJumper.java | 32 +++------- .../src/mage/cards/c/CleavingSkyrider.java | 20 +++--- .../src/mage/cards/c/ClockworkAvian.java | 10 +-- .../condition/common/CovenCondition.java | 2 +- .../LastTimeCounterRemovedCondition.java | 30 ++++----- ...OrMoreSpellsWereCastLastTurnCondition.java | 28 ++++----- 24 files changed, 217 insertions(+), 291 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AyarasOathsworn.java b/Mage.Sets/src/mage/cards/a/AyarasOathsworn.java index 2ba67a29ba1..28783a8319b 100644 --- a/Mage.Sets/src/mage/cards/a/AyarasOathsworn.java +++ b/Mage.Sets/src/mage/cards/a/AyarasOathsworn.java @@ -5,7 +5,6 @@ import mage.abilities.Ability; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.SourceHasCounterCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; @@ -40,15 +39,14 @@ public final class AyarasOathsworn extends CardImpl { this.addAbility(new MenaceAbility(false)); // Whenever Ayara's Oathsworn deals combat damage to a player, if it has fewer than four +1/+1 counters on it, put a +1/+1 counter on it. Then if it has exactly four +1/+1 counters on it, search your library for a card, put it into your hand, then shuffle. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new DealsCombatDamageToAPlayerTriggeredAbility( - new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false - ), condition1, "Whenever {this} deals combat damage to a player, if it has fewer than four " + - "+1/+1 counters on it, put a +1/+1 counter on it. Then if it has exactly four +1/+1 counters on it, " + - "search your library for a card, put it into your hand, then shuffle." - ); + Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()) + .setText("put a +1/+1 counter on it"), false + ).withInterveningIf(condition1); ability.addEffect(new ConditionalOneShotEffect( - new SearchLibraryPutInHandEffect(new TargetCardInLibrary(), false), condition2 + new SearchLibraryPutInHandEffect(new TargetCardInLibrary(), false), + condition2, "Then if it has exactly four +1/+1 counters on it, " + + "search your library for a card, put it into your hand, then shuffle" )); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/BeastbondOutcaster.java b/Mage.Sets/src/mage/cards/b/BeastbondOutcaster.java index 9034f4f66da..a8da380d01b 100644 --- a/Mage.Sets/src/mage/cards/b/BeastbondOutcaster.java +++ b/Mage.Sets/src/mage/cards/b/BeastbondOutcaster.java @@ -3,7 +3,6 @@ package mage.cards.b; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.FerociousCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.hint.common.FerociousHint; import mage.abilities.keyword.PlotAbility; @@ -28,11 +27,8 @@ public final class BeastbondOutcaster extends CardImpl { this.toughness = new MageInt(3); // When Beastbond Outcaster enters the battlefield, if you control a creature with power 4 or greater, draw a card. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)), - FerociousCondition.instance, "When {this} enters, " + - "if you control a creature with power 4 or greater, draw a card." - ).addHint(FerociousHint.instance)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)) + .withInterveningIf(FerociousCondition.instance).addHint(FerociousHint.instance)); // Plot {1}{G} this.addAbility(new PlotAbility("{1}{G}")); diff --git a/Mage.Sets/src/mage/cards/b/BrinkOfMadness.java b/Mage.Sets/src/mage/cards/b/BrinkOfMadness.java index a0181157d5a..7e3653f13a8 100644 --- a/Mage.Sets/src/mage/cards/b/BrinkOfMadness.java +++ b/Mage.Sets/src/mage/cards/b/BrinkOfMadness.java @@ -1,14 +1,13 @@ package mage.cards.b; -import mage.abilities.TriggeredAbility; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; -import mage.abilities.condition.common.CardsInHandCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.Ability; +import mage.abilities.condition.common.HellbentCondition; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.discard.DiscardHandTargetEffect; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; import mage.target.common.TargetOpponent; import java.util.UUID; @@ -22,12 +21,10 @@ public final class BrinkOfMadness extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}{B}"); // At the beginning of your upkeep, if you have no cards in hand, sacrifice Brink of Madness and target opponent discards their hand. - TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceEffect()); - ability.addEffect(new DiscardHandTargetEffect()); + Ability ability = new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceEffect()).withInterveningIf(HellbentCondition.instance); + ability.addEffect(new DiscardHandTargetEffect().concatBy("and")); ability.addTarget(new TargetOpponent()); - CardsInHandCondition condition = new CardsInHandCondition(ComparisonType.EQUAL_TO, 0); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, condition, "At the beginning of your upkeep, if you have no cards in hand, sacrifice {this} and target opponent discards their hand.")); - + this.addAbility(ability); } private BrinkOfMadness(final BrinkOfMadness card) { diff --git a/Mage.Sets/src/mage/cards/b/BrotherhoodSpy.java b/Mage.Sets/src/mage/cards/b/BrotherhoodSpy.java index e3a2af67a09..e5251a1d417 100644 --- a/Mage.Sets/src/mage/cards/b/BrotherhoodSpy.java +++ b/Mage.Sets/src/mage/cards/b/BrotherhoodSpy.java @@ -2,17 +2,19 @@ package mage.cards.b; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect; -import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.hint.ConditionHint; import mage.abilities.hint.Hint; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; @@ -23,14 +25,15 @@ import java.util.UUID; */ public final class BrotherhoodSpy extends CardImpl { - private static final FilterPermanent filter = new FilterControlledPermanent(SubType.ASSASSIN); + private static final FilterPermanent filter + = new FilterControlledPermanent(SubType.ASSASSIN, "you control a legendary Assassin"); static { filter.add(SuperType.LEGENDARY.getPredicate()); } private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter); - private static final Hint hint = new ConditionHint(condition, "You control a legendary Assassin"); + private static final Hint hint = new ConditionHint(condition); public BrotherhoodSpy(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); @@ -41,13 +44,11 @@ public final class BrotherhoodSpy extends CardImpl { this.toughness = new MageInt(3); // At the beginning of combat on your turn, if you control a legendary Assassin, Brotherhood Spy gets +1/+0 until end of turn and can't be blocked this turn. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new BeginningOfCombatTriggeredAbility( - new BoostTargetEffect(1, 0) - ), condition, "At the beginning of combat on your turn, if you control a legendary Assassin, " + - "{this} gets +1/+0 until end of turn and can't be blocked this turn." - ); - ability.addEffect(new CantBeBlockedSourceEffect(Duration.EndOfTurn)); + Ability ability = new BeginningOfCombatTriggeredAbility( + new BoostSourceEffect(1, 0, Duration.EndOfTurn) + ).withInterveningIf(condition); + ability.addEffect(new CantBeBlockedSourceEffect(Duration.EndOfTurn) + .setText("and can't be blocked this turn")); this.addAbility(ability.addHint(hint)); } diff --git a/Mage.Sets/src/mage/cards/b/BullRushBruiser.java b/Mage.Sets/src/mage/cards/b/BullRushBruiser.java index d69fb1ad63d..b4749fa28e9 100644 --- a/Mage.Sets/src/mage/cards/b/BullRushBruiser.java +++ b/Mage.Sets/src/mage/cards/b/BullRushBruiser.java @@ -1,33 +1,35 @@ - package mage.cards.b; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FirstStrikeAbility; -import mage.constants.Duration; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; import mage.filter.common.FilterTeamPermanent; import mage.filter.predicate.mageobject.AnotherPredicate; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class BullRushBruiser extends CardImpl { - private static final FilterTeamPermanent filter = new FilterTeamPermanent(SubType.WARRIOR, "another Warrior"); + private static final FilterTeamPermanent filter + = new FilterTeamPermanent(SubType.WARRIOR, "your team controls another Warrior"); static { filter.add(AnotherPredicate.instance); } + private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter); + public BullRushBruiser(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); @@ -37,12 +39,9 @@ public final class BullRushBruiser extends CardImpl { this.toughness = new MageInt(3); // Whenever Bull-Rush Bruiser attacks, if your team controls another Warrior, Bull-Rush Bruiser gains first strike until end of turn. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new AttacksTriggeredAbility(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn), false), - new PermanentsOnTheBattlefieldCondition(filter), - "Whenever {this} attacks, if your team controls another Warrior, " - + "{this} gains first strike until end of turn." - )); + this.addAbility(new AttacksTriggeredAbility(new GainAbilitySourceEffect( + FirstStrikeAbility.getInstance(), Duration.EndOfTurn + )).withInterveningIf(condition)); } private BullRushBruiser(final BullRushBruiser card) { diff --git a/Mage.Sets/src/mage/cards/b/BurningEyeZubera.java b/Mage.Sets/src/mage/cards/b/BurningEyeZubera.java index bf660252995..be50407423d 100644 --- a/Mage.Sets/src/mage/cards/b/BurningEyeZubera.java +++ b/Mage.Sets/src/mage/cards/b/BurningEyeZubera.java @@ -1,38 +1,36 @@ - package mage.cards.b; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.DiesSourceTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetAnyTarget; +import java.util.Optional; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class BurningEyeZubera extends CardImpl { public BurningEyeZubera(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.ZUBERA, SubType.SPIRIT); this.power = new MageInt(3); this.toughness = new MageInt(3); // When Burning-Eye Zubera dies, if 4 or more damage was dealt to it this turn, Burning-Eye Zubera deals 3 damage to any target. - Ability ability = new ConditionalInterveningIfTriggeredAbility(new DiesSourceTriggeredAbility(new DamageTargetEffect(3)),new SourceGotFourDamage(), - "When {this} dies, if 4 or more damage was dealt to it this turn, Burning-Eye Zubera deals 3 damage to any target"); + Ability ability = new DiesSourceTriggeredAbility(new DamageTargetEffect(3)) + .withInterveningIf(BurningEyeZuberaCondition.instance); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } @@ -47,13 +45,19 @@ public final class BurningEyeZubera extends CardImpl { } } -class SourceGotFourDamage implements Condition { +enum BurningEyeZuberaCondition implements Condition { + instance; + @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent == null) { - permanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD); + return Optional + .ofNullable(source.getSourcePermanentOrLKI(game)) + .map(Permanent::getDamage) + .orElse(0) >= 4; } - return permanent.getDamage() > 3; + + @Override + public String toString() { + return "4 or more damage was dealt to it this turn"; } } diff --git a/Mage.Sets/src/mage/cards/b/BygoneMarvels.java b/Mage.Sets/src/mage/cards/b/BygoneMarvels.java index 9b2429fa71b..2367fc7e168 100644 --- a/Mage.Sets/src/mage/cards/b/BygoneMarvels.java +++ b/Mage.Sets/src/mage/cards/b/BygoneMarvels.java @@ -1,7 +1,6 @@ package mage.cards.b; import mage.abilities.condition.common.DescendCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.CastSourceTriggeredAbility; import mage.abilities.effects.common.CopySourceSpellEffect; import mage.abilities.effects.common.ExileSpellEffect; @@ -27,11 +26,11 @@ public final class BygoneMarvels extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{G}{G}"); // Descend 8 -- When you cast this spell, if there are eight or more permanent cards in your graveyard, copy this spell twice. You may choose new targets for the copies. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new CastSourceTriggeredAbility(new CopySourceSpellEffect(2)), - DescendCondition.EIGHT, "When you cast this spell, if there are eight or more " + - "permanent cards in your graveyard, copy this spell twice. You may choose new targets for the copies." - ).setAbilityWord(AbilityWord.DESCEND_8).addHint(DescendCondition.getHint())); + this.addAbility(new CastSourceTriggeredAbility(new CopySourceSpellEffect(2) + .setText("copy this spell twice. You may choose new targets for the copies")) + .withInterveningIf(DescendCondition.EIGHT) + .setAbilityWord(AbilityWord.DESCEND_8) + .addHint(DescendCondition.getHint())); // Return target permanent card from your graveyard to your hand. Exile Bygone Marvels. this.getSpellAbility().addEffect(new ReturnFromGraveyardToHandTargetEffect()); diff --git a/Mage.Sets/src/mage/cards/c/CacophonyUnleashed.java b/Mage.Sets/src/mage/cards/c/CacophonyUnleashed.java index 5c37b77015f..33dd02d30ac 100644 --- a/Mage.Sets/src/mage/cards/c/CacophonyUnleashed.java +++ b/Mage.Sets/src/mage/cards/c/CacophonyUnleashed.java @@ -4,7 +4,6 @@ import mage.MageInt; import mage.abilities.common.EntersBattlefieldThisOrAnotherTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.CastFromEverywhereSourceCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.DestroyAllEffect; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; import mage.abilities.keyword.DeathtouchAbility; @@ -37,24 +36,18 @@ public final class CacophonyUnleashed extends CardImpl { public CacophonyUnleashed(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{5}{B}{B}"); - // When Cacophony Unleashed enters the battlefield, if you cast it, destroy all nonenchantment creatures. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new DestroyAllEffect(filter)), - CastFromEverywhereSourceCondition.instance, - "When {this} enters, if you cast it, destroy all nonenchantment creatures." - )); + this.addAbility(new EntersBattlefieldTriggeredAbility(new DestroyAllEffect(filter)) + .withInterveningIf(CastFromEverywhereSourceCondition.instance)); // Whenever Cacophony Unleashed or another enchantment you control enters, until end of turn, Cacophony Unleashed becomes a legendary 6/6 Nightmare God creature with menace and deathtouch. It's still an enchantment. - this.addAbility( - new EntersBattlefieldThisOrAnotherTriggeredAbility( + this.addAbility(new EntersBattlefieldThisOrAnotherTriggeredAbility( new BecomesCreatureSourceEffect(new CacophonyUnleashedToken(), CardType.ENCHANTMENT, Duration.EndOfTurn) - .setText("until end of turn, Cacophony Unleashed becomes a legendary 6/6 Nightmare God " - + "creature with menace and deathtouch. It's still an enchantment."), + .setText("until end of turn, {this} becomes a legendary 6/6 Nightmare God " + + "creature with menace and deathtouch. It's still an enchantment."), StaticFilters.FILTER_PERMANENT_ENCHANTMENT, false, true - ) - ); + )); } private CacophonyUnleashed(final CacophonyUnleashed card) { diff --git a/Mage.Sets/src/mage/cards/c/CaligoSkinWitch.java b/Mage.Sets/src/mage/cards/c/CaligoSkinWitch.java index 79205ecbc1a..d8735f5903c 100644 --- a/Mage.Sets/src/mage/cards/c/CaligoSkinWitch.java +++ b/Mage.Sets/src/mage/cards/c/CaligoSkinWitch.java @@ -1,11 +1,9 @@ package mage.cards.c; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.KickedCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.discard.DiscardEachPlayerEffect; import mage.abilities.keyword.KickerAbility; @@ -15,8 +13,9 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; +import java.util.UUID; + /** - * * @author JRHerlehy */ public final class CaligoSkinWitch extends CardImpl { @@ -32,15 +31,9 @@ public final class CaligoSkinWitch extends CardImpl { this.addAbility(new KickerAbility("{3}{B}")); // When Caligo Skin-Witch enters the battlefield, if it was kicked, each opponent discards two cards. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new DiscardEachPlayerEffect( - StaticValue.get(2), - false, - TargetController.OPPONENT - )), - KickedCondition.ONCE, - "When {this} enters, if it was kicked, each opponent discards two cards." - )); + this.addAbility(new EntersBattlefieldTriggeredAbility(new DiscardEachPlayerEffect( + StaticValue.get(2), false, TargetController.OPPONENT + )).withInterveningIf(KickedCondition.ONCE)); } private CaligoSkinWitch(final CaligoSkinWitch card) { diff --git a/Mage.Sets/src/mage/cards/c/CallOfTheFullMoon.java b/Mage.Sets/src/mage/cards/c/CallOfTheFullMoon.java index fa705881e8a..c675832399f 100644 --- a/Mage.Sets/src/mage/cards/c/CallOfTheFullMoon.java +++ b/Mage.Sets/src/mage/cards/c/CallOfTheFullMoon.java @@ -1,54 +1,49 @@ - package mage.cards.c; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.TriggeredAbility; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.TwoOrMoreSpellsWereCastLastTurnCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.TrampleAbility; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; -/** - * - * @author LoneFox +import java.util.UUID; +/** + * @author LoneFox */ public final class CallOfTheFullMoon extends CardImpl { public CallOfTheFullMoon(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); this.subtype.add(SubType.AURA); // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.Benefit)); - Ability ability = new EnchantAbility(auraTarget); - this.addAbility(ability); + this.addAbility(new EnchantAbility(auraTarget)); + // Enchanted creature gets +3/+2 and has trample. - ability = new SimpleStaticAbility(new BoostEnchantedEffect(3, 2, Duration.WhileOnBattlefield)); - Effect effect = new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.AURA); - effect.setText("and has trample."); - ability.addEffect(effect); + Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect(3, 2)); + ability.addEffect(new GainAbilityAttachedEffect( + TrampleAbility.getInstance(), AttachmentType.AURA + ).setText("and has trample")); this.addAbility(ability); // At the beginning of each upkeep, if a player cast two or more spells last turn, sacrifice Call of the Full Moon. - TriggeredAbility ability2 = new BeginningOfUpkeepTriggeredAbility(TargetController.ANY, new SacrificeSourceEffect(), false); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability2, TwoOrMoreSpellsWereCastLastTurnCondition.instance, - "At the beginning of each upkeep, if a player cast two or more spells last turn, sacrifice {this}.")); + this.addAbility(new BeginningOfUpkeepTriggeredAbility( + TargetController.ANY, new SacrificeSourceEffect(), false + ).withInterveningIf(TwoOrMoreSpellsWereCastLastTurnCondition.instance)); } private CallOfTheFullMoon(final CallOfTheFullMoon card) { diff --git a/Mage.Sets/src/mage/cards/c/CallToTheGrave.java b/Mage.Sets/src/mage/cards/c/CallToTheGrave.java index 4ccc7548b6b..42dbde627e9 100644 --- a/Mage.Sets/src/mage/cards/c/CallToTheGrave.java +++ b/Mage.Sets/src/mage/cards/c/CallToTheGrave.java @@ -1,14 +1,11 @@ - package mage.cards.c; -import mage.abilities.Ability; -import mage.abilities.TriggeredAbility; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; -import mage.abilities.common.OnEventTriggeredAbility; -import mage.abilities.condition.common.CreatureCountCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.effects.common.SacrificeEffect; import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -16,33 +13,36 @@ import mage.constants.SubType; import mage.constants.TargetController; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; -import mage.game.events.GameEvent; import java.util.UUID; /** - * * @author nantuko */ public final class CallToTheGrave extends CardImpl { - private static final String ruleText = "At the beginning of the end step, if no creatures are on the battlefield, sacrifice {this}."; private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("non-Zombie creature"); static { filter.add(Predicates.not(SubType.ZOMBIE.getPredicate())); } + private static final Condition condition = new PermanentsOnTheBattlefieldCondition( + new FilterCreaturePermanent("no creatures are on the battlefield"), false + ); + public CallToTheGrave(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{4}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{B}"); // At the beginning of each player's upkeep, that player sacrifices a non-Zombie creature. - Ability ability = new BeginningOfUpkeepTriggeredAbility(TargetController.EACH_PLAYER, new SacrificeEffect(filter, 1, "that player"), false); - this.addAbility(ability); + this.addAbility(new BeginningOfUpkeepTriggeredAbility( + TargetController.EACH_PLAYER, new SacrificeEffect(filter, 1, "that player"), false + )); // At the beginning of the end step, if no creatures are on the battlefield, sacrifice Call to the Grave. - TriggeredAbility triggered = new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new SacrificeSourceEffect()); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(triggered, new CreatureCountCondition(0, TargetController.ANY), ruleText)); + this.addAbility(new BeginningOfEndStepTriggeredAbility( + TargetController.NEXT, new SacrificeSourceEffect(), false + ).withInterveningIf(condition)); } private CallToTheGrave(final CallToTheGrave card) { diff --git a/Mage.Sets/src/mage/cards/c/CandlegroveWitch.java b/Mage.Sets/src/mage/cards/c/CandlegroveWitch.java index e7fef672fa0..4215ec692c8 100644 --- a/Mage.Sets/src/mage/cards/c/CandlegroveWitch.java +++ b/Mage.Sets/src/mage/cards/c/CandlegroveWitch.java @@ -1,15 +1,17 @@ package mage.cards.c; import mage.MageInt; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.common.CovenCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.hint.common.CovenHint; import mage.abilities.keyword.FlyingAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.AbilityWord; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; import java.util.UUID; @@ -27,14 +29,9 @@ public final class CandlegroveWitch extends CardImpl { this.toughness = new MageInt(2); // Coven — At the beginning of combat on your turn, if you control three or more creatures with different powers, Candlegrove Witch gains flying until end of turn. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfCombatTriggeredAbility( - new GainAbilitySourceEffect( - FlyingAbility.getInstance(), Duration.EndOfTurn - ) - ), CovenCondition.instance, "At the beginning of combat on your turn, if you control three " + - "or more creatures with different powers, {this} gains flying until end of turn." - ).addHint(CovenHint.instance).setAbilityWord(AbilityWord.COVEN)); + this.addAbility(new BeginningOfCombatTriggeredAbility( + new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn) + ).withInterveningIf(CovenCondition.instance).addHint(CovenHint.instance).setAbilityWord(AbilityWord.COVEN)); } private CandlegroveWitch(final CandlegroveWitch card) { diff --git a/Mage.Sets/src/mage/cards/c/CandlelitCavalry.java b/Mage.Sets/src/mage/cards/c/CandlelitCavalry.java index bbcbaa73149..afffa3173cd 100644 --- a/Mage.Sets/src/mage/cards/c/CandlelitCavalry.java +++ b/Mage.Sets/src/mage/cards/c/CandlelitCavalry.java @@ -1,15 +1,17 @@ package mage.cards.c; import mage.MageInt; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.common.CovenCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.hint.common.CovenHint; import mage.abilities.keyword.TrampleAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.AbilityWord; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; import java.util.UUID; @@ -27,14 +29,9 @@ public final class CandlelitCavalry extends CardImpl { this.toughness = new MageInt(5); // Coven — At the beginning of combat on your turn, if you control three or more creatures with different powers, Candlelit Cavalry gains trample until end of turn. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfCombatTriggeredAbility( - new GainAbilitySourceEffect( - TrampleAbility.getInstance(), Duration.EndOfTurn - ) - ), CovenCondition.instance, "At the beginning of combat on your turn, if you control " + - "three or more creatures with different powers, {this} gains trample until end of turn." - ).addHint(CovenHint.instance).setAbilityWord(AbilityWord.COVEN)); + this.addAbility(new BeginningOfCombatTriggeredAbility(new GainAbilitySourceEffect( + TrampleAbility.getInstance(), Duration.EndOfTurn + )).withInterveningIf(CovenCondition.instance).addHint(CovenHint.instance).setAbilityWord(AbilityWord.COVEN)); } private CandlelitCavalry(final CandlelitCavalry card) { diff --git a/Mage.Sets/src/mage/cards/c/CatapultFodder.java b/Mage.Sets/src/mage/cards/c/CatapultFodder.java index 2853b20b656..97882939d50 100644 --- a/Mage.Sets/src/mage/cards/c/CatapultFodder.java +++ b/Mage.Sets/src/mage/cards/c/CatapultFodder.java @@ -1,26 +1,43 @@ package mage.cards.c; -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.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; import mage.abilities.keyword.TransformAbility; -import mage.constants.SubType; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.constants.ComparisonType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.ToughnessGreaterThanPowerPredicate; + +import java.util.UUID; /** - * * @author weirddan455 */ public final class CatapultFodder extends CardImpl { + private static final FilterPermanent filter = new FilterControlledCreaturePermanent( + "you control three or more creatures that each have toughness greater than their power" + ); + + static { + filter.add(ToughnessGreaterThanPowerPredicate.instance); + } + + private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 2); + private static final Hint hint = new ValueHint( + "Creatures you control with toughness greater than their power", new PermanentsOnBattlefieldCount(filter) + ); + public CatapultFodder(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); @@ -31,11 +48,7 @@ public final class CatapultFodder extends CardImpl { // At the beginning of combat on your turn, if you control three or more creatures that each have toughness greater than their power, transform Catapult Fodder. this.addAbility(new TransformAbility()); - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfCombatTriggeredAbility(new TransformSourceEffect()), - CatapultFodderCondition.instance, - "At the beginning of combat on your turn, if you control three or more creatures that each have toughness greater than their power, transform {this}" - )); + this.addAbility(new BeginningOfCombatTriggeredAbility(new TransformSourceEffect()).withInterveningIf(condition)); } private CatapultFodder(final CatapultFodder card) { @@ -47,26 +60,3 @@ public final class CatapultFodder extends CardImpl { return new CatapultFodder(this); } } - -enum CatapultFodderCondition implements Condition { - instance; - - @Override - public boolean apply(Game game, Ability source) { - int creatures = 0; - for (Permanent permanent : game.getBattlefield().getAllActivePermanents(source.getControllerId())) { - if (permanent.isCreature(game) && permanent.getToughness().getValue() > permanent.getPower().getValue()) { - creatures++; - if (creatures >= 3) { - return true; - } - } - } - return false; - } - - @Override - public String toString() { - return "you control three or more creatures that each have toughness greater than their power"; - } -} diff --git a/Mage.Sets/src/mage/cards/c/ChevillBaneOfMonsters.java b/Mage.Sets/src/mage/cards/c/ChevillBaneOfMonsters.java index 106c45379c1..3469c669238 100644 --- a/Mage.Sets/src/mage/cards/c/ChevillBaneOfMonsters.java +++ b/Mage.Sets/src/mage/cards/c/ChevillBaneOfMonsters.java @@ -2,15 +2,14 @@ package mage.cards.c; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -27,7 +26,7 @@ import java.util.UUID; public final class ChevillBaneOfMonsters extends CardImpl { private static final FilterPermanent filter - = new FilterPermanent(); + = new FilterPermanent("your opponents control no permanents with bounty counters on them"); private static final FilterPermanent filter2 = new FilterCreatureOrPlaneswalkerPermanent("creature or planeswalker an opponent controls"); private static final FilterPermanent filter3 @@ -59,13 +58,9 @@ public final class ChevillBaneOfMonsters extends CardImpl { this.addAbility(DeathtouchAbility.getInstance()); // At the beginning of your upkeep, if your opponents control no permanents with bounty counters on them, put a bounty counter on target creature or planeswalker an opponent controls. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new BeginningOfUpkeepTriggeredAbility( - new AddCountersTargetEffect(CounterType.BOUNTY.createInstance()), false - ), condition, "At the beginning of your upkeep, " + - "if your opponents control no permanents with bounty counters on them, " + - "put a bounty counter on target creature or planeswalker an opponent controls." - ); + Ability ability = new BeginningOfUpkeepTriggeredAbility( + new AddCountersTargetEffect(CounterType.BOUNTY.createInstance()) + ).withInterveningIf(condition); ability.addTarget(new TargetPermanent(filter2)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/c/ChromeReplicator.java b/Mage.Sets/src/mage/cards/c/ChromeReplicator.java index 20cd7226010..807308840d1 100644 --- a/Mage.Sets/src/mage/cards/c/ChromeReplicator.java +++ b/Mage.Sets/src/mage/cards/c/ChromeReplicator.java @@ -5,7 +5,6 @@ import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.Condition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -37,12 +36,7 @@ public final class ChromeReplicator extends CardImpl { this.toughness = new MageInt(4); // When Chrome Replicator enters the battlefield, if you control two or more nonland, nontoken permanents with the same name as one another, create a 4/4 colorless Construct artifact creature token. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new Construct4Token())), - ChromeReplicatorCondition.instance, "When {this} enters, " + - "if you control two or more nonland, nontoken permanents with the same name as one another, " + - "create a 4/4 colorless Construct artifact creature token." - )); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new Construct4Token())).withInterveningIf(ChromeReplicatorCondition.instance)); } private ChromeReplicator(final ChromeReplicator card) { @@ -78,4 +72,9 @@ enum ChromeReplicatorCondition implements Condition { .filter(s -> !s.isEmpty()) .anyMatch(s -> nameMap.compute(s, CardUtil::setOrIncrementValue) >= 2); } + + @Override + public String toString() { + return "you control two or more nonland, nontoken permanents with the same name as one another"; + } } diff --git a/Mage.Sets/src/mage/cards/c/Chronozoa.java b/Mage.Sets/src/mage/cards/c/Chronozoa.java index 97f3248396b..37e6fc3511e 100644 --- a/Mage.Sets/src/mage/cards/c/Chronozoa.java +++ b/Mage.Sets/src/mage/cards/c/Chronozoa.java @@ -1,12 +1,9 @@ - package mage.cards.c; import mage.MageInt; import mage.abilities.common.DiesSourceTriggeredAbility; import mage.abilities.condition.common.LastTimeCounterRemovedCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.CreateTokenCopySourceEffect; -import mage.abilities.effects.Effect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; @@ -34,11 +31,10 @@ public final class Chronozoa extends CardImpl { this.addAbility(new VanishingAbility(3)); // When Chronozoa dies, if it had no time counters on it, create two tokens that are copies of it. - Effect effect = new CreateTokenCopySourceEffect(2); - effect.setText("create two tokens that are copies of it"); - this.addAbility(new ConditionalInterveningIfTriggeredAbility(new DiesSourceTriggeredAbility(effect, false), - LastTimeCounterRemovedCondition.instance, - "When {this} dies, if it had no time counters on it, create two tokens that are copies of it.")); + this.addAbility(new DiesSourceTriggeredAbility( + new CreateTokenCopySourceEffect(2) + .setText("create two tokens that are copies of it"), false + ).withInterveningIf(LastTimeCounterRemovedCondition.instance)); } private Chronozoa(final Chronozoa card) { diff --git a/Mage.Sets/src/mage/cards/c/CitanulWoodreaders.java b/Mage.Sets/src/mage/cards/c/CitanulWoodreaders.java index 3b3193f57b7..d9b27fbea9f 100644 --- a/Mage.Sets/src/mage/cards/c/CitanulWoodreaders.java +++ b/Mage.Sets/src/mage/cards/c/CitanulWoodreaders.java @@ -1,11 +1,8 @@ - package mage.cards.c; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.KickedCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.KickerAbility; import mage.cards.CardImpl; @@ -13,8 +10,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class CitanulWoodreaders extends CardImpl { @@ -31,11 +29,8 @@ public final class CitanulWoodreaders extends CardImpl { this.addAbility(new KickerAbility("{2}{G}")); // When Citanul Woodreaders enters the battlefield, if it was kicked, draw two cards. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(2)), - KickedCondition.ONCE, - "When {this} enters, if it was kicked, draw two cards." - )); + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(2)) + .withInterveningIf(KickedCondition.ONCE)); } private CitanulWoodreaders(final CitanulWoodreaders card) { diff --git a/Mage.Sets/src/mage/cards/c/ClaimJumper.java b/Mage.Sets/src/mage/cards/c/ClaimJumper.java index ffa895f0f65..568a2c47f67 100644 --- a/Mage.Sets/src/mage/cards/c/ClaimJumper.java +++ b/Mage.Sets/src/mage/cards/c/ClaimJumper.java @@ -3,8 +3,8 @@ package mage.cards.c; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.Condition; import mage.abilities.condition.common.OpponentControlsMoreCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; import mage.abilities.keyword.VigilanceAbility; @@ -29,6 +29,8 @@ public final class ClaimJumper extends CardImpl { filter.add(SubType.PLAINS.getPredicate()); } + private static final Condition condition = new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS); + public ClaimJumper(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); @@ -41,27 +43,13 @@ public final class ClaimJumper extends CardImpl { this.addAbility(VigilanceAbility.getInstance()); // When Claim Jumper enters the battlefield, if an opponent controls more lands than you, you may search your library for a Plains card and put it onto the battlefield tapped. Then if an opponent controls more lands than you, repeat this process once. If you search your library this way, shuffle. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility( - new SearchLibraryPutInPlayEffect( - new TargetCardInLibrary(0, 1, filter), true - ), - true - ), - new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS), - "When {this} enters, if an opponent controls more lands than you, " - + "you may search your library for a Plains card and put it onto the battlefield tapped. " - + "Then if an opponent controls more lands than you, repeat this process once. " - + "If you search your library this way, shuffle." - ); - ability.addEffect( - new ConditionalOneShotEffect( - new SearchLibraryPutInPlayEffect( - new TargetCardInLibrary(0, 1, filter), true, false, true - ), - new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS) - ) - ); + Ability ability = new EntersBattlefieldTriggeredAbility( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), true + ).withInterveningIf(condition); + ability.addEffect(new ConditionalOneShotEffect( + new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true, false, true), + condition, "Then if an opponent controls more lands than you, repeat this process once. If you search your library this way, shuffle" + )); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/CleavingSkyrider.java b/Mage.Sets/src/mage/cards/c/CleavingSkyrider.java index 9dd232ba792..7641522e7d1 100644 --- a/Mage.Sets/src/mage/cards/c/CleavingSkyrider.java +++ b/Mage.Sets/src/mage/cards/c/CleavingSkyrider.java @@ -1,28 +1,30 @@ package mage.cards.c; -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.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.AttackingCreatureCount; import mage.abilities.effects.common.DamageTargetEffect; -import mage.constants.SubType; import mage.abilities.keyword.FlashAbility; -import mage.abilities.keyword.KickerAbility; import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.KickerAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.target.common.TargetAnyTarget; +import java.util.UUID; + /** - * * @author weirddan455 */ public final class CleavingSkyrider extends CardImpl { + private static final DynamicValue xValue = new AttackingCreatureCount("the number of attacking creatures"); + public CleavingSkyrider(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); @@ -41,11 +43,9 @@ public final class CleavingSkyrider extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When Cleaving Skyrider enters the battlefield, if it was kicked, it deals X damage to any target, where X is the number of attacking creatures. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(new AttackingCreatureCount())), - KickedCondition.ONCE, - "When {this} enters, if it was kicked, it deals X damage to any target, where X is the number of attacking creatures." - ); + Ability ability = new EntersBattlefieldTriggeredAbility( + new DamageTargetEffect(xValue, "it") + ).withInterveningIf(KickedCondition.ONCE); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/ClockworkAvian.java b/Mage.Sets/src/mage/cards/c/ClockworkAvian.java index 77f3d5787aa..fbe109ce863 100644 --- a/Mage.Sets/src/mage/cards/c/ClockworkAvian.java +++ b/Mage.Sets/src/mage/cards/c/ClockworkAvian.java @@ -9,7 +9,6 @@ import mage.abilities.condition.common.IsStepCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalActivatedAbility; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; @@ -47,12 +46,9 @@ public final class ClockworkAvian extends CardImpl { )); // At end of combat, if Clockwork Avian attacked or blocked this combat, remove a +1/+0 counter from it. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new EndOfCombatTriggeredAbility( - new RemoveCounterSourceEffect(CounterType.P1P0.createInstance()), false - ), AttackedOrBlockedThisCombatSourceCondition.instance, "At end of combat, " + - "if {this} attacked or blocked this combat, remove a +1/+0 counter from it." - ), new AttackedOrBlockedThisCombatWatcher()); + this.addAbility(new EndOfCombatTriggeredAbility( + new RemoveCounterSourceEffect(CounterType.P1P0.createInstance()).setText("remove a +1/+0 counter from it"), false + ).withInterveningIf(AttackedOrBlockedThisCombatSourceCondition.instance), new AttackedOrBlockedThisCombatWatcher()); // {X}, {tap}: Put up to X +1/+0 counters on Clockwork Avian. This ability can't cause the total number of +1/+0 counters on Clockwork Avian to be greater than four. Activate this ability only during your upkeep. Ability ability = new ConditionalActivatedAbility( diff --git a/Mage/src/main/java/mage/abilities/condition/common/CovenCondition.java b/Mage/src/main/java/mage/abilities/condition/common/CovenCondition.java index 6d2b558ac0b..0a8a6cee560 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/CovenCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/CovenCondition.java @@ -33,6 +33,6 @@ public enum CovenCondition implements Condition { @Override public String toString() { - return "if you control three or more creatures with different powers"; + return "you control three or more creatures with different powers"; } } diff --git a/Mage/src/main/java/mage/abilities/condition/common/LastTimeCounterRemovedCondition.java b/Mage/src/main/java/mage/abilities/condition/common/LastTimeCounterRemovedCondition.java index fb2bf28163c..18709ee7b39 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/LastTimeCounterRemovedCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/LastTimeCounterRemovedCondition.java @@ -2,29 +2,29 @@ package mage.abilities.condition.common; import mage.abilities.Ability; import mage.abilities.condition.Condition; -import mage.constants.Zone; import mage.counters.CounterType; import mage.game.Game; -import mage.game.permanent.Permanent; + +import java.util.Optional; /** * Created by glerman on 20/6/15. */ -public enum LastTimeCounterRemovedCondition implements Condition{ +public enum LastTimeCounterRemovedCondition implements Condition { -instance; + instance; - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent == null) { - permanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD); + @Override + public boolean apply(Game game, Ability source) { + return Optional + .ofNullable(source.getSourcePermanentOrLKI(game)) + .map(permanent -> permanent.getCounters(game).getCount(CounterType.TIME)) + .map(x -> x == 0) + .isPresent(); } - if (permanent != null) { - final int timeCounters = permanent.getCounters(game).getCount(CounterType.TIME); - return timeCounters == 0; - } else { - return false; + + @Override + public String toString() { + return "it had no time counters on it"; } - } } diff --git a/Mage/src/main/java/mage/abilities/condition/common/TwoOrMoreSpellsWereCastLastTurnCondition.java b/Mage/src/main/java/mage/abilities/condition/common/TwoOrMoreSpellsWereCastLastTurnCondition.java index 1f905605a41..f8d755fa332 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/TwoOrMoreSpellsWereCastLastTurnCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/TwoOrMoreSpellsWereCastLastTurnCondition.java @@ -1,4 +1,3 @@ - package mage.abilities.condition.common; import mage.abilities.Ability; @@ -10,22 +9,21 @@ import mage.watchers.common.CastSpellLastTurnWatcher; * @author nantuko */ public enum TwoOrMoreSpellsWereCastLastTurnCondition implements Condition { - - instance; + instance; @Override public boolean apply(Game game, Ability source) { - CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class); - if(watcher == null){ - return false; - } - // if any player cast more than two spells, return true - for (Integer count : watcher.getAmountOfSpellsCastOnPrevTurn().values()) { - if (count >= 2) { - return true; - } - } - // no one cast two or more spells last turn - return false; + return game + .getState() + .getWatcher(CastSpellLastTurnWatcher.class) + .getAmountOfSpellsCastOnPrevTurn() + .values() + .stream() + .anyMatch(x -> x >= 2); + } + + @Override + public String toString() { + return "a player cast two or more spells last turn"; } }