Dragon's maze Race - sealed event packs generation

Converted all guild boosters to PrintSheet+booster-special
This commit is contained in:
Maxmtg
2013-05-07 09:55:00 +00:00
parent 07baf93dd3
commit 1d7c8ea069
35 changed files with 250 additions and 930 deletions

10
.gitattributes vendored
View File

@@ -13596,16 +13596,6 @@ res/quest/world/shandalar/duels/Witch[!!-~]2.dck -text
res/quest/world/shandalar/duels/Witch[!!-~]3.dck -text res/quest/world/shandalar/duels/Witch[!!-~]3.dck -text
res/quest/world/worlds.txt -text res/quest/world/worlds.txt -text
res/sealed/ArabianExtended.sealed -text res/sealed/ArabianExtended.sealed -text
res/sealed/GtcGuildBoros.sealed -text
res/sealed/GtcGuildDimir.sealed -text
res/sealed/GtcGuildGruul.sealed -text
res/sealed/GtcGuildOrzhov.sealed -text
res/sealed/GtcGuildSimic.sealed -text
res/sealed/RtRGuildAzorius.sealed -text
res/sealed/RtRGuildGolgari.sealed -text
res/sealed/RtRGuildIzzet.sealed -text
res/sealed/RtRGuildRakdos.sealed -text
res/sealed/RtRGuildSelesnya.sealed -text
res/sealed/juzamjedi.sealed -text res/sealed/juzamjedi.sealed -text
res/skins/dark_ascension/bg_match.jpg -text res/skins/dark_ascension/bg_match.jpg -text
res/skins/dark_ascension/bg_splash.png -text res/skins/dark_ascension/bg_splash.png -text

View File

@@ -45,6 +45,6 @@ Innistrad, 3/6/ISD, ISD DKA
Avacyn Restored, 3/6/AVR, AVR Avacyn Restored, 3/6/AVR, AVR
Magic 2013, 3/6/M13, M13 Magic 2013, 3/6/M13, M13
Return to Ravnica, 3/6/RTR, RTR GTC DGM Return to Ravnica, 3/6/RTR, RTR GTC DGM
Return to Ravnica Guild Sealed, -/6/RTR, RTR RTR RTR Meta-Choose(Cube(RtRGuildAzorius)Azorius Guild;Cube(RtRGuildIzzet)Izzet Guild;Cube(RtRGuildRakdos)Rakdos Guild;Cube(RtRGuildGolgari)Golgari Guild;Cube(RtRGuildSelesnya)Selesnya Guild)GUILD Return to Ravnica Guild Sealed, -/6/RTR, RTR RTR RTR Meta-Choose(S(RTR Prerelease Azorius Guild)Azorius guild;S(RTR Prerelease Selesnya Guild)Selesnya guild;S(RTR Prerelease Izzet Guild)Izzet guild;S(RTR Prerelease Rakdos Guild)Rakdos guild;S(RTR Prerelease Golgari Guild)Golgari guild)Guild
Gatecrash Guild Sealed, -/6/RTR, GTC GTC GTC Meta-Choose(Cube(GtcGuildBoros)Boros Guild;Cube(GtcGuildDimir)Dimir Guild;Cube(GtcGuildGruul)Gruul Guild;Cube(GtcGuildOrzhov)Orzhov Guild;Cube(GtcGuildSimic)Simic Guild)GUILD Gatecrash Guild Sealed, -/6/RTR, GTC GTC GTC Meta-Choose(S(GTC Prerelease Orzhov Guild)Orzhov guild;S(GTC Prerelease Boros Guild)Boros guild;S(GTC Prerelease Dimir Guild)Dimir guild;S(GTC Prerelease Simic Guild)Simic guild;S(GTC Prerelease Gruul Guild)Gruul guild)Guild
#Dragon's Maze Race Sealed, -/6/RTR, DGM DGM DGM ?<GuildPack> <RandomRelatedGuildPack2>? Dragon's Maze Race, -/5/RTR, DGM DGM DGM Meta-Choose(All(S(RTR Azorius Guild);Random(S(GTC Orzhov Guild);S(GTC Boros Guild);S(GTC Simic Guild);S(GTC Dimir Guild)))Azorius guild and a secret ally;All(S(RTR Selesnya Guild);Random(S(GTC Gruul Guild);S(GTC Orzhov Guild);S(GTC Boros Guild);S(GTC Simic Guild)))Selesnya guild and a secret ally;All(S(RTR Izzet Guild);Random(S(GTC Gruul Guild);S(GTC Dimir Guild);S(GTC Simic Guild);S(GTC Boros Guild)))Izzet guild and a secret ally;All(S(RTR Rakdos Guild);Random(S(GTC Orzhov Guild);S(GTC Dimir Guild);S(GTC Gruul Guild);S(GTC Boros Guild)))Rakdos guild and a secret ally;All(S(RTR Golgari Guild);Random(S(GTC Orzhov Guild);S(GTC Dimir Guild);S(GTC Simic Guild);S(GTC Gruul Guild)))Golgari guild and a secret ally;All(S(GTC Orzhov Guild);Random(S(RTR Azorius Guild);S(RTR Golgari Guild);S(RTR Selesnya Guild);S(RTR Rakdos Guild)))Orzhov guild and a secret ally;All(S(GTC Boros Guild);Random(S(RTR Azorius Guild);S(RTR Rakdos Guild);S(RTR Selesnya Guild);S(RTR Izzet Guild)))Boros guild and a secret ally;All(S(GTC Dimir Guild);Random(S(RTR Azorius Guild);S(RTR Izzet Guild);S(RTR Rakdos Guild);S(RTR Golgari Guild)))Dimir guild and a secret ally;All(S(GTC Simic Guild);Random(S(RTR Azorius Guild);S(RTR Golgari Guild);S(RTR Izzet Guild);S(RTR Selesnya Guild)))Simic guild and a secret ally;All(S(GTC Gruul Guild);Random(S(RTR Golgari Guild);S(RTR Izzet Guild);S(RTR Rakdos Guild);S(RTR Selesnya Guild)))Gruul guild and a secret ally)Guild

View File

