[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 - 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()) {

View file

@ -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|
@ -1371,3 +1377,24 @@
|Generate|TOK:IKO|Human Soldier|3||HumanSoldierToken|
|Generate|TOK:IKO|Kraken|||KrakenToken|
|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;
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));
}

View file

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

View file

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

View file

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

View file

@ -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) {

View file

@ -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);
@ -49,7 +49,7 @@ public final class CustodiSoulbinders extends CardImpl {
// {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);
}

View file

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

View file

@ -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) {

View file

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

View file

@ -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));
@ -79,7 +79,7 @@ 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

View file

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

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

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

View file

@ -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(

View file

@ -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);
@ -34,7 +33,7 @@ public final class SandsteppeOutcast extends CardImpl {
// * 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);
}

View file

@ -13,7 +13,6 @@ import mage.game.permanent.token.SaprolingToken;
import java.util.UUID;
/**
*
* @author noahg
*/
public final class SaprolingInfestation extends CardImpl {
@ -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) {

View file

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

View file

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

View file

@ -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);
@ -55,7 +51,7 @@ public final class TeysaOrzhovScion extends CardImpl {
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) {

View file

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

View file

@ -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,20 +7,21 @@ 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));
}

View file

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

View file

@ -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() {

View file

@ -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;
@ -145,24 +144,3 @@ 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);
}
}

View file

@ -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

View file

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

View file

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

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

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;
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) {

View file

@ -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) {

View file

@ -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) {

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",
"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) {

View file

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

View file

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

View file

@ -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) {

View file

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

View file

@ -20,24 +20,11 @@ public final class TreasureToken extends TokenImpl {
static final private List<String> 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());

View file

@ -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) {

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