diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java index a73ed21c14f..3046eb508ac 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java @@ -388,6 +388,27 @@ public class ScryfallImageSupportTokens { put("PCA/Plane - Turri Island", "https://api.scryfall.com/cards/opca/82/en?format=image"); put("PCA/Plane - Undercity Reaches", "https://api.scryfall.com/cards/opca/83/en?format=image"); + // C20 + put("C20/Angel", "https://api.scryfall.com/cards/tc20/1/en?format=image"); + put("C20/Beast", "https://api.scryfall.com/cards/tc20/11/en?format=image"); + put("C20/Bird Illusion", "https://api.scryfall.com/cards/tc20/7/en?format=image"); + put("C20/Bird", "https://api.scryfall.com/cards/tc20/2/en?format=image"); + put("C20/Dinosaur Cat", "https://api.scryfall.com/cards/tc20/16/en?format=image"); + put("C20/Drake", "https://api.scryfall.com/cards/tc20/8/en?format=image"); + put("C20/Elemental/1", "https://api.scryfall.com/cards/tc20/10/en?format=image"); // 3/1 + put("C20/Elemental/2", "https://api.scryfall.com/cards/tc20/3/en?format=image"); // 4/4 + put("C20/Goblin Warrior", "https://api.scryfall.com/cards/tc20/17/en?format=image"); + put("C20/Human", "https://api.scryfall.com/cards/tc20/4/en?format=image"); + put("C20/Hydra", "https://api.scryfall.com/cards/tc20/12/en?format=image"); + put("C20/Insect/1", "https://api.scryfall.com/cards/tc20/13/en?format=image"); // deathtouch + put("C20/Insect/2", "https://api.scryfall.com/cards/tc20/18/en?format=image"); // haste + put("C20/Saproling", "https://api.scryfall.com/cards/tc20/14/en?format=image"); + put("C20/Snake", "https://api.scryfall.com/cards/tc20/15/en?format=image"); + put("C20/Soldier", "https://api.scryfall.com/cards/tc20/5/en?format=image"); + put("C20/Spirit", "https://api.scryfall.com/cards/tc20/6/en?format=image"); + put("C20/Treasure", "https://api.scryfall.com/cards/tc20/19/en?format=image"); + put("C20/Zombie", "https://api.scryfall.com/cards/tc20/9/en?format=image"); + // generate supported sets supportedSets.clear(); for (String cardName : this.keySet()) { diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index d3426689e90..e5a153c878b 100644 --- a/Mage.Client/src/main/resources/card-pictures-tok.txt +++ b/Mage.Client/src/main/resources/card-pictures-tok.txt @@ -571,7 +571,7 @@ |Generate|TOK:DGM|Wurm|||WurmToken3| |Generate|TOK:DIS|Bird|||DovescapeToken| |Generate|TOK:DIS|Drake|||LeafdrakeRoostDrakeToken| -|Generate|TOK:DIS|Elemental|||ElementalToken| +|Generate|TOK:DIS|Elemental|||ResearchDevelopmentToken| |Generate|TOK:DIS|Goblin|||RakdosGuildmageGoblinToken| |Generate|TOK:DIS|Saproling|||SaprolingToken| |Generate|TOK:DIS|Snake|||PatagiaViperSnakeToken| @@ -956,7 +956,7 @@ |Generate|TOK:MOR|Wolf|||WolfToken| |Generate|TOK:MRD|Beast|||OneDozenEyesBeastToken| |Generate|TOK:MRD|Demon|||ReignOfThePitToken| -|Generate|TOK:MRD|Elemental|||ElementalToken| +|Generate|TOK:MRD|Elemental|||ElementalTokenWithHaste| |Generate|TOK:MRD|Insect|||InsectToken| |Generate|TOK:MRD|Myr|||MyrToken| |Generate|TOK:MRD|Pentavite|||PentaviteToken| @@ -990,7 +990,7 @@ |Generate|TOK:OGW|Eldrazi Scion|5||EldraziScionToken| |Generate|TOK:OGW|Eldrazi Scion|6||EldraziScionToken| |Generate|TOK:OGW|Elemental|1||SeedGuardianToken| -|Generate|TOK:OGW|Elemental|2||ElementalToken| +|Generate|TOK:OGW|Elemental|2||ElementalTokenWithHaste| |Generate|TOK:OGW|Knight Ally|||KnightAllyToken| |Generate|TOK:OGW|Kor Ally|||KorAllyToken| |Generate|TOK:OGW|Octopus|||OctopusToken| @@ -1063,7 +1063,7 @@ |Generate|TOK:RTR|Bird|||BirdToken| |Generate|TOK:RTR|Centaur|||CentaurToken| |Generate|TOK:RTR|Dragon|||UtvaraHellkiteDragonToken| -|Generate|TOK:RTR|Elemental|| +|Generate|TOK:RTR|Elemental|||GreenAndWhiteElementalToken| |Generate|TOK:RTR|Goblin|||GoblinToken| |Generate|TOK:RTR|Knight|||KnightToken| |Generate|TOK:RTR|Ooze|||MysticGenesisOozeToken| @@ -1106,7 +1106,7 @@ |Generate|TOK:SOI|Vampire Knight|||VampireKnightToken| |Generate|TOK:SOI|Wolf|||WolfToken| |Generate|TOK:SOI|Zombie|||ZombieToken| -|Generate|TOK:SOK|Elemental|||ElementalToken| +|Generate|TOK:SOK|Elemental|||ElementalTokenWithHaste| |Generate|TOK:SOK|Snake|||SnakeToken| |Generate|TOK:SOK|Spirit|||SpiritToken| |Generate|TOK:SOK|Urami|||UramiToken| @@ -1328,6 +1328,8 @@ |Generate|TOK:M20|Treasure|||TreasureToken| |Generate|TOK:M20|Wolf|||WolfToken| |Generate|TOK:M20|Zombie|||ZombieToken| + +# ELD |Generate|TOK:ELD|Bear|||BearToken| |Generate|TOK:ELD|Boar|||WolfsQuarryToken| |Generate|TOK:ELD|Dwarf|||DwarfToken| @@ -1346,6 +1348,8 @@ |Generate|TOK:ELD|Mouse|||MouseToken| |Generate|TOK:ELD|Rat|||RatToken| |Generate|TOK:ELD|Wolf|||GarrukCursedHuntsmanToken| + +# THB |Generate|TOK:THB|Goat|||GoatToken| |Generate|TOK:THB|Human Soldier|||HumanSoldierToken| |Generate|TOK:THB|Pegasus|||PegasusToken2| @@ -1360,6 +1364,8 @@ |Generate|TOK:THB|Nightmare|||AshiokNightmareMuseToken| |Generate|TOK:THB|Gold|||GoldToken| |Generate|TOK:THB|Wall|||ArtifactWallToken| + +# IKO |Generate|TOK:IKO|Beast|||BeastToken| |Generate|TOK:IKO|Cat Bird|||CatBirdToken| |Generate|TOK:IKO|Cat|||CatToken| @@ -1370,4 +1376,25 @@ |Generate|TOK:IKO|Human Soldier|2||HumanSoldierToken| |Generate|TOK:IKO|Human Soldier|3||HumanSoldierToken| |Generate|TOK:IKO|Kraken|||KrakenToken| -|Generate|TOK:IKO|Shark|||SharkToken| \ No newline at end of file +|Generate|TOK:IKO|Shark|||SharkToken| + +# C20 +|Generate|TOK:C20|Angel|||AngelToken| +|Generate|TOK:C20|Beast|||BeastToken2| +|Generate|TOK:C20|Bird|||BirdToken| +|Generate|TOK:C20|Bird Illusion|||BirdIllusionToken| +|Generate|TOK:C20|Dinosaur Cat|||DinosaurCatToken| +|Generate|TOK:C20|Drake|||DrakeToken| +|Generate|TOK:C20|Elemental|1||ElementalTokenWithHaste| +|Generate|TOK:C20|Elemental|2||WhiteElementalToken| +|Generate|TOK:C20|Goblin Warrior|||GoblinWarriorToken| +|Generate|TOK:C20|Human|||HumanToken| +|Generate|TOK:C20|Hydra|||ZaxaraTheExemplaryHydraToken| +|Generate|TOK:C20|Insect|1||HornetQueenInsectToken| +|Generate|TOK:C20|Insect|2||TheLocustGodInsectToken| +|Generate|TOK:C20|Saproling|||SaprolingToken| +|Generate|TOK:C20|Snake|||SnakeToken| +|Generate|TOK:C20|Soldier|||SoldierToken| +|Generate|TOK:C20|Spirit|||SpiritWhiteToken| +|Generate|TOK:C20|Treasure|||TreasureToken| +|Generate|TOK:C20|Zombie|||ZombieToken| \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/a/AbzanAscendancy.java b/Mage.Sets/src/mage/cards/a/AbzanAscendancy.java index 558cfe42418..ffea394e3d3 100644 --- a/Mage.Sets/src/mage/cards/a/AbzanAscendancy.java +++ b/Mage.Sets/src/mage/cards/a/AbzanAscendancy.java @@ -1,7 +1,5 @@ - package mage.cards.a; -import java.util.UUID; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; @@ -17,8 +15,9 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.TokenPredicate; import mage.game.permanent.token.SpiritWhiteToken; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class AbzanAscendancy extends CardImpl { @@ -37,7 +36,7 @@ public final class AbzanAscendancy extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new AddCountersAllEffect(CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE), false)); // Whenever a nontoken creature you control dies, create a 1/1 white Spirit creature token with flying. - this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken("KTK")), false, filter)); + this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken()), false, filter)); } diff --git a/Mage.Sets/src/mage/cards/a/ArtifactMutation.java b/Mage.Sets/src/mage/cards/a/ArtifactMutation.java index 416308846b2..abc4b8b08c1 100644 --- a/Mage.Sets/src/mage/cards/a/ArtifactMutation.java +++ b/Mage.Sets/src/mage/cards/a/ArtifactMutation.java @@ -1,7 +1,5 @@ - package mage.cards.a; -import java.util.UUID; import mage.abilities.dynamicvalue.common.TargetConvertedManaCost; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyTargetEffect; @@ -11,19 +9,20 @@ import mage.constants.CardType; import mage.game.permanent.token.SaprolingToken; import mage.target.common.TargetArtifactPermanent; +import java.util.UUID; + /** - * * @author North */ public final class ArtifactMutation extends CardImpl { public ArtifactMutation(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{R}{G}"); - + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R}{G}"); // Destroy target artifact. It can't be regenerated. this.getSpellAbility().addEffect(new DestroyTargetEffect(true)); this.getSpellAbility().addTarget(new TargetArtifactPermanent()); + // create X 1/1 green Saproling creature tokens, where X is that artifact's converted mana cost. this.getSpellAbility().addEffect(new CreateTokenEffect(new SaprolingToken(), TargetConvertedManaCost.instance).setText("create X 1/1 green Saproling creature tokens, where X is that artifact's converted mana cost")); } diff --git a/Mage.Sets/src/mage/cards/b/BenevolentOffering.java b/Mage.Sets/src/mage/cards/b/BenevolentOffering.java index 1a708b23439..1e4ea4310b1 100644 --- a/Mage.Sets/src/mage/cards/b/BenevolentOffering.java +++ b/Mage.Sets/src/mage/cards/b/BenevolentOffering.java @@ -1,7 +1,5 @@ - package mage.cards.b; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -19,8 +17,9 @@ import mage.target.Target; import mage.target.common.TargetOpponent; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class BenevolentOffering extends CardImpl { @@ -69,10 +68,10 @@ class BenevolentOfferingEffect1 extends OneShotEffect { target.choose(Outcome.Sacrifice, source.getControllerId(), source.getSourceId(), game); Player opponent = game.getPlayer(target.getFirstTarget()); if (opponent != null) { - Effect effect = new CreateTokenTargetEffect(new SpiritWhiteToken("C14"), 3); + Effect effect = new CreateTokenTargetEffect(new SpiritWhiteToken(), 3); effect.setTargetPointer(new FixedTarget(opponent.getId())); effect.apply(game, source); - new CreateTokenEffect(new SpiritWhiteToken("C14"), 3).apply(game, source); + new CreateTokenEffect(new SpiritWhiteToken(), 3).apply(game, source); return true; } } diff --git a/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java b/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java index 2987b764e4b..a4e54c3fd3a 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java +++ b/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java @@ -18,7 +18,7 @@ import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.StaticFilters; import mage.game.Game; -import mage.game.permanent.token.ElementalToken; +import mage.game.permanent.token.ElementalTokenWithHaste; import mage.players.Player; import java.util.UUID; @@ -75,7 +75,7 @@ class ChandraElementalEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - CreateTokenEffect effect = new CreateTokenEffect(new ElementalToken("OGW", 2, true), 2); + CreateTokenEffect effect = new CreateTokenEffect(new ElementalTokenWithHaste(), 2); effect.apply(game, source); effect.exileTokensCreatedAtNextEndStep(game, source); return true; diff --git a/Mage.Sets/src/mage/cards/c/ConfrontTheAssault.java b/Mage.Sets/src/mage/cards/c/ConfrontTheAssault.java index 985bc5f919a..2c45b4c15d7 100644 --- a/Mage.Sets/src/mage/cards/c/ConfrontTheAssault.java +++ b/Mage.Sets/src/mage/cards/c/ConfrontTheAssault.java @@ -31,7 +31,7 @@ public final class ConfrontTheAssault extends CardImpl { this.addAbility(ability); // Create three 1/1 white Spirit creature tokens with flying. - this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken("ANA"), 3)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken(), 3)); } public ConfrontTheAssault(final ConfrontTheAssault card) { diff --git a/Mage.Sets/src/mage/cards/c/CustodiSoulbinders.java b/Mage.Sets/src/mage/cards/c/CustodiSoulbinders.java index ab23d88f7d7..968e1360af2 100644 --- a/Mage.Sets/src/mage/cards/c/CustodiSoulbinders.java +++ b/Mage.Sets/src/mage/cards/c/CustodiSoulbinders.java @@ -1,7 +1,5 @@ - package mage.cards.c; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; @@ -21,19 +19,21 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.AnotherPredicate; import mage.game.permanent.token.SpiritWhiteToken; +import java.util.UUID; + /** - * * @author emerald000 */ public final class CustodiSoulbinders extends CardImpl { - + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures"); + static { filter.add(AnotherPredicate.instance); } public CustodiSoulbinders(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.CLERIC); this.power = new MageInt(0); @@ -42,14 +42,14 @@ public final class CustodiSoulbinders extends CardImpl { // Custodi Soulbinders enters the battlefield with X +1/+1 counters on it, where X is the number of other creatures on the battlefield. this.addAbility(new EntersBattlefieldAbility( new AddCountersSourceEffect( - CounterType.P1P1.createInstance(), - new PermanentsOnBattlefieldCount(filter), - false), + CounterType.P1P1.createInstance(), + new PermanentsOnBattlefieldCount(filter), + false), "with X +1/+1 counters on it, where X is the number of other creatures on the battlefield")); - + // {2}{W}, Remove a +1/+1 counter from Custodi Soulbinders: Create a 1/1 white Spirit creature token with flying. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new SpiritWhiteToken("CNS")), new ManaCostsImpl<>("{2}{W}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new SpiritWhiteToken()), new ManaCostsImpl<>("{2}{W}")); ability.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance())); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/f/FeralLightning.java b/Mage.Sets/src/mage/cards/f/FeralLightning.java index e15766daf25..d87cf22bad3 100644 --- a/Mage.Sets/src/mage/cards/f/FeralLightning.java +++ b/Mage.Sets/src/mage/cards/f/FeralLightning.java @@ -1,7 +1,5 @@ - package mage.cards.f; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -10,17 +8,18 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; -import mage.game.permanent.token.ElementalToken; +import mage.game.permanent.token.ElementalTokenWithHaste; import mage.players.Player; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class FeralLightning extends CardImpl { public FeralLightning(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{R}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}{R}{R}"); // Create three 3/1 red Elemental creature tokens with haste. Exile them at the beginning of the next end step. this.getSpellAbility().addEffect(new FeralLightningEffect()); @@ -57,7 +56,7 @@ class FeralLightningEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - CreateTokenEffect effect = new CreateTokenEffect(new ElementalToken("CON", 1, true), 3); + CreateTokenEffect effect = new CreateTokenEffect(new ElementalTokenWithHaste(), 3); effect.apply(game, source); effect.exileTokensCreatedAtNextEndStep(game, source); return true; diff --git a/Mage.Sets/src/mage/cards/g/GeistHonoredMonk.java b/Mage.Sets/src/mage/cards/g/GeistHonoredMonk.java index 879fce467c0..d6d1174281e 100644 --- a/Mage.Sets/src/mage/cards/g/GeistHonoredMonk.java +++ b/Mage.Sets/src/mage/cards/g/GeistHonoredMonk.java @@ -38,7 +38,7 @@ public final class GeistHonoredMonk extends CardImpl { .addHint(CreaturesYouControlHint.instance)); // When Geist-Honored Monk enters the battlefield, create two 1/1 white Spirit creature tokens with flying. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken("ISD"), 2))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken(), 2))); } public GeistHonoredMonk(final GeistHonoredMonk card) { diff --git a/Mage.Sets/src/mage/cards/g/GroveOfTheGuardian.java b/Mage.Sets/src/mage/cards/g/GroveOfTheGuardian.java index d7c445de70d..2237f3b4c8d 100644 --- a/Mage.Sets/src/mage/cards/g/GroveOfTheGuardian.java +++ b/Mage.Sets/src/mage/cards/g/GroveOfTheGuardian.java @@ -1,8 +1,5 @@ - package mage.cards.g; -import java.util.UUID; -import mage.MageInt; import mage.Mana; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -11,20 +8,19 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.keyword.VigilanceAbility; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.TappedPredicate; -import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.GreenAndWhiteElementalToken; import mage.target.common.TargetControlledCreaturePermanent; +import java.util.UUID; + /** * @author LevelX2 */ @@ -43,7 +39,7 @@ public final class GroveOfTheGuardian extends CardImpl { this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana(1), new TapSourceCost())); // {3}{G}{W}, {T}, Tap two untapped creatures you control, Sacrifice Grove of the Guardian: Create an 8/8 green and white Elemental creature token with vigilance. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new ElementalToken(), 1), new ManaCostsImpl("{3}{G}{W}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new GreenAndWhiteElementalToken(), 1), new ManaCostsImpl("{3}{G}{W}")); ability.addCost(new TapSourceCost()); ability.addCost(new TapTargetCost(new TargetControlledCreaturePermanent(2, 2, filter, false))); ability.addCost(new SacrificeSourceCost()); @@ -58,26 +54,4 @@ public final class GroveOfTheGuardian extends CardImpl { public GroveOfTheGuardian copy() { return new GroveOfTheGuardian(this); } - - private static class ElementalToken extends TokenImpl { - - ElementalToken() { - super("Elemental", "8/8 green and white Elemental creature token with vigilance"); - - cardType.add(CardType.CREATURE); - color.setGreen(true); - color.setWhite(true); - this.subtype.add(SubType.ELEMENTAL); - power = new MageInt(8); - toughness = new MageInt(8); - this.addAbility(VigilanceAbility.getInstance()); - } - public ElementalToken(final ElementalToken token) { - super(token); - } - - public ElementalToken copy() { - return new ElementalToken(this); - } - } } diff --git a/Mage.Sets/src/mage/cards/l/LightningCoils.java b/Mage.Sets/src/mage/cards/l/LightningCoils.java index b3b8a32f3a0..fbc516c5b5d 100644 --- a/Mage.Sets/src/mage/cards/l/LightningCoils.java +++ b/Mage.Sets/src/mage/cards/l/LightningCoils.java @@ -1,7 +1,5 @@ - package mage.cards.l; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.DiesCreatureTriggeredAbility; @@ -19,16 +17,18 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.TokenPredicate; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.game.permanent.token.ElementalToken; +import mage.game.permanent.token.ElementalTokenWithHaste; import mage.players.Player; +import java.util.UUID; + /** - * * @author escplan9 - Derek Monturo */ public final class LightningCoils extends CardImpl { - + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a nontoken creature you control"); + static { filter.add(TargetController.YOU.getControllerPredicate()); filter.add(Predicates.not(TokenPredicate.instance)); @@ -36,13 +36,13 @@ public final class LightningCoils extends CardImpl { public LightningCoils(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); - + // Whenever a nontoken creature you control dies, put a charge counter on Lightning Coils. this.addAbility( new DiesCreatureTriggeredAbility( - new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true), + new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true), false, filter)); - + // At the beginning of your upkeep, if Lightning Coils has five or more charge counters on it, remove all of them from it // and put that many 3/1 red Elemental creature tokens with haste onto the battlefield. // Exile them at the beginning of the next end step. @@ -79,9 +79,9 @@ class LightningCoilsEffect extends OneShotEffect { if (counters >= 5) { // remove all the counters and create that many tokens p.removeCounters(CounterType.CHARGE.getName(), p.getCounters(game).getCount(CounterType.CHARGE), game); - CreateTokenEffect effect = new CreateTokenEffect(new ElementalToken("CON", 1, true), counters); + CreateTokenEffect effect = new CreateTokenEffect(new ElementalTokenWithHaste(), counters); effect.apply(game, source); - + // exile those tokens at next end step effect.exileTokensCreatedAtNextEndStep(game, source); return true; diff --git a/Mage.Sets/src/mage/cards/l/LingeringSouls.java b/Mage.Sets/src/mage/cards/l/LingeringSouls.java index e6d972cb4ef..0ebfd5ca775 100644 --- a/Mage.Sets/src/mage/cards/l/LingeringSouls.java +++ b/Mage.Sets/src/mage/cards/l/LingeringSouls.java @@ -1,7 +1,5 @@ - package mage.cards.l; -import java.util.UUID; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.FlashbackAbility; @@ -11,18 +9,19 @@ import mage.constants.CardType; import mage.constants.TimingRule; import mage.game.permanent.token.SpiritWhiteToken; +import java.util.UUID; + /** - * * @author Loki */ public final class LingeringSouls extends CardImpl { public LingeringSouls(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{W}"); // Create two 1/1 white Spirit creature tokens with flying. - this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken("ISD"), 2)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken(), 2)); // Flashback {1}{B} this.addAbility(new FlashbackAbility(new ManaCostsImpl("{1}{B}"), TimingRule.SORCERY)); } diff --git a/Mage.Sets/src/mage/cards/m/MausoleumGuard.java b/Mage.Sets/src/mage/cards/m/MausoleumGuard.java index e25cd9df41c..37cc2384c7d 100644 --- a/Mage.Sets/src/mage/cards/m/MausoleumGuard.java +++ b/Mage.Sets/src/mage/cards/m/MausoleumGuard.java @@ -1,7 +1,5 @@ - package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.DiesTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; @@ -11,13 +9,15 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.game.permanent.token.SpiritWhiteToken; +import java.util.UUID; + /** * @author nantuko */ public final class MausoleumGuard extends CardImpl { public MausoleumGuard(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SCOUT); @@ -25,7 +25,7 @@ public final class MausoleumGuard extends CardImpl { this.toughness = new MageInt(2); // When Mausoleum Guard dies, create two 1/1 white Spirit creature tokens with flying. - this.addAbility(new DiesTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken("ISD"), 2))); + this.addAbility(new DiesTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken(), 2))); } public MausoleumGuard(final MausoleumGuard card) { diff --git a/Mage.Sets/src/mage/cards/m/MidnightHaunting.java b/Mage.Sets/src/mage/cards/m/MidnightHaunting.java index d54a8eef61e..93e947eacdf 100644 --- a/Mage.Sets/src/mage/cards/m/MidnightHaunting.java +++ b/Mage.Sets/src/mage/cards/m/MidnightHaunting.java @@ -1,25 +1,24 @@ - package mage.cards.m; -import java.util.UUID; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.game.permanent.token.SpiritWhiteToken; +import java.util.UUID; + /** - * * @author nantuko */ public final class MidnightHaunting extends CardImpl { public MidnightHaunting(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}"); // Create two 1/1 white Spirit creature tokens with flying. - this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken("ISD"), 2)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken(), 2)); } public MidnightHaunting(final MidnightHaunting card) { diff --git a/Mage.Sets/src/mage/cards/p/ProsperousPirates.java b/Mage.Sets/src/mage/cards/p/ProsperousPirates.java index 8d3de1a966e..06183091c96 100644 --- a/Mage.Sets/src/mage/cards/p/ProsperousPirates.java +++ b/Mage.Sets/src/mage/cards/p/ProsperousPirates.java @@ -1,7 +1,5 @@ - package mage.cards.p; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; @@ -11,8 +9,9 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.game.permanent.token.TreasureToken; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class ProsperousPirates extends CardImpl { @@ -26,7 +25,7 @@ public final class ProsperousPirates extends CardImpl { this.toughness = new MageInt(4); // When Prosperous Pirates enters the battlefield, create two colorless Treasure artifact tokens with "{T}, Sacrifice this artifact: Add one mana of any color." - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new TreasureToken("XLN"), 2))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new TreasureToken(), 2))); } public ProsperousPirates(final ProsperousPirates card) { diff --git a/Mage.Sets/src/mage/cards/r/RequiemAngel.java b/Mage.Sets/src/mage/cards/r/RequiemAngel.java index 20cfb3f4dbc..0ccb69b287b 100644 --- a/Mage.Sets/src/mage/cards/r/RequiemAngel.java +++ b/Mage.Sets/src/mage/cards/r/RequiemAngel.java @@ -1,7 +1,5 @@ - package mage.cards.r; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; @@ -16,8 +14,9 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.AnotherPredicate; import mage.game.permanent.token.SpiritWhiteToken; +import java.util.UUID; + /** - * * @author intimidatingant */ public final class RequiemAngel extends CardImpl { @@ -30,7 +29,7 @@ public final class RequiemAngel extends CardImpl { } public RequiemAngel(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{W}"); this.subtype.add(SubType.ANGEL); this.power = new MageInt(5); @@ -39,7 +38,7 @@ public final class RequiemAngel extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever another non-Spirit creature you control dies, create a 1/1 white Spirit creature token with flying. - this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken("ISD"), 1), false, filter)); + this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken(), 1), false, filter)); } public RequiemAngel(final RequiemAngel card) { diff --git a/Mage.Sets/src/mage/cards/r/ResearchDevelopment.java b/Mage.Sets/src/mage/cards/r/ResearchDevelopment.java index cc9497ea6f3..6bfeeb052f3 100644 --- a/Mage.Sets/src/mage/cards/r/ResearchDevelopment.java +++ b/Mage.Sets/src/mage/cards/r/ResearchDevelopment.java @@ -1,28 +1,23 @@ - package mage.cards.r; -import java.util.Set; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; -import mage.cards.Card; -import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.CardsImpl; -import mage.cards.SplitCard; +import mage.cards.*; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SpellAbilityType; import mage.constants.Zone; import mage.filter.FilterCard; import mage.game.Game; -import mage.game.permanent.token.ElementalToken; +import mage.game.permanent.token.ResearchDevelopmentToken; import mage.players.Player; import mage.target.TargetCard; +import java.util.Set; +import java.util.UUID; + /** - * * @author magenoxx */ public final class ResearchDevelopment extends SplitCard { @@ -144,7 +139,7 @@ class DevelopmentEffect extends OneShotEffect { for (UUID opponentUuid : opponents) { Player opponent = game.getPlayer(opponentUuid); if (opponent != null && opponent.chooseUse(Outcome.Detriment, - "Allow " + player.getLogName() + " to draw a card instead? (" + Integer.toString(i + 1) + ')', source, game)) { + "Allow " + player.getLogName() + " to draw a card instead? (" + (i + 1) + ')', source, game)) { game.informPlayers(opponent.getLogName() + " had chosen to let " + player.getLogName() + " draw a card."); player.drawCards(1, source.getSourceId(), game); putToken = false; @@ -152,7 +147,7 @@ class DevelopmentEffect extends OneShotEffect { } } if (putToken) { - new CreateTokenEffect(new ElementalToken("DIS", 1)).apply(game, source); + new CreateTokenEffect(new ResearchDevelopmentToken()).apply(game, source); } } diff --git a/Mage.Sets/src/mage/cards/r/RevelInRiches.java b/Mage.Sets/src/mage/cards/r/RevelInRiches.java index b1011b4465d..ca8bf841b2d 100644 --- a/Mage.Sets/src/mage/cards/r/RevelInRiches.java +++ b/Mage.Sets/src/mage/cards/r/RevelInRiches.java @@ -1,7 +1,5 @@ - package mage.cards.r; -import java.util.UUID; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.DiesCreatureTriggeredAbility; @@ -19,8 +17,9 @@ import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.game.permanent.token.TreasureToken; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class RevelInRiches extends CardImpl { @@ -37,7 +36,7 @@ public final class RevelInRiches extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{B}"); // Whenever a creature an opponent controls dies, create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color." - this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new TreasureToken("XLN")), false, filter)); + this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new TreasureToken()), false, filter)); // At the beginning of your upkeep, if you control ten or more Treasures, you win the game. TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect(), TargetController.YOU, false); this.addAbility(new ConditionalInterveningIfTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/s/SandsteppeOutcast.java b/Mage.Sets/src/mage/cards/s/SandsteppeOutcast.java index fcc419c66af..72b0150e3e7 100644 --- a/Mage.Sets/src/mage/cards/s/SandsteppeOutcast.java +++ b/Mage.Sets/src/mage/cards/s/SandsteppeOutcast.java @@ -1,7 +1,5 @@ - package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.Mode; @@ -15,14 +13,15 @@ import mage.constants.SubType; import mage.counters.CounterType; import mage.game.permanent.token.SpiritWhiteToken; +import java.util.UUID; + /** - * * @author emerald000 */ public final class SandsteppeOutcast extends CardImpl { public SandsteppeOutcast(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WARRIOR); this.power = new MageInt(2); @@ -31,12 +30,12 @@ public final class SandsteppeOutcast extends CardImpl { // When Sandsteppe Outcast enters the battlefield, choose one - // * Put a +1/+1 counter on Sandsteppe Outcast. Ability ability = new EntersBattlefieldTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance())); - + // * Create a 1/1 white Spirit creature token with flying. Mode mode = new Mode(); - mode.addEffect(new CreateTokenEffect(new SpiritWhiteToken("FRF"))); + mode.addEffect(new CreateTokenEffect(new SpiritWhiteToken())); ability.addMode(mode); - this.addAbility(ability); + this.addAbility(ability); } public SandsteppeOutcast(final SandsteppeOutcast card) { diff --git a/Mage.Sets/src/mage/cards/s/SaprolingInfestation.java b/Mage.Sets/src/mage/cards/s/SaprolingInfestation.java index 7fd3df301ee..3a604196c95 100644 --- a/Mage.Sets/src/mage/cards/s/SaprolingInfestation.java +++ b/Mage.Sets/src/mage/cards/s/SaprolingInfestation.java @@ -13,14 +13,13 @@ import mage.game.permanent.token.SaprolingToken; import java.util.UUID; /** - * * @author noahg */ public final class SaprolingInfestation extends CardImpl { public SaprolingInfestation(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); - + // Whenever a player kicks a spell, you put a 1/1 green Saproling creature token onto the battlefield. this.addAbility(new SaprolingInfestationTriggeredAbility()); @@ -38,7 +37,7 @@ public final class SaprolingInfestation extends CardImpl { class SaprolingInfestationTriggeredAbility extends TriggeredAbilityImpl { SaprolingInfestationTriggeredAbility() { - super(Zone.BATTLEFIELD, new CreateTokenEffect(new SaprolingToken("INV")), false); + super(Zone.BATTLEFIELD, new CreateTokenEffect(new SaprolingToken()), false); } SaprolingInfestationTriggeredAbility(final SaprolingInfestationTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/s/SpectralReserves.java b/Mage.Sets/src/mage/cards/s/SpectralReserves.java index feb8019187a..22caf3fa9c8 100644 --- a/Mage.Sets/src/mage/cards/s/SpectralReserves.java +++ b/Mage.Sets/src/mage/cards/s/SpectralReserves.java @@ -1,7 +1,5 @@ - package mage.cards.s; -import java.util.UUID; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.GainLifeEffect; @@ -10,17 +8,18 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.game.permanent.token.SpiritWhiteToken; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class SpectralReserves extends CardImpl { public SpectralReserves(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{W}"); // Create two 1/1 white Spirit creature tokens with flying. You gain 2 life. - Effect effect = new CreateTokenEffect(new SpiritWhiteToken("EMN"), 2); + Effect effect = new CreateTokenEffect(new SpiritWhiteToken(), 2); effect.setText("Create two 1/1 white Spirit creature tokens with flying"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addEffect(new GainLifeEffect(2)); diff --git a/Mage.Sets/src/mage/cards/s/SpiritBonds.java b/Mage.Sets/src/mage/cards/s/SpiritBonds.java index 2827034a87b..2bdb334f1f6 100644 --- a/Mage.Sets/src/mage/cards/s/SpiritBonds.java +++ b/Mage.Sets/src/mage/cards/s/SpiritBonds.java @@ -1,7 +1,5 @@ - package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -25,8 +23,9 @@ import mage.game.permanent.token.SpiritWhiteToken; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetControlledPermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class SpiritBonds extends CardImpl { @@ -42,16 +41,16 @@ public final class SpiritBonds extends CardImpl { } public SpiritBonds(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); // Whenever a nontoken creature enters the battlefield under your control, you may pay {W}. If you do, but a 1/1 white Spirit creature token with flying into play. - this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new DoIfCostPaid(new CreateTokenEffect(new SpiritWhiteToken("M15")), new ManaCostsImpl("{W}")), filterNontoken, false)); - + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new DoIfCostPaid(new CreateTokenEffect(new SpiritWhiteToken()), new ManaCostsImpl("{W}")), filterNontoken, false)); + // {1}{W}, Sacrifice a Spirit: Target non-Spirit creature you control gains indestructible until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityTargetEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{1}{W}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(1,1,filterSpirit, true))); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(1, 1, filterSpirit, true))); ability.addTarget(new TargetControlledCreaturePermanent(filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/t/TeysaOrzhovScion.java b/Mage.Sets/src/mage/cards/t/TeysaOrzhovScion.java index 16a82f9d075..520f0b35a59 100644 --- a/Mage.Sets/src/mage/cards/t/TeysaOrzhovScion.java +++ b/Mage.Sets/src/mage/cards/t/TeysaOrzhovScion.java @@ -1,7 +1,5 @@ - package mage.cards.t; -import java.util.UUID; import mage.MageInt; import mage.ObjectColor; import mage.abilities.Ability; @@ -12,11 +10,7 @@ import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.ExileTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.SuperType; -import mage.constants.TargetController; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.ColorPredicate; @@ -25,14 +19,16 @@ import mage.game.permanent.token.SpiritWhiteToken; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author emerald000 */ public final class TeysaOrzhovScion extends CardImpl { - + private static final FilterControlledCreaturePermanent filterWhite = new FilterControlledCreaturePermanent("three white creatures"); private static final FilterCreaturePermanent filterBlack = new FilterCreaturePermanent("another black creature you control"); + static { filterWhite.add(new ColorPredicate(ObjectColor.WHITE)); filterBlack.add(new ColorPredicate(ObjectColor.BLACK)); @@ -41,7 +37,7 @@ public final class TeysaOrzhovScion extends CardImpl { } public TeysaOrzhovScion(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{B}"); this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ADVISOR); @@ -53,9 +49,9 @@ public final class TeysaOrzhovScion extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new SacrificeTargetCost(new TargetControlledCreaturePermanent(3, 3, filterWhite, true))); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); - + // Whenever another black creature you control dies, create a 1/1 white Spirit creature token with flying. - this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken("GPT")), false, filterBlack)); + this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken()), false, filterBlack)); } public TeysaOrzhovScion(final TeysaOrzhovScion card) { diff --git a/Mage.Sets/src/mage/cards/t/TreasureMap.java b/Mage.Sets/src/mage/cards/t/TreasureMap.java index 7c0035dcbd4..b0abbf0a749 100644 --- a/Mage.Sets/src/mage/cards/t/TreasureMap.java +++ b/Mage.Sets/src/mage/cards/t/TreasureMap.java @@ -1,7 +1,5 @@ - package mage.cards.t; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; @@ -21,8 +19,9 @@ import mage.game.permanent.Permanent; import mage.game.permanent.token.TreasureToken; import mage.players.Player; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class TreasureMap extends CardImpl { @@ -81,7 +80,7 @@ class TreasureMapEffect extends OneShotEffect { if (counters > 2) { permanent.removeCounters("landmark", counters, game); new TransformSourceEffect(true).apply(game, source); - new CreateTokenEffect(new TreasureToken("XLN"), 3).apply(game, source); + new CreateTokenEffect(new TreasureToken(), 3).apply(game, source); } return true; } diff --git a/Mage.Sets/src/mage/cards/t/TriplicateSpirits.java b/Mage.Sets/src/mage/cards/t/TriplicateSpirits.java index fcdd7040df5..c78169a471a 100644 --- a/Mage.Sets/src/mage/cards/t/TriplicateSpirits.java +++ b/Mage.Sets/src/mage/cards/t/TriplicateSpirits.java @@ -1,7 +1,5 @@ - package mage.cards.t; -import java.util.UUID; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.ConvokeAbility; import mage.cards.CardImpl; @@ -9,21 +7,22 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.game.permanent.token.SpiritWhiteToken; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class TriplicateSpirits extends CardImpl { public TriplicateSpirits(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{W}{W}"); // Convoke this.addAbility(new ConvokeAbility()); // Create three 1/1 white Spirit creature tokens with flying. - this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken("M15"), 3)); - + this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken(), 3)); + } public TriplicateSpirits(final TriplicateSpirits card) { diff --git a/Mage.Sets/src/mage/cards/t/TwilightDrover.java b/Mage.Sets/src/mage/cards/t/TwilightDrover.java index 9b230eea489..2a7f1c2dd6f 100644 --- a/Mage.Sets/src/mage/cards/t/TwilightDrover.java +++ b/Mage.Sets/src/mage/cards/t/TwilightDrover.java @@ -1,7 +1,5 @@ - package mage.cards.t; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.LeavesBattlefieldAllTriggeredAbility; @@ -20,8 +18,9 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.TokenPredicate; import mage.game.permanent.token.SpiritWhiteToken; +import java.util.UUID; + /** - * * @author emerald000 */ public final class TwilightDrover extends CardImpl { @@ -33,7 +32,7 @@ public final class TwilightDrover extends CardImpl { } public TwilightDrover(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.subtype.add(SubType.SPIRIT); this.power = new MageInt(1); @@ -43,7 +42,7 @@ public final class TwilightDrover extends CardImpl { this.addAbility(new LeavesBattlefieldAllTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), filter)); // {2}{W}, Remove a +1/+1 counter from Twilight Drover: Create two 1/1 white Spirit creature tokens with flying. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new SpiritWhiteToken("RAV"), 2), new ManaCostsImpl<>("{2}{W}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new SpiritWhiteToken(), 2), new ManaCostsImpl<>("{2}{W}")); ability.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance())); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/w/WortTheRaidmother.java b/Mage.Sets/src/mage/cards/w/WortTheRaidmother.java index 9e7608a8e11..a45c1d1b00e 100644 --- a/Mage.Sets/src/mage/cards/w/WortTheRaidmother.java +++ b/Mage.Sets/src/mage/cards/w/WortTheRaidmother.java @@ -1,7 +1,5 @@ - package mage.cards.w; -import java.util.UUID; import mage.MageInt; import mage.ObjectColor; import mage.abilities.Ability; @@ -17,12 +15,13 @@ import mage.filter.common.FilterInstantOrSorcerySpell; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.Game; -import mage.game.permanent.token.WortTheRaidmotherToken; +import mage.game.permanent.token.GoblinWarriorToken; import mage.game.stack.Spell; import mage.game.stack.StackObject; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class WortTheRaidmother extends CardImpl { @@ -36,7 +35,7 @@ public final class WortTheRaidmother extends CardImpl { this.toughness = new MageInt(3); // When Wort, the Raidmother enters the battlefield, create two 1/1 red and green Goblin Warrior creature tokens. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new WortTheRaidmotherToken(), 2), false)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new GoblinWarriorToken(), 2), false)); // Each red or green instant or sorcery spell you cast has conspire. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new WortGainConspireEffect())); @@ -59,6 +58,7 @@ class WortGainConspireEffect extends ContinuousEffectImpl { static { filter.add(Predicates.or(new ColorPredicate(ObjectColor.RED), new ColorPredicate(ObjectColor.GREEN))); } + private final ConspireAbility conspireAbility; public WortGainConspireEffect() { diff --git a/Mage.Sets/src/mage/cards/z/ZaxaraTheExemplary.java b/Mage.Sets/src/mage/cards/z/ZaxaraTheExemplary.java index 257729d52be..a5b097d41d2 100644 --- a/Mage.Sets/src/mage/cards/z/ZaxaraTheExemplary.java +++ b/Mage.Sets/src/mage/cards/z/ZaxaraTheExemplary.java @@ -6,7 +6,6 @@ import mage.abilities.TriggeredAbility; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.mana.SimpleManaAbility; @@ -18,7 +17,7 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.game.permanent.token.Token; -import mage.game.permanent.token.TokenImpl; +import mage.game.permanent.token.ZaxaraTheExemplaryHydraToken; import mage.game.stack.Spell; import mage.players.Player; @@ -144,25 +143,4 @@ class ZaxaraTheExemplaryHydraTokenEffect extends OneShotEffect { } return false; } -} - -class ZaxaraTheExemplaryHydraToken extends TokenImpl { - public ZaxaraTheExemplaryHydraToken() { - super("Hydra", "0/0 green Hydra creature token"); - setExpansionSetCodeForImage("C20"); - cardType.add(CardType.CREATURE); - color.setGreen(true); - subtype.add(SubType.HYDRA); - power = new MageInt(0); - toughness = new MageInt(0); - } - - private ZaxaraTheExemplaryHydraToken(final ZaxaraTheExemplaryHydraToken token) { - super(token); - } - - @Override - public ZaxaraTheExemplaryHydraToken copy() { - return new ZaxaraTheExemplaryHydraToken(this); - } } \ No newline at end of file diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 2c2d1e3e4ef..d8fcf905176 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -701,6 +701,10 @@ public class VerifyCardDataTest { if (errorsList.size() > 0) { Assert.fail("Found token errors: " + errorsList.size()); } + + // TODO: all token must have correct availableImageSetCodes (all sets with that token) + // Some sets have original card, but don't have token card at all. So you must use scryfall tokens list above to find + // all token's sets and compare with xmage } @Test diff --git a/Mage/src/main/java/mage/game/permanent/token/BeastToken2.java b/Mage/src/main/java/mage/game/permanent/token/BeastToken2.java index f59cbc94a6d..a1d9745f62d 100644 --- a/Mage/src/main/java/mage/game/permanent/token/BeastToken2.java +++ b/Mage/src/main/java/mage/game/permanent/token/BeastToken2.java @@ -16,7 +16,7 @@ public final class BeastToken2 extends TokenImpl { static final private List tokenImageSets = new ArrayList<>(); static { - tokenImageSets.addAll(Arrays.asList("ZEN", "C14", "DDD", "C15", "DD3GVL", "MM3", "CMA", "E01", "C19")); + tokenImageSets.addAll(Arrays.asList("ZEN", "C14", "DDD", "C15", "DD3GVL", "MM3", "CMA", "E01", "C19", "C20")); } public BeastToken2() { diff --git a/Mage/src/main/java/mage/game/permanent/token/BirdToken.java b/Mage/src/main/java/mage/game/permanent/token/BirdToken.java index c73f04867b2..fd7a4e87120 100644 --- a/Mage/src/main/java/mage/game/permanent/token/BirdToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/BirdToken.java @@ -1,15 +1,13 @@ - - package mage.game.permanent.token; -import java.util.Arrays; import mage.MageInt; import mage.abilities.keyword.FlyingAbility; import mage.constants.CardType; import mage.constants.SubType; +import java.util.Arrays; + /** - * * @author LoneFox */ public final class BirdToken extends TokenImpl { @@ -22,6 +20,7 @@ public final class BirdToken extends TokenImpl { power = new MageInt(1); toughness = new MageInt(1); addAbility(FlyingAbility.getInstance()); + availableImageSetCodes.addAll(Arrays.asList("BNG", "RTR", "ZEN", "C16", "MM3", "DGM")); } @@ -30,7 +29,7 @@ public final class BirdToken extends TokenImpl { } @Override - public BirdToken copy() { + public BirdToken copy() { return new BirdToken(this); } diff --git a/Mage/src/main/java/mage/game/permanent/token/ElementalToken.java b/Mage/src/main/java/mage/game/permanent/token/ElementalToken.java deleted file mode 100644 index 5369b5bff61..00000000000 --- a/Mage/src/main/java/mage/game/permanent/token/ElementalToken.java +++ /dev/null @@ -1,63 +0,0 @@ - - -package mage.game.permanent.token; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import mage.MageInt; -import mage.abilities.keyword.HasteAbility; -import mage.constants.CardType; -import mage.constants.SubType; - -/** - * - * @author magenoxx - */ -public final class ElementalToken extends TokenImpl { - - static final private List tokenImageSets = new ArrayList<>(); - - static { - tokenImageSets.addAll(Arrays.asList("OGW", "CON", "DIS")); - } - - public ElementalToken() { - this ("OGW", 0); - } - - public ElementalToken(String setCode, int tokenType) { - super("Elemental", "3/1 red Elemental creature token"); - availableImageSetCodes = tokenImageSets; - setOriginalExpansionSetCode(setCode); - cardType.add(CardType.CREATURE); - color.setRed(true); - subtype.add(SubType.ELEMENTAL); - power = new MageInt(3); - toughness = new MageInt(1); - - this.setOriginalExpansionSetCode("CON"); - } - - public ElementalToken(String setCode, int tokenType, boolean hasHaste) { - super("Elemental", "3/1 red Elemental creature token"); - setTokenType(tokenType); - availableImageSetCodes = tokenImageSets; - setOriginalExpansionSetCode(setCode); - cardType.add(CardType.CREATURE); - color.setRed(true); - subtype.add(SubType.ELEMENTAL); - power = new MageInt(3); - toughness = new MageInt(1); - - if (hasHaste) this.addAbility(HasteAbility.getInstance()); - } - - public ElementalToken(final ElementalToken token) { - super(token); - } - - public ElementalToken copy() { - return new ElementalToken(this); - } -} diff --git a/Mage/src/main/java/mage/game/permanent/token/ElementalTokenWithHaste.java b/Mage/src/main/java/mage/game/permanent/token/ElementalTokenWithHaste.java new file mode 100644 index 00000000000..f916272c557 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/ElementalTokenWithHaste.java @@ -0,0 +1,51 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.abilities.keyword.HasteAbility; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author magenoxx + */ +public final class ElementalTokenWithHaste extends TokenImpl { + + static final private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("C20", "MBP", "OGW", "SOK", "MRD")); + } + + public ElementalTokenWithHaste() { + super("Elemental", "3/1 red Elemental creature token with haste"); + availableImageSetCodes = tokenImageSets; + cardType.add(CardType.CREATURE); + color.setRed(true); + subtype.add(SubType.ELEMENTAL); + power = new MageInt(3); + toughness = new MageInt(1); + this.addAbility(HasteAbility.getInstance()); + + if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("OGW")) { + setTokenType(2); + } + if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("C20")) { + setTokenType(1); + } + if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("SOK")) { + setTokenType(1); + } + } + + public ElementalTokenWithHaste(final ElementalTokenWithHaste token) { + super(token); + } + + public ElementalTokenWithHaste copy() { + return new ElementalTokenWithHaste(this); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/WortTheRaidmotherToken.java b/Mage/src/main/java/mage/game/permanent/token/GoblinWarriorToken.java similarity index 61% rename from Mage/src/main/java/mage/game/permanent/token/WortTheRaidmotherToken.java rename to Mage/src/main/java/mage/game/permanent/token/GoblinWarriorToken.java index b59b6445800..ec79599e77f 100644 --- a/Mage/src/main/java/mage/game/permanent/token/WortTheRaidmotherToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/GoblinWarriorToken.java @@ -1,17 +1,17 @@ - - package mage.game.permanent.token; + +import mage.MageInt; import mage.constants.CardType; import mage.constants.SubType; -import mage.MageInt; + +import java.util.Arrays; /** - * * @author spjspj */ -public final class WortTheRaidmotherToken extends TokenImpl { +public final class GoblinWarriorToken extends TokenImpl { - public WortTheRaidmotherToken() { + public GoblinWarriorToken() { super("Goblin Warrior", "1/1 red and green Goblin Warrior creature token"); cardType.add(CardType.CREATURE); color.setRed(true); @@ -20,13 +20,15 @@ public final class WortTheRaidmotherToken extends TokenImpl { subtype.add(SubType.WARRIOR); power = new MageInt(1); toughness = new MageInt(1); + + availableImageSetCodes.addAll(Arrays.asList("C20")); } - public WortTheRaidmotherToken(final WortTheRaidmotherToken token) { + public GoblinWarriorToken(final GoblinWarriorToken token) { super(token); } - public WortTheRaidmotherToken copy() { - return new WortTheRaidmotherToken(this); + public GoblinWarriorToken copy() { + return new GoblinWarriorToken(this); } } diff --git a/Mage/src/main/java/mage/game/permanent/token/GreenAndWhiteElementalToken.java b/Mage/src/main/java/mage/game/permanent/token/GreenAndWhiteElementalToken.java new file mode 100644 index 00000000000..ca444ebbb54 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/GreenAndWhiteElementalToken.java @@ -0,0 +1,41 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.abilities.keyword.VigilanceAbility; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author JayDi85 + */ +public final class GreenAndWhiteElementalToken extends TokenImpl { + + static final private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("GK1", "PTC", "RTR")); + } + + public GreenAndWhiteElementalToken() { + super("Elemental", "8/8 green and white Elemental creature token with vigilance"); + cardType.add(CardType.CREATURE); + color.setGreen(true); + color.setWhite(true); + this.subtype.add(SubType.ELEMENTAL); + power = new MageInt(8); + toughness = new MageInt(8); + this.addAbility(VigilanceAbility.getInstance()); + } + + public GreenAndWhiteElementalToken(final GreenAndWhiteElementalToken token) { + super(token); + } + + public GreenAndWhiteElementalToken copy() { + return new GreenAndWhiteElementalToken(this); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/HornetQueenInsectToken.java b/Mage/src/main/java/mage/game/permanent/token/HornetQueenInsectToken.java index 91fea8b5ef7..cc93e12e1d9 100644 --- a/Mage/src/main/java/mage/game/permanent/token/HornetQueenInsectToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/HornetQueenInsectToken.java @@ -1,21 +1,20 @@ - - package mage.game.permanent.token; -import mage.constants.CardType; -import mage.constants.SubType; + import mage.MageInt; import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.keyword.FlyingAbility; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.Arrays; /** - * * @author spjspj */ public final class HornetQueenInsectToken extends TokenImpl { public HornetQueenInsectToken() { super("Insect", "1/1 green Insect creature token with flying and deathtouch"); - setOriginalExpansionSetCode("M15"); cardType.add(CardType.CREATURE); color.setGreen(true); subtype.add(SubType.INSECT); @@ -23,6 +22,8 @@ public final class HornetQueenInsectToken extends TokenImpl { toughness = new MageInt(1); addAbility(FlyingAbility.getInstance()); addAbility(DeathtouchAbility.getInstance()); + + availableImageSetCodes = Arrays.asList("M15", "C20"); } public HornetQueenInsectToken(final HornetQueenInsectToken token) { diff --git a/Mage/src/main/java/mage/game/permanent/token/HumanToken.java b/Mage/src/main/java/mage/game/permanent/token/HumanToken.java index 79f039152e0..f0df12ed622 100644 --- a/Mage/src/main/java/mage/game/permanent/token/HumanToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/HumanToken.java @@ -18,7 +18,7 @@ public final class HumanToken extends TokenImpl { subtype.add(SubType.HUMAN); power = new MageInt(1); toughness = new MageInt(1); - availableImageSetCodes.addAll(Arrays.asList("DKA", "AVR", "FNMP", "RNA", "ELD", "C19")); + availableImageSetCodes.addAll(Arrays.asList("DKA", "AVR", "FNMP", "RNA", "ELD", "C19", "C20")); } public HumanToken(final HumanToken token) { diff --git a/Mage/src/main/java/mage/game/permanent/token/HydraBroodmasterToken.java b/Mage/src/main/java/mage/game/permanent/token/HydraBroodmasterToken.java index 5dace1e2543..82b0acf3bba 100644 --- a/Mage/src/main/java/mage/game/permanent/token/HydraBroodmasterToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/HydraBroodmasterToken.java @@ -1,29 +1,29 @@ - - package mage.game.permanent.token; +import mage.MageInt; import mage.constants.CardType; import mage.constants.SubType; -import mage.MageInt; + +import java.util.Arrays; /** - * * @author spjspj */ public final class HydraBroodmasterToken extends TokenImpl { public HydraBroodmasterToken() { - this(1,1); + this(1, 1); } public HydraBroodmasterToken(int power, int toughness) { super("Hydra", "green Hydra creature token"); - this.setOriginalExpansionSetCode("JOU"); cardType.add(CardType.CREATURE); color.setGreen(true); subtype.add(SubType.HYDRA); this.power = new MageInt(power); this.toughness = new MageInt(toughness); + + availableImageSetCodes = Arrays.asList("JOU"); } public HydraBroodmasterToken(final HydraBroodmasterToken token) { diff --git a/Mage/src/main/java/mage/game/permanent/token/ResearchDevelopmentToken.java b/Mage/src/main/java/mage/game/permanent/token/ResearchDevelopmentToken.java new file mode 100644 index 00000000000..29938baeb3a --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/ResearchDevelopmentToken.java @@ -0,0 +1,39 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author JayDi85 + */ +public final class ResearchDevelopmentToken extends TokenImpl { + + static final private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("DIS")); + } + + public ResearchDevelopmentToken() { + super("Elemental", "3/1 red Elemental creature token"); + availableImageSetCodes = tokenImageSets; + cardType.add(CardType.CREATURE); + color.setRed(true); + subtype.add(SubType.ELEMENTAL); + power = new MageInt(3); + toughness = new MageInt(1); + } + + public ResearchDevelopmentToken(final ResearchDevelopmentToken token) { + super(token); + } + + public ResearchDevelopmentToken copy() { + return new ResearchDevelopmentToken(this); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/SaprolingToken.java b/Mage/src/main/java/mage/game/permanent/token/SaprolingToken.java index 828a2545d88..955d409e928 100644 --- a/Mage/src/main/java/mage/game/permanent/token/SaprolingToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/SaprolingToken.java @@ -32,39 +32,33 @@ public final class SaprolingToken extends TokenImpl { "RTR", "C15", "MM3", + "INV", "C16", // 2 different token images... "CMA", "VMA", // 2 different token, one with DIFFERENT stats, "Saproling Burst" create different token, see https://scryfall.com/card/tvma/12 "E02", "RIX", "DOM", // 3 different token images - "C19" + "C19", + "C20" )); } public SaprolingToken() { - this(null, 0); - } - - public SaprolingToken(String setCode) { - this(setCode, 0); - } - - public SaprolingToken(String setCode, int tokenType) { super("Saproling", "1/1 green Saproling creature token"); availableImageSetCodes = tokenImageSets; - setOriginalExpansionSetCode(setCode); + cardType.add(CardType.CREATURE); + color.setGreen(true); + subtype.add(SubType.SAPROLING); + power = new MageInt(1); + toughness = new MageInt(1); + if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("C16")) { this.setTokenType(RandomUtil.nextInt(2) + 1); } if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("DOM")) { this.setTokenType(RandomUtil.nextInt(3) + 1); } - cardType.add(CardType.CREATURE); - color.setGreen(true); - subtype.add(SubType.SAPROLING); - power = new MageInt(1); - toughness = new MageInt(1); } public SaprolingToken(final SaprolingToken token) { diff --git a/Mage/src/main/java/mage/game/permanent/token/SoldierToken.java b/Mage/src/main/java/mage/game/permanent/token/SoldierToken.java index 6275b24333e..d4b1bfa80dd 100644 --- a/Mage/src/main/java/mage/game/permanent/token/SoldierToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/SoldierToken.java @@ -18,7 +18,7 @@ public final class SoldierToken extends TokenImpl { static { tokenImageSets.addAll(Arrays.asList("10E", "M15", "C14", "ORI", "ALA", "DDF", "THS", "M12", "M13", "MM2", "MMA", "RTR", - "SOM", "DDO", "M10", "ORI", "EMN", "EMA", "CN2", "C16", "MM3", "E01", "DOM", "MH1", "M20")); + "SOM", "DDO", "M10", "ORI", "EMN", "EMA", "CN2", "C16", "MM3", "E01", "DOM", "MH1", "M20", "C20")); } public SoldierToken() { @@ -30,7 +30,6 @@ public final class SoldierToken extends TokenImpl { subtype.add(SubType.SOLDIER); power = new MageInt(1); toughness = new MageInt(1); - } @Override @@ -39,7 +38,7 @@ public final class SoldierToken extends TokenImpl { if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("THS")) { this.setTokenType(RandomUtil.nextInt(2) + 1); } - if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("CN2") || getOriginalExpansionSetCode().equals("MM3")) { + if (getOriginalExpansionSetCode() != null && (getOriginalExpansionSetCode().equals("CN2") || getOriginalExpansionSetCode().equals("MM3"))) { setTokenType(1); } } diff --git a/Mage/src/main/java/mage/game/permanent/token/SpiritWhiteToken.java b/Mage/src/main/java/mage/game/permanent/token/SpiritWhiteToken.java index bfcf62c0112..0d1ab1807b1 100644 --- a/Mage/src/main/java/mage/game/permanent/token/SpiritWhiteToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/SpiritWhiteToken.java @@ -18,24 +18,12 @@ public final class SpiritWhiteToken extends TokenImpl { static { tokenImageSets.addAll(Arrays.asList("AVR", "C14", "CNS", "DDC", "DDK", "FRF", "ISD", "KTK", "M15", "MM2", "SHM", - "SOI", "EMA", "C16", "MM3", "CMA", "E01", "ANA", "RNA", "M20")); + "SOI", "EMA", "C16", "MM3", "CMA", "E01", "ANA", "GPT", "RAV", "EMN", "RNA", "M20", "C20")); } public SpiritWhiteToken() { - this(null, 0); - } - - public SpiritWhiteToken(String setCode) { - this(setCode, 0); - } - - public SpiritWhiteToken(String setCode, int tokenType) { super("Spirit", "1/1 white Spirit creature token with flying"); availableImageSetCodes = tokenImageSets; - setOriginalExpansionSetCode(setCode); - if (tokenType > 0) { - setTokenType(tokenType); - } cardType.add(CardType.CREATURE); subtype.add(SubType.SPIRIT); color.setWhite(true); diff --git a/Mage/src/main/java/mage/game/permanent/token/TheLocustGodInsectToken.java b/Mage/src/main/java/mage/game/permanent/token/TheLocustGodInsectToken.java index 439d6ba8975..c22ec75b438 100644 --- a/Mage/src/main/java/mage/game/permanent/token/TheLocustGodInsectToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/TheLocustGodInsectToken.java @@ -1,21 +1,20 @@ - - package mage.game.permanent.token; + +import mage.MageInt; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.HasteAbility; import mage.constants.CardType; import mage.constants.SubType; -import mage.MageInt; -import mage.abilities.keyword.HasteAbility; -import mage.abilities.keyword.FlyingAbility; + +import java.util.Arrays; /** - * * @author spjspj */ public final class TheLocustGodInsectToken extends TokenImpl { public TheLocustGodInsectToken() { super("Insect", "1/1 blue and red Insect creature token with flying and haste"); - setOriginalExpansionSetCode("HOU"); cardType.add(CardType.CREATURE); color.setBlue(true); color.setRed(true); @@ -24,6 +23,8 @@ public final class TheLocustGodInsectToken extends TokenImpl { toughness = new MageInt(1); addAbility(FlyingAbility.getInstance()); addAbility(HasteAbility.getInstance()); + + availableImageSetCodes = Arrays.asList("HOU", "C20"); } public TheLocustGodInsectToken(final TheLocustGodInsectToken token) { diff --git a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java index 922d5893db4..30919e478f3 100644 --- a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java +++ b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java @@ -2,15 +2,12 @@ package mage.game.permanent.token; import mage.MageObject; import mage.MageObjectImpl; -import mage.MageObjectReference; import mage.abilities.Ability; import mage.cards.Card; import mage.constants.Zone; import mage.game.Game; import mage.game.events.CreateTokenEvent; import mage.game.events.CreatedTokenEvent; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentToken; @@ -53,7 +50,8 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { } } - public TokenImpl() { } + public TokenImpl() { + } public TokenImpl(String name, String description) { this.name = name; @@ -165,6 +163,9 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { if (controller == null) { return false; } + if (amount == 0) { + return false; + } lastAddedTokenIds.clear(); CreateTokenEvent event = new CreateTokenEvent(sourceId, controllerId, amount, this); @@ -240,6 +241,10 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { return tokenType; } + /** + * Set token index to search in card-pictures-tok.txt (if set have multiple tokens with same name) + * Default is 1 + */ @Override public void setTokenType(int tokenType) { this.tokenType = tokenType; diff --git a/Mage/src/main/java/mage/game/permanent/token/TreasureToken.java b/Mage/src/main/java/mage/game/permanent/token/TreasureToken.java index dd23d59eda2..fee291d4041 100644 --- a/Mage/src/main/java/mage/game/permanent/token/TreasureToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/TreasureToken.java @@ -20,24 +20,11 @@ public final class TreasureToken extends TokenImpl { static final private List tokenImageSets = new ArrayList<>(); - static { - tokenImageSets.addAll(Arrays.asList("XLN", "RNA", "M20", "C19")); - } - public TreasureToken() { - this(null, 0); - } - - public TreasureToken(String setCode) { - this(setCode, 0); - } - - public TreasureToken(String setCode, int tokenType) { super("Treasure", "Treasure token"); - availableImageSetCodes = tokenImageSets; - setOriginalExpansionSetCode(setCode); cardType.add(CardType.ARTIFACT); subtype.add(SubType.TREASURE); + availableImageSetCodes = Arrays.asList("XLN", "RNA", "M20", "C19", "C20"); Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(), new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); diff --git a/Mage/src/main/java/mage/game/permanent/token/WhiteElementalToken.java b/Mage/src/main/java/mage/game/permanent/token/WhiteElementalToken.java index 52edc3276e2..5c845455584 100644 --- a/Mage/src/main/java/mage/game/permanent/token/WhiteElementalToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/WhiteElementalToken.java @@ -1,13 +1,11 @@ - - package mage.game.permanent.token; -import mage.constants.CardType; -import mage.constants.SubType; + import mage.MageInt; import mage.abilities.keyword.FlyingAbility; +import mage.constants.CardType; +import mage.constants.SubType; /** - * * @author spjspj */ public final class WhiteElementalToken extends TokenImpl { @@ -19,8 +17,11 @@ public final class WhiteElementalToken extends TokenImpl { subtype.add(SubType.ELEMENTAL); power = new MageInt(4); toughness = new MageInt(4); - setTokenType(2); this.addAbility(FlyingAbility.getInstance()); + + if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("C20")) { + setTokenType(2); + } } public WhiteElementalToken(final WhiteElementalToken token) { diff --git a/Mage/src/main/java/mage/game/permanent/token/ZaxaraTheExemplaryHydraToken.java b/Mage/src/main/java/mage/game/permanent/token/ZaxaraTheExemplaryHydraToken.java new file mode 100644 index 00000000000..ce9eaee6dd1 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/ZaxaraTheExemplaryHydraToken.java @@ -0,0 +1,33 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.Arrays; + +/** + * @author AsterAether + */ +public class ZaxaraTheExemplaryHydraToken extends TokenImpl { + + public ZaxaraTheExemplaryHydraToken() { + super("Hydra", "0/0 green Hydra creature token"); + cardType.add(CardType.CREATURE); + color.setGreen(true); + subtype.add(SubType.HYDRA); + power = new MageInt(0); + toughness = new MageInt(0); + + availableImageSetCodes = Arrays.asList("C20"); + } + + private ZaxaraTheExemplaryHydraToken(final ZaxaraTheExemplaryHydraToken token) { + super(token); + } + + @Override + public ZaxaraTheExemplaryHydraToken copy() { + return new ZaxaraTheExemplaryHydraToken(this); + } +} \ No newline at end of file