diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java index 8d5ab5c5f82..cb2e585edda 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java @@ -512,6 +512,8 @@ public class ScryfallImageSupportCards { add("SLX"); // Universes Within add("CLB"); // Commander Legends: Battle for Baldur's Gate add("2X2"); // Double Masters 2022 + add("DMU"); // Dominaria United + add("DMC"); // Dominaria United Commander add("40K"); // Warhammer 40,000 } }; diff --git a/Mage.Sets/src/mage/cards/e/EvolvedSleeper.java b/Mage.Sets/src/mage/cards/e/EvolvedSleeper.java new file mode 100644 index 00000000000..638e34339f8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EvolvedSleeper.java @@ -0,0 +1,127 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.AddCardSubTypeSourceEffect; +import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class EvolvedSleeper extends CardImpl { + + public EvolvedSleeper(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}"); + + this.subtype.add(SubType.HUMAN); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {B}: Evolved Sleeper becomes a Human Cleric with base power and toughness 2/2. + Ability ability = new SimpleActivatedAbility(new AddCardSubTypeSourceEffect( + Duration.Custom, SubType.HUMAN, SubType.CLERIC + ).setText("{this} becomes a Human Cleric"), new ManaCostsImpl<>("{B}")); + ability.addEffect(new SetPowerToughnessSourceEffect( + 2, 2, Duration.Custom, SubLayer.SetPT_7b + ).setText("with base power and toughness 2/2")); + this.addAbility(ability); + + // {1}{B}: If Evolved Sleeper is a Cleric, put a deathtouch counter on it and it becomes a Phyrexian Human Cleric with base power and toughness 3/3. + this.addAbility(new SimpleActivatedAbility( + new EvolvedSleeperClericEffect(), new ManaCostsImpl<>("{1}{B}") + )); + + // {1}{B}{B}: If Evolved Sleeper is a Phyrexian, put a +1/+1 counter on it, then you draw a card and you lose 1 life. + this.addAbility(new SimpleActivatedAbility( + new EvolvedSleeperPhyrexianEffect(), new ManaCostsImpl<>("{1}{B}{B}") + )); + } + + private EvolvedSleeper(final EvolvedSleeper card) { + super(card); + } + + @Override + public EvolvedSleeper copy() { + return new EvolvedSleeper(this); + } +} + +class EvolvedSleeperClericEffect extends OneShotEffect { + + EvolvedSleeperClericEffect() { + super(Outcome.Benefit); + staticText = "if {this} is a Cleric, put a deathtouch counter on it " + + "and it becomes a Phyrexian Human Cleric with base power and toughness 3/3"; + } + + private EvolvedSleeperClericEffect(final EvolvedSleeperClericEffect effect) { + super(effect); + } + + @Override + public EvolvedSleeperClericEffect copy() { + return new EvolvedSleeperClericEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + if (permanent == null || !permanent.hasSubtype(SubType.CLERIC, game)) { + return false; + } + permanent.addCounters(CounterType.DEATHTOUCH.createInstance(), source.getControllerId(), source, game); + game.addEffect(new AddCardSubTypeSourceEffect( + Duration.Custom, SubType.PHYREXIAN, SubType.HUMAN, SubType.CLERIC + ), source); + game.addEffect(new SetPowerToughnessSourceEffect( + 3, 3, Duration.Custom, SubLayer.SetPT_7b + ), source); + return true; + } +} + +class EvolvedSleeperPhyrexianEffect extends OneShotEffect { + + EvolvedSleeperPhyrexianEffect() { + super(Outcome.Benefit); + staticText = "if {this} is a Phyrexian, put a +1/+1 counter on it, then you draw a card and you lose 1 life"; + } + + private EvolvedSleeperPhyrexianEffect(final EvolvedSleeperPhyrexianEffect effect) { + super(effect); + } + + @Override + public EvolvedSleeperPhyrexianEffect copy() { + return new EvolvedSleeperPhyrexianEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = source.getSourcePermanentOrLKI(game); + if (permanent == null || !permanent.hasSubtype(SubType.PHYREXIAN, game)) { + return false; + } + if (source.getSourcePermanentIfItStillExists(game) != null) { + permanent.addCounters(CounterType.P1P1.createInstance(), source.getControllerId(), source, game); + } + Player player = game.getPlayer(source.getControllerId()); + game.applyEffects(); + player.drawCards(1, source, game); + player.loseLife(1, game, source, false); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/j/JayaFieryNegotiator.java b/Mage.Sets/src/mage/cards/j/JayaFieryNegotiator.java new file mode 100644 index 00000000000..f8631e6e93f --- /dev/null +++ b/Mage.Sets/src/mage/cards/j/JayaFieryNegotiator.java @@ -0,0 +1,149 @@ +package mage.cards.j; + +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.LoyaltyAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.AttackingCreatureCount; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.GetEmblemEffect; +import mage.cards.*; +import mage.constants.*; +import mage.game.Controllable; +import mage.game.Game; +import mage.game.command.emblems.JayaFieryNegotiatorEmblem; +import mage.game.events.GameEvent; +import mage.game.permanent.token.MonkRedToken; +import mage.players.Player; +import mage.target.common.TargetOpponentsCreaturePermanent; +import mage.util.CardUtil; + +import java.util.Iterator; +import java.util.Objects; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class JayaFieryNegotiator extends CardImpl { + + public JayaFieryNegotiator(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{R}{R}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.JAYA); + this.setStartingLoyalty(4); + + // +1: Create a 1/1 red Monk creature token with prowess. + this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new MonkRedToken()), 1)); + + // −1: Exile the top two cards of your library. Choose one of them. You may play that card this turn. + this.addAbility(new LoyaltyAbility(new JayaFieryNegotiatorExileEffect(), -1)); + + // −2: Choose target creature an opponent controls. Whenever you attack this turn, Jaya, Fiery Negotiator deals damage equal to the number of attacking creatures to that creature. + Ability ability = new LoyaltyAbility(new CreateDelayedTriggeredAbilityEffect( + new JayaFieryNegotiatorTriggeredAbility() + ).setText("choose target creature an opponent controls. Whenever you attack this turn, " + + "{this} deals damage equal to the number of attacking creatures to that creature"), -2); + ability.addTarget(new TargetOpponentsCreaturePermanent()); + this.addAbility(ability); + + // −8: You get an emblem with "Whenever you cast a red instant or sorcery spell, copy it twice. You may choose new targets for the copies." + this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new JayaFieryNegotiatorEmblem()), -8)); + } + + private JayaFieryNegotiator(final JayaFieryNegotiator card) { + super(card); + } + + @Override + public JayaFieryNegotiator copy() { + return new JayaFieryNegotiator(this); + } +} + +class JayaFieryNegotiatorExileEffect extends OneShotEffect { + + JayaFieryNegotiatorExileEffect() { + super(Outcome.Benefit); + staticText = "exile the top two cards of your library. Choose one of them. You may play that card this turn"; + } + + private JayaFieryNegotiatorExileEffect(final JayaFieryNegotiatorExileEffect effect) { + super(effect); + } + + @Override + public JayaFieryNegotiatorExileEffect copy() { + return new JayaFieryNegotiatorExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 2)); + Card card; + if (cards.size() < 2) { + card = cards.getRandom(game); + } else { + Iterator iterator = cards.getCards(game).iterator(); + Card card1 = iterator.next(); + Card card2 = iterator.next(); + card = player.chooseUse( + outcome, "Choose a card to play this turn", null, + card1.getName(), card2.getName(), source, game + ) ? card1 : card2; + } + if (card != null) { + CardUtil.makeCardPlayable(game, source, card, Duration.EndOfTurn, false); + } + return true; + } +} + +class JayaFieryNegotiatorTriggeredAbility extends DelayedTriggeredAbility { + + private static final DynamicValue xValue = new AttackingCreatureCount(); + + JayaFieryNegotiatorTriggeredAbility() { + super(new DamageTargetEffect(xValue), Duration.EndOfTurn, false, false); + } + + private JayaFieryNegotiatorTriggeredAbility(final JayaFieryNegotiatorTriggeredAbility ability) { + super(ability); + } + + @Override + public JayaFieryNegotiatorTriggeredAbility copy() { + return new JayaFieryNegotiatorTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return isControlledBy(game.getCombat().getAttackingPlayerId()) + && game + .getCombat() + .getAttackers() + .stream() + .map(game::getPermanent) + .filter(Objects::nonNull) + .map(Controllable::getControllerId) + .anyMatch(this::isControlledBy); + } + + @Override + public String getRule() { + return "Whenever you attack this turn, {this} deals damage equal to the number of attacking creatures to that creature."; + } +} diff --git a/Mage.Sets/src/mage/cards/l/LlanowarLoamspeaker.java b/Mage.Sets/src/mage/cards/l/LlanowarLoamspeaker.java new file mode 100644 index 00000000000..7c6cdf87458 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LlanowarLoamspeaker.java @@ -0,0 +1,55 @@ +package mage.cards.l; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.mana.AnyColorManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.game.permanent.token.custom.CreatureToken; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class LlanowarLoamspeaker extends CardImpl { + + public LlanowarLoamspeaker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.DRUID); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // {T}: Add one mana of any color. + this.addAbility(new AnyColorManaAbility()); + + // {T}: Target land you control becomes a 3/3 Elemental creature with haste until end of turn. It's still a land. Activate only as as sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility(new BecomesCreatureTargetEffect( + new CreatureToken( + 3, 3, "3/3 Elemental creature with haste", SubType.ELEMENTAL + ).withAbility(HasteAbility.getInstance()), false, true, Duration.EndOfTurn + ), new TapSourceCost()); + ability.addTarget(new TargetPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT_LAND)); + this.addAbility(ability); + } + + private LlanowarLoamspeaker(final LlanowarLoamspeaker card) { + super(card); + } + + @Override + public LlanowarLoamspeaker copy() { + return new LlanowarLoamspeaker(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/ShivanDevastator.java b/Mage.Sets/src/mage/cards/s/ShivanDevastator.java new file mode 100644 index 00000000000..a5c6a7e85df --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShivanDevastator.java @@ -0,0 +1,47 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ShivanDevastator extends CardImpl { + + public ShivanDevastator(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{R}"); + + this.subtype.add(SubType.DRAGON); + this.subtype.add(SubType.HYDRA); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Shivan Devastator enters the battlefield with X +1/+1 counters on it. + this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.P1P1.createInstance()))); + } + + private ShivanDevastator(final ShivanDevastator card) { + super(card); + } + + @Override + public ShivanDevastator copy() { + return new ShivanDevastator(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TemporalFirestorm.java b/Mage.Sets/src/mage/cards/t/TemporalFirestorm.java new file mode 100644 index 00000000000..f8c1fb93c79 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TemporalFirestorm.java @@ -0,0 +1,71 @@ +package mage.cards.t; + +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.MultikickerCount; +import mage.abilities.effects.common.DamageAllEffect; +import mage.abilities.effects.common.PhaseOutTargetEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent; +import mage.game.Game; +import mage.target.TargetPermanent; +import mage.target.targetadjustment.TargetAdjuster; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TemporalFirestorm extends CardImpl { + + public TemporalFirestorm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}{R}"); + + // Kicker {1}{W} and/or {1}{U} + KickerAbility kickerAbility = new KickerAbility("{1}{W}"); + kickerAbility.addKickerCost("{1}{U}"); + this.addAbility(kickerAbility); + + // Choose up to X creatures and/or planeswalkers you control, where X is the number of times this spell was kicked. Those permanents phase out. + this.getSpellAbility().addEffect(new PhaseOutTargetEffect().setText("choose up to X creatures and/or " + + "planeswalkers you control, where X is the number of times this spell was kicked. Those permanents phase out")); + this.getSpellAbility().setTargetAdjuster(TemporalFirestormAdjuster.instance); + + // Temporal Firestorm deals 5 damage to each creature and each planeswalker. + this.getSpellAbility().addEffect(new DamageAllEffect( + 5, StaticFilters.FILTER_PERMANENT_CREATURE_OR_PLANESWALKER + ).setText("{this} deals 5 damage to each creature and each planeswalker")); + } + + private TemporalFirestorm(final TemporalFirestorm card) { + super(card); + } + + @Override + public TemporalFirestorm copy() { + return new TemporalFirestorm(this); + } +} + +enum TemporalFirestormAdjuster implements TargetAdjuster { + instance; + private static final FilterPermanent filter = new FilterCreatureOrPlaneswalkerPermanent("creatures and/or planeswalkers you control"); + + static { + filter.add(TargetController.YOU.getControllerPredicate()); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + int kickedCount = MultikickerCount.instance.calculate(game, ability, null); + if (kickedCount > 0) { + ability.getTargets().clear(); + ability.addTarget(new TargetPermanent(0, kickedCount, filter)); + } + } +} diff --git a/Mage.Sets/src/mage/sets/DominariaUnited.java b/Mage.Sets/src/mage/sets/DominariaUnited.java new file mode 100644 index 00000000000..0df450a269b --- /dev/null +++ b/Mage.Sets/src/mage/sets/DominariaUnited.java @@ -0,0 +1,46 @@ +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * @author TheElk801 + */ +public final class DominariaUnited extends ExpansionSet { + + private static final DominariaUnited instance = new DominariaUnited(); + + public static DominariaUnited getInstance() { + return instance; + } + + private DominariaUnited() { + super("Dominaria United", "DMU", ExpansionSet.buildDate(2022, 11, 9), SetType.EXPANSION); + this.blockName = "Dominaria United"; + this.hasBoosters = false; // temporary + this.hasBasicLands = true; + this.numBoosterLands = 1; + this.numBoosterCommon = 10; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 7; + this.maxCardNumberInBooster = 281; + + cards.add(new SetCardInfo("Evolved Sleeper", 93, Rarity.RARE, mage.cards.e.EvolvedSleeper.class)); + cards.add(new SetCardInfo("Forest", 281, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Island", 278, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Jaya, Fiery Negotiator", 133, Rarity.MYTHIC, mage.cards.j.JayaFieryNegotiator.class)); + cards.add(new SetCardInfo("Llanowar Loamspeaker", 170, Rarity.RARE, mage.cards.l.LlanowarLoamspeaker.class)); + cards.add(new SetCardInfo("Mountain", 280, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Plains", 277, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Shivan Devastator", 143, Rarity.MYTHIC, mage.cards.s.ShivanDevastator.class)); + cards.add(new SetCardInfo("Swamp", 279, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Temporal Firestorm", 147, Rarity.RARE, mage.cards.t.TemporalFirestorm.class)); + } + +// @Override +// public BoosterCollator createCollator() { +// return new DominariaUnitedCollator(); +// } +} diff --git a/Mage.Sets/src/mage/sets/DominariaUnitedCommander.java b/Mage.Sets/src/mage/sets/DominariaUnitedCommander.java new file mode 100644 index 00000000000..6506f74bcb5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/DominariaUnitedCommander.java @@ -0,0 +1,21 @@ +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.constants.SetType; + +/** + * @author TheElk801 + */ +public final class DominariaUnitedCommander extends ExpansionSet { + + private static final DominariaUnitedCommander instance = new DominariaUnitedCommander(); + + public static DominariaUnitedCommander getInstance() { + return instance; + } + + private DominariaUnitedCommander() { + super("Dominaria United Commander", "DMC", ExpansionSet.buildDate(2022, 11, 9), SetType.SUPPLEMENTAL); + this.hasBasicLands = false; + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/JayaFieryNegotiatorEmblem.java b/Mage/src/main/java/mage/game/command/emblems/JayaFieryNegotiatorEmblem.java new file mode 100644 index 00000000000..8c0851713e6 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/JayaFieryNegotiatorEmblem.java @@ -0,0 +1,61 @@ +package mage.game.command.emblems; + +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.filter.FilterSpell; +import mage.filter.common.FilterInstantOrSorcerySpell; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.stack.Spell; + +/** + * @author TheElk801 + */ +public final class JayaFieryNegotiatorEmblem extends Emblem { + + private static final FilterSpell filter = new FilterInstantOrSorcerySpell("a red instant or sorcery spell"); + + static { + filter.add(new ColorPredicate(ObjectColor.RED)); + } + + // −8: You get an emblem with "Whenever you cast a red instant or sorcery spell, copy it twice. You may choose new targets for the copies." + public JayaFieryNegotiatorEmblem() { + this.setName("Emblem Jaya"); + this.setExpansionSetCodeForImage("DMU"); + this.getAbilities().add(new SpellCastControllerTriggeredAbility( + new JayaFieryNegotiatorEmblemEffect(), filter, false + )); + } +} + +class JayaFieryNegotiatorEmblemEffect extends OneShotEffect { + + JayaFieryNegotiatorEmblemEffect() { + super(Outcome.Benefit); + staticText = "copy it twice. You may choose new targets for the copies"; + } + + private JayaFieryNegotiatorEmblemEffect(final JayaFieryNegotiatorEmblemEffect effect) { + super(effect); + } + + @Override + public JayaFieryNegotiatorEmblemEffect copy() { + return new JayaFieryNegotiatorEmblemEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Spell spell = (Spell) getValue("spellCast"); + if (spell == null) { + return false; + } + spell.createCopyOnStack(game, source, source.getControllerId(), true, 2); + return true; + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/MonkRedToken.java b/Mage/src/main/java/mage/game/permanent/token/MonkRedToken.java new file mode 100644 index 00000000000..9027b715b4a --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/MonkRedToken.java @@ -0,0 +1,34 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.abilities.keyword.ProwessAbility; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.Arrays; + +/** + * @author TheElk801 + */ +public final class MonkRedToken extends TokenImpl { + + public MonkRedToken() { + super("Monk Token", "1/1 red Monk creature token with prowess"); + cardType.add(CardType.CREATURE); + color.setRed(true); + subtype.add(SubType.MONK); + power = new MageInt(1); + toughness = new MageInt(1); + addAbility(new ProwessAbility()); + + availableImageSetCodes = Arrays.asList("DMU"); + } + + public MonkRedToken(final MonkRedToken token) { + super(token); + } + + public MonkRedToken copy() { + return new MonkRedToken(this); + } +} diff --git a/Utils/known-sets.txt b/Utils/known-sets.txt index de887f9739a..d31fe6f3f63 100644 --- a/Utils/known-sets.txt +++ b/Utils/known-sets.txt @@ -46,6 +46,8 @@ Dark Ascension|DarkAscension| Darksteel|Darksteel| Dissension|Dissension| Dominaria|Dominaria| +Dominaria United|DominariaUnited| +Dominaria United Commander|DominariaUnitedCommander| Dragon's Maze|DragonsMaze| Dragons of Tarkir|DragonsOfTarkir| Duel Decks: Ajani vs. Nicol Bolas|DuelDecksAjaniVsNicolBolas| diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 7b744e42d7c..b0fe3838b9b 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -45225,3 +45225,16 @@ Vanguard Suppressor|Warhammer 40,000|27|R|{3}{U}|Creature - Astartes Warrior|3|2 Blood for the Blood God!|Warhammer 40,000|108|C|{8}{B}{B}{R}|Instant|||This spell costs {1} less to cast for each creature that died this turn.$Discard your hand, then draw eight cards. Blood for the Blood God! deals 8 damage to each opponent. Exile Blood for the Blood God!.| Abaddon the Despoiler|Warhammer 40,000|171|M|{2}{U}{B}{R}|Legendary Creature - Astartes Warrior|5|5|Trample$Mark of the Chaos Ascendant — During your turn, spells you cast from your hand with mana value X or less have cascade, where X is the total amount of life your opponents have lost this turn.| Fabricate|Warhammer 40,000|181|R|{2}{U}|Sorcery|||Search your library for an artifact card, reveal it, put it into your hand, then shuffle.| +Evolved Sleeper|Dominaria United|93|R|{B}|Creature - Human|1|1|{B}: Evolved Sleeper becomes a Human Cleric with base power and toughness 2/2.${1}{B}: If Evolved Sleeper is a Cleric, put a deathtouch counter on it and it becomes a Phyrexian Human Cleric with base power and toughness 3/3.${1}{B}{B}: If Evolved Sleeper is a Phyrexian, put a +1/+1 counter on it, then you draw a card and you lose 1 life.| +Jaya, Fiery Negotiator|Dominaria United|133|M|{2}{R}{R}|Legendary Planeswalker - Jaya|4|+1: Create a 1/1 red Monk creature token with prowess.$−1: Exile the top two cards of your library. Choose one of them. You may play that card this turn.$−2: Choose target creature an opponent controls. Whenever you attack this turn, Jaya, Fiery Negotiator deals damage equal to the number of attacking creatures to that creature.$−8: You get an emblem with "Whenever you cast a red instant or sorcery spell, copy it twice. You may choose new targets for the copies."| +Shivan Devastator|Dominaria United|143|M|{X}{R}|Creature - Dragon Hydra|0|0|Flying, haste$Shivan Devastator enters the battlefield with X +1/+1 counters on it.| +Temporal Firestorm|Dominaria United|147|R|{3}{R}{R}|Sorcery|||Kicker {1}{W} and/or {1}{U}$Choose up to X creatures and/or planeswalkers you control, where X is the number of times this spell was kicked. Those permanents phase out.$Temporal Firestorm deals 5 damage to each creature and each planeswalker.| +Llanowar Loamspeaker|Dominaria United|170|R|{1}{G}|Creature - Elf Druid|1|3|{T}: Add one mana of any color.${T}: Target land you control becomes a 3/3 Elemental creature with haste until end of turn. It's still a land. Activate only as as sorcery.| +Plains|Dominaria United|277|C||Basic Land - Plains|||({T}: Add {W}.)| +Island|Dominaria United|278|C||Basic Land - Island|||({T}: Add {U}.)| +Swamp|Dominaria United|279|C||Basic Land - Swamp|||({T}: Add {B}.)| +Mountain|Dominaria United|280|C||Basic Land - Mountain|||({T}: Add {R}.)| +Forest|Dominaria United|281|C||Basic Land - Forest|||({T}: Add {G}.)| +Jasmine Boreal of the Seven|Dominaria United Commander|33|U|{1}{G}{W}|Legendary Creature - Human Druid|2|4|{T}: Add {G}{W}. Spend this mana only to cast creature spells with no abilities.$Creatures you control with no abilities can't be blocked by creatures with abilities.| +Ramirez DePietro, Pillager|Dominaria United Commander|38|U|{2}{U}{B}|Legendary Creature - Human Pirate|4|3|When Ramirez DePietro, Pillager enters the battlefield, you lose 2 life and create two Treasure tokens.$Whenever one or more Pirates you control deal combat damage to a player, exile the top card of that player's library. You may cast that card for as long as it remains exiled.| +Tor Wauki the Younger|Dominaria United Commander|46|U|{3}{B}{R}|Legendary Creature - Human Archer|3|3|Reach, lifelink$If another source you control would deal noncombat damage to a permanent or player, it deals that much damage plus 1 to that permanent or player instead.$Whenever you cast an instant or sorcery spell, Tor Wauki the Younger deals 2 damage to any target.| diff --git a/Utils/mtg-sets-data.txt b/Utils/mtg-sets-data.txt index 94cbeba4366..4be6749e324 100644 --- a/Utils/mtg-sets-data.txt +++ b/Utils/mtg-sets-data.txt @@ -81,6 +81,8 @@ Dissension|DIS| Dark Ascension|DKA| Deckmasters|DKM| Dominaria|DOM| +Dominaria United|DMU| +Dominaria United Commander|DMC| From the Vault: Dragons|DRB| The Dark|DRK| Darksteel|DST|