diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index 664b4d79c3..0598855512 100644 --- a/Mage.Client/src/main/resources/card-pictures-tok.txt +++ b/Mage.Client/src/main/resources/card-pictures-tok.txt @@ -357,6 +357,7 @@ |Generate|TOK:C17|Rat|||DeathtouchRatToken| |Generate|TOK:C17|Vampire|||EdgarMarkovToken| |Generate|TOK:C17|Zombie|| +|Generate|TOK:C18|Myr|||BrudicladTelchorMyrToken| |Generate|TOK:CHK|Dragon Spirit|||TatsumaDragonToken| |Generate|TOK:CHK|Elemental|||SeedGuardianToken| |Generate|TOK:CHK|Illusion|||MelokuTheCloudedMirrorToken| diff --git a/Mage.Sets/src/mage/cards/a/ArixmethesSlumberingIsle.java b/Mage.Sets/src/mage/cards/a/ArixmethesSlumberingIsle.java new file mode 100644 index 0000000000..3c6578b392 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/ArixmethesSlumberingIsle.java @@ -0,0 +1,121 @@ +package mage.cards.a; + +import java.util.UUID; +import mage.MageInt; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTappedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.condition.common.SourceHasCounterCondition; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import static mage.constants.Layer.TypeChangingEffects_4; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author spjspj + */ +public final class ArixmethesSlumberingIsle extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("a spell"); + + public ArixmethesSlumberingIsle(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{U}"); + + addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.KRAKEN); + this.power = new MageInt(12); + this.toughness = new MageInt(12); + + // Arixmethes, Slumbering Isle enters the battlefield tapped with five slumber counters on it. + this.addAbility(new EntersBattlefieldTappedAbility()); + Effect effect = new AddCountersSourceEffect(CounterType.SLUMBER.createInstance(5)); + this.addAbility(new EntersBattlefieldAbility(effect, "with five slumber counters")); + + // As long as Arixmethes, Slumbering Isle has a slumber counter on it, it's a land. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( + new ArixmethesIsLandEffect(), + new SourceHasCounterCondition(CounterType.SLUMBER, 1, Integer.MAX_VALUE), + "As long as {this} has a slumber counter on it, it's a land"))); + + // Whenever you cast a spell, you may remove a slumber counter from Arixmethes. + this.addAbility(new SpellCastControllerTriggeredAbility(new RemoveCounterSourceEffect(CounterType.SLUMBER.createInstance(1)), true)); + + // {T}: Add {G}{U}. + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 1, 1, 0, 0, 0, 0, 0), new TapSourceCost())); + } + + public ArixmethesSlumberingIsle(final ArixmethesSlumberingIsle card) { + super(card); + } + + @Override + public ArixmethesSlumberingIsle copy() { + return new ArixmethesSlumberingIsle(this); + } +} + +class ArixmethesIsLandEffect extends ContinuousEffectImpl { + + public ArixmethesIsLandEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + this.staticText = "As long as {this} has a slumber counter on it, it's a land"; + } + + public ArixmethesIsLandEffect(final ArixmethesIsLandEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public ArixmethesIsLandEffect copy() { + return new ArixmethesIsLandEffect(this); + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + Permanent permanent = game.getPermanent(source.getSourceId()); + + if (permanent != null) { + switch (layer) { + case TypeChangingEffects_4: + permanent.getCardType().clear(); + permanent.addCardType(CardType.LAND); + permanent.getSubtype(game).clear(); + break; + } + return true; + } + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.TypeChangingEffects_4; + } +} diff --git a/Mage.Sets/src/mage/cards/b/BrudicladTelchorEngineer.java b/Mage.Sets/src/mage/cards/b/BrudicladTelchorEngineer.java new file mode 100644 index 0000000000..6da9effd66 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BrudicladTelchorEngineer.java @@ -0,0 +1,113 @@ +package mage.cards.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfCombatTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.BrudicladTelchorMyrToken; +import mage.players.Player; +import mage.target.common.TargetControlledPermanent; +import mage.util.functions.EmptyApplyToPermanent; + +/** + * + * @author spjspj + */ +public final class BrudicladTelchorEngineer extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creature tokens you control"); + + static { + filter.add(new TokenPredicate()); + } + + public BrudicladTelchorEngineer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}{U}{R}"); + + addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.ARTIFICER); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Creature tokens you control have haste. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter, true))); + + // At the beginning of combat on your turn, create a 2/1 blue Myr artifact creature token. Then you may choose a token you control. If you do, each other token you control becomes a copy of that token. + this.addAbility(new BeginningOfCombatTriggeredAbility(new BrudicladTelchorCombatffect(), TargetController.YOU, false)); + } + + public BrudicladTelchorEngineer(final BrudicladTelchorEngineer card) { + super(card); + } + + @Override + public BrudicladTelchorEngineer copy() { + return new BrudicladTelchorEngineer(this); + } +} + +class BrudicladTelchorCombatffect extends OneShotEffect { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent(" token you control. If you do, each other token you control becomes a copy of that token"); + + static { + filter.add(new TokenPredicate()); + } + + public BrudicladTelchorCombatffect() { + super(Outcome.Sacrifice); + this.staticText = " you may choose a token you control. If you do, each other token you control becomes a copy of that token"; + } + + public BrudicladTelchorCombatffect(final BrudicladTelchorCombatffect effect) { + super(effect); + } + + @Override + public BrudicladTelchorCombatffect copy() { + return new BrudicladTelchorCombatffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + CreateTokenEffect effect = new CreateTokenEffect(new BrudicladTelchorMyrToken(), 1); + + if (effect.apply(game, source)) { + TargetControlledPermanent target = new TargetControlledPermanent(0, 1, filter, true); + target.setNotTarget(true); + if (controller.choose(Outcome.Neutral, target, source.getSourceId(), game)) { + Permanent toCopyFromPermanent = game.getPermanent(target.getFirstTarget()); + + if (toCopyFromPermanent != null) { + for (Permanent toCopyToPermanent : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { + if (!toCopyToPermanent.equals(toCopyFromPermanent)) { + game.copyPermanent(toCopyFromPermanent, toCopyToPermanent.getId(), source, new EmptyApplyToPermanent()); + } + } + return true; + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/Commander2018.java b/Mage.Sets/src/mage/sets/Commander2018.java index a3adae9eb3..9928286208 100644 --- a/Mage.Sets/src/mage/sets/Commander2018.java +++ b/Mage.Sets/src/mage/sets/Commander2018.java @@ -21,10 +21,12 @@ public final class Commander2018 extends ExpansionSet { this.blockName = "Command Zone"; cards.add(new SetCardInfo("Ancient Stone Idol", 53, Rarity.RARE, mage.cards.a.AncientStoneIdol.class)); + cards.add(new SetCardInfo("Arixmethes, Slumbering Isle", 38, Rarity.RARE, mage.cards.a.ArixmethesSlumberingIsle.class)); cards.add(new SetCardInfo("Avenger of Zendikar", 129, Rarity.MYTHIC, mage.cards.a.AvengerOfZendikar.class)); cards.add(new SetCardInfo("Bear Umbra", 131, Rarity.RARE, mage.cards.b.BearUmbra.class)); cards.add(new SetCardInfo("Bloodtracker", 14, Rarity.RARE, mage.cards.b.Bloodtracker.class)); cards.add(new SetCardInfo("Brainstorm", 82, Rarity.UNCOMMON, mage.cards.b.Brainstorm.class)); + cards.add(new SetCardInfo("Brudiclad, Telchor Engineer", 39, Rarity.MYTHIC, mage.cards.b.BrudicladTelchorEngineer.class)); cards.add(new SetCardInfo("Bruna, Light of Alabaster", 170, Rarity.MYTHIC, mage.cards.b.BrunaLightOfAlabaster.class)); cards.add(new SetCardInfo("Budoka Gardener", 134, Rarity.RARE, mage.cards.b.BudokaGardener.class)); cards.add(new SetCardInfo("Centaur Vinecrasher", 135, Rarity.RARE, mage.cards.c.CentaurVinecrasher.class)); diff --git a/Mage/src/main/java/mage/counters/CounterType.java b/Mage/src/main/java/mage/counters/CounterType.java index 7b3dc6ae5f..2ded9a796b 100644 --- a/Mage/src/main/java/mage/counters/CounterType.java +++ b/Mage/src/main/java/mage/counters/CounterType.java @@ -106,6 +106,7 @@ public enum CounterType { SHIELD("shield"), SHRED("shred"), SLIME("slime"), + SLUMBER("slumber"), SOOT("soot"), SPITE("spite"), SPORE("spore"), diff --git a/Mage/src/main/java/mage/game/permanent/token/BrudicladTelchorMyrToken.java b/Mage/src/main/java/mage/game/permanent/token/BrudicladTelchorMyrToken.java new file mode 100644 index 0000000000..33de29d06f --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/BrudicladTelchorMyrToken.java @@ -0,0 +1,43 @@ +package mage.game.permanent.token; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import mage.MageInt; +import mage.constants.CardType; +import mage.constants.SubType; + +public final class BrudicladTelchorMyrToken extends TokenImpl { + + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("C18")); + } + + public BrudicladTelchorMyrToken() { + this((String)null); + } + + public BrudicladTelchorMyrToken(String expansionSetCode) { + super("Myr", "2/1 blue Myr artifact creature token"); + this.setOriginalExpansionSetCode(expansionSetCode); + cardType.add(CardType.CREATURE); + cardType.add(CardType.ARTIFACT); + subtype.add(SubType.MYR); + color.setBlue(true); + power = new MageInt(2); + toughness = new MageInt(1); + + availableImageSetCodes = tokenImageSets; + } + + public BrudicladTelchorMyrToken(final BrudicladTelchorMyrToken token) { + super(token); + } + + public BrudicladTelchorMyrToken copy() { + return new BrudicladTelchorMyrToken(this); + } +}