diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index 3b5f1bafbea..b74ffe49982 100644 --- a/Mage.Client/src/main/resources/card-pictures-tok.txt +++ b/Mage.Client/src/main/resources/card-pictures-tok.txt @@ -23,43 +23,43 @@ #Generate|TOK:C15|Wolf| #Generate|TOK:C15|Zombie| -Generate|TOK:BFZ|Dragon| -Generate|TOK:BFZ|Eldrazi| -Generate|TOK:BFZ|Eldrazi Scion 1| -Generate|TOK:BFZ|Eldrazi Scion 2| -Generate|TOK:BFZ|Eldrazi Scion 3| -Generate|TOK:BFZ|Elemental 1| -Generate|TOK:BFZ|Elemental 2| -Generate|TOK:BFZ|Knight Ally| -Generate|TOK:BFZ|Kor Ally| -Generate|TOK:BFZ|Octopus| -Generate|TOK:BFZ|Plant| -|Generate|EMBLEM!:BFZ|Emblem Gideon, Ally of Zendikar| -|Generate|EMBLEM!:BFZ|Emblem Kiora, Master of the Depths| -|Generate|EMBLEM!:BFZ|Emblem Ob Nixilis Reignited| +|Generate|TOK:BFZ|Dragon| +|Generate|TOK:BFZ|Eldrazi| +|Generate|TOK:BFZ|Eldrazi Scion 1| +|Generate|TOK:BFZ|Eldrazi Scion 2| +|Generate|TOK:BFZ|Eldrazi Scion 3| +|Generate|TOK:BFZ|Elemental 1| +|Generate|TOK:BFZ|Elemental 2| +|Generate|TOK:BFZ|Knight Ally| +|Generate|TOK:BFZ|Kor Ally| +|Generate|TOK:BFZ|Octopus| +|Generate|TOK:BFZ|Plant| +#|Generate|EMBLEM!:BFZ|Emblem Gideon, Ally of Zendikar| +#|Generate|EMBLEM!:BFZ|Emblem Kiora, Master of the Depths| +#|Generate|EMBLEM!:BFZ|Emblem Ob Nixilis Reignited| -Generate|TOK:DDP|Eldrazi Spawn 1| -Generate|TOK:DDP|Eldrazi Spawn 2| -Generate|TOK:DDP|Eldrazi Spawn 3| -Generate|TOK:DDP|Hellion| -Generate|TOK:DDP|Plant| +|Generate|TOK:DDP|Eldrazi Spawn 1| +|Generate|TOK:DDP|Eldrazi Spawn 2| +|Generate|TOK:DDP|Eldrazi Spawn 3| +|Generate|TOK:DDP|Hellion| +|Generate|TOK:DDP|Plant| -Generate|TOK:MM2|Eldrazi Spawn 1| -Generate|TOK:MM2|Eldrazi Spawn 2| -Generate|TOK:MM2|Eldrazi Spawn 3| -Generate|TOK:MM2|Elephant| -Generate|TOK:MM2|Faerie Rogue| -Generate|TOK:MM2|Germ| -Generate|TOK:MM2|Golem| -Generate|TOK:MM2|Insect| -Generate|TOK:MM2|Myr| -Generate|TOK:MM2|Saproling| -Generate|TOK:MM2|Snake| -Generate|TOK:MM2|Soldier| -Generate|TOK:MM2|Spirit| -Generate|TOK:MM2|Thrull| -Generate|TOK:MM2|Wolf| -Generate|TOK:MM2|Wurm| +|Generate|TOK:MM2|Eldrazi Spawn 1| +|Generate|TOK:MM2|Eldrazi Spawn 2| +|Generate|TOK:MM2|Eldrazi Spawn 3| +|Generate|TOK:MM2|Elephant| +|Generate|TOK:MM2|Faerie Rogue| +|Generate|TOK:MM2|Germ| +|Generate|TOK:MM2|Golem| +|Generate|TOK:MM2|Insect| +|Generate|TOK:MM2|Myr| +|Generate|TOK:MM2|Saproling| +|Generate|TOK:MM2|Snake| +|Generate|TOK:MM2|Soldier| +|Generate|TOK:MM2|Spirit| +|Generate|TOK:MM2|Thrull| +|Generate|TOK:MM2|Wolf| +|Generate|TOK:MM2|Worm| #Generate|TOK:TPR|Goblin| #Generate|TOK:TPR|Pegasus| @@ -83,9 +83,9 @@ Generate|TOK:MM2|Wurm| |Generate|TOK:ORI|Thopter 1| |Generate|TOK:ORI|Thopter 2| |Generate|TOK:ORI|Zombie| -|Generate|EMBLEM!:ORI|Emblem Chandra, Roaring Flame| -|Generate|EMBLEM!:ORI|Emblem Jace, Telepath Unbound| -|Generate|EMBLEM!:ORI|Emblem Liliana, Defiant Necromancer| +#|Generate|EMBLEM!:ORI|Emblem Chandra, Roaring Flame| +#|Generate|EMBLEM!:ORI|Emblem Jace, Telepath Unbound| +#|Generate|EMBLEM!:ORI|Emblem Liliana, Defiant Necromancer| #|Generate|TOK:PTC|Angel| #|Generate|TOK:PTC|Avatar| diff --git a/Mage.Sets/src/mage/sets/avacynrestored/GallowsAtWillowHill.java b/Mage.Sets/src/mage/sets/avacynrestored/GallowsAtWillowHill.java index 0d5cdcee9d5..7a5f29fbcd0 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/GallowsAtWillowHill.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/GallowsAtWillowHill.java @@ -34,6 +34,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapTargetCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; @@ -46,7 +47,6 @@ import mage.filter.predicate.permanent.TappedPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.SpiritWhiteToken; -import mage.game.permanent.token.Token; import mage.players.Player; import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetCreaturePermanent; @@ -111,8 +111,7 @@ class GallowsAtWillowHillEffect extends OneShotEffect { Player controller = game.getPlayer(permanent.getControllerId()); permanent.destroy(source.getSourceId(), game, false); if (controller != null) { - Token spirit = new SpiritWhiteToken("AVR", 1); - spirit.putOntoBattlefield(1, game, source.getSourceId(), controller.getId()); + new CreateTokenEffect(new SpiritWhiteToken()).apply(game, source); } affectedTargets++; } diff --git a/Mage.Sets/src/mage/sets/avacynrestored/MoonsilverSpear.java b/Mage.Sets/src/mage/sets/avacynrestored/MoonsilverSpear.java index 83d3afff427..66ed9f70c7f 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/MoonsilverSpear.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/MoonsilverSpear.java @@ -54,7 +54,7 @@ public class MoonsilverSpear extends CardImpl { // Equipped creature has first strike. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.EQUIPMENT))); // Whenever equipped creature attacks, put a 4/4 white Angel creature token with flying onto the battlefield. - this.addAbility(new AttacksAttachedTriggeredAbility(new CreateTokenEffect(new AngelToken(expansionSetCode)))); + this.addAbility(new AttacksAttachedTriggeredAbility(new CreateTokenEffect(new AngelToken()))); // Equip {4} this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(4))); } diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/AkoumStonewaker.java b/Mage.Sets/src/mage/sets/battleforzendikar/AkoumStonewaker.java index aa2253b1e40..8d17a17c4d7 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/AkoumStonewaker.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/AkoumStonewaker.java @@ -122,5 +122,6 @@ class AkoumStonewakerElementalToken extends Token { this.addAbility(TrampleAbility.getInstance()); this.addAbility(HasteAbility.getInstance()); this.setOriginalExpansionSetCode("BFZ"); + this.setTokenType(1); } } diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/OmnathLocusOfRage.java b/Mage.Sets/src/mage/sets/battleforzendikar/OmnathLocusOfRage.java index c09d7fe5080..fff58c51cfa 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/OmnathLocusOfRage.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/OmnathLocusOfRage.java @@ -88,7 +88,7 @@ class OmnathElementalToken extends Token { OmnathElementalToken() { super("Elemental", "5/5 red and green Elemental creature token"); - setTokenType(1); + setTokenType(2); setOriginalExpansionSetCode("BFZ"); cardType.add(CardType.CREATURE); subtype.add("Elemental"); diff --git a/Mage.Sets/src/mage/sets/commander2013/EndrekSahrMasterBreeder.java b/Mage.Sets/src/mage/sets/commander2013/EndrekSahrMasterBreeder.java index dfed94b5507..a0f9f59306a 100644 --- a/Mage.Sets/src/mage/sets/commander2013/EndrekSahrMasterBreeder.java +++ b/Mage.Sets/src/mage/sets/commander2013/EndrekSahrMasterBreeder.java @@ -45,7 +45,7 @@ import mage.filter.FilterSpell; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.ThrullToken; import mage.game.stack.Spell; import mage.target.targetpointer.FixedTarget; @@ -114,22 +114,10 @@ class EndrekSahrMasterBreederEffect extends OneShotEffect { if (spell != null) { int cmc = spell.getConvertedManaCost(); if (cmc > 0) { - return new CreateTokenEffect(new EndrekSahrMasterBreederThrullToken(), cmc).apply(game, source); + return new CreateTokenEffect(new ThrullToken(), cmc).apply(game, source); } return true; } return false; } } - -class EndrekSahrMasterBreederThrullToken extends Token { - - public EndrekSahrMasterBreederThrullToken() { - super("Thrull", "1/1 black Thrull creature token"); - cardType.add(CardType.CREATURE); - color.setBlack(true); - subtype.add("Thrull"); - power = new MageInt(1); - toughness = new MageInt(1); - } -} diff --git a/Mage.Sets/src/mage/sets/darkascension/HuntmasterOfTheFells.java b/Mage.Sets/src/mage/sets/darkascension/HuntmasterOfTheFells.java index 193aee99a9a..22098f98e2f 100644 --- a/Mage.Sets/src/mage/sets/darkascension/HuntmasterOfTheFells.java +++ b/Mage.Sets/src/mage/sets/darkascension/HuntmasterOfTheFells.java @@ -101,7 +101,7 @@ public class HuntmasterOfTheFells extends CardImpl { class HuntmasterOfTheFellsAbility extends TriggeredAbilityImpl { public HuntmasterOfTheFellsAbility() { - super(Zone.BATTLEFIELD, new CreateTokenEffect(new WolfToken(Token.Type.SECOND)), false); + super(Zone.BATTLEFIELD, new CreateTokenEffect(new WolfToken()), false); this.addEffect(new GainLifeEffect(2)); } diff --git a/Mage.Sets/src/mage/sets/darkascension/RequiemAngel.java b/Mage.Sets/src/mage/sets/darkascension/RequiemAngel.java index 3f1263e0fb8..7b98ac2bcb2 100644 --- a/Mage.Sets/src/mage/sets/darkascension/RequiemAngel.java +++ b/Mage.Sets/src/mage/sets/darkascension/RequiemAngel.java @@ -67,7 +67,7 @@ public class RequiemAngel extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever another non-Spirit creature you control dies, put a 1/1 white Spirit creature token with flying onto the battlefield. - this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken(expansionSetCode), 1), false, filter)); + this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken("ISD"), 1), false, filter)); } public RequiemAngel(final RequiemAngel card) { diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/Myrsmith.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/Myrsmith.java index 7e1ebce026c..845fe559621 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/Myrsmith.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/Myrsmith.java @@ -36,9 +36,8 @@ import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; -import mage.constants.Outcome; import mage.filter.common.FilterArtifactSpell; import mage.game.Game; import mage.game.permanent.token.MyrToken; @@ -71,9 +70,9 @@ public class Myrsmith extends CardImpl { } } -class MyrsmithEffect extends OneShotEffect { +class MyrsmithEffect extends CreateTokenEffect { public MyrsmithEffect() { - super(Outcome.PutCreatureInPlay); + super(new MyrToken()); staticText = "you may pay {1}. If you do, put a 1/1 colorless Myr artifact creature token onto the battlefield"; } @@ -86,7 +85,7 @@ class MyrsmithEffect extends OneShotEffect { Cost cost = new GenericManaCost(1); cost.clearPaid(); if (cost.pay(source, game, source.getSourceId(), source.getControllerId(), false)) { - new MyrToken().putOntoBattlefield(1, game, source.getControllerId(), source.getControllerId()); + super.apply(game, source); } return true; } diff --git a/Mage.Sets/src/mage/sets/tempestremastered/FieldOfSouls.java b/Mage.Sets/src/mage/sets/tempestremastered/FieldOfSouls.java index b74ed27145d..9afdd7e1acd 100644 --- a/Mage.Sets/src/mage/sets/tempestremastered/FieldOfSouls.java +++ b/Mage.Sets/src/mage/sets/tempestremastered/FieldOfSouls.java @@ -57,7 +57,7 @@ public class FieldOfSouls extends CardImpl { this.expansionSetCode = "TPR"; // Whenever a nontoken creature is put into your graveyard from the battlefield, put a 1/1 white Spirit creature token with flying onto the battlefield. - this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken("KTK")), false, filter)); + this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken()), false, filter)); } public FieldOfSouls(final FieldOfSouls card) { diff --git a/Mage.Sets/src/mage/sets/timespiral/SarpadianEmpiresVolVii.java b/Mage.Sets/src/mage/sets/timespiral/SarpadianEmpiresVolVii.java index 8b3f154f19d..b0ab59b347a 100644 --- a/Mage.Sets/src/mage/sets/timespiral/SarpadianEmpiresVolVii.java +++ b/Mage.Sets/src/mage/sets/timespiral/SarpadianEmpiresVolVii.java @@ -46,6 +46,7 @@ import mage.game.Game; import mage.game.permanent.token.CitizenToken; import mage.game.permanent.token.GoblinToken; import mage.game.permanent.token.SaprolingToken; +import mage.game.permanent.token.ThrullToken; import mage.game.permanent.token.Token; import mage.players.Player; @@ -165,14 +166,3 @@ class CamaridToken extends Token { toughness = new MageInt(1); } } - -class ThrullToken extends Token { - public ThrullToken() { - super("Thrull", "1/1 black Thrull creature token"); - cardType.add(CardType.CREATURE); - subtype.add("Thrull"); - color.setBlack(true); - power = new MageInt(1); - toughness = new MageInt(1); - } -} diff --git a/Mage.Sets/src/mage/sets/vintagemasters/DecreeOfJustice.java b/Mage.Sets/src/mage/sets/vintagemasters/DecreeOfJustice.java index 247b5ecf8b7..241c2d5b492 100644 --- a/Mage.Sets/src/mage/sets/vintagemasters/DecreeOfJustice.java +++ b/Mage.Sets/src/mage/sets/vintagemasters/DecreeOfJustice.java @@ -60,7 +60,7 @@ public class DecreeOfJustice extends CardImpl { // Put X 4/4 white Angel creature tokens with flying onto the battlefield. - this.getSpellAbility().addEffect(new CreateTokenEffect(new AngelToken("C14"), new ManacostVariableValue())); + this.getSpellAbility().addEffect(new CreateTokenEffect(new AngelToken(), new ManacostVariableValue())); // Cycling {2}{W} this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{2}{W}"))); diff --git a/Mage/src/mage/abilities/keyword/LivingWeaponAbility.java b/Mage/src/mage/abilities/keyword/LivingWeaponAbility.java index f97bb511293..4dc5426b41c 100644 --- a/Mage/src/mage/abilities/keyword/LivingWeaponAbility.java +++ b/Mage/src/mage/abilities/keyword/LivingWeaponAbility.java @@ -1,11 +1,14 @@ package mage.abilities.keyword; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; import mage.constants.CardType; -import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.Token; @@ -31,9 +34,9 @@ public class LivingWeaponAbility extends EntersBattlefieldTriggeredAbility { } } -class LivingWeaponEffect extends OneShotEffect { +class LivingWeaponEffect extends CreateTokenEffect { LivingWeaponEffect() { - super(Outcome.PutCreatureInPlay); + super(new GermToken()); } LivingWeaponEffect(final LivingWeaponEffect effect) { @@ -44,13 +47,13 @@ class LivingWeaponEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - GermToken token = new GermToken(); - token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); - Permanent p = game.getPermanent(token.getLastAddedToken()); - if (p != null) { - p.addAttachment(source.getSourceId(), game); - return true; - } + if (super.apply(game, source)) { + Permanent p = game.getPermanent(this.getLastAddedTokenId()); + if (p != null) { + p.addAttachment(source.getSourceId(), game); + return true; + } + } } return false; } @@ -62,9 +65,16 @@ class LivingWeaponEffect extends OneShotEffect { } class GermToken extends Token { + + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("C14", "MBS", "MM2")); + } + public GermToken() { super("Germ", "a 0/0 black Germ creature token"); - this.setOriginalExpansionSetCode("MBS"); + availableImageSetCodes = tokenImageSets; cardType.add(CardType.CREATURE); color.setBlack(true); subtype.add("Germ"); diff --git a/Mage/src/mage/game/permanent/token/AngelToken.java b/Mage/src/mage/game/permanent/token/AngelToken.java index c21fd10160c..95a43e34646 100644 --- a/Mage/src/mage/game/permanent/token/AngelToken.java +++ b/Mage/src/mage/game/permanent/token/AngelToken.java @@ -1,25 +1,34 @@ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.MageInt; import mage.abilities.keyword.FlyingAbility; import mage.constants.CardType; public class AngelToken extends Token { - + + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("AVR", "C14", "CFX", "GTC", "ISD", "M14", "ORI", "ZEN")); + } + public AngelToken() { - this("M14"); + this(null); } public AngelToken(String setCode) { super("Angel", "4/4 white Angel creature token with flying"); - this.setOriginalExpansionSetCode(setCode); + availableImageSetCodes = tokenImageSets; + setOriginalExpansionSetCode(setCode); + cardType.add(CardType.CREATURE); color.setWhite(true); - subtype.add("Angel"); power = new MageInt(4); toughness = new MageInt(4); addAbility(FlyingAbility.getInstance()); - } } diff --git a/Mage/src/mage/game/permanent/token/EldraziSpawnToken.java b/Mage/src/mage/game/permanent/token/EldraziSpawnToken.java index ec4e3a30a77..c5139001e99 100644 --- a/Mage/src/mage/game/permanent/token/EldraziSpawnToken.java +++ b/Mage/src/mage/game/permanent/token/EldraziSpawnToken.java @@ -28,6 +28,9 @@ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Random; import mage.constants.CardType; import mage.constants.Zone; @@ -42,6 +45,12 @@ import mage.abilities.mana.SimpleManaAbility; */ public class EldraziSpawnToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("ROE", "MM2", "DDP")); + } + public EldraziSpawnToken() { super("Eldrazi Spawn", "0/1 colorless Eldrazi Spawn creature with \"Sacrifice this creature: Add {1} to your mana pool.\""); cardType.add(CardType.CREATURE); @@ -50,7 +59,8 @@ public class EldraziSpawnToken extends Token { power = new MageInt(0); toughness = new MageInt(1); addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana, new SacrificeSourceCost())); - this.setOriginalExpansionSetCode("ROE"); + + availableImageSetCodes = tokenImageSets; // Get one of the three possible token images this.setTokenType(new Random().nextInt(3) + 1); } diff --git a/Mage/src/mage/game/permanent/token/ElephantToken.java b/Mage/src/mage/game/permanent/token/ElephantToken.java index 2b04118862a..a95182b2b1a 100644 --- a/Mage/src/mage/game/permanent/token/ElephantToken.java +++ b/Mage/src/mage/game/permanent/token/ElephantToken.java @@ -28,6 +28,10 @@ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import mage.MageInt; import mage.ObjectColor; import mage.constants.CardType; @@ -38,6 +42,12 @@ import mage.constants.CardType; */ public class ElephantToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("C14", "CNS", "DDD", "MM2", "WWK")); + } + public ElephantToken() { super("Elephant", "3/3 green Elephant creature token"); cardType.add(CardType.CREATURE); @@ -46,7 +56,7 @@ public class ElephantToken extends Token { power = new MageInt(3); toughness = new MageInt(3); - this.setOriginalExpansionSetCode("DDD"); + availableImageSetCodes = tokenImageSets; } } \ No newline at end of file diff --git a/Mage/src/mage/game/permanent/token/FaerieRogueToken.java b/Mage/src/mage/game/permanent/token/FaerieRogueToken.java index a64ff364484..d4c111c3243 100644 --- a/Mage/src/mage/game/permanent/token/FaerieRogueToken.java +++ b/Mage/src/mage/game/permanent/token/FaerieRogueToken.java @@ -28,7 +28,10 @@ package mage.game.permanent.token; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; + import mage.constants.CardType; import mage.MageInt; import mage.abilities.keyword.FlyingAbility; @@ -39,6 +42,12 @@ import mage.abilities.keyword.FlyingAbility; */ public class FaerieRogueToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("SHM", "MOR", "MMA", "MM2")); + } + public FaerieRogueToken() { super("Faerie Rogue", "1/1 black Faerie Rogue creature token with flying"); cardType.add(CardType.CREATURE); @@ -48,6 +57,7 @@ public class FaerieRogueToken extends Token { power = new MageInt(1); toughness = new MageInt(1); addAbility(FlyingAbility.getInstance()); - availableImageSetCodes.addAll(Arrays.asList("SHM", "MOR", "MMA")); + + availableImageSetCodes = tokenImageSets; } } diff --git a/Mage/src/mage/game/permanent/token/GolemToken.java b/Mage/src/mage/game/permanent/token/GolemToken.java index 273943d7fa1..e17e3754f10 100644 --- a/Mage/src/mage/game/permanent/token/GolemToken.java +++ b/Mage/src/mage/game/permanent/token/GolemToken.java @@ -27,6 +27,10 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import mage.constants.CardType; import mage.MageInt; @@ -36,8 +40,14 @@ import mage.MageInt; */ public class GolemToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("MM2", "NPH", "SOM")); + } + public GolemToken() { - this("SOM"); + this(null); } public GolemToken(String setCode) { @@ -48,5 +58,7 @@ public class GolemToken extends Token { subtype.add("Golem"); power = new MageInt(3); toughness = new MageInt(3); + + availableImageSetCodes = tokenImageSets; } } diff --git a/Mage/src/mage/game/permanent/token/InsectToken.java b/Mage/src/mage/game/permanent/token/InsectToken.java index 4fe7f8533ba..cd1e1be1686 100644 --- a/Mage/src/mage/game/permanent/token/InsectToken.java +++ b/Mage/src/mage/game/permanent/token/InsectToken.java @@ -28,6 +28,10 @@ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import mage.MageInt; import mage.constants.CardType; @@ -37,8 +41,14 @@ import mage.constants.CardType; */ public class InsectToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("M10", "MM2")); + } + public InsectToken() { - this("M10"); + this(null); } public InsectToken(String setCode) { @@ -49,5 +59,7 @@ public class InsectToken extends Token { subtype.add("Insect"); power = new MageInt(1); toughness = new MageInt(1); + + availableImageSetCodes = tokenImageSets; } } \ No newline at end of file diff --git a/Mage/src/mage/game/permanent/token/KnightToken.java b/Mage/src/mage/game/permanent/token/KnightToken.java index 3ffd6de9350..909b39ab182 100644 --- a/Mage/src/mage/game/permanent/token/KnightToken.java +++ b/Mage/src/mage/game/permanent/token/KnightToken.java @@ -1,5 +1,8 @@ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.constants.CardType; import mage.MageInt; import mage.abilities.keyword.VigilanceAbility; @@ -10,15 +13,21 @@ import mage.abilities.keyword.VigilanceAbility; */ public class KnightToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("ORI", "RTR")); + } + public KnightToken() { super("Knight", "2/2 white Knight creature token with vigilance"); cardType.add(CardType.CREATURE); color.setWhite(true); - subtype.add("Knight"); power = new MageInt(2); toughness = new MageInt(2); this.addAbility(VigilanceAbility.getInstance()); - setOriginalExpansionSetCode("RTR"); + + availableImageSetCodes = tokenImageSets; } } diff --git a/Mage/src/mage/game/permanent/token/MyrToken.java b/Mage/src/mage/game/permanent/token/MyrToken.java index 0d26eb7c3ba..63d68661769 100644 --- a/Mage/src/mage/game/permanent/token/MyrToken.java +++ b/Mage/src/mage/game/permanent/token/MyrToken.java @@ -1,12 +1,22 @@ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import mage.MageInt; import mage.constants.CardType; public class MyrToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("C14", "MM2", "NPH", "SOM")); + } + public MyrToken() { - this("SOM"); + this(null); } public MyrToken(String expansionSetCode) { @@ -17,5 +27,7 @@ public class MyrToken extends Token { subtype.add("Myr"); power = new MageInt(1); toughness = new MageInt(1); + + availableImageSetCodes = tokenImageSets; } } \ No newline at end of file diff --git a/Mage/src/mage/game/permanent/token/PlantToken.java b/Mage/src/mage/game/permanent/token/PlantToken.java index f44a3f854a9..054a798df25 100644 --- a/Mage/src/mage/game/permanent/token/PlantToken.java +++ b/Mage/src/mage/game/permanent/token/PlantToken.java @@ -28,10 +28,21 @@ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import mage.MageInt; import mage.constants.CardType; public class PlantToken extends Token { + + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("WWK", "DDP")); + } + public PlantToken() { super("Plant", "0/1 green Plant creature"); cardType.add(CardType.CREATURE); @@ -39,6 +50,7 @@ public class PlantToken extends Token { subtype.add("Plant"); power = new MageInt(0); toughness = new MageInt(1); - this.setOriginalExpansionSetCode("WWK"); + + availableImageSetCodes = tokenImageSets; } } diff --git a/Mage/src/mage/game/permanent/token/SaprolingToken.java b/Mage/src/mage/game/permanent/token/SaprolingToken.java index b6c0fc5c5a3..b6e79eb952f 100644 --- a/Mage/src/mage/game/permanent/token/SaprolingToken.java +++ b/Mage/src/mage/game/permanent/token/SaprolingToken.java @@ -28,6 +28,10 @@ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import mage.MageInt; import mage.constants.CardType; @@ -37,6 +41,12 @@ import mage.constants.CardType; */ public class SaprolingToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("10E", "ALA", "DDE", "DDH", "DDJ", "M12", "M13", "M14", "MM2", "MMA", "RTR")); + } + public SaprolingToken() { super("Saproling", "1/1 green Saproling creature token"); this.setOriginalExpansionSetCode("MMA"); @@ -45,5 +55,7 @@ public class SaprolingToken extends Token { subtype.add("Saproling"); power = new MageInt(1); toughness = new MageInt(1); + + availableImageSetCodes = tokenImageSets; } } \ No newline at end of file diff --git a/Mage/src/mage/game/permanent/token/SnakeToken.java b/Mage/src/mage/game/permanent/token/SnakeToken.java index 47d6700aa9c..19e778a015a 100644 --- a/Mage/src/mage/game/permanent/token/SnakeToken.java +++ b/Mage/src/mage/game/permanent/token/SnakeToken.java @@ -28,6 +28,10 @@ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import mage.MageInt; import mage.constants.CardType; @@ -37,18 +41,26 @@ import mage.constants.CardType; */ public class SnakeToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("ZEN", "KTK", "MM2")); + } + public SnakeToken() { - this("ZEN"); + this(null); } public SnakeToken(String setCode) { super("Snake", "1/1 green Snake creature token"); - setOriginalExpansionSetCode(setCode); cardType.add(CardType.CREATURE); color.setGreen(true); subtype.add("Snake"); power = new MageInt(1); toughness = new MageInt(1); + + availableImageSetCodes = tokenImageSets; + setOriginalExpansionSetCode(setCode); } } diff --git a/Mage/src/mage/game/permanent/token/SoldierToken.java b/Mage/src/mage/game/permanent/token/SoldierToken.java index 956f808b5b7..6264190b018 100644 --- a/Mage/src/mage/game/permanent/token/SoldierToken.java +++ b/Mage/src/mage/game/permanent/token/SoldierToken.java @@ -43,7 +43,7 @@ public class SoldierToken extends Token { final static private List tokenImageSets = new ArrayList<>(); static { - tokenImageSets.addAll(Arrays.asList("10E", "M15", "C14", "ORI", "ALA", "DDF", "THS", "M12", "M13", "MM2", "MMA", "RTR", "SOM")); + tokenImageSets.addAll(Arrays.asList("10E", "M15", "C14", "ORI", "ALA", "DDF", "THS", "M12", "M13", "MM2", "MMA", "RTR", "SOM", "DDF", "M10")); } public SoldierToken() { diff --git a/Mage/src/mage/game/permanent/token/SpiritWhiteToken.java b/Mage/src/mage/game/permanent/token/SpiritWhiteToken.java index ad7532b5d69..75ef08c1855 100644 --- a/Mage/src/mage/game/permanent/token/SpiritWhiteToken.java +++ b/Mage/src/mage/game/permanent/token/SpiritWhiteToken.java @@ -27,6 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.MageInt; import mage.abilities.keyword.FlyingAbility; import mage.constants.CardType; @@ -36,15 +39,23 @@ import mage.constants.CardType; */ public class SpiritWhiteToken extends Token { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("AVR", "C14", "CNS", "DDC", "DDK", "FRF", "ISD", "KTK", "M15", "MM2", "SHM")); + } + public SpiritWhiteToken() { - this("SHM", 0); + 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); @@ -57,4 +68,21 @@ public class SpiritWhiteToken extends Token { addAbility(FlyingAbility.getInstance()); } + + @Override + public void setExpansionSetCodeForImage(String code) { + super.setExpansionSetCodeForImage(code); + if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("AVR")) { + setTokenType(1); + } + } + + public SpiritWhiteToken(final SpiritWhiteToken token) { + super(token); + } + + @Override + public SpiritWhiteToken copy() { + return new SpiritWhiteToken(this); + } } diff --git a/Mage/src/mage/game/permanent/token/ThrullToken.java b/Mage/src/mage/game/permanent/token/ThrullToken.java new file mode 100644 index 00000000000..3ce76ac9e26 --- /dev/null +++ b/Mage/src/mage/game/permanent/token/ThrullToken.java @@ -0,0 +1,59 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, this list +* of conditions and the following disclaimer in the documentation and/or other materials +* provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* The views and conclusions contained in the software and documentation are those of the +* authors and should not be interpreted as representing official policies, either expressed +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.game.permanent.token; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import mage.MageInt; +import mage.constants.CardType; + +/** + * + * @author Quercitron + */ +public class ThrullToken extends Token { + + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("MM2")); + } + + public ThrullToken() { + super("Thrull", "1/1 black Thrull creature token"); + cardType.add(CardType.CREATURE); + subtype.add("Thrull"); + color.setBlack(true); + power = new MageInt(1); + toughness = new MageInt(1); + + availableImageSetCodes = tokenImageSets; + } +} diff --git a/Mage/src/mage/game/permanent/token/Token.java b/Mage/src/mage/game/permanent/token/Token.java index 772d317b041..17379eb5793 100644 --- a/Mage/src/mage/game/permanent/token/Token.java +++ b/Mage/src/mage/game/permanent/token/Token.java @@ -235,7 +235,11 @@ public class Token extends MageObjectImpl { if (availableImageSetCodes.contains(code)) { setOriginalExpansionSetCode(code); } else { - setOriginalExpansionSetCode(availableImageSetCodes.get(new Random().nextInt(availableImageSetCodes.size()))); + // we should not set random set if appropriate set is already used + if (getOriginalExpansionSetCode() == null || getOriginalExpansionSetCode().isEmpty() + || !availableImageSetCodes.contains(getOriginalExpansionSetCode())) { + setOriginalExpansionSetCode(availableImageSetCodes.get(new Random().nextInt(availableImageSetCodes.size()))); + } } } else { if (getOriginalExpansionSetCode() == null || getOriginalExpansionSetCode().isEmpty()) { diff --git a/Mage/src/mage/game/permanent/token/WolfToken.java b/Mage/src/mage/game/permanent/token/WolfToken.java index 77cf16ad898..bae31220032 100644 --- a/Mage/src/mage/game/permanent/token/WolfToken.java +++ b/Mage/src/mage/game/permanent/token/WolfToken.java @@ -28,9 +28,12 @@ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import mage.constants.CardType; import mage.MageInt; -import mage.ObjectColor; /** * @@ -38,16 +41,21 @@ import mage.ObjectColor; */ public class WolfToken extends Token { - public WolfToken() { - this("ISD"); + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("BNG", "C14", "CNS", "FNMP", "ISD", "LRW", "M10", "M14", "MM2", "SHM", "SOM", "ZEN")); } - + + public WolfToken() { + this((String) null); + } + public WolfToken(String setCode) { super("Wolf", "2/2 green Wolf creature token"); - this.setOriginalExpansionSetCode(setCode); - if (setCode.equals("ISD")) { - setTokenType(Type.SECOND.code); - } + availableImageSetCodes = tokenImageSets; + setOriginalExpansionSetCode(setCode); + cardType.add(CardType.CREATURE); color.setGreen(true); subtype.add("Wolf"); @@ -55,9 +63,20 @@ public class WolfToken extends Token { toughness = new MageInt(2); } - public WolfToken(Token.Type type) { - this(); - setTokenType(type.getCode()); + @Override + public void setExpansionSetCodeForImage(String code) { + super.setExpansionSetCodeForImage(code); + if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("ISD")) { + this.setTokenType(2); + } } + public WolfToken(final WolfToken token) { + super(token); + } + + @Override + public Token copy() { + return new WolfToken(this); + } }