From d3a47ccef7eba99e9756a89c66e6d80d98807d5e Mon Sep 17 00:00:00 2001 From: friarsol Date: Wed, 26 Aug 2020 22:52:19 -0400 Subject: [PATCH] Add double pick for double masters --- .../src/main/java/forge/card/CardEdition.java | 3 + forge-gui/res/draft/rankings.txt | 637 ++++++++++++++++++ forge-gui/res/editions/Double Masters.txt | 1 + .../main/java/forge/limited/BoosterDraft.java | 49 +- forge-gui/tools/RankingScraper.py | 4 +- 5 files changed, 673 insertions(+), 21 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index ce6289bb5f5..13d2ad422cf 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -123,6 +123,7 @@ public final class CardEdition implements Comparable { // immutable private String additionalUnlockSet = ""; private boolean smallSetOverride = false; private String boosterMustContain = ""; + private boolean doublePickToStartRound = false; private final CardInSet[] cards; private final Map tokenNormalized; @@ -190,6 +191,7 @@ public final class CardEdition implements Comparable { // immutable public String getAdditionalSheetForFoils() { return additionalSheetForFoils; } public String getAdditionalUnlockSet() { return additionalUnlockSet; } public boolean getSmallSetOverride() { return smallSetOverride; } + public boolean getDoublePickToStartRound() { return doublePickToStartRound; } public String getBoosterMustContain() { return boosterMustContain; } public CardInSet[] getCards() { return cards; } public boolean isModern() { return getDate().after(parseDate("2003-07-27")); } //8ED and above are modern except some promo cards and others @@ -377,6 +379,7 @@ public final class CardEdition implements Comparable { // immutable res.additionalUnlockSet = section.get("AdditionalSetUnlockedInQuest", ""); // e.g. Time Spiral Timeshifted (TSB) for Time Spiral res.smallSetOverride = section.getBoolean("TreatAsSmallSet", false); // for "small" sets with over 200 cards (e.g. Eldritch Moon) + res.doublePickToStartRound = section.getBoolean("DoublePick", false); // for "small" sets with over 200 cards (e.g. Eldritch Moon) res.boosterMustContain = section.get("BoosterMustContain", ""); // e.g. Dominaria guaranteed legendary creature return res; diff --git a/forge-gui/res/draft/rankings.txt b/forge-gui/res/draft/rankings.txt index 467179f78de..7c83a19ba14 100644 --- a/forge-gui/res/draft/rankings.txt +++ b/forge-gui/res/draft/rankings.txt @@ -1,4 +1,641 @@ //Rank|Name|Rarity|Set +#1|Angel of Sanctions|M|AKR +#2|Liliana, Death's Majesty|M|AKR +#3|Glorybringer|R|AKR +#4|The Scorpion God|M|AKR +#5|Archfiend of Ifnir|R|AKR +#6|The Locust God|M|AKR +#7|The Scarab God|M|AKR +#8|Gideon of the Trials|M|AKR +#9|Samut, Voice of Dissent|M|AKR +#10|Rhonas the Indomitable|M|AKR +#11|Grind Dust|R|AKR +#12|Nissa, Steward of Elements|M|AKR +#13|Hornet Queen|M|AKR +#14|Bontu's Last Reckoning|R|AKR +#15|Never Return|R|AKR +#16|Hour of Devastation|R|AKR +#17|Curator of Mysteries|R|AKR +#18|Unesh, Criosphinx Sovereign|M|AKR +#19|Insult Injury|R|AKR +#20|Cut Ribbons|R|AKR +#21|Samut, the Tested|M|AKR +#22|Wrath of God|R|AKR +#23|Jace, Unraveler of Secrets|M|AKR +#24|Drake Haven|R|AKR +#25|Vizier of Many Faces|R|AKR +#26|Pride Sovereign|R|AKR +#27|Vizier of the Menagerie|M|AKR +#28|Cast Out|U|AKR +#29|Earthshaker Khenra|R|AKR +#30|Majestic Myriarch|M|AKR +#31|God-Pharaoh's Gift|R|AKR +#32|Chandra, Pyromaster|M|AKR +#33|Crested Sunmare|M|AKR +#34|Desert's Hold|U|AKR +#35|Oketra the True|M|AKR +#36|Liliana's Mastery|R|AKR +#37|Abrade|U|AKR +#38|Struggle Survive|U|AKR +#39|Temmet, Vizier of Naktamun|R|AKR +#40|Sphinx's Revelation|M|AKR +#41|Hazoret the Fervent|M|AKR +#42|Resilient Khenra|R|AKR +#43|Sifter Wurm|U|AKR +#44|Neheb, the Worthy|R|AKR +#45|Nicol Bolas, God-Pharaoh|M|AKR +#46|Prepare Fight|R|AKR +#47|Dusk Dawn|R|AKR +#48|Hour of Revelation|R|AKR +#49|Deem Worthy|U|AKR +#50|Neheb, the Eternal|M|AKR +#51|Glory-Bound Initiate|R|AKR +#52|Oketra's Attendant|U|AKR +#53|Sand Strangler|U|AKR +#54|Trial of Zeal|U|AKR +#55|Anger of the Gods|R|AKR +#56|Sunscourge Champion|U|AKR +#57|Champion of Wits|R|AKR +#58|Kefnet the Mindful|M|AKR +#59|Sweltering Suns|R|AKR +#60|Aven Wind Guide|U|AKR +#61|Hapatra, Vizier of Poisons|R|AKR +#62|Trial of Solidarity|U|AKR +#63|Final Reward|C|AKR +#64|Ahn-Crop Crasher|U|AKR +#65|Magma Spray|C|AKR +#66|Open Fire|C|AKR +#67|Prowling Serpopard|R|AKR +#68|Farm Market|U|AKR +#69|Merciless Javelineer|U|AKR +#70|Nimble Obstructionist|R|AKR +#71|Ominous Sphinx|U|AKR +#72|Bone Picker|U|AKR +#73|Ruthless Sniper|U|AKR +#74|Cartouche of Strength|C|AKR +#75|Crocodile of the Crossing|U|AKR +#76|Ahn-Crop Champion|U|AKR +#77|Consign Oblivion|U|AKR +#78|River Hoopoe|U|AKR +#79|Edifice of Authority|U|AKR +#80|Compulsory Rest|C|AKR +#81|Fan Bearer|C|AKR +#82|Overwhelming Splendor|M|AKR +#83|Lay Claim|U|AKR +#84|Vizier of Tumbling Sands|U|AKR +#85|Baleful Ammit|U|AKR +#86|Gravedigger|U|AKR +#87|Burning-Fist Minotaur|U|AKR +#88|Mouth Feed|R|AKR +#89|Destined Lead|U|AKR +#90|Heaven Earth|R|AKR +#91|Khenra Charioteer|U|AKR +#92|Wayward Servant|U|AKR +#93|Mirage Mirror|R|AKR +#94|Pact of Negation|R|AKR +#95|Thoughtseize|R|AKR +#96|Aven Mindcensor|R|AKR +#97|Cartouche of Knowledge|C|AKR +#98|Bontu the Glorified|M|AKR +#99|Lord of the Accursed|U|AKR +#100|Fervent Paincaster|U|AKR +#101|Puncturing Blow|C|AKR +#102|Enigma Drake|U|AKR +#103|Honored Crop-Captain|U|AKR +#104|Obelisk Spider|U|AKR +#105|Perilous Vault|R|AKR +#106|Gust Walker|C|AKR +#107|Steward of Solidarity|U|AKR +#108|Pull from Tomorrow|R|AKR +#109|Vizier of the Anointed|U|AKR +#110|Torment of Hailfire|R|AKR +#111|Combat Celebrant|M|AKR +#112|Harsh Mentor|R|AKR +#113|Exemplar of Strength|U|AKR +#114|Shefet Monitor|U|AKR +#115|Driven Despair|R|AKR +#116|Desert of the Fervent|C|AKR +#117|Tah-Crop Elite|C|AKR +#118|Cartouche of Ambition|C|AKR +#119|Vile Manifestation|U|AKR +#120|Champion of Rhonas|R|AKR +#121|Hour of Promise|R|AKR +#122|Synchronized Strike|U|AKR +#123|Shadowstorm Vizier|U|AKR +#124|Start Finish|U|AKR +#125|Desert of the Glorified|C|AKR +#126|Desert of the Indomitable|C|AKR +#127|Desert of the True|C|AKR +#128|Demonic Pact|M|AKR +#129|Cartouche of Solidarity|C|AKR +#130|Oketra's Avenger|C|AKR +#131|Vizier of Deferment|U|AKR +#132|Aven Initiate|C|AKR +#133|Eternal of Harsh Truths|U|AKR +#134|Riddleform|U|AKR +#135|Splendid Agony|C|AKR +#136|Battlefield Scavenger|U|AKR +#137|Nef-Crop Entangler|C|AKR +#138|Hooded Brawler|C|AKR +#139|Rags Riches|R|AKR +#140|Rhonas's Monument|U|AKR +#141|Canyon Slough|R|AKR +#142|Desert of the Mindful|C|AKR +#143|Fetid Pools|R|AKR +#144|Irrigated Farmland|R|AKR +#145|Scattered Groves|R|AKR +#146|Sheltered Thicket|R|AKR +#147|Binding Mummy|C|AKR +#148|Dauntless Aven|C|AKR +#149|Commit Memory|R|AKR +#150|Shimmerscale Drake|C|AKR +#151|Wander in Death|C|AKR +#152|Wasteland Scorpion|C|AKR +#153|Defiant Greatmaw|U|AKR +#154|Naga Vitalist|C|AKR +#155|Oasis Ritualist|C|AKR +#156|Rhonas's Stalwart|C|AKR +#157|Trial of Strength|U|AKR +#158|Hollow One|R|AKR +#159|Sunset Pyramid|U|AKR +#160|Ifnir Deadlands|U|AKR +#161|Djeru's Resolve|C|AKR +#162|Aerial Guide|C|AKR +#163|Essence Scatter|C|AKR +#164|Hieroglyphic Illumination|C|AKR +#165|Spellweaver Eternal|C|AKR +#166|Supreme Will|U|AKR +#167|Unquenchable Thirst|C|AKR +#168|Blighted Bat|C|AKR +#169|Doomfall|U|AKR +#170|Trial of Ambition|U|AKR +#171|Cartouche of Zeal|C|AKR +#172|Khenra Scrapper|C|AKR +#173|Magmaroth|U|AKR +#174|Thresher Lizard|C|AKR +#175|Hope Tender|U|AKR +#176|Watchful Naga|U|AKR +#177|Appeal Authority|U|AKR +#178|Onward Victory|U|AKR +#179|Abandoned Sarcophagus|R|AKR +#180|Oketra's Monument|U|AKR +#181|Ramunap Ruins|U|AKR +#182|Shefet Dunes|U|AKR +#183|Wasp of the Bitter End|U|AKR +#184|Lord of Extinction|R|AKR +#185|Gideon's Intervention|R|AKR +#186|Impeccable Timing|C|AKR +#187|Vizier of Remedies|U|AKR +#188|Censor|U|AKR +#189|Cryptic Serpent|U|AKR +#190|Labyrinth Guardian|U|AKR +#191|Trial of Knowledge|U|AKR +#192|Cruel Reality|M|AKR +#193|Dread Wanderer|R|AKR +#194|Lethal Sting|C|AKR +#195|Nest of Scarabs|U|AKR +#196|Pitiless Vizier|C|AKR +#197|Razaketh, the Foulblooded|M|AKR +#198|Soulstinger|C|AKR +#199|Supernatural Stamina|C|AKR +#200|Unburden|C|AKR +#201|Desert Cerodon|C|AKR +#202|Bitterbow Sharpshooters|C|AKR +#203|Greater Sandwurm|C|AKR +#204|Quarry Hauler|C|AKR +#205|Spring Mind|U|AKR +#206|Wall of Forgotten Pharaohs|C|AKR +#207|Hashep Oasis|U|AKR +#208|Zealot of the God-Pharaoh|C|AKR +#209|Collected Company|R|AKR +#210|Aven of Enduring Hope|C|AKR +#211|Those Who Serve|C|AKR +#212|Unconventional Tactics|U|AKR +#213|Winds of Rebuke|C|AKR +#214|Horror of the Broken Lands|C|AKR +#215|Brute Strength|C|AKR +#216|Firebrand Archer|C|AKR +#217|Gilded Cerodon|C|AKR +#218|Thorned Moloch|C|AKR +#219|Ornery Kudu|C|AKR +#220|Shed Weakness|C|AKR +#221|Stinging Shot|C|AKR +#222|Forsake the Worldly|C|AKR +#223|Supply Caravan|C|AKR +#224|Floodwaters|C|AKR +#225|Naga Oracle|C|AKR +#226|Striped Riverwinder|C|AKR +#227|Doomed Dissenter|C|AKR +#228|Khenra Eternal|C|AKR +#229|Blur of Blades|C|AKR +#230|Pathmaker Initiate|C|AKR +#231|Pursue Glory|C|AKR +#232|Initiate's Companion|C|AKR +#233|Ramunap Excavator|R|AKR +#234|Sidewinder Naga|C|AKR +#235|Watchers of the Dead|U|AKR +#236|Evolving Wilds|C|AKR +#237|Ipnu Rivulet|U|AKR +#238|Anointer Priest|C|AKR +#239|Approach of the Second Sun|R|AKR +#240|Mighty Leap|C|AKR +#241|Renewed Faith|U|AKR +#242|Solitary Camel|C|AKR +#243|Countervailing Winds|C|AKR +#244|New Perspectives|R|AKR +#245|Strategic Planning|C|AKR +#246|Marauding Boneslasher|C|AKR +#247|Beneath the Sands|C|AKR +#248|Feral Prowler|C|AKR +#249|Sandwurm Convergence|R|AKR +#250|Claim Fame|U|AKR +#251|Reason Believe|R|AKR +#252|Reduce Rubble|U|AKR +#253|Throne of the God-Pharaoh|R|AKR +#254|Disposal Mummy|C|AKR +#255|In Oketra's Name|C|AKR +#256|Hekma Sentinels|C|AKR +#257|Seeker of Insight|C|AKR +#258|Seer of the Last Tomorrow|C|AKR +#259|Festering Mummy|C|AKR +#260|Bloodlust Inciter|C|AKR +#261|Imminent Doom|R|AKR +#262|Soul-Scar Mage|R|AKR +#263|Dissenter's Deliverance|C|AKR +#264|Pouncing Cheetah|C|AKR +#265|Refuse Cooperate|R|AKR +#266|Gate to the Afterlife|U|AKR +#267|Hazoret's Monument|U|AKR +#268|Cascading Cataracts|R|AKR +#269|Rest in Peace|R|AKR +#270|Sacred Cat|C|AKR +#271|Ancient Crab|C|AKR +#272|As Foretold|M|AKR +#273|Compelling Argument|C|AKR +#274|Slither Blade|C|AKR +#275|Miasmic Mummy|C|AKR +#276|Crash Through|C|AKR +#277|Nimble-Blade Khenra|C|AKR +#278|Tormenting Voice|C|AKR +#279|Manglehorn|U|AKR +#280|Oashra Cultivator|C|AKR +#281|Leave Chance|R|AKR +#282|Bontu's Monument|U|AKR +#283|Sunscorched Desert|C|AKR +#284|Anointed Procession|R|AKR +#285|Protection of the Hekma|U|AKR +#286|Dune Beetle|C|AKR +#287|Scarab Feast|C|AKR +#288|Kefnet's Monument|U|AKR +#289|Solemnity|R|AKR +#290|Haze of Pollen|C|AKR +#291|Failure Comply|R|AKR +#292|Crypt of the Eternals|U|AKR +#293|Trespasser's Curse|C|AKR +#294|By Force|U|AKR +#295|Glorious End|M|AKR +#296|Sixth Sense|U|AKR +#297|Scavenger Grounds|R|AKR +#298|Shatterstorm|R|AKR +#299|Chandra's Defeat|U|AKR +#300|Life Goes On|C|AKR +#301|Liliana's Defeat|U|AKR +#302|Shadow of the Grave|R|AKR +#303|Dispossess|R|AKR +//Rank|Name|Rarity|Set +#1|Karn Liberated|M|2XM +#2|Wurmcoil Engine|M|2XM +#3|The Scarab God|M|2XM +#4|Archangel of Thune|M|2XM +#5|Jace, the Mind Sculptor|M|2XM +#6|Atraxa, Praetors' Voice|M|2XM +#7|Batterskull|M|2XM +#8|Thragtusk|R|2XM +#9|Skithiryx, the Blight Dragon|M|2XM +#10|Sword of Fire and Ice|M|2XM +#11|Geth, Lord of the Vault|M|2XM +#12|Myr Battlesphere|R|2XM +#13|Falkenrath Aristocrat|R|2XM +#14|Vish Kal, Blood Arbiter|R|2XM +#15|Mana Crypt|M|2XM +#16|Riku of Two Reflections|M|2XM +#17|Walking Ballista|R|2XM +#18|Duplicant|R|2XM +#19|Progenitor Mimic|R|2XM +#20|Breya, Etherium Shaper|M|2XM +#21|Sword of Feast and Famine|M|2XM +#22|Sword of Body and Mind|M|2XM +#23|Terastodon|R|2XM +#24|Sword of War and Peace|M|2XM +#25|Avenger of Zendikar|M|2XM +#26|Cyclonic Rift|R|2XM +#27|Council's Judgment|R|2XM +#28|Basilisk Collar|R|2XM +#29|Brudiclad, Telchor Engineer|R|2XM +#30|Path to Exile|U|2XM +#31|Sen Triplets|M|2XM +#32|Sword of Light and Shadow|M|2XM +#33|Champion of Lambholt|R|2XM +#34|Sunforger|R|2XM +#35|Austere Command|R|2XM +#36|Stonehewer Giant|R|2XM +#37|Wrath of God|R|2XM +#38|Phyrexian Metamorph|R|2XM +#39|Hammer of Nazahn|R|2XM +#40|Sharuum the Hegemon|R|2XM +#41|Voice of Resurgence|R|2XM +#42|Rolling Earthquake|R|2XM +#43|Savageborn Hydra|R|2XM +#44|Dualcaster Mage|R|2XM +#45|Dark Confidant|M|2XM +#46|Karrthus, Tyrant of Jund|M|2XM +#47|Baleful Strix|R|2XM +#48|Blade Splicer|R|2XM +#49|Maelstrom Pulse|R|2XM +#50|Unlicensed Disintegration|U|2XM +#51|Abrade|C|2XM +#52|Grim Lavamancer|R|2XM +#53|Maze of Ith|R|2XM +#54|Isochron Scepter|R|2XM +#55|Awakening Zone|R|2XM +#56|Sphinx Summoner|U|2XM +#57|Land Tax|M|2XM +#58|Avacyn, Angel of Hope|M|2XM +#59|Noble Hierarch|R|2XM +#60|Doomed Necromancer|R|2XM +#61|Flickerwisp|U|2XM +#62|Cranial Plating|U|2XM +#63|Yavimaya's Embrace|U|2XM +#64|Cast Down|C|2XM +#65|Bosh, Iron Golem|R|2XM +#66|Fatal Push|U|2XM +#67|Galvanic Blast|U|2XM +#68|Ghor-Clan Rampager|U|2XM +#69|Geist of Saint Traft|M|2XM +#70|Sundering Titan|R|2XM +#71|Grand Architect|R|2XM +#72|Puresteel Paladin|R|2XM +#73|Swiftblade Vindicator|R|2XM +#74|Toxic Deluge|R|2XM +#75|Basalt Monolith|U|2XM +#76|Morkrut Banshee|U|2XM +#77|Selesnya Guildmage|U|2XM +#78|Conjurer's Closet|R|2XM +#79|Rhys the Redeemed|R|2XM +#80|Spellskite|R|2XM +#81|Magus of the Will|R|2XM +#82|Merciless Eviction|R|2XM +#83|Deepglow Skate|R|2XM +#84|Reclamation Sage|U|2XM +#85|Valorous Stance|U|2XM +#86|Dread Return|U|2XM +#87|Disciple of the Vault|U|2XM +#88|Lightning Greaves|U|2XM +#89|Brimstone Volley|U|2XM +#90|Serra Sphinx|U|2XM +#91|Izzet Charm|U|2XM +#92|Glassdust Hulk|U|2XM +#93|Esperzoa|U|2XM +#94|Adaptive Automaton|R|2XM +#95|Arixmethes, Slumbering Isle|R|2XM +#96|Skirsdag High Priest|R|2XM +#97|Liege of the Tangle|R|2XM +#98|Rage Reflection|R|2XM +#99|Pyrewild Shaman|U|2XM +#100|Kuldotha Flamefiend|U|2XM +#101|Master Splicer|U|2XM +#102|Thopter Engineer|U|2XM +#103|Executioner's Capsule|C|2XM +#104|Vengevine|M|2XM +#105|Imperial Recruiter|M|2XM +#106|Master of Etherium|R|2XM +#107|Kemba, Kha Regent|R|2XM +#108|Godo, Bandit Warlord|R|2XM +#109|Thoughtseize|R|2XM +#110|Disciple of Bolas|R|2XM +#111|Hidden Stockpile|U|2XM +#112|Myrsmith|U|2XM +#113|Ulvenwald Mysteries|U|2XM +#114|Ravenous Intruder|U|2XM +#115|Weapons Trainer|U|2XM +#116|Clear Shot|C|2XM +#117|Conclave Naturalists|C|2XM +#118|Doubling Season|M|2XM +#119|Chrome Mox|M|2XM +#120|Blasphemous Act|R|2XM +#121|Jhoira, Weatherlight Captain|R|2XM +#122|Hanna, Ship's Navigator|R|2XM +#123|Oblivion Stone|R|2XM +#124|Thirst for Knowledge|U|2XM +#125|Treasure Keeper|U|2XM +#126|Oubliette|U|2XM +#127|Deathreap Ritual|U|2XM +#128|Ovalchase Daredevil|U|2XM +#129|Pyrite Spellbomb|C|2XM +#130|Kozilek's Predator|C|2XM +#131|Glint-Sleeve Artisan|C|2XM +#132|Blinkmoth Nexus|R|2XM +#133|Endless Atlas|R|2XM +#134|Ratchet Bomb|R|2XM +#135|Death's Shadow|R|2XM +#136|Tuktuk the Explorer|R|2XM +#137|Bloodspore Thrinax|R|2XM +#138|Inkwell Leviathan|R|2XM +#139|Trash for Treasure|U|2XM +#140|Auriok Salvagers|U|2XM +#141|Pentad Prism|U|2XM +#142|Thopter Foundry|U|2XM +#143|Gelatinous Genesis|U|2XM +#144|Valor in Akros|U|2XM +#145|O-Naginata|U|2XM +#146|Golem Artisan|U|2XM +#147|Thraben Inspector|C|2XM +#148|Whisperer of the Wilds|C|2XM +#149|Faerie Mechanist|C|2XM +#150|Bone Picker|C|2XM +#151|Ancestral Blade|C|2XM +#152|Force of Will|M|2XM +#153|Lux Cannon|R|2XM +#154|Reshape|R|2XM +#155|Chord of Calling|R|2XM +#156|Stoneforge Mystic|R|2XM +#157|Tempered Steel|R|2XM +#158|Wound Reflection|R|2XM +#159|Treasure Mage|U|2XM +#160|Vampire Hexmage|U|2XM +#161|Woodland Champion|U|2XM +#162|Enlarge|U|2XM +#163|Bloodshot Trainee|U|2XM +#164|Rush of Knowledge|U|2XM +#165|Sphinx of the Guildpact|U|2XM +#166|Mishra's Factory|U|2XM +#167|Myr Retriever|C|2XM +#168|Lightning Axe|C|2XM +#169|Sift|C|2XM +#170|Twisted Abomination|C|2XM +#171|Cloudreader Sphinx|C|2XM +#172|Topple the Statue|C|2XM +#173|Crib Swap|C|2XM +#174|Angel of the Dawn|C|2XM +#175|Everflowing Chalice|C|2XM +#176|Arcum Dagsson|M|2XM +#177|Magus of the Abyss|R|2XM +#178|Engineered Explosives|R|2XM +#179|Cragganwick Cremator|R|2XM +#180|Master Transmuter|R|2XM +#181|Beacon of Unrest|R|2XM +#182|Mazirek, Kraul Death Priest|R|2XM +#183|Leonin Abunas|R|2XM +#184|Sword of the Meek|R|2XM +#185|Fencing Ace|U|2XM +#186|Chief of the Foundry|U|2XM +#187|Skullmulcher|U|2XM +#188|Sentinel of the Pearl Trident|U|2XM +#189|Painsmith|U|2XM +#190|Riddlesmith|U|2XM +#191|Drown in Sorrow|U|2XM +#192|Pongify|U|2XM +#193|Sandstone Oracle|U|2XM +#194|Cogwork Assembler|U|2XM +#195|Temur Battle Rage|C|2XM +#196|Elvish Aberration|C|2XM +#197|Parasitic Strix|C|2XM +#198|Sanctum Gargoyle|C|2XM +#199|Metalspinner's Puzzleknot|C|2XM +#200|Flayer Husk|C|2XM +#201|Darksteel Axe|C|2XM +#202|Crusader of Odric|C|2XM +#203|Sanctum Spirit|C|2XM +#204|Mox Opal|M|2XM +#205|Heat Shimmer|R|2XM +#206|Greater Good|R|2XM +#207|Mystic Gate|R|2XM +#208|Sunken Ruins|R|2XM +#209|Wooded Bastion|R|2XM +#210|Graven Cairns|R|2XM +#211|Fire-Lit Thicket|R|2XM +#212|Academy Ruins|R|2XM +#213|Ion Storm|R|2XM +#214|Shamanic Revelation|R|2XM +#215|Salvage Titan|R|2XM +#216|Goblin Guide|R|2XM +#217|Ad Nauseam|R|2XM +#218|Flooded Grove|R|2XM +#219|Rugged Prairie|R|2XM +#220|Twilight Mire|R|2XM +#221|Cascade Bluffs|R|2XM +#222|Fetid Heath|R|2XM +#223|Mesmeric Orb|R|2XM +#224|Manamorphose|U|2XM +#225|Hinder|U|2XM +#226|Coretapper|U|2XM +#227|Culling Dais|U|2XM +#228|Clone Shell|U|2XM +#229|Buried Ruin|U|2XM +#230|Chromatic Star|C|2XM +#231|Fierce Empath|C|2XM +#232|Battle-Rattle Shaman|C|2XM +#233|Argivian Restoration|C|2XM +#234|Defiant Salvager|C|2XM +#235|Apprentice Wizard|C|2XM +#236|Sickleslicer|C|2XM +#237|Cathodion|C|2XM +#238|Sculpting Steel|R|2XM +#239|Meddling Mage|R|2XM +#240|Ethersworn Canonist|R|2XM +#241|Heartbeat of Spring|R|2XM +#242|Well of Ideas|R|2XM +#243|High Market|R|2XM +#244|Mishra's Bauble|U|2XM +#245|Throne of Geth|U|2XM +#246|Ash Barrens|U|2XM +#247|Dismantle|U|2XM +#248|Invigorate|U|2XM +#249|Jhoira's Familiar|U|2XM +#250|Skinwing|C|2XM +#251|Ichor Wellspring|C|2XM +#252|Rapacious Dragon|C|2XM +#253|Salivating Gremlins|C|2XM +#254|Skinbrand Goblin|C|2XM +#255|Sylvan Might|C|2XM +#256|Chatter of the Squirrel|C|2XM +#257|Silumgar Scavenger|C|2XM +#258|Driver of the Dead|C|2XM +#259|Frogify|C|2XM +#260|Vulshok Gauntlets|C|2XM +#261|Magnifying Glass|C|2XM +#262|Golem-Skin Gauntlets|C|2XM +#263|Sneak Attack|M|2XM +#264|Glimmervoid|R|2XM +#265|Kuldotha Forgemaster|R|2XM +#266|Braids, Conjurer Adept|R|2XM +#267|Vexing Shusher|R|2XM +#268|Bloodbriar|C|2XM +#269|Ancient Stirrings|C|2XM +#270|Weapon Surge|C|2XM +#271|Kazuul's Toll Collector|C|2XM +#272|Might of the Masses|C|2XM +#273|Death-Hood Cobra|C|2XM +#274|Balduvian Rage|C|2XM +#275|Relic Runner|C|2XM +#276|Supernatural Stamina|C|2XM +#277|Metallic Rebuke|C|2XM +#278|Dire Fleet Hoarder|C|2XM +#279|Divest|C|2XM +#280|Strength of Arms|C|2XM +#281|Remember the Fallen|C|2XM +#282|Revoke Existence|C|2XM +#283|Peace Strider|C|2XM +#284|Masterwork of Ingenuity|R|2XM +#285|Phyrexian Revoker|R|2XM +#286|Veteran Explorer|U|2XM +#287|Expedition Map|U|2XM +#288|Brainstorm|C|2XM +#289|Orcish Vandal|C|2XM +#290|Cathartic Reunion|C|2XM +#291|Goblin Gaveleer|C|2XM +#292|Crushing Vines|C|2XM +#293|Glaze Fiend|C|2XM +#294|Heartless Pillage|C|2XM +#295|Corridor Monitor|C|2XM +#296|Costly Plunder|C|2XM +#297|Alabaster Mage|C|2XM +#298|Fortify|C|2XM +#299|Tumble Magnet|C|2XM +#300|Surge Node|C|2XM +#301|Iron Bully|C|2XM +#302|Iron League Steed|C|2XM +#303|Kaalia of the Vast|M|2XM +#304|Dark Depths|M|2XM +#305|Mana Echoes|M|2XM +#306|Open the Vaults|R|2XM +#307|Mana Reflection|R|2XM +#308|Fulminator Mage|R|2XM +#309|Darksteel Citadel|U|2XM +#310|Springleaf Drum|U|2XM +#311|Welding Jar|U|2XM +#312|Steel Sabotage|C|2XM +#313|Gleaming Barrier|C|2XM +#314|Eager Construct|C|2XM +#315|Accomplished Automaton|C|2XM +#316|Ensnaring Bridge|M|2XM +#317|Boon Reflection|R|2XM +#318|Thought Reflection|R|2XM +#319|Exploration|R|2XM +#320|Time Sieve|R|2XM +#321|Crop Rotation|U|2XM +#322|Vedalken Infuser|C|2XM +#323|Thespian's Stage|R|2XM +#324|Blood Moon|R|2XM +#325|Trinisphere|M|2XM +#326|Maelstrom Nexus|M|2XM +#327|Urza's Mine|C|2XM +#328|Urza's Power Plant|C|2XM +#329|Urza's Tower|C|2XM +#330|Ravenous Trap|R|2XM +#331|Blightsteel Colossus|M|2XM +#332|Darksteel Forge|M|2XM +//Rank|Name|Rarity|Set #1|Baneslayer Angel|M|M21 #2|Chandra, Heart of Fire|M|M21 #3|Massacre Wurm|M|M21 diff --git a/forge-gui/res/editions/Double Masters.txt b/forge-gui/res/editions/Double Masters.txt index c088e550891..5dec0146172 100644 --- a/forge-gui/res/editions/Double Masters.txt +++ b/forge-gui/res/editions/Double Masters.txt @@ -6,6 +6,7 @@ Type=Reprint BoosterCovers=3 Booster=8 Common, 3 Uncommon, 2 RareMythic, 2 fromSheet("2XM Foils") Foil=NotSupported +DoublePick=true [cards] 1 M Karn Liberated diff --git a/forge-gui/src/main/java/forge/limited/BoosterDraft.java b/forge-gui/src/main/java/forge/limited/BoosterDraft.java index c3a87e54373..c54ae9d13c9 100644 --- a/forge-gui/src/main/java/forge/limited/BoosterDraft.java +++ b/forge-gui/src/main/java/forge/limited/BoosterDraft.java @@ -57,6 +57,7 @@ public class BoosterDraft implements IBoosterDraft { private final List players = new ArrayList<>(); private LimitedPlayer localPlayer; + private boolean doublePickToStartRound = false; protected int nextBoosterGroup = 0; private int currentBoosterSize = 0; private int currentBoosterPick = 0; @@ -142,7 +143,11 @@ public class BoosterDraft implements IBoosterDraft { this.product.add(block.getBooster(pp[i])); } } else { - final IUnOpenedProduct product1 = block.getBooster(sets.get(0)); + // Only one set is chosen. If that set lets you draft 2 cards to start adjust draft settings now + String setCode = sets.get(0); + doublePickToStartRound = FModel.getMagicDb().getEditions().get(setCode).getDoublePickToStartRound(); + + final IUnOpenedProduct product1 = block.getBooster(setCode); for (int i = 0; i < nPacks; i++) { this.product.add(product1); @@ -357,6 +362,10 @@ public class BoosterDraft implements IBoosterDraft { public void passPacks() { // Alternate direction of pack passing int adjust = this.nextBoosterGroup % 2 == 1 ? 1 : -1; + if (this.doublePickToStartRound && currentBoosterPick == 1) { + adjust = 0; + } + for (int i = 0; i < N_PLAYERS; i++) { List passingPack = this.players.get(i).passPack(); @@ -494,26 +503,28 @@ public class BoosterDraft implements IBoosterDraft { } private void recordDraftPick(final List thisBooster, PaperCard c) { - if (ForgePreferences.UPLOAD_DRAFT) { - for (int i = 0; i < thisBooster.size(); i++) { - final PaperCard cc = thisBooster.get(i); - final String cnBk = cc.getName() + "|" + cc.getEdition(); + if (!ForgePreferences.UPLOAD_DRAFT) { + return; + } - float pickValue; - if (cc.equals(c)) { - pickValue = thisBooster.size() - * (1f - (((float) this.currentBoosterPick / this.currentBoosterSize) * 2f)); - } else { - pickValue = 0; - } + for (int i = 0; i < thisBooster.size(); i++) { + final PaperCard cc = thisBooster.get(i); + final String cnBk = cc.getName() + "|" + cc.getEdition(); - if (!this.draftPicks.containsKey(cnBk)) { - this.draftPicks.put(cnBk, pickValue); - } else { - final float curValue = this.draftPicks.get(cnBk); - final float newValue = (curValue + pickValue) / 2; - this.draftPicks.put(cnBk, newValue); - } + float pickValue; + if (cc.equals(c)) { + pickValue = thisBooster.size() + * (1f - (((float) this.currentBoosterPick / this.currentBoosterSize) * 2f)); + } else { + pickValue = 0; + } + + if (!this.draftPicks.containsKey(cnBk)) { + this.draftPicks.put(cnBk, pickValue); + } else { + final float curValue = this.draftPicks.get(cnBk); + final float newValue = (curValue + pickValue) / 2; + this.draftPicks.put(cnBk, newValue); } } } diff --git a/forge-gui/tools/RankingScraper.py b/forge-gui/tools/RankingScraper.py index f1711462b09..2a22b28f340 100644 --- a/forge-gui/tools/RankingScraper.py +++ b/forge-gui/tools/RankingScraper.py @@ -45,8 +45,8 @@ def smdsRankings(edition='EldritchMoon', name='Eldritch Moon'): return True -def draftsimRankings(edition='SOI', name='Shadows over Innistrad'): - r = requests.get("http://draftsim.com/%s.js" % edition) +def draftsimRankings(edition='2XM', name='Double Masters'): + r = requests.get("http://draftsim.com/generated/%s.js" % edition) tx = r.text start = tx.find('[') end = tx.rfind(']')