diff --git a/Mage.Sets/src/mage/cards/a/AliriosEnraptured.java b/Mage.Sets/src/mage/cards/a/AliriosEnraptured.java new file mode 100644 index 00000000000..a9068a30909 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AliriosEnraptured.java @@ -0,0 +1,59 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTappedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.game.permanent.token.ReflectionBlueToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class AliriosEnraptured extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.REFLECTION); + private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter); + + public AliriosEnraptured(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Alirios, Enraptured enters the battlefield tapped. + this.addAbility(new EntersBattlefieldTappedAbility()); + + // Alirios doesn't untap during your untap step if you control a Reflection. + this.addAbility(new SimpleStaticAbility(new ConditionalContinuousRuleModifyingEffect( + new DontUntapInControllersUntapStepSourceEffect(), condition + ).setText("{this} doesn't untap during your untap step if you control a Reflection"))); + + // When Alirios enters the battlefield, create a 3/2 blue Reflection creature token. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ReflectionBlueToken()))); + } + + private AliriosEnraptured(final AliriosEnraptured card) { + super(card); + } + + @Override + public AliriosEnraptured copy() { + return new AliriosEnraptured(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/ArtisanOfForms.java b/Mage.Sets/src/mage/cards/a/ArtisanOfForms.java index ac415c84391..1d8a35af4a3 100644 --- a/Mage.Sets/src/mage/cards/a/ArtisanOfForms.java +++ b/Mage.Sets/src/mage/cards/a/ArtisanOfForms.java @@ -1,11 +1,8 @@ - package mage.cards.a; -import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.CopyPermanentEffect; import mage.abilities.keyword.HeroicAbility; import mage.cards.CardImpl; @@ -18,8 +15,9 @@ import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; import mage.util.functions.ApplyToPermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class ArtisanOfForms extends CardImpl { @@ -33,14 +31,10 @@ public final class ArtisanOfForms extends CardImpl { this.toughness = new MageInt(1); // Heroic — Whenever you cast a spell that targets Artisan of Forms, you may have Artisan of Forms become a copy of target creature, except it has this ability. - Effect effect = new CopyPermanentEffect(StaticFilters.FILTER_PERMANENT_CREATURE, new ArtisanOfFormsApplyToPermanent(), true); - effect.setText("have {this} become a copy of target creature, except it has this ability"); - Ability ability = new HeroicAbility(effect, true); - ability.addTarget(new TargetCreaturePermanent()); - this.addAbility(ability); + this.addAbility(createAbility()); } - public ArtisanOfForms(final ArtisanOfForms card) { + private ArtisanOfForms(final ArtisanOfForms card) { super(card); } @@ -48,24 +42,28 @@ public final class ArtisanOfForms extends CardImpl { public ArtisanOfForms copy() { return new ArtisanOfForms(this); } + + static Ability createAbility() { + Ability ability = new HeroicAbility(new CopyPermanentEffect( + StaticFilters.FILTER_PERMANENT_CREATURE, + new ArtisanOfFormsApplyToPermanent(), true + ).setText("have {this} become a copy of target creature, except it has this ability"), true); + ability.addTarget(new TargetCreaturePermanent()); + return ability; + } } class ArtisanOfFormsApplyToPermanent extends ApplyToPermanent { @Override public boolean apply(Game game, MageObject mageObject, Ability source, UUID copyToObjectId) { - Effect effect = new CopyPermanentEffect(new ArtisanOfFormsApplyToPermanent()); - effect.setText("have {this} become a copy of target creature, except it has this ability"); - mageObject.getAbilities().add(new HeroicAbility(effect, true)); + mageObject.getAbilities().add(ArtisanOfForms.createAbility()); return true; } @Override public boolean apply(Game game, Permanent permanent, Ability source, UUID copyToObjectId) { - Effect effect = new CopyPermanentEffect(new ArtisanOfFormsApplyToPermanent()); - effect.setText("have {this} become a copy of target creature, except it has this ability"); - permanent.addAbility(new HeroicAbility(effect, true), game); + permanent.addAbility(ArtisanOfForms.createAbility(), game); return true; } - } diff --git a/Mage.Sets/src/mage/cards/c/CountrysideCrusher.java b/Mage.Sets/src/mage/cards/c/CountrysideCrusher.java index 69273c9ae06..2fdb8d5e45e 100644 --- a/Mage.Sets/src/mage/cards/c/CountrysideCrusher.java +++ b/Mage.Sets/src/mage/cards/c/CountrysideCrusher.java @@ -1,7 +1,6 @@ package mage.cards.c; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -9,19 +8,16 @@ import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.*; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.SubType; -import mage.constants.TargetController; -import mage.constants.Zone; +import mage.constants.*; import mage.counters.CounterType; -import mage.filter.common.FilterLandCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class CountrysideCrusher extends CardImpl { @@ -35,16 +31,19 @@ public final class CountrysideCrusher extends CardImpl { this.toughness = new MageInt(3); // At the beginning of your upkeep, reveal the top card of your library. If it's a land card, put it into your graveyard and repeat this process. - this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CountrysideCrusherEffect(), TargetController.YOU, false)); + this.addAbility(new BeginningOfUpkeepTriggeredAbility( + new CountrysideCrusherEffect(), TargetController.YOU, false + )); + // Whenever a land card is put into your graveyard from anywhere, put a +1/+1 counter on Countryside Crusher. this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility( new AddCountersSourceEffect(CounterType.P1P1.createInstance()), - false, new FilterLandCard("a land card"), TargetController.YOU + false, StaticFilters.FILTER_CARD_LAND_A, TargetController.YOU )); } - public CountrysideCrusher(final CountrysideCrusher card) { + private CountrysideCrusher(final CountrysideCrusher card) { super(card); } @@ -56,12 +55,12 @@ public final class CountrysideCrusher extends CardImpl { class CountrysideCrusherEffect extends OneShotEffect { - public CountrysideCrusherEffect() { + CountrysideCrusherEffect() { super(Outcome.Discard); this.staticText = "reveal the top card of your library. If it's a land card, put it into your graveyard and repeat this process"; } - public CountrysideCrusherEffect(final CountrysideCrusherEffect effect) { + private CountrysideCrusherEffect(final CountrysideCrusherEffect effect) { super(effect); } @@ -74,19 +73,19 @@ class CountrysideCrusherEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (controller != null && sourcePermanent != null) { - Cards cards = new CardsImpl(); - for (Card card : controller.getLibrary().getCards(game)) { - cards.add(card); - if (card.isLand()) { - controller.moveCards(card, Zone.GRAVEYARD, source, game); - } else { - break; - } - } - controller.revealCards(sourcePermanent.getName(), cards, game); - return true; + if (controller == null || sourcePermanent == null) { + return false; } - return false; + Cards cards = new CardsImpl(); + for (Card card : controller.getLibrary().getCards(game)) { + cards.add(card); + if (card.isLand()) { + controller.moveCards(card, Zone.GRAVEYARD, source, game); + } else { + break; + } + } + controller.revealCards(sourcePermanent.getName(), cards, game); + return true; } } diff --git a/Mage.Sets/src/mage/cards/f/FlummoxedCyclops.java b/Mage.Sets/src/mage/cards/f/FlummoxedCyclops.java new file mode 100644 index 00000000000..ed84eb23ef7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FlummoxedCyclops.java @@ -0,0 +1,87 @@ +package mage.cards.f; + +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.common.combat.CantBlockSourceEffect; +import mage.abilities.keyword.ReachAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; + +import java.util.Objects; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class FlummoxedCyclops extends CardImpl { + + public FlummoxedCyclops(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + + this.subtype.add(SubType.CYCLOPS); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Reach + this.addAbility(ReachAbility.getInstance()); + + // Whenever two or more creatures your opponents control attack, Flummoxed Cyclops can't block this combat. + this.addAbility(new FlummoxedCyclopsTriggeredAbility()); + } + + private FlummoxedCyclops(final FlummoxedCyclops card) { + super(card); + } + + @Override + public FlummoxedCyclops copy() { + return new FlummoxedCyclops(this); + } +} + +class FlummoxedCyclopsTriggeredAbility extends TriggeredAbilityImpl { + + FlummoxedCyclopsTriggeredAbility() { + super(Zone.BATTLEFIELD, new CantBlockSourceEffect(Duration.EndOfCombat)); + } + + private FlummoxedCyclopsTriggeredAbility(final FlummoxedCyclopsTriggeredAbility ability) { + super(ability); + } + + @Override + public FlummoxedCyclopsTriggeredAbility copy() { + return new FlummoxedCyclopsTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (!game.getOpponents(getControllerId()).contains(game.getCombat().getAttackingPlayerId())) { + return false; + } + return game + .getCombat() + .getAttackers() + .stream() + .map(game::getPermanent) + .filter(Objects::nonNull) + .count() > 1; + } + + @Override + public String getRule() { + return "Whenever two or more creatures your opponents control attack, {this} can't block this combat."; + } + +} diff --git a/Mage.Sets/src/mage/cards/n/NessianHornbeetle.java b/Mage.Sets/src/mage/cards/n/NessianHornbeetle.java new file mode 100644 index 00000000000..86f5f174b23 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NessianHornbeetle.java @@ -0,0 +1,62 @@ +package mage.cards.n; + +import mage.MageInt; +import mage.abilities.common.BeginningOfCombatTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.filter.predicate.permanent.AnotherPredicate; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class NessianHornbeetle extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledCreaturePermanent(); + + static { + filter.add(AnotherPredicate.instance); + filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 3)); + } + + private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter); + + public NessianHornbeetle(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add(SubType.INSECT); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // At the beginning of combat on your turn, if you control another creature with power 4 or greater, put a +1/+1 counter on Nessian Hornbeetle. + this.addAbility(new ConditionalInterveningIfTriggeredAbility( + new BeginningOfCombatTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + TargetController.YOU, false + ), condition, "At the beginning of combat on your turn, if you control " + + "another creature with power 4 or greater, put a +1/+1 counter on {this}." + )); + } + + private NessianHornbeetle(final NessianHornbeetle card) { + super(card); + } + + @Override + public NessianHornbeetle copy() { + return new NessianHornbeetle(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/ProteanThaumaturge.java b/Mage.Sets/src/mage/cards/p/ProteanThaumaturge.java new file mode 100644 index 00000000000..d8ecd23dac0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/ProteanThaumaturge.java @@ -0,0 +1,78 @@ +package mage.cards.p; + +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.abilityword.ConstellationAbility; +import mage.abilities.effects.common.CopyPermanentEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.util.functions.ApplyToPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ProteanThaumaturge extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("another target creature"); + + static { + filter.add(AnotherPredicate.instance); + } + + public ProteanThaumaturge(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Constellation — Whenever an enchantment enters the battlefield under your control, you may have Protean Thaumaturge become a copy of another target creature, except it has this ability. + this.addAbility(createAbility()); + } + + private ProteanThaumaturge(final ProteanThaumaturge card) { + super(card); + } + + @Override + public ProteanThaumaturge copy() { + return new ProteanThaumaturge(this); + } + + static Ability createAbility() { + Ability ability = new ConstellationAbility(new CopyPermanentEffect( + StaticFilters.FILTER_PERMANENT_CREATURE, + new ProteanThaumaturgeApplyToPermanent(), true + ).setText("have {this} become a copy of another target creature, except it has this ability"), true, false); + ability.addTarget(new TargetPermanent(filter)); + return ability; + } +} + +class ProteanThaumaturgeApplyToPermanent extends ApplyToPermanent { + + @Override + public boolean apply(Game game, MageObject mageObject, Ability source, UUID copyToObjectId) { + mageObject.getAbilities().add(ProteanThaumaturge.createAbility()); + return true; + } + + @Override + public boolean apply(Game game, Permanent permanent, Ability source, UUID copyToObjectId) { + permanent.addAbility(ProteanThaumaturge.createAbility(), game); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/s/SkolaGrovedancer.java b/Mage.Sets/src/mage/cards/s/SkolaGrovedancer.java new file mode 100644 index 00000000000..3677c1c02f4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SkolaGrovedancer.java @@ -0,0 +1,50 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SkolaGrovedancer extends CardImpl { + + public SkolaGrovedancer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{1}{G}"); + + this.subtype.add(SubType.SATYR); + this.subtype.add(SubType.DRUID); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever a land card is put into your graveyard from anywhere, you gain 1 life. + this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility( + new GainLifeEffect(1), false, StaticFilters.FILTER_CARD_LAND_A, TargetController.YOU + )); + + // {2}{G}: Put the top card of your library into your graveyard. + this.addAbility(new SimpleActivatedAbility( + new PutTopCardOfLibraryIntoGraveControllerEffect(1), new ManaCostsImpl("{2}{G}") + )); + } + + private SkolaGrovedancer(final SkolaGrovedancer card) { + super(card); + } + + @Override + public SkolaGrovedancer copy() { + return new SkolaGrovedancer(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/WarbriarBlessing.java b/Mage.Sets/src/mage/cards/w/WarbriarBlessing.java new file mode 100644 index 00000000000..35a72598d6b --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WarbriarBlessing.java @@ -0,0 +1,96 @@ +package mage.cards.w; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class WarbriarBlessing extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("creature you don't control"); + + static { + filter.add(TargetController.NOT_YOU.getControllerPredicate()); + } + + public WarbriarBlessing(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature you control + TargetPermanent auraTarget = new TargetPermanent(StaticFilters.FILTER_CONTROLLED_CREATURE); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When Warbriar Blessing enters the battlefield, enchanted creature fights up to one target creature you don't control. + ability = new EntersBattlefieldTriggeredAbility(new WarbriarBlessingEffect()); + ability.addTarget(new TargetPermanent(0, 1, filter, false)); + this.addAbility(ability); + + // Enchanted creature gets +0/+2. + this.addAbility(new SimpleStaticAbility(new BoostEnchantedEffect(0, 2))); + } + + private WarbriarBlessing(final WarbriarBlessing card) { + super(card); + } + + @Override + public WarbriarBlessing copy() { + return new WarbriarBlessing(this); + } +} + +class WarbriarBlessingEffect extends OneShotEffect { + + WarbriarBlessingEffect() { + super(Outcome.Benefit); + staticText = "enchanted creature fights up to one target creature you don't control"; + } + + private WarbriarBlessingEffect(final WarbriarBlessingEffect effect) { + super(effect); + } + + @Override + public WarbriarBlessingEffect copy() { + return new WarbriarBlessingEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + Permanent opponentsPermanent = game.getPermanent(source.getFirstTarget()); + if (permanent == null || opponentsPermanent == null) { + return false; + } + Permanent attach = game.getPermanent(permanent.getAttachedTo()); + if (attach == null) { + return false; + } + return attach.fight(opponentsPermanent, source, game); + } +} diff --git a/Mage.Sets/src/mage/sets/TherosBeyondDeath.java b/Mage.Sets/src/mage/sets/TherosBeyondDeath.java index 8308550a132..422a5174779 100644 --- a/Mage.Sets/src/mage/sets/TherosBeyondDeath.java +++ b/Mage.Sets/src/mage/sets/TherosBeyondDeath.java @@ -27,6 +27,7 @@ public final class TherosBeyondDeath extends ExpansionSet { this.maxCardNumberInBooster = 254; cards.add(new SetCardInfo("Acolyte of Affliction", 206, Rarity.UNCOMMON, mage.cards.a.AcolyteOfAffliction.class)); + cards.add(new SetCardInfo("Alirios, Enraptured", 42, Rarity.UNCOMMON, mage.cards.a.AliriosEnraptured.class)); cards.add(new SetCardInfo("Allure of the Unknown", 207, Rarity.RARE, mage.cards.a.AllureOfTheUnknown.class)); cards.add(new SetCardInfo("Alseid of Life's Bounty", 1, Rarity.UNCOMMON, mage.cards.a.AlseidOfLifesBounty.class)); cards.add(new SetCardInfo("Altar of the Pantheon", 231, Rarity.COMMON, mage.cards.a.AltarOfThePantheon.class)); @@ -94,6 +95,7 @@ public final class TherosBeyondDeath extends ExpansionSet { cards.add(new SetCardInfo("Final Death", 95, Rarity.COMMON, mage.cards.f.FinalDeath.class)); cards.add(new SetCardInfo("Final Flare", 134, Rarity.COMMON, mage.cards.f.FinalFlare.class)); cards.add(new SetCardInfo("Flicker of Fate", 16, Rarity.COMMON, mage.cards.f.FlickerOfFate.class)); + cards.add(new SetCardInfo("Flummoxed Cyclops", 135, Rarity.COMMON, mage.cards.f.FlummoxedCyclops.class)); cards.add(new SetCardInfo("Forest", 254, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Fruit of Tizerus", 96, Rarity.COMMON, mage.cards.f.FruitOfTizerus.class)); cards.add(new SetCardInfo("Funeral Rites", 97, Rarity.COMMON, mage.cards.f.FuneralRites.class)); @@ -154,6 +156,7 @@ public final class TherosBeyondDeath extends ExpansionSet { cards.add(new SetCardInfo("Nadir Kraken", 55, Rarity.RARE, mage.cards.n.NadirKraken.class)); cards.add(new SetCardInfo("Naiad of Hidden Coves", 56, Rarity.COMMON, mage.cards.n.NaiadOfHiddenCoves.class)); cards.add(new SetCardInfo("Nessian Boar", 181, Rarity.RARE, mage.cards.n.NessianBoar.class)); + cards.add(new SetCardInfo("Nessian Hornbeetle", 182, Rarity.UNCOMMON, mage.cards.n.NessianHornbeetle.class)); cards.add(new SetCardInfo("Nessian Wanderer", 183, Rarity.UNCOMMON, mage.cards.n.NessianWanderer.class)); cards.add(new SetCardInfo("Nexus Wardens", 184, Rarity.COMMON, mage.cards.n.NexusWardens.class)); cards.add(new SetCardInfo("Nylea's Forerunner", 186, Rarity.COMMON, mage.cards.n.NyleasForerunner.class)); @@ -186,6 +189,7 @@ public final class TherosBeyondDeath extends ExpansionSet { cards.add(new SetCardInfo("Plummet", 194, Rarity.COMMON, mage.cards.p.Plummet.class)); cards.add(new SetCardInfo("Polukranos, Unchained", 224, Rarity.MYTHIC, mage.cards.p.PolukranosUnchained.class)); cards.add(new SetCardInfo("Portent of Betrayal", 149, Rarity.COMMON, mage.cards.p.PortentOfBetrayal.class)); + cards.add(new SetCardInfo("Protean Thaumaturge", 60, Rarity.RARE, mage.cards.p.ProteanThaumaturge.class)); cards.add(new SetCardInfo("Purphoros's Intervention", 151, Rarity.RARE, mage.cards.p.PurphorossIntervention.class)); cards.add(new SetCardInfo("Purphoros, Bronze-Blooded", 150, Rarity.MYTHIC, mage.cards.p.PurphorosBronzeBlooded.class)); cards.add(new SetCardInfo("Rage-Scarred Berserker", 113, Rarity.COMMON, mage.cards.r.RageScarredBerserker.class)); @@ -212,6 +216,7 @@ public final class TherosBeyondDeath extends ExpansionSet { cards.add(new SetCardInfo("Shimmerwing Chimera", 64, Rarity.UNCOMMON, mage.cards.s.ShimmerwingChimera.class)); cards.add(new SetCardInfo("Shoal Kraken", 65, Rarity.UNCOMMON, mage.cards.s.ShoalKraken.class)); cards.add(new SetCardInfo("Siona, Captain of the Pyleas", 226, Rarity.UNCOMMON, mage.cards.s.SionaCaptainOfThePyleas.class)); + cards.add(new SetCardInfo("Skola Grovedancer", 202, Rarity.COMMON, mage.cards.s.SkolaGrovedancer.class)); cards.add(new SetCardInfo("Skophos Maze-Warden", 153, Rarity.UNCOMMON, mage.cards.s.SkophosMazeWarden.class)); cards.add(new SetCardInfo("Skophos Warleader", 154, Rarity.COMMON, mage.cards.s.SkophosWarleader.class)); cards.add(new SetCardInfo("Slaughter-Priest of Mogis", 227, Rarity.UNCOMMON, mage.cards.s.SlaughterPriestOfMogis.class)); @@ -274,6 +279,7 @@ public final class TherosBeyondDeath extends ExpansionSet { cards.add(new SetCardInfo("Vexing Gull", 79, Rarity.COMMON, mage.cards.v.VexingGull.class)); cards.add(new SetCardInfo("Victory's Envoy", 289, Rarity.RARE, mage.cards.v.VictorysEnvoy.class)); cards.add(new SetCardInfo("Voracious Typhon", 203, Rarity.COMMON, mage.cards.v.VoraciousTyphon.class)); + cards.add(new SetCardInfo("Warbriar Blessing", 204, Rarity.COMMON, mage.cards.w.WarbriarBlessing.class)); cards.add(new SetCardInfo("Warden of the Chained", 230, Rarity.UNCOMMON, mage.cards.w.WardenOfTheChained.class)); cards.add(new SetCardInfo("Wavebreak Hippocamp", 80, Rarity.RARE, mage.cards.w.WavebreakHippocamp.class)); cards.add(new SetCardInfo("Whirlwind Denial", 81, Rarity.UNCOMMON, mage.cards.w.WhirlwindDenial.class)); diff --git a/Mage/src/main/java/mage/game/permanent/token/ReflectionBlueToken.java b/Mage/src/main/java/mage/game/permanent/token/ReflectionBlueToken.java new file mode 100644 index 00000000000..f970ecb8efa --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/ReflectionBlueToken.java @@ -0,0 +1,28 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * @author TheElk801 + */ +public final class ReflectionBlueToken extends TokenImpl { + + public ReflectionBlueToken() { + super("Reflection", "3/2 blue Reflection creature token"); + cardType.add(CardType.CREATURE); + color.setBlue(true); + subtype.add(SubType.REFLECTION); + power = new MageInt(3); + toughness = new MageInt(2); + } + + private ReflectionBlueToken(final ReflectionBlueToken token) { + super(token); + } + + public ReflectionBlueToken copy() { + return new ReflectionBlueToken(this); + } +}