From 070a54fee2e277f3f7864702821e4aac75253bf6 Mon Sep 17 00:00:00 2001 From: paulsnoops Date: Tue, 11 Apr 2023 11:29:50 +0100 Subject: [PATCH 01/12] Booster Draft: MOM with ONE & SIR updates --- forge-gui/res/blockdata/blocks.txt | 1 + forge-gui/res/draft/rankings.txt | 1497 +++++++++++------ .../res/editions/March of the Machine.txt | 69 + .../Shadows over Innistrad Remastered.txt | 2 +- 4 files changed, 1034 insertions(+), 535 deletions(-) diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index 0cf7a3ae807..9785eda37d9 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -120,3 +120,4 @@ Phyrexia: All Will Be One, 3/6/ONE, ONE Phyrexia: All Will Be One Jumpstart, -/2/ONE, Meta-Choose(S(ONE Mite-y 1)Mite-y 1;S(ONE Mite-y 2)Mite-y 2;S(ONE Progress 1)Progress 1;S(ONE Progress 2)Progress 2;S(ONE Corruption 1)Corruption 1;S(ONE Corruption 2)Corruption 2;S(ONE Rebellious 1)Rebellious 1;S(ONE Rebellious 2)Rebellious 2;S(ONE Toxic 1)Toxic 1;S(ONE Toxic 2)Toxic 2)Themes Alchemy: Phyrexia, 3/6/ONE, YONE Shadows over Innistrad Remastered, 3/6/SIR, SIR +March of the Machine, 3/6/MOM, MOM diff --git a/forge-gui/res/draft/rankings.txt b/forge-gui/res/draft/rankings.txt index de0f8e3c4ab..697f47be79d 100644 --- a/forge-gui/res/draft/rankings.txt +++ b/forge-gui/res/draft/rankings.txt @@ -1,4 +1,357 @@ //Rank|Name|Rarity|Set +#1|Elesh Norn, Grand Cenobite|M|MUL +#2|Sheoldred, Whispering One|M|MUL +#3|Invasion of New Phyrexia|M|MOM +#4|Archangel Elspeth|M|MOM +#5|Glissa, Herald of Predation|R|MOM +#6|Sunfall|R|MOM +#7|Yorion, Sky Nomad|R|MUL +#8|Elesh Norn|M|MOM +#9|Vorinclex|M|MOM +#10|Etali, Primal Conqueror|R|MOM +#11|Boon-Bringer Valkyrie|R|MOM +#12|Yarok, the Desecrated|M|MUL +#13|Quintorius, Loremaster|R|MOM +#14|Zurgo and Ojutai|M|MOM +#15|Ancient Imperiosaur|R|MOM +#16|Aurelia, the Warleader|M|MUL +#17|Lutri, the Spellchaser|R|MUL +#18|Urabrask|M|MOM +#19|Sheoldred|M|MOM +#20|Wrenn and Realmbreaker|M|MOM +#21|Thalia and The Gitrog Monster|M|MOM +#22|Guardian of Ghirapur|R|MOM +#23|Chrome Host Seedshark|R|MOM +#24|Kroxa and Kunoros|M|MOM +#25|Skithiryx, the Blight Dragon|M|MUL +#26|Brudiclad, Telchor Engineer|R|MUL +#27|Grimgrin, Corpse-Born|M|MUL +#28|Borborygmos and Fblthp|M|MOM +#29|Drana and Linvala|R|MOM +#30|Ghalta and Mavren|R|MOM +#31|Hoarding Broodlord|R|MOM +#32|Inga and Esika|R|MOM +#33|Ozolith, the Shattered Spire|R|MOM +#34|Rampaging Raptor|R|MOM +#35|Glistening Dawn|R|MOM +#36|Gyruda, Doom of Depths|R|MUL +#37|Obosh, the Preypiercer|R|MUL +#38|Invasion of Fiora|R|MOM +#39|Invasion of Karsus|R|MOM +#40|Invasion of Tolvada|R|MOM +#41|Invasion of Innistrad|M|MOM +#42|Monastery Mentor|M|MOM +#43|Baral and Kari Zev|R|MOM +#44|Voldaren Thrillseeker|R|MOM +#45|Grafted Butcher|R|MOM +#46|Kogla and Yidaro|R|MOM +#47|Zephyr Singer|R|MOM +#48|Marshal of Zhalfir|U|MOM +#49|Kenrith, the Returned King|M|MUL +#50|Archpriest of Shadows|R|MOM +#51|Stoke the Flames|U|MOM +#52|Halo Forager|U|MOM +#53|Sword of Once and Future|M|MOM +#54|Errant and Giada|R|MOM +#55|Rankle and Torbran|R|MOM +#56|Progenitor Exarch|R|MOM +#57|Ayara, First of Locthwain|R|MUL +#58|Ragavan, Nimble Pilferer|M|MUL +#59|Atraxa, Praetors' Voice|M|MUL +#60|Judith, the Scourge Diva|R|MUL +#61|Keruga, the Macrosage|R|MUL +#62|Kroxa, Titan of Death's Hunger|M|MUL +#63|Invasion of Moag|U|MOM +#64|Polukranos Reborn|R|MOM +#65|Faerie Mastermind|R|MOM +#66|Chandra, Hope's Beacon|M|MOM +#67|Botanical Brawler|U|MOM +#68|Yargle and Multani|R|MOM +#69|Streetwise Negotiator|U|MOM +#70|Furnace Gremlin|U|MOM +#71|Tandem Takedown|U|MOM +#72|Deeproot Wayfinder|R|MOM +#73|Dusk Legion Duelist|R|MOM +#74|Collective Nightmare|U|MOM +#75|Djeru and Hazoret|R|MOM +#76|Bloated Processor|R|MOM +#77|Doomskar Warrior|R|MOM +#78|Urabrask the Hidden|M|MUL +#79|Invasion of Ravnica|M|MOM +#80|Heliod, the Radiant Dawn|R|MOM +#81|Harried Artisan|U|MOM +#82|Ayara, Widow of the Realm|R|MOM +#83|Khenra Spellspear|U|MOM +#84|Norn's Inquisitor|U|MOM +#85|Seal from Existence|U|MOM +#86|Hidetsugu and Kairi|R|MOM +#87|Zimone and Dina|R|MOM +#88|Elvish Vatkeeper|U|MOM +#89|Rampaging Geoderm|U|MOM +#90|Stormclaw Rager|U|MOM +#91|Compleated Huntmaster|U|MOM +#92|Anafenza, Kin-Tree Spirit|R|MUL +#93|Captain Lannery Storm|R|MUL +#94|Goreclaw, Terror of Qal Sisma|R|MUL +#95|Atris, Oracle of Half-Truths|R|MUL +#96|Umori, the Collector|R|MUL +#97|Zirda, the Dawnwaker|R|MUL +#98|Invasion of Segovia|R|MOM +#99|Kami of Whispered Hopes|U|MOM +#100|Pile On|R|MOM +#101|Oracle of Tragedy|U|MOM +#102|Horobi, Death's Wail|R|MUL +#103|Jegantha, the Wellspring|R|MUL +#104|Lurrus of the Dream-Den|R|MUL +#105|Taigam, Ojutai Master|R|MUL +#106|Invasion of Kaladesh|U|MOM +#107|Sun-Blessed Guardian|U|MOM +#108|Skyclave Aerialist|U|MOM +#109|Jin-Gitaxias|M|MOM +#110|Breach the Multiverse|R|MOM +#111|Joyful Stormsculptor|U|MOM +#112|Phyrexian Gargantua|U|MOM +#113|Mutagen Connoisseur|U|MOM +#114|Tiller of Flesh|U|MOM +#115|Nahiri's Warcrafting|R|MOM +#116|Phyrexian Awakening|U|MOM +#117|Volcanic Spite|C|MOM +#118|Niv-Mizzet Reborn|M|MUL +#119|Invasion of Amonkhet|U|MOM +#120|Invasion of Kaldheim|R|MOM +#121|Invasion of Belenon|U|MOM +#122|Invasion of Gobakhan|R|MOM +#123|Invasion of Ikoria|R|MOM +#124|Rona, Herald of Invasion|R|MOM +#125|Blightreaper Thallid|U|MOM +#126|Gnottvold Hermit|U|MOM +#127|Transcendent Message|R|MOM +#128|Omnath, Locus of All|R|MOM +#129|Sandstalker Moloch|U|MOM +#130|Gift of Compleation|U|MOM +#131|Xerex Strobe-Knight|U|MOM +#132|Mirror-Shield Hoplite|U|MOM +#133|Realmbreaker's Grasp|C|MOM +#134|Yedora, Grave Gardener|R|MUL +#135|Ezuri, Claw of Progress|M|MUL +#136|Invasion of Regatha|U|MOM +#137|Invasion of Xerex|U|MOM +#138|Invasion of Zendikar|U|MOM +#139|Invasion of Kamigawa|U|MOM +#140|Invasion of Azgol|U|MOM +#141|Invasion of Pyrulea|U|MOM +#142|Invasion of New Capenna|U|MOM +#143|Merciless Repurposing|U|MOM +#144|Into the Fire|R|MOM +#145|Sculpted Perfection|U|MOM +#146|Deadly Derision|C|MOM +#147|Surge of Salvation|U|MOM +#148|Meeting of Minds|C|MOM +#149|Cosmic Hunger|C|MOM +#150|Vanquish the Weak|C|MOM +#151|Daxos, Blessed by the Sun|U|MUL +#152|Fynn, the Fangbearer|U|MUL +#153|Raff, Weatherlight Stalwart|U|MUL +#154|Invasion of Tarkir|M|MOM +#155|Invasion of Muraganda|U|MOM +#156|Alabaster Host Sanctifier|C|MOM +#157|Bloodfeather Phoenix|R|MOM +#158|Knight-Errant of Eos|R|MOM +#159|Beamtown Beatstick|C|MOM +#160|Tribute to the World Tree|R|MOM +#161|Omen Hawker|U|MOM +#162|Ral's Reinforcements|C|MOM +#163|Protocol Knight|C|MOM +#164|Knight of the New Coalition|C|MOM +#165|Gloomfang Mauler|C|MOM +#166|Overgrown Pest|C|MOM +#167|Preening Champion|C|MOM +#168|Arixmethes, Slumbering Isle|R|MUL +#169|Firesong and Sunspeaker|R|MUL +#170|Imoti, Celebrant of Bounty|U|MUL +#171|Teysa Karlov|R|MUL +#172|Invasion of Vryn|U|MOM +#173|Invasion of Lorwyn|U|MOM +#174|Invasion of Mercadia|U|MOM +#175|Nezumi Freewheeler|U|MOM +#176|Skittering Surveyor|C|MOM +#177|Tangled Skyline|U|MOM +#178|Portent Tracker|C|MOM +#179|Alabaster Host Intercessor|C|MOM +#180|Final Flourish|C|MOM +#181|Emry, Lurker of the Loch|R|MUL +#182|Tetsuko Umezawa, Fugitive|U|MUL +#183|Vorinclex, Voice of Hunger|M|MUL +#184|Firja, Judge of Valor|U|MUL +#185|Kaheera, the Orphanguard|R|MUL +#186|Lathiel, the Bounteous Dawn|R|MUL +#187|Rona, Sheoldred's Faithful|U|MUL +#188|Seraph of New Capenna|U|MOM +#189|Herbology Instructor|U|MOM +#190|Elspeth's Smite|U|MOM +#191|Scrappy Bruiser|U|MOM +#192|Zhalfirin Lancer|U|MOM +#193|Ravenous Sailback|U|MOM +#194|Storm the Seedcore|U|MOM +#195|Ramosian Greatsword|U|MOM +#196|See Double|R|MOM +#197|Astral Wingspan|U|MOM +#198|Change the Equation|U|MOM +#199|Phyrexian Censor|U|MOM +#200|Seed of Hope|C|MOM +#201|Marauding Dreadship|C|MOM +#202|Corrupted Conviction|C|MOM +#203|Hangar Scrounger|C|MOM +#204|Thunderhead Squadron|C|MOM +#205|Attentive Skywarden|C|MOM +#206|War-Trained Slasher|C|MOM +#207|Wary Thespian|C|MOM +#208|Chomping Kavu|C|MOM +#209|Bola Slinger|C|MOM +#210|Sigiled Sentinel|C|MOM +#211|Nezumi Informant|C|MOM +#212|Tymaret, Chosen from Death|U|MUL +#213|Squee, the Immortal|R|MUL +#214|Valduk, Keeper of the Flame|U|MUL +#215|Zada, Hedron Grinder|U|MUL +#216|Renata, Called to the Hunt|U|MUL +#217|Aegar, the Freezing Flame|U|MUL +#218|Reyav, Master Smith|U|MUL +#219|Shanna, Sisay's Legacy|U|MUL +#220|Invasion of Ulgrotha|U|MOM +#221|Invasion of Kylem|U|MOM +#222|Invasion of Eldraine|U|MOM +#223|Invasion of Dominaria|U|MOM +#224|Invasion of Ixalan|R|MOM +#225|Invasion of Shandalar|M|MOM +#226|Captive Weird|U|MOM +#227|Aetherblade Agent|C|MOM +#228|Bloodfell Caves|C|MOM +#229|Blossoming Sands|C|MOM +#230|Dismal Backwater|C|MOM +#231|Jungle Hollow|C|MOM +#232|Rugged Highlands|C|MOM +#233|Scoured Barrens|C|MOM +#234|Swiftwater Cliffs|C|MOM +#235|Thornwood Falls|C|MOM +#236|Tranquil Cove|C|MOM +#237|Wind-Scarred Crag|C|MOM +#238|Ichor Drinker|C|MOM +#239|Enduring Bondwarden|C|MOM +#240|War Historian|C|MOM +#241|Wildwood Escort|C|MOM +#242|Timberland Ancient|C|MOM +#243|Iridescent Blademaster|C|MOM +#244|Searing Barb|C|MOM +#245|Cut Short|C|MOM +#246|Ephara's Dispersal|C|MOM +#247|Tidal Terror|C|MOM +#248|Failed Conversion|C|MOM +#249|Shivan Branch-Burner|U|MOM +#250|Kwende, Pride of Femeref|U|MUL +#251|Sram, Senior Edificer|R|MUL +#252|Thalia, Guardian of Thraben|R|MUL +#253|Inga Rune-Eyes|U|MUL +#254|Dina, Soul Steeper|U|MUL +#255|Juri, Master of the Revue|U|MUL +#256|Order of the Mirror|C|MOM +#257|Pyretic Prankster|C|MOM +#258|Bonded Herdbeast|C|MOM +#259|Moment of Truth|C|MOM +#260|Artistic Refusal|U|MOM +#261|Fearless Skald|U|MOM +#262|City on Fire|R|MOM +#263|Copper Host Crusher|U|MOM +#264|Tenured Oilcaster|C|MOM +#265|Halo-Charged Skaab|C|MOM +#266|Kithkin Billyrider|C|MOM +#267|Converter Beast|C|MOM +#268|Shatter the Source|C|MOM +#269|Placid Rottentail|C|MOM +#270|Oculus Whelp|C|MOM +#271|Serpent-Blade Assailant|C|MOM +#272|Atraxa's Fall|C|MOM +#273|Trailblazing Historian|C|MOM +#274|Redcap Heelslasher|C|MOM +#275|Onakke Javelineer|C|MOM +#276|Karsus Depthguard|C|MOM +#277|Furnace Host Charger|C|MOM +#278|Kor Halberd|C|MOM +#279|Sunder the Gateway|C|MOM +#280|Swordsworn Cavalier|C|MOM +#281|Eyes of Gitaxias|C|MOM +#282|Zhalfirin Shapecraft|C|MOM +#283|Bladed Battle-Fan|C|MOM +#284|Etched Familiar|C|MOM +#285|Flitting Guerilla|C|MOM +#286|Ichor Shade|C|MOM +#287|Unseal the Necropolis|C|MOM +#288|Corruption of Towashi|U|MOM +#289|Baral, Chief of Compliance|R|MUL +#290|Seizan, Perverter of Truth|R|MUL +#291|Yargle, Glutton of Urborg|U|MUL +#292|Radha, Coalition Warlord|U|MUL +#293|Mirrodin Avenged|C|MOM +#294|Furnace Reins|U|MOM +#295|Kitesail|C|MOM +#296|Halo Hopper|C|MOM +#297|Blighted Burgeoning|C|MOM +#298|Wrenn's Resolve|C|MOM +#299|Thrashing Frontliner|C|MOM +#300|Angelic Intervention|C|MOM +#301|Golden-Scale Aeronaut|C|MOM +#302|Infected Defector|C|MOM +#303|Scrollshift|C|MOM +#304|Disturbing Conversion|C|MOM +#305|Expedition Lookout|C|MOM +#306|Furtive Analyst|C|MOM +#307|Stasis Field|C|MOM +#308|Consuming Aetherborn|C|MOM +#309|Dreg Recycler|C|MOM +#310|Etched Host Doombringer|C|MOM +#311|Invasion of Theros|R|MOM +#312|Urn of Godfire|C|MOM +#313|Fertilid's Favor|C|MOM +#314|Crystal Carapace|C|MOM +#315|Arachnoid Adaptation|C|MOM +#316|Aerial Boost|C|MOM +#317|Assimilate Essence|C|MOM +#318|Saiba Cryptomancer|C|MOM +#319|Akki Scrapchomper|C|MOM +#320|Burning Sun's Fury|C|MOM +#321|Jin-Gitaxias, Core Augur|M|MUL +#322|Tarkir Duneshaper|C|MOM +#323|Traumatic Revelation|C|MOM +#324|Complete the Circuit|R|MOM +#325|Flywheel Racer|C|MOM +#326|Mirran Banesplitter|C|MOM +#327|Coming In Hot|C|MOM +#328|Realmbreaker, the Invasion Tree|R|MOM +#329|Phyrexian Archivist|C|MOM +#330|Vengeant Earth|C|MOM +#331|Inspired Charge|C|MOM +#332|Negate|C|MOM +#333|Render Inert|U|MOM +#334|Glistening Deluge|U|MOM +#335|Lithomantic Barrage|U|MOM +#336|Invasion of Alara|R|MOM +#337|Invasion of Arcavios|R|MOM +#338|Plains 1|C|MOM +#339|Plains 2|C|MOM +#340|Plains 3|C|MOM +#341|Island 1|C|MOM +#342|Island 2|C|MOM +#343|Island 3|C|MOM +#344|Swamp 1|C|MOM +#345|Swamp 2|C|MOM +#346|Swamp 3|C|MOM +#347|Mountain 1|C|MOM +#348|Mountain 2|C|MOM +#349|Mountain 3|C|MOM +#350|Forest 1|C|MOM +#351|Forest 2|C|MOM +#352|Forest 3|C|MOM +//Rank|Name|Rarity|Set #1|Archangel Avacyn|M|SIR #2|Sorin, Grim Nemesis|M|SIR #3|Arlinn Kord|M|SIR @@ -16,542 +369,618 @@ #15|Ulrich of the Krallenhorde|R|SIR #16|Dark Salvation|R|SIR #17|Tireless Tracker|R|SIR -#18|Always Watching|R|SIR -#19|Avacyn's Judgment|R|SIR -#20|Collective Effort|R|SIR -#21|Heron's Grace Champion|R|SIR -#22|Thalia, Heretic Cathar|R|SIR -#23|Collective Defiance|R|SIR -#24|Emrakul, the Promised End|M|SIR -#25|Nahiri's Wrath|M|SIR -#26|Spell Queller|R|SIR -#27|Bloodhall Priest|R|SIR -#28|Bygone Bishop|R|SIR -#29|Gisa and Geralf|M|SIR -#30|Goldnight Castigator|M|SIR -#31|Mindwrack Demon|M|SIR -#32|Odric, Lunarch Marshal|R|SIR -#33|Voldaren Pariah|R|SIR -#34|Wharf Infiltrator|R|SIR -#35|Bruna, the Fading Light|R|SIR -#36|Burn from Within|R|SIR -#37|Devils' Playground|R|SIR -#38|Distended Mindbender|R|SIR -#39|Elder Deep-Fiend|R|SIR -#40|Grim Flayer|R|SIR -#41|Startled Awake|M|SIR -#42|Westvale Abbey|R|SIR -#43|Assembled Alphas|R|SIR -#44|Geralf's Masterpiece|R|SIR -#45|Hanweir Garrison|R|SIR -#46|Mirrorwing Dragon|M|SIR -#47|Stromkirk Condemned|R|SIR -#48|Altered Ego|R|SIR -#49|Declaration in Stone|R|SIR -#50|Forgotten Creation|R|SIR -#51|Noosegraf Mob|R|SIR -#52|Selfless Spirit|R|SIR -#53|Sin Prodder|R|SIR -#54|Spirit of the Hunt|R|SIR -#55|Anguished Unmaking|U|SIR -#56|Clear Shot|U|SIR -#57|Collective Brutality|R|SIR -#58|Duskwatch Recruiter|U|SIR -#59|Relentless Dead|M|SIR -#60|Triskaidekaphobia|R|SIR -#61|Diregraf Colossus|R|SIR -#62|Flameblade Angel|R|SIR -#63|Bedlam Reveler|R|SIR -#64|Bound by Moonsilver|C|SIR -#65|Erdwal Illuminator|U|SIR -#66|Fiery Temper|U|SIR -#67|Geier Reach Bandit|U|SIR -#68|Lightning Axe|U|SIR -#69|Stromkirk Occultist|U|SIR -#70|Tree of Perdition|R|SIR -#71|Ulvenwald Hydra|R|SIR -#72|Accursed Witch|U|SIR -#73|Galvanic Bombardment|C|SIR -#74|Incendiary Flow|C|SIR -#75|Ongoing Investigation|U|SIR -#76|Tamiyo's Journal|R|SIR -#77|Thalia's Lancers|R|SIR -#78|Ulvenwald Captive|C|SIR -#79|Dead Weight|C|SIR -#80|Mad Prophet|U|SIR -#81|Mournwillow|U|SIR -#82|Nebelgast Herald|U|SIR -#83|Pack Guardian|U|SIR -#84|Prized Amalgam|R|SIR -#85|Rabid Bite|C|SIR -#86|Sigardian Priest|C|SIR -#87|Veteran Cathar|U|SIR -#88|Alchemist's Greeting|C|SIR -#89|Angelic Purge|C|SIR -#90|Call the Bloodline|U|SIR -#91|Deathcap Cultivator|U|SIR -#92|Kindly Stranger|U|SIR -#93|Rattlechains|R|SIR -#94|Shrill Howler|U|SIR -#95|Ulrich's Kindred|U|SIR -#96|Advanced Stitchwing|U|SIR -#97|Cryptolith Fragment|U|SIR -#98|Drunau Corpse Trawler|U|SIR -#99|Gisa's Bidding|C|SIR -#100|Haunted Dead|U|SIR -#101|Ingenious Skaab|C|SIR -#102|Nearheath Chaplain|U|SIR -#103|Obsessive Skinner|C|SIR -#104|Slayer's Plate|R|SIR -#105|Ulvenwald Mysteries|U|SIR -#106|Conduit of Storms|C|SIR -#107|Courageous Outrider|U|SIR -#108|Gnarlwood Dryad|C|SIR -#109|Graf Mole|U|SIR -#110|Olivia's Bloodsworn|U|SIR -#111|Scourge Wolf|U|SIR -#112|Bloodbriar|C|SIR -#113|Compelling Deterrence|U|SIR -#114|Dauntless Cathar|C|SIR -#115|Imprisoned in the Moon|C|SIR -#116|Insatiable Gorgers|C|SIR -#117|Noose Constrictor|U|SIR -#118|Pore Over the Pages|U|SIR -#119|Puncturing Light|C|SIR -#120|Topplegeist|U|SIR -#121|Blessed Alliance|U|SIR -#122|Certain Death|C|SIR -#123|Daring Sleuth|U|SIR -#124|Deranged Whelp|C|SIR -#125|Drag Under|C|SIR -#126|Lone Rider|U|SIR -#127|Seasons Past|M|SIR -#128|Spectral Shepherd|U|SIR -#129|Subjugator Angel|U|SIR -#130|Thraben Inspector|C|SIR -#131|Bloodmad Vampire|C|SIR -#132|Briarbridge Patrol|C|SIR -#133|Choked Estuary|U|SIR -#134|Crow of Dark Tidings|C|SIR -#135|Drownyard Behemoth|U|SIR -#136|Drownyard Explorers|C|SIR -#137|Ever After|R|SIR -#138|Foreboding Ruins|U|SIR -#139|Fortified Village|U|SIR -#140|Furyblade Vampire|U|SIR -#141|Game Trail|U|SIR -#142|Geier Reach Sanitarium|R|SIR -#143|Geist of the Archives|C|SIR -#144|Gryff's Boon|U|SIR -#145|Hinterland Logger|C|SIR -#146|Mercurial Geists|U|SIR -#147|Olivia's Dragoon|C|SIR -#148|Port Town|U|SIR -#149|Reaper of Flight Moonsilver|U|SIR -#150|Ride Down|U|SIR -#151|Thermo-Alchemist|U|SIR -#152|Thraben Foulbloods|C|SIR -#153|Town Gossipmonger|U|SIR -#154|Traverse the Ulvenwald|R|SIR -#155|Wretched Gryff|C|SIR -#156|Apothecary Geist|C|SIR -#157|Ember-Eye Wolf|C|SIR -#158|Fevered Visions|R|SIR -#159|Forsaken Sanctuary|U|SIR -#160|Foul Orchard|U|SIR -#161|Groundskeeper|U|SIR -#162|Hamlet Captain|U|SIR -#163|Highland Lake|U|SIR -#164|Howlpack Wolf|C|SIR -#165|Midnight Scavengers|U|SIR -#166|Ruthless Disposal|U|SIR -#167|Stone Quarry|U|SIR -#168|Woodland Stream|U|SIR -#169|Byway Courier|C|SIR -#170|Curious Homunculus|U|SIR -#171|Eternal Scourge|R|SIR -#172|Ghoulcaller's Accomplice|C|SIR -#173|Graf Rats|C|SIR -#174|Guardian of Pilgrims|C|SIR -#175|Hanweir Battlements|R|SIR -#176|Pyre Hound|C|SIR -#177|Ravenous Bloodseeker|C|SIR -#178|Rise from the Grave|U|SIR -#179|Steadfast Cathar|C|SIR -#180|Stitcher's Graft|R|SIR -#181|Stormrider Spirit|C|SIR -#182|Confirm Suspicions|R|SIR -#183|Dawn Gryff|C|SIR -#184|Devilthorn Fox|C|SIR -#185|Eldritch Evolution|R|SIR -#186|Exultant Cultist|C|SIR -#187|Faith Unbroken|U|SIR -#188|Falkenrath Gorger|R|SIR -#189|Gatstaf Arsonists|C|SIR -#190|Intrepid Provisioner|C|SIR -#191|Neglected Heirloom|U|SIR -#192|Rush of Adrenaline|C|SIR -#193|Sage of Ancient Lore|R|SIR -#194|Thing in the Ice|R|SIR -#195|Vessel of Nascency|U|SIR -#196|Village Messenger|U|SIR -#197|Weirded Vampire|C|SIR -#198|Cryptolith Rite|R|SIR -#199|Drogskol Shieldmate|C|SIR -#200|Gavony Unhallowed|C|SIR -#201|Insolent Neonate|C|SIR -#202|Liliana's Elite|C|SIR -#203|Magnifying Glass|C|SIR -#204|Mausoleum Wanderer|R|SIR -#205|Morkrut Necropod|C|SIR -#206|Permeating Mass|R|SIR -#207|Sanitarium Skeleton|C|SIR -#208|Swift Spinner|C|SIR -#209|Tattered Haunter|C|SIR -#210|Tormenting Voice|C|SIR -#211|Dusk Feaster|U|SIR -#212|Explosive Apparatus|C|SIR -#213|Field Creeper|C|SIR -#214|Grapple with the Past|C|SIR -#215|Humble the Brute|U|SIR -#216|Jace's Scrutiny|C|SIR -#217|Moonlight Hunt|C|SIR -#218|Strength of Arms|C|SIR -#219|Thornhide Wolves|C|SIR -#220|Weirding Wood|C|SIR -#221|Abundant Maw|U|SIR -#222|Epitaph Golem|C|SIR -#223|Fogwalker|C|SIR -#224|Graf Harvest|U|SIR -#225|Ironclad Slayer|U|SIR -#226|Laboratory Brute|C|SIR -#227|Make Mischief|C|SIR -#228|Mockery of Nature|U|SIR -#229|Rise from the Tides|U|SIR -#230|Borrowed Grace|C|SIR -#231|Borrowed Malevolence|C|SIR -#232|Confront the Unknown|C|SIR -#233|Grotesque Mutation|C|SIR -#234|Harvest Hand|U|SIR -#235|Lupine Prototype|U|SIR -#236|Spontaneous Mutation|C|SIR -#237|Aim High|C|SIR -#238|Biting Rain|U|SIR -#239|Borrowed Hostility|C|SIR -#240|Fiend Binder|C|SIR -#241|Fleeting Memories|U|SIR -#242|Macabre Waltz|C|SIR -#243|Murderer's Axe|U|SIR -#244|Summary Dismissal|R|SIR -#245|Terrarion|C|SIR -#246|True-Faith Censer|C|SIR -#247|Uncaged Fury|U|SIR -#248|Wild-Field Scarecrow|C|SIR -#249|Blood Mist|U|SIR -#250|Convolute|C|SIR -#251|Crawling Sensation|U|SIR -#252|Epiphany at the Drownyard|R|SIR -#253|Hope Against Hope|U|SIR -#254|Howlpack Resurgence|U|SIR -#255|Lunarch Mantle|C|SIR -#256|Magmatic Chasm|C|SIR -#257|Faithbearer Paladin|C|SIR -#258|Merciless Resolve|C|SIR -#259|Shreds of Sanity|U|SIR -#260|Soul Separator|U|SIR -#261|Take Inventory|C|SIR -#262|Indulgent Aristocrat|U|SIR -#263|Stensia Masquerade|U|SIR -#264|Manic Scribe|U|SIR -#265|Pick the Brain|U|SIR -#266|Pieces of the Puzzle|U|SIR -#267|Splendid Reclamation|R|SIR -#268|Wolfkin Bond|C|SIR -#269|Deny Existence|C|SIR -#270|Essence Flux|C|SIR -#271|Second Harvest|R|SIR -#272|Mind's Dilation|M|SIR -#273|Alms of the Vein|C|SIR -#274|Invasive Surgery|U|SIR -#275|Sigarda's Aid|R|SIR -#276|Brain in a Jar|U|SIR -#277|Plains 1|C|SIR -#278|Island 1|C|SIR -#279|Swamp 1|C|SIR -#280|Mountain 1|C|SIR -#281|Forest 1|C|SIR -#282|Plains 2|C|SIR -#283|Island 2|C|SIR -#284|Swamp 2|C|SIR -#285|Mountain 2|C|SIR -#286|Forest 2|C|SIR -#287|Plains 3|C|SIR -#288|Island 3|C|SIR -#289|Swamp 3|C|SIR -#290|Mountain 3|C|SIR -#291|Forest 3|C|SIR +#18|Bloodline Keeper|M|SIS +#19|Devil's Play|R|SIS +#20|Falkenrath Aristocrat|M|SIS +#21|Balefire Dragon|M|SIS +#22|Sigarda, Host of Herons|M|SIS +#23|Always Watching|R|SIR +#24|Avacyn's Judgment|R|SIR +#25|Collective Effort|R|SIR +#26|Heron's Grace Champion|R|SIR +#27|Thalia, Heretic Cathar|R|SIR +#28|Collective Defiance|R|SIR +#29|Emrakul, the Promised End|M|SIR +#30|Nahiri's Wrath|M|SIR +#31|Spell Queller|R|SIR +#32|Bloodhall Priest|R|SIR +#33|Bygone Bishop|R|SIR +#34|Gisa and Geralf|M|SIR +#35|Goldnight Castigator|M|SIR +#36|Mindwrack Demon|M|SIR +#37|Odric, Lunarch Marshal|R|SIR +#38|Voldaren Pariah|R|SIR +#39|Wharf Infiltrator|R|SIR +#40|Bruna, the Fading Light|R|SIR +#41|Burn from Within|R|SIR +#42|Devils' Playground|R|SIR +#43|Distended Mindbender|R|SIR +#44|Elder Deep-Fiend|R|SIR +#45|Grim Flayer|R|SIR +#46|Startled Awake|M|SIR +#47|Westvale Abbey|R|SIR +#48|Mayor of Avabruck|R|SIS +#49|Avacyn, Angel of Hope|M|SIS +#50|Garruk Relentless|M|SIS +#51|Geist of Saint Traft|M|SIS +#52|Havengul Lich|M|SIS +#53|Huntmaster of the Fells|M|SIS +#54|Assembled Alphas|R|SIR +#55|Geralf's Masterpiece|R|SIR +#56|Hanweir Garrison|R|SIR +#57|Mirrorwing Dragon|M|SIR +#58|Stromkirk Condemned|R|SIR +#59|Altered Ego|R|SIR +#60|Declaration in Stone|R|SIR +#61|Forgotten Creation|R|SIR +#62|Noosegraf Mob|R|SIR +#63|Selfless Spirit|R|SIR +#64|Sin Prodder|R|SIR +#65|Spirit of the Hunt|R|SIR +#66|Angel of Flight Alabaster|R|SIS +#67|Kruin Outlaw|R|SIS +#68|Anguished Unmaking|U|SIR +#69|Clear Shot|U|SIR +#70|Collective Brutality|R|SIR +#71|Duskwatch Recruiter|U|SIR +#72|Relentless Dead|M|SIR +#73|Triskaidekaphobia|R|SIR +#74|Lingering Souls|U|SIS +#75|Sever the Bloodline|U|SIS +#76|Spider Spawning|U|SIS +#77|Zealous Conscripts|R|SIS +#78|Snapcaster Mage|M|SIS +#79|Diregraf Colossus|R|SIR +#80|Flameblade Angel|R|SIR +#81|Bedlam Reveler|R|SIR +#82|Bound by Moonsilver|C|SIR +#83|Erdwal Illuminator|U|SIR +#84|Fiery Temper|U|SIR +#85|Geier Reach Bandit|U|SIR +#86|Lightning Axe|U|SIR +#87|Stromkirk Occultist|U|SIR +#88|Tree of Perdition|R|SIR +#89|Ulvenwald Hydra|R|SIR +#90|Fiend Hunter|U|SIS +#91|Accursed Witch|U|SIR +#92|Galvanic Bombardment|C|SIR +#93|Incendiary Flow|C|SIR +#94|Ongoing Investigation|U|SIR +#95|Tamiyo's Journal|R|SIR +#96|Thalia's Lancers|R|SIR +#97|Ulvenwald Captive|C|SIR +#98|Falkenrath Noble|U|SIS +#99|Requiem Angel|R|SIS +#100|Skirsdag High Priest|R|SIS +#101|Dead Weight|C|SIR +#102|Mad Prophet|U|SIR +#103|Mournwillow|U|SIR +#104|Nebelgast Herald|U|SIR +#105|Pack Guardian|U|SIR +#106|Prized Amalgam|R|SIR +#107|Rabid Bite|C|SIR +#108|Sigardian Priest|C|SIR +#109|Veteran Cathar|U|SIR +#110|Alchemist's Greeting|C|SIR +#111|Angelic Purge|C|SIR +#112|Call the Bloodline|U|SIR +#113|Deathcap Cultivator|U|SIR +#114|Kindly Stranger|U|SIR +#115|Rattlechains|R|SIR +#116|Shrill Howler|U|SIR +#117|Ulrich's Kindred|U|SIR +#118|Advanced Stitchwing|U|SIR +#119|Cryptolith Fragment|U|SIR +#120|Drunau Corpse Trawler|U|SIR +#121|Gisa's Bidding|C|SIR +#122|Haunted Dead|U|SIR +#123|Ingenious Skaab|C|SIR +#124|Nearheath Chaplain|U|SIR +#125|Obsessive Skinner|C|SIR +#126|Slayer's Plate|R|SIR +#127|Ulvenwald Mysteries|U|SIR +#128|Diregraf Captain|U|SIS +#129|Cackling Counterpart|R|SIS +#130|Unburial Rites|U|SIS +#131|Skirsdag Cultist|U|SIS +#132|Avacyn's Pilgrim|C|SIS +#133|Invisible Stalker|U|SIS +#134|Conduit of Storms|C|SIR +#135|Courageous Outrider|U|SIR +#136|Gnarlwood Dryad|C|SIR +#137|Graf Mole|U|SIR +#138|Olivia's Bloodsworn|U|SIR +#139|Scourge Wolf|U|SIR +#140|Drogskol Captain|U|SIS +#141|Griselbrand|M|SIS +#142|Bloodbriar|C|SIR +#143|Compelling Deterrence|U|SIR +#144|Dauntless Cathar|C|SIR +#145|Imprisoned in the Moon|C|SIR +#146|Insatiable Gorgers|C|SIR +#147|Noose Constrictor|U|SIR +#148|Pore Over the Pages|U|SIR +#149|Puncturing Light|C|SIR +#150|Topplegeist|U|SIR +#151|Havengul Runebinder|R|SIS +#152|Stromkirk Captain|U|SIS +#153|Doomed Traveler|C|SIS +#154|Bonds of Faith|C|SIS +#155|Brimstone Volley|U|SIS +#156|Mist Raven|C|SIS +#157|Tragic Slip|C|SIS +#158|Blessed Alliance|U|SIR +#159|Certain Death|C|SIR +#160|Daring Sleuth|U|SIR +#161|Deranged Whelp|C|SIR +#162|Drag Under|C|SIR +#163|Lone Rider|U|SIR +#164|Seasons Past|M|SIR +#165|Spectral Shepherd|U|SIR +#166|Subjugator Angel|U|SIR +#167|Thraben Inspector|C|SIR +#168|Butcher's Cleaver|U|SIS +#169|Immerwolf|U|SIS +#170|Hollowhenge Scavenger|C|SIS +#171|Bloodmad Vampire|C|SIR +#172|Briarbridge Patrol|C|SIR +#173|Choked Estuary|U|SIR +#174|Crow of Dark Tidings|C|SIR +#175|Drownyard Behemoth|U|SIR +#176|Drownyard Explorers|C|SIR +#177|Ever After|R|SIR +#178|Foreboding Ruins|U|SIR +#179|Fortified Village|U|SIR +#180|Furyblade Vampire|U|SIR +#181|Game Trail|U|SIR +#182|Geier Reach Sanitarium|R|SIR +#183|Geist of the Archives|C|SIR +#184|Gryff's Boon|U|SIR +#185|Hinterland Logger|C|SIR +#186|Mercurial Geists|U|SIR +#187|Olivia's Dragoon|C|SIR +#188|Port Town|U|SIR +#189|Reaper of Flight Moonsilver|U|SIR +#190|Ride Down|U|SIR +#191|Thermo-Alchemist|U|SIR +#192|Thraben Foulbloods|C|SIR +#193|Town Gossipmonger|U|SIR +#194|Traverse the Ulvenwald|R|SIR +#195|Wretched Gryff|C|SIR +#196|Forbidden Alchemy|C|SIS +#197|Apothecary Geist|C|SIR +#198|Ember-Eye Wolf|C|SIR +#199|Fevered Visions|R|SIR +#200|Forsaken Sanctuary|U|SIR +#201|Foul Orchard|U|SIR +#202|Groundskeeper|U|SIR +#203|Hamlet Captain|U|SIR +#204|Highland Lake|U|SIR +#205|Howlpack Wolf|C|SIR +#206|Midnight Scavengers|U|SIR +#207|Ruthless Disposal|U|SIR +#208|Stone Quarry|U|SIR +#209|Woodland Stream|U|SIR +#210|Battleground Geist|C|SIS +#211|Faithless Looting|C|SIS +#212|Feeling of Dread|C|SIS +#213|Rally the Peasants|U|SIS +#214|Travel Preparations|C|SIS +#215|Gutter Grime|R|SIS +#216|Murder of Crows|U|SIS +#217|Young Wolf|C|SIS +#218|Evolving Wilds|C|SIS +#219|Byway Courier|C|SIR +#220|Curious Homunculus|U|SIR +#221|Eternal Scourge|R|SIR +#222|Ghoulcaller's Accomplice|C|SIR +#223|Graf Rats|C|SIR +#224|Guardian of Pilgrims|C|SIR +#225|Hanweir Battlements|R|SIR +#226|Pyre Hound|C|SIR +#227|Ravenous Bloodseeker|C|SIR +#228|Rise from the Grave|U|SIR +#229|Steadfast Cathar|C|SIR +#230|Stitcher's Graft|R|SIR +#231|Stormrider Spirit|C|SIR +#232|Avacyn's Collar|U|SIS +#233|Silent Departure|C|SIS +#234|Galvanic Juggernaut|U|SIS +#235|Confirm Suspicions|R|SIR +#236|Dawn Gryff|C|SIR +#237|Devilthorn Fox|C|SIR +#238|Eldritch Evolution|R|SIR +#239|Exultant Cultist|C|SIR +#240|Faith Unbroken|U|SIR +#241|Falkenrath Gorger|R|SIR +#242|Gatstaf Arsonists|C|SIR +#243|Intrepid Provisioner|C|SIR +#244|Neglected Heirloom|U|SIR +#245|Rush of Adrenaline|C|SIR +#246|Sage of Ancient Lore|R|SIR +#247|Thing in the Ice|R|SIR +#248|Vessel of Nascency|U|SIR +#249|Village Messenger|U|SIR +#250|Weirded Vampire|C|SIR +#251|Elder Cathar|C|SIS +#252|Cryptolith Rite|R|SIR +#253|Drogskol Shieldmate|C|SIR +#254|Gavony Unhallowed|C|SIR +#255|Insolent Neonate|C|SIR +#256|Liliana's Elite|C|SIR +#257|Magnifying Glass|C|SIR +#258|Mausoleum Wanderer|R|SIR +#259|Morkrut Necropod|C|SIR +#260|Permeating Mass|R|SIR +#261|Sanitarium Skeleton|C|SIR +#262|Swift Spinner|C|SIR +#263|Tattered Haunter|C|SIR +#264|Tormenting Voice|C|SIR +#265|Ghoulraiser|C|SIS +#266|Haunted Fengraf|C|SIS +#267|Moonmist|C|SIS +#268|Traveler's Amulet|C|SIS +#269|Gnaw to the Bone|C|SIS +#270|Bloodflow Connoisseur|C|SIS +#271|Selhoff Occultist|C|SIS +#272|Blazing Torch|C|SIS +#273|Dusk Feaster|U|SIR +#274|Explosive Apparatus|C|SIR +#275|Field Creeper|C|SIR +#276|Grapple with the Past|C|SIR +#277|Humble the Brute|U|SIR +#278|Jace's Scrutiny|C|SIR +#279|Moonlight Hunt|C|SIR +#280|Strength of Arms|C|SIR +#281|Thornhide Wolves|C|SIR +#282|Weirding Wood|C|SIR +#283|Vampiric Fury|C|SIS +#284|Bump in the Night|C|SIS +#285|Mystic Retrieval|U|SIS +#286|Stitcher's Apprentice|C|SIS +#287|Abundant Maw|U|SIR +#288|Epitaph Golem|C|SIR +#289|Fogwalker|C|SIR +#290|Graf Harvest|U|SIR +#291|Ironclad Slayer|U|SIR +#292|Laboratory Brute|C|SIR +#293|Make Mischief|C|SIR +#294|Mockery of Nature|U|SIR +#295|Rise from the Tides|U|SIR +#296|Seance|U|SIS +#297|Traitorous Blood|C|SIS +#298|Somberwald Sage|U|SIS +#299|Vessel of Endless Rest|U|SIS +#300|Borrowed Grace|C|SIR +#301|Borrowed Malevolence|C|SIR +#302|Confront the Unknown|C|SIR +#303|Grotesque Mutation|C|SIR +#304|Harvest Hand|U|SIR +#305|Lupine Prototype|U|SIR +#306|Spontaneous Mutation|C|SIR +#307|Divine Reckoning|R|SIS +#308|Forge Devil|C|SIS +#309|Aim High|C|SIR +#310|Biting Rain|U|SIR +#311|Borrowed Hostility|C|SIR +#312|Fiend Binder|C|SIR +#313|Fleeting Memories|U|SIR +#314|Macabre Waltz|C|SIR +#315|Murderer's Axe|U|SIR +#316|Summary Dismissal|R|SIR +#317|Terrarion|C|SIR +#318|True-Faith Censer|C|SIR +#319|Uncaged Fury|U|SIR +#320|Wild-Field Scarecrow|C|SIR +#321|Past in Flames|M|SIS +#322|Demonmail Hauberk|U|SIS +#323|Barter in Blood|U|SIS +#324|Blood Mist|U|SIR +#325|Convolute|C|SIR +#326|Crawling Sensation|U|SIR +#327|Epiphany at the Drownyard|R|SIR +#328|Hope Against Hope|U|SIR +#329|Howlpack Resurgence|U|SIR +#330|Lunarch Mantle|C|SIR +#331|Magmatic Chasm|C|SIR +#332|Faithbearer Paladin|C|SIR +#333|Merciless Resolve|C|SIR +#334|Shreds of Sanity|U|SIR +#335|Soul Separator|U|SIR +#336|Take Inventory|C|SIR +#337|Indulgent Aristocrat|U|SIR +#338|Stensia Masquerade|U|SIR +#339|Manic Scribe|U|SIR +#340|Pick the Brain|U|SIR +#341|Pieces of the Puzzle|U|SIR +#342|Splendid Reclamation|R|SIR +#343|Wolfkin Bond|C|SIR +#344|Deny Existence|C|SIR +#345|Essence Flux|C|SIR +#346|Second Harvest|R|SIR +#347|Increasing Ambition|R|SIS +#348|Mind's Dilation|M|SIR +#349|Alms of the Vein|C|SIR +#350|Invasive Surgery|U|SIR +#351|Sigarda's Aid|R|SIR +#352|Brain in a Jar|U|SIR +#353|Plains 1|C|SIR +#354|Island 1|C|SIR +#355|Swamp 1|C|SIR +#356|Mountain 1|C|SIR +#357|Forest 1|C|SIR +#358|Plains 2|C|SIR +#359|Island 2|C|SIR +#360|Swamp 2|C|SIR +#361|Mountain 2|C|SIR +#362|Forest 2|C|SIR +#363|Plains 3|C|SIR +#364|Island 3|C|SIR +#365|Swamp 3|C|SIR +#366|Mountain 3|C|SIR +#367|Forest 3|C|SIR //Rank|Name|Rarity|Set -#1|The Eternal Wanderer|R|ONE -#2|White Sun's Twilight|R|ONE -#3|Nissa, Ascended Animist|M|ONE -#4|Kaya, Intangible Slayer|R|ONE -#5|Thrun, Breaker of Silence|R|ONE -#6|Glissa Sunslayer|R|ONE -#7|Blue Sun's Twilight|R|ONE -#8|Vraska, Betrayal's Sting|M|ONE -#9|Black Sun's Twilight|R|ONE -#10|Dragonwing Glider|R|ONE -#11|Atraxa, Grand Unifier|M|ONE -#12|Kaito, Dancing Shadow|R|ONE -#13|Lukka, Bound to Ruin|M|ONE -#14|Sword of Forge and Frontier|M|ONE -#15|Tekuthal, Inquiry Dominus|M|ONE -#16|Bloated Contaminator|R|ONE -#17|Tyrranax Rex|M|ONE -#18|Zopandrel, Hunger Dominus|M|ONE -#19|Jace, the Perfected Mind|M|ONE -#20|Archfiend of the Dross|R|ONE -#21|Solphim, Mayhem Dominus|M|ONE -#22|Elesh Norn, Mother of Machines|M|ONE -#23|Mondrak, Glory Dominus|M|ONE -#24|Ria Ivor, Bane of Bladehold|R|ONE -#25|Phyrexian Vindicator|M|ONE +#1|Nissa, Ascended Animist|M|ONE +#2|Elesh Norn, Mother of Machines|M|ONE +#3|The Eternal Wanderer|R|ONE +#4|White Sun's Twilight|R|ONE +#5|Jace, the Perfected Mind|M|ONE +#6|Vraska, Betrayal's Sting|M|ONE +#7|Dragonwing Glider|R|ONE +#8|Thrun, Breaker of Silence|R|ONE +#9|Migloz, Maze Crusher|R|ONE +#10|Sword of Forge and Frontier|M|ONE +#11|Kemba, Kha Enduring|R|ONE +#12|Mondrak, Glory Dominus|M|ONE +#13|Skrelv, Defector Mite|R|ONE +#14|Black Sun's Twilight|R|ONE +#15|Koth, Fire of Resistance|R|ONE +#16|Urabrask's Forge|R|ONE +#17|Bloated Contaminator|R|ONE +#18|Glissa Sunslayer|R|ONE +#19|Kaito, Dancing Shadow|R|ONE +#20|Kaya, Intangible Slayer|R|ONE +#21|Lukka, Bound to Ruin|M|ONE +#22|Malcator, Purity Overseer|R|ONE +#23|Argentum Masticore|R|ONE +#24|Annex Sentry|U|ONE +#25|Ossification|U|ONE #26|Mercurial Spelldancer|R|ONE -#27|Phyrexian Obliterator|M|ONE -#28|All Will Be One|M|ONE -#29|Capricious Hellraiser|M|ONE -#30|Evolved Spinoderm|R|ONE -#31|Cinderslash Ravager|U|ONE -#32|Migloz, Maze Crusher|R|ONE -#33|Ovika, Enigma Goliath|R|ONE -#34|Kemba, Kha Enduring|R|ONE -#35|Ossification|U|ONE -#36|Skrelv, Defector Mite|R|ONE -#37|Skrelv's Hive|R|ONE -#38|Unctus's Retrofitter|U|ONE -#39|Drown in Ichor|U|ONE -#40|Vraan, Executioner Thane|R|ONE -#41|Ezuri, Stalker of Spheres|R|ONE -#42|Trawler Drake|U|ONE -#43|Unctus, Grand Metatect|R|ONE -#44|Koth, Fire of Resistance|R|ONE -#45|Rebel Salvo|U|ONE -#46|Viral Spawning|U|ONE -#47|Bladehold War-Whip|U|ONE -#48|Charforger|U|ONE -#49|Jor Kadeen, First Goldwarden|R|ONE -#50|Serum-Core Chimera|U|ONE -#51|Argentum Masticore|R|ONE -#52|Annex Sentry|U|ONE -#53|Jawbone Duelist|U|ONE -#54|Serum Snare|U|ONE -#55|Anoint with Affliction|C|ONE -#56|Drivnod, Carnage Dominus|M|ONE -#57|Nimraiser Paladin|U|ONE -#58|Scheming Aspirant|U|ONE -#59|Urabrask's Anointer|U|ONE -#60|Urabrask's Forge|R|ONE -#61|Armored Scrapgorger|U|ONE -#62|Evolving Adaptive|U|ONE -#63|Cephalopod Sentry|U|ONE -#64|Malcator, Purity Overseer|R|ONE -#65|Slaughter Singer|U|ONE -#66|Venser, Corpse Puppet|R|ONE -#67|Vivisection Evangelist|U|ONE -#68|The Filigree Sylex|R|ONE -#69|Planar Disruption|C|ONE -#70|Blade of Shared Souls|R|ONE -#71|Thrummingbird|U|ONE -#72|Churning Reservoir|U|ONE -#73|Volt Charge|C|ONE -#74|Cankerbloom|U|ONE -#75|Contagious Vorrac|C|ONE -#76|Incubation Sac|U|ONE -#77|Infectious Bite|U|ONE -#78|Tyvar's Stand|U|ONE -#79|Venomous Brutalizer|U|ONE -#80|Melira, the Living Cure|R|ONE -#81|Nahiri, the Unforgiving|M|ONE -#82|Tainted Observer|U|ONE -#83|Voidwing Hybrid|U|ONE -#84|Atraxa's Skitterfang|U|ONE -#85|Tablet of Compleation|R|ONE -#86|Bladed Ambassador|U|ONE -#87|Tamiyo's Immobilizer|U|ONE -#88|Transplant Theorist|U|ONE -#89|Annihilating Glare|C|ONE -#90|Bilious Skulldweller|U|ONE -#91|Necrosquito|U|ONE -#92|Hexgold Halberd|U|ONE -#93|Hexgold Slash|C|ONE -#94|Oil-Gorger Troll|C|ONE -#95|Ruthless Predation|C|ONE -#96|Necrogen Rotpriest|U|ONE -#97|Hexgold Hoverwings|U|ONE -#98|Mesmerizing Dose|C|ONE -#99|Quicksilver Fisher|C|ONE -#100|Chittering Skitterling|U|ONE -#101|Geth, Thane of Contracts|R|ONE -#102|Karumonix, the Rat King|R|ONE -#103|Phyrexian Arena|R|ONE -#104|Testament Bearer|C|ONE -#105|Vat Emergence|U|ONE -#106|Furnace Strider|C|ONE -#107|Magmatic Sprinter|U|ONE -#108|Oxidda Finisher|U|ONE -#109|Resistance Skywarden|U|ONE -#110|Sylvok Battle-Chair|U|ONE -#111|Graaz, Unstoppable Juggernaut|R|ONE -#112|Ichorplate Golem|U|ONE -#113|Prophetic Prism|C|ONE -#114|Ribskiff|U|ONE -#115|Surgical Skullbomb|C|ONE -#116|Duelist of Deep Faith|C|ONE -#117|Flensing Raptor|C|ONE -#118|Mandible Justiciar|C|ONE -#119|Atmosphere Surgeon|U|ONE -#120|Distorted Curiosity|U|ONE -#121|Experimental Augury|C|ONE -#122|Gitaxian Raptor|C|ONE -#123|Malcator's Watcher|C|ONE -#124|Reject Imperfection|U|ONE -#125|Watchful Blisterzoa|U|ONE -#126|Ambulatory Edifice|U|ONE -#127|Pestilent Syphoner|C|ONE -#128|Ravenous Necrotitan|U|ONE -#129|Sheoldred's Edict|U|ONE -#130|Stinging Hivemaster|C|ONE -#131|Axiom Engraver|C|ONE -#132|Chimney Rabble|C|ONE -#133|Exuberant Fuseling|U|ONE -#134|Free from Flesh|C|ONE -#135|Furnace Punisher|U|ONE -#136|Hazardous Blast|C|ONE -#137|Kuldotha Cackler|C|ONE -#138|Vindictive Flamestoker|R|ONE -#139|Green Sun's Twilight|R|ONE -#140|Lattice-Blade Mantis|C|ONE -#141|Paladin of Predation|U|ONE -#142|Plague Nurse|C|ONE -#143|Rustvine Cultivator|C|ONE -#144|Thirsting Roots|C|ONE -#145|Tyrranax Atrocity|C|ONE -#146|Kethek, Crucible Goliath|R|ONE -#147|Dross Skullbomb|C|ONE -#148|Furnace Skullbomb|C|ONE -#149|Myr Convert|U|ONE -#150|Mirrex|R|ONE -#151|Basilica Shepherd|C|ONE -#152|Charge of the Mites|C|ONE -#153|Compleat Devotion|C|ONE -#154|Incisor Glider|C|ONE -#155|Porcelain Zealot|U|ONE -#156|Swooping Lookout|U|ONE -#157|Bring the Ending|C|ONE -#158|Eye of Malcator|C|ONE -#159|Meldweb Curator|C|ONE -#160|Tamiyo's Logbook|U|ONE -#161|Vivisurgeon's Insight|C|ONE -#162|Blightbelly Rat|C|ONE -#163|Bonepicker Skirge|C|ONE -#164|Sheoldred's Headcleaver|C|ONE -#165|Vraska's Fall|C|ONE -#166|Barbed Batterfist|C|ONE -#167|Bladegraft Aspirant|C|ONE -#168|Cacophony Scamp|U|ONE -#169|Molten Rebuke|C|ONE -#170|Slobad, Iron Goblin|R|ONE -#171|Thrill of Possibility|C|ONE -#172|Branchblight Stalker|C|ONE -#173|Copper Longlegs|C|ONE -#174|Predation Steward|C|ONE -#175|Skyscythe Engulfer|C|ONE -#176|Unnatural Restoration|U|ONE -#177|Venerated Rotpriest|R|ONE -#178|Tyvar, Jubilant Brawler|R|ONE -#179|Basilica Skullbomb|C|ONE -#180|Dune Mover|C|ONE -#181|Maze Skullbomb|C|ONE -#182|The Autonomous Furnace|C|ONE -#183|The Dross Pits|C|ONE -#184|The Fair Basilica|C|ONE -#185|The Hunter Maze|C|ONE -#186|The Surgical Bay|C|ONE -#187|Terramorphic Expanse|C|ONE -#188|Apostle of Invasion|U|ONE -#189|Crawling Chorus|C|ONE -#190|Indoctrination Attendant|C|ONE -#191|Plated Onslaught|U|ONE -#192|Sinew Dancer|C|ONE -#193|Zealot's Conviction|C|ONE -#194|Chrome Prowler|C|ONE -#195|Escaped Experiment|C|ONE -#196|Glistener Seer|C|ONE -#197|Meldweb Strider|C|ONE -#198|Cruel Grimnarch|C|ONE -#199|Cutthroat Centurion|C|ONE -#200|Feed the Infection|U|ONE -#201|Fleshless Gladiator|C|ONE -#202|Gulping Scraptrap|C|ONE -#203|Infectious Inquiry|C|ONE -#204|Necrogen Communion|U|ONE -#205|Whisper of the Dross|C|ONE -#206|Awaken the Sleeper|U|ONE -#207|Blazing Crescendo|C|ONE -#208|Forgehammer Centurion|C|ONE -#209|Red Sun's Twilight|R|ONE -#210|Sawblade Scamp|C|ONE -#211|Shrapnel Slinger|C|ONE -#212|Vulshok Splitter|C|ONE -#213|Adaptive Sporesinger|C|ONE -#214|Carnivorous Canopy|C|ONE -#215|Ichorspit Basilisk|C|ONE -#216|Maze's Mantle|C|ONE -#217|Noxious Assault|U|ONE -#218|Titanic Growth|C|ONE -#219|Phyrexian Atlas|C|ONE -#220|Staff of Compleation|M|ONE -#221|Zenith Chronicler|R|ONE -#222|Blackcleave Cliffs|R|ONE -#223|Copperline Gorge|R|ONE -#224|Darkslick Shores|R|ONE -#225|The Monumental Facade|R|ONE -#226|The Mycosynth Gardens|R|ONE -#227|Razorverge Thicket|R|ONE -#228|Seachrome Coast|R|ONE -#229|The Seedcore|R|ONE -#230|Goldwarden's Helm|C|ONE -#231|Infested Fleshcutter|U|ONE -#232|Leonin Lightbringer|C|ONE -#233|Mirran Bardiche|C|ONE -#234|Orthodoxy Enforcer|C|ONE -#235|Resistance Reunited|U|ONE -#236|Vanish into Eternity|C|ONE -#237|Veil of Assimilation|U|ONE -#238|Aspirant's Ascent|C|ONE -#239|Gitaxian Anatomist|C|ONE -#240|Ichor Synthesizer|C|ONE -#241|Prologue to Phyresis|C|ONE -#242|Offer Immortality|C|ONE -#243|Vat of Rebirth|U|ONE -#244|Nahiri's Sacrifice|U|ONE -#245|Conduit of Worlds|R|ONE -#246|Expand the Sphere|U|ONE -#247|Monument to Perfection|R|ONE -#248|Myr Custodian|C|ONE -#249|Myr Kinsmith|C|ONE -#250|Prosthetic Injector|U|ONE -#251|Against All Odds|U|ONE -#252|Norn's Wellspring|R|ONE -#253|Font of Progress|U|ONE -#254|Gleeful Demolition|U|ONE -#255|Ichormoon Gauntlet|M|ONE -#256|Mindsplice Apparatus|R|ONE -#257|Minor Misstep|U|ONE -#258|Duress|C|ONE -#259|Soulless Jailer|R|ONE -#260|Encroaching Mycosynth|R|ONE -#261|Mirran Safehouse|R|ONE +#27|Tekuthal, Inquiry Dominus|M|ONE +#28|Solphim, Mayhem Dominus|M|ONE +#29|Evolving Adaptive|U|ONE +#30|Zopandrel, Hunger Dominus|M|ONE +#31|Bladehold War-Whip|U|ONE +#32|Cinderslash Ravager|U|ONE +#33|Bladed Ambassador|U|ONE +#34|Crawling Chorus|C|ONE +#35|Jawbone Duelist|U|ONE +#36|Skrelv's Hive|R|ONE +#37|Blue Sun's Twilight|R|ONE +#38|Trawler Drake|U|ONE +#39|Unctus's Retrofitter|U|ONE +#40|Ambulatory Edifice|U|ONE +#41|Anoint with Affliction|C|ONE +#42|Archfiend of the Dross|R|ONE +#43|Drivnod, Carnage Dominus|M|ONE +#44|Drown in Ichor|U|ONE +#45|Karumonix, the Rat King|R|ONE +#46|Phyrexian Obliterator|M|ONE +#47|Vraan, Executioner Thane|R|ONE +#48|Chimney Rabble|C|ONE +#49|Furnace Strider|C|ONE +#50|Hazardous Blast|C|ONE +#51|Hexgold Slash|C|ONE +#52|Rebel Salvo|U|ONE +#53|Sylvok Battle-Chair|U|ONE +#54|Tyrranax Rex|M|ONE +#55|Ria Ivor, Bane of Bladehold|R|ONE +#56|Slaughter Singer|U|ONE +#57|Vivisection Evangelist|U|ONE +#58|Atraxa's Skitterfang|U|ONE +#59|Ichorplate Golem|U|ONE +#60|Compleat Devotion|C|ONE +#61|Duelist of Deep Faith|C|ONE +#62|Hexgold Hoverwings|U|ONE +#63|Planar Disruption|C|ONE +#64|Plated Onslaught|U|ONE +#65|Porcelain Zealot|U|ONE +#66|Resistance Reunited|U|ONE +#67|Unctus, Grand Metatect|R|ONE +#68|Bilious Skulldweller|U|ONE +#69|Blightbelly Rat|C|ONE +#70|Chittering Skitterling|U|ONE +#71|Gulping Scraptrap|C|ONE +#72|Pestilent Syphoner|C|ONE +#73|Stinging Hivemaster|C|ONE +#74|Testament Bearer|C|ONE +#75|Axiom Engraver|C|ONE +#76|Barbed Batterfist|C|ONE +#77|Blazing Crescendo|C|ONE +#78|Cacophony Scamp|U|ONE +#79|Capricious Hellraiser|M|ONE +#80|Resistance Skywarden|U|ONE +#81|Urabrask's Anointer|U|ONE +#82|Armored Scrapgorger|U|ONE +#83|Cankerbloom|U|ONE +#84|Contagious Vorrac|C|ONE +#85|Evolved Spinoderm|R|ONE +#86|Incubation Sac|U|ONE +#87|Infectious Bite|U|ONE +#88|Viral Spawning|U|ONE +#89|Cephalopod Sentry|U|ONE +#90|Charforger|U|ONE +#91|Jor Kadeen, First Goldwarden|R|ONE +#92|Necrogen Rotpriest|U|ONE +#93|Serum-Core Chimera|U|ONE +#94|Venser, Corpse Puppet|R|ONE +#95|Ribskiff|U|ONE +#96|Serum Snare|U|ONE +#97|Tamiyo's Immobilizer|U|ONE +#98|Nimraiser Paladin|U|ONE +#99|Churning Reservoir|U|ONE +#100|Exuberant Fuseling|U|ONE +#101|Free from Flesh|C|ONE +#102|Furnace Punisher|U|ONE +#103|Hexgold Halberd|U|ONE +#104|Volt Charge|C|ONE +#105|Lattice-Blade Mantis|C|ONE +#106|Ruthless Predation|C|ONE +#107|Titanic Growth|C|ONE +#108|Tyvar's Stand|U|ONE +#109|Ezuri, Stalker of Spheres|R|ONE +#110|Melira, the Living Cure|R|ONE +#111|Tainted Observer|U|ONE +#112|Voidwing Hybrid|U|ONE +#113|Mandible Justiciar|C|ONE +#114|Malcator's Watcher|C|ONE +#115|Mesmerizing Dose|C|ONE +#116|Ravenous Necrotitan|U|ONE +#117|Kuldotha Cackler|C|ONE +#118|Magmatic Sprinter|U|ONE +#119|Vindictive Flamestoker|R|ONE +#120|Rustvine Cultivator|C|ONE +#121|Tyrranax Atrocity|C|ONE +#122|Kethek, Crucible Goliath|R|ONE +#123|Nahiri, the Unforgiving|M|ONE +#124|Ovika, Enigma Goliath|R|ONE +#125|Myr Convert|U|ONE +#126|Mirrex|R|ONE +#127|Basilica Shepherd|C|ONE +#128|Charge of the Mites|C|ONE +#129|Flensing Raptor|C|ONE +#130|Incisor Glider|C|ONE +#131|Indoctrination Attendant|C|ONE +#132|Infested Fleshcutter|U|ONE +#133|Mirran Bardiche|C|ONE +#134|Phyrexian Vindicator|M|ONE +#135|Sinew Dancer|C|ONE +#136|Atmosphere Surgeon|U|ONE +#137|Blade of Shared Souls|R|ONE +#138|Chrome Prowler|C|ONE +#139|Eye of Malcator|C|ONE +#140|Font of Progress|U|ONE +#141|Gitaxian Anatomist|C|ONE +#142|Ichor Synthesizer|C|ONE +#143|Quicksilver Fisher|C|ONE +#144|Tamiyo's Logbook|U|ONE +#145|Vivisurgeon's Insight|C|ONE +#146|Annihilating Glare|C|ONE +#147|Cruel Grimnarch|C|ONE +#148|Infectious Inquiry|C|ONE +#149|Necrogen Communion|U|ONE +#150|Phyrexian Arena|R|ONE +#151|Sheoldred's Headcleaver|C|ONE +#152|Vat Emergence|U|ONE +#153|Whisper of the Dross|C|ONE +#154|All Will Be One|M|ONE +#155|Bladegraft Aspirant|C|ONE +#156|Molten Rebuke|C|ONE +#157|Shrapnel Slinger|C|ONE +#158|Slobad, Iron Goblin|R|ONE +#159|Vulshok Splitter|C|ONE +#160|Branchblight Stalker|C|ONE +#161|Ichorspit Basilisk|C|ONE +#162|Maze's Mantle|C|ONE +#163|Oil-Gorger Troll|C|ONE +#164|Predation Steward|C|ONE +#165|Myr Custodian|C|ONE +#166|Myr Kinsmith|C|ONE +#167|The Autonomous Furnace|C|ONE +#168|Blackcleave Cliffs|R|ONE +#169|Copperline Gorge|R|ONE +#170|Darkslick Shores|R|ONE +#171|The Dross Pits|C|ONE +#172|The Fair Basilica|C|ONE +#173|The Hunter Maze|C|ONE +#174|The Monumental Facade|R|ONE +#175|The Mycosynth Gardens|R|ONE +#176|Razorverge Thicket|R|ONE +#177|Seachrome Coast|R|ONE +#178|The Seedcore|R|ONE +#179|The Surgical Bay|C|ONE +#180|Terramorphic Expanse|C|ONE +#181|Experimental Augury|C|ONE +#182|Reject Imperfection|U|ONE +#183|Watchful Blisterzoa|U|ONE +#184|Necrosquito|U|ONE +#185|Adaptive Sporesinger|C|ONE +#186|Conduit of Worlds|R|ONE +#187|Venerated Rotpriest|R|ONE +#188|Against All Odds|U|ONE +#189|Apostle of Invasion|U|ONE +#190|Goldwarden's Helm|C|ONE +#191|Leonin Lightbringer|C|ONE +#192|Norn's Wellspring|R|ONE +#193|Orthodoxy Enforcer|C|ONE +#194|Swooping Lookout|U|ONE +#195|Vanish into Eternity|C|ONE +#196|Zealot's Conviction|C|ONE +#197|Distorted Curiosity|U|ONE +#198|Escaped Experiment|C|ONE +#199|Gitaxian Raptor|C|ONE +#200|Glistener Seer|C|ONE +#201|Meldweb Curator|C|ONE +#202|Meldweb Strider|C|ONE +#203|Prologue to Phyresis|C|ONE +#204|Thrummingbird|U|ONE +#205|Transplant Theorist|U|ONE +#206|Bonepicker Skirge|C|ONE +#207|Cutthroat Centurion|C|ONE +#208|Feed the Infection|U|ONE +#209|Fleshless Gladiator|C|ONE +#210|Geth, Thane of Contracts|R|ONE +#211|Scheming Aspirant|U|ONE +#212|Vraska's Fall|C|ONE +#213|Awaken the Sleeper|U|ONE +#214|Forgehammer Centurion|C|ONE +#215|Oxidda Finisher|U|ONE +#216|Sawblade Scamp|C|ONE +#217|Carnivorous Canopy|C|ONE +#218|Noxious Assault|U|ONE +#219|Paladin of Predation|U|ONE +#220|Skyscythe Engulfer|C|ONE +#221|Thirsting Roots|C|ONE +#222|Venomous Brutalizer|U|ONE +#223|Basilica Skullbomb|C|ONE +#224|Dross Skullbomb|C|ONE +#225|Dune Mover|C|ONE +#226|The Filigree Sylex|R|ONE +#227|Furnace Skullbomb|C|ONE +#228|Maze Skullbomb|C|ONE +#229|Phyrexian Atlas|C|ONE +#230|Prophetic Prism|C|ONE +#231|Staff of Compleation|M|ONE +#232|Surgical Skullbomb|C|ONE +#233|Zenith Chronicler|R|ONE +#234|Aspirant's Ascent|C|ONE +#235|Bring the Ending|C|ONE +#236|Duress|C|ONE +#237|Offer Immortality|C|ONE +#238|Sheoldred's Edict|U|ONE +#239|Vat of Rebirth|U|ONE +#240|Red Sun's Twilight|R|ONE +#241|Thrill of Possibility|C|ONE +#242|Copper Longlegs|C|ONE +#243|Green Sun's Twilight|R|ONE +#244|Atraxa, Grand Unifier|M|ONE +#245|Graaz, Unstoppable Juggernaut|R|ONE +#246|Prosthetic Injector|U|ONE +#247|Tablet of Compleation|R|ONE +#248|Veil of Assimilation|U|ONE +#249|Encroaching Mycosynth|R|ONE +#250|Ichormoon Gauntlet|M|ONE +#251|Mindsplice Apparatus|R|ONE +#252|Minor Misstep|U|ONE +#253|Gleeful Demolition|U|ONE +#254|Nahiri's Sacrifice|U|ONE +#255|Expand the Sphere|U|ONE +#256|Plague Nurse|C|ONE +#257|Unnatural Restoration|U|ONE +#258|Tyvar, Jubilant Brawler|R|ONE +#259|Mirran Safehouse|R|ONE +#260|Monument to Perfection|R|ONE +#261|Soulless Jailer|R|ONE #262|Plains 1|C|ONE #263|Island 1|C|ONE #264|Swamp 1|C|ONE diff --git a/forge-gui/res/editions/March of the Machine.txt b/forge-gui/res/editions/March of the Machine.txt index 865c7cc0cf7..e6ce3275820 100644 --- a/forge-gui/res/editions/March of the Machine.txt +++ b/forge-gui/res/editions/March of the Machine.txt @@ -3,6 +3,10 @@ Code=MOM Date=2023-04-21 Name=March of the Machine Type=Expansion +BoosterCovers=3 +Booster=8 Common:!fromSheet("MOM lands"):fromsheet("MOM cards"), 2 Uncommon:fromSheet("MOM cards"), 1 dfc:!fromSheet("MOM battles"):fromSheet("MOM cards"), 1 UncommonRareMythic:!dfc:fromSheet("MOM cards"), 1 fromSheet("MOM battles"), 1 fromSheet("MUL cards"), 1 fromSheet("MOM lands") +Prerelease=6 Boosters, 1 RareMythic+ +BoosterBox=36 ScryfallCode=MOM [cards] @@ -406,6 +410,71 @@ ScryfallCode=MOM [buy a box] 387 R Omnath, Locus of All @Helge C. Balzer +[lands] +4 Plains|MOM|1 +3 Plains|MOM|2 +3 Plains|MOM|3 +4 Island|MOM|1 +3 Island|MOM|2 +3 Island|MOM|3 +4 Swamp|MOM|1 +3 Swamp|MOM|2 +3 Swamp|MOM|3 +4 Mountain|MOM|1 +3 Mountain|MOM|2 +3 Mountain|MOM|3 +4 Forest|MOM|1 +3 Forest|MOM|2 +3 Forest|MOM|3 +5 Bloodfell Caves|MOM +5 Blossoming Sands|MOM +5 Dismal Backwater|MOM +5 Jungle Hollow|MOM +5 Rugged Highlands|MOM +5 Scoured Barrens|MOM +5 Swiftwater Cliffs|MOM +5 Thornwood Falls|MOM +5 Tranquil Cove|MOM +5 Wind-Scarred Crag|MOM + +[battles] +1 Invasion of Alara|MOM +1 Invasion of Amonkhet|MOM +1 Invasion of Arcavios|MOM +1 Invasion of Azgol|MOM +1 Invasion of Belenon|MOM +1 Invasion of Dominaria|MOM +1 Invasion of Eldraine|MOM +1 Invasion of Ergamon|MOM +1 Invasion of Fiora|MOM +1 Invasion of Gobakhan|MOM +1 Invasion of Ikoria|MOM +1 Invasion of Innistrad|MOM +1 Invasion of Ixalan|MOM +1 Invasion of Kaladesh|MOM +1 Invasion of Kaldheim|MOM +1 Invasion of Kamigawa|MOM +1 Invasion of Karsus|MOM +1 Invasion of Kylem|MOM +1 Invasion of Lorwyn|MOM +1 Invasion of Mercadia|MOM +1 Invasion of Moag|MOM +1 Invasion of Muraganda|MOM +1 Invasion of New Capenna|MOM +1 Invasion of New Phyrexia|MOM +1 Invasion of Pyrulea|MOM +1 Invasion of Ravnica|MOM +1 Invasion of Regatha|MOM +1 Invasion of Segovia|MOM +1 Invasion of Shandalar|MOM +1 Invasion of Tarkir|MOM +1 Invasion of Theros|MOM +1 Invasion of Tolvada|MOM +1 Invasion of Ulgrotha|MOM +1 Invasion of Vryn|MOM +1 Invasion of Xerex|MOM +1 Invasion of Zendikar|MOM + [tokens] b_2_2_zombie c_1_1_a_thopter_flying diff --git a/forge-gui/res/editions/Shadows over Innistrad Remastered.txt b/forge-gui/res/editions/Shadows over Innistrad Remastered.txt index 8ba7ea1c6a5..fa02296d334 100644 --- a/forge-gui/res/editions/Shadows over Innistrad Remastered.txt +++ b/forge-gui/res/editions/Shadows over Innistrad Remastered.txt @@ -4,7 +4,7 @@ Date=2023-03-21 Name=Shadows over Innistrad Remastered Type=Online BoosterCovers=3 -Booster=10 Common:fromsheet("SIR cards"), 3 Uncommon:fromSheet("SIR cards"), 1 RareMythic:fromSheet("SIR cards"), 1 BasicLand:fromSheet("SIR cards") +Booster=9 Common:fromsheet("SIR cards"), 3 Uncommon:fromSheet("SIR cards"), 1 RareMythic:fromSheet("SIR cards"), 1 BasicLand:fromSheet("SIR cards"), 1 Any:fromSheet("SIS cards") Prerelease=6 Boosters, 1 RareMythic+ BoosterBox=36 ScryfallCode=SIR From 5a9faae08eed250523de904ca390c9c9ba26f8e1 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Wed, 12 Apr 2023 21:19:53 -0400 Subject: [PATCH 02/12] MOM: inga_and_esika.txt + support --- .../src/main/java/forge/game/ForgeScript.java | 18 +++++++++++++----- .../cardsfolder/upcoming/inga_and_esika.txt | 9 +++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/inga_and_esika.txt diff --git a/forge-game/src/main/java/forge/game/ForgeScript.java b/forge-game/src/main/java/forge/game/ForgeScript.java index 2ecb44a56e8..b11d9040420 100644 --- a/forge-game/src/main/java/forge/game/ForgeScript.java +++ b/forge-game/src/main/java/forge/game/ForgeScript.java @@ -254,18 +254,26 @@ public class ForgeScript { int y = AbilityUtils.calculateAmount(source, k[1].substring(2), spellAbility); return Expressions.compare(sa.getTotalManaSpent(), comparator, y); } else if (property.startsWith("ManaFrom")) { - final String fromWhat = property.substring(8); - boolean found = false; + String fromWhat = property.substring(8); + String[] parts = null; + if (fromWhat.contains("_")) { + parts = fromWhat.split("_"); + fromWhat = parts[0]; + } + int toFind = parts != null ? AbilityUtils.calculateAmount(source, parts[1], spellAbility) : 1; + int found = 0; for (Mana m : sa.getPayingMana()) { final Card manaSource = m.getSourceCard(); if (manaSource != null) { if (manaSource.isValid(fromWhat, sourceController, source, spellAbility)) { - found = true; - break; + found++; + if (found == toFind) { + break; + } } } } - return found; + return (found == toFind); } else if (property.equals("MayPlaySource")) { StaticAbility m = sa.getMayPlay(); if (m == null) { diff --git a/forge-gui/res/cardsfolder/upcoming/inga_and_esika.txt b/forge-gui/res/cardsfolder/upcoming/inga_and_esika.txt new file mode 100644 index 00000000000..865acf01cc2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/inga_and_esika.txt @@ -0,0 +1,9 @@ +Name:Inga and Esika +ManaCost:2 G U +Types:Legendary Creature Human God +PT:4/4 +S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddAbility$ Mana | AddKeyword$ Vigilance | Description$ Creatures you control have vigilance and "{T}: Add one mana of any color. Spend this mana only to cast a creature spell." +SVar:Mana:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | RestrictValid$ Spell.Creature | SpellDescription$ Add one mana of any color. Spend this mana only to cast a creature spell. +T:Mode$ SpellCast | ValidCard$ Creature | ValidSA$ Spell.ManaFromCreature_3 | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell, if three or more mana from creatures was spent to cast it, draw a card. +SVar:TrigDraw:DB$ Draw +Oracle:Creatures you control have vigilance and "{T}: Add one mana of any color. Spend this mana only to cast a creature spell."\nWhenever you cast a creature spell, if three or more mana from creatures was spent to cast it, draw a card. From 183ff20c1427e34d92a9f93aac74897da52b0525 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 11 Apr 2023 10:23:27 -0400 Subject: [PATCH 03/12] battle stuff --- .../main/java/forge/game/card/CardProperty.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 059588c271e..eae03fdeb38 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -213,6 +213,11 @@ public class CardProperty { return false; } } + } else if (property.startsWith("OppProtect")) { + if (card.getProtectingPlayer() == null + || !sourceController.getOpponents().contains(card.getProtectingPlayer())) { + return false; + } } else if (property.startsWith("DefendingPlayer")) { Player p = property.endsWith("Ctrl") ? controller : card.getOwner(); if (!game.getPhaseHandler().inCombat()) { @@ -1549,6 +1554,15 @@ public class CardProperty { return false; } } + if (property.equals("attackingBattle")) { + final GameEntity attacked = combat.getDefenderByAttacker(source); + if (!(attacked instanceof Card)) { + return false; + } + if (!((Card) attacked).isBattle()) { + return false; + } + } if (property.startsWith("attackingYouOrYourPW")) { GameEntity defender = combat.getDefenderByAttacker(card); if (defender instanceof Card) { From 03b807aeb927cf014bc361a8cc43a0fb944637a8 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 11 Apr 2023 10:23:53 -0400 Subject: [PATCH 04/12] battle stuff the rest --- .../res/cardsfolder/k/kaya_ghost_assassin.txt | 11 +++++----- ...ovolars_huntmaster_tovolars_packleader.txt | 2 +- .../upcoming/etched_host_doombringer.txt | 15 +++++++++++++ .../invasion_of_amonkhet_lazotep_convert.txt | 22 +++++++++++++++++++ ...nvasion_of_zendikar_awakened_skyclave.txt} | 7 +++--- .../upcoming/joyful_stormsculptor.txt | 11 ++++++++++ .../upcoming/rampaging_geoderm.txt | 13 +++++++++++ .../res/tokenscripts/ur_1_1_elemental.txt | 6 +++++ 8 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/etched_host_doombringer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/invasion_of_amonkhet_lazotep_convert.txt rename forge-gui/res/cardsfolder/upcoming/{invasion_of_zendikar__awakened_skyclave.txt => invasion_of_zendikar_awakened_skyclave.txt} (68%) create mode 100644 forge-gui/res/cardsfolder/upcoming/joyful_stormsculptor.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rampaging_geoderm.txt create mode 100644 forge-gui/res/tokenscripts/ur_1_1_elemental.txt diff --git a/forge-gui/res/cardsfolder/k/kaya_ghost_assassin.txt b/forge-gui/res/cardsfolder/k/kaya_ghost_assassin.txt index 711f6d8530b..fb4d5036bd7 100644 --- a/forge-gui/res/cardsfolder/k/kaya_ghost_assassin.txt +++ b/forge-gui/res/cardsfolder/k/kaya_ghost_assassin.txt @@ -2,7 +2,7 @@ Name:Kaya, Ghost Assassin ManaCost:2 W B Types:Legendary Planeswalker Kaya Loyalty:5 -A:AB$ Pump | Cost$ AddCounter<0/LOYALTY> | ValidTgts$ Creature | TargetMax$ 1 | TargetMin$ 0 | Planeswalker$ True | SubAbility$ DBChoose | StackDeSpellDescription$ SpellDescription | SpellDescription$ Exile CARDNAME or up to one target creature. Return that card to the battlefield under its owner's control at the beginning of your next upkeep. You lose 2 life. +A:AB$ Pump | Cost$ AddCounter<0/LOYALTY> | ValidTgts$ Creature | TargetMax$ 1 | TargetMin$ 0 | Planeswalker$ True | SubAbility$ DBChoose | StackDescription$ SpellDescription | SpellDescription$ Exile CARDNAME or up to one target creature. Return that card to the battlefield under its owner's control at the beginning of your next upkeep. You lose 2 life. SVar:DBChoose:DB$ GenericChoice | Choices$ DBExileSelf,DBExileTarget | Defined$ You SVar:DBExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBDelTrig | SpellDescription$ Exile CARDNAME SVar:DBExileTarget:DB$ ChangeZone | Defined$ Targeted | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBDelTrig | SpellDescription$ Exile up to one target creature @@ -10,9 +10,10 @@ SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Y SVar:DBReturn:DB$ ChangeZone | Origin$ Exile | Defined$ DelayTriggerRememberedLKI | Destination$ Battlefield SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBLoseLife SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 2 | Defined$ You -A:AB$ LoseLife | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Defined$ Player.Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Each opponent loses 2 life and you gain 2 life. -SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 -A:AB$ Discard | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ Player.Opponent | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDraw | SpellDescription$ Each opponent discards a card and you draw a card. -SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 +A:AB$ LoseLife | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Defined$ Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Each opponent loses 2 life and you gain 2 life. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 +A:AB$ Discard | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ Opponent | Mode$ TgtChoose | SubAbility$ DBDraw | SpellDescription$ Each opponent discards a card and you draw a card. +SVar:DBDraw:DB$ Draw AI:RemoveDeck:All +DeckHas:Ability$LifeGain Oracle:[0]: Exile Kaya, Ghost Assassin or up to one target creature. Return that card to the battlefield under its owner's control at the beginning of your next upkeep. You lose 2 life.\n[-1]: Each opponent loses 2 life and you gain 2 life.\n[-2]: Each opponent discards a card and you draw a card. diff --git a/forge-gui/res/cardsfolder/t/tovolars_huntmaster_tovolars_packleader.txt b/forge-gui/res/cardsfolder/t/tovolars_huntmaster_tovolars_packleader.txt index eba47fceecc..e396f549560 100644 --- a/forge-gui/res/cardsfolder/t/tovolars_huntmaster_tovolars_packleader.txt +++ b/forge-gui/res/cardsfolder/t/tovolars_huntmaster_tovolars_packleader.txt @@ -5,7 +5,7 @@ PT:6/6 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 2/2 green Wolf creature tokens. SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ g_2_2_wolf K:Daybound -DeckHas:Ability$Token +DeckHas:Ability$Token & Type$Wolf AlternateMode:DoubleFaced Oracle:When Tovolar's Huntmaster enters the battlefield, create two 2/2 green Wolf creature tokens.\nDaybound (If a player casts no spells during their own turn, it becomes night next turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/etched_host_doombringer.txt b/forge-gui/res/cardsfolder/upcoming/etched_host_doombringer.txt new file mode 100644 index 00000000000..08c2d08438d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/etched_host_doombringer.txt @@ -0,0 +1,15 @@ +Name:Etched Host Doombringer +ManaCost:4 B +Types:Creature Phyrexian Demon +PT:3/5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ When CARDNAME enters the battlefield, ABILITY +SVar:TrigCharm:DB$ Charm | Choices$ Drain,Battle +SVar:Drain:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Target opponent loses 2 life and you gain 2 life. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 +SVar:Battle:DB$ Branch | ValidTgts$ Battle | BranchConditionSVar$ X | TrueSubAbility$ RemoveCounter | FalseSubAbility$ PutCounter | SpellDescription$ Choose target battle. If an opponent protects it, remove three defense counters from it. Otherwise, put three defense counters on it. +SVar:RemoveCounter:DB$ RemoveCounter | Defined$ Targeted | CounterType$ DEFENSE | CounterNum$ 3 +SVar:PutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ DEFENSE | CounterNum$ 3 +SVar:X:Targeted$Valid Battle.OppProtect +DeckHas:Ability$LifeGain +DeckHints:Type$Battle +Oracle:When Etched Host Doombringer enters the battlefield, choose one —\n• Target opponent loses 2 life and you gain 2 life.\n• Choose target battle. If an opponent protects it, remove three defense counters from it. Otherwise, put three defense counters on it. diff --git a/forge-gui/res/cardsfolder/upcoming/invasion_of_amonkhet_lazotep_convert.txt b/forge-gui/res/cardsfolder/upcoming/invasion_of_amonkhet_lazotep_convert.txt new file mode 100644 index 00000000000..712878b1c93 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/invasion_of_amonkhet_lazotep_convert.txt @@ -0,0 +1,22 @@ +Name:Invasion of Amonkhet +ManaCost:1 U B +Types:Battle Siege +Defense:4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When CARDNAME enters the battlefield, each player mills three cards, then each opponent discards a card and you draw a card. (To mill three cards, a player puts the top three cards of their library into their graveyard.) +SVar:TrigMill:DB$ Mill | Defined$ Player | NumCards$ 3 | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | Defined$ Opponent | Mode$ TgtChoose | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw +AlternateMode:DoubleFaced +DeckHas:Ability$Mill +Oracle:(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)\nWhen Invasion of Amonkhet enters the battlefield, each player mills three cards, then each opponent discards a card and you draw a card. (To mill three cards, a player puts the top three cards of their library into their graveyard.) + +ALTERNATE + +Name:Lazotep Convert +ManaCost:no cost +Colors:blue,black +Types:Creature Zombie +PT:4/4 +K:ETBReplacement:Copy:DBCopy:Optional +SVar:DBCopy:DB$ Clone | Choices$ Creature | ChoiceZone$ Graveyard | SetPower$ 4 | SetToughness$ 4 | AddColors$ Black | AddTypes$ Zombie | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature card in a graveyard, except it's a 4/4 black Zombie in addition to its other types. +Oracle:You may have Lazotep Convert enter the battlefield as a copy of any creature card in a graveyard, except it's a 4/4 black Zombie in addition to its other types. diff --git a/forge-gui/res/cardsfolder/upcoming/invasion_of_zendikar__awakened_skyclave.txt b/forge-gui/res/cardsfolder/upcoming/invasion_of_zendikar_awakened_skyclave.txt similarity index 68% rename from forge-gui/res/cardsfolder/upcoming/invasion_of_zendikar__awakened_skyclave.txt rename to forge-gui/res/cardsfolder/upcoming/invasion_of_zendikar_awakened_skyclave.txt index 1da2f318d66..3b0cd3d5e92 100644 --- a/forge-gui/res/cardsfolder/upcoming/invasion_of_zendikar__awakened_skyclave.txt +++ b/forge-gui/res/cardsfolder/upcoming/invasion_of_zendikar_awakened_skyclave.txt @@ -4,9 +4,8 @@ Types:Battle Siege Defense:3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | TriggerDescription$ When CARDNAME enters the battlefield, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle. SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 2 | Shuffle$ True -Oracle:(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.) When Invasion of Zendikar enters the battlefield, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle. - AlternateMode:DoubleFaced +Oracle:(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)\nWhen Invasion of Zendikar enters the battlefield, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle. ALTERNATE @@ -18,6 +17,6 @@ PT:4/4 A:SP$ PermanentCreature K:Vigilance K:Haste -S:Mode$ Continuous | Affected$ Card.Self | AddType$ Land | Description$ As long as Awakened Skyclave is on the battlefield, it’s a land in addition to its other types. +S:Mode$ Continuous | Affected$ Card.Self | AddType$ Land | Description$ As long as CARDNAME is on the battlefield, it's a land in addition to its other types. A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. -Oracle:Vigilance, haste. \nAs long as Awakened Skyclave is on the battlefield, it's a land in addition to its other types.\n{T}: Add one mana of any color +Oracle:Vigilance, haste\nAs long as Awakened Skyclave is on the battlefield, it's a land in addition to its other types.\n{T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/upcoming/joyful_stormsculptor.txt b/forge-gui/res/cardsfolder/upcoming/joyful_stormsculptor.txt new file mode 100644 index 00000000000..d1518922dea --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/joyful_stormsculptor.txt @@ -0,0 +1,11 @@ +Name:Joyful Stormsculptor +ManaCost:3 U R +Types:Creature Human Shaman +PT:2/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 blue and red Elemental creature tokens. +SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ ur_1_1_elemental +T:Mode$ SpellCast | ValidCard$ Card.withConvoke | ValidActivatingPlayer$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a spell that has convoke, CARDNAME deals 1 damage to each opponent and each battle they protect. +SVar:TrigDamage:DB$ DamageAll | ValidPlayers$ Player.Opponent | ValidCards$ Battle.OppProtect | NumDmg$ 1 +DeckHas:Ability$Token & Type$Elemental +DeckHints:Keyword$Convoke +Oracle:When Joyful Stormsculptor enters the battlefield, create two 1/1 blue and red Elemental creature tokens.\nWhenever you cast a spell that has convoke, Joyful Stormsculptor deals 1 damage to each opponent and each battle they protect. diff --git a/forge-gui/res/cardsfolder/upcoming/rampaging_geoderm.txt b/forge-gui/res/cardsfolder/upcoming/rampaging_geoderm.txt new file mode 100644 index 00000000000..dd055fea851 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rampaging_geoderm.txt @@ -0,0 +1,13 @@ +Name:Rampaging Geoderm +ManaCost:2 R G +Types:Creature Dinosaur Beast +PT:3/3 +K:Trample +K:Haste +T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, target attacking creature gets +1/+1 until end of turn. If it's attacking a battle, put a +1/+1 counter on it instead. +SVar:TrigPump:DB$ Branch | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | BranchConditionSVar$ X | TrueSubAbility$ PutCounter | FalseSubAbility$ Pump +SVar:PutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 +SVar:Pump:DB$ Pump | Defined$ Targeted | NumAtt$ +1 | NumDef$ +1 +SVar:X:Targeted$Valid Card.attackingBattle +DeckHas:Ability$Counters +Oracle:Trample, haste\nWhenever you attack, target attacking creature gets +1/+1 until end of turn. If it's attacking a battle, put a +1/+1 counter on it instead. diff --git a/forge-gui/res/tokenscripts/ur_1_1_elemental.txt b/forge-gui/res/tokenscripts/ur_1_1_elemental.txt new file mode 100644 index 00000000000..ff29342f278 --- /dev/null +++ b/forge-gui/res/tokenscripts/ur_1_1_elemental.txt @@ -0,0 +1,6 @@ +Name:Elemental Token +ManaCost:no cost +Colors:blue,red +Types:Creature Elemental +PT:1/1 +Oracle: From a1051b3f3ec9c2e2946cd57a1a2e312e2df9e2a7 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 11 Apr 2023 19:49:19 -0400 Subject: [PATCH 05/12] more battle stuff --- .../game/ability/effects/PlayEffect.java | 1 + .../java/forge/game/card/CardFactoryUtil.java | 4 ++-- .../cardsfolder/s/sorin_lord_of_innistrad.txt | 2 +- .../upcoming/etched_host_doombringer.txt | 2 +- .../invasion_of_amonkhet_lazotep_convert.txt | 1 + ...nvasion_of_dominaria_serra_faithkeeper.txt | 22 +++++++++++++++++++ .../cardsfolder/upcoming/portent_tracker.txt | 10 +++++++++ 7 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/invasion_of_dominaria_serra_faithkeeper.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/portent_tracker.txt diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 0b7d9f440b0..1f14afa6ecc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -290,6 +290,7 @@ public class PlayEffect extends SpellAbilityEffect { if (!tgtCard.changeToState(CardStateName.Transformed)) { // Failed to transform. In the future, we might need to just remove this option and continue amount--; + System.err.println("CastTransformed failed for '" + tgtCard + "'."); continue; } state = CardStateName.Transformed; diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 38d8c517545..4f00e1693a1 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3932,7 +3932,7 @@ public class CardFactoryUtil { StringBuilder chooseSB = new StringBuilder(); chooseSB.append("Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementResult$ Updated"); chooseSB.append(" | Description$ (As a Siege enters the battlefield, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)"); - String chooseProtector = "DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | Protect$ True | ChoiceTitle$ Choose an opponent to protect this battle | AILogic$ Curse"; + String chooseProtector = "DB$ ChoosePlayer | Defined$ You | Choices$ Opponent | Protect$ True | ChoiceTitle$ Choose an opponent to protect this battle | AILogic$ Curse"; ReplacementEffect re = ReplacementHandler.parseReplacement(chooseSB.toString(), card, true); re.setOverridingAbility(AbilityFactory.getAbility(chooseProtector, card)); @@ -3944,7 +3944,7 @@ public class CardFactoryUtil { triggerDefeated.append(" TriggerDescription$ When CARDNAME is defeated, exile it, then cast it transformed."); String castExileBattle = "DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True"; - String castDefeatedBattle = "DB$ Play | Defined$ Remembered | WithoutManaCost$ True | CastTransformed$ True"; + String castDefeatedBattle = "DB$ Play | Defined$ Remembered | CastTransformed$ True"; Trigger defeatedTrigger = TriggerHandler.parseTrigger(triggerDefeated.toString(), card, true); SpellAbility exileAbility = AbilityFactory.getAbility(castExileBattle, card); diff --git a/forge-gui/res/cardsfolder/s/sorin_lord_of_innistrad.txt b/forge-gui/res/cardsfolder/s/sorin_lord_of_innistrad.txt index e7d16ec0d32..c7ce6d5523d 100644 --- a/forge-gui/res/cardsfolder/s/sorin_lord_of_innistrad.txt +++ b/forge-gui/res/cardsfolder/s/sorin_lord_of_innistrad.txt @@ -4,7 +4,7 @@ Types:Legendary Planeswalker Sorin Loyalty:3 A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | TokenAmount$ 1 | TokenScript$ b_1_1_vampire_lifelink | Planeswalker$ True | SpellDescription$ Create a 1/1 black Vampire creature token with lifelink. A:AB$ Effect | Cost$ SubCounter<2/LOYALTY> | Name$ Emblem - Sorin, Lord of Innistrad | Image$ emblem_sorin_lord_of_innistrad | StaticAbilities$ STPump | Planeswalker$ True | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Creatures you control get +1/+0." -SVar:STPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddPower$ 1 +SVar:STPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddPower$ 1 | Description$ Creatures you control get +1/+0. A:AB$ Destroy | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Creature,Planeswalker.Other | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Select target creatures or other planeswalkers | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DBChangeZoneAll | SpellDescription$ Destroy up to three target creatures and/or other planeswalkers. Return each card put into a graveyard this way to the battlefield under your control. SVar:DBChangeZoneAll:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/upcoming/etched_host_doombringer.txt b/forge-gui/res/cardsfolder/upcoming/etched_host_doombringer.txt index 08c2d08438d..e9b11b2bb40 100644 --- a/forge-gui/res/cardsfolder/upcoming/etched_host_doombringer.txt +++ b/forge-gui/res/cardsfolder/upcoming/etched_host_doombringer.txt @@ -5,7 +5,7 @@ PT:3/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ When CARDNAME enters the battlefield, ABILITY SVar:TrigCharm:DB$ Charm | Choices$ Drain,Battle SVar:Drain:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Target opponent loses 2 life and you gain 2 life. -SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 | StackDescription$ None SVar:Battle:DB$ Branch | ValidTgts$ Battle | BranchConditionSVar$ X | TrueSubAbility$ RemoveCounter | FalseSubAbility$ PutCounter | SpellDescription$ Choose target battle. If an opponent protects it, remove three defense counters from it. Otherwise, put three defense counters on it. SVar:RemoveCounter:DB$ RemoveCounter | Defined$ Targeted | CounterType$ DEFENSE | CounterNum$ 3 SVar:PutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ DEFENSE | CounterNum$ 3 diff --git a/forge-gui/res/cardsfolder/upcoming/invasion_of_amonkhet_lazotep_convert.txt b/forge-gui/res/cardsfolder/upcoming/invasion_of_amonkhet_lazotep_convert.txt index 712878b1c93..60b71db18aa 100644 --- a/forge-gui/res/cardsfolder/upcoming/invasion_of_amonkhet_lazotep_convert.txt +++ b/forge-gui/res/cardsfolder/upcoming/invasion_of_amonkhet_lazotep_convert.txt @@ -17,6 +17,7 @@ ManaCost:no cost Colors:blue,black Types:Creature Zombie PT:4/4 +A:SP$ PermanentCreature K:ETBReplacement:Copy:DBCopy:Optional SVar:DBCopy:DB$ Clone | Choices$ Creature | ChoiceZone$ Graveyard | SetPower$ 4 | SetToughness$ 4 | AddColors$ Black | AddTypes$ Zombie | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature card in a graveyard, except it's a 4/4 black Zombie in addition to its other types. Oracle:You may have Lazotep Convert enter the battlefield as a copy of any creature card in a graveyard, except it's a 4/4 black Zombie in addition to its other types. diff --git a/forge-gui/res/cardsfolder/upcoming/invasion_of_dominaria_serra_faithkeeper.txt b/forge-gui/res/cardsfolder/upcoming/invasion_of_dominaria_serra_faithkeeper.txt new file mode 100644 index 00000000000..6bd564a0792 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/invasion_of_dominaria_serra_faithkeeper.txt @@ -0,0 +1,22 @@ +Name:Invasion of Dominaria +ManaCost:2 W +Types:Battle Siege +Defense:5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 4 life and draw a card. +SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 4 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw +AlternateMode:DoubleFaced +DeckHas:Ability$LifeGain +Oracle:(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)\nWhen Invasion of Dominaria enters the battlefield, you gain 4 life and draw a card. + +ALTERNATE + +Name:Serra Faithkeeper +ManaCost:no cost +Colors:white +Types:Creature Angel +PT:4/4 +A:SP$ PermanentCreature +K:Flying +K:Vigilance +Oracle:Flying, vigilance diff --git a/forge-gui/res/cardsfolder/upcoming/portent_tracker.txt b/forge-gui/res/cardsfolder/upcoming/portent_tracker.txt new file mode 100644 index 00000000000..387b87a712e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/portent_tracker.txt @@ -0,0 +1,10 @@ +Name:Portent Tracker +ManaCost:1 G +Types:Creature Satyr Scout +PT:1/1 +A:AB$ Untap | Cost$ T | ValidTgts$ Land | AILogic$ PoolExtraMana | SpellDescription$ Untap target land. +A:AB$ Branch | Cost$ T | ValidTgts$ Battle | BranchConditionSVar$ Targeted$Valid Battle.OppProtect | SorcerySpeed$ True | TrueSubAbility$ RemoveCounter | FalseSubAbility$ PutCounter | SpellDescription$ Choose target battle. If an opponent protects it, remove a defense counter from it. Otherwise, put a defense counter on it. Activate only as a sorcery. +SVar:RemoveCounter:DB$ RemoveCounter | Defined$ Targeted | CounterType$ DEFENSE +SVar:PutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ DEFENSE +DeckHints:Type$Battle +Oracle:{T}: Untap target land.\n{T}: Choose target battle. If an opponent protects it, remove a defense counter from it. Otherwise, put a defense counter on it. Activate only as a sorcery. From 4a90f426038dbfdd47ceda5cc8dce3615a6978a8 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Wed, 12 Apr 2023 13:40:33 -0400 Subject: [PATCH 06/12] castDefeatedBattle --- .../src/main/java/forge/game/card/CardFactoryUtil.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 4f00e1693a1..181c4185ffb 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3944,7 +3944,11 @@ public class CardFactoryUtil { triggerDefeated.append(" TriggerDescription$ When CARDNAME is defeated, exile it, then cast it transformed."); String castExileBattle = "DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True"; - String castDefeatedBattle = "DB$ Play | Defined$ Remembered | CastTransformed$ True"; + // note full rules text: + // When the last defense counter is removed from this permanent, exile it, then you may cast it transformed + // without paying its mana cost. + String castDefeatedBattle = "DB$ Play | Defined$ Remembered | WithoutManaCost$ True | Optional$ True | " + + "CastTransformed$ True"; Trigger defeatedTrigger = TriggerHandler.parseTrigger(triggerDefeated.toString(), card, true); SpellAbility exileAbility = AbilityFactory.getAbility(castExileBattle, card); From 3e5da3b16240532c175c108791f984b0a5a4086a Mon Sep 17 00:00:00 2001 From: Northmoc Date: Wed, 12 Apr 2023 13:47:53 -0400 Subject: [PATCH 07/12] refactor cards to CountersPutOrRemoveEffect --- .../effects/CountersPutOrRemoveEffect.java | 20 +++++++++++++++++-- .../cardsfolder/s/shape_of_the_wiitigo.txt | 8 ++++---- .../upcoming/etched_host_doombringer.txt | 5 +---- .../cardsfolder/upcoming/portent_tracker.txt | 4 +--- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java index b5ffe10e01c..e756719b75d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java @@ -17,6 +17,7 @@ import forge.game.player.PlayerController; import forge.game.player.PlayerController.BinaryChoiceType; import forge.game.spellability.SpellAbility; import forge.util.CardTranslation; +import forge.util.Expressions; import forge.util.Lang; import forge.util.Localizer; @@ -27,6 +28,9 @@ import forge.util.Localizer; public class CountersPutOrRemoveEffect extends SpellAbilityEffect { @Override protected String getStackDescription(SpellAbility sa) { + if (sa.hasParam("AddConditionSVar")) { + return "Add StackDescription for AddOrRemoveCounter line with condition!"; + } final StringBuilder sb = new StringBuilder(); final Player pl = sa.hasParam("DefinedPlayer") ? AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("DefinedPlayer"), sa).getFirst() @@ -50,7 +54,7 @@ public class CountersPutOrRemoveEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card source = sa.getHostCard(); final Game game = source.getGame(); - final int counterAmount = AbilityUtils.calculateAmount(source, sa.getParam("CounterNum"), sa); + final int counterAmount = AbilityUtils.calculateAmount(source, sa.getParamOrDefault("CounterNum", "1"), sa); if (counterAmount <= 0) { return; @@ -112,7 +116,19 @@ public class CountersPutOrRemoveEffect extends SpellAbilityEffect { params.put("CounterType", chosenType); prompt = Localizer.getInstance().getMessage("lblWhatToDoWithTargetCounter", chosenType.getName()) + " "; - boolean putCounter = pc.chooseBinary(sa, prompt, BinaryChoiceType.AddOrRemove, params); + boolean putCounter; + if (sa.hasParam("RemoveConditionSVar")) { + final Card host = sa.getHostCard(); + final int value = AbilityUtils.calculateAmount(host, sa.getParam("RemoveConditionSVar"), sa); + final String compare = sa.getParamOrDefault("RemoveConditionSVarCompare", "GE1"); + final String operator = compare.substring(0, 2); + final String operand = compare.substring(2); + final int operandValue = AbilityUtils.calculateAmount(host, operand, sa); + + putCounter = !Expressions.compare(value, operator, operandValue); + } else { + putCounter = pc.chooseBinary(sa, prompt, BinaryChoiceType.AddOrRemove, params); + } if (putCounter) { tgtCard.addCounter(chosenType, counterAmount, pl, table); diff --git a/forge-gui/res/cardsfolder/s/shape_of_the_wiitigo.txt b/forge-gui/res/cardsfolder/s/shape_of_the_wiitigo.txt index c79028d63aa..e1210f280ae 100644 --- a/forge-gui/res/cardsfolder/s/shape_of_the_wiitigo.txt +++ b/forge-gui/res/cardsfolder/s/shape_of_the_wiitigo.txt @@ -2,11 +2,11 @@ Name:Shape of the Wiitigo ManaCost:3 G G G Types:Enchantment Aura K:Enchant creature -A:SP$ Attach | Cost$ 3 G G G | ValidTgts$ Creature | AILogic$ Pump +A:SP$ Attach | ValidTgts$ Creature | AILogic$ Pump T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put six +1/+1 counters on enchanted creature. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Enchanted | CounterType$ P1P1 | CounterNum$ 6 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter2 | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on enchanted creature if it attacked or blocked since your last upkeep. Otherwise, remove a +1/+1 counter from it. -SVar:TrigPutCounter2:DB$ PutCounter | Defined$ Enchanted | CounterType$ P1P1 | CounterNum$ 1 | ConditionPresent$ Card.EnchantedBy+attackedOrBlockedSinceYourLastUpkeep | SubAbility$ RemCounter -SVar:RemCounter:DB$ RemoveCounter | Defined$ Enchanted | CounterType$ P1P1 | CounterNum$ 1 | ConditionPresent$ Card.EnchantedBy+attackedOrBlockedSinceYourLastUpkeep | ConditionCompare$ EQ0 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAddOrRemoveCounter | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on enchanted creature if it attacked or blocked since your last upkeep. Otherwise, remove a +1/+1 counter from it. +SVar:TrigAddOrRemoveCounter:DB$ AddOrRemoveCounter | CounterType$ P1P1 | Defined$ Enchanted | RemoveConditionSVar$ Count$Valid Card.EnchantedBy+!attackedOrBlockedSinceYourLastUpkeep SVar:SacMe:1 +DeckHas:Ability$Counters Oracle:Enchant creature\nWhen Shape of the Wiitigo enters the battlefield, put six +1/+1 counters on enchanted creature.\nAt the beginning of your upkeep, put a +1/+1 counter on enchanted creature if it attacked or blocked since your last upkeep. Otherwise, remove a +1/+1 counter from it. diff --git a/forge-gui/res/cardsfolder/upcoming/etched_host_doombringer.txt b/forge-gui/res/cardsfolder/upcoming/etched_host_doombringer.txt index e9b11b2bb40..efba8d2c9b0 100644 --- a/forge-gui/res/cardsfolder/upcoming/etched_host_doombringer.txt +++ b/forge-gui/res/cardsfolder/upcoming/etched_host_doombringer.txt @@ -6,10 +6,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigCharm:DB$ Charm | Choices$ Drain,Battle SVar:Drain:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Target opponent loses 2 life and you gain 2 life. SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 | StackDescription$ None -SVar:Battle:DB$ Branch | ValidTgts$ Battle | BranchConditionSVar$ X | TrueSubAbility$ RemoveCounter | FalseSubAbility$ PutCounter | SpellDescription$ Choose target battle. If an opponent protects it, remove three defense counters from it. Otherwise, put three defense counters on it. -SVar:RemoveCounter:DB$ RemoveCounter | Defined$ Targeted | CounterType$ DEFENSE | CounterNum$ 3 -SVar:PutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ DEFENSE | CounterNum$ 3 -SVar:X:Targeted$Valid Battle.OppProtect +SVar:Battle:DB$ AddOrRemoveCounter | ValidTgts$ Battle | RemoveConditionSVar$ Targeted$Valid Battle.OppProtect | CounterType$ DEFENSE | CounterNum$ 3 | StackDescription$ REP Choose target battle. _ & it_{c:Targeted} | SpellDescription$ Choose target battle. If an opponent protects it, remove three defense counters from it. Otherwise, put three defense counters on it. DeckHas:Ability$LifeGain DeckHints:Type$Battle Oracle:When Etched Host Doombringer enters the battlefield, choose one —\n• Target opponent loses 2 life and you gain 2 life.\n• Choose target battle. If an opponent protects it, remove three defense counters from it. Otherwise, put three defense counters on it. diff --git a/forge-gui/res/cardsfolder/upcoming/portent_tracker.txt b/forge-gui/res/cardsfolder/upcoming/portent_tracker.txt index 387b87a712e..da8d9fb49ca 100644 --- a/forge-gui/res/cardsfolder/upcoming/portent_tracker.txt +++ b/forge-gui/res/cardsfolder/upcoming/portent_tracker.txt @@ -3,8 +3,6 @@ ManaCost:1 G Types:Creature Satyr Scout PT:1/1 A:AB$ Untap | Cost$ T | ValidTgts$ Land | AILogic$ PoolExtraMana | SpellDescription$ Untap target land. -A:AB$ Branch | Cost$ T | ValidTgts$ Battle | BranchConditionSVar$ Targeted$Valid Battle.OppProtect | SorcerySpeed$ True | TrueSubAbility$ RemoveCounter | FalseSubAbility$ PutCounter | SpellDescription$ Choose target battle. If an opponent protects it, remove a defense counter from it. Otherwise, put a defense counter on it. Activate only as a sorcery. -SVar:RemoveCounter:DB$ RemoveCounter | Defined$ Targeted | CounterType$ DEFENSE -SVar:PutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ DEFENSE +A:AB$ AddOrRemoveCounter | Cost$ T | ValidTgts$ Battle | RemoveConditionSVar$ Targeted$Valid Battle.OppProtect | CounterType$ DEFENSE | SorcerySpeed$ True | StackDescription$ REP Choose target battle. _ & it_{c:Targeted} & Activate only as a sorcery._ | SpellDescription$ Choose target battle. If an opponent protects it, remove a defense counter from it. Otherwise, put a defense counter on it. Activate only as a sorcery. DeckHints:Type$Battle Oracle:{T}: Untap target land.\n{T}: Choose target battle. If an opponent protects it, remove a defense counter from it. Otherwise, put a defense counter on it. Activate only as a sorcery. From 1eca58c313a8950ee7db35e4d0d9d99edb1c808c Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 13 Apr 2023 11:50:34 +0800 Subject: [PATCH 08/12] remove redundant frames on navigation arrow --- .../forge/adventure/util/NavArrowActor.java | 2 +- .../Shandalar/maps/tileset/compass.atlas | 16 ++++++++-------- .../Shandalar/maps/tileset/compass.png | Bin 2189 -> 2018 bytes 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/util/NavArrowActor.java b/forge-gui-mobile/src/forge/adventure/util/NavArrowActor.java index 156f9c47003..75df31b5107 100644 --- a/forge-gui-mobile/src/forge/adventure/util/NavArrowActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/NavArrowActor.java @@ -19,7 +19,7 @@ public class NavArrowActor extends Actor { if (textureAtlas.isEmpty()) { System.out.print("NavArrow sprite not found"); } - currentAnimation = new Animation<>(0.6f, textureAtlas); + currentAnimation = new Animation<>(0.4f, textureAtlas); } @Override diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/compass.atlas b/forge-gui/res/adventure/Shandalar/maps/tileset/compass.atlas index 436da3408fa..823251c5561 100644 --- a/forge-gui/res/adventure/Shandalar/maps/tileset/compass.atlas +++ b/forge-gui/res/adventure/Shandalar/maps/tileset/compass.atlas @@ -4,15 +4,15 @@ size: 50,50 format: RGBA8888 filter: Nearest,Nearest repeat: none -right0 - xy: 0,0 - size: 50,50 -right1 - xy: 50,0 +right3 + xy: 9,0 size: 50,50 right2 - xy: 100,0 + xy: 6,0 size: 50,50 -right3 - xy: 150,0 +right1 + xy: 3,0 + size: 50,50 +right0 + xy: 0,0 size: 50,50 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/maps/tileset/compass.png b/forge-gui/res/adventure/Shandalar/maps/tileset/compass.png index 477b906dbe03f652e0a9ee8f489457233ded5585..4643afc063f1af832cab1eb165065f9cb35830b4 100644 GIT binary patch delta 498 zcmeAbe8jKV8Q|y6%O%Cdz`(%k>ERLtq>VtBgAGW^*>`N5s3^g>aibLv)8s-X!^uue z+LISCC8#8(TBMq#ni%S)T396OnxvYT=vpS4CF+_OS)?Xe8m1Z;m?v&lW9DV#G7d2` zv@)@@GPIa%%c6+P&0sN}yn#hetvJZtNx{?A+04+=%uLrv&rnIBBr`3|%D*TxHLoPG zBr`wHR>^Sl2NnTFS7Pi{QYbEQEi17q&qxJoG%_$U)-^EEHAHfVE8FUNX&Htxpck)u zx;TbpG`_uI$aTm-;^;^H%+*`W17!BLu)pLiDfp`Oj_;h@5$_#ci)TL&m^Zn5$u-9p zzfb*kUZ(SN;sggK25INQ7p#A@9d8J==%Ny9FFKrBDE=XP^0JnhkyT1H=ax>Xd3)lQ z(dHznP4juyl_;!U_V!3cQ_IERLtq)z~`5eFNPlnk8maH66F};S@{=brskC-mSpDV*(w=Mp2=b$3#eDHNBumX%nQXQTqnGcqtT)-^EEHAHfV3)|{?zF)bO3=E8o zo-U3d6?5L+cFejRAi?tBxzf)$-;}uLd$h7Wnw)Ym`Do+xP;c>1H&Q;o4!zILq|Y-? zkjH6L?TfwU33vNnF>FX>V`^-4NKg=v;9w!h41U^v{`1H8_a*J^>+{>Ue((9#?>_g~ zhn(e~v`%-JHJ(%`!Bwb$+Plu8r!8? zRTr+^sxSXE+i!O9_TaBi-(Fl=zs_p1-|u%JayqOse~-L2IX2O1YP&b1yWK~t-ol)J zn%CmyukSB=v-R@A@4NKfp8vdY{`AVN*KXZ@y6e}}`qX{zfkvM%(~>_i|9bWB-t!*c z?yM|P*iib^KCDI8Sb&3vg^9WGfP;boPNo7v#Xg4BpN>BgdD9L`gbbdpelF{r5}E+m CxdxK} From 2b9a5a290e2f8eb7ead59ab991a0186fbb460774 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Thu, 13 Apr 2023 08:10:18 +0200 Subject: [PATCH 09/12] Some fixes --- .../forge/ai/ability/CountersProliferateAi.java | 14 ++++++++++---- forge-game/src/main/java/forge/game/card/Card.java | 1 + forge-gui/res/cardsfolder/j/jaddi_lifestrider.txt | 2 +- forge-gui/res/cardsfolder/s/siege_striker.txt | 2 +- .../res/cardsfolder/upcoming/elenda_and_azor.txt | 2 +- .../res/cardsfolder/upcoming/progenitor_exarch.txt | 3 ++- ...elink.txt => w_1_1_vampire_knight_lifelink.txt} | 4 ++-- 7 files changed, 18 insertions(+), 10 deletions(-) rename forge-gui/res/tokenscripts/{w_1_1_vampire_lifelink.txt => w_1_1_vampire_knight_lifelink.txt} (53%) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersProliferateAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersProliferateAi.java index 48599cf5763..2fa411bc203 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersProliferateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersProliferateAi.java @@ -28,10 +28,9 @@ public class CountersProliferateAi extends SpellAbilityAi { @Override protected boolean checkApiLogic(Player ai, SpellAbility sa) { final List cperms = Lists.newArrayList(); - final List allies = ai.getYourTeam(); boolean allyExpOrEnergy = false; - for (final Player p : allies) { + for (final Player p : ai.getYourTeam()) { // player has experience or energy counter if (p.getCounters(CounterEnumType.EXPERIENCE) + p.getCounters(CounterEnumType.ENERGY) >= 1) { allyExpOrEnergy = true; @@ -140,9 +139,16 @@ public class CountersProliferateAi extends SpellAbilityAi { if (c.isPlaneswalker()) { if (c.getController().isOpponentOf(ai)) { continue; - } else { - return (T)c; } + return (T)c; + } + + if (c.isBattle()) { + if (c.getProtectingPlayer().isOpponentOf(ai)) { + // TODO in multiplayer we might sometimes want to do it anyway? + continue; + } + return (T)c; } final Card lki = CardUtil.getLKICopy(c); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 5cf807fed1f..8f2d05f945e 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1738,6 +1738,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { protectingPlayer = p; view.updateProtectingPlayer(this); } + public final void setSecretChosenPlayer(final Player p) { chosenPlayer = p; } diff --git a/forge-gui/res/cardsfolder/j/jaddi_lifestrider.txt b/forge-gui/res/cardsfolder/j/jaddi_lifestrider.txt index f1858d9f568..90a60b489d6 100644 --- a/forge-gui/res/cardsfolder/j/jaddi_lifestrider.txt +++ b/forge-gui/res/cardsfolder/j/jaddi_lifestrider.txt @@ -2,7 +2,7 @@ Name:Jaddi Lifestrider ManaCost:4 G Types:Creature Elemental PT:2/8 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ GuestList | TriggerDescription$ When CARDNAME enters the battlefield, you may tap any number of untapped creatures you control. You gain 2 life for each creature tapped this way. +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigJaddiLifestriderTap | TriggerDescription$ When CARDNAME enters the battlefield, you may tap any number of untapped creatures you control. You gain 2 life for each creature tapped this way. SVar:TrigJaddiLifestriderTap:DB$ Tap | CardChoices$ Creature.YouCtrl+untapped | AnyNumber$ True | ChoiceAmount$ Count$Valid Creature.YouCtrl+untapped | RememberTapped$ True | SubAbility$ DBJaddiLifestriderGainLife SVar:DBJaddiLifestriderGainLife:DB$ GainLife | LifeAmount$ JaddiLifestriderZ | SubAbility$ DBJaddiLifestriderCleanup SVar:DBJaddiLifestriderCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/s/siege_striker.txt b/forge-gui/res/cardsfolder/s/siege_striker.txt index 7fb60242eaf..cc3e6ee0332 100644 --- a/forge-gui/res/cardsfolder/s/siege_striker.txt +++ b/forge-gui/res/cardsfolder/s/siege_striker.txt @@ -3,7 +3,7 @@ ManaCost:2 W Types:Creature Human Soldier PT:1/1 K:Double Strike -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, you may tap any number of untapped creatures you control. CARDNAME gets +1/+1 until end of turn for each creature tapped this way. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTap | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, you may tap any number of untapped creatures you control. CARDNAME gets +1/+1 until end of turn for each creature tapped this way. SVar:TrigTap:DB$ Tap | CardChoices$ Creature.YouCtrl+untapped | AnyNumber$ True | ChoiceAmount$ Count$Valid Creature.YouCtrl+untapped | RememberTapped$ True | SubAbility$ DBPump SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ Y | NumDef$ Y | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/upcoming/elenda_and_azor.txt b/forge-gui/res/cardsfolder/upcoming/elenda_and_azor.txt index 88c63638b60..d0d1005de8e 100644 --- a/forge-gui/res/cardsfolder/upcoming/elenda_and_azor.txt +++ b/forge-gui/res/cardsfolder/upcoming/elenda_and_azor.txt @@ -8,7 +8,7 @@ T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ SVar:TrigDraw:AB$ Draw | Cost$ X W U U | NumCards$ X SVar:X:Count$xPaid T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of each end step, you may pay 4 life. If you do, create a number of 1/1 black Vampire Knight creature tokens with lifelink equal to the number of cards you've drawn this turn. -SVar:TrigToken:AB$ Token | Cost$ PayLife<4> | TokenAmount$ Y | TokenScript$ w_1_1_vampire_lifelink | TokenOwner$ You +SVar:TrigToken:AB$ Token | Cost$ PayLife<4> | TokenAmount$ Y | TokenScript$ w_1_1_vampire_knight_lifelink | TokenOwner$ You SVar:Y:Count$YouDrewThisTurn DeckHas:Ability$Token|LifeGain SVar:HasAttackEffect:TRUE diff --git a/forge-gui/res/cardsfolder/upcoming/progenitor_exarch.txt b/forge-gui/res/cardsfolder/upcoming/progenitor_exarch.txt index 93e7c0a51b3..d191bb0df73 100644 --- a/forge-gui/res/cardsfolder/upcoming/progenitor_exarch.txt +++ b/forge-gui/res/cardsfolder/upcoming/progenitor_exarch.txt @@ -3,8 +3,9 @@ ManaCost:X X W Types:Creature Phyrexian Cat Cleric PT:1/2 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigIncubate | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME enters the battlefield, incubate 3 X times. (To incubate 3, create an Incubator token with three +1/+1 counters on it and "{2}: Transform this artifact." It transforms into a 0/0 Phyrexian artifact creature.) -SVar:TrigIncubate:DB$ Incubate | Amount$ 3 | Times$ Count$xPaid +SVar:TrigIncubate:DB$ Incubate | Amount$ 3 | Times$ X A:AB$ SetState | Cost$ T | TgtPrompt$ Select target Incubator token you control | ValidTgts$ Incubator.token+YouCtrl | Mode$ Transform | SpellDescription$ Transform target Incubator token you control. +SVar:X:Count$xPaid DeckHints:Type$Incubator DeckHas:Ability$Token|Counters & Type$Artifact|Incubator Oracle:When Progenitor Exarch enters the battlefield, incubate 3 X times. (To incubate 3, create an Incubator token with three +1/+1 counters on it and "{2}: Transform this artifact." It transforms into a 0/0 Phyrexian artifact creature.)\n{T}: Transform target Incubator token you control. diff --git a/forge-gui/res/tokenscripts/w_1_1_vampire_lifelink.txt b/forge-gui/res/tokenscripts/w_1_1_vampire_knight_lifelink.txt similarity index 53% rename from forge-gui/res/tokenscripts/w_1_1_vampire_lifelink.txt rename to forge-gui/res/tokenscripts/w_1_1_vampire_knight_lifelink.txt index 01f33cc970c..68f8d88471b 100644 --- a/forge-gui/res/tokenscripts/w_1_1_vampire_lifelink.txt +++ b/forge-gui/res/tokenscripts/w_1_1_vampire_knight_lifelink.txt @@ -1,6 +1,6 @@ -Name:Vampire Token +Name:Vampire Knight Token ManaCost:no cost -Types:Creature Vampire +Types:Creature Knight Vampire Colors:white PT:1/1 K:Lifelink From d90bfb0504e344f079792a1aecbb30d0916b27a4 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Thu, 13 Apr 2023 08:52:50 +0200 Subject: [PATCH 10/12] Update invasion_of_kylem__valors_reach_tag_team.txt --- .../upcoming/invasion_of_kylem__valors_reach_tag_team.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/invasion_of_kylem__valors_reach_tag_team.txt b/forge-gui/res/cardsfolder/upcoming/invasion_of_kylem__valors_reach_tag_team.txt index 8d59f7ce740..d734f3136bf 100644 --- a/forge-gui/res/cardsfolder/upcoming/invasion_of_kylem__valors_reach_tag_team.txt +++ b/forge-gui/res/cardsfolder/upcoming/invasion_of_kylem__valors_reach_tag_team.txt @@ -4,7 +4,7 @@ Types:Battle Siege Defense:5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | TriggerDescription$ When CARDNAME enters the battlefield, up to two target creatures each get +2/+0 and gain vigilance and haste until end of turn. SVar:TrigSearch:DB$ Pump | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | NumAtt$ 2 | KW$ Vigilance & Haste -Oracle:(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.) When Invasion of Kylem enters the battlefield, up to two target creatures each get +2/+0 and gain vigilance and haste until end of turn. +Oracle:(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)\nWhen Invasion of Kylem enters the battlefield, up to two target creatures each get +2/+0 and gain vigilance and haste until end of turn. AlternateMode:DoubleFaced From faa8e6d6c942fd4cfe44466e0608b0e49001ca3b Mon Sep 17 00:00:00 2001 From: TRT <> Date: Thu, 13 Apr 2023 10:20:36 +0200 Subject: [PATCH 11/12] lazy build SpellPermanent on TDFC --- .../src/main/java/forge/game/ability/AbilityUtils.java | 6 ++++++ .../main/java/forge/toolbox/imaging/FCardImageRenderer.java | 6 +++--- .../upcoming/invasion_of_amonkhet_lazotep_convert.txt | 1 - .../upcoming/invasion_of_dominaria_serra_faithkeeper.txt | 1 - .../invasion_of_new_phyrexia_teferi_akosa_of_zhalfir.txt | 1 - .../upcoming/invasion_of_zendikar_awakened_skyclave.txt | 1 - 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index f78bc947b82..1e3fcf65120 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -2939,6 +2939,12 @@ public class AbilityUtils { la.setCardState(original); list.add(la); } + if (state == CardStateName.Transformed && tgtCard.isPermanent() && !tgtCard.isAura()) { + // casting defeated battle + Spell sp = new SpellPermanent(tgtCard, original); + sp.setCardState(original); + list.add(sp); + } if (tgtCard.isModal()) { CardState modal = tgtCard.getState(CardStateName.Modal); Iterables.addAll(list, tgtCard.getBasicSpells(modal)); diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java index 91c7c68a353..fb206283ff7 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java @@ -184,7 +184,7 @@ public class FCardImageRenderer { if (!card.isSplitCard() && !card.isFlipCard()) { final CardStateView state = card.getState(card.isAdventureCard() ? false : altState); if ((state.isCreature() && !state.getKeywordKey().contains("Level up")) - || state.isPlaneswalker() || state.getType().hasSubtype("Vehicle")) + || state.isPlaneswalker() || state.isVehicle()) hasPTBox = true; } if (hasPTBox) { @@ -294,7 +294,7 @@ public class FCardImageRenderer { int headerHeight = NAME_SIZE + 2 * HEADER_PADDING; int typeBoxHeight = TYPE_SIZE + 2 * TYPE_PADDING; int ptBoxHeight = 0; - if (state.isCreature() || state.isPlaneswalker() || state.getType().hasSubtype("Vehicle")) { + if (state.isCreature() || state.isPlaneswalker() || state.isVehicle()) { //if P/T box needed, make room for it ptBoxHeight = headerHeight; } @@ -839,7 +839,7 @@ public class FCardImageRenderer { TEXT_COLOR = Color.WHITE; pieces.add(String.valueOf(state.getLoyalty())); } - else if (state.getType().hasSubtype("Vehicle")) { + else if (state.isVehicle()) { Color [] vhColor = { new Color(128, 96, 64) }; colors = vhColor; TEXT_COLOR = Color.WHITE; diff --git a/forge-gui/res/cardsfolder/upcoming/invasion_of_amonkhet_lazotep_convert.txt b/forge-gui/res/cardsfolder/upcoming/invasion_of_amonkhet_lazotep_convert.txt index 60b71db18aa..712878b1c93 100644 --- a/forge-gui/res/cardsfolder/upcoming/invasion_of_amonkhet_lazotep_convert.txt +++ b/forge-gui/res/cardsfolder/upcoming/invasion_of_amonkhet_lazotep_convert.txt @@ -17,7 +17,6 @@ ManaCost:no cost Colors:blue,black Types:Creature Zombie PT:4/4 -A:SP$ PermanentCreature K:ETBReplacement:Copy:DBCopy:Optional SVar:DBCopy:DB$ Clone | Choices$ Creature | ChoiceZone$ Graveyard | SetPower$ 4 | SetToughness$ 4 | AddColors$ Black | AddTypes$ Zombie | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature card in a graveyard, except it's a 4/4 black Zombie in addition to its other types. Oracle:You may have Lazotep Convert enter the battlefield as a copy of any creature card in a graveyard, except it's a 4/4 black Zombie in addition to its other types. diff --git a/forge-gui/res/cardsfolder/upcoming/invasion_of_dominaria_serra_faithkeeper.txt b/forge-gui/res/cardsfolder/upcoming/invasion_of_dominaria_serra_faithkeeper.txt index 6bd564a0792..19671108ba1 100644 --- a/forge-gui/res/cardsfolder/upcoming/invasion_of_dominaria_serra_faithkeeper.txt +++ b/forge-gui/res/cardsfolder/upcoming/invasion_of_dominaria_serra_faithkeeper.txt @@ -16,7 +16,6 @@ ManaCost:no cost Colors:white Types:Creature Angel PT:4/4 -A:SP$ PermanentCreature K:Flying K:Vigilance Oracle:Flying, vigilance diff --git a/forge-gui/res/cardsfolder/upcoming/invasion_of_new_phyrexia_teferi_akosa_of_zhalfir.txt b/forge-gui/res/cardsfolder/upcoming/invasion_of_new_phyrexia_teferi_akosa_of_zhalfir.txt index e7bed686b0b..bb4193d7aff 100644 --- a/forge-gui/res/cardsfolder/upcoming/invasion_of_new_phyrexia_teferi_akosa_of_zhalfir.txt +++ b/forge-gui/res/cardsfolder/upcoming/invasion_of_new_phyrexia_teferi_akosa_of_zhalfir.txt @@ -16,7 +16,6 @@ ManaCost:no cost Colors:white,blue Types:Legendary Planeswalker Teferi Loyalty:4 -A:SP$ PermanentNoncreature A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 2 | SubAbility$ DBDiscard | SpellDescription$ Draw two cards. SVar:DBDiscard:DB$ Discard | NumCards$ 2 | Mode$ TgtChoose | UnlessType$ Creature | StackDescription$ SpellDescription | SpellDescription$ Then discard two cards unless you discard a creature card. A:AB$ Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Name$ Emblem - Teferi Akosa of Zhalfir | Image$ emblem_teferi_akosa_of_zhalfir | StaticAbilities$ STPump | Duration$ Permanent | SpellDescription$ You get an emblem with "Knights you control get +1/+0 and have ward {1}." diff --git a/forge-gui/res/cardsfolder/upcoming/invasion_of_zendikar_awakened_skyclave.txt b/forge-gui/res/cardsfolder/upcoming/invasion_of_zendikar_awakened_skyclave.txt index 3b0cd3d5e92..2490e22beec 100644 --- a/forge-gui/res/cardsfolder/upcoming/invasion_of_zendikar_awakened_skyclave.txt +++ b/forge-gui/res/cardsfolder/upcoming/invasion_of_zendikar_awakened_skyclave.txt @@ -14,7 +14,6 @@ ManaCost:no cost Colors:green Types:Creature Elemental PT:4/4 -A:SP$ PermanentCreature K:Vigilance K:Haste S:Mode$ Continuous | Affected$ Card.Self | AddType$ Land | Description$ As long as CARDNAME is on the battlefield, it's a land in addition to its other types. From 984049276e92c9f58d3bcbbfe7c29971464dd5b1 Mon Sep 17 00:00:00 2001 From: Northmoc <103371817+Northmoc@users.noreply.github.com> Date: Thu, 13 Apr 2023 14:01:43 -0400 Subject: [PATCH 12/12] cut_short.txt and support (#2877) * cut_short.txt and support --- forge-game/src/main/java/forge/game/card/Card.java | 4 ++++ forge-game/src/main/java/forge/game/card/CardProperty.java | 4 ++++ forge-game/src/main/java/forge/game/zone/MagicStack.java | 2 +- forge-gui/res/cardsfolder/upcoming/cut_short.txt | 6 ++++++ 4 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/cut_short.txt diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 8f2d05f945e..01298b6bd93 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -7118,6 +7118,10 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return getOwner().canDiscardBy(sa, effect); } + public boolean activatedThisTurn() { + return !numberTurnActivations.isEmpty(); + } + public void addAbilityActivated(SpellAbility ability) { numberTurnActivations.add(ability); numberGameActivations.add(ability); diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index eae03fdeb38..aa6e5189171 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1075,6 +1075,10 @@ public class CardProperty { if (!property.startsWith("without") && !card.hasStartOfUnHiddenKeyword(property.substring(4))) { return false; } + } else if (property.startsWith("activated")) { + if (!card.activatedThisTurn()) { + return false; + } } else if (property.startsWith("tapped")) { if (!card.isTapped()) { return false; diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 53cd57ff0ef..d053b73ec37 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -135,7 +135,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable