From dd316ee61fe926ca35c0471109740af283dd564c Mon Sep 17 00:00:00 2001 From: theelk801 Date: Sun, 28 Sep 2025 19:11:23 -0400 Subject: [PATCH] [ECL] Implement Mutable Explorer --- .../src/mage/cards/m/MutableExplorer.java | 44 +++++++++++++++++++ Mage.Sets/src/mage/cards/m/Mutavault.java | 40 +++++------------ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + .../game/permanent/token/MutavaultToken.java | 38 ++++++++++++++++ .../permanent/token/custom/CreatureToken.java | 5 +++ 5 files changed, 100 insertions(+), 29 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/m/MutableExplorer.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/MutavaultToken.java diff --git a/Mage.Sets/src/mage/cards/m/MutableExplorer.java b/Mage.Sets/src/mage/cards/m/MutableExplorer.java new file mode 100644 index 00000000000..d677e8be10c --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MutableExplorer.java @@ -0,0 +1,44 @@ +package mage.cards.m; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.ChangelingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.game.permanent.token.MutavaultToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MutableExplorer extends CardImpl { + + public MutableExplorer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add(SubType.SHAPESHIFTER); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Changeling + this.addAbility(new ChangelingAbility()); + + // When this creature enters, create a tapped Mutavault token. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new CreateTokenEffect(new MutavaultToken(), 1, true) + )); + } + + private MutableExplorer(final MutableExplorer card) { + super(card); + } + + @Override + public MutableExplorer copy() { + return new MutableExplorer(this); + } +} diff --git a/Mage.Sets/src/mage/cards/m/Mutavault.java b/Mage.Sets/src/mage/cards/m/Mutavault.java index 62ab683908b..290d708d601 100644 --- a/Mage.Sets/src/mage/cards/m/Mutavault.java +++ b/Mage.Sets/src/mage/cards/m/Mutavault.java @@ -1,34 +1,34 @@ - package mage.cards.m; -import java.util.UUID; -import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Zone; -import mage.game.permanent.token.TokenImpl; +import mage.game.permanent.token.custom.CreatureToken; + +import java.util.UUID; /** - * * @author jonubuu */ public final class Mutavault extends CardImpl { public Mutavault(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // {tap}: Add {C}. this.addAbility(new ColorlessManaAbility()); + // {1}: Mutavault becomes a 2/2 creature with all creature types until end of turn. It's still a land. - this.addAbility(new SimpleActivatedAbility( - new BecomesCreatureSourceEffect(new MutavaultToken(), CardType.LAND, Duration.EndOfTurn), - new ManaCostsImpl<>("{1}"))); + this.addAbility(new SimpleActivatedAbility(new BecomesCreatureSourceEffect( + new CreatureToken(2, 2, "2/2 creature with all creature types") + .withAllCreatureTypes(true), + CardType.LAND, Duration.EndOfTurn + ), new GenericManaCost(1))); } private Mutavault(final Mutavault card) { @@ -40,21 +40,3 @@ public final class Mutavault extends CardImpl { return new Mutavault(this); } } - -class MutavaultToken extends TokenImpl { - - public MutavaultToken() { - super("", "2/2 creature with all creature types"); - cardType.add(CardType.CREATURE); - subtype.setIsAllCreatureTypes(true); - power = new MageInt(2); - toughness = new MageInt(2); - } - private MutavaultToken(final MutavaultToken token) { - super(token); - } - - public MutavaultToken copy() { - return new MutavaultToken(this); - } -} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index ecb60af409b..3dba5a9e8a6 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -27,6 +27,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Blood Crypt", 349, Rarity.RARE, mage.cards.b.BloodCrypt.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Hallowed Fountain", 265, Rarity.RARE, mage.cards.h.HallowedFountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Hallowed Fountain", 347, Rarity.RARE, mage.cards.h.HallowedFountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mutable Explorer", 186, Rarity.RARE, mage.cards.m.MutableExplorer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mutable Explorer", 327, Rarity.RARE, mage.cards.m.MutableExplorer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Overgrown Tomb", 266, Rarity.RARE, mage.cards.o.OvergrownTomb.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Overgrown Tomb", 350, Rarity.RARE, mage.cards.o.OvergrownTomb.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Steam Vents", 267, Rarity.RARE, mage.cards.s.SteamVents.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage/src/main/java/mage/game/permanent/token/MutavaultToken.java b/Mage/src/main/java/mage/game/permanent/token/MutavaultToken.java new file mode 100644 index 00000000000..cb93749ce12 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/MutavaultToken.java @@ -0,0 +1,38 @@ +package mage.game.permanent.token; + +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; +import mage.abilities.mana.ColorlessManaAbility; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.game.permanent.token.custom.CreatureToken; + +/** + * @author TheElk801 + */ +public final class MutavaultToken extends TokenImpl { + + public MutavaultToken() { + super("Mutavault", "Mutavault token"); + cardType.add(CardType.LAND); + + // {tap}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {1}: Mutavault becomes a 2/2 creature with all creature types until end of turn. It's still a land. + this.addAbility(new SimpleActivatedAbility(new BecomesCreatureSourceEffect( + new CreatureToken(2, 2, "2/2 creature with all creature types") + .withAllCreatureTypes(true), + CardType.LAND, Duration.EndOfTurn + ), new GenericManaCost(1))); + } + + private MutavaultToken(final MutavaultToken token) { + super(token); + } + + public MutavaultToken copy() { + return new MutavaultToken(this); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java b/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java index eb2e87400d0..71a845f06ad 100644 --- a/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java @@ -73,6 +73,11 @@ public final class CreatureToken extends TokenImpl { return this; } + public CreatureToken withAllCreatureTypes(boolean allCreatureTypes) { + this.subtype.setIsAllCreatureTypes(allCreatureTypes); + return this; + } + private CreatureToken(final CreatureToken token) { super(token); }