From 8dd20a3e2e68c98c1d3c77ca3171de4a4ebbbfb9 Mon Sep 17 00:00:00 2001 From: Muz Ali Date: Mon, 26 Jan 2026 20:13:02 -0600 Subject: [PATCH 1/6] Make Vastwood Animist use CreatureToken instead of custom private token --- .../src/mage/cards/v/VastwoodAnimist.java | 42 +++++++------------ Utils/mtg-cards-data.txt | 2 +- 2 files changed, 15 insertions(+), 29 deletions(-) diff --git a/Mage.Sets/src/mage/cards/v/VastwoodAnimist.java b/Mage.Sets/src/mage/cards/v/VastwoodAnimist.java index a38f6bf045b..de2b6e929ea 100644 --- a/Mage.Sets/src/mage/cards/v/VastwoodAnimist.java +++ b/Mage.Sets/src/mage/cards/v/VastwoodAnimist.java @@ -12,11 +12,14 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SubType; import mage.filter.common.FilterControlledLandPermanent; import mage.filter.common.FilterControlledPermanent; import mage.game.Game; -import mage.game.permanent.token.TokenImpl; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetControlledPermanent; /** @@ -34,7 +37,7 @@ public final class VastwoodAnimist extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(1); - // {tap}: Target land you control becomes an X/X Elemental creature until end of turn, where X is the number of Allies you control. It's still a land. + // {T}: Target land you control becomes an X/X Elemental creature until end of turn, where X is the number of Allies you control. It's still a land. Ability ability = new SimpleActivatedAbility(new VastwoodAnimistEffect(), new TapSourceCost()); ability.addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent())); this.addAbility(ability); @@ -52,14 +55,10 @@ public final class VastwoodAnimist extends CardImpl { class VastwoodAnimistEffect extends OneShotEffect { - static final FilterControlledPermanent filterAllies = new FilterControlledPermanent("allies you control"); - - static { - filterAllies.add(SubType.ALLY.getPredicate()); - } + static final FilterControlledPermanent filterAllies = new FilterControlledPermanent(SubType.ALLY); public VastwoodAnimistEffect() { - super(Outcome.Benefit); + super(Outcome.BecomeCreature); this.staticText = "Target land you control becomes an X/X Elemental creature until end of turn, where X is the number of Allies you control. It's still a land."; } @@ -75,27 +74,14 @@ class VastwoodAnimistEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int amount = new PermanentsOnBattlefieldCount(filterAllies).calculate(game, source, this); - ContinuousEffect effect = new BecomesCreatureTargetEffect(new VastwoodAnimistElementalToken(amount), false, true, Duration.EndOfTurn); + ContinuousEffect effect = new BecomesCreatureTargetEffect( + new CreatureToken(amount, amount, "X/X Elemental creature, where X is the number of Allies you control", SubType.ELEMENTAL), + false, + true, + Duration.EndOfTurn + ); effect.setTargetPointer(this.getTargetPointer().copy()); game.addEffect(effect, source); return false; } } - -class VastwoodAnimistElementalToken extends TokenImpl { - - VastwoodAnimistElementalToken(int amount) { - super("", "X/X Elemental creature, where X is the number of Allies you control"); - cardType.add(CardType.CREATURE); - subtype.add(SubType.ELEMENTAL); - power = new MageInt(amount); - toughness = new MageInt(amount); - } - private VastwoodAnimistElementalToken(final VastwoodAnimistElementalToken token) { - super(token); - } - - public VastwoodAnimistElementalToken copy() { - return new VastwoodAnimistElementalToken(this); - } -} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 11d8b0e38a4..7fa05b1b65e 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -27190,7 +27190,7 @@ Snapping Creeper|Worldwake|112|C|{2}{G}|Creature - Plant|2|3|Landfall - Whenever Strength of the Tajuru|Worldwake|113|R|{X}{G}{G}|Instant|||Multikicker {1} (You may pay an additional {1} any number of times as you cast this spell.)$Choose target creature, then choose another target creature for each time Strength of the Tajuru was kicked. Put X +1/+1 counters on each of them.| Summit Apes|Worldwake|114|U|{3}{G}|Creature - Ape|5|2|As long as you control a Mountain, Summit Apes can't be blocked except by two or more creatures.| Terastodon|Worldwake|115|R|{6}{G}{G}|Creature - Elephant|9|9|When Terastodon enters the battlefield, you may destroy up to three target noncreature permanents. For each permanent put into a graveyard this way, its controller puts a 3/3 green Elephant creature token onto the battlefield.| -Vastwood Animist|Worldwake|116|U|{2}{G}|Creature - Elf Shaman Ally|1|1|{tap}: Target land you control becomes an X/X Elemental creature until end of turn, where X is the number of Allies you control. It's still a land.| +Vastwood Animist|Worldwake|116|U|{2}{G}|Creature - Elf Shaman Ally|1|1|{T}: Target land you control becomes an X/X Elemental creature until end of turn, where X is the number of Allies you control. It's still a land.| Vastwood Zendikon|Worldwake|117|C|{4}{G}|Enchantment - Aura|||Enchant land$Enchanted land is a 6/4 green Elemental creature. It's still a land.$When enchanted land dies, return that card to its owner's hand.| Wolfbriar Elemental|Worldwake|118|R|{2}{G}{G}|Creature - Elemental|4|4|Multikicker {G} (You may pay an additional {G} any number of times as you cast this spell.)$When Wolfbriar Elemental enters the battlefield, put a 2/2 green Wolf creature token onto the battlefield for each time it was kicked.| Novablast Wurm|Worldwake|119|M|{3}{G}{G}{W}{W}|Creature - Wurm|7|7|Whenever Novablast Wurm attacks, destroy all other creatures.| From d4774ef12524b1a1361c1e6db4e3df1485b51f87 Mon Sep 17 00:00:00 2001 From: Muz Ali Date: Mon, 26 Jan 2026 19:40:44 -0600 Subject: [PATCH 2/6] Make Turn // Burn use CreatureToken instead of custom private token --- Mage.Sets/src/mage/cards/t/TurnBurn.java | 32 ++++++------------------ 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/Mage.Sets/src/mage/cards/t/TurnBurn.java b/Mage.Sets/src/mage/cards/t/TurnBurn.java index fcd1e9e2c4a..1f74740716c 100644 --- a/Mage.Sets/src/mage/cards/t/TurnBurn.java +++ b/Mage.Sets/src/mage/cards/t/TurnBurn.java @@ -1,7 +1,6 @@ package mage.cards.t; -import mage.MageInt; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect; @@ -11,7 +10,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SpellAbilityType; import mage.constants.SubType; -import mage.game.permanent.token.TokenImpl; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetAnyTarget; import mage.target.common.TargetCreaturePermanent; @@ -28,8 +27,12 @@ public final class TurnBurn extends SplitCard { // Turn // Until end of turn, target creature loses all abilities and becomes a red Weird with base power and toughness 0/1. - Effect effect = new BecomesCreatureTargetEffect(new WeirdToken(), true, false, Duration.EndOfTurn) - .withDurationRuleAtStart(true); + Effect effect = new BecomesCreatureTargetEffect( + new CreatureToken(0, 1, "red Weird with base power and toughness 0/1", SubType.WEIRD).withColor("R"), + true, + false, + Duration.EndOfTurn + ).withDurationRuleAtStart(true); getLeftHalfCard().getSpellAbility().addEffect(effect); getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent().withChooseHint("becomes a Weird")); @@ -48,25 +51,4 @@ public final class TurnBurn extends SplitCard { public TurnBurn copy() { return new TurnBurn(this); } - - private static class WeirdToken extends TokenImpl { - - private WeirdToken() { - super("Weird", "red Weird with base power and toughness 0/1"); - cardType.add(CardType.CREATURE); - color.setRed(true); - subtype.add(SubType.WEIRD); - power = new MageInt(0); - toughness = new MageInt(1); - } - private WeirdToken(final WeirdToken token) { - super(token); - } - - public WeirdToken copy() { - return new WeirdToken(this); - } - - } - } From 37ced75d2ee2aeaf3d78bb883d64bb9693304308 Mon Sep 17 00:00:00 2001 From: Muz Ali Date: Mon, 26 Jan 2026 19:23:06 -0600 Subject: [PATCH 3/6] Make Wind Zendikon use CreatureToken instead of custom private token --- Mage.Sets/src/mage/cards/w/WindZendikon.java | 60 +++++++------------- 1 file changed, 20 insertions(+), 40 deletions(-) diff --git a/Mage.Sets/src/mage/cards/w/WindZendikon.java b/Mage.Sets/src/mage/cards/w/WindZendikon.java index 210206e70e6..7f2302c6da7 100644 --- a/Mage.Sets/src/mage/cards/w/WindZendikon.java +++ b/Mage.Sets/src/mage/cards/w/WindZendikon.java @@ -1,8 +1,6 @@ package mage.cards.w; import java.util.UUID; -import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.DiesAttachedTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; @@ -12,9 +10,11 @@ import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.game.permanent.token.TokenImpl; -import mage.target.TargetPermanent; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetLandPermanent; /** @@ -27,24 +27,25 @@ public final class WindZendikon extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{U}"); this.subtype.add(SubType.AURA); - // Enchant land // Enchanted land is a 2/2 blue Elemental creature with flying. It's still a land. // When enchanted land dies, return that card to its owner's hand. - - TargetPermanent auraTarget = new TargetLandPermanent(); + + TargetLandPermanent auraTarget = new TargetLandPermanent(); this.getSpellAbility().addTarget(auraTarget); - this.getSpellAbility().addEffect(new AttachEffect(Outcome.PutCreatureInPlay)); - Ability ability = new EnchantAbility(auraTarget); - this.addAbility(ability); - - Ability ability2 = new SimpleStaticAbility(new BecomesCreatureAttachedEffect( - new WindZendikonElementalToken(), "Enchanted land is a 2/2 blue Elemental creature with flying. It's still a land", - Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.COLOR)); - this.addAbility(ability2); - - Ability ability3 = new DiesAttachedTriggeredAbility(new ReturnToHandAttachedEffect(), "enchanted land", false); - this.addAbility(ability3); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BecomeCreature)); + this.addAbility(new EnchantAbility(auraTarget)); + + this.addAbility(new SimpleStaticAbility(new BecomesCreatureAttachedEffect( + new CreatureToken( + 2, 2, "2/2 blue Elemental creature with flying", SubType.ELEMENTAL + ).withColor("U").withAbility(FlyingAbility.getInstance()), + "Enchanted land is a 2/2 blue Elemental creature with flying. It's still a land", + Duration.WhileOnBattlefield, + BecomesCreatureAttachedEffect.LoseType.COLOR + ))); + + this.addAbility(new DiesAttachedTriggeredAbility(new ReturnToHandAttachedEffect(), "enchanted land")); } private WindZendikon(final WindZendikon card) { @@ -55,25 +56,4 @@ public final class WindZendikon extends CardImpl { public WindZendikon copy() { return new WindZendikon(this); } - -} - -class WindZendikonElementalToken extends TokenImpl { - - WindZendikonElementalToken() { - super("", "2/2 blue Elemental creature with flying"); - cardType.add(CardType.CREATURE); - color.setBlue(true); - subtype.add(SubType.ELEMENTAL); - power = new MageInt(2); - toughness = new MageInt(2); - addAbility(FlyingAbility.getInstance()); - } - private WindZendikonElementalToken(final WindZendikonElementalToken token) { - super(token); - } - - public WindZendikonElementalToken copy() { - return new WindZendikonElementalToken(this); - } } From 7dfa2f57db2e0fa9204f3faf62e0f2157e6cacaf Mon Sep 17 00:00:00 2001 From: Muz Ali Date: Mon, 26 Jan 2026 19:12:27 -0600 Subject: [PATCH 4/6] Make Woodwraith Corrupter use CreatureToken instead of custom private token --- .../src/mage/cards/w/WoodwraithCorrupter.java | 33 +++++-------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/Mage.Sets/src/mage/cards/w/WoodwraithCorrupter.java b/Mage.Sets/src/mage/cards/w/WoodwraithCorrupter.java index 3642d9cce99..3fb1232ccad 100644 --- a/Mage.Sets/src/mage/cards/w/WoodwraithCorrupter.java +++ b/Mage.Sets/src/mage/cards/w/WoodwraithCorrupter.java @@ -16,7 +16,7 @@ import mage.constants.Duration; import mage.constants.SubType; import mage.constants.Zone; import mage.filter.common.FilterLandPermanent; -import mage.game.permanent.token.TokenImpl; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.TargetPermanent; /** @@ -40,7 +40,13 @@ public final class WoodwraithCorrupter extends CardImpl { this.toughness = new MageInt(6); // {1}{B}{G}, {T}: Target Forest becomes a 4/4 black and green Elemental Horror creature. It's still a land. - Effect effect = new BecomesCreatureTargetEffect(new WoodwraithCorrupterToken(), false, true, Duration.Custom); + Effect effect = new BecomesCreatureTargetEffect( + new CreatureToken(4, 4, "4/4 black and green Elemental Horror creature", SubType.ELEMENTAL, SubType.HORROR) + .withColor("BG"), + false, + true, + Duration.Custom + ); Ability ability = new SimpleActivatedAbility(effect, new ManaCostsImpl<>("{1}{B}{G}")); ability.addTarget(new TargetPermanent(filter)); ability.addCost(new TapSourceCost()); @@ -56,26 +62,3 @@ public final class WoodwraithCorrupter extends CardImpl { return new WoodwraithCorrupter(this); } } - -class WoodwraithCorrupterToken extends TokenImpl { - - public WoodwraithCorrupterToken() { - super("", "4/4 black and green Elemental Horror creature"); - cardType.add(CardType.CREATURE); - - color.setBlack(true); - color.setGreen(true); - subtype.add(SubType.ELEMENTAL); - subtype.add(SubType.HORROR); - - power = new MageInt(4); - toughness = new MageInt(4); - } - private WoodwraithCorrupterToken(final WoodwraithCorrupterToken token) { - super(token); - } - - public WoodwraithCorrupterToken copy() { - return new WoodwraithCorrupterToken(this); - } -} From a429753eb02306cfd91d8a77dc45266bee48f1c8 Mon Sep 17 00:00:00 2001 From: Muz Ali Date: Mon, 26 Jan 2026 20:03:16 -0600 Subject: [PATCH 5/6] Make Wakeroot Elemental use CreatureToken instead of custom private token --- .../src/mage/cards/w/WakerootElemental.java | 30 ++++--------------- 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/Mage.Sets/src/mage/cards/w/WakerootElemental.java b/Mage.Sets/src/mage/cards/w/WakerootElemental.java index 0402b8a290e..23fc849c528 100644 --- a/Mage.Sets/src/mage/cards/w/WakerootElemental.java +++ b/Mage.Sets/src/mage/cards/w/WakerootElemental.java @@ -14,7 +14,7 @@ import mage.constants.Duration; import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledLandPermanent; -import mage.game.permanent.token.TokenImpl; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.TargetPermanent; import java.util.UUID; @@ -38,7 +38,11 @@ public final class WakerootElemental extends CardImpl { new UntapTargetEffect(), new ManaCostsImpl<>("{G}{G}{G}{G}{G}") ); ability.addEffect(new BecomesCreatureTargetEffect( - new WakerootElementalToken(), false, true, Duration.Custom + new CreatureToken(5, 5, "Elemental creature with haste", SubType.ELEMENTAL) + .withAbility(HasteAbility.getInstance()), + false, + true, + Duration.Custom ).setText("It becomes a 5/5 Elemental creature with haste. It's still a land.")); ability.addTarget(new TargetPermanent(filter)); this.addAbility(ability); @@ -53,25 +57,3 @@ public final class WakerootElemental extends CardImpl { return new WakerootElemental(this); } } - -class WakerootElementalToken extends TokenImpl { - - WakerootElementalToken() { - super("", "5/5 Elemental creature with haste"); - this.cardType.add(CardType.CREATURE); - this.subtype.add(SubType.ELEMENTAL); - - this.power = new MageInt(5); - this.toughness = new MageInt(5); - - this.addAbility(HasteAbility.getInstance()); - } - - private WakerootElementalToken(final WakerootElementalToken token) { - super(token); - } - - public WakerootElementalToken copy() { - return new WakerootElementalToken(this); - } -} From e42c1a7561d352f937fb26a9a071415d0270f290 Mon Sep 17 00:00:00 2001 From: Muz Ali Date: Mon, 26 Jan 2026 18:32:15 -0600 Subject: [PATCH 6/6] Make Xanthic Statue use CreatureToken instead of custom private token --- .../src/mage/cards/w/WoodwraithCorrupter.java | 1 - Mage.Sets/src/mage/cards/x/XanthicStatue.java | 37 ++++++------------- 2 files changed, 11 insertions(+), 27 deletions(-) diff --git a/Mage.Sets/src/mage/cards/w/WoodwraithCorrupter.java b/Mage.Sets/src/mage/cards/w/WoodwraithCorrupter.java index 3fb1232ccad..63463352c7d 100644 --- a/Mage.Sets/src/mage/cards/w/WoodwraithCorrupter.java +++ b/Mage.Sets/src/mage/cards/w/WoodwraithCorrupter.java @@ -14,7 +14,6 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.common.FilterLandPermanent; import mage.game.permanent.token.custom.CreatureToken; import mage.target.TargetPermanent; diff --git a/Mage.Sets/src/mage/cards/x/XanthicStatue.java b/Mage.Sets/src/mage/cards/x/XanthicStatue.java index bfde2c0c8e4..85d5287bb58 100644 --- a/Mage.Sets/src/mage/cards/x/XanthicStatue.java +++ b/Mage.Sets/src/mage/cards/x/XanthicStatue.java @@ -2,7 +2,6 @@ package mage.cards.x; import java.util.UUID; -import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; @@ -11,8 +10,8 @@ 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.constants.SubType; +import mage.game.permanent.token.custom.CreatureToken; /** * @@ -24,9 +23,15 @@ public final class XanthicStatue extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{8}"); // {5}: Until end of turn, Xanthic Statue becomes an 8/8 Golem artifact creature with trample. - this.addAbility(new SimpleActivatedAbility(new BecomesCreatureSourceEffect(new XanthicStatueCreature(), CardType.ARTIFACT, Duration.EndOfTurn) - .setText("until end of turn, {this} becomes an 8/8 Golem artifact creature with trample") - , new ManaCostsImpl<>("{5}"))); + this.addAbility(new SimpleActivatedAbility( + new BecomesCreatureSourceEffect( + new CreatureToken(8, 8, "8/8 Golem artifact creature with trample", SubType.GOLEM) + .withAbility(TrampleAbility.getInstance()), + CardType.ARTIFACT, + Duration.EndOfTurn + ).setText("until end of turn, {this} becomes an 8/8 Golem artifact creature with trample"), + new ManaCostsImpl<>("{5}") + )); } private XanthicStatue(final XanthicStatue card) { @@ -38,23 +43,3 @@ public final class XanthicStatue extends CardImpl { return new XanthicStatue(this); } } - -class XanthicStatueCreature extends TokenImpl { - - public XanthicStatueCreature() { - super("Xanthic Statue", "8/8 Golem artifact creature with trample"); - cardType.add(CardType.ARTIFACT); - cardType.add(CardType.CREATURE); - power = new MageInt(8); - toughness = new MageInt(8); - - this.addAbility(TrampleAbility.getInstance()); - } - private XanthicStatueCreature(final XanthicStatueCreature token) { - super(token); - } - - public XanthicStatueCreature copy() { - return new XanthicStatueCreature(this); - } -}