[AFR] added tokens and images download support;

This commit is contained in:
Oleg Agafonov 2021-08-21 20:07:39 +04:00
parent 88484f5a1e
commit 654ee7791c
20 changed files with 125 additions and 34 deletions

View file

@ -613,6 +613,30 @@ public class ScryfallImageSupportTokens {
put("MH2/Zombie Army", "https://api.scryfall.com/cards/tmh2/7/en?format=image"); put("MH2/Zombie Army", "https://api.scryfall.com/cards/tmh2/7/en?format=image");
put("MH2/Zombie", "https://api.scryfall.com/cards/tmh2/6/en?format=image"); put("MH2/Zombie", "https://api.scryfall.com/cards/tmh2/6/en?format=image");
// AFR
put("AFR/Angel", "https://api.scryfall.com/cards/tafr/1/en?format=image");
put("AFR/Boo", "https://api.scryfall.com/cards/tafr/10/en?format=image");
put("AFR/Devil", "https://api.scryfall.com/cards/tafr/11/en?format=image");
put("AFR/Dog Illusion", "https://api.scryfall.com/cards/tafr/3/en?format=image");
put("AFR/Dungeon of the Mad Mage", "https://api.scryfall.com/cards/tafr/20/en?format=image");
put("AFR/Emblem Ellywick Tumblestrum", "https://api.scryfall.com/cards/tafr/16/en?format=image");
put("AFR/Faerie Dragon", "https://api.scryfall.com/cards/tafr/4/en?format=image");
put("AFR/Goblin", "https://api.scryfall.com/cards/tafr/12/en?format=image");
put("AFR/Guenhwyvar", "https://api.scryfall.com/cards/tafr/13/en?format=image");
put("AFR/Icingdeath, Frost Tongue", "https://api.scryfall.com/cards/tafr/2/en?format=image");
put("AFR/Emblem Lolth, Spider Queen", "https://api.scryfall.com/cards/tafr/17/en?format=image");
put("AFR/Lost Mine of Phandelver", "https://api.scryfall.com/cards/tafr/21/en?format=image");
put("AFR/Emblem Mordenkainen", "https://api.scryfall.com/cards/tafr/18/en?format=image");
put("AFR/Skeleton", "https://api.scryfall.com/cards/tafr/6/en?format=image");
put("AFR/Spider", "https://api.scryfall.com/cards/tafr/7/en?format=image");
put("AFR/The Atropal", "https://api.scryfall.com/cards/tafr/5/en?format=image");
put("AFR/Tomb of Annihilation", "https://api.scryfall.com/cards/tafr/22/en?format=image");
put("AFR/Treasure", "https://api.scryfall.com/cards/tafr/15/en?format=image");
put("AFR/Vecna", "https://api.scryfall.com/cards/tafr/8/en?format=image");
put("AFR/Wolf", "https://api.scryfall.com/cards/tafr/14/en?format=image");
put("AFR/Emblem Zariel, Archduke of Avernus", "https://api.scryfall.com/cards/tafr/19/en?format=image");
put("AFR/Zombie", "https://api.scryfall.com/cards/tafr/9/en?format=image");
// generate supported sets // generate supported sets
supportedSets.clear(); supportedSets.clear();
for (String cardName : this.keySet()) { for (String cardName : this.keySet()) {

View file

@ -108,6 +108,10 @@
|Generate|EMBLEM:KHM|Tyvar Kell||Emblem Tyvar|TyvarKellEmblem| |Generate|EMBLEM:KHM|Tyvar Kell||Emblem Tyvar|TyvarKellEmblem|
|Generate|EMBLEM:STX|Lukka, Wayward Bonder||Emblem Lukka|LukkaWaywardBonderEmblem| |Generate|EMBLEM:STX|Lukka, Wayward Bonder||Emblem Lukka|LukkaWaywardBonderEmblem|
|Generate|EMBLEM:STX|Rowan, Scholar of Sparks||Emblem Rowan|RowanScholarOfSparksEmblem| |Generate|EMBLEM:STX|Rowan, Scholar of Sparks||Emblem Rowan|RowanScholarOfSparksEmblem|
|Generate|EMBLEM:AFR|Ellywick Tumblestrum||Emblem Ellywick|EllywickTumblestrumEmblem|
|Generate|EMBLEM:AFR|Lolth, Spider Queen||Emblem Lolth|LolthSpiderQueenEmblem|
|Generate|EMBLEM:AFR|Mordenkainen||Emblem Mordenkainen|MordenkainenEmblem|
|Generate|EMBLEM:AFR|Zariel, Archduke of Avernus||Emblem Zariel|ZarielArchdukeOfAvernusEmblem|
# Planes # Planes
|Generate|PLANE:PCA|Plane - Academy at Tolaria West|||AcademyAtTolariaWestPlane| |Generate|PLANE:PCA|Plane - Academy at Tolaria West|||AcademyAtTolariaWestPlane|
@ -1564,3 +1568,20 @@
|Generate|TOK:MH2|Treasure|2||TreasureToken| |Generate|TOK:MH2|Treasure|2||TreasureToken|
|Generate|TOK:MH2|Zombie|||ZombieToken| |Generate|TOK:MH2|Zombie|||ZombieToken|
|Generate|TOK:MH2|Zombie Army|||ZombieArmyToken| |Generate|TOK:MH2|Zombie Army|||ZombieArmyToken|
# AFR
|Generate|TOK:AFR|Angel|||Angel33Token|
|Generate|TOK:AFR|Boo|||BooToken|
|Generate|TOK:AFR|Devil|||DevilToken|
|Generate|TOK:AFR|Dog Illusion|||DogIllusionToken|
# |Generate|TOK:AFR|Faerie Dragon|||xxx| TODO: add after dice pr merge
|Generate|TOK:AFR|Goblin|||GoblinToken|
|Generate|TOK:AFR|Guenhwyvar|||GuenhwyvarToken|
|Generate|TOK:AFR|Icingdeath, Frost Tongue|||IcingdeathFrostTongueToken|
|Generate|TOK:AFR|Skeleton|||SkeletonToken|
|Generate|TOK:AFR|Spider|||LolthSpiderToken|
|Generate|TOK:AFR|The Atropal|||TheAtropalToken|
|Generate|TOK:AFR|Treasure|||TreasureToken|
|Generate|TOK:AFR|Vecna|||VecnaToken|
|Generate|TOK:AFR|Wolf|||WolfToken|
|Generate|TOK:AFR|Zombie|||ZombieToken|

View file

@ -34,7 +34,7 @@ public final class ArlinnVoiceOfThePack extends CardImpl {
this.addAbility(new SimpleStaticAbility(new ArlinnVoiceOfThePackReplacementEffect())); this.addAbility(new SimpleStaticAbility(new ArlinnVoiceOfThePackReplacementEffect()));
// -2: Create a 2/2 green Wolf creature token. // -2: Create a 2/2 green Wolf creature token.
this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new WolfToken("WAR")), -2)); this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new WolfToken()), -2));
} }
private ArlinnVoiceOfThePack(final ArlinnVoiceOfThePack card) { private ArlinnVoiceOfThePack(final ArlinnVoiceOfThePack card) {

View file

@ -187,7 +187,10 @@ class TheBookOfVileDarknessEffect extends OneShotEffect {
} }
for (Ability ability : card.getAbilities(game)) { for (Ability ability : card.getAbilities(game)) {
if (ability instanceof TriggeredAbility) { if (ability instanceof TriggeredAbility) {
token.addAbility(ability.copy()); Ability copyAbility = ability.copy();
copyAbility.newId();
copyAbility.setControllerId(source.getControllerId());
token.addAbility(copyAbility);
} }
} }
} }