@@ -1,24 +1,23 @@
#Boosters for prerelease events of RTR #Prerelease boosters
GTC Prerelease Boros Guild: 10 Common:printsheet("GTC Boros Guild"), 3 Uncommon:printsheet("GTC Boros Guild"), 1 RareMythic:printsheet("GTC Boros Guild"), 2 promo("Boros Guildgate|GTC","Foundry Champion|GTC") RTR Prerelease Azorius Guild: 10 Common:fromSheet("RTR Azorius Guild"), 3 Uncommon:fromSheet("RTR Azorius Guild"), 1 RareMythic:fromSheet("RTR Azorius Guild"), 2 promo("Azorius GuildGate|RTR","Archon of the Triumvirate|RTR")
GTC Prerelease Dimir Guild: 10 Common:printsheet("GTC Dimir Guild"), 3 Uncommon:printsheet("GTC Dimir Guild"), 1 RareMythic:printsheet("GTC Dimir Guild"), 2 promo("Dimir Guildgate|GTC","Consuming Aberration|GTC") GTC Prerelease Orzhov Guild: 10 Common:fromSheet("GTC Orzhov Guild"), 3 Uncommon:fromSheet("GTC Orzhov Guild"), 1 RareMythic:fromSheet("GTC Orzhov Guild"), 2 promo("Orzhov GuildGate|GTC","Treasury Thrull|GTC")
GTC Prerelease Gruul Guild: 10 Common:printsheet("GTC Gruul Guild"), 3 Uncommon:printsheet("GTC Gruul Guild"), 1 RareMythic:printsheet("GTC Gruul Guild"), 2 promo("Gruul Guildgate|GTC","Rubblehulk|GTC") GTC Prerelease Boros Guild: 10 Common:fromSheet("GTC Boros Guild"), 3 Uncommon:fromSheet("GTC Boros Guild"), 1 RareMythic:fromSheet("GTC Boros Guild"), 2 promo("Boros GuildGate|GTC","Foundry Champion|GTC")
GTC Prerelease Orzhov Guild: 10 Common:printsheet("GTC Orzhov Guild"), 3 Uncommon:printsheet("GTC Orzhov Guild"), 1 RareMythic:printsheet("GTC Orzhov Guild"), 2 promo("Orzhov Guildgate|GTC","Treasury Thrull|GTC") RTR Prerelease Selesnya Guild: 10 Common:fromSheet("RTR Selesnya Guild"), 3 Uncommon:fromSheet("RTR Selesnya Guild"), 1 RareMythic:fromSheet("RTR Selesnya Guild"), 2 promo("Selesnya GuildGate|RTR","Grove of the Guardian|RTR")
GTC Prerelease Simic Guild: 10 Common:printsheet("GTC Simic Guild"), 3 Uncommon:printsheet("GTC Simic Guild"), 1 RareMythic:printsheet("GTC Simic Guild"), 2 promo("Simic Guildgate|GTC","Fathom Mage|GTC") GTC Prerelease Dimir Guild: 10 Common:fromSheet("GTC Dimir Guild"), 3 Uncommon:fromSheet("GTC Dimir Guild"), 1 RareMythic:fromSheet("GTC Dimir Guild"), 2 promo("Dimir GuildGate|GTC","Consuming Aberration|GTC")
RTR Prerelease Izzet Guild: 10 Common:fromSheet("RTR Izzet Guild"), 3 Uncommon:fromSheet("RTR Izzet Guild"), 1 RareMythic:fromSheet("RTR Izzet Guild"), 2 promo("Izzet GuildGate|RTR","Hypersonic Dragon|RTR")
GTC Prerelease Simic Guild: 10 Common:fromSheet("GTC Simic Guild"), 3 Uncommon:fromSheet("GTC Simic Guild"), 1 RareMythic:fromSheet("GTC Simic Guild"), 2 promo("Simic GuildGate|GTC","Fathom Mage|GTC")
RTR Prerelease Rakdos Guild: 10 Common:fromSheet("RTR Rakdos Guild"), 3 Uncommon:fromSheet("RTR Rakdos Guild"), 1 RareMythic:fromSheet("RTR Rakdos Guild"), 2 promo("Rakdos GuildGate|RTR","Carnival Hellsteed|RTR")
RTR Prerelease Golgari Guild: 10 Common:fromSheet("RTR Golgari Guild"), 3 Uncommon:fromSheet("RTR Golgari Guild"), 1 RareMythic:fromSheet("RTR Golgari Guild"), 2 promo("Golgari GuildGate|RTR","Corpsejack Menace|RTR")
GTC Prerelease Gruul Guild: 10 Common:fromSheet("GTC Gruul Guild"), 3 Uncommon:fromSheet("GTC Gruul Guild"), 1 RareMythic:fromSheet("GTC Gruul Guild"), 2 promo("Gruul GuildGate|GTC","Rubblehulk|GTC")
RTR Prerelease Azorius Guild: 10 Common:printsheet("RTR Azorius Guild"), 3 Uncommon:printsheet("RTR Azorius Guild"), 1 RareMythic:printsheet("RTR Azorius Guild"), 2 promo("Azorius Guildgate|RTR","Archon of the Triumvirate|RTR") #Boosters for DGM event
RTR Prerelease Golgari Guild: 10 Common:printsheet("RTR Golgari Guild"), 3 Uncommon:printsheet("RTR Golgari Guild"), 1 RareMythic:printsheet("RTR Golgari Guild"), 2 promo("Golgari Guildgate|RTR","Corpsejack Menace|RTR") RTR Azorius Guild: 10 Common:fromSheet("RTR Azorius Guild"), 3 Uncommon:fromSheet("RTR Azorius Guild"), 1 RareMythic:fromSheet("RTR Azorius Guild"), 1 promo("Azorius GuildGate|RTR")
RTR Prerelease Izzet Guild: 10 Common:printsheet("RTR Izzet Guild"), 3 Uncommon:printsheet("RTR Izzet Guild"), 1 RareMythic:printsheet("RTR Izzet Guild"), 2 promo("Izzet Guildgate|RTR","Hypersonic Dragon|RTR") GTC Orzhov Guild: 10 Common:fromSheet("GTC Orzhov Guild"), 3 Uncommon:fromSheet("GTC Orzhov Guild"), 1 RareMythic:fromSheet("GTC Orzhov Guild"), 1 promo("Orzhov GuildGate|GTC")
RTR Prerelease Rakdos Guild: 10 Common:printsheet("RTR Rakdos Guild"), 3 Uncommon:printsheet("RTR Rakdos Guild"), 1 RareMythic:printsheet("RTR Rakdos Guild"), 2 promo("Rakdos Guildgate|RTR","Carnival Hellsteed|RTR") GTC Boros Guild: 10 Common:fromSheet("GTC Boros Guild"), 3 Uncommon:fromSheet("GTC Boros Guild"), 1 RareMythic:fromSheet("GTC Boros Guild"), 1 promo("Boros GuildGate|GTC")
RTR Prerelease Selesnya Guild: 10 Common:printsheet("RTR Selesnya Guild"), 3 Uncommon:printsheet("RTR Selesnya Guild"), 1 RareMythic:printsheet("RTR Selesnya Guild"), 2 promo("Selesnya Guildgate|RTR","Grove of the Guardian|RTR") RTR Selesnya Guild: 10 Common:fromSheet("RTR Selesnya Guild"), 3 Uncommon:fromSheet("RTR Selesnya Guild"), 1 RareMythic:fromSheet("RTR Selesnya Guild"), 1 promo("Selesnya GuildGate|RTR")
GTC Dimir Guild: 10 Common:fromSheet("GTC Dimir Guild"), 3 Uncommon:fromSheet("GTC Dimir Guild"), 1 RareMythic:fromSheet("GTC Dimir Guild"), 1 promo("Dimir GuildGate|GTC")
#Same boosters without a promo (used for DGM maze race) RTR Izzet Guild: 10 Common:fromSheet("RTR Izzet Guild"), 3 Uncommon:fromSheet("RTR Izzet Guild"), 1 RareMythic:fromSheet("RTR Izzet Guild"), 1 promo("Izzet GuildGate|RTR")
GTC Boros Guild: 10 Common:printsheet("GTC Boros Guild"), 3 Uncommon:printsheet("GTC Boros Guild"), 1 RareMythic:printsheet("GTC Boros Guild"), 1 promo("Boros Guildgate|GTC") GTC Simic Guild: 10 Common:fromSheet("GTC Simic Guild"), 3 Uncommon:fromSheet("GTC Simic Guild"), 1 RareMythic:fromSheet("GTC Simic Guild"), 1 promo("Simic GuildGate|GTC")
GTC Dimir Guild: 10 Common:printsheet("GTC Dimir Guild"), 3 Uncommon:printsheet("GTC Dimir Guild"), 1 RareMythic:printsheet("GTC Dimir Guild"), 1 promo("Dimir Guildgate|GTC") RTR Rakdos Guild: 10 Common:fromSheet("RTR Rakdos Guild"), 3 Uncommon:fromSheet("RTR Rakdos Guild"), 1 RareMythic:fromSheet("RTR Rakdos Guild"), 1 promo("Rakdos GuildGate|RTR")
GTC Gruul Guild: 10 Common:printsheet("GTC Gruul Guild"), 3 Uncommon:printsheet("GTC Gruul Guild"), 1 RareMythic:printsheet("GTC Gruul Guild"), 1 promo("Gruul Guildgate|GTC") RTR Golgari Guild: 10 Common:fromSheet("RTR Golgari Guild"), 3 Uncommon:fromSheet("RTR Golgari Guild"), 1 RareMythic:fromSheet("RTR Golgari Guild"), 1 promo("Golgari GuildGate|RTR")
GTC Orzhov Guild: 10 Common:printsheet("GTC Orzhov Guild"), 3 Uncommon:printsheet("GTC Orzhov Guild"), 1 RareMythic:printsheet("GTC Orzhov Guild"), 1 promo("Orzhov Guildgate|GTC") GTC Gruul Guild: 10 Common:fromSheet("GTC Gruul Guild"), 3 Uncommon:fromSheet("GTC Gruul Guild"), 1 RareMythic:fromSheet("GTC Gruul Guild"), 1 promo("Gruul GuildGate|GTC")
GTC Simic Guild: 10 Common:printsheet("GTC Simic Guild"), 3 Uncommon:printsheet("GTC Simic Guild"), 1 RareMythic:printsheet("GTC Simic Guild"), 1 promo("Simic Guildgate|GTC")
RTR Azorius Guild: 10 Common:printsheet("RTR Azorius Guild"), 3 Uncommon:printsheet("RTR Azorius Guild"), 1 RareMythic:printsheet("RTR Azorius Guild"), 1 promo("Azorius Guildgate|RTR")
RTR Golgari Guild: 10 Common:printsheet("RTR Golgari Guild"), 3 Uncommon:printsheet("RTR Golgari Guild"), 1 RareMythic:printsheet("RTR Golgari Guild"), 1 promo("Golgari Guildgate|RTR")
RTR Izzet Guild: 10 Common:printsheet("RTR Izzet Guild"), 3 Uncommon:printsheet("RTR Izzet Guild"), 1 RareMythic:printsheet("RTR Izzet Guild"), 1 promo("Izzet Guildgate|RTR")
RTR Rakdos Guild: 10 Common:printsheet("RTR Rakdos Guild"), 3 Uncommon:printsheet("RTR Rakdos Guild"), 1 RareMythic:printsheet("RTR Rakdos Guild"), 1 promo("Rakdos Guildgate|RTR")
RTR Selesnya Guild: 10 Common:printsheet("RTR Selesnya Guild"), 3 Uncommon:printsheet("RTR Selesnya Guild"), 1 RareMythic:printsheet("RTR Selesnya Guild"), 1 promo("Selesnya Guildgate|RTR")

View File

@@ -20,9 +20,9 @@ CFX: 3 covers, 10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand ALA
CHK: 5 covers, 11 Common, 3 Uncommon, 1 Rare CHK: 5 covers, 11 Common, 3 Uncommon, 1 Rare
CHR: 1 covers, 9 Common, 3 UncommonRare CHR: 1 covers, 9 Common, 3 UncommonRare
CSP: 3 covers, 11 Common, 3 Uncommon, 1 Rare CSP: 3 covers, 11 Common, 3 Uncommon, 1 Rare
DGM: 3 covers, 10 Common:!land, 3 Uncommon, 1 RareMythic:!land, 1 Custom("Dragon's Maze Lands") DGM: 3 covers, 10 Common:!land, 3 Uncommon, 1 RareMythic:!land, 1 fromSheet("DGM Lands")
DIS: 3 covers, 11 Common, 3 Uncommon, 1 Rare DIS: 3 covers, 11 Common, 3 Uncommon, 1 Rare
DKA: 3 covers, 9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 Any:dfc, 1 BasicLand ISD DKA: 3 covers, 9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 dfc, 1 BasicLand ISD
DRK: 1 covers, 6 Common, 2 UncommonRare DRK: 1 covers, 6 Common, 2 UncommonRare
DST: 3 covers, 11 Common, 3 Uncommon, 1 Rare DST: 3 covers, 11 Common, 3 Uncommon, 1 Rare
EVE: 3 covers, 11 Common, 3 Uncommon, 1 Rare EVE: 3 covers, 11 Common, 3 Uncommon, 1 Rare
@@ -34,7 +34,7 @@ GTC: 5 covers, 10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand RTR
HML: 1 covers, 6 Common, 2 UncommonRare HML: 1 covers, 6 Common, 2 UncommonRare
ICE: 5 covers, 11 Common, 3 Uncommon, 1 Rare ICE: 5 covers, 11 Common, 3 Uncommon, 1 Rare
INV: 3 covers, 11 Common, 3 Uncommon, 1 Rare INV: 3 covers, 11 Common, 3 Uncommon, 1 Rare
ISD: 5 covers, 9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 Any:dfc, 1 BasicLand ISD: 5 covers, 9 Common:!dfc, 3 Uncommon:!dfc, 1 RareMythic:!dfc, 1 dfc, 1 BasicLand
JUD: 1 covers, 11 Common, 3 Uncommon, 1 Rare JUD: 1 covers, 11 Common, 3 Uncommon, 1 Rare
LEA: 1 covers, 11 Common, 3 Uncommon, 1 Rare LEA: 1 covers, 11 Common, 3 Uncommon, 1 Rare
LEB: 1 covers, 11 Common, 3 Uncommon, 1 Rare LEB: 1 covers, 11 Common, 3 Uncommon, 1 Rare

