diff --git a/Mage.Sets/src/mage/cards/a/AcademyWall.java b/Mage.Sets/src/mage/cards/a/AcademyWall.java index 0a73ec066fe..3d825910bd2 100644 --- a/Mage.Sets/src/mage/cards/a/AcademyWall.java +++ b/Mage.Sets/src/mage/cards/a/AcademyWall.java @@ -32,7 +32,7 @@ public final class AcademyWall extends CardImpl { new DrawDiscardControllerEffect(true), StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); } private AcademyWall(final AcademyWall card) { diff --git a/Mage.Sets/src/mage/cards/a/AkkiBattleSquad.java b/Mage.Sets/src/mage/cards/a/AkkiBattleSquad.java index befcf601a6f..f1a8b8b1798 100644 --- a/Mage.Sets/src/mage/cards/a/AkkiBattleSquad.java +++ b/Mage.Sets/src/mage/cards/a/AkkiBattleSquad.java @@ -37,7 +37,7 @@ public final class AkkiBattleSquad extends CardImpl { // Whenever one or more modified creatures you control attack, untap all modified creatures you control. After this combat phase, there is an additional combat phase. This ability triggers only once each turn. Ability ability = new AttacksCreatureYouControlTriggeredAbility( new UntapAllEffect(filter), false, filter - ).setTriggerPhrase("Whenever one or more modified creatures you control attack, ").setTriggersOnceEachTurn(true); + ).setTriggerPhrase("Whenever one or more modified creatures you control attack, ").setTriggersLimitEachTurn(1); ability.addEffect(new AdditionalCombatPhaseEffect().setText("After this combat phase, there is an additional combat phase")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/a/AnjeMaidOfDishonor.java b/Mage.Sets/src/mage/cards/a/AnjeMaidOfDishonor.java index 007eeb69d55..2b2a98c7988 100644 --- a/Mage.Sets/src/mage/cards/a/AnjeMaidOfDishonor.java +++ b/Mage.Sets/src/mage/cards/a/AnjeMaidOfDishonor.java @@ -71,7 +71,7 @@ class AnjeMaidOfDishonorTriggeredAbility extends TriggeredAbilityImpl { public AnjeMaidOfDishonorTriggeredAbility() { super(Zone.BATTLEFIELD, new CreateTokenEffect(new BloodToken())); - this.setTriggersOnceEachTurn(true); + this.setTriggersLimitEachTurn(1); setTriggerPhrase("Whenever {this} and/or one or more other Vampires enter the battlefield under your control, "); } diff --git a/Mage.Sets/src/mage/cards/a/AtKnifepoint.java b/Mage.Sets/src/mage/cards/a/AtKnifepoint.java index 1ec619808f9..df7ab794ce0 100644 --- a/Mage.Sets/src/mage/cards/a/AtKnifepoint.java +++ b/Mage.Sets/src/mage/cards/a/AtKnifepoint.java @@ -38,7 +38,7 @@ public final class AtKnifepoint extends CardImpl { ))); // Whenever you commit a crime, create a 1/1 red Mercenary creature token with "{T}: Target creature you control gets +1/+0 until end of turn. Activate only as a sorcery." This ability triggers only once each turn. - this.addAbility(new CommittedCrimeTriggeredAbility(new CreateTokenEffect(new MercenaryToken())).setTriggersOnceEachTurn(true)); + this.addAbility(new CommittedCrimeTriggeredAbility(new CreateTokenEffect(new MercenaryToken())).setTriggersLimitEachTurn(1)); } private AtKnifepoint(final AtKnifepoint card) { diff --git a/Mage.Sets/src/mage/cards/b/BanditsHaul.java b/Mage.Sets/src/mage/cards/b/BanditsHaul.java index 2a3a6361f0f..d452d35a82a 100644 --- a/Mage.Sets/src/mage/cards/b/BanditsHaul.java +++ b/Mage.Sets/src/mage/cards/b/BanditsHaul.java @@ -27,7 +27,7 @@ public final class BanditsHaul extends CardImpl { // Whenever you commit a crime, put a loot counter on Bandit's Haul. This ability triggers only once each turn. this.addAbility(new CommittedCrimeTriggeredAbility( new AddCountersSourceEffect(CounterType.LOOT.createInstance()) - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); // {T}: Add one mana of any color. this.addAbility(new AnyColorManaAbility()); diff --git a/Mage.Sets/src/mage/cards/b/BaronBertramGraywater.java b/Mage.Sets/src/mage/cards/b/BaronBertramGraywater.java index 004b9004cbd..43b6cf01768 100644 --- a/Mage.Sets/src/mage/cards/b/BaronBertramGraywater.java +++ b/Mage.Sets/src/mage/cards/b/BaronBertramGraywater.java @@ -44,7 +44,7 @@ public final class BaronBertramGraywater extends CardImpl { // Whenever one or more tokens enter the battlefield under your control, create a 1/1 black Vampire Rogue creature token with lifelink. This ability triggers only once each turn. this.addAbility(new EntersBattlefieldOneOrMoreTriggeredAbility( new CreateTokenEffect(new VampireRogueToken()), filter, TargetController.YOU - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); // {1}{B}, Sacrifice another creature or artifact: Draw a card. Ability ability = new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new ManaCostsImpl<>("{1}{B}")); diff --git a/Mage.Sets/src/mage/cards/b/BloodHustler.java b/Mage.Sets/src/mage/cards/b/BloodHustler.java index 7edd5685fc4..60daba6f557 100644 --- a/Mage.Sets/src/mage/cards/b/BloodHustler.java +++ b/Mage.Sets/src/mage/cards/b/BloodHustler.java @@ -33,7 +33,7 @@ public final class BloodHustler extends CardImpl { // Whenever you commit a crime, put a +1/+1 counter on Blood Hustler. This ability triggers only once each turn. this.addAbility(new CommittedCrimeTriggeredAbility( new AddCountersSourceEffect(CounterType.P1P1.createInstance()) - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); // {3}{B}: Target opponent loses 1 life and you gain 1 life. Ability ability = new SimpleActivatedAbility(new LoseLifeTargetEffect(1), new ManaCostsImpl<>("{3}{B}")); diff --git a/Mage.Sets/src/mage/cards/b/BloodHypnotist.java b/Mage.Sets/src/mage/cards/b/BloodHypnotist.java index 0bbfc82d1ad..bd4095a27e3 100644 --- a/Mage.Sets/src/mage/cards/b/BloodHypnotist.java +++ b/Mage.Sets/src/mage/cards/b/BloodHypnotist.java @@ -40,7 +40,7 @@ public final class BloodHypnotist extends CardImpl { // Whenever you sacrifice one or more Blood tokens, target creature can't block this turn. This ability triggers only once each turn. Ability ability = new SacrificePermanentTriggeredAbility( new CantBlockTargetEffect(Duration.EndOfTurn), filter - ).setTriggersOnceEachTurn(true); + ).setTriggersLimitEachTurn(1); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/ChanceMetElves.java b/Mage.Sets/src/mage/cards/c/ChanceMetElves.java index 2b82295bf40..852195e262c 100644 --- a/Mage.Sets/src/mage/cards/c/ChanceMetElves.java +++ b/Mage.Sets/src/mage/cards/c/ChanceMetElves.java @@ -25,7 +25,7 @@ public final class ChanceMetElves extends CardImpl { this.toughness = new MageInt(2); // Whenever you scry, put a +1/+1 counter on Chance-Met Elves. This ability triggers only once each turn. - this.addAbility(new ScryTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance())).setTriggersOnceEachTurn(true)); + this.addAbility(new ScryTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance())).setTriggersLimitEachTurn(1)); } private ChanceMetElves(final ChanceMetElves card) { diff --git a/Mage.Sets/src/mage/cards/c/ChandraHopesBeacon.java b/Mage.Sets/src/mage/cards/c/ChandraHopesBeacon.java index b39e87ccc9c..737b6801135 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraHopesBeacon.java +++ b/Mage.Sets/src/mage/cards/c/ChandraHopesBeacon.java @@ -41,7 +41,7 @@ public class ChandraHopesBeacon extends CardImpl { new CopyTargetStackObjectEffect(true).withText("it"), StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false, SetTargetPointer.SPELL - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); //+2: Add two mana in any combination of colors. this.addAbility(new LoyaltyAbility(new AddManaInAnyCombinationEffect(2), 2)); diff --git a/Mage.Sets/src/mage/cards/c/CloakedCadet.java b/Mage.Sets/src/mage/cards/c/CloakedCadet.java index 3d33a14ece6..f691c35e367 100644 --- a/Mage.Sets/src/mage/cards/c/CloakedCadet.java +++ b/Mage.Sets/src/mage/cards/c/CloakedCadet.java @@ -50,7 +50,7 @@ class CloakedCadetTriggeredAbility extends TriggeredAbilityImpl { CloakedCadetTriggeredAbility() { super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1)); - this.setTriggersOnceEachTurn(true); + this.setTriggersLimitEachTurn(1); setTriggerPhrase("Whenever one or more +1/+1 counters are put on one or more Humans you control, "); } diff --git a/Mage.Sets/src/mage/cards/c/CrawlingInfestation.java b/Mage.Sets/src/mage/cards/c/CrawlingInfestation.java index 3ea707cd00d..b39d48ac1e0 100644 --- a/Mage.Sets/src/mage/cards/c/CrawlingInfestation.java +++ b/Mage.Sets/src/mage/cards/c/CrawlingInfestation.java @@ -18,7 +18,6 @@ import mage.game.events.ZoneChangeEvent; import mage.game.permanent.token.InsectToken; /** - * * @author weirddan455 */ public final class CrawlingInfestation extends CardImpl { @@ -47,7 +46,7 @@ class CrawlingInfestationTriggeredAbility extends TriggeredAbilityImpl { public CrawlingInfestationTriggeredAbility() { super(Zone.BATTLEFIELD, new CreateTokenEffect(new InsectToken())); - this.setTriggersOnceEachTurn(true); + this.setTriggersLimitEachTurn(1); setTriggerPhrase("Whenever one or more creature cards are put into your graveyard from anywhere during your turn, "); } diff --git a/Mage.Sets/src/mage/cards/c/CuratorOfSunsCreation.java b/Mage.Sets/src/mage/cards/c/CuratorOfSunsCreation.java index 83223c712aa..da0f7a3697f 100644 --- a/Mage.Sets/src/mage/cards/c/CuratorOfSunsCreation.java +++ b/Mage.Sets/src/mage/cards/c/CuratorOfSunsCreation.java @@ -45,7 +45,7 @@ class CuratorOfSunsCreationTriggeredAbility extends TriggeredAbilityImpl { CuratorOfSunsCreationTriggeredAbility() { super(Zone.BATTLEFIELD, null, false); - setTriggersOnceEachTurn(true); + setTriggersLimitEachTurn(1); } private CuratorOfSunsCreationTriggeredAbility(final CuratorOfSunsCreationTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/d/DeepmuckDesperado.java b/Mage.Sets/src/mage/cards/d/DeepmuckDesperado.java index adae010f128..83c11324ec7 100644 --- a/Mage.Sets/src/mage/cards/d/DeepmuckDesperado.java +++ b/Mage.Sets/src/mage/cards/d/DeepmuckDesperado.java @@ -27,7 +27,7 @@ public final class DeepmuckDesperado extends CardImpl { // Whenever you commit a crime, each opponent mills three cards. This ability triggers only once each turn. this.addAbility(new CommittedCrimeTriggeredAbility( new MillCardsEachPlayerEffect(3, TargetController.OPPONENT) - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); } private DeepmuckDesperado(final DeepmuckDesperado card) { diff --git a/Mage.Sets/src/mage/cards/d/DennickPiousApparition.java b/Mage.Sets/src/mage/cards/d/DennickPiousApparition.java index e5ca15db082..5559ba3a766 100644 --- a/Mage.Sets/src/mage/cards/d/DennickPiousApparition.java +++ b/Mage.Sets/src/mage/cards/d/DennickPiousApparition.java @@ -40,7 +40,7 @@ public final class DennickPiousApparition extends CardImpl { this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility( new InvestigateEffect(1), false, StaticFilters.FILTER_CARD_CREATURE, TargetController.ANY - ).setTriggersOnceEachTurn(true).setTriggerPhrase("Whenever one or more creature cards are put into graveyards from anywhere, ")); + ).setTriggersLimitEachTurn(1).setTriggerPhrase("Whenever one or more creature cards are put into graveyards from anywhere, ")); // If Dennick, Pious Apparition would be put into a graveyard from anywhere, exile it instead. this.addAbility(new PutIntoGraveFromAnywhereSourceAbility(new ExileSourceEffect().setText("exile it instead"))); diff --git a/Mage.Sets/src/mage/cards/d/DramaticFinale.java b/Mage.Sets/src/mage/cards/d/DramaticFinale.java index 286f94436d9..c6b231d1ac3 100644 --- a/Mage.Sets/src/mage/cards/d/DramaticFinale.java +++ b/Mage.Sets/src/mage/cards/d/DramaticFinale.java @@ -39,7 +39,7 @@ public final class DramaticFinale extends CardImpl { // Whenever one or more nontoken creatures you control die, create a 2/1 white and black Inkling creature token with flying. This ability triggers only once each turn. this.addAbility(new DiesCreatureTriggeredAbility( new CreateTokenEffect(new InklingToken()), false, filter - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); } private DramaticFinale(final DramaticFinale card) { diff --git a/Mage.Sets/src/mage/cards/d/DuelistOfTheMind.java b/Mage.Sets/src/mage/cards/d/DuelistOfTheMind.java index f3034f78410..2f4b72cbe37 100644 --- a/Mage.Sets/src/mage/cards/d/DuelistOfTheMind.java +++ b/Mage.Sets/src/mage/cards/d/DuelistOfTheMind.java @@ -44,7 +44,7 @@ public final class DuelistOfTheMind extends CardImpl { // Whenever you commit a crime, you may draw a card. If you do, discard a card. This ability triggers only once each turn. this.addAbility(new CommittedCrimeTriggeredAbility( new DrawDiscardControllerEffect(1, 1, true), false - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); } private DuelistOfTheMind(final DuelistOfTheMind card) { diff --git a/Mage.Sets/src/mage/cards/d/DuskLegionDuelist.java b/Mage.Sets/src/mage/cards/d/DuskLegionDuelist.java index ef463cd86b7..f7ebbe18f12 100644 --- a/Mage.Sets/src/mage/cards/d/DuskLegionDuelist.java +++ b/Mage.Sets/src/mage/cards/d/DuskLegionDuelist.java @@ -28,7 +28,7 @@ public final class DuskLegionDuelist extends CardImpl { this.addAbility(VigilanceAbility.getInstance()); // Whenever one or more +1/+1 counters are put on Dusk Legion Duelist, draw a card. This ability triggers only once each turn. - this.addAbility(new OneOrMoreCountersAddedTriggeredAbility(new DrawCardSourceControllerEffect(1)).setTriggersOnceEachTurn(true)); + this.addAbility(new OneOrMoreCountersAddedTriggeredAbility(new DrawCardSourceControllerEffect(1)).setTriggersLimitEachTurn(1)); } private DuskLegionDuelist(final DuskLegionDuelist card) { diff --git a/Mage.Sets/src/mage/cards/d/DyingToServe.java b/Mage.Sets/src/mage/cards/d/DyingToServe.java index c3255424205..ccf9b71630d 100644 --- a/Mage.Sets/src/mage/cards/d/DyingToServe.java +++ b/Mage.Sets/src/mage/cards/d/DyingToServe.java @@ -20,7 +20,7 @@ public final class DyingToServe extends CardImpl { // Whenever you discard one or more cards, create a tapped 2/2 black Zombie creature token. This ability triggers only once each turn. this.addAbility(new DiscardCardControllerTriggeredAbility(new CreateTokenEffect( new ZombieToken(), 1, true, false), false - ).setTriggerPhrase("Whenever you discard one or more cards, ").setTriggersOnceEachTurn(true)); + ).setTriggerPhrase("Whenever you discard one or more cards, ").setTriggersLimitEachTurn(1)); } private DyingToServe(final DyingToServe card) { diff --git a/Mage.Sets/src/mage/cards/e/ElvishArchivist.java b/Mage.Sets/src/mage/cards/e/ElvishArchivist.java index 8f950581c81..d8fa064aa98 100644 --- a/Mage.Sets/src/mage/cards/e/ElvishArchivist.java +++ b/Mage.Sets/src/mage/cards/e/ElvishArchivist.java @@ -30,14 +30,14 @@ public final class ElvishArchivist extends CardImpl { this.addAbility(new EntersBattlefieldControlledTriggeredAbility( new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)), StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT - ).setTriggersOnceEachTurn(true) + ).setTriggersLimitEachTurn(1) .setTriggerPhrase("Whenever one or more artifacts enter the battlefield under your control, ")); // Whenever one or more enchantments enter the battlefield under your control, draw a card. This ability triggers only once each turn. this.addAbility(new EntersBattlefieldControlledTriggeredAbility( new DrawCardSourceControllerEffect(1), StaticFilters.FILTER_CONTROLLED_PERMANENT_ENCHANTMENT - ).setTriggersOnceEachTurn(true) + ).setTriggersLimitEachTurn(1) .setTriggerPhrase("Whenever one or more enchantments enter the battlefield under your control, ")); } diff --git a/Mage.Sets/src/mage/cards/e/ElvishWarmaster.java b/Mage.Sets/src/mage/cards/e/ElvishWarmaster.java index 5f29e9f1644..ad5fbbcbde3 100644 --- a/Mage.Sets/src/mage/cards/e/ElvishWarmaster.java +++ b/Mage.Sets/src/mage/cards/e/ElvishWarmaster.java @@ -44,7 +44,7 @@ public final class ElvishWarmaster extends CardImpl { // Whenever one or more other Elves enters the battlefield under your control, create a 1/1 green Elf Warrior creature token. This ability triggers only once each turn. this.addAbility(new EntersBattlefieldControlledTriggeredAbility( new CreateTokenEffect(new ElfWarriorToken()), filter - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); // {5}{G}{G}: Elves you control get +2/+2 and gain deathtouch until end of turn. Ability ability = new SimpleActivatedAbility(new BoostControlledEffect( diff --git a/Mage.Sets/src/mage/cards/e/EomerMarshalOfRohan.java b/Mage.Sets/src/mage/cards/e/EomerMarshalOfRohan.java index a8666054728..d5f726ecb41 100644 --- a/Mage.Sets/src/mage/cards/e/EomerMarshalOfRohan.java +++ b/Mage.Sets/src/mage/cards/e/EomerMarshalOfRohan.java @@ -47,8 +47,8 @@ public final class EomerMarshalOfRohan extends CardImpl { // Whenever one or more other attacking legendary creatures you control die, untap all creatures you control. After this phase, there is an additional combat phase. This ability triggers only once each turn. Ability ability = new DiesCreatureTriggeredAbility( - new UntapAllEffect(StaticFilters.FILTER_CONTROLLED_CREATURES), false, filter - ).setTriggersOnceEachTurn(true); + new UntapAllEffect(StaticFilters.FILTER_CONTROLLED_CREATURES), false, filter + ).setTriggersLimitEachTurn(1); ability.addEffect(new AdditionalCombatPhaseEffect()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/e/ExpeditionSupplier.java b/Mage.Sets/src/mage/cards/e/ExpeditionSupplier.java index 6c101105651..907c9e02bd0 100644 --- a/Mage.Sets/src/mage/cards/e/ExpeditionSupplier.java +++ b/Mage.Sets/src/mage/cards/e/ExpeditionSupplier.java @@ -30,7 +30,7 @@ public final class ExpeditionSupplier extends CardImpl { // Whenever Expedition Supplier or another Human enters the battlefield under your control, conjure a card named Utility Knife onto the battlefield. This ability triggers only once each turn. this.addAbility(new EntersBattlefieldThisOrAnotherTriggeredAbility(new ConjureCardEffect( "Utility Knife", Zone.BATTLEFIELD, 1 - ), filter, false, true).setTriggersOnceEachTurn(true)); + ), filter, false, true).setTriggersLimitEachTurn(1)); } private ExpeditionSupplier(final ExpeditionSupplier card) { diff --git a/Mage.Sets/src/mage/cards/e/ExtraordinaryJourney.java b/Mage.Sets/src/mage/cards/e/ExtraordinaryJourney.java index 86b4a8793e7..05450ff7f6d 100644 --- a/Mage.Sets/src/mage/cards/e/ExtraordinaryJourney.java +++ b/Mage.Sets/src/mage/cards/e/ExtraordinaryJourney.java @@ -137,7 +137,7 @@ class ExtraordinaryJourneyTriggeredAbility extends TriggeredAbilityImpl { super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1, "you"), false); setTriggerPhrase("Whenever one or more nontoken creatures enter the battlefield, " + "if one or more of them entered from exile or was cast from exile, "); - setTriggersOnceEachTurn(true); + setTriggersLimitEachTurn(1); } private ExtraordinaryJourneyTriggeredAbility(final ExtraordinaryJourneyTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/f/FolkHero.java b/Mage.Sets/src/mage/cards/f/FolkHero.java index c13ca81a6d7..47c8505b046 100644 --- a/Mage.Sets/src/mage/cards/f/FolkHero.java +++ b/Mage.Sets/src/mage/cards/f/FolkHero.java @@ -41,7 +41,7 @@ public final class FolkHero extends CardImpl { this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect( new SpellCastControllerTriggeredAbility( new DrawCardSourceControllerEffect(1), filter, false - ).setTriggersOnceEachTurn(true), Duration.WhileOnBattlefield, + ).setTriggersLimitEachTurn(1), Duration.WhileOnBattlefield, StaticFilters.FILTER_CREATURES_OWNED_COMMANDER ))); } diff --git a/Mage.Sets/src/mage/cards/f/ForgeBoss.java b/Mage.Sets/src/mage/cards/f/ForgeBoss.java index 30550b18158..6475f99d5fd 100644 --- a/Mage.Sets/src/mage/cards/f/ForgeBoss.java +++ b/Mage.Sets/src/mage/cards/f/ForgeBoss.java @@ -14,7 +14,6 @@ import mage.filter.predicate.mageobject.AnotherPredicate; import java.util.UUID; /** - * * @author weirddan455 */ public final class ForgeBoss extends CardImpl { @@ -36,7 +35,7 @@ public final class ForgeBoss extends CardImpl { // Whenever you sacrifice one or more other creatures, Forge Boss deals 2 damage to each opponent. This ability triggers only once each turn. this.addAbility(new SacrificePermanentTriggeredAbility( new DamagePlayersEffect(2, TargetController.OPPONENT), filter - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); } private ForgeBoss(final ForgeBoss card) { diff --git a/Mage.Sets/src/mage/cards/f/ForgeNeverwinterCharlatan.java b/Mage.Sets/src/mage/cards/f/ForgeNeverwinterCharlatan.java index cf414535ebf..b2d2dfe4267 100644 --- a/Mage.Sets/src/mage/cards/f/ForgeNeverwinterCharlatan.java +++ b/Mage.Sets/src/mage/cards/f/ForgeNeverwinterCharlatan.java @@ -56,7 +56,7 @@ public final class ForgeNeverwinterCharlatan extends CardImpl { this.addAbility(new SacrificePermanentTriggeredAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new TreasureToken(), 1, true), StaticFilters.FILTER_PERMANENT_CREATURE, TargetController.ANY, SetTargetPointer.NONE, false - ).setTriggersOnceEachTurn(true).setTriggerPhrase("Whenever one or more players sacrifice one or more creatures, ")); + ).setTriggersLimitEachTurn(1).setTriggerPhrase("Whenever one or more players sacrifice one or more creatures, ")); } private ForgeNeverwinterCharlatan(final ForgeNeverwinterCharlatan card) { diff --git a/Mage.Sets/src/mage/cards/f/FreestriderLookout.java b/Mage.Sets/src/mage/cards/f/FreestriderLookout.java index 8098b2b59f9..ce1cc70990d 100644 --- a/Mage.Sets/src/mage/cards/f/FreestriderLookout.java +++ b/Mage.Sets/src/mage/cards/f/FreestriderLookout.java @@ -33,7 +33,7 @@ public final class FreestriderLookout extends CardImpl { this.addAbility(new CommittedCrimeTriggeredAbility(new LookLibraryAndPickControllerEffect( 5, 1, StaticFilters.FILTER_CARD_LAND_A, PutCards.BATTLEFIELD_TAPPED, PutCards.BOTTOM_RANDOM - )).setTriggersOnceEachTurn(true)); + )).setTriggersLimitEachTurn(1)); } private FreestriderLookout(final FreestriderLookout card) { diff --git a/Mage.Sets/src/mage/cards/g/GhoulishProcession.java b/Mage.Sets/src/mage/cards/g/GhoulishProcession.java index 095078e764c..a61b8771e1c 100644 --- a/Mage.Sets/src/mage/cards/g/GhoulishProcession.java +++ b/Mage.Sets/src/mage/cards/g/GhoulishProcession.java @@ -12,7 +12,6 @@ import mage.game.permanent.token.ZombieDecayedToken; import java.util.UUID; /** - * * @author weirddan455 */ public final class GhoulishProcession extends CardImpl { @@ -28,7 +27,7 @@ public final class GhoulishProcession extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); // Whenever one or more nontoken creatures die, create a 2/2 black Zombie creature token with decayed. This ability triggers only once each turn. - this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new ZombieDecayedToken()), false, filter).setTriggersOnceEachTurn(true)); + this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new ZombieDecayedToken()), false, filter).setTriggersLimitEachTurn(1)); } private GhoulishProcession(final GhoulishProcession card) { diff --git a/Mage.Sets/src/mage/cards/g/GisaTheHellraiser.java b/Mage.Sets/src/mage/cards/g/GisaTheHellraiser.java index 2d91b11f5ad..8be3a9b044a 100644 --- a/Mage.Sets/src/mage/cards/g/GisaTheHellraiser.java +++ b/Mage.Sets/src/mage/cards/g/GisaTheHellraiser.java @@ -58,7 +58,7 @@ public final class GisaTheHellraiser extends CardImpl { this.addAbility(ability); // Whenever you commit a crime, create two tapped 2/2 blue and black Zombie Rogue creature tokens. This ability triggers only once each turn. - ability = new CommittedCrimeTriggeredAbility(new CreateTokenEffect(new ZombieRogueToken(), 2, true)).setTriggersOnceEachTurn(true); + ability = new CommittedCrimeTriggeredAbility(new CreateTokenEffect(new ZombieRogueToken(), 2, true)).setTriggersLimitEachTurn(1); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GloinDwarfEmissary.java b/Mage.Sets/src/mage/cards/g/GloinDwarfEmissary.java index 4008a05d87b..a305271e9a5 100644 --- a/Mage.Sets/src/mage/cards/g/GloinDwarfEmissary.java +++ b/Mage.Sets/src/mage/cards/g/GloinDwarfEmissary.java @@ -41,7 +41,7 @@ public final class GloinDwarfEmissary extends CardImpl { // Whenever you cast a historic spell, create a Treasure token. This ability triggers only once each turn. this.addAbility(new SpellCastControllerTriggeredAbility( new CreateTokenEffect(new TreasureToken()), filter, false - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); // {T}, Sacrifice a Treasure: Goad target creature. Ability ability = new SimpleActivatedAbility(new GoadTargetEffect(), new TapSourceCost()); diff --git a/Mage.Sets/src/mage/cards/h/HardbristleBandit.java b/Mage.Sets/src/mage/cards/h/HardbristleBandit.java index affcca3ef86..f022857538e 100644 --- a/Mage.Sets/src/mage/cards/h/HardbristleBandit.java +++ b/Mage.Sets/src/mage/cards/h/HardbristleBandit.java @@ -28,7 +28,7 @@ public final class HardbristleBandit extends CardImpl { this.addAbility(new AnyColorManaAbility()); // Whenever you commit a crime, untap Hardbristle Bandit. This ability triggers only once each turn. - this.addAbility(new CommittedCrimeTriggeredAbility(new UntapSourceEffect()).setTriggersOnceEachTurn(true)); + this.addAbility(new CommittedCrimeTriggeredAbility(new UntapSourceEffect()).setTriggersLimitEachTurn(1)); } private HardbristleBandit(final HardbristleBandit card) { diff --git a/Mage.Sets/src/mage/cards/h/HomicideInvestigator.java b/Mage.Sets/src/mage/cards/h/HomicideInvestigator.java index efa82a80337..cdb3ed80e7d 100644 --- a/Mage.Sets/src/mage/cards/h/HomicideInvestigator.java +++ b/Mage.Sets/src/mage/cards/h/HomicideInvestigator.java @@ -27,7 +27,7 @@ public final class HomicideInvestigator extends CardImpl { // Whenever one or more nontoken creatures you control die, investigate. This ability triggers only once each turn. this.addAbility(new DiesCreatureTriggeredAbility( new InvestigateEffect(), false, StaticFilters.FILTER_CONTROLLED_CREATURE_NON_TOKEN - ).setTriggerPhrase("Whenever one or more nontoken creatures you control die, ").setTriggersOnceEachTurn(true)); + ).setTriggerPhrase("Whenever one or more nontoken creatures you control die, ").setTriggersLimitEachTurn(1)); } private HomicideInvestigator(final HomicideInvestigator card) { diff --git a/Mage.Sets/src/mage/cards/h/HostileInvestigator.java b/Mage.Sets/src/mage/cards/h/HostileInvestigator.java index c474d559a80..d6317e97c64 100644 --- a/Mage.Sets/src/mage/cards/h/HostileInvestigator.java +++ b/Mage.Sets/src/mage/cards/h/HostileInvestigator.java @@ -36,7 +36,7 @@ public final class HostileInvestigator extends CardImpl { // Whenever one or more players discard one or more cards, investigate. This ability triggers only once each turn. this.addAbility(new DiscardCardPlayerTriggeredAbility(new InvestigateEffect(), false) .setTriggerPhrase("Whenever one or more players discard one or more cards, ") - .setTriggersOnceEachTurn(true)); + .setTriggersLimitEachTurn(1)); } private HostileInvestigator(final HostileInvestigator card) { diff --git a/Mage.Sets/src/mage/cards/i/IngeniousSmith.java b/Mage.Sets/src/mage/cards/i/IngeniousSmith.java index 4884910e824..109dbd3b1ee 100644 --- a/Mage.Sets/src/mage/cards/i/IngeniousSmith.java +++ b/Mage.Sets/src/mage/cards/i/IngeniousSmith.java @@ -41,7 +41,7 @@ public final class IngeniousSmith extends CardImpl { // This ability triggers only once each turn. this.addAbility(new EntersBattlefieldControlledTriggeredAbility( new AddCountersSourceEffect(CounterType.P1P1.createInstance()), filter - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); } private IngeniousSmith(final IngeniousSmith card) { diff --git a/Mage.Sets/src/mage/cards/j/JinGitaxiasProgressTyrant.java b/Mage.Sets/src/mage/cards/j/JinGitaxiasProgressTyrant.java index f79be07b680..bc797f7eeb0 100644 --- a/Mage.Sets/src/mage/cards/j/JinGitaxiasProgressTyrant.java +++ b/Mage.Sets/src/mage/cards/j/JinGitaxiasProgressTyrant.java @@ -44,12 +44,12 @@ public final class JinGitaxiasProgressTyrant extends CardImpl { this.addAbility(new SpellCastControllerTriggeredAbility( new CopyTargetStackObjectEffect().setText("copy that spell. You may choose new targets for the copy"), filter, false, SetTargetPointer.SPELL - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); // Whenever an opponent casts an artifact, instant, or sorcery spell, counter that spell. This ability triggers only once each turn. this.addAbility(new SpellCastOpponentTriggeredAbility( new JinGitaxiasProgressTyrantEffect(), filter, false - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); } private JinGitaxiasProgressTyrant(final JinGitaxiasProgressTyrant card) { diff --git a/Mage.Sets/src/mage/cards/k/KambalProfiteeringMayor.java b/Mage.Sets/src/mage/cards/k/KambalProfiteeringMayor.java index ae5d6c91e28..885dc2d0bf2 100644 --- a/Mage.Sets/src/mage/cards/k/KambalProfiteeringMayor.java +++ b/Mage.Sets/src/mage/cards/k/KambalProfiteeringMayor.java @@ -73,7 +73,7 @@ class KambalProfiteeringMayorTriggeredAbility extends TriggeredAbilityImpl { KambalProfiteeringMayorTriggeredAbility() { super(Zone.BATTLEFIELD, null); - this.setTriggersOnceEachTurn(true); + this.setTriggersLimitEachTurn(1); } private KambalProfiteeringMayorTriggeredAbility(final KambalProfiteeringMayorTriggeredAbility effect) { diff --git a/Mage.Sets/src/mage/cards/l/LazavFamiliarStranger.java b/Mage.Sets/src/mage/cards/l/LazavFamiliarStranger.java index 08b12088fb4..9389715569e 100644 --- a/Mage.Sets/src/mage/cards/l/LazavFamiliarStranger.java +++ b/Mage.Sets/src/mage/cards/l/LazavFamiliarStranger.java @@ -35,7 +35,7 @@ public final class LazavFamiliarStranger extends CardImpl { // Whenever you commit a crime, put a +1/+1 counter on Lazav, Familiar Stranger. Then you may exile a card from a graveyard. If a creature card was exiled this way, you may have Lazav become a copy of that card until end of turn. This ability triggers only once each turn. Ability ability = new CommittedCrimeTriggeredAbility( new AddCountersSourceEffect(CounterType.P1P1.createInstance()) - ).setTriggersOnceEachTurn(true); + ).setTriggersLimitEachTurn(1); ability.addEffect(new LazavFamiliarStrangerEffect()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/l/LosheelClockworkScholar.java b/Mage.Sets/src/mage/cards/l/LosheelClockworkScholar.java index 143f5692736..de570733b88 100644 --- a/Mage.Sets/src/mage/cards/l/LosheelClockworkScholar.java +++ b/Mage.Sets/src/mage/cards/l/LosheelClockworkScholar.java @@ -47,7 +47,7 @@ public final class LosheelClockworkScholar extends CardImpl { // Whenever one or more artifact creatures enter the battlefield under your control, draw a card. This ability triggers only once each turn. this.addAbility(new EntersBattlefieldControlledTriggeredAbility( new DrawCardSourceControllerEffect(1), filter2 - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); } private LosheelClockworkScholar(final LosheelClockworkScholar card) { diff --git a/Mage.Sets/src/mage/cards/m/MagdaTheHoardmaster.java b/Mage.Sets/src/mage/cards/m/MagdaTheHoardmaster.java index 28e11f98f24..607e61f4358 100644 --- a/Mage.Sets/src/mage/cards/m/MagdaTheHoardmaster.java +++ b/Mage.Sets/src/mage/cards/m/MagdaTheHoardmaster.java @@ -35,7 +35,7 @@ public final class MagdaTheHoardmaster extends CardImpl { // Whenever you commit a crime, create a tapped Treasure token. This ability triggers only once each turn. this.addAbility( new CommittedCrimeTriggeredAbility(new CreateTokenEffect(new TreasureToken(), 1, true)) - .setTriggersOnceEachTurn(true) + .setTriggersLimitEachTurn(1) ); // Sacrifice three Treasures: Create a 4/4 red Scorpion Dragon creature token with flying and haste. Activate only as a sorcery. diff --git a/Mage.Sets/src/mage/cards/m/MaraudingSphinx.java b/Mage.Sets/src/mage/cards/m/MaraudingSphinx.java index 13a830aeebf..fab0b1b5850 100644 --- a/Mage.Sets/src/mage/cards/m/MaraudingSphinx.java +++ b/Mage.Sets/src/mage/cards/m/MaraudingSphinx.java @@ -37,7 +37,7 @@ public final class MaraudingSphinx extends CardImpl { this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"), false)); // Whenever you commit a crime, surveil 2. This ability triggers only once each turn. - this.addAbility(new CommittedCrimeTriggeredAbility(new SurveilEffect(2), false).setTriggersOnceEachTurn(true)); + this.addAbility(new CommittedCrimeTriggeredAbility(new SurveilEffect(2), false).setTriggersLimitEachTurn(1)); } private MaraudingSphinx(final MaraudingSphinx card) { diff --git a/Mage.Sets/src/mage/cards/m/MerryWardenOfIsengard.java b/Mage.Sets/src/mage/cards/m/MerryWardenOfIsengard.java index a2eb4ecb394..0a79ac0d7bc 100644 --- a/Mage.Sets/src/mage/cards/m/MerryWardenOfIsengard.java +++ b/Mage.Sets/src/mage/cards/m/MerryWardenOfIsengard.java @@ -34,7 +34,7 @@ public final class MerryWardenOfIsengard extends CardImpl { // Whenever one or more artifacts enter the battlefield under your control, create a 1/1 white Soldier creature token with lifelink. This ability triggers only once each turn. this.addAbility(new EntersBattlefieldAllTriggeredAbility( new CreateTokenEffect(new SoldierLifelinkToken()), StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT - ).setTriggerPhrase("Whenever one or more artifacts enter the battlefield under your control, ").setTriggersOnceEachTurn(true)); + ).setTriggerPhrase("Whenever one or more artifacts enter the battlefield under your control, ").setTriggersLimitEachTurn(1)); } private MerryWardenOfIsengard(final MerryWardenOfIsengard card) { diff --git a/Mage.Sets/src/mage/cards/m/MirelurkQueen.java b/Mage.Sets/src/mage/cards/m/MirelurkQueen.java index a5895ac6cc9..0eed33e909b 100644 --- a/Mage.Sets/src/mage/cards/m/MirelurkQueen.java +++ b/Mage.Sets/src/mage/cards/m/MirelurkQueen.java @@ -49,7 +49,7 @@ public final class MirelurkQueen extends CardImpl { new AddCountersSourceEffect(CounterType.P1P1.createInstance()) .concatBy(", then") ); - triggeredAbility.setTriggersOnceEachTurn(true); + triggeredAbility.setTriggersLimitEachTurn(1); this.addAbility(triggeredAbility); } diff --git a/Mage.Sets/src/mage/cards/m/MirrorShieldHoplite.java b/Mage.Sets/src/mage/cards/m/MirrorShieldHoplite.java index 9dd7d68be5b..b58e6faf088 100644 --- a/Mage.Sets/src/mage/cards/m/MirrorShieldHoplite.java +++ b/Mage.Sets/src/mage/cards/m/MirrorShieldHoplite.java @@ -52,7 +52,7 @@ class MirrorShieldHopliteTriggeredAbility extends TriggeredAbilityImpl { MirrorShieldHopliteTriggeredAbility() { super(Zone.BATTLEFIELD, new CopyStackObjectEffect()); this.setTriggerPhrase("Whenever a creature you control becomes the target of a backup ability, "); - this.setTriggersOnceEachTurn(true); + this.setTriggersLimitEachTurn(1); } private MirrorShieldHopliteTriggeredAbility(final MirrorShieldHopliteTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/m/MishraExcavationProdigy.java b/Mage.Sets/src/mage/cards/m/MishraExcavationProdigy.java index 4fcec487a77..98057b12d5c 100644 --- a/Mage.Sets/src/mage/cards/m/MishraExcavationProdigy.java +++ b/Mage.Sets/src/mage/cards/m/MishraExcavationProdigy.java @@ -49,7 +49,7 @@ public final class MishraExcavationProdigy extends CardImpl { // Whenever you discard one or more artifact cards, add {R}{R}. This ability triggers only once each turn. this.addAbility(new DiscardCardControllerTriggeredAbility( new BasicManaEffect(Mana.RedMana(2)), false, filter - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); } private MishraExcavationProdigy(final MishraExcavationProdigy card) { diff --git a/Mage.Sets/src/mage/cards/m/MorbidOpportunist.java b/Mage.Sets/src/mage/cards/m/MorbidOpportunist.java index dbc01cd18ae..8668468ee55 100644 --- a/Mage.Sets/src/mage/cards/m/MorbidOpportunist.java +++ b/Mage.Sets/src/mage/cards/m/MorbidOpportunist.java @@ -26,7 +26,7 @@ public final class MorbidOpportunist extends CardImpl { // Whenever one or more other creatures die, draw a card. This ability triggers only once each turn. this.addAbility(new DiesCreatureTriggeredAbility( new DrawCardSourceControllerEffect(1), false, true - ).setTriggerPhrase("Whenever one or more other creatures die, ").setTriggersOnceEachTurn(true)); + ).setTriggerPhrase("Whenever one or more other creatures die, ").setTriggersLimitEachTurn(1)); } private MorbidOpportunist(final MorbidOpportunist card) { diff --git a/Mage.Sets/src/mage/cards/n/NaduWingedWisdom.java b/Mage.Sets/src/mage/cards/n/NaduWingedWisdom.java new file mode 100644 index 00000000000..035402f27cf --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NaduWingedWisdom.java @@ -0,0 +1,56 @@ +package mage.cards.n; + +import mage.MageInt; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BecomesTargetSourceTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.RevealTopLandToBattlefieldElseHandEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class NaduWingedWisdom extends CardImpl { + + public NaduWingedWisdom(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{U}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.BIRD); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Creatures you control have "Whenever this creature becomes the target of a spell or ability, reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand. This ability triggers only twice each turn." + TriggeredAbility trigger = new BecomesTargetSourceTriggeredAbility( + new RevealTopLandToBattlefieldElseHandEffect("it") + ); + trigger.setTriggersLimitEachTurn(2); + trigger.setTriggerPhrase("Whenever this creature becomes the target of a spell or ability, "); + this.addAbility(new SimpleStaticAbility( + new GainAbilityControlledEffect(trigger, Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES) + )); + } + + private NaduWingedWisdom(final NaduWingedWisdom card) { + super(card); + } + + @Override + public NaduWingedWisdom copy() { + return new NaduWingedWisdom(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/n/NeeraWildMage.java b/Mage.Sets/src/mage/cards/n/NeeraWildMage.java index be4bf5d1b04..d3f43d2d202 100644 --- a/Mage.Sets/src/mage/cards/n/NeeraWildMage.java +++ b/Mage.Sets/src/mage/cards/n/NeeraWildMage.java @@ -36,7 +36,7 @@ public final class NeeraWildMage extends CardImpl { this.addAbility(new SpellCastControllerTriggeredAbility( new NeeraWildMageEffect(), StaticFilters.FILTER_SPELL_A, true, SetTargetPointer.SPELL - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); } private NeeraWildMage(final NeeraWildMage card) { diff --git a/Mage.Sets/src/mage/cards/n/NimrodelWatcher.java b/Mage.Sets/src/mage/cards/n/NimrodelWatcher.java index 12e508024b7..533c1fd8101 100644 --- a/Mage.Sets/src/mage/cards/n/NimrodelWatcher.java +++ b/Mage.Sets/src/mage/cards/n/NimrodelWatcher.java @@ -29,7 +29,7 @@ public final class NimrodelWatcher extends CardImpl { // Whenever you scry, Nimrodel Watcher gets +1/+0 until end of turn and can't be blocked this turn. This ability triggers only once each turn. Ability ability = new ScryTriggeredAbility(new BoostSourceEffect( 1, 0, Duration.EndOfTurn - )).setTriggersOnceEachTurn(true); + )).setTriggersLimitEachTurn(1); ability.addEffect(new CantBeBlockedSourceEffect(Duration.EndOfTurn) .setText("and can't be blocked this turn")); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/o/OniCultAnvil.java b/Mage.Sets/src/mage/cards/o/OniCultAnvil.java index 48d668332d6..7b13c92accb 100644 --- a/Mage.Sets/src/mage/cards/o/OniCultAnvil.java +++ b/Mage.Sets/src/mage/cards/o/OniCultAnvil.java @@ -23,7 +23,6 @@ import mage.game.permanent.Permanent; import mage.game.permanent.token.ConstructToken; /** - * * @author weirddan455 */ public final class OniCultAnvil extends CardImpl { @@ -55,7 +54,7 @@ class OniCultAnvilTriggeredAbility extends TriggeredAbilityImpl { public OniCultAnvilTriggeredAbility() { super(Zone.BATTLEFIELD, new CreateTokenEffect(new ConstructToken())); - this.setTriggersOnceEachTurn(true); + this.setTriggersLimitEachTurn(1); setTriggerPhrase("Whenever one or more artifacts you control leave the battlefield during your turn, "); } diff --git a/Mage.Sets/src/mage/cards/p/PoeticIngenuity.java b/Mage.Sets/src/mage/cards/p/PoeticIngenuity.java index 1eaba72f247..6c72331beb5 100644 --- a/Mage.Sets/src/mage/cards/p/PoeticIngenuity.java +++ b/Mage.Sets/src/mage/cards/p/PoeticIngenuity.java @@ -39,7 +39,7 @@ public final class PoeticIngenuity extends CardImpl { new CreateTokenEffect(new Dinosaur31Token()), StaticFilters.FILTER_SPELL_AN_ARTIFACT, false - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); } private PoeticIngenuity(final PoeticIngenuity card) { diff --git a/Mage.Sets/src/mage/cards/r/RatchetRescueRacer.java b/Mage.Sets/src/mage/cards/r/RatchetRescueRacer.java index b77c6bee274..2d56d3c98e7 100644 --- a/Mage.Sets/src/mage/cards/r/RatchetRescueRacer.java +++ b/Mage.Sets/src/mage/cards/r/RatchetRescueRacer.java @@ -47,7 +47,7 @@ public final class RatchetRescueRacer extends CardImpl { this.addAbility(new DiesCreatureTriggeredAbility( new TransformSourceEffect().setText("convert {this}"), false, filter ).setTriggerPhrase("Whenever one or more nontoken artifacts you control " + - "are put into a graveyard from the battlefield, ").setTriggersOnceEachTurn(true)); + "are put into a graveyard from the battlefield, ").setTriggersLimitEachTurn(1)); } private RatchetRescueRacer(final RatchetRescueRacer card) { diff --git a/Mage.Sets/src/mage/cards/r/RavenOfFellOmens.java b/Mage.Sets/src/mage/cards/r/RavenOfFellOmens.java index 3f7bb48525c..ae20ffa7d35 100644 --- a/Mage.Sets/src/mage/cards/r/RavenOfFellOmens.java +++ b/Mage.Sets/src/mage/cards/r/RavenOfFellOmens.java @@ -29,7 +29,7 @@ public final class RavenOfFellOmens extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever you commit a crime, each opponent loses 1 life and you gain 1 life. This ability triggers only once each turn. - Ability ability = new CommittedCrimeTriggeredAbility(new LoseLifeOpponentsEffect(1)).setTriggersOnceEachTurn(true); + Ability ability = new CommittedCrimeTriggeredAbility(new LoseLifeOpponentsEffect(1)).setTriggersLimitEachTurn(1); ability.addEffect(new GainLifeEffect(1).concatBy("and")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SallySparrow.java b/Mage.Sets/src/mage/cards/s/SallySparrow.java index a2b62045c80..91fdf0783e9 100644 --- a/Mage.Sets/src/mage/cards/s/SallySparrow.java +++ b/Mage.Sets/src/mage/cards/s/SallySparrow.java @@ -39,7 +39,7 @@ public final class SallySparrow extends CardImpl { // Whenever one or more other creatures you control leave the battlefield, investigate. This ability triggers only once each turn. this.addAbility(new LeavesBattlefieldAllTriggeredAbility( new InvestigateEffect(), StaticFilters.FILTER_OTHER_CONTROLLED_CREATURES - ).setTriggersOnceEachTurn(true) + ).setTriggersLimitEachTurn(1) .setTriggerPhrase("Whenever one or more other creatures you control leave the battlefield, ")); } diff --git a/Mage.Sets/src/mage/cards/s/SandScout.java b/Mage.Sets/src/mage/cards/s/SandScout.java index 71d14bd9fa4..9421e2f0245 100644 --- a/Mage.Sets/src/mage/cards/s/SandScout.java +++ b/Mage.Sets/src/mage/cards/s/SandScout.java @@ -51,7 +51,7 @@ public final class SandScout extends CardImpl { // Whenever one or more land cards are put into your graveyard from anywhere, create a 1/1 red, green, and white Sand Warrior creature token. This ability triggers only once each turn. this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility( new CreateTokenEffect(new HazezonTamarSandWarriorToken()), false, StaticFilters.FILTER_CARD_LAND, TargetController.YOU - ).setTriggerPhrase("Whenever one or more land cards are put into your graveyard from anywhere, ").setTriggersOnceEachTurn(true)); + ).setTriggerPhrase("Whenever one or more land cards are put into your graveyard from anywhere, ").setTriggersLimitEachTurn(1)); } private SandScout(final SandScout card) { diff --git a/Mage.Sets/src/mage/cards/s/SarahJaneSmith.java b/Mage.Sets/src/mage/cards/s/SarahJaneSmith.java index e8a3241d997..7e7144c1c9e 100644 --- a/Mage.Sets/src/mage/cards/s/SarahJaneSmith.java +++ b/Mage.Sets/src/mage/cards/s/SarahJaneSmith.java @@ -33,7 +33,7 @@ public final class SarahJaneSmith extends CardImpl { // Whenever you cast a historic spell, investigate. This ability triggers only once each turn. this.addAbility(new SpellCastControllerTriggeredAbility( new InvestigateEffect(), filter, false - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); // Doctor's companion this.addAbility(DoctorsCompanionAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/s/SatoruUmezawa.java b/Mage.Sets/src/mage/cards/s/SatoruUmezawa.java index 622bda00cbb..e285aa4d8ee 100644 --- a/Mage.Sets/src/mage/cards/s/SatoruUmezawa.java +++ b/Mage.Sets/src/mage/cards/s/SatoruUmezawa.java @@ -56,7 +56,7 @@ class SatoruUmezawaTriggeredAbility extends TriggeredAbilityImpl { SatoruUmezawaTriggeredAbility() { super(Zone.BATTLEFIELD, new LookLibraryAndPickControllerEffect(3, 1, PutCards.HAND, PutCards.BOTTOM_ANY)); - this.setTriggersOnceEachTurn(true); + this.setTriggersLimitEachTurn(1); setTriggerPhrase("Whenever you activate a ninjutsu ability, "); } diff --git a/Mage.Sets/src/mage/cards/s/SefrisOfTheHiddenWays.java b/Mage.Sets/src/mage/cards/s/SefrisOfTheHiddenWays.java index 45235d7b3e0..b68dcce7311 100644 --- a/Mage.Sets/src/mage/cards/s/SefrisOfTheHiddenWays.java +++ b/Mage.Sets/src/mage/cards/s/SefrisOfTheHiddenWays.java @@ -38,7 +38,7 @@ public final class SefrisOfTheHiddenWays extends CardImpl { // Whenever one or more creature cards are put into your graveyard from anywhere, venture into the dungeon. This ability triggers only once each turn. this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility( new VentureIntoTheDungeonEffect(), false, filter, TargetController.YOU - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); // Create Undead — Whenever you complete a dungeon, return target creature card from your graveyard to the battlefield. Ability ability = new CompletedDungeonTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect()); diff --git a/Mage.Sets/src/mage/cards/s/SengirConnoisseur.java b/Mage.Sets/src/mage/cards/s/SengirConnoisseur.java index 2faa99d9b1a..2621e029260 100644 --- a/Mage.Sets/src/mage/cards/s/SengirConnoisseur.java +++ b/Mage.Sets/src/mage/cards/s/SengirConnoisseur.java @@ -37,7 +37,7 @@ public final class SengirConnoisseur extends CardImpl { // Whenever one or more other creatures die, put a +1/+1 counter on Sengir Connoisseur. This ability triggers only once each turn. this.addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, filter) - .setTriggersOnceEachTurn(true)); + .setTriggersLimitEachTurn(1)); } private SengirConnoisseur(final SengirConnoisseur card) { diff --git a/Mage.Sets/src/mage/cards/s/SharaeOfNumbingDepths.java b/Mage.Sets/src/mage/cards/s/SharaeOfNumbingDepths.java index 0580bed6c49..23bfd48086f 100644 --- a/Mage.Sets/src/mage/cards/s/SharaeOfNumbingDepths.java +++ b/Mage.Sets/src/mage/cards/s/SharaeOfNumbingDepths.java @@ -61,7 +61,7 @@ class SharaeOfNumbingDepthsTriggeredAbility extends TriggeredAbilityImpl { SharaeOfNumbingDepthsTriggeredAbility() { super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1)); - this.setTriggersOnceEachTurn(true); + this.setTriggersLimitEachTurn(1); setTriggerPhrase("Whenever you tap one or more untapped creatures your opponents control, "); } diff --git a/Mage.Sets/src/mage/cards/s/SpitefulBanditry.java b/Mage.Sets/src/mage/cards/s/SpitefulBanditry.java index 9544cf9905f..f1bdf523696 100644 --- a/Mage.Sets/src/mage/cards/s/SpitefulBanditry.java +++ b/Mage.Sets/src/mage/cards/s/SpitefulBanditry.java @@ -31,7 +31,7 @@ public final class SpitefulBanditry extends CardImpl { new CreateTokenEffect(new TreasureToken()) .setText("you create a Treasure token"), false, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE - ).setTriggerPhrase("Whenever one or more creatures your opponents control die, ").setTriggersOnceEachTurn(true)); + ).setTriggerPhrase("Whenever one or more creatures your opponents control die, ").setTriggersLimitEachTurn(1)); } private SpitefulBanditry(final SpitefulBanditry card) { diff --git a/Mage.Sets/src/mage/cards/s/StonebindersFamiliar.java b/Mage.Sets/src/mage/cards/s/StonebindersFamiliar.java index fdad6df23ce..f7d143b8fd6 100644 --- a/Mage.Sets/src/mage/cards/s/StonebindersFamiliar.java +++ b/Mage.Sets/src/mage/cards/s/StonebindersFamiliar.java @@ -47,7 +47,7 @@ class StonebindersFamiliarTriggeredAbility extends TriggeredAbilityImpl { StonebindersFamiliarTriggeredAbility() { super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance())); - this.setTriggersOnceEachTurn(true); + this.setTriggersLimitEachTurn(1); } private StonebindersFamiliarTriggeredAbility(final StonebindersFamiliarTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/t/TameshiRealityArchitect.java b/Mage.Sets/src/mage/cards/t/TameshiRealityArchitect.java index e225818bf05..6ac1c25bc9e 100644 --- a/Mage.Sets/src/mage/cards/t/TameshiRealityArchitect.java +++ b/Mage.Sets/src/mage/cards/t/TameshiRealityArchitect.java @@ -44,7 +44,7 @@ public final class TameshiRealityArchitect extends CardImpl { // Whenever one or more noncreature permanents are returned to hand, draw a card. This ability triggers only once each turn. this.addAbility(new ZoneChangeAllTriggeredAbility(Zone.BATTLEFIELD, Zone.BATTLEFIELD, Zone.HAND, new DrawCardSourceControllerEffect(1), filter, - "Whenever one or more noncreature permanents are returned to hand, ", false).setTriggersOnceEachTurn(true)); + "Whenever one or more noncreature permanents are returned to hand, ", false).setTriggersLimitEachTurn(1)); // {X}{W}, Return a land you control to its owner's hand: Return target artifact or enchantment card with mana value X or less from your graveyard to the battlefield. Activate only as a sorcery. Ability ability = new ActivateAsSorceryActivatedAbility( diff --git a/Mage.Sets/src/mage/cards/t/TeysaOpulentOligarch.java b/Mage.Sets/src/mage/cards/t/TeysaOpulentOligarch.java index 7e55f21d57f..1af05a3e987 100644 --- a/Mage.Sets/src/mage/cards/t/TeysaOpulentOligarch.java +++ b/Mage.Sets/src/mage/cards/t/TeysaOpulentOligarch.java @@ -67,7 +67,7 @@ public final class TeysaOpulentOligarch extends CardImpl { "Whenever a Clue you control is put into a graveyard from the battlefield, ", false ); - trigger.setTriggersOnceEachTurn(true); + trigger.setTriggersLimitEachTurn(1); this.addAbility(trigger); } diff --git a/Mage.Sets/src/mage/cards/t/TheSixthDoctor.java b/Mage.Sets/src/mage/cards/t/TheSixthDoctor.java index 58dbf8da591..fc57d5cdee9 100644 --- a/Mage.Sets/src/mage/cards/t/TheSixthDoctor.java +++ b/Mage.Sets/src/mage/cards/t/TheSixthDoctor.java @@ -43,7 +43,7 @@ public final class TheSixthDoctor extends CardImpl { new RemoveTypeCopyApplier(SuperType.LEGENDARY) ).setText("copy it, except the copy isn't legendary"), filter, false, SetTargetPointer.SPELL - ).setTriggersOnceEachTurn(true).withFlavorWord("Time Lord's Prerogative") + ).setTriggersLimitEachTurn(1).withFlavorWord("Time Lord's Prerogative") ); } diff --git a/Mage.Sets/src/mage/cards/t/ThopterShop.java b/Mage.Sets/src/mage/cards/t/ThopterShop.java index 669e2ef3fc3..5bad8edd969 100644 --- a/Mage.Sets/src/mage/cards/t/ThopterShop.java +++ b/Mage.Sets/src/mage/cards/t/ThopterShop.java @@ -33,7 +33,7 @@ public final class ThopterShop extends CardImpl { // Whenever one or more artifact creatures you control die, draw a card. This ability triggers only once each turn. this.addAbility(new DiesCreatureTriggeredAbility( new DrawCardSourceControllerEffect(1), false, filter - ).setTriggersOnceEachTurn(true).setTriggerPhrase("Whenever one or more artifact creatures you control die, ")); + ).setTriggersLimitEachTurn(1).setTriggerPhrase("Whenever one or more artifact creatures you control die, ")); // {2}{W}, {T}: Create a 1/1 colorless Thopter artifact creature token with flying. Ability ability = new SimpleActivatedAbility( diff --git a/Mage.Sets/src/mage/cards/t/TocasiasWelcome.java b/Mage.Sets/src/mage/cards/t/TocasiasWelcome.java index 8dfd0bbe70b..3afaf39fb34 100644 --- a/Mage.Sets/src/mage/cards/t/TocasiasWelcome.java +++ b/Mage.Sets/src/mage/cards/t/TocasiasWelcome.java @@ -29,7 +29,7 @@ public final class TocasiasWelcome extends CardImpl { // Whenever one or more creatures with mana value 3 or less enter the battlefield under your control, draw a card. This ability triggers only once each turn. this.addAbility(new EntersBattlefieldControlledTriggeredAbility( new DrawCardSourceControllerEffect(1), filter - ).setTriggersOnceEachTurn(true).setTriggerPhrase("Whenever one or more creatures with mana value 3 " + + ).setTriggersLimitEachTurn(1).setTriggerPhrase("Whenever one or more creatures with mana value 3 " + "or less enter the battlefield under your control, ")); } diff --git a/Mage.Sets/src/mage/cards/t/TomBombadil.java b/Mage.Sets/src/mage/cards/t/TomBombadil.java index 0bba564b6e6..7a2f42b74cf 100644 --- a/Mage.Sets/src/mage/cards/t/TomBombadil.java +++ b/Mage.Sets/src/mage/cards/t/TomBombadil.java @@ -50,7 +50,7 @@ public final class TomBombadil extends CardImpl { this.addAbility(ability.addHint(hint)); // Whenever the final chapter ability of a Saga you control resolves, reveal cards from the top of your library until you reveal a Saga card. Put that card onto the battlefield and the rest on the bottom of your library in a random order. This ability triggers only once each turn. - this.addAbility(new FinalChapterAbilityResolvesTriggeredAbility(new TomBombadilEffect()).setTriggersOnceEachTurn(true)); + this.addAbility(new FinalChapterAbilityResolvesTriggeredAbility(new TomBombadilEffect()).setTriggersLimitEachTurn(1)); } private TomBombadil(final TomBombadil card) { diff --git a/Mage.Sets/src/mage/cards/t/TyvarTheBellicose.java b/Mage.Sets/src/mage/cards/t/TyvarTheBellicose.java index 189d1aa66b6..ad65509206b 100644 --- a/Mage.Sets/src/mage/cards/t/TyvarTheBellicose.java +++ b/Mage.Sets/src/mage/cards/t/TyvarTheBellicose.java @@ -73,7 +73,7 @@ class TyvarTheBellicoseTriggeredAbility extends TriggeredAbilityImpl { super(Zone.BATTLEFIELD, new AddCountersSourceEffect( CounterType.P1P1.createInstance(0), SavedDamageValue.MANY, false )); - this.setTriggersOnceEachTurn(true); + this.setTriggersLimitEachTurn(1); } private TyvarTheBellicoseTriggeredAbility(final TyvarTheBellicoseTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/u/UrzaPowerstoneProdigy.java b/Mage.Sets/src/mage/cards/u/UrzaPowerstoneProdigy.java index f989c225f1d..48d569820c7 100644 --- a/Mage.Sets/src/mage/cards/u/UrzaPowerstoneProdigy.java +++ b/Mage.Sets/src/mage/cards/u/UrzaPowerstoneProdigy.java @@ -49,7 +49,7 @@ public final class UrzaPowerstoneProdigy extends CardImpl { // Whenever you discard one or more artifact cards, create a tapped Powerstone token. This ability triggers only once each turn. this.addAbility(new DiscardCardControllerTriggeredAbility( new CreateTokenEffect(new PowerstoneToken(), 1, true), false, filter - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); } private UrzaPowerstoneProdigy(final UrzaPowerstoneProdigy card) { diff --git a/Mage.Sets/src/mage/cards/v/VadmirNewBlood.java b/Mage.Sets/src/mage/cards/v/VadmirNewBlood.java index 7a5eaccf8cc..63212c2515f 100644 --- a/Mage.Sets/src/mage/cards/v/VadmirNewBlood.java +++ b/Mage.Sets/src/mage/cards/v/VadmirNewBlood.java @@ -39,7 +39,7 @@ public final class VadmirNewBlood extends CardImpl { // Whenever you commit a crime, put a +1/+1 counter on Vadmir, New Blood. This ability triggers only once each turn. this.addAbility(new CommittedCrimeTriggeredAbility( new AddCountersSourceEffect(CounterType.P1P1.createInstance()) - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); // As long as Vadmir has four or more +1/+1 counters on it, it has menace and lifelink. Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(new GainAbilitySourceEffect( diff --git a/Mage.Sets/src/mage/cards/v/VarisSilverymoonRanger.java b/Mage.Sets/src/mage/cards/v/VarisSilverymoonRanger.java index 4c70d4b5a0b..636e004bd05 100644 --- a/Mage.Sets/src/mage/cards/v/VarisSilverymoonRanger.java +++ b/Mage.Sets/src/mage/cards/v/VarisSilverymoonRanger.java @@ -52,7 +52,7 @@ public final class VarisSilverymoonRanger extends CardImpl { // Whenever you cast a creature or planeswalker spell, venture into the dungeon. This ability triggers only once each turn. this.addAbility(new SpellCastControllerTriggeredAbility( new VentureIntoTheDungeonEffect(), filter, false - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); // Whenever you complete a dungeon, create a 2/2 green Wolf creature token. this.addAbility(new CompletedDungeonTriggeredAbility(new CreateTokenEffect(new WolfToken()))); diff --git a/Mage.Sets/src/mage/cards/v/VraanExecutionerThane.java b/Mage.Sets/src/mage/cards/v/VraanExecutionerThane.java index 14f2b1a67b4..d11f72f03ae 100644 --- a/Mage.Sets/src/mage/cards/v/VraanExecutionerThane.java +++ b/Mage.Sets/src/mage/cards/v/VraanExecutionerThane.java @@ -32,7 +32,7 @@ public final class VraanExecutionerThane extends CardImpl { Ability ability = new DiesCreatureTriggeredAbility( new LoseLifeOpponentsEffect(2), false, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE - ).setTriggerPhrase("Whenever one or more other creatures you control die, ").setTriggersOnceEachTurn(true); + ).setTriggerPhrase("Whenever one or more other creatures you control die, ").setTriggersLimitEachTurn(1); ability.addEffect(new GainLifeEffect(2).concatBy("and")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/w/WelcomingVampire.java b/Mage.Sets/src/mage/cards/w/WelcomingVampire.java index 82e6d1f315e..6d9e0038ae8 100644 --- a/Mage.Sets/src/mage/cards/w/WelcomingVampire.java +++ b/Mage.Sets/src/mage/cards/w/WelcomingVampire.java @@ -38,7 +38,7 @@ public final class WelcomingVampire extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever one or more other creatures with power 2 or less enter the battlefield under your control, draw a card. This ability triggers only once each turn. - this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new DrawCardSourceControllerEffect(1), filter).setTriggersOnceEachTurn(true)); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new DrawCardSourceControllerEffect(1), filter).setTriggersLimitEachTurn(1)); } private WelcomingVampire(final WelcomingVampire card) { diff --git a/Mage.Sets/src/mage/cards/w/WellRested.java b/Mage.Sets/src/mage/cards/w/WellRested.java index 614569015af..5c193710f4f 100644 --- a/Mage.Sets/src/mage/cards/w/WellRested.java +++ b/Mage.Sets/src/mage/cards/w/WellRested.java @@ -42,7 +42,7 @@ public final class WellRested extends CardImpl { new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)), false, false); gainedAbility.addEffect(new GainLifeEffect(2).concatBy(", then")); gainedAbility.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and")); - gainedAbility.setTriggersOnceEachTurn(true); + gainedAbility.setTriggersLimitEachTurn(1); this.addAbility(new SimpleStaticAbility(new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA) .setText("Enchanted creature has \"Whenever this creature becomes untapped, " + diff --git a/Mage.Sets/src/mage/cards/w/WhisperingWizard.java b/Mage.Sets/src/mage/cards/w/WhisperingWizard.java index d01cbfb9255..c28d817b2f2 100644 --- a/Mage.Sets/src/mage/cards/w/WhisperingWizard.java +++ b/Mage.Sets/src/mage/cards/w/WhisperingWizard.java @@ -29,7 +29,7 @@ public final class WhisperingWizard extends CardImpl { this.addAbility(new SpellCastControllerTriggeredAbility( new CreateTokenEffect(new SpiritWhiteToken()), StaticFilters.FILTER_SPELL_A_NON_CREATURE, false - ).setTriggersOnceEachTurn(true)); + ).setTriggersLimitEachTurn(1)); } private WhisperingWizard(final WhisperingWizard card) { diff --git a/Mage.Sets/src/mage/sets/ModernHorizons3.java b/Mage.Sets/src/mage/sets/ModernHorizons3.java index e86ae1dc9ca..ecc55cf13c7 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons3.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons3.java @@ -98,6 +98,7 @@ public final class ModernHorizons3 extends ExpansionSet { cards.add(new SetCardInfo("Mindless Conscription", 101, Rarity.UNCOMMON, mage.cards.m.MindlessConscription.class)); cards.add(new SetCardInfo("Mogg Mob", 127, Rarity.UNCOMMON, mage.cards.m.MoggMob.class)); cards.add(new SetCardInfo("Mountain", 307, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Nadu, Winged Wisdom", 193, Rarity.RARE, mage.cards.n.NaduWingedWisdom.class)); cards.add(new SetCardInfo("Nethergoyf", 103, Rarity.MYTHIC, mage.cards.n.Nethergoyf.class)); cards.add(new SetCardInfo("Null Elemental Blast", 12, Rarity.UNCOMMON, mage.cards.n.NullElementalBlast.class)); cards.add(new SetCardInfo("Nulldrifter", 13, Rarity.RARE, mage.cards.n.Nulldrifter.class)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/NaduWingedWisdomTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/NaduWingedWisdomTest.java new file mode 100644 index 00000000000..b9838143c84 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/NaduWingedWisdomTest.java @@ -0,0 +1,102 @@ +package org.mage.test.cards.single.mh3; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author Susucr + */ +public class NaduWingedWisdomTest extends CardTestPlayerBase { + + /** + * {@link mage.cards.n.NaduWingedWisdom Nadu, Winged Wisdom} {1}{G}{U} + * Legendary Creature — Bird Wizard + * Flying + * Creatures you control have “Whenever this creature becomes the target of a spell or ability, reveal the top card of your library. If it’s a land card, put it onto the battlefield. Otherwise, put it into your hand. This ability triggers only twice each turn.” + * 3/4 + */ + private static final String nadu = "Nadu, Winged Wisdom"; + + @Test + public void test_Simple() { + setStrictChooseMode(true); + skipInitShuffling(); + + addCard(Zone.BATTLEFIELD, playerA, nadu); + addCard(Zone.BATTLEFIELD, playerA, "Shuko"); // Equip {0} + addCard(Zone.LIBRARY, playerA, "Forest", 1); + addCard(Zone.LIBRARY, playerA, "Grizzly Bears", 1); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {0}", nadu); + waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {0}", nadu); + waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {0}", nadu); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertHandCount(playerA, 1); + assertHandCount(playerA, "Grizzly Bears", 1); + assertPermanentCount(playerA, 3); + assertPermanentCount(playerA, "Forest", 1); + } + + @Test + public void test_AnotherCreature_SeparateCount() { + setStrictChooseMode(true); + skipInitShuffling(); + + addCard(Zone.BATTLEFIELD, playerA, nadu); + addCard(Zone.BATTLEFIELD, playerA, "Shuko"); // Equip {0} + addCard(Zone.BATTLEFIELD, playerA, "Elite Vanguard", 1); + addCard(Zone.LIBRARY, playerA, "Forest", 2); + addCard(Zone.LIBRARY, playerA, "Grizzly Bears", 2); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {0}", nadu); + waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {0}", "Elite Vanguard"); + waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {0}", nadu); + waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {0}", "Elite Vanguard"); + waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {0}", nadu); + waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {0}", "Elite Vanguard"); + waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {0}", nadu); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertHandCount(playerA, 2); + assertHandCount(playerA, "Grizzly Bears", 2); + assertPermanentCount(playerA, 5); + assertPermanentCount(playerA, "Forest", 2); + } + + @Test + public void test_CanTriggerMultipleAtSameTime() { + setStrictChooseMode(true); + skipInitShuffling(); + + addCard(Zone.BATTLEFIELD, playerA, nadu); + addCard(Zone.BATTLEFIELD, playerA, "Elite Vanguard", 1); + addCard(Zone.BATTLEFIELD, playerA, "Plateau", 2); + addCard(Zone.HAND, playerA, "Martial Glory"); // Target creature gets +3/+0 until end of turn. Target creature gets +0/+3 until end of turn. + addCard(Zone.LIBRARY, playerA, "Grizzly Bears", 2); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Martial Glory", nadu + "^Elite Vanguard"); + setChoice(playerA, "Whenever"); // trigger order + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertHandCount(playerA, 2); + assertHandCount(playerA, "Grizzly Bears", 2); + assertPermanentCount(playerA, 4); + } +} diff --git a/Mage/src/main/java/mage/abilities/TriggeredAbilities.java b/Mage/src/main/java/mage/abilities/TriggeredAbilities.java index d45f0482257..83bde214870 100644 --- a/Mage/src/main/java/mage/abilities/TriggeredAbilities.java +++ b/Mage/src/main/java/mage/abilities/TriggeredAbilities.java @@ -240,11 +240,11 @@ public class TriggeredAbilities extends LinkedHashMap } } - if (ability.checkTrigger(event, game) && ability.checkTriggeredAlready(game) && !ability.checkUsedAlready(game)) { + if (ability.checkTrigger(event, game) && ability.checkTriggeredLimit(game) && !ability.checkUsedAlready(game)) { NumberOfTriggersEvent numberOfTriggersEvent = new NumberOfTriggersEvent(ability, event); // event == null - state based triggers like StateTriggeredAbility, must be ignored for number event if (event == null || !game.replaceEvent(numberOfTriggersEvent, ability)) { - int numTriggers = ability.getTriggersOnceEachTurn() ? 1 : numberOfTriggersEvent.getAmount(); + int numTriggers = Integer.min(ability.getRemainingTriggersLimitEachTurn(game), numberOfTriggersEvent.getAmount()); for (int i = 0; i < numTriggers; i++) { if (this.enableIntegrityLogs) { logger.info("trigger will be USED: " + ability); diff --git a/Mage/src/main/java/mage/abilities/TriggeredAbility.java b/Mage/src/main/java/mage/abilities/TriggeredAbility.java index 92d0f3dcdd7..f2ce53a5fdc 100644 --- a/Mage/src/main/java/mage/abilities/TriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/TriggeredAbility.java @@ -27,13 +27,25 @@ public interface TriggeredAbility extends Ability { */ boolean checkTrigger(GameEvent event, Game game); - boolean checkTriggeredAlready(Game game); + /** + * If the trigger is limited per turn, check if it can trigger again or the limit is met. + * true if unlimited + */ + boolean checkTriggeredLimit(Game game); boolean checkUsedAlready(Game game); - TriggeredAbility setTriggersOnceEachTurn(boolean triggersOnce); + /** + * limit the number of triggers each turn + */ + TriggeredAbility setTriggersLimitEachTurn(int limit); - boolean getTriggersOnceEachTurn(); + /** + * Get the number of times the trigger may trigger this turn. + * e.g. 0, 1 or 2 for a trigger that is limited to trigger twice each turn. + * Integer.MAX_VALUE when no limit. + */ + int getRemainingTriggersLimitEachTurn(Game game); TriggeredAbility setDoOnlyOnceEachTurn(boolean doOnlyOnce); diff --git a/Mage/src/main/java/mage/abilities/TriggeredAbilityImpl.java b/Mage/src/main/java/mage/abilities/TriggeredAbilityImpl.java index c9a06b7fcf2..e8b86ed2040 100644 --- a/Mage/src/main/java/mage/abilities/TriggeredAbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/TriggeredAbilityImpl.java @@ -15,6 +15,7 @@ import mage.players.Player; import mage.util.CardUtil; import java.util.Locale; +import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -25,7 +26,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge private boolean optional; private boolean leavesTheBattlefieldTrigger; - private boolean triggersOnceEachTurn = false; + private int triggerLimitEachTurn = Integer.MAX_VALUE; // for "triggers only once|twice each turn" private boolean doOnlyOnceEachTurn = false; private boolean replaceRuleText = false; // if true, replace "{this}" with "it" in effect text private GameEvent triggerEvent = null; @@ -54,7 +55,7 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge super(ability); this.optional = ability.optional; this.leavesTheBattlefieldTrigger = ability.leavesTheBattlefieldTrigger; - this.triggersOnceEachTurn = ability.triggersOnceEachTurn; + this.triggerLimitEachTurn = ability.triggerLimitEachTurn; this.doOnlyOnceEachTurn = ability.doOnlyOnceEachTurn; this.replaceRuleText = ability.replaceRuleText; this.triggerEvent = ability.triggerEvent; @@ -70,13 +71,37 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge } } + // Used for triggers with a per-turn limit. + private String getKeyLastTurnTriggered(Game game) { + return CardUtil.getCardZoneString( + "lastTurnTriggered|" + getOriginalId(), getSourceId(), game + ); + } + + // Used for triggers with a per-turn limit. + private String getKeyLastTurnTriggeredCount(Game game) { + return CardUtil.getCardZoneString( + "lastTurnTriggeredCount|" + getOriginalId(), getSourceId(), game + ); + } + private void setLastTrigger(Game game) { - if (!triggersOnceEachTurn) { + if (triggerLimitEachTurn == Integer.MAX_VALUE) { return; } - game.getState().setValue(CardUtil.getCardZoneString( - "lastTurnTriggered" + getOriginalId(), sourceId, game - ), game.getTurnNum()); + String keyLastTurnTriggered = getKeyLastTurnTriggered(game); + String keyLastTurnTriggeredCount = getKeyLastTurnTriggeredCount(game); + Integer lastTurn = (Integer) game.getState().getValue(keyLastTurnTriggered); + int currentTurn = game.getTurnNum(); + if (lastTurn != null && lastTurn == currentTurn) { + // Ability already triggered this turn, incrementing the count. + int lastCount = Optional.ofNullable((Integer) game.getState().getValue(keyLastTurnTriggeredCount)).orElse(0); + game.getState().setValue(keyLastTurnTriggeredCount, lastCount + 1); + } else { + // first trigger for Ability this turn. + game.getState().setValue(keyLastTurnTriggered, currentTurn); + game.getState().setValue(keyLastTurnTriggeredCount, 1); + } } @Override @@ -96,14 +121,8 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge } @Override - public boolean checkTriggeredAlready(Game game) { - if (!triggersOnceEachTurn) { - return true; - } - Integer lastTurnTriggered = (Integer) game.getState().getValue( - CardUtil.getCardZoneString("lastTurnTriggered" + getOriginalId(), sourceId, game) - ); - return lastTurnTriggered == null || lastTurnTriggered != game.getTurnNum(); + public boolean checkTriggeredLimit(Game game) { + return getRemainingTriggersLimitEachTurn(game) > 0; } @Override @@ -118,14 +137,28 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge } @Override - public TriggeredAbility setTriggersOnceEachTurn(boolean triggersOnce) { - this.triggersOnceEachTurn = triggersOnce; + public TriggeredAbility setTriggersLimitEachTurn(int limit) { + this.triggerLimitEachTurn = limit; return this; } @Override - public boolean getTriggersOnceEachTurn() { - return this.triggersOnceEachTurn; + public int getRemainingTriggersLimitEachTurn(Game game) { + if (triggerLimitEachTurn == Integer.MAX_VALUE) { + return Integer.MAX_VALUE; + } + String keyLastTurnTriggered = getKeyLastTurnTriggered(game); + Integer lastTurn = (Integer) game.getState().getValue(keyLastTurnTriggered); + int currentTurn = game.getTurnNum(); + if (lastTurn != null && lastTurn == currentTurn) { + // Ability already triggered this turn, so returning the limit minus the count this turn + String keyLastTurnTriggeredCount = getKeyLastTurnTriggeredCount(game); + int count = Optional.ofNullable((Integer) game.getState().getValue(keyLastTurnTriggeredCount)).orElse(0); + return Math.max(0, triggerLimitEachTurn - count); + } else { + // Ability did not trigger this turn, so returning the limit + return triggerLimitEachTurn; + } } @Override @@ -229,8 +262,20 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge superRule = superRule.replaceFirst("^((?:you may )?sacrifice |(put|remove) [^ ]+ [^ ]+ counters? (on|from) |return |transform |untap |regenerate )?\\{this\\}", "$1it"); } sb.append(superRule); - if (triggersOnceEachTurn) { - sb.append(" This ability triggers only once each turn."); + if (triggerLimitEachTurn != Integer.MAX_VALUE) { + sb.append(" This ability triggers only "); + switch (triggerLimitEachTurn) { + case 1: + sb.append("once"); + break; + case 2: + sb.append("twice"); + break; + default: + // No card with that behavior yet, so feel free to change the text once one exist + sb.append(CardUtil.numberToText(triggerLimitEachTurn) + " times"); + } + sb.append(" each turn."); } if (doOnlyOnceEachTurn) { sb.append(" Do this only once each turn.");