From df7e51094caf8d439cbe757d804cea9f1180a839 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Thu, 25 Apr 2013 12:40:17 +0000 Subject: [PATCH] Changes to RTR/GTC guild sealed: now there's only 1 guild booster, both promos are inside. File format for cubes adjusted --- .gitattributes | 11 +- res/blockdata/blocks.txt | 103 ++++---- res/blockdata/fantasyblocks.txt | 58 ++--- res/cube/GtcPromoBoros.dck | 5 - res/cube/GtcPromoDimir.dck | 5 - res/cube/GtcPromoGruul.dck | 5 - res/cube/GtcPromoOrzhov.dck | 5 - res/cube/GtcPromoSimic.dck | 5 - res/cube/RtRPromoAzorius.dck | 6 - res/cube/RtRPromoGolgari.dck | 6 - res/cube/RtRPromoIzzet.dck | 6 - res/cube/RtRPromoRakdos.dck | 6 - res/cube/RtRPromoSelesnya.dck | 6 - res/sealed/ArabianExtended.sealed | 9 +- res/sealed/GtcGuildBoros.sealed | 9 +- res/sealed/GtcGuildDimir.sealed | 9 +- res/sealed/GtcGuildGruul.sealed | 7 +- res/sealed/GtcGuildOrzhov.sealed | 8 +- res/sealed/GtcGuildSimic.sealed | 9 +- res/sealed/GtcPromoBoros.sealed | 12 - res/sealed/GtcPromoDimir.sealed | 12 - res/sealed/GtcPromoGruul.sealed | 12 - res/sealed/GtcPromoOrzhov.sealed | 12 - res/sealed/GtcPromoSimic.sealed | 12 - res/sealed/RtRGuildAzorius.sealed | 9 +- res/sealed/RtRGuildGolgari.sealed | 7 +- res/sealed/RtRGuildIzzet.sealed | 7 +- res/sealed/RtRGuildRakdos.sealed | 11 +- res/sealed/RtRGuildSelesnya.sealed | 11 +- res/sealed/RtRPromoAzorius.sealed | 12 - res/sealed/RtRPromoGolgari.sealed | 12 - res/sealed/RtRPromoIzzet.sealed | 12 - res/sealed/RtRPromoRakdos.sealed | 12 - res/sealed/RtRPromoSelesnya.sealed | 12 - res/sealed/juzamjedi.sealed | 9 +- .../java/forge/card/BoosterGenerator.java | 17 +- src/main/java/forge/card/CardBlock.java | 133 ++++------- .../java/forge/card/IUnOpenedProduct.java | 16 ++ src/main/java/forge/card/MetaSet.java | 224 +++++------------- src/main/java/forge/card/UnOpenedMeta.java | 107 ++------- src/main/java/forge/card/UnOpenedProduct.java | 7 +- .../cardfactory/CardFactorySorceries.java | 6 - .../java/forge/game/limited/BoosterDraft.java | 57 ++--- .../forge/game/limited/CustomLimited.java | 47 ---- .../forge/game/limited/SealedDeckFormat.java | 70 +++--- .../java/forge/game/player/HumanPlayer.java | 40 ++-- 46 files changed, 310 insertions(+), 866 deletions(-) delete mode 100644 res/cube/GtcPromoBoros.dck delete mode 100644 res/cube/GtcPromoDimir.dck delete mode 100644 res/cube/GtcPromoGruul.dck delete mode 100644 res/cube/GtcPromoOrzhov.dck delete mode 100644 res/cube/GtcPromoSimic.dck delete mode 100644 res/cube/RtRPromoAzorius.dck delete mode 100644 res/cube/RtRPromoGolgari.dck delete mode 100644 res/cube/RtRPromoIzzet.dck delete mode 100644 res/cube/RtRPromoRakdos.dck delete mode 100644 res/cube/RtRPromoSelesnya.dck delete mode 100644 res/sealed/GtcPromoBoros.sealed delete mode 100644 res/sealed/GtcPromoDimir.sealed delete mode 100644 res/sealed/GtcPromoGruul.sealed delete mode 100644 res/sealed/GtcPromoOrzhov.sealed delete mode 100644 res/sealed/GtcPromoSimic.sealed delete mode 100644 res/sealed/RtRPromoAzorius.sealed delete mode 100644 res/sealed/RtRPromoGolgari.sealed delete mode 100644 res/sealed/RtRPromoIzzet.sealed delete mode 100644 res/sealed/RtRPromoRakdos.sealed delete mode 100644 res/sealed/RtRPromoSelesnya.sealed create mode 100644 src/main/java/forge/card/IUnOpenedProduct.java diff --git a/.gitattributes b/.gitattributes index c24307aa2c1..fb4fbce83c8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13432,21 +13432,11 @@ res/sealed/GtcGuildDimir.sealed -text res/sealed/GtcGuildGruul.sealed -text res/sealed/GtcGuildOrzhov.sealed -text res/sealed/GtcGuildSimic.sealed -text -res/sealed/GtcPromoBoros.sealed -text -res/sealed/GtcPromoDimir.sealed -text -res/sealed/GtcPromoGruul.sealed -text -res/sealed/GtcPromoOrzhov.sealed -text -res/sealed/GtcPromoSimic.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/RtRPromoAzorius.sealed -text -res/sealed/RtRPromoGolgari.sealed -text -res/sealed/RtRPromoIzzet.sealed -text -res/sealed/RtRPromoRakdos.sealed -text -res/sealed/RtRPromoSelesnya.sealed -text res/sealed/juzamjedi.sealed -text res/skins/dark_ascension/bg_match.jpg -text res/skins/dark_ascension/bg_splash.png -text @@ -13578,6 +13568,7 @@ src/main/java/forge/card/FormatCollection.java -text src/main/java/forge/card/ICardCharacteristics.java -text src/main/java/forge/card/ICardFace.java -text src/main/java/forge/card/ICardRawAbilites.java -text +src/main/java/forge/card/IUnOpenedProduct.java -text src/main/java/forge/card/MagicColor.java -text src/main/java/forge/card/MetaSet.java -text src/main/java/forge/card/TriggerReplacementBase.java -text diff --git a/res/blockdata/blocks.txt b/res/blockdata/blocks.txt index f7ed6355888..7676dfde0be 100644 --- a/res/blockdata/blocks.txt +++ b/res/blockdata/blocks.txt @@ -1,53 +1,50 @@ -Set0:LEA|Name:Alpha|DraftPacks:3|LandSetCode:LEA|SealedPacks:6 -Set0:LEB|Name:Beta|DraftPacks:3|LandSetCode:LEB|SealedPacks:6 -Set0:2ED|Name:Unlimited|DraftPacks:3|LandSetCode:2ED|SealedPacks:6 -Set0:ARN|Name:Arabian Nights|DraftPacks:5|LandSetCode:2ED|SealedPacks:9 -Set0:ATQ|Name:Antiquities|DraftPacks:5|LandSetCode:2ED|SealedPacks:9 -Set0:3ED|Name:Revised|DraftPacks:3|LandSetCode:3ED|SealedPacks:6 -Set0:LEG|Name:Legends|DraftPacks:3|LandSetCode:3ED|SealedPacks:6 -Set0:DRK|Name:The Dark|DraftPacks:5|LandSetCode:3ED|SealedPacks:9 -Set0:FEM|Name:Fallen Empires|DraftPacks:5|LandSetCode:3ED|SealedPacks:9 -Set0:4ED|Name:Fourth Edition|DraftPacks:3|LandSetCode:4ED|SealedPacks:6 - -Set0:ICE|Set1:ALL|Set2:CSP|Name:Ice Age|DraftPacks:3|LandSetCode:ICE|SealedPacks:6 -Set0:HML|Name:Homelands|DraftPacks:5|LandSetCode:4ED|SealedPacks:9 -Set0:MIR|Set1:VIS|Set2:WTH|Name:Mirage|DraftPacks:3|LandSetCode:MIR|SealedPacks:6 -Set0:5ED|Name:Fifth Edition|DraftPacks:3|LandSetCode:5ED|SealedPacks:6 -Set0:POR|Name:Portal|DraftPacks:3|LandSetCode:POR|SealedPacks:6 -Set0:TMP|Set1:STH|Set2:EXO|Name:Tempest|DraftPacks:3|LandSetCode:TMP|SealedPacks:6 -Set0:PO2|Name:Portal Second Age|DraftPacks:3|LandSetCode:PO2|SealedPacks:6 -Set0:USG|Set1:ULG|Set2:UDS|Name:Urza|DraftPacks:3|LandSetCode:USG|SealedPacks:6 -Set0:6ED|Name:Sixth Edition|DraftPacks:3|LandSetCode:6ED|SealedPacks:6 -Set0:PTK|Name:Portal Three Kingdoms|DraftPacks:5|LandSetCode:PTK|SealedPacks:9 - -Set0:MMQ|Set1:NMS|Set2:PCY|Name:Masques|DraftPacks:3|LandSetCode:MMQ|SealedPacks:6 -Set0:INV|Set1:PLS|Set2:APC|Name:Invasion|DraftPacks:3|LandSetCode:INV|SealedPacks:6 -Set0:7ED|Name:Seventh Edition|DraftPacks:3|LandSetCode:7ED|SealedPacks:6 -Set0:ODY|Set1:TOR|Set2:JUD|Name:Odyssey|DraftPacks:3|LandSetCode:ODY|SealedPacks:6 -Set0:ONS|Set1:LGN|Set2:SCG|Name:Onslaught|DraftPacks:3|LandSetCode:ONS|SealedPacks:6 -Set0:8ED|Name:Eighth Edition|DraftPacks:3|LandSetCode:8ED|SealedPacks:6 -Set0:MRD|Set1:DST|Set2:5DN|Name:Mirrodin|DraftPacks:3|LandSetCode:MRD|SealedPacks:6 -Set0:CHK|Set1:BOK|Set2:SOK|Name:Kamigawa|DraftPacks:3|LandSetCode:CHK|SealedPacks:6 -Set0:9ED|Name:Ninth Edition|DraftPacks:3|LandSetCode:9ED|SealedPacks:6 -Set0:RAV|Set1:GPT|Set2:DIS|Name:Ravnica|DraftPacks:3|LandSetCode:RAV|SealedPacks:6 - -Set0:CSP|Name:Coldsnap|DraftPacks:3|LandSetCode:9ED|SealedPacks:6 -Set0:TSP|Set1:PLC|Set2:FUT|Name:Time Spiral|DraftPacks:3|LandSetCode:TSP|SealedPacks:6 -Set0:10E|Name:Tenth Edition|DraftPacks:3|LandSetCode:10E|SealedPacks:6 -Set0:LRW|Set1:MOR|Name:Lorwyn|DraftPacks:3|LandSetCode:LRW|SealedPacks:6 -Set0:SHM|Set1:EVE|Name:Shadowmoor|DraftPacks:3|LandSetCode:SHM|SealedPacks:6 -Set0:ALA|Set1:CFX|Set2:ARB|Name:Shards of Alara|DraftPacks:3|LandSetCode:ALA|SealedPacks:6 -Set0:M10|Name:Magic 2010|DraftPacks:3|LandSetCode:M10|SealedPacks:6 -Set0:ZEN|Set1:WWK|Name:Zendikar|DraftPacks:3|LandSetCode:ZEN|SealedPacks:6 -Set0:ROE|Name:Rise of the Eldrazi|DraftPacks:3|LandSetCode:ROE|SealedPacks:6 -Set0:M11|Name:Magic 2011|DraftPacks:3|LandSetCode:M11|SealedPacks:6 - -Set0:SOM|Set1:MBS|Set2:NPH|Name:Scars of Mirrodin|DraftPacks:3|LandSetCode:SOM|SealedPacks:6 -Set0:M12|Name:Magic 2012|DraftPacks:3|LandSetCode:M12|SealedPacks:6 -Set0:ISD|Set1:DKA|Name:Innistrad|DraftPacks:3|LandSetCode:ISD|SealedPacks:6 -Set0:AVR|Name:Avacyn Restored|DraftPacks:3|LandSetCode:AVR|SealedPacks:6 -Set0:M13|Name:Magic 2013|DraftPacks:3|LandSetCode:M13|SealedPacks:6 -Set0:RTR|Name:Return to Ravnica|DraftPacks:3|LandSetCode:RTR|SealedPacks:6 -Set0:RTR|Set1:RTR|Set2:RTR|Set3:RTR|Set4:RTR|Meta0:CHOOSE1/CUBE/RtRGuildAzorius/Azorius Guild;CUBE/RtRGuildIzzet/Izzet Guild;CUBE/RtRGuildRakdos/Rakdos Guild;CUBE/RtRGuildGolgari/Golgari Guild;CUBE/RtRGuildSelesnya/Selesnya Guild/GUILD|Meta1:CHOOSE1/CUBE/RtRPromoAzorius/Azorius Guild;CUBE/RtRPromoIzzet/Izzet Guild;CUBE/RtRPromoRakdos/Rakdos Guild;CUBE/RtRPromoGolgari/Golgari Guild;CUBE/RtRPromoSelesnya/Selesnya Guild/PROMO|Name:Return to Ravnica Guild Sealed|DraftPacks:3|LandSetCode:RTR|SealedPacks:7 -Set0:GTC|Name:Gatecrash|DraftPacks:3|LandSetCode:RTR|SealedPacks:6 -Set0:GTC|Set1:GTC|Set2:GTC|Set3:GTC|Set4:GTC|Meta0:CHOOSE1/CUBE/GtcGuildBoros/Boros Guild;CUBE/GtcGuildDimir/Dimir Guild;CUBE/GtcGuildGruul/Gruul Guild;CUBE/GtcGuildOrzhov/Orzhov Guild;CUBE/GtcGuildSimic/Simic Guild/GUILD|Meta1:CHOOSE1/CUBE/GtcPromoBoros/Boros Guild;CUBE/GtcPromoDimir/Dimir Guild;CUBE/GtcPromoGruul/Gruul Guild;CUBE/GtcPromoOrzhov/Orzhov Guild;CUBE/GtcPromoSimic/Simic Guild/PROMO|Name:Gatecrash Guild Sealed|DraftPacks:3|LandSetCode:RTR|SealedPacks:7 +# Name, Draft/Sealed/Lands, All sets and metas +Alpha, 3/6/LEA, LEA +Beta, 3/6/LEB, LEB +Unlimited, 3/6/2ED, 2ED +Arabian Nights, 5/9/2ED, ARN +Antiquities, 5/9/2ED, ATQ +Revised, 3/6/3ED, 3ED +Legends, 3/6/3ED, LEG +The Dark, 5/9/3ED, DRK +Fallen Empires, 5/9/3ED, FEM +Fourth Edition, 3/6/4ED, 4ED +Ice Age, 3/6/ICE, ICE ALL CSP +Homelands, 5/9/4ED, HML +Mirage, 3/6/MIR, MIR VIS WTH +Fifth Edition, 3/6/5ED, 5ED +Portal, 3/6/POR, POR +Tempest, 3/6/TMP, TMP STH EXO +Portal Second Age, 3/6/PO2, PO2 +Urza, 3/6/USG, USG ULG UDS +Sixth Edition, 3/6/6ED, 6ED +Portal Three Kingdoms, 5/9/PTK, PTK +Masques, 3/6/MMQ, MMQ NMS PCY +Invasion, 3/6/INV, INV PLS APC +Seventh Edition, 3/6/7ED, 7ED +Odyssey, 3/6/ODY, ODY TOR JUD +Onslaught, 3/6/ONS, ONS LGN SCG +Eighth Edition, 3/6/8ED, 8ED +Mirrodin, 3/6/MRD, MRD DST 5DN +Kamigawa, 3/6/CHK, CHK BOK SOK +Ninth Edition, 3/6/9ED, 9ED +Ravnica, 3/6/RAV, RAV GPT DIS +Coldsnap, 3/6/9ED, CSP +Time Spiral, 3/6/TSP, TSP PLC FUT +Tenth Edition, 3/6/10E, 10E +Lorwyn, 3/6/LRW, LRW MOR +Shadowmoor, 3/6/SHM, SHM EVE +Shards of Alara, 3/6/ALA, ALA CFX ARB +Magic 2010, 3/6/M10, M10 +Zendikar, 3/6/ZEN, ZEN WWK +Rise of the Eldrazi, 3/6/ROE, ROE +Magic 2011, 3/6/M11, M11 +Scars of Mirrodin, 3/6/SOM, SOM MBS NPH +Magic 2012, 3/6/M12, M12 +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 +Return to Ravnica Guild Sealed, 3/6/RTR, RTR 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, 3/6/RTR, GTC +Gatecrash Guild Sealed, 3/6/RTR, GTC 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 \ No newline at end of file diff --git a/res/blockdata/fantasyblocks.txt b/res/blockdata/fantasyblocks.txt index be0e83d3302..6bc1b045a10 100644 --- a/res/blockdata/fantasyblocks.txt +++ b/res/blockdata/fantasyblocks.txt @@ -1,29 +1,29 @@ -Index:0|Set0:ICE|Set1:ARN|Set2:LEG|Name:(3) Arabian Ice Age|DraftPacks:3|LandSetCode:ICE|SealedPacks:6 -Index:1|Set0:2ED|Set1:ARN|Set2:LEG|Name:(3) Unlimited Power|DraftPacks:3|LandSetCode:2ED|SealedPacks:6 -Index:2|Set0:DRK|Set1:FEM|Set2:HML|Name:(3) Dark Empires|DraftPacks:3|LandSetCode:3ED|SealedPacks:6 -Index:3|Set0:MIR|Set1:TMP|Set2:USG|Name:(3) Urza's Tempest Mirage|DraftPacks:3|LandSetCode:5ED|SealedPacks:6 -Index:4|Set0:INV|Set1:ODY|Set2:ONS|Name:(3) Twilight of an Era|DraftPacks:3|LandSetCode:7ED|SealedPacks:6 -Index:5|Set0:MRD|Set1:CHK|Set2:RAV|Name:(3) New Dawn|DraftPacks:3|LandSetCode:9ED|SealedPacks:6 -Index:6|Set0:2ED|Set1:ARN|Set2:ATQ|Set3:LEG|Set4:DRK|Set5:FEM|Name:(5-6) Chronicles 01 - Origins|DraftPacks:3|LandSetCode:2ED|SealedPacks:6 -Index:7|Set0:ICE|Set1:HML|Set2:ALL|Set3:MIR|Set4:VIS|Set5:WTH|Name:(5-6) Chronicles 02 - Icy Mirage|DraftPacks:3|LandSetCode:5ED|SealedPacks:6 -Index:8|Set0:TMP|Set1:USG|Set2:STH|Set3:ULG|Set4:EXO|Set5:UDS|Name:(5-6) Chronicles 03 - Urza's Tempest|DraftPacks:3|LandSetCode:6ED|SealedPacks:6 -Index:9|Set0:MMQ|Set1:INV|Set2:NMS|Set3:PLS|Set4:PCY|Set5:APC|Name:(5-6) Chronicles 04 - Mercadian Invasion|DraftPacks:3|LandSetCode:7ED|SealedPacks:6 -Index:10|Set0:ODY|Set1:ONS|Set2:TOR|Set3:LGN|Set4:JUD|Set5:SCG|Name:(5-6) Chronicles 05 - Onslaught Odyssey|DraftPacks:3|LandSetCode:8ED|SealedPacks:6 -Index:11|Set0:MRD|Set1:CHK|Set2:DST|Set3:BOK|Set4:5DN|Set5:SOK|Name:(5-6) Chronicles 06 - Champions of Mirrodin|DraftPacks:3|LandSetCode:9ED|SealedPacks:6 -Index:12|Set0:RAV|Set1:TSP|Set2:GPT|Set3:PLC|Set4:DIS|Set5:FUT|Name:(5-6) Chronicles 07 - Ravnica Spiral|DraftPacks:3|LandSetCode:9ED|SealedPacks:6 -Index:13|Set0:LRW|Set1:SHM|Set2:MOR|Set3:EVE|Set3:CSP|Name:(5-6) Chronicles 08 - Cold Lorwynmoor (5 only)|DraftPacks:3|LandSetCode:10E|SealedPacks:6 -Index:14|Set0:ALA|Set1:ZEN|Set2:CFX|Set3:WWK|Set4:ARB|Set5:ROE|Name:(5-6) Chronicles 09 - Shards of Zendikar|DraftPacks:3|LandSetCode:M11|SealedPacks:6 -Index:15|Set0:SOM|Set1:ISD|Set2:MBS|Set3:DKA|Set4:NPH|Set5:AVR|Name:(5-6) Chronicles 10 - Scars of Innistrad|DraftPacks:3|LandSetCode:M11|SealedPacks:6 -Index:16|Set0:ARN|Set1:MIR|Set2:VIS|Set3:WTH|Name:(4) Arabian Africa|DraftPacks:3|LandSetCode:MIR|SealedPacks:6 -Index:17|Set0:MIR|Set1:CHK|Set2:VIS|Set3:BOK|Set4:WTH|Set5:SOK|Name:(6) Africa-Asia|DraftPacks:3|LandSetCode:MIR|SealedPacks:6 -Index:18|Set0:2ED|Set1:3ED|Set2:4ED|Set3:5ED|Set4:6ED|Set5:7ED|Name:(6-7)Cores 1 (2,3,4,5,6,7)|DraftPacks:3|LandSetCode:4ED|SealedPacks:6 -Index:19|Set0:8ED|Set1:9ED|Set2:10E|Set3:M10|Set4:M11|Set5:M12|Set6:M13|Name:(6-7)Cores 2 (8,9,10,M10,M11,M12,M13)|DraftPacks:3|LandSetCode:9ED|SealedPacks:7 -Index:20|Set0:ICE|Set1:ALL|Set2:CSP|Set3:HML|Name:(4) Ice Age Extended|DraftPacks:3|LandSetCode:ICE|SealedPacks:6 -Index:21|Set0:2ED|Set1:ICE|Set2:HML|Set3:LEG|Set4:DRK|Set5:FEM|Name:(6) Sample 6-pack|DraftPacks:3|LandSetCode:2ED|SealedPacks:6 -Index:22|Set0:4ED|Set1:ALL|Set2:ICE|Set3:HML|Set4:LEG|Set5:DRK|Set6:FEM|Name:(7) Sample 7-pack|DraftPacks:3|LandSetCode:4ED|SealedPacks:7 -Index:23|Set0:4ED|Set1:ALL|Set2:ICE|Set3:HML|Set4:LEG|Set5:DRK|Set6:FEM|Set7:CHR|Name:(8) Sample 8-pack|DraftPacks:3|LandSetCode:4ED|SealedPacks:8 -Index:24|Set0:2ED|Set1:ALL|Set2:ICE|Set3:HML|Set4:LEG|Set5:DRK|Set6:FEM|Set7:ATQ|Set8:ARN|Name:(9) Sample 9-pack|DraftPacks:3|LandSetCode:2ED|SealedPacks:9 -Index:25|Set0:2ED|Set1:ATQ|Set2:ARN|Set3:DRK|Set4:LEG|Set5:FEM|Set6:ICE|Set7:HML|Set8:ALL|Name:(9) MtG Encyclopedia|DraftPacks:3|LandSetCode:2ED|SealedPacks:9 -Index:26|Meta0:CUBE/ArabianExtended/ARAB|Meta1:META/ISD,DKA,AVR,M13/M13-ISD|Meta2:FULL/*/*|Name:(3) Metaset Sample|DraftPacks:3|LandSetCode:2ED|SealedPacks:6 -Index:27|Meta0:CHOOSE1/CUBE/ArabianExtended/ArabianExtended;FULL/*/*;META/ICE,ALL,HML,CSP/IceAgeBlockExtended;BOOSTER/2ED/Unlimited;PACK/4ED/4th Edition /CHOOSE|Meta1:RANDOM1/FULL/*/*;META/CHK,BOK,SOK/KAMI;BOOSTER/8ED/8ED/RANDOM|Meta2:COMBO/CUBE/juzamjedi/JZJEDI;META/USG,ULG,UDS/URZA;PACK/M13/M13;BOOSTER/TSB/TimeShift/COMBO|Name:(3) Metaset Sample 2|DraftPacks:3|LandSetCode:2ED|SealedPacks:6 - +# Name, Draft/Sealed/Lands, All sets and metas +(3) Arabian Ice Age, 3/6/ICE, ICE ARN LEG +(3) Unlimited Power, 3/6/2ED, 2ED ARN LEG +(3) Dark Empires, 3/6/3ED, DRK FEM HML +(3) Urza's Tempest Mirage, 3/6/5ED, MIR TMP USG +(3) Twilight of an Era, 3/6/7ED, INV ODY ONS +(3) New Dawn, 3/6/9ED, MRD CHK RAV +(5-6) Chronicles 01 - Origins, 3/6/2ED, 2ED ARN ATQ LEG DRK FEM +(5-6) Chronicles 02 - Icy Mirage, 3/6/5ED, ICE HML ALL MIR VIS WTH +(5-6) Chronicles 03 - Urza's Tempest, 3/6/6ED, TMP USG STH ULG EXO UDS +(5-6) Chronicles 04 - Mercadian Invasion, 3/6/7ED, MMQ INV NMS PLS PCY APC +(5-6) Chronicles 05 - Onslaught Odyssey, 3/6/8ED, ODY ONS TOR LGN JUD SCG +(5-6) Chronicles 06 - Champions of Mirrodin, 3/6/9ED, MRD CHK DST BOK 5DN SOK +(5-6) Chronicles 07 - Ravnica Spiral, 3/6/9ED, RAV TSP GPT PLC DIS FUT +(5-6) Chronicles 08 - Cold Lorwynmoor (5 only), 3/6/10E, LRW SHM MOR EVE CSP +(5-6) Chronicles 09 - Shards of Zendikar, 3/6/M11, ALA ZEN CFX WWK ARB ROE +(5-6) Chronicles 10 - Scars of Innistrad, 3/6/M11, SOM ISD MBS DKA NPH AVR +(4) Arabian Africa, 3/6/MIR, ARN MIR VIS WTH +(6) Africa-Asia, 3/6/MIR, MIR CHK VIS BOK WTH SOK +(6-7)Cores 1 (2,3,4,5,6,7), 3/6/4ED, 2ED 3ED 4ED 5ED 6ED 7ED +(6-7)Cores 2 (8,9,10,M10,M11,M12,M13), 3/7/10E, 8ED 9ED 10E M10 M11 M12 M13 +(4) Ice Age Extended, 3/6/ICE, ICE ALL CSP HML +(6) Sample 6-pack, 3/6/2ED, 2ED ICE HML LEG DRK FEM +(7) Sample 7-pack, 3/7/4ED, 4ED ALL ICE HML LEG DRK FEM +(8) Sample 8-pack, 3/8/4ED, 4ED ALL ICE HML LEG DRK FEM CHR +(9) Sample 9-pack, 3/9/2ED, 2ED ALL ICE HML LEG DRK FEM ATQ ARN +(9) MtG Encyclopedia, 3/9/2ED, 2ED ATQ ARN DRK LEG FEM ICE HML ALL +(3) Metaset Sample, 3/6/2ED, Meta-Cube(ArabianExtended)ARAB Meta-JoinedSet(ISD DKA AVR M13)M13-ISD Meta-Full() +(3) Metaset Sample 2, 3/6/2ED, Meta-Choose(CUBE(ArabianExtended)Arabian Extended;FULL()*;JoinedSet(ICE ALL HML CSP)Ice Age Block Extended;Booster(2ED)Unlimited booster;Pack(4ED)4th Edition Tournament)CHOOSE Meta-Random(Full()*;JoinedSet(CHK BOK SOK)KAMI;Booster(8ED)8ED)RANDOM \ No newline at end of file diff --git a/res/cube/GtcPromoBoros.dck b/res/cube/GtcPromoBoros.dck deleted file mode 100644 index b2408ed0dc3..00000000000 --- a/res/cube/GtcPromoBoros.dck +++ /dev/null @@ -1,5 +0,0 @@ -[metadata] -Name=GtcPromoBoros -[Main] -1 Boros Guildgate|GTC -1 Foundry Champion|GTC diff --git a/res/cube/GtcPromoDimir.dck b/res/cube/GtcPromoDimir.dck deleted file mode 100644 index ec6f60d07c5..00000000000 --- a/res/cube/GtcPromoDimir.dck +++ /dev/null @@ -1,5 +0,0 @@ -[metadata] -Name=GtcPromoDimir -[Main] -1 Consuming Aberration|GTC -1 Dimir Guildgate|GTC diff --git a/res/cube/GtcPromoGruul.dck b/res/cube/GtcPromoGruul.dck deleted file mode 100644 index 553fe167bfb..00000000000 --- a/res/cube/GtcPromoGruul.dck +++ /dev/null @@ -1,5 +0,0 @@ -[metadata] -Name=GtcPromoGruul -[Main] -1 Gruul Guildgate|GTC -1 Rubblehulk|GTC diff --git a/res/cube/GtcPromoOrzhov.dck b/res/cube/GtcPromoOrzhov.dck deleted file mode 100644 index 437b041ef1e..00000000000 --- a/res/cube/GtcPromoOrzhov.dck +++ /dev/null @@ -1,5 +0,0 @@ -[metadata] -Name=GtcPromoOrzhov -[Main] -1 Orzhov Guildgate|GTC -1 Treasury Thrull|GTC diff --git a/res/cube/GtcPromoSimic.dck b/res/cube/GtcPromoSimic.dck deleted file mode 100644 index 3277009bfc3..00000000000 --- a/res/cube/GtcPromoSimic.dck +++ /dev/null @@ -1,5 +0,0 @@ -[metadata] -Name=GtcPromoSimic -[Main] -1 Fathom Mage|GTC -1 Simic Guildgate|GTC diff --git a/res/cube/RtRPromoAzorius.dck b/res/cube/RtRPromoAzorius.dck deleted file mode 100644 index b14c4cf3df2..00000000000 --- a/res/cube/RtRPromoAzorius.dck +++ /dev/null @@ -1,6 +0,0 @@ -[metadata] -Name=RtRPromoAzorius -[main] -1 Archon of the Triumvirate|RTR -1 Azorius Guildgate|RTR -[sideboard] diff --git a/res/cube/RtRPromoGolgari.dck b/res/cube/RtRPromoGolgari.dck deleted file mode 100644 index 6fc7a18fb0c..00000000000 --- a/res/cube/RtRPromoGolgari.dck +++ /dev/null @@ -1,6 +0,0 @@ -[metadata] -Name=RtRPromoGolgari -[main] -1 Corpsejack Menace|RTR -1 Golgari Guildgate|RTR -[sideboard] diff --git a/res/cube/RtRPromoIzzet.dck b/res/cube/RtRPromoIzzet.dck deleted file mode 100644 index d4fb85dc820..00000000000 --- a/res/cube/RtRPromoIzzet.dck +++ /dev/null @@ -1,6 +0,0 @@ -[metadata] -Name=RtRPromoIzzet -[main] -1 Hypersonic Dragon|RTR -1 Izzet Guildgate|RTR -[sideboard] diff --git a/res/cube/RtRPromoRakdos.dck b/res/cube/RtRPromoRakdos.dck deleted file mode 100644 index dce3d2d606b..00000000000 --- a/res/cube/RtRPromoRakdos.dck +++ /dev/null @@ -1,6 +0,0 @@ -[metadata] -Name=RtRPromoRakdos -[main] -1 Carnival Hellsteed|RTR -1 Rakdos Guildgate|RTR -[sideboard] diff --git a/res/cube/RtRPromoSelesnya.dck b/res/cube/RtRPromoSelesnya.dck deleted file mode 100644 index 6485a2a46ab..00000000000 --- a/res/cube/RtRPromoSelesnya.dck +++ /dev/null @@ -1,6 +0,0 @@ -[metadata] -Name=RtRPromoSelesnya -[main] -1 Grove of the Guardian|RTR -1 Selesnya Guildgate|RTR -[sideboard] diff --git a/res/sealed/ArabianExtended.sealed b/res/sealed/ArabianExtended.sealed index 5dec8aaeb32..3112968bad3 100644 --- a/res/sealed/ArabianExtended.sealed +++ b/res/sealed/ArabianExtended.sealed @@ -2,11 +2,6 @@ Name:ArabianExtended DeckFile:ArabianExtended IgnoreRarity:False LandSetCode:2ED - -NumCards:15 -NumSpecials:0 -NumMythics:1 -NumRares:1 -NumUncommons:3 -NumCommons:11 + +Booster: 1 Rare, 11 Common, 3 Uncommon NumPacks:3 \ No newline at end of file diff --git a/res/sealed/GtcGuildBoros.sealed b/res/sealed/GtcGuildBoros.sealed index 62bd692dac6..a87ad98233b 100644 --- a/res/sealed/GtcGuildBoros.sealed +++ b/res/sealed/GtcGuildBoros.sealed @@ -2,11 +2,6 @@ Name:GtcGuildBoros DeckFile:GtcGuildBoros IgnoreRarity:False LandSetCode:M13 - -NumCards:14 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:3 -NumCommons:10 + +Booster:10 Common, 3 Uncommon, 1 Rare, 2 promo("Boros Guildgate|GTC","Foundry Champion|GTC") NumPacks:1 diff --git a/res/sealed/GtcGuildDimir.sealed b/res/sealed/GtcGuildDimir.sealed index 013db5b7e91..dba7162467f 100644 --- a/res/sealed/GtcGuildDimir.sealed +++ b/res/sealed/GtcGuildDimir.sealed @@ -2,11 +2,6 @@ Name:GtcGuildDimir DeckFile:GtcGuildDimir IgnoreRarity:False LandSetCode:M13 - -NumCards:14 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:3 -NumCommons:10 + +Booster:10 Common, 3 Uncommon, 1 Rare, 2 promo("Dimir Guildgate|GTC","Consuming Aberration|GTC") NumPacks:1 diff --git a/res/sealed/GtcGuildGruul.sealed b/res/sealed/GtcGuildGruul.sealed index 6616638c363..709418f30bb 100644 --- a/res/sealed/GtcGuildGruul.sealed +++ b/res/sealed/GtcGuildGruul.sealed @@ -3,10 +3,5 @@ DeckFile:GtcGuildGruul IgnoreRarity:False LandSetCode:M13 -NumCards:14 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:3 -NumCommons:10 +Booster:10 Common, 3 Uncommon, 1 Rare, 2 promo("Gruul Guildgate|GTC","Rubblehulk|GTC") NumPacks:1 diff --git a/res/sealed/GtcGuildOrzhov.sealed b/res/sealed/GtcGuildOrzhov.sealed index 4279598770f..bcf3962c0b2 100644 --- a/res/sealed/GtcGuildOrzhov.sealed +++ b/res/sealed/GtcGuildOrzhov.sealed @@ -1,12 +1,6 @@ Name:GtcGuildOrzhov DeckFile:GtcGuildOrzhov -IgnoreRarity:False LandSetCode:M13 -NumCards:14 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:3 -NumCommons:10 +Booster:10 Common, 3 Uncommon, 1 Rare, 2 promo("Orzhov Guildgate|GTC","Treasury Thrull|GTC") NumPacks:1 diff --git a/res/sealed/GtcGuildSimic.sealed b/res/sealed/GtcGuildSimic.sealed index 06c7c8d7b0b..8c37200274a 100644 --- a/res/sealed/GtcGuildSimic.sealed +++ b/res/sealed/GtcGuildSimic.sealed @@ -2,11 +2,6 @@ Name:GtcGuildSimic DeckFile:GtcGuildSimic IgnoreRarity:False LandSetCode:M13 - -NumCards:14 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:3 -NumCommons:10 + +Booster:10 Common, 3 Uncommon, 1 Rare, 2 promo("Simic Guildgate|GTC","Fathom Mage|GTC") NumPacks:1 diff --git a/res/sealed/GtcPromoBoros.sealed b/res/sealed/GtcPromoBoros.sealed deleted file mode 100644 index 9b6932f79a9..00000000000 --- a/res/sealed/GtcPromoBoros.sealed +++ /dev/null @@ -1,12 +0,0 @@ -Name:GtcPromoBoros -DeckFile:GtcPromoBoros -IgnoreRarity:False -LandSetCode:M13 - -NumCards:2 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:0 -NumCommons:1 -NumPacks:1 diff --git a/res/sealed/GtcPromoDimir.sealed b/res/sealed/GtcPromoDimir.sealed deleted file mode 100644 index bcc8b8b9c0c..00000000000 --- a/res/sealed/GtcPromoDimir.sealed +++ /dev/null @@ -1,12 +0,0 @@ -Name:GtcPromoDimir -DeckFile:GtcPromoDimir -IgnoreRarity:False -LandSetCode:M13 - -NumCards:2 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:0 -NumCommons:1 -NumPacks:1 diff --git a/res/sealed/GtcPromoGruul.sealed b/res/sealed/GtcPromoGruul.sealed deleted file mode 100644 index 8490a27096b..00000000000 --- a/res/sealed/GtcPromoGruul.sealed +++ /dev/null @@ -1,12 +0,0 @@ -Name:GtcPromoGruul -DeckFile:GtcPromoGruul -IgnoreRarity:False -LandSetCode:M13 - -NumCards:2 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:0 -NumCommons:1 -NumPacks:1 diff --git a/res/sealed/GtcPromoOrzhov.sealed b/res/sealed/GtcPromoOrzhov.sealed deleted file mode 100644 index 104eea27576..00000000000 --- a/res/sealed/GtcPromoOrzhov.sealed +++ /dev/null @@ -1,12 +0,0 @@ -Name:GtcPromoOrzhov -DeckFile:GtcPromoOrzhov -IgnoreRarity:False -LandSetCode:M13 - -NumCards:2 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:0 -NumCommons:1 -NumPacks:1 diff --git a/res/sealed/GtcPromoSimic.sealed b/res/sealed/GtcPromoSimic.sealed deleted file mode 100644 index 40c3f0eb653..00000000000 --- a/res/sealed/GtcPromoSimic.sealed +++ /dev/null @@ -1,12 +0,0 @@ -Name:GtcPromoSimic -DeckFile:GtcPromoSimic -IgnoreRarity:False -LandSetCode:M13 - -NumCards:2 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:0 -NumCommons:1 -NumPacks:1 diff --git a/res/sealed/RtRGuildAzorius.sealed b/res/sealed/RtRGuildAzorius.sealed index c05c970827d..94dccfc1996 100644 --- a/res/sealed/RtRGuildAzorius.sealed +++ b/res/sealed/RtRGuildAzorius.sealed @@ -2,11 +2,6 @@ Name:RtRGuildAzorius DeckFile:RtRGuildAzorius IgnoreRarity:False LandSetCode:M13 - -NumCards:14 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:3 -NumCommons:10 + +Booster:10 Common, 3 Uncommon, 1 Rare, 2 promo("Azorius Guildgate|RTR","Archon of the Triumvirate|RTR") NumPacks:1 diff --git a/res/sealed/RtRGuildGolgari.sealed b/res/sealed/RtRGuildGolgari.sealed index 7b6184be0f7..32f103435cd 100644 --- a/res/sealed/RtRGuildGolgari.sealed +++ b/res/sealed/RtRGuildGolgari.sealed @@ -3,10 +3,5 @@ DeckFile:RtRGuildGolgari IgnoreRarity:False LandSetCode:M13 -NumCards:14 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:3 -NumCommons:10 +Booster:10 Common, 3 Uncommon, 1 Rare, 2 promo("Golgari Guildgate|RTR","Corpsejack Menace|RTR") NumPacks:1 diff --git a/res/sealed/RtRGuildIzzet.sealed b/res/sealed/RtRGuildIzzet.sealed index 071c1aff308..f9e9e087602 100644 --- a/res/sealed/RtRGuildIzzet.sealed +++ b/res/sealed/RtRGuildIzzet.sealed @@ -3,10 +3,5 @@ DeckFile:RtRGuildIzzet IgnoreRarity:False LandSetCode:M13 -NumCards:14 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:3 -NumCommons:10 +Booster:10 Common, 3 Uncommon, 1 Rare, 2 promo("Izzet Guildgate|RTR","Hypersonic Dragon|RTR") NumPacks:1 diff --git a/res/sealed/RtRGuildRakdos.sealed b/res/sealed/RtRGuildRakdos.sealed index 9ffe7f55f2c..8ca7e405c48 100644 --- a/res/sealed/RtRGuildRakdos.sealed +++ b/res/sealed/RtRGuildRakdos.sealed @@ -2,11 +2,6 @@ Name:RtRGuildRakdos DeckFile:RtRGuildRakdos IgnoreRarity:False LandSetCode:M13 - -NumCards:14 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:3 -NumCommons:10 -NumPacks:1 + +Booster:10 Common, 3 Uncommon, 1 Rare, 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 index c0f11b591af..b23f141d407 100644 --- a/res/sealed/RtRGuildSelesnya.sealed +++ b/res/sealed/RtRGuildSelesnya.sealed @@ -2,11 +2,6 @@ Name:RtRGuildSelesnya DeckFile:RtRGuildSelesnya IgnoreRarity:False LandSetCode:M13 - -NumCards:14 -NumSpecials:1 -NumMythics:0 -NumRares:1 -NumUncommons:3 -NumCommons:10 -NumPacks:1 + +Booster:10 Common, 3 Uncommon, 1 Rare, 2 promo("Selesnya Guildgate|RTR","Grove of the Guardian|RTR") +NumPacks:1 \ No newline at end of file diff --git a/res/sealed/RtRPromoAzorius.sealed b/res/sealed/RtRPromoAzorius.sealed deleted file mode 100644 index 7b240855659..00000000000 --- a/res/sealed/RtRPromoAzorius.sealed +++ /dev/null @@ -1,12 +0,0 @@ -Name:RtRPromoAzorius -DeckFile:RtRPromoAzorius -IgnoreRarity:False -LandSetCode:M13 - -NumCards:2 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:0 -NumCommons:1 -NumPacks:1 diff --git a/res/sealed/RtRPromoGolgari.sealed b/res/sealed/RtRPromoGolgari.sealed deleted file mode 100644 index 2ef589acde0..00000000000 --- a/res/sealed/RtRPromoGolgari.sealed +++ /dev/null @@ -1,12 +0,0 @@ -Name:RtRPromoGolgari -DeckFile:RtRPromoGolgari -IgnoreRarity:False -LandSetCode:M13 - -NumCards:2 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:0 -NumCommons:1 -NumPacks:1 diff --git a/res/sealed/RtRPromoIzzet.sealed b/res/sealed/RtRPromoIzzet.sealed deleted file mode 100644 index 44629675113..00000000000 --- a/res/sealed/RtRPromoIzzet.sealed +++ /dev/null @@ -1,12 +0,0 @@ -Name:RtRPromoIzzet -DeckFile:RtRPromoIzzet -IgnoreRarity:False -LandSetCode:M13 - -NumCards:2 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:0 -NumCommons:1 -NumPacks:1 diff --git a/res/sealed/RtRPromoRakdos.sealed b/res/sealed/RtRPromoRakdos.sealed deleted file mode 100644 index 69254833971..00000000000 --- a/res/sealed/RtRPromoRakdos.sealed +++ /dev/null @@ -1,12 +0,0 @@ -Name:RtRPromoRakdos -DeckFile:RtRPromoRakdos -IgnoreRarity:False -LandSetCode:M13 - -NumCards:2 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:0 -NumCommons:1 -NumPacks:1 diff --git a/res/sealed/RtRPromoSelesnya.sealed b/res/sealed/RtRPromoSelesnya.sealed deleted file mode 100644 index 384e7db15a4..00000000000 --- a/res/sealed/RtRPromoSelesnya.sealed +++ /dev/null @@ -1,12 +0,0 @@ -Name:RtRPromoSelesnya -DeckFile:RtRPromoSelesnya -IgnoreRarity:False -LandSetCode:M13 - -NumCards:2 -NumSpecials:0 -NumMythics:0 -NumRares:1 -NumUncommons:0 -NumCommons:1 -NumPacks:1 diff --git a/res/sealed/juzamjedi.sealed b/res/sealed/juzamjedi.sealed index fc2782d42b5..95db73b40de 100644 --- a/res/sealed/juzamjedi.sealed +++ b/res/sealed/juzamjedi.sealed @@ -2,11 +2,6 @@ Name:JuzamjediCube DeckFile:JuzamjediCube IgnoreRarity:True LandSetCode:M11 - -NumCards:15 -NumSpecials:0 -NumMythics:1 -NumRares:5 -NumUncommons:5 -NumCommons:5 + +Booster: 5 Common, 5 Uncommon, 5 RareNotMythic, 1 Mythic NumPacks:3 \ 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 871000104bd..38c54e9f11b 100644 --- a/src/main/java/forge/card/BoosterGenerator.java +++ b/src/main/java/forge/card/BoosterGenerator.java @@ -78,10 +78,7 @@ public class BoosterGenerator { String slotType = slot.getLeft(); // add expansion symbol here? int numCards = slot.getRight().intValue(); - String[] sType = TextUtil.splitWithParenthesis(slotType, ' ', '(', ')'); - String sheetKey = sType.length == 1 ? slotType.trim() + " " + booster.getEdition() : slotType.trim(); - - PrintSheet ps = makeSheet(sheetKey, sourcePool); + PrintSheet ps = makeSheet(slotType, sourcePool); result.addAll(ps.random(numCards, true)); } return result; @@ -98,11 +95,17 @@ public class BoosterGenerator { if(mainCode.endsWith("s")) mainCode = mainCode.substring(0, mainCode.length()-1); - String sets = sKey[1]; - Predicate setPred = IPaperCard.Predicates.printedInSets(sets.split(" ")); + Predicate setPred = (Predicate) (sKey.length > 1 ? IPaperCard.Predicates.printedInSets(sKey[1].split(" ")) : Predicates.alwaysTrue()); // Pre-defined sheets: - if( mainCode.equalsIgnoreCase("any") ) { + 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)); + } + + } else if( mainCode.equalsIgnoreCase("any") ) { // no restriction on rarity Predicate predicate = Predicates.and(setPred, extraPred); ps.addAll(Iterables.filter(src, predicate)); diff --git a/src/main/java/forge/card/CardBlock.java b/src/main/java/forge/card/CardBlock.java index ceaa398339e..76ce48675b8 100644 --- a/src/main/java/forge/card/CardBlock.java +++ b/src/main/java/forge/card/CardBlock.java @@ -19,11 +19,16 @@ package forge.card; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.TreeMap; import com.google.common.base.Function; import com.google.common.base.Predicate; + +import forge.Singletons; import forge.item.CardPrinted; import forge.item.IPaperCard; +import forge.util.TextUtil; import forge.util.storage.StorageReaderFile; // import forge.deck.Deck; @@ -37,7 +42,7 @@ public final class CardBlock implements Comparable { private final int orderNum; private final String name; private final CardEdition[] sets; - private final ArrayList metaSets; + private final Map metaSets = new TreeMap(); private final CardEdition landSet; private final int cntBoostersDraft; private final int cntBoostersSealed; @@ -61,12 +66,14 @@ public final class CardBlock implements Comparable { * @param cntBoostersSealed * the cnt boosters sealed */ - public CardBlock(final int index, final String name, final List sets, final ArrayList metas, + public CardBlock(final int index, final String name, final List sets, final List metas, final CardEdition landSet, final int cntBoostersDraft, final int cntBoostersSealed) { this.orderNum = index; this.name = name; this.sets = sets.toArray(CardBlock.EMPTY_SET_ARRAY); - this.metaSets = metas; + for(MetaSet m : metas) { + this.metaSets.put(m.getCode(), m); + } this.landSet = landSet; this.cntBoostersDraft = cntBoostersDraft; this.cntBoostersSealed = cntBoostersSealed; @@ -195,9 +202,9 @@ public final class CardBlock implements Comparable { */ @Override public String toString() { - if (this.getNumberMetaSets() + this.getNumberSets() < 1) { + if (this.metaSets.isEmpty() && this.sets.length < 1) { return this.name + " (empty)"; - } else if (this.getNumberMetaSets() + this.getNumberSets() < 2) { + } else if (this.metaSets.size() + this.getNumberSets() < 2) { return this.name + " (set)"; } return this.name + " (block)"; @@ -229,39 +236,30 @@ public final class CardBlock implements Comparable { */ @Override protected CardBlock read(String line, int i) { - final String[] sParts = line.trim().split("\\|"); + final String[] sParts = TextUtil.splitWithParenthesis(line.trim(), ',', '(', ')', 3); + String name = sParts[0]; - String name = null; - int index = 1+i; - final List sets = new ArrayList(9); // add support for up to 9 different sets in a block! - final ArrayList metas = new ArrayList(); - CardEdition landSet = null; - int draftBoosters = 3; - int sealedBoosters = 6; + String[] numbers = sParts[1].trim().split("/"); + int draftBoosters = Integer.parseInt(numbers[0]); + int sealedBoosters = Integer.parseInt(numbers[1]); + CardEdition landSet = editions.getEditionByCodeOrThrow(numbers[2]); - for (final String sPart : sParts) { - final String[] kv = sPart.split(":", 2); - final String key = kv[0].toLowerCase(); - if ("name".equals(key)) { - name = kv[1]; - } else if ("set0".equals(key) || "set1".equals(key) || "set2".equals(key) || "set3".equals(key) - || "set4".equals(key) || "set5".equals(key) || "set6".equals(key) || "set7".equals(key) - || "set8".equals(key)) { - sets.add(editions.getEditionByCodeOrThrow(kv[1])); - } else if ("meta0".equals(key) || "meta1".equals(key) || "meta2".equals(key) || "meta3".equals(key) - || "meta4".equals(key) || "meta5".equals(key) || "meta6".equals(key) || "meta7".equals(key) - || "meta8".equals(key)) { - metas.add(new MetaSet(kv[1])); - } else if ("landsetcode".equals(key)) { - landSet = editions.getEditionByCodeOrThrow(kv[1]); - } else if ("draftpacks".equals(key)) { - draftBoosters = Integer.parseInt(kv[1]); - } else if ("sealedpacks".equals(key)) { - sealedBoosters = Integer.parseInt(kv[1]); + List sets = new ArrayList(); + List metas = new ArrayList(); + + String[] setNames = TextUtil.splitWithParenthesis(sParts[2], ' ', '(', ')' ); + for(final String set : setNames ) { + if(set.startsWith("Meta-")) { + String metaSpec = set.substring(5); + boolean noDraft = metaSpec.startsWith("NoDraft-"); + if( noDraft ) metaSpec = metaSpec.substring(8); + metas.add(new MetaSet(metaSpec, noDraft)); + } else { + sets.add(editions.getEditionByCodeOrThrow(set)); } - } - return new CardBlock(index, name, sets, metas, landSet, draftBoosters, sealedBoosters); + + return new CardBlock(i+1, name, sets, metas, landSet, draftBoosters, sealedBoosters); } } @@ -280,56 +278,15 @@ public final class CardBlock implements Comparable { } } - /** - * The number of meta-sets in the block. - * - * @return int, number of meta-sets. - */ - public int getNumberMetaSets() { - if (metaSets == null || metaSets.size() < 1) { - return 0; - } - else { - return metaSets.size(); - } + public Iterable getMetaSetNames() { + return metaSets.keySet(); } - /** - * Returns the requested meta-set. - * - * @param index - * int, the requested index - * @return MetaSet, the requested meta-set. - */ - public MetaSet getMetaSet(final int index) { - if (index < 0 || index > this.getNumberMetaSets() - 1) { - throw new RuntimeException("Illegal MetaSet requested: " + index); - } - else { - return metaSets.get(index); - } + + public MetaSet getMetaSet(String key) { + return metaSets.get(key); } - /** - * Returns true if there is a meta-set of the requested type. - * - * @param compare - * String, the requested the requested type - * @return boolean, the requsted type was found - */ - public boolean hasMetaSetType(final String compare) { - - if (this.getNumberMetaSets() < 1) { - return false; - } - - for (MetaSet mSet : metaSets) { - if (mSet.getType().equalsIgnoreCase(compare)) { - return true; - } - } - return false; - } /** * Tries to create a booster for the selected meta-set code. @@ -338,18 +295,8 @@ public final class CardBlock implements Comparable { * String, the MetaSet code * @return UnOpenedProduct, the created booster. */ - public UnOpenedProduct getBooster(final String code) { - - if (this.getNumberMetaSets() < 1) { - throw new RuntimeException("Attempted to get a booster pack for empty metasets."); - } - else { - for (int i = 0; i < this.getNumberMetaSets(); i++) { - if (code.equals(metaSets.get(i).getCode())) { - return metaSets.get(i).getBooster(); - } - } - throw new RuntimeException("Could not find metaset " + code + " for booster generation."); - } + public IUnOpenedProduct getBooster(final String code) { + MetaSet ms = metaSets.get(code); + return ms == null ? new UnOpenedProduct(Singletons.getModel().getBoosters().get(code)) : ms.getBooster(); } } diff --git a/src/main/java/forge/card/IUnOpenedProduct.java b/src/main/java/forge/card/IUnOpenedProduct.java new file mode 100644 index 00000000000..a1fddd91bae --- /dev/null +++ b/src/main/java/forge/card/IUnOpenedProduct.java @@ -0,0 +1,16 @@ +package forge.card; + +import java.util.List; + +import com.google.common.base.Supplier; + +import forge.item.CardPrinted; + +/** + * TODO: Write javadoc for this type. + * + */ + +public interface IUnOpenedProduct extends Supplier> { + public List get(); +} \ No newline at end of file diff --git a/src/main/java/forge/card/MetaSet.java b/src/main/java/forge/card/MetaSet.java index 7da165aead1..dc37be2d0b3 100644 --- a/src/main/java/forge/card/MetaSet.java +++ b/src/main/java/forge/card/MetaSet.java @@ -19,14 +19,16 @@ package forge.card; import java.io.File; -import java.util.ArrayList; import java.util.List; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; + import forge.Singletons; import forge.game.limited.CustomLimited; import forge.item.CardDb; import forge.item.CardPrinted; -import forge.item.ItemPool; +import forge.item.IPaperCard; import forge.util.FileUtil; /** @@ -90,10 +92,21 @@ import forge.util.FileUtil; * */ public class MetaSet { + + private enum MetaSetType { + Full, + Cube, + JoinedSet, + Choose, + Random, + Booster, + Pack + } - private final String type; + private final MetaSetType type; private final String data; private final String code; + private final boolean draftable; // private BoosterGenerator boosterGen; /** @@ -103,48 +116,26 @@ public class MetaSet { * @param creationString * a {@link java.lang.String} object. */ - public MetaSet(final String creationString) { + public MetaSet(final String creationString, boolean canDraft) { + int idxFirstPar = creationString.indexOf('('); + int idxLastPar = creationString.lastIndexOf(')'); + draftable = canDraft; + type = MetaSetType.valueOf(creationString.substring(0, idxFirstPar).trim()); + data = creationString.substring(idxFirstPar + 1, idxLastPar); + String description = creationString.substring(idxLastPar + 1); - String[] kv = new String [3]; - kv[0] = creationString.substring(0, creationString.indexOf('/')); - kv[1] = creationString.substring(creationString.indexOf('/') + 1, creationString.lastIndexOf('/')); - kv[2] = creationString.substring(creationString.lastIndexOf('/') + 1); - // Display the parse results: - // System.out.println("KV = '" + kv[0] + "', '" + kv[1] + "', '" + kv[2] + "'"); + 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; - type = kv[0]; - data = kv[1]; - - if ("cube".equalsIgnoreCase(type)) { - code = "*C:" + kv[2]; + default: throw new RuntimeException("Invalid MetaSet type: " + type); } - else if ("full".equalsIgnoreCase(type)) { - code = "*FULL"; - } - else if ("meta".equalsIgnoreCase(type)) { - code = "*B:" + kv[2]; - } - else if ("choose1".equalsIgnoreCase(type)) { - code = "*!:" + kv[2]; - } - else if ("random1".equalsIgnoreCase(type)) { - code = "*?:" + kv[2]; - } - else if ("combo".equalsIgnoreCase(type)) { - code = "*+:" + kv[2]; - } - else if ("booster".equalsIgnoreCase(type)) { - code = "*" + kv[2]; - } - else if ("pack".equalsIgnoreCase(type)) { - code = "*" + kv[2] + "(S)"; - } - else { - code = null; - throw new RuntimeException("Invalid MetaSet type: " + type); - } - } /** @@ -157,152 +148,57 @@ public class MetaSet { return code; } - /** - * Return the type. - * - * @return - * String, type - */ - public final String getType() { - return type; - } - /** * * Attempt to get a booster. * * @return UnOpenedProduct, the generated booster. */ - public UnOpenedProduct getBooster() { + public IUnOpenedProduct getBooster() { - ItemPool cardPool = null; + switch(type) { + case Full: + return new UnOpenedProduct(BoosterTemplate.genericBooster); - if ("meta".equalsIgnoreCase(type) || "choose1".equalsIgnoreCase(type) - || "random1".equalsIgnoreCase(type) || "combo".equalsIgnoreCase(type)) { - cardPool = new ItemPool(CardPrinted.class); - } + case Booster: + return new UnOpenedProduct(Singletons.getModel().getBoosters().get(data)); - if ("cube".equalsIgnoreCase(type)) { + case Pack: + return new UnOpenedProduct(Singletons.getModel().getTournamentPacks().get(data)); - final File dFolder = new File("res/sealed/"); + case JoinedSet: + Predicate predicate = IPaperCard.Predicates.printedInSets(data.split(" ")); + Iterable pool = Iterables.filter(CardDb.instance().getAllCards(), predicate); + return new UnOpenedProduct(BoosterTemplate.genericBooster, pool); - if (!dFolder.exists()) { - throw new RuntimeException("GenerateSealed : folder not found -- folder is " + dFolder.getAbsolutePath()); - } + case Choose: + return new UnOpenedMeta(data, true); - if (!dFolder.isDirectory()) { - throw new RuntimeException("GenerateSealed : not a folder -- " + dFolder.getAbsolutePath()); - } + case Random: + return new UnOpenedMeta(data, false); - List dfData = FileUtil.readFile("res/sealed/" + data + ".sealed"); - final CustomLimited myCube = CustomLimited.parse(dfData, Singletons.getModel().getDecks().getCubes()); - - SealedProductTemplate fnPick = myCube.getIgnoreRarity() ? myCube.getSealedProductTemplate() : BoosterTemplate.genericBooster; - return new UnOpenedProduct(fnPick, myCube.getCardPool()); - } - else if ("full".equalsIgnoreCase(type)) { - return new UnOpenedProduct(BoosterTemplate.genericBooster); - } - else if ("meta".equalsIgnoreCase(type)) { - - // NOTE: The following code is far from ideal in a number of ways. If someone can - // think of a way to improve it, please do so. --BBU - // ItemPool cardPool = new ItemPool(CardPrinted.class); - for (CardPrinted aCard : CardDb.instance().getAllCards()) { - if (data.indexOf(aCard.getEdition()) > -1) { - cardPool.add(aCard); - // System.out.println("Added card" + aCard.getName()); - } - } - return new UnOpenedProduct(BoosterTemplate.genericBooster, cardPool); - } else if ("booster".equalsIgnoreCase(type)) { - return new UnOpenedProduct(Singletons.getModel().getBoosters().get(data)); - } else if ("pack".equalsIgnoreCase(type)) { - return new UnOpenedProduct(Singletons.getModel().getTournamentPacks().get(data)); - } else if ("choose1".equalsIgnoreCase(type)) { - return new UnOpenedMeta(data, true); - } else if ("random1".equalsIgnoreCase(type)) { - return new UnOpenedMeta(data, false); - } else if ("combo".equalsIgnoreCase(type)) { - final BoosterGenerator bpSets = new BoosterGenerator(); - return new UnOpenedProduct(BoosterTemplate.genericBooster, buildPool(data)); - } - else { - throw new RuntimeException("Cannot initialize boosters for: " + type); - } - } - - /** - * Build a cardpool for the 'combo' special MetaSet type. - * - * @param creationString - * the data that contains a collection of semicolon-separated metaset definitions - * @return ItemPool - * the collection of cards - * - */ - private ItemPool buildPool(final String creationString) { - - ItemPool cardPool = new ItemPool(CardPrinted.class); - - List metaSets = new ArrayList(); - final String[] metas = creationString.split(";"); - - for (int i = 0; i < metas.length; i++) { - - final String [] typeTest = metas[i].split("/"); - if (typeTest[0].equalsIgnoreCase("choose1") || typeTest[0].equalsIgnoreCase("random1") - || typeTest[0].equalsIgnoreCase("combo")) { - System.out.println("WARNING - MetaSet type '" + typeTest[0] + "' ignored in pool creation."); - } - else if (typeTest[0].equalsIgnoreCase("full")) { - for (CardPrinted aCard : CardDb.instance().getUniqueCards()) { - cardPool.add(aCard); - } - return cardPool; - } - final MetaSet addMeta = new MetaSet(metas[i]); - metaSets.add(addMeta); - } - - if (metaSets.size() < 1) { - return null; - } - - for (MetaSet mSet : metaSets) { - if (mSet.type.equalsIgnoreCase("meta") || mSet.type.equalsIgnoreCase("booster") - || mSet.type.equalsIgnoreCase("pack")) { - final String mData = new String(mSet.data); - for (CardPrinted aCard : CardDb.instance().getAllCards()) { - if (mData.indexOf(aCard.getEdition()) > -1) { - if (!cardPool.contains(aCard)) { - cardPool.add(aCard); - // System.out.println(mSet.type + " " + mData + ": Added card: " + aCard.getName()); - } - } - } - } else if (mSet.type.equalsIgnoreCase("cube")) { + case Cube: final File dFolder = new File("res/sealed/"); if (!dFolder.exists()) { - throw new RuntimeException("GenerateSealed : folder not found -- folder is " - + dFolder.getAbsolutePath()); + throw new RuntimeException("GenerateSealed : folder not found -- folder is " + dFolder.getAbsolutePath()); } if (!dFolder.isDirectory()) { throw new RuntimeException("GenerateSealed : not a folder -- " + dFolder.getAbsolutePath()); } - List dfData = FileUtil.readFile("res/sealed/" + mSet.data + ".sealed"); + List dfData = FileUtil.readFile("res/sealed/" + data + ".sealed"); final CustomLimited myCube = CustomLimited.parse(dfData, Singletons.getModel().getDecks().getCubes()); - for (CardPrinted aCard : myCube.getCardPool().toFlatList()) { - if (!cardPool.contains(aCard)) { - cardPool.add(aCard); - // System.out.println(mSet.type + " " + mSet.data + ": Added card: " + aCard.getName()); - } - } - } + + SealedProductTemplate fnPick = myCube.getSealedProductTemplate(); + return new UnOpenedProduct(fnPick, myCube.getCardPool()); + + default: return null; } - return cardPool; + } + + public boolean isDraftable() { + return draftable; } } diff --git a/src/main/java/forge/card/UnOpenedMeta.java b/src/main/java/forge/card/UnOpenedMeta.java index 42536c525ac..e35c46a86a1 100644 --- a/src/main/java/forge/card/UnOpenedMeta.java +++ b/src/main/java/forge/card/UnOpenedMeta.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import forge.Singletons; import forge.gui.GuiChoose; import forge.item.CardPrinted; import forge.util.MyRandom; @@ -30,14 +29,12 @@ import forge.util.MyRandom; /** * This type extends UnOpenedProduct to support booster choice or random boosters * in sealed deck games. See MetaSet.java for further information. - * */ -public class UnOpenedMeta extends UnOpenedProduct { + +public class UnOpenedMeta implements IUnOpenedProduct { private final ArrayList metaSets; - private final boolean choice; - private List partiality; - private final int partialityPreference = 100; // Otherwise guild sealed will result in silly combinations + private final boolean canChoose; private final Random generator = MyRandom.getRandom(); /** @@ -48,60 +45,23 @@ public class UnOpenedMeta extends UnOpenedProduct { * sets the random/choice status. */ public UnOpenedMeta(final String creationString, final boolean choose) { - // NOTE: we need to call the super constructor with something non-null, - // but it doesn't matter with what exactly, since we are overriding it - // in open() anyway. I'm using Portal because that makes it easier to - // spot if the code is misbehaving in certain ways. --BBU - super(Singletons.getModel().getBoosters().get("POR")); metaSets = new ArrayList(); - choice = choose; - final String[] metas = creationString.split(";"); - partiality = null; - for (int i = 0; i < metas.length; i++) { - final MetaSet addMeta = new MetaSet(metas[i]); - metaSets.add(addMeta); + canChoose = choose; + + + for(String m : creationString.split(";")) { + metaSets.add(new MetaSet(m, true)); } } - - /** - * Adds to partiality info. - * @param addString - * String, add partiality for this String. - */ - private void addPartiality(final String addString) { - if (!hasPartiality(addString)) { - partiality.add(addString); - } - } - - /** - * Checks if the AI has a partiality for this set. - * @param partialString - * String, check partiality for this. - */ - private boolean hasPartiality(final String partialString) { - - if (partiality.isEmpty()) { - return false; - } - - for (final String cmp : partiality) { - if (partialString.equals(cmp)) { - return true; - } - } - return false; - } - /** * Open the booster pack, return contents. * @return List, list of cards. */ @Override public List get() { - return this.open(true, null); + return this.open(true); } /** @@ -113,14 +73,13 @@ public class UnOpenedMeta extends UnOpenedProduct { * @return List, list of cards. */ - public List open(final boolean isHuman, List partialities) { + public List open(final boolean isHuman) { if (metaSets.size() < 1) { throw new RuntimeException("Empty UnOpenedMetaset, cannot generate booster."); } - if (choice) { - + if (canChoose) { if (isHuman) { final List choices = new ArrayList(); @@ -131,7 +90,7 @@ public class UnOpenedMeta extends UnOpenedProduct { for (int i = 0; i < metaSets.size(); i++) { if (o.toString().equals(metaSets.get(i).getCode())) { - final UnOpenedProduct newBooster = metaSets.get(i).getBooster(); + final IUnOpenedProduct newBooster = metaSets.get(i).getBooster(); return newBooster.get(); } } @@ -139,50 +98,14 @@ public class UnOpenedMeta extends UnOpenedProduct { throw new RuntimeException("Could not find MetaSet " + o.toString()); } else { - partiality = partialities; - int selected = -1; - - if (partiality == null || partiality.isEmpty()) { - // System.out.println("No partiality yet"); - selected = generator.nextInt(metaSets.size()); - // System.out.println("AI randomly chose " + metaSets.get(selected).getCode()); - if (partiality != null) { - addPartiality(metaSets.get(selected).getCode()); - } - } - else { - for (int i = 0; i < metaSets.size(); i++) { - if (hasPartiality(metaSets.get(i).getCode()) && MyRandom.percentTrue(partialityPreference)) { - // System.out.println("AI chose " + metaSets.get(i).getCode() + " because of partiality."); - selected = i; - break; - } - } - } - - if (selected == -1) { - selected = generator.nextInt(metaSets.size()); - if (partiality != null) { - addPartiality(metaSets.get(selected).getCode()); - } - // System.out.println("AI chose " + metaSets.get(selected).getCode() + " because partiality not established or failed percentage test."); - } - final UnOpenedProduct newBooster = metaSets.get(selected).getBooster(); + int selected = generator.nextInt(metaSets.size()); + final IUnOpenedProduct newBooster = metaSets.get(selected).getBooster(); return newBooster.get(); } } else { int selected = generator.nextInt(metaSets.size()); - // System.out.println("RANDOMLY got " + metaSets.get(selected).getCode()); - - // It may actually seem slightly unfair to allow the computer change its partialities based - // on the random sets it gets since the player can't do the same...but, OTOH, this could also - // work against the computer, if this results in a bad partiality choice. --BBU - if (!isHuman && partiality != null && MyRandom.percentTrue(partialityPreference)) { - addPartiality(metaSets.get(selected).getCode()); - // System.out.println("AI decided to add " + metaSets.get(selected).getCode() + " to partialities."); - } - final UnOpenedProduct newBooster = metaSets.get(selected).getBooster(); + final IUnOpenedProduct newBooster = metaSets.get(selected).getBooster(); return newBooster.get(); } } diff --git a/src/main/java/forge/card/UnOpenedProduct.java b/src/main/java/forge/card/UnOpenedProduct.java index e5bf921553c..4c0550fe6d5 100644 --- a/src/main/java/forge/card/UnOpenedProduct.java +++ b/src/main/java/forge/card/UnOpenedProduct.java @@ -2,16 +2,11 @@ package forge.card; import java.util.List; -import com.google.common.base.Supplier; import forge.item.CardPrinted; import forge.item.ItemPoolView; -/** - * TODO: Write javadoc for this type. - * - */ -public class UnOpenedProduct implements Supplier> { +public class UnOpenedProduct implements IUnOpenedProduct { private final ItemPoolView cards; private final Iterable cardPoolFlat; diff --git a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java index dfcf4e124cb..111d5db0333 100644 --- a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java +++ b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java @@ -19,19 +19,13 @@ package forge.card.cardfactory; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.Map.Entry; -import com.google.common.collect.Iterables; - import forge.Card; import forge.CardLists; import forge.CardPredicates; import forge.FThreads; import forge.CardPredicates.Presets; -import forge.Constant; -import forge.card.CardType; import forge.card.cost.Cost; import forge.card.mana.ManaCost; import forge.card.spellability.Spell; diff --git a/src/main/java/forge/game/limited/BoosterDraft.java b/src/main/java/forge/game/limited/BoosterDraft.java index a4a72d835e1..8932b537820 100644 --- a/src/main/java/forge/game/limited/BoosterDraft.java +++ b/src/main/java/forge/game/limited/BoosterDraft.java @@ -24,10 +24,13 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.NoSuchElementException; +import java.util.Stack; import java.util.TreeMap; import javax.swing.JOptionPane; +import org.apache.commons.lang.ArrayUtils; + import com.google.common.base.Supplier; import forge.Card; @@ -37,6 +40,7 @@ import forge.card.BoosterGenerator; import forge.card.BoosterTemplate; import forge.card.CardBlock; import forge.card.CardEdition; +import forge.card.IUnOpenedProduct; import forge.card.SealedProductTemplate; import forge.card.UnOpenedProduct; import forge.deck.Deck; @@ -96,63 +100,37 @@ public final class BoosterDraft implements IBoosterDraft { case Block: case FantasyBlock: // Draft from cards by block or set List blocks = new ArrayList(); - IStorageView storage = draftType == CardPoolLimitation.Block ? Singletons.getModel().getBlocks() : Singletons.getModel().getFantasyBlocks(); for (CardBlock b : storage) { - if (b.hasMetaSetType("choose1") || b.hasMetaSetType("random1")) { - System.out.println("Ignoring block " + b.getName() + " because its MetaSet types are not supported in Draft."); - } else { - blocks.add(b); - } + blocks.add(b); } - final CardBlock block = GuiChoose.one("Choose Block", blocks); final CardEdition[] cardSets = block.getSets(); - final String[] sets = new String[cardSets.length + block.getNumberMetaSets()]; + final Stack sets = new Stack(); for (int k = cardSets.length - 1; k >= 0; --k) { - sets[k] = cardSets[k].getCode(); + sets.add(cardSets[k].getCode()); } - if (block.getNumberMetaSets() > 0) { - - int j = cardSets.length; - - for (int k = 0; k < block.getNumberMetaSets(); k++) { - sets[j + k] = block.getMetaSet(k).getCode(); - } + for(String setCode : block.getMetaSetNames() ) { + if ( block.getMetaSet(setCode).isDraftable() ) + sets.push(setCode); // to the beginning } final int nPacks = block.getCntBoostersDraft(); - final List setCombos = getSetCombos(sets); - while (setCombos == null) { - throw new RuntimeException("Unsupported amount of packs (" + nPacks + ") in a Draft block!"); - } - - if (sets.length > 1) { - final Object p = GuiChoose.one("Choose Set Combination", setCombos); + if (sets.size() > 1) { + final Object p = GuiChoose.one("Choose Set Combination", getSetCombos(sets)); final String[] pp = p.toString().split("/"); for (int i = 0; i < nPacks; i++) { - if (pp[i].charAt(0) == '*') { - this.product.add(block.getBooster(pp[i])); - } - else { - this.product.add( - new UnOpenedProduct(Singletons.getModel().getBoosters().get(pp[i]))); - } + this.product.add(block.getBooster(pp[i])); } } else { - UnOpenedProduct product1; - if (sets[0].charAt(0) == '*') { - product1 = block.getBooster(sets[0]); - } - else { - product1 = new UnOpenedProduct(Singletons.getModel().getBoosters().get(sets[0])); - } + IUnOpenedProduct product1 = block.getBooster(sets.get(0)); + for (int i = 0; i < nPacks; i++) { this.product.add(product1); } @@ -368,8 +346,9 @@ public final class BoosterDraft implements IBoosterDraft { HttpUtil.upload(NewConstants.URL_DRAFT_UPLOAD + "?fmt=" + draftFormat, outDraftData); } - private ArrayList getSetCombos(final String[] sets) { - ArrayList setCombos = new ArrayList(); + private List getSetCombos(final List setz) { + String[] sets = setz.toArray(ArrayUtils.EMPTY_STRING_ARRAY); + List setCombos = new ArrayList(); if (sets.length >= 2) { setCombos.add(String.format("%s/%s/%s", sets[0], sets[0], sets[0])); setCombos.add(String.format("%s/%s/%s", sets[0], sets[0], sets[1])); diff --git a/src/main/java/forge/game/limited/CustomLimited.java b/src/main/java/forge/game/limited/CustomLimited.java index 07038082a2a..3cfe619b44e 100644 --- a/src/main/java/forge/game/limited/CustomLimited.java +++ b/src/main/java/forge/game/limited/CustomLimited.java @@ -60,13 +60,6 @@ public class CustomLimited extends DeckBase { private static final long serialVersionUID = 7435640939026612173L; - /** The Ignore rarity. */ - private boolean ignoreRarity; - - /** The Singleton. */ - private boolean singleton = false; - - /** The Num packs. */ private int numPacks = 3; @@ -109,8 +102,6 @@ public class CustomLimited extends DeckBase { slots = BoosterTemplate.genericBooster.getSlots(); final CustomLimited cd = new CustomLimited(data.get("Name"), slots); - cd.setIgnoreRarity(data.getBoolean("IgnoreRarity")); - cd.setSingleton(data.getBoolean("Singleton")); cd.landSetCode = data.get("LandSetCode"); cd.numPacks = data.getInt("NumPacks"); final Deck deckCube = cubes.get(data.get("DeckFile")); @@ -140,44 +131,6 @@ public class CustomLimited extends DeckBase { this.numPacks = numPacksIn; } - /** - * Gets the singleton. - * - * @return the singleton - */ - public boolean getSingleton() { - return this.singleton; - } - - /** - * Sets the singleton. - * - * @param singletonIn - * the singleton to set - */ - public void setSingleton(final boolean singletonIn) { - this.singleton = singletonIn; - } - - /** - * Gets the ignore rarity. - * - * @return the ignoreRarity - */ - public boolean getIgnoreRarity() { - return this.ignoreRarity; - } - - /** - * Sets the ignore rarity. - * - * @param ignoreRarityIn - * the ignoreRarity to set - */ - public void setIgnoreRarity(final boolean ignoreRarityIn) { - this.ignoreRarity = ignoreRarityIn; - } - /** * Gets the land set code. * diff --git a/src/main/java/forge/game/limited/SealedDeckFormat.java b/src/main/java/forge/game/limited/SealedDeckFormat.java index 5248bc93c89..13d07b7b399 100644 --- a/src/main/java/forge/game/limited/SealedDeckFormat.java +++ b/src/main/java/forge/game/limited/SealedDeckFormat.java @@ -20,13 +20,17 @@ package forge.game.limited; import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.Stack; import javax.swing.JOptionPane; +import org.apache.commons.lang.ArrayUtils; + import forge.Singletons; import forge.card.BoosterTemplate; import forge.card.CardBlock; import forge.card.CardEdition; +import forge.card.IUnOpenedProduct; import forge.card.UnOpenedMeta; import forge.card.UnOpenedProduct; import forge.gui.GuiChoose; @@ -45,8 +49,7 @@ import forge.util.FileUtil; * @since 1.0.15 */ public class SealedDeckFormat { - private final ArrayList product = new ArrayList(); - private List partiality; + private final ArrayList product = new ArrayList(); /** The Land set code. */ private String[] landSetCode = { "" }; @@ -60,9 +63,6 @@ public class SealedDeckFormat { * a {@link java.lang.String} object. */ public SealedDeckFormat(final String sealedType) { - - partiality = new ArrayList(); - if (sealedType.equals("Full")) { // Choose number of boosters final Integer[] integers = new Integer[10]; @@ -96,20 +96,16 @@ public class SealedDeckFormat { final CardBlock block = GuiChoose.one("Choose Block", blocks); final CardEdition[] cardSets = block.getSets(); - final String[] sets = new String[cardSets.length + block.getNumberMetaSets()]; + final Stack sets = new Stack(); + for (int k = cardSets.length - 1; k >= 0; --k) { - sets[k] = cardSets[k].getCode(); + sets.add(cardSets[k].getCode()); } final int nPacks = block.getCntBoostersSealed(); - if (block.getNumberMetaSets() > 0) { - - int j = cardSets.length; - - for (int k = 0; k < block.getNumberMetaSets(); k++) { - sets[j + k] = block.getMetaSet(k).getCode(); - } + for(String ms : block.getMetaSetNames()) { + sets.push(ms); } final List setCombos = getSetCombos(sets, nPacks); @@ -118,7 +114,7 @@ public class SealedDeckFormat { throw new RuntimeException("Unsupported amount of packs (" + nPacks + ") in a Sealed Deck block!"); } - if (sets.length > 1) { + if (sets.size() > 1) { final Object p = GuiChoose.one("Choose Set Combination", setCombos); final String[] pp = p.toString().split("/"); @@ -210,13 +206,8 @@ public class SealedDeckFormat { } } } else { - UnOpenedProduct product1; - if (sets[0].charAt(0) == '*') { - product1 = block.getBooster(sets[0]); - } - else { - product1 = new UnOpenedProduct(Singletons.getModel().getBoosters().get(sets[0])); - } + IUnOpenedProduct product1; + product1 = block.getBooster(sets.get(0)); // Choose number of boosters final Integer[] integers = new Integer[10]; @@ -296,7 +287,8 @@ public class SealedDeckFormat { * * @return an ArrayList of the set choices. */ - private ArrayList getSetCombos(final String[] sets, final int nPacks) { + private ArrayList getSetCombos(final List setz, final int nPacks) { + String[] sets = setz.toArray(ArrayUtils.EMPTY_STRING_ARRAY); ArrayList setCombos = new ArrayList(); if (nPacks == 3) { @@ -398,24 +390,24 @@ public class SealedDeckFormat { setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0])); } else { // Default to 6 packs - if (sets.length >= 2) { - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[0], sets[0], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[1], sets[1], sets[1], sets[0], sets[0], sets[0])); + if (sets.length >= 6) { + setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[5], sets[4], sets[3], sets[2], sets[1], sets[0])); } - if (sets.length >= 3) { - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[2], sets[2], sets[2], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[2], sets[2], sets[1], sets[1], sets[0], sets[0])); + if (sets.length >= 5) { + setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[1], sets[0], sets[0])); } if (sets.length >= 4) { setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[3], sets[2], sets[1], sets[0], sets[0], sets[0])); setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[3], sets[2], sets[1], sets[1], sets[0], sets[0])); } - if (sets.length >= 5) { - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[1], sets[0], sets[0])); + if (sets.length >= 3) { + setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[2], sets[2], sets[2], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[2], sets[2], sets[1], sets[1], sets[0], sets[0])); } - if (sets.length >= 6) { - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[5], sets[4], sets[3], sets[2], sets[1], sets[0])); + if (sets.length >= 2) { + setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[1], sets[1], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[0], sets[0], sets[0], sets[0], sets[0], sets[0])); } } return setCombos; @@ -443,16 +435,12 @@ public class SealedDeckFormat { */ public ItemPool getCardpool(final boolean isHuman) { - if (!isHuman) { - if (!partiality.isEmpty()) { - partiality.clear(); - } - } + final ItemPool pool = new ItemPool(CardPrinted.class); - for (UnOpenedProduct prod : product) { + for (IUnOpenedProduct prod : product) { if( prod instanceof UnOpenedMeta ) - pool.addAllFlat(((UnOpenedMeta) prod).open(isHuman, partiality)); + pool.addAllFlat(((UnOpenedMeta) prod).open(isHuman)); else pool.addAllFlat(prod.get()); } diff --git a/src/main/java/forge/game/player/HumanPlayer.java b/src/main/java/forge/game/player/HumanPlayer.java index 7feed31be18..ae8f7d24ab7 100644 --- a/src/main/java/forge/game/player/HumanPlayer.java +++ b/src/main/java/forge/game/player/HumanPlayer.java @@ -150,27 +150,6 @@ public class HumanPlayer extends Player { } } - private boolean payManaCostIfNeeded(final SpellAbility sa) { - final ManaCostBeingPaid manaCost; - if (sa.getSourceCard().isCopiedSpell() && sa.isSpell()) { - manaCost = new ManaCostBeingPaid(ManaCost.ZERO); - } else { - manaCost = new ManaCostBeingPaid(sa.getPayCosts().getTotalMana()); - manaCost.applySpellCostChange(sa); - } - - boolean isPaid = manaCost.isPaid(); - - if( !isPaid ) { - InputPayManaBase inputPay = new InputPayManaSimple(game, sa, manaCost); - FThreads.setInputAndWait(inputPay); - isPaid = inputPay.isPaid(); - } - return isPaid; - } - - - /** *

* playSpellAbility_NoStack. @@ -199,6 +178,25 @@ public class HumanPlayer extends Player { } } + private boolean payManaCostIfNeeded(final SpellAbility sa) { + final ManaCostBeingPaid manaCost; + if (sa.getSourceCard().isCopiedSpell() && sa.isSpell()) { + manaCost = new ManaCostBeingPaid(ManaCost.ZERO); + } else { + manaCost = new ManaCostBeingPaid(sa.getPayCosts().getTotalMana()); + manaCost.applySpellCostChange(sa); + } + + boolean isPaid = manaCost.isPaid(); + + if( !isPaid ) { + InputPayManaBase inputPay = new InputPayManaSimple(game, sa, manaCost); + FThreads.setInputAndWait(inputPay); + isPaid = inputPay.isPaid(); + } + return isPaid; + } + /** * choose optional additional costs. For HUMAN only * @param activator