View File

@@ -1,59 +0,0 @@
[metadata]
Name=GtcGuildBoros
[Main]
1 Act of Treason|GTC
1 Aerial Maneuver|GTC
1 Angelic Edict|GTC
1 Arrows of Justice|GTC
1 Assault Griffin|GTC
1 Assemble the Legion|GTC
1 Aurelia, the Warleader|GTC
1 Bomber Corps|GTC
1 Boros Charm|GTC
1 Boros Elite|GTC
1 Boros Keyrune|GTC
1 Boros Reckoner|GTC
1 Cinder Elemental|GTC
1 Court Street Denizen|GTC
1 Crackling Perimeter|GTC
1 Daring Skyjek|GTC
1 Debtor's Pulpit|GTC
1 Ember Beast|GTC
1 Firefist Striker|GTC
1 Firemane Avenger|GTC
1 Fortress Cyclops|GTC
1 Foundry Street Denizen|GTC
1 Frontline Medic|GTC
1 Furious Resistance|GTC
1 Guardian of the Gateless|GTC
1 Guildscorn Ward|GTC
1 Hellraiser Goblin|GTC
1 Homing Lightning|GTC
1 Knight Watch|GTC
1 Legion Loyalist|GTC
1 Madcap Skills|GTC
1 Mark for Death|GTC
1 Martial Glory|GTC
1 Massive Raid|GTC
1 Molten Primordial|GTC
1 Mugging|GTC
1 Murder Investigation|GTC
1 Nav Squad Commandos|GTC
1 Ordruun Veteran|GTC
1 Righteous Charge|GTC
1 Ripscale Predator|GTC
1 Shattering Blow|GTC
1 Shielded Passage|GTC
1 Skullcrack|GTC
1 Skyknight Legionnaire|GTC
1 Smite|GTC
1 Spark Trooper|GTC
1 Structural Collapse|GTC
1 Sunhome Guildmage|GTC
1 Tin Street Market|GTC
1 Towering Thunderfist|GTC
1 Truefire Paladin|GTC
1 Urbis Protector|GTC
1 Warmind Infantry|GTC
1 Wojek Halberdiers|GTC
1 Zarichi Tiger|GTC

View File

@@ -1,59 +0,0 @@
[metadata]
Name=GtcGuildDimir
[Main]
1 AEtherize|GTC
1 Agoraphobia|GTC
1 Balustrade Spy|GTC
1 Call of the Nightwing|GTC
1 Coerced Confession|GTC
1 Contaminated Ground|GTC
1 Corpse Blockade|GTC
1 Death's Approach|GTC
1 Deathcult Rogue|GTC
1 Dimir Charm|GTC
1 Dimir Keyrune|GTC
1 Dinrova Horror|GTC
1 Duskmantle Guildmage|GTC
1 Dying Wish|GTC
1 Gateway Shade|GTC
1 Gridlock|GTC
1 Grisly Spectacle|GTC
1 Gutter Skulk|GTC
1 Hands of Binding|GTC
1 Horror of the Dim|GTC
1 Illness in the Ranks|GTC
1 Incursion Specialist|GTC
1 Keymaster Rogue|GTC
1 Killing Glare|GTC
1 Last Thoughts|GTC
1 Lazav, Dimir Mastermind|GTC
1 Leyline Phantom|GTC
1 Mental Vapors|GTC
1 Metropolis Sprite|GTC
1 Midnight Recovery|GTC
1 Mind Grind|GTC
1 Mindeye Drake|GTC
1 Mortus Strider|GTC
1 Nightveil Specter|GTC
1 Paranoid Delusions|GTC
1 Psychic Strike|GTC
1 Rapid Hybridization|GTC
1 Sage's Row Denizen|GTC
1 Sapphire Drake|GTC
1 Scatter Arc|GTC
1 Sepulchral Primordial|GTC
1 Shadow Alley Denizen|GTC
1 Shadow Slice|GTC
1 Skygames|GTC
1 Slate Street Ruffian|GTC
1 Smog Elemental|GTC
1 Soul Ransom|GTC
1 Spell Rupture|GTC
1 Stolen Identity|GTC
1 Totally Lost|GTC
1 Undercity Informer|GTC
1 Undercity Plague|GTC
1 Voidwalk|GTC
1 Way of the Thief|GTC
1 Whispering Madness|GTC
1 Wight of Precinct Six|GTC

View File

@@ -1,60 +0,0 @@
[metadata]
Name=GtcGuildGruul
[Main]
1 Act of Treason|GTC
1 Alpha Authority|GTC
1 Borborygmos Enraged|GTC
1 Burning-Tree Emissary|GTC
1 Burst of Strength|GTC
1 Cinder Elemental|GTC
1 Clan Defiance|GTC
1 Crackling Perimeter|GTC
1 Crowned Ceratok|GTC
1 Disciple of the Old Ways|GTC
1 Ember Beast|GTC
1 Forced Adaptation|GTC
1 Foundry Street Denizen|GTC
1 Frenzied Tilling|GTC
1 Furious Resistance|GTC
1 Ghor-Clan Rampager|GTC
1 Greenside Watcher|GTC
1 Ground Assault|GTC
1 Gruul Charm|GTC
1 Gruul Keyrune|GTC
1 Gruul Ragebeast|GTC
1 Hellraiser Goblin|GTC
1 Hindervines|GTC
1 Homing Lightning|GTC
1 Ivy Lane Denizen|GTC
1 Madcap Skills|GTC
1 Mark for Death|GTC
1 Massive Raid|GTC
1 Miming Slime|GTC
1 Mugging|GTC
1 Naturalize|GTC
1 Pit Fight|GTC
1 Primal Visitation|GTC
1 Ripscale Predator|GTC
1 Rubblebelt Raiders|GTC
1 Ruination Wurm|GTC
1 Rust Scarab|GTC
1 Scab-Clan Charger|GTC
1 Scorchwalker|GTC
1 Serene Remembrance|GTC
1 Signal the Clans|GTC
1 Skarrg Goliath|GTC
1 Skarrg Guildmage|GTC
1 Skinbrand Goblin|GTC
1 Skullcrack|GTC
1 Slaughterhorn|GTC
1 Spire Tracer|GTC
1 Structural Collapse|GTC
1 Sylvan Primordial|GTC
1 Tin Street Market|GTC
1 Tower Defense|GTC
1 Verdant Haven|GTC
1 Viashino Shanktail|GTC
1 Wasteland Viper|GTC
1 Wildwood Rebirth|GTC
1 Wrecking Ogre|GTC
1 Zhur-Taa Swine|GTC

View File

@@ -1,58 +0,0 @@
[metadata]
Name=GtcGuildOrzhov
[Main]
1 Aerial Maneuver|GTC
1 Alms Beast|GTC
1 Angelic Edict|GTC
1 Assault Griffin|GTC
1 Balustrade Spy|GTC
1 Basilica Guards|GTC
1 Basilica Screecher|GTC
1 Beckon Apparition|GTC
1 Blind Obedience|GTC
1 Cartel Aristocrat|GTC
1 Contaminated Ground|GTC
1 Corpse Blockade|GTC
1 Court Street Denizen|GTC
1 Crypt Ghast|GTC
1 Death's Approach|GTC
1 Debtor's Pulpit|GTC
1 Dutiful Thrull|GTC
1 Dying Wish|GTC
1 Executioner's Swing|GTC
1 Gateway Shade|GTC
1 Gift of Orzhova|GTC
1 Grisly Spectacle|GTC
1 Guardian of the Gateless|GTC
1 Guildscorn Ward|GTC
1 Gutter Skulk|GTC
1 High Priest of Penance|GTC
1 Illness in the Ranks|GTC
1 Immortal Servitude|GTC
1 Killing Glare|GTC
1 Kingpin's Pet|GTC
1 Knight of Obligation|GTC
1 Knight Watch|GTC
1 Luminate Primordial|GTC
1 Merciless Eviction|GTC
1 Murder Investigation|GTC
1 Obzedat, Ghost Council|GTC
1 One Thousand Lashes|GTC
1 Orzhov Charm|GTC
1 Orzhov Keyrune|GTC
1 Purge the Profane|GTC
1 Righteous Charge|GTC
1 Shadow Alley Denizen|GTC
1 Shielded Passage|GTC
1 Slate Street Ruffian|GTC
1 Smite|GTC
1 Smog Elemental|GTC
1 Syndic of Tithes|GTC
1 Syndicate Enforcer|GTC
1 Thrull Parasite|GTC
1 Undercity Informer|GTC
1 Urbis Protector|GTC
1 Vizkopa Confessor|GTC
1 Vizkopa Guildmage|GTC
1 Wight of Precinct Six|GTC
1 Zarichi Tiger|GTC

View File

