[C20] tokens support and fixes:

* Added tokens for C20;
* Added tokens images download for C20;
* Fixed that some tokens uses wrong images or images from wrong set (example: Elemental);
This commit is contained in:
Oleg Agafonov 2020-06-15 20:29:52 +04:00
parent 2b21298377
commit c2487aec7d
48 changed files with 406 additions and 349 deletions

View file

@ -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 - 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"); 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 // generate supported sets
supportedSets.clear(); supportedSets.clear();
for (String cardName : this.keySet()) { for (String cardName : this.keySet()) {

View file

@ -571,7 +571,7 @@
|Generate|TOK:DGM|Wurm|||WurmToken3| |Generate|TOK:DGM|Wurm|||WurmToken3|
|Generate|TOK:DIS|Bird|||DovescapeToken| |Generate|TOK:DIS|Bird|||DovescapeToken|
|Generate|TOK:DIS|Drake|||LeafdrakeRoostDrakeToken| |Generate|TOK:DIS|Drake|||LeafdrakeRoostDrakeToken|
|Generate|TOK:DIS|Elemental|||ElementalToken| |Generate|TOK:DIS|Elemental|||ResearchDevelopmentToken|
|Generate|TOK:DIS|Goblin|||RakdosGuildmageGoblinToken| |Generate|TOK:DIS|Goblin|||RakdosGuildmageGoblinToken|
|Generate|TOK:DIS|Saproling|||SaprolingToken| |Generate|TOK:DIS|Saproling|||SaprolingToken|
|Generate|TOK:DIS|Snake|||PatagiaViperSnakeToken| |Generate|TOK:DIS|Snake|||PatagiaViperSnakeToken|
@ -956,7 +956,7 @@
|Generate|TOK:MOR|Wolf|||WolfToken| |Generate|TOK:MOR|Wolf|||WolfToken|
|Generate|TOK:MRD|Beast|||OneDozenEyesBeastToken| |Generate|TOK:MRD|Beast|||OneDozenEyesBeastToken|
|Generate|TOK:MRD|Demon|||ReignOfThePitToken| |Generate|TOK:MRD|Demon|||ReignOfThePitToken|
|Generate|TOK:MRD|Elemental|||ElementalToken| |Generate|TOK:MRD|Elemental|||ElementalTokenWithHaste|
|Generate|TOK:MRD|Insect|||InsectToken| |Generate|TOK:MRD|Insect|||InsectToken|
|Generate|TOK:MRD|Myr|||MyrToken| |Generate|TOK:MRD|Myr|||MyrToken|
|Generate|TOK:MRD|Pentavite|||PentaviteToken| |Generate|TOK:MRD|Pentavite|||PentaviteToken|
@ -990,7 +990,7 @@
|Generate|TOK:OGW|Eldrazi Scion|5||EldraziScionToken| |Generate|TOK:OGW|Eldrazi Scion|5||EldraziScionToken|
|Generate|TOK:OGW|Eldrazi Scion|6||EldraziScionToken| |Generate|TOK:OGW|Eldrazi Scion|6||EldraziScionToken|
|Generate|TOK:OGW|Elemental|1||SeedGuardianToken| |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|Knight Ally|||KnightAllyToken|
|Generate|TOK:OGW|Kor Ally|||KorAllyToken| |Generate|TOK:OGW|Kor Ally|||KorAllyToken|
|Generate|TOK:OGW|Octopus|||OctopusToken| |Generate|TOK:OGW|Octopus|||OctopusToken|
@ -1063,7 +1063,7 @@
|Generate|TOK:RTR|Bird|||BirdToken| |Generate|TOK:RTR|Bird|||BirdToken|
|Generate|TOK:RTR|Centaur|||CentaurToken| |Generate|TOK:RTR|Centaur|||CentaurToken|
|Generate|TOK:RTR|Dragon|||UtvaraHellkiteDragonToken| |Generate|TOK:RTR|Dragon|||UtvaraHellkiteDragonToken|
|Generate|TOK:RTR|Elemental|| |Generate|TOK:RTR|Elemental|||GreenAndWhiteElementalToken|
|Generate|TOK:RTR|Goblin|||GoblinToken| |Generate|TOK:RTR|Goblin|||GoblinToken|
|Generate|TOK:RTR|Knight|||KnightToken| |Generate|TOK:RTR|Knight|||KnightToken|
|Generate|TOK:RTR|Ooze|||MysticGenesisOozeToken| |Generate|TOK:RTR|Ooze|||MysticGenesisOozeToken|
@ -1106,7 +1106,7 @@
|Generate|TOK:SOI|Vampire Knight|||VampireKnightToken| |Generate|TOK:SOI|Vampire Knight|||VampireKnightToken|
|Generate|TOK:SOI|Wolf|||WolfToken| |Generate|TOK:SOI|Wolf|||WolfToken|
|Generate|TOK:SOI|Zombie|||ZombieToken| |Generate|TOK:SOI|Zombie|||ZombieToken|
|Generate|TOK:SOK|Elemental|||ElementalToken| |Generate|TOK:SOK|Elemental|||ElementalTokenWithHaste|
|Generate|TOK:SOK|Snake|||SnakeToken| |Generate|TOK:SOK|Snake|||SnakeToken|
|Generate|TOK:SOK|Spirit|||SpiritToken| |Generate|TOK:SOK|Spirit|||SpiritToken|
|Generate|TOK:SOK|Urami|||UramiToken| |Generate|TOK:SOK|Urami|||UramiToken|
@ -1328,6 +1328,8 @@
|Generate|TOK:M20|Treasure|||TreasureToken| |Generate|TOK:M20|Treasure|||TreasureToken|
|Generate|TOK:M20|Wolf|||WolfToken| |Generate|TOK:M20|Wolf|||WolfToken|
|Generate|TOK:M20|Zombie|||ZombieToken| |Generate|TOK:M20|Zombie|||ZombieToken|
# ELD
|Generate|TOK:ELD|Bear|||BearToken| |Generate|TOK:ELD|Bear|||BearToken|
|Generate|TOK:ELD|Boar|||WolfsQuarryToken| |Generate|TOK:ELD|Boar|||WolfsQuarryToken|
|Generate|TOK:ELD|Dwarf|||DwarfToken| |Generate|TOK:ELD|Dwarf|||DwarfToken|
@ -1346,6 +1348,8 @@
|Generate|TOK:ELD|Mouse|||MouseToken| |Generate|TOK:ELD|Mouse|||MouseToken|
|Generate|TOK:ELD|Rat|||RatToken| |Generate|TOK:ELD|Rat|||RatToken|
|Generate|TOK:ELD|Wolf|||GarrukCursedHuntsmanToken| |Generate|TOK:ELD|Wolf|||GarrukCursedHuntsmanToken|
# THB
|Generate|TOK:THB|Goat|||GoatToken| |Generate|TOK:THB|Goat|||GoatToken|
|Generate|TOK:THB|Human Soldier|||HumanSoldierToken| |Generate|TOK:THB|Human Soldier|||HumanSoldierToken|
|Generate|TOK:THB|Pegasus|||PegasusToken2| |Generate|TOK:THB|Pegasus|||PegasusToken2|
@ -1360,6 +1364,8 @@
|Generate|TOK:THB|Nightmare|||AshiokNightmareMuseToken| |Generate|TOK:THB|Nightmare|||AshiokNightmareMuseToken|
|Generate|TOK:THB|Gold|||GoldToken| |Generate|TOK:THB|Gold|||GoldToken|
|Generate|TOK:THB|Wall|||ArtifactWallToken| |Generate|TOK:THB|Wall|||ArtifactWallToken|
# IKO
|Generate|TOK:IKO|Beast|||BeastToken| |Generate|TOK:IKO|Beast|||BeastToken|
|Generate|TOK:IKO|Cat Bird|||CatBirdToken| |Generate|TOK:IKO|Cat Bird|||CatBirdToken|
|Generate|TOK:IKO|Cat|||CatToken| |Generate|TOK:IKO|Cat|||CatToken|
@ -1370,4 +1376,25 @@
|Generate|TOK:IKO|Human Soldier|2||HumanSoldierToken| |Generate|TOK:IKO|Human Soldier|2||HumanSoldierToken|
|Generate|TOK:IKO|Human Soldier|3||HumanSoldierToken| |Generate|TOK:IKO|Human Soldier|3||HumanSoldierToken|
|Generate|TOK:IKO|Kraken|||KrakenToken| |Generate|TOK:IKO|Kraken|||KrakenToken|
|Generate|TOK:IKO|Shark|||SharkToken| |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|

View file

@ -1,7 +1,5 @@
package mage.cards.a; package mage.cards.a;
import java.util.UUID;
import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
@ -17,8 +15,9 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.TokenPredicate; import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.permanent.token.SpiritWhiteToken; import mage.game.permanent.token.SpiritWhiteToken;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class AbzanAscendancy extends CardImpl { 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)); 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. // 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));
} }