View file

@ -26,7 +26,7 @@ public final class WolfSkullShaman extends CardImpl {
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
// Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Wolf-Skull Shaman, you may reveal it. If you do, create a 2/2 green Wolf creature token. // Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Wolf-Skull Shaman, you may reveal it. If you do, create a 2/2 green Wolf creature token.
this.addAbility(new KinshipAbility(new CreateTokenEffect(new WolfToken("LRW")))); this.addAbility(new KinshipAbility(new CreateTokenEffect(new WolfToken())));
} }
private WolfSkullShaman(final WolfSkullShaman card) { private WolfSkullShaman(final WolfSkullShaman card) {

View file

@ -72,7 +72,7 @@ class WolfcallersHowlEffect extends OneShotEffect {
} }
} }
if (count > 0) { if (count > 0) {
return new CreateTokenEffect(new WolfToken("C14"), count).apply(game, source); return new CreateTokenEffect(new WolfToken(), count).apply(game, source);
} }
return true; return true;
} }

View file

@ -41,7 +41,7 @@ public final class WrensRunPackmaster extends CardImpl {
this.addAbility(new ChampionAbility(this, SubType.ELF, false)); this.addAbility(new ChampionAbility(this, SubType.ELF, false));
// {2}{G}: Create a 2/2 green Wolf creature token. // {2}{G}: Create a 2/2 green Wolf creature token.
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new WolfToken("LRW")), new ManaCostsImpl<>("{2}{G}"))); this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new WolfToken()), new ManaCostsImpl<>("{2}{G}")));
// Each Wolf you control has deathtouch. // Each Wolf you control has deathtouch.
Effect effect = new GainAbilityAllEffect(DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield, filter); Effect effect = new GainAbilityAllEffect(DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield, filter);

View file

@ -7,6 +7,8 @@ import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import java.util.Arrays;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -20,8 +22,11 @@ public final class BooToken extends TokenImpl {
subtype.add(SubType.HAMSTER); subtype.add(SubType.HAMSTER);
power = new MageInt(1); power = new MageInt(1);
toughness = new MageInt(1); toughness = new MageInt(1);
addAbility(TrampleAbility.getInstance()); addAbility(TrampleAbility.getInstance());
addAbility(HasteAbility.getInstance()); addAbility(HasteAbility.getInstance());
availableImageSetCodes = Arrays.asList("AFR");
} }
private BooToken(final BooToken token) { private BooToken(final BooToken token) {

View file

@ -1,6 +1,7 @@
package mage.game.permanent.token; package mage.game.permanent.token;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import mage.MageInt; import mage.MageInt;
@ -27,11 +28,15 @@ public final class DevilToken extends TokenImpl {
color.setRed(true); color.setRed(true);
power = new MageInt(1); power = new MageInt(1);
toughness = new MageInt(1); toughness = new MageInt(1);
// When this creature dies, it deals 1 damage to any target.
Effect effect = new DamageTargetEffect(1); Effect effect = new DamageTargetEffect(1);
effect.setText("it deals 1 damage to any target"); effect.setText("it deals 1 damage to any target");
Ability ability = new DiesSourceTriggeredAbility(effect); Ability ability = new DiesSourceTriggeredAbility(effect);
ability.addTarget(new TargetAnyTarget()); ability.addTarget(new TargetAnyTarget());
this.addAbility(ability); this.addAbility(ability);
availableImageSetCodes = Arrays.asList("SOI", "WAR", "AFR");
} }
public DevilToken(final DevilToken token) { public DevilToken(final DevilToken token) {

View file

@ -13,6 +13,8 @@ import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.players.Player; import mage.players.Player;
import java.util.Arrays;
/** /**
* *
* @author weirddan455 * @author weirddan455
@ -27,10 +29,14 @@ public final class DogIllusionToken extends TokenImpl {
subtype.add(SubType.ILLUSION); subtype.add(SubType.ILLUSION);
power = new MageInt(0); power = new MageInt(0);
toughness = new MageInt(0); toughness = new MageInt(0);
addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(
// This creature's power and toughness are each equal to twice the number of cards in your hand.
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(
DogIllusionValue.instance, Duration.EndOfGame) DogIllusionValue.instance, Duration.EndOfGame)
.setText("this creature's power and toughness are each equal to twice the number of cards in your hand") .setText("this creature's power and toughness are each equal to twice the number of cards in your hand")
)); ));
availableImageSetCodes = Arrays.asList("AFR");
} }
private DogIllusionToken(final DogIllusionToken token) { private DogIllusionToken(final DogIllusionToken token) {

View file

@ -32,7 +32,7 @@ public final class GoblinToken extends TokenImpl {
availableImageSetCodes = Arrays.asList("10E", "ALA", "SOM", "M10", "NPH", "M13", "RTR", availableImageSetCodes = Arrays.asList("10E", "ALA", "SOM", "M10", "NPH", "M13", "RTR",
"MMA", "M15", "C14", "KTK", "EVG", "DTK", "ORI", "DDG", "DDN", "EVG", "MM2", "MMA", "M15", "C14", "KTK", "EVG", "DTK", "ORI", "DDG", "DDN", "EVG", "MM2",
"MM3", "EMA", "C16", "DOM", "ANA", "RNA", "WAR", "MH1", "TSR", "MH2"); "MM3", "EMA", "C16", "DOM", "ANA", "RNA", "WAR", "MH1", "TSR", "MH2", "AFR");
} }
public GoblinToken(final GoblinToken token) { public GoblinToken(final GoblinToken token) {

View file

@ -6,6 +6,8 @@ import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import java.util.Arrays;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -19,7 +21,11 @@ public final class GuenhwyvarToken extends TokenImpl {
subtype.add(SubType.CAT); subtype.add(SubType.CAT);
power = new MageInt(4); power = new MageInt(4);
toughness = new MageInt(1); toughness = new MageInt(1);
addAbility(TrampleAbility.getInstance());
// Trample
this.addAbility(TrampleAbility.getInstance());
availableImageSetCodes = Arrays.asList("AFR");
} }
private GuenhwyvarToken(final GuenhwyvarToken token) { private GuenhwyvarToken(final GuenhwyvarToken token) {

View file

@ -14,6 +14,8 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.DefendingPlayerControlsPredicate; import mage.filter.predicate.permanent.DefendingPlayerControlsPredicate;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import java.util.Arrays;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -35,11 +37,19 @@ public class IcingdeathFrostTongueToken extends TokenImpl {
cardType.add(CardType.ARTIFACT); cardType.add(CardType.ARTIFACT);
color.setWhite(true); color.setWhite(true);
subtype.add(SubType.EQUIPMENT); subtype.add(SubType.EQUIPMENT);
// Equipped creature gets +2/+0
this.addAbility(new SimpleStaticAbility(new BoostEquippedEffect(2, 0))); this.addAbility(new SimpleStaticAbility(new BoostEquippedEffect(2, 0)));
// Whenever equipped creature attacks, tap target creature defending player controls
Ability ability = new AttacksAttachedTriggeredAbility(new TapTargetEffect(), false); Ability ability = new AttacksAttachedTriggeredAbility(new TapTargetEffect(), false);
ability.addTarget(new TargetPermanent(filter)); ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability); this.addAbility(ability);
// Equip {2}
this.addAbility(new EquipAbility(2)); this.addAbility(new EquipAbility(2));
availableImageSetCodes = Arrays.asList("AFR");
} }
private IcingdeathFrostTongueToken(final IcingdeathFrostTongueToken token) { private IcingdeathFrostTongueToken(final IcingdeathFrostTongueToken token) {

View file

@ -6,6 +6,8 @@ import mage.abilities.keyword.ReachAbility;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import java.util.Arrays;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -18,8 +20,14 @@ public final class LolthSpiderToken extends TokenImpl {
subtype.add(SubType.SPIDER); subtype.add(SubType.SPIDER);
power = new MageInt(2); power = new MageInt(2);
toughness = new MageInt(1); toughness = new MageInt(1);
addAbility(new MenaceAbility());
addAbility(ReachAbility.getInstance()); // Menace
this.addAbility(new MenaceAbility());
// Reach
this.addAbility(ReachAbility.getInstance());
availableImageSetCodes = Arrays.asList("AFR");
} }
public LolthSpiderToken(final LolthSpiderToken token) { public LolthSpiderToken(final LolthSpiderToken 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 SkeletonToken extends TokenImpl {
color.setBlack(true); color.setBlack(true);
power = new MageInt(1); power = new MageInt(1);
toughness = new MageInt(1); toughness = new MageInt(1);
availableImageSetCodes = Arrays.asList("AFR");
} }
public SkeletonToken(final SkeletonToken token) { public SkeletonToken(final SkeletonToken token) {

View file

@ -6,6 +6,8 @@ import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import java.util.Arrays;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -20,7 +22,11 @@ public final class TheAtropalToken extends TokenImpl {
subtype.add(SubType.HORROR); subtype.add(SubType.HORROR);
power = new MageInt(4); power = new MageInt(4);
toughness = new MageInt(4); toughness = new MageInt(4);
// Deathtouch
addAbility(DeathtouchAbility.getInstance()); addAbility(DeathtouchAbility.getInstance());
availableImageSetCodes = Arrays.asList("AFR");
} }
public TheAtropalToken(final TheAtropalToken token) { public TheAtropalToken(final TheAtropalToken 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"); availableImageSetCodes = Arrays.asList("XLN", "RNA", "M20", "C19", "C20", "M21", "CMR", "KHM", "STX", "MH2", "AFR");
} }
public TreasureToken(final TreasureToken token) { public TreasureToken(final TreasureToken token) {

View file

@ -6,6 +6,8 @@ import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import java.util.Arrays;
/** /**
* @author TheElk801 * @author TheElk801
*/ */
@ -20,7 +22,11 @@ public final class VecnaToken extends TokenImpl {
subtype.add(SubType.GOD); subtype.add(SubType.GOD);
power = new MageInt(8); power = new MageInt(8);
toughness = new MageInt(8); toughness = new MageInt(8);
addAbility(IndestructibleAbility.getInstance());
// Indestructible
this.addAbility(IndestructibleAbility.getInstance());
availableImageSetCodes = Arrays.asList("AFR");
} }
private VecnaToken(final VecnaToken token) { private VecnaToken(final VecnaToken token) {

View file

@ -3,48 +3,35 @@ package mage.game.permanent.token;
import mage.MageInt; import mage.MageInt;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.util.RandomUtil;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
/** /**
* @author BetaSteward_at_googlemail.com * @author BetaSteward_at_googlemail.com
*/ */
public final class WolfToken extends TokenImpl { public final class WolfToken extends TokenImpl {
static final private List<String> tokenImageSets = new ArrayList<>();
static {
tokenImageSets.addAll(Arrays.asList("BNG", "C14", "CNS", "FNMP", "ISD", "LRW", "M10", "M14", "MM2", "SHM", "SOM",
"ZEN", "SOI", "C15", "M15", "WAR", "M20", "THB"));
}
public WolfToken() { public WolfToken() {
this(null, 0);
}
public WolfToken(String setCode) {
this(setCode, 0);
}
public WolfToken(String setCode, int tokenType) {
super("Wolf", "2/2 green Wolf creature token"); super("Wolf", "2/2 green Wolf creature token");
availableImageSetCodes = tokenImageSets;
setOriginalExpansionSetCode(setCode);
cardType.add(CardType.CREATURE); cardType.add(CardType.CREATURE);
color.setGreen(true); color.setGreen(true);
subtype.add(SubType.WOLF); subtype.add(SubType.WOLF);
power = new MageInt(2); power = new MageInt(2);
toughness = new MageInt(2); toughness = new MageInt(2);
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",
"THB", "AFR");
} }
@Override @Override
public void setExpansionSetCodeForImage(String code) { public void setExpansionSetCodeForImage(String code) {
super.setExpansionSetCodeForImage(code); super.setExpansionSetCodeForImage(code);
if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("ISD")) { if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("ISD")) {
this.setTokenType(2); this.setTokenType(RandomUtil.nextInt(2) + 1); // 2 images
} }
} }

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"); "CMR", "C21", "MH2", "AFR");
} }
@Override @Override