[VOW] added tokens and images support

This commit is contained in:
Oleg Agafonov 2022-02-05 14:44:46 +04:00
parent dd72e078b5
commit 3cb721fbd9
21 changed files with 143 additions and 23 deletions

View file

@ -691,6 +691,26 @@ public class ScryfallImageSupportTokens {
put("VOC/Spirit/2", "https://api.scryfall.com/cards/tvoc/3/en?format=image"); // 3/3 put("VOC/Spirit/2", "https://api.scryfall.com/cards/tvoc/3/en?format=image"); // 3/3
put("VOC/Thopter", "https://api.scryfall.com/cards/tvoc/6/en?format=image"); put("VOC/Thopter", "https://api.scryfall.com/cards/tvoc/6/en?format=image");
// VOW
put("VOW/Blood", "https://api.scryfall.com/cards/tvow/17/en?format=image");
put("VOW/Boar", "https://api.scryfall.com/cards/tvow/12/en?format=image");
put("VOW/Emblem Chandra, Dressed to Kill", "https://api.scryfall.com/cards/tvow/20/en?format=image");
put("VOW/Dragon Illusion", "https://api.scryfall.com/cards/tvow/9/en?format=image");
put("VOW/Human Soldier", "https://api.scryfall.com/cards/tvow/15/en?format=image");
put("VOW/Human/1", "https://api.scryfall.com/cards/tvow/10/en?format=image"); // red
put("VOW/Human/2", "https://api.scryfall.com/cards/tvow/1/en?format=image"); // white
put("VOW/Insect", "https://api.scryfall.com/cards/tvow/13/en?format=image");
put("VOW/Slug", "https://api.scryfall.com/cards/tvow/6/en?format=image");
put("VOW/Spirit Cleric", "https://api.scryfall.com/cards/tvow/4/en?format=image");
put("VOW/Spirit/1", "https://api.scryfall.com/cards/tvow/2/en?format=image"); // 1/1
put("VOW/Spirit/2", "https://api.scryfall.com/cards/tvow/3/en?format=image"); // 4/4
put("VOW/Treasure", "https://api.scryfall.com/cards/tvow/18/en?format=image");
put("VOW/Vampire/1", "https://api.scryfall.com/cards/tvow/16/en?format=image"); // lifelink
put("VOW/Vampire/2", "https://api.scryfall.com/cards/tvow/7/en?format=image"); // flying, lifelink
put("VOW/Wolf/1", "https://api.scryfall.com/cards/tvow/14/en?format=image"); // green
put("VOW/Wolf/2", "https://api.scryfall.com/cards/tvow/11/en?format=image"); // red
put("VOW/Zombie/1", "https://api.scryfall.com/cards/tvow/8/en?format=image"); // 2/2
put("VOW/Zombie/2", "https://api.scryfall.com/cards/tvow/5/en?format=image"); // */*
// generate supported sets // generate supported sets
supportedSets.clear(); supportedSets.clear();

View file

@ -114,6 +114,7 @@
|Generate|EMBLEM:AFR|Zariel, Archduke of Avernus||Emblem Zariel|ZarielArchdukeOfAvernusEmblem| |Generate|EMBLEM:AFR|Zariel, Archduke of Avernus||Emblem Zariel|ZarielArchdukeOfAvernusEmblem|
|Generate|EMBLEM:MID|Teferi, Who Slows the Sunset||Emblem Teferi|TeferiWhoSlowsTheSunsetEmblem| |Generate|EMBLEM:MID|Teferi, Who Slows the Sunset||Emblem Teferi|TeferiWhoSlowsTheSunsetEmblem|
|Generate|EMBLEM:MID|Wrenn and Seven||Emblem Wrenn|WrennAndSevenEmblem| |Generate|EMBLEM:MID|Wrenn and Seven||Emblem Wrenn|WrennAndSevenEmblem|
|Generate|EMBLEM:VOW|Chandra, Dressed to Kill||Emblem Chandra|ChandraDressedToKillEmblem|
# Planes # Planes
|Generate|PLANE:PCA|Plane - Academy at Tolaria West|||AcademyAtTolariaWestPlane| |Generate|PLANE:PCA|Plane - Academy at Tolaria West|||AcademyAtTolariaWestPlane|
@ -1644,3 +1645,23 @@
|Generate|TOK:VOC|Spirit|1||SpiritToken| |Generate|TOK:VOC|Spirit|1||SpiritToken|
|Generate|TOK:VOC|Spirit|2||AnotherSpiritToken| |Generate|TOK:VOC|Spirit|2||AnotherSpiritToken|
|Generate|TOK:VOC|Thopter|||ThopterColorlessToken| |Generate|TOK:VOC|Thopter|||ThopterColorlessToken|
# VOW
|Generate|TOK:VOW|Blood|||BloodToken|
|Generate|TOK:VOW|Boar|||Boar3Token|
|Generate|TOK:VOW|Dragon Illusion|||DragonIllusionToken|
|Generate|TOK:VOW|Human|1||RedHumanToken|
|Generate|TOK:VOW|Human|2||HumanToken|
|Generate|TOK:VOW|Human Soldier|||HumanSoldierTrainingToken|
|Generate|TOK:VOW|Insect|||InsectToken|
|Generate|TOK:VOW|Slug|||SlugToken|
|Generate|TOK:VOW|Spirit|1||SpiritWhiteToken|
|Generate|TOK:VOW|Spirit|2||DorotheasRetributionSpiritToken|
|Generate|TOK:VOW|Spirit Cleric|||SpiritClericToken|
|Generate|TOK:VOW|Treasure|||TreasureToken|
|Generate|TOK:VOW|Vampire|1||EdgarMarkovsCoffinVampireToken|
|Generate|TOK:VOW|Vampire|2||VampireLifelinkToken|
|Generate|TOK:VOW|Wolf|1||WolfToken|
|Generate|TOK:VOW|Wolf|2||RedWolfToken|
|Generate|TOK:VOW|Zombie|1||ZombieToken|
|Generate|TOK:VOW|Zombie|2||StitcherGeralfZombieToken|

View file

@ -14,7 +14,7 @@ import mage.constants.TargetController;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.game.permanent.token.EdgarMarkovsCoffinToken; import mage.game.permanent.token.EdgarMarkovsCoffinVampireToken;
import java.util.UUID; import java.util.UUID;
@ -33,7 +33,7 @@ public final class EdgarMarkovsCoffin extends CardImpl {
// At the beginning of your upkeep, create a 1/1 white and black Vampire creature token with lifelink and put a bloodline counter on Edgar Markov's Coffin. Then if there are three or more bloodline counters on it, remove those counters and transform it. // At the beginning of your upkeep, create a 1/1 white and black Vampire creature token with lifelink and put a bloodline counter on Edgar Markov's Coffin. Then if there are three or more bloodline counters on it, remove those counters and transform it.
Ability ability = new BeginningOfUpkeepTriggeredAbility( Ability ability = new BeginningOfUpkeepTriggeredAbility(
new CreateTokenEffect(new EdgarMarkovsCoffinToken()), new CreateTokenEffect(new EdgarMarkovsCoffinVampireToken()),
TargetController.YOU, false TargetController.YOU, false
); );
ability.addEffect(new AddCountersSourceEffect( ability.addEffect(new AddCountersSourceEffect(

View file

@ -20,7 +20,7 @@ import mage.filter.common.FilterControlledPermanent;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.TokenPredicate; import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.permanent.token.BloodToken; import mage.game.permanent.token.BloodToken;
import mage.game.permanent.token.EdgarMarkovsCoffinToken; import mage.game.permanent.token.EdgarMarkovsCoffinVampireToken;
import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetControlledPermanent;
import java.util.UUID; import java.util.UUID;
@ -49,7 +49,7 @@ public final class GlassCastHeart extends CardImpl {
// {B}, {T}, Pay 1 life: Create a 1/1 white and black Vampire creature token with lifelink. // {B}, {T}, Pay 1 life: Create a 1/1 white and black Vampire creature token with lifelink.
Ability ability = new SimpleActivatedAbility( Ability ability = new SimpleActivatedAbility(
new CreateTokenEffect(new EdgarMarkovsCoffinToken()), new ManaCostsImpl<>("{B}") new CreateTokenEffect(new EdgarMarkovsCoffinVampireToken()), new ManaCostsImpl<>("{B}")
); );
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
ability.addCost(new PayLifeCost(1)); ability.addCost(new PayLifeCost(1));

View file

@ -10,6 +10,8 @@ import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import java.util.Arrays;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -28,6 +30,8 @@ public final class BloodToken extends TokenImpl {
ability.addCost(new DiscardCardCost()); ability.addCost(new DiscardCardCost());
ability.addCost(new SacrificeSourceCost().setText("Sacrifice this artifact")); ability.addCost(new SacrificeSourceCost().setText("Sacrifice this artifact"));
this.addAbility(ability); this.addAbility(ability);
availableImageSetCodes = Arrays.asList("VOW");
} }
public BloodToken(final BloodToken token) { public BloodToken(final BloodToken token) {

View file

@ -4,6 +4,8 @@ import mage.MageInt;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import java.util.Arrays;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -16,6 +18,8 @@ public final class Boar3Token extends TokenImpl {
subtype.add(SubType.BOAR); subtype.add(SubType.BOAR);
power = new MageInt(3); power = new MageInt(3);
toughness = new MageInt(1); toughness = new MageInt(1);
availableImageSetCodes = Arrays.asList("VOW");
} }
public Boar3Token(final Boar3Token token) { public Boar3Token(final Boar3Token token) {

View file

@ -6,6 +6,8 @@ import mage.abilities.keyword.HasteAbility;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import java.util.Arrays;
/** /**
* *
* @author weirddan455 * @author weirddan455
@ -25,8 +27,10 @@ public class DragonIllusionToken extends TokenImpl {
power = new MageInt(xValue); power = new MageInt(xValue);
toughness = new MageInt(xValue); toughness = new MageInt(xValue);
addAbility(FlyingAbility.getInstance()); this.addAbility(FlyingAbility.getInstance());
addAbility(HasteAbility.getInstance()); this.addAbility(HasteAbility.getInstance());
availableImageSetCodes = Arrays.asList("VOW");
} }
private DragonIllusionToken(final DragonIllusionToken token) { private DragonIllusionToken(final DragonIllusionToken token) {

View file

@ -5,12 +5,14 @@ import mage.abilities.keyword.LifelinkAbility;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import java.util.Arrays;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
public final class EdgarMarkovsCoffinToken extends TokenImpl { public final class EdgarMarkovsCoffinVampireToken extends TokenImpl {
public EdgarMarkovsCoffinToken() { public EdgarMarkovsCoffinVampireToken() {
super("Vampire", "1/1 white and black Vampire creature token with lifelink"); super("Vampire", "1/1 white and black Vampire creature token with lifelink");
cardType.add(CardType.CREATURE); cardType.add(CardType.CREATURE);
color.setWhite(true); color.setWhite(true);
@ -18,14 +20,18 @@ public final class EdgarMarkovsCoffinToken extends TokenImpl {
subtype.add(SubType.VAMPIRE); subtype.add(SubType.VAMPIRE);
power = new MageInt(1); power = new MageInt(1);
toughness = new MageInt(1); toughness = new MageInt(1);
// Lifelink
this.addAbility(LifelinkAbility.getInstance()); this.addAbility(LifelinkAbility.getInstance());
availableImageSetCodes = Arrays.asList("VOW");
} }
public EdgarMarkovsCoffinToken(final EdgarMarkovsCoffinToken token) { public EdgarMarkovsCoffinVampireToken(final EdgarMarkovsCoffinVampireToken token) {
super(token); super(token);
} }
public EdgarMarkovsCoffinToken copy() { public EdgarMarkovsCoffinVampireToken copy() {
return new EdgarMarkovsCoffinToken(this); return new EdgarMarkovsCoffinVampireToken(this);
} }
} }

View file

@ -5,6 +5,8 @@ import mage.abilities.keyword.TrainingAbility;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import java.util.Arrays;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -19,7 +21,11 @@ public class HumanSoldierTrainingToken extends TokenImpl {
subtype.add(SubType.SOLDIER); subtype.add(SubType.SOLDIER);
power = new MageInt(1); power = new MageInt(1);
toughness = new MageInt(1); toughness = new MageInt(1);
// Training (Whenever this creature attacks with another creature with greater power, put a +1/+1 counter on this creature.)
this.addAbility(new TrainingAbility()); this.addAbility(new TrainingAbility());
availableImageSetCodes = Arrays.asList("VOW");
} }
private HumanSoldierTrainingToken(final HumanSoldierTrainingToken token) { private HumanSoldierTrainingToken(final HumanSoldierTrainingToken token) {

View file

@ -19,7 +19,7 @@ public final class HumanToken extends TokenImpl {
power = new MageInt(1); power = new MageInt(1);
toughness = new MageInt(1); toughness = new MageInt(1);
availableImageSetCodes.addAll(Arrays.asList("DKA", "AVR", "FNMP", "RNA", "ELD", "C19", "C20", "MID")); availableImageSetCodes.addAll(Arrays.asList("DKA", "AVR", "FNMP", "RNA", "ELD", "C19", "C20", "MID", "VOW"));
} }
public HumanToken(final HumanToken token) { public HumanToken(final HumanToken token) {
@ -34,8 +34,9 @@ public final class HumanToken extends TokenImpl {
@Override @Override
public void setExpansionSetCodeForImage(String code) { public void setExpansionSetCodeForImage(String code) {
super.setExpansionSetCodeForImage(code); super.setExpansionSetCodeForImage(code);
if (getOriginalExpansionSetCode().equals("AVR")) {
this.setTokenType(1); if (getOriginalExpansionSetCode().equals("VOW")) {
this.setTokenType(2);
} }
} }
} }

View file

@ -24,7 +24,7 @@ public final class InsectToken extends TokenImpl {
power = new MageInt(1); power = new MageInt(1);
toughness = new MageInt(1); toughness = new MageInt(1);
availableImageSetCodes = Arrays.asList("M10", "MM2", "SOI", "ZNR"); availableImageSetCodes = Arrays.asList("M10", "MM2", "SOI", "ZNR", "VOW");
} }
public InsectToken(final InsectToken token) { public InsectToken(final InsectToken token) {

View file

@ -6,6 +6,8 @@ import mage.constants.SubType;
import mage.MageInt; import mage.MageInt;
import mage.ObjectColor; import mage.ObjectColor;
import java.util.Arrays;
/** /**
* *
* @author spjspj * @author spjspj
@ -20,6 +22,17 @@ public final class RedHumanToken extends TokenImpl {
this.color.setRed(true); this.color.setRed(true);
this.power = new MageInt(1); this.power = new MageInt(1);
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
availableImageSetCodes = Arrays.asList("AVR", "EMN", "VOW");
}
@Override
public void setExpansionSetCodeForImage(String code) {
super.setExpansionSetCodeForImage(code);
if (getOriginalExpansionSetCode().equals("AVR")) {
this.setTokenType(2);
}
} }
public RedHumanToken(final RedHumanToken token) { public RedHumanToken(final RedHumanToken token) {

View file

@ -4,6 +4,8 @@ import mage.MageInt;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import java.util.Arrays;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -17,6 +19,17 @@ public final class RedWolfToken extends TokenImpl {
subtype.add(SubType.WOLF); subtype.add(SubType.WOLF);
power = new MageInt(3); power = new MageInt(3);
toughness = new MageInt(2); toughness = new MageInt(2);
availableImageSetCodes = Arrays.asList("VOW");
}
@Override
public void setExpansionSetCodeForImage(String code) {
super.setExpansionSetCodeForImage(code);
if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("VOW")) {
setTokenType(2);
}
} }
private RedWolfToken(final RedWolfToken token) { private RedWolfToken(final RedWolfToken token) {

View file

@ -4,6 +4,8 @@ import mage.MageInt;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import java.util.Arrays;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -16,6 +18,8 @@ public final class SlugToken extends TokenImpl {
subtype.add(SubType.SLUG); subtype.add(SubType.SLUG);
power = new MageInt(1); power = new MageInt(1);
toughness = new MageInt(1); toughness = new MageInt(1);
availableImageSetCodes = Arrays.asList("VOW");
} }
public SlugToken(final SlugToken token) { public SlugToken(final SlugToken token) {

View file

@ -12,6 +12,8 @@ import mage.constants.SubType;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import java.util.Arrays;
/** /**
* *
* @author weirddan455 * @author weirddan455
@ -28,7 +30,10 @@ public class SpiritClericToken extends TokenImpl {
power = new MageInt(0); power = new MageInt(0);
toughness = new MageInt(0); toughness = new MageInt(0);
// This creatures power and toughness are each equal to the number of Spirits you control.
this.addAbility(new SimpleStaticAbility(new SetPowerToughnessSourceEffect(SpiritClericTokenValue.instance, Duration.EndOfGame))); this.addAbility(new SimpleStaticAbility(new SetPowerToughnessSourceEffect(SpiritClericTokenValue.instance, Duration.EndOfGame)));
availableImageSetCodes = Arrays.asList("VOW");
} }
private SpiritClericToken(final SpiritClericToken token) { private SpiritClericToken(final SpiritClericToken token) {

View file

@ -23,7 +23,8 @@ public final class SpiritWhiteToken extends TokenImpl {
addAbility(FlyingAbility.getInstance()); addAbility(FlyingAbility.getInstance());
availableImageSetCodes = Arrays.asList("AVR", "C14", "CNS", "DDC", "DDK", "FRF", "ISD", "KTK", "M15", "MM2", "SHM", availableImageSetCodes = Arrays.asList("AVR", "C14", "CNS", "DDC", "DDK", "FRF", "ISD", "KTK", "M15", "MM2", "SHM",
"SOI", "EMA", "C16", "MM3", "CMA", "E01", "ANA", "GPT", "RAV", "EMN", "RNA", "M20", "C20", "CMR", "KHM", "MID"); "SOI", "EMA", "C16", "MM3", "CMA", "E01", "ANA", "GPT", "RAV", "EMN", "RNA", "M20", "C20", "CMR", "KHM",
"MID", "VOW");
} }
@Override @Override

View file

@ -23,7 +23,7 @@ public final class StitcherGeralfZombieToken extends TokenImpl {
power = new MageInt(xValue); power = new MageInt(xValue);
toughness = new MageInt(xValue); toughness = new MageInt(xValue);
availableImageSetCodes = Arrays.asList("C14", "MIC"); availableImageSetCodes = Arrays.asList("C14", "MIC", "VOW");
} }
@Override @Override
@ -37,6 +37,10 @@ public final class StitcherGeralfZombieToken extends TokenImpl {
if (getOriginalExpansionSetCode().equals("MIC")) { if (getOriginalExpansionSetCode().equals("MIC")) {
this.setTokenType(2); this.setTokenType(2);
} }
if (getOriginalExpansionSetCode().equals("VOW")) {
this.setTokenType(2);
}
} }
public StitcherGeralfZombieToken(final StitcherGeralfZombieToken token) { public StitcherGeralfZombieToken(final StitcherGeralfZombieToken token) {

View file

@ -27,7 +27,7 @@ public final class TreasureToken extends TokenImpl {
ability.addCost(new SacrificeSourceCost()); ability.addCost(new SacrificeSourceCost());
this.addAbility(ability); this.addAbility(ability);
availableImageSetCodes = Arrays.asList("XLN", "RNA", "M20", "C19", "C20", "M21", "CMR", "KHM", "STX", "MH2", "AFR"); availableImageSetCodes = Arrays.asList("XLN", "RNA", "M20", "C19", "C20", "M21", "CMR", "KHM", "STX", "MH2", "AFR", "VOW");
} }
public TreasureToken(final TreasureToken token) { public TreasureToken(final TreasureToken token) {

View file

@ -6,6 +6,8 @@ import mage.abilities.keyword.LifelinkAbility;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import java.util.Arrays;
/** /**
* *
* @author weirddan455 * @author weirddan455
@ -19,8 +21,20 @@ public class VampireLifelinkToken extends TokenImpl {
subtype.add(SubType.VAMPIRE); subtype.add(SubType.VAMPIRE);
power = new MageInt(2); power = new MageInt(2);
toughness = new MageInt(3); toughness = new MageInt(3);
addAbility(FlyingAbility.getInstance());
addAbility(LifelinkAbility.getInstance()); this.addAbility(FlyingAbility.getInstance());
this.addAbility(LifelinkAbility.getInstance());
availableImageSetCodes = Arrays.asList("VOW");
}
@Override
public void setExpansionSetCodeForImage(String code) {
super.setExpansionSetCodeForImage(code);
if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("VOW")) {
setTokenType(2);
}
} }
private VampireLifelinkToken(final VampireLifelinkToken token) { private VampireLifelinkToken(final VampireLifelinkToken token) {

View file

@ -23,7 +23,7 @@ public final class WolfToken extends TokenImpl {
availableImageSetCodes = Arrays.asList("BNG", "C14", "C15", "CMA", "CMD", "CNS", "DKA", "EVE", "ISD", availableImageSetCodes = Arrays.asList("BNG", "C14", "C15", "CMA", "CMD", "CNS", "DKA", "EVE", "ISD",
"LRW", "M10", "M14", "MM2", "MOR", "SHM", "SOI", "SOM", "V10", "WWK", "ZEN", "WAR", "M20", "LRW", "M10", "M14", "MM2", "MOR", "SHM", "SOI", "SOM", "V10", "WWK", "ZEN", "WAR", "M20",
"THB", "AFR", "MID"); "THB", "AFR", "MID", "VOW");
} }
@Override @Override

View file

@ -25,7 +25,7 @@ public final class ZombieToken extends TokenImpl {
"CNS", "MMA", "BNG", "KTK", "DTK", "ORI", "OGW", "CNS", "MMA", "BNG", "KTK", "DTK", "ORI", "OGW",
"SOI", "EMN", "EMA", "MM3", "AKH", "CMA", "E01", "SOI", "EMN", "EMA", "MM3", "AKH", "CMA", "E01",
"RNA", "WAR", "MH1", "M20", "C19", "THB", "M21", "RNA", "WAR", "MH1", "M20", "C19", "THB", "M21",
"CMR", "C21", "MH2", "AFR", "MIC"); "CMR", "C21", "MH2", "AFR", "MIC", "VOW");
} }
@Override @Override