View file

@ -1,7 +1,5 @@
package mage.cards.a; package mage.cards.a;
import java.util.UUID;
import mage.abilities.dynamicvalue.common.TargetConvertedManaCost; import mage.abilities.dynamicvalue.common.TargetConvertedManaCost;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.DestroyTargetEffect;
@ -11,19 +9,20 @@ import mage.constants.CardType;
import mage.game.permanent.token.SaprolingToken; import mage.game.permanent.token.SaprolingToken;
import mage.target.common.TargetArtifactPermanent; import mage.target.common.TargetArtifactPermanent;
import java.util.UUID;
/** /**
*
* @author North * @author North
*/ */
public final class ArtifactMutation extends CardImpl { public final class ArtifactMutation extends CardImpl {
public ArtifactMutation(UUID ownerId, CardSetInfo setInfo) { 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. // Destroy target artifact. It can't be regenerated.
this.getSpellAbility().addEffect(new DestroyTargetEffect(true)); this.getSpellAbility().addEffect(new DestroyTargetEffect(true));
this.getSpellAbility().addTarget(new TargetArtifactPermanent()); this.getSpellAbility().addTarget(new TargetArtifactPermanent());
// create X 1/1 green Saproling creature tokens, where X is that artifact's converted mana cost. // 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")); 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"));
} }

View file

@ -1,7 +1,5 @@
package mage.cards.b; package mage.cards.b;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
@ -19,8 +17,9 @@ import mage.target.Target;
import mage.target.common.TargetOpponent; import mage.target.common.TargetOpponent;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class BenevolentOffering extends CardImpl { public final class BenevolentOffering extends CardImpl {
@ -69,10 +68,10 @@ class BenevolentOfferingEffect1 extends OneShotEffect {
target.choose(Outcome.Sacrifice, source.getControllerId(), source.getSourceId(), game); target.choose(Outcome.Sacrifice, source.getControllerId(), source.getSourceId(), game);
Player opponent = game.getPlayer(target.getFirstTarget()); Player opponent = game.getPlayer(target.getFirstTarget());
if (opponent != null) { 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.setTargetPointer(new FixedTarget(opponent.getId()));
effect.apply(game, source); effect.apply(game, source);
new CreateTokenEffect(new SpiritWhiteToken("C14"), 3).apply(game, source); new CreateTokenEffect(new SpiritWhiteToken(), 3).apply(game, source);
return true; return true;
} }
} }

View file

@ -18,7 +18,7 @@ import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.token.ElementalToken; import mage.game.permanent.token.ElementalTokenWithHaste;
import mage.players.Player; import mage.players.Player;
import java.util.UUID; import java.util.UUID;
@ -75,7 +75,7 @@ class ChandraElementalEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId()); Player controller = game.getPlayer(source.getControllerId());
if (controller != null) { 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.apply(game, source);
effect.exileTokensCreatedAtNextEndStep(game, source); effect.exileTokensCreatedAtNextEndStep(game, source);
return true; return true;

View file

@ -31,7 +31,7 @@ public final class ConfrontTheAssault extends CardImpl {
this.addAbility(ability); this.addAbility(ability);
// Create three 1/1 white Spirit creature tokens with flying. // 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) { public ConfrontTheAssault(final ConfrontTheAssault card) {

View file

@ -1,7 +1,5 @@
package mage.cards.c; package mage.cards.c;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
@ -21,19 +19,21 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.AnotherPredicate; import mage.filter.predicate.permanent.AnotherPredicate;
import mage.game.permanent.token.SpiritWhiteToken; import mage.game.permanent.token.SpiritWhiteToken;
import java.util.UUID;
/** /**
*
* @author emerald000 * @author emerald000
*/ */
public final class CustodiSoulbinders extends CardImpl { public final class CustodiSoulbinders extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures");
static { static {
filter.add(AnotherPredicate.instance); filter.add(AnotherPredicate.instance);
} }
public CustodiSoulbinders(UUID ownerId, CardSetInfo setInfo) { 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.HUMAN);
this.subtype.add(SubType.CLERIC); this.subtype.add(SubType.CLERIC);
this.power = new MageInt(0); 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. // 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( this.addAbility(new EntersBattlefieldAbility(
new AddCountersSourceEffect( new AddCountersSourceEffect(
CounterType.P1P1.createInstance(), CounterType.P1P1.createInstance(),
new PermanentsOnBattlefieldCount(filter), new PermanentsOnBattlefieldCount(filter),
false), false),
"with X +1/+1 counters on it, where X is the number of other creatures on the battlefield")); "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. // {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())); ability.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance()));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,7 +1,5 @@
package mage.cards.f; package mage.cards.f;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
@ -10,17 +8,18 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.token.ElementalToken; import mage.game.permanent.token.ElementalTokenWithHaste;
import mage.players.Player; import mage.players.Player;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class FeralLightning extends CardImpl { public final class FeralLightning extends CardImpl {
public FeralLightning(UUID ownerId, CardSetInfo setInfo) { 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. // 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()); this.getSpellAbility().addEffect(new FeralLightningEffect());
@ -57,7 +56,7 @@ class FeralLightningEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId()); Player controller = game.getPlayer(source.getControllerId());
if (controller != null) { 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.apply(game, source);
effect.exileTokensCreatedAtNextEndStep(game, source); effect.exileTokensCreatedAtNextEndStep(game, source);
return true; return true;

View file

@ -38,7 +38,7 @@ public final class GeistHonoredMonk extends CardImpl {
.addHint(CreaturesYouControlHint.instance)); .addHint(CreaturesYouControlHint.instance));
// When Geist-Honored Monk enters the battlefield, create two 1/1 white Spirit creature tokens with flying. // 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) { public GeistHonoredMonk(final GeistHonoredMonk card) {

View file

@ -1,8 +1,5 @@
package mage.cards.g; package mage.cards.g;
import java.util.UUID;
import mage.MageInt;
import mage.Mana; import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; 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.common.TapTargetCost;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.mana.SimpleManaAbility; import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.TappedPredicate; import mage.filter.predicate.permanent.TappedPredicate;
import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.GreenAndWhiteElementalToken;
import mage.game.permanent.token.Token;
import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetControlledCreaturePermanent;
import java.util.UUID;
/** /**
* @author LevelX2 * @author LevelX2
*/ */
@ -43,7 +39,7 @@ public final class GroveOfTheGuardian extends CardImpl {
this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana(1), new TapSourceCost())); 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. // {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 TapSourceCost());
ability.addCost(new TapTargetCost(new TargetControlledCreaturePermanent(2, 2, filter, false))); ability.addCost(new TapTargetCost(new TargetControlledCreaturePermanent(2, 2, filter, false)));
ability.addCost(new SacrificeSourceCost()); ability.addCost(new SacrificeSourceCost());
@ -58,26 +54,4 @@ public final class GroveOfTheGuardian extends CardImpl {
public GroveOfTheGuardian copy() { public GroveOfTheGuardian copy() {
return new GroveOfTheGuardian(this); 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);
}
}
} }

