From a2592ef36e92717fb89a01a5db19014f2f5435a2 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Fri, 19 Apr 2019 08:36:52 -0400 Subject: [PATCH] implemented Sarkhan the Masterless --- .../mage/cards/s/SarkhanTheMasterless.java | 165 ++++++++++++++++++ Mage.Sets/src/mage/sets/WarOfTheSpark.java | 1 + .../game/permanent/token/DragonToken.java | 12 +- 3 files changed, 171 insertions(+), 7 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/s/SarkhanTheMasterless.java diff --git a/Mage.Sets/src/mage/cards/s/SarkhanTheMasterless.java b/Mage.Sets/src/mage/cards/s/SarkhanTheMasterless.java new file mode 100644 index 00000000000..aa6a06f345e --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SarkhanTheMasterless.java @@ -0,0 +1,165 @@ +package mage.cards.s; + +import mage.MageObjectReference; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.AttacksAllTriggeredAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.DragonToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SarkhanTheMasterless extends CardImpl { + + public SarkhanTheMasterless(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{R}{R}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.SARKHAN); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); + + // Whenever a creature attacks you or a planeswalker you control, each Dragon you control deals 1 damage to that creature. + this.addAbility(new AttacksAllTriggeredAbility( + new SarkhanTheMasterlessDamageEffect(), + false, StaticFilters.FILTER_PERMANENT_A_CREATURE, + SetTargetPointer.PERMANENT, true + )); + + // +1: Until end of turn, each planeswalker you control becomes a 4/4 red Dragon creature and gains flying. + this.addAbility(new LoyaltyAbility(new SarkhanTheMasterlessBecomeDragonEffect(), 1)); + + // -3: Create a 4/4 red Dragon creature token with flying. + this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new DragonToken()), -3)); + } + + private SarkhanTheMasterless(final SarkhanTheMasterless card) { + super(card); + } + + @Override + public SarkhanTheMasterless copy() { + return new SarkhanTheMasterless(this); + } +} + +class SarkhanTheMasterlessDamageEffect extends OneShotEffect { + + SarkhanTheMasterlessDamageEffect() { + super(Outcome.Benefit); + staticText = "each Dragon you control deals 1 damage to that creature."; + } + + private SarkhanTheMasterlessDamageEffect(final SarkhanTheMasterlessDamageEffect effect) { + super(effect); + } + + @Override + public SarkhanTheMasterlessDamageEffect copy() { + return new SarkhanTheMasterlessDamageEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent creature = game.getPermanent(targetPointer.getFirst(game, source)); + if (creature == null) { + return false; + } + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(source.getControllerId())) { + if (permanent != null && permanent.hasSubtype(SubType.DRAGON, game)) { + creature.damage(1, permanent.getId(), game); + } + } + return true; + } +} + +class SarkhanTheMasterlessBecomeDragonEffect extends ContinuousEffectImpl { + + SarkhanTheMasterlessBecomeDragonEffect() { + super(Duration.EndOfTurn, Outcome.BecomeCreature); + staticText = "Until end of turn, each planeswalker you control becomes a 4/4 red Dragon creature and gains flying."; + } + + private SarkhanTheMasterlessBecomeDragonEffect(final SarkhanTheMasterlessBecomeDragonEffect effect) { + super(effect); + } + + @Override + public SarkhanTheMasterlessBecomeDragonEffect copy() { + return new SarkhanTheMasterlessBecomeDragonEffect(this); + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(source.getControllerId())) { + if (permanent != null && permanent.isPlaneswalker()) { + affectedObjectList.add(new MageObjectReference(permanent, game)); + } + } + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + boolean flag = false; + for (MageObjectReference mor : affectedObjectList) { + Permanent permanent = mor.getPermanent(game); + if (permanent == null) { + continue; + } + flag = true; + switch (layer) { + case TypeChangingEffects_4: + if (sublayer == SubLayer.NA) { + permanent.getCardType().clear(); + permanent.addCardType(CardType.CREATURE); + permanent.getSubtype(game).clear(); + permanent.getSubtype(game).add(SubType.DRAGON); + permanent.getSuperType().clear(); + } + break; + case ColorChangingEffects_5: + permanent.getColor(game).setColor(ObjectColor.RED); + break; + case AbilityAddingRemovingEffects_6: + if (sublayer == SubLayer.NA) { + permanent.addAbility(FlyingAbility.getInstance(), source.getSourceId(), game); + } + break; + case PTChangingEffects_7: + if (sublayer == SubLayer.SetPT_7b) { + permanent.getPower().setValue(4); + permanent.getToughness().setValue(4); + } + } + } + return flag; + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.PTChangingEffects_7 + || layer == Layer.AbilityAddingRemovingEffects_6 + || layer == Layer.ColorChangingEffects_5 + || layer == Layer.TypeChangingEffects_4; + } +} diff --git a/Mage.Sets/src/mage/sets/WarOfTheSpark.java b/Mage.Sets/src/mage/sets/WarOfTheSpark.java index 73429068636..9dcf421928b 100644 --- a/Mage.Sets/src/mage/sets/WarOfTheSpark.java +++ b/Mage.Sets/src/mage/sets/WarOfTheSpark.java @@ -229,6 +229,7 @@ public final class WarOfTheSpark extends ExpansionSet { cards.add(new SetCardInfo("Saheeli, Sublime Artificer", 234, Rarity.UNCOMMON, mage.cards.s.SaheeliSublimeArtificer.class)); cards.add(new SetCardInfo("Samut's Sprint", 142, Rarity.COMMON, mage.cards.s.SamutsSprint.class)); cards.add(new SetCardInfo("Samut, Tyrant Smasher", 235, Rarity.UNCOMMON, mage.cards.s.SamutTyrantSmasher.class)); + cards.add(new SetCardInfo("Sarkhan the Masterless", 143, Rarity.RARE, mage.cards.s.SarkhanTheMasterless.class)); cards.add(new SetCardInfo("Sarkhan's Catharsis", 144, Rarity.COMMON, mage.cards.s.SarkhansCatharsis.class)); cards.add(new SetCardInfo("Shriekdiver", 103, Rarity.COMMON, mage.cards.s.Shriekdiver.class)); cards.add(new SetCardInfo("Silent Submersible", 66, Rarity.RARE, mage.cards.s.SilentSubmersible.class)); diff --git a/Mage/src/main/java/mage/game/permanent/token/DragonToken.java b/Mage/src/main/java/mage/game/permanent/token/DragonToken.java index 0d441de1caa..babf74f8df8 100644 --- a/Mage/src/main/java/mage/game/permanent/token/DragonToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/DragonToken.java @@ -1,17 +1,15 @@ - - package mage.game.permanent.token; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import mage.MageInt; import mage.abilities.keyword.FlyingAbility; import mage.constants.CardType; import mage.constants.SubType; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** - * * @author BetaSteward_at_googlemail.com */ public final class DragonToken extends TokenImpl { @@ -19,7 +17,7 @@ public final class DragonToken extends TokenImpl { static final private List tokenImageSets = new ArrayList<>(); static { - tokenImageSets.addAll(Arrays.asList("DTK", "MMA", "ALA", "MM3", "C17")); + tokenImageSets.addAll(Arrays.asList("DTK", "MMA", "ALA", "MM3", "C17", "WAR")); } public DragonToken() {