@@ -1,60 +0,0 @@
[metadata]
Name=GtcGuildSimic
[Main]
1 Adaptive Snapjaw|GTC
1 AEtherize|GTC
1 Agoraphobia|GTC
1 Alpha Authority|GTC
1 Biomass Mutation|GTC
1 Bioshift|GTC
1 Biovisionary|GTC
1 Burst of Strength|GTC
1 Clinging Anemones|GTC
1 Cloudfin Raptor|GTC
1 Crocanura|GTC
1 Crowned Ceratok|GTC
1 Diluvian Primordial|GTC
1 Drakewing Krasis|GTC
1 Elusive Krasis|GTC
1 Experiment One|GTC
1 Forced Adaptation|GTC
1 Frilled Oculus|GTC
1 Greenside Watcher|GTC
1 Gridlock|GTC
1 Gyre Sage|GTC
1 Hindervines|GTC
1 Hydroform|GTC
1 Incursion Specialist|GTC
1 Ivy Lane Denizen|GTC
1 Keymaster Rogue|GTC
1 Leyline Phantom|GTC
1 Merfolk of the Depths|GTC
1 Metropolis Sprite|GTC
1 Miming Slime|GTC
1 Mindeye Drake|GTC
1 Mystic Genesis|GTC
1 Naturalize|GTC
1 Nimbus Swimmer|GTC
1 Prime Speaker Zegana|GTC
1 Rapid Hybridization|GTC
1 Rust Scarab|GTC
1 Sage's Row Denizen|GTC
1 Sapphire Drake|GTC
1 Scatter Arc|GTC
1 Serene Remembrance|GTC
1 Shambleshark|GTC
1 Simic Charm|GTC
1 Simic Fluxmage|GTC
1 Simic Keyrune|GTC
1 Simic Manipulator|GTC
1 Skygames|GTC
1 Spell Rupture|GTC
1 Spire Tracer|GTC
1 Totally Lost|GTC
1 Tower Defense|GTC
1 Unexpected Results|GTC
1 Urban Evolution|GTC
1 Verdant Haven|GTC
1 Way of the Thief|GTC
1 Wildwood Rebirth|GTC
1 Zameck Guildmage|GTC

View File

@@ -1,71 +0,0 @@
[metadata]
Name=RtRGuildAzorius
[main]
1 Aquus Steed|RTR
1 Armory Guard|RTR
1 Arrest|RTR
1 Avenging Arrow|RTR
1 Azor's Elocutors|RTR
1 Azorius Arrester|RTR
1 Azorius Charm|RTR
1 Azorius Justiciar|RTR
1 Azorius Keyrune|RTR
1 Bazaar Krovod|RTR
1 Cancel|RTR
1 Chronic Flooding|RTR
1 Civic Saber|RTR
1 Codex Shredder|RTR
1 Concordia Pegasus|RTR
1 Conjured Currency|RTR
1 Crosstown Courier|RTR
1 Detention Sphere|RTR
1 Dispel|RTR
1 Doorkeeper|RTR
1 Dramatic Rescue|RTR
1 Ethereal Armor|RTR
1 Faerie Impostor|RTR
1 Fall of the Gavel|RTR
1 Fencing Ace|RTR
1 Hallowed Fountain|RTR
1 Hover Barrier|RTR
1 Hussar Patrol|RTR
1 Inaction Injunction|RTR
1 Inspiration|RTR
1 Isperia's Skywatch|RTR
1 Isperia, Supreme Judge|RTR
1 Judge's Familiar|RTR
1 Keening Apparition|RTR
1 Knightly Valor|RTR
1 Lyev Skyknight|RTR
1 Martial Law|RTR
1 New Prahv Guildmage|RTR
1 Palisade Giant|RTR
1 Paralyzing Grasp|RTR
1 Phantom General|RTR
1 Precinct Captain|RTR
1 Psychic Spiral|RTR
1 Rest in Peace|RTR
1 Righteous Authority|RTR
1 Runewing|RTR
1 Search the City|RTR
1 Search Warrant|RTR
1 Security Blockade|RTR
1 Seller of Songbirds|RTR
1 Skyline Predator|RTR
1 Skymark Roc|RTR
1 Soul Tithe|RTR
1 Soulsworn Spirit|RTR
1 Sphere of Safety|RTR
1 Sphinx of the Chimes|RTR
1 Stealer of Secrets|RTR
1 Street Sweeper|RTR
1 Sunspire Griffin|RTR
1 Supreme Verdict|RTR
1 Swift Justice|RTR
1 Syncopate|RTR
1 Tablet of the Guilds|RTR
1 Tower Drake|RTR
1 Trained Caracal|RTR
1 Vassal Soul|RTR
1 Voidwielder|RTR
[sideboard]

View File

@@ -1,73 +0,0 @@
[metadata]
Name=RtRGuildGolgari
[main]
1 Abrupt Decay|RTR
1 Aerial Predation|RTR
1 Archweaver|RTR
1 Assassin's Strike|RTR
1 Axebane Guardian|RTR
1 Axebane Stag|RTR
1 Brushstrider|RTR
1 Catacomb Slug|RTR
1 Centaur's Herald|RTR
1 Chorus of Might|RTR
1 Civic Saber|RTR
1 Codex Shredder|RTR
1 Cremate|RTR
1 Daggerdrome Imp|RTR
1 Dark Revenant|RTR
1 Deadbridge Goliath|RTR
1 Death's Presence|RTR
1 Deathrite Shaman|RTR
1 Desecration Demon|RTR
1 Destroy the Evidence|RTR
1 Drainpipe Vermin|RTR
1 Dreg Mangler|RTR
1 Drudge Beetle|RTR
1 Gatecreeper Vine|RTR
1 Giant Growth|RTR
1 Gobbling Ooze|RTR
1 Golgari Charm|RTR
1 Golgari Decoy|RTR
1 Golgari Keyrune|RTR
1 Golgari Longlegs|RTR
1 Grave Betrayal|RTR
1 Grisly Salvage|RTR
1 Jarad's Orders|RTR
1 Jarad, Golgari Lich Lord|RTR
1 Korozda Guildmage|RTR
1 Korozda Monitor|RTR
1 Launch Party|RTR
1 Lotleth Troll|RTR
1 Mana Bloom|RTR
1 Mind Rot|RTR
1 Oak Street Innkeeper|RTR
1 Ogre Jailbreaker|RTR
1 Overgrown Tomb|RTR
1 Pack Rat|RTR
1 Perilous Shadow|RTR
1 Rites of Reaping|RTR
1 Rubbleback Rhino|RTR
1 Savage Surge|RTR
1 Seek the Horizon|RTR
1 Sewer Shambler|RTR
1 Shrieking Affliction|RTR
1 Slime Molding|RTR
1 Slitherhead|RTR
1 Sluiceway Scorpion|RTR
1 Slum Reaper|RTR
1 Stab Wound|RTR
1 Stonefare Crocodile|RTR
1 Street Sweeper|RTR
1 Tablet of the Guilds|RTR
1 Tavern Swindler|RTR
1 Terrus Wurm|RTR
1 Towering Indrik|RTR
1 Treasured Find|RTR
1 Trestle Troll|RTR
1 Ultimate Price|RTR
1 Underworld Connections|RTR
1 Urban Burgeoning|RTR
1 Wild Beastmaster|RTR
1 Zanikev Locust|RTR
[sideboard]

View File

@@ -1,71 +0,0 @@
[metadata]
Name=RtRGuildIzzet
[main]
1 Annihilating Fire|RTR
1 Aquus Steed|RTR
1 Ash Zealot|RTR
1 Batterhorn|RTR
1 Bellows Lizard|RTR
1 Blistercoil Weird|RTR
1 Blustersquall|RTR
1 Cancel|RTR
1 Chemister's Trick|RTR
1 Chronic Flooding|RTR
1 Civic Saber|RTR
1 Cobblebrute|RTR
1 Codex Shredder|RTR
1 Conjured Currency|RTR
1 Counterflux|RTR
1 Crosstown Courier|RTR
1 Cyclonic Rift|RTR
1 Dispel|RTR
1 Doorkeeper|RTR
1 Downsize|RTR
1 Dynacharge|RTR
1 Electrickery|RTR
1 Essence Backlash|RTR
1 Explosive Impact|RTR
1 Faerie Impostor|RTR
1 Firemind's Foresight|RTR
1 Frostburn Weird|RTR
1 Goblin Electromancer|RTR
1 Goblin Rally|RTR
1 Guild Feud|RTR
1 Guttersnipe|RTR
1 Hover Barrier|RTR
1 Inspiration|RTR
1 Izzet Charm|RTR
1 Izzet Keyrune|RTR
1 Izzet Staticaster|RTR
1 Lobber Crew|RTR
1 Mercurial Chemister|RTR
1 Minotaur Aggressor|RTR
1 Mizzium Mortars|RTR
1 Mizzium Skin|RTR
1 Niv-Mizzet, Dracogenius|RTR
1 Nivix Guildmage|RTR
1 Nivmagus Elemental|RTR
1 Paralyzing Grasp|RTR
1 Psychic Spiral|RTR
1 Pursuit of Flight|RTR
1 Pyroconvergence|RTR
1 Racecourse Fury|RTR
1 Runewing|RTR
1 Search the City|RTR
1 Skyline Predator|RTR
1 Sphinx of the Chimes|RTR
1 Stealer of Secrets|RTR
1 Steam Vents|RTR
1 Street Spasm|RTR
1 Street Sweeper|RTR
1 Survey the Wreckage|RTR
1 Syncopate|RTR
1 Tablet of the Guilds|RTR
1 Teleportal|RTR
1 Tenement Crasher|RTR
1 Thoughtflare|RTR
1 Traitorous Instinct|RTR
1 Vandalblast|RTR
1 Viashino Racketeer|RTR
1 Voidwielder|RTR
[sideboard]

View File

@@ -1,70 +0,0 @@
[metadata]
Name=RtRGuildRakdos
[main]
1 Annihilating Fire|RTR
1 Ash Zealot|RTR
1 Assassin's Strike|RTR
1 Auger Spree|RTR
1 Batterhorn|RTR
1 Bellows Lizard|RTR
1 Blood Crypt|RTR
1 Bloodfray Giant|RTR
1 Catacomb Slug|RTR
1 Chaos Imps|RTR
1 Civic Saber|RTR
1 Cobblebrute|RTR
1 Codex Shredder|RTR
1 Cremate|RTR
1 Cryptborn Horror|RTR
1 Daggerdrome Imp|RTR
1 Dark Revenant|RTR
1 Dead Reveler|RTR
1 Desecration Demon|RTR
1 Destroy the Evidence|RTR
1 Deviant Glee|RTR
1 Drainpipe Vermin|RTR
1 Dreadbore|RTR
1 Explosive Impact|RTR
1 Goblin Rally|RTR
1 Gore-House Chainwalker|RTR
1 Grave Betrayal|RTR
1 Grim Roustabout|RTR
1 Guild Feud|RTR
1 Guttersnipe|RTR
1 Havoc Festival|RTR
1 Hellhole Flailer|RTR
1 Launch Party|RTR
1 Lobber Crew|RTR
1 Mind Rot|RTR
1 Minotaur Aggressor|RTR
1 Ogre Jailbreaker|RTR
1 Pack Rat|RTR
1 Perilous Shadow|RTR
1 Pyroconvergence|RTR
1 Racecourse Fury|RTR
1 Rakdos Cackler|RTR
1 Rakdos Charm|RTR
1 Rakdos Keyrune|RTR
1 Rakdos Ragemutt|RTR
1 Rakdos Ringleader|RTR
1 Rakdos Shred-Freak|RTR
1 Rakdos, Lord of Riots|RTR
1 Rix Maadi Guildmage|RTR
1 Shrieking Affliction|RTR
1 Skull Rend|RTR
1 Slaughter Games|RTR
1 Slum Reaper|RTR
1 Spawn of Rix Maadi|RTR
1 Splatter Thug|RTR
1 Stab Wound|RTR
1 Street Sweeper|RTR
1 Survey the Wreckage|RTR
1 Tablet of the Guilds|RTR
1 Tavern Swindler|RTR
1 Tenement Crasher|RTR
1 Thrill-Kill Assassin|RTR
1 Traitorous Instinct|RTR
1 Ultimate Price|RTR
1 Underworld Connections|RTR
1 Viashino Racketeer|RTR
[sideboard]

View File

@@ -1,71 +0,0 @@
[metadata]
Name=RtRGuildSelesnya
[main]
1 Aerial Predation|RTR
1 Archweaver|RTR
1 Armory Guard|RTR
1 Arrest|RTR
1 Avenging Arrow|RTR
1 Axebane Guardian|RTR
1 Axebane Stag|RTR
1 Bazaar Krovod|RTR
1 Brushstrider|RTR
1 Call of the Conclave|RTR
1 Centaur Healer|RTR
1 Centaur's Herald|RTR
1 Chorus of Might|RTR
1 Civic Saber|RTR
1 Codex Shredder|RTR
1 Collective Blessing|RTR
1 Common Bond|RTR
1 Concordia Pegasus|RTR
1 Coursers' Accord|RTR
1 Death's Presence|RTR
1 Druid's Deliverance|RTR
1 Dryad Militant|RTR
1 Ethereal Armor|RTR
1 Eyes in the Skies|RTR
1 Fencing Ace|RTR
1 Gatecreeper Vine|RTR
1 Giant Growth|RTR
1 Gobbling Ooze|RTR
1 Growing Ranks|RTR
1 Heroes' Reunion|RTR
1 Horncaller's Chant|RTR
1 Keening Apparition|RTR
1 Knightly Valor|RTR
1 Loxodon Smiter|RTR
1 Mana Bloom|RTR
1 Oak Street Innkeeper|RTR
1 Palisade Giant|RTR
1 Phantom General|RTR
1 Precinct Captain|RTR
1 Rest in Peace|RTR
1 Risen Sanctuary|RTR
1 Rootborn Defenses|RTR
1 Rubbleback Rhino|RTR
1 Savage Surge|RTR
1 Security Blockade|RTR
1 Seek the Horizon|RTR
1 Selesnya Charm|RTR
1 Selesnya Keyrune|RTR
1 Selesnya Sentry|RTR
1 Seller of Songbirds|RTR
1 Slime Molding|RTR
1 Soul Tithe|RTR
1 Sphere of Safety|RTR
1 Street Sweeper|RTR
1 Sundering Growth|RTR
1 Sunspire Griffin|RTR
1 Swift Justice|RTR
1 Tablet of the Guilds|RTR
1 Temple Garden|RTR
1 Towering Indrik|RTR
1 Trained Caracal|RTR
1 Trostani's Judgment|RTR
1 Trostani, Selesnya's Voice|RTR
1 Urban Burgeoning|RTR
1 Vitu-Ghazi Guildmage|RTR
1 Wayfaring Temple|RTR
1 Wild Beastmaster|RTR
[sideboard]

View File

@@ -1,7 +0,0 @@
Name:GtcGuildBoros
DeckFile:GtcGuildBoros
IgnoreRarity:False
LandSetCode:M13
Booster:10 Common, 3 Uncommon, 1 RareMythic, 2 promo("Boros Guildgate|GTC","Foundry Champion|GTC")
NumPacks:1

View File

@@ -1,7 +0,0 @@
Name:GtcGuildDimir
DeckFile:GtcGuildDimir
IgnoreRarity:False
LandSetCode:M13
Booster:10 Common, 3 Uncommon, 1 RareMythic, 2 promo("Dimir Guildgate|GTC","Consuming Aberration|GTC")
NumPacks:1

View File

@@ -1,7 +0,0 @@
Name:GtcGuildGruul
DeckFile:GtcGuildGruul
IgnoreRarity:False
LandSetCode:M13
Booster:10 Common, 3 Uncommon, 1 RareMythic, 2 promo("Gruul Guildgate|GTC","Rubblehulk|GTC")
NumPacks:1

View File

@@ -1,6 +0,0 @@
Name:GtcGuildOrzhov
DeckFile:GtcGuildOrzhov
LandSetCode:M13
Booster:10 Common, 3 Uncommon, 1 RareMythic, 2 promo("Orzhov Guildgate|GTC","Treasury Thrull|GTC")
NumPacks:1

View File

@@ -1,7 +0,0 @@
Name:GtcGuildSimic
DeckFile:GtcGuildSimic
IgnoreRarity:False
LandSetCode:M13
Booster:10 Common, 3 Uncommon, 1 RareMythic, 2 promo("Simic Guildgate|GTC","Fathom Mage|GTC")
NumPacks:1

View File

@@ -1,7 +0,0 @@
Name:RtRGuildAzorius
DeckFile:RtRGuildAzorius
IgnoreRarity:False
LandSetCode:M13
Booster:10 Common, 3 Uncommon, 1 RareMythic, 2 promo("Azorius Guildgate|RTR","Archon of the Triumvirate|RTR")
NumPacks:1

View File

@@ -1,7 +0,0 @@
Name:RtRGuildGolgari
DeckFile:RtRGuildGolgari
IgnoreRarity:False
LandSetCode:M13
Booster:10 Common, 3 Uncommon, 1 RareMythic, 2 promo("Golgari Guildgate|RTR","Corpsejack Menace|RTR")
NumPacks:1

View File

@@ -1,7 +0,0 @@
Name:RtRGuildIzzet
DeckFile:RtRGuildIzzet
IgnoreRarity:False
LandSetCode:M13
Booster:10 Common, 3 Uncommon, 1 RareMythic, 2 promo("Izzet Guildgate|RTR","Hypersonic Dragon|RTR")
NumPacks:1

View File

@@ -1,7 +0,0 @@
Name:RtRGuildRakdos
DeckFile:RtRGuildRakdos
IgnoreRarity:False
LandSetCode:M13
Booster:10 Common, 3 Uncommon, 1 RareMythic, 2 promo("Rakdos Guildgate|RTR","Corpsejack Menace|RTR")
NumPacks:1

View File

@@ -1,7 +0,0 @@
Name:RtRGuildSelesnya
DeckFile:RtRGuildSelesnya
IgnoreRarity:False
LandSetCode:M13
Booster:10 Common, 3 Uncommon, 1 RareMythic, 2 promo("Selesnya Guildgate|RTR","Grove of the Guardian|RTR")
NumPacks:1

View File

@@ -18,6 +18,9 @@
package forge.card; package forge.card;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
@@ -48,6 +51,7 @@ import forge.util.TextUtil;
*/ */
public class BoosterGenerator { public class BoosterGenerator {
private static final String LAND = "Land";
public static final String ANY = "Any"; public static final String ANY = "Any";
public static final String COMMON = "Common"; public static final String COMMON = "Common";
public static final String UNCOMMON = "Uncommon"; public static final String UNCOMMON = "Uncommon";
@@ -73,7 +77,8 @@ public class BoosterGenerator {
int numCards = slot.getRight().intValue(); int numCards = slot.getRight().intValue();
String[] sType = TextUtil.splitWithParenthesis(slotType, ' ', '(', ')'); String[] sType = TextUtil.splitWithParenthesis(slotType, ' ', '(', ')');
String sheetKey = sType.length == 1 && booster.getEdition() != null ? slotType.trim() + " " + booster.getEdition() : slotType.trim(); String setCode = sType.length == 1 && booster.getEdition() != null ? booster.getEdition() : null;
String sheetKey = Singletons.getModel().getEditions().contains(setCode) ? slotType.trim() + " " + setCode: slotType.trim();
PrintSheet ps = getPrintSheet(sheetKey); PrintSheet ps = getPrintSheet(sheetKey);
result.addAll(ps.random(numCards, true)); result.addAll(ps.random(numCards, true));
@@ -85,37 +90,43 @@ public class BoosterGenerator {
public static final PrintSheet makeSheet(String sheetKey, Iterable<CardPrinted> src) { public static final PrintSheet makeSheet(String sheetKey, Iterable<CardPrinted> src) {
PrintSheet ps = new PrintSheet(sheetKey); PrintSheet ps = new PrintSheet(sheetKey);
String[] sKey = TextUtil.splitWithParenthesis(sheetKey, ' ', '(', ')', 2); String[] sKey = TextUtil.splitWithParenthesis(sheetKey, ' ', '(', ')', 2);
String[] operators = TextUtil.splitWithParenthesis(sKey[0], ':', '(', ')');
Predicate<CardPrinted> extraPred = buildExtraPredicate(operators);
String mainCode = operators[0].trim();
if(mainCode.endsWith("s"))
mainCode = mainCode.substring(0, mainCode.length()-1);
Predicate<CardPrinted> setPred = (Predicate<CardPrinted>) (sKey.length > 1 ? IPaperCard.Predicates.printedInSets(sKey[1].split(" ")) : Predicates.alwaysTrue()); Predicate<CardPrinted> setPred = (Predicate<CardPrinted>) (sKey.length > 1 ? IPaperCard.Predicates.printedInSets(sKey[1].split(" ")) : Predicates.alwaysTrue());
// Pre-defined sheets: List<String> operators = new LinkedList<String>(Arrays.asList(TextUtil.splitWithParenthesis(sKey[0], ':', '(', ')')));
if (mainCode.startsWith("promo(")) { // get exactly the named cards, nevermind any restrictions Predicate<CardPrinted> extraPred = buildExtraPredicate(operators);
String list = StringUtils.strip(mainCode.substring(5), "() ");
String[] cardNames = TextUtil.splitWithParenthesis(list, ',', '"', '"');
for(String cardName: cardNames) {
ps.add(CardDb.instance().getCard(cardName));
}
} else if( mainCode.equalsIgnoreCase(ANY) ) { // no restriction on rarity // source replacement operators - if one is applied setPredicate will be ignored
Iterator<String> itMod = operators.iterator();
while(itMod.hasNext()) {
String mainCode = itMod.next();
if ( mainCode.regionMatches(true, 0, "fromSheet", 0, 9)) { // custom print sheet
String sheetName = StringUtils.strip(mainCode.substring(9), "()\" ");
src = Singletons.getModel().getPrintSheets().get(sheetName).toFlatList();
setPred = Predicates.alwaysTrue();
} else if (mainCode.startsWith("promo")) { // get exactly the named cards, that's a tiny inlined print sheet
String list = StringUtils.strip(mainCode.substring(5), "() ");
String[] cardNames = TextUtil.splitWithParenthesis(list, ',', '"', '"');
List<CardPrinted> srcList = new ArrayList<CardPrinted>();
for(String cardName: cardNames)
srcList.add(CardDb.instance().getCard(cardName));
src = srcList;
setPred = Predicates.alwaysTrue();
} else
continue;
itMod.remove();
}
// only special operators should remain by now - the ones that could not be turned into one predicate
String mainCode = operators.isEmpty() ? null : operators.get(0).trim();
if( null == mainCode || mainCode.equalsIgnoreCase(ANY) ) { // no restriction on rarity
Predicate<CardPrinted> predicate = Predicates.and(setPred, extraPred); Predicate<CardPrinted> predicate = Predicates.and(setPred, extraPred);
ps.addAll(Iterables.filter(src, predicate)); ps.addAll(Iterables.filter(src, predicate));
} else if( mainCode.equalsIgnoreCase(COMMON) ) {
Predicate<CardPrinted> predicate = Predicates.and(setPred, IPaperCard.Predicates.Presets.IS_COMMON, extraPred);
ps.addAll(Iterables.filter(src, predicate));
} else if ( mainCode.equalsIgnoreCase(UNCOMMON) ) {
Predicate<CardPrinted> predicate = Predicates.and(setPred, IPaperCard.Predicates.Presets.IS_UNCOMMON, extraPred);
ps.addAll(Iterables.filter(src, predicate));
} else if ( mainCode.equalsIgnoreCase(UNCOMMON_RARE) ) { // for sets like ARN, where U1 cards are considered rare and U3 are uncommon } else if ( mainCode.equalsIgnoreCase(UNCOMMON_RARE) ) { // for sets like ARN, where U1 cards are considered rare and U3 are uncommon
Predicate<CardPrinted> predicateRares = Predicates.and(setPred, IPaperCard.Predicates.Presets.IS_RARE, extraPred); Predicate<CardPrinted> predicateRares = Predicates.and(setPred, IPaperCard.Predicates.Presets.IS_RARE, extraPred);
ps.addAll(Iterables.filter(src, predicateRares)); ps.addAll(Iterables.filter(src, predicateRares));
@@ -131,53 +142,40 @@ public class BoosterGenerator {
Predicate<CardPrinted> predicateRare = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_RARE, extraPred); Predicate<CardPrinted> predicateRare = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_RARE, extraPred);
ps.addAll(Iterables.filter(src, predicateRare), 2); ps.addAll(Iterables.filter(src, predicateRare), 2);
} else
} else if ( mainCode.equalsIgnoreCase(RARE) ) { throw new IllegalArgumentException("Booster generator: operator could not be parsed - " + mainCode);
Predicate<CardPrinted> predicateRare = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_RARE, extraPred);
ps.addAll(Iterables.filter(src, predicateRare));
} else if ( mainCode.equalsIgnoreCase(MYTHIC) ) {
Predicate<CardPrinted> predicateMythic = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_MYTHIC_RARE, extraPred);
ps.addAll(Iterables.filter(src, predicateMythic));
} else if ( mainCode.equalsIgnoreCase(BASIC_LAND) ) {
Predicate<CardPrinted> predicateLand = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_BASIC_LAND, extraPred );
ps.addAll(Iterables.filter(src, predicateLand));
} else if ( mainCode.equalsIgnoreCase(TIME_SHIFTED) ) {
Predicate<CardPrinted> predicate = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_SPECIAL, extraPred );
ps.addAll(Iterables.filter(src, predicate));
} else if ( mainCode.startsWith("Custom(") || mainCode.startsWith("custom(") ) {
String sheetName = StringUtils.strip(mainCode.substring(6), "()\" ");
return Singletons.getModel().getPrintSheets().get(sheetName);
}
return ps; return ps;
} }
/** /**
* TODO: Write javadoc for this method. * This method also modifies passed parameter
* @param operators
* @return
*/ */
private static Predicate<CardPrinted> buildExtraPredicate(String[] operators) { private static Predicate<CardPrinted> buildExtraPredicate(List<String> operators) {
if ( operators.length <= 1)
return Predicates.alwaysTrue();
List<Predicate<CardPrinted>> conditions = new ArrayList<Predicate<CardPrinted>>(); List<Predicate<CardPrinted>> conditions = new ArrayList<Predicate<CardPrinted>>();
for(int i = 1; i < operators.length; i++) {
String operator = operators[i]; Iterator<String> itOp = operators.iterator();
if(StringUtils.isEmpty(operator)) while(itOp.hasNext()) {
String operator = itOp.next();
if(StringUtils.isEmpty(operator)) {
itOp.remove();
continue; continue;
}
if(operator.endsWith("s"))
operator = operator.substring(0, operator.length()-1);
boolean invert = operator.charAt(0) == '!'; boolean invert = operator.charAt(0) == '!';
if( invert ) operator = operator.substring(1); if( invert ) operator = operator.substring(1);
Predicate<CardPrinted> toAdd = null; Predicate<CardPrinted> toAdd = null;
if( operator.equals("dfc") ) { if( operator.equalsIgnoreCase("dfc") ) { toAdd = Predicates.compose(CardRulesPredicates.splitType(CardSplitType.Transform), CardPrinted.FN_GET_RULES);
toAdd = Predicates.compose(CardRulesPredicates.splitType(CardSplitType.Transform), CardPrinted.FN_GET_RULES); } else if ( operator.equalsIgnoreCase(LAND) ) { toAdd = Predicates.compose(CardRulesPredicates.Presets.IS_LAND, CardPrinted.FN_GET_RULES);
} else if( operator.equals("land") ) { } else if ( operator.equalsIgnoreCase(BASIC_LAND)) { toAdd = IPaperCard.Predicates.Presets.IS_BASIC_LAND;
toAdd = Predicates.compose(CardRulesPredicates.Presets.IS_LAND, CardPrinted.FN_GET_RULES); } else if ( operator.equalsIgnoreCase(TIME_SHIFTED)) { toAdd = IPaperCard.Predicates.Presets.IS_SPECIAL;
} else if ( operator.equalsIgnoreCase(MYTHIC)) { toAdd = IPaperCard.Predicates.Presets.IS_MYTHIC_RARE;
} else if ( operator.equalsIgnoreCase(RARE)) { toAdd = IPaperCard.Predicates.Presets.IS_RARE;
} else if ( operator.equalsIgnoreCase(UNCOMMON)) { toAdd = IPaperCard.Predicates.Presets.IS_UNCOMMON;
} else if ( operator.equalsIgnoreCase(COMMON)) { toAdd = IPaperCard.Predicates.Presets.IS_COMMON;
} else if ( operator.startsWith("name(") ) { } else if ( operator.startsWith("name(") ) {
operator = StringUtils.strip(operator.substring(4), "() "); operator = StringUtils.strip(operator.substring(4), "() ");
String[] cardNames = TextUtil.splitWithParenthesis(operator, ',', '"', '"'); String[] cardNames = TextUtil.splitWithParenthesis(operator, ',', '"', '"');
@@ -185,12 +183,16 @@ public class BoosterGenerator {
} }
if(toAdd == null) if(toAdd == null)
throw new IllegalArgumentException("Booster generator: operator could not be parsed - " + operator); continue;
else
itOp.remove();
if( invert ) if( invert )
toAdd = Predicates.not(toAdd); toAdd = Predicates.not(toAdd);
conditions.add(toAdd); conditions.add(toAdd);
} }
if( conditions.isEmpty() )
return Predicates.alwaysTrue();
return Predicates.and(conditions); return Predicates.and(conditions);
} }

View File

@@ -6,7 +6,6 @@ import java.util.List;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import com.google.common.base.Function;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.util.TextUtil; import forge.util.TextUtil;
@@ -22,11 +21,9 @@ public class BoosterTemplate extends SealedProductTemplate {
private final int foilRate = 68; private final int foilRate = 68;
private final int artIndices; private final int artIndices;
private final String edition;
private BoosterTemplate(String edition0, int artIndices0, Iterable<Pair<String, Integer>> itrSlots) { private BoosterTemplate(String edition, int artIndices0, Iterable<Pair<String, Integer>> itrSlots) {
super(itrSlots); super(edition, itrSlots);
this.edition = edition0;
artIndices = artIndices0; artIndices = artIndices0;
} }
@@ -38,8 +35,6 @@ public class BoosterTemplate extends SealedProductTemplate {
return artIndices; return artIndices;
} }
@Override
public final String getEdition() { return edition; }
@Override @Override
public String toString() { public String toString() {
@@ -63,17 +58,9 @@ public class BoosterTemplate extends SealedProductTemplate {
return s.toString(); return s.toString();
} }
public static final Function<? super BoosterTemplate, String> FN_GET_CODE = new Function<BoosterTemplate, String>() {
@Override
public String apply(BoosterTemplate arg1) {
return arg1.edition;
}
};
public static final class Reader extends StorageReaderFile<BoosterTemplate> { public static final class Reader extends StorageReaderFile<BoosterTemplate> {
public Reader(String pathname) { public Reader(String pathname) {
super(pathname, BoosterTemplate.FN_GET_CODE); super(pathname, BoosterTemplate.FN_GET_NAME);
} }
@Override @Override

View File

@@ -284,12 +284,10 @@ public final class CardBlock implements Comparable<CardBlock> {
return metaSets.keySet(); return metaSets.keySet();
} }
public MetaSet getMetaSet(String key) { public MetaSet getMetaSet(String key) {
return metaSets.get(key); return metaSets.get(key);
} }
/** /**
* Tries to create a booster for the selected meta-set code. * Tries to create a booster for the selected meta-set code.
* *

View File

@@ -6,8 +6,6 @@ import java.util.List;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import com.google.common.base.Function;
import forge.util.TextUtil; import forge.util.TextUtil;
import forge.util.storage.StorageReaderFile; import forge.util.storage.StorageReaderFile;
@@ -17,29 +15,19 @@ import forge.util.storage.StorageReaderFile;
*/ */
public class FatPackTemplate extends SealedProductTemplate { public class FatPackTemplate extends SealedProductTemplate {
private final int cntBoosters; private final int cntBoosters;
private final String edition;
@Override
public String getEdition() { return edition; }
public int getCntBoosters() { return cntBoosters; } public int getCntBoosters() { return cntBoosters; }
public static final Function<? super FatPackTemplate, String> FN_GET_CODE = new Function<FatPackTemplate, String>() { private FatPackTemplate(String edition, int boosters, Iterable<Pair<String, Integer>> itrSlots)
@Override
public String apply(FatPackTemplate arg1) {
return arg1.edition;
}
};
private FatPackTemplate(String edition0, int boosters, Iterable<Pair<String, Integer>> itrSlots)
{ {
super(itrSlots); super(edition, itrSlots);
edition = edition0;
cntBoosters = boosters; cntBoosters = boosters;
} }
public static final class Reader extends StorageReaderFile<FatPackTemplate> { public static final class Reader extends StorageReaderFile<FatPackTemplate> {
public Reader(String pathname) { public Reader(String pathname) {
super(pathname, FatPackTemplate.FN_GET_CODE); super(pathname, FatPackTemplate.FN_GET_NAME);
} }
@Override @Override

View File

@@ -91,13 +91,30 @@ import forge.util.FileUtil;
public class MetaSet { public class MetaSet {
private enum MetaSetType { private enum MetaSetType {
Full, Full("F", "All cards"),
Cube, Cube("C", "Cube"),
JoinedSet, JoinedSet("J", "Joined set"),
Choose, Choose("Select", "Choose from list"),
Random, Combo("All", "Combined booster"),
Booster, Random("Any", "Randomly selected"),
Pack Booster("B", "Booster"),
SpecialBooster("S", "Special Booster"),
Pack("T", "Tournament/Starter");
private final String shortHand;
public final String descriptiveName;
private MetaSetType(String shortname, String descName) {
shortHand = shortname;
descriptiveName = descName;
}
public static MetaSetType smartValueOf(String trim) {
for(MetaSetType mt : MetaSetType.values()) {
if( mt.name().equalsIgnoreCase(trim) || mt.shortHand.equalsIgnoreCase(trim))
return mt;
}
throw new IllegalArgumentException(trim + " not recognized as Meta Set");
}
} }
private final MetaSetType type; private final MetaSetType type;
@@ -118,21 +135,10 @@ public class MetaSet {
int idxLastPar = creationString.lastIndexOf(')'); int idxLastPar = creationString.lastIndexOf(')');
draftable = canDraft; draftable = canDraft;
type = MetaSetType.valueOf(creationString.substring(0, idxFirstPar).trim()); type = MetaSetType.smartValueOf(creationString.substring(0, idxFirstPar).trim());
data = creationString.substring(idxFirstPar + 1, idxLastPar); data = creationString.substring(idxFirstPar + 1, idxLastPar);
String description = creationString.substring(idxLastPar + 1); String description = creationString.substring(idxLastPar + 1);
code = description + "\u00A0(" + type.descriptiveName + ")"; // u00A0 (nbsp) will not be equal to simple space
switch (type) {
case Cube: code = "*C:" + description; break;
case Full: code = "*FULL"; break;
case JoinedSet: code = "*B:" + description; break;
case Choose: code = "*!:" + description; break;
case Random: code = "*?:" + description; break;
case Booster: code = "*" + description; break;
case Pack: code = "*" + description + "(S)"; break;
default: throw new RuntimeException("Invalid MetaSet type: " + type);
}
} }
/** /**
@@ -160,6 +166,9 @@ public class MetaSet {
case Booster: case Booster:
return new UnOpenedProduct(Singletons.getModel().getBoosters().get(data)); return new UnOpenedProduct(Singletons.getModel().getBoosters().get(data));
case SpecialBooster:
return new UnOpenedProduct(Singletons.getModel().getSpecialBoosters().get(data));
case Pack: case Pack:
return new UnOpenedProduct(Singletons.getModel().getTournamentPacks().get(data)); return new UnOpenedProduct(Singletons.getModel().getTournamentPacks().get(data));
@@ -167,11 +176,9 @@ public class MetaSet {
Predicate<CardPrinted> predicate = IPaperCard.Predicates.printedInSets(data.split(" ")); Predicate<CardPrinted> predicate = IPaperCard.Predicates.printedInSets(data.split(" "));
return new UnOpenedProduct(BoosterTemplate.genericBooster, predicate); return new UnOpenedProduct(BoosterTemplate.genericBooster, predicate);
case Choose: case Choose: return UnOpenedMeta.choose(data);
return new UnOpenedMeta(data, true); case Random: return UnOpenedMeta.random(data);
case Combo: return UnOpenedMeta.selectAll(data);
case Random:
return new UnOpenedMeta(data, false);
case Cube: case Cube:
final File dFolder = new File("res/sealed/"); final File dFolder = new File("res/sealed/");
@@ -194,6 +201,11 @@ public class MetaSet {
} }
} }
@Override
public String toString() {
return code;
}
public boolean isDraftable() { public boolean isDraftable() {
return draftable; return draftable;
} }

View File

@@ -18,28 +18,40 @@
package forge.card; package forge.card;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import com.google.common.base.Function;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.util.TextUtil;
import forge.util.storage.StorageReaderFile;
public class SealedProductTemplate { public class SealedProductTemplate {
protected final List<Pair<String, Integer>> slots; protected final List<Pair<String, Integer>> slots;
protected final String name;
public final List<Pair<String, Integer>> getSlots() { public final List<Pair<String, Integer>> getSlots() {
return slots; return slots;
} }
public String getEdition() { public final String getEdition() {
return null; return name;
} }
public SealedProductTemplate(Iterable<Pair<String, Integer>> itrSlots) public SealedProductTemplate(Iterable<Pair<String, Integer>> itrSlots)
{
this(null, itrSlots);
}
public SealedProductTemplate(String name0, Iterable<Pair<String, Integer>> itrSlots)
{ {
slots = Lists.newArrayList(itrSlots); slots = Lists.newArrayList(itrSlots);
name = name0;
} }
public int getNumberOfCardsExpected() { public int getNumberOfCardsExpected() {
@@ -49,4 +61,32 @@ public class SealedProductTemplate {
} }
return sum; return sum;
} }
protected static final Function<? super SealedProductTemplate, String> FN_GET_NAME = new Function<SealedProductTemplate, String>() {
@Override
public String apply(SealedProductTemplate arg1) {
return arg1.name;
}
};
public static final class Reader extends StorageReaderFile<SealedProductTemplate> {
public Reader(String pathname) {
super(pathname, SealedProductTemplate.FN_GET_NAME);
}
@Override
protected SealedProductTemplate read(String line, int i) {
String[] headAndData = TextUtil.split(line, ':', 2);
final String edition = headAndData[0];
final String[] data = TextUtil.splitWithParenthesis(headAndData[1], ',', '(', ')');
List<Pair<String, Integer>> slots = new ArrayList<Pair<String,Integer>>();
for(String slotDesc : data) {
String[] kv = TextUtil.splitWithParenthesis(slotDesc, ' ', '(', ')', 2);
slots.add(ImmutablePair.of(kv[1], Integer.parseInt(kv[0])));
}
return new SealedProductTemplate(edition, slots);
}
}
} }

View File

@@ -25,6 +25,7 @@ import java.util.Random;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
import forge.item.CardPrinted; import forge.item.CardPrinted;
import forge.util.MyRandom; import forge.util.MyRandom;
import forge.util.TextUtil;
/** /**
* This type extends UnOpenedProduct to support booster choice or random boosters * This type extends UnOpenedProduct to support booster choice or random boosters
@@ -33,8 +34,14 @@ import forge.util.MyRandom;
public class UnOpenedMeta implements IUnOpenedProduct { public class UnOpenedMeta implements IUnOpenedProduct {
private enum JoinOperation {
RandomOne,
ChooseOne,
SelectAll,
}
private final ArrayList<MetaSet> metaSets; private final ArrayList<MetaSet> metaSets;
private final boolean canChoose; private final JoinOperation operation;
private final Random generator = MyRandom.getRandom(); private final Random generator = MyRandom.getRandom();
/** /**
@@ -44,12 +51,11 @@ public class UnOpenedMeta implements IUnOpenedProduct {
* @param choose * @param choose
* sets the random/choice status. * sets the random/choice status.
*/ */
public UnOpenedMeta(final String creationString, final boolean choose) { private UnOpenedMeta(final String creationString, final JoinOperation op) {
metaSets = new ArrayList<MetaSet>(); metaSets = new ArrayList<MetaSet>();
canChoose = choose; operation = op;
for(String m : TextUtil.splitWithParenthesis(creationString, ';', '(', ')')) {
for(String m : creationString.split(";")) {
metaSets.add(new MetaSet(m, true)); metaSets.add(new MetaSet(m, true));
} }
} }
@@ -72,41 +78,42 @@ public class UnOpenedMeta implements IUnOpenedProduct {
* known partialities for the AI. * known partialities for the AI.
* @return List, list of cards. * @return List, list of cards.
*/ */
public List<CardPrinted> open(final boolean isHuman) { public List<CardPrinted> open(final boolean isHuman) {
if (metaSets.size() < 1) { if (metaSets.isEmpty()) {
throw new RuntimeException("Empty UnOpenedMetaset, cannot generate booster."); throw new RuntimeException("Empty UnOpenedMetaset, cannot generate booster.");
} }
if (canChoose) { switch(operation) {
if (isHuman) { case ChooseOne:
final List<String> choices = new ArrayList<String>(); if (isHuman) {
final MetaSet ms = GuiChoose.one("Choose booster:", metaSets);
for (MetaSet meta : metaSets) { return ms.getBooster().get();
choices.add(meta.getCode());
}
final Object o = GuiChoose.one("Choose booster:", choices);
for (int i = 0; i < metaSets.size(); i++) {
if (o.toString().equals(metaSets.get(i).getCode())) {
final IUnOpenedProduct newBooster = metaSets.get(i).getBooster();
return newBooster.get();
}
} }
throw new RuntimeException("Could not find MetaSet " + o.toString()); case RandomOne: // AI should fall though here from the case above
}
else {
int selected = generator.nextInt(metaSets.size()); int selected = generator.nextInt(metaSets.size());
final IUnOpenedProduct newBooster = metaSets.get(selected).getBooster(); final IUnOpenedProduct newBooster = metaSets.get(selected).getBooster();
return newBooster.get(); return newBooster.get();
}
} case SelectAll:
else { List<CardPrinted> allCards = new ArrayList<CardPrinted>();
int selected = generator.nextInt(metaSets.size()); for (MetaSet ms : metaSets) {
final IUnOpenedProduct newBooster = metaSets.get(selected).getBooster(); allCards.addAll(ms.getBooster().get());
return newBooster.get(); }
return allCards;
} }
throw new IllegalStateException("Got wrong operation type in unopenedMeta - execution should never reach this point");
} }
public static UnOpenedMeta choose(String desc) {
return new UnOpenedMeta(desc, JoinOperation.ChooseOne);
}
public static UnOpenedMeta random(String desc) {
return new UnOpenedMeta(desc, JoinOperation.RandomOne);
}
public static UnOpenedMeta selectAll(String desc) {
return new UnOpenedMeta(desc, JoinOperation.SelectAll);
}
} }

View File

@@ -108,10 +108,9 @@ public class SealedCardPoolGenerator {
return; return;
for (String pz : TextUtil.split(p, ',')) { for (String pz : TextUtil.split(p, ',')) {
String pp = pz.trim(); String[] pps = TextUtil.splitWithParenthesis(pz.trim(), ' ' , '(', ')');
int idxSp = pp.indexOf(' '); String setCode = pps[pps.length - 1];
String setCode = idxSp > 0 ? pp.substring(idxSp+1) : pp; int nBoosters = pps.length > 1 ? Integer.parseInt(pps[0]) : 1;
int nBoosters = idxSp > 0 ? Integer.parseInt(pp.substring(0, idxSp)) : 1;
while(nBoosters-- > 0) while(nBoosters-- > 0)
this.product.add(block.getBooster(setCode)); this.product.add(block.getBooster(setCode));
} }
@@ -218,17 +217,25 @@ public class SealedCardPoolGenerator {
} }
} }
else if (nPacks == 5) { else if (nPacks == 5) {
if (sets.length >= 2) { if (sets.length == 1 || !sets[0].equals(sets[1]) ) {
setCombos.add(String.format("%s, %s, %s, %s, %s", sets[0], sets[0], sets[0], sets[0], sets[0])); setCombos.add(String.format("5 %s", sets[0]));
setCombos.add(String.format("%s, %s, %s, %s, %s", sets[1], sets[1], sets[0], sets[0], sets[0]));
} }
if (sets.length >= 3) {
setCombos.add(String.format("%s, %s, %s, %s, %s", sets[2], sets[2], sets[0], sets[0], sets[0])); if (sets.length >= 2 && !sets[0].equals(sets[1])) {
setCombos.add(String.format("%s, %s, %s, %s, %s", sets[2], sets[1], sets[0], sets[0], sets[0])); setCombos.add(String.format("3 %s, 2 %s", sets[0], sets[1]));
setCombos.add(String.format("%s, %s, %s, %s, %s", sets[2], sets[1], sets[1], sets[0], sets[0])); setCombos.add(String.format("2 %s, 3 %s", sets[0], sets[1]));
}
if (sets.length >= 3 && !sets[0].equals(sets[2])) {
setCombos.add(String.format("3 %s, 2 %s", sets[0], sets[2]));
setCombos.add(String.format("3 %s, %s, %s", sets[0], sets[1], sets[2]));
setCombos.add(String.format("2 %s, 2 %s, %s", sets[0], sets[1], sets[2]));
} }
if (sets.length >= 4) { if (sets.length >= 4) {
setCombos.add(String.format("%s, %s, %s, %s, %s", sets[3], sets[2], sets[1], sets[0], sets[0])); if( sets[1].equals(sets[2]) && sets[1].equals(sets[0])) {
setCombos.add(String.format("%s, 4 %s", sets[3], sets[0])); // for guild sealed
} else {
setCombos.add(String.format("%s, %s, %s, 2 %s", sets[3], sets[2], sets[1], sets[0]));
}
} }
if (sets.length >= 5) { if (sets.length >= 5) {
setCombos.add(String.format("%s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[1], sets[0])); setCombos.add(String.format("%s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[1], sets[0]));

View File

@@ -121,5 +121,9 @@ public class PrintSheet {
return cardsWithWeights.isEmpty(); return cardsWithWeights.isEmpty();
} }
public Iterable<CardPrinted> toFlatList() {
return cardsWithWeights.toFlatList();
}
} }

View File

@@ -34,6 +34,7 @@ import forge.card.CardRulesReader;
import forge.card.EditionCollection; import forge.card.EditionCollection;
import forge.card.FatPackTemplate; import forge.card.FatPackTemplate;
import forge.card.FormatCollection; import forge.card.FormatCollection;
import forge.card.SealedProductTemplate;
import forge.card.cardfactory.CardStorageReader; import forge.card.cardfactory.CardStorageReader;
import forge.deck.CardCollections; import forge.deck.CardCollections;
import forge.error.BugReporter; import forge.error.BugReporter;
@@ -85,6 +86,7 @@ public enum FModel {
private final EditionCollection editions; private final EditionCollection editions;
private final FormatCollection formats; private final FormatCollection formats;
private final IStorageView<BoosterTemplate> boosters; private final IStorageView<BoosterTemplate> boosters;
private final IStorageView<SealedProductTemplate> specialBoosters;
private final IStorageView<BoosterTemplate> tournaments; private final IStorageView<BoosterTemplate> tournaments;
private final IStorageView<FatPackTemplate> fatPacks; private final IStorageView<FatPackTemplate> fatPacks;
private final IStorageView<CardBlock> blocks; private final IStorageView<CardBlock> blocks;
@@ -147,6 +149,7 @@ public enum FModel {
this.editions = CardRulesReader.editions; // CardRules ctor cannot refer to FModel, since it is not yet build by that moment this.editions = CardRulesReader.editions; // CardRules ctor cannot refer to FModel, since it is not yet build by that moment
this.formats = new FormatCollection("res/blockdata/formats.txt"); this.formats = new FormatCollection("res/blockdata/formats.txt");
this.boosters = new StorageView<BoosterTemplate>(new BoosterTemplate.Reader("res/blockdata/boosters.txt")); this.boosters = new StorageView<BoosterTemplate>(new BoosterTemplate.Reader("res/blockdata/boosters.txt"));
this.specialBoosters = new StorageView<SealedProductTemplate>(new SealedProductTemplate.Reader("res/blockdata/boosters-special.txt"));
this.tournaments = new StorageView<BoosterTemplate>(new BoosterTemplate.Reader("res/blockdata/starters.txt")); this.tournaments = new StorageView<BoosterTemplate>(new BoosterTemplate.Reader("res/blockdata/starters.txt"));
this.fatPacks = new StorageView<FatPackTemplate>(new FatPackTemplate.Reader("res/blockdata/fatpacks.txt")); this.fatPacks = new StorageView<FatPackTemplate>(new FatPackTemplate.Reader("res/blockdata/fatpacks.txt"));
this.blocks = new StorageView<CardBlock>(new CardBlock.Reader("res/blockdata/blocks.txt", editions)); this.blocks = new StorageView<CardBlock>(new CardBlock.Reader("res/blockdata/blocks.txt", editions));
@@ -377,6 +380,10 @@ public enum FModel {
return boosters; return boosters;
} }
public final IStorageView<SealedProductTemplate> getSpecialBoosters() {
return specialBoosters;
}
public IStorageView<PrintSheet> getPrintSheets() { public IStorageView<PrintSheet> getPrintSheets() {
return printSheets; return printSheets;
} }

View File

@@ -87,7 +87,7 @@ public class StorageView<T> implements IStorageView<T> {
*/ */
@Override @Override
public boolean contains(String name) { public boolean contains(String name) {
return this.map.containsKey(name); return name == null ? false : this.map.containsKey(name);
} }
@Override @Override