mirror of
https://github.com/correl/mage.git
synced 2024-11-14 19:19:32 +00:00
[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:
parent
2b21298377
commit
c2487aec7d
48 changed files with 406 additions and 349 deletions
|
@ -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()) {
|
||||
|
|
|
@ -571,7 +571,7 @@
|
|||
|Generate|TOK:DGM|Wurm|||WurmToken3|
|
||||
|Generate|TOK:DIS|Bird|||DovescapeToken|
|
||||
|Generate|TOK:DIS|Drake|||LeafdrakeRoostDrakeToken|
|
||||
|Generate|TOK:DIS|Elemental|||ElementalToken|
|
||||
|Generate|TOK:DIS|Elemental|||ResearchDevelopmentToken|
|
||||
|Generate|TOK:DIS|Goblin|||RakdosGuildmageGoblinToken|
|
||||
|Generate|TOK:DIS|Saproling|||SaprolingToken|
|
||||
|Generate|TOK:DIS|Snake|||PatagiaViperSnakeToken|
|
||||
|
@ -956,7 +956,7 @@
|
|||
|Generate|TOK:MOR|Wolf|||WolfToken|
|
||||
|Generate|TOK:MRD|Beast|||OneDozenEyesBeastToken|
|
||||
|Generate|TOK:MRD|Demon|||ReignOfThePitToken|
|
||||
|Generate|TOK:MRD|Elemental|||ElementalToken|
|
||||
|Generate|TOK:MRD|Elemental|||ElementalTokenWithHaste|
|
||||
|Generate|TOK:MRD|Insect|||InsectToken|
|
||||
|Generate|TOK:MRD|Myr|||MyrToken|
|
||||
|Generate|TOK:MRD|Pentavite|||PentaviteToken|
|
||||
|
@ -990,7 +990,7 @@
|
|||
|Generate|TOK:OGW|Eldrazi Scion|5||EldraziScionToken|
|
||||
|Generate|TOK:OGW|Eldrazi Scion|6||EldraziScionToken|
|
||||
|Generate|TOK:OGW|Elemental|1||SeedGuardianToken|
|
||||
|Generate|TOK:OGW|Elemental|2||ElementalToken|
|
||||
|Generate|TOK:OGW|Elemental|2||ElementalTokenWithHaste|
|
||||
|Generate|TOK:OGW|Knight Ally|||KnightAllyToken|
|
||||
|Generate|TOK:OGW|Kor Ally|||KorAllyToken|
|
||||
|Generate|TOK:OGW|Octopus|||OctopusToken|
|
||||
|
@ -1063,7 +1063,7 @@
|
|||
|Generate|TOK:RTR|Bird|||BirdToken|
|
||||
|Generate|TOK:RTR|Centaur|||CentaurToken|
|
||||
|Generate|TOK:RTR|Dragon|||UtvaraHellkiteDragonToken|
|
||||
|Generate|TOK:RTR|Elemental||
|
||||
|Generate|TOK:RTR|Elemental|||GreenAndWhiteElementalToken|
|
||||
|Generate|TOK:RTR|Goblin|||GoblinToken|
|
||||
|Generate|TOK:RTR|Knight|||KnightToken|
|
||||
|Generate|TOK:RTR|Ooze|||MysticGenesisOozeToken|
|
||||
|
@ -1106,7 +1106,7 @@
|
|||
|Generate|TOK:SOI|Vampire Knight|||VampireKnightToken|
|
||||
|Generate|TOK:SOI|Wolf|||WolfToken|
|
||||
|Generate|TOK:SOI|Zombie|||ZombieToken|
|
||||
|Generate|TOK:SOK|Elemental|||ElementalToken|
|
||||
|Generate|TOK:SOK|Elemental|||ElementalTokenWithHaste|
|
||||
|Generate|TOK:SOK|Snake|||SnakeToken|
|
||||
|Generate|TOK:SOK|Spirit|||SpiritToken|
|
||||
|Generate|TOK:SOK|Urami|||UramiToken|
|
||||
|
@ -1328,6 +1328,8 @@
|
|||
|Generate|TOK:M20|Treasure|||TreasureToken|
|
||||
|Generate|TOK:M20|Wolf|||WolfToken|
|
||||
|Generate|TOK:M20|Zombie|||ZombieToken|
|
||||
|
||||
# ELD
|
||||
|Generate|TOK:ELD|Bear|||BearToken|
|
||||
|Generate|TOK:ELD|Boar|||WolfsQuarryToken|
|
||||
|Generate|TOK:ELD|Dwarf|||DwarfToken|
|
||||
|
@ -1346,6 +1348,8 @@
|
|||
|Generate|TOK:ELD|Mouse|||MouseToken|
|
||||
|Generate|TOK:ELD|Rat|||RatToken|
|
||||
|Generate|TOK:ELD|Wolf|||GarrukCursedHuntsmanToken|
|
||||
|
||||
# THB
|
||||
|Generate|TOK:THB|Goat|||GoatToken|
|
||||
|Generate|TOK:THB|Human Soldier|||HumanSoldierToken|
|
||||
|Generate|TOK:THB|Pegasus|||PegasusToken2|
|
||||
|
@ -1360,6 +1364,8 @@
|
|||
|Generate|TOK:THB|Nightmare|||AshiokNightmareMuseToken|
|
||||
|Generate|TOK:THB|Gold|||GoldToken|
|
||||
|Generate|TOK:THB|Wall|||ArtifactWallToken|
|
||||
|
||||
# IKO
|
||||
|Generate|TOK:IKO|Beast|||BeastToken|
|
||||
|Generate|TOK:IKO|Cat Bird|||CatBirdToken|
|
||||
|Generate|TOK:IKO|Cat|||CatToken|
|
||||
|
@ -1370,4 +1376,25 @@
|
|||
|Generate|TOK:IKO|Human Soldier|2||HumanSoldierToken|
|
||||
|Generate|TOK:IKO|Human Soldier|3||HumanSoldierToken|
|
||||
|Generate|TOK:IKO|Kraken|||KrakenToken|
|
||||
|Generate|TOK:IKO|Shark|||SharkToken|
|
||||
|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|
|
|
@ -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));
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
|
||||
package mage.cards.c;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldAbility;
|
||||
|
@ -21,19 +19,21 @@ import mage.filter.common.FilterCreaturePermanent;
|
|||
import mage.filter.predicate.permanent.AnotherPredicate;
|
||||
import mage.game.permanent.token.SpiritWhiteToken;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author emerald000
|
||||
*/
|
||||
public final class CustodiSoulbinders extends CardImpl {
|
||||
|
||||
|
||||
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures");
|
||||
|
||||
static {
|
||||
filter.add(AnotherPredicate.instance);
|
||||
}
|
||||
|
||||
public CustodiSoulbinders(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.CLERIC);
|
||||
this.power = new MageInt(0);
|
||||
|
@ -42,14 +42,14 @@ public final class CustodiSoulbinders extends CardImpl {
|
|||
// Custodi Soulbinders enters the battlefield with X +1/+1 counters on it, where X is the number of other creatures on the battlefield.
|
||||
this.addAbility(new EntersBattlefieldAbility(
|
||||
new AddCountersSourceEffect(
|
||||
CounterType.P1P1.createInstance(),
|
||||
new PermanentsOnBattlefieldCount(filter),
|
||||
false),
|
||||
CounterType.P1P1.createInstance(),
|
||||
new PermanentsOnBattlefieldCount(filter),
|
||||
false),
|
||||
"with X +1/+1 counters on it, where X is the number of other creatures on the battlefield"));
|
||||
|
||||
|
||||
|
||||
// {2}{W}, Remove a +1/+1 counter from Custodi Soulbinders: Create a 1/1 white Spirit creature token with flying.
|
||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new SpiritWhiteToken("CNS")), new ManaCostsImpl<>("{2}{W}"));
|
||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new SpiritWhiteToken()), new ManaCostsImpl<>("{2}{W}"));
|
||||
ability.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance()));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
|
||||
package mage.cards.l;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.abilities.common.DiesCreatureTriggeredAbility;
|
||||
|
@ -19,16 +17,18 @@ import mage.filter.predicate.Predicates;
|
|||
import mage.filter.predicate.permanent.TokenPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.token.ElementalToken;
|
||||
import mage.game.permanent.token.ElementalTokenWithHaste;
|
||||
import mage.players.Player;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author escplan9 - Derek Monturo
|
||||
*/
|
||||
public final class LightningCoils extends CardImpl {
|
||||
|
||||
|
||||
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a nontoken creature you control");
|
||||
|
||||
static {
|
||||
filter.add(TargetController.YOU.getControllerPredicate());
|
||||
filter.add(Predicates.not(TokenPredicate.instance));
|
||||
|
@ -36,13 +36,13 @@ public final class LightningCoils extends CardImpl {
|
|||
|
||||
public LightningCoils(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
|
||||
|
||||
|
||||
// Whenever a nontoken creature you control dies, put a charge counter on Lightning Coils.
|
||||
this.addAbility(
|
||||
new DiesCreatureTriggeredAbility(
|
||||
new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true),
|
||||
new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true),
|
||||
false, filter));
|
||||
|
||||
|
||||
// At the beginning of your upkeep, if Lightning Coils has five or more charge counters on it, remove all of them from it
|
||||
// and put that many 3/1 red Elemental creature tokens with haste onto the battlefield.
|
||||
// Exile them at the beginning of the next end step.
|
||||
|
@ -79,9 +79,9 @@ class LightningCoilsEffect extends OneShotEffect {
|
|||
if (counters >= 5) {
|
||||
// remove all the counters and create that many tokens
|
||||
p.removeCounters(CounterType.CHARGE.getName(), p.getCounters(game).getCount(CounterType.CHARGE), game);
|
||||
CreateTokenEffect effect = new CreateTokenEffect(new ElementalToken("CON", 1, true), counters);
|
||||
CreateTokenEffect effect = new CreateTokenEffect(new ElementalTokenWithHaste(), counters);
|
||||
effect.apply(game, source);
|
||||
|
||||
|
||||
// exile those tokens at next end step
|
||||
effect.exileTokensCreatedAtNextEndStep(game, source);
|
||||
return true;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
|
||||
package mage.cards.s;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.Mode;
|
||||
|
@ -15,14 +13,15 @@ import mage.constants.SubType;
|
|||
import mage.counters.CounterType;
|
||||
import mage.game.permanent.token.SpiritWhiteToken;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author emerald000
|
||||
*/
|
||||
public final class SandsteppeOutcast extends CardImpl {
|
||||
|
||||
public SandsteppeOutcast(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.WARRIOR);
|
||||
this.power = new MageInt(2);
|
||||
|
@ -31,12 +30,12 @@ public final class SandsteppeOutcast extends CardImpl {
|
|||
// When Sandsteppe Outcast enters the battlefield, choose one -
|
||||
// * Put a +1/+1 counter on Sandsteppe Outcast.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()));
|
||||
|
||||
|
||||
// * Create a 1/1 white Spirit creature token with flying.
|
||||
Mode mode = new Mode();
|
||||
mode.addEffect(new CreateTokenEffect(new SpiritWhiteToken("FRF")));
|
||||
mode.addEffect(new CreateTokenEffect(new SpiritWhiteToken()));
|
||||
ability.addMode(mode);
|
||||
this.addAbility(ability);
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
public SandsteppeOutcast(final SandsteppeOutcast card) {
|
||||
|
|
|
@ -13,14 +13,13 @@ import mage.game.permanent.token.SaprolingToken;
|
|||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author noahg
|
||||
*/
|
||||
public final class SaprolingInfestation extends CardImpl {
|
||||
|
||||
public SaprolingInfestation(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}");
|
||||
|
||||
|
||||
|
||||
// Whenever a player kicks a spell, you put a 1/1 green Saproling creature token onto the battlefield.
|
||||
this.addAbility(new SaprolingInfestationTriggeredAbility());
|
||||
|
@ -38,7 +37,7 @@ public final class SaprolingInfestation extends CardImpl {
|
|||
class SaprolingInfestationTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
SaprolingInfestationTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new CreateTokenEffect(new SaprolingToken("INV")), false);
|
||||
super(Zone.BATTLEFIELD, new CreateTokenEffect(new SaprolingToken()), false);
|
||||
}
|
||||
|
||||
SaprolingInfestationTriggeredAbility(final SaprolingInfestationTriggeredAbility ability) {
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
|
||||
package mage.cards.t;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.ObjectColor;
|
||||
import mage.abilities.Ability;
|
||||
|
@ -12,11 +10,7 @@ import mage.abilities.effects.common.CreateTokenEffect;
|
|||
import mage.abilities.effects.common.ExileTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.constants.TargetController;
|
||||
import mage.constants.Zone;
|
||||
import mage.constants.*;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||
|
@ -25,14 +19,16 @@ import mage.game.permanent.token.SpiritWhiteToken;
|
|||
import mage.target.common.TargetControlledCreaturePermanent;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author emerald000
|
||||
*/
|
||||
public final class TeysaOrzhovScion extends CardImpl {
|
||||
|
||||
|
||||
private static final FilterControlledCreaturePermanent filterWhite = new FilterControlledCreaturePermanent("three white creatures");
|
||||
private static final FilterCreaturePermanent filterBlack = new FilterCreaturePermanent("another black creature you control");
|
||||
|
||||
static {
|
||||
filterWhite.add(new ColorPredicate(ObjectColor.WHITE));
|
||||
filterBlack.add(new ColorPredicate(ObjectColor.BLACK));
|
||||
|
@ -41,7 +37,7 @@ public final class TeysaOrzhovScion extends CardImpl {
|
|||
}
|
||||
|
||||
public TeysaOrzhovScion(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}{B}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{B}");
|
||||
this.addSuperType(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.ADVISOR);
|
||||
|
@ -53,9 +49,9 @@ public final class TeysaOrzhovScion extends CardImpl {
|
|||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new SacrificeTargetCost(new TargetControlledCreaturePermanent(3, 3, filterWhite, true)));
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
this.addAbility(ability);
|
||||
|
||||
|
||||
// Whenever another black creature you control dies, create a 1/1 white Spirit creature token with flying.
|
||||
this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken("GPT")), false, filterBlack));
|
||||
this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken()), false, filterBlack));
|
||||
}
|
||||
|
||||
public TeysaOrzhovScion(final TeysaOrzhovScion card) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
|
||||
package mage.cards.t;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.keyword.ConvokeAbility;
|
||||
import mage.cards.CardImpl;
|
||||
|
@ -9,21 +7,22 @@ import mage.cards.CardSetInfo;
|
|||
import mage.constants.CardType;
|
||||
import mage.game.permanent.token.SpiritWhiteToken;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public final class TriplicateSpirits extends CardImpl {
|
||||
|
||||
public TriplicateSpirits(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{W}{W}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{W}{W}");
|
||||
|
||||
|
||||
// Convoke
|
||||
this.addAbility(new ConvokeAbility());
|
||||
// Create three 1/1 white Spirit creature tokens with flying.
|
||||
this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken("M15"), 3));
|
||||
|
||||
this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken(), 3));
|
||||
|
||||
}
|
||||
|
||||
public TriplicateSpirits(final TriplicateSpirits card) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -6,7 +6,6 @@ import mage.abilities.TriggeredAbility;
|
|||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
|
||||
import mage.abilities.keyword.DeathtouchAbility;
|
||||
import mage.abilities.mana.SimpleManaAbility;
|
||||
|
@ -18,7 +17,7 @@ import mage.game.Game;
|
|||
import mage.game.events.GameEvent;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.token.Token;
|
||||
import mage.game.permanent.token.TokenImpl;
|
||||
import mage.game.permanent.token.ZaxaraTheExemplaryHydraToken;
|
||||
import mage.game.stack.Spell;
|
||||
import mage.players.Player;
|
||||
|
||||
|
@ -144,25 +143,4 @@ class ZaxaraTheExemplaryHydraTokenEffect extends OneShotEffect {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
class ZaxaraTheExemplaryHydraToken extends TokenImpl {
|
||||
public ZaxaraTheExemplaryHydraToken() {
|
||||
super("Hydra", "0/0 green Hydra creature token");
|
||||
setExpansionSetCodeForImage("C20");
|
||||
cardType.add(CardType.CREATURE);
|
||||
color.setGreen(true);
|
||||
subtype.add(SubType.HYDRA);
|
||||
power = new MageInt(0);
|
||||
toughness = new MageInt(0);
|
||||
}
|
||||
|
||||
private ZaxaraTheExemplaryHydraToken(final ZaxaraTheExemplaryHydraToken token) {
|
||||
super(token);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ZaxaraTheExemplaryHydraToken copy() {
|
||||
return new ZaxaraTheExemplaryHydraToken(this);
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -1,15 +1,13 @@
|
|||
|
||||
|
||||
package mage.game.permanent.token;
|
||||
|
||||
import java.util.Arrays;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LoneFox
|
||||
*/
|
||||
public final class BirdToken extends TokenImpl {
|
||||
|
@ -22,6 +20,7 @@ public final class BirdToken extends TokenImpl {
|
|||
power = new MageInt(1);
|
||||
toughness = new MageInt(1);
|
||||
addAbility(FlyingAbility.getInstance());
|
||||
|
||||
availableImageSetCodes.addAll(Arrays.asList("BNG", "RTR", "ZEN", "C16", "MM3", "DGM"));
|
||||
}
|
||||
|
||||
|
@ -30,7 +29,7 @@ public final class BirdToken extends TokenImpl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public BirdToken copy() {
|
||||
public BirdToken copy() {
|
||||
return new BirdToken(this);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue