mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 02:30:08 -08:00
Rework Mystery Booster and adjust some set classifications (#12138)
Mystery Booster rework: * added images download support from scryfall (closes #11806); * added virtual sets support (remix); * fixed Commander set name (closes #12110);
This commit is contained in:
parent
9f52c8946e
commit
9566e23d0b
23 changed files with 1939 additions and 3684 deletions
|
|
@ -12,6 +12,6 @@ NAME:Draw Go by Randy Buehler 12th place WC 1998
|
||||||
4 [V10:11] Nevinyrral's Disk
|
4 [V10:11] Nevinyrral's Disk
|
||||||
18 [GN2:58] Island
|
18 [GN2:58] Island
|
||||||
4 [10E:356] Quicksand
|
4 [10E:356] Quicksand
|
||||||
4 [FMB1:121] Stalking Stones
|
4 [TMP:327] Stalking Stones
|
||||||
LAYOUT MAIN:(1,1)(NONE,false,50)|([VIS:41],[3ED:54],[3ED:54],[3ED:54],[3ED:54],[C13:39],[C13:39],[C13:39],[C13:39],[MIR:61],[MIR:61],[PRM:36078],[PRM:36078],[PRM:36078],[PRM:31395],[PRM:31395],[PRM:31395],[PRM:31395],[F01:11],[F01:11],[F01:11],[F01:11],[BRB:41],[BRB:41],[BRB:41],[7ED:88],[TSB:35],[TSB:35],[TSB:35],[TSB:35],[V10:11],[V10:11],[V10:11],[V10:11],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[10E:356],[10E:356],[10E:356],[10E:356],[FMB1:121],[FMB1:121],[FMB1:121],[FMB1:121])
|
LAYOUT MAIN:(1,1)(NONE,false,50)|([VIS:41],[3ED:54],[3ED:54],[3ED:54],[3ED:54],[C13:39],[C13:39],[C13:39],[C13:39],[MIR:61],[MIR:61],[PRM:36078],[PRM:36078],[PRM:36078],[PRM:31395],[PRM:31395],[PRM:31395],[PRM:31395],[F01:11],[F01:11],[F01:11],[F01:11],[BRB:41],[BRB:41],[BRB:41],[7ED:88],[TSB:35],[TSB:35],[TSB:35],[TSB:35],[V10:11],[V10:11],[V10:11],[V10:11],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[GN2:58],[10E:356],[10E:356],[10E:356],[10E:356],[TMP:327],[TMP:327],[TMP:327],[TMP:327])
|
||||||
LAYOUT SIDEBOARD:(0,0)(NONE,false,50)|
|
LAYOUT SIDEBOARD:(0,0)(NONE,false,50)|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ public class ArenaBeginnerSet extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ArenaBeginnerSet() {
|
private ArenaBeginnerSet() {
|
||||||
super("Arena Beginner Set", "ANB", ExpansionSet.buildDate(2020, 8, 13), SetType.MAGIC_ONLINE);
|
super("Arena Beginner Set", "ANB", ExpansionSet.buildDate(2020, 8, 13), SetType.MAGIC_ARENA);
|
||||||
this.hasBoosters = false;
|
this.hasBoosters = false;
|
||||||
this.hasBasicLands = true;
|
this.hasBasicLands = true;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ public final class ArenaNewPlayerExperience extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ArenaNewPlayerExperience() {
|
private ArenaNewPlayerExperience() {
|
||||||
super("Arena New Player Experience", "ANA", ExpansionSet.buildDate(2018, 7, 14), SetType.MAGIC_ONLINE);
|
super("Arena New Player Experience", "ANA", ExpansionSet.buildDate(2018, 7, 14), SetType.MAGIC_ARENA);
|
||||||
this.hasBoosters = false;
|
this.hasBoosters = false;
|
||||||
this.hasBasicLands = true;
|
this.hasBasicLands = true;
|
||||||
|
|
||||||
|
|
@ -65,4 +65,4 @@ public final class ArenaNewPlayerExperience extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Swamp", 28, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Swamp", 28, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Swamp", 29, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Swamp", 29, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ public final class ArenaNewPlayerExperienceCards extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ArenaNewPlayerExperienceCards() {
|
private ArenaNewPlayerExperienceCards() {
|
||||||
super("Arena New Player Experience Cards", "OANA", ExpansionSet.buildDate(2018, 7, 14), SetType.MAGIC_ONLINE);
|
super("Arena New Player Experience Cards", "OANA", ExpansionSet.buildDate(2018, 7, 14), SetType.MAGIC_ARENA);
|
||||||
this.hasBoosters = false;
|
this.hasBoosters = false;
|
||||||
this.hasBasicLands = false;
|
this.hasBasicLands = false;
|
||||||
|
|
||||||
|
|
@ -35,4 +35,4 @@ public final class ArenaNewPlayerExperienceCards extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Treetop Warden", 48, Rarity.COMMON, mage.cards.t.TreetopWarden.class));
|
cards.add(new SetCardInfo("Treetop Warden", 48, Rarity.COMMON, mage.cards.t.TreetopWarden.class));
|
||||||
cards.add(new SetCardInfo("Zephyr Gull", 23, Rarity.COMMON, mage.cards.z.ZephyrGull.class));
|
cards.add(new SetCardInfo("Zephyr Gull", 23, Rarity.COMMON, mage.cards.z.ZephyrGull.class));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ public final class ArenaNewPlayerExperienceExtras extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ArenaNewPlayerExperienceExtras() {
|
private ArenaNewPlayerExperienceExtras() {
|
||||||
super("Arena New Player Experience Extras", "XANA", ExpansionSet.buildDate(2018, 7, 14), SetType.MAGIC_ONLINE);
|
super("Arena New Player Experience Extras", "XANA", ExpansionSet.buildDate(2018, 7, 14), SetType.MAGIC_ARENA);
|
||||||
this.hasBoosters = false;
|
this.hasBoosters = false;
|
||||||
this.hasBasicLands = true;
|
this.hasBasicLands = true;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
package mage.sets;
|
package mage.sets;
|
||||||
|
|
||||||
import mage.cards.ExpansionSet;
|
import mage.cards.ExpansionSet;
|
||||||
|
|
@ -9,16 +8,16 @@ import mage.constants.SetType;
|
||||||
*
|
*
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
public final class Commander extends ExpansionSet {
|
public final class Commander2011 extends ExpansionSet {
|
||||||
|
|
||||||
private static final Commander instance = new Commander();
|
private static final Commander2011 instance = new Commander2011();
|
||||||
|
|
||||||
public static Commander getInstance() {
|
public static Commander2011 getInstance() {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Commander() {
|
private Commander2011() {
|
||||||
super("Commander", "CMD", ExpansionSet.buildDate(2011, 6, 17), SetType.SUPPLEMENTAL);
|
super("Commander 2011", "CMD", ExpansionSet.buildDate(2011, 6, 17), SetType.SUPPLEMENTAL);
|
||||||
this.blockName = "Command Zone";
|
this.blockName = "Command Zone";
|
||||||
cards.add(new SetCardInfo("Acidic Slime", 140, Rarity.UNCOMMON, mage.cards.a.AcidicSlime.class));
|
cards.add(new SetCardInfo("Acidic Slime", 140, Rarity.UNCOMMON, mage.cards.a.AcidicSlime.class));
|
||||||
cards.add(new SetCardInfo("Acorn Catapult", 241, Rarity.RARE, mage.cards.a.AcornCatapult.class));
|
cards.add(new SetCardInfo("Acorn Catapult", 241, Rarity.RARE, mage.cards.a.AcornCatapult.class));
|
||||||
|
|
@ -17,7 +17,7 @@ public final class HASCONPromo2017 extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private HASCONPromo2017() {
|
private HASCONPromo2017() {
|
||||||
super("HASCON Promo 2017", "H17", ExpansionSet.buildDate(2017, 9, 8), SetType.JOKESET);
|
super("HASCON Promo 2017", "H17", ExpansionSet.buildDate(2017, 9, 8), SetType.JOKE_SET);
|
||||||
this.hasBasicLands = false;
|
this.hasBasicLands = false;
|
||||||
|
|
||||||
cards.add(new ExpansionSet.SetCardInfo("Grimlock, Dinobot Leader", 1, Rarity.MYTHIC, mage.cards.g.GrimlockDinobotLeader.class));
|
cards.add(new ExpansionSet.SetCardInfo("Grimlock, Dinobot Leader", 1, Rarity.MYTHIC, mage.cards.g.GrimlockDinobotLeader.class));
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ public final class HappyHolidays extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private HappyHolidays() {
|
private HappyHolidays() {
|
||||||
super("Happy Holidays", "HHO", ExpansionSet.buildDate(2006, 12, 31), SetType.JOKESET);
|
super("Happy Holidays", "HHO", ExpansionSet.buildDate(2006, 12, 31), SetType.JOKE_SET);
|
||||||
this.hasBasicLands = false;
|
this.hasBasicLands = false;
|
||||||
|
|
||||||
cards.add(new SetCardInfo("Fruitcake Elemental", 6, Rarity.RARE, mage.cards.f.FruitcakeElemental.class));
|
cards.add(new SetCardInfo("Fruitcake Elemental", 6, Rarity.RARE, mage.cards.f.FruitcakeElemental.class));
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ public final class HeroesOfTheRealm2016 extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private HeroesOfTheRealm2016() {
|
private HeroesOfTheRealm2016() {
|
||||||
super("Heroes of the Realm 2016", "PHTR", ExpansionSet.buildDate(2017, 9, 20), SetType.JOKESET);
|
super("Heroes of the Realm 2016", "PHTR", ExpansionSet.buildDate(2017, 9, 20), SetType.JOKE_SET);
|
||||||
this.hasBasicLands = false;
|
this.hasBasicLands = false;
|
||||||
|
|
||||||
cards.add(new SetCardInfo("Chandra, Gremlin Wrangler", 1, Rarity.MYTHIC, mage.cards.c.ChandraGremlinWrangler.class));
|
cards.add(new SetCardInfo("Chandra, Gremlin Wrangler", 1, Rarity.MYTHIC, mage.cards.c.ChandraGremlinWrangler.class));
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ public class HeroesOfTheRealm2017 extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private HeroesOfTheRealm2017() {
|
private HeroesOfTheRealm2017() {
|
||||||
super("Heroes of the Realm 2017", "PH17", ExpansionSet.buildDate(2018, 8, 1), SetType.JOKESET);
|
super("Heroes of the Realm 2017", "PH17", ExpansionSet.buildDate(2018, 8, 1), SetType.JOKE_SET);
|
||||||
this.hasBoosters = false;
|
this.hasBoosters = false;
|
||||||
this.hasBasicLands = false;
|
this.hasBasicLands = false;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ public class HeroesOfTheRealm2019 extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private HeroesOfTheRealm2019() {
|
private HeroesOfTheRealm2019() {
|
||||||
super("Heroes of the Realm 2019", "PH19", ExpansionSet.buildDate(2020, 8, 1), SetType.JOKESET);
|
super("Heroes of the Realm 2019", "PH19", ExpansionSet.buildDate(2020, 8, 1), SetType.JOKE_SET);
|
||||||
this.hasBoosters = false;
|
this.hasBoosters = false;
|
||||||
this.hasBasicLands = false;
|
this.hasBasicLands = false;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ public class MTGArenaPromos extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private MTGArenaPromos() {
|
private MTGArenaPromos() {
|
||||||
super("MTG Arena Promos", "PANA", ExpansionSet.buildDate(2020, 2, 15), SetType.MAGIC_ONLINE);
|
super("MTG Arena Promos", "PANA", ExpansionSet.buildDate(2020, 2, 15), SetType.MAGIC_ARENA);
|
||||||
this.hasBoosters = false;
|
this.hasBoosters = false;
|
||||||
this.hasBasicLands = true;
|
this.hasBasicLands = true;
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -19,7 +19,7 @@ public class MysteryBoosterPlaytest extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private MysteryBoosterPlaytest() {
|
private MysteryBoosterPlaytest() {
|
||||||
super("Mystery Booster Playtest", "CMB1", ExpansionSet.buildDate(2019, 11, 7), SetType.JOKESET);
|
super("Mystery Booster Playtest", "CMB1", ExpansionSet.buildDate(2019, 11, 7), SetType.JOKE_SET);
|
||||||
this.hasBoosters = false;
|
this.hasBoosters = false;
|
||||||
this.hasBasicLands = false;
|
this.hasBasicLands = false;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,145 +0,0 @@
|
||||||
package mage.sets;
|
|
||||||
|
|
||||||
import mage.cards.ExpansionSet;
|
|
||||||
import mage.constants.Rarity;
|
|
||||||
import mage.constants.SetType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* https://scryfall.com/sets/fmb1
|
|
||||||
*/
|
|
||||||
public class MysteryBoosterRetailEditionFoils extends ExpansionSet {
|
|
||||||
|
|
||||||
private static final MysteryBoosterRetailEditionFoils instance = new MysteryBoosterRetailEditionFoils();
|
|
||||||
|
|
||||||
public static MysteryBoosterRetailEditionFoils getInstance() {
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
private MysteryBoosterRetailEditionFoils() {
|
|
||||||
super("Mystery Booster Retail Edition Foils", "FMB1", ExpansionSet.buildDate(2020, 3, 8), SetType.SUPPLEMENTAL);
|
|
||||||
this.hasBoosters = false;
|
|
||||||
this.hasBasicLands = false;
|
|
||||||
|
|
||||||
cards.add(new SetCardInfo("Alchemist's Refuge", 117, Rarity.RARE, mage.cards.a.AlchemistsRefuge.class));
|
|
||||||
cards.add(new SetCardInfo("Allosaurus Rider", 61, Rarity.RARE, mage.cards.a.AllosaurusRider.class));
|
|
||||||
cards.add(new SetCardInfo("Amulet of Vigor", 98, Rarity.RARE, mage.cards.a.AmuletOfVigor.class));
|
|
||||||
cards.add(new SetCardInfo("Archetype of Endurance", 62, Rarity.UNCOMMON, mage.cards.a.ArchetypeOfEndurance.class));
|
|
||||||
cards.add(new SetCardInfo("Aurelia's Fury", 83, Rarity.MYTHIC, mage.cards.a.AureliasFury.class));
|
|
||||||
cards.add(new SetCardInfo("Balduvian Rage", 46, Rarity.UNCOMMON, mage.cards.b.BalduvianRage.class));
|
|
||||||
cards.add(new SetCardInfo("Balefire Liege", 93, Rarity.RARE, mage.cards.b.BalefireLiege.class));
|
|
||||||
cards.add(new SetCardInfo("Blasting Station", 99, Rarity.UNCOMMON, mage.cards.b.BlastingStation.class));
|
|
||||||
cards.add(new SetCardInfo("Blighted Agent", 20, Rarity.COMMON, mage.cards.b.BlightedAgent.class));
|
|
||||||
cards.add(new SetCardInfo("Boreal Druid", 63, Rarity.COMMON, mage.cards.b.BorealDruid.class));
|
|
||||||
cards.add(new SetCardInfo("Boundless Realms", 64, Rarity.RARE, mage.cards.b.BoundlessRealms.class));
|
|
||||||
cards.add(new SetCardInfo("Braid of Fire", 47, Rarity.RARE, mage.cards.b.BraidOfFire.class));
|
|
||||||
cards.add(new SetCardInfo("Bramblewood Paragon", 65, Rarity.UNCOMMON, mage.cards.b.BramblewoodParagon.class));
|
|
||||||
cards.add(new SetCardInfo("Bringer of the Black Dawn", 33, Rarity.RARE, mage.cards.b.BringerOfTheBlackDawn.class));
|
|
||||||
cards.add(new SetCardInfo("Burning Inquiry", 48, Rarity.COMMON, mage.cards.b.BurningInquiry.class));
|
|
||||||
cards.add(new SetCardInfo("Celestial Dawn", 2, Rarity.RARE, mage.cards.c.CelestialDawn.class));
|
|
||||||
cards.add(new SetCardInfo("Celestial Kirin", 3, Rarity.RARE, mage.cards.c.CelestialKirin.class));
|
|
||||||
cards.add(new SetCardInfo("Changeling Hero", 4, Rarity.UNCOMMON, mage.cards.c.ChangelingHero.class));
|
|
||||||
cards.add(new SetCardInfo("Chimney Imp", 34, Rarity.COMMON, mage.cards.c.ChimneyImp.class));
|
|
||||||
cards.add(new SetCardInfo("Codex Shredder", 100, Rarity.UNCOMMON, mage.cards.c.CodexShredder.class));
|
|
||||||
cards.add(new SetCardInfo("Conspiracy", 35, Rarity.RARE, mage.cards.c.Conspiracy.class));
|
|
||||||
cards.add(new SetCardInfo("Council Guardian", 5, Rarity.UNCOMMON, mage.cards.c.CouncilGuardian.class));
|
|
||||||
cards.add(new SetCardInfo("Delay", 21, Rarity.UNCOMMON, mage.cards.d.Delay.class));
|
|
||||||
cards.add(new SetCardInfo("Drogskol Captain", 84, Rarity.UNCOMMON, mage.cards.d.DrogskolCaptain.class));
|
|
||||||
cards.add(new SetCardInfo("Echoing Decay", 36, Rarity.COMMON, mage.cards.e.EchoingDecay.class));
|
|
||||||
cards.add(new SetCardInfo("Eidolon of Rhetoric", 6, Rarity.UNCOMMON, mage.cards.e.EidolonOfRhetoric.class));
|
|
||||||
cards.add(new SetCardInfo("Fatespinner", 22, Rarity.RARE, mage.cards.f.Fatespinner.class));
|
|
||||||
cards.add(new SetCardInfo("Fiery Gambit", 49, Rarity.RARE, mage.cards.f.FieryGambit.class));
|
|
||||||
cards.add(new SetCardInfo("Flamekin Harbinger", 50, Rarity.UNCOMMON, mage.cards.f.FlamekinHarbinger.class));
|
|
||||||
cards.add(new SetCardInfo("Form of the Dragon", 51, Rarity.RARE, mage.cards.f.FormOfTheDragon.class));
|
|
||||||
cards.add(new SetCardInfo("Frozen Aether", 23, Rarity.UNCOMMON, mage.cards.f.FrozenAether.class));
|
|
||||||
cards.add(new SetCardInfo("Funeral Charm", 37, Rarity.RARE, mage.cards.f.FuneralCharm.class));
|
|
||||||
cards.add(new SetCardInfo("Fungusaur", 66, Rarity.RARE, mage.cards.f.Fungusaur.class));
|
|
||||||
cards.add(new SetCardInfo("Game-Trail Changeling", 67, Rarity.COMMON, mage.cards.g.GameTrailChangeling.class));
|
|
||||||
cards.add(new SetCardInfo("Geth's Grimoire", 101, Rarity.UNCOMMON, mage.cards.g.GethsGrimoire.class));
|
|
||||||
cards.add(new SetCardInfo("Gilder Bairn", 94, Rarity.UNCOMMON, mage.cards.g.GilderBairn.class));
|
|
||||||
cards.add(new SetCardInfo("Gleeful Sabotage", 68, Rarity.COMMON, mage.cards.g.GleefulSabotage.class));
|
|
||||||
cards.add(new SetCardInfo("Glittering Wish", 85, Rarity.RARE, mage.cards.g.GlitteringWish.class));
|
|
||||||
cards.add(new SetCardInfo("Goblin Bushwhacker", 52, Rarity.COMMON, mage.cards.g.GoblinBushwhacker.class));
|
|
||||||
cards.add(new SetCardInfo("Grand Architect", 24, Rarity.RARE, mage.cards.g.GrandArchitect.class));
|
|
||||||
cards.add(new SetCardInfo("Greater Mossdog", 69, Rarity.COMMON, mage.cards.g.GreaterMossdog.class));
|
|
||||||
cards.add(new SetCardInfo("Guerrilla Tactics", 53, Rarity.UNCOMMON, mage.cards.g.GuerrillaTactics.class));
|
|
||||||
cards.add(new SetCardInfo("Harmonic Sliver", 86, Rarity.UNCOMMON, mage.cards.h.HarmonicSliver.class));
|
|
||||||
cards.add(new SetCardInfo("Helix Pinnacle", 70, Rarity.RARE, mage.cards.h.HelixPinnacle.class));
|
|
||||||
cards.add(new SetCardInfo("Herald of Leshrac", 38, Rarity.RARE, mage.cards.h.HeraldOfLeshrac.class));
|
|
||||||
cards.add(new SetCardInfo("Hornet Sting", 71, Rarity.COMMON, mage.cards.h.HornetSting.class));
|
|
||||||
cards.add(new SetCardInfo("Intruder Alarm", 25, Rarity.RARE, mage.cards.i.IntruderAlarm.class));
|
|
||||||
cards.add(new SetCardInfo("Iron Myr", 102, Rarity.COMMON, mage.cards.i.IronMyr.class));
|
|
||||||
cards.add(new SetCardInfo("Isamaru, Hound of Konda", 7, Rarity.RARE, mage.cards.i.IsamaruHoundOfKonda.class));
|
|
||||||
cards.add(new SetCardInfo("Karrthus, Tyrant of Jund", 87, Rarity.MYTHIC, mage.cards.k.KarrthusTyrantOfJund.class));
|
|
||||||
cards.add(new SetCardInfo("Knowledge Pool", 103, Rarity.RARE, mage.cards.k.KnowledgePool.class));
|
|
||||||
cards.add(new SetCardInfo("Kulrath Knight", 95, Rarity.UNCOMMON, mage.cards.k.KulrathKnight.class));
|
|
||||||
cards.add(new SetCardInfo("Lantern of Insight", 104, Rarity.UNCOMMON, mage.cards.l.LanternOfInsight.class));
|
|
||||||
cards.add(new SetCardInfo("Lapse of Certainty", 8, Rarity.COMMON, mage.cards.l.LapseOfCertainty.class));
|
|
||||||
cards.add(new SetCardInfo("Leveler", 105, Rarity.RARE, mage.cards.l.Leveler.class));
|
|
||||||
cards.add(new SetCardInfo("Lich's Mirror", 106, Rarity.MYTHIC, mage.cards.l.LichsMirror.class));
|
|
||||||
cards.add(new SetCardInfo("Lightning Storm", 54, Rarity.UNCOMMON, mage.cards.l.LightningStorm.class));
|
|
||||||
cards.add(new SetCardInfo("Lumithread Field", 9, Rarity.COMMON, mage.cards.l.LumithreadField.class));
|
|
||||||
cards.add(new SetCardInfo("Maelstrom Nexus", 88, Rarity.MYTHIC, mage.cards.m.MaelstromNexus.class));
|
|
||||||
cards.add(new SetCardInfo("Magewright's Stone", 107, Rarity.UNCOMMON, mage.cards.m.MagewrightsStone.class));
|
|
||||||
cards.add(new SetCardInfo("Manaweft Sliver", 72, Rarity.UNCOMMON, mage.cards.m.ManaweftSliver.class));
|
|
||||||
cards.add(new SetCardInfo("Maro", 73, Rarity.RARE, mage.cards.m.Maro.class));
|
|
||||||
cards.add(new SetCardInfo("Marrow-Gnawer", 39, Rarity.RARE, mage.cards.m.MarrowGnawer.class));
|
|
||||||
cards.add(new SetCardInfo("Memnite", 108, Rarity.UNCOMMON, mage.cards.m.Memnite.class));
|
|
||||||
cards.add(new SetCardInfo("Minamo, School at Water's Edge", 118, Rarity.RARE, mage.cards.m.MinamoSchoolAtWatersEdge.class));
|
|
||||||
cards.add(new SetCardInfo("Mind Funeral", 89, Rarity.UNCOMMON, mage.cards.m.MindFuneral.class));
|
|
||||||
cards.add(new SetCardInfo("Mindslaver", 109, Rarity.RARE, mage.cards.m.Mindslaver.class));
|
|
||||||
cards.add(new SetCardInfo("Mirrodin's Core", 119, Rarity.UNCOMMON, mage.cards.m.MirrodinsCore.class));
|
|
||||||
cards.add(new SetCardInfo("Misthollow Griffin", 26, Rarity.MYTHIC, mage.cards.m.MisthollowGriffin.class));
|
|
||||||
cards.add(new SetCardInfo("Myojin of Life's Web", 74, Rarity.RARE, mage.cards.m.MyojinOfLifesWeb.class));
|
|
||||||
cards.add(new SetCardInfo("Nezumi Shortfang", 40, Rarity.RARE, mage.cards.n.NezumiShortfang.class));
|
|
||||||
cards.add(new SetCardInfo("Noggle Bandit", 96, Rarity.COMMON, mage.cards.n.NoggleBandit.class));
|
|
||||||
cards.add(new SetCardInfo("Norin the Wary", 55, Rarity.RARE, mage.cards.n.NorinTheWary.class));
|
|
||||||
cards.add(new SetCardInfo("Norn's Annex", 10, Rarity.RARE, mage.cards.n.NornsAnnex.class));
|
|
||||||
cards.add(new SetCardInfo("Not of This World", 1, Rarity.UNCOMMON, mage.cards.n.NotOfThisWorld.class));
|
|
||||||
cards.add(new SetCardInfo("Ogre Gatecrasher", 56, Rarity.COMMON, mage.cards.o.OgreGatecrasher.class));
|
|
||||||
cards.add(new SetCardInfo("One with Nothing", 41, Rarity.RARE, mage.cards.o.OneWithNothing.class));
|
|
||||||
cards.add(new SetCardInfo("Panglacial Wurm", 75, Rarity.RARE, mage.cards.p.PanglacialWurm.class));
|
|
||||||
cards.add(new SetCardInfo("Paradox Haze", 27, Rarity.UNCOMMON, mage.cards.p.ParadoxHaze.class));
|
|
||||||
cards.add(new SetCardInfo("Patron of the Moon", 28, Rarity.RARE, mage.cards.p.PatronOfTheMoon.class));
|
|
||||||
cards.add(new SetCardInfo("Pili-Pala", 110, Rarity.COMMON, mage.cards.p.PiliPala.class));
|
|
||||||
cards.add(new SetCardInfo("Proclamation of Rebirth", 11, Rarity.RARE, mage.cards.p.ProclamationOfRebirth.class));
|
|
||||||
cards.add(new SetCardInfo("Puca's Mischief", 29, Rarity.RARE, mage.cards.p.PucasMischief.class));
|
|
||||||
cards.add(new SetCardInfo("Pull from Eternity", 12, Rarity.UNCOMMON, mage.cards.p.PullFromEternity.class));
|
|
||||||
cards.add(new SetCardInfo("Pyretic Ritual", 57, Rarity.COMMON, mage.cards.p.PyreticRitual.class));
|
|
||||||
cards.add(new SetCardInfo("Ravenous Trap", 42, Rarity.UNCOMMON, mage.cards.r.RavenousTrap.class));
|
|
||||||
cards.add(new SetCardInfo("Reaper King", 111, Rarity.RARE, mage.cards.r.ReaperKing.class));
|
|
||||||
cards.add(new SetCardInfo("Reki, the History of Kamigawa", 76, Rarity.RARE, mage.cards.r.RekiTheHistoryOfKamigawa.class));
|
|
||||||
cards.add(new SetCardInfo("Rescue from the Underworld", 43, Rarity.UNCOMMON, mage.cards.r.RescueFromTheUnderworld.class));
|
|
||||||
cards.add(new SetCardInfo("Rhox", 77, Rarity.RARE, mage.cards.r.Rhox.class));
|
|
||||||
cards.add(new SetCardInfo("Rune-Tail, Kitsune Ascendant", 13, Rarity.RARE, mage.cards.r.RuneTailKitsuneAscendant.class));
|
|
||||||
cards.add(new SetCardInfo("Sakura-Tribe Scout", 78, Rarity.COMMON, mage.cards.s.SakuraTribeScout.class));
|
|
||||||
cards.add(new SetCardInfo("Sarkhan the Mad", 90, Rarity.MYTHIC, mage.cards.s.SarkhanTheMad.class));
|
|
||||||
cards.add(new SetCardInfo("Scourge of the Throne", 58, Rarity.MYTHIC, mage.cards.s.ScourgeOfTheThrone.class));
|
|
||||||
cards.add(new SetCardInfo("Scryb Ranger", 79, Rarity.UNCOMMON, mage.cards.s.ScrybRanger.class));
|
|
||||||
cards.add(new SetCardInfo("Sen Triplets", 91, Rarity.MYTHIC, mage.cards.s.SenTriplets.class));
|
|
||||||
cards.add(new SetCardInfo("Sheltering Ancient", 80, Rarity.UNCOMMON, mage.cards.s.ShelteringAncient.class));
|
|
||||||
cards.add(new SetCardInfo("Shizo, Death's Storehouse", 120, Rarity.RARE, mage.cards.s.ShizoDeathsStorehouse.class));
|
|
||||||
cards.add(new SetCardInfo("Sinew Sliver", 14, Rarity.COMMON, mage.cards.s.SinewSliver.class));
|
|
||||||
cards.add(new SetCardInfo("Sosuke, Son of Seshiro", 81, Rarity.UNCOMMON, mage.cards.s.SosukeSonOfSeshiro.class));
|
|
||||||
cards.add(new SetCardInfo("Soul's Attendant", 15, Rarity.COMMON, mage.cards.s.SoulsAttendant.class));
|
|
||||||
cards.add(new SetCardInfo("Spelltithe Enforcer", 16, Rarity.RARE, mage.cards.s.SpelltitheEnforcer.class));
|
|
||||||
cards.add(new SetCardInfo("Spellweaver Volute", 30, Rarity.RARE, mage.cards.s.SpellweaverVolute.class));
|
|
||||||
cards.add(new SetCardInfo("Spike Feeder", 82, Rarity.RARE, mage.cards.s.SpikeFeeder.class));
|
|
||||||
cards.add(new SetCardInfo("Springjack Shepherd", 17, Rarity.UNCOMMON, mage.cards.s.SpringjackShepherd.class));
|
|
||||||
cards.add(new SetCardInfo("Stalking Stones", 121, Rarity.UNCOMMON, mage.cards.s.StalkingStones.class));
|
|
||||||
cards.add(new SetCardInfo("Stigma Lasher", 59, Rarity.RARE, mage.cards.s.StigmaLasher.class));
|
|
||||||
cards.add(new SetCardInfo("Storm Crow", 31, Rarity.COMMON, mage.cards.s.StormCrow.class));
|
|
||||||
cards.add(new SetCardInfo("Sundial of the Infinite", 112, Rarity.RARE, mage.cards.s.SundialOfTheInfinite.class));
|
|
||||||
cards.add(new SetCardInfo("Teferi's Puzzle Box", 113, Rarity.RARE, mage.cards.t.TeferisPuzzleBox.class));
|
|
||||||
cards.add(new SetCardInfo("Trailblazer's Boots", 114, Rarity.UNCOMMON, mage.cards.t.TrailblazersBoots.class));
|
|
||||||
cards.add(new SetCardInfo("Treasonous Ogre", 60, Rarity.UNCOMMON, mage.cards.t.TreasonousOgre.class));
|
|
||||||
cards.add(new SetCardInfo("Triskelion", 115, Rarity.RARE, mage.cards.t.Triskelion.class));
|
|
||||||
cards.add(new SetCardInfo("Undead Warchief", 44, Rarity.RARE, mage.cards.u.UndeadWarchief.class));
|
|
||||||
cards.add(new SetCardInfo("Viscera Seer", 45, Rarity.COMMON, mage.cards.v.VisceraSeer.class));
|
|
||||||
cards.add(new SetCardInfo("Wall of Shards", 18, Rarity.UNCOMMON, mage.cards.w.WallOfShards.class));
|
|
||||||
cards.add(new SetCardInfo("Wear // Tear", 97, Rarity.UNCOMMON, mage.cards.w.WearTear.class));
|
|
||||||
cards.add(new SetCardInfo("White Knight", 19, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class));
|
|
||||||
cards.add(new SetCardInfo("Witchbane Orb", 116, Rarity.RARE, mage.cards.w.WitchbaneOrb.class));
|
|
||||||
cards.add(new SetCardInfo("Yore-Tiller Nephilim", 92, Rarity.RARE, mage.cards.y.YoreTillerNephilim.class));
|
|
||||||
cards.add(new SetCardInfo("Zur's Weirding", 32, Rarity.RARE, mage.cards.z.ZursWeirding.class));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -18,7 +18,7 @@ public final class Unglued extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Unglued() {
|
private Unglued() {
|
||||||
super("Unglued", "UGL", ExpansionSet.buildDate(1998, 8, 11), SetType.JOKESET);
|
super("Unglued", "UGL", ExpansionSet.buildDate(1998, 8, 11), SetType.JOKE_SET);
|
||||||
|
|
||||||
cards.add(new SetCardInfo("Burning Cinder Fury of Crimson Chaos Fire", 40, Rarity.RARE, mage.cards.b.BurningCinderFuryOfCrimsonChaosFire.class));
|
cards.add(new SetCardInfo("Burning Cinder Fury of Crimson Chaos Fire", 40, Rarity.RARE, mage.cards.b.BurningCinderFuryOfCrimsonChaosFire.class));
|
||||||
cards.add(new SetCardInfo("Checks and Balances", 16, Rarity.UNCOMMON, mage.cards.c.ChecksAndBalances.class));
|
cards.add(new SetCardInfo("Checks and Balances", 16, Rarity.UNCOMMON, mage.cards.c.ChecksAndBalances.class));
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ public final class Unhinged extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Unhinged() {
|
private Unhinged() {
|
||||||
super("Unhinged", "UNH", ExpansionSet.buildDate(2004, 11, 20), SetType.JOKESET);
|
super("Unhinged", "UNH", ExpansionSet.buildDate(2004, 11, 20), SetType.JOKE_SET);
|
||||||
|
|
||||||
cards.add(new SetCardInfo("\"Ach! Hans, Run!\"", 116, Rarity.RARE, mage.cards.a.AchHansRun.class));
|
cards.add(new SetCardInfo("\"Ach! Hans, Run!\"", 116, Rarity.RARE, mage.cards.a.AchHansRun.class));
|
||||||
cards.add(new SetCardInfo("B-I-N-G-O", 92, Rarity.RARE, mage.cards.b.BINGO.class));
|
cards.add(new SetCardInfo("B-I-N-G-O", 92, Rarity.RARE, mage.cards.b.BINGO.class));
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ public class Unsanctioned extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Unsanctioned() {
|
private Unsanctioned() {
|
||||||
super("Unsanctioned", "UND", ExpansionSet.buildDate(2020, 2, 29), SetType.JOKESET);
|
super("Unsanctioned", "UND", ExpansionSet.buildDate(2020, 2, 29), SetType.JOKE_SET);
|
||||||
this.hasBoosters = false;
|
this.hasBoosters = false;
|
||||||
this.hasBasicLands = true;
|
this.hasBasicLands = true;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ public final class Unstable extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Unstable() {
|
private Unstable() {
|
||||||
super("Unstable", "UST", ExpansionSet.buildDate(2017, 12, 8), SetType.JOKESET);
|
super("Unstable", "UST", ExpansionSet.buildDate(2017, 12, 8), SetType.JOKE_SET);
|
||||||
|
|
||||||
cards.add(new SetCardInfo("Amateur Auteur", "3a", Rarity.COMMON, mage.cards.a.AmateurAuteur.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Amateur Auteur", "3a", Rarity.COMMON, mage.cards.a.AmateurAuteur.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Amateur Auteur", "3b", Rarity.COMMON, mage.cards.a.AmateurAuteur.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Amateur Auteur", "3b", Rarity.COMMON, mage.cards.a.AmateurAuteur.class, NON_FULL_USE_VARIOUS));
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ public class UnstablePromos extends ExpansionSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
private UnstablePromos() {
|
private UnstablePromos() {
|
||||||
super("Unstable Promos", "PUST", ExpansionSet.buildDate(2017, 11, 13), SetType.JOKESET);
|
super("Unstable Promos", "PUST", ExpansionSet.buildDate(2017, 11, 13), SetType.JOKE_SET);
|
||||||
this.hasBoosters = false;
|
this.hasBoosters = false;
|
||||||
this.hasBasicLands = false;
|
this.hasBasicLands = false;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -108,35 +108,6 @@ public class BoosterGenerationTest extends MageTestPlayerBase {
|
||||||
Assert.assertNotNull(booster);
|
Assert.assertNotNull(booster);
|
||||||
Assert.assertEquals("Pack contains 15 cards", 15, booster.size());
|
Assert.assertEquals("Pack contains 15 cards", 15, booster.size());
|
||||||
|
|
||||||
Assert.assertTrue("Slot 1 is white", booster.get(0).getColor().isWhite());
|
|
||||||
Assert.assertTrue("Slot 2 is white", booster.get(1).getColor().isWhite());
|
|
||||||
|
|
||||||
// Wretched Gryff is colorless, but stores in blue slots
|
|
||||||
Assert.assertTrue("Slot 3 is blue", booster.get(2).getName().equals("Wretched Gryff") || booster.get(2).getColor().isBlue());
|
|
||||||
Assert.assertTrue("Slot 4 is blue", booster.get(3).getName().equals("Wretched Gryff") || booster.get(3).getColor().isBlue());
|
|
||||||
|
|
||||||
Assert.assertTrue("Slot 5 is black", booster.get(4).getColor().isBlack());
|
|
||||||
Assert.assertTrue("Slot 6 is black", booster.get(5).getColor().isBlack());
|
|
||||||
|
|
||||||
Assert.assertTrue("Slot 7 is red", booster.get(6).getColor().isRed());
|
|
||||||
Assert.assertTrue("Slot 8 is red", booster.get(7).getColor().isRed());
|
|
||||||
|
|
||||||
Assert.assertTrue("Slot 9 is green", booster.get(8).getColor().isGreen());
|
|
||||||
Assert.assertTrue("Slot 10 is green", booster.get(9).getColor().isGreen());
|
|
||||||
|
|
||||||
Assert.assertTrue("Slot 11 is multicolored", booster.get(10).getColor().isMulticolored());
|
|
||||||
Assert.assertTrue("Slot 12 is colorless", booster.get(11).getColor().isColorless());
|
|
||||||
|
|
||||||
Assert.assertEquals("Slot 15 is from FMB1 set", "FMB1", booster.get(14).getExpansionSetCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testMysteryBooster1Create15CardBooster() {
|
|
||||||
// https://magic.wizards.com/en/articles/archive/feature/unraveling-mystery-booster-2019-11-14
|
|
||||||
List<Card> booster = MysteryBooster.getInstance().create15CardBooster();
|
|
||||||
Assert.assertNotNull(booster);
|
|
||||||
Assert.assertEquals("Pack contains 15 cards", 15, booster.size());
|
|
||||||
|
|
||||||
Assert.assertTrue("Slot 1 is white (" + booster.get(0).getName() + ')', booster.get(0).getColorIdentity().isWhite());
|
Assert.assertTrue("Slot 1 is white (" + booster.get(0).getName() + ')', booster.get(0).getColorIdentity().isWhite());
|
||||||
Assert.assertTrue("Slot 2 is white (" + booster.get(1).getName() + ')', booster.get(1).getColorIdentity().isWhite());
|
Assert.assertTrue("Slot 2 is white (" + booster.get(1).getName() + ')', booster.get(1).getColorIdentity().isWhite());
|
||||||
|
|
||||||
|
|
@ -153,14 +124,7 @@ public class BoosterGenerationTest extends MageTestPlayerBase {
|
||||||
Assert.assertTrue("Slot 10 is green (" + booster.get(9).getName() + ')', booster.get(9).getColorIdentity().isGreen());
|
Assert.assertTrue("Slot 10 is green (" + booster.get(9).getName() + ')', booster.get(9).getColorIdentity().isGreen());
|
||||||
|
|
||||||
Assert.assertTrue("Slot 11 is multicolored (" + booster.get(10).getName() + ')', booster.get(10).getColorIdentity().isMulticolored());
|
Assert.assertTrue("Slot 11 is multicolored (" + booster.get(10).getName() + ')', booster.get(10).getColorIdentity().isMulticolored());
|
||||||
Assert.assertTrue(
|
Assert.assertTrue("Slot 12 is colorless (" + booster.get(11).getName() + ')', booster.get(11).getColor().isColorless());
|
||||||
"Slot 12 is colorless (" + booster.get(11).getName() + ')',
|
|
||||||
booster.get(11).getColor().isColorless()
|
|
||||||
|| booster.get(11).isLand()
|
|
||||||
|| booster.get(11).isArtifact()
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert.assertEquals("Slot 15 is from FMB1 set", "FMB1", booster.get(14).getExpansionSetCode());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -200,7 +164,7 @@ public class BoosterGenerationTest extends MageTestPlayerBase {
|
||||||
for (int i = 0; i < 50; i++) {
|
for (int i = 0; i < 50; i++) {
|
||||||
List<Card> booster = CoreSet2019.getInstance().createBooster();
|
List<Card> booster = CoreSet2019.getInstance().createBooster();
|
||||||
// check that booster contains a land card
|
// check that booster contains a land card
|
||||||
assertTrue(booster.stream().anyMatch(card -> card.isLand()));
|
assertTrue(booster.stream().anyMatch(MageObject::isLand));
|
||||||
allCards.addAll(booster);
|
allCards.addAll(booster);
|
||||||
}
|
}
|
||||||
// check that some dual lands were generated
|
// check that some dual lands were generated
|
||||||
|
|
|
||||||
|
|
@ -675,4 +675,13 @@ public abstract class ExpansionSet implements Serializable {
|
||||||
return numBoosterDoubleFaced;
|
return numBoosterDoubleFaced;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static void addCardInfoToList(List<CardInfo> boosterList, String name, String expansion, String cardNumber) {
|
||||||
|
CardInfo cardInfo = CardRepository.instance.findCardWithPreferredSetAndNumber(name, expansion, cardNumber);
|
||||||
|
if (cardInfo != null && cardInfo.getSetCode().equals(expansion) && cardInfo.getCardNumber().equals(cardNumber)) {
|
||||||
|
boosterList.add(cardInfo);
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException("CardInfo not found: " + name + " (" + expansion + ":" + cardNumber + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,8 @@ public enum SetType {
|
||||||
SUPPLEMENTAL_STANDARD_LEGAL("Standard Legal Supplemental"),
|
SUPPLEMENTAL_STANDARD_LEGAL("Standard Legal Supplemental"),
|
||||||
SUPPLEMENTAL_MODERN_LEGAL("Modern Legal Supplemental"),
|
SUPPLEMENTAL_MODERN_LEGAL("Modern Legal Supplemental"),
|
||||||
PROMOTIONAL("Promotional"),
|
PROMOTIONAL("Promotional"),
|
||||||
JOKESET("Joke Set"),
|
REMIX("Remix"),
|
||||||
|
JOKE_SET("Joke Set"),
|
||||||
CUSTOM_SET("Unofficial Set");
|
CUSTOM_SET("Unofficial Set");
|
||||||
|
|
||||||
private final String text;
|
private final String text;
|
||||||
|
|
@ -31,12 +32,12 @@ public enum SetType {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isJokeSet() {
|
public boolean isJokeSet() {
|
||||||
return this == SetType.JOKESET;
|
return this == SetType.JOKE_SET;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEternalLegal() {
|
public boolean isEternalLegal() {
|
||||||
// any official sets except un-sets
|
// any official sets except un-sets
|
||||||
return this != SetType.CUSTOM_SET && this != SetType.JOKESET && this != SetType.MAGIC_ARENA;
|
return this != SetType.CUSTOM_SET && this != SetType.JOKE_SET && this != SetType.MAGIC_ARENA;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isStandardLegal() {
|
public boolean isStandardLegal() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue