From 1d7c8ea06927345c115b423f3b8b22fd37b5f282 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Tue, 7 May 2013 09:55:00 +0000 Subject: [PATCH] Dragon's maze Race - sealed event packs generation Converted all guild boosters to PrintSheet+booster-special --- .gitattributes | 10 -- res/blockdata/blocks.txt | 6 +- res/blockdata/boosters-special.txt | 45 +++--- res/blockdata/boosters.txt | 6 +- res/cube/GtcGuildBoros.dck | 59 -------- res/cube/GtcGuildDimir.dck | 59 -------- res/cube/GtcGuildGruul.dck | 60 -------- res/cube/GtcGuildOrzhov.dck | 58 -------- res/cube/GtcGuildSimic.dck | 60 -------- res/cube/RtRGuildAzorius.dck | 71 ---------- res/cube/RtRGuildGolgari.dck | 73 ---------- res/cube/RtRGuildIzzet.dck | 71 ---------- res/cube/RtRGuildRakdos.dck | 70 ---------- res/cube/RtRGuildSelesnya.dck | 71 ---------- res/sealed/GtcGuildBoros.sealed | 7 - res/sealed/GtcGuildDimir.sealed | 7 - res/sealed/GtcGuildGruul.sealed | 7 - res/sealed/GtcGuildOrzhov.sealed | 6 - res/sealed/GtcGuildSimic.sealed | 7 - res/sealed/RtRGuildAzorius.sealed | 7 - res/sealed/RtRGuildGolgari.sealed | 7 - res/sealed/RtRGuildIzzet.sealed | 7 - res/sealed/RtRGuildRakdos.sealed | 7 - res/sealed/RtRGuildSelesnya.sealed | 7 - .../java/forge/card/BoosterGenerator.java | 128 +++++++++--------- src/main/java/forge/card/BoosterTemplate.java | 21 +-- src/main/java/forge/card/CardBlock.java | 2 - src/main/java/forge/card/FatPackTemplate.java | 20 +-- src/main/java/forge/card/MetaSet.java | 62 +++++---- .../forge/card/SealedProductTemplate.java | 46 ++++++- src/main/java/forge/card/UnOpenedMeta.java | 69 +++++----- .../game/limited/SealedCardPoolGenerator.java | 31 +++-- src/main/java/forge/item/PrintSheet.java | 4 + src/main/java/forge/model/FModel.java | 7 + .../java/forge/util/storage/StorageView.java | 2 +- 35 files changed, 250 insertions(+), 930 deletions(-) delete mode 100644 res/cube/GtcGuildBoros.dck delete mode 100644 res/cube/GtcGuildDimir.dck delete mode 100644 res/cube/GtcGuildGruul.dck delete mode 100644 res/cube/GtcGuildOrzhov.dck delete mode 100644 res/cube/GtcGuildSimic.dck delete mode 100644 res/cube/RtRGuildAzorius.dck delete mode 100644 res/cube/RtRGuildGolgari.dck delete mode 100644 res/cube/RtRGuildIzzet.dck delete mode 100644 res/cube/RtRGuildRakdos.dck delete mode 100644 res/cube/RtRGuildSelesnya.dck delete mode 100644 res/sealed/GtcGuildBoros.sealed delete mode 100644 res/sealed/GtcGuildDimir.sealed delete mode 100644 res/sealed/GtcGuildGruul.sealed delete mode 100644 res/sealed/GtcGuildOrzhov.sealed delete mode 100644 res/sealed/GtcGuildSimic.sealed delete mode 100644 res/sealed/RtRGuildAzorius.sealed delete mode 100644 res/sealed/RtRGuildGolgari.sealed delete mode 100644 res/sealed/RtRGuildIzzet.sealed delete mode 100644 res/sealed/RtRGuildRakdos.sealed delete mode 100644 res/sealed/RtRGuildSelesnya.sealed diff --git a/.gitattributes b/.gitattributes index 865b8b543fe..6a168c4b1e8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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/worlds.txt -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/skins/dark_ascension/bg_match.jpg -text res/skins/dark_ascension/bg_splash.png -text diff --git a/res/blockdata/blocks.txt b/res/blockdata/blocks.txt index e8bc70e8b71..9b482520e9c 100644 --- a/res/blockdata/blocks.txt +++ b/res/blockdata/blocks.txt @@ -45,6 +45,6 @@ Innistrad, 3/6/ISD, ISD DKA Avacyn Restored, 3/6/AVR, AVR Magic 2013, 3/6/M13, M13 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 -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 -#Dragon's Maze Race Sealed, -/6/RTR, DGM DGM DGM ? ? \ No newline at end of file +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(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, -/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 \ No newline at end of file diff --git a/res/blockdata/boosters-special.txt b/res/blockdata/boosters-special.txt index 801adb494c5..a472adb3e9d 100644 --- a/res/blockdata/boosters-special.txt +++ b/res/blockdata/boosters-special.txt @@ -1,24 +1,23 @@ -#Boosters for prerelease events of RTR -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") -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 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 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") -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") +#Prerelease boosters +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 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 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") +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 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") -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 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") -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") -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") - -#Same boosters without a promo (used for DGM maze race) -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 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") -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") -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 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") +#Boosters for DGM event +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") +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") +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 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") +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 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") +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") +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 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") diff --git a/res/blockdata/boosters.txt b/res/blockdata/boosters.txt index eb1ed0d4001..d6be9de6a3e 100644 --- a/res/blockdata/boosters.txt +++ b/res/blockdata/boosters.txt @@ -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 CHR: 1 covers, 9 Common, 3 UncommonRare 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 -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 DST: 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 ICE: 5 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 LEA: 1 covers, 11 Common, 3 Uncommon, 1 Rare LEB: 1 covers, 11 Common, 3 Uncommon, 1 Rare diff --git a/res/cube/GtcGuildBoros.dck b/res/cube/GtcGuildBoros.dck deleted file mode 100644 index 59d6dc06e2d..00000000000 --- a/res/cube/GtcGuildBoros.dck +++ /dev/null @@ -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 diff --git a/res/cube/GtcGuildDimir.dck b/res/cube/GtcGuildDimir.dck deleted file mode 100644 index 732e5d36ab6..00000000000 --- a/res/cube/GtcGuildDimir.dck +++ /dev/null @@ -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 diff --git a/res/cube/GtcGuildGruul.dck b/res/cube/GtcGuildGruul.dck deleted file mode 100644 index 1ce597502e4..00000000000 --- a/res/cube/GtcGuildGruul.dck +++ /dev/null @@ -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 diff --git a/res/cube/GtcGuildOrzhov.dck b/res/cube/GtcGuildOrzhov.dck deleted file mode 100644 index 5dcfeaf02c6..00000000000 --- a/res/cube/GtcGuildOrzhov.dck +++ /dev/null @@ -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 diff --git a/res/cube/GtcGuildSimic.dck b/res/cube/GtcGuildSimic.dck deleted file mode 100644 index 07bcf2eaf4a..00000000000 --- a/res/cube/GtcGuildSimic.dck +++ /dev/null @@ -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 diff --git a/res/cube/RtRGuildAzorius.dck b/res/cube/RtRGuildAzorius.dck deleted file mode 100644 index 9edea4986b4..00000000000 --- a/res/cube/RtRGuildAzorius.dck +++ /dev/null @@ -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] diff --git a/res/cube/RtRGuildGolgari.dck b/res/cube/RtRGuildGolgari.dck deleted file mode 100644 index e3edbe77297..00000000000 --- a/res/cube/RtRGuildGolgari.dck +++ /dev/null @@ -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] diff --git a/res/cube/RtRGuildIzzet.dck b/res/cube/RtRGuildIzzet.dck deleted file mode 100644 index 68f93e62e6f..00000000000 --- a/res/cube/RtRGuildIzzet.dck +++ /dev/null @@ -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] diff --git a/res/cube/RtRGuildRakdos.dck b/res/cube/RtRGuildRakdos.dck deleted file mode 100644 index de1b0873978..00000000000 --- a/res/cube/RtRGuildRakdos.dck +++ /dev/null @@ -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] diff --git a/res/cube/RtRGuildSelesnya.dck b/res/cube/RtRGuildSelesnya.dck deleted file mode 100644 index f22a4f80adb..00000000000 --- a/res/cube/RtRGuildSelesnya.dck +++ /dev/null @@ -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] diff --git a/res/sealed/GtcGuildBoros.sealed b/res/sealed/GtcGuildBoros.sealed deleted file mode 100644 index 4d4ef06bc5c..00000000000 --- a/res/sealed/GtcGuildBoros.sealed +++ /dev/null @@ -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 diff --git a/res/sealed/GtcGuildDimir.sealed b/res/sealed/GtcGuildDimir.sealed deleted file mode 100644 index 165a402794c..00000000000 --- a/res/sealed/GtcGuildDimir.sealed +++ /dev/null @@ -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 diff --git a/res/sealed/GtcGuildGruul.sealed b/res/sealed/GtcGuildGruul.sealed deleted file mode 100644 index dd4c12c632e..00000000000 --- a/res/sealed/GtcGuildGruul.sealed +++ /dev/null @@ -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 diff --git a/res/sealed/GtcGuildOrzhov.sealed b/res/sealed/GtcGuildOrzhov.sealed deleted file mode 100644 index 2d17bc1a694..00000000000 --- a/res/sealed/GtcGuildOrzhov.sealed +++ /dev/null @@ -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 diff --git a/res/sealed/GtcGuildSimic.sealed b/res/sealed/GtcGuildSimic.sealed deleted file mode 100644 index a25e69e3b97..00000000000 --- a/res/sealed/GtcGuildSimic.sealed +++ /dev/null @@ -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 diff --git a/res/sealed/RtRGuildAzorius.sealed b/res/sealed/RtRGuildAzorius.sealed deleted file mode 100644 index 99856e6eef6..00000000000 --- a/res/sealed/RtRGuildAzorius.sealed +++ /dev/null @@ -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 diff --git a/res/sealed/RtRGuildGolgari.sealed b/res/sealed/RtRGuildGolgari.sealed deleted file mode 100644 index c3d84d69c04..00000000000 --- a/res/sealed/RtRGuildGolgari.sealed +++ /dev/null @@ -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 diff --git a/res/sealed/RtRGuildIzzet.sealed b/res/sealed/RtRGuildIzzet.sealed deleted file mode 100644 index 03e0ca951ee..00000000000 --- a/res/sealed/RtRGuildIzzet.sealed +++ /dev/null @@ -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 diff --git a/res/sealed/RtRGuildRakdos.sealed b/res/sealed/RtRGuildRakdos.sealed deleted file mode 100644 index 37c7cb12561..00000000000 --- a/res/sealed/RtRGuildRakdos.sealed +++ /dev/null @@ -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 \ No newline at end of file diff --git a/res/sealed/RtRGuildSelesnya.sealed b/res/sealed/RtRGuildSelesnya.sealed deleted file mode 100644 index 1fd14225377..00000000000 --- a/res/sealed/RtRGuildSelesnya.sealed +++ /dev/null @@ -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 \ No newline at end of file diff --git a/src/main/java/forge/card/BoosterGenerator.java b/src/main/java/forge/card/BoosterGenerator.java index 033eb69727d..d76135617ed 100644 --- a/src/main/java/forge/card/BoosterGenerator.java +++ b/src/main/java/forge/card/BoosterGenerator.java @@ -18,6 +18,9 @@ package forge.card; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -48,6 +51,7 @@ import forge.util.TextUtil; */ public class BoosterGenerator { + private static final String LAND = "Land"; public static final String ANY = "Any"; public static final String COMMON = "Common"; public static final String UNCOMMON = "Uncommon"; @@ -73,7 +77,8 @@ public class BoosterGenerator { int numCards = slot.getRight().intValue(); 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); result.addAll(ps.random(numCards, true)); @@ -85,40 +90,46 @@ public class BoosterGenerator { public static final PrintSheet makeSheet(String sheetKey, Iterable src) { PrintSheet ps = new PrintSheet(sheetKey); String[] sKey = TextUtil.splitWithParenthesis(sheetKey, ' ', '(', ')', 2); - - String[] operators = TextUtil.splitWithParenthesis(sKey[0], ':', '(', ')'); - Predicate extraPred = buildExtraPredicate(operators); - String mainCode = operators[0].trim(); - if(mainCode.endsWith("s")) - mainCode = mainCode.substring(0, mainCode.length()-1); - Predicate setPred = (Predicate) (sKey.length > 1 ? IPaperCard.Predicates.printedInSets(sKey[1].split(" ")) : Predicates.alwaysTrue()); - // Pre-defined sheets: - if (mainCode.startsWith("promo(")) { // get exactly the named cards, nevermind any restrictions - String list = StringUtils.strip(mainCode.substring(5), "() "); - String[] cardNames = TextUtil.splitWithParenthesis(list, ',', '"', '"'); - for(String cardName: cardNames) { - ps.add(CardDb.instance().getCard(cardName)); - } + List operators = new LinkedList(Arrays.asList(TextUtil.splitWithParenthesis(sKey[0], ':', '(', ')'))); + Predicate extraPred = buildExtraPredicate(operators); - } else if( mainCode.equalsIgnoreCase(ANY) ) { // no restriction on rarity + // source replacement operators - if one is applied setPredicate will be ignored + Iterator 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 srcList = new ArrayList(); + 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 predicate = Predicates.and(setPred, extraPred); ps.addAll(Iterables.filter(src, predicate)); - } else if( mainCode.equalsIgnoreCase(COMMON) ) { - Predicate predicate = Predicates.and(setPred, IPaperCard.Predicates.Presets.IS_COMMON, extraPred); - ps.addAll(Iterables.filter(src, predicate)); - - } else if ( mainCode.equalsIgnoreCase(UNCOMMON) ) { - Predicate 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 - Predicate predicateRares = Predicates.and(setPred, IPaperCard.Predicates.Presets.IS_RARE, extraPred); ps.addAll(Iterables.filter(src, predicateRares)); - + Predicate predicateUncommon = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_UNCOMMON, extraPred); ps.addAll(Iterables.filter(src, predicateUncommon), 3); @@ -128,56 +139,43 @@ public class BoosterGenerator { Predicate predicateMythic = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_MYTHIC_RARE, extraPred); ps.addAll(Iterables.filter(src, predicateMythic)); - + Predicate predicateRare = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_RARE, extraPred); ps.addAll(Iterables.filter(src, predicateRare), 2); - - } else if ( mainCode.equalsIgnoreCase(RARE) ) { - Predicate predicateRare = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_RARE, extraPred); - ps.addAll(Iterables.filter(src, predicateRare)); - - } else if ( mainCode.equalsIgnoreCase(MYTHIC) ) { - Predicate predicateMythic = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_MYTHIC_RARE, extraPred); - ps.addAll(Iterables.filter(src, predicateMythic)); - - } else if ( mainCode.equalsIgnoreCase(BASIC_LAND) ) { - Predicate predicateLand = Predicates.and( setPred, IPaperCard.Predicates.Presets.IS_BASIC_LAND, extraPred ); - ps.addAll(Iterables.filter(src, predicateLand)); - - } else if ( mainCode.equalsIgnoreCase(TIME_SHIFTED) ) { - Predicate 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); - } + } else + throw new IllegalArgumentException("Booster generator: operator could not be parsed - " + mainCode); return ps; } /** - * TODO: Write javadoc for this method. - * @param operators - * @return + * This method also modifies passed parameter */ - private static Predicate buildExtraPredicate(String[] operators) { - if ( operators.length <= 1) - return Predicates.alwaysTrue(); - + private static Predicate buildExtraPredicate(List operators) { List> conditions = new ArrayList>(); - for(int i = 1; i < operators.length; i++) { - String operator = operators[i]; - if(StringUtils.isEmpty(operator)) + + Iterator itOp = operators.iterator(); + while(itOp.hasNext()) { + String operator = itOp.next(); + if(StringUtils.isEmpty(operator)) { + itOp.remove(); continue; + } + + if(operator.endsWith("s")) + operator = operator.substring(0, operator.length()-1); boolean invert = operator.charAt(0) == '!'; if( invert ) operator = operator.substring(1); Predicate toAdd = null; - if( operator.equals("dfc") ) { - toAdd = Predicates.compose(CardRulesPredicates.splitType(CardSplitType.Transform), CardPrinted.FN_GET_RULES); - } else if( operator.equals("land") ) { - toAdd = Predicates.compose(CardRulesPredicates.Presets.IS_LAND, CardPrinted.FN_GET_RULES); + if( operator.equalsIgnoreCase("dfc") ) { 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.equalsIgnoreCase(BASIC_LAND)) { toAdd = IPaperCard.Predicates.Presets.IS_BASIC_LAND; + } 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(") ) { operator = StringUtils.strip(operator.substring(4), "() "); String[] cardNames = TextUtil.splitWithParenthesis(operator, ',', '"', '"'); @@ -185,12 +183,16 @@ public class BoosterGenerator { } if(toAdd == null) - throw new IllegalArgumentException("Booster generator: operator could not be parsed - " + operator); + continue; + else + itOp.remove(); if( invert ) toAdd = Predicates.not(toAdd); conditions.add(toAdd); } + if( conditions.isEmpty() ) + return Predicates.alwaysTrue(); return Predicates.and(conditions); } diff --git a/src/main/java/forge/card/BoosterTemplate.java b/src/main/java/forge/card/BoosterTemplate.java index 301650a504f..dce5bd1e218 100644 --- a/src/main/java/forge/card/BoosterTemplate.java +++ b/src/main/java/forge/card/BoosterTemplate.java @@ -6,7 +6,6 @@ import java.util.List; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import com.google.common.base.Function; import com.google.common.collect.Lists; import forge.util.TextUtil; @@ -22,11 +21,9 @@ public class BoosterTemplate extends SealedProductTemplate { private final int foilRate = 68; private final int artIndices; - private final String edition; - - private BoosterTemplate(String edition0, int artIndices0, Iterable> itrSlots) { - super(itrSlots); - this.edition = edition0; + + private BoosterTemplate(String edition, int artIndices0, Iterable> itrSlots) { + super(edition, itrSlots); artIndices = artIndices0; } @@ -38,8 +35,6 @@ public class BoosterTemplate extends SealedProductTemplate { return artIndices; } - @Override - public final String getEdition() { return edition; } @Override public String toString() { @@ -63,17 +58,9 @@ public class BoosterTemplate extends SealedProductTemplate { return s.toString(); } - public static final Function FN_GET_CODE = new Function() { - @Override - public String apply(BoosterTemplate arg1) { - return arg1.edition; - } - }; - - public static final class Reader extends StorageReaderFile { public Reader(String pathname) { - super(pathname, BoosterTemplate.FN_GET_CODE); + super(pathname, BoosterTemplate.FN_GET_NAME); } @Override diff --git a/src/main/java/forge/card/CardBlock.java b/src/main/java/forge/card/CardBlock.java index 44510d02f97..9b854b2ad02 100644 --- a/src/main/java/forge/card/CardBlock.java +++ b/src/main/java/forge/card/CardBlock.java @@ -284,12 +284,10 @@ public final class CardBlock implements Comparable { return metaSets.keySet(); } - public MetaSet getMetaSet(String key) { return metaSets.get(key); } - /** * Tries to create a booster for the selected meta-set code. * diff --git a/src/main/java/forge/card/FatPackTemplate.java b/src/main/java/forge/card/FatPackTemplate.java index dcefcd28d08..55d019ac50e 100644 --- a/src/main/java/forge/card/FatPackTemplate.java +++ b/src/main/java/forge/card/FatPackTemplate.java @@ -6,8 +6,6 @@ import java.util.List; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import com.google.common.base.Function; - import forge.util.TextUtil; import forge.util.storage.StorageReaderFile; @@ -17,29 +15,19 @@ import forge.util.storage.StorageReaderFile; */ public class FatPackTemplate extends SealedProductTemplate { private final int cntBoosters; - private final String edition; - @Override - public String getEdition() { return edition; } + public int getCntBoosters() { return cntBoosters; } - public static final Function FN_GET_CODE = new Function() { - @Override - public String apply(FatPackTemplate arg1) { - return arg1.edition; - } - }; - - private FatPackTemplate(String edition0, int boosters, Iterable> itrSlots) + private FatPackTemplate(String edition, int boosters, Iterable> itrSlots) { - super(itrSlots); - edition = edition0; + super(edition, itrSlots); cntBoosters = boosters; } public static final class Reader extends StorageReaderFile { public Reader(String pathname) { - super(pathname, FatPackTemplate.FN_GET_CODE); + super(pathname, FatPackTemplate.FN_GET_NAME); } @Override diff --git a/src/main/java/forge/card/MetaSet.java b/src/main/java/forge/card/MetaSet.java index c560a8e2e83..9478a174433 100644 --- a/src/main/java/forge/card/MetaSet.java +++ b/src/main/java/forge/card/MetaSet.java @@ -91,13 +91,30 @@ import forge.util.FileUtil; public class MetaSet { private enum MetaSetType { - Full, - Cube, - JoinedSet, - Choose, - Random, - Booster, - Pack + Full("F", "All cards"), + Cube("C", "Cube"), + JoinedSet("J", "Joined set"), + Choose("Select", "Choose from list"), + Combo("All", "Combined booster"), + Random("Any", "Randomly selected"), + 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; @@ -118,21 +135,10 @@ public class MetaSet { int idxLastPar = creationString.lastIndexOf(')'); draftable = canDraft; - type = MetaSetType.valueOf(creationString.substring(0, idxFirstPar).trim()); + type = MetaSetType.smartValueOf(creationString.substring(0, idxFirstPar).trim()); data = creationString.substring(idxFirstPar + 1, idxLastPar); String description = creationString.substring(idxLastPar + 1); - - 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); - } + code = description + "\u00A0(" + type.descriptiveName + ")"; // u00A0 (nbsp) will not be equal to simple space } /** @@ -160,6 +166,9 @@ public class MetaSet { case Booster: return new UnOpenedProduct(Singletons.getModel().getBoosters().get(data)); + case SpecialBooster: + return new UnOpenedProduct(Singletons.getModel().getSpecialBoosters().get(data)); + case Pack: return new UnOpenedProduct(Singletons.getModel().getTournamentPacks().get(data)); @@ -167,11 +176,9 @@ public class MetaSet { Predicate predicate = IPaperCard.Predicates.printedInSets(data.split(" ")); return new UnOpenedProduct(BoosterTemplate.genericBooster, predicate); - case Choose: - return new UnOpenedMeta(data, true); - - case Random: - return new UnOpenedMeta(data, false); + case Choose: return UnOpenedMeta.choose(data); + case Random: return UnOpenedMeta.random(data); + case Combo: return UnOpenedMeta.selectAll(data); case Cube: final File dFolder = new File("res/sealed/"); @@ -193,6 +200,11 @@ public class MetaSet { default: return null; } } + + @Override + public String toString() { + return code; + } public boolean isDraftable() { return draftable; diff --git a/src/main/java/forge/card/SealedProductTemplate.java b/src/main/java/forge/card/SealedProductTemplate.java index 34e98d1dede..ac1fdfff4a0 100644 --- a/src/main/java/forge/card/SealedProductTemplate.java +++ b/src/main/java/forge/card/SealedProductTemplate.java @@ -18,28 +18,40 @@ package forge.card; +import java.util.ArrayList; import java.util.List; +import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; +import com.google.common.base.Function; import com.google.common.collect.Lists; +import forge.util.TextUtil; +import forge.util.storage.StorageReaderFile; + public class SealedProductTemplate { protected final List> slots; + protected final String name; public final List> getSlots() { return slots; } - public String getEdition() { - return null; + public final String getEdition() { + return name; } - public SealedProductTemplate(Iterable> itrSlots) + { + this(null, itrSlots); + } + + public SealedProductTemplate(String name0, Iterable> itrSlots) { slots = Lists.newArrayList(itrSlots); + name = name0; } public int getNumberOfCardsExpected() { @@ -49,4 +61,32 @@ public class SealedProductTemplate { } return sum; } + + protected static final Function FN_GET_NAME = new Function() { + @Override + public String apply(SealedProductTemplate arg1) { + return arg1.name; + } + }; + + public static final class Reader extends StorageReaderFile { + 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> slots = new ArrayList>(); + 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); + } + } } diff --git a/src/main/java/forge/card/UnOpenedMeta.java b/src/main/java/forge/card/UnOpenedMeta.java index e35c46a86a1..ce6e5feead1 100644 --- a/src/main/java/forge/card/UnOpenedMeta.java +++ b/src/main/java/forge/card/UnOpenedMeta.java @@ -25,6 +25,7 @@ import java.util.Random; import forge.gui.GuiChoose; import forge.item.CardPrinted; import forge.util.MyRandom; +import forge.util.TextUtil; /** * This type extends UnOpenedProduct to support booster choice or random boosters @@ -33,8 +34,14 @@ import forge.util.MyRandom; public class UnOpenedMeta implements IUnOpenedProduct { + private enum JoinOperation { + RandomOne, + ChooseOne, + SelectAll, + } + private final ArrayList metaSets; - private final boolean canChoose; + private final JoinOperation operation; private final Random generator = MyRandom.getRandom(); /** @@ -44,12 +51,11 @@ public class UnOpenedMeta implements IUnOpenedProduct { * @param choose * sets the random/choice status. */ - public UnOpenedMeta(final String creationString, final boolean choose) { + private UnOpenedMeta(final String creationString, final JoinOperation op) { metaSets = new ArrayList(); - canChoose = choose; + operation = op; - - for(String m : creationString.split(";")) { + for(String m : TextUtil.splitWithParenthesis(creationString, ';', '(', ')')) { metaSets.add(new MetaSet(m, true)); } } @@ -72,41 +78,42 @@ public class UnOpenedMeta implements IUnOpenedProduct { * known partialities for the AI. * @return List, list of cards. */ - public List open(final boolean isHuman) { - if (metaSets.size() < 1) { + if (metaSets.isEmpty()) { throw new RuntimeException("Empty UnOpenedMetaset, cannot generate booster."); } - if (canChoose) { - if (isHuman) { - final List choices = new ArrayList(); - - for (MetaSet meta : metaSets) { - choices.add(meta.getCode()); + switch(operation) { + case ChooseOne: + if (isHuman) { + final MetaSet ms = GuiChoose.one("Choose booster:", metaSets); + return ms.getBooster().get(); } - 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()); - } - else { + + case RandomOne: // AI should fall though here from the case above int selected = generator.nextInt(metaSets.size()); final IUnOpenedProduct newBooster = metaSets.get(selected).getBooster(); return newBooster.get(); - } - } - else { - int selected = generator.nextInt(metaSets.size()); - final IUnOpenedProduct newBooster = metaSets.get(selected).getBooster(); - return newBooster.get(); + + case SelectAll: + List allCards = new ArrayList(); + for (MetaSet ms : metaSets) { + allCards.addAll(ms.getBooster().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); + } + } diff --git a/src/main/java/forge/game/limited/SealedCardPoolGenerator.java b/src/main/java/forge/game/limited/SealedCardPoolGenerator.java index 724ec3c8e68..db0768c9b4c 100644 --- a/src/main/java/forge/game/limited/SealedCardPoolGenerator.java +++ b/src/main/java/forge/game/limited/SealedCardPoolGenerator.java @@ -108,10 +108,9 @@ public class SealedCardPoolGenerator { return; for (String pz : TextUtil.split(p, ',')) { - String pp = pz.trim(); - int idxSp = pp.indexOf(' '); - String setCode = idxSp > 0 ? pp.substring(idxSp+1) : pp; - int nBoosters = idxSp > 0 ? Integer.parseInt(pp.substring(0, idxSp)) : 1; + String[] pps = TextUtil.splitWithParenthesis(pz.trim(), ' ' , '(', ')'); + String setCode = pps[pps.length - 1]; + int nBoosters = pps.length > 1 ? Integer.parseInt(pps[0]) : 1; while(nBoosters-- > 0) this.product.add(block.getBooster(setCode)); } @@ -218,17 +217,25 @@ public class SealedCardPoolGenerator { } } else if (nPacks == 5) { - if (sets.length >= 2) { - setCombos.add(String.format("%s, %s, %s, %s, %s", sets[0], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s, %s, %s, %s, %s", sets[1], sets[1], sets[0], sets[0], sets[0])); + if (sets.length == 1 || !sets[0].equals(sets[1]) ) { + setCombos.add(String.format("5 %s", 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])); - setCombos.add(String.format("%s, %s, %s, %s, %s", sets[2], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s, %s, %s, %s, %s", sets[2], sets[1], sets[1], sets[0], sets[0])); + + if (sets.length >= 2 && !sets[0].equals(sets[1])) { + setCombos.add(String.format("3 %s, 2 %s", sets[0], sets[1])); + 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) { - 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) { setCombos.add(String.format("%s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[1], sets[0])); diff --git a/src/main/java/forge/item/PrintSheet.java b/src/main/java/forge/item/PrintSheet.java index f9acaeea48d..abd785987f5 100644 --- a/src/main/java/forge/item/PrintSheet.java +++ b/src/main/java/forge/item/PrintSheet.java @@ -121,5 +121,9 @@ public class PrintSheet { return cardsWithWeights.isEmpty(); } + public Iterable toFlatList() { + return cardsWithWeights.toFlatList(); + } + } diff --git a/src/main/java/forge/model/FModel.java b/src/main/java/forge/model/FModel.java index 2c39f620ffa..5b834a9c35d 100644 --- a/src/main/java/forge/model/FModel.java +++ b/src/main/java/forge/model/FModel.java @@ -34,6 +34,7 @@ import forge.card.CardRulesReader; import forge.card.EditionCollection; import forge.card.FatPackTemplate; import forge.card.FormatCollection; +import forge.card.SealedProductTemplate; import forge.card.cardfactory.CardStorageReader; import forge.deck.CardCollections; import forge.error.BugReporter; @@ -85,6 +86,7 @@ public enum FModel { private final EditionCollection editions; private final FormatCollection formats; private final IStorageView boosters; + private final IStorageView specialBoosters; private final IStorageView tournaments; private final IStorageView fatPacks; private final IStorageView 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.formats = new FormatCollection("res/blockdata/formats.txt"); this.boosters = new StorageView(new BoosterTemplate.Reader("res/blockdata/boosters.txt")); + this.specialBoosters = new StorageView(new SealedProductTemplate.Reader("res/blockdata/boosters-special.txt")); this.tournaments = new StorageView(new BoosterTemplate.Reader("res/blockdata/starters.txt")); this.fatPacks = new StorageView(new FatPackTemplate.Reader("res/blockdata/fatpacks.txt")); this.blocks = new StorageView(new CardBlock.Reader("res/blockdata/blocks.txt", editions)); @@ -377,6 +380,10 @@ public enum FModel { return boosters; } + public final IStorageView getSpecialBoosters() { + return specialBoosters; + } + public IStorageView getPrintSheets() { return printSheets; } diff --git a/src/main/java/forge/util/storage/StorageView.java b/src/main/java/forge/util/storage/StorageView.java index 5206c08f1a2..754f74131f9 100644 --- a/src/main/java/forge/util/storage/StorageView.java +++ b/src/main/java/forge/util/storage/StorageView.java @@ -87,7 +87,7 @@ public class StorageView implements IStorageView { */ @Override public boolean contains(String name) { - return this.map.containsKey(name); + return name == null ? false : this.map.containsKey(name); } @Override