diff --git a/Mage.Sets/src/mage/cards/a/AlandraSkyDreamer.java b/Mage.Sets/src/mage/cards/a/AlandraSkyDreamer.java new file mode 100644 index 00000000000..26df186e13d --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AlandraSkyDreamer.java @@ -0,0 +1,80 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.common.DrawNthCardTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.game.permanent.token.DrakeToken; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.CardsInControllerHandCount; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.constants.Duration; +import mage.filter.common.FilterCreaturePermanent; + +/** + * @author amoscatelli + */ +public final class AlandraSkyDreamer extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.DRAKE, "Drakes"); + + public AlandraSkyDreamer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{U}"); + addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.MERFOLK); + this.subtype.add(SubType.WIZARD); + + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Whenever you draw your second card earch turn, create a 2/2 blue Drake creature token with flying. + this.addAbility( + new DrawNthCardTriggeredAbility( + new CreateTokenEffect( + new DrakeToken() + ), + false, + 2 + ) + ); + + // Whenever you draw your fifth card each turn, Alandra, Sky Dreamer and Drakes you control each get +X/+X until end of turn, where X is the number of cards in your hand. + DrawNthCardTriggeredAbility drawNthCardTriggeredAbility = new DrawNthCardTriggeredAbility( + new BoostSourceEffect( + CardsInControllerHandCount.instance, + CardsInControllerHandCount.instance, + Duration.EndOfTurn + ).setText("{this}"), + false, + 5 + ); + drawNthCardTriggeredAbility.addEffect( + new BoostControlledEffect( + CardsInControllerHandCount.instance, + CardsInControllerHandCount.instance, + Duration.EndOfTurn, + filter, + false + ).setText("and Drakes you control each get +X/+X until end of turn, where X is the number of cards in your hand") + ); + this.addAbility( + drawNthCardTriggeredAbility + ); + + } + + private AlandraSkyDreamer(final AlandraSkyDreamer card) { + super(card); + } + + @Override + public AlandraSkyDreamer copy() { + return new AlandraSkyDreamer(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BloodhazeWolverine.java b/Mage.Sets/src/mage/cards/b/BloodhazeWolverine.java index 38b7b6e5131..eb9ecb9c8bd 100644 --- a/Mage.Sets/src/mage/cards/b/BloodhazeWolverine.java +++ b/Mage.Sets/src/mage/cards/b/BloodhazeWolverine.java @@ -2,7 +2,7 @@ package mage.cards.b; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FirstStrikeAbility; @@ -27,9 +27,9 @@ public final class BloodhazeWolverine extends CardImpl { this.toughness = new MageInt(1); // Whenever you draw your second card each turn, Bloodhaze Wolverine gets +1/+1 and gains first strike until end of turn. - Ability ability = new DrawSecondCardTriggeredAbility(new BoostSourceEffect( + Ability ability = new DrawNthCardTriggeredAbility(new BoostSourceEffect( 1, 1, Duration.EndOfTurn - ).setText("{this} gets +1/+1"), false); + ).setText("{this} gets +1/+1"), false, 2); ability.addEffect(new GainAbilitySourceEffect( FirstStrikeAbility.getInstance(), Duration.EndOfTurn ).setText("and gains first strike until end of turn")); diff --git a/Mage.Sets/src/mage/cards/d/DoggedDetective.java b/Mage.Sets/src/mage/cards/d/DoggedDetective.java index fa3e4d50c84..e905b3d0b89 100644 --- a/Mage.Sets/src/mage/cards/d/DoggedDetective.java +++ b/Mage.Sets/src/mage/cards/d/DoggedDetective.java @@ -2,7 +2,7 @@ package mage.cards.d; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; import mage.abilities.effects.keyword.SurveilEffect; @@ -31,7 +31,7 @@ public final class DoggedDetective extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new SurveilEffect(2))); // Whenever an opponent draws their second card each turn, you may return Dogged Detective from your graveyard to your hand. - this.addAbility(new DrawSecondCardTriggeredAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), true, TargetController.OPPONENT)); + this.addAbility(new DrawNthCardTriggeredAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), true, TargetController.OPPONENT, 2)); } private DoggedDetective(final DoggedDetective card) { diff --git a/Mage.Sets/src/mage/cards/e/EtherealInvestigator.java b/Mage.Sets/src/mage/cards/e/EtherealInvestigator.java index a42ce321bd3..452566702c4 100644 --- a/Mage.Sets/src/mage/cards/e/EtherealInvestigator.java +++ b/Mage.Sets/src/mage/cards/e/EtherealInvestigator.java @@ -1,7 +1,7 @@ package mage.cards.e; import mage.MageInt; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.dynamicvalue.common.OpponentsCount; import mage.abilities.effects.common.CreateTokenEffect; @@ -34,8 +34,8 @@ public final class EtherealInvestigator extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new InvestigateEffect(OpponentsCount.instance))); // Whenever you draw your second card each turn, create a 1/1 white Spirit creature token with flying. - this.addAbility(new DrawSecondCardTriggeredAbility( - new CreateTokenEffect(new SpiritWhiteToken()), false + this.addAbility(new DrawNthCardTriggeredAbility( + new CreateTokenEffect(new SpiritWhiteToken()), false, 2 )); } diff --git a/Mage.Sets/src/mage/cards/f/FaerieMastermind.java b/Mage.Sets/src/mage/cards/f/FaerieMastermind.java index 63dd465cedc..62cdac26bd8 100644 --- a/Mage.Sets/src/mage/cards/f/FaerieMastermind.java +++ b/Mage.Sets/src/mage/cards/f/FaerieMastermind.java @@ -1,7 +1,7 @@ package mage.cards.f; import mage.MageInt; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DrawCardAllEffect; @@ -32,10 +32,10 @@ public class FaerieMastermind extends CardImpl { this.addAbility(FlyingAbility.getInstance()); //Whenever an opponent draws their second card each turn, you draw a card. - this.addAbility(new DrawSecondCardTriggeredAbility( + this.addAbility(new DrawNthCardTriggeredAbility( new DrawCardSourceControllerEffect(1) .setText("you draw a card"), - false, TargetController.OPPONENT + false, TargetController.OPPONENT, 2 )); //{3}{U}: Each player draws a card. diff --git a/Mage.Sets/src/mage/cards/f/FaerieVandal.java b/Mage.Sets/src/mage/cards/f/FaerieVandal.java index dff975f655d..27187b57fc9 100644 --- a/Mage.Sets/src/mage/cards/f/FaerieVandal.java +++ b/Mage.Sets/src/mage/cards/f/FaerieVandal.java @@ -1,7 +1,7 @@ package mage.cards.f; import mage.MageInt; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.FlashAbility; import mage.abilities.keyword.FlyingAbility; @@ -33,8 +33,8 @@ public final class FaerieVandal extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever you draw your second card each turn, put a +1/+1 counter on Faerie Vandal. - this.addAbility(new DrawSecondCardTriggeredAbility( - new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false + this.addAbility(new DrawNthCardTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, 2 )); } diff --git a/Mage.Sets/src/mage/cards/g/GaviNestWarden.java b/Mage.Sets/src/mage/cards/g/GaviNestWarden.java index fc839dbfcde..ec46064316f 100644 --- a/Mage.Sets/src/mage/cards/g/GaviNestWarden.java +++ b/Mage.Sets/src/mage/cards/g/GaviNestWarden.java @@ -2,7 +2,7 @@ package mage.cards.g; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.CyclingDiscardCost; import mage.abilities.costs.mana.GenericManaCost; @@ -40,7 +40,7 @@ public final class GaviNestWarden extends CardImpl { this.addAbility(new SimpleStaticAbility(new CyclingZeroCostEffect()), new GaviNestWardenWatcher()); // Whenever you draw your second card each turn, create a 2/2 red and white Dinosaur Cat creature token. - this.addAbility(new DrawSecondCardTriggeredAbility(new CreateTokenEffect(new DinosaurCatToken()), false)); + this.addAbility(new DrawNthCardTriggeredAbility(new CreateTokenEffect(new DinosaurCatToken()), false, 2)); } private GaviNestWarden(final GaviNestWarden card) { diff --git a/Mage.Sets/src/mage/cards/g/GixianPuppeteer.java b/Mage.Sets/src/mage/cards/g/GixianPuppeteer.java index 9133871cc9d..47425bfe3b3 100644 --- a/Mage.Sets/src/mage/cards/g/GixianPuppeteer.java +++ b/Mage.Sets/src/mage/cards/g/GixianPuppeteer.java @@ -4,7 +4,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.DiesSourceTriggeredAbility; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.LoseLifeOpponentsEffect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; @@ -41,7 +41,7 @@ public final class GixianPuppeteer extends CardImpl { this.toughness = new MageInt(3); // Whenever you draw your second card each turn, each opponent loses 2 life and you gain 2 life. - Ability ability = new DrawSecondCardTriggeredAbility(new LoseLifeOpponentsEffect(2), false); + Ability ability = new DrawNthCardTriggeredAbility(new LoseLifeOpponentsEffect(2), false, 2); ability.addEffect(new GainLifeEffect(2).concatBy("and")); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/g/GurglingAnointer.java b/Mage.Sets/src/mage/cards/g/GurglingAnointer.java index 03f99beefbb..80cbeff90da 100644 --- a/Mage.Sets/src/mage/cards/g/GurglingAnointer.java +++ b/Mage.Sets/src/mage/cards/g/GurglingAnointer.java @@ -4,7 +4,7 @@ import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.DiesSourceTriggeredAbility; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.FlyingAbility; @@ -52,7 +52,7 @@ public final class GurglingAnointer extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever you draw your second card each turn, put a +1/+1 counter on Gurgling Anointer. - this.addAbility(new DrawSecondCardTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false)); + this.addAbility(new DrawNthCardTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, 2)); // When Gurgling Anointer dies, return another target creature card with mana value less than or equal to Gurgling Anointer's power from your graveyard to the battlefield. Ability ability = new DiesSourceTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect()); diff --git a/Mage.Sets/src/mage/cards/i/ImprobableAlliance.java b/Mage.Sets/src/mage/cards/i/ImprobableAlliance.java index 40c680fb5fc..d2ee3b66c0f 100644 --- a/Mage.Sets/src/mage/cards/i/ImprobableAlliance.java +++ b/Mage.Sets/src/mage/cards/i/ImprobableAlliance.java @@ -1,6 +1,6 @@ package mage.cards.i; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.CreateTokenEffect; @@ -21,7 +21,7 @@ public final class ImprobableAlliance extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}{R}"); // Whenever you draw your second card each turn, create a 1/1 blue Faerie creature token with flying. - this.addAbility(new DrawSecondCardTriggeredAbility(new CreateTokenEffect(new FaerieToken()), false)); + this.addAbility(new DrawNthCardTriggeredAbility(new CreateTokenEffect(new FaerieToken()), false, 2)); // {4}{U}{R}: Draw a card, then discard a card. this.addAbility(new SimpleActivatedAbility( diff --git a/Mage.Sets/src/mage/cards/i/IrencragPyromancer.java b/Mage.Sets/src/mage/cards/i/IrencragPyromancer.java index 15265ab3170..1fbfd64a5be 100644 --- a/Mage.Sets/src/mage/cards/i/IrencragPyromancer.java +++ b/Mage.Sets/src/mage/cards/i/IrencragPyromancer.java @@ -2,7 +2,7 @@ package mage.cards.i; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -26,7 +26,7 @@ public final class IrencragPyromancer extends CardImpl { this.toughness = new MageInt(4); // Whenever you draw your second card each turn, Irencrag Pyromancer deals 3 damage to any target. - Ability ability = new DrawSecondCardTriggeredAbility(new DamageTargetEffect(3), false); + Ability ability = new DrawNthCardTriggeredAbility(new DamageTargetEffect(3), false, 2); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/j/JaceArcaneStrategist.java b/Mage.Sets/src/mage/cards/j/JaceArcaneStrategist.java index 3ed23ece1d1..73e95363a93 100644 --- a/Mage.Sets/src/mage/cards/j/JaceArcaneStrategist.java +++ b/Mage.Sets/src/mage/cards/j/JaceArcaneStrategist.java @@ -2,7 +2,7 @@ package mage.cards.j; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.combat.CantBeBlockedAllEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; @@ -31,8 +31,8 @@ public final class JaceArcaneStrategist extends CardImpl { this.setStartingLoyalty(4); // Whenever you draw your second card each turn, put a +1/+1 counter on target creature you control. - Ability ability = new DrawSecondCardTriggeredAbility( - new AddCountersTargetEffect(CounterType.P1P1.createInstance()), false + Ability ability = new DrawNthCardTriggeredAbility( + new AddCountersTargetEffect(CounterType.P1P1.createInstance()), false, 2 ); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/j/Jackhammer.java b/Mage.Sets/src/mage/cards/j/Jackhammer.java index db185bac9f7..13e6b59b089 100644 --- a/Mage.Sets/src/mage/cards/j/Jackhammer.java +++ b/Mage.Sets/src/mage/cards/j/Jackhammer.java @@ -2,7 +2,7 @@ package mage.cards.j; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.DrawCardSourceControllerEffect; diff --git a/Mage.Sets/src/mage/cards/j/JolraelMwonvuliRecluse.java b/Mage.Sets/src/mage/cards/j/JolraelMwonvuliRecluse.java index f1bf5241920..a245ac7448f 100644 --- a/Mage.Sets/src/mage/cards/j/JolraelMwonvuliRecluse.java +++ b/Mage.Sets/src/mage/cards/j/JolraelMwonvuliRecluse.java @@ -1,7 +1,7 @@ package mage.cards.j; import mage.MageInt; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.CardsInControllerHandCount; @@ -33,7 +33,7 @@ public final class JolraelMwonvuliRecluse extends CardImpl { this.toughness = new MageInt(2); // Whenever you draw your second card each turn, create a 2/2 green Cat creature token. - this.addAbility(new DrawSecondCardTriggeredAbility(new CreateTokenEffect(new GreenCat2Token()), false)); + this.addAbility(new DrawNthCardTriggeredAbility(new CreateTokenEffect(new GreenCat2Token()), false, 2)); // {4}{G}{G}: Until end of turn, creatures you control have base power and toughness X/X, where X is the number of cards in your hand. this.addAbility(new SimpleActivatedAbility(new SetBasePowerToughnessAllEffect( diff --git a/Mage.Sets/src/mage/cards/l/LatNamAdept.java b/Mage.Sets/src/mage/cards/l/LatNamAdept.java index fe6c63dbd84..8c0f62e3247 100644 --- a/Mage.Sets/src/mage/cards/l/LatNamAdept.java +++ b/Mage.Sets/src/mage/cards/l/LatNamAdept.java @@ -1,7 +1,7 @@ package mage.cards.l; import mage.MageInt; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -25,8 +25,8 @@ public final class LatNamAdept extends CardImpl { this.toughness = new MageInt(3); // Whenever you draw your second card each turn, put a +1/+1 counter on Lat-Nam Adept. - this.addAbility(new DrawSecondCardTriggeredAbility( - new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false + this.addAbility(new DrawNthCardTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, 2 )); } diff --git a/Mage.Sets/src/mage/cards/m/MadRatter.java b/Mage.Sets/src/mage/cards/m/MadRatter.java index aa38a136333..08b23f5b5ce 100644 --- a/Mage.Sets/src/mage/cards/m/MadRatter.java +++ b/Mage.Sets/src/mage/cards/m/MadRatter.java @@ -1,7 +1,7 @@ package mage.cards.m; import mage.MageInt; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -24,7 +24,7 @@ public final class MadRatter extends CardImpl { this.toughness = new MageInt(2); // Whenever you draw your second card each turn, create two 1/1 black Rat creature tokens. - this.addAbility(new DrawSecondCardTriggeredAbility(new CreateTokenEffect(new RatToken(), 2), false)); + this.addAbility(new DrawNthCardTriggeredAbility(new CreateTokenEffect(new RatToken(), 2), false, 2)); } private MadRatter(final MadRatter card) { diff --git a/Mage.Sets/src/mage/cards/m/MantleOfTides.java b/Mage.Sets/src/mage/cards/m/MantleOfTides.java index efde9dae20c..900824acbf7 100644 --- a/Mage.Sets/src/mage/cards/m/MantleOfTides.java +++ b/Mage.Sets/src/mage/cards/m/MantleOfTides.java @@ -1,7 +1,7 @@ package mage.cards.m; import mage.abilities.Ability; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.BoostEquippedEffect; @@ -29,9 +29,9 @@ public final class MantleOfTides extends CardImpl { this.addAbility(new SimpleStaticAbility(new BoostEquippedEffect(1, 2))); // Whenever you draw your second card each turn, attach Mantle of Tides to target creature you control. - Ability ability = new DrawSecondCardTriggeredAbility(new AttachEffect( + Ability ability = new DrawNthCardTriggeredAbility(new AttachEffect( Outcome.Benefit, "attach {this} to target creature you control" - ), false); + ), false, 2); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/m/MinnWilyIllusionist.java b/Mage.Sets/src/mage/cards/m/MinnWilyIllusionist.java index 454c45fe487..2c59627a48b 100644 --- a/Mage.Sets/src/mage/cards/m/MinnWilyIllusionist.java +++ b/Mage.Sets/src/mage/cards/m/MinnWilyIllusionist.java @@ -3,7 +3,7 @@ package mage.cards.m; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.DiesCreatureTriggeredAbility; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.Card; @@ -41,8 +41,8 @@ public final class MinnWilyIllusionist extends CardImpl { this.toughness = new MageInt(3); // Whenever you draw your second card each turn, create a 1/1 blue Illusion creature token with "This creature gets +1/+0 for each other Illusion you control." - this.addAbility(new DrawSecondCardTriggeredAbility( - new CreateTokenEffect(new MinnWilyIllusionistToken()), false + this.addAbility(new DrawNthCardTriggeredAbility( + new CreateTokenEffect(new MinnWilyIllusionistToken()), false, 2 )); // Whenever an Illusion you control dies, you may put a permanent card with mana value less than or equal to that creature's power from your hand onto the battlefield. diff --git a/Mage.Sets/src/mage/cards/m/MysticSkyfish.java b/Mage.Sets/src/mage/cards/m/MysticSkyfish.java index 9c75a23b5c6..cb8eee272e6 100644 --- a/Mage.Sets/src/mage/cards/m/MysticSkyfish.java +++ b/Mage.Sets/src/mage/cards/m/MysticSkyfish.java @@ -1,7 +1,7 @@ package mage.cards.m; import mage.MageInt; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -25,8 +25,8 @@ public final class MysticSkyfish extends CardImpl { this.toughness = new MageInt(1); // Whenever you draw your second card each turn, Mystic Skyfish gains flying until end of turn. - this.addAbility(new DrawSecondCardTriggeredAbility( - new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), false) + this.addAbility(new DrawNthCardTriggeredAbility( + new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), false, 2) ); } diff --git a/Mage.Sets/src/mage/cards/s/SteelgazeGriffin.java b/Mage.Sets/src/mage/cards/s/SteelgazeGriffin.java index 303869131ef..5813fec3111 100644 --- a/Mage.Sets/src/mage/cards/s/SteelgazeGriffin.java +++ b/Mage.Sets/src/mage/cards/s/SteelgazeGriffin.java @@ -1,7 +1,7 @@ package mage.cards.s; import mage.MageInt; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -28,7 +28,7 @@ public final class SteelgazeGriffin extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When you draw your second card each turn, Steelgaze Griffin gets +2/+0 until end of turn. - this.addAbility(new DrawSecondCardTriggeredAbility(new BoostSourceEffect(2, 0, Duration.EndOfTurn), false)); + this.addAbility(new DrawNthCardTriggeredAbility(new BoostSourceEffect(2, 0, Duration.EndOfTurn), false, 2)); } private SteelgazeGriffin(final SteelgazeGriffin card) { diff --git a/Mage.Sets/src/mage/cards/t/TheCouncilOfFour.java b/Mage.Sets/src/mage/cards/t/TheCouncilOfFour.java index 0564008a997..9ce193c3296 100644 --- a/Mage.Sets/src/mage/cards/t/TheCouncilOfFour.java +++ b/Mage.Sets/src/mage/cards/t/TheCouncilOfFour.java @@ -2,7 +2,7 @@ package mage.cards.t; import mage.MageInt; import mage.abilities.common.CastSecondSpellTriggeredAbility; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; @@ -30,10 +30,10 @@ public final class TheCouncilOfFour extends CardImpl { this.toughness = new MageInt(8); // Whenever a player draws their second card during their turn, you draw a card. - this.addAbility(new DrawSecondCardTriggeredAbility( + this.addAbility(new DrawNthCardTriggeredAbility( new DrawCardSourceControllerEffect(1) .setText("you draw a card"), - false, TargetController.ACTIVE + false, TargetController.ACTIVE, 2 )); // Whenever a player casts their second spell during their turn, you create a 2/2 white Knight creature token. diff --git a/Mage.Sets/src/mage/cards/t/ThopterMechanic.java b/Mage.Sets/src/mage/cards/t/ThopterMechanic.java index 8a4f9142ecd..64632e07450 100644 --- a/Mage.Sets/src/mage/cards/t/ThopterMechanic.java +++ b/Mage.Sets/src/mage/cards/t/ThopterMechanic.java @@ -2,7 +2,7 @@ package mage.cards.t; import mage.MageInt; import mage.abilities.common.DiesSourceTriggeredAbility; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; @@ -28,8 +28,8 @@ public final class ThopterMechanic extends CardImpl { this.toughness = new MageInt(1); // Whenever you draw your second card each turn, put a +1/+1 counter on Thopter Mechanic. - this.addAbility(new DrawSecondCardTriggeredAbility( - new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false + this.addAbility(new DrawNthCardTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, 2 )); // When Thopter Mechanic dies, create a 1/1 colorless Thopter artifact creature token with flying. diff --git a/Mage.Sets/src/mage/cards/z/ZimoneAndDina.java b/Mage.Sets/src/mage/cards/z/ZimoneAndDina.java index 216254aa758..672edd6c69c 100644 --- a/Mage.Sets/src/mage/cards/z/ZimoneAndDina.java +++ b/Mage.Sets/src/mage/cards/z/ZimoneAndDina.java @@ -2,7 +2,7 @@ package mage.cards.z; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.DrawSecondCardTriggeredAbility; +import mage.abilities.common.DrawNthCardTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; @@ -36,7 +36,7 @@ public final class ZimoneAndDina extends CardImpl { this.toughness = new MageInt(4); // Whenever you draw your second card each turn, target opponent loses 2 life and you gain 2 life. - Ability ability = new DrawSecondCardTriggeredAbility(new LoseLifeTargetEffect(2), false); + Ability ability = new DrawNthCardTriggeredAbility(new LoseLifeTargetEffect(2), false, 2); ability.addEffect(new GainLifeEffect(2).concatBy("and")); ability.addTarget(new TargetOpponent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/Jumpstart2022.java b/Mage.Sets/src/mage/sets/Jumpstart2022.java index cadc930b7eb..71947519d16 100644 --- a/Mage.Sets/src/mage/sets/Jumpstart2022.java +++ b/Mage.Sets/src/mage/sets/Jumpstart2022.java @@ -32,6 +32,7 @@ public final class Jumpstart2022 extends ExpansionSet { cards.add(new SetCardInfo("Aftershock", 129, Rarity.COMMON, mage.cards.a.Aftershock.class)); cards.add(new SetCardInfo("Ajani's Pridemate", 142, Rarity.UNCOMMON, mage.cards.a.AjanisPridemate.class)); cards.add(new SetCardInfo("Ajani, Strength of the Pride", 141, Rarity.MYTHIC, mage.cards.a.AjaniStrengthOfThePride.class)); + cards.add(new SetCardInfo("Alandra, Sky Dreamer", 9, Rarity.RARE, mage.cards.a.AlandraSkyDreamer.class)); cards.add(new SetCardInfo("Alchemist's Vial", 753, Rarity.COMMON, mage.cards.a.AlchemistsVial.class)); cards.add(new SetCardInfo("Alley Strangler", 375, Rarity.COMMON, mage.cards.a.AlleyStrangler.class)); cards.add(new SetCardInfo("Alseid of Life's Bounty", 143, Rarity.UNCOMMON, mage.cards.a.AlseidOfLifesBounty.class)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/AlandraSkyDreamerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/AlandraSkyDreamerTest.java new file mode 100644 index 00000000000..e0370f1dd8c --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/AlandraSkyDreamerTest.java @@ -0,0 +1,48 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package org.mage.test.cards.triggers; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +public class AlandraSkyDreamerTest extends CardTestPlayerBase { + + @Test + public void testDraw2() { + addCard(Zone.HAND, playerA, "Inspiration"); + addCard(Zone.BATTLEFIELD, playerA, "Island", 4); + addCard(Zone.BATTLEFIELD, playerA, "Alandra, Sky Dreamer", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Inspiration", playerA); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertHandCount(playerA, 2); + assertPermanentCount(playerA, "Drake Token", 1); + assertPowerToughness(playerA, "Drake Token", 2, 2); + assertPowerToughness(playerA, "Alandra, Sky Dreamer", 2, 4); + } + + @Test + public void testDraw5() { + addCard(Zone.HAND, playerA, "Inspiration"); + addCard(Zone.HAND, playerA, "Ancestral Recall"); + addCard(Zone.BATTLEFIELD, playerA, "Island", 5); + addCard(Zone.BATTLEFIELD, playerA, "Alandra, Sky Dreamer", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Inspiration", playerA); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ancestral Recall", playerA); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + int drawnCards = 5; + assertHandCount(playerA, drawnCards); + assertPermanentCount(playerA, "Drake Token", 1); + assertPowerToughness(playerA, "Drake Token", 2 + drawnCards, 2 + drawnCards); + assertPowerToughness(playerA, "Alandra, Sky Dreamer", 2 + drawnCards, 4 + drawnCards); + } +} diff --git a/Mage/src/main/java/mage/abilities/common/DrawSecondCardTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DrawNthCardTriggeredAbility.java similarity index 65% rename from Mage/src/main/java/mage/abilities/common/DrawSecondCardTriggeredAbility.java rename to Mage/src/main/java/mage/abilities/common/DrawNthCardTriggeredAbility.java index c0a38d83893..458a507294d 100644 --- a/Mage/src/main/java/mage/abilities/common/DrawSecondCardTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/DrawNthCardTriggeredAbility.java @@ -18,32 +18,35 @@ import java.util.*; /** * @author TheElk801 */ -public class DrawSecondCardTriggeredAbility extends TriggeredAbilityImpl { +public class DrawNthCardTriggeredAbility extends TriggeredAbilityImpl { private static final Hint hint = new ValueHint( "Cards drawn this turn", CardsDrawnThisTurnDynamicValue.instance ); private final TargetController targetController; + private final int cardNumber; - public DrawSecondCardTriggeredAbility(Effect effect, boolean optional) { - this(effect, optional, TargetController.YOU); + public DrawNthCardTriggeredAbility(Effect effect, boolean optional, int cardNumber) { + this(effect, optional, TargetController.YOU, cardNumber); } - public DrawSecondCardTriggeredAbility(Effect effect, boolean optional, TargetController targetController) { - this(Zone.BATTLEFIELD, effect, optional, targetController); + public DrawNthCardTriggeredAbility(Effect effect, boolean optional, TargetController targetController, int cardNumber) { + this(Zone.BATTLEFIELD, effect, optional, targetController, cardNumber); } - public DrawSecondCardTriggeredAbility(Zone zone, Effect effect, boolean optional, TargetController targetController) { + public DrawNthCardTriggeredAbility(Zone zone, Effect effect, boolean optional, TargetController targetController, int cardNumber) { super(zone, effect, optional); - this.addWatcher(new DrawSecondCardWatcher()); + this.addWatcher(new DrawCardWatcher()); this.targetController = targetController; + this.cardNumber = cardNumber; this.addHint(hint); setTriggerPhrase(generateTriggerPhrase()); } - private DrawSecondCardTriggeredAbility(final DrawSecondCardTriggeredAbility ability) { + private DrawNthCardTriggeredAbility(final DrawNthCardTriggeredAbility ability) { super(ability); this.targetController = ability.targetController; + this.cardNumber = ability.cardNumber; } @Override @@ -73,7 +76,7 @@ public class DrawSecondCardTriggeredAbility extends TriggeredAbilityImpl { default: throw new IllegalArgumentException("TargetController " + targetController + " not supported"); } - return DrawSecondCardWatcher.checkEvent(event.getPlayerId(), event, game); + return DrawCardWatcher.checkEvent(event.getPlayerId(), event, game, cardNumber); } public String generateTriggerPhrase() { @@ -90,17 +93,16 @@ public class DrawSecondCardTriggeredAbility extends TriggeredAbilityImpl { } @Override - public DrawSecondCardTriggeredAbility copy() { - return new DrawSecondCardTriggeredAbility(this); + public DrawNthCardTriggeredAbility copy() { + return new DrawNthCardTriggeredAbility(this); } } -class DrawSecondCardWatcher extends Watcher { +class DrawCardWatcher extends Watcher { - private final Set drewOnce = new HashSet<>(); - private final Map secondDrawMap = new HashMap<>(); + private final Map> drawMap = new HashMap<>(); - DrawSecondCardWatcher() { + DrawCardWatcher() { super(WatcherScope.GAME); } @@ -109,21 +111,21 @@ class DrawSecondCardWatcher extends Watcher { if (event.getType() != GameEvent.EventType.DREW_CARD) { return; } - if (drewOnce.contains(event.getPlayerId())) { - secondDrawMap.putIfAbsent(event.getPlayerId(), event.getId()); - } else { - drewOnce.add(event.getPlayerId()); + if (!drawMap.containsKey(event.getPlayerId())) { + drawMap.putIfAbsent(event.getPlayerId(), new ArrayList<>()); } + drawMap.get(event.getPlayerId()).add(event.getId()); } @Override public void reset() { super.reset(); - drewOnce.clear(); - secondDrawMap.clear(); + drawMap.clear(); } - - static boolean checkEvent(UUID playerId, GameEvent event, Game game) { - return event.getId().equals(game.getState().getWatcher(DrawSecondCardWatcher.class).secondDrawMap.getOrDefault(playerId, null)); + + static boolean checkEvent(UUID playerId, GameEvent event, Game game, int cardNumber) { + Map> drawMap = game.getState().getWatcher(DrawCardWatcher.class).drawMap; + return drawMap.containsKey(playerId) && Objects.equals(drawMap.get(playerId).size(), cardNumber) && event.getId().equals(drawMap.get(playerId).get(cardNumber - 1)); } + } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostAllOfChosenSubtypeEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostAllOfChosenSubtypeEffect.java index 6a2c1e466af..70352fbe94a 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostAllOfChosenSubtypeEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostAllOfChosenSubtypeEffect.java @@ -1,6 +1,7 @@ package mage.abilities.effects.common.continuous; import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.common.ChooseCreatureTypeEffect; import mage.constants.Duration; import mage.constants.SubType; @@ -23,6 +24,10 @@ public class BoostAllOfChosenSubtypeEffect extends BoostAllEffect { super(power, toughness, duration, filter, excludeSource); } + public BoostAllOfChosenSubtypeEffect(DynamicValue power, DynamicValue toughness, Duration duration, FilterCreaturePermanent filter, boolean excludeSource) { + super(power, toughness, duration, filter, excludeSource); + } + public BoostAllOfChosenSubtypeEffect(final BoostAllOfChosenSubtypeEffect effect) { super(effect); this.subtype = effect.subtype;