View file

@ -1,7 +1,5 @@
package mage.cards.l; package mage.cards.l;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.DiesCreatureTriggeredAbility;
@ -19,16 +17,18 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.TokenPredicate; import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.game.permanent.token.ElementalToken; import mage.game.permanent.token.ElementalTokenWithHaste;
import mage.players.Player; import mage.players.Player;
import java.util.UUID;
/** /**
*
* @author escplan9 - Derek Monturo * @author escplan9 - Derek Monturo
*/ */
public final class LightningCoils extends CardImpl { public final class LightningCoils extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a nontoken creature you control"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a nontoken creature you control");
static { static {
filter.add(TargetController.YOU.getControllerPredicate()); filter.add(TargetController.YOU.getControllerPredicate());
filter.add(Predicates.not(TokenPredicate.instance)); filter.add(Predicates.not(TokenPredicate.instance));
@ -36,13 +36,13 @@ public final class LightningCoils extends CardImpl {
public LightningCoils(UUID ownerId, CardSetInfo setInfo) { public LightningCoils(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
// Whenever a nontoken creature you control dies, put a charge counter on Lightning Coils. // Whenever a nontoken creature you control dies, put a charge counter on Lightning Coils.
this.addAbility( this.addAbility(
new DiesCreatureTriggeredAbility( new DiesCreatureTriggeredAbility(
new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true), new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true),
false, filter)); 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 // 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. // 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. // Exile them at the beginning of the next end step.
@ -79,9 +79,9 @@ class LightningCoilsEffect extends OneShotEffect {
if (counters >= 5) { if (counters >= 5) {
// remove all the counters and create that many tokens // remove all the counters and create that many tokens
p.removeCounters(CounterType.CHARGE.getName(), p.getCounters(game).getCount(CounterType.CHARGE), game); 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); effect.apply(game, source);
// exile those tokens at next end step // exile those tokens at next end step
effect.exileTokensCreatedAtNextEndStep(game, source); effect.exileTokensCreatedAtNextEndStep(game, source);
return true; return true;

View file

@ -1,7 +1,5 @@
package mage.cards.l; package mage.cards.l;
import java.util.UUID;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.FlashbackAbility; import mage.abilities.keyword.FlashbackAbility;
@ -11,18 +9,19 @@ import mage.constants.CardType;
import mage.constants.TimingRule; import mage.constants.TimingRule;
import mage.game.permanent.token.SpiritWhiteToken; import mage.game.permanent.token.SpiritWhiteToken;
import java.util.UUID;
/** /**
*
* @author Loki * @author Loki
*/ */
public final class LingeringSouls extends CardImpl { public final class LingeringSouls extends CardImpl {
public LingeringSouls(UUID ownerId, CardSetInfo setInfo) { 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. // 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} // Flashback {1}{B}
this.addAbility(new FlashbackAbility(new ManaCostsImpl("{1}{B}"), TimingRule.SORCERY)); this.addAbility(new FlashbackAbility(new ManaCostsImpl("{1}{B}"), TimingRule.SORCERY));
} }

View file

@ -1,7 +1,5 @@
package mage.cards.m; package mage.cards.m;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.common.DiesTriggeredAbility; import mage.abilities.common.DiesTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
@ -11,13 +9,15 @@ import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.game.permanent.token.SpiritWhiteToken; import mage.game.permanent.token.SpiritWhiteToken;
import java.util.UUID;
/** /**
* @author nantuko * @author nantuko
*/ */
public final class MausoleumGuard extends CardImpl { public final class MausoleumGuard extends CardImpl {
public MausoleumGuard(UUID ownerId, CardSetInfo setInfo) { 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.HUMAN);
this.subtype.add(SubType.SCOUT); this.subtype.add(SubType.SCOUT);
@ -25,7 +25,7 @@ public final class MausoleumGuard extends CardImpl {
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
// When Mausoleum Guard dies, create two 1/1 white Spirit creature tokens with flying. // 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) { public MausoleumGuard(final MausoleumGuard card) {

View file

@ -1,25 +1,24 @@
package mage.cards.m; package mage.cards.m;
import java.util.UUID;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.game.permanent.token.SpiritWhiteToken; import mage.game.permanent.token.SpiritWhiteToken;
import java.util.UUID;
/** /**
*
* @author nantuko * @author nantuko
*/ */
public final class MidnightHaunting extends CardImpl { public final class MidnightHaunting extends CardImpl {
public MidnightHaunting(UUID ownerId, CardSetInfo setInfo) { 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. // 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) { public MidnightHaunting(final MidnightHaunting card) {

View file

@ -1,7 +1,5 @@
package mage.cards.p; package mage.cards.p;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
@ -11,8 +9,9 @@ import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.game.permanent.token.TreasureToken; import mage.game.permanent.token.TreasureToken;
import java.util.UUID;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class ProsperousPirates extends CardImpl { public final class ProsperousPirates extends CardImpl {
@ -26,7 +25,7 @@ public final class ProsperousPirates extends CardImpl {
this.toughness = new MageInt(4); 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." // 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) { public ProsperousPirates(final ProsperousPirates card) {

View file

@ -1,7 +1,5 @@
package mage.cards.r; package mage.cards.r;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
@ -16,8 +14,9 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.AnotherPredicate; import mage.filter.predicate.permanent.AnotherPredicate;
import mage.game.permanent.token.SpiritWhiteToken; import mage.game.permanent.token.SpiritWhiteToken;
import java.util.UUID;
/** /**
*
* @author intimidatingant * @author intimidatingant
*/ */
public final class RequiemAngel extends CardImpl { public final class RequiemAngel extends CardImpl {
@ -30,7 +29,7 @@ public final class RequiemAngel extends CardImpl {
} }
public RequiemAngel(UUID ownerId, CardSetInfo setInfo) { 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.subtype.add(SubType.ANGEL);
this.power = new MageInt(5); this.power = new MageInt(5);
@ -39,7 +38,7 @@ public final class RequiemAngel extends CardImpl {
this.addAbility(FlyingAbility.getInstance()); this.addAbility(FlyingAbility.getInstance());
// Whenever another non-Spirit creature you control dies, create a 1/1 white Spirit creature token with flying. // 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) { public RequiemAngel(final RequiemAngel card) {

View file

@ -1,28 +1,23 @@
package mage.cards.r; package mage.cards.r;
import java.util.Set;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.Card; import mage.cards.*;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.cards.SplitCard;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.SpellAbilityType; import mage.constants.SpellAbilityType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.token.ElementalToken; import mage.game.permanent.token.ResearchDevelopmentToken;
import mage.players.Player; import mage.players.Player;
import mage.target.TargetCard; import mage.target.TargetCard;
import java.util.Set;
import java.util.UUID;
/** /**
*
* @author magenoxx * @author magenoxx
*/ */
public final class ResearchDevelopment extends SplitCard { public final class ResearchDevelopment extends SplitCard {
@ -144,7 +139,7 @@ class DevelopmentEffect extends OneShotEffect {
for (UUID opponentUuid : opponents) { for (UUID opponentUuid : opponents) {
Player opponent = game.getPlayer(opponentUuid); Player opponent = game.getPlayer(opponentUuid);
if (opponent != null && opponent.chooseUse(Outcome.Detriment, 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."); game.informPlayers(opponent.getLogName() + " had chosen to let " + player.getLogName() + " draw a card.");
player.drawCards(1, source.getSourceId(), game); player.drawCards(1, source.getSourceId(), game);
putToken = false; putToken = false;
@ -152,7 +147,7 @@ class DevelopmentEffect extends OneShotEffect {
} }
} }
if (putToken) { if (putToken) {
new CreateTokenEffect(new ElementalToken("DIS", 1)).apply(game, source); new CreateTokenEffect(new ResearchDevelopmentToken()).apply(game, source);
} }
} }

View file

@ -1,7 +1,5 @@
package mage.cards.r; package mage.cards.r;
import java.util.UUID;
import mage.abilities.TriggeredAbility; import mage.abilities.TriggeredAbility;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.DiesCreatureTriggeredAbility;
@ -19,8 +17,9 @@ import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
import mage.game.permanent.token.TreasureToken; import mage.game.permanent.token.TreasureToken;
import java.util.UUID;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class RevelInRiches extends CardImpl { 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}"); 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." // 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. // 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); TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect(), TargetController.YOU, false);
this.addAbility(new ConditionalInterveningIfTriggeredAbility( this.addAbility(new ConditionalInterveningIfTriggeredAbility(

View file

@ -1,7 +1,5 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.Mode; import mage.abilities.Mode;
@ -15,14 +13,15 @@ import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.permanent.token.SpiritWhiteToken; import mage.game.permanent.token.SpiritWhiteToken;
import java.util.UUID;
/** /**
*
* @author emerald000 * @author emerald000
*/ */
public final class SandsteppeOutcast extends CardImpl { public final class SandsteppeOutcast extends CardImpl {
public SandsteppeOutcast(UUID ownerId, CardSetInfo setInfo) { 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.HUMAN);
this.subtype.add(SubType.WARRIOR); this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(2); this.power = new MageInt(2);
@ -31,12 +30,12 @@ public final class SandsteppeOutcast extends CardImpl {
// When Sandsteppe Outcast enters the battlefield, choose one - // When Sandsteppe Outcast enters the battlefield, choose one -
// * Put a +1/+1 counter on Sandsteppe Outcast. // * Put a +1/+1 counter on Sandsteppe Outcast.
Ability ability = new EntersBattlefieldTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance())); Ability ability = new EntersBattlefieldTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()));
// * Create a 1/1 white Spirit creature token with flying. // * Create a 1/1 white Spirit creature token with flying.
Mode mode = new Mode(); Mode mode = new Mode();
mode.addEffect(new CreateTokenEffect(new SpiritWhiteToken("FRF"))); mode.addEffect(new CreateTokenEffect(new SpiritWhiteToken()));
ability.addMode(mode); ability.addMode(mode);
this.addAbility(ability); this.addAbility(ability);
} }
public SandsteppeOutcast(final SandsteppeOutcast card) { public SandsteppeOutcast(final SandsteppeOutcast card) {

View file

@ -13,14 +13,13 @@ import mage.game.permanent.token.SaprolingToken;
import java.util.UUID; import java.util.UUID;
/** /**
*
* @author noahg * @author noahg
*/ */
public final class SaprolingInfestation extends CardImpl { public final class SaprolingInfestation extends CardImpl {
public SaprolingInfestation(UUID ownerId, CardSetInfo setInfo) { public SaprolingInfestation(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); 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. // Whenever a player kicks a spell, you put a 1/1 green Saproling creature token onto the battlefield.
this.addAbility(new SaprolingInfestationTriggeredAbility()); this.addAbility(new SaprolingInfestationTriggeredAbility());
@ -38,7 +37,7 @@ public final class SaprolingInfestation extends CardImpl {
class SaprolingInfestationTriggeredAbility extends TriggeredAbilityImpl { class SaprolingInfestationTriggeredAbility extends TriggeredAbilityImpl {
SaprolingInfestationTriggeredAbility() { SaprolingInfestationTriggeredAbility() {
super(Zone.BATTLEFIELD, new CreateTokenEffect(new SaprolingToken("INV")), false); super(Zone.BATTLEFIELD, new CreateTokenEffect(new SaprolingToken()), false);
} }
SaprolingInfestationTriggeredAbility(final SaprolingInfestationTriggeredAbility ability) { SaprolingInfestationTriggeredAbility(final SaprolingInfestationTriggeredAbility ability) {

View file

@ -1,7 +1,5 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.GainLifeEffect;
@ -10,17 +8,18 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.game.permanent.token.SpiritWhiteToken; import mage.game.permanent.token.SpiritWhiteToken;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class SpectralReserves extends CardImpl { public final class SpectralReserves extends CardImpl {
public SpectralReserves(UUID ownerId, CardSetInfo setInfo) { 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. // 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"); effect.setText("Create two 1/1 white Spirit creature tokens with flying");
this.getSpellAbility().addEffect(effect); this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addEffect(new GainLifeEffect(2)); this.getSpellAbility().addEffect(new GainLifeEffect(2));

View file

@ -1,7 +1,5 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
@ -25,8 +23,9 @@ import mage.game.permanent.token.SpiritWhiteToken;
import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class SpiritBonds extends CardImpl { public final class SpiritBonds extends CardImpl {
@ -42,16 +41,16 @@ public final class SpiritBonds extends CardImpl {
} }
public SpiritBonds(UUID ownerId, CardSetInfo setInfo) { 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. // 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. // {1}{W}, Sacrifice a Spirit: Target non-Spirit creature you control gains indestructible until end of turn.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new GainAbilityTargetEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{1}{W}")); 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)); ability.addTarget(new TargetControlledCreaturePermanent(filter));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,7 +1,5 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.ObjectColor; import mage.ObjectColor;
import mage.abilities.Ability; import mage.abilities.Ability;
@ -12,11 +10,7 @@ import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.ExileTargetEffect; import mage.abilities.effects.common.ExileTargetEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.*;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.ColorPredicate; 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.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author emerald000 * @author emerald000
*/ */
public final class TeysaOrzhovScion extends CardImpl { public final class TeysaOrzhovScion extends CardImpl {
private static final FilterControlledCreaturePermanent filterWhite = new FilterControlledCreaturePermanent("three white creatures"); private static final FilterControlledCreaturePermanent filterWhite = new FilterControlledCreaturePermanent("three white creatures");
private static final FilterCreaturePermanent filterBlack = new FilterCreaturePermanent("another black creature you control"); private static final FilterCreaturePermanent filterBlack = new FilterCreaturePermanent("another black creature you control");
static { static {
filterWhite.add(new ColorPredicate(ObjectColor.WHITE)); filterWhite.add(new ColorPredicate(ObjectColor.WHITE));
filterBlack.add(new ColorPredicate(ObjectColor.BLACK)); filterBlack.add(new ColorPredicate(ObjectColor.BLACK));
@ -41,7 +37,7 @@ public final class TeysaOrzhovScion extends CardImpl {
} }
public TeysaOrzhovScion(UUID ownerId, CardSetInfo setInfo) { 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.addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.ADVISOR); 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 ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new SacrificeTargetCost(new TargetControlledCreaturePermanent(3, 3, filterWhite, true)));
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability); this.addAbility(ability);
// Whenever another black creature you control dies, create a 1/1 white Spirit creature token with flying. // 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) { public TeysaOrzhovScion(final TeysaOrzhovScion card) {

View file

@ -1,7 +1,5 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
@ -21,8 +19,9 @@ import mage.game.permanent.Permanent;
import mage.game.permanent.token.TreasureToken; import mage.game.permanent.token.TreasureToken;
import mage.players.Player; import mage.players.Player;
import java.util.UUID;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class TreasureMap extends CardImpl { public final class TreasureMap extends CardImpl {
@ -81,7 +80,7 @@ class TreasureMapEffect extends OneShotEffect {
if (counters > 2) { if (counters > 2) {
permanent.removeCounters("landmark", counters, game); permanent.removeCounters("landmark", counters, game);
new TransformSourceEffect(true).apply(game, source); 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; return true;
} }

View file

@ -1,7 +1,5 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.ConvokeAbility; import mage.abilities.keyword.ConvokeAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
@ -9,21 +7,22 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.game.permanent.token.SpiritWhiteToken; import mage.game.permanent.token.SpiritWhiteToken;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class TriplicateSpirits extends CardImpl { public final class TriplicateSpirits extends CardImpl {
public TriplicateSpirits(UUID ownerId, CardSetInfo setInfo) { 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 // Convoke
this.addAbility(new ConvokeAbility()); this.addAbility(new ConvokeAbility());
// Create three 1/1 white Spirit creature tokens with flying. // 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) { public TriplicateSpirits(final TriplicateSpirits card) {

View file

@ -1,7 +1,5 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.LeavesBattlefieldAllTriggeredAbility; import mage.abilities.common.LeavesBattlefieldAllTriggeredAbility;
@ -20,8 +18,9 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.TokenPredicate; import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.permanent.token.SpiritWhiteToken; import mage.game.permanent.token.SpiritWhiteToken;
import java.util.UUID;
/** /**
*
* @author emerald000 * @author emerald000
*/ */
public final class TwilightDrover extends CardImpl { public final class TwilightDrover extends CardImpl {
@ -33,7 +32,7 @@ public final class TwilightDrover extends CardImpl {
} }
public TwilightDrover(UUID ownerId, CardSetInfo setInfo) { 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.subtype.add(SubType.SPIRIT);
this.power = new MageInt(1); 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)); 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. // {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())); ability.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance()));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,7 +1,5 @@
package mage.cards.w; package mage.cards.w;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.ObjectColor; import mage.ObjectColor;
import mage.abilities.Ability; import mage.abilities.Ability;
@ -17,12 +15,13 @@ import mage.filter.common.FilterInstantOrSorcerySpell;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ColorPredicate; import mage.filter.predicate.mageobject.ColorPredicate;
import mage.game.Game; 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.Spell;
import mage.game.stack.StackObject; import mage.game.stack.StackObject;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class WortTheRaidmother extends CardImpl { public final class WortTheRaidmother extends CardImpl {
@ -36,7 +35,7 @@ public final class WortTheRaidmother extends CardImpl {
this.toughness = new MageInt(3); this.toughness = new MageInt(3);
// When Wort, the Raidmother enters the battlefield, create two 1/1 red and green Goblin Warrior creature tokens. // 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. // Each red or green instant or sorcery spell you cast has conspire.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new WortGainConspireEffect())); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new WortGainConspireEffect()));
@ -59,6 +58,7 @@ class WortGainConspireEffect extends ContinuousEffectImpl {
static { static {
filter.add(Predicates.or(new ColorPredicate(ObjectColor.RED), new ColorPredicate(ObjectColor.GREEN))); filter.add(Predicates.or(new ColorPredicate(ObjectColor.RED), new ColorPredicate(ObjectColor.GREEN)));
} }
private final ConspireAbility conspireAbility; private final ConspireAbility conspireAbility;
public WortGainConspireEffect() { public WortGainConspireEffect() {

View file

@ -6,7 +6,6 @@ import mage.abilities.TriggeredAbility;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.mana.SimpleManaAbility; import mage.abilities.mana.SimpleManaAbility;
@ -18,7 +17,7 @@ import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.game.permanent.token.Token; 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.game.stack.Spell;
import mage.players.Player; import mage.players.Player;
@ -144,25 +143,4 @@ class ZaxaraTheExemplaryHydraTokenEffect extends OneShotEffect {
} }
return false; 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);
}
} }

View file

@ -701,6 +701,10 @@ public class VerifyCardDataTest {
if (errorsList.size() > 0) { if (errorsList.size() > 0) {
Assert.fail("Found token errors: " + errorsList.size()); 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 @Test

View file

@ -16,7 +16,7 @@ public final class BeastToken2 extends TokenImpl {
static final private List<String> tokenImageSets = new ArrayList<>(); static final private List<String> tokenImageSets = new ArrayList<>();
static { 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() { public BeastToken2() {

View file

@ -1,15 +1,13 @@
package mage.game.permanent.token; package mage.game.permanent.token;
import java.util.Arrays;
import mage.MageInt; import mage.MageInt;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import java.util.Arrays;
/** /**
*
* @author LoneFox * @author LoneFox
*/ */
public final class BirdToken extends TokenImpl { public final class BirdToken extends TokenImpl {
@ -22,6 +20,7 @@ public final class BirdToken extends TokenImpl {
power = new MageInt(1); power = new MageInt(1);
toughness = new MageInt(1); toughness = new MageInt(1);
addAbility(FlyingAbility.getInstance()); addAbility(FlyingAbility.getInstance());
availableImageSetCodes.addAll(Arrays.asList("BNG", "RTR", "ZEN", "C16", "MM3", "DGM")); availableImageSetCodes.addAll(Arrays.asList("BNG", "RTR", "ZEN", "C16", "MM3", "DGM"));
} }
@ -30,7 +29,7 @@ public final class BirdToken extends TokenImpl {
} }
@Override @Override
public BirdToken copy() { public BirdToken copy() {
return new BirdToken(this); return new BirdToken(this);
} }

View file

@ -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<String> 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);
}
}

View file

@ -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<String> 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);
}
}

View file

@ -1,17 +1,17 @@
package mage.game.permanent.token; package mage.game.permanent.token;
import mage.MageInt;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.MageInt;
import java.util.Arrays;
/** /**
*
* @author spjspj * @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"); super("Goblin Warrior", "1/1 red and green Goblin Warrior creature token");
cardType.add(CardType.CREATURE); cardType.add(CardType.CREATURE);
color.setRed(true); color.setRed(true);
@ -20,13 +20,15 @@ public final class WortTheRaidmotherToken extends TokenImpl {
subtype.add(SubType.WARRIOR); subtype.add(SubType.WARRIOR);
power = new MageInt(1); power = new MageInt(1);
toughness = new MageInt(1); toughness = new MageInt(1);
availableImageSetCodes.addAll(Arrays.asList("C20"));
} }
public WortTheRaidmotherToken(final WortTheRaidmotherToken token) { public GoblinWarriorToken(final GoblinWarriorToken token) {
super(token); super(token);
} }
public WortTheRaidmotherToken copy() { public GoblinWarriorToken copy() {
return new WortTheRaidmotherToken(this); return new GoblinWarriorToken(this);
} }
} }

View file

@ -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<String> 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);
}
}

View file

@ -1,21 +1,20 @@
package mage.game.permanent.token; package mage.game.permanent.token;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.MageInt; import mage.MageInt;
import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.Arrays;
/** /**
*
* @author spjspj * @author spjspj
*/ */
public final class HornetQueenInsectToken extends TokenImpl { public final class HornetQueenInsectToken extends TokenImpl {
public HornetQueenInsectToken() { public HornetQueenInsectToken() {
super("Insect", "1/1 green Insect creature token with flying and deathtouch"); super("Insect", "1/1 green Insect creature token with flying and deathtouch");
setOriginalExpansionSetCode("M15");
cardType.add(CardType.CREATURE); cardType.add(CardType.CREATURE);
color.setGreen(true); color.setGreen(true);
subtype.add(SubType.INSECT); subtype.add(SubType.INSECT);
@ -23,6 +22,8 @@ public final class HornetQueenInsectToken extends TokenImpl {
toughness = new MageInt(1); toughness = new MageInt(1);
addAbility(FlyingAbility.getInstance()); addAbility(FlyingAbility.getInstance());
addAbility(DeathtouchAbility.getInstance()); addAbility(DeathtouchAbility.getInstance());
availableImageSetCodes = Arrays.asList("M15", "C20");
} }
public HornetQueenInsectToken(final HornetQueenInsectToken token) { public HornetQueenInsectToken(final HornetQueenInsectToken token) {

View file

@ -18,7 +18,7 @@ public final class HumanToken extends TokenImpl {
subtype.add(SubType.HUMAN); subtype.add(SubType.HUMAN);
power = new MageInt(1); power = new MageInt(1);
toughness = 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) { public HumanToken(final HumanToken token) {

View file

@ -1,29 +1,29 @@
package mage.game.permanent.token; package mage.game.permanent.token;
import mage.MageInt;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.MageInt;
import java.util.Arrays;
/** /**
*
* @author spjspj * @author spjspj
*/ */
public final class HydraBroodmasterToken extends TokenImpl { public final class HydraBroodmasterToken extends TokenImpl {
public HydraBroodmasterToken() { public HydraBroodmasterToken() {
this(1,1); this(1, 1);
} }
public HydraBroodmasterToken(int power, int toughness) { public HydraBroodmasterToken(int power, int toughness) {
super("Hydra", "green Hydra creature token"); super("Hydra", "green Hydra creature token");
this.setOriginalExpansionSetCode("JOU");
cardType.add(CardType.CREATURE); cardType.add(CardType.CREATURE);
color.setGreen(true); color.setGreen(true);
subtype.add(SubType.HYDRA); subtype.add(SubType.HYDRA);
this.power = new MageInt(power); this.power = new MageInt(power);
this.toughness = new MageInt(toughness); this.toughness = new MageInt(toughness);
availableImageSetCodes = Arrays.asList("JOU");
} }
public HydraBroodmasterToken(final HydraBroodmasterToken token) { public HydraBroodmasterToken(final HydraBroodmasterToken token) {

View file

@ -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<String> 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);
}
}

View file

@ -32,39 +32,33 @@ public final class SaprolingToken extends TokenImpl {
"RTR", "RTR",
"C15", "C15",
"MM3", "MM3",
"INV",
"C16", // 2 different token images... "C16", // 2 different token images...
"CMA", "CMA",
"VMA", // 2 different token, one with DIFFERENT stats, "Saproling Burst" create different token, see https://scryfall.com/card/tvma/12 "VMA", // 2 different token, one with DIFFERENT stats, "Saproling Burst" create different token, see https://scryfall.com/card/tvma/12
"E02", "E02",
"RIX", "RIX",
"DOM", // 3 different token images "DOM", // 3 different token images
"C19" "C19",
"C20"
)); ));
} }
public SaprolingToken() { 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"); super("Saproling", "1/1 green Saproling creature token");
availableImageSetCodes = tokenImageSets; 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")) { if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("C16")) {
this.setTokenType(RandomUtil.nextInt(2) + 1); this.setTokenType(RandomUtil.nextInt(2) + 1);
} }
if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("DOM")) { if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("DOM")) {
this.setTokenType(RandomUtil.nextInt(3) + 1); 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) { public SaprolingToken(final SaprolingToken token) {

View file

@ -18,7 +18,7 @@ public final class SoldierToken extends TokenImpl {
static { static {
tokenImageSets.addAll(Arrays.asList("10E", "M15", "C14", "ORI", "ALA", "DDF", "THS", "M12", "M13", "MM2", "MMA", "RTR", 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() { public SoldierToken() {
@ -30,7 +30,6 @@ public final class SoldierToken extends TokenImpl {
subtype.add(SubType.SOLDIER); subtype.add(SubType.SOLDIER);
power = new MageInt(1); power = new MageInt(1);
toughness = new MageInt(1); toughness = new MageInt(1);
} }
@Override @Override
@ -39,7 +38,7 @@ public final class SoldierToken extends TokenImpl {
if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("THS")) { if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("THS")) {
this.setTokenType(RandomUtil.nextInt(2) + 1); 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); setTokenType(1);
} }
} }

View file

@ -18,24 +18,12 @@ public final class SpiritWhiteToken extends TokenImpl {
static { static {
tokenImageSets.addAll(Arrays.asList("AVR", "C14", "CNS", "DDC", "DDK", "FRF", "ISD", "KTK", "M15", "MM2", "SHM", 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() { 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"); super("Spirit", "1/1 white Spirit creature token with flying");
availableImageSetCodes = tokenImageSets; availableImageSetCodes = tokenImageSets;
setOriginalExpansionSetCode(setCode);
if (tokenType > 0) {
setTokenType(tokenType);
}
cardType.add(CardType.CREATURE); cardType.add(CardType.CREATURE);
subtype.add(SubType.SPIRIT); subtype.add(SubType.SPIRIT);
color.setWhite(true); color.setWhite(true);

View file

@ -1,21 +1,20 @@
package mage.game.permanent.token; 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.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.MageInt;
import mage.abilities.keyword.HasteAbility; import java.util.Arrays;
import mage.abilities.keyword.FlyingAbility;
/** /**
*
* @author spjspj * @author spjspj
*/ */
public final class TheLocustGodInsectToken extends TokenImpl { public final class TheLocustGodInsectToken extends TokenImpl {
public TheLocustGodInsectToken() { public TheLocustGodInsectToken() {
super("Insect", "1/1 blue and red Insect creature token with flying and haste"); super("Insect", "1/1 blue and red Insect creature token with flying and haste");
setOriginalExpansionSetCode("HOU");
cardType.add(CardType.CREATURE); cardType.add(CardType.CREATURE);
color.setBlue(true); color.setBlue(true);
color.setRed(true); color.setRed(true);
@ -24,6 +23,8 @@ public final class TheLocustGodInsectToken extends TokenImpl {
toughness = new MageInt(1); toughness = new MageInt(1);
addAbility(FlyingAbility.getInstance()); addAbility(FlyingAbility.getInstance());
addAbility(HasteAbility.getInstance()); addAbility(HasteAbility.getInstance());
availableImageSetCodes = Arrays.asList("HOU", "C20");
} }
public TheLocustGodInsectToken(final TheLocustGodInsectToken token) { public TheLocustGodInsectToken(final TheLocustGodInsectToken token) {

View file

@ -2,15 +2,12 @@ package mage.game.permanent.token;
import mage.MageObject; import mage.MageObject;
import mage.MageObjectImpl; import mage.MageObjectImpl;
import mage.MageObjectReference;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.cards.Card; import mage.cards.Card;
import mage.constants.Zone; import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.game.events.CreateTokenEvent; import mage.game.events.CreateTokenEvent;
import mage.game.events.CreatedTokenEvent; import mage.game.events.CreatedTokenEvent;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.events.ZoneChangeEvent; import mage.game.events.ZoneChangeEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.game.permanent.PermanentToken; 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) { public TokenImpl(String name, String description) {
this.name = name; this.name = name;
@ -165,6 +163,9 @@ public abstract class TokenImpl extends MageObjectImpl implements Token {
if (controller == null) { if (controller == null) {
return false; return false;
} }
if (amount == 0) {
return false;
}
lastAddedTokenIds.clear(); lastAddedTokenIds.clear();
CreateTokenEvent event = new CreateTokenEvent(sourceId, controllerId, amount, this); CreateTokenEvent event = new CreateTokenEvent(sourceId, controllerId, amount, this);
@ -240,6 +241,10 @@ public abstract class TokenImpl extends MageObjectImpl implements Token {
return tokenType; return tokenType;
} }
/**
* Set token index to search in card-pictures-tok.txt (if set have multiple tokens with same name)
* Default is 1
*/
@Override @Override
public void setTokenType(int tokenType) { public void setTokenType(int tokenType) {
this.tokenType = tokenType; this.tokenType = tokenType;

View file

@ -20,24 +20,11 @@ public final class TreasureToken extends TokenImpl {
static final private List<String> tokenImageSets = new ArrayList<>(); static final private List<String> tokenImageSets = new ArrayList<>();
static {
tokenImageSets.addAll(Arrays.asList("XLN", "RNA", "M20", "C19"));
}
public TreasureToken() { public TreasureToken() {
this(null, 0);
}
public TreasureToken(String setCode) {
this(setCode, 0);
}
public TreasureToken(String setCode, int tokenType) {
super("Treasure", "Treasure token"); super("Treasure", "Treasure token");
availableImageSetCodes = tokenImageSets;
setOriginalExpansionSetCode(setCode);
cardType.add(CardType.ARTIFACT); cardType.add(CardType.ARTIFACT);
subtype.add(SubType.TREASURE); subtype.add(SubType.TREASURE);
availableImageSetCodes = Arrays.asList("XLN", "RNA", "M20", "C19", "C20");
Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(), new TapSourceCost()); Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(), new TapSourceCost());
ability.addCost(new SacrificeSourceCost()); ability.addCost(new SacrificeSourceCost());

View file

@ -1,13 +1,11 @@
package mage.game.permanent.token; package mage.game.permanent.token;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.MageInt; import mage.MageInt;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.constants.CardType;
import mage.constants.SubType;
/** /**
*
* @author spjspj * @author spjspj
*/ */
public final class WhiteElementalToken extends TokenImpl { public final class WhiteElementalToken extends TokenImpl {
@ -19,8 +17,11 @@ public final class WhiteElementalToken extends TokenImpl {
subtype.add(SubType.ELEMENTAL); subtype.add(SubType.ELEMENTAL);
power = new MageInt(4); power = new MageInt(4);
toughness = new MageInt(4); toughness = new MageInt(4);
setTokenType(2);
this.addAbility(FlyingAbility.getInstance()); this.addAbility(FlyingAbility.getInstance());
if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("C20")) {
setTokenType(2);
}
} }
public WhiteElementalToken(final WhiteElementalToken token) { public WhiteElementalToken(final WhiteElementalToken token) {

View file

@ -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);
}
}