diff --git a/.gitignore b/.gitignore
index 812f56fc36d..5b29a556792 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,6 +18,7 @@ Mage.Server.Plugins/Mage.Deck.Limited/target
Mage.Server.Plugins/Mage.Game.CommanderDuel/target
Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/target/
Mage.Server.Plugins/Mage.Game.FreeForAll/target
+Mage.Server.Plugins/Mage.Game.MomirDuel/target
Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target
Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/target
Mage.Server.Plugins/Mage.Player.AI.DraftBot/target
@@ -50,7 +51,7 @@ Mage.Updater/target
mage.updater.client/target
releases
-Utils/author.txt
+Utils/author.txt
.DS_Store
.metadata
.project
@@ -88,4 +89,6 @@ Mage.Server.Plugins/Mage.Draft.8PlayerBooster/target
/Utils/*_unimplemented.txt
*.netbeans_automatic_build
*.txt
-Mage.Client/serverlist.txt
\ No newline at end of file
+Mage.Client/serverlist.txt
+/bin/
+/target/
\ No newline at end of file
diff --git a/Mage.Client/plugins/mage-theme-plugin.jar b/Mage.Client/plugins/mage-theme-plugin.jar
deleted file mode 100644
index 1448724874d..00000000000
Binary files a/Mage.Client/plugins/mage-theme-plugin.jar and /dev/null differ
diff --git a/Mage.Client/pom.xml b/Mage.Client/pom.xml
index e48d07e8091..46cd82bba88 100644
--- a/Mage.Client/pom.xml
+++ b/Mage.Client/pom.xml
@@ -6,7 +6,7 @@
org.magemage-root
- 1.4.3
+ 1.4.5org.mage
diff --git a/Mage.Client/release/sample-decks/2013/Standard/DailyMTG/Adam Cotner's Skaabs!..dck b/Mage.Client/release/sample-decks/2013/Standard/DailyMTG/Adam Cotner's Skaabs!.dck
similarity index 100%
rename from Mage.Client/release/sample-decks/2013/Standard/DailyMTG/Adam Cotner's Skaabs!..dck
rename to Mage.Client/release/sample-decks/2013/Standard/DailyMTG/Adam Cotner's Skaabs!.dck
diff --git a/Mage.Client/release/sample-decks/Commander/Commander 2015/Call the Spirits (WB).dck b/Mage.Client/release/sample-decks/Commander/Commander 2015/Call the Spirits (WB).dck
new file mode 100644
index 00000000000..c00e539a8e2
--- /dev/null
+++ b/Mage.Client/release/sample-decks/Commander/Commander 2015/Call the Spirits (WB).dck
@@ -0,0 +1,78 @@
+1 [C15:77] Open the Vaults
+1 [C15:76] Monk Idealist
+1 [C15:75] Mesa Enchantress
+1 [C15:74] Marshal's Anthem
+1 [C15:73] Kor Sanctifiers
+1 [C15:281] Command Tower
+1 [C15:72] Karmic Justice
+1 [C15:283] Evolving Wilds
+1 [C15:70] Ghostblade Eidolon
+1 [C15:285] Ghost Quarter
+1 [C15:121] Doomwake Giant
+1 [C15:122] Dreadbringer Lampads
+1 [C15:320] Vivid Meadow
+1 [C15:125] Fallen Ideal
+11 [C15:323] Plains
+1 [C15:126] Fate Unraveler
+1 [C15:79] Seal of Cleansing
+1 [C15:248] Burnished Hart
+1 [C15:127] Gild
+1 [C15:128] Grave Peril
+1 [C15:129] Nighthowler
+1 [C15:80] Sigil of the Empty Throne
+1 [C15:84] Vow of Duty
+1 [C15:81] Silent Sentinel
+1 [C15:274] Wayfarer's Bauble
+1 [C15:277] Barren Moor
+1 [C15:234] Teysa, Envoy of Ghosts
+1 [C15:311] Tainted Field
+1 [C15:235] Treasury Thrull
+1 [C15:114] Ancient Craving
+1 [C15:46] Karlov of the Ghost Council
+1 [C15:313] Temple of the False God
+1 [C15:237] Underworld Coinsmith
+1 [C15:116] Black Market
+1 [C15:314] Terramorphic Expanse
+1 [C15:319] Vivid Marsh
+1 [C15:55] Thought Vessel
+1 [C15:52] Sandstone Oracle
+1 [C15:261] Orzhov Cluestone
+1 [C15:140] Vow of Malice
+1 [C15:262] Orzhov Signet
+1 [C15:19] Deadly Tempest
+1 [C15:18] Daxos's Torment
+1 [C15:17] Corpse Augur
+1 [C15:16] Banshee of the Dread Choir
+1 [C15:268] Sol Ring
+1 [C15:301] Reliquary Tower
+1 [C15:57] Ajani's Chosen
+1 [C15:302] Scoured Barrens
+1 [C15:303] Secluded Steppe
+1 [C15:229] Necromancer's Covenant
+1 [C15:22] Thief of Blood
+1 [C15:66] Dawn to Dusk
+1 [C15:64] Celestial Archon
+1 [C15:63] Celestial Ancient
+1 [C15:62] Cage of Hands
+1 [C15:61] Banishing Light
+1 [C15:250] Crystal Chimes
+1 [C15:60] Aura of Silence
+1 [C15:130] Phyrexian Arena
+1 [C15:295] New Benalia
+1 [C15:133] Phyrexian Reclamation
+1 [C15:298] Orzhov Basilica
+13 [C15:331] Swamp
+1 [C15:299] Orzhov Guildgate
+1 [C15:135] Seal of Doom
+1 [C15:257] Lightning Greaves
+1 [C15:8] Shielded by Faith
+1 [C15:68] Dictate of Heliod
+1 [C15:67] Dawnglare Invoker
+1 [C15:138] Underworld Connections
+1 [C15:7] Righteous Confluence
+1 [C15:215] Death Grasp
+1 [C15:6] Oreskos Explorer
+1 [C15:4] Herald of the Host
+1 [C15:3] Grasp of Fate
+1 [C15:1] Bastion Protector
+SB: 1 [C15:43] Daxos the Returned
diff --git a/Mage.Client/release/sample-decks/Commander/Commander 2015/Plunder the Graves (GB).dck b/Mage.Client/release/sample-decks/Commander/Commander 2015/Plunder the Graves (GB).dck
new file mode 100644
index 00000000000..3f6ecd43882
--- /dev/null
+++ b/Mage.Client/release/sample-decks/Commander/Commander 2015/Plunder the Graves (GB).dck
@@ -0,0 +1,77 @@
+1 [C15:33] Bloodspore Thrinax
+1 [C15:281] Command Tower
+1 [C15:283] Evolving Wilds
+1 [C15:120] Diabolic Servitude
+1 [C15:286] Golgari Guildgate
+1 [C15:39] Skullwinder
+1 [C15:287] Golgari Rot Farm
+1 [C15:200] Sakura-Tribe Elder
+1 [C15:38] Pathbreaker Ibex
+1 [C15:123] Eater of Hope
+1 [C15:288] Grim Backwoods
+1 [C15:201] Satyr Wayfinder
+1 [C15:37] Great Oak Guardian
+1 [C15:124] Extractor Demon
+1 [C15:245] Bonehoard
+1 [C15:289] High Market
+1 [C15:202] Spider Spawning
+1 [C15:35] Centaur Vinecrasher
+1 [C15:34] Caller of the Pack
+1 [C15:204] Terastodon
+1 [C15:206] Tribute to the Wild
+1 [C15:207] Verdant Force
+1 [C15:208] Viridian Emissary
+1 [C15:191] Mulch
+1 [C15:192] Mycoloth
+1 [C15:196] Overwhelming Stampede
+1 [C15:198] Primal Growth
+1 [C15:232] Putrefy
+1 [C15:112] Altar's Reap
+1 [C15:48] Mazirek, Kraul Death Priest
+1 [C15:113] Ambition's Cost
+1 [C15:312] Tainted Wood
+1 [C15:115] Barter in Blood
+1 [C15:314] Terramorphic Expanse
+1 [C15:117] Blood Bairn
+1 [C15:238] Vulturous Zombie
+1 [C15:118] Butcher of Malakir
+1 [C15:119] Champion of Stray Souls
+1 [C15:318] Vivid Grove
+1 [C15:319] Vivid Marsh
+1 [C15:55] Thought Vessel
+1 [C15:183] Eternal Witness
+1 [C15:186] Indrik Stomphowler
+1 [C15:187] Kessig Cagebreakers
+1 [C15:17] Corpse Augur
+1 [C15:221] Golgari Charm
+1 [C15:16] Banshee of the Dread Choir
+1 [C15:222] Grisly Salvage
+1 [C15:223] Jarad, Golgari Lich Lord
+1 [C15:267] Skullclamp
+1 [C15:300] Polluted Mire
+1 [C15:224] Korozda Guildmage
+1 [C15:268] Sol Ring
+1 [C15:226] Lotleth Troll
+1 [C15:307] Slippery Karst
+1 [C15:22] Thief of Blood
+1 [C15:21] Scourge of Nel Toth
+1 [C15:20] Dread Summons
+1 [C15:292] Jungle Hollow
+1 [C15:173] Acidic Slime
+1 [C15:131] Phyrexian Plaguelord
+1 [C15:132] Phyrexian Rager
+1 [C15:253] Eldrazi Monument
+1 [C15:210] Viridian Zealot
+13 [C15:331] Swamp
+1 [C15:211] Wall of Blossoms
+1 [C15:255] Golgari Signet
+1 [C15:134] Rise from the Grave
+1 [C15:212] Wood Elves
+1 [C15:179] Cloudthresher
+1 [C15:257] Lightning Greaves
+1 [C15:136] Sever the Bloodline
+1 [C15:137] Shriekmaw
+1 [C15:23] Wretched Confluence
+1 [C15:139] Victimize
+12 [C15:339] Forest
+SB: 1 [C15:49] Meren of Clan Nel Toth
diff --git a/Mage.Client/release/sample-decks/Commander/Commander 2015/Seize Control (UR).dck b/Mage.Client/release/sample-decks/Commander/Commander 2015/Seize Control (UR).dck
new file mode 100644
index 00000000000..ee3dfe19a30
--- /dev/null
+++ b/Mage.Client/release/sample-decks/Commander/Commander 2015/Seize Control (UR).dck
@@ -0,0 +1,75 @@
+1 [C15:31] Warchief Giant
+1 [C15:30] Rite of the Raging Storm
+1 [C15:281] Command Tower
+1 [C15:162] Magmaquake
+1 [C15:283] Evolving Wilds
+1 [C15:163] Mizzium Mortars
+1 [C15:240] Call the Skybreaker
+1 [C15:169] Urza's Rage
+14 [C15:327] Island
+1 [C15:88] Blue Sun's Zenith
+1 [C15:87] Blatant Thievery
+1 [C15:42] Arjun, the Shifting Flame
+1 [C15:85] AEtherize
+1 [C15:151] Dragon Mage
+1 [C15:153] Faithless Looting
+1 [C15:275] Worn Powerstone
+1 [C15:110] Thought Reflection
+1 [C15:231] Prophetic Bolt
+1 [C15:111] Windfall
+1 [C15:233] Steam Augury
+1 [C15:310] Swiftwater Cliffs
+1 [C15:313] Temple of the False God
+1 [C15:89] Blustersquall
+1 [C15:314] Terramorphic Expanse
+1 [C15:316] Vivid Crag
+1 [C15:317] Vivid Creek
+1 [C15:90] Brainstorm
+1 [C15:11] Gigantoplasm
+1 [C15:55] Thought Vessel
+1 [C15:10] Broodbirth Viper
+1 [C15:54] Seal of the Guildpact
+1 [C15:98] Mystic Retrieval
+1 [C15:96] Lone Revenant
+1 [C15:95] Jace's Archivist
+1 [C15:94] Fact or Fiction
+1 [C15:93] Echoing Truth
+1 [C15:141] Act of Aggression
+1 [C15:92] Dominate
+1 [C15:263] Psychosis Crawler
+1 [C15:220] Goblin Electromancer
+1 [C15:144] Chain Reaction
+1 [C15:145] Charmbreaker Devils
+1 [C15:101] Preordain
+1 [C15:146] Comet Storm
+1 [C15:268] Sol Ring
+1 [C15:103] Reins of Power
+1 [C15:14] Mystic Confluence
+1 [C15:301] Reliquary Tower
+1 [C15:302] Rogue's Passage
+1 [C15:13] Mirror Match
+1 [C15:104] Repeal
+1 [C15:12] Illusory Ambusher
+1 [C15:149] Desperate Ravings
+1 [C15:105] Rite of Replication
+1 [C15:227] Melek, Izzet Paragon
+1 [C15:106] Sleep
+1 [C15:107] Stolen Goods
+1 [C15:108] Stroke of Genius
+1 [C15:109] Talrand, Sky Summoner
+1 [C15:309] Spinerock Knoll
+1 [C15:290] Izzet Boilerworks
+1 [C15:170] Vandalblast
+1 [C15:291] Izzet Guildgate
+1 [C15:172] Word of Seizing
+1 [C15:29] Mizzix's Mastery
+1 [C15:28] Meteor Blast
+1 [C15:256] Izzet Signet
+1 [C15:9] AEthersnatch
+1 [C15:24] Awaken the Sky Tyrant
+1 [C15:214] Counterflux
+13 [C15:335] Mountain
+1 [C15:216] Epic Experiment
+1 [C15:217] Etherium-Horn Sorcerer
+1 [C15:218] Firemind's Foresight
+SB: 1 [C15:50] Mizzix of the Izmagnus
diff --git a/Mage.Client/release/sample-decks/Commander/Commander 2015/Swell the Host (GU).dck b/Mage.Client/release/sample-decks/Commander/Commander 2015/Swell the Host (GU).dck
new file mode 100644
index 00000000000..e9b21032d22
--- /dev/null
+++ b/Mage.Client/release/sample-decks/Commander/Commander 2015/Swell the Host (GU).dck
@@ -0,0 +1,77 @@
+1 [C15:32] Arachnogenesis
+1 [C15:281] Command Tower
+1 [C15:283] Evolving Wilds
+1 [C15:241] Cold-Eyed Selkie
+1 [C15:242] Snakeform
+1 [C15:39] Skullwinder
+1 [C15:243] Wistful Selkie
+1 [C15:200] Sakura-Tribe Elder
+1 [C15:37] Great Oak Guardian
+1 [C15:289] High Market
+1 [C15:322] Zoetic Cavern
+1 [C15:36] Ezuri's Predation
+1 [C15:203] Stingerfling Spider
+1 [C15:34] Caller of the Pack
+1 [C15:205] Thelonite Hermit
+11 [C15:327] Island
+1 [C15:209] Viridian Shaman
+1 [C15:190] Loaming Shaman
+1 [C15:86] Bident of Thassa
+1 [C15:193] Noble Quarry
+1 [C15:40] Verdant Confluence
+1 [C15:194] Ohran Viper
+1 [C15:271] Swiftfoot Boots
+1 [C15:272] Sword of Vengeance
+1 [C15:195] Overrun
+1 [C15:197] Patagia Viper
+1 [C15:230] Prime Speaker Zegana
+1 [C15:199] Rampant Growth
+1 [C15:47] Kaseto, Orochi Archmage
+1 [C15:236] Trygon Predator
+1 [C15:314] Terramorphic Expanse
+1 [C15:315] Thornwood Falls
+1 [C15:239] Biomantic Mastery
+1 [C15:317] Vivid Creek
+1 [C15:318] Vivid Grove
+1 [C15:91] Day of the Dragons
+1 [C15:99] Ninja of the Deep Hours
+1 [C15:55] Thought Vessel
+1 [C15:10] Broodbirth Viper
+1 [C15:97] Mulldrifter
+1 [C15:53] Scytheclaw
+1 [C15:180] Cobra Trap
+1 [C15:181] Desert Twister
+1 [C15:182] Elvish Visionary
+1 [C15:183] Eternal Witness
+1 [C15:260] Orochi Hatchery
+1 [C15:184] Experiment One
+1 [C15:185] Forgotten Ancient
+1 [C15:100] Plaxmanta
+1 [C15:265] Simic Keyrune
+1 [C15:188] Kodama's Reach
+1 [C15:266] Simic Signet
+1 [C15:189] Krosan Grip
+1 [C15:102] Rapid Hybridization
+1 [C15:15] Synthetic Destiny
+1 [C15:268] Sol Ring
+1 [C15:301] Reliquary Tower
+1 [C15:225] Lorescale Coatl
+1 [C15:269] Solemn Simulacrum
+1 [C15:13] Mirror Match
+1 [C15:12] Illusory Ambusher
+1 [C15:56] Command Beacon
+1 [C15:228] Mystic Snake
+1 [C15:305] Simic Growth Chamber
+1 [C15:306] Simic Guildgate
+1 [C15:293] Llanowar Reborn
+1 [C15:294] Mosswort Bridge
+1 [C15:174] Arbor Colossus
+1 [C15:175] Bane of Progress
+1 [C15:296] Novijen, Heart of Progress
+1 [C15:176] Beastmaster Ascension
+1 [C15:297] Oran-Rief, the Vastwood
+1 [C15:177] Caller of the Claw
+1 [C15:178] Chameleon Colossus
+1 [C15:213] Coiling Oracle
+14 [C15:339] Forest
+SB: 1 [C15:44] Ezuri, Claw of Progress
diff --git a/Mage.Client/release/sample-decks/Commander/Commander 2015/Wade into Battle (RW).dck b/Mage.Client/release/sample-decks/Commander/Commander 2015/Wade into Battle (RW).dck
new file mode 100644
index 00000000000..461da3856cb
--- /dev/null
+++ b/Mage.Client/release/sample-decks/Commander/Commander 2015/Wade into Battle (RW).dck
@@ -0,0 +1,77 @@
+1 [C15:31] Warchief Giant
+1 [C15:30] Rite of the Raging Storm
+1 [C15:280] Boros Guildgate
+1 [C15:160] Inferno Titan
+1 [C15:281] Command Tower
+1 [C15:161] Magma Giant
+1 [C15:282] Drifting Meadow
+1 [C15:71] Jareth, Leonine Titan
+1 [C15:283] Evolving Wilds
+1 [C15:284] Forgotten Cave
+1 [C15:164] Stinkdrinker Daredevil
+1 [C15:165] Stoneshock Giant
+1 [C15:166] Sunrise Sovereign
+1 [C15:320] Vivid Meadow
+1 [C15:167] Taurean Mauler
+1 [C15:244] Basalt Monolith
+1 [C15:321] Wind-Scarred Crag
+1 [C15:168] Thundercloud Shaman
+1 [C15:246] Boros Cluestone
+11 [C15:323] Plains
+1 [C15:247] Boros Signet
+1 [C15:78] Orim's Thunder
+1 [C15:249] Coldsteel Heart
+1 [C15:41] Anya, Merciless Angel
+1 [C15:270] Staff of Nin
+1 [C15:83] Victory's Herald
+1 [C15:150] Disaster Radius
+1 [C15:82] Sun Titan
+1 [C15:273] Urza's Incubator
+1 [C15:152] Earthquake
+1 [C15:275] Worn Powerstone
+1 [C15:154] Fall of the Hammer
+1 [C15:155] Fumiko the Lowblood
+1 [C15:276] Ancient Amphitheater
+1 [C15:156] Hamletback Goliath
+1 [C15:157] Hammerfist Giant
+1 [C15:278] Blasted Landscape
+1 [C15:158] Hostility
+1 [C15:279] Boros Garrison
+1 [C15:159] Hunted Dragon
+1 [C15:314] Terramorphic Expanse
+1 [C15:316] Vivid Crag
+1 [C15:55] Thought Vessel
+1 [C15:52] Sandstone Oracle
+1 [C15:51] Blade of Selves
+1 [C15:142] Borderland Behemoth
+1 [C15:264] Seer's Sundial
+1 [C15:143] Breath of Darigaaz
+1 [C15:59] Arbiter of Knollridge
+1 [C15:58] Angel of Serenity
+1 [C15:268] Sol Ring
+1 [C15:147] Curse of the Nightly Hunt
+1 [C15:148] Desolation Giant
+1 [C15:303] Secluded Steppe
+1 [C15:308] Smoldering Crater
+1 [C15:65] Crib Swap
+1 [C15:171] Warstorm Surge
+1 [C15:61] Banishing Light
+1 [C15:251] Darksteel Ingot
+1 [C15:252] Dreamstone Hedron
+1 [C15:254] Fellwar Stone
+1 [C15:28] Meteor Blast
+1 [C15:27] Magus of the Wheel
+1 [C15:26] Fiery Confluence
+1 [C15:25] Dream Pillager
+1 [C15:257] Lightning Greaves
+1 [C15:69] Faith's Fetters
+1 [C15:258] Loxodon Warhammer
+14 [C15:335] Mountain
+1 [C15:67] Dawnglare Invoker
+1 [C15:259] Mind Stone
+1 [C15:6] Oreskos Explorer
+1 [C15:5] Kalemne's Captain
+1 [C15:4] Herald of the Host
+1 [C15:219] Gisela, Blade of Goldnight
+1 [C15:2] Dawnbreak Reclaimer
+SB: 1 [C15:45] Kalemne, Disciple of Iroas
diff --git a/Mage.Client/release/sample-decks/Momir Basic/Momir Basic.dck b/Mage.Client/release/sample-decks/Momir Basic/Momir Basic.dck
new file mode 100644
index 00000000000..1295622aa28
--- /dev/null
+++ b/Mage.Client/release/sample-decks/Momir Basic/Momir Basic.dck
@@ -0,0 +1,23 @@
+NAME:Mormir Basic
+3 [BFZ:259] Island
+3 [BFZ:261] Swamp
+3 [BFZ:250] Plains
+3 [BFZ:272] Forest
+3 [BFZ:260] Swamp
+3 [BFZ:271] Forest
+3 [BFZ:270] Forest
+3 [BFZ:265] Mountain
+2 [BFZ:254] Plains
+3 [BFZ:264] Swamp
+3 [BFZ:274] Forest
+1 [BFZ:252] Plains
+3 [BFZ:262] Swamp
+3 [BFZ:251] Plains
+2 [BFZ:273] Forest
+3 [BFZ:258] Island
+2 [BFZ:269] Mountain
+3 [BFZ:268] Mountain
+3 [BFZ:257] Island
+3 [BFZ:267] Mountain
+3 [BFZ:266] Mountain
+2 [BFZ:255] Island
diff --git a/Mage.Client/serverlist.txt b/Mage.Client/serverlist.txt
index 46138917a32..db223b403ff 100644
--- a/Mage.Client/serverlist.txt
+++ b/Mage.Client/serverlist.txt
@@ -1,7 +1,6 @@
XMage.de 1 (Europe/Germany) fast :xmage.de:17171
woogerworks (North America/USA) :xmage.woogerworks.info:17171
-XMage.info 1 (Europe/France) slow :176.31.186.181:17171
-XMage.info 2 (Europe/France) slow :176.31.186.181:17000
-IceMage (Europe/Netherlands) :ring0.cc:17171
+XMage.info 1 (Europe/France) new network code -> see forum :176.31.186.181:17171
+XMage BR (South America/Brazil) :ec2-54-233-67-0.sa-east-1.compute.amazonaws.com:17171
Seedds Server (Asia) :115.29.203.80:17171
localhost -> connect to your local server (must be started):localhost:17171
diff --git a/Mage.Client/sounds/OnAddArtifact.wav b/Mage.Client/sounds/OnAddArtifact.wav
index e9488ecad8e..2d6295ca752 100644
Binary files a/Mage.Client/sounds/OnAddArtifact.wav and b/Mage.Client/sounds/OnAddArtifact.wav differ
diff --git a/Mage.Client/sounds/OnAddPermanent.wav b/Mage.Client/sounds/OnAddPermanent.wav
index ac338bf4c86..7ca048e5141 100644
Binary files a/Mage.Client/sounds/OnAddPermanent.wav and b/Mage.Client/sounds/OnAddPermanent.wav differ
diff --git a/Mage.Client/sounds/OnAttack.wav b/Mage.Client/sounds/OnAttack.wav
index 48f3b7ac287..815db42ae67 100644
Binary files a/Mage.Client/sounds/OnAttack.wav and b/Mage.Client/sounds/OnAttack.wav differ
diff --git a/Mage.Client/sounds/OnBlock.wav b/Mage.Client/sounds/OnBlock.wav
index 984ab5f9145..28bf3ddde51 100644
Binary files a/Mage.Client/sounds/OnBlock.wav and b/Mage.Client/sounds/OnBlock.wav differ
diff --git a/Mage.Client/sounds/OnButtonCancel.wav b/Mage.Client/sounds/OnButtonCancel.wav
index cb0b80dbf8a..9b0c04ca6f8 100644
Binary files a/Mage.Client/sounds/OnButtonCancel.wav and b/Mage.Client/sounds/OnButtonCancel.wav differ
diff --git a/Mage.Client/sounds/OnButtonOk.wav b/Mage.Client/sounds/OnButtonOk.wav
index 7c33054ce49..f0e09ff85b9 100644
Binary files a/Mage.Client/sounds/OnButtonOk.wav and b/Mage.Client/sounds/OnButtonOk.wav differ
diff --git a/Mage.Client/sounds/OnCountdown1.wav b/Mage.Client/sounds/OnCountdown1.wav
index 5ab29bf462b..08fbe61614b 100644
Binary files a/Mage.Client/sounds/OnCountdown1.wav and b/Mage.Client/sounds/OnCountdown1.wav differ
diff --git a/Mage.Client/sounds/OnDraftSelect.wav b/Mage.Client/sounds/OnDraftSelect.wav
index cd8a5c09dbd..a7aa354a744 100644
Binary files a/Mage.Client/sounds/OnDraftSelect.wav and b/Mage.Client/sounds/OnDraftSelect.wav differ
diff --git a/Mage.Client/sounds/OnDraw.wav b/Mage.Client/sounds/OnDraw.wav
index 144d2009d1f..a91c5ec6f4d 100644
Binary files a/Mage.Client/sounds/OnDraw.wav and b/Mage.Client/sounds/OnDraw.wav differ
diff --git a/Mage.Client/sounds/OnEndTurn.wav b/Mage.Client/sounds/OnEndTurn.wav
index 56a6c525e2f..261e7482e33 100644
Binary files a/Mage.Client/sounds/OnEndTurn.wav and b/Mage.Client/sounds/OnEndTurn.wav differ
diff --git a/Mage.Client/sounds/OnGameStart.wav b/Mage.Client/sounds/OnGameStart.wav
index 791a85b591a..08d76fefdb0 100644
Binary files a/Mage.Client/sounds/OnGameStart.wav and b/Mage.Client/sounds/OnGameStart.wav differ
diff --git a/Mage.Client/sounds/OnHover.wav b/Mage.Client/sounds/OnHover.wav
index fae205369b0..459fd070553 100644
Binary files a/Mage.Client/sounds/OnHover.wav and b/Mage.Client/sounds/OnHover.wav differ
diff --git a/Mage.Client/sounds/OnNextPage.wav b/Mage.Client/sounds/OnNextPage.wav
index e109a11679c..c8aae197d5d 100644
Binary files a/Mage.Client/sounds/OnNextPage.wav and b/Mage.Client/sounds/OnNextPage.wav differ
diff --git a/Mage.Client/sounds/OnNextPhase.wav b/Mage.Client/sounds/OnNextPhase.wav
index 7d321fc19fb..09cfb019cac 100644
Binary files a/Mage.Client/sounds/OnNextPhase.wav and b/Mage.Client/sounds/OnNextPhase.wav differ
diff --git a/Mage.Client/sounds/OnPlayerJoined.wav b/Mage.Client/sounds/OnPlayerJoined.wav
index 0182728328d..98a94af7515 100644
Binary files a/Mage.Client/sounds/OnPlayerJoined.wav and b/Mage.Client/sounds/OnPlayerJoined.wav differ
diff --git a/Mage.Client/sounds/OnPlayerLeft.wav b/Mage.Client/sounds/OnPlayerLeft.wav
index c0590e8489f..13c6a54aa3b 100644
Binary files a/Mage.Client/sounds/OnPlayerLeft.wav and b/Mage.Client/sounds/OnPlayerLeft.wav differ
diff --git a/Mage.Client/sounds/OnPlayerLost.wav b/Mage.Client/sounds/OnPlayerLost.wav
index 4fd3e50fb19..4960cf90d4d 100644
Binary files a/Mage.Client/sounds/OnPlayerLost.wav and b/Mage.Client/sounds/OnPlayerLost.wav differ
diff --git a/Mage.Client/sounds/OnPlayerQuit.wav b/Mage.Client/sounds/OnPlayerQuit.wav
index d9b2826d1ec..4d97f17e4fe 100644
Binary files a/Mage.Client/sounds/OnPlayerQuit.wav and b/Mage.Client/sounds/OnPlayerQuit.wav differ
diff --git a/Mage.Client/sounds/OnPlayerQuitTournament.wav b/Mage.Client/sounds/OnPlayerQuitTournament.wav
index c92220b59c0..8857e7980f7 100644
Binary files a/Mage.Client/sounds/OnPlayerQuitTournament.wav and b/Mage.Client/sounds/OnPlayerQuitTournament.wav differ
diff --git a/Mage.Client/sounds/OnPlayerSubmittedDeck.wav b/Mage.Client/sounds/OnPlayerSubmittedDeck.wav
index cfa7603c0fd..1e89502f8fd 100644
Binary files a/Mage.Client/sounds/OnPlayerSubmittedDeck.wav and b/Mage.Client/sounds/OnPlayerSubmittedDeck.wav differ
diff --git a/Mage.Client/sounds/OnPlayerWhispered.wav b/Mage.Client/sounds/OnPlayerWhispered.wav
index ad26c3a9d41..7e58c8a5a1c 100644
Binary files a/Mage.Client/sounds/OnPlayerWhispered.wav and b/Mage.Client/sounds/OnPlayerWhispered.wav differ
diff --git a/Mage.Client/sounds/OnPlayerWon.wav b/Mage.Client/sounds/OnPlayerWon.wav
index 3c9eda4625e..91f00881dde 100644
Binary files a/Mage.Client/sounds/OnPlayerWon.wav and b/Mage.Client/sounds/OnPlayerWon.wav differ
diff --git a/Mage.Client/sounds/OnPrevPage.wav b/Mage.Client/sounds/OnPrevPage.wav
index 9cafab28a64..85b7179063c 100644
Binary files a/Mage.Client/sounds/OnPrevPage.wav and b/Mage.Client/sounds/OnPrevPage.wav differ
diff --git a/Mage.Client/sounds/OnSkipButton.wav b/Mage.Client/sounds/OnSkipButton.wav
index 7d321fc19fb..db8a44c52f7 100644
Binary files a/Mage.Client/sounds/OnSkipButton.wav and b/Mage.Client/sounds/OnSkipButton.wav differ
diff --git a/Mage.Client/sounds/OnSkipButtonCancel.wav b/Mage.Client/sounds/OnSkipButtonCancel.wav
index cb0b80dbf8a..d58aa0144a4 100644
Binary files a/Mage.Client/sounds/OnSkipButtonCancel.wav and b/Mage.Client/sounds/OnSkipButtonCancel.wav differ
diff --git a/Mage.Client/sounds/OnStackNew.wav b/Mage.Client/sounds/OnStackNew.wav
index 4fd917b8e84..4610b5fe33c 100644
Binary files a/Mage.Client/sounds/OnStackNew.wav and b/Mage.Client/sounds/OnStackNew.wav differ
diff --git a/Mage.Client/sounds/OnSummon-.wav b/Mage.Client/sounds/OnSummon-.wav
index 1facee015c8..63e57d3df3e 100644
Binary files a/Mage.Client/sounds/OnSummon-.wav and b/Mage.Client/sounds/OnSummon-.wav differ
diff --git a/Mage.Client/sounds/OnSummon.wav b/Mage.Client/sounds/OnSummon.wav
index f41a49e9a68..bf5bed88cce 100644
Binary files a/Mage.Client/sounds/OnSummon.wav and b/Mage.Client/sounds/OnSummon.wav differ
diff --git a/Mage.Client/sounds/OnTapPermanent.wav b/Mage.Client/sounds/OnTapPermanent.wav
index 7c33054ce49..8760020598e 100644
Binary files a/Mage.Client/sounds/OnTapPermanent.wav and b/Mage.Client/sounds/OnTapPermanent.wav differ
diff --git a/Mage.Client/sounds/OnTournamentStart.wav b/Mage.Client/sounds/OnTournamentStart.wav
index a6aa47f24fc..94df53fcd9f 100644
Binary files a/Mage.Client/sounds/OnTournamentStart.wav and b/Mage.Client/sounds/OnTournamentStart.wav differ
diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java
index 73b71ead8b3..4494e6951da 100644
--- a/Mage.Client/src/main/java/mage/client/MageFrame.java
+++ b/Mage.Client/src/main/java/mage/client/MageFrame.java
@@ -83,7 +83,7 @@ import mage.cards.repository.CardCriteria;
import mage.cards.repository.CardInfo;
import mage.cards.repository.CardRepository;
import mage.client.cards.BigCard;
-import mage.client.chat.ChatPanel;
+import mage.client.chat.ChatPanelBasic;
import mage.client.components.MageComponents;
import mage.client.components.MageDesktopManager;
import mage.client.components.MageJDesktop;
@@ -165,7 +165,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
private static boolean grayMode = false;
private static boolean fullscreenMode = false;
- private static final Map chats = new HashMap<>();
+ private static final Map chats = new HashMap<>();
private static final Map games = new HashMap<>();
private static final Map drafts = new HashMap<>();
private static final MageUI ui = new MageUI();
@@ -358,6 +358,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
} else {
connectDialog.showDialog();
}
+ setWindowTitle();
}
});
@@ -369,10 +370,10 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
}
}
- public void setWindowTitle() {
+ private void setWindowTitle() {
setTitle(TITLE_NAME + " Client: "
- + version == null ? "" : version.toString() + " Server: "
- + ((session != null && session.isConnected()) ? session.getVersionInfo() : ""));
+ + (version == null ? "" : version.toString()) + " Server: "
+ + ((session != null && session.isConnected()) ? session.getVersionInfo() : ""));
}
private void addTooltipContainer() {
@@ -959,12 +960,12 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
if (JOptionPane.showConfirmDialog(this, "Are you sure you want to disconnect?", "Confirm disconnect", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
session.disconnect(false);
tablesPane.clearChat();
- setWindowTitle();
showMessage("You have disconnected");
}
} else {
connectDialog.showDialog();
}
+ setWindowTitle();
}//GEN-LAST:event_btnConnectActionPerformed
public void btnAboutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAboutActionPerformed
@@ -1249,11 +1250,11 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
return ui;
}
- public static ChatPanel getChat(UUID chatId) {
+ public static ChatPanelBasic getChat(UUID chatId) {
return chats.get(chatId);
}
- public static void addChat(UUID chatId, ChatPanel chatPanel) {
+ public static void addChat(UUID chatId, ChatPanelBasic chatPanel) {
chats.put(chatId, chatPanel);
}
diff --git a/Mage.Client/src/main/java/mage/client/cards/BigCard.java b/Mage.Client/src/main/java/mage/client/cards/BigCard.java
index 6265dc288a9..75fa5508789 100644
--- a/Mage.Client/src/main/java/mage/client/cards/BigCard.java
+++ b/Mage.Client/src/main/java/mage/client/cards/BigCard.java
@@ -161,6 +161,7 @@ public class BigCard extends JComponent {
}
public void addJXPanel(UUID cardId, JXPanel jxPanel) {
+ this.cardId = cardId;
bigImage = null;
synchronized (this) {
if (this.panel != null) { remove(this.panel); }
diff --git a/Mage.Client/src/main/java/mage/client/cards/Card.java b/Mage.Client/src/main/java/mage/client/cards/Card.java
index ca322655e8c..1ef0d5c415f 100644
--- a/Mage.Client/src/main/java/mage/client/cards/Card.java
+++ b/Mage.Client/src/main/java/mage/client/cards/Card.java
@@ -1,45 +1,84 @@
/*
-* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification, are
-* permitted provided that the following conditions are met:
-*
-* 1. Redistributions of source code must retain the above copyright notice, this list of
-* conditions and the following disclaimer.
-*
-* 2. Redistributions in binary form must reproduce the above copyright notice, this list
-* of conditions and the following disclaimer in the documentation and/or other materials
-* provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
-* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The views and conclusions contained in the software and documentation are those of the
-* authors and should not be interpreted as representing official policies, either expressed
-* or implied, of BetaSteward_at_googlemail.com.
-*/
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
/*
* Card.java
*
* Created on 17-Dec-2009, 9:20:50 PM
*/
-
package mage.client.cards;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.awt.image.BufferedImage;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.Popup;
+import javax.swing.PopupFactory;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Style;
+import javax.swing.text.StyleConstants;
+import javax.swing.text.StyleContext;
+import javax.swing.text.StyledDocument;
import mage.cards.CardDimensions;
import mage.cards.MagePermanent;
import mage.cards.Sets;
import mage.cards.TextPopup;
import mage.cards.action.ActionCallback;
import mage.client.MageFrame;
+import static mage.client.constants.Constants.CONTENT_MAX_XOFFSET;
+import static mage.client.constants.Constants.FRAME_MAX_HEIGHT;
+import static mage.client.constants.Constants.FRAME_MAX_WIDTH;
+import static mage.client.constants.Constants.NAME_FONT_MAX_SIZE;
+import static mage.client.constants.Constants.NAME_MAX_YOFFSET;
+import static mage.client.constants.Constants.POWBOX_TEXT_MAX_LEFT;
+import static mage.client.constants.Constants.POWBOX_TEXT_MAX_TOP;
+import static mage.client.constants.Constants.SYMBOL_MAX_XOFFSET;
+import static mage.client.constants.Constants.SYMBOL_MAX_YOFFSET;
+import static mage.client.constants.Constants.TYPE_MAX_YOFFSET;
import mage.client.game.PlayAreaPanel;
import mage.client.util.Config;
import mage.client.util.DefaultActionCallback;
@@ -48,18 +87,11 @@ import mage.client.util.gui.ArrowBuilder;
import mage.constants.CardType;
import mage.constants.EnlargeMode;
import mage.remote.Session;
-import mage.view.*;
-
-import javax.swing.*;
-import javax.swing.text.*;
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.image.BufferedImage;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-import static mage.client.constants.Constants.*;
+import mage.view.AbilityView;
+import mage.view.CardView;
+import mage.view.CounterView;
+import mage.view.PermanentView;
+import mage.view.StackAbilityView;
/**
*
@@ -77,15 +109,18 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
protected final UUID gameId;
protected final BigCard bigCard;
protected CardView card;
- protected Popup popup;
- protected boolean popupShowing;
+ protected Popup tooltipPopup;
+ protected boolean tooltipShowing;
- protected TextPopup popupText = new TextPopup();
+ protected TextPopup tooltipText = new TextPopup();
protected BufferedImage background;
protected BufferedImage image = new BufferedImage(FRAME_MAX_WIDTH, FRAME_MAX_HEIGHT, BufferedImage.TYPE_INT_RGB);
protected BufferedImage small;
protected String backgroundName;
+ // if this is set, it's opened if the user right clicks on the card panel
+ private JPopupMenu popupMenu;
+
/**
* Creates new form Card
*
@@ -126,7 +161,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
@Override
public void update(PermanentView permanent) {
- this.update((CardView)permanent);
+ this.update((CardView) permanent);
}
@Override
@@ -141,7 +176,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
background = ImageHelper.getBackground(card, backgroundName);
}
- popupText.setText(getText(cardType));
+ tooltipText.setText(getText(cardType));
gImage.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
gImage.setColor(Color.BLACK);
@@ -159,8 +194,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
gImage.drawString(card.getName(), CONTENT_MAX_XOFFSET, NAME_MAX_YOFFSET);
if (card.getCardTypes().contains(CardType.CREATURE)) {
gImage.drawString(card.getPower() + "/" + card.getToughness(), POWBOX_TEXT_MAX_LEFT, POWBOX_TEXT_MAX_TOP);
- }
- else if (card.getCardTypes().contains(CardType.PLANESWALKER)) {
+ } else if (card.getCardTypes().contains(CardType.PLANESWALKER)) {
gImage.drawString(card.getLoyalty(), POWBOX_TEXT_MAX_LEFT, POWBOX_TEXT_MAX_TOP);
}
@@ -174,8 +208,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
gSmall.drawString(card.getName(), Config.dimensions.contentXOffset, Config.dimensions.nameYOffset);
if (card.getCardTypes().contains(CardType.CREATURE)) {
gSmall.drawString(card.getPower() + "/" + card.getToughness(), Config.dimensions.powBoxTextLeft, Config.dimensions.powBoxTextTop);
- }
- else if (card.getCardTypes().contains(CardType.PLANESWALKER)) {
+ } else if (card.getCardTypes().contains(CardType.PLANESWALKER)) {
gSmall.drawString(card.getLoyalty(), Config.dimensions.powBoxTextLeft, Config.dimensions.powBoxTextTop);
}
@@ -194,11 +227,10 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
protected String getText(String cardType) {
StringBuilder sb = new StringBuilder();
if (card instanceof StackAbilityView || card instanceof AbilityView) {
- for (String rule: getRules()) {
+ for (String rule : getRules()) {
sb.append("\n").append(rule);
}
- }
- else {
+ } else {
sb.append(card.getName());
if (card.getManaCost().size() > 0) {
sb.append("\n").append(card.getManaCost());
@@ -209,11 +241,10 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
}
if (card.getCardTypes().contains(CardType.CREATURE)) {
sb.append("\n").append(card.getPower()).append("/").append(card.getToughness());
- }
- else if (card.getCardTypes().contains(CardType.PLANESWALKER)) {
+ } else if (card.getCardTypes().contains(CardType.PLANESWALKER)) {
sb.append("\n").append(card.getLoyalty());
}
- for (String rule: getRules()) {
+ for (String rule : getRules()) {
sb.append("\n").append(rule);
}
if (card.getExpansionSetCode() != null && card.getExpansionSetCode().length() > 0) {
@@ -233,8 +264,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
StringBuilder sb = new StringBuilder();
if (card.getCardTypes().contains(CardType.LAND)) {
sb.append("land").append(card.getSuperTypes()).append(card.getSubTypes());
- }
- else if (card.getCardTypes() != null && (card.getCardTypes().contains(CardType.CREATURE) || card.getCardTypes().contains(CardType.PLANESWALKER))) {
+ } else if (card.getCardTypes() != null && (card.getCardTypes().contains(CardType.CREATURE) || card.getCardTypes().contains(CardType.PLANESWALKER))) {
sb.append("creature");
}
sb.append(card.getColor()).append(card.getRarity()).append(card.getExpansionSetCode());
@@ -246,10 +276,11 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
StyledDocument doc = text.getStyledDocument();
try {
- for (String rule: getRules()) {
+ for (String rule : getRules()) {
doc.insertString(doc.getLength(), rule + "\n", doc.getStyle("small"));
}
- } catch (BadLocationException e) {}
+ } catch (BadLocationException e) {
+ }
text.setCaretPosition(0);
}
@@ -257,12 +288,11 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
protected List getRules() {
if (card.getCounters() != null) {
List rules = new ArrayList<>(card.getRules());
- for (CounterView counter: card.getCounters()) {
+ for (CounterView counter : card.getCounters()) {
rules.add(counter.getCount() + " x " + counter.getName());
}
return rules;
- }
- else {
+ } else {
return card.getRules();
}
}
@@ -270,17 +300,17 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
protected String getType(CardView card) {
StringBuilder sbType = new StringBuilder();
- for (String superType: card.getSuperTypes()) {
+ for (String superType : card.getSuperTypes()) {
sbType.append(superType).append(" ");
}
- for (CardType cardType: card.getCardTypes()) {
+ for (CardType cardType : card.getCardTypes()) {
sbType.append(cardType.toString()).append(" ");
}
if (card.getSubTypes().size() > 0) {
sbType.append("- ");
- for (String subType: card.getSubTypes()) {
+ for (String subType : card.getSubTypes()) {
sbType.append(subType).append(" ");
}
}
@@ -288,10 +318,10 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
return sbType.toString();
}
- /** This method is called from within the constructor to
- * initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is
- * always regenerated by the Form Editor.
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
@@ -343,7 +373,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
@Override
public void mouseMoved(MouseEvent arg0) {
this.bigCard.showTextComponent();
- this.bigCard.setCard(card.getId(), EnlargeMode.NORMAL, image, getRules());
+ this.bigCard.setCard(card.getId(), EnlargeMode.NORMAL, image, getRules());
}
@Override
@@ -362,18 +392,18 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
@Override
public void mouseEntered(MouseEvent arg0) {
- if (!popupShowing) {
- if (popup != null) {
- popup.hide();
+ if (!tooltipShowing) {
+ if (tooltipPopup != null) {
+ tooltipPopup.hide();
}
PopupFactory factory = PopupFactory.getSharedInstance();
- popup = factory.getPopup(this, popupText, (int) this.getLocationOnScreen().getX() + Config.dimensions.frameWidth, (int) this.getLocationOnScreen().getY() + 40);
- popup.show();
- //hack to get popup to resize to fit text
- popup.hide();
- popup = factory.getPopup(this, popupText, (int) this.getLocationOnScreen().getX() + Config.dimensions.frameWidth, (int) this.getLocationOnScreen().getY() + 40);
- popup.show();
- popupShowing = true;
+ tooltipPopup = factory.getPopup(this, tooltipText, (int) this.getLocationOnScreen().getX() + Config.dimensions.frameWidth, (int) this.getLocationOnScreen().getY() + 40);
+ tooltipPopup.show();
+ //hack to get tooltipPopup to resize to fit text
+ tooltipPopup.hide();
+ tooltipPopup = factory.getPopup(this, tooltipText, (int) this.getLocationOnScreen().getX() + Config.dimensions.frameWidth, (int) this.getLocationOnScreen().getY() + 40);
+ tooltipPopup.show();
+ tooltipShowing = true;
// Draw Arrows for targets
List targets = card.getTargets();
@@ -383,14 +413,14 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
if (playAreaPanel != null) {
Point target = playAreaPanel.getLocationOnScreen();
Point me = this.getLocationOnScreen();
- ArrowBuilder.getBuilder().addArrow(gameId, (int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() - 40, Color.red, ArrowBuilder.Type.TARGET);
+ ArrowBuilder.getBuilder().addArrow(gameId, (int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() - 40, Color.red, ArrowBuilder.Type.TARGET);
} else {
for (PlayAreaPanel pa : MageFrame.getGame(gameId).getPlayers().values()) {
MagePermanent permanent = pa.getBattlefieldPanel().getPermanents().get(uuid);
if (permanent != null) {
Point target = permanent.getLocationOnScreen();
Point me = this.getLocationOnScreen();
- ArrowBuilder.getBuilder().addArrow(gameId, (int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() + 10, Color.red, ArrowBuilder.Type.TARGET);
+ ArrowBuilder.getBuilder().addArrow(gameId, (int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() + 10, Color.red, ArrowBuilder.Type.TARGET);
}
}
}
@@ -401,12 +431,12 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
@Override
public void mouseExited(MouseEvent arg0) {
- if(getMousePosition(true) != null) {
+ if (getMousePosition(true) != null) {
return;
}
- if (popup != null) {
- popup.hide();
- popupShowing = false;
+ if (tooltipPopup != null) {
+ tooltipPopup.hide();
+ tooltipShowing = false;
ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.TARGET);
ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.PAIRED);
ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.SOURCE);
@@ -421,8 +451,8 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
@Override
public void focusLost(FocusEvent arg0) {
- if (popup != null) {
- popup.hide();
+ if (tooltipPopup != null) {
+ tooltipPopup.hide();
}
this.repaint();
}
@@ -437,42 +467,54 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
// End of variables declaration//GEN-END:variables
@Override
- public void componentResized(ComponentEvent e) { }
+ public void componentResized(ComponentEvent e) {
+ }
@Override
- public void componentMoved(ComponentEvent e) { }
+ public void componentMoved(ComponentEvent e) {
+ }
@Override
- public void componentShown(ComponentEvent e) { }
+ public void componentShown(ComponentEvent e) {
+ }
@Override
public void componentHidden(ComponentEvent e) {
- if (popup != null) {
- popup.hide();
+ if (tooltipPopup != null) {
+ tooltipPopup.hide();
}
}
@Override
- public List getLinks() {return null;}
+ public List getLinks() {
+ return null;
+ }
@Override
- public boolean isTapped() {return false;}
+ public boolean isTapped() {
+ return false;
+ }
@Override
- public boolean isFlipped() {return false;}
+ public boolean isFlipped() {
+ return false;
+ }
@Override
- public void onBeginAnimation() {}
+ public void onBeginAnimation() {
+ }
@Override
- public void onEndAnimation() {}
+ public void onEndAnimation() {
+ }
@Override
- public void setAlpha(float transparency) {}
+ public void setAlpha(float transparency) {
+ }
@Override
public CardView getOriginal() {
- return card;
+ return card;
}
@Override
@@ -539,6 +581,14 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
public void setTextOffset(int yOffset) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
-
-
+
+ @Override
+ public JPopupMenu getPopupMenu() {
+ return popupMenu;
+ }
+
+ @Override
+ public void setPopupMenu(JPopupMenu popupMenu) {
+ this.popupMenu = popupMenu;
+ }
}
diff --git a/Mage.Client/src/main/java/mage/client/cards/CardArea.java b/Mage.Client/src/main/java/mage/client/cards/CardArea.java
index 1d40d21f806..783724d1a4e 100644
--- a/Mage.Client/src/main/java/mage/client/cards/CardArea.java
+++ b/Mage.Client/src/main/java/mage/client/cards/CardArea.java
@@ -1,56 +1,64 @@
/*
-* Copyright 2012 BetaSteward_at_googlemail.com. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification, are
-* permitted provided that the following conditions are met:
-*
-* 1. Redistributions of source code must retain the above copyright notice, this list of
-* conditions and the following disclaimer.
-*
-* 2. Redistributions in binary form must reproduce the above copyright notice, this list
-* of conditions and the following disclaimer in the documentation and/or other materials
-* provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
-* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The views and conclusions contained in the software and documentation are those of the
-* authors and should not be interpreted as representing official policies, either expressed
-* or implied, of BetaSteward_at_googlemail.com.
-*/
-
+ * Copyright 2012 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
package mage.client.cards;
-import mage.cards.CardDimensions;
-import mage.cards.MageCard;
-import mage.client.plugins.impl.Plugins;
-import mage.client.util.CardsViewUtil;
-import mage.client.util.Config;
-import mage.view.AbilityView;
-import mage.view.CardView;
-import mage.view.CardsView;
-import mage.view.SimpleCardsView;
-import org.mage.card.arcane.CardPanel;
-
-import javax.swing.*;
-import java.awt.*;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;
import java.util.UUID;
+import javax.swing.JLayeredPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import mage.cards.CardDimensions;
+import mage.cards.MageCard;
+import mage.client.plugins.impl.Plugins;
+import mage.client.util.Config;
+import mage.client.util.Event;
+import mage.client.util.Listener;
+import mage.view.AbilityView;
+import mage.view.CardView;
+import mage.view.CardsView;
+import mage.view.SimpleCardView;
+import org.mage.card.arcane.CardPanel;
-public class CardArea extends JPanel {
+public class CardArea extends JPanel implements MouseListener {
+
+ protected CardEventSource cardEventSource = new CardEventSource();
private boolean reloaded = false;
private final javax.swing.JLayeredPane cardArea;
private final javax.swing.JScrollPane scrollPane;
- private int yTextOffset;
+ private int yTextOffset;
/**
* Create the panel.
@@ -68,28 +76,23 @@ public class CardArea extends JPanel {
}
public void cleanUp() {
- for(Component comp: cardArea.getComponents()) {
- if (comp instanceof CardPanel) {
- ((CardPanel) comp).cleanUp();
- cardArea.remove(comp);
- }
- }
- }
-
- public void loadCards(SimpleCardsView showCards, BigCard bigCard, CardDimensions dimension, UUID gameId, MouseListener listener) {
- loadCards(CardsViewUtil.convertSimple(showCards), bigCard, dimension, gameId, listener);
+ for (Component comp : cardArea.getComponents()) {
+ if (comp instanceof CardPanel) {
+ ((CardPanel) comp).cleanUp();
+ cardArea.remove(comp);
+ }
+ }
}
- public void loadCards(CardsView showCards, BigCard bigCard, CardDimensions dimension, UUID gameId, MouseListener listener) {
+ public void loadCards(CardsView showCards, BigCard bigCard, CardDimensions dimension, UUID gameId) {
this.reloaded = true;
cardArea.removeAll();
if (showCards != null && showCards.size() < 10) {
yTextOffset = 10;
- loadCardsFew(showCards, bigCard, gameId, listener);
- }
- else {
+ loadCardsFew(showCards, bigCard, gameId);
+ } else {
yTextOffset = 0;
- loadCardsMany(showCards, bigCard, gameId, listener, dimension);
+ loadCardsMany(showCards, bigCard, gameId, dimension);
}
cardArea.revalidate();
@@ -97,28 +100,28 @@ public class CardArea extends JPanel {
this.repaint();
}
- public void loadCardsNarrow(CardsView showCards, BigCard bigCard, CardDimensions dimension, UUID gameId, MouseListener listener) {
+ public void loadCardsNarrow(CardsView showCards, BigCard bigCard, CardDimensions dimension, UUID gameId) {
this.reloaded = true;
cardArea.removeAll();
- yTextOffset = 0;
- loadCardsMany(showCards, bigCard, gameId, listener, dimension);
+ yTextOffset = 0;
+ loadCardsMany(showCards, bigCard, gameId, dimension);
cardArea.revalidate();
this.revalidate();
this.repaint();
}
- private void loadCardsFew(CardsView showCards, BigCard bigCard, UUID gameId, MouseListener listener) {
+ private void loadCardsFew(CardsView showCards, BigCard bigCard, UUID gameId) {
Rectangle rectangle = new Rectangle(Config.dimensions.frameWidth, Config.dimensions.frameHeight);
Dimension dimension = new Dimension(Config.dimensions.frameWidth, Config.dimensions.frameHeight);
for (CardView card : showCards.values()) {
- addCard(card, bigCard, gameId, rectangle, dimension, Config.dimensions, listener);
+ addCard(card, bigCard, gameId, rectangle, dimension, Config.dimensions);
rectangle.translate(Config.dimensions.frameWidth, 0);
}
cardArea.setPreferredSize(new Dimension(Config.dimensions.frameWidth * showCards.size(), Config.dimensions.frameHeight));
}
- private void addCard(CardView card, BigCard bigCard, UUID gameId, Rectangle rectangle, Dimension dimension, CardDimensions cardDimensions, MouseListener listener) {
+ private void addCard(CardView card, BigCard bigCard, UUID gameId, Rectangle rectangle, Dimension dimension, CardDimensions cardDimensions) {
if (card instanceof AbilityView) {
CardView tmp = ((AbilityView) card).getSourceCard();
tmp.overrideRules(card.getRules());
@@ -127,28 +130,26 @@ public class CardArea extends JPanel {
tmp.setAbility(card); // cross-reference, required for ability picker
card = tmp;
}
- MageCard cardImg = Plugins.getInstance().getMageCard(card, bigCard, dimension, gameId, true);
+ MageCard cardPanel = Plugins.getInstance().getMageCard(card, bigCard, dimension, gameId, true);
- cardImg.setBounds(rectangle);
- if (listener != null) {
- cardImg.addMouseListener(listener);
- }
- cardArea.add(cardImg);
- cardArea.moveToFront(cardImg);
- cardImg.update(card);
- cardImg.setCardBounds(rectangle.x, rectangle.y, cardDimensions.frameWidth, cardDimensions.frameHeight);
- cardImg.setTextOffset(yTextOffset);
- cardImg.showCardTitle();
+ cardPanel.setBounds(rectangle);
+ cardPanel.addMouseListener(this);
+ cardArea.add(cardPanel);
+ cardArea.moveToFront(cardPanel);
+ cardPanel.update(card);
+ cardPanel.setCardBounds(rectangle.x, rectangle.y, cardDimensions.frameWidth, cardDimensions.frameHeight);
+ cardPanel.setTextOffset(yTextOffset);
+ cardPanel.showCardTitle();
}
- private void loadCardsMany(CardsView showCards, BigCard bigCard, UUID gameId, MouseListener listener, CardDimensions cardDimensions) {
+ private void loadCardsMany(CardsView showCards, BigCard bigCard, UUID gameId, CardDimensions cardDimensions) {
int columns = 1;
if (showCards != null && showCards.size() > 0) {
Rectangle rectangle = new Rectangle(cardDimensions.frameWidth, cardDimensions.frameHeight);
Dimension dimension = new Dimension(cardDimensions.frameWidth, cardDimensions.frameHeight);
int count = 0;
for (CardView card : showCards.values()) {
- addCard(card, bigCard, gameId, rectangle, dimension, cardDimensions, listener);
+ addCard(card, bigCard, gameId, rectangle, dimension, cardDimensions);
if (count >= 20) {
rectangle.translate(cardDimensions.frameWidth, -400);
columns++;
@@ -169,11 +170,11 @@ public class CardArea extends JPanel {
public void clearReloaded() {
this.reloaded = false;
}
-
+
public void selectCards(List selected) {
for (Component component : cardArea.getComponents()) {
if (component instanceof MageCard) {
- MageCard mageCard = (MageCard)component;
+ MageCard mageCard = (MageCard) component;
if (selected.contains(mageCard.getOriginal().getId())) {
mageCard.setSelected(true);
}
@@ -184,7 +185,7 @@ public class CardArea extends JPanel {
public void markCards(List marked) {
for (Component component : cardArea.getComponents()) {
if (component instanceof MageCard) {
- MageCard mageCard = (MageCard)component;
+ MageCard mageCard = (MageCard) component;
if (marked.contains(mageCard.getOriginal().getId())) {
mageCard.setChoosable(true);
}
@@ -192,4 +193,82 @@ public class CardArea extends JPanel {
}
}
+ public void setPopupMenu(JPopupMenu popupMenu) {
+ for (Component component : cardArea.getComponents()) {
+ if (component instanceof MageCard) {
+ MageCard mageCard = (MageCard) component;
+ mageCard.setPopupMenu(popupMenu);
+ }
+ }
+ }
+
+ public void addCardEventListener(Listener listener) {
+ cardEventSource.addListener(listener);
+ }
+
+ public void clearCardEventListeners() {
+ cardEventSource.clearListeners();
+ }
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ }
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+ if (e.getClickCount() >= 1 && !e.isConsumed()) {
+ Object obj = e.getSource();
+ if (e.getClickCount() == 2) {
+ e.consume();
+ if (obj instanceof Card) {
+ if (e.isAltDown()) {
+ cardEventSource.altDoubleClick(((Card) obj).getOriginal(), "alt-double-click");
+ } else {
+ cardEventSource.doubleClick(((Card) obj).getOriginal(), "double-click");
+ }
+ } else if (obj instanceof MageCard) {
+ if (e.isAltDown()) {
+ cardEventSource.altDoubleClick(((MageCard) obj).getOriginal(), "alt-double-click");
+ } else {
+ cardEventSource.doubleClick(((MageCard) obj).getOriginal(), "double-click");
+ }
+ }
+ }
+ if (obj instanceof MageCard) {
+ checkMenu(e, ((MageCard) obj).getOriginal());
+ } else {
+ checkMenu(e, null);
+ }
+ }
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ if (!e.isConsumed()) {
+ Object obj = e.getSource();
+ if (obj instanceof MageCard) {
+ checkMenu(e, ((MageCard) obj).getOriginal());
+ } else {
+ checkMenu(e, null);
+ }
+ } else {
+ cardEventSource.actionConsumedEvent("action-consumed");
+ }
+ }
+
+ private void checkMenu(MouseEvent Me, SimpleCardView card) {
+ if (Me.isPopupTrigger()) {
+ Me.consume();
+ cardEventSource.showPopupMenuEvent(card, Me.getComponent(), Me.getX(), Me.getY(), "show-popup-menu");
+ }
+ }
+
+ @Override
+ public void mouseEntered(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+ }
+
}
diff --git a/Mage.Client/src/main/java/mage/client/cards/CardEventSource.java b/Mage.Client/src/main/java/mage/client/cards/CardEventSource.java
index 5aa243ffc10..01528dd06b0 100644
--- a/Mage.Client/src/main/java/mage/client/cards/CardEventSource.java
+++ b/Mage.Client/src/main/java/mage/client/cards/CardEventSource.java
@@ -1,49 +1,48 @@
/*
-* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification, are
-* permitted provided that the following conditions are met:
-*
-* 1. Redistributions of source code must retain the above copyright notice, this list of
-* conditions and the following disclaimer.
-*
-* 2. Redistributions in binary form must reproduce the above copyright notice, this list
-* of conditions and the following disclaimer in the documentation and/or other materials
-* provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
-* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The views and conclusions contained in the software and documentation are those of the
-* authors and should not be interpreted as representing official policies, either expressed
-* or implied, of BetaSteward_at_googlemail.com.
-*/
-
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
package mage.client.cards;
import java.awt.Component;
+import java.io.Serializable;
import mage.client.util.Event;
import mage.client.util.EventDispatcher;
import mage.client.util.EventSource;
import mage.client.util.Listener;
import mage.view.SimpleCardView;
-import java.io.Serializable;
-
/**
*
* @author BetaSteward_at_googlemail.com
*/
public class CardEventSource implements EventSource, Serializable {
- protected final EventDispatcher dispatcher = new EventDispatcher() {};
+ protected final EventDispatcher dispatcher = new EventDispatcher() {
+ };
@Override
public void addListener(Listener listener) {
@@ -74,6 +73,9 @@ public class CardEventSource implements EventSource, Serializable {
dispatcher.fireEvent(new Event(card, message, x, y, component));
}
+ public void actionConsumedEvent(String message) {
+ dispatcher.fireEvent(new Event(null, message));
+ }
@Override
public void clearListeners() {
diff --git a/Mage.Client/src/main/java/mage/client/cards/CardGrid.java b/Mage.Client/src/main/java/mage/client/cards/CardGrid.java
index a2369fe3149..9940628f998 100644
--- a/Mage.Client/src/main/java/mage/client/cards/CardGrid.java
+++ b/Mage.Client/src/main/java/mage/client/cards/CardGrid.java
@@ -1,16 +1,16 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
@@ -20,7 +20,7 @@
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
+ *
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
@@ -31,7 +31,6 @@
*
* Created on 30-Mar-2010, 9:25:40 PM
*/
-
package mage.client.cards;
import java.awt.Component;
@@ -54,6 +53,7 @@ import mage.client.plugins.impl.Plugins;
import mage.client.util.Config;
import mage.client.util.Event;
import mage.client.util.Listener;
+import mage.utils.CardUtil;
import mage.view.CardView;
import mage.view.CardsView;
import org.mage.card.arcane.CardPanel;
@@ -82,7 +82,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
public void clear() {
- for(MouseListener ml: this.getMouseListeners()) {
+ for (MouseListener ml : this.getMouseListeners()) {
this.removeMouseListener(ml);
}
this.clearCardEventListeners();
@@ -101,7 +101,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
this.bigCard = bigCard;
this.gameId = gameId;
if (merge) {
- for (CardView card: showCards.values()) {
+ for (CardView card : showCards.values()) {
if (!cards.containsKey(card.getId())) {
addCard(card, bigCard, gameId, drawImage);
}
@@ -115,7 +115,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
} else {
this.clearCards();
- for (CardView card: showCards.values()) {
+ for (CardView card : showCards.values()) {
addCard(card, bigCard, gameId, drawImage);
}
}
@@ -144,7 +144,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
int curRow = 0;
if (cards.size() > 0) {
Rectangle rectangle = new Rectangle(Config.dimensions.frameWidth, Config.dimensions.frameHeight);
- List sortedCards = new ArrayList(cards.values());
+ List sortedCards = new ArrayList<>(cards.values());
switch (sortSetting.getSortBy()) {
case NAME:
Collections.sort(sortedCards, new CardNameComparator());
@@ -155,15 +155,16 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
case COLOR:
Collections.sort(sortedCards, new CardColorComparator());
break;
- case COLOR_DETAILED:
- Collections.sort(sortedCards, new CardColorDetailedComparator());
+ case COLOR_IDENTITY:
+ Collections.sort(sortedCards, new CardColorDetailedIdentity());
break;
case CASTING_COST:
Collections.sort(sortedCards, new CardCostComparator());
break;
+
}
MageCard lastCard = null;
- for (MageCard cardImg: sortedCards) {
+ for (MageCard cardImg : sortedCards) {
if (sortSetting.isPilesToggle()) {
if (lastCard == null) {
lastCard = cardImg;
@@ -187,8 +188,9 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
curRow = 0;
}
break;
- case COLOR_DETAILED:
- if (cardImg.getOriginal().getColor().hashCode() != lastCard.getOriginal().getColor().hashCode()) {
+ case COLOR_IDENTITY:
+ if (CardUtil.getColorIdentitySortValue(cardImg.getOriginal().getManaCost(), cardImg.getOriginal().getColor(), cardImg.getOriginal().getRules())
+ != CardUtil.getColorIdentitySortValue(lastCard.getOriginal().getManaCost(), lastCard.getOriginal().getColor(), lastCard.getOriginal().getRules())) {
curColumn++;
curRow = 0;
}
@@ -206,8 +208,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
moveToFront(cardImg);
curRow++;
lastCard = cardImg;
- }
- else {
+ } else {
rectangle.setLocation(curColumn * Config.dimensions.frameWidth, curRow * 20);
cardImg.setBounds(rectangle);
cardImg.setCardBounds(rectangle.x, rectangle.y, Config.dimensions.frameWidth, Config.dimensions.frameHeight);
@@ -221,15 +222,15 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
}
resizeArea();
- revalidate();
- repaint();
+ revalidate();
+ repaint();
}
private void clearCards() {
// remove possible mouse listeners, preventing gc
- for (MageCard mageCard: cards.values()) {
+ for (MageCard mageCard : cards.values()) {
if (mageCard instanceof CardPanel) {
- ((CardPanel)mageCard).cleanUp();
+ ((CardPanel) mageCard).cleanUp();
}
}
this.cards.clear();
@@ -237,7 +238,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
private void removeAllCardImg() {
- for (Component comp: getComponents()) {
+ for (Component comp : getComponents()) {
if (comp instanceof Card || comp instanceof MageCard) {
remove(comp);
}
@@ -245,14 +246,14 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
private void removeCardImg(UUID cardId) {
- for (Component comp: getComponents()) {
+ for (Component comp : getComponents()) {
if (comp instanceof Card) {
- if (((Card)comp).getCardId().equals(cardId)) {
+ if (((Card) comp).getCardId().equals(cardId)) {
remove(comp);
comp = null;
}
} else if (comp instanceof MageCard) {
- if (((MageCard)comp).getOriginal().getId().equals(cardId)) {
+ if (((MageCard) comp).getOriginal().getId().equals(cardId)) {
remove(comp);
comp = null;
}
@@ -275,10 +276,10 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
cardEventSource.clearListeners();
}
- /** This method is called from within the constructor to
- * initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is
- * always regenerated by the Form Editor.
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
@@ -296,10 +297,8 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
);
}// //GEN-END:initComponents
-
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
-
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2 && !e.isConsumed()) {
@@ -322,22 +321,26 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
@Override
- public void mousePressed(MouseEvent e) {}
+ public void mousePressed(MouseEvent e) {
+ }
@Override
- public void mouseReleased(MouseEvent e) {}
+ public void mouseReleased(MouseEvent e) {
+ }
@Override
- public void mouseEntered(MouseEvent e) {}
+ public void mouseEntered(MouseEvent e) {
+ }
@Override
- public void mouseExited(MouseEvent e) {}
+ public void mouseExited(MouseEvent e) {
+ }
private void resizeArea() {
Dimension area = new Dimension(0, 0);
Dimension size = getPreferredSize();
- for (Component comp: getComponents()) {
+ for (Component comp : getComponents()) {
Rectangle r = comp.getBounds();
if (r.x + r.width > area.width) {
area.width = r.x + r.width;
@@ -348,13 +351,13 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
if (size.height != area.height || size.width != area.width) {
setPreferredSize(area);
- }
+ }
}
@Override
public void refresh() {
revalidate();
- repaint();
+ repaint();
}
@Override
@@ -379,8 +382,7 @@ class CardRarityComparator implements Comparator {
int val = o1.getOriginal().getRarity().compareTo(o2.getOriginal().getRarity());
if (val == 0) {
return o1.getOriginal().getName().compareTo(o2.getOriginal().getName());
- }
- else {
+ } else {
return val;
}
}
@@ -394,8 +396,7 @@ class CardCostComparator implements Comparator {
int val = Integer.valueOf(o1.getOriginal().getConvertedManaCost()).compareTo(Integer.valueOf(o2.getOriginal().getConvertedManaCost()));
if (val == 0) {
return o1.getOriginal().getName().compareTo(o2.getOriginal().getName());
- }
- else {
+ } else {
return val;
}
}
@@ -409,23 +410,22 @@ class CardColorComparator implements Comparator {
int val = o1.getOriginal().getColor().compareTo(o2.getOriginal().getColor());
if (val == 0) {
return o1.getOriginal().getName().compareTo(o2.getOriginal().getName());
- }
- else {
+ } else {
return val;
}
}
}
-class CardColorDetailedComparator implements Comparator {
+class CardColorDetailedIdentity implements Comparator {
@Override
public int compare(MageCard o1, MageCard o2) {
- int val = o1.getOriginal().getColor().hashCode() - o2.getOriginal().getColor().hashCode();
+ int val = CardUtil.getColorIdentitySortValue(o1.getOriginal().getManaCost(), o1.getOriginal().getColor(), o1.getOriginal().getRules())
+ - CardUtil.getColorIdentitySortValue(o2.getOriginal().getManaCost(), o2.getOriginal().getColor(), o2.getOriginal().getRules());
if (val == 0) {
return o1.getOriginal().getName().compareTo(o2.getOriginal().getName());
- }
- else {
+ } else {
return val;
}
}
diff --git a/Mage.Client/src/main/java/mage/client/cards/CardsList.java b/Mage.Client/src/main/java/mage/client/cards/CardsList.java
index 489f18d08ef..e4bf5d2b67f 100644
--- a/Mage.Client/src/main/java/mage/client/cards/CardsList.java
+++ b/Mage.Client/src/main/java/mage/client/cards/CardsList.java
@@ -1,37 +1,36 @@
/*
-* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification, are
-* permitted provided that the following conditions are met:
-*
-* 1. Redistributions of source code must retain the above copyright notice, this list of
-* conditions and the following disclaimer.
-*
-* 2. Redistributions in binary form must reproduce the above copyright notice, this list
-* of conditions and the following disclaimer in the documentation and/or other materials
-* provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
-* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The views and conclusions contained in the software and documentation are those of the
-* authors and should not be interpreted as representing official policies, either expressed
-* or implied, of BetaSteward_at_googlemail.com.
-*/
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
/*
* CardsList.java
*
* Created on Dec 18, 2009, 10:40:12 AM
*/
-
package mage.client.cards;
import java.awt.Color;
@@ -59,7 +58,7 @@ import mage.client.constants.Constants.DeckEditorMode;
import mage.client.constants.Constants.SortBy;
import static mage.client.constants.Constants.SortBy.CASTING_COST;
import static mage.client.constants.Constants.SortBy.COLOR;
-import static mage.client.constants.Constants.SortBy.COLOR_DETAILED;
+import static mage.client.constants.Constants.SortBy.COLOR_IDENTITY;
import static mage.client.constants.Constants.SortBy.RARITY;
import mage.client.deckeditor.SortSetting;
import mage.client.deckeditor.table.TableModel;
@@ -67,7 +66,7 @@ import mage.client.deckeditor.table.UpdateCountsCallback;
import mage.client.dialog.PreferencesDialog;
import mage.client.plugins.impl.Plugins;
import mage.client.util.CardViewColorComparator;
-import mage.client.util.CardViewColorDetailedComparator;
+import mage.client.util.CardViewColorIdentityComparator;
import mage.client.util.CardViewCostComparator;
import mage.client.util.CardViewNameComparator;
import mage.client.util.CardViewRarityComparator;
@@ -86,7 +85,7 @@ import org.mage.card.arcane.CardPanel;
* @author BetaSteward_at_googlemail.com
*/
public class CardsList extends javax.swing.JPanel implements MouseListener, ICardGrid {
-
+
protected CardEventSource cardEventSource = new CardEventSource();
private Dimension cardDimension;
private CardsView cards;
@@ -98,8 +97,10 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
private TableModel mainModel;
private JTable mainTable;
private ICardGrid currentView;
-
- /** Creates new form Cards */
+
+ /**
+ * Creates new form Cards
+ */
public CardsList() {
initComponents();
makeTransparent();
@@ -115,22 +116,22 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
mainModel.removeTableModelListener(mainTable);
mainModel.clear();
}
- if(cardArea != null) {
- for(MouseListener ml: cardArea.getMouseListeners()) {
+ if (cardArea != null) {
+ for (MouseListener ml : cardArea.getMouseListeners()) {
cardArea.removeMouseListener(ml);
}
}
- if(mainTable != null) {
- for(MouseListener ml: mainTable.getMouseListeners()) {
+ if (mainTable != null) {
+ for (MouseListener ml : mainTable.getMouseListeners()) {
mainTable.removeMouseListener(ml);
}
}
if (currentView != null) {
currentView.clearCardEventListeners();
}
- for (Component comp :cardArea.getComponents()) {
- if (comp instanceof CardPanel) {
- ((CardPanel)comp).cleanUp();
+ for (Component comp : cardArea.getComponents()) {
+ if (comp instanceof CardPanel) {
+ ((CardPanel) comp).cleanUp();
}
}
mageCards.clear();
@@ -208,20 +209,20 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
// activate spinner for card number change
mainModel.setNumberEditable(true);
TableColumnModel tcm = mainTable.getColumnModel();
- TableColumn tc = tcm.getColumn(0);
+ TableColumn tc = tcm.getColumn(0);
tc.setMaxWidth(55);
tc.setMinWidth(55);
tc.setPreferredWidth(55);
- tc.setCellEditor(new TableSpinnerEditor(this));
+ tc.setCellEditor(new TableSpinnerEditor(this));
}
}
-
+
public void handleSetNumber(int number) {
if (mainTable.getSelectedRowCount() == 1) {
mainModel.setNumber(mainTable.getSelectedRow(), number);
- }
+ }
}
-
+
public void handleDoubleClick() {
if (mainTable.getSelectedRowCount() > 0) {
int[] n = mainTable.getSelectedRows();
@@ -232,7 +233,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
}
}
}
-
+
public void handleAltDoubleClick() {
if (mainTable.getSelectedRowCount() > 0) {
int[] n = mainTable.getSelectedRows();
@@ -243,7 +244,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
}
}
}
-
+
public ICardGrid getMainModel() {
return mainModel;
}
@@ -256,7 +257,6 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
return list;
}
-
public void loadCards(CardsView showCards, BigCard bigCard, UUID gameId) {
int selectedRow = -1;
if (currentView.equals(mainModel)) {
@@ -270,7 +270,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
chkPiles.setSelected(sortSetting.isPilesToggle());
currentView.loadCards(showCards, sortSetting, bigCard, gameId);
if (selectedRow >= 0) {
- selectedRow = Math.min(selectedRow, mainTable.getRowCount()-1);
+ selectedRow = Math.min(selectedRow, mainTable.getRowCount() - 1);
if (selectedRow >= 0) {
mainTable.setRowSelectionInterval(selectedRow, selectedRow);
}
@@ -281,7 +281,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
if (cards == null) {
cards = new CardsView();
}
- currentView.loadCards(cards, sortSetting, bigCard, gameId);
+ currentView.loadCards(cards, sortSetting, bigCard, gameId);
}
@Override
@@ -295,22 +295,21 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
Comparator comparator = null;
Map oldMageCards = mageCards;
mageCards = new LinkedHashMap<>();
-
+
//Find card view
- for(UUID uuid : cards.keySet()){
- if(oldMageCards.containsKey(uuid)){
+ for (UUID uuid : cards.keySet()) {
+ if (oldMageCards.containsKey(uuid)) {
mageCards.put(uuid, oldMageCards.get(uuid));
oldMageCards.remove(uuid);
- }
- else{
+ } else {
mageCards.put(uuid, addCard(cards.get(uuid), bigCard, gameId));
}
}
//Remove unused cards
- for(MageCard card : oldMageCards.values()){
+ for (MageCard card : oldMageCards.values()) {
cardArea.remove(card);
}
-
+
if (cards != null && cards.size() > 0) {
Rectangle rectangle = new Rectangle(Config.dimensions.frameWidth, Config.dimensions.frameHeight);
List sortedCards = new ArrayList<>(cards.values());
@@ -324,25 +323,25 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
case COLOR:
comparator = new CardViewColorComparator();
break;
- case COLOR_DETAILED:
- comparator = new CardViewColorDetailedComparator();
+ case COLOR_IDENTITY:
+ comparator = new CardViewColorIdentityComparator();
break;
case CASTING_COST:
comparator = new CardViewCostComparator();
break;
}
- if(comparator != null){
+ if (comparator != null) {
Collections.sort(sortedCards, new CardViewNameComparator());
Collections.sort(sortedCards, comparator);
}
CardView lastCard = null;
- for (CardView card: sortedCards) {
+ for (CardView card : sortedCards) {
if (sortSetting.isPilesToggle()) {
if (lastCard == null) {
lastCard = card;
}
- if(comparator != null){
- if(comparator.compare(card, lastCard) > 0){
+ if (comparator != null) {
+ if (comparator.compare(card, lastCard) > 0) {
curColumn++;
maxRow = Math.max(maxRow, curRow);
curRow = 0;
@@ -350,7 +349,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
}
rectangle.setLocation(curColumn * Config.dimensions.frameWidth, curRow * 20);
setCardBounds(mageCards.get(card.getId()), rectangle);
-
+
curRow++;
lastCard = card;
} else {
@@ -368,21 +367,21 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
maxRow = Math.max(maxRow, curRow);
maxColumn = Math.max(maxColumn, curColumn);
updateCounts();
- cardArea.setPreferredSize(new Dimension((maxColumn+1) * Config.dimensions.frameWidth, Config.dimensions.frameHeight + maxRow*20));
+ cardArea.setPreferredSize(new Dimension((maxColumn + 1) * Config.dimensions.frameWidth, Config.dimensions.frameHeight + maxRow * 20));
cardArea.revalidate();
this.revalidate();
this.repaint();
this.setVisible(true);
}
-
- private void updateCounts(){
+
+ private void updateCounts() {
int landCount = 0;
int creatureCount = 0;
int sorceryCount = 0;
int instantCount = 0;
int enchantmentCount = 0;
- for (CardView card: cards.values()) {
- if (card.getCardTypes().contains(CardType.LAND)) {
+ for (CardView card : cards.values()) {
+ if (card.getCardTypes().contains(CardType.LAND)) {
landCount++;
}
if (card.getCardTypes().contains(CardType.CREATURE)) {
@@ -398,7 +397,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
enchantmentCount++;
}
}
-
+
int count = cards != null ? cards.size() : 0;
this.lblCount.setText(Integer.toString(count));
this.lblCreatureCount.setText(Integer.toString(creatureCount));
@@ -418,7 +417,6 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
cardImg.addMouseListener(this);
return cardImg;
}
-
private void setCardBounds(MageCard card, Rectangle rectangle) {
card.setBounds(rectangle);
@@ -456,10 +454,10 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
mainModel.clearCardEventListeners();
}
- /** This method is called from within the constructor to
- * initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is
- * always regenerated by the Form Editor.
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
@@ -678,9 +676,9 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
currentView = mainModel;
panelCardArea.setViewportView(mainTable);
cbSortBy.setEnabled(false);
- chkPiles.setEnabled(false);
+ chkPiles.setEnabled(false);
PreferencesDialog.saveValue(PreferencesDialog.KEY_DRAFT_VIEW, "listView");
- redrawCards();
+ redrawCards();
}//GEN-LAST:event_jToggleListViewActionPerformed
private void cbSortByActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbSortByActionPerformed
@@ -698,8 +696,8 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
panelCardArea.setViewportView(cardArea);
cbSortBy.setEnabled(true);
chkPiles.setEnabled(true);
- PreferencesDialog.saveValue(PreferencesDialog.KEY_DRAFT_VIEW, "cardView");
- redrawCards();
+ PreferencesDialog.saveValue(PreferencesDialog.KEY_DRAFT_VIEW, "cardView");
+ redrawCards();
}//GEN-LAST:event_jToggleCardViewActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
@@ -725,28 +723,26 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
@Override
public void mousePressed(MouseEvent e) {
- if (e.getClickCount() >= 1 && !e.isConsumed()) {
+ if (e.getClickCount() >= 1 && !e.isConsumed()) {
Object obj = e.getSource();
if (e.getClickCount() == 2) {
e.consume();
if (obj instanceof Card) {
if (e.isAltDown()) {
- cardEventSource.altDoubleClick(((Card)obj).getOriginal(), "alt-double-click");
- }
- else {
- cardEventSource.doubleClick(((Card)obj).getOriginal(), "double-click");
+ cardEventSource.altDoubleClick(((Card) obj).getOriginal(), "alt-double-click");
+ } else {
+ cardEventSource.doubleClick(((Card) obj).getOriginal(), "double-click");
}
} else if (obj instanceof MageCard) {
if (e.isAltDown()) {
- cardEventSource.altDoubleClick(((MageCard)obj).getOriginal(), "alt-double-click");
- }
- else {
- cardEventSource.doubleClick(((MageCard)obj).getOriginal(), "double-click");
+ cardEventSource.altDoubleClick(((MageCard) obj).getOriginal(), "alt-double-click");
+ } else {
+ cardEventSource.doubleClick(((MageCard) obj).getOriginal(), "double-click");
}
}
}
if (obj instanceof MageCard) {
- checkMenu(e, ((MageCard)obj).getOriginal());
+ checkMenu(e, ((MageCard) obj).getOriginal());
} else {
checkMenu(e, null);
}
@@ -758,14 +754,14 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
if (!e.isConsumed()) {
Object obj = e.getSource();
if (obj instanceof MageCard) {
- checkMenu(e, ((MageCard)obj).getOriginal());
+ checkMenu(e, ((MageCard) obj).getOriginal());
} else {
checkMenu(e, null);
}
}
}
- private void checkMenu(MouseEvent Me, SimpleCardView card){
+ private void checkMenu(MouseEvent Me, SimpleCardView card) {
if (Me.isPopupTrigger()) {
Me.consume();
cardEventSource.showPopupMenuEvent(card, Me.getComponent(), Me.getX(), Me.getY(), "show-popup-menu");
diff --git a/Mage.Client/src/main/java/mage/client/cards/Permanent.java b/Mage.Client/src/main/java/mage/client/cards/Permanent.java
index e7401b39de4..a01e368641d 100644
--- a/Mage.Client/src/main/java/mage/client/cards/Permanent.java
+++ b/Mage.Client/src/main/java/mage/client/cards/Permanent.java
@@ -254,20 +254,20 @@ public class Permanent extends Card {
@Override
public void mouseEntered(MouseEvent arg0) {
- if (!popupShowing) {
- if (popup != null) {
- popup.hide();
+ if (!tooltipShowing) {
+ if (tooltipPopup != null) {
+ tooltipPopup.hide();
}
PopupFactory factory = PopupFactory.getSharedInstance();
int x = (int) this.getLocationOnScreen().getX() + (permanent.isTapped()?Config.dimensions.frameHeight:Config.dimensions.frameWidth);
int y = (int) this.getLocationOnScreen().getY() + 40;
- popup = factory.getPopup(this, popupText, x, y);
- popup.show();
- //hack to get popup to resize to fit text
- popup.hide();
- popup = factory.getPopup(this, popupText, x, y);
- popup.show();
- popupShowing = true;
+ tooltipPopup = factory.getPopup(this, tooltipText, x, y);
+ tooltipPopup.show();
+ //hack to get tooltipPopup to resize to fit text
+ tooltipPopup.hide();
+ tooltipPopup = factory.getPopup(this, tooltipText, x, y);
+ tooltipPopup.show();
+ tooltipShowing = true;
}
}
diff --git a/Mage.Client/src/main/java/mage/client/chat/ChatPanelBasic.form b/Mage.Client/src/main/java/mage/client/chat/ChatPanelBasic.form
new file mode 100644
index 00000000000..70c347f0639
--- /dev/null
+++ b/Mage.Client/src/main/java/mage/client/chat/ChatPanelBasic.form
@@ -0,0 +1,69 @@
+
+
+
diff --git a/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java b/Mage.Client/src/main/java/mage/client/chat/ChatPanelBasic.java
similarity index 52%
rename from Mage.Client/src/main/java/mage/client/chat/ChatPanel.java
rename to Mage.Client/src/main/java/mage/client/chat/ChatPanelBasic.java
index b20e0a9f6f4..b096fef13c9 100644
--- a/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java
+++ b/Mage.Client/src/main/java/mage/client/chat/ChatPanelBasic.java
@@ -35,82 +35,65 @@ package mage.client.chat;
import java.awt.Color;
import java.awt.event.KeyEvent;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
import java.util.UUID;
-import javax.swing.Icon;
import javax.swing.JTextField;
-import javax.swing.table.AbstractTableModel;
-import javax.swing.table.JTableHeader;
-import javax.swing.table.TableColumnModel;
import mage.client.MageFrame;
-import static mage.client.dialog.PreferencesDialog.KEY_USERS_COLUMNS_ORDER;
-import static mage.client.dialog.PreferencesDialog.KEY_USERS_COLUMNS_WIDTH;
-import mage.client.util.MageTableRowSorter;
-import mage.client.util.gui.TableUtil;
-import mage.client.util.gui.countryBox.CountryCellRenderer;
-import mage.remote.MageRemoteException;
import mage.remote.Session;
import mage.view.ChatMessage.MessageColor;
import mage.view.ChatMessage.MessageType;
-import mage.view.RoomUsersView;
-import mage.view.UsersView;
import org.mage.card.arcane.ManaSymbols;
/**
*
* @author BetaSteward_at_googlemail.com, nantuko
*/
-public class ChatPanel extends javax.swing.JPanel {
+public class ChatPanelBasic extends javax.swing.JPanel {
- private UUID chatId;
- private Session session;
- private final List players = new ArrayList<>();
- private final UserTableModel userTableModel;
+ protected UUID chatId;
+ protected Session session;
/**
* Chat message color for opponents.
*/
- private static final String OPPONENT_COLOR = "#FF7F50";
+ protected static final String OPPONENT_COLOR = "#FF7F50";
/**
* Chat message color for client player.
*/
- private static final String MY_COLOR = "#7FFFD4";
+ protected static final String MY_COLOR = "#7FFFD4";
/**
* Chat message color for timestamps.
*/
- private static final String TIMESTAMP_COLOR = "#CCCC33";
+ protected static final String TIMESTAMP_COLOR = "#CCCC33";
/**
* Chat message color for messages.
*/
- private static final String MESSAGE_COLOR = "White";
+ protected static final String MESSAGE_COLOR = "White";
/**
* Chat message color for personal infos.
*/
- private static final String USER_INFO_COLOR = "Yellow";
+ protected static final String USER_INFO_COLOR = "Yellow";
/**
* Chat message color for status infos.
*/
- private static final String STATUS_COLOR = "#FFCC33";
+ protected static final String STATUS_COLOR = "#FFCC33";
/**
* Alpha value for transparency (255 = not transparent)
*/
- private static final int ALPHA = 80;
+ public static final int CHAT_ALPHA = 80;
/**
* This will be a chat that will be connected to {this} and will handle
* redirected messages; Mostly used to redirect user messages to another
* window.
*/
- private ChatPanel connectedChat;
+ protected ChatPanelBasic connectedChat;
/**
* Parent chat this chat connected to. Used to send messages using parent
* chat as it is the only one connected to server.
*/
- private ChatPanel parentChatRef;
+ protected ChatPanelBasic parentChatRef;
/**
* Selected extended view mode.
*/
- private VIEW_MODE extendedViewMode = VIEW_MODE.NONE;
+ protected VIEW_MODE extendedViewMode = VIEW_MODE.NONE;
public enum VIEW_MODE {
@@ -120,57 +103,31 @@ public class ChatPanel extends javax.swing.JPanel {
* Controls the output start messages as the chat panel is created
*
*/
- private ChatType chatType = ChatType.DEFAULT;
-
- private static final int[] defaultColumnsWidth = {20, 100, 100, 80, 80};
+ protected ChatType chatType = ChatType.DEFAULT;
public enum ChatType {
DEFAULT, GAME, TABLES, TOURNAMENT
}
- private boolean startMessageDone = false;
+ protected boolean startMessageDone = false;
/**
- * Creates new form ChatPanel
- */
- public ChatPanel() {
- this(false);
- }
-
- /**
- * @param addPlayersTab if true, adds chat/players tabs
- */
- /**
+ *
* Creates new form ChatPanel
*
- * @param addPlayersTab
*/
- public ChatPanel(boolean addPlayersTab) {
- userTableModel = new UserTableModel();
+ public ChatPanelBasic() {
initComponents();
- setBackground(new Color(0, 0, 0, ALPHA));
- jTablePlayers.setBackground(new Color(0, 0, 0, ALPHA));
- jTablePlayers.setForeground(Color.white);
- jTablePlayers.setRowSorter(new MageTableRowSorter(userTableModel));
-
- TableUtil.setColumnWidthAndOrder(jTablePlayers, defaultColumnsWidth, KEY_USERS_COLUMNS_WIDTH, KEY_USERS_COLUMNS_ORDER);
- jTablePlayers.setDefaultRenderer(Icon.class, new CountryCellRenderer());
+ setBackground(new Color(0, 0, 0, CHAT_ALPHA));
if (jScrollPaneTxt != null) {
- jScrollPaneTxt.setBackground(new Color(0, 0, 0, ALPHA));
- jScrollPaneTxt.getViewport().setBackground(new Color(0, 0, 0, ALPHA));
- }
- if (jScrollPanePlayers != null) {
- jScrollPanePlayers.setBackground(new Color(0, 0, 0, ALPHA));
- jScrollPanePlayers.getViewport().setBackground(new Color(0, 0, 0, ALPHA));
- }
- if (!addPlayersTab) {
- simplifyComponents();
+ jScrollPaneTxt.setBackground(new Color(0, 0, 0, CHAT_ALPHA));
+ jScrollPaneTxt.getViewport().setBackground(new Color(0, 0, 0, CHAT_ALPHA));
}
}
public void cleanUp() {
- TableUtil.saveColumnWidthAndOrderToPrefs(jTablePlayers, KEY_USERS_COLUMNS_WIDTH, KEY_USERS_COLUMNS_ORDER);
+
}
public ChatType getChatType() {
@@ -254,7 +211,7 @@ public class ChatPanel extends javax.swing.JPanel {
this.txtConversation.append(text.toString());
}
- private String getColoredText(String color, String text) {
+ protected String getColoredText(String color, String text) {
StringBuilder sb = new StringBuilder();
sb.append(" choices;
diff --git a/Mage.Client/src/main/java/mage/client/constants/Constants.java b/Mage.Client/src/main/java/mage/client/constants/Constants.java
index 969a9654c67..1ea8c4a1e9d 100644
--- a/Mage.Client/src/main/java/mage/client/constants/Constants.java
+++ b/Mage.Client/src/main/java/mage/client/constants/Constants.java
@@ -1,31 +1,30 @@
/*
-* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification, are
-* permitted provided that the following conditions are met:
-*
-* 1. Redistributions of source code must retain the above copyright notice, this list of
-* conditions and the following disclaimer.
-*
-* 2. Redistributions in binary form must reproduce the above copyright notice, this list
-* of conditions and the following disclaimer in the documentation and/or other materials
-* provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
-* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The views and conclusions contained in the software and documentation are those of the
-* authors and should not be interpreted as representing official policies, either expressed
-* or implied, of BetaSteward_at_googlemail.com.
-*/
-
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
package mage.client.constants;
import java.io.File;
@@ -37,6 +36,7 @@ import javax.swing.border.Border;
* @author BetaSteward_at_googlemail.com
*/
public final class Constants {
+
private Constants() {
throw new AssertionError();
}
@@ -69,7 +69,7 @@ public final class Constants {
public static final int POWBOX_TEXT_MAX_LEFT = 212;
public static final int DAMAGE_MAX_LEFT = 180;
- public static final Border EMPTY_BORDER = BorderFactory.createEmptyBorder(2,2,2,2);
+ public static final Border EMPTY_BORDER = BorderFactory.createEmptyBorder(2, 2, 2, 2);
public static final double SCALE_FACTOR = 0.5;
@@ -80,26 +80,29 @@ public final class Constants {
public static final String RESOURCE_PATH_SET = IO.imageBaseDir + "sets" + File.separator;
public static final String RESOURCE_PATH_SET_SMALL = RESOURCE_PATH_SET + File.separator + "small" + File.separator;
public static final String BASE_SOUND_PATH = "sounds" + File.separator;
- public static final String BASE_MUSICS_PATH = "music" + File.separator ;
-
+ public static final String BASE_MUSICS_PATH = "music" + File.separator;
+
public interface IO {
+
String imageBaseDir = "plugins" + File.separator + "images" + File.separator;
String IMAGE_PROPERTIES_FILE = "image.url.properties";
}
public enum DeckEditorMode {
+
FREE_BUILDING,
LIMITED_BUILDING,
SIDEBOARDING
}
public enum SortBy {
- CASTING_COST ("Casting Cost"),
- RARITY ("Rarity"),
- COLOR ("Color"),
- COLOR_DETAILED ("Color Detailed"),
- NAME ("Name"),
- UNSORTED ("Unsorted");
+
+ CASTING_COST("Casting Cost"),
+ RARITY("Rarity"),
+ COLOR("Color"),
+ COLOR_IDENTITY("Color Identity"),
+ NAME("Name"),
+ UNSORTED("Unsorted");
private final String text;
@@ -120,8 +123,8 @@ public final class Constants {
return RARITY;
case "Color":
return COLOR;
- case "Color Detailed":
- return COLOR_DETAILED;
+ case "Color Identity":
+ return COLOR_IDENTITY;
case "Name":
return NAME;
default:
diff --git a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java
index 2a7d8570191..67429dd5e8c 100644
--- a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java
+++ b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java
@@ -27,21 +27,24 @@
*/
package mage.client.deck.generator;
-import java.util.*;
-
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
import mage.cards.Card;
import mage.cards.decks.Deck;
import mage.cards.repository.CardCriteria;
import mage.cards.repository.CardInfo;
import mage.cards.repository.CardRepository;
-import mage.cards.repository.ExpansionInfo;
import mage.cards.repository.ExpansionRepository;
import mage.client.dialog.PreferencesDialog;
import mage.client.util.sets.ConstructedFormats;
import mage.constants.CardType;
import mage.constants.ColoredManaSymbol;
import mage.constants.Rarity;
-
+import mage.util.TournamentUtil;
/**
* Generates random card pool and builds a deck.
@@ -57,6 +60,7 @@ public class DeckGenerator {
/**
* Builds a deck out of the selected block/set/format.
+ *
* @return a path to the generated deck.
*/
public static String generateDeck() {
@@ -70,7 +74,6 @@ public class DeckGenerator {
return PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TABLE_DECK_FILE, null);
}
-
protected static Deck buildDeck() {
String selectedColors = genDialog.getSelectedColors();
@@ -100,6 +103,7 @@ public class DeckGenerator {
/**
* If the user has selected random colors, pick them randomly for the user.
+ *
* @param selectedColors a string of the colors selected.
* @return a String representation of the new colors chosen.
*/
@@ -130,9 +134,10 @@ public class DeckGenerator {
}
/**
- * Generates all the cards to use in the deck.
- * Adds creatures, non-creatures, lands (including non-basic).
- * Fixes the deck, adjusting for size and color of the cards retrieved.
+ * Generates all the cards to use in the deck. Adds creatures,
+ * non-creatures, lands (including non-basic). Fixes the deck, adjusting for
+ * size and color of the cards retrieved.
+ *
* @param deckSize how big the deck is to generate.
* @param allowedColors which colors are allowed in the deck.
* @param setsToUse which sets to use to retrieve cards for this deck.
@@ -148,16 +153,18 @@ public class DeckGenerator {
creatureCriteria.setCodes(sets);
creatureCriteria.notTypes(CardType.LAND);
creatureCriteria.types(CardType.CREATURE);
- if (!(genDialog.useArtifacts()))
+ if (!(genDialog.useArtifacts())) {
creatureCriteria.notTypes(CardType.ARTIFACT);
+ }
// Non-creatures (sorcery, instant, enchantment, artifact etc.)
final CardCriteria nonCreatureCriteria = new CardCriteria();
nonCreatureCriteria.setCodes(sets);
nonCreatureCriteria.notTypes(CardType.LAND);
nonCreatureCriteria.notTypes(CardType.CREATURE);
- if (!(genDialog.useArtifacts()))
+ if (!(genDialog.useArtifacts())) {
nonCreatureCriteria.notTypes(CardType.ARTIFACT);
+ }
// Non-basic land
final CardCriteria nonBasicLandCriteria = new CardCriteria();
@@ -176,15 +183,18 @@ public class DeckGenerator {
return genPool.getDeck();
}
-
/**
- * Generates all spells for the deck.
- * Each card is retrieved from the database and checked against the converted mana cost (CMC) needed for the current card pool.
- * If a card's CMC matches the CMC range required by the pool, it is added to the deck.
- * This ensures that the majority of cards fit a fixed mana curve for the deck, and it is playable.
- * Creatures and non-creatures are retrieved separately to ensure the deck contains a reasonable mix of both.
+ * Generates all spells for the deck. Each card is retrieved from the
+ * database and checked against the converted mana cost (CMC) needed for the
+ * current card pool. If a card's CMC matches the CMC range required by the
+ * pool, it is added to the deck. This ensures that the majority of cards
+ * fit a fixed mana curve for the deck, and it is playable. Creatures and
+ * non-creatures are retrieved separately to ensure the deck contains a
+ * reasonable mix of both.
+ *
* @param criteria the criteria to search for in the database.
- * @param spellCount the number of spells that match the criteria needed in the deck.
+ * @param spellCount the number of spells that match the criteria needed in
+ * the deck.
*/
private static void generateSpells(CardCriteria criteria, int spellCount) {
List cardPool = CardRepository.instance.findCards(criteria);
@@ -211,8 +221,9 @@ public class DeckGenerator {
} else {
if (reservesAdded < (genPool.getDeckSize() / 2)) {
added = genPool.tryAddReserve(card, cardCMC);
- if(added)
+ if (added) {
reservesAdded++;
+ }
}
}
}
@@ -230,11 +241,13 @@ public class DeckGenerator {
}
/**
- * Generates all the lands for the deck.
- * Generates non-basic if selected by the user and if the deck isn't monocolored.
- * Will fetch non-basic lands if required and then fill up the remaining space with basic lands.
- * Basic lands are adjusted according to the mana symbols seen in the cards used in this deck.
- * Usually the lands will be well balanced relative to the color of cards.
+ * Generates all the lands for the deck. Generates non-basic if selected by
+ * the user and if the deck isn't monocolored. Will fetch non-basic lands if
+ * required and then fill up the remaining space with basic lands. Basic
+ * lands are adjusted according to the mana symbols seen in the cards used
+ * in this deck. Usually the lands will be well balanced relative to the
+ * color of cards.
+ *
* @param criteria the criteria of the lands to search for in the database.
* @param landsCount the amount of lands required for this deck.
* @param basicLands information about the basic lands from the sets used.
@@ -280,47 +293,13 @@ public class DeckGenerator {
/**
* Returns a map of colored mana symbol to basic land cards of that color.
+ *
* @param setsToUse which sets to retrieve basic lands from.
* @return a map of color to basic lands.
*/
private static Map> generateBasicLands(List setsToUse) {
- List landSets = new LinkedList<>();
-
- // decide from which sets basic lands are taken from
- for (String setCode :setsToUse) {
- ExpansionInfo expansionInfo = ExpansionRepository.instance.getSetByCode(setCode);
- if (expansionInfo.hasBasicLands()) {
- landSets.add(expansionInfo.getCode());
- }
- }
-
- // if sets have no basic land, take land from block
- if (landSets.isEmpty()) {
- for (String setCode :setsToUse) {
- ExpansionInfo expansionInfo = ExpansionRepository.instance.getSetByCode(setCode);
- List blockSets = ExpansionRepository.instance.getSetsFromBlock(expansionInfo.getBlockName());
- for (ExpansionInfo blockSet: blockSets) {
- if (blockSet.hasBasicLands()) {
- landSets.add(blockSet.getCode());
- }
- }
- }
- }
- // if still no set with lands found, take one by random
- if (landSets.isEmpty()) {
- // if sets have no basic lands and also it has no parent or parent has no lands get last set with lands
- // select a set with basic lands by random
- Random generator = new Random();
- List basicLandSets = ExpansionRepository.instance.getSetsWithBasicLandsByReleaseDate();
- if (basicLandSets.size() > 0) {
- landSets.add(basicLandSets.get(generator.nextInt(basicLandSets.size())).getCode());
- }
- }
-
- if (landSets.isEmpty()) {
- throw new IllegalArgumentException("No set with basic land was found");
- }
+ Set landSets = TournamentUtil.getLandSetCodeForDeckSets(setsToUse);
CardCriteria criteria = new CardCriteria();
if (!landSets.isEmpty()) {
@@ -329,7 +308,7 @@ public class DeckGenerator {
Map> basicLandMap = new HashMap<>();
- for(ColoredManaSymbol c: ColoredManaSymbol.values()) {
+ for (ColoredManaSymbol c : ColoredManaSymbol.values()) {
String landName = DeckGeneratorPool.getBasicLandName(c.toString());
criteria.rarities(Rarity.LAND).name(landName);
List cards = CardRepository.instance.findCards(criteria);
@@ -339,11 +318,14 @@ public class DeckGenerator {
}
/**
- * Once any non-basic lands are added, add basic lands until the deck is filled.
+ * Once any non-basic lands are added, add basic lands until the deck is
+ * filled.
+ *
* @param landsNeeded how many remaining lands are needed.
* @param percentage the percentage needed for each color in the final deck.
* @param count how many of each color can be produced by non-basic lands.
- * @param basicLands list of information about basic lands from the database.
+ * @param basicLands list of information about basic lands from the
+ * database.
*/
private static void addBasicLands(int landsNeeded, Map percentage, Map count, Map> basicLands) {
int colorTotal = 0;
@@ -369,8 +351,9 @@ public class DeckGenerator {
int currentCount = count.get(color.toString());
double thisPercentage = 0.0;
// Calculate the percentage of lands so far that produce this color
- if (currentCount > 0)
+ if (currentCount > 0) {
thisPercentage = (currentCount / (double) colorTotal) * 100.0;
+ }
// Check if the color is the most "needed" (highest percentage) we have seen so far
if (neededPercentage - thisPercentage > minPercentage) {
// Put this color land forward to be added
@@ -378,7 +361,7 @@ public class DeckGenerator {
minPercentage = (neededPercentage - thisPercentage);
}
}
- if(colorToAdd != null) {
+ if (colorToAdd != null) {
genPool.addCard(getBasicLand(colorToAdd, basicLands));
count.put(colorToAdd.toString(), count.get(colorToAdd.toString()) + 1);
colorTotal++;
@@ -389,15 +372,17 @@ public class DeckGenerator {
/**
* Return a random basic land of the chosen color.
+ *
* @param color the color the basic land should produce.
- * @param basicLands list of information about basic lands from the database.
+ * @param basicLands list of information about basic lands from the
+ * database.
* @return a single basic land that produces the color needed.
*/
private static Card getBasicLand(ColoredManaSymbol color, Map> basicLands) {
Random random = new Random();
String landName = DeckGeneratorPool.getBasicLandName(color.toString());
- return basicLands.get(landName).get(random.nextInt(basicLands.size() - 1)).getMockCard().copy();
+ List basicLandsInfo = basicLands.get(landName);
+ return basicLandsInfo.get(random.nextInt(basicLandsInfo.size() - 1)).getMockCard().copy();
}
-
}
diff --git a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorPool.java b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorPool.java
index d45838990ee..3e92fef086e 100644
--- a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorPool.java
+++ b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorPool.java
@@ -385,6 +385,12 @@ public class DeckGeneratorPool
if(spellSize < nonLandSize) {
int spellsNeeded = nonLandSize-spellSize;
+
+ // If we haven't got enough spells in reserve to fulfil the amount we need, we can't continue.
+ if(reserveSpells.size() < spellsNeeded) {
+ throw new IllegalStateException("Not enough cards found to generate deck. Please try again");
+ }
+
List spellsToAdd = new ArrayList<>(spellsNeeded);
// Initial reservoir
@@ -401,7 +407,6 @@ public class DeckGeneratorPool
// Add randomly selected spells needed
deckCards.addAll(spellsToAdd);
}
-
// More spells than needed
else if(spellSize > (deckSize - landCount)) {
@@ -410,8 +415,11 @@ public class DeckGeneratorPool
deckCards.remove(random.nextInt(deckCards.size()));
}
}
- if(deckCards.size() != nonLandSize)
+
+ // Not strictly necessary as we check when adding cards, but worth double checking anyway.
+ if(deckCards.size() != nonLandSize) {
throw new IllegalStateException("Not enough cards found to generate deck. Please try again");
+ }
// Return the fixed amount
return deckCards;
diff --git a/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java b/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java
index f198e866d29..9b25eea3712 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java
@@ -57,7 +57,7 @@ public class AddLandDialog extends MageDialog {
private static final Logger logger = Logger.getLogger(MageDialog.class);
private Deck deck;
- private final Set setCodesland = new HashSet<>();
+ private final Set landSetCodes = new HashSet<>();
private static final int DEFAULT_SEALED_DECK_CARD_NUMBER = 40;
@@ -71,27 +71,27 @@ public class AddLandDialog extends MageDialog {
public void showDialog(Deck deck, DeckEditorMode mode) {
this.deck = deck;
- SortedSet landSets = new TreeSet<>();
+ SortedSet landSetNames = new TreeSet<>();
if (!mode.equals(DeckEditorMode.FREE_BUILDING)) {
// decide from which sets basic lands are taken from
for (String setCode : deck.getExpansionSetCodes()) {
ExpansionInfo expansionInfo = ExpansionRepository.instance.getSetByCode(setCode);
if (expansionInfo != null && expansionInfo.hasBasicLands()) {
- this.setCodesland.add(expansionInfo.getCode());
- landSets.add(expansionInfo.getName());
+ this.landSetCodes.add(expansionInfo.getCode());
+ landSetNames.add(expansionInfo.getName());
}
}
// if sets have no basic land, take land from block
- if (this.setCodesland.isEmpty()) {
+ if (this.landSetCodes.isEmpty()) {
for (String setCode : deck.getExpansionSetCodes()) {
ExpansionInfo expansionInfo = ExpansionRepository.instance.getSetByCode(setCode);
if (expansionInfo != null) {
List blockSets = ExpansionRepository.instance.getSetsFromBlock(expansionInfo.getBlockName());
for (ExpansionInfo blockSet : blockSets) {
if (blockSet.hasBasicLands()) {
- this.setCodesland.add(blockSet.getCode());
- landSets.add(blockSet.getName());
+ this.landSetCodes.add(blockSet.getCode());
+ landSetNames.add(blockSet.getName());
}
}
}
@@ -99,19 +99,19 @@ public class AddLandDialog extends MageDialog {
}
}
// if still no set with lands found, add list of all available
- if (this.setCodesland.isEmpty()) {
+ if (this.landSetCodes.isEmpty()) {
List basicLandSets = ExpansionRepository.instance.getSetsWithBasicLandsByReleaseDate();
for (ExpansionInfo expansionInfo : basicLandSets) {
- landSets.add(expansionInfo.getName());
+ landSetNames.add(expansionInfo.getName());
}
}
- if (landSets.isEmpty()) {
+ if (landSetNames.isEmpty()) {
throw new IllegalArgumentException("No set with basic land was found");
}
- if (landSets.size() > 1) {
- landSets.add("");
+ if (landSetNames.size() > 1) {
+ landSetNames.add("");
}
- cbLandSet.setModel(new DefaultComboBoxModel(landSets.toArray()));
+ cbLandSet.setModel(new DefaultComboBoxModel(landSetNames.toArray()));
MageFrame.getDesktop().add(this, JLayeredPane.PALETTE_LAYER);
this.setVisible(true);
@@ -123,7 +123,7 @@ public class AddLandDialog extends MageDialog {
CardCriteria criteria = new CardCriteria();
if (landSetName.equals("")) {
- criteria.setCodes(setCodesland.toArray(new String[setCodesland.size()]));
+ criteria.setCodes(landSetCodes.toArray(new String[landSetCodes.size()]));
} else {
ExpansionInfo expansionInfo = ExpansionRepository.instance.getSetByName(landSetName);
if (expansionInfo == null) {
diff --git a/Mage.Client/src/main/java/mage/client/dialog/CardInfoWindowDialog.java b/Mage.Client/src/main/java/mage/client/dialog/CardInfoWindowDialog.java
index 284852f6c0b..59b6a23fa66 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/CardInfoWindowDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/CardInfoWindowDialog.java
@@ -36,8 +36,6 @@ package mage.client.dialog;
import java.awt.Point;
import java.beans.PropertyVetoException;
import java.util.UUID;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.SwingUtilities;
import javax.swing.event.InternalFrameAdapter;
@@ -50,6 +48,7 @@ import mage.client.util.gui.GuiDisplayUtil;
import mage.view.CardsView;
import mage.view.ExileView;
import mage.view.SimpleCardsView;
+import org.apache.log4j.Logger;
import org.mage.plugins.card.utils.impl.ImageManagerImpl;
/**
@@ -58,6 +57,8 @@ import org.mage.plugins.card.utils.impl.ImageManagerImpl;
*/
public class CardInfoWindowDialog extends MageDialog {
+ private static final Logger logger = Logger.getLogger(CardInfoWindowDialog.class);
+
public static enum ShowType {
REVEAL, REVEAL_TOP_LIBRARY, LOOKED_AT, EXILE, GRAVEYARD, OTHER
@@ -123,7 +124,7 @@ public class CardInfoWindowDialog extends MageDialog {
try {
this.setIcon(false);
} catch (PropertyVetoException ex) {
- Logger.getLogger(CardInfoWindowDialog.class.getName()).log(Level.SEVERE, null, ex);
+ logger.error(null, ex);
}
}
} else {
diff --git a/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java b/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java
index 0eec9111ea9..ba8cbb2bf65 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java
@@ -1,46 +1,39 @@
/*
-* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification, are
-* permitted provided that the following conditions are met:
-*
-* 1. Redistributions of source code must retain the above copyright notice, this list of
-* conditions and the following disclaimer.
-*
-* 2. Redistributions in binary form must reproduce the above copyright notice, this list
-* of conditions and the following disclaimer in the documentation and/or other materials
-* provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
-* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The views and conclusions contained in the software and documentation are those of the
-* authors and should not be interpreted as representing official policies, either expressed
-* or implied, of BetaSteward_at_googlemail.com.
-*/
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
/*
* ConnectDialog.java
*
* Created on 20-Jan-2010, 9:37:07 PM
*/
-
package mage.client.dialog;
-import mage.client.MageFrame;
-import mage.client.util.Config;
-import mage.remote.Connection;
-import org.apache.log4j.Logger;
-
-import javax.swing.*;
-import java.awt.*;
+import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
@@ -63,10 +56,17 @@ import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import javax.swing.JOptionPane;
+import javax.swing.SwingWorker;
+import mage.client.MageFrame;
+import static mage.client.dialog.PreferencesDialog.KEY_CONNECTION_URL_SERVER_LIST;
import static mage.client.dialog.PreferencesDialog.KEY_CONNECT_AUTO_CONNECT;
import static mage.client.dialog.PreferencesDialog.KEY_CONNECT_FLAG;
+import mage.client.util.Config;
import mage.client.util.gui.countryBox.CountryItemEditor;
+import mage.remote.Connection;
import mage.remote.Connection.ProxyType;
+import org.apache.log4j.Logger;
/**
* @author BetaSteward_at_googlemail.com
@@ -101,11 +101,11 @@ public class ConnectDialog extends MageDialog {
this.txtUserName.setText(MageFrame.getPreferences().get("userName", ""));
this.chkAutoConnect.setSelected(Boolean.parseBoolean(MageFrame.getPreferences().get(KEY_CONNECT_AUTO_CONNECT, "false")));
this.chkForceUpdateDB.setSelected(false); // has always to be set manually to force comparison
-
+
String selectedFlag = MageFrame.getPreferences().get(KEY_CONNECT_FLAG, "world");
// set the selected country/flag
for (int i = 0; i < cbFlag.getItemCount(); i++) {
- String[] name = (String[])cbFlag.getItemAt(i);
+ String[] name = (String[]) cbFlag.getItemAt(i);
if (name[1].equals(selectedFlag)) {
cbFlag.setSelectedIndex(i);
break;
@@ -124,10 +124,9 @@ public class ConnectDialog extends MageDialog {
}
/**
- * This method is called from within the constructor to
- * initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is
- * always regenerated by the Form Editor.
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
@@ -293,7 +292,7 @@ public class ConnectDialog extends MageDialog {
private void btnCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelActionPerformed
MageFrame.getPreferences().put("autoConnect", Boolean.toString(chkAutoConnect.isSelected()));
- MageFrame.getPreferences().put(KEY_CONNECT_FLAG, ((CountryItemEditor)cbFlag.getEditor()).getImageItem());
+ MageFrame.getPreferences().put(KEY_CONNECT_FLAG, ((CountryItemEditor) cbFlag.getEditor()).getImageItem());
if (task != null && !task.isDone()) {
task.cancel(true);
} else {
@@ -329,7 +328,7 @@ public class ConnectDialog extends MageDialog {
connection.setPort(Integer.valueOf(this.txtPort.getText().trim()));
connection.setUsername(this.txtUserName.getText().trim());
connection.setForceDBComparison(this.chkForceUpdateDB.isSelected());
- MageFrame.getPreferences().put(KEY_CONNECT_FLAG, ((CountryItemEditor)cbFlag.getEditor()).getImageItem());
+ MageFrame.getPreferences().put(KEY_CONNECT_FLAG, ((CountryItemEditor) cbFlag.getEditor()).getImageItem());
ProxyType configProxyType = Connection.ProxyType.valueByText(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_PROXY_TYPE, "None"));
@@ -354,8 +353,8 @@ public class ConnectDialog extends MageDialog {
}
// pref settings
- MageFrame.getInstance().setUserPrefsToConnection(connection);
-
+ MageFrame.getInstance().setUserPrefsToConnection(connection);
+
logger.debug("connecting: " + connection.getProxyType() + " " + connection.getProxyHost() + " " + connection.getProxyPort());
task = new ConnectTask();
task.execute();
@@ -385,7 +384,7 @@ public class ConnectDialog extends MageDialog {
get(CONNECTION_TIMEOUT_MS, TimeUnit.MILLISECONDS);
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
if (result) {
- lblStatus.setText("");
+ lblStatus.setText("");
connected();
MageFrame.getInstance().showGames(false);
} else {
@@ -412,7 +411,6 @@ public class ConnectDialog extends MageDialog {
this.hideDialog();
}
-
private void keyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_keyTyped
char c = evt.getKeyChar();
if (!Character.isDigit(c)) {
@@ -428,8 +426,12 @@ public class ConnectDialog extends MageDialog {
private void findPublicServerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
BufferedReader in = null;
try {
-
- URL serverListURL = new URL(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CONNECTION_URL_SERVER_LIST, "http://xmage.de/files/server-list.txt"));
+ String serverUrl = PreferencesDialog.getCachedValue(KEY_CONNECTION_URL_SERVER_LIST, "http://xmage.de/files/server-list.txt");
+ if (serverUrl.contains("xmage.info/files/")) {
+ serverUrl = serverUrl.replace("xmage.info/files/", "xmage.de/files/"); // replace old URL if still saved
+ PreferencesDialog.saveValue(KEY_CONNECTION_URL_SERVER_LIST, serverUrl);
+ }
+ URL serverListURL = new URL(serverUrl);
Connection.ProxyType configProxyType = Connection.ProxyType.valueByText(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_PROXY_TYPE, "None"));
Proxy p = null;
@@ -465,12 +467,12 @@ public class ConnectDialog extends MageDialog {
boolean URLNotFound = false;
try {
in = new BufferedReader(new InputStreamReader(serverListURL.openConnection(p).getInputStream()));
- } catch (SocketTimeoutException |FileNotFoundException | UnknownHostException ex ) {
+ } catch (SocketTimeoutException | FileNotFoundException | UnknownHostException ex) {
logger.warn("Could not read serverlist from: " + serverListURL.toString());
File f = new File("serverlist.txt");
if (f.exists() && !f.isDirectory()) {
logger.info("Using buffered serverlist: serverlist.txt");
- URLNotFound = true;
+ URLNotFound = true;
in = new BufferedReader(new FileReader("serverlist.txt"));
}
}
@@ -518,7 +520,7 @@ public class ConnectDialog extends MageDialog {
JOptionPane.showMessageDialog(null, "Wrong server data format.");
}
}
-
+
} catch (Exception ex) {
logger.error(ex, ex);
} finally {
@@ -539,7 +541,6 @@ public class ConnectDialog extends MageDialog {
// TODO add your handling code here:
}//GEN-LAST:event_chkForceUpdateDBActionPerformed
-
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnCancel;
private javax.swing.JButton btnConnect;
diff --git a/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.java b/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.java
index dc3c892658e..dfe0a233092 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.java
@@ -40,7 +40,7 @@ import javax.swing.*;
*/
public class FeedbackDialog extends javax.swing.JDialog {
- private static final transient Logger log = Logger.getLogger(PreferencesDialog.class);
+ private static final Logger log = Logger.getLogger(PreferencesDialog.class);
private String[] feedbackTypes = {"", "Bug or \"something doesn't work\"",
"Feature or \"I need that function\"",
diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java
index 9f0dd4a6494..71135fc7983 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java
@@ -1,30 +1,30 @@
/*
-* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification, are
-* permitted provided that the following conditions are met:
-*
-* 1. Redistributions of source code must retain the above copyright notice, this list of
-* conditions and the following disclaimer.
-*
-* 2. Redistributions in binary form must reproduce the above copyright notice, this list
-* of conditions and the following disclaimer in the documentation and/or other materials
-* provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
-* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The views and conclusions contained in the software and documentation are those of the
-* authors and should not be interpreted as representing official policies, either expressed
-* or implied, of BetaSteward_at_googlemail.com.
-*/
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
package mage.client.dialog;
import java.io.FileNotFoundException;
@@ -71,7 +71,9 @@ public class NewTableDialog extends MageDialog {
private static final String LIMITED = "Limited";
- /** Creates new form NewTableDialog */
+ /**
+ * Creates new form NewTableDialog
+ */
public NewTableDialog() {
session = MageFrame.getSession();
lastSessionId = "";
@@ -79,13 +81,13 @@ public class NewTableDialog extends MageDialog {
player1Panel.showLevel(false);
this.spnNumWins.setModel(new SpinnerNumberModel(1, 1, 5, 1));
this.spnFreeMulligans.setModel(new SpinnerNumberModel(0, 0, 5, 1));
- MageFrame.getUI().addButton(MageComponents.NEW_TABLE_OK_BUTTON, btnOK);
+ MageFrame.getUI().addButton(MageComponents.NEW_TABLE_OK_BUTTON, btnOK);
}
- /** This method is called from within the constructor to
- * initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is
- * always regenerated by the Form Editor.
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
@@ -361,7 +363,7 @@ public class NewTableDialog extends MageDialog {
GameTypeView gameType = (GameTypeView) cbGameType.getSelectedItem();
MatchOptions options = new MatchOptions(this.txtName.getText(), gameType.getName());
options.getPlayerTypes().add("Human");
- for (TablePlayerPanel player: players) {
+ for (TablePlayerPanel player : players) {
options.getPlayerTypes().add(player.getPlayerType());
}
options.setDeckType((String) this.cbDeckType.getSelectedItem());
@@ -370,9 +372,9 @@ public class NewTableDialog extends MageDialog {
options.setAttackOption((MultiplayerAttackOption) this.cbAttackOption.getSelectedItem());
options.setSkillLevel((SkillLevel) this.cbSkillLevel.getSelectedItem());
options.setRange((RangeOfInfluence) this.cbRange.getSelectedItem());
- options.setWinsNeeded((Integer)this.spnNumWins.getValue());
+ options.setWinsNeeded((Integer) this.spnNumWins.getValue());
options.setRollbackTurnsAllowed(chkRollbackTurnsAllowed.isSelected());
- options.setFreeMulligans((Integer)this.spnFreeMulligans.getValue());
+ options.setFreeMulligans((Integer) this.spnFreeMulligans.getValue());
options.setPassword(this.txtPassword.getText());
if (!checkMatchOptions(options)) {
return;
@@ -391,9 +393,8 @@ public class NewTableDialog extends MageDialog {
this.player1Panel.getPlayerName(),
"Human", 1,
DeckImporterUtil.importDeck(this.player1Panel.getDeckFile()),
- this.txtPassword.getText())
- ) {
- for (TablePlayerPanel player: players) {
+ this.txtPassword.getText())) {
+ for (TablePlayerPanel player : players) {
if (!player.getPlayerType().equals("Human")) {
if (!player.joinTable(roomId, table.getTableId())) {
// error message must be send by the server
@@ -423,7 +424,7 @@ public class NewTableDialog extends MageDialog {
}//GEN-LAST:event_cbGameTypeActionPerformed
private void numPlayersChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_numPlayersChanged
- int numPlayers = (Integer)this.spnNumPlayers.getValue() - 1;
+ int numPlayers = (Integer) this.spnNumPlayers.getValue() - 1;
createPlayers(numPlayers);
}//GEN-LAST:event_numPlayersChanged
@@ -432,9 +433,10 @@ public class NewTableDialog extends MageDialog {
}//GEN-LAST:event_spnNumWinsnumPlayersChanged
/**
- * Checks about not valid game option combinations and shows an error message
- *
- * @return
+ * Checks about not valid game option combinations and shows an error
+ * message
+ *
+ * @return
*/
private boolean checkMatchOptions(MatchOptions options) {
switch (options.getDeckType()) {
@@ -451,11 +453,17 @@ public class NewTableDialog extends MageDialog {
return false;
}
break;
+ case "Variant Magic - Momir Basic":
+ if (!options.getGameType().startsWith("Momir Basic")) {
+ JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Deck type Momir Basic needs also a Momir Basic game type", "Error", JOptionPane.ERROR_MESSAGE);
+ return false;
+ }
+ break;
}
switch (options.getGameType()) {
case "Commander Two Player Duel":
case "Commander Free For All":
- if (!options.getDeckType().equals("Variant Magic - Commander") && !options.getDeckType().equals("Variant Magic - Duel Commander") ) {
+ if (!options.getDeckType().equals("Variant Magic - Commander") && !options.getDeckType().equals("Variant Magic - Duel Commander")) {
JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Deck type Commander needs also a Commander game type", "Error", JOptionPane.ERROR_MESSAGE);
return false;
}
@@ -466,16 +474,16 @@ public class NewTableDialog extends MageDialog {
return false;
}
break;
- }
+ }
return true;
}
-
+
private void setGameOptions() {
GameTypeView gameType = (GameTypeView) cbGameType.getSelectedItem();
int oldValue = (Integer) this.spnNumPlayers.getValue();
this.spnNumPlayers.setModel(new SpinnerNumberModel(gameType.getMinPlayers(), gameType.getMinPlayers(), gameType.getMaxPlayers(), 1));
this.spnNumPlayers.setEnabled(gameType.getMinPlayers() != gameType.getMaxPlayers());
- if (oldValue >= gameType.getMinPlayers() && oldValue <= gameType.getMaxPlayers()){
+ if (oldValue >= gameType.getMinPlayers() && oldValue <= gameType.getMaxPlayers()) {
this.spnNumPlayers.setValue(oldValue);
}
this.cbAttackOption.setEnabled(gameType.isUseAttackOption());
@@ -495,17 +503,16 @@ public class NewTableDialog extends MageDialog {
playerPanel.init(players.size() + 2, playerType);
players.add(playerPanel);
playerPanel.addPlayerTypeEventListener(
- new Listener () {
- @Override
- public void event(Event event) {
- drawPlayers();
+ new Listener() {
+ @Override
+ public void event(Event event) {
+ drawPlayers();
+ }
}
- }
);
}
-
- }
- // remove player panels no longer needed
+
+ } // remove player panels no longer needed
else if (numPlayers < players.size()) {
while (players.size() != numPlayers) {
players.remove(players.size() - 1);
@@ -516,7 +523,7 @@ public class NewTableDialog extends MageDialog {
private void drawPlayers() {
this.pnlOtherPlayers.removeAll();
- for (TablePlayerPanel panel: players) {
+ for (TablePlayerPanel panel : players) {
this.pnlOtherPlayers.add(panel);
}
this.pack();
@@ -531,7 +538,7 @@ public class NewTableDialog extends MageDialog {
}
public void showDialog(UUID roomId) {
- this.roomId = roomId;
+ this.roomId = roomId;
if (!lastSessionId.equals(MageFrame.getSession().getSessionId())) {
lastSessionId = session.getSessionId();
this.player1Panel.setPlayerName(session.getUserName());
@@ -543,8 +550,8 @@ public class NewTableDialog extends MageDialog {
cbAttackOption.setModel(new DefaultComboBoxModel(MultiplayerAttackOption.values()));
cbSkillLevel.setModel(new DefaultComboBoxModel(SkillLevel.values()));
// Update the existing player panels (neccessary if server was changes = new session)
- int i=2;
- for (TablePlayerPanel tablePlayerPanel :players) {
+ int i = 2;
+ for (TablePlayerPanel tablePlayerPanel : players) {
tablePlayerPanel.init(i++, tablePlayerPanel.getPlayerType());
}
setGameSettingsFromPrefs();
@@ -565,7 +572,7 @@ public class NewTableDialog extends MageDialog {
private void selectLimitedByDefault() {
for (int i = 0; i < cbDeckType.getItemCount(); i++) {
- String name = (String)cbDeckType.getItemAt(i);
+ String name = (String) cbDeckType.getItemAt(i);
if (name.equals(LIMITED)) {
cbDeckType.setSelectedIndex(i);
break;
@@ -574,9 +581,9 @@ public class NewTableDialog extends MageDialog {
}
/**
- * set the table settings from java prefs
+ * set the table settings from java prefs
*/
- private void setGameSettingsFromPrefs () {
+ private void setGameSettingsFromPrefs() {
txtName.setText(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TABLE_NAME, "Game"));
txtPassword.setText(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TABLE_PASSWORD, ""));
@@ -585,7 +592,6 @@ public class NewTableDialog extends MageDialog {
prefPlayerTypes.addAll(Arrays.asList(playerTypes.split(",")));
this.spnNumPlayers.setValue(Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TABLE_NUMBER_PLAYERS, "2")));
-
String gameTypeName = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TABLE_GAME_TYPE, "Two Player Duel");
for (GameTypeView gtv : session.getGameTypes()) {
if (gtv.getName().equals(gameTypeName)) {
@@ -594,7 +600,7 @@ public class NewTableDialog extends MageDialog {
}
}
int timeLimit = Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TABLE_TIME_LIMIT, "1500"));
- for (MatchTimeLimit mtl :MatchTimeLimit.values()) {
+ for (MatchTimeLimit mtl : MatchTimeLimit.values()) {
if (mtl.getTimeLimit() == timeLimit) {
this.cbTimeLimit.setSelectedItem(mtl);
break;
@@ -608,32 +614,32 @@ public class NewTableDialog extends MageDialog {
this.spnNumWins.setValue(Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TABLE_NUMBER_OF_WINS, "2")));
this.chkRollbackTurnsAllowed.setSelected(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TABLE_ROLLBACK_TURNS_ALLOWED, "Yes").equals("Yes"));
-
int range = Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TABLE_RANGE, "1"));
- for (RangeOfInfluence roi :RangeOfInfluence.values()) {
+ for (RangeOfInfluence roi : RangeOfInfluence.values()) {
if (roi.getRange() == range) {
this.cbRange.setSelectedItem(roi);
break;
}
}
String attackOption = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TABLE_ATTACK_OPTION, "Attack Multiple Players");
- for (MultiplayerAttackOption mao :MultiplayerAttackOption.values()) {
+ for (MultiplayerAttackOption mao : MultiplayerAttackOption.values()) {
if (mao.toString().equals(attackOption)) {
this.cbAttackOption.setSelectedItem(mao);
break;
}
}
String skillLevelDefault = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TABLE_SKILL_LEVEL, "Casual");
- for (SkillLevel skillLevel :SkillLevel.values()) {
+ for (SkillLevel skillLevel : SkillLevel.values()) {
if (skillLevel.toString().equals(skillLevelDefault)) {
this.cbSkillLevel.setSelectedItem(skillLevel);
break;
}
- }
+ }
}
/**
- * Save the settings to java prefs to reload it next time the dialog will be created
+ * Save the settings to java prefs to reload it next time the dialog will be
+ * created
*
* @param options
* @param deckFile
@@ -645,7 +651,7 @@ public class NewTableDialog extends MageDialog {
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TABLE_TIME_LIMIT, Integer.toString(options.getPriorityTime()));
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TABLE_GAME_TYPE, options.getGameType());
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TABLE_NUMBER_OF_WINS, Integer.toString(options.getWinsNeeded()));
- PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TABLE_ROLLBACK_TURNS_ALLOWED, options.isRollbackTurnsAllowed() ? "Yes": "No");
+ PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TABLE_ROLLBACK_TURNS_ALLOWED, options.isRollbackTurnsAllowed() ? "Yes" : "No");
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TABLE_NUMBER_OF_FREE_MULLIGANS, Integer.toString(options.getFreeMulligans()));
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TABLE_DECK_FILE, deckFile);
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TABLE_NUMBER_PLAYERS, spnNumPlayers.getValue().toString());
@@ -655,7 +661,7 @@ public class NewTableDialog extends MageDialog {
StringBuilder playerTypesString = new StringBuilder();
ListIterator iterator = players.listIterator();
while (iterator.hasNext()) {
- if (playerTypesString.length()>0) {
+ if (playerTypesString.length() > 0) {
playerTypesString.append(",");
}
TablePlayerPanel tpp = (TablePlayerPanel) iterator.next();
diff --git a/Mage.Client/src/main/java/mage/client/dialog/PickPileDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PickPileDialog.java
index d2e63313b46..698e14ea6cb 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/PickPileDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/PickPileDialog.java
@@ -1,33 +1,41 @@
/*
-* Copyright 2012 BetaSteward_at_googlemail.com. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification, are
-* permitted provided that the following conditions are met:
-*
-* 1. Redistributions of source code must retain the above copyright notice, this list of
-* conditions and the following disclaimer.
-*
-* 2. Redistributions in binary form must reproduce the above copyright notice, this list
-* of conditions and the following disclaimer in the documentation and/or other materials
-* provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
-* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The views and conclusions contained in the software and documentation are those of the
-* authors and should not be interpreted as representing official policies, either expressed
-* or implied, of BetaSteward_at_googlemail.com.
-*/
-
+ * Copyright 2012 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
package mage.client.dialog;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.UUID;
+import javax.swing.JButton;
+import javax.swing.JLayeredPane;
+import javax.swing.JPanel;
import mage.cards.CardDimensions;
import mage.client.MageFrame;
import mage.client.cards.BigCard;
@@ -35,18 +43,12 @@ import mage.client.cards.CardArea;
import mage.client.util.SettingsManager;
import mage.client.util.gui.GuiDisplayUtil;
import mage.view.CardsView;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.UUID;
import org.mage.card.arcane.CardPanel;
/**
-*
-* @author BetaSteward_at_googlemail.com
-*/
+ *
+ * @author BetaSteward_at_googlemail.com
+ */
public class PickPileDialog extends MageDialog {
private final CardArea pile1;
@@ -94,24 +96,24 @@ public class PickPileDialog extends MageDialog {
}
public void cleanUp() {
- for(Component comp: pile1.getComponents()) {
- if (comp instanceof CardPanel) {
- ((CardPanel) comp).cleanUp();
- pile1.remove(comp);
- }
- }
- for(Component comp: pile2.getComponents()) {
- if (comp instanceof CardPanel) {
- ((CardPanel) comp).cleanUp();
- pile2.remove(comp);
- }
- }
+ for (Component comp : pile1.getComponents()) {
+ if (comp instanceof CardPanel) {
+ ((CardPanel) comp).cleanUp();
+ pile1.remove(comp);
+ }
+ }
+ for (Component comp : pile2.getComponents()) {
+ if (comp instanceof CardPanel) {
+ ((CardPanel) comp).cleanUp();
+ pile2.remove(comp);
+ }
+ }
}
-
+
public void loadCards(String name, CardsView pile1, CardsView pile2, BigCard bigCard, CardDimensions dimension, UUID gameId) {
this.title = name;
- this.pile1.loadCardsNarrow(pile1, bigCard, dimension, gameId, null);
- this.pile2.loadCardsNarrow(pile2, bigCard, dimension, gameId, null);
+ this.pile1.loadCardsNarrow(pile1, bigCard, dimension, gameId);
+ this.pile2.loadCardsNarrow(pile2, bigCard, dimension, gameId);
if (getParent() != MageFrame.getDesktop() /*|| this.isClosed*/) {
MageFrame.getDesktop().add(this, JLayeredPane.MODAL_LAYER);
diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form
index e35b22b89bd..8008ce940d9 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form
+++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form
@@ -25,13 +25,13 @@
-
+
-
+
@@ -69,8 +69,11 @@
-
+
+
+
+
@@ -82,8 +85,8 @@
-
-
+
+
@@ -200,18 +203,18 @@
-
-
+
-
-
-
+
+
+
+
-
+
@@ -231,7 +234,7 @@
-
+
@@ -333,16 +336,23 @@
-
+
-
+
+
+
+
-
+
+
+
+
+
@@ -357,6 +367,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -364,8 +384,8 @@
-
-
+
+
@@ -511,8 +531,8 @@
-
-
+
+
@@ -520,7 +540,7 @@
-
+
@@ -611,7 +631,7 @@
-
+
@@ -658,6 +678,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -674,11 +733,11 @@
-
+
-
-
+
+
@@ -713,29 +772,34 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
-
+
@@ -843,36 +907,37 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1150,120 +1215,54 @@
-
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
@@ -1273,41 +1272,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
+
@@ -1321,17 +1305,26 @@
+
+
+
+
+
+
+
+
+
-
+
-
+
@@ -1345,17 +1338,59 @@
+
+
+
+
+
+
+
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1369,17 +1404,26 @@
+
+
+
+
+
+
+
+
+
-
+
-
+
@@ -1393,29 +1437,30 @@
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
@@ -1425,17 +1470,26 @@
+
+
+
+
+
+
+
+
+
-
+
-
+
@@ -1449,17 +1503,26 @@
+
+
+
+
+
+
+
+
+
-
+
-
+
@@ -1473,17 +1536,26 @@
+
+
+
+
+
+
+
+
+
-
+
-
+
@@ -1497,17 +1569,26 @@
+
+
+
+
+
+
+
+
+
-
+
-
+
@@ -1521,17 +1602,26 @@
+
+
+
+
+
+
+
+
+
-
+
-
+
@@ -1545,17 +1635,419 @@
+
+
+
+
+
+
+
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1578,19 +2070,18 @@
-
+
-
-
+
+
+
-
-
-
+
-
+
@@ -1606,7 +2097,7 @@
-
+
@@ -1803,7 +2294,7 @@
-
+
@@ -1819,7 +2310,7 @@
-
+
diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java
index bd764f48ce6..2d464312ebe 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java
@@ -42,9 +42,7 @@ import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Map;
-import java.util.Set;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import javax.swing.BorderFactory;
@@ -63,6 +61,9 @@ import mage.client.MageFrame;
import mage.client.util.Config;
import mage.client.util.ImageHelper;
import mage.client.util.gui.BufferedImageBuilder;
+import static mage.constants.Constants.DEFAULT_AVATAR_ID;
+import static mage.constants.Constants.MAX_AVATAR_ID;
+import static mage.constants.Constants.MIN_AVATAR_ID;
import mage.players.net.UserData;
import mage.players.net.UserGroup;
import mage.players.net.UserSkipPrioritySteps;
@@ -77,7 +78,7 @@ import org.apache.log4j.Logger;
*/
public class PreferencesDialog extends javax.swing.JDialog {
- private static final transient Logger log = Logger.getLogger(PreferencesDialog.class);
+ private static final Logger log = Logger.getLogger(PreferencesDialog.class);
public static final String KEY_HAND_USE_BIG_CARDS = "handUseBigCards";
public static final String KEY_SHOW_TOOLTIPS_ANY_ZONE = "showTooltipsInAnyZone";
@@ -91,6 +92,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
public static final String KEY_GAME_ASK_MOVE_TO_GRAVE_ORDER = "gameAskMoveToGraveORder";
public static final String KEY_GAME_LOG_AUTO_SAVE = "gameLogAutoSave";
+ public static final String KEY_DRAFT_LOG_AUTO_SAVE = "draftLogAutoSave";
public static final String KEY_CARD_IMAGES_USE_DEFAULT = "cardImagesUseDefault";
public static final String KEY_CARD_IMAGES_PATH = "cardImagesPath";
@@ -134,6 +136,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
public static final String KEY_STOP_BLOCK = "stopDeclareBlockersStep";
public static final String KEY_STOP_ALL_MAIN_PHASES = "stopOnAllMainPhases";
public static final String KEY_STOP_ALL_END_PHASES = "stopOnAllEndPhases";
+ public static final String KEY_PASS_PRIORITY_CAST = "passPriorityCast";
+ public static final String KEY_PASS_PRIORITY_ACTIVATION = "passPriorityActivation";
+ public static final String KEY_AUTO_ORDER_TRIGGER = "autoOrderTrigger";
// mana auto payment
public static final String KEY_GAME_MANA_AUTOPAYMENT = "gameManaAutopayment";
@@ -260,29 +265,12 @@ public class PreferencesDialog extends javax.swing.JDialog {
public static String PHASE_ON = "on";
public static String PHASE_OFF = "off";
- public static final int DEFAULT_AVATAR_ID = 51;
- private static int selectedAvatarId = DEFAULT_AVATAR_ID;
- private static final Set available_avatars = new HashSet<>();
private static final Map panels = new HashMap<>();
private static final Border GREEN_BORDER = BorderFactory.createLineBorder(Color.GREEN, 3);
private static final Border BLACK_BORDER = BorderFactory.createLineBorder(Color.BLACK, 3);
- static {
- available_avatars.add(51);
- available_avatars.add(13);
- available_avatars.add(9);
- available_avatars.add(53);
- available_avatars.add(10);
- available_avatars.add(39);
- available_avatars.add(19);
- available_avatars.add(30);
- available_avatars.add(25);
-
- available_avatars.add(22);
- available_avatars.add(77);
- available_avatars.add(62);
- }
+ private static int selectedAvatarId;
private final JFileChooser fc = new JFileChooser();
@@ -362,6 +350,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
cbAskMoveToGraveOrder = new javax.swing.JCheckBox();
main_gamelog = new javax.swing.JPanel();
cbGameLogAutoSave = new javax.swing.JCheckBox();
+ cbDraftLogAutoSave = new javax.swing.JCheckBox();
tabPhases = new javax.swing.JPanel();
jLabelHeadLine = new javax.swing.JLabel();
jLabelYourTurn = new javax.swing.JLabel();
@@ -392,6 +381,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
cbStopBlock = new javax.swing.JCheckBox();
cbStopOnAllMain = new javax.swing.JCheckBox();
cbStopOnAllEnd = new javax.swing.JCheckBox();
+ cbPassPriorityCast = new javax.swing.JCheckBox();
+ cbPassPriorityActivation = new javax.swing.JCheckBox();
+ cbAutoOrderTrigger = new javax.swing.JCheckBox();
tabImages = new javax.swing.JPanel();
panelCardImages = new javax.swing.JPanel();
cbUseDefaultImageFolder = new javax.swing.JCheckBox();
@@ -425,20 +417,30 @@ public class PreferencesDialog extends javax.swing.JDialog {
tabAvatars = new javax.swing.JPanel();
avatarPane = new javax.swing.JScrollPane();
avatarPanel = new javax.swing.JPanel();
- jLabel12 = new javax.swing.JLabel();
jPanel10 = new javax.swing.JPanel();
- jPanel13 = new javax.swing.JPanel();
jPanel11 = new javax.swing.JPanel();
jPanel12 = new javax.swing.JPanel();
+ jPanel13 = new javax.swing.JPanel();
jPanel14 = new javax.swing.JPanel();
jPanel15 = new javax.swing.JPanel();
- jLabel13 = new javax.swing.JLabel();
jPanel16 = new javax.swing.JPanel();
jPanel17 = new javax.swing.JPanel();
jPanel18 = new javax.swing.JPanel();
jPanel19 = new javax.swing.JPanel();
jPanel20 = new javax.swing.JPanel();
jPanel21 = new javax.swing.JPanel();
+ jPanel22 = new javax.swing.JPanel();
+ jPanel23 = new javax.swing.JPanel();
+ jPanel24 = new javax.swing.JPanel();
+ jPanel25 = new javax.swing.JPanel();
+ jPanel26 = new javax.swing.JPanel();
+ jPanel27 = new javax.swing.JPanel();
+ jPanel28 = new javax.swing.JPanel();
+ jPanel29 = new javax.swing.JPanel();
+ jPanel30 = new javax.swing.JPanel();
+ jPanel31 = new javax.swing.JPanel();
+ jPanel32 = new javax.swing.JPanel();
+ jPanel33 = new javax.swing.JPanel();
tabConnection = new javax.swing.JPanel();
lblProxyType = new javax.swing.JLabel();
cbProxyType = new javax.swing.JComboBox();
@@ -600,16 +602,16 @@ public class PreferencesDialog extends javax.swing.JDialog {
main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(main_gameLayout.createSequentialGroup()
.addContainerGap()
- .addGroup(main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(cbAllowRequestToShowHandCards, javax.swing.GroupLayout.PREFERRED_SIZE, 546, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGroup(main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(showPlayerNamesPermanently, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(nonLandPermanentsInOnePile, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(showAbilityPickerForced, javax.swing.GroupLayout.Alignment.LEADING))
- .addComponent(cbShowStormCounter, javax.swing.GroupLayout.PREFERRED_SIZE, 546, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(cbConfirmEmptyManaPool, javax.swing.GroupLayout.PREFERRED_SIZE, 546, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(cbAskMoveToGraveOrder, javax.swing.GroupLayout.PREFERRED_SIZE, 546, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addComponent(cbConfirmEmptyManaPool, javax.swing.GroupLayout.DEFAULT_SIZE, 485, Short.MAX_VALUE)
+ .addComponent(cbAllowRequestToShowHandCards, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(cbShowStormCounter, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(cbAskMoveToGraveOrder, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addContainerGap(7, Short.MAX_VALUE))
);
main_gameLayout.setVerticalGroup(
main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -627,7 +629,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addComponent(cbConfirmEmptyManaPool)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cbAskMoveToGraveOrder)
- .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addContainerGap())
);
nonLandPermanentsInOnePile.getAccessibleContext().setAccessibleName("nonLandPermanentsInOnePile");
@@ -643,18 +645,32 @@ public class PreferencesDialog extends javax.swing.JDialog {
}
});
+ cbDraftLogAutoSave.setSelected(true);
+ cbDraftLogAutoSave.setText("Auto save draft logs (to \"../Mage.Client/gamelogs/\" directory)");
+ cbDraftLogAutoSave.setToolTipText("The logs of all your games will be saved to the mentioned folder if this option is switched on.");
+ cbDraftLogAutoSave.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cbDraftLogAutoSaveActionPerformed(evt);
+ }
+ });
+
javax.swing.GroupLayout main_gamelogLayout = new javax.swing.GroupLayout(main_gamelog);
main_gamelog.setLayout(main_gamelogLayout);
main_gamelogLayout.setHorizontalGroup(
main_gamelogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(main_gamelogLayout.createSequentialGroup()
.addContainerGap()
- .addComponent(cbGameLogAutoSave, javax.swing.GroupLayout.PREFERRED_SIZE, 528, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGroup(main_gamelogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
+ .addComponent(cbDraftLogAutoSave, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(cbGameLogAutoSave, javax.swing.GroupLayout.DEFAULT_SIZE, 473, Short.MAX_VALUE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
main_gamelogLayout.setVerticalGroup(
main_gamelogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(cbGameLogAutoSave, javax.swing.GroupLayout.Alignment.TRAILING)
+ .addGroup(main_gamelogLayout.createSequentialGroup()
+ .addComponent(cbGameLogAutoSave)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(cbDraftLogAutoSave))
);
javax.swing.GroupLayout tabMainLayout = new javax.swing.GroupLayout(tabMain);
@@ -665,8 +681,10 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addContainerGap()
.addGroup(tabMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(main_card, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(main_game, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(main_gamelog, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addComponent(main_gamelog, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(tabMainLayout.createSequentialGroup()
+ .addComponent(main_game, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
);
tabMainLayout.setVerticalGroup(
@@ -675,8 +693,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addContainerGap()
.addComponent(main_card, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(main_game, javax.swing.GroupLayout.PREFERRED_SIZE, 189, Short.MAX_VALUE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(main_game, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(main_gamelog, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
@@ -685,7 +703,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
tabsPanel.addTab("Main", tabMain);
- jLabelHeadLine.setText("Choose phases your game will stop on:");
+ jLabelHeadLine.setText("Choose phases your game will stop on if not skipped by a skip action (e.g. F6):");
jLabelYourTurn.setText("Your turn");
@@ -706,7 +724,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
jLabelEndOfTurn.setText("End of turn:");
phases_stopSettings.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Stop settings"));
- phases_stopSettings.setLayout(new java.awt.GridLayout(4, 1));
+ phases_stopSettings.setLayout(new java.awt.GridLayout(7, 1));
cbStopAttack.setSelected(true);
cbStopAttack.setText("Stop on declare attackers step if you skip steps (F4/F5/F7) and attackers are available");
@@ -750,6 +768,39 @@ public class PreferencesDialog extends javax.swing.JDialog {
});
phases_stopSettings.add(cbStopOnAllEnd);
+ cbPassPriorityCast.setText("Pass priority automatically after you have put a spell on the stack");
+ cbPassPriorityCast.setToolTipText("If activated the system passes priority automatically for you if you have put a spell on the stack.");
+ cbPassPriorityCast.setActionCommand("");
+ cbPassPriorityCast.setPreferredSize(new java.awt.Dimension(300, 25));
+ cbPassPriorityCast.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cbPassPriorityCastActionPerformed(evt);
+ }
+ });
+ phases_stopSettings.add(cbPassPriorityCast);
+
+ cbPassPriorityActivation.setText("Pass priority automatically after you have put an activated ability on the stack");
+ cbPassPriorityActivation.setToolTipText("If activated the system passes priority for you automatically after you have put an activated ability on the stack.");
+ cbPassPriorityActivation.setActionCommand("");
+ cbPassPriorityActivation.setPreferredSize(new java.awt.Dimension(300, 25));
+ cbPassPriorityActivation.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cbPassPriorityActivationActionPerformed(evt);
+ }
+ });
+ phases_stopSettings.add(cbPassPriorityActivation);
+
+ cbAutoOrderTrigger.setText("Set order for your triggers automatically if all have the same text");
+ cbAutoOrderTrigger.setToolTipText("If activated the order to put on the stack your triggers that trigger at the same time \nis set automatically if all have the same text.");
+ cbAutoOrderTrigger.setActionCommand("");
+ cbAutoOrderTrigger.setPreferredSize(new java.awt.Dimension(300, 25));
+ cbAutoOrderTrigger.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cbAutoOrderTriggerActionPerformed(evt);
+ }
+ });
+ phases_stopSettings.add(cbAutoOrderTrigger);
+
javax.swing.GroupLayout tabPhasesLayout = new javax.swing.GroupLayout(tabPhases);
tabPhases.setLayout(tabPhasesLayout);
tabPhasesLayout.setHorizontalGroup(
@@ -860,11 +911,11 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addComponent(jLabelEndOfTurn)
.addComponent(checkBoxEndTurnOthers))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(phases_stopSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addContainerGap(13, Short.MAX_VALUE))
+ .addComponent(phases_stopSettings, javax.swing.GroupLayout.DEFAULT_SIZE, 183, Short.MAX_VALUE)
+ .addContainerGap())
);
- tabsPanel.addTab("Phases", tabPhases);
+ tabsPanel.addTab("Phases & Priority", tabPhases);
panelCardImages.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Card images:"));
@@ -907,24 +958,27 @@ public class PreferencesDialog extends javax.swing.JDialog {
panelCardImages.setLayout(panelCardImagesLayout);
panelCardImagesLayout.setHorizontalGroup(
panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(panelCardImagesLayout.createSequentialGroup()
- .addGap(24, 24, 24)
- .addComponent(txtImageFolderPath)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(btnBrowseImageLocation))
.addGroup(panelCardImagesLayout.createSequentialGroup()
.addGroup(panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(cbUseDefaultImageFolder)
- .addComponent(cbCheckForNewImages)
.addGroup(panelCardImagesLayout.createSequentialGroup()
- .addGroup(panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
- .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelCardImagesLayout.createSequentialGroup()
- .addContainerGap()
- .addComponent(labelPreferedImageLanguage))
- .addComponent(cbSaveToZipFiles, javax.swing.GroupLayout.Alignment.LEADING))
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(cbPreferedImageLanguage, javax.swing.GroupLayout.PREFERRED_SIZE, 153, javax.swing.GroupLayout.PREFERRED_SIZE)))
- .addGap(0, 0, Short.MAX_VALUE))
+ .addGroup(panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(cbUseDefaultImageFolder)
+ .addComponent(cbCheckForNewImages)
+ .addGroup(panelCardImagesLayout.createSequentialGroup()
+ .addGroup(panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
+ .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelCardImagesLayout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(labelPreferedImageLanguage))
+ .addComponent(cbSaveToZipFiles, javax.swing.GroupLayout.Alignment.LEADING))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(cbPreferedImageLanguage, javax.swing.GroupLayout.PREFERRED_SIZE, 153, javax.swing.GroupLayout.PREFERRED_SIZE)))
+ .addGap(0, 190, Short.MAX_VALUE))
+ .addGroup(panelCardImagesLayout.createSequentialGroup()
+ .addGap(24, 24, 24)
+ .addComponent(txtImageFolderPath)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(btnBrowseImageLocation)))
+ .addContainerGap())
);
panelCardImagesLayout.setVerticalGroup(
panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -1006,32 +1060,29 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addGroup(panelBackgroundImagesLayout.createSequentialGroup()
.addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelBackgroundImagesLayout.createSequentialGroup()
- .addGap(19, 19, 19)
- .addComponent(jLabel14))
- .addGroup(panelBackgroundImagesLayout.createSequentialGroup()
- .addGap(25, 25, 25)
- .addComponent(jLabel15)))
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(panelBackgroundImagesLayout.createSequentialGroup()
- .addComponent(txtBattlefieldImagePath, javax.swing.GroupLayout.PREFERRED_SIZE, 336, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelBackgroundImagesLayout.createSequentialGroup()
+ .addGap(19, 19, 19)
+ .addComponent(jLabel14))
+ .addGroup(panelBackgroundImagesLayout.createSequentialGroup()
+ .addGap(25, 25, 25)
+ .addComponent(jLabel15)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(btnBrowseBattlefieldImage))
- .addGroup(panelBackgroundImagesLayout.createSequentialGroup()
- .addComponent(txtBackgroundImagePath, javax.swing.GroupLayout.PREFERRED_SIZE, 332, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(txtBackgroundImagePath)
+ .addComponent(txtBattlefieldImagePath))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(btnBrowseBackgroundImage)))
- .addGap(0, 0, Short.MAX_VALUE))
- .addGroup(panelBackgroundImagesLayout.createSequentialGroup()
- .addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(cbUseRandomBattleImage)
- .addComponent(cbUseDefaultBattleImage)
- .addComponent(cbUseDefaultBackground))
- .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(btnBrowseBackgroundImage, javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(btnBrowseBattlefieldImage, javax.swing.GroupLayout.Alignment.TRAILING)))
+ .addGroup(panelBackgroundImagesLayout.createSequentialGroup()
+ .addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(cbUseRandomBattleImage)
+ .addComponent(cbUseDefaultBattleImage)
+ .addComponent(cbUseDefaultBackground))
+ .addGap(0, 0, Short.MAX_VALUE)))
+ .addContainerGap())
);
-
- panelBackgroundImagesLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {txtBackgroundImagePath, txtBattlefieldImagePath});
-
panelBackgroundImagesLayout.setVerticalGroup(
panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelBackgroundImagesLayout.createSequentialGroup()
@@ -1060,8 +1111,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addGroup(tabImagesLayout.createSequentialGroup()
.addContainerGap()
.addGroup(tabImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(panelCardImages, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(panelBackgroundImages, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addComponent(panelCardImages, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(panelBackgroundImages, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
tabImagesLayout.setVerticalGroup(
@@ -1193,249 +1244,459 @@ public class PreferencesDialog extends javax.swing.JDialog {
tabsPanel.addTab("Sounds", tabSounds);
- jLabel12.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
- jLabel12.setText("Choose your avatar:");
+ avatarPane.setMaximumSize(new java.awt.Dimension(508, 772));
+ avatarPane.setMinimumSize(new java.awt.Dimension(508, 772));
+ avatarPane.setPreferredSize(new java.awt.Dimension(508, 772));
+
+ avatarPanel.setMaximumSize(new java.awt.Dimension(508, 772));
+ avatarPanel.setMinimumSize(new java.awt.Dimension(508, 772));
+ avatarPanel.setPreferredSize(new java.awt.Dimension(508, 772));
+ avatarPanel.setLayout(new java.awt.GridLayout(6, 4, 20, 20));
jPanel10.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel10.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel10.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel10.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel10Layout = new javax.swing.GroupLayout(jPanel10);
jPanel10.setLayout(jPanel10Layout);
jPanel10Layout.setHorizontalGroup(
jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
jPanel10Layout.setVerticalGroup(
jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
- jPanel13.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
-
- javax.swing.GroupLayout jPanel13Layout = new javax.swing.GroupLayout(jPanel13);
- jPanel13.setLayout(jPanel13Layout);
- jPanel13Layout.setHorizontalGroup(
- jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
- );
- jPanel13Layout.setVerticalGroup(
- jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
- );
+ avatarPanel.add(jPanel10);
jPanel11.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel11.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel11.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel11.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel11Layout = new javax.swing.GroupLayout(jPanel11);
jPanel11.setLayout(jPanel11Layout);
jPanel11Layout.setHorizontalGroup(
jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
jPanel11Layout.setVerticalGroup(
jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
+ avatarPanel.add(jPanel11);
+
jPanel12.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel12.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel12.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel12.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel12Layout = new javax.swing.GroupLayout(jPanel12);
jPanel12.setLayout(jPanel12Layout);
jPanel12Layout.setHorizontalGroup(
jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
jPanel12Layout.setVerticalGroup(
jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
+ avatarPanel.add(jPanel12);
+
+ jPanel13.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel13.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel13.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel13.setPreferredSize(new java.awt.Dimension(102, 102));
+
+ javax.swing.GroupLayout jPanel13Layout = new javax.swing.GroupLayout(jPanel13);
+ jPanel13.setLayout(jPanel13Layout);
+ jPanel13Layout.setHorizontalGroup(
+ jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+ jPanel13Layout.setVerticalGroup(
+ jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 0, Short.MAX_VALUE)
+ );
+
+ avatarPanel.add(jPanel13);
+
jPanel14.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel14.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel14.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel14.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel14Layout = new javax.swing.GroupLayout(jPanel14);
jPanel14.setLayout(jPanel14Layout);
jPanel14Layout.setHorizontalGroup(
jPanel14Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
jPanel14Layout.setVerticalGroup(
jPanel14Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
+ avatarPanel.add(jPanel14);
+
jPanel15.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel15.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel15.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel15.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel15Layout = new javax.swing.GroupLayout(jPanel15);
jPanel15.setLayout(jPanel15Layout);
jPanel15Layout.setHorizontalGroup(
jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
jPanel15Layout.setVerticalGroup(
jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
- jLabel13.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
- jLabel13.setText("New avatars:");
+ avatarPanel.add(jPanel15);
jPanel16.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel16.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel16.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel16.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel16Layout = new javax.swing.GroupLayout(jPanel16);
jPanel16.setLayout(jPanel16Layout);
jPanel16Layout.setHorizontalGroup(
jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
jPanel16Layout.setVerticalGroup(
jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
+ avatarPanel.add(jPanel16);
+
jPanel17.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel17.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel17.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel17.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel17Layout = new javax.swing.GroupLayout(jPanel17);
jPanel17.setLayout(jPanel17Layout);
jPanel17Layout.setHorizontalGroup(
jPanel17Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
jPanel17Layout.setVerticalGroup(
jPanel17Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
+ avatarPanel.add(jPanel17);
+
jPanel18.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel18.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel18.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel18.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel18Layout = new javax.swing.GroupLayout(jPanel18);
jPanel18.setLayout(jPanel18Layout);
jPanel18Layout.setHorizontalGroup(
jPanel18Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
jPanel18Layout.setVerticalGroup(
jPanel18Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
+ avatarPanel.add(jPanel18);
+
jPanel19.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel19.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel19.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel19.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel19Layout = new javax.swing.GroupLayout(jPanel19);
jPanel19.setLayout(jPanel19Layout);
jPanel19Layout.setHorizontalGroup(
jPanel19Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
jPanel19Layout.setVerticalGroup(
jPanel19Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
+ avatarPanel.add(jPanel19);
+
jPanel20.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel20.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel20.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel20.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel20Layout = new javax.swing.GroupLayout(jPanel20);
jPanel20.setLayout(jPanel20Layout);
jPanel20Layout.setHorizontalGroup(
jPanel20Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
jPanel20Layout.setVerticalGroup(
jPanel20Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
+ avatarPanel.add(jPanel20);
+
jPanel21.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel21.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel21.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel21.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel21Layout = new javax.swing.GroupLayout(jPanel21);
jPanel21.setLayout(jPanel21Layout);
jPanel21Layout.setHorizontalGroup(
jPanel21Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
jPanel21Layout.setVerticalGroup(
jPanel21Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 100, Short.MAX_VALUE)
+ .addGap(0, 110, Short.MAX_VALUE)
);
- javax.swing.GroupLayout avatarPanelLayout = new javax.swing.GroupLayout(avatarPanel);
- avatarPanel.setLayout(avatarPanelLayout);
- avatarPanelLayout.setHorizontalGroup(
- avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(avatarPanelLayout.createSequentialGroup()
- .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(avatarPanelLayout.createSequentialGroup()
- .addContainerGap()
- .addComponent(jLabel12))
- .addGroup(avatarPanelLayout.createSequentialGroup()
- .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(avatarPanelLayout.createSequentialGroup()
- .addGap(30, 30, 30)
- .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
- .addComponent(jPanel12, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel19, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGap(33, 33, 33)
- .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jPanel13, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel14, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel20, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
- .addGroup(avatarPanelLayout.createSequentialGroup()
- .addContainerGap()
- .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(avatarPanelLayout.createSequentialGroup()
- .addGap(20, 20, 20)
- .addComponent(jPanel16, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addGap(33, 33, 33)
- .addComponent(jPanel17, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addComponent(jLabel13))))
- .addGap(32, 32, 32)
- .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jPanel18, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel21, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel15, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
- .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ avatarPanel.add(jPanel21);
+
+ jPanel22.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel22.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel22.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel22.setPreferredSize(new java.awt.Dimension(102, 102));
+
+ javax.swing.GroupLayout jPanel22Layout = new javax.swing.GroupLayout(jPanel22);
+ jPanel22.setLayout(jPanel22Layout);
+ jPanel22Layout.setHorizontalGroup(
+ jPanel22Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
);
- avatarPanelLayout.setVerticalGroup(
- avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(avatarPanelLayout.createSequentialGroup()
- .addContainerGap()
- .addComponent(jLabel12)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jPanel11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel13, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGap(26, 26, 26)
- .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jPanel15, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel12, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel14, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGap(23, 23, 23)
- .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
- .addComponent(jPanel19, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel20, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel21, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGap(18, 18, 18)
- .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
- .addGroup(avatarPanelLayout.createSequentialGroup()
- .addComponent(jLabel13)
- .addGap(18, 18, 18)
- .addComponent(jPanel16, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addComponent(jPanel17, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jPanel18, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGap(25, 25, 25))
+ jPanel22Layout.setVerticalGroup(
+ jPanel22Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
);
+ avatarPanel.add(jPanel22);
+
+ jPanel23.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel23.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel23.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel23.setPreferredSize(new java.awt.Dimension(102, 102));
+
+ javax.swing.GroupLayout jPanel23Layout = new javax.swing.GroupLayout(jPanel23);
+ jPanel23.setLayout(jPanel23Layout);
+ jPanel23Layout.setHorizontalGroup(
+ jPanel23Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+ jPanel23Layout.setVerticalGroup(
+ jPanel23Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+
+ avatarPanel.add(jPanel23);
+
+ jPanel24.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel24.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel24.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel24.setPreferredSize(new java.awt.Dimension(102, 102));
+
+ javax.swing.GroupLayout jPanel24Layout = new javax.swing.GroupLayout(jPanel24);
+ jPanel24.setLayout(jPanel24Layout);
+ jPanel24Layout.setHorizontalGroup(
+ jPanel24Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+ jPanel24Layout.setVerticalGroup(
+ jPanel24Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+
+ avatarPanel.add(jPanel24);
+
+ jPanel25.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel25.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel25.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel25.setPreferredSize(new java.awt.Dimension(102, 102));
+
+ javax.swing.GroupLayout jPanel25Layout = new javax.swing.GroupLayout(jPanel25);
+ jPanel25.setLayout(jPanel25Layout);
+ jPanel25Layout.setHorizontalGroup(
+ jPanel25Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+ jPanel25Layout.setVerticalGroup(
+ jPanel25Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+
+ avatarPanel.add(jPanel25);
+
+ jPanel26.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel26.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel26.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel26.setPreferredSize(new java.awt.Dimension(102, 102));
+
+ javax.swing.GroupLayout jPanel26Layout = new javax.swing.GroupLayout(jPanel26);
+ jPanel26.setLayout(jPanel26Layout);
+ jPanel26Layout.setHorizontalGroup(
+ jPanel26Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+ jPanel26Layout.setVerticalGroup(
+ jPanel26Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+
+ avatarPanel.add(jPanel26);
+
+ jPanel27.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel27.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel27.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel27.setPreferredSize(new java.awt.Dimension(102, 102));
+
+ javax.swing.GroupLayout jPanel27Layout = new javax.swing.GroupLayout(jPanel27);
+ jPanel27.setLayout(jPanel27Layout);
+ jPanel27Layout.setHorizontalGroup(
+ jPanel27Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+ jPanel27Layout.setVerticalGroup(
+ jPanel27Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+
+ avatarPanel.add(jPanel27);
+
+ jPanel28.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel28.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel28.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel28.setPreferredSize(new java.awt.Dimension(102, 102));
+
+ javax.swing.GroupLayout jPanel28Layout = new javax.swing.GroupLayout(jPanel28);
+ jPanel28.setLayout(jPanel28Layout);
+ jPanel28Layout.setHorizontalGroup(
+ jPanel28Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+ jPanel28Layout.setVerticalGroup(
+ jPanel28Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+
+ avatarPanel.add(jPanel28);
+
+ jPanel29.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel29.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel29.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel29.setPreferredSize(new java.awt.Dimension(102, 102));
+
+ javax.swing.GroupLayout jPanel29Layout = new javax.swing.GroupLayout(jPanel29);
+ jPanel29.setLayout(jPanel29Layout);
+ jPanel29Layout.setHorizontalGroup(
+ jPanel29Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+ jPanel29Layout.setVerticalGroup(
+ jPanel29Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+
+ avatarPanel.add(jPanel29);
+
+ jPanel30.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel30.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel30.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel30.setPreferredSize(new java.awt.Dimension(102, 102));
+
+ javax.swing.GroupLayout jPanel30Layout = new javax.swing.GroupLayout(jPanel30);
+ jPanel30.setLayout(jPanel30Layout);
+ jPanel30Layout.setHorizontalGroup(
+ jPanel30Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+ jPanel30Layout.setVerticalGroup(
+ jPanel30Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+
+ avatarPanel.add(jPanel30);
+
+ jPanel31.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel31.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel31.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel31.setPreferredSize(new java.awt.Dimension(102, 102));
+
+ javax.swing.GroupLayout jPanel31Layout = new javax.swing.GroupLayout(jPanel31);
+ jPanel31.setLayout(jPanel31Layout);
+ jPanel31Layout.setHorizontalGroup(
+ jPanel31Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+ jPanel31Layout.setVerticalGroup(
+ jPanel31Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+
+ avatarPanel.add(jPanel31);
+
+ jPanel32.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel32.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel32.setMinimumSize(new java.awt.Dimension(102, 102));
+ jPanel32.setPreferredSize(new java.awt.Dimension(102, 102));
+
+ javax.swing.GroupLayout jPanel32Layout = new javax.swing.GroupLayout(jPanel32);
+ jPanel32.setLayout(jPanel32Layout);
+ jPanel32Layout.setHorizontalGroup(
+ jPanel32Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+ jPanel32Layout.setVerticalGroup(
+ jPanel32Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+
+ avatarPanel.add(jPanel32);
+
+ jPanel33.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
+ jPanel33.setMaximumSize(new java.awt.Dimension(102, 102));
+ jPanel33.setMinimumSize(new java.awt.Dimension(102, 102));
+
+ javax.swing.GroupLayout jPanel33Layout = new javax.swing.GroupLayout(jPanel33);
+ jPanel33.setLayout(jPanel33Layout);
+ jPanel33Layout.setHorizontalGroup(
+ jPanel33Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+ jPanel33Layout.setVerticalGroup(
+ jPanel33Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 110, Short.MAX_VALUE)
+ );
+
+ avatarPanel.add(jPanel33);
+
avatarPane.setViewportView(avatarPanel);
javax.swing.GroupLayout tabAvatarsLayout = new javax.swing.GroupLayout(tabAvatars);
tabAvatars.setLayout(tabAvatarsLayout);
tabAvatarsLayout.setHorizontalGroup(
tabAvatarsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(avatarPane, javax.swing.GroupLayout.DEFAULT_SIZE, 590, Short.MAX_VALUE)
+ .addGroup(tabAvatarsLayout.createSequentialGroup()
+ .addComponent(avatarPane, javax.swing.GroupLayout.PREFERRED_SIZE, 527, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(0, 0, Short.MAX_VALUE))
);
tabAvatarsLayout.setVerticalGroup(
tabAvatarsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(avatarPane, javax.swing.GroupLayout.DEFAULT_SIZE, 359, Short.MAX_VALUE)
+ .addComponent(avatarPane, javax.swing.GroupLayout.PREFERRED_SIZE, 418, Short.MAX_VALUE)
);
tabsPanel.addTab("Avatars", tabAvatars);
@@ -1574,7 +1835,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addContainerGap()
.addComponent(lblURLServerList, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(txtURLServerList, javax.swing.GroupLayout.PREFERRED_SIZE, 421, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addComponent(txtURLServerList, javax.swing.GroupLayout.PREFERRED_SIZE, 370, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(connection_serversLayout.createSequentialGroup()
.addGap(141, 141, 141)
.addComponent(jLabel17)))
@@ -1585,7 +1846,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addGroup(connection_serversLayout.createSequentialGroup()
.addGroup(connection_serversLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(lblURLServerList, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(txtURLServerList, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addComponent(txtURLServerList, javax.swing.GroupLayout.DEFAULT_SIZE, 28, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel17))
);
@@ -1596,15 +1857,14 @@ public class PreferencesDialog extends javax.swing.JDialog {
tabConnectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(tabConnectionLayout.createSequentialGroup()
.addContainerGap()
- .addGroup(tabConnectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(tabConnectionLayout.createSequentialGroup()
+ .addGroup(tabConnectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
+ .addComponent(pnlProxySettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(javax.swing.GroupLayout.Alignment.LEADING, tabConnectionLayout.createSequentialGroup()
.addComponent(lblProxyType)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(cbProxyType, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addGap(0, 0, Short.MAX_VALUE))
- .addComponent(pnlProxySettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(cbProxyType, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(connection_servers, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
- .addContainerGap())
+ .addContainerGap(16, Short.MAX_VALUE))
);
tabConnectionLayout.setVerticalGroup(
tabConnectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -1617,7 +1877,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addComponent(cbProxyType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addComponent(pnlProxySettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addContainerGap(54, Short.MAX_VALUE))
+ .addContainerGap(107, Short.MAX_VALUE))
);
pnlProxySettings.getAccessibleContext().setAccessibleDescription("");
@@ -1645,12 +1905,12 @@ public class PreferencesDialog extends javax.swing.JDialog {
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
- .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addContainerGap(405, Short.MAX_VALUE)
.addComponent(saveButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(exitButton, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
- .addComponent(tabsPanel)
+ .addComponent(tabsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -1681,8 +1941,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
save(prefs, dialog.cbConfirmEmptyManaPool, KEY_GAME_CONFIRM_EMPTY_MANA_POOL, "true", "false", UPDATE_CACHE_POLICY);
save(prefs, dialog.cbAskMoveToGraveOrder, KEY_GAME_ASK_MOVE_TO_GRAVE_ORDER, "true", "false", UPDATE_CACHE_POLICY);
save(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY);
+ save(prefs, dialog.cbDraftLogAutoSave, KEY_DRAFT_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY);
- // Phases
+ // Phases & Priority
save(prefs, dialog.checkBoxUpkeepYou, UPKEEP_YOU);
save(prefs, dialog.checkBoxDrawYou, DRAW_YOU);
save(prefs, dialog.checkBoxMainYou, MAIN_YOU);
@@ -1703,6 +1964,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
save(prefs, dialog.cbStopBlock, KEY_STOP_BLOCK, "true", "false", UPDATE_CACHE_POLICY);
save(prefs, dialog.cbStopOnAllMain, KEY_STOP_ALL_MAIN_PHASES, "true", "false", UPDATE_CACHE_POLICY);
save(prefs, dialog.cbStopOnAllEnd, KEY_STOP_ALL_END_PHASES, "true", "false", UPDATE_CACHE_POLICY);
+ save(prefs, dialog.cbPassPriorityCast, KEY_PASS_PRIORITY_CAST, "true", "false", UPDATE_CACHE_POLICY);
+ save(prefs, dialog.cbPassPriorityActivation, KEY_PASS_PRIORITY_ACTIVATION, "true", "false", UPDATE_CACHE_POLICY);
+ save(prefs, dialog.cbAutoOrderTrigger, KEY_AUTO_ORDER_TRIGGER, "true", "false", UPDATE_CACHE_POLICY);
// images
save(prefs, dialog.cbUseDefaultImageFolder, KEY_CARD_IMAGES_USE_DEFAULT, "true", "false", UPDATE_CACHE_POLICY);
@@ -1736,10 +2000,11 @@ public class PreferencesDialog extends javax.swing.JDialog {
save(prefs, dialog.txtURLServerList, KEY_CONNECTION_URL_SERVER_LIST);
// Avatar
- if (available_avatars.contains(selectedAvatarId)) {
- prefs.put(KEY_AVATAR, String.valueOf(selectedAvatarId));
- updateCache(KEY_AVATAR, String.valueOf(selectedAvatarId));
+ if (selectedAvatarId < MIN_AVATAR_ID || selectedAvatarId > MAX_AVATAR_ID) {
+ selectedAvatarId = DEFAULT_AVATAR_ID;
}
+ prefs.put(KEY_AVATAR, String.valueOf(selectedAvatarId));
+ updateCache(KEY_AVATAR, String.valueOf(selectedAvatarId));
try {
MageFrame.getSession().updatePreferencesForServer(getUserData());
@@ -2001,6 +2266,22 @@ public class PreferencesDialog extends javax.swing.JDialog {
// TODO add your handling code here:
}//GEN-LAST:event_cbAskMoveToGraveOrderActionPerformed
+ private void cbDraftLogAutoSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbDraftLogAutoSaveActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_cbDraftLogAutoSaveActionPerformed
+
+ private void cbPassPriorityCastActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbPassPriorityCastActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_cbPassPriorityCastActionPerformed
+
+ private void cbPassPriorityActivationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbPassPriorityActivationActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_cbPassPriorityActivationActionPerformed
+
+ private void cbAutoOrderTriggerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbAutoOrderTriggerActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_cbAutoOrderTriggerActionPerformed
+
private void showProxySettings() {
if (cbProxyType.getSelectedItem() == Connection.ProxyType.SOCKS) {
this.pnlProxy.setVisible(true);
@@ -2079,6 +2360,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
load(prefs, dialog.cbAskMoveToGraveOrder, KEY_GAME_ASK_MOVE_TO_GRAVE_ORDER, "true");
load(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true");
+ load(prefs, dialog.cbDraftLogAutoSave, KEY_DRAFT_LOG_AUTO_SAVE, "true");
load(prefs, dialog.checkBoxUpkeepYou, UPKEEP_YOU, "on", "on");
load(prefs, dialog.checkBoxDrawYou, DRAW_YOU, "on", "on");
@@ -2100,6 +2382,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
load(prefs, dialog.cbStopBlock, KEY_STOP_BLOCK, "true", "true");
load(prefs, dialog.cbStopOnAllMain, KEY_STOP_ALL_MAIN_PHASES, "true", "false");
load(prefs, dialog.cbStopOnAllEnd, KEY_STOP_ALL_END_PHASES, "true", "false");
+ load(prefs, dialog.cbPassPriorityCast, KEY_PASS_PRIORITY_CAST, "true", "false");
+ load(prefs, dialog.cbPassPriorityActivation, KEY_PASS_PRIORITY_ACTIVATION, "true", "false");
+ load(prefs, dialog.cbAutoOrderTrigger, KEY_AUTO_ORDER_TRIGGER, "true", "true");
}
@@ -2196,7 +2481,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
} catch (NumberFormatException n) {
selectedAvatarId = DEFAULT_AVATAR_ID;
} finally {
- if (!available_avatars.contains(selectedAvatarId)) {
+ if (selectedAvatarId < MIN_AVATAR_ID || selectedAvatarId > MAX_AVATAR_ID) {
selectedAvatarId = DEFAULT_AVATAR_ID;
}
}
@@ -2280,6 +2565,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
private static void load(Preferences prefs, JCheckBox checkBox, String propName, String yesValue, String defaultValue) {
String prop = prefs.get(propName, defaultValue);
checkBox.setSelected(prop.equals(yesValue));
+ updateCache(propName, prop);
}
private static void load(Preferences prefs, JTextField field, String propName, String defaultValue) {
@@ -2362,26 +2648,37 @@ public class PreferencesDialog extends javax.swing.JDialog {
private void addAvatars() {
try {
- addAvatar(jPanel10, 51, true, false);
+ addAvatar(jPanel10, 10, true, false);
+ addAvatar(jPanel11, 11, false, false);
+ addAvatar(jPanel12, 12, false, false);
addAvatar(jPanel13, 13, false, false);
- addAvatar(jPanel11, 9, false, false);
- addAvatar(jPanel12, 53, false, false);
- addAvatar(jPanel14, 10, false, false);
- addAvatar(jPanel15, 39, false, false);
+ addAvatar(jPanel14, 14, false, false);
+ addAvatar(jPanel15, 15, false, false);
+ addAvatar(jPanel16, 16, false, false);
+ addAvatar(jPanel17, 17, false, false);
+ addAvatar(jPanel18, 18, false, false);
addAvatar(jPanel19, 19, false, false);
- addAvatar(jPanel20, 30, false, false);
- addAvatar(jPanel21, 25, false, false);
+ addAvatar(jPanel20, 20, false, false);
+ addAvatar(jPanel21, 21, false, false);
+ addAvatar(jPanel22, 22, false, false);
+ addAvatar(jPanel23, 23, false, false);
+ addAvatar(jPanel24, 24, false, false);
+ addAvatar(jPanel25, 25, false, false);
+ addAvatar(jPanel26, 26, false, false);
+ addAvatar(jPanel27, 27, false, false);
+ addAvatar(jPanel28, 28, false, false);
+ addAvatar(jPanel29, 29, false, false);
+ addAvatar(jPanel30, 30, false, false);
+ addAvatar(jPanel31, 31, false, false);
+ addAvatar(jPanel32, 32, false, false);
- addAvatar(jPanel16, 22, false, false);
- addAvatar(jPanel17, 77, false, false);
- addAvatar(jPanel18, 62, false, false);
} catch (Exception e) {
log.error(e, e);
}
}
public void setSelectedId(int id) {
- if (available_avatars.contains(id)) {
+ if (id >= MIN_AVATAR_ID && id <= MAX_AVATAR_ID) {
for (JPanel panel : panels.values()) {
panel.setBorder(BLACK_BORDER);
}
@@ -2394,7 +2691,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
String path = "/avatars/" + String.valueOf(id) + ".jpg";
panels.put(id, jPanel);
Image image = ImageHelper.getImageFromResources(path);
- Rectangle r = new Rectangle(90, 90);
+
+ Rectangle r = new Rectangle(jPanel.getWidth() - 5, jPanel.getHeight() - 5);
BufferedImage bufferedImage;
if (!locked) {
bufferedImage = BufferedImageBuilder.bufferImage(image, BufferedImage.TYPE_INT_ARGB);
@@ -2425,16 +2723,22 @@ public class PreferencesDialog extends javax.swing.JDialog {
}
public static UserData getUserData() {
+ if (selectedAvatarId == 0) {
+ getSelectedAvatar();
+ }
return new UserData(UserGroup.PLAYER,
PreferencesDialog.selectedAvatarId,
- PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SHOW_TOOLTIPS_ANY_ZONE, "true").equals("true"),
+ PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SHOW_ABILITY_PICKER_FORCED, "true").equals("true"),
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_ALLOW_REQUEST_SHOW_HAND_CARDS, "true").equals("true"),
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_CONFIRM_EMPTY_MANA_POOL, "true").equals("true"),
getUserSkipPrioritySteps(),
MageFrame.getPreferences().get(KEY_CONNECT_FLAG, "world"),
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_ASK_MOVE_TO_GRAVE_ORDER, "true").equals("true"),
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_MANA_AUTOPAYMENT, "true").equals("true"),
- PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_MANA_AUTOPAYMENT_ONLY_ONE, "true").equals("true")
+ PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_MANA_AUTOPAYMENT_ONLY_ONE, "true").equals("true"),
+ PreferencesDialog.getCachedValue(PreferencesDialog.KEY_PASS_PRIORITY_CAST, "true").equals("true"),
+ PreferencesDialog.getCachedValue(PreferencesDialog.KEY_PASS_PRIORITY_ACTIVATION, "true").equals("true"),
+ PreferencesDialog.getCachedValue(PreferencesDialog.KEY_AUTO_ORDER_TRIGGER, "true").equals("true")
);
}
@@ -2447,14 +2751,18 @@ public class PreferencesDialog extends javax.swing.JDialog {
private javax.swing.JButton btnBrowseImageLocation;
private javax.swing.JCheckBox cbAllowRequestToShowHandCards;
private javax.swing.JCheckBox cbAskMoveToGraveOrder;
+ private javax.swing.JCheckBox cbAutoOrderTrigger;
private javax.swing.JCheckBox cbCheckForNewImages;
private javax.swing.JCheckBox cbConfirmEmptyManaPool;
+ private javax.swing.JCheckBox cbDraftLogAutoSave;
private javax.swing.JCheckBox cbEnableBattlefieldBGM;
private javax.swing.JCheckBox cbEnableDraftSounds;
private javax.swing.JCheckBox cbEnableGameSounds;
private javax.swing.JCheckBox cbEnableOtherSounds;
private javax.swing.JCheckBox cbEnableSkipButtonsSounds;
private javax.swing.JCheckBox cbGameLogAutoSave;
+ private javax.swing.JCheckBox cbPassPriorityActivation;
+ private javax.swing.JCheckBox cbPassPriorityCast;
private javax.swing.JComboBox cbPreferedImageLanguage;
private javax.swing.JComboBox cbProxyType;
private javax.swing.JCheckBox cbSaveToZipFiles;
@@ -2485,8 +2793,6 @@ public class PreferencesDialog extends javax.swing.JDialog {
private javax.swing.JCheckBox displayBigCardsInHand;
private javax.swing.JButton exitButton;
private javax.swing.JLabel jLabel11;
- private javax.swing.JLabel jLabel12;
- private javax.swing.JLabel jLabel13;
private javax.swing.JLabel jLabel14;
private javax.swing.JLabel jLabel15;
private javax.swing.JLabel jLabel16;
@@ -2513,6 +2819,18 @@ public class PreferencesDialog extends javax.swing.JDialog {
private javax.swing.JPanel jPanel19;
private javax.swing.JPanel jPanel20;
private javax.swing.JPanel jPanel21;
+ private javax.swing.JPanel jPanel22;
+ private javax.swing.JPanel jPanel23;
+ private javax.swing.JPanel jPanel24;
+ private javax.swing.JPanel jPanel25;
+ private javax.swing.JPanel jPanel26;
+ private javax.swing.JPanel jPanel27;
+ private javax.swing.JPanel jPanel28;
+ private javax.swing.JPanel jPanel29;
+ private javax.swing.JPanel jPanel30;
+ private javax.swing.JPanel jPanel31;
+ private javax.swing.JPanel jPanel32;
+ private javax.swing.JPanel jPanel33;
private javax.swing.JLabel labelPreferedImageLanguage;
private javax.swing.JLabel lblProxyPassword;
private javax.swing.JLabel lblProxyPort;
diff --git a/Mage.Client/src/main/java/mage/client/dialog/ShowCardsDialog.java b/Mage.Client/src/main/java/mage/client/dialog/ShowCardsDialog.java
index 433aecd21cd..dffa208b6c7 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/ShowCardsDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/ShowCardsDialog.java
@@ -1,82 +1,76 @@
/*
-* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification, are
-* permitted provided that the following conditions are met:
-*
-* 1. Redistributions of source code must retain the above copyright notice, this list of
-* conditions and the following disclaimer.
-*
-* 2. Redistributions in binary form must reproduce the above copyright notice, this list
-* of conditions and the following disclaimer in the documentation and/or other materials
-* provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
-* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The views and conclusions contained in the software and documentation are those of the
-* authors and should not be interpreted as representing official policies, either expressed
-* or implied, of BetaSteward_at_googlemail.com.
-*/
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
/*
* ShowCardsDialog.java
*
* Created on 3-Feb-2010, 8:59:11 PM
*/
-
package mage.client.dialog;
import java.awt.Component;
import java.awt.Point;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
import java.io.Serializable;
import java.util.Map;
import java.util.UUID;
-import javax.swing.ImageIcon;
import javax.swing.JLayeredPane;
+import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import mage.cards.CardDimensions;
import mage.client.MageFrame;
import mage.client.cards.BigCard;
import mage.client.cards.CardArea;
-import mage.client.util.CardsViewUtil;
+import mage.client.util.Event;
+import mage.client.util.Listener;
import mage.client.util.SettingsManager;
import mage.client.util.gui.GuiDisplayUtil;
+import mage.game.events.PlayerQueryEvent.QueryType;
import mage.view.CardsView;
-import mage.view.SimpleCardsView;
import org.mage.card.arcane.CardPanel;
-import org.mage.plugins.card.utils.impl.ImageManagerImpl;
/**
* @author BetaSteward_at_googlemail.com
*/
-public class ShowCardsDialog extends MageDialog implements MouseListener {
+public class ShowCardsDialog extends MageDialog {
-
-
// remember if this dialog was already auto positioned, so don't do it after the first time
private boolean positioned;
-
/**
* Creates new form ShowCardsDialog
*/
public ShowCardsDialog() {
this.positioned = false;
-
+
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
initComponents();
this.setModal(false);
-
+
}
public void cleanUp() {
@@ -89,33 +83,37 @@ public class ShowCardsDialog extends MageDialog implements MouseListener {
}
}
- public void loadCards(String name, SimpleCardsView showCards, BigCard bigCard, CardDimensions dimension, UUID gameId, boolean modal) {
- loadCards(name, CardsViewUtil.convertSimple(showCards), bigCard, dimension, gameId, modal);
- }
-
- public void loadCards(String name, CardsView showCards, BigCard bigCard, CardDimensions dimension, UUID gameId, boolean modal) {
- loadCards(name, showCards, bigCard, dimension, gameId, modal, null);
- }
-
- public void loadCards(String name, CardsView showCards, BigCard bigCard, CardDimensions dimension, UUID gameId, boolean modal, Map options) {
+ public void loadCards(String name, CardsView showCards, BigCard bigCard,
+ CardDimensions dimension, UUID gameId, boolean modal, Map options,
+ JPopupMenu popupMenu, Listener eventListener) {
this.title = name;
this.setTitelBarToolTip(name);
- cardArea.loadCards(showCards, bigCard, dimension, gameId, this);
+ cardArea.clearCardEventListeners();
+ cardArea.loadCards(showCards, bigCard, dimension, gameId);
if (options != null) {
if (options.containsKey("chosen")) {
- java.util.List chosenCards = (java.util.List)options.get("chosen");
+ java.util.List chosenCards = (java.util.List) options.get("chosen");
cardArea.selectCards(chosenCards);
}
if (options.containsKey("choosable")) {
- java.util.List choosableCards = (java.util.List)options.get("choosable");
+ java.util.List choosableCards = (java.util.List) options.get("choosable");
cardArea.markCards(choosableCards);
}
+ if (options.containsKey("queryType") && QueryType.PICK_ABILITY.equals(options.get("queryType"))) {
+ cardArea.setPopupMenu(popupMenu);
+ }
+ }
+ if (popupMenu != null) {
+ this.cardArea.setPopupMenu(popupMenu);
+ }
+ if (eventListener != null) {
+ this.cardArea.addCardEventListener(eventListener);
}
if (getParent() != MageFrame.getDesktop() /*|| this.isClosed*/) {
MageFrame.getDesktop().add(this, JLayeredPane.DEFAULT_LAYER);
}
- pack();
+ pack();
this.revalidate();
this.repaint();
@@ -147,36 +145,9 @@ public class ShowCardsDialog extends MageDialog implements MouseListener {
setResizable(true);
getContentPane().setLayout(new java.awt.BorderLayout());
getContentPane().add(cardArea, java.awt.BorderLayout.CENTER);
- this.addMouseListener(this);
pack();
}
private CardArea cardArea;
-
- @Override
- public void mouseClicked(MouseEvent e) {
- this.hideDialog();
- }
-
- @Override
- public void mousePressed(MouseEvent e) {
- // only hide dialog, if a cardPanel was selected
- if (e.getSource() instanceof CardPanel) {
- this.hideDialog();
- }
- }
-
- @Override
- public void mouseReleased(MouseEvent e) {
- }
-
- @Override
- public void mouseEntered(MouseEvent e) {
- }
-
- @Override
- public void mouseExited(MouseEvent e) {
- }
-
}
diff --git a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.form b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.form
index 226f944a8db..be222cd34b6 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.form
+++ b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.form
@@ -28,13 +28,13 @@
-
+
-
+
@@ -91,9 +91,10 @@
-
+
+
@@ -122,10 +123,7 @@
-
-
-
-
+
diff --git a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java
index 156ea32b0a1..9840c82582b 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java
@@ -41,7 +41,7 @@ import javax.swing.Icon;
import javax.swing.SwingWorker;
import javax.swing.table.AbstractTableModel;
import mage.client.MageFrame;
-import mage.client.chat.ChatPanel;
+import mage.client.chat.ChatPanelBasic;
import mage.client.components.MageComponents;
import mage.client.components.tray.MageTray;
import static mage.client.dialog.PreferencesDialog.KEY_TABLE_WAITING_COLUMNS_ORDER;
@@ -86,7 +86,7 @@ public class TableWaitingDialog extends MageDialog {
this.setSize(prefWidth, prefHeight);
}
- chatPanel.useExtendedView(ChatPanel.VIEW_MODE.NONE);
+ chatPanel.useExtendedView(ChatPanelBasic.VIEW_MODE.NONE);
tableSeats.createDefaultColumnsFromModel();
TableUtil.setColumnWidthAndOrder(tableSeats, defaultColumnsWidth, KEY_TABLE_WAITING_COLUMNS_WIDTH, KEY_TABLE_WAITING_COLUMNS_ORDER);
tableSeats.setDefaultRenderer(Icon.class, new CountryCellRenderer());
@@ -183,7 +183,7 @@ public class TableWaitingDialog extends MageDialog {
jSplitPane1 = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
tableSeats = new javax.swing.JTable();
- chatPanel = new mage.client.chat.ChatPanel(false);
+ chatPanel = new mage.client.chat.ChatPanelBasic();
setResizable(true);
setTitle("Waiting for players");
@@ -219,9 +219,10 @@ public class TableWaitingDialog extends MageDialog {
}
});
- jSplitPane1.setDividerLocation(320);
+ jSplitPane1.setDividerLocation(300);
jSplitPane1.setDividerSize(3);
jSplitPane1.setResizeWeight(1.0);
+ jSplitPane1.setToolTipText("");
tableSeats.setModel(tableWaitModel);
tableSeats.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
@@ -239,12 +240,12 @@ public class TableWaitingDialog extends MageDialog {
.addComponent(btnMoveDown)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnMoveUp)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 326, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnStart)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnCancel)
.addContainerGap())
- .addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 644, Short.MAX_VALUE)
+ .addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -308,7 +309,7 @@ public class TableWaitingDialog extends MageDialog {
private javax.swing.JButton btnMoveDown;
private javax.swing.JButton btnMoveUp;
private javax.swing.JButton btnStart;
- private mage.client.chat.ChatPanel chatPanel;
+ private mage.client.chat.ChatPanelBasic chatPanel;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JTable tableSeats;
diff --git a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java
index da4ea2b4255..679cb823d06 100644
--- a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java
+++ b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java
@@ -31,7 +31,6 @@
*
* Created on Jan 7, 2011, 2:15:48 PM
*/
-
package mage.client.draft;
import java.awt.Component;
@@ -41,7 +40,16 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
import java.util.HashSet;
+import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
@@ -53,9 +61,12 @@ import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;
import javax.swing.Timer;
+import mage.cards.repository.CardInfo;
+import mage.cards.repository.CardRepository;
import mage.client.MageFrame;
import mage.client.components.tray.MageTray;
import mage.client.deckeditor.SortSettingDraft;
+import mage.client.dialog.PreferencesDialog;
import mage.client.plugins.impl.Plugins;
import mage.client.util.CardsViewUtil;
import mage.client.util.Event;
@@ -69,6 +80,7 @@ import mage.view.DraftPickView;
import mage.view.DraftView;
import mage.view.SimpleCardView;
import mage.view.SimpleCardsView;
+import org.apache.log4j.Logger;
/**
*
@@ -76,6 +88,8 @@ import mage.view.SimpleCardsView;
*/
public class DraftPanel extends javax.swing.JPanel {
+ private static final Logger logger = Logger.getLogger(DraftPanel.class);
+
private UUID draftId;
private Session session;
private Timer countdown;
@@ -94,16 +108,31 @@ public class DraftPanel extends javax.swing.JPanel {
// id of card with popup menu
protected UUID cardIdPopupMenu;
+ // Filename for the draft log (only updated if writing the log).
+ private String logFilename;
+
+ // Number of the current booster (for draft log writing).
+ private int packNo;
+
+ // Number of the current card pick (for draft log writing).
+ private int pickNo;
+
+ // Cached booster data to be written into the log (see logLastPick).
+ private String currentBoosterHeader;
+ private String[] currentBooster;
+
private static final CardsView emptyView = new CardsView();
- /** Creates new form DraftPanel */
+ /**
+ * Creates new form DraftPanel
+ */
public DraftPanel() {
initComponents();
draftBooster.setOpaque(false);
draftPicks.setSortSetting(SortSettingDraft.getInstance());
draftPicks.setOpaque(false);
-
+
popupMenuPickedArea = new JPopupMenu();
addPopupMenuPickArea();
this.add(popupMenuPickedArea);
@@ -115,18 +144,17 @@ public class DraftPanel extends javax.swing.JPanel {
draftLeftPane.setOpaque(false);
countdown = new Timer(1000,
- new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- if (--timeout > 0) {
- setTimeout(timeout);
- }
- else {
- setTimeout(0);
- countdown.stop();
+ new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (--timeout > 0) {
+ setTimeout(timeout);
+ } else {
+ setTimeout(0);
+ countdown.stop();
+ }
}
}
- }
);
}
@@ -149,15 +177,29 @@ public class DraftPanel extends javax.swing.JPanel {
if (!session.joinDraft(draftId)) {
hideDraft();
}
+
+ if (isLogging()) {
+ // If we are logging the draft create a file that will contain
+ // the log.
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
+ logFilename = "Draft_" + sdf.format(new Date()) + "_" + draftId + ".txt";
+ try {
+ Files.write(pathToDraftLog(), "".getBytes(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
+ } catch (IOException ex) {
+ logger.error(null, ex);
+ }
+ } else {
+ logFilename = null;
+ }
}
- public void updateDraft(DraftView draftView) {
- if (draftView.getSets().size() != 3){
+ public void updateDraft(DraftView draftView) {
+ if (draftView.getSets().size() != 3) {
// Random draft
this.txtPack1.setText("Random Boosters");
this.txtPack2.setText("Random Boosters");
this.txtPack3.setText("Random Boosters");
- }else{
+ } else {
this.txtPack1.setText(draftView.getSets().get(0));
this.txtPack2.setText(draftView.getSets().get(1));
this.txtPack3.setText(draftView.getSets().get(2));
@@ -167,17 +209,20 @@ public class DraftPanel extends javax.swing.JPanel {
this.chkPack3.setSelected(draftView.getBoosterNum() > 2);
this.txtCardNo.setText(Integer.toString(draftView.getCardNum()));
+ packNo = draftView.getBoosterNum();
+ pickNo = draftView.getCardNum();
+
int right = draftView.getPlayers().size() / 2;
int left = draftView.getPlayers().size() - right;
int height = left * 18;
lblTableImage.setSize(new Dimension(lblTableImage.getWidth(), height));
- Image tableImage = ImageHelper.getImageFromResources(draftView.getBoosterNum() == 2 ? "/draft/table_left.png":"/draft/table_right.png");
+ Image tableImage = ImageHelper.getImageFromResources(draftView.getBoosterNum() == 2 ? "/draft/table_left.png" : "/draft/table_right.png");
BufferedImage resizedTable = ImageHelper.getResizedImage(BufferedImageBuilder.bufferImage(tableImage, BufferedImage.TYPE_INT_ARGB), lblTableImage.getWidth());
lblTableImage.setIcon(new ImageIcon(resizedTable));
-
+
int count = 0;
int numberPlayers = draftView.getPlayers().size();
- for(String playerName: draftView.getPlayers()) {
+ for (String playerName : draftView.getPlayers()) {
count++;
setPlayerNameToLabel(playerName, count, numberPlayers);
}
@@ -188,13 +233,13 @@ public class DraftPanel extends javax.swing.JPanel {
int right = players / 2;
int left = players - right;
if (index <= left) {
- // left side down (1 - 8)
+ // left side down (1 - 8)
tablePosition = index;
} else {
// right side up (16 - 9)
tablePosition = 9 + right - (index - left);
}
- switch(tablePosition) {
+ switch (tablePosition) {
case 1:
lblPlayer01.setText(name);
break;
@@ -247,50 +292,51 @@ public class DraftPanel extends javax.swing.JPanel {
}
public void loadBooster(DraftPickView draftPickView) {
+ logLastPick(draftPickView);
// upper area that shows the picks
loadCardsToPickedCardsArea(draftPickView.getPicks());
this.draftPicks.clearCardEventListeners();
- this.draftPicks.addCardEventListener(new Listener () {
- @Override
- public void event(Event event) {
- if (event.getEventName().equals("show-popup-menu")) {
- if (event.getSource() != null) {
- // Popup Menu Card
- cardIdPopupMenu = ((SimpleCardView)event.getSource()).getId();
- popupMenuCardPanel.show(event.getComponent(), event.getxPos(), event.getyPos());
- } else {
- // Popup Menu area
- popupMenuPickedArea.show(event.getComponent(), event.getxPos(), event.getyPos());
- }
+ this.draftPicks.addCardEventListener(new Listener() {
+ @Override
+ public void event(Event event) {
+ if (event.getEventName().equals("show-popup-menu")) {
+ if (event.getSource() != null) {
+ // Popup Menu Card
+ cardIdPopupMenu = ((SimpleCardView) event.getSource()).getId();
+ popupMenuCardPanel.show(event.getComponent(), event.getxPos(), event.getyPos());
+ } else {
+ // Popup Menu area
+ popupMenuPickedArea.show(event.getComponent(), event.getxPos(), event.getyPos());
}
}
}
+ }
);
// lower area that shows the booster
draftBooster.loadBooster(CardsViewUtil.convertSimple(draftPickView.getBooster()), bigCard);
this.draftBooster.clearCardEventListeners();
this.draftBooster.addCardEventListener(
- new Listener () {
- @Override
- public void event(Event event) {
- if (event.getEventName().equals("pick-a-card")) {
- SimpleCardView source = (SimpleCardView) event.getSource();
- DraftPickView view = session.sendCardPick(draftId, source.getId(), cardsHidden);
- if (view != null) {
- loadCardsToPickedCardsArea(view.getPicks());
- draftBooster.loadBooster(emptyView, bigCard);
- Plugins.getInstance().getActionCallback().hidePopup();
- setMessage("Waiting for other players");
+ new Listener() {
+ @Override
+ public void event(Event event) {
+ if (event.getEventName().equals("pick-a-card")) {
+ SimpleCardView source = (SimpleCardView) event.getSource();
+ DraftPickView view = session.sendCardPick(draftId, source.getId(), cardsHidden);
+ if (view != null) {
+ loadCardsToPickedCardsArea(view.getPicks());
+ draftBooster.loadBooster(emptyView, bigCard);
+ Plugins.getInstance().getActionCallback().hideTooltipPopup();
+ setMessage("Waiting for other players");
+ }
+ }
+ if (event.getEventName().equals("mark-a-card")) {
+ SimpleCardView source = (SimpleCardView) event.getSource();
+ session.sendCardMark(draftId, source.getId());
}
}
- if (event.getEventName().equals("mark-a-card")) {
- SimpleCardView source = (SimpleCardView) event.getSource();
- session.sendCardMark(draftId, source.getId());
- }
}
- }
);
setMessage("Pick a card");
if (!MageFrame.getInstance().isActive()) {
@@ -307,7 +353,7 @@ public class DraftPanel extends javax.swing.JPanel {
private void loadCardsToPickedCardsArea(SimpleCardsView pickedCards) {
this.pickedCards = pickedCards;
- for (Map.Entry entry: pickedCards.entrySet()) {
+ for (Map.Entry entry : pickedCards.entrySet()) {
if (!cardsHidden.contains(entry.getKey())) {
pickedCardsShown.put(entry.getKey(), entry.getValue());
}
@@ -315,22 +361,22 @@ public class DraftPanel extends javax.swing.JPanel {
draftPicks.loadCards(CardsViewUtil.convertSimple(pickedCardsShown), bigCard, null);
}
- private void setTimeout(int s){
- int minute = s/60;
- int second = s - (minute*60);
+ private void setTimeout(int s) {
+ int minute = s / 60;
+ int second = s - (minute * 60);
String text;
- if(minute < 10){
+ if (minute < 10) {
text = "0" + Integer.toString(minute) + ":";
- }else{
+ } else {
text = Integer.toString(minute) + ":";
}
- if(second < 10){
+ if (second < 10) {
text = text + "0" + Integer.toString(second);
- }else{
+ } else {
text = text + Integer.toString(second);
}
this.txtTimeRemaining.setText(text);
- if (s==6 && !draftBooster.isEmptyGrid()) {
+ if (s == 6 && !draftBooster.isEmptyGrid()) {
AudioManager.playOnCountdown1();
}
}
@@ -341,7 +387,7 @@ public class DraftPanel extends javax.swing.JPanel {
c = c.getParent();
}
if (c != null) {
- ((DraftPane)c).removeDraft();
+ ((DraftPane) c).removeDraft();
}
}
@@ -375,7 +421,6 @@ public class DraftPanel extends javax.swing.JPanel {
});
// popupMenuPickedArea.addSeparator();
-
}
private void addPopupMenuCardPanel() {
@@ -394,7 +439,6 @@ public class DraftPanel extends javax.swing.JPanel {
});
// popupMenuCardPanel.addSeparator();
-
}
private void hideThisCard(UUID card) {
@@ -413,10 +457,97 @@ public class DraftPanel extends javax.swing.JPanel {
draftPicks.loadCards(CardsViewUtil.convertSimple(pickedCardsShown), bigCard, null);
}
- /** This method is called from within the constructor to
- * initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is
- * always regenerated by the Form Editor.
+ // Log the last card picked into the draft log together with booster
+ // contents.
+ // We don't get any event when the card is selected due to timeout
+ // that's why instead of proactively logging our pick we instead
+ // log *last* pick from the list of picks.
+ // To make this possible we cache the list of cards from the
+ // previous booster and it's sequence number (pack number / pick number)
+ // in fields currentBooster and currentBoosterHeader.
+ private void logLastPick(DraftPickView pickView) {
+ if (!isLogging()) {
+ return;
+ }
+ if (currentBooster != null) {
+ String lastPick = getCardName(getLastPick(pickView.getPicks().values()));
+ if (lastPick != null && currentBooster.length > 1) {
+ logPick(lastPick);
+ }
+ currentBooster = null;
+ }
+ setCurrentBoosterForLog(pickView.getBooster());
+ if (currentBooster.length == 1) {
+ logPick(currentBooster[0]);
+ }
+ }
+
+ private static boolean isLogging() {
+ String autoSave = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_DRAFT_LOG_AUTO_SAVE, "true");
+ return autoSave.equals("true");
+ }
+
+ private void setCurrentBoosterForLog(SimpleCardsView booster) {
+ LinkedList cards = new LinkedList<>();
+ for (SimpleCardView simple : booster.values()) {
+ String cardName = getCardName(simple);
+ if (cardName != null) {
+ cards.add(cardName);
+ }
+ }
+
+ currentBoosterHeader = "Pack " + packNo + " pick " + pickNo + ":\n";
+ currentBooster = cards.toArray(new String[cards.size()]);
+ }
+
+ private void logPick(String pick) {
+ StringBuilder b = new StringBuilder();
+ b.append(currentBoosterHeader);
+ for (String name : currentBooster) {
+ b.append(pick.equals(name) ? "--> " : " ");
+ b.append(name);
+ b.append('\n');
+ }
+ b.append('\n');
+ appendToDraftLog(b.toString());
+ }
+
+ private Path pathToDraftLog() {
+ File saveDir = new File("gamelogs");
+ if (!saveDir.exists()) {
+ saveDir.mkdirs();
+ }
+ return new File(saveDir, logFilename).toPath();
+ }
+
+ private void appendToDraftLog(String data) {
+ try {
+ Files.write(pathToDraftLog(), data.getBytes(), StandardOpenOption.APPEND);
+ } catch (IOException ex) {
+ logger.error(null, ex);
+ }
+ }
+
+ private static SimpleCardView getLastPick(Collection picks) {
+ SimpleCardView last = null;
+ for (SimpleCardView pick : picks) {
+ last = pick;
+ }
+ return last;
+ }
+
+ private static String getCardName(SimpleCardView card) {
+ if (card == null) {
+ return null;
+ }
+ CardInfo cardInfo = CardRepository.instance.findCard(card.getExpansionSetCode(), card.getCardNumber());
+ return cardInfo != null ? cardInfo.getName() : null;
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
diff --git a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java
index 5daa90a9f71..6b68931c35e 100644
--- a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java
@@ -42,12 +42,14 @@ import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import mage.client.MageFrame;
-import mage.client.chat.ChatPanel;
+import mage.client.chat.ChatPanelBasic;
import mage.client.components.MageTextArea;
import mage.client.dialog.MageDialog;
import mage.client.util.audio.AudioManager;
import mage.client.util.gui.ArrowBuilder;
-import mage.constants.Constants;
+import static mage.constants.Constants.Option.ORIGINAL_ID;
+import static mage.constants.Constants.Option.SECOND_MESSAGE;
+import static mage.constants.Constants.Option.SPECIAL_BUTTON;
import mage.constants.PlayerAction;
import mage.remote.Session;
import org.apache.log4j.Logger;
@@ -69,7 +71,7 @@ public class FeedbackPanel extends javax.swing.JPanel {
private Session session;
private FeedbackMode mode;
private MageDialog connectedDialog;
- private ChatPanel connectedChatPanel;
+ private ChatPanelBasic connectedChatPanel;
private int lastMessageId;
private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();
@@ -85,6 +87,7 @@ public class FeedbackPanel extends javax.swing.JPanel {
public void init(UUID gameId) {
this.gameId = gameId;
session = MageFrame.getSession();
+ helper.init(gameId);
}
public void getFeedback(FeedbackMode mode, String message, boolean special, Map options, int messageId) {
@@ -95,61 +98,42 @@ public class FeedbackPanel extends javax.swing.JPanel {
}
this.lastMessageId = messageId;
}
-
- this.lblMessage.setText(message);
- this.helper.setMessage(message);
+ this.helper.setBasicMessage(message);
+ this.helper.setOriginalId(null); // reference to the feedback causing ability
+ String lblText = addAdditionalText(message, options);
+ this.helper.setTextArea(lblText);
+ this.lblMessage.setText(lblText);
this.mode = mode;
switch (this.mode) {
case INFORM:
- this.btnLeft.setVisible(false);
- this.btnRight.setVisible(false);
- this.helper.setState("", false, "", false);
+ setButtonState("", "", mode);
break;
case QUESTION:
- this.btnLeft.setVisible(true);
- this.btnLeft.setText("Yes");
- this.btnRight.setVisible(true);
- this.btnRight.setText("No");
- this.helper.setState("Yes", true, "No", true);
+ setButtonState("Yes", "No", mode);
+ if (options != null && options.containsKey(ORIGINAL_ID)) {
+ this.helper.setOriginalId((UUID) options.get(ORIGINAL_ID));
+ }
break;
case CONFIRM:
- this.btnLeft.setVisible(true);
- this.btnLeft.setText("OK");
- this.btnRight.setVisible(true);
- this.btnRight.setText("Cancel");
- this.helper.setState("Ok", true, "Cancel", true);
+ setButtonState("OK", "Cancel", mode);
break;
case CANCEL:
- this.btnLeft.setVisible(false);
- this.btnRight.setVisible(true);
- this.btnRight.setText("Cancel");
- this.helper.setState("", false, "Cancel", true);
+ setButtonState("", "Cancel", mode);
this.helper.setUndoEnabled(false);
break;
case SELECT:
- this.btnLeft.setVisible(false);
- this.btnRight.setVisible(true);
- this.btnRight.setText("Done");
- this.helper.setState("", false, "Done", true);
+ setButtonState("", "Done", mode);
break;
case END:
- this.btnLeft.setVisible(false);
- this.btnRight.setVisible(true);
- this.btnRight.setText("Close game");
- this.helper.setState("", false, "Close game", true);
+ setButtonState("", "Close game", mode);
ArrowBuilder.getBuilder().removeAllArrows(gameId);
endWithTimeout();
break;
}
- if (options != null && options.containsKey(Constants.Option.SPECIAL_BUTTON)) {
- String specialText = (String) options.get(Constants.Option.SPECIAL_BUTTON);
- this.btnSpecial.setVisible(true);
- this.btnSpecial.setText(specialText);
- this.helper.setSpecial(specialText, true);
+ if (options != null && options.containsKey(SPECIAL_BUTTON)) {
+ this.setSpecial((String) options.get(SPECIAL_BUTTON), true);
} else {
- this.btnSpecial.setVisible(special);
- this.btnSpecial.setText("Special");
- this.helper.setSpecial("Special", special);
+ this.setSpecial("Special", special);
}
requestFocusIfPossible();
@@ -162,6 +146,32 @@ public class FeedbackPanel extends javax.swing.JPanel {
this.helper.setVisible(true);
}
+ private void setButtonState(String leftText, String rightText, FeedbackMode mode) {
+ btnLeft.setVisible(!leftText.isEmpty());
+ btnLeft.setText(leftText);
+ btnRight.setVisible(!rightText.isEmpty());
+ btnRight.setText(rightText);
+ this.helper.setState(leftText, !leftText.isEmpty(), rightText, !rightText.isEmpty(), mode);
+ }
+
+ private String addAdditionalText(String message, Map options) {
+ if (options != null && options.containsKey(SECOND_MESSAGE)) {
+ return message + getSmallText((String) options.get(SECOND_MESSAGE));
+ } else {
+ return message;
+ }
+ }
+
+ protected String getSmallText(String text) {
+ return "
" + text + "
";
+ }
+
+ private void setSpecial(String text, boolean visible) {
+ this.btnSpecial.setText(text);
+ this.btnSpecial.setVisible(visible);
+ this.helper.setSpecial(text, visible);
+ }
+
/**
* Close game window by pressing OK button after 8 seconds
*/
@@ -313,7 +323,7 @@ public class FeedbackPanel extends javax.swing.JPanel {
return this.mode;
}
- public void setConnectedChatPanel(ChatPanel chatPanel) {
+ public void setConnectedChatPanel(ChatPanelBasic chatPanel) {
this.connectedChatPanel = chatPanel;
}
diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java
index 2d172a6a33f..0a44146935b 100644
--- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java
@@ -66,8 +66,10 @@ import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLayeredPane;
+import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;
import javax.swing.SwingWorker;
import javax.swing.border.Border;
@@ -80,7 +82,7 @@ import mage.cards.action.ActionCallback;
import mage.choices.Choice;
import mage.client.MageFrame;
import mage.client.cards.BigCard;
-import mage.client.chat.ChatPanel;
+import mage.client.chat.ChatPanelBasic;
import mage.client.combat.CombatManager;
import mage.client.components.HoverButton;
import mage.client.components.MageComponents;
@@ -100,7 +102,9 @@ import mage.client.plugins.adapters.MageActionCallback;
import mage.client.plugins.impl.Plugins;
import mage.client.util.CardsViewUtil;
import mage.client.util.Config;
+import mage.client.util.Event;
import mage.client.util.GameManager;
+import mage.client.util.Listener;
import mage.client.util.audio.AudioManager;
import mage.client.util.gui.ArrowBuilder;
import mage.client.util.gui.MageDialogState;
@@ -118,7 +122,13 @@ import static mage.constants.PhaseStep.FIRST_COMBAT_DAMAGE;
import static mage.constants.PhaseStep.UNTAP;
import static mage.constants.PhaseStep.UPKEEP;
import mage.constants.PlayerAction;
+import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_ABILITY_FIRST;
+import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_ABILITY_LAST;
+import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_NAME_FIRST;
+import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_NAME_LAST;
+import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_RESET_ALL;
import mage.constants.Zone;
+import mage.game.events.PlayerQueryEvent;
import mage.remote.Session;
import mage.view.AbilityPickerView;
import mage.view.CardView;
@@ -131,6 +141,7 @@ import mage.view.PlayerView;
import mage.view.RevealedView;
import mage.view.SimpleCardsView;
import org.apache.log4j.Logger;
+import org.mage.card.arcane.CardPanel;
import org.mage.plugins.card.utils.impl.ImageManagerImpl;
/**
@@ -143,6 +154,13 @@ public final class GamePanel extends javax.swing.JPanel {
private static final String YOUR_HAND = "Your hand";
private static final int X_PHASE_WIDTH = 55;
private static final int STACK_MIN_CARDS_OFFSET_Y = 7;
+
+ private static final String CMD_AUTO_ORDER_FIRST = "cmdAutoOrderFirst";
+ private static final String CMD_AUTO_ORDER_LAST = "cmdAutoOrderLast";
+ private static final String CMD_AUTO_ORDER_NAME_FIRST = "cmdAutoOrderNameFirst";
+ private static final String CMD_AUTO_ORDER_NAME_LAST = "cmdAutoOrderNameLast";
+ private static final String CMD_AUTO_ORDER_RESET_ALL = "cmdAutoOrderResetAll";
+
private final Map players = new HashMap<>();
// non modal frames
@@ -174,9 +192,22 @@ public final class GamePanel extends javax.swing.JPanel {
private MageDialogState choiceWindowState;
+ private enum PopUpMenuType {
+
+ TRIGGER_ORDER
+ }
+ // CardView popupMenu was invoked last
+ private CardView cardViewPopupMenu;
+
+ // popup menu for triggered abilities order
+ private JPopupMenu popupMenuTriggerOrder;
+
public GamePanel() {
initComponents();
+ initPopupMenuTriggerOrder();
+ //this.add(popupMenuTriggerOrder);
+
pickNumber = new PickNumberDialog();
MageFrame.getDesktop().add(pickNumber, JLayeredPane.MODAL_LAYER);
@@ -281,7 +312,7 @@ public final class GamePanel extends javax.swing.JPanel {
pickTargetDialog.cleanUp();
pickTargetDialog.removeDialog();
}
- Plugins.getInstance().getActionCallback().hidePopup();
+ Plugins.getInstance().getActionCallback().hideTooltipPopup();
try {
Component popupContainer = MageFrame.getUI().getComponent(MageComponents.POPUP_CONTAINER);
popupContainer.setVisible(false);
@@ -957,31 +988,37 @@ public final class GamePanel extends javax.swing.JPanel {
* @param messageId
*/
public void pickTarget(String message, CardsView cardView, GameView gameView, Set targets, boolean required, Map options, int messageId) {
- ShowCardsDialog dialog = null;
- if (options != null && options.containsKey("targetZone")) {
- if (Zone.HAND.equals(options.get("targetZone"))) { // mark selectable target cards in hand
- List choosen = null;
- if (options.containsKey("chosen")) {
- choosen = (List) options.get("chosen");
- }
- for (CardView card : gameView.getHand().values()) {
- if (targets == null || targets.isEmpty()) {
- card.setPlayable(false);
- card.setChoosable(true);
- } else if (targets.contains(card.getId())) {
- card.setPlayable(false);
- card.setChoosable(true);
+ PopUpMenuType popupMenuType = null;
+ if (options != null) {
+ if (options.containsKey("targetZone")) {
+ if (Zone.HAND.equals(options.get("targetZone"))) { // mark selectable target cards in hand
+ List choosen = null;
+ if (options.containsKey("chosen")) {
+ choosen = (List) options.get("chosen");
}
- if (choosen != null && choosen.contains(card.getId())) {
- card.setSelected(true);
+ for (CardView card : gameView.getHand().values()) {
+ if (targets == null || targets.isEmpty()) {
+ card.setPlayable(false);
+ card.setChoosable(true);
+ } else if (targets.contains(card.getId())) {
+ card.setPlayable(false);
+ card.setChoosable(true);
+ }
+ if (choosen != null && choosen.contains(card.getId())) {
+ card.setSelected(true);
+ }
}
}
}
+ if (options.containsKey("queryType") && PlayerQueryEvent.QueryType.PICK_ABILITY.equals(options.get("queryType"))) {
+ popupMenuType = PopUpMenuType.TRIGGER_ORDER;
+ }
}
updateGame(gameView);
Map options0 = options == null ? new HashMap() : options;
+ ShowCardsDialog dialog = null;
if (cardView != null && cardView.size() > 0) {
- dialog = showCards(message, cardView, required, options0);
+ dialog = showCards(message, cardView, required, options0, popupMenuType);
options0.put("dialog", dialog);
}
this.feedbackPanel.getFeedback(required ? FeedbackMode.INFORM : FeedbackMode.CANCEL, message, gameView.getSpecial(), options0, messageId);
@@ -1066,10 +1103,14 @@ public final class GamePanel extends javax.swing.JPanel {
((MageActionCallback) callback).hideGameUpdate(gameId);
}
- private ShowCardsDialog showCards(String title, CardsView cards, boolean required, Map options) {
+ private ShowCardsDialog showCards(String title, CardsView cards, boolean required, Map options, PopUpMenuType popupMenuType) {
hideAll();
ShowCardsDialog showCards = new ShowCardsDialog();
- showCards.loadCards(title, cards, bigCard, Config.dimensionsEnlarged, gameId, required, options);
+ JPopupMenu popupMenu = null;
+ if (PopUpMenuType.TRIGGER_ORDER.equals(popupMenuType)) {
+ popupMenu = popupMenuTriggerOrder;
+ }
+ showCards.loadCards(title, cards, bigCard, Config.dimensionsEnlarged, gameId, required, options, popupMenu, getShowCardsEventListener(showCards));
return showCards;
}
@@ -1163,12 +1204,12 @@ public final class GamePanel extends javax.swing.JPanel {
btnSkipForward = new javax.swing.JButton();
btnPreviousPlay = new javax.swing.JButton();
pnlBattlefield = new javax.swing.JPanel();
- gameChatPanel = new mage.client.chat.ChatPanel();
- gameChatPanel.useExtendedView(ChatPanel.VIEW_MODE.GAME);
- userChatPanel = new mage.client.chat.ChatPanel();
+ gameChatPanel = new mage.client.chat.ChatPanelBasic();
+ gameChatPanel.useExtendedView(ChatPanelBasic.VIEW_MODE.GAME);
+ userChatPanel = new mage.client.chat.ChatPanelBasic();
userChatPanel.setParentChat(gameChatPanel);
- userChatPanel.useExtendedView(ChatPanel.VIEW_MODE.CHAT);
- userChatPanel.setChatType(ChatPanel.ChatType.GAME);
+ userChatPanel.useExtendedView(ChatPanelBasic.VIEW_MODE.CHAT);
+ userChatPanel.setChatType(ChatPanelBasic.ChatType.GAME);
gameChatPanel.setConnectedChat(userChatPanel);
gameChatPanel.disableInput();
gameChatPanel.setMinimumSize(new java.awt.Dimension(100, 48));
@@ -1942,6 +1983,106 @@ public final class GamePanel extends javax.swing.JPanel {
hoverButtons.put(name, button);
}
+ // Event listener for the ShowCardsDialog
+ private Listener getShowCardsEventListener(final ShowCardsDialog dialog) {
+ return new Listener() {
+ @Override
+ public void event(Event event) {
+ if (event.getEventName().equals("show-popup-menu")) {
+ if (event.getComponent() != null && event.getComponent() instanceof CardPanel) {
+ JPopupMenu menu = ((CardPanel) event.getComponent()).getPopupMenu();
+ if (menu != null) {
+ cardViewPopupMenu = ((CardView) event.getSource());
+ menu.show(event.getComponent(), event.getxPos(), event.getyPos());
+ }
+ }
+ }
+ if (event.getEventName().equals("action-consumed")) {
+ dialog.removeDialog();
+ }
+ }
+ };
+ }
+
+ public void handleTriggerOrderPopupMenuEvent(ActionEvent e) {
+ UUID abilityId = null;
+ String abilityRuleText = null;
+ if (cardViewPopupMenu instanceof CardView && cardViewPopupMenu.getAbility() != null) {
+ abilityId = cardViewPopupMenu.getAbility().getId();
+ if (!cardViewPopupMenu.getAbility().getRules().isEmpty()
+ && !cardViewPopupMenu.getAbility().getRules().get(0).isEmpty()) {
+ abilityRuleText = cardViewPopupMenu.getAbility().getRules().get(0);
+ }
+ }
+ switch (e.getActionCommand()) {
+ case CMD_AUTO_ORDER_FIRST:
+ session.sendPlayerAction(TRIGGER_AUTO_ORDER_ABILITY_FIRST, gameId, abilityId);
+ session.sendPlayerUUID(gameId, abilityId);
+ break;
+ case CMD_AUTO_ORDER_LAST:
+ session.sendPlayerAction(TRIGGER_AUTO_ORDER_ABILITY_LAST, gameId, abilityId);
+ session.sendPlayerUUID(gameId, null); // Don't use this but refresh the displayed abilities
+ break;
+ case CMD_AUTO_ORDER_NAME_FIRST:
+ if (abilityRuleText != null) {
+ session.sendPlayerAction(TRIGGER_AUTO_ORDER_NAME_FIRST, gameId, abilityRuleText);
+ session.sendPlayerUUID(gameId, abilityId);
+ }
+ break;
+ case CMD_AUTO_ORDER_NAME_LAST:
+ if (abilityRuleText != null) {
+ session.sendPlayerAction(TRIGGER_AUTO_ORDER_NAME_LAST, gameId, abilityRuleText);
+ session.sendPlayerUUID(gameId, null); // Don't use this but refresh the displayed abilities
+ }
+ break;
+ case CMD_AUTO_ORDER_RESET_ALL:
+ session.sendPlayerAction(TRIGGER_AUTO_ORDER_RESET_ALL, gameId, null);
+ break;
+ }
+ for (ShowCardsDialog dialog : pickTarget) {
+ dialog.removeDialog();
+ }
+ }
+
+ private void initPopupMenuTriggerOrder() {
+
+ ActionListener actionListener = new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ handleTriggerOrderPopupMenuEvent(e);
+ }
+ };
+
+ popupMenuTriggerOrder = new JPopupMenu();
+
+ // String tooltipText = "";
+ JMenuItem menuItem;
+ menuItem = new JMenuItem("Put this ability always first on the stack");
+ menuItem.setActionCommand(CMD_AUTO_ORDER_FIRST);
+ menuItem.addActionListener(actionListener);
+ popupMenuTriggerOrder.add(menuItem);
+
+ menuItem = new JMenuItem("Put this ability always last on the stack");
+ menuItem.setActionCommand(CMD_AUTO_ORDER_LAST);
+ menuItem.addActionListener(actionListener);
+ popupMenuTriggerOrder.add(menuItem);
+
+ menuItem = new JMenuItem("Put all abilities with that rule text always first on the stack");
+ menuItem.setActionCommand(CMD_AUTO_ORDER_NAME_FIRST);
+ menuItem.addActionListener(actionListener);
+ popupMenuTriggerOrder.add(menuItem);
+
+ menuItem = new JMenuItem("Put all abilities with that rule text always last on the stack");
+ menuItem.setActionCommand(CMD_AUTO_ORDER_NAME_LAST);
+ menuItem.addActionListener(actionListener);
+ popupMenuTriggerOrder.add(menuItem);
+
+ menuItem = new JMenuItem("Reset all order settings for triggered abilities");
+ menuItem.setActionCommand(CMD_AUTO_ORDER_RESET_ALL);
+ menuItem.addActionListener(actionListener);
+ popupMenuTriggerOrder.add(menuItem);
+ }
+
public String getGameLog() {
return gameChatPanel.getText();
}
@@ -1984,9 +2125,9 @@ public final class GamePanel extends javax.swing.JPanel {
private javax.swing.JButton btnStopWatching;
- private mage.client.chat.ChatPanel gameChatPanel;
+ private mage.client.chat.ChatPanelBasic gameChatPanel;
private mage.client.game.FeedbackPanel feedbackPanel;
- private mage.client.chat.ChatPanel userChatPanel;
+ private mage.client.chat.ChatPanelBasic userChatPanel;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JSplitPane jSplitPane0;
diff --git a/Mage.Client/src/main/java/mage/client/game/HelperPanel.java b/Mage.Client/src/main/java/mage/client/game/HelperPanel.java
index 829493e0e1c..8a06f33d539 100644
--- a/Mage.Client/src/main/java/mage/client/game/HelperPanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/HelperPanel.java
@@ -28,17 +28,34 @@
package mage.client.game;
import java.awt.Color;
+import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagLayout;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.UUID;
import javax.swing.BoxLayout;
import javax.swing.JButton;
+import javax.swing.JMenuItem;
import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
import javax.swing.UIManager;
+import mage.client.MageFrame;
import mage.client.components.MageTextArea;
+import mage.client.game.FeedbackPanel.FeedbackMode;
+import static mage.client.game.FeedbackPanel.FeedbackMode.QUESTION;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_ID_NO;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_ID_YES;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_RESET_ALL;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_TEXT_NO;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_TEXT_YES;
+import mage.remote.Session;
/**
* Panel with buttons that copy the state of feedback panel.
@@ -64,12 +81,34 @@ public class HelperPanel extends JPanel {
private final int defaultDismissTimeout = ToolTipManager.sharedInstance().getDismissDelay();
private final Object tooltipBackground = UIManager.get("info");
+ private static final String CMD_AUTO_ANSWER_ID_YES = "cmdAutoAnswerIdYes";
+ private static final String CMD_AUTO_ANSWER_ID_NO = "cmdAutoAnswerIdNo";
+ private static final String CMD_AUTO_ANSWER_NAME_YES = "cmdAutoAnswerNameYes";
+ private static final String CMD_AUTO_ANSWER_NAME_NO = "cmdAutoAnswerNameNo";
+ private static final String CMD_AUTO_ANSWER_RESET_ALL = "cmdAutoAnswerResetAll";
+
+ // popup menu for set automatic answers
+ private JPopupMenu popupMenuAskYes;
+ private JPopupMenu popupMenuAskNo;
+
+ // originalId of feedback causing ability
+ private UUID originalId;
+ private String message;
+
+ private UUID gameId;
+ private Session session;
+
public HelperPanel() {
initComponents();
}
- private void initComponents() {
+ public void init(UUID gameId) {
+ this.gameId = gameId;
+ session = MageFrame.getSession();
+ }
+ private void initComponents() {
+ initPopupMenuTriggerOrder();
setBackground(new Color(0, 0, 0, 100));
//setLayout(new GridBagLayout());
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
@@ -108,72 +147,44 @@ public class HelperPanel extends JPanel {
btnUndo.setVisible(false);
container.add(btnUndo);
- btnLeft.addActionListener(new java.awt.event.ActionListener() {
+ MouseListener checkPopupAdapter = new MouseAdapter() {
+ @Override
+ public void mousePressed(MouseEvent me) {
+ checkPopupMenu(me);
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent me) {
+ checkPopupMenu(me);
+ }
+
+ };
+
+ btnLeft.addMouseListener(checkPopupAdapter);
+ btnLeft.addActionListener(new ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (linkLeft != null) {
- {
- Thread worker = new Thread() {
- @Override
- public void run() {
- SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
- setState("", false, "", false);
- setSpecial("", false);
- linkLeft.doClick();
- }
- });
- }
- };
- worker.start();
- }
+ clickButton(linkLeft);
}
}
});
- btnRight.addActionListener(new java.awt.event.ActionListener() {
+ btnRight.addMouseListener(checkPopupAdapter);
+ btnRight.addActionListener(new ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (linkRight != null) {
- Thread worker = new Thread() {
- @Override
- public void run() {
- SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
- setState("", false, "", false);
- setSpecial("", false);
- linkRight.doClick();
- }
- });
- }
- };
- worker.start();
+ clickButton(linkRight);
}
}
});
- btnSpecial.addActionListener(new java.awt.event.ActionListener() {
+ btnSpecial.addActionListener(new ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (linkSpecial != null) {
- {
- Thread worker = new Thread() {
- @Override
- public void run() {
- SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
- setState("", false, "", false);
- setSpecial("", false);
- linkSpecial.doClick();
- }
- });
- }
- };
- worker.start();
- }
+ clickButton(linkSpecial);
}
}
});
@@ -200,7 +211,7 @@ public class HelperPanel extends JPanel {
}
});
- // sets a darker background and higher simiss time fpr tooltip in the feedback / helper panel
+ // sets a darker background and higher simiss time fur tooltip in the feedback / helper panel
textArea.addMouseListener(new MouseAdapter() {
@Override
@@ -217,15 +228,50 @@ public class HelperPanel extends JPanel {
});
}
- public void setState(String txtLeft, boolean leftVisible, String txtRight, boolean rightVisible) {
+ private void checkPopupMenu(MouseEvent me) {
+ if (me.isPopupTrigger()
+ && originalId != null) { // only Yes/No requests from abilities can be automated
+ JButton source = (JButton) me.getSource();
+ if (source.getActionCommand().startsWith(QUESTION.toString())) {
+ showPopupMenu(me.getComponent(), source.getActionCommand());
+ me.consume();
+ }
+ }
+ }
+
+ private void clickButton(final JButton button) {
+ Thread worker = new Thread() {
+ @Override
+ public void run() {
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ setState("", false, "", false, null);
+ setSpecial("", false);
+ button.doClick();
+ }
+ });
+ }
+ };
+ worker.start();
+ }
+
+ public void setState(String txtLeft, boolean leftVisible, String txtRight, boolean rightVisible, FeedbackMode mode) {
this.btnLeft.setVisible(leftVisible);
if (!txtLeft.isEmpty()) {
this.btnLeft.setText(txtLeft);
+ if (mode != null) {
+ this.btnLeft.setActionCommand(mode.toString() + txtLeft);
+ }
}
this.btnRight.setVisible(rightVisible);
if (!txtRight.isEmpty()) {
this.btnRight.setText(txtRight);
+ if (mode != null) {
+ this.btnRight.setActionCommand(mode.toString() + txtRight);
+ }
}
+
}
public void setSpecial(String txtSpecial, boolean specialVisible) {
@@ -251,25 +297,116 @@ public class HelperPanel extends JPanel {
this.linkUndo = undo;
}
- public void setMessage(String message) {
-// if (message.startsWith("Use alternative cost")) {
-// message = "Use alternative cost?";
-// } else if (message.contains("Use ")) {
-// if (message.length() < this.getWidth() / 10) {
-// message = getSmallText(message);
-// } else {
-// message = "Use ability?" + getSmallText(message.substring(0, this.getWidth() / 10));
-// }
-// }
- textArea.setText(message, this.getWidth());
+ public void setOriginalId(UUID originalId) {
+ this.originalId = originalId;
}
- protected String getSmallText(String text) {
- return "
" + text + "
";
+ public void setBasicMessage(String message) {
+ this.message = message;
+ this.textArea.setText(message, this.getWidth());
+ }
+
+ public void setTextArea(String message) {
+ this.textArea.setText(message, this.getWidth());
}
@Override
public void requestFocus() {
this.btnRight.requestFocus();
}
+
+ private void initPopupMenuTriggerOrder() {
+
+ ActionListener actionListener = new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ handleAutoAnswerPopupMenuEvent(e);
+ }
+ };
+
+ popupMenuAskYes = new JPopupMenu();
+ popupMenuAskNo = new JPopupMenu();
+
+ // String tooltipText = "";
+ JMenuItem menuItem;
+ menuItem = new JMenuItem("Always Yes for the same text and ability");
+ menuItem.setActionCommand(CMD_AUTO_ANSWER_ID_YES);
+ menuItem.addActionListener(actionListener);
+ menuItem.setToolTipText("If the same question from the same ability would be asked again, it's automatically answered with Yes.");
+ popupMenuAskYes.add(menuItem);
+
+ menuItem = new JMenuItem("Always No for the same text and ability");
+ menuItem.setActionCommand(CMD_AUTO_ANSWER_ID_NO);
+ menuItem.setToolTipText("If the same question from the same ability would be asked again, it's automatically answered with No.");
+ menuItem.addActionListener(actionListener);
+ popupMenuAskNo.add(menuItem);
+
+ menuItem = new JMenuItem("Always Yes for the same text");
+ menuItem.setActionCommand(CMD_AUTO_ANSWER_NAME_YES);
+ menuItem.setToolTipText("If the same question would be asked again (regardless from which source), it's automatically answered with Yes.");
+ menuItem.addActionListener(actionListener);
+ popupMenuAskYes.add(menuItem);
+
+ menuItem = new JMenuItem("Always No for the same text");
+ menuItem.setActionCommand(CMD_AUTO_ANSWER_NAME_NO);
+ menuItem.setToolTipText("If the same question would be asked again (regardless from which source), it's automatically answered with No.");
+ menuItem.addActionListener(actionListener);
+ popupMenuAskNo.add(menuItem);
+
+ menuItem = new JMenuItem("Delete all automatic Yes/No settings");
+ menuItem.setActionCommand(CMD_AUTO_ANSWER_RESET_ALL);
+ menuItem.addActionListener(actionListener);
+ popupMenuAskYes.add(menuItem);
+
+ menuItem = new JMenuItem("Delete all automatic Yes/No settings");
+ menuItem.setActionCommand(CMD_AUTO_ANSWER_RESET_ALL);
+ menuItem.addActionListener(actionListener);
+ popupMenuAskNo.add(menuItem);
+ }
+
+ public void handleAutoAnswerPopupMenuEvent(ActionEvent e) {
+ switch (e.getActionCommand()) {
+ case CMD_AUTO_ANSWER_ID_YES:
+ session.sendPlayerAction(REQUEST_AUTO_ANSWER_ID_YES, gameId, originalId.toString() + "#" + message);
+ clickButton(btnLeft);
+ break;
+ case CMD_AUTO_ANSWER_ID_NO:
+ session.sendPlayerAction(REQUEST_AUTO_ANSWER_ID_NO, gameId, originalId.toString() + "#" + message);
+ clickButton(btnRight);
+ break;
+ case CMD_AUTO_ANSWER_NAME_YES:
+ session.sendPlayerAction(REQUEST_AUTO_ANSWER_TEXT_YES, gameId, message);
+ clickButton(btnLeft);
+ break;
+ case CMD_AUTO_ANSWER_NAME_NO:
+ session.sendPlayerAction(REQUEST_AUTO_ANSWER_TEXT_NO, gameId, message);
+ clickButton(btnRight);
+ break;
+ case CMD_AUTO_ANSWER_RESET_ALL:
+ session.sendPlayerAction(REQUEST_AUTO_ANSWER_RESET_ALL, gameId, null);
+ break;
+ }
+ }
+
+ private void showPopupMenu(Component callingComponent, String actionCommand) {
+ // Get the location of the point 'on the screen'
+ Point p = callingComponent.getLocationOnScreen();
+ // Show the JPopupMenu via program
+ // Parameter desc
+ // ----------------
+ // this - represents current frame
+ // 0,0 is the co ordinate where the popup
+ // is shown
+ JPopupMenu menu;
+ if (actionCommand.endsWith("Yes")) {
+ menu = popupMenuAskYes;
+ } else {
+ menu = popupMenuAskNo;
+ }
+ menu.show(this, 0, 0);
+
+ // Now set the location of the JPopupMenu
+ // This location is relative to the screen
+ menu.setLocation(p.x, p.y + callingComponent.getHeight());
+ }
}
diff --git a/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java b/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java
index a3d2f246c4d..44f2f509b54 100644
--- a/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java
@@ -278,6 +278,30 @@ public class PlayAreaPanel extends javax.swing.JPanel {
}
});
+ menuItem = new JMenuItem("Triggered abilities - reset auto stack order");
+ menuItem.setMnemonic(KeyEvent.VK_T);
+ menuItem.setToolTipText("Deletes all triggered ability order settings you added during the game.");
+ automaticConfirmsMenu.add(menuItem);
+ // Reset the replacement effcts that were auto selected for the game
+ menuItem.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ gamePanel.getSession().sendPlayerAction(PlayerAction.TRIGGER_AUTO_ORDER_RESET_ALL, gameId, null);
+ }
+ });
+
+ menuItem = new JMenuItem("Use requests - reset automatic answers");
+ menuItem.setMnemonic(KeyEvent.VK_T);
+ menuItem.setToolTipText("Deletes all defined automatic answers for Yes/No usage requests.");
+ automaticConfirmsMenu.add(menuItem);
+ // Reset the replacement effcts that were auto selected for the game
+ menuItem.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ gamePanel.getSession().sendPlayerAction(PlayerAction.REQUEST_AUTO_ANSWER_RESET_ALL, gameId, null);
+ }
+ });
+
JMenu handCardsMenu = new JMenu("Cards on hand");
handCardsMenu.setMnemonic(KeyEvent.VK_H);
popupMenu.add(handCardsMenu);
diff --git a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java
index 01ffad75880..347b69c1267 100644
--- a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java
+++ b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java
@@ -69,6 +69,9 @@ import mage.client.util.ImageHelper;
import mage.client.util.gui.BufferedImageBuilder;
import mage.client.util.gui.countryBox.CountryUtil;
import mage.components.ImagePanel;
+import static mage.constants.Constants.DEFAULT_AVATAR_ID;
+import static mage.constants.Constants.MAX_AVATAR_ID;
+import static mage.constants.Constants.MIN_AVATAR_ID;
import mage.constants.ManaType;
import mage.remote.Session;
import mage.utils.timer.PriorityTimer;
@@ -92,7 +95,7 @@ public class PlayerPanelExt extends javax.swing.JPanel {
private static final int AVATAR_COUNT = 77;
- private static final String DEFAULT_AVATAR_PATH = "/avatars/51.jpg";
+ private static final String DEFAULT_AVATAR_PATH = "/avatars/" + DEFAULT_AVATAR_ID + ".jpg";
private static final int PANEL_WIDTH = 94;
private static final int PANEL_HEIGHT = 242;
@@ -105,6 +108,7 @@ public class PlayerPanelExt extends javax.swing.JPanel {
private int avatarId = -1;
private String flagName;
+ private String basicTooltipText;
private PriorityTimer timer;
@@ -156,25 +160,7 @@ public class PlayerPanelExt extends javax.swing.JPanel {
public void update(PlayerView player) {
this.player = player;
- if (flagName == null) { // do only once
- avatar.setText(this.player.getName());
- if (!player.getUserData().getFlagName().equals(flagName)) {
- flagName = player.getUserData().getFlagName();
- this.avatar.setTopTextImage(CountryUtil.getCountryFlagIcon(flagName).getImage());
- }
- // TODO: Add the wins to the tooltiptext of the avatar
- String countryname = CountryUtil.getCountryName(flagName);
- if (countryname == null) {
- countryname = "Unknown";
- }
- String tooltip = "Name: " + player.getName() + " Country: " + countryname;
- avatar.setToolTipText(tooltip);
- avatar.repaint();
-
- // used if avatar image can't be used
- this.btnPlayer.setText(player.getName());
- this.btnPlayer.setToolTipText(tooltip);
- }
+ updateAvatar();
int playerLife = player.getLife();
if (playerLife > 99) {
Font font = lifeLabel.getFont();
@@ -238,8 +224,8 @@ public class PlayerPanelExt extends javax.swing.JPanel {
if (!MageFrame.isLite()) {
int id = player.getUserData().getAvatarId();
- if (id <= 0) {
- id = PreferencesDialog.DEFAULT_AVATAR_ID;
+ if (!(id >= 1000) && (id <= 0 || (id <= MIN_AVATAR_ID && id > MAX_AVATAR_ID))) {
+ id = DEFAULT_AVATAR_ID;
}
if (id != avatarId) {
avatarId = id;
@@ -284,6 +270,39 @@ public class PlayerPanelExt extends javax.swing.JPanel {
update(player.getManaPool());
}
+ /**
+ * Updates the avatar image and tooltip text
+ */
+ private void updateAvatar() {
+ if (flagName == null) { // do only once
+ avatar.setText(this.player.getName());
+ if (!player.getUserData().getFlagName().equals(flagName)) {
+ flagName = player.getUserData().getFlagName();
+ this.avatar.setTopTextImage(CountryUtil.getCountryFlagIcon(flagName).getImage());
+ }
+ // TODO: Add the wins to the tooltiptext of the avatar
+ String countryname = CountryUtil.getCountryName(flagName);
+ if (countryname == null) {
+ countryname = "Unknown";
+ }
+ basicTooltipText = "Name: " + player.getName()
+ + " Country: " + countryname
+ + " Deck hash code: " + player.getDeckHashCode()
+ + " Wins: " + player.getWins() + " of " + player.getWinsNeeded() + " (to win the match)";
+ }
+ // Extend tooltip
+ StringBuilder tooltipText = new StringBuilder(basicTooltipText);
+ if (player.getExperience() > 0) {
+ tooltipText.append(" Experience counters: ").append(player.getExperience());
+ }
+ avatar.setToolTipText(tooltipText.toString());
+ avatar.repaint();
+
+ // used if avatar image can't be used
+ this.btnPlayer.setText(player.getName());
+ this.btnPlayer.setToolTipText(tooltipText.toString());
+ }
+
private String getPriorityTimeLeftString(PlayerView player) {
int priorityTimeLeft = player.getPriorityTimeLeft();
return getPriorityTimeLeftString(priorityTimeLeft);
@@ -799,7 +818,7 @@ public class PlayerPanelExt extends javax.swing.JPanel {
}
private void btnCommandZoneActionPerformed(java.awt.event.ActionEvent evt) {
- DialogManager.getManager(gameId).showEmblemsDialog(CardsViewUtil.convertCommandObject(player.getCommadObjectList()), bigCard, gameId);
+ DialogManager.getManager(gameId).showEmblemsDialog(CardsViewUtil.convertCommandObject(player.getCommandObjectList()), bigCard, gameId);
}
private void btnExileZoneActionPerformed(java.awt.event.ActionEvent evt) {
diff --git a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java
index c55072a95fa..c236a42741b 100644
--- a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java
+++ b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java
@@ -65,12 +65,12 @@ public class MageActionCallback implements ActionCallback {
public static final int MIN_X_OFFSET_REQUIRED = 20;
- private Popup popup;
+ private Popup tooltipPopup;
private JPopupMenu jPopupMenu;
private BigCard bigCard;
protected static final DefaultActionCallback defaultCallback = DefaultActionCallback.getInstance();
protected static Session session = MageFrame.getSession();
- private CardView popupCard;
+ private CardView tooltipCard;
private TransferData popupData;
private JComponent cardInfoPane;
private volatile boolean popupTextWindowOpen = false;
@@ -92,7 +92,7 @@ public class MageActionCallback implements ActionCallback {
private boolean isDragging;
private Point initialCardPos;
private Point initialMousePos;
- private Set cardPanels = new HashSet();
+ private final Set cardPanels = new HashSet<>();
public MageActionCallback() {
enlargeMode = EnlargeMode.NORMAL;
@@ -117,10 +117,10 @@ public class MageActionCallback implements ActionCallback {
@Override
public void mouseEntered(MouseEvent e, final TransferData data) {
- hidePopup();
+ hideTooltipPopup();
cancelTimeout();
- this.popupCard = data.card;
+ this.tooltipCard = data.card;
this.popupData = data;
Component parentComponent = SwingUtilities.getRoot(data.component);
@@ -135,10 +135,10 @@ public class MageActionCallback implements ActionCallback {
ArrowUtil.drawArrowsForPairedCards(data, parentPoint);
ArrowUtil.drawArrowsForEnchantPlayers(data, parentPoint);
- showPopup(data, parentComponent, parentPoint);
+ showTooltipPopup(data, parentComponent, parentPoint);
}
- private void showPopup(final TransferData data, final Component parentComponent, final Point parentPoint) {
+ private void showTooltipPopup(final TransferData data, final Component parentComponent, final Point parentPoint) {
if (data.component != null) {
String showTooltips = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SHOW_TOOLTIPS_ANY_ZONE, "true");
if (showTooltips.equals("false")) {
@@ -154,12 +154,12 @@ public class MageActionCallback implements ActionCallback {
}
data.locationOnScreen = data.component.getLocationOnScreen();
}
- popup = factory.getPopup(data.component, data.popupText, (int) data.locationOnScreen.getX() + data.popupOffsetX, (int) data.locationOnScreen.getY() + data.popupOffsetY + 40);
- popup.show();
+ tooltipPopup = factory.getPopup(data.component, data.popupText, (int) data.locationOnScreen.getX() + data.popupOffsetX, (int) data.locationOnScreen.getY() + data.popupOffsetY + 40);
+ tooltipPopup.show();
// hack to get popup to resize to fit text
- popup.hide();
- popup = factory.getPopup(data.component, data.popupText, (int) data.locationOnScreen.getX() + data.popupOffsetX, (int) data.locationOnScreen.getY() + data.popupOffsetY + 40);
- popup.show();
+ tooltipPopup.hide();
+ tooltipPopup = factory.getPopup(data.component, data.popupText, (int) data.locationOnScreen.getX() + data.popupOffsetX, (int) data.locationOnScreen.getY() + data.popupOffsetY + 40);
+ tooltipPopup.show();
} else {
sumbitShowPopupTask(data, parentComponent, parentPoint);
}
@@ -171,7 +171,7 @@ public class MageActionCallback implements ActionCallback {
public void run() {
ThreadUtils.sleep(300);
- if (popupCard == null || !popupCard.equals(data.card) || session == null || !popupTextWindowOpen || !enlargedWindowState.equals(EnlargedWindowState.CLOSED)) {
+ if (tooltipCard == null || !tooltipCard.equals(data.card) || session == null || !popupTextWindowOpen || !enlargedWindowState.equals(EnlargedWindowState.CLOSED)) {
return;
}
@@ -229,13 +229,15 @@ public class MageActionCallback implements ActionCallback {
initialMousePos = new Point((int) mouse.getX(), (int) mouse.getY());
initialCardPos = data.component.getLocation();
// Closes popup & enlarged view if a card/Permanent is selected
- hidePopup();
+ hideTooltipPopup();
}
@Override
public void mouseReleased(MouseEvent e, TransferData transferData) {
CardPanel card = ((CardPanel) transferData.component);
- if (card.getZone() != null && card.getZone().equalsIgnoreCase("hand")) {
+ if (e.isPopupTrigger() /*&& card.getPopupMenu() != null*/) {
+ hideTooltipPopup();
+ } else if (card.getZone() != null && card.getZone().equalsIgnoreCase("hand")) {
int maxXOffset = 0;
if (isDragging) {
Point mouse = new Point(e.getX(), e.getY());
@@ -250,13 +252,15 @@ public class MageActionCallback implements ActionCallback {
transferData.component.requestFocusInWindow();
defaultCallback.mouseClicked(e, transferData.gameId, session, transferData.card);
// Closes popup & enlarged view if a card/Permanent is selected
- hidePopup();
+ hideTooltipPopup();
}
+ e.consume();
} else {
transferData.component.requestFocusInWindow();
defaultCallback.mouseClicked(e, transferData.gameId, session, transferData.card);
// Closes popup & enlarged view if a card/Permanent is selected
- hidePopup();
+ hideTooltipPopup();
+ e.consume();
}
}
@@ -264,7 +268,7 @@ public class MageActionCallback implements ActionCallback {
if (this.startedDragging && prevCard != null && card != null) {
for (Component component : card.getCardArea().getComponents()) {
if (component instanceof CardPanel) {
- if (cardPanels.contains(component)) {
+ if (cardPanels.contains((CardPanel) component)) {
component.setLocation(component.getLocation().x, component.getLocation().y - GO_DOWN_ON_DRAG_Y_OFFSET);
}
}
@@ -288,6 +292,10 @@ public class MageActionCallback implements ActionCallback {
// drag'n'drop is allowed for HAND zone only
return;
}
+ if (!SwingUtilities.isLeftMouseButton(e)) {
+ // only allow draging with the left mouse button
+ return;
+ }
isDragging = true;
prevCard = card;
Point p = card.getCardLocation();
@@ -323,7 +331,7 @@ public class MageActionCallback implements ActionCallback {
for (Component component : container.getComponents()) {
if (component instanceof CardPanel) {
if (!component.equals(card)) {
- if (!cardPanels.contains(component)) {
+ if (!cardPanels.contains((CardPanel) component)) {
component.setLocation(component.getLocation().x, component.getLocation().y + GO_DOWN_ON_DRAG_Y_OFFSET);
}
cardPanels.add((CardPanel) component);
@@ -405,10 +413,10 @@ public class MageActionCallback implements ActionCallback {
*
*/
@Override
- public void hidePopup() {
- this.popupCard = null;
- if (popup != null) {
- popup.hide();
+ public void hideTooltipPopup() {
+ this.tooltipCard = null;
+ if (tooltipPopup != null) {
+ tooltipPopup.hide();
}
if (jPopupMenu != null) {
jPopupMenu.setVisible(false);
@@ -421,7 +429,7 @@ public class MageActionCallback implements ActionCallback {
Component popupContainer = MageFrame.getUI().getComponent(MageComponents.POPUP_CONTAINER);
popupContainer.setVisible(false);
} catch (Exception e2) {
- e2.printStackTrace();
+ logger.warn("Can't set tooltip to visible = false", e2);
}
}
@@ -433,7 +441,7 @@ public class MageActionCallback implements ActionCallback {
}
public void hideAll(UUID gameId) {
- hidePopup();
+ hideTooltipPopup();
startHideTimeout();
this.popupTextWindowOpen = false;
if (gameId != null) {
@@ -483,7 +491,7 @@ public class MageActionCallback implements ActionCallback {
cardView = popupData.card;
}
if (this.popupTextWindowOpen) {
- hidePopup();
+ hideTooltipPopup();
}
if (cardView != null) {
if (cardView.isToRotate()) {
@@ -506,7 +514,7 @@ public class MageActionCallback implements ActionCallback {
cardPreviewContainer.setVisible(false);
} catch (InterruptedException e) {
- e.printStackTrace();
+ logger.warn("Can't hide enlarged card", e);
}
}
}
@@ -582,7 +590,7 @@ public class MageActionCallback implements ActionCallback {
}
} catch (Exception e) {
- e.printStackTrace();
+ logger.warn("Problem dring display of enlarged card", e);
}
}
});
diff --git a/Mage.Client/src/main/java/mage/client/plugins/impl/Plugins.java b/Mage.Client/src/main/java/mage/client/plugins/impl/Plugins.java
index 733a87391cb..ee1dcbcef4e 100644
--- a/Mage.Client/src/main/java/mage/client/plugins/impl/Plugins.java
+++ b/Mage.Client/src/main/java/mage/client/plugins/impl/Plugins.java
@@ -58,7 +58,6 @@ public class Plugins implements MagePlugins {
pm.addPluginsFrom(new File(PLUGINS_DIRECTORY).toURI());
this.cardPlugin = new CardPluginImpl();
this.counterPlugin = pm.getPlugin(CounterPlugin.class);
- //this.themePlugin = pm.getPlugin(ThemePlugin.class);
this.themePlugin = new ThemePluginImpl();
logger.info("Done.");
}
diff --git a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java
index 4ace6713242..1ba022d1896 100644
--- a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java
+++ b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java
@@ -33,9 +33,7 @@ import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import mage.cards.decks.Deck;
import mage.client.MageFrame;
-import mage.client.chat.ChatPanel;
-import static mage.client.chat.ChatPanel.ChatType.TABLES;
-import static mage.client.chat.ChatPanel.ChatType.TOURNAMENT;
+import mage.client.chat.ChatPanelBasic;
import mage.client.constants.Constants.DeckEditorMode;
import mage.client.draft.DraftPanel;
import mage.client.game.GamePanel;
@@ -116,9 +114,9 @@ public class CallbackClientImpl implements CallbackClient {
break;
case "chatMessage": {
ChatMessage message = (ChatMessage) callback.getData();
- ChatPanel panel = MageFrame.getChat(callback.getObjectId());
+ ChatPanelBasic panel = MageFrame.getChat(callback.getObjectId());
if (panel != null) {
- // play the to the message connected sound
+ // play the sound related to the message
if (message.getSoundToPlay() != null) {
switch (message.getSoundToPlay()) {
case PlayerLeft:
@@ -383,9 +381,9 @@ public class CallbackClientImpl implements CallbackClient {
});
}
- private void createChatStartMessage(ChatPanel chatPanel) {
+ private void createChatStartMessage(ChatPanelBasic chatPanel) {
chatPanel.setStartMessageDone(true);
- ChatPanel usedPanel = chatPanel;
+ ChatPanelBasic usedPanel = chatPanel;
if (chatPanel.getConnectedChat() != null) {
usedPanel = chatPanel.getConnectedChat();
}
diff --git a/Mage.Client/src/main/java/mage/client/chat/ChatPanel.form b/Mage.Client/src/main/java/mage/client/table/PlayersChatPanel.form
similarity index 72%
rename from Mage.Client/src/main/java/mage/client/chat/ChatPanel.form
rename to Mage.Client/src/main/java/mage/client/table/PlayersChatPanel.form
index f423543b402..9ef7f54408f 100644
--- a/Mage.Client/src/main/java/mage/client/chat/ChatPanel.form
+++ b/Mage.Client/src/main/java/mage/client/table/PlayersChatPanel.form
@@ -16,16 +16,14 @@
-
-
+
-
+
-
@@ -43,39 +41,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -119,12 +84,16 @@
+
+
+
+
+
+
+
+
+
-
-
-
-
-
diff --git a/Mage.Client/src/main/java/mage/client/table/PlayersChatPanel.java b/Mage.Client/src/main/java/mage/client/table/PlayersChatPanel.java
new file mode 100644
index 00000000000..0c96d1588b5
--- /dev/null
+++ b/Mage.Client/src/main/java/mage/client/table/PlayersChatPanel.java
@@ -0,0 +1,278 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+
+/*
+ * ChatPanel.java
+ *
+ * Created on 15-Dec-2009, 11:04:31 PM
+ */
+package mage.client.table;
+
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import javax.swing.Icon;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.JTableHeader;
+import javax.swing.table.TableColumnModel;
+import mage.client.chat.ChatPanelBasic;
+import static mage.client.chat.ChatPanelBasic.CHAT_ALPHA;
+import mage.client.chat.ChatPanelSeparated;
+import mage.client.components.ColorPane;
+import static mage.client.dialog.PreferencesDialog.KEY_USERS_COLUMNS_ORDER;
+import static mage.client.dialog.PreferencesDialog.KEY_USERS_COLUMNS_WIDTH;
+import mage.client.util.MageTableRowSorter;
+import mage.client.util.gui.TableUtil;
+import mage.client.util.gui.countryBox.CountryCellRenderer;
+import mage.remote.MageRemoteException;
+import mage.view.RoomUsersView;
+import mage.view.UsersView;
+
+/**
+ *
+ * @author BetaSteward_at_googlemail.com, nantuko
+ */
+public class PlayersChatPanel extends javax.swing.JPanel {
+
+ private final List players = new ArrayList<>();
+ private final UserTableModel userTableModel;
+ private final ChatPanelSeparated userChatPanel;
+ private final ColorPane systemMessagesPane;
+ private static final int[] defaultColumnsWidth = {20, 100, 100, 80, 80};
+
+
+ /*
+ * Creates new form ChatPanel
+ *
+ */
+ public PlayersChatPanel() {
+ userTableModel = new UserTableModel(); // needs to be set before initComponents();
+
+ initComponents();
+ setBackground(new Color(0, 0, 0, CHAT_ALPHA));
+
+ jTablePlayers.setBackground(new Color(0, 0, 0, CHAT_ALPHA));
+ jTablePlayers.setForeground(Color.white);
+ jTablePlayers.setRowSorter(new MageTableRowSorter(userTableModel));
+
+ TableUtil.setColumnWidthAndOrder(jTablePlayers, defaultColumnsWidth, KEY_USERS_COLUMNS_WIDTH, KEY_USERS_COLUMNS_ORDER);
+ jTablePlayers.setDefaultRenderer(Icon.class, new CountryCellRenderer());
+
+ systemMessagesPane = new ColorPane();
+
+ userChatPanel = new ChatPanelSeparated();
+ userChatPanel.setSystemMessagesPane(systemMessagesPane);
+
+ if (jTabbedPaneText != null) {
+ jTabbedPaneText.setBackground(new Color(0, 0, 0, CHAT_ALPHA));
+ if (userChatPanel != null) {
+ userChatPanel.setBackground(new Color(0, 0, 0, CHAT_ALPHA));
+ jTabbedPaneText.addTab("Talk", userChatPanel);
+ }
+ if (systemMessagesPane != null) {
+ systemMessagesPane.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
+ systemMessagesPane.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
+ systemMessagesPane.setFocusCycleRoot(false);
+ systemMessagesPane.setMargin(new java.awt.Insets(2, 2, 2, 2));
+ systemMessagesPane.setOpaque(false);
+ systemMessagesPane.setExtBackgroundColor(new Color(0, 0, 0, CHAT_ALPHA)); // Alpha = 255 not transparent
+ systemMessagesPane.setSelectionColor(Color.LIGHT_GRAY);
+ jTabbedPaneText.addTab("System", systemMessagesPane);
+
+ }
+ }
+ if (jScrollPanePlayers != null) {
+
+ jScrollPanePlayers.setBackground(new Color(0, 0, 0, CHAT_ALPHA));
+ jScrollPanePlayers.getViewport().setBackground(new Color(0, 0, 0, CHAT_ALPHA));
+ }
+ }
+
+ public ChatPanelBasic getUserChatPanel() {
+ return userChatPanel;
+ }
+
+ public void cleanUp() {
+ TableUtil.saveColumnWidthAndOrderToPrefs(jTablePlayers, KEY_USERS_COLUMNS_WIDTH, KEY_USERS_COLUMNS_ORDER);
+ userChatPanel.cleanUp();
+ }
+
+ public void setSplitDividerLocation(int location) {
+ if (jSplitPane1 != null) {
+ jSplitPane1.setDividerLocation(location);
+ }
+ }
+
+ public int getSplitDividerLocation() {
+ if (jSplitPane1 == null) {
+ return 0;
+ }
+ return this.jSplitPane1.getDividerLocation();
+ }
+
+ class UserTableModel extends AbstractTableModel {
+
+ private final String[] columnNames = new String[]{"Loc", "Players", "Info", "Games", "Connection"};
+ private UsersView[] players = new UsersView[0];
+
+ public void loadData(Collection roomUserInfoList) throws MageRemoteException {
+ RoomUsersView roomUserInfo = roomUserInfoList.iterator().next();
+ this.players = roomUserInfo.getUsersView().toArray(new UsersView[0]);
+ JTableHeader th = jTablePlayers.getTableHeader();
+ TableColumnModel tcm = th.getColumnModel();
+
+ tcm.getColumn(jTablePlayers.convertColumnIndexToView(1)).setHeaderValue("Players (" + this.players.length + ")");
+ tcm.getColumn(jTablePlayers.convertColumnIndexToView(3)).setHeaderValue(
+ "Games " + roomUserInfo.getNumberActiveGames()
+ + (roomUserInfo.getNumberActiveGames() != roomUserInfo.getNumberGameThreads() ? " (T:" + roomUserInfo.getNumberGameThreads() : " (")
+ + " limit: " + roomUserInfo.getNumberMaxGames() + ")");
+ th.repaint();
+ this.fireTableDataChanged();
+ }
+
+ @Override
+ public int getRowCount() {
+ return players.length;
+ }
+
+ @Override
+ public int getColumnCount() {
+ return columnNames.length;
+ }
+
+ @Override
+ public Object getValueAt(int arg0, int arg1) {
+ switch (arg1) {
+ case 0:
+ return players[arg0].getFlagName();
+ case 1:
+ return players[arg0].getUserName();
+ case 2:
+ return players[arg0].getInfoState();
+ case 3:
+ return players[arg0].getInfoGames();
+ case 4:
+ return players[arg0].getInfoPing();
+ }
+ return "";
+ }
+
+ @Override
+ public String getColumnName(int columnIndex) {
+ String colName = "";
+
+ if (columnIndex <= getColumnCount()) {
+ colName = columnNames[columnIndex];
+ }
+
+ return colName;
+ }
+
+ @Override
+ public Class getColumnClass(int columnIndex) {
+ switch (columnIndex) {
+ case 0:
+ return Icon.class;
+ default:
+ return String.class;
+ }
+ }
+
+ @Override
+ public boolean isCellEditable(int rowIndex, int columnIndex) {
+ return false;
+ }
+
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ jSplitPane1 = new javax.swing.JSplitPane();
+ jScrollPanePlayers = new javax.swing.JScrollPane();
+ jTablePlayers = new javax.swing.JTable();
+ jTabbedPaneText = new javax.swing.JTabbedPane();
+
+ jSplitPane1.setBorder(null);
+ jSplitPane1.setDividerSize(10);
+ jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
+ jSplitPane1.setResizeWeight(0.25);
+
+ jScrollPanePlayers.setBorder(null);
+
+ jTablePlayers.setModel(this.userTableModel);
+ jTablePlayers.setToolTipText("Connected players");
+ jTablePlayers.setAutoscrolls(false);
+ jTablePlayers.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
+ jTablePlayers.setFocusable(false);
+ jTablePlayers.setGridColor(new java.awt.Color(255, 255, 255));
+ jTablePlayers.setOpaque(false);
+ jTablePlayers.setRequestFocusEnabled(false);
+ jTablePlayers.setRowSelectionAllowed(false);
+ jTablePlayers.setUpdateSelectionOnSort(false);
+ jTablePlayers.setVerifyInputWhenFocusTarget(false);
+ jScrollPanePlayers.setViewportView(jTablePlayers);
+
+ jSplitPane1.setTopComponent(jScrollPanePlayers);
+ jSplitPane1.setRightComponent(jTabbedPaneText);
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE)
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addComponent(jSplitPane1)
+ .addGap(0, 0, 0))
+ );
+ }// //GEN-END:initComponents
+
+ public void setRoomUserInfo(List> view) {
+ try {
+ userTableModel.loadData(view.get(0));
+ } catch (Exception ex) {
+ this.players.clear();
+ }
+ }
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JScrollPane jScrollPanePlayers;
+ private javax.swing.JSplitPane jSplitPane1;
+ private javax.swing.JTabbedPane jTabbedPaneText;
+ private javax.swing.JTable jTablePlayers;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/Mage.Client/src/main/java/mage/client/table/TablesPanel.form b/Mage.Client/src/main/java/mage/client/table/TablesPanel.form
index 77d59264027..95b426c7da7 100644
--- a/Mage.Client/src/main/java/mage/client/table/TablesPanel.form
+++ b/Mage.Client/src/main/java/mage/client/table/TablesPanel.form
@@ -503,7 +503,7 @@
-
+
@@ -516,7 +516,7 @@
-
+
@@ -540,7 +540,7 @@
-
+
@@ -554,7 +554,7 @@
-
+
@@ -570,21 +570,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -595,7 +580,7 @@
-
+
@@ -679,7 +664,14 @@
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java
index 1a56c2873dc..1fa0b11e792 100644
--- a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java
+++ b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java
@@ -69,7 +69,7 @@ import javax.swing.SwingWorker;
import javax.swing.table.AbstractTableModel;
import mage.cards.decks.importer.DeckImporterUtil;
import mage.client.MageFrame;
-import mage.client.chat.ChatPanel;
+import mage.client.chat.ChatPanelBasic;
import mage.client.components.MageComponents;
import mage.client.dialog.JoinTableDialog;
import mage.client.dialog.NewTableDialog;
@@ -143,16 +143,16 @@ public class TablesPanel extends javax.swing.JPanel {
tableCompleted.setRowSorter(new MageTableRowSorter(matchesModel));
- chatPanel.useExtendedView(ChatPanel.VIEW_MODE.NONE);
- chatPanel.setBorder(null);
- chatPanel.setChatType(ChatPanel.ChatType.TABLES);
+ chatPanelMain.getUserChatPanel().useExtendedView(ChatPanelBasic.VIEW_MODE.NONE);
+ chatPanelMain.getUserChatPanel().setBorder(null);
+ chatPanelMain.getUserChatPanel().setChatType(ChatPanelBasic.ChatType.TABLES);
filterButtons = new JToggleButton[]{btnStateWaiting, btnStateActive, btnStateFinished,
btnTypeMatch, btnTypeTourneyConstructed, btnTypeTourneyLimited,
btnFormatBlock, btnFormatStandard, btnFormatModern, btnFormatLegacy, btnFormatVintage, btnFormatCommander, btnFormatTinyLeader, btnFormatLimited, btnFormatOther,
btnSkillBeginner, btnSkillCasual, btnSkillSerious};
- JComponent[] components = new JComponent[]{chatPanel, jSplitPane1, jScrollPane1, jScrollPane2, topPanel, jPanel3};
+ JComponent[] components = new JComponent[]{chatPanelMain, jSplitPane1, jScrollPane1, jScrollPane2, topPanel, jPanel3};
for (JComponent component : components) {
component.setOpaque(false);
}
@@ -274,7 +274,7 @@ public class TablesPanel extends javax.swing.JPanel {
public void cleanUp() {
saveSettings();
- chatPanel.cleanUp();
+ chatPanelMain.cleanUp();
}
private void saveDividerLocations() {
@@ -284,7 +284,7 @@ public class TablesPanel extends javax.swing.JPanel {
PreferencesDialog.saveValue(PreferencesDialog.KEY_MAGE_PANEL_LAST_SIZE, sb);
PreferencesDialog.saveValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_1, Integer.toString(this.jSplitPane1.getDividerLocation()));
PreferencesDialog.saveValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_2, Integer.toString(this.jSplitPane2.getDividerLocation()));
- PreferencesDialog.saveValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_3, Integer.toString(chatPanel.getSplitDividerLocation()));
+ PreferencesDialog.saveValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_3, Integer.toString(chatPanelMain.getSplitDividerLocation()));
}
private void restoreSettings() {
@@ -333,8 +333,8 @@ public class TablesPanel extends javax.swing.JPanel {
}
}
location = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_TABLES_DIVIDER_LOCATION_3, null);
- if (location != null && chatPanel != null) {
- chatPanel.setSplitDividerLocation(Integer.parseInt(location));
+ if (location != null && chatPanelMain != null) {
+ chatPanelMain.setSplitDividerLocation(Integer.parseInt(location));
}
}
}
@@ -376,7 +376,7 @@ public class TablesPanel extends javax.swing.JPanel {
updateTablesTask.execute();
}
if (updatePlayersTask == null || updatePlayersTask.isDone()) {
- updatePlayersTask = new UpdatePlayersTask(session, roomId, this.chatPanel);
+ updatePlayersTask = new UpdatePlayersTask(session, roomId, this.chatPanelMain);
updatePlayersTask.execute();
}
if (this.btnStateFinished.isSelected()) {
@@ -426,7 +426,7 @@ public class TablesPanel extends javax.swing.JPanel {
MageFrame.getDesktop().add(joinTableDialog, JLayeredPane.MODAL_LAYER);
}
if (chatRoomId != null) {
- this.chatPanel.connect(chatRoomId);
+ this.chatPanelMain.getUserChatPanel().connect(chatRoomId);
startTasks();
this.setVisible(true);
this.repaint();
@@ -461,7 +461,7 @@ public class TablesPanel extends javax.swing.JPanel {
} else {
this.jPanel2.setVisible(true);
this.jLabel2.setText(serverMessages.get(0));
- this.jButton1.setVisible(serverMessages.size() > 1);
+ this.jButtonNext.setVisible(serverMessages.size() > 1);
}
}
@@ -473,7 +473,7 @@ public class TablesPanel extends javax.swing.JPanel {
}
}
stopTasks();
- this.chatPanel.disconnect();
+ this.chatPanelMain.getUserChatPanel().disconnect();
Component c = this.getParent();
while (c != null && !(c instanceof TablesPane)) {
@@ -484,8 +484,8 @@ public class TablesPanel extends javax.swing.JPanel {
}
}
- public ChatPanel getChatPanel() {
- return this.chatPanel;
+ public ChatPanelBasic getChatPanel() {
+ return chatPanelMain.getUserChatPanel();
}
private void setTableFilter() {
@@ -501,7 +501,7 @@ public class TablesPanel extends javax.swing.JPanel {
// type
List> typeFilterList = new ArrayList<>();
if (btnTypeMatch.isSelected()) {
- typeFilterList.add(RowFilter.regexFilter("Two|Commander|Free|Tiny", TableTableModel.COLUMN_GAME_TYPE));
+ typeFilterList.add(RowFilter.regexFilter("Two|Commander|Free|Tiny|Momir", TableTableModel.COLUMN_GAME_TYPE));
}
if (btnTypeTourneyConstructed.isSelected()) {
typeFilterList.add(RowFilter.regexFilter("Constructed", TableTableModel.COLUMN_GAME_TYPE));
@@ -537,7 +537,7 @@ public class TablesPanel extends javax.swing.JPanel {
formatFilterList.add(RowFilter.regexFilter("^Limited", TableTableModel.COLUMN_DECK_TYPE));
}
if (btnFormatOther.isSelected()) {
- formatFilterList.add(RowFilter.regexFilter("^Constructed - Pauper|^Constructed - Extended|^Constructed - Historical|^Constructed - Super", TableTableModel.COLUMN_DECK_TYPE));
+ formatFilterList.add(RowFilter.regexFilter("^Momir Basic|^Constructed - Pauper|^Constructed - Extended|^Constructed - Historical|^Constructed - Super", TableTableModel.COLUMN_DECK_TYPE));
}
List> skillFilterList = new ArrayList<>();
@@ -628,15 +628,15 @@ public class TablesPanel extends javax.swing.JPanel {
jPanel2 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
- jButton1 = new javax.swing.JButton();
+ jButtonNext = new javax.swing.JButton();
jSplitPane1 = new javax.swing.JSplitPane();
- chatPanel = new mage.client.chat.ChatPanel(true);
jPanel3 = new javax.swing.JPanel();
jSplitPane2 = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
tableTables = new javax.swing.JTable();
jScrollPane2 = new javax.swing.JScrollPane();
tableCompleted = new javax.swing.JTable();
+ chatPanelMain = new mage.client.table.PlayersChatPanel();
topPanel.setBackground(java.awt.Color.white);
topPanel.setOpaque(false);
@@ -1022,13 +1022,13 @@ public class TablesPanel extends javax.swing.JPanel {
jLabel2.setText("You are playing Mage version 0.7.5. Welcome! -- Mage dev team --");
- jButton1.setText("Next");
- jButton1.setMaximumSize(new java.awt.Dimension(55, 25));
- jButton1.setMinimumSize(new java.awt.Dimension(55, 25));
- jButton1.setPreferredSize(new java.awt.Dimension(55, 25));
- jButton1.addActionListener(new java.awt.event.ActionListener() {
+ jButtonNext.setText("Next");
+ jButtonNext.setMaximumSize(new java.awt.Dimension(55, 25));
+ jButtonNext.setMinimumSize(new java.awt.Dimension(55, 25));
+ jButtonNext.setPreferredSize(new java.awt.Dimension(55, 25));
+ jButtonNext.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
- jButton1ActionPerformed(evt);
+ jButtonNextActionPerformed(evt);
}
});
@@ -1037,7 +1037,7 @@ public class TablesPanel extends javax.swing.JPanel {
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
- .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jButtonNext, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
@@ -1048,7 +1048,7 @@ public class TablesPanel extends javax.swing.JPanel {
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
- .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jButtonNext, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel2)
.addComponent(jLabel1))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
@@ -1058,9 +1058,6 @@ public class TablesPanel extends javax.swing.JPanel {
jSplitPane1.setDividerSize(10);
jSplitPane1.setResizeWeight(1.0);
- chatPanel.setMinimumSize(new java.awt.Dimension(100, 43));
- jSplitPane1.setRightComponent(chatPanel);
-
jSplitPane2.setBorder(null);
jSplitPane2.setDividerSize(10);
jSplitPane2.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
@@ -1085,7 +1082,7 @@ public class TablesPanel extends javax.swing.JPanel {
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jSplitPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 798, Short.MAX_VALUE)
+ .addComponent(jSplitPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 810, Short.MAX_VALUE)
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -1093,6 +1090,7 @@ public class TablesPanel extends javax.swing.JPanel {
);
jSplitPane1.setLeftComponent(jPanel3);
+ jSplitPane1.setRightComponent(chatPanelMain);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
@@ -1154,7 +1152,7 @@ public class TablesPanel extends javax.swing.JPanel {
newTableDialog.showDialog(roomId);
}//GEN-LAST:event_btnNewTableActionPerformed
- private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
+ private void jButtonNextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonNextActionPerformed
synchronized (this) {
if (messages != null && !messages.isEmpty()) {
currentMessage++;
@@ -1164,7 +1162,7 @@ public class TablesPanel extends javax.swing.JPanel {
this.jLabel2.setText(messages.get(currentMessage));
}
}
- }//GEN-LAST:event_jButton1ActionPerformed
+ }//GEN-LAST:event_jButtonNextActionPerformed
private void btnFilterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnFilterActionPerformed
setTableFilter();
@@ -1206,10 +1204,10 @@ public class TablesPanel extends javax.swing.JPanel {
private javax.swing.JToggleButton btnTypeMatch;
private javax.swing.JToggleButton btnTypeTourneyConstructed;
private javax.swing.JToggleButton btnTypeTourneyLimited;
- private mage.client.chat.ChatPanel chatPanel;
+ private mage.client.table.PlayersChatPanel chatPanelMain;
private javax.swing.JToolBar filterBar1;
private javax.swing.JToolBar filterBar2;
- private javax.swing.JButton jButton1;
+ private javax.swing.JButton jButtonNext;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel2;
@@ -1413,11 +1411,11 @@ class UpdatePlayersTask extends SwingWorker> {
private final Session session;
private final UUID roomId;
- private final ChatPanel chat;
+ private final PlayersChatPanel chat;
private static final Logger logger = Logger.getLogger(UpdatePlayersTask.class);
- UpdatePlayersTask(Session session, UUID roomId, ChatPanel chat) {
+ UpdatePlayersTask(Session session, UUID roomId, PlayersChatPanel chat) {
this.session = session;
this.roomId = roomId;
this.chat = chat;
diff --git a/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.form b/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.form
index 7be5a2a059a..11305f2904d 100644
--- a/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.form
+++ b/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.form
@@ -349,10 +349,7 @@
-
-
-
-
+
diff --git a/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.java b/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.java
index 576bdbf4cf0..9c50628a9c2 100644
--- a/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.java
+++ b/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.java
@@ -49,7 +49,7 @@ import javax.swing.JOptionPane;
import javax.swing.SwingWorker;
import javax.swing.table.AbstractTableModel;
import mage.client.MageFrame;
-import mage.client.chat.ChatPanel;
+import mage.client.chat.ChatPanelBasic;
import mage.client.dialog.PreferencesDialog;
import static mage.client.dialog.PreferencesDialog.KEY_TOURNAMENT_MATCH_COLUMNS_ORDER;
import static mage.client.dialog.PreferencesDialog.KEY_TOURNAMENT_MATCH_COLUMNS_WIDTH;
@@ -105,8 +105,8 @@ public class TournamentPanel extends javax.swing.JPanel {
tableMatches.createDefaultColumnsFromModel();
TableUtil.setColumnWidthAndOrder(tableMatches, defaultColumnsWidthMatches, KEY_TOURNAMENT_MATCH_COLUMNS_WIDTH, KEY_TOURNAMENT_MATCH_COLUMNS_ORDER);
- chatPanel1.useExtendedView(ChatPanel.VIEW_MODE.NONE);
- chatPanel1.setChatType(ChatPanel.ChatType.TOURNAMENT);
+ chatPanel1.useExtendedView(ChatPanelBasic.VIEW_MODE.NONE);
+ chatPanel1.setChatType(ChatPanelBasic.ChatType.TOURNAMENT);
Action action = new AbstractAction() {
@Override
@@ -317,7 +317,7 @@ public class TournamentPanel extends javax.swing.JPanel {
tablePlayers = new javax.swing.JTable();
jScrollPane2 = new javax.swing.JScrollPane();
tableMatches = new javax.swing.JTable();
- chatPanel1 = new mage.client.chat.ChatPanel();
+ chatPanel1 = new mage.client.chat.ChatPanelBasic();
setPreferredSize(new java.awt.Dimension(908, 580));
@@ -484,8 +484,6 @@ public class TournamentPanel extends javax.swing.JPanel {
jSplitPane1.setBottomComponent(jScrollPane2);
jSplitPane2.setLeftComponent(jSplitPane1);
-
- chatPanel1.setStartMessageDone(true);
jSplitPane2.setRightComponent(chatPanel1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
@@ -524,7 +522,7 @@ public class TournamentPanel extends javax.swing.JPanel {
private javax.swing.JPanel actionPanel;
private javax.swing.JButton btnCloseWindow;
private javax.swing.JButton btnQuitTournament;
- private mage.client.chat.ChatPanel chatPanel1;
+ private mage.client.chat.ChatPanelBasic chatPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JSplitPane jSplitPane1;
diff --git a/Mage.Client/src/main/java/mage/client/unusedFiles/CombatDialog.java b/Mage.Client/src/main/java/mage/client/unusedFiles/CombatDialog.java
index b5fc4b3ffd3..57a0b6cf80e 100644
--- a/Mage.Client/src/main/java/mage/client/unusedFiles/CombatDialog.java
+++ b/Mage.Client/src/main/java/mage/client/unusedFiles/CombatDialog.java
@@ -36,7 +36,6 @@
package mage.client.unusedFiles;
import mage.client.cards.BigCard;
-import mage.client.unusedFiles.CombatGroup;
import mage.view.CombatGroupView;
import javax.swing.*;
@@ -44,9 +43,8 @@ import java.awt.*;
import java.beans.PropertyVetoException;
import java.util.List;
import java.util.UUID;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import mage.client.dialog.MageDialog;
+import org.apache.log4j.Logger;
/**
*
@@ -54,6 +52,8 @@ import mage.client.dialog.MageDialog;
*/
public class CombatDialog extends MageDialog {
+ private static final Logger logger = Logger.getLogger(CombatDialog.class);
+
private UUID gameId;
private BigCard bigCard;
private int lastX = 500;
@@ -100,7 +100,7 @@ public class CombatDialog extends MageDialog {
try {
this.setSelected(true);
} catch (PropertyVetoException ex) {
- Logger.getLogger(CombatDialog.class.getName()).log(Level.SEVERE, null, ex);
+ logger.error(null, ex);
}
pack();
this.revalidate();
diff --git a/Mage.Client/src/main/java/mage/client/unusedFiles/PlayerPanel.java b/Mage.Client/src/main/java/mage/client/unusedFiles/PlayerPanel.java
index 6e35211152e..b1f0a8774e7 100644
--- a/Mage.Client/src/main/java/mage/client/unusedFiles/PlayerPanel.java
+++ b/Mage.Client/src/main/java/mage/client/unusedFiles/PlayerPanel.java
@@ -1,37 +1,36 @@
/*
-* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification, are
-* permitted provided that the following conditions are met:
-*
-* 1. Redistributions of source code must retain the above copyright notice, this list of
-* conditions and the following disclaimer.
-*
-* 2. Redistributions in binary form must reproduce the above copyright notice, this list
-* of conditions and the following disclaimer in the documentation and/or other materials
-* provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
-* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The views and conclusions contained in the software and documentation are those of the
-* authors and should not be interpreted as representing official policies, either expressed
-* or implied, of BetaSteward_at_googlemail.com.
-*/
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
/*
* PlayerPanel.java
*
* Created on Nov 18, 2009, 3:01:31 PM
*/
-
package mage.client.unusedFiles;
//package mage.client.game;
@@ -58,7 +57,9 @@ public class PlayerPanel extends javax.swing.JPanel {
private ShowCardsDialog graveyard;
private BigCard bigCard;
- /** Creates new form PlayerPanel */
+ /**
+ * Creates new form PlayerPanel
+ */
public PlayerPanel() {
initComponents();
}
@@ -79,19 +80,17 @@ public class PlayerPanel extends javax.swing.JPanel {
this.btnPlayerName.setText(player.getName());
if (player.isActive()) {
this.btnPlayerName.setBackground(Color.DARK_GRAY);
- }
- else if (player.hasLeft()) {
+ } else if (player.hasLeft()) {
this.btnPlayerName.setBackground(Color.RED);
- }
- else {
+ } else {
this.btnPlayerName.setBackground(Color.LIGHT_GRAY);
}
}
- /** This method is called from within the constructor to
- * initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is
- * always regenerated by the Form Editor.
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
@@ -201,10 +200,9 @@ public class PlayerPanel extends javax.swing.JPanel {
if (graveyard == null) {
graveyard = new ShowCardsDialog();
}
- graveyard.loadCards(player.getName() + " graveyard", player.getGraveyard(), bigCard, Config.dimensions, gameId, false);
+ graveyard.loadCards(player.getName() + " graveyard", player.getGraveyard(), bigCard, Config.dimensions, gameId, false, null, null, null);
}//GEN-LAST:event_btnGraveActionPerformed
-
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnGrave;
private javax.swing.JButton btnPlayerName;
diff --git a/Mage.Client/src/main/java/mage/client/util/CardViewColorDetailedComparator.java b/Mage.Client/src/main/java/mage/client/util/CardViewColorIdentityComparator.java
similarity index 86%
rename from Mage.Client/src/main/java/mage/client/util/CardViewColorDetailedComparator.java
rename to Mage.Client/src/main/java/mage/client/util/CardViewColorIdentityComparator.java
index 179254b961c..36be3025d11 100644
--- a/Mage.Client/src/main/java/mage/client/util/CardViewColorDetailedComparator.java
+++ b/Mage.Client/src/main/java/mage/client/util/CardViewColorIdentityComparator.java
@@ -25,21 +25,21 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.client.util;
import java.util.Comparator;
+import mage.utils.CardUtil;
import mage.view.CardView;
/**
*
* @author BetaSteward_at_googlemail.com
*/
-public class CardViewColorDetailedComparator implements Comparator {
+public class CardViewColorIdentityComparator implements Comparator {
@Override
public int compare(CardView o1, CardView o2) {
- return o1.getColor().hashCode() - o2.getColor().hashCode();
+ return CardUtil.getColorIdentitySortValue(o1.getManaCost(), o1.getColor(), o1.getRules())
+ - CardUtil.getColorIdentitySortValue(o2.getManaCost(), o2.getColor(), o2.getRules());
}
-
-}
\ No newline at end of file
+}
diff --git a/Mage.Client/src/main/java/mage/client/util/CardViewCostComparator.java b/Mage.Client/src/main/java/mage/client/util/CardViewCostComparator.java
index 22eae462b06..a77d685a489 100644
--- a/Mage.Client/src/main/java/mage/client/util/CardViewCostComparator.java
+++ b/Mage.Client/src/main/java/mage/client/util/CardViewCostComparator.java
@@ -1,16 +1,16 @@
/*
* Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
@@ -20,12 +20,11 @@
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
+ *
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.client.util;
import java.util.Comparator;
@@ -39,7 +38,7 @@ public class CardViewCostComparator implements Comparator {
@Override
public int compare(CardView o1, CardView o2) {
- return Integer.valueOf(o1.getConvertedManaCost()).compareTo(Integer.valueOf(o2.getConvertedManaCost()));
+ return Integer.valueOf(o1.getConvertedManaCost()).compareTo(o2.getConvertedManaCost());
}
}
diff --git a/Mage.Client/src/main/java/mage/client/util/DeckUtil.java b/Mage.Client/src/main/java/mage/client/util/DeckUtil.java
index 1b240c389ce..930b1c777db 100644
--- a/Mage.Client/src/main/java/mage/client/util/DeckUtil.java
+++ b/Mage.Client/src/main/java/mage/client/util/DeckUtil.java
@@ -43,7 +43,7 @@ import org.apache.log4j.Logger;
*/
public class DeckUtil {
- private static final transient Logger log = Logger.getLogger(DeckUtil.class);
+ private static final Logger log = Logger.getLogger(DeckUtil.class);
private DeckUtil() {
}
diff --git a/Mage.Client/src/main/java/mage/client/util/Listener.java b/Mage.Client/src/main/java/mage/client/util/Listener.java
index 8c7ce8dc99f..6fb209b684c 100644
--- a/Mage.Client/src/main/java/mage/client/util/Listener.java
+++ b/Mage.Client/src/main/java/mage/client/util/Listener.java
@@ -1,31 +1,30 @@
/*
-* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification, are
-* permitted provided that the following conditions are met:
-*
-* 1. Redistributions of source code must retain the above copyright notice, this list of
-* conditions and the following disclaimer.
-*
-* 2. Redistributions in binary form must reproduce the above copyright notice, this list
-* of conditions and the following disclaimer in the documentation and/or other materials
-* provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
-* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The views and conclusions contained in the software and documentation are those of the
-* authors and should not be interpreted as representing official policies, either expressed
-* or implied, of BetaSteward_at_googlemail.com.
-*/
-
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
package mage.client.util;
import java.io.Serializable;
@@ -33,7 +32,9 @@ import java.io.Serializable;
/**
*
* @author BetaSteward_at_googlemail.com
+ * @param
*/
public interface Listener extends Serializable {
+
void event(E event);
}
diff --git a/Mage.Client/src/main/java/mage/client/util/audio/AudioManager.java b/Mage.Client/src/main/java/mage/client/util/audio/AudioManager.java
index 9e9dd416a29..a27a48f1a3a 100644
--- a/Mage.Client/src/main/java/mage/client/util/audio/AudioManager.java
+++ b/Mage.Client/src/main/java/mage/client/util/audio/AudioManager.java
@@ -303,7 +303,7 @@ public class AudioManager {
private static void checkAndPlayClip(MageClip mageClip) {
try {
- if (mageClip != null) {
+ if (mageClip != null && mageClip.getClip() != null) {
boolean playSound = false;
switch (mageClip.getAudioGroup()) {
case GameSounds:
diff --git a/Mage.Client/src/main/java/mage/client/util/gui/Arrow.java b/Mage.Client/src/main/java/mage/client/util/gui/Arrow.java
index b513ea79665..0befa70bed9 100644
--- a/Mage.Client/src/main/java/mage/client/util/gui/Arrow.java
+++ b/Mage.Client/src/main/java/mage/client/util/gui/Arrow.java
@@ -11,11 +11,11 @@ import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Area;
import java.awt.geom.GeneralPath;
-
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Arrow extends JPanel {
+
private static final long serialVersionUID = -4631054277822828303L;
private int startX;
@@ -27,21 +27,25 @@ public class Arrow extends JPanel {
private Composite composite;
private Color color = Color.red;
- public Arrow () {
+ public Arrow() {
setOpaque(false);
setOpacity(0.6f);
}
- protected void paintComponent (Graphics g) {
+ protected void paintComponent(Graphics g) {
super.paintComponent(g);
float ex = endX - startX;
float ey = endY - startY;
- if (ex == 0 && ey == 0) return;
- float length = (float)Math.sqrt(ex * ex + ey * ey);
- float bendPercent = (float)Math.asin(ey / length);
- if (endX > startX) bendPercent = -bendPercent;
+ if (ex == 0 && ey == 0) {
+ return;
+ }
+ float length = (float) Math.sqrt(ex * ex + ey * ey);
+ float bendPercent = (float) Math.asin(ey / length);
+ if (endX > startX) {
+ bendPercent = -bendPercent;
+ }
Area arrow = getArrow(length, bendPercent);
- Graphics2D g2d = (Graphics2D)g;
+ Graphics2D g2d = (Graphics2D) g;
g2d.translate(startX, startY);
g2d.rotate(Math.atan2(ey, ex));
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
@@ -52,16 +56,16 @@ public class Arrow extends JPanel {
g2d.draw(arrow);
}
- private Area getArrow (float length, float bendPercent) {
+ private Area getArrow(float length, float bendPercent) {
float p1x = 0, p1y = 0;
float p2x = length, p2y = 0;
float cx = length / 2, cy = length / 8f * bendPercent;
float adjSize, ex, ey, abs_e;
- adjSize = (float)(bodyWidth / 2 / Math.sqrt(2));
+ adjSize = (float) (bodyWidth / 2 / Math.sqrt(2));
ex = p2x - cx;
ey = p2y - cy;
- abs_e = (float)Math.sqrt(ex * ex + ey * ey);
+ abs_e = (float) Math.sqrt(ex * ex + ey * ey);
ex /= abs_e;
ey /= abs_e;
GeneralPath bodyPath = new GeneralPath();
@@ -71,10 +75,10 @@ public class Arrow extends JPanel {
bodyPath.quadTo(cx, cy, p2x - (ey + ex) * adjSize, p2y + (ex - ey) * adjSize);
bodyPath.closePath();
- adjSize = (float)(headSize / Math.sqrt(2));
+ adjSize = (float) (headSize / Math.sqrt(2));
ex = p2x - cx;
ey = p2y - cy;
- abs_e = (float)Math.sqrt(ex * ex + ey * ey);
+ abs_e = (float) Math.sqrt(ex * ex + ey * ey);
ex /= abs_e;
ey /= abs_e;
GeneralPath headPath = new GeneralPath();
@@ -88,23 +92,23 @@ public class Arrow extends JPanel {
return area;
}
- public int getBodyWidth () {
+ public int getBodyWidth() {
return bodyWidth;
}
- public void setBodyWidth (int bodyWidth) {
+ public void setBodyWidth(int bodyWidth) {
this.bodyWidth = bodyWidth;
}
- public float getHeadSize () {
+ public float getHeadSize() {
return headSize;
}
- public void setHeadSize (float headSize) {
+ public void setHeadSize(float headSize) {
this.headSize = headSize;
}
- public void setArrowLocation (int startX, int startY, int endX, int endY) {
+ public void setArrowLocation(int startX, int startY, int endX, int endY) {
this.startX = startX;
this.startY = startY;
this.endX = endX;
@@ -112,7 +116,7 @@ public class Arrow extends JPanel {
repaint();
}
- public void setOpacity (float opacity) {
+ public void setOpacity(float opacity) {
composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity);
}
@@ -120,7 +124,7 @@ public class Arrow extends JPanel {
this.color = color;
}
- public static void main (String[] args) {
+ public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
@@ -130,11 +134,13 @@ public class Arrow extends JPanel {
frame.setResizable(false);
frame.setVisible(true);
frame.getContentPane().addMouseMotionListener(new MouseMotionListener() {
- public void mouseMoved (MouseEvent e) {
+ @Override
+ public void mouseMoved(MouseEvent e) {
arrow.setArrowLocation(320, 240, e.getX(), e.getY());
}
- public void mouseDragged (MouseEvent e) {
+ @Override
+ public void mouseDragged(MouseEvent e) {
}
});
}
diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java
index 774fea3adb1..5f50c709569 100644
--- a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java
+++ b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java
@@ -29,6 +29,7 @@ import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
import mage.cards.MagePermanent;
import mage.cards.TextPopup;
import mage.cards.action.ActionCallback;
@@ -63,15 +64,16 @@ import org.mage.plugins.card.utils.impl.ImageManagerImpl;
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public class CardPanel extends MagePermanent implements MouseListener, MouseMotionListener, MouseWheelListener, ComponentListener {
+
private static final long serialVersionUID = -3272134219262184410L;
- private static final Logger log = Logger.getLogger(CardPanel.class);
+ private static final Logger logger = Logger.getLogger(CardPanel.class);
private static final int WIDTH_LIMIT = 90; // card width limit to create smaller counter
public static final double TAPPED_ANGLE = Math.PI / 2;
public static final double FLIPPED_ANGLE = Math.PI;
public static final float ASPECT_RATIO = 3.5f / 2.5f;
- public static final int POPUP_X_GAP = 1; // prevent popup window from blinking
+ public static final int POPUP_X_GAP = 1; // prevent tooltip window from blinking
public static CardPanel dragAnimationPanel;
@@ -120,7 +122,7 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
private GlowText ptText;
private boolean displayEnabled = true;
private boolean isAnimationPanel;
- public int cardXOffset, cardYOffset, cardWidth, cardHeight;
+ public int cardXOffset, cardYOffset, cardWidth, cardHeight;
private boolean isSelected;
private boolean isPlayable;
@@ -132,8 +134,8 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
private ActionCallback callback;
- protected boolean popupShowing;
- protected TextPopup popupText = new TextPopup();
+ protected boolean tooltipShowing;
+ protected TextPopup tooltipText = new TextPopup();
protected UUID gameId;
private TransferData data = new TransferData();
@@ -152,6 +154,9 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
private int yTextOffset = 10;
+ // if this is set, it's opened if the user right clicks on the card panel
+ private JPopupMenu popupMenu;
+
public CardPanel(CardView newGameCard, UUID gameId, final boolean loadImage, ActionCallback callback, final boolean foil, Dimension dimension) {
this.gameCard = newGameCard;
this.callback = callback;
@@ -165,7 +170,6 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
//for container debug (don't remove)
//setBorder(BorderFactory.createLineBorder(Color.green));
-
if (this.gameCard.canTransform()) {
buttonPanel = new JPanel();
buttonPanel.setLayout(null);
@@ -222,14 +226,14 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
}
if (newGameCard.isAbility()) {
if (AbilityType.TRIGGERED.equals(newGameCard.getAbilityType())) {
- setTypeIcon(ImageManagerImpl.getInstance().getTriggeredAbilityImage(),"Triggered Ability");
+ setTypeIcon(ImageManagerImpl.getInstance().getTriggeredAbilityImage(), "Triggered Ability");
} else if (AbilityType.ACTIVATED.equals(newGameCard.getAbilityType())) {
- setTypeIcon(ImageManagerImpl.getInstance().getActivatedAbilityImage(),"Activated Ability");
+ setTypeIcon(ImageManagerImpl.getInstance().getActivatedAbilityImage(), "Activated Ability");
}
}
if (this.gameCard.isToken()) {
- setTypeIcon(ImageManagerImpl.getInstance().getTokenIconImage(),"Token Permanent");
+ setTypeIcon(ImageManagerImpl.getInstance().getTokenIconImage(), "Token Permanent");
}
// icon to inform about permanent is copying something
@@ -299,7 +303,7 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
imagePanel.setScalingMultiPassType(MultipassType.none);
String cardType = getType(newGameCard);
- popupText.setText(getText(cardType, newGameCard));
+ tooltipText.setText(getText(cardType, newGameCard));
Util.threadPool.submit(new Runnable() {
@Override
@@ -326,9 +330,9 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
}
setText(gameCard);
} catch (Exception e) {
- e.printStackTrace();
+ logger.fatal("Problem during image animation", e);
} catch (Error err) {
- err.printStackTrace();
+ logger.error("Problem during image animation", err);
}
}
});
@@ -344,7 +348,6 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
typeButton.setLocation(2, 2);
typeButton.setSize(25, 25);
-
iconPanel.setVisible(true);
typeButton.setIcon(new ImageIcon(bufferedImage));
if (toolTipText != null) {
@@ -355,17 +358,17 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
public void cleanUp() {
if (dayNightButton != null) {
- for(ActionListener al: dayNightButton.getActionListeners()) {
+ for (ActionListener al : dayNightButton.getActionListeners()) {
dayNightButton.removeActionListener(al);
}
}
- for(MouseListener ml: this.getMouseListeners() ){
+ for (MouseListener ml : this.getMouseListeners()) {
this.removeMouseListener(ml);
}
- for(MouseMotionListener ml: this.getMouseMotionListeners() ){
+ for (MouseMotionListener ml : this.getMouseMotionListeners()) {
this.removeMouseMotionListener(ml);
}
- for(MouseWheelListener ml: this.getMouseWheelListeners() ){
+ for (MouseWheelListener ml : this.getMouseWheelListeners()) {
this.removeMouseWheelListener(ml);
}
// this holds reference to ActionCallback forever so set it to null to prevent
@@ -394,7 +397,6 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
}
}
-
@Override
public void setZone(String zone) {
this.zone = zone;
@@ -502,7 +504,7 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
} else if (isPlayable) {
g2d.setColor(new Color(153, 102, 204, 200));
//g2d.fillRoundRect(cardXOffset + 1, cardYOffset + 1, cardWidth - 2, cardHeight - 2, cornerSize, cornerSize);
- g2d.fillRoundRect(cardXOffset, cardYOffset , cardWidth , cardHeight , cornerSize, cornerSize);
+ g2d.fillRoundRect(cardXOffset, cardYOffset, cardWidth, cardHeight, cornerSize, cornerSize);
}
if (canAttack) {
@@ -512,10 +514,10 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
//TODO:uncomment
/*
- if (gameCard.isAttacking()) {
- g2d.setColor(new Color(200,10,10,200));
- g2d.fillRoundRect(cardXOffset+1, cardYOffset+1, cardWidth-2, cardHeight-2, cornerSize, cornerSize);
- }*/
+ if (gameCard.isAttacking()) {
+ g2d.setColor(new Color(200,10,10,200));
+ g2d.fillRoundRect(cardXOffset+1, cardYOffset+1, cardWidth-2, cardHeight-2, cornerSize, cornerSize);
+ }*/
}
@Override
@@ -562,8 +564,7 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
if (counterPanel != null) {
counterPanel.setLocation(cardXOffset + borderSize, cardYOffset + borderSize);
counterPanel.setSize(cardWidth - borderSize * 2, cardHeight - borderSize * 2);
- int size = cardWidth > WIDTH_LIMIT ? 40: 20;
-
+ int size = cardWidth > WIDTH_LIMIT ? 40 : 20;
minusCounterLabel.setLocation(counterPanel.getWidth() - size, counterPanel.getHeight() - size * 2);
minusCounterLabel.setSize(size, size);
@@ -577,7 +578,6 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
otherCounterLabel.setLocation(5, counterPanel.getHeight() - size);
otherCounterLabel.setSize(size, size);
-
}
int fontHeight = Math.round(cardHeight * (27f / 680));
boolean showText = (!isAnimationPanel && fontHeight < 12);
@@ -823,7 +823,7 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
this.gameCard = card;
String cardType = getType(card);
- popupText.setText(getText(cardType, card));
+ tooltipText.setText(getText(cardType, card));
if (hasSickness && CardUtil.isCreature(gameCard) && isPermanent) {
overlayPanel.setVisible(true);
@@ -864,11 +864,11 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
minusCounterLabel.setVisible(false);
loyaltyCounterLabel.setVisible(false);
otherCounterLabel.setVisible(false);
- for (CounterView counterView:card.getCounters()) {
+ for (CounterView counterView : card.getCounters()) {
if (counterView.getCount() == 0) {
continue;
}
- switch(counterView.getName()) {
+ switch (counterView.getName()) {
case "+1/+1":
if (counterView.getCount() != plusCounter) {
plusCounter = counterView.getCount();
@@ -913,10 +913,10 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
}
private static ImageIcon getCounterImageWithAmount(int amount, BufferedImage image, int cardWidth) {
- int factor = cardWidth > WIDTH_LIMIT ? 2 :1;
+ int factor = cardWidth > WIDTH_LIMIT ? 2 : 1;
int xOffset = amount > 9 ? 2 : 5;
- int fontSize = factor == 1 ? amount < 10 ? 12 : amount < 100 ? 10 : amount < 1000 ? 7: 6
- :amount < 10 ? 19 : amount < 100 ? 15 : amount < 1000 ? 12: amount < 10000 ?9 : 8;
+ int fontSize = factor == 1 ? amount < 10 ? 12 : amount < 100 ? 10 : amount < 1000 ? 7 : 6
+ : amount < 10 ? 19 : amount < 100 ? 15 : amount < 1000 ? 12 : amount < 10000 ? 9 : 8;
BufferedImage newImage;
if (cardWidth > WIDTH_LIMIT) {
newImage = ImageManagerImpl.deepCopy(image);
@@ -925,7 +925,7 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
}
Graphics graphics = newImage.getGraphics();
graphics.setColor(Color.BLACK);
- graphics.setFont(new Font("Arial Black", amount > 100 ? Font.PLAIN : Font.BOLD, fontSize ));
+ graphics.setFont(new Font("Arial Black", amount > 100 ? Font.PLAIN : Font.BOLD, fontSize));
graphics.drawString(Integer.toString(amount), xOffset * factor, 11 * factor);
return new ImageIcon(newImage);
}
@@ -977,12 +977,12 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
if (gameCard.hideInfo()) {
return;
}
- if (!popupShowing) {
+ if (!tooltipShowing) {
synchronized (this) {
- if (!popupShowing) {
+ if (!tooltipShowing) {
TransferData transferData = getTransferDataForMouseEntered();
if (this.isShowing()) {
- popupShowing = true;
+ tooltipShowing = true;
callback.mouseEntered(e, transferData);
}
}
@@ -1013,13 +1013,13 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
if (getMousePosition(true) != null) {
return;
}
- if (popupShowing) {
+ if (tooltipShowing) {
synchronized (this) {
- if (popupShowing) {
- popupShowing = false;
+ if (tooltipShowing) {
+ tooltipShowing = false;
data.component = this;
data.card = this.gameCard;
- data.popupText = popupText;
+ data.popupText = tooltipText;
callback.mouseExited(e, data);
}
}
@@ -1047,7 +1047,7 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
private TransferData getTransferDataForMouseEntered() {
data.component = this;
data.card = this.gameCard;
- data.popupText = popupText;
+ data.popupText = tooltipText;
data.gameId = this.gameId;
data.locationOnScreen = data.component.getLocationOnScreen(); // we need this for popup
data.popupOffsetX = isTapped() ? cardHeight + cardXOffset + POPUP_X_GAP : cardWidth + cardXOffset + POPUP_X_GAP;
@@ -1145,7 +1145,7 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
dayNightButton.setIcon(new ImageIcon(night));
}
if (this.gameCard.getSecondCardFace() == null) {
- log.error("no second side for card to transform!");
+ logger.error("no second side for card to transform!");
return;
}
if (!isPermanent) { // use only for custom transformation (when pressing day-night button)
@@ -1210,5 +1210,14 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti
yTextOffset = yOffset;
}
+ @Override
+ public JPopupMenu getPopupMenu() {
+ return popupMenu;
+ }
+
+ @Override
+ public void setPopupMenu(JPopupMenu popupMenu) {
+ this.popupMenu = popupMenu;
+ }
}
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/CardPluginImpl.java b/Mage.Client/src/main/java/org/mage/plugins/card/CardPluginImpl.java
index 7c99afe5997..6dd83a15359 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/CardPluginImpl.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/CardPluginImpl.java
@@ -81,6 +81,7 @@ public class CardPluginImpl implements CardPlugin {
@PluginLoaded
public void newPlugin(CardPlugin plugin) {
+ log.info(plugin.toString() + " has been loaded.");
}
@Override
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java
index 497bc1c1883..b84f07cc1ad 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java
@@ -9,7 +9,7 @@ import org.mage.plugins.card.images.CardDownloadData;
public interface CardImageSource {
String generateURL(CardDownloadData card) throws Exception;
- String generateTokenUrl(CardDownloadData card);
+ String generateTokenUrl(CardDownloadData card) throws Exception;
String getSourceName();
Float getAverageSize();
}
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java
index 4ad6037eccd..b18182f5e80 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java
@@ -36,7 +36,7 @@ public class GathererSets implements Iterable {
private static final String[] withMythics = {"M10", "M11", "M12", "M13", "M14", "M15", "ORI",
"DDF", "DDG", "DDH", "DDI", "DDJ", "DDK", "DDL", "DDM", "DDN",
- "DD3", "DD3B", "DDO",
+ "DD3", "DD3B", "DDO", "DDP",
"FVD", "FVE", "FVL", "FVR",
"V12", "V13", "V14", "V15",
"ALA", "CON", "ARB",
@@ -49,7 +49,7 @@ public class GathererSets implements Iterable {
"THS", "BNG", "JOU",
"CNS", "VMA", "TPR",
"KTK", "FRF", "DTK",
- "BFZ"};
+ "BFZ", "EXP", "OGW"};
private static final HashMap symbolsReplacements = new HashMap<>();
static {
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java
index bec0386a467..5b2ab1a20b1 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java
@@ -13,9 +13,12 @@ import org.mage.plugins.card.utils.CardImageUtils;
public class MagicCardsImageSource implements CardImageSource {
private static CardImageSource instance = new MagicCardsImageSource();
-
+
private static final Map setNameTokenReplacement = new HashMap() {
{
+ put("C15", "commander-2015");
+ put("ORG", "oath-of-the-gatewatch");
+ put("EXP", "zendikar-expeditions");
put("BFZ", "battle-for-zendikar");
put("FVL", "from-the-vault-legends");
put("FVD", "from-the-vault-dragons");
@@ -31,8 +34,8 @@ public class MagicCardsImageSource implements CardImageSource {
put("MM2", "modern-masters-2015");
put("PTC", "prerelease-events");
put("DTK", "dragons-of-tarkir");
- put("GRC","wpngateway");
- put("MBP","media-inserts");
+ put("GRC", "wpngateway");
+ put("MBP", "media-inserts");
put("MLP", "launch-party");
put("WMCQ", "world-magic-cup-qualifier");
put("GPX", "grand-prix");
@@ -40,7 +43,7 @@ public class MagicCardsImageSource implements CardImageSource {
put("MGDC", "magic-game-day-cards");
put("FNMP", "friday-night-magic");
put("FRF", "fate-reforged");
- put("C14", "commander-2014-edition");
+ put("C14", "commander-2014");
put("KTK", "khans-of-tarkir");
put("VMA", "vintage-masters");
put("CNS", "conspiracy");
@@ -103,6 +106,7 @@ public class MagicCardsImageSource implements CardImageSource {
put("DDM", "duel-decks-jace-vs-vraska");
put("DDN", "duel-decks-speed-vs-cunning");
put("DDO", "duel-decks-elspeth-vs-kiora");
+ put("DDP", "duel-decks-zendikar-vs-eldrazi");
}
private static final long serialVersionUID = 1L;
};
@@ -129,7 +133,7 @@ public class MagicCardsImageSource implements CardImageSource {
String set = CardImageUtils.updateSet(cardSet, true);
String preferedLanguage = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_PREF_LANGUAGE, "en");
-
+
StringBuilder url = new StringBuilder("http://magiccards.info/scans/").append(preferedLanguage).append("/");
url.append(set.toLowerCase()).append("/").append(collectorId);
@@ -153,7 +157,12 @@ public class MagicCardsImageSource implements CardImageSource {
@Override
public String generateTokenUrl(CardDownloadData card) {
- String name = card.getName().replaceAll(" ", "-").replace(",", "").toLowerCase();
+ String name = card.getName();
+ // add type to name if it's not 0
+ if (card.getType() > 0) {
+ name = name + " " + card.getType();
+ }
+ name = name.replaceAll(" ", "-").replace(",", "").toLowerCase();
String set = "not-supported-set";
if (setNameTokenReplacement.containsKey(card.getSet())) {
set = setNameTokenReplacement.get(card.getSet());
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java
index 0728084c111..78995593cd7 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java
@@ -36,7 +36,10 @@ import java.net.Proxy;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.Map;
+import java.util.Set;
import java.util.prefs.Preferences;
import mage.client.MageFrame;
import mage.remote.Connection;
@@ -56,6 +59,7 @@ public class MythicspoilerComSource implements CardImageSource {
private static CardImageSource instance;
private static Map setsAliases;
private static Map cardNameAliases;
+ private static Map> cardNameAliasesStart;
private final Map> sets;
public static CardImageSource getInstance() {
@@ -71,8 +75,9 @@ public class MythicspoilerComSource implements CardImageSource {
}
public MythicspoilerComSource() {
- sets = new HashMap<>();
+ sets = new LinkedHashMap<>();
setsAliases = new HashMap<>();
+ setsAliases.put("exp", "bfz");
cardNameAliases = new HashMap<>();
// set+wrong name from web side => correct card name
cardNameAliases.put("MM2-otherwordlyjourney", "otherworldlyjourney");
@@ -81,12 +86,24 @@ public class MythicspoilerComSource implements CardImageSource {
cardNameAliases.put("THS-soldierofpantheon", "soldierofthepantheon");
cardNameAliases.put("THS-vulpinegolaith", "vulpinegoliath");
cardNameAliases.put("ORI-kothopedhoarderofsouls", "kothophedsoulhoarder");
+ cardNameAliases.put("BFZ-unisonstrike", "tandemtactics");
+ cardNameAliases.put("BFZ-eldrazidevastator", "eldrazidevastator");
+ cardNameAliases.put("BFZ-kozliekschanneler", "kozilekschanneler");
+
+ cardNameAliasesStart = new HashMap<>();
+ HashSet names = new HashSet<>();
+ names.add("eldrazidevastator.jpg");
+ cardNameAliasesStart.put("BFZ", names);
}
private Map getSetLinks(String cardSet) {
Map setLinks = new HashMap<>();
try {
String setNames = setsAliases.get(cardSet.toLowerCase());
+ Set aliasesStart = new HashSet<>();
+ if (cardNameAliasesStart.containsKey(cardSet)) {
+ aliasesStart.addAll(cardNameAliasesStart.get(cardSet));
+ }
if (setNames == null) {
setNames = cardSet.toLowerCase();
}
@@ -119,33 +136,42 @@ public class MythicspoilerComSource implements CardImageSource {
}
Elements cardsImages = doc.select("img[src^=cards/]"); // starts with cards/
+ if (!aliasesStart.isEmpty()) {
+ for (String text : aliasesStart) {
+ cardsImages.addAll(doc.select("img[src^=" + text + "]"));
+ }
+ }
if (cardsImages.isEmpty()) {
break;
}
for (Element cardsImage : cardsImages) {
String cardLink = cardsImage.attr("src");
+ String cardName = null;
if (cardLink.startsWith("cards/") && cardLink.endsWith(".jpg")) {
- String cardName = cardLink.substring(6, cardLink.length() - 4);
- if (cardName != null && !cardName.isEmpty()) {
- if (cardNameAliases.containsKey(cardSet + "-" + cardName)) {
- cardName = cardNameAliases.get(cardSet + "-" + cardName);
- }
- if (cardName.endsWith("1") || cardName.endsWith("2") || cardName.endsWith("3") || cardName.endsWith("4") || cardName.endsWith("5")) {
- if (!cardName.startsWith("forest")
- && !cardName.startsWith("swamp")
- && !cardName.startsWith("mountain")
- && !cardName.startsWith("island")
- && !cardName.startsWith("plains")) {
- cardName = cardName.substring(0, cardName.length() - 1);
- }
- }
- setLinks.put(cardName, baseUrl + cardLink);
- }
+ cardName = cardLink.substring(6, cardLink.length() - 4);
+ } else if (aliasesStart.contains(cardLink)) {
+ cardName = cardLink.substring(0, cardLink.length() - 4);;
+ }
+ if (cardName != null && !cardName.isEmpty()) {
+ if (cardNameAliases.containsKey(cardSet + "-" + cardName)) {
+ cardName = cardNameAliases.get(cardSet + "-" + cardName);
+ }
+ if (cardName.endsWith("1") || cardName.endsWith("2") || cardName.endsWith("3") || cardName.endsWith("4") || cardName.endsWith("5")) {
+ if (!cardName.startsWith("forest")
+ && !cardName.startsWith("swamp")
+ && !cardName.startsWith("mountain")
+ && !cardName.startsWith("island")
+ && !cardName.startsWith("plains")) {
+ cardName = cardName.substring(0, cardName.length() - 1);
+ }
+ }
+ setLinks.put(cardName, baseUrl + cardLink);
}
-
}
+
}
+
} catch (IOException ex) {
System.out.println("Exception when parsing the mythicspoiler page: " + ex.getMessage());
}
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java
new file mode 100644
index 00000000000..fbdfb89d912
--- /dev/null
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java
@@ -0,0 +1,324 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+
+package org.mage.plugins.card.dl.sources;
+
+import org.apache.log4j.Logger;
+import org.mage.plugins.card.images.CardDownloadData;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * @author Quercitron
+ */
+public class TokensMtgImageSource implements CardImageSource {
+
+ private static final Logger logger = Logger.getLogger(TokensMtgImageSource.class);
+
+ private static CardImageSource instance = new TokensMtgImageSource();
+
+ public static CardImageSource getInstance() {
+ if (instance == null) {
+ instance = new TokensMtgImageSource();
+ }
+ return instance;
+ }
+
+ @Override
+ public String getSourceName() {
+ return "tokens.mtg.onl";
+ }
+
+ @Override
+ public Float getAverageSize() {
+ return 26.7f;
+ }
+
+ @Override
+ public String generateURL(CardDownloadData card) throws Exception {
+ return null;
+ }
+
+ private static final String[] EMBLEMS = {
+ "Ajani",
+ "Chandra",
+ "Dack",
+ "Daretti",
+ "Domri",
+ "Elspeth",
+ "Garruk",
+ "Gideon",
+ "Jace",
+ "Kiora",
+ "Koth",
+ "Liliana",
+ "Narset",
+ "Nixilis",
+ "Sarkhan",
+ "Sorin",
+ "Tamiyo",
+ "Teferi",
+ "Venser",
+ };
+
+ private static final Map SET_NAMES_REPLACEMENT = new HashMap() {
+ {
+ put("con", "CFX");
+ put("fnmp", "FNM");
+ }
+ };
+
+ @Override
+ public String generateTokenUrl(CardDownloadData card) throws IOException {
+ String name = card.getName();
+ String set = card.getSet();
+ int type = card.getType();
+
+ // handle emblems
+ if (name.toLowerCase().contains("emblem")) {
+ for (String emblem : EMBLEMS) {
+ if (name.toLowerCase().contains(emblem.toLowerCase())){
+ name = emblem + " Emblem";
+ break;
+ }
+ }
+ }
+
+ // we should replace some set names
+ if (SET_NAMES_REPLACEMENT.containsKey(set.toLowerCase())) {
+ set = SET_NAMES_REPLACEMENT.get(set.toLowerCase());
+ }
+
+ // Image URL contains token number
+ // e.g. http://tokens.mtg.onl/tokens/ORI_010-Thopter.jpg -- token number 010
+ // We don't know these numbers, but we can take them from a file
+ // with tokens information that can be downloaded from the site.
+ List tokensData = getTokensData();
+
+ if (tokensData.isEmpty()) {
+ return null;
+ }
+
+ List matchedTokens = new ArrayList();
+ for (TokenData token : tokensData) {
+ if (name.equalsIgnoreCase(token.getName()) && set.equalsIgnoreCase(token.getExpansionSetCode())) {
+ matchedTokens.add(token);
+ }
+ }
+
+ if (matchedTokens.isEmpty()) {
+ logger.info("Could not find data for token " + name + ", set " + set + ".");
+ return null;
+ }
+
+ TokenData tokenData;
+ if (type == 0) {
+ if (matchedTokens.size() > 1) {
+ logger.info("Multiple images were found for token " + name + ", set " + set + ".");
+ }
+ tokenData = matchedTokens.get(0);
+ } else {
+ if (type > matchedTokens.size()) {
+ logger.warn("Not enough images for token with type " + type + ", name " + name + ", set " + set + ".");
+ return null;
+ }
+ tokenData = matchedTokens.get(card.getType() - 1);
+ }
+
+ String url = "http://tokens.mtg.onl/tokens/" + tokenData.getExpansionSetCode().trim() + "_"
+ + tokenData.getNumber().trim() + "-" + tokenData.getName().trim()+ ".jpg";
+ url = url.replace(' ', '-');
+ return url;
+ }
+
+ private List tokensData;
+
+ private final Object tokensDataSync = new Object();
+
+ private List getTokensData() throws IOException {
+ if (tokensData == null) {
+ synchronized (tokensDataSync) {
+ if (tokensData == null) {
+ tokensData = new ArrayList();
+
+ // get tokens data from resource file
+ InputStream inputStream = null;
+ try {
+ inputStream = this.getClass().getResourceAsStream("/tokens-mtg-onl-list.csv");
+ List fileTokensData = parseTokensData(inputStream);
+ tokensData.addAll(fileTokensData);
+ } catch (Exception exception) {
+ logger.warn("Failed to get tokens description from resource file tokens-mtg-onl-list.csv", exception);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (Exception e) {
+ logger.error("Input stream close failed:", e);
+ }
+ }
+ }
+
+ // description on site may contain new information
+ // try to add it
+ try {
+ URL url = new URL("http://tokens.mtg.onl/data/SetsWithTokens.csv");
+ inputStream = url.openStream();
+ List siteTokensData = parseTokensData(inputStream);
+
+ List newTokensData = new ArrayList();
+ for (TokenData siteData : siteTokensData) {
+ boolean isNew = true;
+ for (TokenData fileData : tokensData) {
+ if (siteData.getName().equalsIgnoreCase(fileData.getName())
+ && siteData.getNumber().equalsIgnoreCase(fileData.getNumber())
+ && siteData.getExpansionSetCode().equalsIgnoreCase(fileData.getExpansionSetCode())) {
+ isNew = false;
+ break;
+ }
+ }
+ if (isNew) {
+ newTokensData.add(siteData);
+ }
+ }
+
+ tokensData.addAll(newTokensData);
+ } catch (Exception exception) {
+ logger.warn("Failed to get tokens description from tokens.mtg.onl", exception);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (Exception e) {
+ logger.error("Input stream close failed:", e);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return tokensData;
+ }
+
+ private List parseTokensData(InputStream inputStream) throws IOException {
+ List tokensData = new ArrayList();
+
+ InputStreamReader inputReader = null;
+ BufferedReader reader = null;
+ try {
+ // we have to specify encoding to read special comma
+ inputReader = new InputStreamReader(inputStream, "Cp1252");
+ reader = new BufferedReader(inputReader);
+
+ reader.readLine(); // skip header
+ String line = reader.readLine();
+ // states
+ // 0 - wait set name
+ // 1 - wait cards
+ // 2 - process cards
+ int state = 0;
+ String set = null;
+ while (line != null) {
+ if (line.trim().isEmpty()) {
+ if (state == 2) {
+ state = 0;
+ }
+ } else {
+ if (state == 0) {
+ set = line.substring(0, 3);
+ state = 1;
+ } else {
+ if (state == 1) {
+ state = 2;
+ }
+ String[] split = line.split(",");
+ // replace special comma for cards like 'Ashaya‚ the Awoken World'
+ String name = split[0].replace('‚', ',');
+ String number = split[1];
+ TokenData token = new TokenData(name, number, set);
+ tokensData.add(token);
+ }
+ }
+
+ line = reader.readLine();
+ }
+ } finally {
+ if (inputReader != null) {
+ try {
+ inputReader.close();
+ } catch (Exception e) {
+ logger.error("Input reader close failed:", e);
+ }
+ }
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (Exception e) {
+ logger.error("Buffered reader close failed:", e);
+ }
+ }
+ }
+
+ return tokensData;
+ }
+
+ final class TokenData {
+ final private String name;
+ final private String number;
+ final private String expansionSetCode;
+
+ public TokenData(String name, String number, String expansionSetCode) {
+ this.name = name;
+ this.number = number;
+ this.expansionSetCode = expansionSetCode;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public String getExpansionSetCode() {
+ return expansionSetCode;
+ }
+ }
+
+}
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java
index 08a6a7287d8..9a1c93babe8 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java
@@ -99,6 +99,7 @@ public class WizardCardsImageSource implements CardImageSource {
setsAliases.put("BTD", "Beatdown Box Set");
setsAliases.put("C13", "Commander 2013 Edition");
setsAliases.put("C14", "Commander 2014");
+ setsAliases.put("C15", "Commander 2015");
setsAliases.put("CHK", "Champions of Kamigawa");
setsAliases.put("CHR", "Chronicles");
setsAliases.put("CMD", "Magic: The Gathering-Commander");
@@ -123,6 +124,7 @@ public class WizardCardsImageSource implements CardImageSource {
setsAliases.put("DDM", "Duel Decks: Jace vs. Vraska");
setsAliases.put("DDN", "Duel Decks: Speed vs. Cunning");
setsAliases.put("DDO", "Duel Decks: Elspeth vs. Kiora");
+ setsAliases.put("DDP", "Duel Decks: Zendikar vs. Eldrazi");
setsAliases.put("DGM", "Dragon's Maze");
setsAliases.put("DIS", "Dissension");
setsAliases.put("DKA", "Dark Ascension");
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java
index 4467e0ab2af..fae3f0ca071 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java
@@ -49,17 +49,12 @@ import mage.client.constants.Constants;
import mage.client.dialog.PreferencesDialog;
import mage.client.util.sets.ConstructedFormats;
import mage.remote.Connection;
-import static mage.remote.Connection.ProxyType.HTTP;
-import static mage.remote.Connection.ProxyType.SOCKS;
import net.java.truevfs.access.TFile;
import net.java.truevfs.access.TFileOutputStream;
import net.java.truevfs.access.TVFS;
import net.java.truevfs.kernel.spec.FsSyncException;
import org.apache.log4j.Logger;
-import org.mage.plugins.card.dl.sources.CardImageSource;
-import org.mage.plugins.card.dl.sources.MagicCardsImageSource;
-import org.mage.plugins.card.dl.sources.MythicspoilerComSource;
-import org.mage.plugins.card.dl.sources.WizardCardsImageSource;
+import org.mage.plugins.card.dl.sources.*;
import org.mage.plugins.card.properties.SettingsManager;
import org.mage.plugins.card.utils.CardImageUtils;
@@ -140,7 +135,16 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
p0.add(jLabel1);
p0.add(Box.createVerticalStrut(5));
- ComboBoxModel jComboBox1Model = new DefaultComboBoxModel(new String[] { "magiccards.info", "wizards.com", "mythicspoiler.com" /*, "mtgimage.com (HQ)" , "mtgathering.ru HQ", "mtgathering.ru MQ", "mtgathering.ru LQ"*/});
+ ComboBoxModel jComboBox1Model = new DefaultComboBoxModel(new String[] {
+ "magiccards.info",
+ "wizards.com",
+ "mythicspoiler.com",
+ "tokens.mtg.onl",
+ //"mtgimage.com (HQ)",
+ //"mtgathering.ru HQ",
+ //"mtgathering.ru MQ",
+ //"mtgathering.ru LQ",
+ });
jComboBox1 = new JComboBox();
cardImageSource = MagicCardsImageSource.getInstance();
@@ -161,6 +165,9 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
case 2:
cardImageSource = MythicspoilerComSource.getInstance();
break;
+ case 3:
+ cardImageSource = TokensMtgImageSource.getInstance();
+ break;
}
int count = DownloadPictures.this.cards.size();
float mb = (count * cardImageSource.getAverageSize()) / 1024;
@@ -221,7 +228,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
// JOptionPane
Object[] options = { startDownloadButton, closeButton = new JButton("Cancel") };
- dlg = new JOptionPane(p0, JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[1]);
+ dlg = new JOptionPane(p0, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[1]);
}
public static boolean checkForNewCards(List allCards) {
@@ -363,23 +370,27 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
while (line != null) {
line = line.trim();
if (line.startsWith("|")) { // new format
- String[] params = line.split("\\|");
- if (params.length >= 4) {
+ String[] params = line.split("\\|", -1);
+ if (params.length >= 5) {
+ int type = 0;
+ if (params[4] != null && ! params[4].isEmpty()) {
+ type = Integer.parseInt(params[4].trim());
+ }
if (params[1].toLowerCase().equals("generate") && params[2].startsWith("TOK:")) {
String set = params[2].substring(4);
- CardDownloadData card = new CardDownloadData(params[3], set, 0, false, 0, "", true);
+ CardDownloadData card = new CardDownloadData(params[3], set, 0, false, type, "", true);
list.add(card);
} else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM:")) {
String set = params[2].substring(7);
- CardDownloadData card = new CardDownloadData("Emblem " + params[3], set, 0, false,0, "", true);
+ CardDownloadData card = new CardDownloadData("Emblem " + params[3], set, 0, false, type, "", true);
list.add(card);
} else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM-:")) {
String set = params[2].substring(8);
- CardDownloadData card = new CardDownloadData(params[3] + " Emblem", set, 0, false, 0, "", true);
+ CardDownloadData card = new CardDownloadData(params[3] + " Emblem", set, 0, false, type, "", true);
list.add(card);
} else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM!:")) {
String set = params[2].substring(8);
- CardDownloadData card = new CardDownloadData(params[3], set, 0, false, 0, "", true);
+ CardDownloadData card = new CardDownloadData(params[3], set, 0, false, type, "", true);
list.add(card);
}
} else {
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java
index 33cbb1a7dbe..6389c70ecff 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java
@@ -25,8 +25,8 @@ import org.mage.plugins.card.utils.CardImageUtils;
/**
* This class stores ALL card images in a cache with soft values. this means
- * that the images may be garbage collected when they are not needed any more, but will
- * be kept as long as possible.
+ * that the images may be garbage collected when they are not needed any more,
+ * but will be kept as long as possible.
*
* Key format: "####"
*
@@ -46,8 +46,7 @@ public class ImageCache {
private static final Map imageCache;
/**
- * Common pattern for keys.
- * Format: "##"
+ * Common pattern for keys. Format: "##"
*/
private static final Pattern KEY_PATTERN = Pattern.compile("(.*)#(.*)#(.*)#(.*)#(.*)");
@@ -104,16 +103,16 @@ public class ImageCache {
thumbnailFile = new TFile(thumbnailPath);
} catch (Exception ex) {
}
- boolean exists =false;
+ boolean exists = false;
if (thumbnailFile != null) {
try {
exists = thumbnailFile.exists();
- } catch(Exception ex) {
+ } catch (Exception ex) {
exists = false;
}
}
if (exists) {
- log.debug("loading thumbnail for " + key + ", path="+thumbnailPath);
+ log.debug("loading thumbnail for " + key + ", path=" + thumbnailPath);
return loadImage(thumbnailFile);
} else {
BufferedImage image = loadImage(file);
@@ -187,30 +186,15 @@ public class ImageCache {
}
public static BufferedImage getThumbnail(CardView card) {
- String key = getKey(card) + "#thumb";
- if (card.getUsesVariousArt()) {
- key += "#usesVariousArt";
- }
- // log.debug("#key: " + key);
- return getImage(key);
+ return getImage(getKey(card, card.getName(), "#thumb"));
}
public static BufferedImage getImageOriginal(CardView card) {
- String key = getKey(card);
- if (card.getUsesVariousArt()) {
- key += "#usesVariousArt";
- }
- // log.warn("#key: " + key);
- return getImage(key);
+ return getImage(getKey(card, card.getName(), ""));
}
public static BufferedImage getImageOriginalAlternateName(CardView card) {
- String key = getKeyAlternateName(card, card.getAlternateName());
- if (card.getUsesVariousArt()) {
- key += "#usesVariousArt";
- }
- // log.warn("#key: " + key);
- return getImage(key);
+ return getImage(getKey(card, card.getAlternateName(), ""));
}
/**
@@ -230,7 +214,7 @@ public class ImageCache {
if (ex.getCause() instanceof NullPointerException) {
return null;
}
- log.error(ex,ex);
+ log.error(ex, ex);
return null;
}
}
@@ -238,32 +222,25 @@ public class ImageCache {
/**
* Returns the map key for a card, without any suffixes for the image size.
*/
- private static String getKey(CardView card) {
- StringBuilder sb = new StringBuilder(card.getName()).append("#");
- sb.append(card.getExpansionSetCode()).append("#");
- sb.append(card.getType()).append("#");
- sb.append(card.getCardNumber()).append("#");
- sb.append(card.getTokenSetCode() == null ? "":card.getTokenSetCode());
- return sb.toString();
- }
-
- /**
- * Returns the map key for the flip image of a card, without any suffixes for the image size.
- */
- private static String getKeyAlternateName(CardView card, String alternateName) {
- StringBuilder sb = new StringBuilder(alternateName).append("#");
- sb.append(card.getExpansionSetCode()).append("#");
- sb.append(card.getType()).append("#");
- sb.append(card.getCardNumber()).append("#");
- sb.append(card.getTokenSetCode() == null ? "":card.getTokenSetCode());
- return sb.toString();
+ private static String getKey(CardView card, String name, String suffix) {
+ return name + "#" + card.getExpansionSetCode() + "#" + card.getType() + "#" + card.getCardNumber() + "#"
+ + (card.getTokenSetCode() == null ? "" : card.getTokenSetCode())
+ + suffix
+ + (card.getUsesVariousArt() ? "#usesVariousArt" : "");
+
}
+// /**
+// * Returns the map key for the flip image of a card, without any suffixes for the image size.
+// */
+// private static String getKeyAlternateName(CardView card, String alternateName) {
+// return alternateName + "#" + card.getExpansionSetCode() + "#" +card.getType()+ "#" + card.getCardNumber() + "#"
+// + (card.getTokenSetCode() == null ? "":card.getTokenSetCode());
+// }
/**
* Load image from file
*
- * @param file
- * file to load image from
+ * @param file file to load image from
* @return {@link BufferedImage}
*/
public static BufferedImage loadImage(TFile file) {
@@ -297,7 +274,7 @@ public class ImageCache {
ImageIO.write(image, "jpg", outputStream);
}
} catch (IOException e) {
- log.error(e,e);
+ log.error(e, e);
imageFile.delete();
}
return image;
@@ -305,6 +282,7 @@ public class ImageCache {
/**
* Returns an image scaled to the size given
+ *
* @param original
* @return
*/
@@ -344,6 +322,7 @@ public class ImageCache {
/**
* Returns an image scaled to the size appropriate for the card picture
* panel
+ *
* @param original
* @param sizeNeed
* @return
@@ -356,6 +335,7 @@ public class ImageCache {
/**
* Returns the image appropriate to display the card in the picture panel
+ *
* @param card
* @param width
* @param height
@@ -365,11 +345,7 @@ public class ImageCache {
if (Constants.THUMBNAIL_SIZE_FULL.width + 10 > width) {
return getThumbnail(card);
}
- String key = getKey(card);
- if (card.getUsesVariousArt()) {
- key += "#usesVariousArt";
- }
- // log.warn("getImage: " + key);
+ String key = getKey(card, card.getName(), "");
BufferedImage original = getImage(key);
if (original == null) {
log.debug(key + " not found");
diff --git a/Mage.Client/src/main/resources/avatars/10.jpg b/Mage.Client/src/main/resources/avatars/10.jpg
index fb5b2744649..7ce97fc81e3 100644
Binary files a/Mage.Client/src/main/resources/avatars/10.jpg and b/Mage.Client/src/main/resources/avatars/10.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/11.jpg b/Mage.Client/src/main/resources/avatars/11.jpg
new file mode 100644
index 00000000000..2b665f235a2
Binary files /dev/null and b/Mage.Client/src/main/resources/avatars/11.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/12.jpg b/Mage.Client/src/main/resources/avatars/12.jpg
new file mode 100644
index 00000000000..d57f3963ee1
Binary files /dev/null and b/Mage.Client/src/main/resources/avatars/12.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/13.jpg b/Mage.Client/src/main/resources/avatars/13.jpg
index 2b665f235a2..b08ae1c24ab 100644
Binary files a/Mage.Client/src/main/resources/avatars/13.jpg and b/Mage.Client/src/main/resources/avatars/13.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/14.jpg b/Mage.Client/src/main/resources/avatars/14.jpg
index d57f3963ee1..e45b888a9ea 100644
Binary files a/Mage.Client/src/main/resources/avatars/14.jpg and b/Mage.Client/src/main/resources/avatars/14.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/15.jpg b/Mage.Client/src/main/resources/avatars/15.jpg
new file mode 100644
index 00000000000..d7fcc94512b
Binary files /dev/null and b/Mage.Client/src/main/resources/avatars/15.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/16.jpg b/Mage.Client/src/main/resources/avatars/16.jpg
new file mode 100644
index 00000000000..75b41b0ce63
Binary files /dev/null and b/Mage.Client/src/main/resources/avatars/16.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/17.jpg b/Mage.Client/src/main/resources/avatars/17.jpg
new file mode 100644
index 00000000000..12905b63ec3
Binary files /dev/null and b/Mage.Client/src/main/resources/avatars/17.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/18.jpg b/Mage.Client/src/main/resources/avatars/18.jpg
new file mode 100644
index 00000000000..d02ccd4c29d
Binary files /dev/null and b/Mage.Client/src/main/resources/avatars/18.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/19.jpg b/Mage.Client/src/main/resources/avatars/19.jpg
index b08ae1c24ab..bbffc049eea 100644
Binary files a/Mage.Client/src/main/resources/avatars/19.jpg and b/Mage.Client/src/main/resources/avatars/19.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/48.jpg b/Mage.Client/src/main/resources/avatars/20.jpg
similarity index 100%
rename from Mage.Client/src/main/resources/avatars/48.jpg
rename to Mage.Client/src/main/resources/avatars/20.jpg
diff --git a/Mage.Client/src/main/resources/avatars/21.jpg b/Mage.Client/src/main/resources/avatars/21.jpg
new file mode 100644
index 00000000000..fb5b2744649
Binary files /dev/null and b/Mage.Client/src/main/resources/avatars/21.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/22.jpg b/Mage.Client/src/main/resources/avatars/22.jpg
index e45b888a9ea..12c2a87b7bf 100644
Binary files a/Mage.Client/src/main/resources/avatars/22.jpg and b/Mage.Client/src/main/resources/avatars/22.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/23.jpg b/Mage.Client/src/main/resources/avatars/23.jpg
index d7fcc94512b..64459f61716 100644
Binary files a/Mage.Client/src/main/resources/avatars/23.jpg and b/Mage.Client/src/main/resources/avatars/23.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/57.jpg b/Mage.Client/src/main/resources/avatars/24.jpg
similarity index 100%
rename from Mage.Client/src/main/resources/avatars/57.jpg
rename to Mage.Client/src/main/resources/avatars/24.jpg
diff --git a/Mage.Client/src/main/resources/avatars/25.jpg b/Mage.Client/src/main/resources/avatars/25.jpg
index 75b41b0ce63..68b2b338648 100644
Binary files a/Mage.Client/src/main/resources/avatars/25.jpg and b/Mage.Client/src/main/resources/avatars/25.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/62.jpg b/Mage.Client/src/main/resources/avatars/26.jpg
similarity index 100%
rename from Mage.Client/src/main/resources/avatars/62.jpg
rename to Mage.Client/src/main/resources/avatars/26.jpg
diff --git a/Mage.Client/src/main/resources/avatars/66.jpg b/Mage.Client/src/main/resources/avatars/27.jpg
similarity index 100%
rename from Mage.Client/src/main/resources/avatars/66.jpg
rename to Mage.Client/src/main/resources/avatars/27.jpg
diff --git a/Mage.Client/src/main/resources/avatars/71.jpg b/Mage.Client/src/main/resources/avatars/28.jpg
similarity index 100%
rename from Mage.Client/src/main/resources/avatars/71.jpg
rename to Mage.Client/src/main/resources/avatars/28.jpg
diff --git a/Mage.Client/src/main/resources/avatars/29.jpg b/Mage.Client/src/main/resources/avatars/29.jpg
index 12905b63ec3..ee79324b94d 100644
Binary files a/Mage.Client/src/main/resources/avatars/29.jpg and b/Mage.Client/src/main/resources/avatars/29.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/30.jpg b/Mage.Client/src/main/resources/avatars/30.jpg
index d02ccd4c29d..cf70d9b85e8 100644
Binary files a/Mage.Client/src/main/resources/avatars/30.jpg and b/Mage.Client/src/main/resources/avatars/30.jpg differ
diff --git a/Mage.Client/src/main/resources/avatars/77.jpg b/Mage.Client/src/main/resources/avatars/31.jpg
similarity index 100%
rename from Mage.Client/src/main/resources/avatars/77.jpg
rename to Mage.Client/src/main/resources/avatars/31.jpg
diff --git a/Mage.Client/src/main/resources/avatars/9.jpg b/Mage.Client/src/main/resources/avatars/32.jpg
similarity index 100%
rename from Mage.Client/src/main/resources/avatars/9.jpg
rename to Mage.Client/src/main/resources/avatars/32.jpg
diff --git a/Mage.Client/src/main/resources/avatars/39.jpg b/Mage.Client/src/main/resources/avatars/39.jpg
deleted file mode 100644
index bbffc049eea..00000000000
Binary files a/Mage.Client/src/main/resources/avatars/39.jpg and /dev/null differ
diff --git a/Mage.Client/src/main/resources/avatars/51.jpg b/Mage.Client/src/main/resources/avatars/51.jpg
deleted file mode 100644
index 7ce97fc81e3..00000000000
Binary files a/Mage.Client/src/main/resources/avatars/51.jpg and /dev/null differ
diff --git a/Mage.Client/src/main/resources/avatars/52.jpg b/Mage.Client/src/main/resources/avatars/52.jpg
deleted file mode 100644
index 12c2a87b7bf..00000000000
Binary files a/Mage.Client/src/main/resources/avatars/52.jpg and /dev/null differ
diff --git a/Mage.Client/src/main/resources/avatars/53.jpg b/Mage.Client/src/main/resources/avatars/53.jpg
deleted file mode 100644
index 64459f61716..00000000000
Binary files a/Mage.Client/src/main/resources/avatars/53.jpg and /dev/null differ
diff --git a/Mage.Client/src/main/resources/avatars/6.jpg b/Mage.Client/src/main/resources/avatars/6.jpg
deleted file mode 100644
index 68b2b338648..00000000000
Binary files a/Mage.Client/src/main/resources/avatars/6.jpg and /dev/null differ
diff --git a/Mage.Client/src/main/resources/avatars/72.jpg b/Mage.Client/src/main/resources/avatars/72.jpg
deleted file mode 100644
index ee79324b94d..00000000000
Binary files a/Mage.Client/src/main/resources/avatars/72.jpg and /dev/null differ
diff --git a/Mage.Client/src/main/resources/avatars/75.jpg b/Mage.Client/src/main/resources/avatars/75.jpg
deleted file mode 100644
index cf70d9b85e8..00000000000
Binary files a/Mage.Client/src/main/resources/avatars/75.jpg and /dev/null differ
diff --git a/Mage.Client/src/main/resources/avatars/special/21.gif b/Mage.Client/src/main/resources/avatars/special/21.gif
new file mode 100644
index 00000000000..5de3fb6134a
Binary files /dev/null and b/Mage.Client/src/main/resources/avatars/special/21.gif differ
diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt
index 9cf60742b90..cdd9a2fa5cb 100644
--- a/Mage.Client/src/main/resources/card-pictures-tok.txt
+++ b/Mage.Client/src/main/resources/card-pictures-tok.txt
@@ -1,442 +1,601 @@
-#Generate|TOK:MM2|Eldrazi Spawn 1|
-#Generate|TOK:MM2|Eldrazi Spawn 2|
-#Generate|TOK:MM2|Eldrazi Spawn 3|
-#Generate|TOK:MM2|Elephant|
-#Generate|TOK:MM2|Faerie Rogue|
-#Generate|TOK:MM2|Germ|
-#Generate|TOK:MM2|Golem|
-#Generate|TOK:MM2|Insect|
-#Generate|TOK:MM2|Myr|
-#Generate|TOK:MM2|Saproling|
-#Generate|TOK:MM2|Snake|
-#Generate|TOK:MM2|Soldier|
-#Generate|TOK:MM2|Spirit|
-#Generate|TOK:MM2|Thrull|
-#Generate|TOK:MM2|Wolf|
-#Generate|TOK:MM2|Wurm|
+|Generate|TOK:C15|Angel||
+|Generate|TOK:C15|Bear||
+|Generate|TOK:C15|Beast||
+|Generate|TOK:C15|Cat||
+|Generate|TOK:C15|Dragon||
+|Generate|TOK:C15|Drake||
+|Generate|TOK:C15|Elemental Shaman||
+|Generate|TOK:C15|Elemental||
+|Generate|TOK:C15|Elephant||
+|Generate|TOK:C15|Frog Lizard||
+|Generate|TOK:C15|Germ||
+|Generate|TOK:C15|Gold||
+|Generate|TOK:C15|Knight|1|
+|Generate|TOK:C15|Knight|2|
+|Generate|TOK:C15|Lightning Rager||
+|Generate|TOK:C15|Saproling||
+|Generate|TOK:C15|Shapeshifter||
+|Generate|TOK:C15|Snake|1|
+|Generate|TOK:C15|Snake|2|
+|Generate|TOK:C15|Spider||
+|Generate|TOK:C15|Spirit|1|
+|Generate|TOK:C15|Spirit|2|
+|Generate|TOK:C15|Wolf||
+|Generate|TOK:C15|Zombie||
-#Generate|TOK:TPR|Goblin|
-#Generate|TOK:TPR|Pegasus|
-#Generate|TOK:TPR|Rat|
-#Generate|TOK:TPR|Reflection|
-#Generate|TOK:TPR|Saproling|
-#Generate|TOK:TPR|Sliver|
-#Generate|TOK:TPR|Spike|
-#Generate|TOK:TPR|Spirit|
-#Generate|TOK:TPR|Thopter|
-#Generate|TOK:TPR|Zombie|
+|Generate|TOK:BFZ|Dragon||
+|Generate|TOK:BFZ|Eldrazi||
+|Generate|TOK:BFZ|Eldrazi Scion|1|
+|Generate|TOK:BFZ|Eldrazi Scion|2|
+|Generate|TOK:BFZ|Eldrazi Scion|3|
+|Generate|TOK:BFZ|Elemental|1|
+|Generate|TOK:BFZ|Elemental|2|
+|Generate|TOK:BFZ|Knight Ally||
+|Generate|TOK:BFZ|Kor Ally||
+|Generate|TOK:BFZ|Octopus||
+|Generate|TOK:BFZ|Plant||
+|Generate|EMBLEM!:BFZ|Emblem Gideon, Ally of Zendikar||
+|Generate|EMBLEM!:BFZ|Emblem Kiora, Master of the Depths||
+|Generate|EMBLEM!:BFZ|Emblem Ob Nixilis Reignited||
-#|Generate|TOK:ORI|Ashaya, the Awoken World|
-#|Generate|TOK:ORI|Angel|
-#|Generate|TOK:ORI|Demon|
-#|Generate|TOK:ORI|Elemental|
-#|Generate|TOK:ORI|Elf Warrior|
-#|Generate|TOK:ORI|Goblin|
-#|Generate|TOK:ORI|Knight|
-#|Generate|TOK:ORI|Soldier|
-#|Generate|TOK:ORI|Thopter 1|
-#|Generate|TOK:ORI|Thopter 2|
-#|Generate|TOK:ORI|Zombie|
-#|Generate|EMBLEM!:ORI|Emblem Chandra, Roaring Flame|
-#|Generate|EMBLEM!:ORI|Emblem Jace, Telepath Unbound|
-#|Generate|EMBLEM!:ORI|Emblem Liliana, Defiant Necromancer|
+|Generate|TOK:DDP|Eldrazi Spawn|1|
+|Generate|TOK:DDP|Eldrazi Spawn|2|
+|Generate|TOK:DDP|Eldrazi Spawn|3|
+|Generate|TOK:DDP|Hellion||
+|Generate|TOK:DDP|Plant||
-#|Generate|TOK:PTC|Angel|
-#|Generate|TOK:PTC|Avatar|
-#|Generate|TOK:PTC|Beast|
-#|Generate|TOK:PTC|Dragon|
-#|Generate|TOK:PTC|Elemental|
-#|Generate|TOK:PTC|Harpy|
-#|Generate|TOK:PTC|Hippo|
-#|Generate|TOK:PTC|Soldier|
-#|Generate|TOK:PTC|Wolf|
-#|Generate|TOK:PTC|Wurm|
+|Generate|TOK:MM2|Eldrazi Spawn|1|
+|Generate|TOK:MM2|Eldrazi Spawn|2|
+|Generate|TOK:MM2|Eldrazi Spawn|3|
+|Generate|TOK:MM2|Elephant||
+|Generate|TOK:MM2|Faerie Rogue||
+|Generate|TOK:MM2|Germ||
+|Generate|TOK:MM2|Golem||
+|Generate|TOK:MM2|Insect||
+|Generate|TOK:MM2|Myr||
+|Generate|TOK:MM2|Saproling||
+|Generate|TOK:MM2|Snake||
+|Generate|TOK:MM2|Soldier||
+|Generate|TOK:MM2|Spirit||
+|Generate|TOK:MM2|Thrull||
+|Generate|TOK:MM2|Wolf||
+|Generate|TOK:MM2|Worm||
-#|Generate|TOK:DTK|Djinn Monk|
-#|Generate|TOK:DTK|Dragon|
-#|Generate|TOK:DTK|Goblin|
-#|Generate|TOK:DTK|Morph|
-#|Generate|TOK:DTK|Warrior|
-#|Generate|TOK:DTK|Zombie|
-#|Generate|TOK:DTK|Zombie Horror|
-#|Generate|EMBLEM!:DTK|Emblem Narset Transcendent|
+#Generate|TOK:TPR|Goblin||
+#Generate|TOK:TPR|Pegasus||
+#Generate|TOK:TPR|Rat||
+#Generate|TOK:TPR|Reflection||
+#Generate|TOK:TPR|Saproling||
+#Generate|TOK:TPR|Sliver||
+#Generate|TOK:TPR|Spike||
+#Generate|TOK:TPR|Spirit||
+#Generate|TOK:TPR|Thopter||
+#Generate|TOK:TPR|Zombie||
-#|Generate|TOK:GRC|Bird|
-#|Generate|TOK:GRC|Golem|
-#|Generate|TOK:GRC|Human|
-#|Generate|TOK:GRC|Myr|
-#|Generate|TOK:GRC|Saproling|
+|Generate|TOK:ORI|Ashaya, the Awoken World||
+|Generate|TOK:ORI|Angel||
+|Generate|TOK:ORI|Demon||
+|Generate|TOK:ORI|Elemental||
+|Generate|TOK:ORI|Elf Warrior||
+|Generate|TOK:ORI|Goblin||
+|Generate|TOK:ORI|Knight||
+|Generate|TOK:ORI|Soldier||
+|Generate|TOK:ORI|Thopter|1|
+|Generate|TOK:ORI|Thopter|2|
+|Generate|TOK:ORI|Zombie||
+|Generate|EMBLEM!:ORI|Emblem Chandra, Roaring Flame||
+|Generate|EMBLEM!:ORI|Emblem Jace, Telepath Unbound||
+|Generate|EMBLEM!:ORI|Emblem Liliana, Defiant Necromancer||
-#|Generate|TOK:MBP:Beast|
-#|Generate|TOK:MBP|Cat|
-#|Generate|TOK:MBP|Dragon|
-#|Generate|TOK:MBP|Elephant|
-#|Generate|TOK:MBP|Goblin|
-#|Generate|TOK:MBP|Zombie|
+#|Generate|TOK:PTC|Angel||
+#|Generate|TOK:PTC|Avatar||
+#|Generate|TOK:PTC|Beast||
+#|Generate|TOK:PTC|Dragon||
+#|Generate|TOK:PTC|Elemental||
+#|Generate|TOK:PTC|Harpy||
+#|Generate|TOK:PTC|Hippo||
+#|Generate|TOK:PTC|Soldier||
+#|Generate|TOK:PTC|Wolf||
+#|Generate|TOK:PTC|Wurm||
-#|Generate|TOK:MLP|Thopter|
+|Generate|TOK:DTK|Djinn Monk||
+|Generate|TOK:DTK|Dragon||
+|Generate|TOK:DTK|Goblin||
+|Generate|TOK:DTK|Morph||
+|Generate|TOK:DTK|Warrior||
+|Generate|TOK:DTK|Zombie||
+|Generate|TOK:DTK|Zombie Horror||
+|Generate|EMBLEM!:DTK|Emblem Narset||
-#|Generate|TOK:WMCQ|Angel|
+|Generate|TOK:DDO|Soldier||
+|Generate|TOK:DDO|Kraken||
-#|Generate|TOK:GPX|Elephant|
-#|Generate|TOK:GPX|Germ|
+|Generate|TOK:FRF|Monk|1|
+|Generate|TOK:FRF|Monk|2|
+|Generate|TOK:FRF|Spirit||
+|Generate|TOK:FRF|Warrior||
+|Generate|TOK:FRF|Manifest||
-#|Generate|TOK:JR|Angel|
-#|Generate|TOK:JR|Faerie Rogue|
-#|Generate|TOK:JR|Soldier|
-#|Generate|TOK:JR|Squirrel|
+#|Generate|TOK:GRC|Bird||
+#|Generate|TOK:GRC|Golem||
+#|Generate|TOK:GRC|Human||
+#|Generate|TOK:GRC|Myr||
+#|Generate|TOK:GRC|Saproling||
-#|Generate|TOK:MGDC|Centaur|
-#|Generate|TOK:MGDC|Knight|
-#|Generate|TOK:MGDC|Rhino|
-#|Generate|TOK:MGDC|Sliver|
+#|Generate|TOK:MBP:Beast||
+#|Generate|TOK:MBP|Cat||
+#|Generate|TOK:MBP|Dragon||
+#|Generate|TOK:MBP|Elephant||
+#|Generate|TOK:MBP|Goblin||
+#|Generate|TOK:MBP|Zombie||
-#|Generate|TOK:FNMP|Centaur|
-|Generate|TOK:FNMP|Human|
-|Generate|TOK:FNMP|Wolf|
-#|Generate|TOK:FNMP|Wurm|
+#|Generate|TOK:MLP|Thopter||
-|Generate|TOK:DDN|Goblin|
+#|Generate|TOK:WMCQ|Angel||
-#|Generate|TOK:KTK|Bear|
-#|Generate|TOK:KTK|Bird|
-#|Generate|TOK:KTK|Goblin|
-#|Generate|TOK:KTK|Morph|
-#|Generate|TOK:KTK|Snake|
-#|Generate|TOK:KTK|Spirit Warrior|
-#|Generate|TOK:KTK|Spirit|
-#|Generate|TOK:KTK|Vampire|
-#|Generate|TOK:KTK|Warrior 1|
-#|Generate|TOK:KTK|Warrior 2|
-#|Generate|TOK:KTK|Zombie|
-#|Generate|EMBLEM!:KTK|Emblem Sarkhan, the Dragonspeaker|
-#|Generate|EMBLEM!:KTK|Emblem Sorin, Solemn Visitor|
+#|Generate|TOK:GPX|Elephant||
+#|Generate|TOK:GPX|Germ||
-|Generate|TOK:M15|Sliver|
-|Generate|TOK:M15|Soldier|
-|Generate|TOK:M15|Zombie|
-|Generate|TOK:M15|Goblin|
-|Generate|TOK:M15|Beast 1|
-|Generate|TOK:M15|Insect|
-|Generate|TOK:M15|Spirit|
-|Generate|TOK:M15|Squid|
-|Generate|TOK:M15|Beast 2|
-|Generate|TOK:M15|Dragon|
-|Generate|TOK:M15|Treefolk Warrior|
-|Generate|TOK:M15|Land Mine|
-|Generate|EMBLEM!:M15|Emblem Ajani|
-|Generate|EMBLEM!:M15|Emblem Garruk|
+#|Generate|TOK:JR|Angel||
+#|Generate|TOK:JR|Faerie Rogue||
+#|Generate|TOK:JR|Soldier||
+#|Generate|TOK:JR|Squirrel||
-|Generate|TOK:CNS|Zombie|
-|Generate|TOK:CNS|Spirit|
-|Generate|TOK:CNS|Demon|
-|Generate|TOK:CNS|Ogre|
-|Generate|TOK:CNS|Elephant|
-|Generate|TOK:CNS|Squirrel|
-|Generate|TOK:CNS|Wolf|
-|Generate|TOK:CNS|Construct|
-|Generate|EMBLEM!:CNS|Emblem Dack Fayden|
+#|Generate|TOK:MGDC|Centaur||
+#|Generate|TOK:MGDC|Knight||
+#|Generate|TOK:MGDC|Rhino||
+#|Generate|TOK:MGDC|Sliver||
-|Generate|TOK:JOU|Sphinx|
-|Generate|TOK:JOU|Zombie|
-|Generate|TOK:JOU|Minotaur|
-|Generate|TOK:JOU|Hydra|
-|Generate|TOK:JOU|Spider|
-|Generate|TOK:JOU|Snake|
+#|Generate|TOK:FNMP|Centaur||
+|Generate|TOK:FNMP|Human||
+|Generate|TOK:FNMP|Wolf||
+#|Generate|TOK:FNMP|Wurm||
-|Generate|TOK:DDM|Assassin|
+|Generate|TOK:DD3D|Elemental Shaman||
-|Generate|TOK:BNG|Bird 1|
-|Generate|TOK:BNG|Cat Soldier|
-|Generate|TOK:BNG|Soldier|
-|Generate|TOK:BNG|Bird 2|
-|Generate|TOK:BNG|Kraken|
-|Generate|TOK:BNG|Zombie|
-|Generate|TOK:BNG|Elemental|
-|Generate|TOK:BNG|Centaur|
-|Generate|TOK:BNG|Wolf|
-|Generate|TOK:BNG|Gold|
-|Generate|EMBLEM:BNG|Kiora, the Crashing Wave|
+|Generate|TOK:DD3C|Beast|1|
+|Generate|TOK:DD3C|Beast|2|
+|Generate|TOK:DD3C|Elephant||
+|Generate|TOK:DD3C|Bat||
-|Generate|TOK:M14|Sliver|
-|Generate|TOK:M14|Angel|
-|Generate|TOK:M14|Cat|
-|Generate|TOK:M14|Goat|
-|Generate|TOK:M14|Zombie|
-|Generate|TOK:M14|Dragon|
-|Generate|TOK:M14|Elemental 1|
-|Generate|TOK:M14|Elemental 2|
-|Generate|TOK:M14|Beast|
-|Generate|TOK:M14|Saproling|
-|Generate|TOK:M14|Wolf|
-|Generate|EMBLEM:M14|Liliana of the Dark Realms|
-|Generate|EMBLEM:M14|Garruk, Caller of Beasts|
+|Generate|TOK:DD3B|Elemental||
+|Generate|TOK:DD3B|Elf Warrior||
+|Generate|TOK:|DD3B|Goblin||
-|Generate|TOK:THS|Cleric|
-|Generate|TOK:THS|Soldier 1|
-|Generate|TOK:THS|Soldier 2|
-|Generate|TOK:THS|Bird|
-|Generate|TOK:THS|Elemental|
-|Generate|TOK:THS|Harpy|
-|Generate|TOK:THS|Soldier 3|
-|Generate|TOK:THS|Boar|
-|Generate|TOK:THS|Satyr|
-|Generate|TOK:THS|Golem|
-|Generate|EMBLEM-:THS|Elspeth, Suns Champion|
+|Generate|TOK:DD3A|Spirit||
+|Generate|TOK:DD3A|Demon||
+|Generate|TOK:DD3A|Thrull||
-|Generate|TOK:DDL|Griffin|
-|Generate|TOK:DDL|Beast|
+|Generate|TOK:C14|Angel||
+|Generate|TOK:C14|Cat||
+|Generate|TOK:C14|Goat||
+|Generate|TOK:C14|Kor Soldier||
+|Generate|TOK:C14|Pegasus||
+|Generate|TOK:C14|Soldier||
+|Generate|TOK:C14|Spirit||
+|Generate|TOK:C14|Fish||
+|Generate|TOK:C14|Kraken||
+|Generate|TOK:C14|Whale||
+|Generate|TOK:C14|Zombie|1|
+|Generate|TOK:C14|Demon|1|
+|Generate|TOK:C14|Demon|2|
+|Generate|TOK:C14|Germ||
+|Generate|TOK:C14|Horror||
+|Generate|TOK:C14|Zombie|2|
+|Generate|TOK:C14|Goblin||
+|Generate|TOK:C14|Ape||
+|Generate|TOK:C14|Beast|1|
+|Generate|TOK:C14|Beast|2|
+|Generate|TOK:C14|Elemental||
+|Generate|TOK:C14|Elephant||
+|Generate|TOK:C14|Elf Druid||
+|Generate|TOK:C14|Elf Warrior||
+|Generate|TOK:C14|Treefolk||
+|Generate|TOK:C14|Wolf||
+|Generate|TOK:C14|Gargoyle||
+|Generate|TOK:C14|Myr||
+|Generate|TOK:C14|Pentavite||
+|Generate|TOK:C14|Stoneforged Blade||
+|Generate|TOK:C14|Tuktuk the Returned||
+|Generate|TOK:C14|Wurm|1|
+|Generate|TOK:C14|Wurm|2|
+|Generate|EMBLEM!:C14|Emblem Teferi|
+|Generate|EMBLEM!:C14|Emblem Nixilis|
+|Generate|EMBLEM!:C14|Emblem Daretti|
-|Generate|TOK:MMA|Giant Warrior|
-|Generate|TOK:MMA|Kithkin Soldier|
-|Generate|TOK:MMA|Soldier|
-|Generate|TOK:MMA|Illusion|
-|Generate|TOK:MMA|Bat|
-|Generate|TOK:MMA|Goblin Rogue|
-|Generate|TOK:MMA|Spider|
-|Generate|TOK:MMA|Zombie|
-|Generate|TOK:MMA|Dragon|
-|Generate|TOK:MMA|Goblin|
-|Generate|TOK:MMA|Elemental|
-|Generate|TOK:MMA|Saproling|
-|Generate|TOK:MMA|Treefolk Shaman|
-|Generate|TOK:MMA|Faerie Rogue|
-|Generate|TOK:MMA|Worm|
-|Generate|EMBLEM:MMA|Elspeth, Knight Errant|
+|Generate|TOK:DDN|Goblin||
-|Generate|TOK:DGM|Elemental|
+|Generate|TOK:KTK|Bear||
+|Generate|TOK:KTK|Bird||
+|Generate|TOK:KTK|Goblin||
+|Generate|TOK:KTK|Morph||
+|Generate|TOK:KTK|Snake||
+|Generate|TOK:KTK|Spirit Warrior||
+|Generate|TOK:KTK|Spirit||
+|Generate|TOK:KTK|Vampire||
+|Generate|TOK:KTK|Warrior|1|
+|Generate|TOK:KTK|Warrior|2|
+|Generate|TOK:KTK|Warrior|3|
+|Generate|TOK:KTK|Zombie||
+|Generate|EMBLEM!:KTK|Emblem Sarkhan||
+|Generate|EMBLEM!:KTK|Emblem Sorin||
-|Generate|TOK:DDK|Spirit|
+|Generate|TOK:M15|Sliver||
+|Generate|TOK:M15|Soldier||
+|Generate|TOK:M15|Zombie||
+|Generate|TOK:M15|Goblin||
+|Generate|TOK:M15|Beast|1|
+|Generate|TOK:M15|Insect||
+|Generate|TOK:M15|Spirit||
+|Generate|TOK:M15|Squid|1|
+|Generate|TOK:M15|Squid|2|
+|Generate|TOK:M15|Wolf||
+|Generate|TOK:M15|Beast|2|
+|Generate|TOK:M15|Dragon||
+|Generate|TOK:M15|Treefolk Warrior||
+|Generate|TOK:M15|Land Mine||
+|Generate|EMBLEM!:M15|Emblem Ajani||
+|Generate|EMBLEM!:M15|Emblem Garruk||
-|Generate|TOK:GTC|Angel|
-|Generate|TOK:GTC|Rat|
-|Generate|TOK:GTC|Frog Lizard|
-|Generate|TOK:GTC|Cleric|
-|Generate|TOK:GTC|Horror|
-|Generate|TOK:GTC|Soldier|
-|Generate|TOK:GTC|Spirit|
-|Generate|EMBLEM:GTC|Domri Rade|
+|Generate|TOK:CNS|Zombie||
+|Generate|TOK:CNS|Spirit||
+|Generate|TOK:CNS|Demon||
+|Generate|TOK:CNS|Ogre||
+|Generate|TOK:CNS|Elephant||
+|Generate|TOK:CNS|Squirrel||
+|Generate|TOK:CNS|Wolf||
+|Generate|TOK:CNS|Construct||
+|Generate|EMBLEM!:CNS|Emblem Dack Fayden||
-|Generate|TOK:RTR|Bird|
-|Generate|TOK:RTR|Knight|
-|Generate|TOK:RTR|Soldier|
-|Generate|TOK:RTR|Assassin|
-|Generate|TOK:RTR|Dragon|
-|Generate|TOK:RTR|Goblin|
-|Generate|TOK:RTR|Centaur 1|
-|Generate|TOK:RTR|Ooze|
-|Generate|TOK:RTR|Rhino|
-|Generate|TOK:RTR|Saproling|
-|Generate|TOK:RTR|Wurm|
-|Generate|TOK:RTR|Elemental|
-|Generate|TOK:RTR|Centaur 2|
+|Generate|TOK:JOU|Sphinx||
+|Generate|TOK:JOU|Zombie||
+|Generate|TOK:JOU|Minotaur|1|
+|Generate|TOK:JOU|Minotaur|2|
+|Generate|TOK:JOU|Hydra||
+|Generate|TOK:JOU|Spider||
+|Generate|TOK:JOU|Snake||
-|Generate|EMBLEM-:M13|Liliana of the Dark Realms|
+|Generate|TOK:DDM|Assassin||
-|Generate|TOK:DDJ|Saproling|
+|Generate|TOK:BNG|Bird|1|
+|Generate|TOK:BNG|Cat Soldier||
+|Generate|TOK:BNG|Soldier|1|
+|Generate|TOK:BNG|Soldier|2|
+|Generate|TOK:BNG|Bird|2|
+|Generate|TOK:BNG|Kraken||
+|Generate|TOK:BNG|Zombie||
+|Generate|TOK:BNG|Elemental||
+|Generate|TOK:BNG|Centaur||
+|Generate|TOK:BNG|Wolf||
+|Generate|TOK:BNG|Gold||
+|Generate|EMBLEM:BNG|Kiora, the Crashing Wave||
-|Generate|TOK:M13|Cat|
-|Generate|TOK:M13|Goat|
-|Generate|TOK:M13|Soldier|
-|Generate|TOK:M13|Drake|
-|Generate|TOK:M13|Zombie|
-|Generate|TOK:M13|Goblin|
-|Generate|TOK:M13|Hellion|
-|Generate|TOK:M13|Beast|
-|Generate|TOK:M13|Saproling|
-|Generate|TOK:M13|Wurm|
+|Generate|TOK:THS|Cleric||
+|Generate|TOK:THS|Soldier|1|
+|Generate|TOK:THS|Soldier|2|
+|Generate|TOK:THS|Soldier|3|
+|Generate|TOK:THS|Bird||
+|Generate|TOK:THS|Elemental||
+|Generate|TOK:THS|Harpy||
+|Generate|TOK:THS|Soldier|3|
+|Generate|TOK:THS|Boar||
+|Generate|TOK:THS|Satyr||
+|Generate|TOK:THS|Golem|1|
+|Generate|TOK:THS|Golem|2|
+|Generate|EMBLEM-:THS|Elspeth, Suns Champion||
-|Generate|EMBLEM:AVR|Tamiyo, the Moon Sage|
+|Generate|TOK:M14|Sliver|1|
+|Generate|TOK:M14|Sliver|2|
+|Generate|TOK:M14|Angel||
+|Generate|TOK:M14|Cat||
+|Generate|TOK:M14|Goat||
+|Generate|TOK:M14|Zombie||
+|Generate|TOK:M14|Dragon||
+|Generate|TOK:M14|Elemental|1|
+|Generate|TOK:M14|Elemental|2|
+|Generate|TOK:M14|Beast||
+|Generate|TOK:M14|Saproling||
+|Generate|TOK:M14|Wolf||
+|Generate|EMBLEM:M14|Liliana of the Dark Realms||
+|Generate|EMBLEM:M14|Garruk, Caller of Beasts||
-|Generate|TOK:AVR|Angel|
-|Generate|TOK:AVR|Human 1|
-|Generate|TOK:AVR|Spirit 1|
-|Generate|TOK:AVR|Spirit 2|
-|Generate|TOK:AVR|Demon|
-|Generate|TOK:AVR|Zombie|
-|Generate|TOK:AVR|Human 2|
+|Generate|TOK:DDL|Griffin||
+|Generate|TOK:DDL|Beast||
-|Generate|EMBLEM:DDI|Venser, the Sojourner|
-|Generate|EMBLEM:DDI|Koth of the Hammer|
+|Generate|TOK:MMA|Giant Warrior||
+|Generate|TOK:MMA|Kithkin Soldier||
+|Generate|TOK:MMA|Soldier||
+|Generate|TOK:MMA|Illusion||
+|Generate|TOK:MMA|Bat||
+|Generate|TOK:MMA|Goblin Rogue||
+|Generate|TOK:MMA|Spider||
+|Generate|TOK:MMA|Zombie||
+|Generate|TOK:MMA|Dragon||
+|Generate|TOK:MMA|Goblin||
+|Generate|TOK:MMA|Elemental||
+|Generate|TOK:MMA|Saproling||
+|Generate|TOK:MMA|Treefolk Shaman||
+|Generate|TOK:MMA|Faerie Rogue||
+|Generate|TOK:MMA|Worm||
+|Generate|EMBLEM:MMA|Elspeth, Knight Errant||
-|Generate|TOK:DKA|Human|
-|Generate|TOK:DKA|Vampire|
+|Generate|TOK:DGM|Elemental||
+|Generate|TOK:DGM|Bird||
-|Generate|TOK:ISD|Angel|
-|Generate|TOK:ISD|Spirit|
-|Generate|TOK:ISD|Homunculus|
-|Generate|TOK:ISD|Demon|
-|Generate|TOK:ISD|Vampire|
-|Generate|TOK:ISD|Wolf 1|
-|Generate|TOK:ISD|Zombie 1|
-|Generate|TOK:ISD|Zombie 2|
-|Generate|TOK:ISD|Zombie 3|
-|Generate|TOK:ISD|Ooze|
-|Generate|TOK:ISD|Spider|
-|Generate|TOK:ISD|Wolf 2|
+|Generate|TOK:DDK|Spirit||
-|Generate|TOK:DDH|Griffin|
-|Generate|TOK:DDH|Saproling|
+|Generate|TOK:GTC|Angel||
+|Generate|TOK:GTC|Rat||
+|Generate|TOK:GTC|Frog Lizard||
+|Generate|TOK:GTC|Cleric||
+|Generate|TOK:GTC|Horror||
+|Generate|TOK:GTC|Soldier|1|
+|Generate|TOK:GTC|Soldier|2|
+|Generate|TOK:GTC|Spirit||
+|Generate|EMBLEM:GTC|Domri Rade||
-|Generate|TOK:M12|Bird|
-|Generate|TOK:M12|Soldier|
-|Generate|TOK:M12|Zombie|
-|Generate|TOK:M12|Beast|
-|Generate|TOK:M12|Saproling|
-|Generate|TOK:M12|Wurm|
-|Generate|TOK:M12|Pentavite|
+|Generate|TOK:RTR|Bird||
+|Generate|TOK:RTR|Knight|1|
+|Generate|TOK:RTR|Knight|2|
+|Generate|TOK:RTR|Soldier||
+|Generate|TOK:RTR|Assassin||
+|Generate|TOK:RTR|Dragon||
+|Generate|TOK:RTR|Goblin||
+|Generate|TOK:RTR|Centaur|1|
+|Generate|TOK:RTR|Centaur|2|
+|Generate|TOK:RTR|Ooze||
+|Generate|TOK:RTR|Rhino||
+|Generate|TOK:RTR|Saproling||
+|Generate|TOK:RTR|Wurm||
+|Generate|TOK:RTR|Elemental||
-|Generate|TOK:NPH|Beast|
-|Generate|TOK:NPH|Beast|
-|Generate|TOK:NPH|Goblin|
-|Generate|TOK:NPH|Golem|
-|Generate|TOK:NPH|Myr|
+|Generate|TOK:DDJ|Saproling||
-|Generate|TOK:DDG|Goblin|
+|Generate|EMBLEM-:M13|Liliana of the Dark Realms||
+|Generate|TOK:M13|Cat||
+|Generate|TOK:M13|Goat||
+|Generate|TOK:M13|Soldier||
+|Generate|TOK:M13|Drake||
+|Generate|TOK:M13|Zombie||
+|Generate|TOK:M13|Goblin|1|
+|Generate|TOK:M13|Goblin|2|
+|Generate|TOK:M13|Hellion||
+|Generate|TOK:M13|Beast||
+|Generate|TOK:M13|Saproling||
+|Generate|TOK:M13|Wurm||
-|Generate|TOK:MBS|Germ|
-|Generate|TOK:MBS|Zombie|
-|Generate|TOK:MBS|Golem|
-|Generate|TOK:MBS|Horror|
-|Generate|TOK:MBS|Thopter|
-|Generate|TOK:MBS|Zombie|
-|Generate|TOK:MBS|Zombie|
+|Generate|EMBLEM:AVR|Tamiyo, the Moon Sage||
+|Generate|TOK:AVR|Angel|1|
+|Generate|TOK:AVR|Angel|2|
+|Generate|TOK:AVR|Angel|3|
+|Generate|TOK:AVR|Human|1|
+|Generate|TOK:AVR|Human|2|
+|Generate|TOK:AVR|Spirit|1|
+|Generate|TOK:AVR|Spirit|2|
+|Generate|TOK:AVR|Demon|1|
+|Generate|TOK:AVR|Demon|2|
+|Generate|TOK:AVR|Demon|3|
+|Generate|TOK:AVR|Zombie||
-|Generate|TOK:DDF|Soldier|
+|Generate|EMBLEM:DDI|Venser, the Sojourner||
+|Generate|EMBLEM:DDI|Koth of the Hammer||
-|Generate|TOK:SOM|Cat|
-|Generate|TOK:SOM|Soldier|
-|Generate|TOK:SOM|Goblin|
-|Generate|TOK:SOM|Insect|
-|Generate|TOK:SOM|Wolf|
-|Generate|TOK:SOM|Golem|
-|Generate|TOK:SOM|Myr|
-|Generate|TOK:SOM|Wurm 1|
-|Generate|TOK:SOM|Wurm 2|
+|Generate|TOK:DKA|Human||
+|Generate|TOK:DKA|Vampire||
+|Generate|EMBLEM:DKA|Sorin, Lord of Innistrad|
-|Generate|TOK:M11|Avatar|
-|Generate|TOK:M11|Bird|
-|Generate|TOK:M11|Zombie|
-|Generate|TOK:M11|Beast|
-|Generate|TOK:M11|Ooze 1|
-|Generate|TOK:M11|Ooze 2|
+|Generate|TOK:ISD|Angel||
+|Generate|TOK:ISD|Spirit||
+|Generate|TOK:ISD|Homunculus||
+|Generate|TOK:ISD|Demon||
+|Generate|TOK:ISD|Vampire||
+|Generate|TOK:ISD|Wolf|1|
+|Generate|TOK:ISD|Zombie|1|
+|Generate|TOK:ISD|Zombie|2|
+|Generate|TOK:ISD|Zombie|3|
+|Generate|TOK:ISD|Ooze||
+|Generate|TOK:ISD|Spider||
+|Generate|TOK:ISD|Wolf|2|
-|Generate|TOK:ROE|Eldrazi Spawn 1|
-|Generate|TOK:ROE|Eldrazi Spawn 2|
-|Generate|TOK:ROE|Eldrazi Spawn 3|
-|Generate|TOK:ROE|Elemental|
-|Generate|TOK:ROE|Ooze|
-|Generate|TOK:ROE|Tuktuk the Returned|
+|Generate|TOK:DDH|Griffin||
+|Generate|TOK:DDH|Saproling||
-|Generate|TOK:DDE|Saproling|
-|Generate|TOK:DDE|Hornet|
-|Generate|TOK:DDE|Minion|
+|Generate|TOK:M12|Bird||
+|Generate|TOK:M12|Soldier||
+|Generate|TOK:M12|Zombie||
+|Generate|TOK:M12|Beast||
+|Generate|TOK:M12|Saproling||
+|Generate|TOK:M12|Wurm||
+|Generate|TOK:M12|Pentavite||
-|Generate|TOK:WWK|Soldier Ally|
-|Generate|TOK:WWK|Dragon|
-|Generate|TOK:WWK|Ogre|
-|Generate|TOK:WWK|Elephant|
-|Generate|TOK:WWK|Plant|
-|Generate|TOK:WWK|Construct|
+|Generate|TOK:NPH|Beast||
+|Generate|TOK:NPH|Beast||
+|Generate|TOK:NPH|Goblin||
+|Generate|TOK:NPH|Golem||
+|Generate|TOK:NPH|Myr||
-|Generate|TOK:ZEN|Angel|
-|Generate|TOK:ZEN|Bird|
-|Generate|TOK:ZEN|Kor Soldier|
-|Generate|TOK:ZEN|Illusion|
-|Generate|TOK:ZEN|Merfolk|
-|Generate|TOK:ZEN|Vampire|
-|Generate|TOK:ZEN|Zombie Giant|
-|Generate|TOK:ZEN|Elemental|
-|Generate|TOK:ZEN|Beast|
-|Generate|TOK:ZEN|Snake|
-|Generate|TOK:ZEN|Wolf|
+|Generate|TOK:DDG|Goblin||
-|Generate|TOK:M10|Avatar|
-|Generate|TOK:M10|Beast|
-|Generate|TOK:M10|Gargoyle|
-|Generate|TOK:M10|Goblin|
-|Generate|TOK:M10|Insect|
-|Generate|TOK:M10|Soldier|
-|Generate|TOK:M10|Wolf|
-|Generate|TOK:M10|Zombie|
+|Generate|TOK:MBS|Germ||
+|Generate|TOK:MBS|Zombie||
+|Generate|TOK:MBS|Golem||
+|Generate|TOK:MBS|Horror||
+|Generate|TOK:MBS|Thopter||
+|Generate|TOK:MBS|Zombie||
+|Generate|TOK:MBS|Zombie||
-|Generate|TOK:DDD|Beast 1|
-|Generate|TOK:DDD|Beast 2|
-|Generate|TOK:DDD|Elephant|
+|Generate|TOK:DDF|Soldier||
-|Generate|TOK:ARB|Bird Soldier|
-|Generate|TOK:ARB|Lizard|
-|Generate|TOK:ARB|Dragon|
-|Generate|TOK:ARB|Zombie Wizard|
+|Generate|TOK:SOM|Cat||
+|Generate|TOK:SOM|Soldier||
+|Generate|TOK:SOM|Goblin||
+|Generate|TOK:SOM|Insect||
+|Generate|TOK:SOM|Wolf||
+|Generate|TOK:SOM|Golem||
+|Generate|TOK:SOM|Myr||
+|Generate|TOK:SOM|Wurm|1|
+|Generate|TOK:SOM|Wurm|2|
-|Generate|TOK:DDC|Spirit|
-|Generate|TOK:DDC|Demon|
-|Generate|TOK:DDC|Thrull|
+|Generate|TOK:M11|Avatar||
+|Generate|TOK:M11|Bird||
+|Generate|TOK:M11|Zombie||
+|Generate|TOK:M11|Beast||
+|Generate|TOK:M11|Ooze|1|
+|Generate|TOK:M11|Ooze|2|
-|Generate|TOK:CON|Angel|
-|Generate|TOK:CON|Elemental|
+|Generate|TOK:ROE|Eldrazi Spawn|1|
+|Generate|TOK:ROE|Eldrazi Spawn|2|
+|Generate|TOK:ROE|Eldrazi Spawn|3|
+|Generate|TOK:ROE|Elemental||
+|Generate|TOK:ROE|Hellion||
+|Generate|TOK:ROE|Ooze||
+|Generate|TOK:ROE|Tuktuk the Returned||
-|Generate|TOK:DD2|Elemental Shaman|
+|Generate|TOK:DDE|Saproling||
+|Generate|TOK:DDE|Hornet||
+|Generate|TOK:DDE|Minion||
-|Generate|TOK:ALA|Soldier|
-|Generate|TOK:ALA|Beast|
-|Generate|TOK:ALA|Homunculus|
-|Generate|TOK:ALA|Thopter|
-|Generate|TOK:ALA|Skeleton|
-|Generate|TOK:ALA|Zombie|
-|Generate|TOK:ALA|Dragon|
-|Generate|TOK:ALA|Goblin|
-|Generate|TOK:ALA|Ooze|
-|Generate|TOK:ALA|Saproling|
+|Generate|TOK:WWK|Soldier Ally||
+|Generate|TOK:WWK|Dragon||
+|Generate|TOK:WWK|Ogre||
+|Generate|TOK:WWK|Elephant||
+|Generate|TOK:WWK|Plant||
+|Generate|TOK:WWK|Construct||
-|Generate|TOK:EVE|Goat|
-|Generate|TOK:EVE|Bird|
-|Generate|TOK:EVE|Beast|
-|Generate|TOK:EVE|Spirit|
-|Generate|TOK:EVE|Elemental|
-|Generate|TOK:EVE|Worm|
-|Generate|TOK:EVE|Goblin Soldier|
+|Generate|TOK:ZEN|Angel||
+|Generate|TOK:ZEN|Bird||
+|Generate|TOK:ZEN|Kor Soldier||
+|Generate|TOK:ZEN|Illusion||
+|Generate|TOK:ZEN|Merfolk||
+|Generate|TOK:ZEN|Vampire||
+|Generate|TOK:ZEN|Zombie Giant||
+|Generate|TOK:ZEN|Elemental||
+|Generate|TOK:ZEN|Beast||
+|Generate|TOK:ZEN|Snake||
+|Generate|TOK:ZEN|Wolf||
-|Generate|TOK:SHM|Kithkin Soldier|
-|Generate|TOK:SHM|Spirit|
-|Generate|TOK:SHM|Rat|
-|Generate|TOK:SHM|Elemental 1|
-|Generate|TOK:SHM|Elf Warrior 1|
-|Generate|TOK:SHM|Spider|
-|Generate|TOK:SHM|Wolf|
-|Generate|TOK:SHM|Faerie Rogue|
-|Generate|TOK:SHM|Elemental 2|
-|Generate|TOK:SHM|Giant Warrior|
-|Generate|TOK:SHM|Goblin Warrior|
-|Generate|TOK:SHM|Elf Warrior 2|
+|Generate|TOK:M10|Avatar||
+|Generate|TOK:M10|Beast||
+|Generate|TOK:M10|Gargoyle||
+|Generate|TOK:M10|Goblin||
+|Generate|TOK:M10|Insect||
+|Generate|TOK:M10|Soldier||
+|Generate|TOK:M10|Wolf||
+|Generate|TOK:M10|Zombie||
-|Generate|TOK:EVG|Elemental|
-|Generate|TOK:EVG|Elf Warrior|
-|Generate|TOK:EVG|Goblin|
+|Generate|TOK:DDD|Beast|1|
+|Generate|TOK:DDD|Beast|2|
+|Generate|TOK:DDD|Elephant||
-|Generate|TOK:MOR|Giant Warrior|
-|Generate|TOK:MOR|Faerie Rogue|
-|Generate|TOK:MOR|Treefolk Shaman|
+|Generate|TOK:ARB|Bird Soldier||
+|Generate|TOK:ARB|Lizard||
+|Generate|TOK:ARB|Dragon||
+|Generate|TOK:ARB|Zombie Wizard||
-|Generate|TOK:LRW|Avatar|
-|Generate|TOK:LRW|Elemental 1|
-|Generate|TOK:LRW|Kithkin Soldier|
-|Generate|TOK:LRW|Merfolk Wizard|
-|Generate|TOK:LRW|Goblin Rogue|
-|Generate|TOK:LRW|Elemental Shaman|
-|Generate|TOK:LRW|Beast|
-|Generate|TOK:LRW|Elemental 2|
-|Generate|TOK:LRW|Elf Warrior|
-|Generate|TOK:LRW|Wolf|
-|Generate|TOK:LRW|Shapeshifter|
+|Generate|TOK:DDC|Spirit||
+|Generate|TOK:DDC|Demon||
+|Generate|TOK:DDC|Thrull||
-|Generate|TOK:10E|Soldier|
-|Generate|TOK:10E|Zombie|
-|Generate|TOK:10E|Dragon|
-|Generate|TOK:10E|Goblin|
-|Generate|TOK:10E|Saproling|
-|Generate|TOK:10E|Wasp|
+|Generate|TOK:CON|Angel||
+|Generate|TOK:CON|Elemental||
-|Generate|TOK:CSP|Marit Lage|
+|Generate|TOK:DD2|Elemental Shaman||
-|Generate|TOK:CHK|Spirit|
\ No newline at end of file
+|Generate|TOK:ALA|Soldier||
+|Generate|TOK:ALA|Beast||
+|Generate|TOK:ALA|Homunculus||
+|Generate|TOK:ALA|Thopter||
+|Generate|TOK:ALA|Skeleton||
+|Generate|TOK:ALA|Zombie||
+|Generate|TOK:ALA|Dragon||
+|Generate|TOK:ALA|Goblin||
+|Generate|TOK:ALA|Ooze||
+|Generate|TOK:ALA|Saproling||
+
+|Generate|TOK:EVE|Goat||
+|Generate|TOK:EVE|Bird||
+|Generate|TOK:EVE|Beast||
+|Generate|TOK:EVE|Spirit||
+|Generate|TOK:EVE|Elemental||
+|Generate|TOK:EVE|Worm||
+|Generate|TOK:EVE|Goblin Soldier||
+
+|Generate|TOK:SHM|Kithkin Soldier||
+|Generate|TOK:SHM|Spirit||
+|Generate|TOK:SHM|Rat||
+|Generate|TOK:SHM|Elemental|1|
+|Generate|TOK:SHM|Elf Warrior|1|
+|Generate|TOK:SHM|Spider||
+|Generate|TOK:SHM|Wolf||
+|Generate|TOK:SHM|Faerie Rogue||
+|Generate|TOK:SHM|Elemental|2|
+|Generate|TOK:SHM|Giant Warrior||
+|Generate|TOK:SHM|Goblin Warrior||
+|Generate|TOK:SHM|Elf Warrior|2|
+
+|Generate|TOK:EVG|Elemental||
+|Generate|TOK:EVG|Elf Warrior||
+|Generate|TOK:EVG|Goblin||
+
+|Generate|TOK:MOR|Giant Warrior||
+|Generate|TOK:MOR|Faerie Rogue||
+|Generate|TOK:MOR|Treefolk Shaman||
+
+|Generate|TOK:LRW|Avatar||
+|Generate|TOK:LRW|Elemental|1|
+|Generate|TOK:LRW|Kithkin Soldier||
+|Generate|TOK:LRW|Merfolk Wizard||
+|Generate|TOK:LRW|Goblin Rogue||
+|Generate|TOK:LRW|Elemental Shaman||
+|Generate|TOK:LRW|Beast||
+|Generate|TOK:LRW|Elemental|2|
+|Generate|TOK:LRW|Elf Warrior||
+|Generate|TOK:LRW|Wolf||
+|Generate|TOK:LRW|Shapeshifter||
+
+|Generate|TOK:10E|Soldier||
+|Generate|TOK:10E|Zombie||
+|Generate|TOK:10E|Dragon||
+|Generate|TOK:10E|Goblin||
+|Generate|TOK:10E|Saproling||
+|Generate|TOK:10E|Wasp||
+
+|Generate|TOK:CSP|Marit Lage||
+
+|Generate|TOK:CHK|Spirit||
+#|Generate|TOK:CHK|Dragon Spirit||
+
+#|Generate|TOK:5DN|Kaldra||
+
+|Generate|TOK:DST|Beast||
+
+|Generate|TOK:MRD|Demon||
+|Generate|TOK:MRD|Myr||
+|Generate|TOK:MRD|Pentavite||
+
+|Generate|TOK:8ED|Rukh||
+
+|Generate|TOK:SCG|Angel||
+
+|Generate|TOK:LGN|Goblin||
+|Generate|TOK:LGN|Sliver||
+
+|Generate|TOK:ONS|Bear||
+|Generate|TOK:ONS|Dragon||
+|Generate|TOK:ONS|Insect||
+|Generate|TOK:ONS|Soldier||
+
+|Generate|TOK:ODY|Bear||
+|Generate|TOK:ODY|Beast||
+|Generate|TOK:ODY|Elephant||
+|Generate|TOK:ODY|Squirrel||
+|Generate|TOK:ODY|Wurm||
+|Generate|TOK:ODY|Zombie||
+
+|Generate|TOK:APC|Goblin Soldier||
+
+|Generate|TOK:PLS|Spirit||
+
+|Generate|TOK:INV|Bird||
+|Generate|TOK:INV|Elephant||
+|Generate|TOK:INV|Saproling||
\ No newline at end of file
diff --git a/Mage.Client/src/main/resources/image.url.properties b/Mage.Client/src/main/resources/image.url.properties
index fb9c408f3ab..4d00fec3336 100644
--- a/Mage.Client/src/main/resources/image.url.properties
+++ b/Mage.Client/src/main/resources/image.url.properties
@@ -64,6 +64,6 @@ ddd=gvl
unh=uh
dde=pvc
# Remove setname as soon as the images can be downloaded
-ignore.urls=TOK,MM2,V15,BFZ
+ignore.urls=TOK, OGW
# sets ordered by release time (newest goes first)
-token.lookup.order=BFZ,FVD,FVE,FVL,FVR,V12,V13,V14,V15,TPR,MPRP,DD3,DDO,ORI,MM2,PTC,DTK,FRF,KTK,M15,VMA,CNS,JOU,BNG,THS,DDL,M14,MMA,DGM,GTC,RTR,M13,AVR,DDI,DKA,ISD,M12,NPH,MBS,SOM,M11,ROE,DDE,WWK,ZEN,M10,GVL,ARB,DVD,CFX,JVC,ALA,EVE,SHM,EVG,MOR,LRW,10E,CLS,CHK,GRC
\ No newline at end of file
+token.lookup.order=C15,OGW,EXP,DDP,BFZ,FVD,FVE,FVL,FVR,V12,V13,V14,V15,TPR,MPRP,DD3,DDO,ORI,MM2,PTC,DTK,FRF,KTK,M15,VMA,CNS,JOU,BNG,THS,DDL,M14,MMA,DGM,GTC,RTR,M13,AVR,DDI,DKA,ISD,M12,NPH,MBS,SOM,M11,ROE,DDE,WWK,ZEN,M10,GVL,ARB,DVD,CFX,JVC,ALA,EVE,SHM,EVG,MOR,LRW,10E,CLS,CHK,GRC
\ No newline at end of file
diff --git a/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv b/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv
new file mode 100644
index 00000000000..2a64a370e06
--- /dev/null
+++ b/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv
@@ -0,0 +1,712 @@
+Token name, Number, Color, P/T, Promo, Type, Artist, Text
+
+UGL - Unglued (1998-08-11)
+
+Pegasus, 89, W, 1|1, -, Creature - Pegasus, Mark Zug, Flying
+Soldier, 90, W, 1|1, -, Creature - Soldier, Daren Bader, -
+Zombie, 91, B, 2|2, -, Creature - Zombie, Christopher Rush, -
+Goblin, 92, R, 1|1, -, Creature - Goblin, Pete Venters, -
+Sheep, 93, G, 1|1, -, Creature - Sheep, Kev Walker, -
+Squirrel, 94, G, 1|1, -, Creature - Squirrel, Ron Spencer, -
+
+ATH - Anthologies (1998-11-01)
+
+Pegasus, 89, W, 1|1, -, Creature - Pegasus, Mark Zug, Flying
+Goblin, 92, R, 1|1, -, Creature - Goblin, Pete Venters, -
+
+INV - Invasion (2000-10-02)
+
+Bird, T1, U, 1|1, Player Rewards, Creature - Bird, Michael Sutfin, Flying
+Elephant, T2, G, 3|3, Player Rewards, Creature - Elephant, Terese Nielsen, -
+Saproling, T3, G, 1|1, Player Rewards, Creature - Saproling, Jeff Laubenstein, -
+
+PLS - Planeshift (2001-02-05)
+
+Spirit, T1, W, 1|1, Player Rewards, Creature - Spirit, John Matson, Flying
+
+APC - Apocalypse (2001-06-04)
+
+Goblin Soldier, T1, R W, 1|1, Player Rewards, Creature - Goblin Soldier, Ron Spears, -
+
+ODY - Odyssey (2001-10-01)
+
+Bear, T1, G, 2|2, Player Rewards, Creature - Bear, Heather Hudson, -
+Beast, T2, G, 4|4, Player Rewards, Creature - Beast, Larry Elmore, -
+Elephant, T3, G, 3|3, Player Rewards, Creature - Elephant, Arnie Swekel, -
+Squirrel, T4, G, 1|1, Player Rewards, Creature - Squirrel, Ron Spencer, -
+Wurm, T5, G, 6|6, Player Rewards, Creature - Wurm, Alan Pollack, -
+Zombie, T6, B, 2|2, Player Rewards, Creature - Zombie, Dana Knutson, -
+
+ONS - Onslaught (2002-10-07)
+
+Bear, T1, G, 2|2, Player Rewards, Creature - Bear, Glen Angus, -
+Dragon, T2, R, 5|5, Player Rewards, Creature - Dragon, Glen Angus, Flying
+Insect, T3, G, 1|1, Player Rewards, Creature - Insect, Anthony S. Waters, -
+Soldier, T4, W, 1|1, Player Rewards, Creature - Soldier, Ron Spencer, -
+
+LGN - Legions (2003-02-03)
+
+Goblin, T1, R, 1|1, Player Rewards, Creature - Goblin, Darrell Riche, -
+Sliver, T2, -, 1|1, Player Rewards, Creature - Sliver, Tony Szczudlo, -
+
+SCG - Scourge (2003-05-26)
+
+Angel, T1, W, 4|4, Player Rewards, Creature - Angel, Scott M. Fischer, Flying
+
+8ED - Eighth Edition (2003-07-28)
+
+Rukh, T1, R, 4|4, Player Rewards, Creature - Rukh, Edward P. Beard Jr., Flying
+
+MRD - Mirrodin (2003-10-02)
+
+Demon, T1, B, *|*, Player Rewards, Creature - Demon, Pete Venters, -
+Myr, T2, -, 1|1, Player Rewards, Creature - Myr, Wayne England, -
+Pentavite, T3, -, 1|1, Player Rewards, Artifact Creature - Pentavite, Greg Staples, -
+
+DST - Darksteel (2004-02-06)
+
+Beast, T1, G, 3|3, Player Rewards, Creature - Beast, Edward P. Beard Jr., -
+
+CHK - Champions of Kamigawa (2004-10-01)
+
+Spirit, T1, -, 1|1, Player Rewards, Creature - Spirit, Hugh Jamieson, -
+
+CSP - Coldsnap (2006-07-21)
+
+Marit Lage, T1, B, 20|20, Pre-Release, Creature - Avatar, Stephan Martiniere, Flying indestructible
+
+10E - Tenth Edition (2007-07-13)
+
+Soldier, 1, W, 1|1, -, Creature - Soldier, Parente, -
+Zombie, 2, B, 2|2, -, Creature - Zombie, Carl Critchlow, -
+Dragon, 3, R, 5|5, -, Creature - Dragon, Jim Pavelec, Flying
+Goblin, 4, R, 1|1, -, Creature - Goblin, Dave Kendall, -
+Saproling, 5, G, 1|1, -, Creature - Saproling, Cyril Van Der Haegen, -
+Wasp, 6, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying
+
+LRW - Lorwyn (2007-10-12)
+
+Avatar, 1, W, *|*, -, Creature - Avatar, Vance Kovacs, This creature's power and toughness are each equal to your life total.
+Elemental, 2, W, 4|4, -, Creature - Elemental, Anthony S. Waters, Flying
+Kithkin Soldier, 3, W, 1|1, -, Creature - Kithkin Soldier, Greg Hildebrandt, -
+Merfolk Wizard, 4, U, 1|1, -, Creature - Merfolk Wizard, Mark Poole, -
+Goblin Rogue, 5, B, 1|1, -, Creature - Goblin Rogue, Richard Sardinha, -
+Elemental Shaman, 6, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, -
+Beast, 7, G, 3|3, -, Creature - Beast, John Donahue, -
+Elemental, 8, G, 4|4, -, Creature - Elemental, Brandon Kitkouski, -
+Elf Warrior, 9, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, -
+Wolf, 10, G, 2|2, -, Creature - Wolf, Pete Venters, -
+Shapeshifter, 11, -, 1|1, -, Creature - Shapeshifter, Franz Vohwinkel, Changeling
+
+EVG - Duel Decks: Elves vs. Goblins (2007-11-16)
+
+Elemental, T1, G, 7|7, -, Creature - Elemental, Anthony S. Waters, Trample
+Elf Warrior, T2, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, -
+Goblin, T3, R, 1|1, -, Creature - Goblin, Dave Kendall, -
+
+MOR - Morningtide (2008-02-01)
+
+Giant Warrior, 1, W, 5|5, -, Creature - Giant Warrior, Steve Ellis, -
+Faerie Rogue, 2, B, 1|1, -, Creature - Faerie Rogue, Jim Nelson, Flying
+Treefolk Shaman, 3, G, 2|5, -, Creature - Treefolk Shaman, Richard Sardinha, -
+
+SHM - Shadowmoor (2008-05-02)
+
+Kithkin Soldier, 1, W, 1|1, -, Creature - Kithkin Soldier, Randy Gallegos, -
+Spirit, 2, W, 1|1, -, Creature - Spirit, Jeremy Enecio, Flying
+Rat, 3, B, 1|1, -, Creature - Rat, Carl Critchlow, -
+Elemental, 4, R, 1|1, -, Creature - Elemental, Cyril Van Der Haegen, Haste
+Elf Warrior, 5, G, 1|1, -, Creature - Elf Warrior, William O'Connor, -
+Spider, 6, G, 1|2, -, Creature - Spider, Thomas M. Baxa, Reach
+Wolf, 7, G, 2|2, -, Creature - Wolf, Lars Grant-West, -
+Faerie Rogue, 8, U B, 1|1, -, Creature - Faerie Rogue, E. M. Gist, Flying
+Elemental, 9, B R, 5|5, -, Creature - Elemental, Dave Dorman, -
+Giant Warrior, 10, R G, 4|4, -, Creature - Giant Warrior, Trevor Hairsine, Haste
+Goblin Warrior, 11, R G, 1|1, -, Creature - Goblin Warrior, Dave Allsop, -
+Elf Warrior, 12, G W, 1|1, -, Creature - Elf Warrior, Carl Frank, -
+
+EVE - Eventide (2008-07-25)
+
+Goat, 1, W, -, -, Creature - Goat, Terese Nielsen, -
+Bird, 2, U, 1|1, -, Creature - Bird, Heather Hudson, Flying
+Beast, 3, G, 3|3, -, Creature - Beast, William O'Connor, -
+Spirit, 4, W B, 1|1, -, Creature - Spirit, Larry MacDougall, Flying
+Elemental, 5, U R, 5|5, -, Creature - Elemental, Randy Gallegos, Flying
+Worm, 6, B G, 1|1, -, Creature - Worm, Chuck Lukacs, -
+Goblin Soldier, 7, R W, 1|1, -, Creature - Goblin Soldier, Jeff Miracola, -
+
+ALA - Shards of Alara (2008-10-03)
+
+Soldier, 1, W, 1|1, -, Creature - Soldier, Alan Pollack, -
+Homunculus, 2, U, -, -, Artifact Creature - Homunculus, Howard Lyon, -
+Thopter, 3, U, 1|1, -, Artifact Creature - Thopter, Andrew Murray, Flying
+Skeleton, 4, B, 1|1, -, Creature - Skeleton, Thomas M. Baxa, {B}: Regenerate this creature.
+Zombie, 5, B, 2|2, -, Creature - Zombie, Dave Kendall, -
+Dragon, 6, R, 4|4, -, Creature - Dragon, Vance Kovacs, Flying
+Goblin, 7, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, -
+Ooze, 8, G, *|*, -, Creature - Ooze, Anthony S. Waters, -
+Saproling, 9, G, 1|1, -, Creature - Saproling, Trevor Claxton, -
+Beast, 10, R G W, 8|8, -, Creature - Beast, Parente, -
+
+DD2 - Duel Decks: Jace vs. Chandra (2008-11-07)
+
+Elemental Shaman, T1, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, -
+
+CFX - Conflux (2009-02-06)
+
+Angel, 1, W, 4|4, -, Creature - Angel, Cyril Van Der Haegen, Flying
+Elemental, 2, R, 3|1, -, Creature - Elemental, Vance Kovacs, -
+
+DDC - Duel Decks: Divine vs. Demonic (2009-04-10)
+
+Spirit, T1, W, 1|1, -, Creature - Spirit, Luca Zontini, Flying
+Demon, T2, B, *|*, -, Creature - Demon, Pete Venters, Flying
+Thrull, T3, B, -, -, Creature - Thrull, Veronique Meignaud, -
+
+ARB - Alara Reborn (2009-04-30)
+
+Bird Soldier, 1, W, 1|1, -, Creature - Bird Soldier, Matt Cavotta, Flying
+Lizard, 2, G, 2|2, -, Creature - Lizard, Anthony S. Waters, -
+Dragon, 3, R G, 1|1, -, Creature - Dragon, Jaime Jones, Flying devour 2
+Zombie Wizard, 4, U B, 1|1, -, Creature - Zombie Wizard, Dave Allsop, -
+
+M10 - Magic 2010 (2009-07-17)
+
+Avatar, 1, W, *|*, -, Creature - Avatar, Vance Kovacs, This creature's power and toughness are each equal to your life total.
+Soldier, 2, W, 1|1, -, Creature - Soldier, Parente, -
+Zombie, 3, B, 2|2, -, Creature - Zombie, Bud Cook, -
+Goblin, 4, R, 1|1, -, Creature - Goblin, Dave Kendall, -
+Beast, 5, G, 3|3, -, Creature - Beast, John Donahue, -
+Insect, 6, G, 1|1, -, Creature - Insect, Ron Spencer, -
+Wolf, 7, G, 2|2, -, Creature - Wolf, Lars Grant-West, -
+Gargoyle, 8, -, 3|4, -, Artifact Creature - Gargoyle, Paul Bonner, Flying
+
+ZEN - Zendikar (2009-10-02)
+
+Angel, 1, W, 4|4, -, Creature - Angel, Adi Granov, Flying
+Bird, 2, W, 1|1, -, Creature - Bird, Howard Lyon, Flying
+Kor Soldier, 3, W, 1|1, -, Creature - Kor Soldier, Daren Bader, -
+Illusion, 4, U, 2|2, -, Creature - Illusion, Cyril Van Der Haegen, -
+Merfolk, 5, U, 1|1, -, Creature - Merfolk, Warren Mahy, -
+Vampire, 6, B, *|*, -, Creature - Vampire, Kekai Kotaki, -
+Zombie Giant, 7, B, 5|5, -, Creature - Zombie Giant, Igor Kieryluk, -
+Elemental, 8, R, 7|1, -, Creature - Elemental, Anthony Francisco, Trample haste
+Beast, 9, G, 4|4, -, Creature - Beast, Steve Prescott, -
+Snake, 10, G, 1|1, -, Creature - Snake, Austin Hsu, -
+Wolf, 11, G, 2|2, -, Creature - Wolf, Daren Bader, -
+
+DDD - Duel Decks: Garruk vs. Liliana (2009-10-30)
+
+Beast, T1, G, 3|3, -, Creature - Beast, John Donahue, -
+Beast, T2, G, 4|4, -, Creature - Beast, Steve Prescott, -
+Elephant, T3, G, 3|3, -, Creature - Elephant, Arnie Swekel, -
+
+WWK - Worldwake (2010-02-05)
+
+Soldier Ally, 1, W, 1|1, -, Creature - Soldier Ally, Kekai Kotaki, -
+Dragon, 2, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying
+Ogre, 3, R, 3|3, -, Creature - Ogre, Paul Bonner, -
+Elephant, 4, G, 3|3, -, Creature - Elephant, Lars Grant-West, -
+Plant, 5, G, -, -, Creature - Plant, Daren Bader, -
+Construct, 6, -, 6|12, -, Artifact Creature - Construct, Jung Park, Trample
+
+DDE - Duel Decks: Phyrexia vs. the Coalition (2010-03-19)
+
+Hornet, T1, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying haste
+Minion, T2, B, *|*, -, Creature - Minion, Dave Kendall, -
+Saproling, T3, G, 1|1, -, Creature - Saproling, Warren Mahy, -
+
+ROE - Rise of the Eldrazi (2010-04-23)
+
+Eldrazi Spawn, 1a, -, -, -, Creature - Eldrazi Spawn, Aleksi Briclot, Sacrifice this creature: Add {1} to your mana pool.
+Eldrazi Spawn, 1b, -, -, -, Creature - Eldrazi Spawn, Mark Tedin, Sacrifice this creature: Add {1} to your mana pool.
+Eldrazi Spawn, 1c, -, -, -, Creature - Eldrazi Spawn, Veronique Meignaud, Sacrifice this creature: Add {1} to your mana pool.
+Elemental, 2, R, *|*, -, Creature - Elemental, Jung Park, -
+Hellion, 3, R, 4|4, -, Creature - Hellion, Anthony Francisco, -
+Ooze, 4, G, *|*, -, Creature - Ooze, Daniel Ljunggren, -
+Tuktuk The Returned, 5, -, 5|5, -, Legendary Artifact Creature - Goblin Golem, Franz Vohwinkel, -
+
+M11 - Magic 2011 (2010-07-16)
+
+Avatar, 1, W, *|*, -, Creature - Avatar, Vance Kovacs, This creature's power and toughness are each equal to your life total.
+Bird, 2, W, 3|3, -, Creature - Bird, Paul Bonner, Flying
+Zombie, 3, B, 2|2, -, Creature - Zombie, Bud Cook, -
+Beast, 4, G, 3|3, -, Creature - Beast, John Donahue, -
+Ooze, 5, G, 2|2, -, Creature - Ooze, Raymond Swanland, When this creature dies put two 1/1 green Ooze creature tokens onto the battlefield.
+Ooze, 6, G, 1|1, -, Creature - Ooze, Raymond Swanland, -
+
+DDF - Duel Decks: Elspeth vs. Tezzeret (2010-09-03)
+
+Soldier, T1, W, 1|1, -, Creature - Soldier, Parente, -
+
+SOM - Scars of Mirrodin (2010-10-01)
+
+Cat, 1, W, 2|2, -, Creature - Cat, Scott Chou, -
+Soldier, 2, W, 1|1, -, Creature - Soldier, Goran Josic, -
+Goblin, 3, R, 1|1, -, Creature - Goblin, Goran Josic, -
+Insect, 4, G, 1|1, -, Creature - Insect, Adrian Smith, Infect
+Wolf, 5, G, 2|2, -, Creature - Wolf, Chris Rahn, -
+Golem, 6, -, 3|3, -, Artifact Creature - Golem, Nic Klein, -
+Myr, 7, -, 1|1, -, Artifact Creature - Myr, Ryan Pancoast, -
+Wurm, 8, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Deathtouch
+Wurm, 9, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Lifelink
+Poison Counter, -, -, -, -, Emblem, -, -
+
+MBS - Mirrodin Besieged (2011-02-04)
+
+Germ, 1, B, -, -, Creature - Germ, Igor Kieryluk, -
+Zombie, 2, B, 2|2, -, Creature - Zombie, Dave Kendall, -
+Golem, 3, -, 9|9, -, Artifact Creature - Golem, Svetlin Velinov, -
+Horror, 4, -, *|*, -, Artifact Creature - Horror, Scott Chou, -
+Thopter, 5, -, 1|1, -, Artifact Creature - Thopter, Volkan Baga, Flying
+Poison Counter, -, -, -, -, Emblem, -, -
+
+DDG - Duel Decks: Knights vs. Dragons (2011-04-01)
+
+Goblin, T1, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, -
+
+NPH - New Phyrexia (2011-05-13)
+
+Beast, 1, G, 3|3, -, Creature - Beast, Dave Allsop, -
+Goblin, 2, R, 1|1, -, Creature - Goblin, Jaime Jones, -
+Golem, 3, -, 3|3, -, Artifact Creature - Golem, Volkan Baga, -
+Myr, 4, -, 1|1, -, Artifact Creature - Myr, Matt Stewart, -
+Poison Counter, -, -, -, -, Emblem, -, -
+
+M12 - Magic 2012 (2011-07-15)
+
+Bird, 1, W, 3|3, -, Creature - Bird, Paul Bonner, Flying
+Soldier, 2, W, 1|1, -, Creature - Soldier, Parente, -
+Zombie, 3, B, 2|2, -, Creature - Zombie, Carl Critchlow, -
+Beast, 4, G, 3|3, -, Creature - Beast, John Donahue, -
+Saproling, 5, G, 1|1, -, Creature - Saproling, Cyril Van Der Haegen, -
+Wurm, 6, G, 6|6, -, Creature - Wurm, Anthony Francisco, -
+Pentavite, 7, -, 1|1, -, Artifact Creature - Pentavite, Greg Staples, Flying
+
+DDH - Duel Decks: Ajani vs. Nicol Bolas (2011-09-02)
+
+Griffin, T1, W, 2|2, -, Creature - Griffin, Jim Nelson, Flying
+Saproling, T2, G, 1|1, -, Creature - Saproling, Cyril Van Der Haegen, -
+
+ISD - Innistrad (2011-09-30)
+
+Angel, 1, W, 4|4, -, Creature - Angel, Winona Nelson, Flying
+Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying
+Homunculus, 3, U, 2|2, -, Creature - Homunculus, Johann Bodin, -
+Demon, 4, B, 5|5, -, Creature - Demon, Kev Walker, Flying
+Vampire, 5, B, 2|2, -, Creature - Vampire, Svetlin Velinov, Flying
+Wolf, 6, B, 1|1, -, Creature - Wolf, Daniel Ljunggren, Deathtouch
+Zombie, 7, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
+Zombie, 8, B, 2|2, -, Creature - Zombie, Christopher Moeller, -
+Zombie, 9, B, 2|2, -, Creature - Zombie, Cynthia Sheppard, -
+Ooze, 10, G, *|*, -, Creature - Ooze, Erica Yang, This creature's power and toughness are each equal to the number of slime counters on Gutter Grime.
+Spider, 11, G, 1|2, -, Creature - Spider, Daniel Ljunggren, Reach
+Wolf, 12, G, 2|2, -, Creature - Wolf, David Palumbo, -
+Wolf, T12, G, 2|2, Judge, Creature - Wolf, David Palumbo, -
+
+DKA - Dark Ascension (2012-02-03)
+
+Human, 1, W, 1|1, -, Creature - Human, John Stanko, -
+Vampire, 2, B, 1|1, -, Creature - Vampire, Peter Mohrbacher, Lifelink
+Sorin Emblem, 3, -, -, -, Emblem - Sorin, Michael Komrack, Creatures you control get +1/+0.
+
+DDI - Duel Decks: Venser vs. Koth (2012-03-30)
+
+Koth Emblem, E1, -, -, -, Emblem - Koth, Eric Deschamps, Mountains you control have Tap: This land deals 1 damage to target creature or player.'
+Venser Emblem, E2, -, -, -, Emblem - Venser, Eric Deschamps, Whenever you cast a spell exile target permanent.
+
+FNM - Friday Night Magic (2012-04-01)
+
+Human, T1a, W, 1|1, Full Moon, Creature - Human, Lars Grant-West, -
+Wolf, T1b, G, 2|2, Full Moon, Creature - Wolf, Lars Grant-West, -
+
+AVR - Avacyn Restored (2012-05-04)
+
+Angel, 1, W, 4|4, -, Creature - Angel, Anthony Palumbo, Flying
+Human, 2, W, 1|1, -, Creature - Human, Michael C. Hayes, -
+Spirit, 3, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying
+Spirit, 4, U, 1|1, -, Creature - Spirit, Dan Scott, Flying
+Demon, 5, B, 5|5, -, Creature - Demon, Kev Walker, Flying
+Zombie, 6, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
+Human, 7, R, 1|1, -, Creature - Human, Ryan Pancoast, Haste
+Tamiyo Emblem, 8, -, -, -, Emblem - Tamiyo, Eric Deschamps, You have no maximum hand size. Whenever a card is put into your graveyard from anywhere you may return it to your hand.
+Angel, T1, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying
+Angel, T1F, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying
+Demon, T5, B, 5|5, Pre-Release, Creature - Demon, Karl Kopinski, Flying
+Demon, T5F, B, 5|5, Pre-Release, Creature - Demon, Karl Kopinski, Flying
+
+M13 - Magic 2013 (2012-07-13)
+
+Goblin, 1, R, 1|1, League, Creature - Goblin, Jim Nelson, -
+Cat, 1, W, 2|2, -, Creature - Cat, Jesper Ejsing, -
+Goat, 2, W, -, -, Creature - Goat, Adam Paquette, -
+Soldier, 3, W, 1|1, -, Creature - Soldier, Greg Staples, -
+Drake, 4, U, 2|2, -, Creature - Drake, Svetlin Velinov, Flying
+Zombie, 5, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
+Goblin, 6, R, 1|1, -, Creature - Goblin, Karl Kopinski, -
+Hellion, 7, R, 4|4, -, Creature - Hellion, Anthony Francisco, -
+Beast, 8, G, 3|3, -, Creature - Beast, John Donahue, -
+Saproling, 9, G, 1|1, -, Creature - Saproling, Brad Rigney, -
+Wurm, 10, G, 6|6, -, Creature - Wurm, Anthony Francisco, -
+Liliana Emblem, 11, -, -, -, Emblem - Liliana, D. Alexander Gregory, Swamps you control have Tap: Add {B}{B}{B}{B} to your mana pool.'
+
+DDJ - Duel Decks: Izzet vs. Golgari (2012-09-07)
+
+Saproling, T1, G, 1|1, -, Creature - Saproling, Brad Rigney, -
+
+RTR - Return to Ravnica (2012-10-05)
+
+Centaur, 1, G, 3|3, Judge, Creature - Centaur, James Ryman, -
+Knight, 1, W, 2|2, League, Creature - Knight, Lucas Graciano, Vigilance
+Bird, 1, W, 1|1, -, Creature - Bird, James Ryman, Flying
+Knight, 2, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance
+Soldier, 3, W, 1|1, -, Creature - Soldier, Steve Prescott, -
+Assassin, 4, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player that player loses the game.
+Dragon, 5, R, 6|6, -, Creature - Dragon, Mark Zug, Flying
+Goblin, 6, R, 1|1, -, Creature - Goblin, Christopher Moeller, -
+Centaur, 7, G, 3|3, -, Creature - Centaur, Slawomir Maniak, -
+Ooze, 8, G, *|*, -, Creature - Ooze, Marco Nelor, -
+Rhino, 9, G, 4|4, -, Creature - Rhino, Tomasz Jedruszek, Trample
+Saproling, 10, G, 1|1, -, Creature - Saproling, Raoul Vitale, -
+Wurm, 11, G, 5|5, -, Creature - Wurm, Anthony Palumbo, Trample
+Elemental, 12, G W, 8|8, -, Creature - Elemental, Yeong-Hao Han, Vigilance
+
+GTC - Gatecrash (2013-02-01)
+
+Soldier, 1, R W, 1|1, League, Creature - Soldier, Zoltan Boros, Haste
+Angel, 1, W, 4|4, -, Creature - Angel, Steve Argyle, Flying
+Rat, 2, B, 1|1, -, Creature - Rat, Nils Hamm, -
+Frog Lizard, 3, G, 3|3, -, Creature - Frog Lizard, Jack Wang, -
+Cleric, 4, W B, 1|1, -, Creature - Cleric, Jason Chan, {3}{W}{B}{B} {T} Sacrifice this creature: Return a card named Deathpact Angel from your graveyard to the battlefield.
+Horror, 5, U B, 1|1, -, Creature - Horror, Adam Paquette, Flying
+Soldier, 6, R W, 1|1, -, Creature - Soldier, David Palumbo, Haste
+Spirit, 7, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying
+Domri Emblem, 8, -, -, -, Emblem - Domri, Tyler Jacobson, Creatures you control have double strike trample hexproof and haste.
+
+DDK - Duel Decks: Sorin vs. Tibalt (2013-03-15)
+
+Spirit, T1, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying
+
+DGM - Dragon's Maze (2013-05-03)
+
+Bird, 1, W, 1|1, League, Creature - Bird, Martina Pilcerova, Flying
+Elemental, 1, G W, *|*, -, Creature - Elemental, Mark Winters, This creature's power and toughness are each equal to the number of creatures you control.
+
+MMA - Modern Masters (2013-06-07)
+
+Giant Warrior, 1, W, 5|5, -, Creature - Giant Warrior, Svetlin Velinov, -
+Kithkin Soldier, 2, W, 1|1, -, Creature - Kithkin Soldier, Randy Gallegos, -
+Soldier, 3, W, 1|1, -, Creature - Soldier, Goran Josic, -
+Illusion, 4, U, 1|1, -, Creature - Illusion, Veronique Meignaud, -
+Bat, 5, B, 1|1, -, Creature - Bat, Wayne Reynolds, Flying
+Goblin Rogue, 6, B, 1|1, -, Creature - Goblin Rogue, Dave Kendall, -
+Spider, 7, B, 2|4, -, Creature - Spider, Lars Grant-West, Reach
+Zombie, 8, B, 2|2, -, Creature - Zombie, Bud Cook, -
+Dragon, 9, R, 4|4, -, Creature - Dragon, Vance Kovacs, Flying
+Goblin, 10, R, 1|1, -, Creature - Goblin, Dave Kendall, -
+Elemental, 11, G, 4|4, -, Creature - Elemental, Brandon Kitkouski, -
+Saproling, 12, G, 1|1, -, Creature - Saproling, Warren Mahy, -
+Treefolk Shaman, 13, G, 2|5, -, Creature - Treefolk Shaman, Zack Stella, -
+Faerie Rogue, 14, U B, 1|1, -, Creature - Faerie Rogue, E. M. Gist, Flying
+Worm, 15, B G, 1|1, -, Creature - Worm, Chuck Lukacs, -
+Elspeth Emblem, 16, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts creatures enchantments and lands you control have indestructible.
+
+M14 - Magic 2014 Core Set (2013-07-19)
+
+Sliver, 1, -, 1|1, -, Creature - Sliver, Igor Kieryluk, -
+Angel, 1, W, 4|4, -, Creature - Angel, James Ryman, Flying
+Cat, 3, W, 2|2, -, Creature - Cat, Jesper Ejsing, -
+Goat, 4, W, -, -, Creature - Goat, Adam Paquette, -
+Zombie, 5, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
+Dragon, 6, R, 2|2, -, Creature - Dragon, Jack Wang, Flying {R}: This creature gets +1/+0 until end of turn.
+Elemental, 7, R, 1|1, -, Creature - Elemental, Jaime Jones, -
+Elemental, 8, R, 1|1, -, Creature - Elemental, Winona Nelson, -
+Beast, 9, G, 3|3, -, Creature - Beast, John Donahue, -
+Saproling, 10, G, 1|1, -, Creature - Saproling, Brad Rigney, -
+Wolf, 11, G, 2|2, -, Creature - Wolf, Lars Grant-West, -
+Liliana Emblem, 12, -, -, -, Emblem - Liliana, D. Alexander Gregory, Swamps you control have Tap: Add {B}{B}{B}{B} to your mana pool.'
+Garruk Emblem, 13, -, -, -, Emblem - Garruk, Karl Kopinski, Whenever you cast a creature spell you may search your library for a creature card put it onto the battlefield then shuffle your library.
+Sliver, T1, -, 1|1, League, Creature - Sliver, Vincent Proce, -
+
+DDL - Duel Decks: Heroes vs. Monsters (2013-09-06)
+
+Griffin, T1, W, 2|2, -, Creature - Griffin, Johann Bodin, Flying
+Beast, T2, G, 3|3, -, Creature - Beast, Jesper Ejsing, -
+
+THS - Theros (2013-09-27)
+
+Golem, 1, -, 3|3, Judge, Enchantment Artifact Creature - Golem, Yeong-Hao Han, -
+Soldier, 1, W, 1|1, League, Creature - Soldier, Johann Bodin, -
+Cleric, 1, W, 2|1, -, Enchantment Creature - Cleric, Johann Bodin, -
+Soldier, 2, W, 1|1, -, Creature - Soldier, Seb McKinnon, -
+Soldier, 3, W, 1|1, -, Creature - Soldier, Svetlin Velinov, -
+Bird, 4, U, 2|2, -, Creature - Bird, Peter Mohrbacher, Flying
+Elemental, 5, U, 1|0, -, Creature - Elemental, Karl Kopinski, -
+Harpy, 6, B, 1|1, -, Creature - Harpy, Nils Hamm, Flying
+Soldier, 7, R, 1|1, -, Creature - Soldier, Johann Bodin, -
+Boar, 8, G, 2|2, -, Creature - Boar, James Ryman, -
+Satyr, 9, R G, 2|2, -, Creature - Satyr, Johann Bodin, -
+Golem, 10, -, 3|3, -, Enchantment Artifact Creature - Golem, Yeong-Hao Han, -
+Elspeth Emblem, 11, -, -, -, Emblem - Elspeth, Eric Deschamps, Creatures you control get +2/+2 and have flying.
+
+BNG - Born of the Gods (2014-02-07)
+
+Soldier, 1, W, 1|1, League, Enchantment Creature - Soldier, Ryan Barger, -
+Bird, 1, W, 1|1, -, Creature - Bird, Clint Cearly, Flying
+Cat Soldier, 2, W, 1|1, -, Creature - Cat Soldier, Scott Chou, Vigilance
+Soldier, 3, W, 1|1, -, Enchantment Creature - Soldier, David Palumbo, -
+Bird, 4, U, 2|2, -, Enchantment Creature - Bird, Mike Sass, Flying
+Kraken, 5, U, 9|9, -, Creature - Kraken, Dan Scott, -
+Zombie, 6, B, 2|2, -, Enchantment Creature - Zombie, Winona Nelson, -
+Elemental, 7, R, 3|1, -, Enchantment Creature - Elemental, Greg Staples, -
+Centaur, 8, G, 3|3, -, Enchantment Creature - Centaur, Ryan Barger, -
+Wolf, 9, G, 2|2, -, Creature - Wolf, Raoul Vitale, -
+Gold, 10, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool.
+Kiora Emblem, 11, -, -, -, Emblem - Kiora, Scott M. Fischer, At the beginning of your end step put a 9/9 blue Kraken creature token onto the battlefield.
+
+DDM - Duel Decks: Jace vs. Vraska (2014-03-14)
+
+Assassin, T1, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player that player loses the game.
+
+JOU - Journey into Nyx (2014-05-02)
+
+Minotaur, 1, R, 2|3, League, Creature - Minotaur, Scott Murphy, -
+Sphinx, 1, U, 4|4, -, Creature - Sphinx, Jesper Ejsing, Flying
+Zombie, 2, B, *|*, -, Creature - Zombie, Zack Stella, -
+Minotaur, 3, R, 2|3, -, Creature - Minotaur, Craig J Spearing, -
+Hydra, 4, G, *|*, -, Creature - Hydra, Steve Prescott, -
+Spider, 5, G, 1|3, -, Enchantment Creature - Spider, Yohann Schepacz, Reach
+Snake, 6, G B, 1|1, -, Enchantment Creature - Snake, Greg Staples, Deathtouch
+
+MD1 - Modern Event Deck 2014 (2014-05-30)
+
+Soldier, 1, W, 1|1, -, Creature - Soldier, Goran Josic, -
+Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying
+Myr, 3, -, 1|1, -, Artifact Creature - Myr, Matt Stewart, -
+Elspeth Emblem, 4, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts creatures enchantments and lands you control have indestructible.
+
+CNS - Conspiracy (2014-06-06)
+
+Spirit, 1, W, 1|1, -, Creature - Spirit, Jeff Simpson, Flying
+Demon, 2, B, *|*, -, Creature - Demon, Evan Shipard, Flying
+Zombie, 3, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
+Ogre, 4, R, 4|4, -, Creature - Ogre, Dave Kendall, -
+Elephant, 5, G, 3|3, -, Creature - Elephant, Lars Grant-West, -
+Squirrel, 6, G, 1|1, -, Creature - Squirrel, Daniel Ljunggren, -
+Wolf, 7, G, 2|2, -, Creature - Wolf, Raoul Vitale, -
+Construct, 8, -, 1|1, -, Artifact Creature - Construct, Adam Paquette, Defender
+Dack Emblem, 9, -, -, -, Emblem - Dack, Eric Deschamps, Whenever you cast a spell that targets one or more permanents gain control of those permanents.
+
+M15 - Magic 2015 Core Set (2014-07-18)
+
+Wolf, 001, G, 1|1, Pre-Release, Creature - Wolf, David Palumbo, -
+Sliver, 001, -, 1|1, -, Creature - Sliver, Igor Kieryluk, -
+Squid, 001, U, 1|1, League, Creature - Squid, Richard Wright, Islandwalk
+Soldier, 002, W, 1|1, -, Creature - Soldier, Greg Staples, -
+Spirit, 003, W, 1|1, -, Creature - Spirit, Mike Sass, Flying
+Squid, 004, U, 1|1, -, Creature - Squid, Jack Wang, Islandwalk
+Beast, 005, B, 3|3, -, Creature - Beast, John Donahue, Deathtouch
+Zombie, 006, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
+Dragon, 007, R, 2|2, -, Creature - Dragon, Jack Wang, Flying {R}: This creature gets +1/+0 until end of turn.
+Goblin, 008, R, 1|1, -, Creature - Goblin, Karl Kopinski, -
+Beast, 009, G, 3|3, -, Creature - Beast, Dave Kendall, -
+Insect, 010, G, 1|1, -, Creature - Insect, Martina Pilcerova, Flying deathtouch
+Treefolk Warrior, 011, G, *|*, -, Creature - Treefolk Warrior, Todd Lockwood, This creature's power and toughness are each equal to the number of Forests you control.
+Land Mine, 012, -, -, -, Artifact, Kev Walker, {R} Sacrifice this artifact: This artifact deals 2 damage to target attacking creature without flying.
+Ajani Emblem, 013, -, -, -, Emblem - Ajani, Chris Rahn, If a source would deal damage to you or a planeswalker you control prevent all but 1 of that damage.
+Garruk Emblem, 014, -, -, -, Emblem - Garruk, Tyler Jacobson, Whenever a creature attacks you it gets +5/+5 and gains trample until end of turn.
+
+DDN - Duel Decks: Speed vs. Cunning (2014-09-05)
+
+Goblin, 082, R, 1|1, -, Creature - Goblin, Karl Kopinski, -
+
+KTK - Khans of Tarkir (2014-09-26)
+
+Warrior, 001, W, 1|1, League, Creature - Warrior, Winona Nelson, -
+Bird, 001, W, 3|4, -, Creature - Bird, Mark Zug, Flying
+Spirit, 002, W, 1|1, -, Creature - Spirit, Mike Sass, Flying
+Warrior, 003, W, 1|1, -, Creature - Warrior, Ryan Barger, -
+Warrior, 004, W, 1|1, -, Creature - Warrior, Yefim Kligerman, -
+Vampire, 005, B, 2|2, -, Creature - Vampire, Cynthia Sheppard, Flying
+Zombie, 006, B, 2|2, -, Creature - Zombie, Wayne Reynolds, -
+Goblin, 007, R, 1|1, -, Creature - Goblin, Kev Walker, -
+Bear, 008, G, 4|4, -, Creature - Bear, Kev Walker, -
+Snake, 009, G, 1|1, -, Creature - Snake, Lars Grant-West, -
+Spirit Warrior, 010, B G, *|*, -, Creature - Spirit Warrior, Ryan Alexander Lee, -
+Morph, 011, -, 2|2, -, Creature, Raymond Swanland, (You can cover a face-down creature with this reminder card. A card with morph can be turned face up any time for its morph cost.)
+Sarkhan Emblem, 012, -, -, -, Emblem - Sarkhan, Daarken, At the beginning of your draw step draw two additional cards. At the beginning of your end step discard your hand.
+Sorin Emblem, 013, -, -, -, Emblem - Sorin, Cynthia Sheppard, At the beginning of each opponent's upkeep that player sacrifices a creature.
+
+C14 - Commander 2014 (2014-11-07)
+
+Angel, 001, W, 4|4, -, Creature - Angel, Anthony Palumbo, Flying
+Cat, 002, W, 2|2, -, Creature - Cat, Scott Chou, -
+Goat, 003, W, -, -, Creature - Goat, Adam Paquette, -
+Kor Soldier, 004, W, 1|1, -, Creature - Kor Soldier, Daren Bader, -
+Pegasus, 005, W, 1|1, -, Creature - Pegasus, Greg Hildebrandt, Flying
+Soldier, 006, W, 1|1, -, Creature - Soldier, Goran Josic, -
+Spirit, 007, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying
+Fish, 008, U, 3|3, -, Creature - Fish, Dan Scott, When this creature dies put a 6/6 blue Whale creature token onto the battlefield with "When this creature dies put a 9/9 blue Kraken creature token onto the battlefield."
+Kraken, 009, U, 9|9, -, Creature - Kraken, Dan Scott, -
+Whale, 010, U, 6|6, -, Creature - Whale, Dan Scott, When this creature dies put a 9/9 blue Kraken creature token onto the battlefield.
+Zombie, 011, U, *|*, -, Creature - Zombie, Dave Kendall, -
+Demon, 012, B, *|*, -, Creature - Demon, Pete Venters, Flying
+Demon, 013, B, 5|5, -, Creature - Demon, Kev Walker, Flying
+Germ, 014, B, -, -, Creature - Germ, Igor Kieryluk, -
+Horror, 015, B, *|*, -, Creature - Horror, Jason Felix, -
+Zombie, 016, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
+Goblin, 017, R, 1|1, -, Creature - Goblin, Dave Kendall, -
+Ape, 018, G, 3|3, -, Creature - Ape, Lars Grant-West, -
+Beast, 019, G, 3|3, -, Creature - Beast, Dave Allsop, -
+Beast, 020, G, 4|4, -, Creature - Beast, Steve Prescott, -
+Elemental, 021, G, 5|3, -, Creature - Elemental, Nils Hamm, -
+Elephant, 022, G, 3|3, -, Creature - Elephant, Lars Grant-West, -
+Elf Druid, 023, G, 1|1, -, Creature - Elf Druid, Raymond Swanland, {T}: Add {G} to your mana pool.
+Elf Warrior, 024, G, 1|1, -, Creature - Elf Warrior, William O'Connor, -
+Treefolk, 025, G, *|*, -, Creature - Treefolk, Filip Burburan, -
+Wolf, 026, G, 2|2, -, Creature - Wolf, Daren Bader, -
+Gargoyle, 027, -, 3|4, -, Artifact Creature - Gargoyle, Paul Bonner, Flying
+Myr, 028, -, 1|1, -, Artifact Creature - Myr, Ryan Pancoast, -
+Pentavite, 029, -, 1|1, -, Artifact Creature - Pentavite, Greg Staples, Flying
+Stoneforged Blade, 030, -, -, -, Artifact - Equipment, Eric Deschamps, Indestructible Equipped creature gets +5/+5 and has double strike. Equip {0}
+Tuktuk The Returned, 031, -, 5|5, -, Legendary Artifact Creature - Goblin Golem, Franz Vohwinkel, -
+Wurm, 032, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Deathtouch
+Wurm, 033, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Lifelink
+Teferi Emblem, 034, -, -, -, Emblem - Teferi, Tyler Jacobson, You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant.
+Nixilis Emblem, 035, -, -, -, Emblem - Nixilis, Daarken, {1}{B} Sacrifice a creature: You gain X life and draw X cards where X is the sacrificed creature's power.
+Daretti Emblem, 036, -, -, -, Emblem - Daretti, Dan Scott, Whenever an artifact is put into your graveyard from the battlefield return that card to the battlefield at the beginning of the next end step.
+
+DD3_EVG - Duel Decks Anthology Elves vs. Goblins (2014-12-05)
+
+Elemental, 001, G, 7|7, -, Creature - Elemental, Anthony S. Waters, Trample
+Elf Warrior, 002, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, -
+Goblin, 003, R, 1|1, -, Creature - Goblin, Dave Kendall, -
+
+DD3_JVC - Duel Decks Anthology Jace vs. Chandra (2014-12-05)
+
+Elemental Shaman, 004, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, -
+
+DD3_DVD - Duel Decks Anthology Divine vs. Demonic (2014-12-05)
+
+Spirit, 005, W, 1|1, -, Creature - Spirit, Luca Zontini, Flying
+Demon, 006, B, *|*, -, Creature - Demon, Pete Venters, Flying
+Thrull, 007, B, -, -, Creature - Thrull, Veronique Meignaud, -
+
+DD3_GVL - Duel Decks Anthology Garruk vs. Liliana (2014-12-05)
+
+Beast, 008, G, 3|3, -, Creature - Beast, John Donahue, -
+Beast, 009, G, 4|4, -, Creature - Beast, Steve Prescott, -
+Elephant, 010, G, 3|3, -, Creature - Elephant, Arnie Swekel, -
+Bat, 011, B, 1|1, -, Creature - Bat, Wayne Reynolds, Flying
+
+FRF - Fate Reforged (2015-01-23)
+
+Monk, 001, W, 1|1, -, Creature - Monk, Steven Belledin, Prowess
+Monk, 001T, W, 1|1, League, Creature - Monk, Magali Villeneuve, Prowess
+Spirit, 002, W, 1|1, -, Creature - Spirit, Aaron Miller, Flying
+Warrior, 003, B, 2|1, -, Creature - Warrior, Zoltan Boros, -
+Manifest, 004, -, 2|2, -, Creature, Raymond Swanland, (You can cover a face-down manifested creature with this reminder card. A manifested creature card can be turned face up any time for its mana cost. A face-down card can also be turned face up for its morph cost.)
+
+DDO - Duel Decks: Elspeth vs. Kiora (2015-02-27)
+
+Soldier, 066, W, 1|1, -, Creature - Soldier, Svetlin Velinov, -
+Kraken, 067, U, 9|9, -, Creature - Kraken, Dan Scott, -
+
+DTK - Dragons of Tarkir (2015-03-27)
+
+Warrior, 001, W, 1|1, -, Creature - Warrior, Aaron Miller, -
+Djinn Monk, 002, U, 2|2, -, Creature - Djinn Monk, Izzy, Flying
+Zombie, 003, B, 2|2, -, Creature - Zombie, Vincent Proce, -
+Zombie Horror, 004, B, *|*, -, Creature - Zombie Horror, Nils Hamm, -
+Dragon, 005, R, 4|4, -, Creature - Dragon, Gabor Szikszai, Flying
+Goblin, 006, R, 1|1, -, Creature - Goblin, Mike Bierek, -
+Morph, 007, -, 2|2, -, Creature, Raymond Swanland, (You can cover a face-down creature with this reminder card. A card with morph can be turned face up any time for its morph cost.)
+Narset Emblem, 008, -, -, -, Emblem - Narset, Magali Villeneuve, Your opponents can't cast noncreature spells.
+
+MM2 - Modern Masters 2015 Edition (2015-05-22)
+
+Eldrazi Spawn, 001, -, -, -, Creature - Eldrazi Spawn, Aleksi Briclot, Sacrifice this creature: Add {1} to your mana pool.
+Eldrazi Spawn, 002, -, -, -, Creature - Eldrazi Spawn, Mark Tedin, Sacrifice this creature: Add {1} to your mana pool.
+Eldrazi Spawn, 003, -, -, -, Creature - Eldrazi Spawn, Veronique Meignaud, Sacrifice this creature: Add {1} to your mana pool.
+Soldier, 004, W, 1|1, -, Creature - Soldier, Greg Staples, -
+Spirit, 005, W, 1|1, -, Creature - Spirit, Mike Sass, Flying
+Faerie Rogue, 006, B, 1|1, -, Creature - Faerie Rogue, Dave Allsop, Flying
+Germ, 007, B, -, -, Creature - Germ, Igor Kieryluk, -
+Thrull, 008, B, 1|1, -, Creature - Thrull, Mark Tedin, -
+Elephant, 009, G, 3|3, -, Creature - Elephant, Lars Grant-West, -
+Insect, 010, G, 1|1, -, Creature - Insect, Ron Spencer, -
+Saproling, 011, G, 1|1, -, Creature - Saproling, Warren Mahy, -
+Snake, 012, G, 1|1, -, Creature - Snake, Austin Hsu, -
+Wolf, 013, G, 2|2, -, Creature - Wolf, Daren Bader, -
+Worm, 014, B G, 1|1, -, Creature - Worm, Chuck Lukacs, -
+Golem, 015, -, 3|3, -, Artifact Creature - Golem, Nic Klein, -
+Myr, 016, -, 1|1, -, Artifact Creature - Myr, Ryan Pancoast, -
+
+ORI - Magic Origins (2015-07-17)
+
+Angel, 001, W, 4|4, -, Creature - Angel, Cyril Van Der Haegen, Flying
+Knight, 002, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance
+Soldier, 003, W, 1|1, -, Creature - Soldier, Steve Prescott, -
+Demon, 004, B, 5|5, -, Creature - Demon, Kev Walker, Flying
+Zombie, 005, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
+Goblin, 006, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, -
+Ashaya the Awoken World, 007, G, 4|4, -, Legendary Creature - Elemental, Raymond Swanland, -
+Elemental, 008, G, 2|2, -, Creature - Elemental, Marco Nelor, -
+Elf Warrior, 009, G, 1|1, -, Creature - Elf Warrior, William O'Connor, -
+Thopter, 010, -, 1|1, -, Artifact Creature - Thopter, Adam Paquette, Flying
+Thopter, 011, -, 1|1, -, Artifact Creature - Thopter, Svetlin Velinov, Flying
+Jace Emblem, 012, -, -, -, Emblem - Jace, Jaime Jones, Whenever you cast a spell target opponent puts the top five cards of his or her library into his or her graveyard.
+Liliana Emblem, 013, -, -, -, Emblem - Liliana, Karla Ortiz, Whenever a creature dies return it to the battlefield under your control at the beginning of the next end step.
+Chandra Emblem, 014, -, -, -, Emblem - Chandra, Eric Deschamps, At the beginning of your upkeep this emblem deals 3 damage to you.
+
+DDP - Duel Decks: Zendikar vs. Eldrazi (2015-08-28)
+
+Eldrazi Spawn, 076, -, -, -, Creature - Eldrazi Spawn, Aleksi Briclot, Sacrifice this creature: Add {1} to your mana pool.
+Eldrazi Spawn, 077, -, -, -, Creature - Eldrazi Spawn, Veronique Meignaud, Sacrifice this creature: Add {1} to your mana pool.
+Eldrazi Spawn, 078, -, -, -, Creature - Eldrazi Spawn, Mark Tedin, Sacrifice this creature: Add {1} to your mana pool.
+Hellion, 079, R, 4|4, -, Creature - Hellion, Anthony Francisco, -
+Plant, 080, G, -, -, Creature - Plant, Daren Bader, -
+
+BFZ - Battle for Zendikar (2015-10-09)
+
+Eldrazi, 001, -, 10|10, -, Creature - Eldrazi, Jack Wang, -
+Eldrazi Scion, 002, -, 1|1, -, Creature - Eldrazi Scion, Izzy, Sacrifice this creature: Add {1} to your mana pool.
+Eldrazi Scion, 003, -, 1|1, -, Creature - Eldrazi Scion, Winona Nelson, Sacrifice this creature: Add {1} to your mana pool.
+Eldrazi Scion, 004, -, 1|1, -, Creature - Eldrazi Scion, Svetlin Velinov, Sacrifice this creature: Add {1} to your mana pool.
+Knight Ally, 005, W, 2|2, -, Creature - Knight Ally, Josu Hernaiz, -
+Kor Ally, 006, W, 1|1, -, Creature - Kor Ally, Jeremy Wilson, -
+Octopus, 007, U, 8|8, -, Creature - Octopus, Craig J Spearing, -
+Dragon, 008, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying
+Plant, 009, G, 1|1, -, Creature - Plant, Sam Burley, -
+Elemental, 009, R, 3|1, -, Creature - Elemental, Victor Adame Minguez, Trample Haste
+Elemental, 011, G R, 5|5, -, Creature - Elemental, Brad Rigney, -
+Gideon Emblem, 012, -, -, -, Emblem - Gideon, Eric Deschamps, -
+Nixilis Emblem, 013, -, -, -, Emblem - Nixilis, Chris Rahn, -
+Kiora Emblem, 014, -, -, -, Emblem - Kiora, Jason Chan, -
+
+C15 - Commander 2015 (2015-11-13)
+
+Shapeshifter, 001, -, 1|1, -, Creature - Shapeshifter, Franz Vohwinkel, Changeling
+Angel, 002, W, 4|4, -, Creature - Angel, Cyril Van Der Haegen, Flying
+Cat, 003, W, 2|2, -, Creature - Cat, Jesper Ejsing, -
+Knight, 004, W, 2|2, -, Creature - Knight, Hideaki Takamura, First strike
+Knight, 005, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance
+Drake, 006, U, 2|2, -, Creature - Drake, Svetlin Velinov, Flying
+Germ, 007, B, -, -, Creature - Germ, Igor Kieryluk, -
+Zombie, 008, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
+Dragon, 009, R, 5|5, -, Creature - Dragon, Jim Pavelec, Flying
+Elemental Shaman, 010, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, -
+Lightning Rager, 011, R, 5|1, -, Creature - Elemental, Svetlin Velinov, Trample Haste At the beginning of your end step sacrifice this creature.
+Bear, 012, G, 2|2, -, Creature - Bear, Heather Hudson, -
+Beast, 013, G, 4|4, -, Creature - Beast, Svetlin Velinov, -
+Elephant, 014, G, 3|3, -, Creature - Elephant, Lars Grant-West, -
+Frog Lizard, 015, G, 3|3, -, Creature - Frog Lizard, Jack Wang, -
+Saproling, 016, G, 1|1, -, Creature - Saproling, Brad Rigney, -
+Snake, 017, G, 1|1, -, Creature - Snake, Dan Scott, -
+Spider, 018, G, 1|2, -, Creature - Spider, Daniel Ljunggren, Reach
+Wolf, 019, G, 2|2, -, Creature - Wolf, David Palumbo, -
+Elemental, 020, U R, 5|5, -, Creature - Elemental, Randy Gallegos, Flying
+Snake, 021, G U, 1|1, -, Creature - Snake, Christopher Moeller, -
+Spirit, 022, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying
+Spirit, 023, -, *|*, -, Enchantment Creature - Spirit, Adam Paquette, This creature's power and toughness are each equal to the number of experience counters you have.
+Gold, 024, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool.
diff --git a/Mage.Client/src/test/java/mage/client/game/TokensMtgImageSourceTest.java b/Mage.Client/src/test/java/mage/client/game/TokensMtgImageSourceTest.java
new file mode 100644
index 00000000000..b33b81d0b99
--- /dev/null
+++ b/Mage.Client/src/test/java/mage/client/game/TokensMtgImageSourceTest.java
@@ -0,0 +1,32 @@
+package mage.client.game;
+
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.mage.plugins.card.dl.sources.CardImageSource;
+import org.mage.plugins.card.dl.sources.TokensMtgImageSource;
+import org.mage.plugins.card.images.CardDownloadData;
+
+/**
+ *
+ * @author Quercitron
+ */
+@Ignore
+public class TokensMtgImageSourceTest {
+
+ @Test
+ public void generateTokenUrlTest() throws Exception {
+ CardImageSource imageSource = TokensMtgImageSource.getInstance();
+
+ String url = imageSource.generateTokenUrl(new CardDownloadData("Thopter", "ORI", 0, false, 1, "ORI"));
+ Assert.assertEquals("http://tokens.mtg.onl/tokens/ORI_010-Thopter.jpg", url);
+ url = imageSource.generateTokenUrl(new CardDownloadData("Thopter", "ORI", 0, false, 2, "ORI"));
+ Assert.assertEquals("http://tokens.mtg.onl/tokens/ORI_011-Thopter.jpg", url);
+
+ url = imageSource.generateTokenUrl(new CardDownloadData("Ashaya, the Awoken World", "ORI", 0, false, 0, "ORI"));
+ Assert.assertEquals("http://tokens.mtg.onl/tokens/ORI_007-Ashaya,-the-Awoken-World.jpg", url);
+
+ url = imageSource.generateTokenUrl(new CardDownloadData("Emblem Gideon, Ally of Zendikar", "BFZ", 0, false, 0, null));
+ Assert.assertEquals("http://tokens.mtg.onl/tokens/BFZ_012-Gideon-Emblem.jpg", url);
+ }
+}
diff --git a/Mage.Common/pom.xml b/Mage.Common/pom.xml
index 09ab27aea29..b35033d97f5 100644
--- a/Mage.Common/pom.xml
+++ b/Mage.Common/pom.xml
@@ -7,7 +7,7 @@
org.magemage-root
- 1.4.3
+ 1.4.5mage-common
diff --git a/Mage.Common/src/mage/cards/MageCard.java b/Mage.Common/src/mage/cards/MageCard.java
index 320e9d11390..275c3773c03 100644
--- a/Mage.Common/src/mage/cards/MageCard.java
+++ b/Mage.Common/src/mage/cards/MageCard.java
@@ -1,35 +1,61 @@
package mage.cards;
+import java.awt.Image;
+import java.util.UUID;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
import mage.cards.action.ActionCallback;
import mage.view.CardView;
-import javax.swing.*;
-import java.awt.*;
-import java.util.UUID;
-
public abstract class MageCard extends JPanel {
+
private static final long serialVersionUID = 6089945326434301879L;
public abstract void onBeginAnimation();
+
public abstract void onEndAnimation();
+
public abstract boolean isTapped();
+
public abstract boolean isFlipped();
+
public abstract void setAlpha(float transparency);
+
public abstract float getAlpha();
+
public abstract CardView getOriginal();
+
// sets the vertical text offset for the card name on the image
public abstract void setTextOffset(int yOffset);
+
public abstract void setCardBounds(int x, int y, int width, int height);
+
public abstract void update(CardView card);
+
public abstract void updateImage();
+
public abstract Image getImage();
+
public abstract void setZone(String zone);
+
public abstract String getZone();
+
public abstract void updateCallback(ActionCallback callback, UUID gameId);
+
public abstract void toggleTransformed();
+
public abstract boolean isTransformed();
+
public abstract void showCardTitle();
+
public abstract void setSelected(boolean selected);
+
public abstract void setCardAreaRef(JPanel cardArea);
+
public abstract void setChoosable(boolean isChoosable);
+
+ public abstract void setPopupMenu(JPopupMenu popupMenu);
+
+ public abstract JPopupMenu getPopupMenu();
+
}
diff --git a/Mage.Common/src/mage/cards/action/ActionCallback.java b/Mage.Common/src/mage/cards/action/ActionCallback.java
index c355ff4faeb..a2b1345f019 100644
--- a/Mage.Common/src/mage/cards/action/ActionCallback.java
+++ b/Mage.Common/src/mage/cards/action/ActionCallback.java
@@ -12,6 +12,6 @@ public interface ActionCallback {
void mouseEntered(MouseEvent e, TransferData data);
void mouseExited(MouseEvent e, TransferData data);
void mouseWheelMoved(MouseWheelEvent e, TransferData data);
- void hidePopup();
+ void hideTooltipPopup();
}
diff --git a/Mage.Common/src/mage/cards/action/impl/EmptyCallback.java b/Mage.Common/src/mage/cards/action/impl/EmptyCallback.java
index 425225a573a..9db675f342a 100644
--- a/Mage.Common/src/mage/cards/action/impl/EmptyCallback.java
+++ b/Mage.Common/src/mage/cards/action/impl/EmptyCallback.java
@@ -35,7 +35,7 @@ public class EmptyCallback implements ActionCallback {
}
@Override
- public void hidePopup() {
+ public void hideTooltipPopup() {
}
@Override
diff --git a/Mage.Common/src/mage/constants/Constants.java b/Mage.Common/src/mage/constants/Constants.java
index a5b586c63a8..fd8bf95052c 100644
--- a/Mage.Common/src/mage/constants/Constants.java
+++ b/Mage.Common/src/mage/constants/Constants.java
@@ -67,6 +67,10 @@ public final class Constants {
public static final double SCALE_FACTOR = 0.5;
+ public static final int MIN_AVATAR_ID = 10;
+ public static final int MAX_AVATAR_ID = 32;
+ public static final int DEFAULT_AVATAR_ID = 10;
+
/**
* Time each player has during the game to play using his\her priority.
*/
@@ -83,6 +87,10 @@ public final class Constants {
public static final String POSSIBLE_ATTACKERS = "possibleAttackers";
public static final String SPECIAL_BUTTON = "specialButton";
+ // used to control automatic answers of optional effects
+ public static final String ORIGINAL_ID = "originalId";
+ public static final String SECOND_MESSAGE = "secondMessage";
+ public static final String HINT_TEXT = "hintText";
}
diff --git a/Mage.Common/src/mage/remote/MageVersionException.java b/Mage.Common/src/mage/remote/MageVersionException.java
index 4da5aec0ddc..33108ab2d6b 100644
--- a/Mage.Common/src/mage/remote/MageVersionException.java
+++ b/Mage.Common/src/mage/remote/MageVersionException.java
@@ -1,16 +1,16 @@
/*
* Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
@@ -20,7 +20,7 @@
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
+ *
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
@@ -38,8 +38,8 @@ public class MageVersionException extends MageException {
private final MageVersion serverVersion;
- public MageVersionException(MageVersion clientVersion, MageVersion serverVersion) {
- super("Wrong client version " + clientVersion + ", expecting version " + serverVersion + ". \r\n\r\nPlease download needed version from http://XMage.info or http://www.slightlymagic.net/forum/viewforum.php?f=70");
+ public MageVersionException(MageVersion clientVersion, MageVersion serverVersion) {
+ super("Wrong client version " + clientVersion + ", expecting version " + serverVersion + ". \r\n\r\nPlease download needed version from http://XMage.de or http://www.slightlymagic.net/forum/viewforum.php?f=70");
this.serverVersion = serverVersion;
}
diff --git a/Mage.Common/src/mage/remote/SessionImpl.java b/Mage.Common/src/mage/remote/SessionImpl.java
index 8017868ba74..3b4036d4c26 100644
--- a/Mage.Common/src/mage/remote/SessionImpl.java
+++ b/Mage.Common/src/mage/remote/SessionImpl.java
@@ -468,9 +468,7 @@ public class SessionImpl implements Session {
@Override
public void handleConnectionException(Throwable throwable, Client client) {
- logger.info("connection to server lost - " + throwable.getMessage());
- throwable.printStackTrace();
-
+ logger.info("connection to server lost - " + throwable.getMessage(), throwable);
reconnect(throwable);
}
}
diff --git a/Mage.Common/src/mage/utils/CardUtil.java b/Mage.Common/src/mage/utils/CardUtil.java
index fb3331ed4be..f5c7c9c6a85 100644
--- a/Mage.Common/src/mage/utils/CardUtil.java
+++ b/Mage.Common/src/mage/utils/CardUtil.java
@@ -1,5 +1,7 @@
package mage.utils;
+import java.util.List;
+import mage.ObjectColor;
import mage.cards.Card;
import mage.cards.MagePermanent;
import mage.constants.CardType;
@@ -13,6 +15,12 @@ import mage.view.CardView;
*/
public class CardUtil {
+ private static final String regexBlack = ".*\\x7b.{0,2}B.{0,2}\\x7d.*";
+ private static final String regexBlue = ".*\\x7b.{0,2}U.{0,2}\\x7d.*";
+ private static final String regexRed = ".*\\x7b.{0,2}R.{0,2}\\x7d.*";
+ private static final String regexGreen = ".*\\x7b.{0,2}G.{0,2}\\x7d.*";
+ private static final String regexWhite = ".*\\x7b.{0,2}W.{0,2}\\x7d.*";
+
public static boolean isCreature(CardView card) {
return is(card, CardType.CREATURE);
}
@@ -48,4 +56,34 @@ public class CardUtil {
public static boolean isLand(Card card) {
return card.getCardType().contains(CardType.LAND);
}
+
+ public static int getColorIdentitySortValue(List manaCost, ObjectColor originalColor, List rules) {
+ ObjectColor color = new ObjectColor(originalColor);
+ for (String rule : rules) {
+ rule = rule.replaceAll("(?i)", ""); // Ignoring reminder text in italic
+ if (rule.matches(regexBlack)) {
+ color.setBlack(true);
+ }
+ if (rule.matches(regexBlue)) {
+ color.setBlue(true);
+ }
+ if (rule.matches(regexGreen)) {
+ color.setGreen(true);
+ }
+ if (rule.matches(regexRed)) {
+ color.setRed(true);
+ }
+ if (rule.matches(regexWhite)) {
+ color.setWhite(true);
+ }
+ }
+
+ int hash = 3;
+ hash = 23 * hash + (color.isWhite() || manaCost.contains("{W}") ? 1 : 0);
+ hash = 23 * hash + (color.isBlue() || manaCost.contains("{U}") ? 1 : 0);
+ hash = 23 * hash + (color.isBlack() || manaCost.contains("{B}") ? 1 : 0);
+ hash = 23 * hash + (color.isRed() || manaCost.contains("{R}") ? 1 : 0);
+ hash = 23 * hash + (color.isGreen() || manaCost.contains("{G}") ? 1 : 0);
+ return hash;
+ }
}
diff --git a/Mage.Common/src/mage/utils/MageVersion.java b/Mage.Common/src/mage/utils/MageVersion.java
index 805d71e91be..4680bcb2b55 100644
--- a/Mage.Common/src/mage/utils/MageVersion.java
+++ b/Mage.Common/src/mage/utils/MageVersion.java
@@ -40,7 +40,7 @@ public class MageVersion implements Serializable, Comparable {
*/
public final static int MAGE_VERSION_MAJOR = 1;
public final static int MAGE_VERSION_MINOR = 4;
- public final static int MAGE_VERSION_PATCH = 3;
+ public final static int MAGE_VERSION_PATCH = 5;
public final static String MAGE_VERSION_MINOR_PATCH = "v0";
public final static String MAGE_VERSION_INFO = "";
diff --git a/Mage.Common/src/mage/utils/properties/PropertiesUtil.java b/Mage.Common/src/mage/utils/properties/PropertiesUtil.java
index 50d1bfdbb1f..87a936131f8 100644
--- a/Mage.Common/src/mage/utils/properties/PropertiesUtil.java
+++ b/Mage.Common/src/mage/utils/properties/PropertiesUtil.java
@@ -1,7 +1,6 @@
package mage.utils.properties;
-import com.j256.ormlite.logger.Logger;
-import com.j256.ormlite.logger.LoggerFactory;
+import org.apache.log4j.Logger;
import java.io.IOException;
import java.io.InputStream;
@@ -12,7 +11,7 @@ import java.util.Properties;
*/
public class PropertiesUtil {
- private static final Logger logger = LoggerFactory.getLogger(PropertiesUtil.class);
+ private static final Logger logger = Logger.getLogger(PropertiesUtil.class);
private static final String LOG_JDBC_URL = "jdbc:h2:file:./db/mage.h2;AUTO_SERVER=TRUE";
private static final String FEEDBACK_JDBC_URL = "jdbc:h2:file:./db/feedback.h2;AUTO_SERVER=TRUE";
@@ -25,7 +24,7 @@ public class PropertiesUtil {
try {
properties.load(in);
} catch (IOException e) {
- logger.error(e, "Couldn't load properties");
+ logger.error("Couldn't load properties", e);
}
} else {
logger.warn("No xmage.properties were found on classpath");
diff --git a/Mage.Common/src/mage/view/CardView.java b/Mage.Common/src/mage/view/CardView.java
index 6c90e5a66b4..5be823cbe31 100644
--- a/Mage.Common/src/mage/view/CardView.java
+++ b/Mage.Common/src/mage/view/CardView.java
@@ -32,7 +32,7 @@ import java.util.List;
import java.util.UUID;
import mage.MageObject;
import mage.ObjectColor;
-import mage.abilities.Modes;
+import mage.abilities.Mode;
import mage.abilities.SpellAbility;
import mage.abilities.costs.mana.ManaCosts;
import mage.cards.Card;
@@ -153,7 +153,7 @@ public class CardView extends SimpleCardView {
* for morph / face down cards to know which player may see information for
* the card
* @param showFaceDownCard if true and the card is not on the battelfield,
- * also a face dwon card is shown in the view dwon cards will be shown
+ * also a face down card is shown in the view, face down cards will be shown
*/
public CardView(Card card, Game game, boolean controlled, boolean showFaceDownCard) {
super(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.getUsesVariousArt(), card.getTokenSetCode(), game != null);
@@ -191,6 +191,7 @@ public class CardView extends SimpleCardView {
this.power = Integer.toString(card.getPower().getValue());
this.toughness = Integer.toString(card.getToughness().getValue());
this.cardTypes = card.getCardType();
+ this.faceDown = ((Permanent) card).isFaceDown(game);
} else {
// this.hideInfo = true;
return;
@@ -310,19 +311,16 @@ public class CardView extends SimpleCardView {
this.mageObjectType = MageObjectType.SPELL;
Spell spell = (Spell) card;
for (SpellAbility spellAbility : spell.getSpellAbilities()) {
- for (UUID modeId : spellAbility.getModes().getSelectedModes()) {
- spellAbility.getModes().setActiveMode(modeId);
- if (spellAbility.getTargets().size() > 0) {
+ for (Mode mode : spellAbility.getModes().getSelectedModes()) {
+ if (mode.getTargets().size() > 0) {
setTargets(spellAbility.getTargets());
}
}
}
// show for modal spell, which mode was choosen
if (spell.getSpellAbility().isModal()) {
- Modes modes = spell.getSpellAbility().getModes();
- for (UUID modeId : modes.getSelectedModes()) {
- modes.setActiveMode(modeId);
- this.rules.add("Chosen mode: " + spell.getSpellAbility().getEffects().getText(modes.get(modeId)) + "");
+ for (Mode mode : spell.getSpellAbility().getModes().getSelectedModes()) {
+ this.rules.add("Chosen mode: " + mode.getEffects().getText(mode) + "");
}
}
}
diff --git a/Mage.Common/src/mage/view/CardsView.java b/Mage.Common/src/mage/view/CardsView.java
index 2b72e78a1c2..606918a3eec 100644
--- a/Mage.Common/src/mage/view/CardsView.java
+++ b/Mage.Common/src/mage/view/CardsView.java
@@ -89,6 +89,9 @@ public class CardsView extends LinkedHashMap {
case EXILED:
case GRAVEYARD:
sourceObject = game.getCard(ability.getSourceId());
+ if (sourceObject == null) {
+ sourceObject = game.getPermanent(ability.getSourceId());
+ }
isCard = true;
break;
case BATTLEFIELD:
@@ -152,6 +155,9 @@ public class CardsView extends LinkedHashMap {
for (UUID uuid : abilityTargets) {
MageObject mageObject = game.getObject(uuid);
if (mageObject != null) {
+ if ((mageObject instanceof Card) && ((Card) mageObject).isFaceDown(game)) {
+ continue;
+ }
names.add(GameLog.getColoredObjectIdNameForTooltip(mageObject));
}
}
diff --git a/Mage.Common/src/mage/view/EmblemView.java b/Mage.Common/src/mage/view/EmblemView.java
index e4971d5cecb..1681f05de90 100644
--- a/Mage.Common/src/mage/view/EmblemView.java
+++ b/Mage.Common/src/mage/view/EmblemView.java
@@ -28,6 +28,13 @@ public class EmblemView implements CommandObjectView, Serializable {
rules = emblem.getAbilities().getRules(sourceCard.getName());
}
+ public EmblemView(Emblem emblem) {
+ id = emblem.getId();
+ name = emblem.getName();
+ expansionSetCode = emblem.getExpansionSetCodeForImage();
+ rules = emblem.getAbilities().getRules(emblem.getName());
+ }
+
@Override
public String getExpansionSetCode() {
return expansionSetCode;
diff --git a/Mage.Common/src/mage/view/GameView.java b/Mage.Common/src/mage/view/GameView.java
index 9f078a75b91..7060d19ab91 100644
--- a/Mage.Common/src/mage/view/GameView.java
+++ b/Mage.Common/src/mage/view/GameView.java
@@ -62,7 +62,7 @@ public class GameView implements Serializable {
private static final long serialVersionUID = 1L;
- private static final transient Logger logger = Logger.getLogger(GameView.class);
+ private static final Logger logger = Logger.getLogger(GameView.class);
private final int priorityTime;
private final List players = new ArrayList<>();
@@ -103,7 +103,12 @@ public class GameView implements Serializable {
Card card = game.getCard(stackObject.getSourceId());
if (card != null) {
if (object != null) {
- stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility) stackObject, card.getName(), new CardView(card)));
+ if (object instanceof Permanent) {
+ boolean controlled = ((Permanent) object).getControllerId().equals(createdForPlayerId);
+ stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility) stackObject, ((Permanent) object).getName(), new CardView(((Permanent) object), game, controlled, false)));
+ } else {
+ stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility) stackObject, card.getName(), new CardView(card, game, false, false)));
+ }
} else {
stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility) stackObject, "", new CardView(card)));
}
@@ -118,6 +123,7 @@ public class GameView implements Serializable {
checkPaid(stackObject.getId(), (StackAbility) stackObject);
} else if (object instanceof Emblem) {
Card sourceCard = game.getCard(((Emblem) object).getSourceId());
+ CardView cardView;
if (sourceCard != null) {
if (!sourceCard.getCardType().contains(CardType.PLANESWALKER)) {
if (sourceCard.getSecondCardFace() != null) {
@@ -126,20 +132,26 @@ public class GameView implements Serializable {
}
((StackAbility) stackObject).setName("Emblem " + sourceCard.getName());
((StackAbility) stackObject).setExpansionSetCode(sourceCard.getExpansionSetCode());
+ cardView = new CardView(new EmblemView(((Emblem) object), sourceCard));
} else {
- throw new IllegalArgumentException("Source card for emblem not found.");
+ cardView = new CardView(new EmblemView((Emblem) object));
}
stack.put(stackObject.getId(),
- new StackAbilityView(game, (StackAbility) stackObject, object.getName(), new CardView(new EmblemView(((Emblem) object), sourceCard))));
+ new StackAbilityView(game, (StackAbility) stackObject, object.getName(), cardView));
checkPaid(stackObject.getId(), ((StackAbility) stackObject));
} else {
- StackAbility stackAbility = ((StackAbility) object);
- stackAbility.newId();
- stack.put(stackObject.getId(), new CardView(((StackAbility) stackObject)));
- checkPaid(stackObject.getId(), ((StackAbility) stackObject));
+ if (object instanceof StackAbility) {
+ StackAbility stackAbility = ((StackAbility) object);
+ stackAbility.newId();
+ stack.put(stackObject.getId(), new CardView(((StackAbility) stackObject)));
+ checkPaid(stackObject.getId(), ((StackAbility) stackObject));
+ } else {
+ logger.fatal("Object can't be cast to StackAbility: " + object.getName() + " " + object.toString() + " " + object.getClass().toString());
+ }
}
} else {
- logger.error("Stack Object for stack ability not found: " + stackObject.getStackAbility().getRule());
+ // can happen if a player times out while ability is on the stack
+ logger.debug("Stack Object for stack ability not found: " + stackObject.getStackAbility().getRule());
}
} else {
// Spell
@@ -174,7 +186,7 @@ public class GameView implements Serializable {
}
if (isPlayer) {
// has only to be set for active palyer with priority (e.g. pay mana by delve or Quenchable Fire special action)
- if (state.getPriorityPlayerId() == createdForPlayerId && createdForPlayer != null) {
+ if (createdForPlayer != null && createdForPlayerId.equals(state.getPriorityPlayerId())) {
this.special = state.getSpecialActions().getControlledBy(state.getPriorityPlayerId(), createdForPlayer.isInPayManaMode()).size() > 0;
}
} else {
diff --git a/Mage.Common/src/mage/view/PermanentView.java b/Mage.Common/src/mage/view/PermanentView.java
index 2b7fe476f00..9ec311a269d 100644
--- a/Mage.Common/src/mage/view/PermanentView.java
+++ b/Mage.Common/src/mage/view/PermanentView.java
@@ -1,31 +1,30 @@
/*
-* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification, are
-* permitted provided that the following conditions are met:
-*
-* 1. Redistributions of source code must retain the above copyright notice, this list of
-* conditions and the following disclaimer.
-*
-* 2. Redistributions in binary form must reproduce the above copyright notice, this list
-* of conditions and the following disclaimer in the documentation and/or other materials
-* provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
-* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The views and conclusions contained in the software and documentation are those of the
-* authors and should not be interpreted as representing official policies, either expressed
-* or implied, of BetaSteward_at_googlemail.com.
-*/
-
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
package mage.view;
import java.util.ArrayList;
@@ -44,6 +43,7 @@ import mage.players.Player;
* @author BetaSteward_at_googlemail.com
*/
public class PermanentView extends CardView {
+
private static final long serialVersionUID = 1L;
private boolean tapped;
@@ -78,7 +78,7 @@ public class PermanentView extends CardView {
}
this.attachedTo = permanent.getAttachedTo();
if (isToken()) {
- original = new CardView(((PermanentToken)permanent).getToken());
+ original = new CardView(((PermanentToken) permanent).getToken());
original.expansionSetCode = permanent.getExpansionSetCode();
tokenSetCode = original.getTokenSetCode();
} else {
@@ -98,7 +98,7 @@ public class PermanentView extends CardView {
this.alternateName = permanent.getFlipCardName();
this.originalName = this.getName();
} else {
- if (controlled // controller may always know
+ if (controlled // controller may always know
|| (!morphed && !manifested)) { // others don't know for morph or transformed cards
this.alternateName = original.getName();
this.originalName = this.getName();
@@ -113,11 +113,11 @@ public class PermanentView extends CardView {
this.nameOwner = "";
}
} else {
- this.nameOwner = "";
+ this.nameOwner = "";
}
-
+
if (permanent.isFaceDown(game) && card != null) {
- if (controlled){
+ if (controlled) {
// must be a morphed or manifested card
for (Ability permanentAbility : permanent.getAbilities()) {
if (permanentAbility instanceof TurnFaceUpAbility && !permanentAbility.getRuleVisible()) {
@@ -131,17 +131,17 @@ public class PermanentView extends CardView {
this.displayName = card.getName();
this.expansionSetCode = card.getExpansionSetCode();
this.cardNumber = card.getCardNumber();
- } else{
- if (permanent.isMorphed()) {
- this.rules.add("If the controller has priority, he or she may turn this permanent face up." +
- " This is a special action; it doesnt use the stack. To do this he or she pays the morph costs," +
- " then turns this permanent face up.");
- }else if (permanent.isManifested()) {
- this.rules.add("A manifested creature card can be turned face up any time for it's mana cost." +
- " A face-down card can also be turned face up for its morph cost.");
+ } else {
+ if (permanent.isManifested()) {
+ this.rules.add("A manifested creature card can be turned face up any time for it's mana cost."
+ + " A face-down card can also be turned face up for its morph cost.");
+ } else if (permanent.isMorphed()) {
+ this.rules.add("If the controller has priority, he or she may turn this permanent face up."
+ + " This is a special action; it doesnt use the stack. To do this he or she pays the morph costs,"
+ + " then turns this permanent face up.");
}
}
- }
+ }
// determines if shown in it's own column
if (permanent.getAttachedTo() != null) {
attachedToPermanent = game.getPermanent(permanent.getAttachedTo()) != null;
@@ -170,7 +170,7 @@ public class PermanentView extends CardView {
return phasedIn;
}
- public boolean hasSummoningSickness(){
+ public boolean hasSummoningSickness() {
return summoningSickness;
}
@@ -209,6 +209,7 @@ public class PermanentView extends CardView {
public boolean isMorphed() {
return morphed;
}
+
public boolean isManifested() {
return manifested;
}
diff --git a/Mage.Common/src/mage/view/PlayerView.java b/Mage.Common/src/mage/view/PlayerView.java
index ce66a5ffbe0..49b5b3d8e54 100644
--- a/Mage.Common/src/mage/view/PlayerView.java
+++ b/Mage.Common/src/mage/view/PlayerView.java
@@ -58,6 +58,10 @@ public class PlayerView implements Serializable {
private final String name;
private final int life;
private final int poison;
+ private final int experience;
+ private final int wins;
+ private final int winsNeeded;
+ private final long deckHashCode;
private final int libraryCount;
private final int handCount;
private final boolean isActive;
@@ -85,6 +89,10 @@ public class PlayerView implements Serializable {
this.name = player.getName();
this.life = player.getLife();
this.poison = player.getCounters().getCount(CounterType.POISON);
+ this.experience = player.getCounters().getCount(CounterType.EXPERIENCE);
+ this.wins = player.getMatchPlayer().getWins();
+ this.winsNeeded = player.getMatchPlayer().getWinsNeeded();
+ this.deckHashCode = player.getMatchPlayer().getDeck().getDeckHashCode();
this.libraryCount = player.getLibrary().size();
this.handCount = player.getHand().size();
this.manaPool = new ManaPoolView(player.getManaPool());
@@ -132,6 +140,8 @@ public class PlayerView implements Serializable {
}
}
commandList.add(new EmblemView(emblem, sourceCard));
+ } else {
+ commandList.add(new EmblemView(emblem));
}
}
} else if (commandObject instanceof Commander) {
@@ -181,10 +191,26 @@ public class PlayerView implements Serializable {
return this.poison;
}
+ public int getExperience() {
+ return this.experience;
+ }
+
public int getLibraryCount() {
return this.libraryCount;
}
+ public int getWins() {
+ return wins;
+ }
+
+ public int getWinsNeeded() {
+ return winsNeeded;
+ }
+
+ public long getDeckHashCode() {
+ return deckHashCode;
+ }
+
public int getHandCount() {
return this.handCount;
}
@@ -229,7 +255,7 @@ public class PlayerView implements Serializable {
return this.userData;
}
- public List getCommadObjectList() {
+ public List getCommandObjectList() {
return commandList;
}
diff --git a/Mage.Common/src/mage/view/SeatView.java b/Mage.Common/src/mage/view/SeatView.java
index f8f79a397e2..d812dadebd6 100644
--- a/Mage.Common/src/mage/view/SeatView.java
+++ b/Mage.Common/src/mage/view/SeatView.java
@@ -30,6 +30,7 @@ package mage.view;
import java.io.Serializable;
import java.util.UUID;
import mage.game.Seat;
+import mage.players.net.UserData;
/**
*
@@ -48,7 +49,11 @@ public class SeatView implements Serializable {
if (seat.getPlayer() != null) {
this.playerId = seat.getPlayer().getId();
this.playerName = seat.getPlayer().getName();
- this.flagName = seat.getPlayer().getUserData().getFlagName();
+ if (seat.getPlayer().getUserData() == null) {
+ this.flagName = UserData.getDefaultFlagName();
+ } else {
+ this.flagName = seat.getPlayer().getUserData().getFlagName();
+ }
} else {
// Empty seat
this.playerName = "";
diff --git a/Mage.Common/src/mage/view/StackAbilityView.java b/Mage.Common/src/mage/view/StackAbilityView.java
index 6fb4d3c4863..815c0ec13d1 100644
--- a/Mage.Common/src/mage/view/StackAbilityView.java
+++ b/Mage.Common/src/mage/view/StackAbilityView.java
@@ -31,6 +31,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import mage.MageObject;
+import mage.abilities.Mode;
import mage.abilities.Modes;
import mage.abilities.effects.Effect;
import mage.cards.Card;
@@ -98,13 +99,12 @@ public class StackAbilityView extends CardView {
private void updateTargets(Game game, StackAbility ability) {
List names = new ArrayList<>();
- for (UUID modeId : ability.getModes().getSelectedModes()) {
- ability.getModes().setActiveMode(modeId);
- if (ability.getTargets().size() > 0) {
- setTargets(ability.getTargets());
+ for (Mode mode : ability.getModes().getSelectedModes()) {
+ if (mode.getTargets().size() > 0) {
+ setTargets(mode.getTargets());
} else {
List targetList = new ArrayList<>();
- for (Effect effect : ability.getEffects()) {
+ for (Effect effect : mode.getEffects()) {
TargetPointer targetPointer = effect.getTargetPointer();
if (targetPointer instanceof FixedTarget) {
targetList.add(((FixedTarget) targetPointer).getTarget());
@@ -132,9 +132,8 @@ public class StackAbilityView extends CardView {
// show for modal ability, which mode was choosen
if (ability.isModal()) {
Modes modes = ability.getModes();
- for (UUID modeId : modes.getSelectedModes()) {
- modes.setActiveMode(modeId);
- this.rules.add("Chosen mode: " + ability.getEffects().getText(modes.get(modeId)) + "");
+ for (Mode mode : modes.getSelectedModes()) {
+ this.rules.add("Chosen mode: " + mode.getEffects().getText(mode) + "");
}
}
}
diff --git a/Mage.Common/src/mage/view/UserDataView.java b/Mage.Common/src/mage/view/UserDataView.java
index 242fa32ec2d..c60bbe88c54 100644
--- a/Mage.Common/src/mage/view/UserDataView.java
+++ b/Mage.Common/src/mage/view/UserDataView.java
@@ -20,10 +20,14 @@ public class UserDataView implements Serializable {
String flagName;
protected boolean askMoveToGraveOrder;
- static UserData getDefaultUserDataView() {
+ static UserData getDefaultUserData() {
return UserData.getDefaultUserDataView();
}
+ public static UserDataView getDefaultUserDataView() {
+ return new UserDataView(getDefaultUserData());
+ }
+
public UserDataView(int avatarId, boolean showAbilityPickerForced, boolean allowRequestShowHandCards,
boolean confirmEmptyManaPool, UserSkipPrioritySteps userSkipPrioritySteps, String flagName, boolean askMoveToGraveOrder) {
this.avatarId = avatarId;
diff --git a/Mage.Plugins/Mage.Counter.Plugin/pom.xml b/Mage.Plugins/Mage.Counter.Plugin/pom.xml
index df8cc7328b3..9005ebb0e46 100644
--- a/Mage.Plugins/Mage.Counter.Plugin/pom.xml
+++ b/Mage.Plugins/Mage.Counter.Plugin/pom.xml
@@ -7,7 +7,7 @@
org.magemage-plugins
- 1.4.3
+ 1.4.5mage-counter-plugin
diff --git a/Mage.Plugins/Mage.Theme.Plugin/pom.xml b/Mage.Plugins/Mage.Theme.Plugin/pom.xml
deleted file mode 100644
index eebc730e4a8..00000000000
--- a/Mage.Plugins/Mage.Theme.Plugin/pom.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
- 4.0.0
-
-
- org.mage
- mage-plugins
- 1.4.3
-
-
- mage-theme-plugin
- jar
- 0.5
- Mage Theme Plugin
- Contains resources for drawing background
-
-
-
- ${project.groupId}
- mage-common
- ${mage-version}
-
-
- log4j
- log4j
- provided
-
-
- ${project.groupId}
- mage-client
- 1.4.3
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
- 1.7
- 1.7
-
-
-
-
- mage-theme-plugin
-
-
diff --git a/Mage.Plugins/Mage.Theme.Plugin/src/main/java/org/mage/plugins/theme/ThemePluginImpl.java b/Mage.Plugins/Mage.Theme.Plugin/src/main/java/org/mage/plugins/theme/ThemePluginImpl.java
deleted file mode 100644
index f2a10884a10..00000000000
--- a/Mage.Plugins/Mage.Theme.Plugin/src/main/java/org/mage/plugins/theme/ThemePluginImpl.java
+++ /dev/null
@@ -1,210 +0,0 @@
-package org.mage.plugins.theme;
-
-import mage.components.ImagePanel;
-import mage.interfaces.plugin.ThemePlugin;
-import mage.client.dialog.PreferencesDialog;
-import net.xeoh.plugins.base.annotations.PluginImplementation;
-import net.xeoh.plugins.base.annotations.events.Init;
-import net.xeoh.plugins.base.annotations.events.PluginLoaded;
-import net.xeoh.plugins.base.annotations.meta.Author;
-import org.apache.log4j.Logger;
-
-import javax.imageio.ImageIO;
-import javax.swing.*;
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.*;
-import java.io.InputStream;
-import java.util.Map;
-
-@PluginImplementation
-@Author(name = "nantuko")
-public class ThemePluginImpl implements ThemePlugin {
-
- private static final Logger log = Logger.getLogger(ThemePluginImpl.class);
- private static BufferedImage background;
- private List flist = new List();
- private String BackgroundDir = "plugins" + File.separator + "plugin.data" + File.separator
- + "background" + File.separator;
- @Init
- public void init() {
- }
-
- @PluginLoaded
- public void newPlugin(ThemePlugin plugin) {
- log.info(plugin.toString() + " has been loaded.");
- }
-
- public String toString() {
- return "[Theme plugin, version 0.5]";
- }
-
- public boolean loadimages(){
- File filedir = new File(BackgroundDir);
- File[] filelist = filedir.listFiles();
- if(filelist == null) return false;
- if(filelist.length == 0) return false;
- for(File f:filelist){
- String filename = f.getName().toLowerCase();
- if(filename != null && (filename.endsWith(".png") || filename.endsWith(".jpg")
- || filename.endsWith(".bmp"))){
- flist.add(filename);
- }
- }
- if(flist.getItemCount() == 0) return false;
- return true;
- }
-
- public void applyInGame(Map ui) {
- BufferedImage background;
- try {
-
- if(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_BATTLEFIELD_IMAGE_DEFAULT,
- "true").equals("true")){
-
- background = loadbuffer_default();
-
- }else if(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_BATTLEFIELD_IMAGE_RANDOM,
- "true").equals("true")){
-
- background = loadbuffer_random();
-
- }else if(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_BATTLEFIELD_IMAGE, "") != null){
-
- background = loadbuffer_selected();
-
- }else{
- background = loadbuffer_default();
- }
-
-
-
- /*
- if(loadimages()){
- int it = (int)Math.abs(Math.random()*(flist.getItemCount()));
- filename = BackgroundDir + flist.getItem(it);
- background = ImageIO.read(new File(filename));
- }else{
- filename = "/dragon.png";
- InputStream is = this.getClass().getResourceAsStream(filename);
- if (is == null)
- throw new FileNotFoundException("Couldn't find " + filename + " in resources.");
- background = ImageIO.read(is);
- }
- */
- if (background == null) {
- throw new FileNotFoundException("Couldn't find background file in resources.");
- }
-
- if (ui.containsKey("gamePanel") && ui.containsKey("jLayeredPane")) {
- ImagePanel bgPanel = new ImagePanel(background, ImagePanel.TILED);
-
- unsetOpaque(ui.get("jSplitPane1"));
- unsetOpaque(ui.get("pnlBattlefield"));
- unsetOpaque(ui.get("jPanel3"));
- unsetOpaque(ui.get("hand"));
- unsetOpaque(ui.get("gameChatPanel"));
- unsetOpaque(ui.get("userChatPanel"));
-
- ui.get("gamePanel").remove(ui.get("jLayeredPane"));
- bgPanel.add(ui.get("jLayeredPane"));
- ui.get("gamePanel").add(bgPanel);
- } else {
- log.error("error: no components");
- }
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- return;
- }
- }
-
-
- private BufferedImage loadbuffer_default() throws IOException{
- String filename = "/dragon.png";
- BufferedImage res;
- InputStream is = this.getClass().getResourceAsStream(filename);
- res = ImageIO.read(is);
- return res;
- }
-
- private BufferedImage loadbuffer_random() throws IOException{
- BufferedImage res;
- if(loadimages()){
- int it = (int)Math.abs(Math.random()*(flist.getItemCount()));
- String filename = BackgroundDir + flist.getItem(it);
- res = ImageIO.read(new File(filename));
- return res;
- }
- return null;
- }
-
- private BufferedImage loadbuffer_selected() throws IOException{
- BufferedImage res;
- String path = PreferencesDialog.getCachedValue(PreferencesDialog.
- KEY_BATTLEFIELD_IMAGE, "");
- if(path != null){
- res = ImageIO.read(new File(path));
- return res;
- }
- return null;
- }
-
-
- public JComponent updateTable(Map ui) {
- ImagePanel bgPanel = createImagePanelInstance();
-
- unsetOpaque(ui.get("jScrollPane1"));
- unsetOpaque(ui.get("jPanel1"));
- unsetOpaque(ui.get("tablesPanel"));
- JComponent viewport = ui.get("jScrollPane1ViewPort");
- if (viewport != null) {
- viewport.setBackground(new Color(255,255,255,50));
- }
- return bgPanel;
- }
-
- private ImagePanel createImagePanelInstance() {
- if (background == null) {
- synchronized (ThemePluginImpl.class) {
- if (background == null) {
- String filename = "/background.png";
- try {
- if(PreferencesDialog.getCachedValue(PreferencesDialog.
- KEY_BACKGROUND_IMAGE_DEFAULT, "true").equals("true")){
- InputStream is = this.getClass().getResourceAsStream(filename);
- if (is == null)
- throw new FileNotFoundException("Couldn't find " + filename + " in resources.");
- background = ImageIO.read(is);
- }else if(PreferencesDialog.getCachedValue(PreferencesDialog.
- KEY_BACKGROUND_IMAGE, "") != null){
- String path = PreferencesDialog.getCachedValue(PreferencesDialog.
- KEY_BATTLEFIELD_IMAGE, "");
- if(path != null){
- background = ImageIO.read(new File(path));
- }else{
- InputStream is = this.getClass().getResourceAsStream(filename);
- if (is == null)
- throw new FileNotFoundException("Couldn't find " + filename + " in resources.");
- background = ImageIO.read(is);
- }
- }
-
- if (background == null)
- throw new FileNotFoundException("Couldn't find " + filename + " in resources.");
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- return null;
- }
- }
- }
- }
- return new ImagePanel(background, ImagePanel.SCALED);
- }
-
- private void unsetOpaque(JComponent c) {
- if (c != null) {
- c.setOpaque(false);
- }
- }
-}
diff --git a/Mage.Plugins/Mage.Theme.Plugin/src/main/resources/background.png b/Mage.Plugins/Mage.Theme.Plugin/src/main/resources/background.png
deleted file mode 100644
index 01acc151f2c..00000000000
Binary files a/Mage.Plugins/Mage.Theme.Plugin/src/main/resources/background.png and /dev/null differ
diff --git a/Mage.Plugins/Mage.Theme.Plugin/src/main/resources/dk_gray.jpg b/Mage.Plugins/Mage.Theme.Plugin/src/main/resources/dk_gray.jpg
deleted file mode 100644
index 2e0776d6068..00000000000
Binary files a/Mage.Plugins/Mage.Theme.Plugin/src/main/resources/dk_gray.jpg and /dev/null differ
diff --git a/Mage.Plugins/Mage.Theme.Plugin/src/main/resources/dragon.png b/Mage.Plugins/Mage.Theme.Plugin/src/main/resources/dragon.png
deleted file mode 100644
index 634f56c21c8..00000000000
Binary files a/Mage.Plugins/Mage.Theme.Plugin/src/main/resources/dragon.png and /dev/null differ
diff --git a/Mage.Plugins/Mage.Theme.Plugin/src/main/resources/green.jpg b/Mage.Plugins/Mage.Theme.Plugin/src/main/resources/green.jpg
deleted file mode 100644
index f5705253297..00000000000
Binary files a/Mage.Plugins/Mage.Theme.Plugin/src/main/resources/green.jpg and /dev/null differ
diff --git a/Mage.Plugins/pom.xml b/Mage.Plugins/pom.xml
index 4e6b8ad8521..b8ec0e9e444 100644
--- a/Mage.Plugins/pom.xml
+++ b/Mage.Plugins/pom.xml
@@ -7,7 +7,7 @@
org.magemage-root
- 1.4.3
+ 1.4.5mage-plugins
@@ -16,7 +16,6 @@
Mage Plugins POM
- Mage.Theme.PluginMage.Counter.Plugin
diff --git a/Mage.Server.Console/pom.xml b/Mage.Server.Console/pom.xml
index 77cb534fd1d..01ecd66db97 100644
--- a/Mage.Server.Console/pom.xml
+++ b/Mage.Server.Console/pom.xml
@@ -6,7 +6,7 @@
org.magemage-root
- 1.4.3
+ 1.4.5org.mage
diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/pom.xml b/Mage.Server.Plugins/Mage.Deck.Constructed/pom.xml
index dabc671779d..64f1bfa7580 100644
--- a/Mage.Server.Plugins/Mage.Deck.Constructed/pom.xml
+++ b/Mage.Server.Plugins/Mage.Deck.Constructed/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-deck-constructed
diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/BattleForZendikarBlock.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/BattleForZendikarBlock.java
new file mode 100644
index 00000000000..10fc42fd8bc
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/BattleForZendikarBlock.java
@@ -0,0 +1,44 @@
+/*
+* Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without modification, are
+* permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this list of
+* conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice, this list
+* of conditions and the following disclaimer in the documentation and/or other materials
+* provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* The views and conclusions contained in the software and documentation are those of the
+* authors and should not be interpreted as representing official policies, either expressed
+* or implied, of BetaSteward_at_googlemail.com.
+*/
+
+package mage.deck;
+
+import mage.cards.decks.Constructed;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BattleForZendikarBlock extends Constructed {
+
+ public BattleForZendikarBlock() {
+ super("Constructed - Battle for Zendikar Block");
+ setCodes.add("BFZ");
+ setCodes.add("OGW");
+ }
+}
diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/DuelCommander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/DuelCommander.java
index feb71b5e85a..a380531598e 100644
--- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/DuelCommander.java
+++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/DuelCommander.java
@@ -64,11 +64,12 @@ public class DuelCommander extends Commander {
banned.add("Mox Pearl");
banned.add("Mox Ruby");
banned.add("Mox Sapphire");
- banned.add("Mystical Tutor"); // banned effective July 17, 2015
+ banned.add("Mystical Tutor");
banned.add("Natural Order");
banned.add("Necropotence");
banned.add("Oath of Druids");
banned.add("Protean Hulk");
+ banned.add("Sensei's Divining Top");
banned.add("Serra Ascendant");
banned.add("Shahrazad");
banned.add("Sol Ring");
diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalType2.java
similarity index 94%
rename from Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java
rename to Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalType2.java
index 9fef3463b57..08e2025ddb2 100644
--- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalStandard.java
+++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/HistoricalType2.java
@@ -23,7 +23,7 @@ import mage.constants.SetType;
*
* @author Marthinwurer (at gmail.com)
*/
-public class HistoricalStandard extends Constructed {
+public class HistoricalType2 extends Constructed {
/*
* This array stores the set codes of each standard up to
@@ -34,9 +34,9 @@ public class HistoricalStandard extends Constructed {
{"DRK", "FEM", "4ED"},
// 2nd standard: 4th, Fallen Empires, Ice Age, Chronicles, Homelands,
// Alliances, and Mirage.
- {"FEM", "4ED", "ICE", "HML", "ALL", "MIR"},
+ {"FEM", "4ED", "ICE", "CHR", "HML", "ALL", "MIR"},
// 3rd standard: 4th, Chronicles, Alliances, Mirage, Visions.
- {"4ED", "ALL", "MIR", "VIS"},
+ {"4ED", "CHR", "ALL", "MIR", "VIS"},
// 4th Standard: Ice Age, Homelands, Alliances, Mirage, Visions, 5th,
// and Weatherlight.
{"ICE", "HML", "ALL", "MIR", "VIS", "5ED", "WTH"},
@@ -73,9 +73,9 @@ public class HistoricalStandard extends Constructed {
// 18th Standard
{"9ED", "RAV", "GPT", "DIS", "CSP", "TSP", "TSB", "PLC", "FUT"},
// 19th Standard
- {"10E", "RAV", "GPT", "DIS", "CSP", "TSP", "PLC", "FUT"},
+ {"10E", "RAV", "GPT", "DIS", "CSP", "TSP", "TSB", "PLC", "FUT"},
// 20th Standard
- {"10E", "CSP", "TSP", "PLC", "FUT", "LRW", "MOR", "SHM", "EVE"},
+ {"10E", "CSP", "TSP", "TSB", "PLC", "FUT", "LRW", "MOR", "SHM", "EVE"},
// 21st Standard
{"10E", "LRW", "MOR", "SHM", "EVE", "ALA", "CON", "ARB"}
};
@@ -84,15 +84,17 @@ public class HistoricalStandard extends Constructed {
* Constructor. Don't need to mess with any of the sets yet; that will be
* done in the overridden validate function.
*/
- public HistoricalStandard() {
- super("Constructed - Historical Standard");
+ public HistoricalType2() {
+ super("Constructed - Historical Type 2");
// banned cards
banned.add("Balance");
+ banned.add("Earthcraft");
banned.add("Memory Jar");
banned.add("Mind Over Matter");
banned.add("Mind Twist");
banned.add("Skullclamp");
+ banned.add("Time Spiral");
banned.add("Tolarian Academy");
banned.add("Yawgmoth's Bargain");
}
diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Legacy.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Legacy.java
index f06a58d238f..f8c24589b7b 100644
--- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Legacy.java
+++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Legacy.java
@@ -46,7 +46,6 @@ public class Legacy extends Constructed {
banned.add("Balance");
banned.add("Bazaar of Baghdad");
banned.add("Black Lotus");
- banned.add("Black Vise");
banned.add("Brago's Favor");
banned.add("Bronze Tablet");
banned.add("Channel");
@@ -56,6 +55,7 @@ public class Legacy extends Constructed {
banned.add("Demonic Attorney");
banned.add("Demonic Consultation");
banned.add("Demonic Tutor");
+ banned.add("Dig Through Time");
banned.add("Double Stroke");
banned.add("Earthcraft");
banned.add("Falling Star");
@@ -104,7 +104,7 @@ public class Legacy extends Constructed {
banned.add("Timmerian Fiends");
banned.add("Tinker");
banned.add("Tolarian Academy");
- banned.add("Treasure Cruise"); // banned effective January 23, 2015
+ banned.add("Treasure Cruise");
banned.add("Unexpected Potential");
banned.add("Vampiric Tutor");
banned.add("Wheel of Fortune");
diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Momir.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Momir.java
new file mode 100644
index 00000000000..48a05c3c81e
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Momir.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.deck;
+
+import mage.cards.Card;
+import mage.cards.decks.Deck;
+import mage.cards.decks.DeckValidator;
+
+import java.util.*;
+
+/**
+ *
+ * @author nigelzor
+ */
+public class Momir extends DeckValidator {
+
+ public Momir() {
+ this("Momir Basic");
+ }
+
+ public Momir(String name) {
+ super(name);
+ }
+
+ @Override
+ public boolean validate(Deck deck) {
+ boolean valid = true;
+
+ if (deck.getCards().size() != 60) {
+ invalid.put("Deck", "Must contain 60 cards: has " + deck.getCards().size() + " cards");
+ valid = false;
+ }
+
+ List basicLandNames = new ArrayList<>(Arrays.asList("Forest", "Island", "Mountain", "Swamp", "Plains"));
+ for (Card card : deck.getCards()) {
+ if (!basicLandNames.contains(card.getName())) {
+ invalid.put(card.getName(), "Only basic lands are allowed");
+ valid = false;
+ }
+ }
+
+ return valid;
+ }
+
+}
diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/ShardsOfAlaraBlock.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/ShardsOfAlaraBlock.java
index 44fc5e3e6b3..c8915b5a8b1 100644
--- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/ShardsOfAlaraBlock.java
+++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/ShardsOfAlaraBlock.java
@@ -37,7 +37,7 @@ import mage.cards.decks.Constructed;
public class ShardsOfAlaraBlock extends Constructed {
public ShardsOfAlaraBlock() {
- super("Constructed - Shards Of Alara Block");
+ super("Constructed - Shards of Alara Block");
setCodes.add("ALA");
setCodes.add("CON");
setCodes.add("ARB");
diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperType2.java
similarity index 95%
rename from Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java
rename to Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperType2.java
index 4eb4d5c4e8a..70780d45796 100644
--- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperStandard.java
+++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/SuperType2.java
@@ -18,13 +18,13 @@ import mage.constants.SetType;
*
* This class was originally made to work with the historical standard ruleset.
* Data taken from http://thattournament.website/historic-tournament.php (site
- * changed, originally thtp://mtgt.nfshost.com/historic-tournament.php)
+ * changed, originally http://mtgt.nfshost.com/historic-tournament.php)
*
* If there are any questions or corrections, feel free to contact me.
*
* @author Marthinwurer (at gmail.com)
*/
-public class SuperStandard extends Constructed {
+public class SuperType2 extends Constructed {
/*
* This array stores the set codes of each standard up to
@@ -49,9 +49,9 @@ public class SuperStandard extends Constructed {
// 18th Standard
{"9ED", "RAV", "GPT", "DIS", "CSP", "TSP", "TSB", "PLC", "FUT"},
// 19th Standard
- {"10E", "RAV", "GPT", "DIS", "CSP", "TSP", "PLC", "FUT"},
+ {"10E", "RAV", "GPT", "DIS", "CSP", "TSP", "TSB", "PLC", "FUT"},
// 20th Standard
- {"10E", "CSP", "TSP", "PLC", "FUT", "LRW", "MOR", "SHM", "EVE"},
+ {"10E", "CSP", "TSP", "TSB", "PLC", "FUT", "LRW", "MOR", "SHM", "EVE"},
// 21st Standard
{"10E", "LRW", "MOR", "SHM", "EVE", "ALA", "CON", "ARB"}
};
@@ -60,8 +60,8 @@ public class SuperStandard extends Constructed {
* Constructor. Don't need to mess with any of the sets yet; that will be
* done in the overridden validate function.
*/
- public SuperStandard() {
- super("Constructed - Super Standard");
+ public SuperType2() {
+ super("Constructed - Super Type 2");
banned.add("Ancient Den");
banned.add("Disciple of the Vault");
diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Vintage.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Vintage.java
index c329a3accac..ef3efea54f2 100644
--- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Vintage.java
+++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Vintage.java
@@ -70,8 +70,10 @@ public class Vintage extends Constructed {
restricted.add("Black Lotus");
restricted.add("Brainstorm");
restricted.add("Channel");
+ restricted.add("Chalice of the Void");
restricted.add("Demonic Consultation");
restricted.add("Demonic Tutor");
+ restricted.add("Dig Through Time");
restricted.add("Fastbond");
restricted.add("Flash");
restricted.add("Imperial Seal");
@@ -93,13 +95,12 @@ public class Vintage extends Constructed {
restricted.add("Ponder");
restricted.add("Sol Ring");
restricted.add("Strip Mine");
- restricted.add("Thirst for Knowledge");
restricted.add("Time Vault");
restricted.add("Time Walk");
restricted.add("Timetwister");
restricted.add("Tinker");
restricted.add("Tolarian Academy");
- restricted.add("Treasure Cruise"); // banned effective January 23, 2015
+ restricted.add("Treasure Cruise");
restricted.add("Trinisphere");
restricted.add("Vampiric Tutor");
restricted.add("Wheel of Fortune");
diff --git a/Mage.Server.Plugins/Mage.Deck.Limited/pom.xml b/Mage.Server.Plugins/Mage.Deck.Limited/pom.xml
index 3ab629a71a6..35b61af4df8 100644
--- a/Mage.Server.Plugins/Mage.Deck.Limited/pom.xml
+++ b/Mage.Server.Plugins/Mage.Deck.Limited/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-deck-limited
diff --git a/Mage.Server.Plugins/Mage.Game.CommanderDuel/pom.xml b/Mage.Server.Plugins/Mage.Game.CommanderDuel/pom.xml
index 66972c3a272..009e2da37e0 100644
--- a/Mage.Server.Plugins/Mage.Game.CommanderDuel/pom.xml
+++ b/Mage.Server.Plugins/Mage.Game.CommanderDuel/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-game-commanderduel
diff --git a/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/pom.xml b/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/pom.xml
index ccfa64fc609..faadbdb0d99 100644
--- a/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/pom.xml
+++ b/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/pom.xml
@@ -6,7 +6,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-game-commanderfreeforall
diff --git a/Mage.Server.Plugins/Mage.Game.FreeForAll/pom.xml b/Mage.Server.Plugins/Mage.Game.FreeForAll/pom.xml
index a608c789705..75f223eebdf 100644
--- a/Mage.Server.Plugins/Mage.Game.FreeForAll/pom.xml
+++ b/Mage.Server.Plugins/Mage.Game.FreeForAll/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-game-freeforall
diff --git a/Mage.Server.Plugins/Mage.Game.MomirDuel/pom.xml b/Mage.Server.Plugins/Mage.Game.MomirDuel/pom.xml
new file mode 100644
index 00000000000..828f8c1cdd5
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Game.MomirDuel/pom.xml
@@ -0,0 +1,50 @@
+
+
+
+ 4.0.0
+
+
+ org.mage
+ mage-server-plugins
+ 1.4.5
+
+
+ mage-game-momirduel
+ jar
+ Mage Game Momir Basic Two Player
+
+
+
+ ${project.groupId}
+ mage
+ ${project.version}
+
+
+
+
+ src
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.7
+ 1.7
+
+
+
+ maven-resources-plugin
+
+ UTF-8
+
+
+
+
+
+ mage-game-momirduel
+
+
+
+
+
diff --git a/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuel.java b/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuel.java
new file mode 100644
index 00000000000..e34dd81d2a9
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuel.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.game;
+
+import mage.abilities.Ability;
+import mage.abilities.common.LimitedTimesPerTurnActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.common.DiscardCardCost;
+import mage.abilities.costs.mana.VariableManaCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.InfoEffect;
+import mage.cards.Card;
+import mage.cards.repository.CardCriteria;
+import mage.cards.repository.CardInfo;
+import mage.cards.repository.CardRepository;
+import mage.constants.*;
+import mage.game.command.Emblem;
+import mage.game.match.MatchType;
+import mage.game.permanent.token.EmptyToken;
+import mage.game.turn.TurnMod;
+import mage.players.Player;
+import mage.util.CardUtil;
+
+import java.util.*;
+
+/**
+ *
+ * @author nigelzor
+ */
+public class MomirDuel extends GameImpl {
+
+ public MomirDuel(MultiplayerAttackOption attackOption, RangeOfInfluence range, int freeMulligans, int startLife) {
+ super(attackOption, range, freeMulligans, startLife);
+ }
+
+ public MomirDuel(final MomirDuel game) {
+ super(game);
+ }
+
+ @Override
+ public MatchType getGameType() {
+ return new MomirDuelType();
+ }
+
+ @Override
+ public int getNumPlayers() {
+ return 2;
+ }
+
+ @Override
+ protected void init(UUID choosingPlayerId) {
+ Ability ability = new SimpleStaticAbility(Zone.COMMAND, new InfoEffect("Vanguard effects"));
+ for (UUID playerId : state.getPlayerList(startingPlayerId)) {
+ Player player = getPlayer(playerId);
+ if (player != null) {
+ addEmblem(new MomirEmblem(), ability, playerId);
+ }
+ }
+ getState().addAbility(ability, null);
+ super.init(choosingPlayerId);
+ state.getTurnMods().add(new TurnMod(startingPlayerId, PhaseStep.DRAW));
+ }
+
+ @Override
+ public Set getOpponents(UUID playerId) {
+ Set opponents = new HashSet<>();
+ for (UUID opponentId: this.getPlayer(playerId).getInRange()) {
+ if (!opponentId.equals(playerId)) {
+ opponents.add(opponentId);
+ }
+ }
+ return opponents;
+ }
+
+ @Override
+ public boolean isOpponent(Player player, UUID playerToCheck) {
+ return !player.getId().equals(playerToCheck);
+ }
+
+ @Override
+ public MomirDuel copy() {
+ return new MomirDuel(this);
+ }
+
+}
+
+// faking Vanguard as an Emblem; need to come back to this and add a new type of CommandObject
+class MomirEmblem extends Emblem {
+
+ public MomirEmblem() {
+ setName("Momir Vig, Simic Visionary");
+
+ // {X}, Discard a card: Put a token into play as a copy of a random creature card with converted mana cost X. Play this ability only any time you could play a sorcery and only once each turn.
+ LimitedTimesPerTurnActivatedAbility ability = new LimitedTimesPerTurnActivatedAbility(Zone.COMMAND, new MomirEffect(), new VariableManaCost());
+ ability.addCost(new DiscardCardCost());
+ ability.setTiming(TimingRule.SORCERY);
+ this.getAbilities().add(ability);
+
+ }
+}
+
+class MomirEffect extends OneShotEffect {
+
+ private static final Random rnd = new Random();
+
+ public MomirEffect() {
+ super(Outcome.PutCreatureInPlay);
+ }
+
+ public MomirEffect(MomirEffect effect) {
+ super(effect);
+ staticText = "Put a token into play as a copy of a random creature card with converted mana cost X";
+ }
+
+ @Override
+ public MomirEffect copy() {
+ return new MomirEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ int value = source.getManaCostsToPay().getX();
+ // should this be random across card names, or card printings?
+ CardCriteria criteria = new CardCriteria().types(CardType.CREATURE).convertedManaCost(value);
+ List options = CardRepository.instance.findCards(criteria);
+ if (options != null && !options.isEmpty()) {
+ Card card = options.get(rnd.nextInt(options.size())).getCard();
+ EmptyToken token = new EmptyToken();
+ CardUtil.copyTo(token).from(card);
+ token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId(), false, false);
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuelMatch.java b/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuelMatch.java
new file mode 100644
index 00000000000..9f91e749f05
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuelMatch.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.game;
+
+import mage.game.match.MatchImpl;
+import mage.game.match.MatchOptions;
+
+/**
+ *
+ * @author nigelzor
+ */
+public class MomirDuelMatch extends MatchImpl {
+
+ public MomirDuelMatch(MatchOptions options) {
+ super(options);
+ }
+
+ @Override
+ public void startGame() throws GameException {
+ // Momir Vig, Simic Visionary gives +4 starting life
+ int startLife = 24;
+
+ MomirDuel game = new MomirDuel(options.getAttackOption(), options.getRange(), options.getFreeMulligans(), startLife);
+ game.setStartMessage(this.createGameStartMessage());
+
+ this.initGame(game);
+ games.add(game);
+ }
+
+}
diff --git a/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuelType.java b/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuelType.java
new file mode 100644
index 00000000000..4ec7925477f
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuelType.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.game;
+
+import mage.game.match.MatchType;
+
+/**
+ *
+ * @author nigelzor
+ */
+public class MomirDuelType extends MatchType {
+
+ public MomirDuelType() {
+ this.name = "Momir Basic Two Player Duel";
+ this.maxPlayers = 2;
+ this.minPlayers = 2;
+ this.numTeams = 0;
+ this.useAttackOption = false;
+ this.useRange = false;
+ this.sideboardingAllowed = true;
+ }
+
+ protected MomirDuelType(final MomirDuelType matchType){
+ super(matchType);
+ }
+
+ @Override
+ public MomirDuelType copy() {
+ return new MomirDuelType(this);
+ }
+
+}
diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml
index 7f1ff12438f..bbeeed59005 100644
--- a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml
+++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-game-tinyleadersduel
diff --git a/Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/pom.xml b/Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/pom.xml
index 7c6e74649f0..a3d7867c387 100644
--- a/Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/pom.xml
+++ b/Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-game-twoplayerduel
diff --git a/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml b/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml
index bf21ad2d2fe..7ee253d4b6b 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml
+++ b/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-player-ai-draftbot
diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/pom.xml b/Mage.Server.Plugins/Mage.Player.AI.MA/pom.xml
index 4495a41f8a6..9d55f31bbde 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.MA/pom.xml
+++ b/Mage.Server.Plugins/Mage.Player.AI.MA/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-player-ai-ma
diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java
index 66fc062f4d7..37cce686334 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java
+++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java
@@ -104,6 +104,7 @@ import mage.players.Player;
import mage.target.Target;
import mage.target.TargetCard;
import mage.target.Targets;
+import org.apache.log4j.Logger;
/**
*
@@ -111,7 +112,7 @@ import mage.target.Targets;
*/
public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ {
- private static final transient org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(ComputerPlayer6.class);
+ private static final Logger logger = Logger.getLogger(ComputerPlayer6.class);
private static final ExecutorService pool = Executors.newFixedThreadPool(1);
protected int maxDepth;
protected int maxNodes;
@@ -436,29 +437,32 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ {
}
protected void resolve(SimulationNode2 node, int depth, Game game) {
- StackObject ability = game.getStack().pop();
- if (ability instanceof StackAbility) {
- SearchEffect effect = getSearchEffect((StackAbility) ability);
- if (effect != null && ability.getControllerId().equals(playerId)) {
+ StackObject stackObject = game.getStack().getFirst();
+ if (stackObject instanceof StackAbility) {
+ SearchEffect effect = getSearchEffect((StackAbility) stackObject);
+ if (effect != null && stackObject.getControllerId().equals(playerId)) {
Target target = effect.getTarget();
if (!target.doneChosing()) {
- for (UUID targetId : target.possibleTargets(ability.getSourceId(), ability.getControllerId(), game)) {
+ for (UUID targetId : target.possibleTargets(stackObject.getSourceId(), stackObject.getControllerId(), game)) {
Game sim = game.copy();
- StackAbility newAbility = (StackAbility) ability.copy();
+ StackAbility newAbility = (StackAbility) stackObject.copy();
SearchEffect newEffect = getSearchEffect(newAbility);
newEffect.getTarget().addTarget(targetId, newAbility, sim);
sim.getStack().push(newAbility);
- SimulationNode2 newNode = new SimulationNode2(node, sim, depth, ability.getControllerId());
+ SimulationNode2 newNode = new SimulationNode2(node, sim, depth, stackObject.getControllerId());
node.children.add(newNode);
newNode.getTargets().add(targetId);
- logger.trace("Sim search -- node#: " + SimulationNode2.getCount() + " for player: " + sim.getPlayer(ability.getControllerId()).getName());
+ logger.trace("Sim search -- node#: " + SimulationNode2.getCount() + " for player: " + sim.getPlayer(stackObject.getControllerId()).getName());
}
return;
}
}
}
//logger.info("simulating resolve ");
- ability.resolve(game);
+ stackObject.resolve(game);
+ if (stackObject instanceof StackAbility) {
+ game.getStack().remove(stackObject);
+ }
game.applyEffects();
game.getPlayers().resetPassed();
game.getPlayerList().setCurrent(game.getActivePlayerId());
@@ -1190,7 +1194,8 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ {
safeToAttack = false;
}
if (safeToAttack) {
- attackingPlayer.declareAttacker(attacker.getId(), defenderId, game, false);
+ // undo has to be possible e.g. if not able to pay a attack fee (e.g. Ghostly Prison)
+ attackingPlayer.declareAttacker(attacker.getId(), defenderId, game, true);
}
}
}
diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer7.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer7.java
index 22037b2ad53..3822c054646 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer7.java
+++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer7.java
@@ -74,7 +74,7 @@ import org.apache.log4j.Logger;
*/
public class ComputerPlayer7 extends ComputerPlayer6 {
- private static final transient Logger logger = Logger.getLogger(ComputerPlayer7.class);
+ private static final Logger logger = Logger.getLogger(ComputerPlayer7.class);
private boolean allowBadMoves;
diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Config2.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Config2.java
index 6123868991c..55d87f6914e 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Config2.java
+++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Config2.java
@@ -28,14 +28,13 @@
package mage.player.ai;
+import org.apache.log4j.Logger;
+
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Properties;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import mage.util.Logging;
/**
*
@@ -43,7 +42,7 @@ import mage.util.Logging;
*/
public class Config2 {
- private static final Logger logger = Logging.getLogger(Config2.class.getName());
+ private static final Logger logger = Logger.getLogger(Config2.class);
// public static final int maxDepth;
public static final int maxNodes;
@@ -70,9 +69,9 @@ public class Config2 {
// p.setProperty("maxThinkSeconds", "30");
}
} catch (IOException ex) {
- logger.log(Level.SEVERE, null, ex);
+ logger.error(null, ex);
} catch (URISyntaxException ex) {
- Logger.getLogger(Config2.class.getName()).log(Level.SEVERE, null, ex);
+ logger.error(null, ex);
}
// maxDepth = Integer.parseInt(p.getProperty("maxDepth"));
maxNodes = Integer.parseInt(p.getProperty("maxNodes"));
diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator2.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator2.java
index 0e2c9f409c1..68661f92b86 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator2.java
+++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator2.java
@@ -9,6 +9,7 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.player.ai.ma.ArtificialScoringSystem;
import mage.players.Player;
+import org.apache.log4j.Logger;
/**
*
@@ -19,7 +20,7 @@ import mage.players.Player;
*/
public class GameStateEvaluator2 {
- private static final transient org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(GameStateEvaluator2.class);
+ private static final Logger logger = Logger.getLogger(GameStateEvaluator2.class);
public static final int WIN_GAME_SCORE = 100000000;
public static final int LOSE_GAME_SCORE = -WIN_GAME_SCORE;
diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java
index 419a33a0b53..058d42b6e6d 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java
+++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java
@@ -53,6 +53,7 @@ import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.stack.StackAbility;
import mage.players.Player;
+import mage.players.net.UserData;
import mage.target.Target;
import org.apache.log4j.Logger;
@@ -62,7 +63,7 @@ import org.apache.log4j.Logger;
*/
public class SimulatedPlayer2 extends ComputerPlayer {
- private static final transient Logger logger = Logger.getLogger(SimulatedPlayer2.class);
+ private static final Logger logger = Logger.getLogger(SimulatedPlayer2.class);
private final boolean isSimulatedPlayer;
private transient ConcurrentLinkedQueue allActions;
private boolean forced;
@@ -75,6 +76,7 @@ public class SimulatedPlayer2 extends ComputerPlayer {
pass.setControllerId(playerId);
this.isSimulatedPlayer = isSimulatedPlayer;
this.suggested = suggested;
+ this.userData = UserData.getDefaultUserDataView();
}
public SimulatedPlayer2(final SimulatedPlayer2 player) {
diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationWorker2.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationWorker2.java
index 991947bcb87..971cd3698e5 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationWorker2.java
+++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationWorker2.java
@@ -29,11 +29,9 @@
package mage.player.ai;
import java.util.concurrent.Callable;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import mage.abilities.Ability;
import mage.game.Game;
-import mage.util.Logging;
+import org.apache.log4j.Logger;
/**
*
@@ -41,7 +39,7 @@ import mage.util.Logging;
*/
public class SimulationWorker2 implements Callable {
- private static final Logger logger = Logging.getLogger(SimulationWorker2.class.getName());
+ private static final Logger logger = Logger.getLogger(SimulationWorker2.class);
private Game game;
private SimulatedAction2 previousActions;
@@ -60,7 +58,7 @@ public class SimulationWorker2 implements Callable {
try {
// player.simulateAction(game, previousActions, action);
} catch (Exception ex) {
- logger.log(Level.SEVERE, null, ex);
+ logger.error(null, ex);
}
return null;
}
diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/util/CombatUtil.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/util/CombatUtil.java
index 262523582ef..a5118936766 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/util/CombatUtil.java
+++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/util/CombatUtil.java
@@ -12,6 +12,7 @@ import mage.game.turn.EndOfCombatStep;
import mage.game.turn.FirstCombatDamageStep;
import mage.game.turn.Step;
import mage.players.Player;
+import org.apache.log4j.Logger;
import java.util.*;
@@ -24,7 +25,7 @@ public class CombatUtil {
private static final List emptyList = new ArrayList();
- private static final transient org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(CombatUtil.class);
+ private static final Logger log = Logger.getLogger(CombatUtil.class);
private CombatUtil() {
}
diff --git a/Mage.Server.Plugins/Mage.Player.AI/pom.xml b/Mage.Server.Plugins/Mage.Player.AI/pom.xml
index 51788aff21a..8ed2a850251 100644
--- a/Mage.Server.Plugins/Mage.Player.AI/pom.xml
+++ b/Mage.Server.Plugins/Mage.Player.AI/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-player-ai
diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java
index 89d7ab37637..6e2acbb8fa9 100644
--- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java
+++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java
@@ -74,12 +74,11 @@ import mage.abilities.mana.ManaAbility;
import mage.abilities.mana.ManaOptions;
import mage.cards.Card;
import mage.cards.Cards;
+import mage.cards.CardsImpl;
import mage.cards.decks.Deck;
import mage.cards.repository.CardCriteria;
import mage.cards.repository.CardInfo;
import mage.cards.repository.CardRepository;
-import mage.cards.repository.ExpansionInfo;
-import mage.cards.repository.ExpansionRepository;
import mage.choices.Choice;
import mage.choices.ChoiceColor;
import mage.constants.AsThoughEffectType;
@@ -144,9 +143,12 @@ import mage.target.common.TargetCreatureOrPlayer;
import mage.target.common.TargetCreatureOrPlayerAmount;
import mage.target.common.TargetDefender;
import mage.target.common.TargetDiscard;
+import mage.target.common.TargetOpponent;
import mage.target.common.TargetPermanentOrPlayer;
import mage.target.common.TargetSpellOrPermanent;
import mage.util.Copier;
+import mage.util.MessageToClient;
+import mage.util.TournamentUtil;
import mage.util.TreeNode;
import org.apache.log4j.Logger;
@@ -158,10 +160,10 @@ import org.apache.log4j.Logger;
*/
public class ComputerPlayer extends PlayerImpl implements Player {
- private transient final static Logger log = Logger.getLogger(ComputerPlayer.class);
+ private static final Logger log = Logger.getLogger(ComputerPlayer.class);
protected int PASSIVITY_PENALTY = 5; // Penalty value for doing nothing if some actions are availble
- protected boolean ALLOW_INTERRUPT = true; // change this for test / debugging purposes to false to switch off interrupts while debugging
+ protected boolean ALLOW_INTERRUPT = true; // change this for test / debugging purposes to false to switch off interrupts while debugging
private transient Map unplayable = new TreeMap<>();
private transient List playableNonInstant = new ArrayList<>();
@@ -171,6 +173,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
private transient List chosenColors;
private transient ManaCost currentUnpaidMana;
+ private final Random random = new Random();
public ComputerPlayer(String name, RangeOfInfluence range) {
super(name, range);
@@ -194,7 +197,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
@Override
public boolean chooseMulligan(Game game) {
log.debug("chooseMulligan");
- if (hand.size() < 6 || isTestMode()) {
+ if (hand.size() < 6 || isTestMode() || game.getClass().getName().contains("Momir")) {
return false;
}
Set lands = hand.getCards(new FilterLandCard(), game);
@@ -216,33 +219,11 @@ public class ComputerPlayer extends PlayerImpl implements Player {
if (target.getTargetController() != null && target.getAbilityController() != null) {
abilityControllerId = target.getAbilityController();
}
- UUID opponentId = game.getOpponents(abilityControllerId).iterator().next();
+ UUID randomOpponentId = getRandomOpponent(abilityControllerId, game);
if (target instanceof TargetPlayer) {
- if (outcome.isGood()) {
- if (target.canTarget(abilityControllerId, game)) {
- target.add(abilityControllerId, game);
- return true;
- }
- if (target.isRequired(sourceId, game)) {
- if (target.canTarget(opponentId, game)) {
- target.add(opponentId, game);
- return true;
- }
- }
- } else {
- if (target.canTarget(opponentId, game)) {
- target.add(opponentId, game);
- return true;
- }
- if (target.isRequired(sourceId, game)) {
- if (target.canTarget(abilityControllerId, game)) {
- target.add(abilityControllerId, game);
- return true;
- }
- }
- }
- return false;
+ return setTargetPlayer(outcome, target, null, sourceId, abilityControllerId, randomOpponentId, game);
}
+
if (target instanceof TargetDiscard) {
findPlayables(game);
if (unplayable.size() > 0) {
@@ -289,13 +270,13 @@ public class ComputerPlayer extends PlayerImpl implements Player {
if (outcome.isGood()) {
targets = threats(abilityControllerId, sourceId, ((TargetPermanent) target).getFilter(), game, target.getTargets());
} else {
- targets = threats(opponentId, sourceId, ((TargetPermanent) target).getFilter(), game, target.getTargets());
+ targets = threats(randomOpponentId, sourceId, ((TargetPermanent) target).getFilter(), game, target.getTargets());
}
if (targets.isEmpty() && target.isRequired()) {
if (!outcome.isGood()) {
targets = threats(abilityControllerId, sourceId, ((TargetPermanent) target).getFilter(), game, target.getTargets());
} else {
- targets = threats(opponentId, sourceId, ((TargetPermanent) target).getFilter(), game, target.getTargets());
+ targets = threats(randomOpponentId, sourceId, ((TargetPermanent) target).getFilter(), game, target.getTargets());
}
}
}
@@ -320,9 +301,10 @@ public class ComputerPlayer extends PlayerImpl implements Player {
return target.isChosen();
}
- if (target instanceof TargetCardInHand) {
+ if (target instanceof TargetCardInHand
+ || (target.getZone().equals(Zone.HAND) && (target instanceof TargetCard))) {
List cards = new ArrayList<>();
- for (UUID cardId : ((TargetCardInHand) target).possibleTargets(sourceId, this.getId(), game)) {
+ for (UUID cardId : target.possibleTargets(sourceId, this.getId(), game)) {
Card card = game.getCard(cardId);
if (card != null) {
cards.add(card);
@@ -344,7 +326,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
if (outcome.isGood()) {
targets = threats(abilityControllerId, sourceId, ((FilterCreatureOrPlayer) t.getFilter()).getCreatureFilter(), game, target.getTargets());
} else {
- targets = threats(opponentId, sourceId, ((FilterCreatureOrPlayer) t.getFilter()).getCreatureFilter(), game, target.getTargets());
+ targets = threats(randomOpponentId, sourceId, ((FilterCreatureOrPlayer) t.getFilter()).getCreatureFilter(), game, target.getTargets());
}
for (Permanent permanent : targets) {
List alreadyTargetted = target.getTargets();
@@ -361,8 +343,8 @@ public class ComputerPlayer extends PlayerImpl implements Player {
return true;
}
} else {
- if (target.canTarget(opponentId, null, game)) {
- target.add(opponentId, game);
+ if (target.canTarget(randomOpponentId, null, game)) {
+ target.add(randomOpponentId, game);
return true;
}
}
@@ -374,8 +356,8 @@ public class ComputerPlayer extends PlayerImpl implements Player {
if (target instanceof TargetPermanentOrPlayer) {
List targets;
TargetPermanentOrPlayer t = ((TargetPermanentOrPlayer) target);
- List ownedTargets = threats(abilityControllerId, sourceId, ((FilterPermanentOrPlayer) t.getFilter()).getPermanentFilter(), game, target.getTargets());;
- List opponentTargets = threats(opponentId, sourceId, ((FilterPermanentOrPlayer) t.getFilter()).getPermanentFilter(), game, target.getTargets());
+ List ownedTargets = threats(abilityControllerId, sourceId, ((FilterPermanentOrPlayer) t.getFilter()).getPermanentFilter(), game, target.getTargets());
+ List opponentTargets = threats(randomOpponentId, sourceId, ((FilterPermanentOrPlayer) t.getFilter()).getPermanentFilter(), game, target.getTargets());
if (outcome.isGood()) {
targets = ownedTargets;
} else {
@@ -396,16 +378,16 @@ public class ComputerPlayer extends PlayerImpl implements Player {
return true;
}
} else {
- if (target.canTarget(opponentId, null, game)) {
- target.add(opponentId, game);
+ if (target.canTarget(randomOpponentId, null, game)) {
+ target.add(randomOpponentId, game);
return true;
}
}
if (!target.isRequired(sourceId, game) || target.getNumberOfTargets() == 0) {
return false;
}
- if (target.canTarget(opponentId, null, game)) {
- target.add(opponentId, game);
+ if (target.canTarget(randomOpponentId, null, game)) {
+ target.add(randomOpponentId, game);
return true;
}
if (target.canTarget(abilityControllerId, null, game)) {
@@ -493,37 +475,18 @@ public class ComputerPlayer extends PlayerImpl implements Player {
if (target.getAbilityController() != null) {
abilityControllerId = target.getAbilityController();
}
- UUID opponentId = game.getOpponents(abilityControllerId).iterator().next();
+ UUID randomOpponentId = getRandomOpponent(abilityControllerId, game);
if (target instanceof TargetPlayer) {
- if (outcome.isGood()) {
- if (target.canTarget(abilityControllerId, abilityControllerId, source, game)) {
- target.addTarget(playerId, source, game);
- return true;
- }
- if (target.isRequired(source)) {
- if (target.canTarget(abilityControllerId, opponentId, source, game)) {
- target.addTarget(opponentId, source, game);
- return true;
- }
- }
- } else {
- if (target.canTarget(abilityControllerId, opponentId, source, game)) {
- target.addTarget(opponentId, source, game);
- return true;
- }
- if (target.isRequired(source)) {
- if (target.canTarget(abilityControllerId, abilityControllerId, source, game)) {
- target.addTarget(abilityControllerId, source, game);
- return true;
- }
- }
- }
- return false;
+ return setTargetPlayer(outcome, target, source, source.getSourceId(), abilityControllerId, randomOpponentId, game);
}
+
if (target instanceof TargetDiscard || target instanceof TargetCardInHand) {
if (outcome.isGood()) {
- ArrayList cardsInHand = new ArrayList<>(hand.getCards(game));
- while (!target.isChosen() && !cardsInHand.isEmpty() && target.getMaxNumberOfTargets() > target.getTargets().size()) {
+ Cards cards = new CardsImpl(target.possibleTargets(source.getSourceId(), getId(), game));
+ ArrayList cardsInHand = new ArrayList<>(cards.getCards(game));
+ while (!target.isChosen()
+ && target.possibleTargets(source.getSourceId(), getId(), game).size() > 0
+ && target.getMaxNumberOfTargets() > target.getTargets().size()) {
Card card = pickBestCard(cardsInHand, null, target, source, game);
if (card != null) {
if (target.canTarget(getId(), card.getId(), source, game)) {
@@ -583,7 +546,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
if (outcome.isGood()) {
targets = threats(abilityControllerId, source == null ? null : source.getSourceId(), ((TargetPermanent) target).getFilter(), game, target.getTargets());
} else {
- targets = threats(opponentId, source == null ? null : source.getSourceId(), ((TargetPermanent) target).getFilter(), game, target.getTargets());
+ targets = threats(randomOpponentId, source == null ? null : source.getSourceId(), ((TargetPermanent) target).getFilter(), game, target.getTargets());
}
if (targets.isEmpty() && target.isRequired(source)) {
targets = threats(null, source == null ? null : source.getSourceId(), ((TargetPermanent) target).getFilter(), game, target.getTargets());
@@ -607,7 +570,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
if (outcome.isGood()) {
targets = threats(abilityControllerId, source.getSourceId(), ((FilterCreatureOrPlayer) t.getFilter()).getCreatureFilter(), game, target.getTargets());
} else {
- targets = threats(opponentId, source.getSourceId(), ((FilterCreatureOrPlayer) t.getFilter()).getCreatureFilter(), game, target.getTargets());
+ targets = threats(randomOpponentId, source.getSourceId(), ((FilterCreatureOrPlayer) t.getFilter()).getCreatureFilter(), game, target.getTargets());
}
if (targets.isEmpty()) {
@@ -617,8 +580,8 @@ public class ComputerPlayer extends PlayerImpl implements Player {
return true;
}
} else {
- if (target.canTarget(getId(), opponentId, source, game)) {
- target.addTarget(opponentId, source, game);
+ if (target.canTarget(getId(), randomOpponentId, source, game)) {
+ target.addTarget(randomOpponentId, source, game);
return true;
}
}
@@ -643,8 +606,8 @@ public class ComputerPlayer extends PlayerImpl implements Player {
return true;
}
} else {
- if (target.canTarget(getId(), opponentId, source, game)) {
- target.addTarget(opponentId, source, game);
+ if (target.canTarget(getId(), randomOpponentId, source, game)) {
+ target.addTarget(randomOpponentId, source, game);
return true;
}
}
@@ -684,17 +647,6 @@ public class ComputerPlayer extends PlayerImpl implements Player {
}
return target.isChosen();
}
- if (target instanceof TargetCardInHand) {
- List cards = new ArrayList<>();
- cards.addAll(this.hand.getCards(game));
- while (!target.isChosen() && !cards.isEmpty()) {
- Card pick = pickTarget(cards, outcome, target, source, game);
- if (pick != null) {
- target.addTarget(pick.getId(), source, game);
- }
- }
- return target.isChosen();
- }
if (target instanceof TargetSpell) {
if (game.getStack().size() > 0) {
Iterator it = game.getStack().iterator();
@@ -709,21 +661,21 @@ public class ComputerPlayer extends PlayerImpl implements Player {
return false;
}
if (target instanceof TargetSpellOrPermanent) {
+ // TODO: Also check if a spell should be selected
List targets;
boolean outcomeTargets = true;
if (outcome.isGood()) {
targets = threats(abilityControllerId, source == null ? null : source.getSourceId(), ((TargetSpellOrPermanent) target).getPermanentFilter(), game, target.getTargets());
} else {
- targets = threats(opponentId, source == null ? null : source.getSourceId(), ((TargetSpellOrPermanent) target).getPermanentFilter(), game, target.getTargets());
+ targets = threats(randomOpponentId, source == null ? null : source.getSourceId(), ((TargetSpellOrPermanent) target).getPermanentFilter(), game, target.getTargets());
}
if (targets.isEmpty() && target.isRequired(source)) {
targets = threats(null, source == null ? null : source.getSourceId(), ((TargetSpellOrPermanent) target).getPermanentFilter(), game, target.getTargets());
Collections.reverse(targets);
outcomeTargets = false;
- //targets = game.getBattlefield().getActivePermanents(((TargetPermanent)target).getFilter(), playerId, game);
}
for (Permanent permanent : targets) {
- if (((TargetPermanent) target).canTarget(abilityControllerId, permanent.getId(), source, game)) {
+ if (((TargetSpellOrPermanent) target).canTarget(abilityControllerId, permanent.getId(), source, game)) {
target.addTarget(permanent.getId(), source, game);
if (!outcomeTargets || target.getMaxNumberOfTargets() <= target.getTargets().size()) {
return true;
@@ -763,7 +715,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
if (target instanceof TargetDefender) {
// TODO: Improve, now planeswalker is always chosen if it exits
List targets;
- targets = game.getBattlefield().getActivePermanents(new FilterPlaneswalkerPermanent(), opponentId, game);
+ targets = game.getBattlefield().getActivePermanents(new FilterPlaneswalkerPermanent(), randomOpponentId, game);
if (targets != null && !targets.isEmpty()) {
for (Permanent planeswalker : targets) {
if (target.canTarget(getId(), planeswalker.getId(), source, game)) {
@@ -775,8 +727,8 @@ public class ComputerPlayer extends PlayerImpl implements Player {
}
}
if (!target.isChosen()) {
- if (target.canTarget(getId(), opponentId, source, game)) {
- target.addTarget(opponentId, source, game);
+ if (target.canTarget(getId(), randomOpponentId, source, game)) {
+ target.addTarget(randomOpponentId, source, game);
}
}
return target.isChosen();
@@ -999,7 +951,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
}
while (lands.size() > 0 && this.canPlayLand()) {
if (lands.size() == 1) {
- this.playLand(lands.iterator().next(), game);
+ this.playLand(lands.iterator().next(), game, false);
} else {
playALand(lands, game);
}
@@ -1014,7 +966,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
for (ManaAbility ability : card.getAbilities().getManaAbilities(Zone.BATTLEFIELD)) {
for (Mana netMana : ability.getNetMana(game)) {
if (netMana.enough(mana)) {
- this.playLand(card, game);
+ this.playLand(card, game, false);
lands.remove(card);
return;
}
@@ -1028,7 +980,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
for (ManaAbility ability : card.getAbilities().getManaAbilities(Zone.BATTLEFIELD)) {
for (Mana netMana : ability.getNetMana(game)) {
if (mana.contains(netMana)) {
- this.playLand(card, game);
+ this.playLand(card, game, false);
lands.remove(card);
return;
}
@@ -1037,7 +989,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
}
}
//play first available land
- this.playLand(lands.iterator().next(), game);
+ this.playLand(lands.iterator().next(), game, false);
lands.remove(lands.iterator().next());
}
@@ -1141,7 +1093,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
protected boolean playManaHandling(Ability ability, ManaCost unpaid, Game game) {
// log.info("paying for " + unpaid.getText());
- boolean spendAnyMana = game.getContinuousEffects().asThough(ability.getSourceId(), AsThoughEffectType.SPEND_ANY_MANA, ability, ability.getControllerId(), game);
+ boolean spendAnyMana = game.getContinuousEffects().asThough(ability.getSourceId(), AsThoughEffectType.SPEND_OTHER_MANA, ability, ability.getControllerId(), game);
ManaCost cost;
List producers;
if (unpaid instanceof ManaCosts) {
@@ -1330,6 +1282,11 @@ public class ComputerPlayer extends PlayerImpl implements Player {
@Override
public boolean chooseUse(Outcome outcome, String message, Ability source, Game game) {
+ return this.chooseUse(outcome, new MessageToClient(message), source, game);
+ }
+
+ @Override
+ public boolean chooseUse(Outcome outcome, MessageToClient message, Ability source, Game game) {
log.debug("chooseUse: " + outcome.isGood());
// Be proactive! Always use abilities, the evaluation function will decide if it's good or not
// Otherwise some abilities won't be used by AI like LoseTargetEffect that has "bad" outcome
@@ -1568,9 +1525,14 @@ public class ComputerPlayer extends PlayerImpl implements Player {
return modes.getMode();
}
//TODO: improve this;
+ AvailableMode:
for (Mode mode : modes.getAvailableModes(source, game)) {
- if (!modes.getSelectedModes().contains(mode.getId()) // select only modes not already selected
- && mode.getTargets().canChoose(source.getSourceId(), source.getControllerId(), game)) { // and where targets are available
+ for (Mode selectedMode : modes.getSelectedModes()) {
+ if (selectedMode.getId().equals(mode.getId())) {
+ continue AvailableMode;
+ }
+ }
+ if (mode.getTargets().canChoose(source.getSourceId(), source.getControllerId(), game)) { // and where targets are available
return mode;
}
}
@@ -1632,42 +1594,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
private static void addBasicLands(Deck deck, String landName, int number) {
Random random = new Random();
- Set landSets = new HashSet<>();
-
- // decide from which sets basic lands are taken from
- for (String setCode : deck.getExpansionSetCodes()) {
- ExpansionInfo expansionInfo = ExpansionRepository.instance.getSetByCode(setCode);
- if (expansionInfo.hasBasicLands()) {
- landSets.add(expansionInfo.getCode());
- }
- }
-
- // if sets have no basic land, take land from block
- if (landSets.isEmpty()) {
- for (String setCode : deck.getExpansionSetCodes()) {
- ExpansionInfo expansionInfo = ExpansionRepository.instance.getSetByCode(setCode);
- List blockSets = ExpansionRepository.instance.getSetsFromBlock(expansionInfo.getBlockName());
- for (ExpansionInfo blockSet : blockSets) {
- if (blockSet.hasBasicLands()) {
- landSets.add(blockSet.getCode());
- }
- }
- }
- }
- // if still no set with lands found, take one by random
- if (landSets.isEmpty()) {
- // if sets have no basic lands and also it has no parent or parent has no lands get last set with lands
- // select a set with basic lands by random
- Random generator = new Random();
- List basicLandSets = ExpansionRepository.instance.getSetsWithBasicLandsByReleaseDate();
- if (basicLandSets.size() > 0) {
- landSets.add(basicLandSets.get(generator.nextInt(basicLandSets.size())).getCode());
- }
- }
-
- if (landSets.isEmpty()) {
- throw new IllegalArgumentException("No set with basic land was found");
- }
+ Set landSets = TournamentUtil.getLandSetCodeForDeckSets(deck.getExpansionSetCodes());
CardCriteria criteria = new CardCriteria();
if (!landSets.isEmpty()) {
@@ -2223,4 +2150,116 @@ public class ComputerPlayer extends PlayerImpl implements Player {
return new ComputerPlayer(this);
}
+ /**
+ * Sets a possible target player
+ *
+ */
+ private boolean setTargetPlayer(Outcome outcome, Target target, Ability source, UUID sourceId, UUID abilityControllerId, UUID randomOpponentId, Game game) {
+ if (target instanceof TargetOpponent) {
+ if (source == null) {
+ if (((TargetOpponent) target).canTarget(randomOpponentId, game)) {
+ target.add(randomOpponentId, game);
+ return true;
+ }
+ } else {
+ if (((TargetOpponent) target).canTarget(randomOpponentId, source, game)) {
+ target.add(randomOpponentId, game);
+ return true;
+ }
+ }
+ for (UUID currentId : game.getOpponents(abilityControllerId)) {
+ if (source == null) {
+ if (((TargetOpponent) target).canTarget(currentId, game)) {
+ target.add(currentId, game);
+ return true;
+ }
+ } else {
+ if (((TargetOpponent) target).canTarget(currentId, source, game)) {
+ target.add(currentId, game);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ if (target instanceof TargetPlayer) {
+ if (outcome.isGood()) {
+ if (source == null) {
+ if (target.canTarget(abilityControllerId, game)) {
+ target.add(abilityControllerId, game);
+ return true;
+ }
+ if (target.isRequired(sourceId, game)) {
+ if (target.canTarget(randomOpponentId, game)) {
+ target.add(randomOpponentId, game);
+ return true;
+ }
+ }
+ } else {
+ if (target.canTarget(abilityControllerId, abilityControllerId, source, game)) {
+ target.addTarget(playerId, source, game);
+ return true;
+ }
+ if (target.isRequired(sourceId, game)) {
+ if (target.canTarget(randomOpponentId, game)) {
+ target.add(randomOpponentId, game);
+ return true;
+ }
+ }
+ }
+
+ } else {
+ if (source == null) {
+ if (target.canTarget(randomOpponentId, game)) {
+ target.add(randomOpponentId, game);
+ return true;
+ }
+ if (target.isRequired(sourceId, game)) {
+ if (target.canTarget(abilityControllerId, game)) {
+ target.add(abilityControllerId, game);
+ return true;
+ }
+ }
+ } else {
+ if (target.canTarget(randomOpponentId, game)) {
+ target.add(randomOpponentId, game);
+ return true;
+ }
+ if (target.isRequired(sourceId, game)) {
+ if (target.canTarget(abilityControllerId, game)) {
+ target.add(abilityControllerId, game);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns an opponent by random
+ *
+ * @param abilityControllerId
+ * @param game
+ * @return
+ */
+ private UUID getRandomOpponent(UUID abilityControllerId, Game game) {
+ UUID randomOpponentId = game.getOpponents(abilityControllerId).iterator().next();
+ Set opponents = game.getOpponents(abilityControllerId);
+ if (opponents.size() > 1) {
+ int rand = random.nextInt(opponents.size());
+ int count = 0;
+ for (UUID currentId : opponents) {
+ if (count == rand) {
+ randomOpponentId = currentId;
+ break;
+ }
+ }
+ }
+ return randomOpponentId;
+ }
}
diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/pom.xml b/Mage.Server.Plugins/Mage.Player.AIMCTS/pom.xml
index 62c8e069013..baeab50796e 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMCTS/pom.xml
+++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-player-ai-mcts
diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java
index c620bb68407..e36bde422eb 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java
+++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java
@@ -62,7 +62,7 @@ public class ComputerPlayerMCTS extends ComputerPlayer implements Player {
protected transient MCTSNode root;
protected int maxThinkTime;
- private static final transient Logger logger = Logger.getLogger(ComputerPlayerMCTS.class);
+ private static final Logger logger = Logger.getLogger(ComputerPlayerMCTS.class);
private int poolSize;
public ComputerPlayerMCTS(String name, RangeOfInfluence range, int skill) {
diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSExecutor.java b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSExecutor.java
index 1e12abdcc7b..e46c0ed9a91 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSExecutor.java
+++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSExecutor.java
@@ -43,7 +43,7 @@ public class MCTSExecutor implements Callable {
protected UUID playerId;
protected int simCount;
- private static final transient Logger logger = Logger.getLogger(ComputerPlayerMCTS.class);
+ private static final Logger logger = Logger.getLogger(ComputerPlayerMCTS.class);
public MCTSExecutor(Game sim, UUID playerId, int thinkTime) {
this.playerId = playerId;
diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSNode.java b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSNode.java
index eacf86be8b5..f28f8683921 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSNode.java
+++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSNode.java
@@ -57,7 +57,7 @@ public class MCTSNode {
public static final boolean USE_ACTION_CACHE = false;
private static final double selectionCoefficient = Math.sqrt(2.0);
private static final double passRatioTolerance = 0.0;
- private static final transient Logger logger = Logger.getLogger(MCTSNode.class);
+ private static final Logger logger = Logger.getLogger(MCTSNode.class);
private int visits = 0;
private int wins = 0;
diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSPlayer.java b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSPlayer.java
index e653bc80db8..9c2769eb1dc 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSPlayer.java
+++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSPlayer.java
@@ -45,7 +45,7 @@ import java.util.UUID;
*/
public class MCTSPlayer extends ComputerPlayer {
- private static final transient Logger logger = Logger.getLogger(MCTSPlayer.class);
+ private static final Logger logger = Logger.getLogger(MCTSPlayer.class);
protected PassAbility pass = new PassAbility();
diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/SimulatedPlayerMCTS.java b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/SimulatedPlayerMCTS.java
index 94633b9f034..6e0ffde4447 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/SimulatedPlayerMCTS.java
+++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/SimulatedPlayerMCTS.java
@@ -66,7 +66,7 @@ public class SimulatedPlayerMCTS extends MCTSPlayer {
private boolean isSimulatedPlayer;
private static Random rnd = new Random();
private int actionCount = 0;
- private static final transient Logger logger = Logger.getLogger(SimulatedPlayerMCTS.class);
+ private static final Logger logger = Logger.getLogger(SimulatedPlayerMCTS.class);
public SimulatedPlayerMCTS(UUID id, boolean isSimulatedPlayer) {
super(id);
diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/pom.xml b/Mage.Server.Plugins/Mage.Player.AIMinimax/pom.xml
index 696f0b3043f..31d417e4151 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMinimax/pom.xml
+++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-player-aiminimax
diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java
index 496bf0a47af..bc43063666e 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java
+++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java
@@ -60,8 +60,8 @@ import java.util.concurrent.*;
*/
public class ComputerPlayer2 extends ComputerPlayer implements Player {
- private static final transient Logger logger = Logger.getLogger(ComputerPlayer2.class);
- private static final transient ExecutorService pool = Executors.newFixedThreadPool(1);
+ private static final Logger logger = Logger.getLogger(ComputerPlayer2.class);
+ private static final ExecutorService pool = Executors.newFixedThreadPool(1);
protected int maxDepth;
protected int maxNodes;
diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer3.java b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer3.java
index 8b2d9cfaf17..c01bed8a68e 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer3.java
+++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer3.java
@@ -49,7 +49,7 @@ import java.util.UUID;
*/
public class ComputerPlayer3 extends ComputerPlayer2 implements Player {
- private static final transient Logger logger = Logger.getLogger(ComputerPlayer3.class);
+ private static final Logger logger = Logger.getLogger(ComputerPlayer3.class);
public ComputerPlayer3(String name, RangeOfInfluence range, int skill) {
super(name, range, skill);
diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/GameStateEvaluator.java b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/GameStateEvaluator.java
index 920b00d2520..16e131031eb 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/GameStateEvaluator.java
+++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/GameStateEvaluator.java
@@ -53,7 +53,7 @@ import org.apache.log4j.Logger;
*/
public class GameStateEvaluator {
- private static final transient Logger logger = Logger.getLogger(GameStateEvaluator.class);
+ private static final Logger logger = Logger.getLogger(GameStateEvaluator.class);
private static final int LIFE_FACTOR = Config.evaluatorLifeFactor;
private static final int PERMANENT_FACTOR = Config.evaluatorPermanentFactor;
diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/SimulateBlockWorker.java b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/SimulateBlockWorker.java
index 10f315c56d7..97dc7bf9da4 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/SimulateBlockWorker.java
+++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/SimulateBlockWorker.java
@@ -28,10 +28,9 @@
package mage.player.ai;
+import org.apache.log4j.Logger;
+
import java.util.concurrent.Callable;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import mage.util.Logging;
/**
*
@@ -39,7 +38,7 @@ import mage.util.Logging;
*/
public class SimulateBlockWorker implements Callable {
- private static final Logger logger = Logging.getLogger(SimulationWorker.class.getName());
+ private static final Logger logger = Logger.getLogger(SimulationWorker.class);
private SimulationNode node;
private ComputerPlayer3 player;
@@ -54,7 +53,7 @@ public class SimulateBlockWorker implements Callable {
try {
// player.simulateBlock(node);
} catch (Exception ex) {
- logger.log(Level.SEVERE, null, ex);
+ logger.error(null, ex);
}
return null;
}
diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/SimulatedPlayer.java b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/SimulatedPlayer.java
index a43eddaa763..a7547ce9649 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/SimulatedPlayer.java
+++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/SimulatedPlayer.java
@@ -51,7 +51,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
*/
public class SimulatedPlayer extends ComputerPlayer {
- private static final transient Logger logger = Logger.getLogger(SimulatedPlayer.class);
+ private static final Logger logger = Logger.getLogger(SimulatedPlayer.class);
private boolean isSimulatedPlayer;
private transient ConcurrentLinkedQueue allActions;
private static PassAbility pass = new PassAbility();
diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/SimulationWorker.java b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/SimulationWorker.java
index 2d185c8096b..41ef901f423 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/SimulationWorker.java
+++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/SimulationWorker.java
@@ -29,11 +29,9 @@
package mage.player.ai;
import java.util.concurrent.Callable;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import mage.abilities.Ability;
import mage.game.Game;
-import mage.util.Logging;
+import org.apache.log4j.Logger;
/**
*
@@ -41,7 +39,7 @@ import mage.util.Logging;
*/
public class SimulationWorker implements Callable {
- private static final Logger logger = Logging.getLogger(SimulationWorker.class.getName());
+ private static final Logger logger = Logger.getLogger(SimulationWorker.class);
private Game game;
private SimulatedAction previousActions;
@@ -60,7 +58,7 @@ public class SimulationWorker implements Callable {
try {
// player.simulateAction(game, previousActions, action);
} catch (Exception ex) {
- logger.log(Level.SEVERE, null, ex);
+ logger.error(null, ex);
}
return null;
}
diff --git a/Mage.Server.Plugins/Mage.Player.Human/pom.xml b/Mage.Server.Plugins/Mage.Player.Human/pom.xml
index 28493362e66..a8440a72de3 100644
--- a/Mage.Server.Plugins/Mage.Player.Human/pom.xml
+++ b/Mage.Server.Plugins/Mage.Player.Human/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-player-human
diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java
index 2ed5be13a9f..ee62a58f33d 100644
--- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java
+++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java
@@ -47,6 +47,7 @@ import mage.abilities.SpellAbility;
import mage.abilities.TriggeredAbility;
import mage.abilities.costs.VariableCost;
import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.costs.mana.PhyrexianManaCost;
@@ -63,6 +64,17 @@ import mage.constants.ManaType;
import mage.constants.Outcome;
import mage.constants.PhaseStep;
import mage.constants.PlayerAction;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_ID_NO;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_ID_YES;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_RESET_ALL;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_TEXT_NO;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_TEXT_YES;
+import static mage.constants.PlayerAction.RESET_AUTO_SELECT_REPLACEMENT_EFFECTS;
+import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_ABILITY_FIRST;
+import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_ABILITY_LAST;
+import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_NAME_FIRST;
+import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_NAME_LAST;
+import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_RESET_ALL;
import mage.constants.RangeOfInfluence;
import mage.constants.Zone;
import mage.filter.common.FilterAttackingCreature;
@@ -88,6 +100,7 @@ import mage.target.common.TargetCreatureOrPlayer;
import mage.target.common.TargetDefender;
import mage.util.GameLog;
import mage.util.ManaUtil;
+import mage.util.MessageToClient;
import org.apache.log4j.Logger;
/**
@@ -104,11 +117,19 @@ public class HumanPlayer extends PlayerImpl {
protected static FilterBlockingCreature filterBlock = new FilterBlockingCreature();
protected final Choice replacementEffectChoice;
- private static final Logger log = Logger.getLogger(HumanPlayer.class);
+ private static final Logger logger = Logger.getLogger(HumanPlayer.class);
protected HashSet autoSelectReplacementEffects = new HashSet<>();
protected ManaCost currentlyUnpaidMana;
+ protected Set triggerAutoOrderAbilityFirst = new HashSet<>();
+ protected Set triggerAutoOrderAbilityLast = new HashSet<>();
+ protected Set triggerAutoOrderNameFirst = new HashSet<>();
+ protected Set triggerAutoOrderNameLast = new HashSet<>();
+
+ protected Map requestAutoAnswerId = new HashMap<>();
+ protected Map requestAutoAnswerText = new HashMap<>();
+
public HumanPlayer(String name, RangeOfInfluence range, int skill) {
super(name, range);
replacementEffectChoice = new ChoiceImpl(true);
@@ -125,53 +146,30 @@ public class HumanPlayer extends PlayerImpl {
protected void waitForResponse(Game game) {
response.clear();
- log.debug("Waiting response from player: " + getId());
+ logger.debug("Waiting response from player: " + getId());
game.resumeTimer(getTurnControlledBy());
synchronized (response) {
try {
response.wait();
- log.debug("Got response from player: " + getId());
+ logger.debug("Got response from player: " + getId());
} catch (InterruptedException ex) {
- ex.printStackTrace();
+ logger.error("Response error for player " + getName() + " gameId: " + game.getId(), ex);
} finally {
game.pauseTimer(getTurnControlledBy());
}
}
}
- protected void waitForBooleanResponse(Game game) {
- do {
- waitForResponse(game);
- } while (response.getBoolean() == null && !abort);
- }
-
- protected void waitForUUIDResponse(Game game) {
- do {
- waitForResponse(game);
- } while (response.getUUID() == null && !abort);
- }
-
- protected void waitForStringResponse(Game game) {
- do {
- waitForResponse(game);
- } while (response.getString() == null && !abort);
- }
-
- protected void waitForIntegerResponse(Game game) {
- do {
- waitForResponse(game);
- } while (response.getInteger() == null && !abort);
- }
-
@Override
public boolean chooseMulligan(Game game) {
updateGameStatePriority("chooseMulligan", game);
int nextHandSize = game.mulliganDownTo(playerId);
- game.fireAskPlayerEvent(playerId, new StringBuilder("Mulligan ")
- .append(getHand().size() > nextHandSize ? "down to " : "for free, draw ")
- .append(nextHandSize)
- .append(nextHandSize == 1 ? " card?" : " cards?").toString());
- waitForBooleanResponse(game);
+ do {
+ game.fireAskPlayerEvent(playerId, new MessageToClient("Mulligan "
+ + (getHand().size() > nextHandSize ? "down to " : "for free, draw ")
+ + nextHandSize + (nextHandSize == 1 ? " card?" : " cards?")), null);
+ waitForResponse(game);
+ } while (response.getBoolean() == null && !abort);
if (!abort) {
return response.getBoolean();
}
@@ -180,15 +178,51 @@ public class HumanPlayer extends PlayerImpl {
@Override
public boolean chooseUse(Outcome outcome, String message, Ability source, Game game) {
+ return this.chooseUse(outcome, new MessageToClient(message), source, game);
+ }
+
+ @Override
+ public boolean chooseUse(Outcome outcome, MessageToClient message, Ability source, Game game) {
+ if (source != null) {
+ Boolean answer = requestAutoAnswerId.get(source.getOriginalId() + "#" + message.getMessage());
+ if (answer != null) {
+ return answer;
+ } else {
+ answer = requestAutoAnswerText.get(message.getMessage());
+ if (answer != null) {
+ return answer;
+ }
+ }
+ }
updateGameStatePriority("chooseUse", game);
- game.fireAskPlayerEvent(playerId, addSecondLineWithObjectName(message, source == null ? null : source.getSourceId(), game));
- waitForBooleanResponse(game);
+ do {
+ if (message.getSecondMessage() == null) {
+ message.setSecondMessage(getRelatedObjectName(source, game));
+ }
+ game.fireAskPlayerEvent(playerId, message, source);
+ waitForResponse(game);
+ } while (response.getBoolean() == null && !abort);
if (!abort) {
return response.getBoolean();
}
return false;
}
+ private String getRelatedObjectName(Ability source, Game game) {
+ if (source != null) {
+ return getRelatedObjectName(source.getSourceId(), game);
+ }
+ return null;
+ }
+
+ private String getRelatedObjectName(UUID sourceId, Game game) {
+ MageObject mageObject = game.getObject(sourceId);
+ if (mageObject != null) {
+ return mageObject.getLogName();
+ }
+ return null;
+ }
+
private String addSecondLineWithObjectName(String message, UUID sourceId, Game game) {
if (sourceId != null) {
MageObject mageObject = game.getPermanent(sourceId);
@@ -226,7 +260,7 @@ public class HumanPlayer extends PlayerImpl {
while (!abort) {
game.fireChooseChoiceEvent(playerId, replacementEffectChoice);
waitForResponse(game);
- log.debug("Choose effect: " + response.getString());
+ logger.debug("Choose effect: " + response.getString());
if (response.getString() != null) {
if (response.getString().startsWith("#")) {
autoSelectReplacementEffects.add(response.getString().substring(1));
@@ -298,7 +332,7 @@ public class HumanPlayer extends PlayerImpl {
List chosen = target.getTargets();
options.put("chosen", (Serializable) chosen);
- game.fireSelectTargetEvent(getId(), addSecondLineWithObjectName(target.getMessage(), sourceId, game), targetIds, required, getOptions(target, options));
+ game.fireSelectTargetEvent(getId(), new MessageToClient(target.getMessage(), getRelatedObjectName(sourceId, game)), targetIds, required, getOptions(target, options));
waitForResponse(game);
if (response.getUUID() != null) {
if (!targetIds.contains(response.getUUID())) {
@@ -359,12 +393,12 @@ public class HumanPlayer extends PlayerImpl {
}
while (!abort) {
Set possibleTargets = target.possibleTargets(source == null ? null : source.getSourceId(), abilityControllerId, game);
- boolean required = target.isRequired(source);
+ boolean required = target.isRequired(source != null ? source.getSourceId() : null, game);
if (possibleTargets.isEmpty() || target.getTargets().size() >= target.getNumberOfTargets()) {
required = false;
}
- game.fireSelectTargetEvent(getId(), addSecondLineWithObjectName(target.getMessage(), source == null ? null : source.getSourceId(), game), possibleTargets, required, getOptions(target, null));
+ game.fireSelectTargetEvent(getId(), new MessageToClient(target.getMessage(), getRelatedObjectName(source, game)), possibleTargets, required, getOptions(target, null));
waitForResponse(game);
if (response.getUUID() != null) {
if (target.getTargets().contains(response.getUUID())) {
@@ -432,7 +466,7 @@ public class HumanPlayer extends PlayerImpl {
options.put("choosable", (Serializable) choosable);
}
- game.fireSelectTargetEvent(playerId, target.getMessage(), cards, required, options);
+ game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage()), cards, required, options);
waitForResponse(game);
if (response.getUUID() != null) {
if (target.canTarget(response.getUUID(), cards, game)) {
@@ -461,7 +495,12 @@ public class HumanPlayer extends PlayerImpl {
public boolean chooseTarget(Outcome outcome, Cards cards, TargetCard target, Ability source, Game game) {
updateGameStatePriority("chooseTarget(5)", game);
while (!abort) {
- boolean required = target.isRequired(source);
+ boolean required;
+ if (target.isRequiredExplicitlySet()) {
+ required = target.isRequired();
+ } else {
+ required = target.isRequired(source);
+ }
// if there is no cards to select from, then add possibility to cancel choosing action
if (cards == null) {
required = false;
@@ -486,7 +525,7 @@ public class HumanPlayer extends PlayerImpl {
if (!choosable.isEmpty()) {
options.put("choosable", (Serializable) choosable);
}
- game.fireSelectTargetEvent(playerId, addSecondLineWithObjectName(target.getMessage(), source == null ? null : source.getSourceId(), game), cards, required, options);
+ game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage(), getRelatedObjectName(source, game)), cards, required, options);
waitForResponse(game);
if (response.getUUID() != null) {
if (target.getTargets().contains(response.getUUID())) { // if already included remove it
@@ -515,7 +554,7 @@ public class HumanPlayer extends PlayerImpl {
public boolean chooseTargetAmount(Outcome outcome, TargetAmount target, Ability source, Game game) {
updateGameStatePriority("chooseTargetAmount", game);
while (!abort) {
- game.fireSelectTargetEvent(playerId, addSecondLineWithObjectName(target.getMessage() + "\n Amount remaining:" + target.getAmountRemaining(), source == null ? null : source.getSourceId(), game),
+ game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage() + "\n Amount remaining:" + target.getAmountRemaining(), getRelatedObjectName(source, game)),
target.possibleTargets(source == null ? null : source.getSourceId(), playerId, game),
target.isRequired(source),
getOptions(target, null));
@@ -538,6 +577,18 @@ public class HumanPlayer extends PlayerImpl {
public boolean priority(Game game) {
passed = false;
if (!abort) {
+ if (getJustActivatedType() != null) {
+ if (userData.isPassPriorityCast() && getJustActivatedType().equals(AbilityType.SPELL)) {
+ setJustActivatedType(null);
+ pass(game);
+ return false;
+ }
+ if (userData.isPassPriorityActivation() && getJustActivatedType().equals(AbilityType.ACTIVATED)) {
+ setJustActivatedType(null);
+ pass(game);
+ return false;
+ }
+ }
if (passedAllTurns) {
if (passWithManaPoolCheck(game)) {
return false;
@@ -629,21 +680,23 @@ public class HumanPlayer extends PlayerImpl {
if (object != null) {
Zone zone = game.getState().getZone(object.getId());
if (zone != null) {
- if (object instanceof Card && ((Card) object).isFaceDown(game)) {
- revealFaceDownCard((Card) object, game);
+ if (object instanceof Card
+ && ((Card) object).isFaceDown(game)
+ && lookAtFaceDownCard((Card) object, game)) {
result = true;
- }
- Player actingPlayer = null;
- if (game.getPriorityPlayerId().equals(playerId)) {
- actingPlayer = this;
- } else if (getPlayersUnderYourControl().contains(game.getPriorityPlayerId())) {
- actingPlayer = game.getPlayer(game.getPriorityPlayerId());
- }
- if (actingPlayer != null) {
- LinkedHashMap useableAbilities = actingPlayer.getUseableActivatedAbilities(object, zone, game);
- if (useableAbilities != null && useableAbilities.size() > 0) {
- activateAbility(useableAbilities, object, game);
- result = true;
+ } else {
+ Player actingPlayer = null;
+ if (game.getPriorityPlayerId().equals(playerId)) {
+ actingPlayer = this;
+ } else if (getPlayersUnderYourControl().contains(game.getPriorityPlayerId())) {
+ actingPlayer = game.getPlayer(game.getPriorityPlayerId());
+ }
+ if (actingPlayer != null) {
+ LinkedHashMap useableAbilities = actingPlayer.getUseableActivatedAbilities(object, zone, game);
+ if (useableAbilities != null && useableAbilities.size() > 0) {
+ activateAbility(useableAbilities, object, game);
+ result = true;
+ }
}
}
}
@@ -667,12 +720,49 @@ public class HumanPlayer extends PlayerImpl {
@Override
public TriggeredAbility chooseTriggeredAbility(List abilities, Game game) {
- updateGameStatePriority("chooseTriggeredAbility", game);
+ String autoOrderRuleText = null;
+ boolean autoOrderUse = getUserData().isAutoOrderTrigger();
while (!abort) {
- game.fireSelectTargetEvent(playerId, "Pick triggered ability (goes to the stack first)", abilities);
+ // try to set trigger auto order
+ List abilitiesWithNoOrderSet = new ArrayList<>();
+ TriggeredAbility abilityOrderLast = null;
+ for (TriggeredAbility ability : abilities) {
+ if (triggerAutoOrderAbilityFirst.contains(ability.getOriginalId())) {
+ return ability;
+ }
+ MageObject object = game.getObject(ability.getSourceId());
+ String rule = ability.getRule(object != null ? object.getName() : null);
+ if (triggerAutoOrderNameFirst.contains(rule)) {
+ return ability;
+ }
+ if (triggerAutoOrderAbilityLast.contains(ability.getOriginalId())) {
+ abilityOrderLast = ability;
+ continue;
+ }
+ if (triggerAutoOrderNameLast.contains(rule)) {
+ abilityOrderLast = ability;
+ continue;
+ }
+ if (autoOrderUse) {
+ if (autoOrderRuleText == null) {
+ autoOrderRuleText = rule;
+ } else if (!rule.equals(autoOrderRuleText)) {
+ autoOrderUse = false;
+ }
+ }
+ abilitiesWithNoOrderSet.add(ability);
+ }
+ if (abilitiesWithNoOrderSet.isEmpty()) {
+ return abilityOrderLast;
+ }
+ if (abilitiesWithNoOrderSet.size() == 1 || autoOrderUse) {
+ return abilitiesWithNoOrderSet.iterator().next();
+ }
+ updateGameStatePriority("chooseTriggeredAbility", game);
+ game.fireSelectTargetTriggeredAbilityEvent(playerId, "Pick triggered ability (goes to the stack first)", abilitiesWithNoOrderSet);
waitForResponse(game);
if (response.getUUID() != null) {
- for (TriggeredAbility ability : abilities) {
+ for (TriggeredAbility ability : abilitiesWithNoOrderSet) {
if (ability.getId().equals(response.getUUID())) {
return ability;
}
@@ -709,6 +799,7 @@ public class HumanPlayer extends PlayerImpl {
if (unpaid instanceof ManaCostsImpl) {
specialManaAction(unpaid, game);
// TODO: delve or convoke cards with PhyrexianManaCost won't work together (this combinaton does not exist yet)
+ @SuppressWarnings("unchecked")
ManaCostsImpl costs = (ManaCostsImpl) unpaid;
for (ManaCost cost : costs.getUnpaid()) {
if (cost instanceof PhyrexianManaCost) {
@@ -744,8 +835,10 @@ public class HumanPlayer extends PlayerImpl {
public int announceXMana(int min, int max, String message, Game game, Ability ability) {
int xValue = 0;
updateGameStatePriority("announceXMana", game);
- game.fireGetAmountEvent(playerId, message, min, max);
- waitForIntegerResponse(game);
+ do {
+ game.fireGetAmountEvent(playerId, message, min, max);
+ waitForResponse(game);
+ } while (response.getInteger() == null && !abort);
if (response != null && response.getInteger() != null) {
xValue = response.getInteger();
}
@@ -756,8 +849,10 @@ public class HumanPlayer extends PlayerImpl {
public int announceXCost(int min, int max, String message, Game game, Ability ability, VariableCost variableCost) {
int xValue = 0;
updateGameStatePriority("announceXCost", game);
- game.fireGetAmountEvent(playerId, message, min, max);
- waitForIntegerResponse(game);
+ do {
+ game.fireGetAmountEvent(playerId, message, min, max);
+ waitForResponse(game);
+ } while (response.getInteger() == null && !abort);
if (response != null && response.getInteger() != null) {
xValue = response.getInteger();
}
@@ -821,6 +916,15 @@ public class HumanPlayer extends PlayerImpl {
attackedDefender, attacker.getId(), attacker.getControllerId()), game)) {
continue;
}
+ // if attacker needs a specific defender to attack so select that one instead
+ if (game.getCombat().getCreaturesForcedToAttack().containsKey(attacker.getId())) {
+ Set possibleDefenders = game.getCombat().getCreaturesForcedToAttack().get(attacker.getId());
+ if (!possibleDefenders.isEmpty() && !possibleDefenders.contains(attackedDefender)) {
+ declareAttacker(attacker.getId(), possibleDefenders.iterator().next(), game, false);
+ continue;
+ }
+ }
+ // attack selected default defender
declareAttacker(attacker.getId(), attackedDefender, game, false);
}
} else if (response.getBoolean() != null) {
@@ -842,14 +946,18 @@ public class HumanPlayer extends PlayerImpl {
} else {
Permanent creature = game.getPermanent(creatureId);
if (creature != null) {
- sb.append(creature.getName()).append(" ");
+ sb.append(creature.getIdName()).append(" ");
}
}
}
if (game.getCombat().getMaxAttackers() > forcedAttackers) {
- game.informPlayer(this, sb.insert(0, " more attacker(s) that are forced to attack.\nCreatures forced to attack: ")
- .insert(0, Math.min(game.getCombat().getMaxAttackers() - forcedAttackers, game.getCombat().getCreaturesForcedToAttack().size() - forcedAttackers))
+ int requireToAttack = Math.min(game.getCombat().getMaxAttackers() - forcedAttackers, game.getCombat().getCreaturesForcedToAttack().size() - forcedAttackers);
+ String message = (requireToAttack == 1 ? " more attacker that is " : " more attackers that are ")
+ + "forced to attack.\nCreature"
+ + (requireToAttack == 1 ? "" : "s") + " forced to attack: ";
+ game.informPlayer(this, sb.insert(0, message)
+ .insert(0, requireToAttack)
.insert(0, "You have to attack with ").toString());
continue;
}
@@ -905,7 +1013,7 @@ public class HumanPlayer extends PlayerImpl {
possibleDefender = defenders;
}
if (possibleDefender.size() == 1) {
- declareAttacker(attackerId, defenders.iterator().next(), game, true);
+ declareAttacker(attackerId, possibleDefender.iterator().next(), game, true);
return true;
} else {
TargetDefender target = new TargetDefender(possibleDefender, attackerId);
@@ -1008,7 +1116,8 @@ public class HumanPlayer extends PlayerImpl {
protected void selectCombatGroup(UUID defenderId, UUID blockerId, Game game) {
updateGameStatePriority("selectCombatGroup", game);
TargetAttackingCreature target = new TargetAttackingCreature();
- game.fireSelectTargetEvent(playerId, addSecondLineWithObjectName("Select attacker to block", blockerId, game), target.possibleTargets(null, playerId, game), false, getOptions(target, null));
+ game.fireSelectTargetEvent(playerId, new MessageToClient("Select attacker to block", getRelatedObjectName(blockerId, game)),
+ target.possibleTargets(null, playerId, game), false, getOptions(target, null));
waitForResponse(game);
if (response.getBoolean() != null) {
// do nothing
@@ -1031,6 +1140,7 @@ public class HumanPlayer extends PlayerImpl {
int remainingDamage = damage;
while (remainingDamage > 0 && canRespond()) {
Target target = new TargetCreatureOrPlayer();
+ target.setNotTarget(true);
if (singleTargetName != null) {
target.setTargetName(singleTargetName);
}
@@ -1055,8 +1165,10 @@ public class HumanPlayer extends PlayerImpl {
@Override
public int getAmount(int min, int max, String message, Game game) {
updateGameStatePriority("getAmount", game);
- game.fireGetAmountEvent(playerId, message, min, max);
- waitForIntegerResponse(game);
+ do {
+ game.fireGetAmountEvent(playerId, message, min, max);
+ waitForResponse(game);
+ } while (response.getInteger() == null && !abort);
if (response != null && response.getInteger() != null) {
return response.getInteger();
} else {
@@ -1121,7 +1233,9 @@ public class HumanPlayer extends PlayerImpl {
updateGameStatePriority("activateAbility", game);
if (abilities.size() == 1 && suppressAbilityPicker(abilities.values().iterator().next())) {
ActivatedAbility ability = abilities.values().iterator().next();
- if (ability.getTargets().size() != 0 || !(ability.getCosts().size() == 1 && ability.getCosts().get(0) instanceof SacrificeSourceCost)) {
+ if (ability.getTargets().size() != 0
+ || !(ability.getCosts().size() == 1 && ability.getCosts().get(0) instanceof SacrificeSourceCost)
+ || !(ability.getCosts().size() == 2 && ability.getCosts().get(0) instanceof TapSourceCost && ability.getCosts().get(0) instanceof SacrificeSourceCost)) {
activateAbility(ability, game);
return;
}
@@ -1143,11 +1257,7 @@ public class HumanPlayer extends PlayerImpl {
if (!ability.getSourceId().equals(getCastSourceIdWithAlternateMana()) && ability.getManaCostsToPay().convertedManaCost() > 0) {
return true;
}
- if (ability instanceof ManaAbility) {
- return true;
- }
- // if ability has no mana costs you have to pick it from ability picker
- return false;
+ return ability instanceof ManaAbility;
}
return true;
}
@@ -1184,12 +1294,27 @@ public class HumanPlayer extends PlayerImpl {
if (modes.size() > 1) {
MageObject obj = game.getObject(source.getSourceId());
Map modeMap = new LinkedHashMap<>();
+ AvailableModes:
for (Mode mode : modes.getAvailableModes(source, game)) {
- if (!modes.getSelectedModes().contains(mode.getId()) // show only modes not already selected
- && mode.getTargets().canChoose(source.getSourceId(), source.getControllerId(), game)) { // and where targets are available
+ int timesSelected = 0;
+ for (Mode selectedMode : modes.getSelectedModes()) {
+ if (mode.getId().equals(selectedMode.getId())) {
+ if (modes.isEachModeMoreThanOnce()) {
+ timesSelected++;
+ } else {
+ continue AvailableModes;
+ }
+ }
+ }
+ if (mode.getTargets().canChoose(source.getSourceId(), source.getControllerId(), game)) { // and needed targets have to be available
String modeText = mode.getEffects().getText(mode);
if (obj != null) {
- modeText = modeText.replace("{source}", obj.getName());
+ modeText = modeText.replace("{source}", obj.getName()).replace("{this}", obj.getName());
+ }
+ if (modes.isEachModeMoreThanOnce()) {
+ if (timesSelected > 0) {
+ modeText = "(selected " + timesSelected + "x) " + modeText;
+ }
}
modeMap.put(mode.getId(), modeText);
}
@@ -1216,14 +1341,17 @@ public class HumanPlayer extends PlayerImpl {
}
return null;
}
+
return modes.getMode();
}
@Override
public boolean choosePile(Outcome outcome, String message, List extends Card> pile1, List extends Card> pile2, Game game) {
updateGameStatePriority("choosePile", game);
- game.fireChoosePileEvent(playerId, message, pile1, pile2);
- waitForBooleanResponse(game);
+ do {
+ game.fireChoosePileEvent(playerId, message, pile1, pile2);
+ waitForResponse(game);
+ } while (response.getBoolean() == null && !abort);
if (!abort) {
return response.getBoolean();
}
@@ -1235,7 +1363,7 @@ public class HumanPlayer extends PlayerImpl {
synchronized (response) {
response.setString(responseString);
response.notify();
- log.debug("Got response string from player: " + getId());
+ logger.debug("Got response string from player: " + getId());
}
}
@@ -1245,7 +1373,7 @@ public class HumanPlayer extends PlayerImpl {
response.setManaType(manaType);
response.setResponseManaTypePlayerId(manaTypePlayerId);
response.notify();
- log.debug("Got response mana type from player: " + getId());
+ logger.debug("Got response mana type from player: " + getId());
}
}
@@ -1254,7 +1382,7 @@ public class HumanPlayer extends PlayerImpl {
synchronized (response) {
response.setUUID(responseUUID);
response.notify();
- log.debug("Got response UUID from player: " + getId());
+ logger.debug("Got response UUID from player: " + getId());
}
}
@@ -1263,7 +1391,7 @@ public class HumanPlayer extends PlayerImpl {
synchronized (response) {
response.setBoolean(responseBoolean);
response.notify();
- log.debug("Got response boolean from player: " + getId());
+ logger.debug("Got response boolean from player: " + getId());
}
}
@@ -1272,7 +1400,7 @@ public class HumanPlayer extends PlayerImpl {
synchronized (response) {
response.setInteger(responseInteger);
response.notify();
- log.debug("Got response integer from player: " + getId());
+ logger.debug("Got response integer from player: " + getId());
}
}
@@ -1281,7 +1409,7 @@ public class HumanPlayer extends PlayerImpl {
abort = true;
synchronized (response) {
response.notify();
- log.debug("Got cancel action from player: " + getId());
+ logger.debug("Got cancel action from player: " + getId());
}
}
@@ -1290,7 +1418,7 @@ public class HumanPlayer extends PlayerImpl {
synchronized (response) {
response.setInteger(0);
response.notify();
- log.debug("Got skip action from player: " + getId());
+ logger.debug("Got skip action from player: " + getId());
}
}
@@ -1301,17 +1429,98 @@ public class HumanPlayer extends PlayerImpl {
protected void updateGameStatePriority(String methodName, Game game) {
if (game.getState().getPriorityPlayerId() != null) { // don't do it if priority was set to null before (e.g. discard in cleanaup)
- log.debug("Setting game priority to " + getId() + " [" + methodName + "]");
+ logger.debug("Setting game priority to " + getId() + " [" + methodName + "]");
game.getState().setPriorityPlayerId(getId());
}
}
@Override
- public void sendPlayerAction(PlayerAction playerAction, Game game) {
- if (PlayerAction.RESET_AUTO_SELECT_REPLACEMENT_EFFECTS.equals(playerAction)) {
- autoSelectReplacementEffects.clear();
- } else {
- super.sendPlayerAction(playerAction, game);
+ public void sendPlayerAction(PlayerAction playerAction, Game game, Object data) {
+ switch (playerAction) {
+ case RESET_AUTO_SELECT_REPLACEMENT_EFFECTS:
+ autoSelectReplacementEffects.clear();
+ break;
+ case TRIGGER_AUTO_ORDER_ABILITY_FIRST:
+ case TRIGGER_AUTO_ORDER_ABILITY_LAST:
+ case TRIGGER_AUTO_ORDER_NAME_FIRST:
+ case TRIGGER_AUTO_ORDER_NAME_LAST:
+ case TRIGGER_AUTO_ORDER_RESET_ALL:
+ setTriggerAutoOrder(playerAction, game, data);
+ break;
+ case REQUEST_AUTO_ANSWER_ID_NO:
+ case REQUEST_AUTO_ANSWER_ID_YES:
+ case REQUEST_AUTO_ANSWER_TEXT_NO:
+ case REQUEST_AUTO_ANSWER_TEXT_YES:
+ case REQUEST_AUTO_ANSWER_RESET_ALL:
+ setRequestAutoAnswer(playerAction, game, data);
+ break;
+ default:
+ super.sendPlayerAction(playerAction, game, data);
+ }
+ }
+
+ private void setRequestAutoAnswer(PlayerAction playerAction, Game game, Object data) {
+ if (playerAction.equals(REQUEST_AUTO_ANSWER_RESET_ALL)) {
+ requestAutoAnswerId.clear();
+ requestAutoAnswerText.clear();
+ return;
+ }
+ if (data instanceof String) {
+ String key = (String) data;
+ switch (playerAction) {
+ case REQUEST_AUTO_ANSWER_ID_NO:
+ requestAutoAnswerId.put(key, false);
+ break;
+ case REQUEST_AUTO_ANSWER_TEXT_NO:
+ requestAutoAnswerText.put(key, false);
+ break;
+ case REQUEST_AUTO_ANSWER_ID_YES:
+ requestAutoAnswerId.put(key, true);
+ break;
+ case REQUEST_AUTO_ANSWER_TEXT_YES:
+ requestAutoAnswerText.put(key, true);
+ break;
+ }
+ }
+ }
+
+ private void setTriggerAutoOrder(PlayerAction playerAction, Game game, Object data) {
+ if (playerAction.equals(TRIGGER_AUTO_ORDER_RESET_ALL)) {
+ triggerAutoOrderAbilityFirst.clear();
+ triggerAutoOrderAbilityLast.clear();
+ triggerAutoOrderNameFirst.clear();
+ triggerAutoOrderNameLast.clear();
+ return;
+ }
+ if (data instanceof UUID) {
+ UUID abilityId = (UUID) data;
+ UUID originalId = null;
+ for (TriggeredAbility ability : game.getState().getTriggered(getId())) {
+ if (ability.getId().equals(abilityId)) {
+ originalId = ability.getOriginalId();
+ break;
+ }
+ }
+ if (originalId != null) {
+ switch (playerAction) {
+ case TRIGGER_AUTO_ORDER_ABILITY_FIRST:
+ triggerAutoOrderAbilityFirst.add(originalId);
+ break;
+ case TRIGGER_AUTO_ORDER_ABILITY_LAST:
+ triggerAutoOrderAbilityFirst.add(originalId);
+ break;
+ }
+ }
+ } else if (data instanceof String) {
+ String abilityName = (String) data;
+ switch (playerAction) {
+ case TRIGGER_AUTO_ORDER_NAME_FIRST:
+ triggerAutoOrderNameFirst.add(abilityName);
+ break;
+ case TRIGGER_AUTO_ORDER_NAME_LAST:
+ triggerAutoOrderNameLast.add(abilityName);
+ break;
+ }
}
}
@@ -1330,7 +1539,7 @@ public class HumanPlayer extends PlayerImpl {
}
if (!chooseUse(Outcome.Detriment, GameLog.getPlayerConfirmColoredText("You have still mana in your mana pool. Pass regardless?")
+ GameLog.getSmallSecondLineText(activePlayerText + " / " + game.getStep().getType().toString() + priorityPlayerText), null, game)) {
- sendPlayerAction(PlayerAction.PASS_PRIORITY_CANCEL_ALL_ACTIONS, game);
+ sendPlayerAction(PlayerAction.PASS_PRIORITY_CANCEL_ALL_ACTIONS, game, null);
return false;
}
}
diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/pom.xml b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/pom.xml
index 06efa02a054..ad866a17197 100644
--- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/pom.xml
+++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-tournament-boosterdraft
diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/AdamStyborskisPauperCube.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/AdamStyborskisPauperCube.java
new file mode 100644
index 00000000000..66ab2c5a67f
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/AdamStyborskisPauperCube.java
@@ -0,0 +1,454 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.tournament.cubes;
+
+import mage.game.draft.DraftCube;
+import mage.game.draft.DraftCube.CardIdentity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AdamStyborskisPauperCube extends DraftCube {
+
+public AdamStyborskisPauperCube() {
+ super("Adam Styborkski's Cube (411 cards)"); // https://docs.google.com/spreadsheets/d/12iQhC4bHqFW7hEWxPBjyC8yBDehFZ0_4DkqzyA8EL3o/edit#gid=0
+
+ cubeCards.add(new CardIdentity("Act of Treason", ""));
+ cubeCards.add(new CardIdentity("Adventuring Gear", ""));
+ cubeCards.add(new CardIdentity("Aerie Ouphes", ""));
+ cubeCards.add(new CardIdentity("AEther Adept", ""));
+ cubeCards.add(new CardIdentity("AEthersnipe", ""));
+ cubeCards.add(new CardIdentity("Agony Warp", ""));
+ cubeCards.add(new CardIdentity("Ambush Viper", ""));
+ cubeCards.add(new CardIdentity("Apex Hawks", ""));
+ cubeCards.add(new CardIdentity("Arachnus Web", ""));
+ cubeCards.add(new CardIdentity("Arc Lightning", ""));
+ cubeCards.add(new CardIdentity("Armillary Sphere", ""));
+ cubeCards.add(new CardIdentity("Army of Allah", ""));
+ cubeCards.add(new CardIdentity("Arrest", ""));
+ cubeCards.add(new CardIdentity("Ashes to Ashes", ""));
+ cubeCards.add(new CardIdentity("Assault Zeppelid", ""));
+ cubeCards.add(new CardIdentity("Attended Knight", ""));
+ cubeCards.add(new CardIdentity("Auger Spree", ""));
+ cubeCards.add(new CardIdentity("Aven Riftwatcher", ""));
+ cubeCards.add(new CardIdentity("Aven Surveyor", ""));
+ cubeCards.add(new CardIdentity("Azorius Guildgate", ""));
+ cubeCards.add(new CardIdentity("Baleful Eidolon", ""));
+ cubeCards.add(new CardIdentity("Barbed Lightning", ""));
+ cubeCards.add(new CardIdentity("Barren Moor", ""));
+ cubeCards.add(new CardIdentity("Basking Rootwalla", ""));
+ cubeCards.add(new CardIdentity("Battle Screech", ""));
+ cubeCards.add(new CardIdentity("Beetleback Chief", ""));
+ cubeCards.add(new CardIdentity("Beetleform Mage", ""));
+ cubeCards.add(new CardIdentity("Blade of the Sixth Pride", ""));
+ cubeCards.add(new CardIdentity("Blastoderm", ""));
+ cubeCards.add(new CardIdentity("Blazing Torch", ""));
+ cubeCards.add(new CardIdentity("Blightning", ""));
+ cubeCards.add(new CardIdentity("Blinding Beam", ""));
+ cubeCards.add(new CardIdentity("Bloodfell Caves", ""));
+ cubeCards.add(new CardIdentity("Blossoming Sands", ""));
+ cubeCards.add(new CardIdentity("Bonded Construct", ""));
+ cubeCards.add(new CardIdentity("Bonds of Faith", ""));
+ cubeCards.add(new CardIdentity("Bonesplitter", ""));
+ cubeCards.add(new CardIdentity("Boomerang", ""));
+ cubeCards.add(new CardIdentity("Borderland Marauder", ""));
+ cubeCards.add(new CardIdentity("Boros Guildgate", ""));
+ cubeCards.add(new CardIdentity("Branching Bolt", ""));
+ cubeCards.add(new CardIdentity("Brute Force", ""));
+ cubeCards.add(new CardIdentity("Burst Lightning", ""));
+ cubeCards.add(new CardIdentity("Butcher Ghoul", ""));
+ cubeCards.add(new CardIdentity("Cadaver Imp", ""));
+ cubeCards.add(new CardIdentity("Cage of Hands", ""));
+ cubeCards.add(new CardIdentity("Calcite Snapper", ""));
+ cubeCards.add(new CardIdentity("Capsize", ""));
+ cubeCards.add(new CardIdentity("Carnivorous Death-Parrot", ""));
+ cubeCards.add(new CardIdentity("Carnophage", ""));
+ cubeCards.add(new CardIdentity("Cathodion", ""));
+ cubeCards.add(new CardIdentity("Cavern Harpy", ""));
+ cubeCards.add(new CardIdentity("Centaur Healer", ""));
+ cubeCards.add(new CardIdentity("Centaur's Herald", ""));
+ cubeCards.add(new CardIdentity("Center Soul", ""));
+ cubeCards.add(new CardIdentity("Chain Lightning", ""));
+ cubeCards.add(new CardIdentity("Chainer's Edict", ""));
+ cubeCards.add(new CardIdentity("Citanul Woodreaders", ""));
+ cubeCards.add(new CardIdentity("Claustrophobia", ""));
+ cubeCards.add(new CardIdentity("Clay Statue", ""));
+ cubeCards.add(new CardIdentity("Cloaked Siren", ""));
+ cubeCards.add(new CardIdentity("Cloud of Faeries", ""));
+ cubeCards.add(new CardIdentity("Cloudshift", ""));
+ cubeCards.add(new CardIdentity("Coalition Honor Guard", ""));
+ cubeCards.add(new CardIdentity("Cogwork Librarian", ""));
+ cubeCards.add(new CardIdentity("Colossal Might", ""));
+ cubeCards.add(new CardIdentity("Compulsive Research", ""));
+ cubeCards.add(new CardIdentity("Consume Strength", ""));
+ cubeCards.add(new CardIdentity("Corrupted Zendikon", ""));
+ cubeCards.add(new CardIdentity("Counterspell", ""));
+ cubeCards.add(new CardIdentity("Crippling Fatigue", ""));
+ cubeCards.add(new CardIdentity("Crocanura", ""));
+ cubeCards.add(new CardIdentity("Crypt Rats", ""));
+ cubeCards.add(new CardIdentity("Crystallization", ""));
+ cubeCards.add(new CardIdentity("Cultivate", ""));
+ cubeCards.add(new CardIdentity("Cunning Strike", ""));
+ cubeCards.add(new CardIdentity("Curse of Chains", ""));
+ cubeCards.add(new CardIdentity("Custodi Squire", ""));
+ cubeCards.add(new CardIdentity("Daring Skyjek", ""));
+ cubeCards.add(new CardIdentity("Daru Lancer", ""));
+ cubeCards.add(new CardIdentity("Dauthi Horror", ""));
+ cubeCards.add(new CardIdentity("Dauthi Marauder", ""));
+ cubeCards.add(new CardIdentity("Dauthi Mercenary", ""));
+ cubeCards.add(new CardIdentity("Dauthi Slayer", ""));
+ cubeCards.add(new CardIdentity("Dead Reveler", ""));
+ cubeCards.add(new CardIdentity("Dead Weight", ""));
+ cubeCards.add(new CardIdentity("Death Denied", ""));
+ cubeCards.add(new CardIdentity("Deep Analysis", ""));
+ cubeCards.add(new CardIdentity("Deprive", ""));
+ cubeCards.add(new CardIdentity("Deputy of Acquittals", ""));
+ cubeCards.add(new CardIdentity("Desert", ""));
+ cubeCards.add(new CardIdentity("Devour Flesh", ""));
+ cubeCards.add(new CardIdentity("Diabolic Edict", ""));
+ cubeCards.add(new CardIdentity("Dimir Guildgate", ""));
+ cubeCards.add(new CardIdentity("Disfigure", ""));
+ cubeCards.add(new CardIdentity("Dismal Backwater", ""));
+ cubeCards.add(new CardIdentity("Distortion Strike", ""));
+ cubeCards.add(new CardIdentity("Doom Blade", ""));
+ cubeCards.add(new CardIdentity("Doomed Traveler", ""));
+ cubeCards.add(new CardIdentity("Dragon Fodder", ""));
+ cubeCards.add(new CardIdentity("Driver of the Dead", ""));
+ cubeCards.add(new CardIdentity("Dynacharge", ""));
+ cubeCards.add(new CardIdentity("Elephant Ambush", ""));
+ cubeCards.add(new CardIdentity("Elephant Guide", ""));
+ cubeCards.add(new CardIdentity("Elusive Spellfist", ""));
+ cubeCards.add(new CardIdentity("Enhanced Awareness", ""));
+ cubeCards.add(new CardIdentity("Epic Confrontation", ""));
+ cubeCards.add(new CardIdentity("Errant Ephemeron", ""));
+ cubeCards.add(new CardIdentity("Esper Cormorants", ""));
+ cubeCards.add(new CardIdentity("Essence Scatter", ""));
+ cubeCards.add(new CardIdentity("Ethereal Armor", ""));
+ cubeCards.add(new CardIdentity("Evincar's Justice", ""));
+ cubeCards.add(new CardIdentity("Evolution Charm", ""));
+ cubeCards.add(new CardIdentity("Evolving Wilds", ""));
+ cubeCards.add(new CardIdentity("Exclude", ""));
+ cubeCards.add(new CardIdentity("Eye of Nowhere", ""));
+ cubeCards.add(new CardIdentity("Faceless Butcher", ""));
+ cubeCards.add(new CardIdentity("Faith's Fetters", ""));
+ cubeCards.add(new CardIdentity("Fall of the Hammer", ""));
+ cubeCards.add(new CardIdentity("Farseek", ""));
+ cubeCards.add(new CardIdentity("Feat of Resistance", ""));
+ cubeCards.add(new CardIdentity("Feeling of Dread", ""));
+ cubeCards.add(new CardIdentity("Fellwar Stone", ""));
+ cubeCards.add(new CardIdentity("Fervent Cathar", ""));
+ cubeCards.add(new CardIdentity("Fire Ambush", ""));
+ cubeCards.add(new CardIdentity("Fireblast", ""));
+ cubeCards.add(new CardIdentity("Firebolt", ""));
+ cubeCards.add(new CardIdentity("Firefiend Elemental", ""));
+ cubeCards.add(new CardIdentity("Fireslinger", ""));
+ cubeCards.add(new CardIdentity("Fists of Ironwood", ""));
+ cubeCards.add(new CardIdentity("Flayer Husk", ""));
+ cubeCards.add(new CardIdentity("Flurry of Horns", ""));
+ cubeCards.add(new CardIdentity("Font of Return", ""));
+ cubeCards.add(new CardIdentity("Fortify", ""));
+ cubeCards.add(new CardIdentity("Foul Spirit", ""));
+ cubeCards.add(new CardIdentity("Frilled Oculus", ""));
+ cubeCards.add(new CardIdentity("Frostburn Weird", ""));
+ cubeCards.add(new CardIdentity("Fyndhorn Elves", ""));
+ cubeCards.add(new CardIdentity("Garruk's Companion", ""));
+ cubeCards.add(new CardIdentity("Gathan Raiders", ""));
+ cubeCards.add(new CardIdentity("Gather the Townsfolk", ""));
+ cubeCards.add(new CardIdentity("Ghastly Demise", ""));
+ cubeCards.add(new CardIdentity("Ghirapur Gearcrafter", ""));
+ cubeCards.add(new CardIdentity("Ghitu Slinger", ""));
+ cubeCards.add(new CardIdentity("Giant Growth", ""));
+ cubeCards.add(new CardIdentity("Gideon's Lawkeeper", ""));
+ cubeCards.add(new CardIdentity("Goblin Heelcutter", ""));
+ cubeCards.add(new CardIdentity("Gods Willing", ""));
+ cubeCards.add(new CardIdentity("Goldmeadow Harrier", ""));
+ cubeCards.add(new CardIdentity("Golgari Guildgate", ""));
+ cubeCards.add(new CardIdentity("Gore-House Chainwalker", ""));
+ cubeCards.add(new CardIdentity("Gravedigger", ""));
+ cubeCards.add(new CardIdentity("Gray Merchant of Asphodel", ""));
+ cubeCards.add(new CardIdentity("Grim Contest", ""));
+ cubeCards.add(new CardIdentity("Grisly Salvage", ""));
+ cubeCards.add(new CardIdentity("Gruul Guildgate", ""));
+ cubeCards.add(new CardIdentity("Gryff Vanguard", ""));
+ cubeCards.add(new CardIdentity("Guardian Automaton", ""));
+ cubeCards.add(new CardIdentity("Guardian of the Guildpact", ""));
+ cubeCards.add(new CardIdentity("Gurmag Angler", ""));
+ cubeCards.add(new CardIdentity("Halimar Depths", ""));
+ cubeCards.add(new CardIdentity("Halimar Wavewatch", ""));
+ cubeCards.add(new CardIdentity("Harrow", ""));
+ cubeCards.add(new CardIdentity("Harsh Sustenance", ""));
+ cubeCards.add(new CardIdentity("Hissing Iguanar", ""));
+ cubeCards.add(new CardIdentity("Hooting Mandrills", ""));
+ cubeCards.add(new CardIdentity("Hyena Umbra", ""));
+ cubeCards.add(new CardIdentity("Hymn to Tourach", ""));
+ cubeCards.add(new CardIdentity("Imperiosaur", ""));
+ cubeCards.add(new CardIdentity("Incinerate", ""));
+ cubeCards.add(new CardIdentity("Inner-Flame Acolyte", ""));
+ cubeCards.add(new CardIdentity("Into the Roil", ""));
+ cubeCards.add(new CardIdentity("Izzet Chronarch", ""));
+ cubeCards.add(new CardIdentity("Izzet Guildgate", ""));
+ cubeCards.add(new CardIdentity("Jilt", ""));
+ cubeCards.add(new CardIdentity("Journey to Nowhere", ""));
+ cubeCards.add(new CardIdentity("Jungle Hollow", ""));
+ cubeCards.add(new CardIdentity("Kabuto Moth", ""));
+ cubeCards.add(new CardIdentity("Keldon Marauders", ""));
+ cubeCards.add(new CardIdentity("Khalni Garden", ""));
+ cubeCards.add(new CardIdentity("Kingpin's Pet", ""));
+ cubeCards.add(new CardIdentity("Kodama's Reach", ""));
+ cubeCards.add(new CardIdentity("Kor Skyfisher", ""));
+ cubeCards.add(new CardIdentity("Kozilek's Predator", ""));
+ cubeCards.add(new CardIdentity("Krenko's Command", ""));
+ cubeCards.add(new CardIdentity("Krosan Tusker", ""));
+ cubeCards.add(new CardIdentity("Kruin Striker", ""));
+ cubeCards.add(new CardIdentity("Lash Out", ""));
+ cubeCards.add(new CardIdentity("Last Gasp", ""));
+ cubeCards.add(new CardIdentity("Leonin Bola", ""));
+ cubeCards.add(new CardIdentity("Leonin Scimitar", ""));
+ cubeCards.add(new CardIdentity("Lightning Bolt", ""));
+ cubeCards.add(new CardIdentity("Lightning Strike", ""));
+ cubeCards.add(new CardIdentity("Liliana's Specter", ""));
+ cubeCards.add(new CardIdentity("Llanowar Elves", ""));
+ cubeCards.add(new CardIdentity("Lone Missionary", ""));
+ cubeCards.add(new CardIdentity("Looter il-Kor", ""));
+ cubeCards.add(new CardIdentity("Lotus Path Djinn", ""));
+ cubeCards.add(new CardIdentity("Loyal Cathar", ""));
+ cubeCards.add(new CardIdentity("Loyal Pegasus", ""));
+ cubeCards.add(new CardIdentity("Lurking Automaton", ""));
+ cubeCards.add(new CardIdentity("Makeshift Mauler", ""));
+ cubeCards.add(new CardIdentity("Mana Leak", ""));
+ cubeCards.add(new CardIdentity("Man-o'-War", ""));
+ cubeCards.add(new CardIdentity("Mardu Hordechief", ""));
+ cubeCards.add(new CardIdentity("Mardu Scout", ""));
+ cubeCards.add(new CardIdentity("Mardu Skullhunter", ""));
+ cubeCards.add(new CardIdentity("Martial Glory", ""));
+ cubeCards.add(new CardIdentity("Maul Splicer", ""));
+ cubeCards.add(new CardIdentity("Maze of Ith", ""));
+ cubeCards.add(new CardIdentity("Merfolk Looter", ""));
+ cubeCards.add(new CardIdentity("Mind Stone", ""));
+ cubeCards.add(new CardIdentity("Minotaur Skullcleaver", ""));
+ cubeCards.add(new CardIdentity("Mire Boa", ""));
+ cubeCards.add(new CardIdentity("Miscalculation", ""));
+ cubeCards.add(new CardIdentity("Mishra's Factory", ""));
+ cubeCards.add(new CardIdentity("Mist Raven", ""));
+ cubeCards.add(new CardIdentity("Mogg Fanatic", ""));
+ cubeCards.add(new CardIdentity("Mogg Flunkies", ""));
+ cubeCards.add(new CardIdentity("Mogg War Marshal", ""));
+ cubeCards.add(new CardIdentity("Moldervine Cloak", ""));
+ cubeCards.add(new CardIdentity("Momentary Blink", ""));
+ cubeCards.add(new CardIdentity("Morgue Theft", ""));
+ cubeCards.add(new CardIdentity("Mulldrifter", ""));
+ cubeCards.add(new CardIdentity("Nameless Inversion", ""));
+ cubeCards.add(new CardIdentity("Narcolepsy", ""));
+ cubeCards.add(new CardIdentity("Necromancer's Assistant", ""));
+ cubeCards.add(new CardIdentity("Nessian Asp", ""));
+ cubeCards.add(new CardIdentity("Nest Invader", ""));
+ cubeCards.add(new CardIdentity("Nezumi Cutthroat", ""));
+ cubeCards.add(new CardIdentity("Nightscape Familiar", ""));
+ cubeCards.add(new CardIdentity("Ninja of the Deep Hours", ""));
+ cubeCards.add(new CardIdentity("Oblivion Ring", ""));
+ cubeCards.add(new CardIdentity("Okiba-Gang Shinobi", ""));
+ cubeCards.add(new CardIdentity("Omenspeaker", ""));
+ cubeCards.add(new CardIdentity("Orzhov Guildgate", ""));
+ cubeCards.add(new CardIdentity("Otherworldly Journey", ""));
+ cubeCards.add(new CardIdentity("Pacifism", ""));
+ cubeCards.add(new CardIdentity("Path of Anger's Flame", ""));
+ cubeCards.add(new CardIdentity("Penumbra Spider", ""));
+ cubeCards.add(new CardIdentity("Perilous Myr", ""));
+ cubeCards.add(new CardIdentity("Pestermite", ""));
+ cubeCards.add(new CardIdentity("Pestilence", ""));
+ cubeCards.add(new CardIdentity("Phantom Nomad", ""));
+ cubeCards.add(new CardIdentity("Phantom Tiger", ""));
+ cubeCards.add(new CardIdentity("Pharika's Chosen", ""));
+ cubeCards.add(new CardIdentity("Phyrexian Rager", ""));
+ cubeCards.add(new CardIdentity("Pillory of the Sleepless", ""));
+ cubeCards.add(new CardIdentity("Pit Fight", ""));
+ cubeCards.add(new CardIdentity("Pit Keeper", ""));
+ cubeCards.add(new CardIdentity("Plated Geopede", ""));
+ cubeCards.add(new CardIdentity("Plover Knights", ""));
+ cubeCards.add(new CardIdentity("Porcelain Legionnaire", ""));
+ cubeCards.add(new CardIdentity("Pouncing Kavu", ""));
+ cubeCards.add(new CardIdentity("Predatory Nightstalker", ""));
+ cubeCards.add(new CardIdentity("Preordain", ""));
+ cubeCards.add(new CardIdentity("Prey Upon", ""));
+ cubeCards.add(new CardIdentity("Prismatic Lens", ""));
+ cubeCards.add(new CardIdentity("Prismatic Strands", ""));
+ cubeCards.add(new CardIdentity("Pristine Talisman", ""));
+ cubeCards.add(new CardIdentity("Probe", ""));
+ cubeCards.add(new CardIdentity("Prophetic Prism", ""));
+ cubeCards.add(new CardIdentity("Putrid Leech", ""));
+ cubeCards.add(new CardIdentity("Pyrotechnics", ""));
+ cubeCards.add(new CardIdentity("Qasali Pridemage", ""));
+ cubeCards.add(new CardIdentity("Raise the Alarm", ""));
+ cubeCards.add(new CardIdentity("Rakdos Guildgate", ""));
+ cubeCards.add(new CardIdentity("Rakdos Shred-Freak", ""));
+ cubeCards.add(new CardIdentity("Rampant Growth", ""));
+ cubeCards.add(new CardIdentity("Rancor", ""));
+ cubeCards.add(new CardIdentity("Ranger's Guile", ""));
+ cubeCards.add(new CardIdentity("Ray of Command", ""));
+ cubeCards.add(new CardIdentity("Razorfin Hunter", ""));
+ cubeCards.add(new CardIdentity("Reckless Charge", ""));
+ cubeCards.add(new CardIdentity("Reclaim", ""));
+ cubeCards.add(new CardIdentity("Recoil", ""));
+ cubeCards.add(new CardIdentity("Remove Soul", ""));
+ cubeCards.add(new CardIdentity("Rend Flesh", ""));
+ cubeCards.add(new CardIdentity("Rendclaw Trow", ""));
+ cubeCards.add(new CardIdentity("Rhox Maulers", ""));
+ cubeCards.add(new CardIdentity("Rishadan Airship", ""));
+ cubeCards.add(new CardIdentity("River Boa", ""));
+ cubeCards.add(new CardIdentity("Ronin Houndmaster", ""));
+ cubeCards.add(new CardIdentity("Rugged Highlands", ""));
+ cubeCards.add(new CardIdentity("Runed Servitor", ""));
+ cubeCards.add(new CardIdentity("Rushing River", ""));
+ cubeCards.add(new CardIdentity("Safehold Elite", ""));
+ cubeCards.add(new CardIdentity("Sakura-Tribe Elder", ""));
+ cubeCards.add(new CardIdentity("Sandsteppe Outcast", ""));
+ cubeCards.add(new CardIdentity("Sangrite Backlash", ""));
+ cubeCards.add(new CardIdentity("Sarkhan's Rage", ""));
+ cubeCards.add(new CardIdentity("Savage Punch", ""));
+ cubeCards.add(new CardIdentity("Savage Surge", ""));
+ cubeCards.add(new CardIdentity("Scatter the Seeds", ""));
+ cubeCards.add(new CardIdentity("Scion of the Wild", ""));
+ cubeCards.add(new CardIdentity("Scoured Barrens", ""));
+ cubeCards.add(new CardIdentity("Scuzzback Marauders", ""));
+ cubeCards.add(new CardIdentity("Searing Blaze", ""));
+ cubeCards.add(new CardIdentity("Searing Spear", ""));
+ cubeCards.add(new CardIdentity("Sejiri Steppe", ""));
+ cubeCards.add(new CardIdentity("Selesnya Guildgate", ""));
+ cubeCards.add(new CardIdentity("Sentinel Spider", ""));
+ cubeCards.add(new CardIdentity("Seraph of Dawn", ""));
+ cubeCards.add(new CardIdentity("Serrated Arrows", ""));
+ cubeCards.add(new CardIdentity("Shaper Parasite", ""));
+ cubeCards.add(new CardIdentity("Shelter", ""));
+ cubeCards.add(new CardIdentity("Shimmering Glasskite", ""));
+ cubeCards.add(new CardIdentity("Shimmering Grotto", ""));
+ cubeCards.add(new CardIdentity("Sigil Blessing", ""));
+ cubeCards.add(new CardIdentity("Silent Departure", ""));
+ cubeCards.add(new CardIdentity("Simic Guildgate", ""));
+ cubeCards.add(new CardIdentity("Skinthinner", ""));
+ cubeCards.add(new CardIdentity("Skirk Marauder", ""));
+ cubeCards.add(new CardIdentity("Skyknight Legionnaire", ""));
+ cubeCards.add(new CardIdentity("Skywinder Drake", ""));
+ cubeCards.add(new CardIdentity("Slash Panther", ""));
+ cubeCards.add(new CardIdentity("Slippery Bogle", ""));
+ cubeCards.add(new CardIdentity("Snakeform", ""));
+ cubeCards.add(new CardIdentity("Snap", ""));
+ cubeCards.add(new CardIdentity("Snuff Out", ""));
+ cubeCards.add(new CardIdentity("Soltari Emissary", ""));
+ cubeCards.add(new CardIdentity("Soltari Lancer", ""));
+ cubeCards.add(new CardIdentity("Soltari Trooper", ""));
+ cubeCards.add(new CardIdentity("Soul Manipulation", ""));
+ cubeCards.add(new CardIdentity("Sparksmith", ""));
+ cubeCards.add(new CardIdentity("Sphere of the Suns", ""));
+ cubeCards.add(new CardIdentity("Spined Thopter", ""));
+ cubeCards.add(new CardIdentity("Splatter Thug", ""));
+ cubeCards.add(new CardIdentity("Staggershock", ""));
+ cubeCards.add(new CardIdentity("Stampeding Elk Herd", ""));
+ cubeCards.add(new CardIdentity("Stave Off", ""));
+ cubeCards.add(new CardIdentity("Stealer of Secrets", ""));
+ cubeCards.add(new CardIdentity("Stitched Drake", ""));
+ cubeCards.add(new CardIdentity("Stormfront Pegasus", ""));
+ cubeCards.add(new CardIdentity("Stormscape Apprentice", ""));
+ cubeCards.add(new CardIdentity("Strider Harness", ""));
+ cubeCards.add(new CardIdentity("Strip Mine", ""));
+ cubeCards.add(new CardIdentity("Sultai Scavenger", ""));
+ cubeCards.add(new CardIdentity("Suppression Bonds", ""));
+ cubeCards.add(new CardIdentity("Suq'Ata Lancer", ""));
+ cubeCards.add(new CardIdentity("Swiftwater Cliffs", ""));
+ cubeCards.add(new CardIdentity("Sylvok Lifestaff", ""));
+ cubeCards.add(new CardIdentity("Tail Slash", ""));
+ cubeCards.add(new CardIdentity("Teetering Peaks", ""));
+ cubeCards.add(new CardIdentity("Temporal Isolation", ""));
+ cubeCards.add(new CardIdentity("Tenement Crasher", ""));
+ cubeCards.add(new CardIdentity("Terminate", ""));
+ cubeCards.add(new CardIdentity("Terramorphic Expanse", ""));
+ cubeCards.add(new CardIdentity("Test of Faith", ""));
+ cubeCards.add(new CardIdentity("Thornweald Archer", ""));
+ cubeCards.add(new CardIdentity("Thornwood Falls", ""));
+ cubeCards.add(new CardIdentity("Thought Courier", ""));
+ cubeCards.add(new CardIdentity("Thundering Giant", ""));
+ cubeCards.add(new CardIdentity("Thundering Tanadon", ""));
+ cubeCards.add(new CardIdentity("Time to Feed", ""));
+ cubeCards.add(new CardIdentity("Tithe Drinker", ""));
+ cubeCards.add(new CardIdentity("Totem-Guide Hartebeest", ""));
+ cubeCards.add(new CardIdentity("Tragic Slip", ""));
+ cubeCards.add(new CardIdentity("Tranquil Cove", ""));
+ cubeCards.add(new CardIdentity("Travel Preparations", ""));
+ cubeCards.add(new CardIdentity("Treasure Cruise", ""));
+ cubeCards.add(new CardIdentity("Triplicate Spirits", ""));
+ cubeCards.add(new CardIdentity("Trumpet Blast", ""));
+ cubeCards.add(new CardIdentity("Tumble Magnet", ""));
+ cubeCards.add(new CardIdentity("Twin Bolt", ""));
+ cubeCards.add(new CardIdentity("Typhoid Rats", ""));
+ cubeCards.add(new CardIdentity("Ulamog's Crusher", ""));
+ cubeCards.add(new CardIdentity("Undying Evil", ""));
+ cubeCards.add(new CardIdentity("Unearth", ""));
+ cubeCards.add(new CardIdentity("Unknown Shores", ""));
+ cubeCards.add(new CardIdentity("Unmake", ""));
+ cubeCards.add(new CardIdentity("Vampire Interloper", ""));
+ cubeCards.add(new CardIdentity("Vampire Lacerator", ""));
+ cubeCards.add(new CardIdentity("Vault Skirge", ""));
+ cubeCards.add(new CardIdentity("Vendetta", ""));
+ cubeCards.add(new CardIdentity("Veteran's Sidearm", ""));
+ cubeCards.add(new CardIdentity("Viashino Firstblade", ""));
+ cubeCards.add(new CardIdentity("Vines of Vastwood", ""));
+ cubeCards.add(new CardIdentity("Voidwielder", ""));
+ cubeCards.add(new CardIdentity("Volcanic Hammer", ""));
+ cubeCards.add(new CardIdentity("Vulshok Morningstar", ""));
+ cubeCards.add(new CardIdentity("Vulshok Sorcerer", ""));
+ cubeCards.add(new CardIdentity("Vulturous Aven", ""));
+ cubeCards.add(new CardIdentity("Wakedancer", ""));
+ cubeCards.add(new CardIdentity("Walker of the Grove", ""));
+ cubeCards.add(new CardIdentity("Wall of Roots", ""));
+ cubeCards.add(new CardIdentity("War Flare", ""));
+ cubeCards.add(new CardIdentity("Warren Pilferers", ""));
+ cubeCards.add(new CardIdentity("Waterfront Bouncer", ""));
+ cubeCards.add(new CardIdentity("Wayfarer's Bauble", ""));
+ cubeCards.add(new CardIdentity("Whirlpool Whelm", ""));
+ cubeCards.add(new CardIdentity("Whispers of the Muse", ""));
+ cubeCards.add(new CardIdentity("Whispersilk Cloak", ""));
+ cubeCards.add(new CardIdentity("Whitemane Lion", ""));
+ cubeCards.add(new CardIdentity("Wickerbough Elder", ""));
+ cubeCards.add(new CardIdentity("Wild Instincts", ""));
+ cubeCards.add(new CardIdentity("Wild Mongrel", ""));
+ cubeCards.add(new CardIdentity("Wild Nacatl", ""));
+ cubeCards.add(new CardIdentity("Wildsize", ""));
+ cubeCards.add(new CardIdentity("Will-Forged Golem", ""));
+ cubeCards.add(new CardIdentity("Wind-Scarred Crag", ""));
+ cubeCards.add(new CardIdentity("Wingcrafter", ""));
+ cubeCards.add(new CardIdentity("Wingsteed Rider", ""));
+ cubeCards.add(new CardIdentity("Withdraw", ""));
+ cubeCards.add(new CardIdentity("Wojek Halberdiers", ""));
+ cubeCards.add(new CardIdentity("Wrecking Ball", ""));
+ cubeCards.add(new CardIdentity("Yavimaya Elder", ""));
+ cubeCards.add(new CardIdentity("Yotian Soldier", ""));
+ cubeCards.add(new CardIdentity("Young Wolf", ""));
+ cubeCards.add(new CardIdentity("Youthful Knight", ""));
+ cubeCards.add(new CardIdentity("Zhur-Taa Swine", ""));
+ }
+}
diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/JimDavisCube.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/JimDavisCube.java
new file mode 100644
index 00000000000..8674c4e2251
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/JimDavisCube.java
@@ -0,0 +1,511 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.tournament.cubes;
+
+import mage.game.draft.DraftCube;
+import mage.game.draft.DraftCube.CardIdentity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class JimDavisCube extends DraftCube {
+
+ public JimDavisCube() {
+ super("Jim Davis's Cube (469 cards)"); // https://docs.google.com/spreadsheets/d/1pZ3aQR-Kb5MmMDNh1sOtMt4vSrJEWNixyZDZrQSBJb4/edit#gid=0
+
+ cubeCards.add(new CardIdentity("Abbot of Keral Keep", ""));
+ cubeCards.add(new CardIdentity("Abrupt Decay", ""));
+ cubeCards.add(new CardIdentity("Absorb", ""));
+ cubeCards.add(new CardIdentity("Academy Ruins", ""));
+ cubeCards.add(new CardIdentity("Accorder Paladin", ""));
+ cubeCards.add(new CardIdentity("Advantageous Proclamation", ""));
+ cubeCards.add(new CardIdentity("AEther Vial", ""));
+ cubeCards.add(new CardIdentity("Agent of Acquisitions", ""));
+ cubeCards.add(new CardIdentity("Ajani Vengeant", ""));
+ cubeCards.add(new CardIdentity("Ancient Den", ""));
+ cubeCards.add(new CardIdentity("Ancient Tomb", ""));
+ cubeCards.add(new CardIdentity("Angel of Serenity", ""));
+ cubeCards.add(new CardIdentity("Animate Dead", ""));
+ cubeCards.add(new CardIdentity("Ankh of Mishra", ""));
+ cubeCards.add(new CardIdentity("Arcbound Ravager", ""));
+ cubeCards.add(new CardIdentity("Arid Mesa", ""));
+ cubeCards.add(new CardIdentity("Armageddon", ""));
+ cubeCards.add(new CardIdentity("Ashen Rider", ""));
+ cubeCards.add(new CardIdentity("Avacyn's Pilgrim", ""));
+ cubeCards.add(new CardIdentity("Avenger of Zendikar", ""));
+ cubeCards.add(new CardIdentity("Azorius Signet", ""));
+ cubeCards.add(new CardIdentity("Backup Plan", ""));
+ cubeCards.add(new CardIdentity("Badlands", ""));
+ cubeCards.add(new CardIdentity("Balance", ""));
+ cubeCards.add(new CardIdentity("Baleful Strix", ""));
+ cubeCards.add(new CardIdentity("Baneslayer Angel", ""));
+ cubeCards.add(new CardIdentity("Batterskull", ""));
+ cubeCards.add(new CardIdentity("Battle Screech", ""));
+ cubeCards.add(new CardIdentity("Battlefield Forge", ""));
+ cubeCards.add(new CardIdentity("Bayou", ""));
+ cubeCards.add(new CardIdentity("Bazaar of Baghdad", ""));
+ cubeCards.add(new CardIdentity("Birds of Paradise", ""));
+ cubeCards.add(new CardIdentity("Birthing Pod", ""));
+ cubeCards.add(new CardIdentity("Bitterblossom", ""));
+ cubeCards.add(new CardIdentity("Blackcleave Cliffs", ""));
+ cubeCards.add(new CardIdentity("Blade Splicer", ""));
+ cubeCards.add(new CardIdentity("Blightning", ""));
+ cubeCards.add(new CardIdentity("Blinkmoth Nexus", ""));
+ cubeCards.add(new CardIdentity("Blood Artist", ""));
+ cubeCards.add(new CardIdentity("Blood Crypt", ""));
+ cubeCards.add(new CardIdentity("Bloodbraid Elf", ""));
+ cubeCards.add(new CardIdentity("Bloodghast", ""));
+ cubeCards.add(new CardIdentity("Bloodsoaked Champion", ""));
+ cubeCards.add(new CardIdentity("Bloodstained Mire", ""));
+ cubeCards.add(new CardIdentity("Bonesplitter", ""));
+ cubeCards.add(new CardIdentity("Boros Charm", ""));
+ cubeCards.add(new CardIdentity("Boros Reckoner", ""));
+ cubeCards.add(new CardIdentity("Braids, Cabal Minion", ""));
+ cubeCards.add(new CardIdentity("Brain Freeze", ""));
+ cubeCards.add(new CardIdentity("Brainstorm", ""));
+ cubeCards.add(new CardIdentity("Breeding Pool", ""));
+ cubeCards.add(new CardIdentity("Brimaz, King of Oreskos", ""));
+ cubeCards.add(new CardIdentity("Bring to Light", ""));
+ cubeCards.add(new CardIdentity("Broodmate Dragon", ""));
+ cubeCards.add(new CardIdentity("Cabal Ritual", ""));
+ cubeCards.add(new CardIdentity("Careful Study", ""));
+ cubeCards.add(new CardIdentity("Carrion Feeder", ""));
+ cubeCards.add(new CardIdentity("Catacomb Sifter", ""));
+ cubeCards.add(new CardIdentity("Celestial Colonnade", ""));
+ cubeCards.add(new CardIdentity("Chained to the Rocks", ""));
+ cubeCards.add(new CardIdentity("Chain Lightning", ""));
+ cubeCards.add(new CardIdentity("Champion of the Parish", ""));
+ cubeCards.add(new CardIdentity("Chandra's Phoenix", ""));
+ cubeCards.add(new CardIdentity("Chromatic Sphere", ""));
+ cubeCards.add(new CardIdentity("Chromatic Star", ""));
+ cubeCards.add(new CardIdentity("Chrome Mox", ""));
+ cubeCards.add(new CardIdentity("City of Brass", ""));
+ cubeCards.add(new CardIdentity("City of Traitors", ""));
+ cubeCards.add(new CardIdentity("Clifftop Retreat", ""));
+ cubeCards.add(new CardIdentity("Coalition Relic", ""));
+ cubeCards.add(new CardIdentity("Coercive Portal", ""));
+ cubeCards.add(new CardIdentity("Cogwork Librarian", ""));
+ cubeCards.add(new CardIdentity("Collected Company", ""));
+ cubeCards.add(new CardIdentity("Condescend", ""));
+ cubeCards.add(new CardIdentity("Copperline Gorge", ""));
+ cubeCards.add(new CardIdentity("Council's Judgment", ""));
+ cubeCards.add(new CardIdentity("Counterspell", ""));
+ cubeCards.add(new CardIdentity("Court Hussar", ""));
+ cubeCards.add(new CardIdentity("Cranial Plating", ""));
+ cubeCards.add(new CardIdentity("Creeping Tar Pit", ""));
+ cubeCards.add(new CardIdentity("Crop Rotation", ""));
+ cubeCards.add(new CardIdentity("Crucible of Worlds", ""));
+ cubeCards.add(new CardIdentity("Cruel Ultimatum", ""));
+ cubeCards.add(new CardIdentity("Cryptic Command", ""));
+ cubeCards.add(new CardIdentity("Curse of Shallow Graves", ""));
+ cubeCards.add(new CardIdentity("Cursed Scroll", ""));
+ cubeCards.add(new CardIdentity("Damnation", ""));
+ cubeCards.add(new CardIdentity("Dark Confidant", ""));
+ cubeCards.add(new CardIdentity("Dark Ritual", ""));
+ cubeCards.add(new CardIdentity("Darkslick Shores", ""));
+ cubeCards.add(new CardIdentity("Darksteel Citadel", ""));
+ cubeCards.add(new CardIdentity("Daze", ""));
+ cubeCards.add(new CardIdentity("Deal Broker", ""));
+ cubeCards.add(new CardIdentity("Deathrite Shaman", ""));
+ cubeCards.add(new CardIdentity("Delver of Secrets", ""));
+ cubeCards.add(new CardIdentity("Demonic Tutor", ""));
+ cubeCards.add(new CardIdentity("Deranged Hermit", ""));
+ cubeCards.add(new CardIdentity("Detention Sphere", ""));
+ cubeCards.add(new CardIdentity("Dig Through Time", ""));
+ cubeCards.add(new CardIdentity("Dimir Signet", ""));
+ cubeCards.add(new CardIdentity("Diregraf Ghoul", ""));
+ cubeCards.add(new CardIdentity("Dismember", ""));
+ cubeCards.add(new CardIdentity("Dragon Hunter", ""));
+ cubeCards.add(new CardIdentity("Dragonlord Atarka", ""));
+ cubeCards.add(new CardIdentity("Drana, Liberator of Malakir", ""));
+ cubeCards.add(new CardIdentity("Dream Halls", ""));
+ cubeCards.add(new CardIdentity("Dryad Militant", ""));
+ cubeCards.add(new CardIdentity("Dust Bowl", ""));
+ cubeCards.add(new CardIdentity("Dwarven Blastminer", ""));
+ cubeCards.add(new CardIdentity("Edric, Spymaster of Trest", ""));
+ cubeCards.add(new CardIdentity("Eidolon of the Great Revel", ""));
+ cubeCards.add(new CardIdentity("Electrolyze", ""));
+ cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn", ""));
+ cubeCards.add(new CardIdentity("Engineered Explosives", ""));
+ cubeCards.add(new CardIdentity("Enlightened Tutor", ""));
+ cubeCards.add(new CardIdentity("Entomb", ""));
+ cubeCards.add(new CardIdentity("Etched Champion", ""));
+ cubeCards.add(new CardIdentity("Eternal Witness", ""));
+ cubeCards.add(new CardIdentity("Etherium Sculptor", ""));
+ cubeCards.add(new CardIdentity("Ethersworn Canonist", ""));
+ cubeCards.add(new CardIdentity("Eureka", ""));
+ cubeCards.add(new CardIdentity("Everflowing Chalice", ""));
+ cubeCards.add(new CardIdentity("Expedition Map", ""));
+ cubeCards.add(new CardIdentity("Experiment One", ""));
+ cubeCards.add(new CardIdentity("Explore", ""));
+ cubeCards.add(new CardIdentity("Fact or Fiction", ""));
+ cubeCards.add(new CardIdentity("Faithless Looting", ""));
+ cubeCards.add(new CardIdentity("Falkenrath Aristocrat", ""));
+ cubeCards.add(new CardIdentity("Far // Away", ""));
+ cubeCards.add(new CardIdentity("Fastbond", ""));
+ cubeCards.add(new CardIdentity("Fauna Shaman", ""));
+ cubeCards.add(new CardIdentity("Figure of Destiny", ""));
+ cubeCards.add(new CardIdentity("Fire // Ice", ""));
+ cubeCards.add(new CardIdentity("Fireblast", ""));
+ cubeCards.add(new CardIdentity("Firebolt", ""));
+ cubeCards.add(new CardIdentity("Firedrinker Satyr", ""));
+ cubeCards.add(new CardIdentity("Firestorm", ""));
+ cubeCards.add(new CardIdentity("Flagstones of Trokair", ""));
+ cubeCards.add(new CardIdentity("Flametongue Kavu", ""));
+ cubeCards.add(new CardIdentity("Flesh Carver", ""));
+ cubeCards.add(new CardIdentity("Flickerwisp", ""));
+ cubeCards.add(new CardIdentity("Flinthoof Boar", ""));
+ cubeCards.add(new CardIdentity("Flooded Strand", ""));
+ cubeCards.add(new CardIdentity("Force of Will", ""));
+ cubeCards.add(new CardIdentity("Forgotten Cave", ""));
+ cubeCards.add(new CardIdentity("Frantic Search", ""));
+ cubeCards.add(new CardIdentity("Frogmite", ""));
+ cubeCards.add(new CardIdentity("Fulminator Mage", ""));
+ cubeCards.add(new CardIdentity("Gaea's Cradle", ""));
+ cubeCards.add(new CardIdentity("Galvanic Blast", ""));
+ cubeCards.add(new CardIdentity("Gamble", ""));
+ cubeCards.add(new CardIdentity("Garruk Wildspeaker", ""));
+ cubeCards.add(new CardIdentity("Geist of Saint Traft", ""));
+ cubeCards.add(new CardIdentity("Gemstone Mine", ""));
+ cubeCards.add(new CardIdentity("Genesis Hydra", ""));
+ cubeCards.add(new CardIdentity("Ghitu Encampment", ""));
+ cubeCards.add(new CardIdentity("Ghor-Clan Rampager", ""));
+ cubeCards.add(new CardIdentity("Gideon, Ally of Zendikar", ""));
+ cubeCards.add(new CardIdentity("Gifts Ungiven", ""));
+ cubeCards.add(new CardIdentity("Gilded Lotus", ""));
+ cubeCards.add(new CardIdentity("Gitaxian Probe", ""));
+ cubeCards.add(new CardIdentity("Glint Hawk Idol", ""));
+ cubeCards.add(new CardIdentity("Gnarled Scarhide", ""));
+ cubeCards.add(new CardIdentity("Go for the Throat", ""));
+ cubeCards.add(new CardIdentity("Goblin Electromancer", ""));
+ cubeCards.add(new CardIdentity("Goblin Guide", ""));
+ cubeCards.add(new CardIdentity("Goblin Rabblemaster", ""));
+ cubeCards.add(new CardIdentity("Goblin Welder", ""));
+ cubeCards.add(new CardIdentity("Godless Shrine", ""));
+ cubeCards.add(new CardIdentity("Golgari Rot Farm", ""));
+ cubeCards.add(new CardIdentity("Grave Titan", ""));
+ cubeCards.add(new CardIdentity("Gravecrawler", ""));
+ cubeCards.add(new CardIdentity("Great Furnace", ""));
+ cubeCards.add(new CardIdentity("Greater Gargadon", ""));
+ cubeCards.add(new CardIdentity("Green Sun's Zenith", ""));
+ cubeCards.add(new CardIdentity("Grim Lavamancer", ""));
+ cubeCards.add(new CardIdentity("Grim Monolith", ""));
+ cubeCards.add(new CardIdentity("Griselbrand", ""));
+ cubeCards.add(new CardIdentity("Gush", ""));
+ cubeCards.add(new CardIdentity("Hallowed Fountain", ""));
+ cubeCards.add(new CardIdentity("Hallowed Spiritkeeper", ""));
+ cubeCards.add(new CardIdentity("Hangarback Walker", ""));
+ cubeCards.add(new CardIdentity("Harmonize", ""));
+ cubeCards.add(new CardIdentity("Heartbeat of Spring", ""));
+ cubeCards.add(new CardIdentity("Hellrider", ""));
+ cubeCards.add(new CardIdentity("Hellspark Elemental", ""));
+ cubeCards.add(new CardIdentity("Helm of Awakening", ""));
+ cubeCards.add(new CardIdentity("Hero of Bladehold", ""));
+ cubeCards.add(new CardIdentity("Hex Parasite", ""));
+ cubeCards.add(new CardIdentity("Hinterland Harbor", ""));
+ cubeCards.add(new CardIdentity("Hokori, Dust Drinker", ""));
+ cubeCards.add(new CardIdentity("Hooting Mandrills", ""));
+ cubeCards.add(new CardIdentity("Horizon Canopy", ""));
+ cubeCards.add(new CardIdentity("Hymn to Tourach", ""));
+ cubeCards.add(new CardIdentity("Imperial Recruiter", ""));
+ cubeCards.add(new CardIdentity("Imperial Seal", ""));
+ cubeCards.add(new CardIdentity("Inferno Titan", ""));
+ cubeCards.add(new CardIdentity("Inquisition of Kozilek", ""));
+ cubeCards.add(new CardIdentity("Isamaru, Hound of Konda", ""));
+ cubeCards.add(new CardIdentity("Isochron Scepter", ""));
+ cubeCards.add(new CardIdentity("Isolated Chapel", ""));
+ cubeCards.add(new CardIdentity("Izzet Signet", ""));
+ cubeCards.add(new CardIdentity("Jace, the Mind Sculptor", ""));
+ cubeCards.add(new CardIdentity("Jace, Vryn's Prodigy", ""));
+ cubeCards.add(new CardIdentity("Jeskai Ascendancy", ""));
+ cubeCards.add(new CardIdentity("Joraga Treespeaker", ""));
+ cubeCards.add(new CardIdentity("Kami of Ancient Law", ""));
+ cubeCards.add(new CardIdentity("Karakas", ""));
+ cubeCards.add(new CardIdentity("Karn Liberated", ""));
+ cubeCards.add(new CardIdentity("Keranos, God of Storms", ""));
+ cubeCards.add(new CardIdentity("Kessig Wolf Run", ""));
+ cubeCards.add(new CardIdentity("Kiki-Jiki, Mirror Breaker", ""));
+ cubeCards.add(new CardIdentity("Kira, Great Glass-Spinner", ""));
+ cubeCards.add(new CardIdentity("Kird Ape", ""));
+ cubeCards.add(new CardIdentity("Kitchen Finks", ""));
+ cubeCards.add(new CardIdentity("Knight of the Reliquary", ""));
+ cubeCards.add(new CardIdentity("Kolaghan's Command", ""));
+ cubeCards.add(new CardIdentity("Kytheon, Hero of Akros", ""));
+ cubeCards.add(new CardIdentity("Land Tax", ""));
+ cubeCards.add(new CardIdentity("Life from the Loam", ""));
+ cubeCards.add(new CardIdentity("Lightning Bolt", ""));
+ cubeCards.add(new CardIdentity("Lightning Helix", ""));
+ cubeCards.add(new CardIdentity("Lightning Mauler", ""));
+ cubeCards.add(new CardIdentity("Liliana of the Veil", ""));
+ cubeCards.add(new CardIdentity("Lim-Dul's Vault", ""));
+ cubeCards.add(new CardIdentity("Lingering Souls", ""));
+ cubeCards.add(new CardIdentity("Lion's Eye Diamond", ""));
+ cubeCards.add(new CardIdentity("Llanowar Elves", ""));
+ cubeCards.add(new CardIdentity("Loam Lion", ""));
+ cubeCards.add(new CardIdentity("Lodestone Golem", ""));
+ cubeCards.add(new CardIdentity("Lore Seeker", ""));
+ cubeCards.add(new CardIdentity("Lotus Cobra", ""));
+ cubeCards.add(new CardIdentity("Lotus Petal", ""));
+ cubeCards.add(new CardIdentity("Maelstrom Pulse", ""));
+ cubeCards.add(new CardIdentity("Magma Jet", ""));
+ cubeCards.add(new CardIdentity("Makindi Sliderunner", ""));
+ cubeCards.add(new CardIdentity("Mana Confluence", ""));
+ cubeCards.add(new CardIdentity("Mana Leak", ""));
+ cubeCards.add(new CardIdentity("Mardu Woe-Reaper", ""));
+ cubeCards.add(new CardIdentity("Marsh Flats", ""));
+ cubeCards.add(new CardIdentity("Martial Coup", ""));
+ cubeCards.add(new CardIdentity("Master of Etherium", ""));
+ cubeCards.add(new CardIdentity("Maze of Ith", ""));
+ cubeCards.add(new CardIdentity("Meloku the Clouded Mirror", ""));
+ cubeCards.add(new CardIdentity("Memnite", ""));
+ cubeCards.add(new CardIdentity("Memory Jar", ""));
+ cubeCards.add(new CardIdentity("Memory Lapse", ""));
+ cubeCards.add(new CardIdentity("Mentor of the Meek", ""));
+ cubeCards.add(new CardIdentity("Metalworker", ""));
+ cubeCards.add(new CardIdentity("Mind Stone", ""));
+ cubeCards.add(new CardIdentity("Mindslaver", ""));
+ cubeCards.add(new CardIdentity("Mirari's Wake", ""));
+ cubeCards.add(new CardIdentity("Mishra's Factory", ""));
+ cubeCards.add(new CardIdentity("Misty Rainforest", ""));
+ cubeCards.add(new CardIdentity("Molten Rain", ""));
+ cubeCards.add(new CardIdentity("Moment's Peace", ""));
+ cubeCards.add(new CardIdentity("Monastery Mentor", ""));
+ cubeCards.add(new CardIdentity("Monastery Swiftspear", ""));
+ cubeCards.add(new CardIdentity("Mother of Runes", ""));
+ cubeCards.add(new CardIdentity("Mox Diamond", ""));
+ cubeCards.add(new CardIdentity("Mox Opal", ""));
+ cubeCards.add(new CardIdentity("Mulldrifter", ""));
+ cubeCards.add(new CardIdentity("Murderous Cut", ""));
+ cubeCards.add(new CardIdentity("Mutavault", ""));
+ cubeCards.add(new CardIdentity("Myr Battlesphere", ""));
+ cubeCards.add(new CardIdentity("Myrsmith", ""));
+ cubeCards.add(new CardIdentity("Mystical Tutor", ""));
+ cubeCards.add(new CardIdentity("Necropotence", ""));
+ cubeCards.add(new CardIdentity("Nether Void", ""));
+ cubeCards.add(new CardIdentity("Noble Hierarch", ""));
+ cubeCards.add(new CardIdentity("Oath of Druids", ""));
+ cubeCards.add(new CardIdentity("Oblivion Ring", ""));
+ cubeCards.add(new CardIdentity("Ohran Viper", ""));
+ cubeCards.add(new CardIdentity("Oona's Prowler", ""));
+ cubeCards.add(new CardIdentity("Ophiomancer", ""));
+ cubeCards.add(new CardIdentity("Opposition", ""));
+ cubeCards.add(new CardIdentity("Oracle of Mul Daya", ""));
+ cubeCards.add(new CardIdentity("Orzhov Signet", ""));
+ cubeCards.add(new CardIdentity("Outpost Siege", ""));
+ cubeCards.add(new CardIdentity("Overgrown Tomb", ""));
+ cubeCards.add(new CardIdentity("Pack Rat", ""));
+ cubeCards.add(new CardIdentity("Painful Truths", ""));
+ cubeCards.add(new CardIdentity("Path to Exile", ""));
+ cubeCards.add(new CardIdentity("Pernicious Deed", ""));
+ cubeCards.add(new CardIdentity("Phantasmal Image", ""));
+ cubeCards.add(new CardIdentity("Phyrexian Arena", ""));
+ cubeCards.add(new CardIdentity("Phyrexian Metamorph", ""));
+ cubeCards.add(new CardIdentity("Phyrexian Revoker", ""));
+ cubeCards.add(new CardIdentity("Phyrexian Tower", ""));
+ cubeCards.add(new CardIdentity("Pia and Kiran Nalaar", ""));
+ cubeCards.add(new CardIdentity("Plateau", ""));
+ cubeCards.add(new CardIdentity("Plow Under", ""));
+ cubeCards.add(new CardIdentity("Polluted Delta", ""));
+ cubeCards.add(new CardIdentity("Ponder", ""));
+ cubeCards.add(new CardIdentity("Porcelain Legionnaire", ""));
+ cubeCards.add(new CardIdentity("Power Play", ""));
+ cubeCards.add(new CardIdentity("Precinct Captain", ""));
+ cubeCards.add(new CardIdentity("Precursor Golem", ""));
+ cubeCards.add(new CardIdentity("Preordain", ""));
+ cubeCards.add(new CardIdentity("Primeval Titan", ""));
+ cubeCards.add(new CardIdentity("Prismatic Lens", ""));
+ cubeCards.add(new CardIdentity("Prophetic Bolt", ""));
+ cubeCards.add(new CardIdentity("Putrid Imp", ""));
+ cubeCards.add(new CardIdentity("Qasali Pridemage", ""));
+ cubeCards.add(new CardIdentity("Rakdos Cackler", ""));
+ cubeCards.add(new CardIdentity("Rancor", ""));
+ cubeCards.add(new CardIdentity("Ranger of Eos", ""));
+ cubeCards.add(new CardIdentity("Ratchet Bomb", ""));
+ cubeCards.add(new CardIdentity("Ravenous Baboons", ""));
+ cubeCards.add(new CardIdentity("Razorverge Thicket", ""));
+ cubeCards.add(new CardIdentity("Reanimate", ""));
+ cubeCards.add(new CardIdentity("Reckless Charge", ""));
+ cubeCards.add(new CardIdentity("Reckless Waif", ""));
+ cubeCards.add(new CardIdentity("Reclamation Sage", ""));
+ cubeCards.add(new CardIdentity("Recurring Nightmare", ""));
+ cubeCards.add(new CardIdentity("Regrowth", ""));
+ cubeCards.add(new CardIdentity("Relic Seeker", ""));
+ cubeCards.add(new CardIdentity("Remand", ""));
+ cubeCards.add(new CardIdentity("Restoration Angel", ""));
+ cubeCards.add(new CardIdentity("Reveillark", ""));
+ cubeCards.add(new CardIdentity("Rishadan Port", ""));
+ cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary", ""));
+ cubeCards.add(new CardIdentity("Rude Awakening", ""));
+ cubeCards.add(new CardIdentity("Sacred Foundry", ""));
+ cubeCards.add(new CardIdentity("Sakura-Tribe Elder", ""));
+ cubeCards.add(new CardIdentity("Sarkhan, the Dragonspeaker", ""));
+ cubeCards.add(new CardIdentity("Savannah", ""));
+ cubeCards.add(new CardIdentity("Scalding Tarn", ""));
+ cubeCards.add(new CardIdentity("Scavenging Ooze", ""));
+ cubeCards.add(new CardIdentity("Scroll Rack", ""));
+ cubeCards.add(new CardIdentity("Scrubland", ""));
+ cubeCards.add(new CardIdentity("Scythe Leopard", ""));
+ cubeCards.add(new CardIdentity("Seachrome Coast", ""));
+ cubeCards.add(new CardIdentity("Searing Blaze", ""));
+ cubeCards.add(new CardIdentity("Seat of the Synod", ""));
+ cubeCards.add(new CardIdentity("Seeker of the Way", ""));
+ cubeCards.add(new CardIdentity("Seething Song", ""));
+ cubeCards.add(new CardIdentity("Sensei's Divining Top", ""));
+ cubeCards.add(new CardIdentity("Shadowmage Infiltrator", ""));
+ cubeCards.add(new CardIdentity("Shambling Vent", ""));
+ cubeCards.add(new CardIdentity("Shardless Agent", ""));
+ cubeCards.add(new CardIdentity("Shelldock Isle", ""));
+ cubeCards.add(new CardIdentity("Show and Tell", ""));
+ cubeCards.add(new CardIdentity("Shrapnel Blast", ""));
+ cubeCards.add(new CardIdentity("Siege Rhino", ""));
+ cubeCards.add(new CardIdentity("Signal Pest", ""));
+ cubeCards.add(new CardIdentity("Simic Growth Chamber", ""));
+ cubeCards.add(new CardIdentity("Simic Signet", ""));
+ cubeCards.add(new CardIdentity("Simic Sky Swallower", ""));
+ cubeCards.add(new CardIdentity("Sinkhole", ""));
+ cubeCards.add(new CardIdentity("Skullclamp", ""));
+ cubeCards.add(new CardIdentity("Skyshroud Elite", ""));
+ cubeCards.add(new CardIdentity("Smallpox", ""));
+ cubeCards.add(new CardIdentity("Smokestack", ""));
+ cubeCards.add(new CardIdentity("Snapcaster Mage", ""));
+ cubeCards.add(new CardIdentity("Sneak Attack", ""));
+ cubeCards.add(new CardIdentity("Soldier of the Pantheon", ""));
+ cubeCards.add(new CardIdentity("Solemn Simulacrum", ""));
+ cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad", ""));
+ cubeCards.add(new CardIdentity("Spear of Heliod", ""));
+ cubeCards.add(new CardIdentity("Spectral Procession", ""));
+ cubeCards.add(new CardIdentity("Spellskite", ""));
+ cubeCards.add(new CardIdentity("Sphere of Resistance", ""));
+ cubeCards.add(new CardIdentity("Sphinx's Revelation", ""));
+ cubeCards.add(new CardIdentity("Squee, Goblin Nabob", ""));
+ cubeCards.add(new CardIdentity("Standstill", ""));
+ cubeCards.add(new CardIdentity("Steam Vents", ""));
+ cubeCards.add(new CardIdentity("Steel Overseer", ""));
+ cubeCards.add(new CardIdentity("Steppe Lynx", ""));
+ cubeCards.add(new CardIdentity("Stoke the Flames", ""));
+ cubeCards.add(new CardIdentity("Stomping Ground", ""));
+ cubeCards.add(new CardIdentity("Stoneforge Mystic", ""));
+ cubeCards.add(new CardIdentity("Strangleroot Geist", ""));
+ cubeCards.add(new CardIdentity("Stratus Dancer", ""));
+ cubeCards.add(new CardIdentity("Strip Mine", ""));
+ cubeCards.add(new CardIdentity("Stromkirk Noble", ""));
+ cubeCards.add(new CardIdentity("Student of Warfare", ""));
+ cubeCards.add(new CardIdentity("Sudden Demise", ""));
+ cubeCards.add(new CardIdentity("Sudden Shock", ""));
+ cubeCards.add(new CardIdentity("Sulfur Falls", ""));
+ cubeCards.add(new CardIdentity("Sulfuric Vortex", ""));
+ cubeCards.add(new CardIdentity("Sun Titan", ""));
+ cubeCards.add(new CardIdentity("Sundering Titan", ""));
+ cubeCards.add(new CardIdentity("Survival of the Fittest", ""));
+ cubeCards.add(new CardIdentity("Sword of Feast and Famine", ""));
+ cubeCards.add(new CardIdentity("Sword of Fire and Ice", ""));
+ cubeCards.add(new CardIdentity("Swords to Plowshares", ""));
+ cubeCards.add(new CardIdentity("Sylvan Library", ""));
+ cubeCards.add(new CardIdentity("Taiga", ""));
+ cubeCards.add(new CardIdentity("Tangle Wire", ""));
+ cubeCards.add(new CardIdentity("Tarmogoyf", ""));
+ cubeCards.add(new CardIdentity("Tasigur, the Golden Fang", ""));
+ cubeCards.add(new CardIdentity("Teetering Peaks", ""));
+ cubeCards.add(new CardIdentity("Temple Garden", ""));
+ cubeCards.add(new CardIdentity("Temple of Epiphany", ""));
+ cubeCards.add(new CardIdentity("Temple of Malice", ""));
+ cubeCards.add(new CardIdentity("Tendrils of Agony", ""));
+ cubeCards.add(new CardIdentity("Terastodon", ""));
+ cubeCards.add(new CardIdentity("Terminate", ""));
+ cubeCards.add(new CardIdentity("Tezzeret, Agent of Bolas", ""));
+ cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben", ""));
+ cubeCards.add(new CardIdentity("The Abyss", ""));
+ cubeCards.add(new CardIdentity("The Tabernacle at Pendrell Vale", ""));
+ cubeCards.add(new CardIdentity("Thirst for Knowledge", ""));
+ cubeCards.add(new CardIdentity("Thopter Engineer", ""));
+ cubeCards.add(new CardIdentity("Thopter Spy Network", ""));
+ cubeCards.add(new CardIdentity("Thoughtseize", ""));
+ cubeCards.add(new CardIdentity("Thragtusk", ""));
+ cubeCards.add(new CardIdentity("Thran Dynamo", ""));
+ cubeCards.add(new CardIdentity("Tidehollow Sculler", ""));
+ cubeCards.add(new CardIdentity("Time Spiral", ""));
+ cubeCards.add(new CardIdentity("Timetwister", ""));
+ cubeCards.add(new CardIdentity("Tin Street Hooligan", ""));
+ cubeCards.add(new CardIdentity("Tinker", ""));
+ cubeCards.add(new CardIdentity("Tolarian Academy", ""));
+ cubeCards.add(new CardIdentity("Tooth and Nail", ""));
+ cubeCards.add(new CardIdentity("Tormented Hero", ""));
+ cubeCards.add(new CardIdentity("Tranquil Thicket", ""));
+ cubeCards.add(new CardIdentity("Treachery", ""));
+ cubeCards.add(new CardIdentity("Treasure Cruise", ""));
+ cubeCards.add(new CardIdentity("Tree of Tales", ""));
+ cubeCards.add(new CardIdentity("Treetop Village", ""));
+ cubeCards.add(new CardIdentity("Trinket Mage", ""));
+ cubeCards.add(new CardIdentity("Tropical Island", ""));
+ cubeCards.add(new CardIdentity("Trygon Predator", ""));
+ cubeCards.add(new CardIdentity("Tundra", ""));
+ cubeCards.add(new CardIdentity("Turnabout", ""));
+ cubeCards.add(new CardIdentity("Ugin, the Spirit Dragon", ""));
+ cubeCards.add(new CardIdentity("Umezawa's Jitte", ""));
+ cubeCards.add(new CardIdentity("Underground Sea", ""));
+ cubeCards.add(new CardIdentity("Unexpectedly Absent", ""));
+ cubeCards.add(new CardIdentity("Upheaval", ""));
+ cubeCards.add(new CardIdentity("Urborg, Tomb of Yawgmoth", ""));
+ cubeCards.add(new CardIdentity("Vampire Lacerator", ""));
+ cubeCards.add(new CardIdentity("Vampiric Tutor", ""));
+ cubeCards.add(new CardIdentity("Vault of Whispers", ""));
+ cubeCards.add(new CardIdentity("Vault Skirge", ""));
+ cubeCards.add(new CardIdentity("Vedalken Shackles", ""));
+ cubeCards.add(new CardIdentity("Vendilion Clique", ""));
+ cubeCards.add(new CardIdentity("Vengevine", ""));
+ cubeCards.add(new CardIdentity("Venser, Shaper Savant", ""));
+ cubeCards.add(new CardIdentity("Verdant Catacombs", ""));
+ cubeCards.add(new CardIdentity("Vindicate", ""));
+ cubeCards.add(new CardIdentity("Volcanic Island", ""));
+ cubeCards.add(new CardIdentity("Volrath's Stronghold", ""));
+ cubeCards.add(new CardIdentity("Voltaic Key", ""));
+ cubeCards.add(new CardIdentity("Wall of Blossoms", ""));
+ cubeCards.add(new CardIdentity("Wall of Omens", ""));
+ cubeCards.add(new CardIdentity("Wall of Roots", ""));
+ cubeCards.add(new CardIdentity("Wasteland", ""));
+ cubeCards.add(new CardIdentity("Waterfront Bouncer", ""));
+ cubeCards.add(new CardIdentity("Watery Grave", ""));
+ cubeCards.add(new CardIdentity("Wheel of Fortune", ""));
+ cubeCards.add(new CardIdentity("Whisperwood Elemental", ""));
+ cubeCards.add(new CardIdentity("Wild Nacatl", ""));
+ cubeCards.add(new CardIdentity("Wildfire", ""));
+ cubeCards.add(new CardIdentity("Windbrisk Heights", ""));
+ cubeCards.add(new CardIdentity("Windswept Heath", ""));
+ cubeCards.add(new CardIdentity("Winter Orb", ""));
+ cubeCards.add(new CardIdentity("Wooded Foothills", ""));
+ cubeCards.add(new CardIdentity("Woodland Cemetery", ""));
+ cubeCards.add(new CardIdentity("Worm Harvest", ""));
+ cubeCards.add(new CardIdentity("Wrath of God", ""));
+ cubeCards.add(new CardIdentity("Wurmcoil Engine", ""));
+ cubeCards.add(new CardIdentity("Xathrid Necromancer", ""));
+ cubeCards.add(new CardIdentity("Yawgmoth's Will", ""));
+ cubeCards.add(new CardIdentity("Young Pyromancer", ""));
+ cubeCards.add(new CardIdentity("Zurgo Bellstriker", ""));
+ }
+}
diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/LegendaryCube.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/LegendaryCube.java
new file mode 100644
index 00000000000..9e5c8a3573f
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/LegendaryCube.java
@@ -0,0 +1,641 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.tournament.cubes;
+
+import mage.game.draft.DraftCube;
+
+/**
+ *
+ * @author fireshoes
+ */
+
+public class LegendaryCube extends DraftCube {
+
+public LegendaryCube() {
+ super("Legendary Cube (598 cards)"); // http://magic.wizards.com/en/MTGO/articles/archive/legendary-cube-cardlist-2015-11-09
+
+ cubeCards.add(new CardIdentity("Aboshan, Cephalid Emperor", ""));
+ cubeCards.add(new CardIdentity("Absorb Vis", ""));
+ cubeCards.add(new CardIdentity("Akroma's Memorial", ""));
+ cubeCards.add(new CardIdentity("Akroma's Vengeance", ""));
+ cubeCards.add(new CardIdentity("Akroma, Angel of Wrath", ""));
+ cubeCards.add(new CardIdentity("Akuta, Born of Ash", ""));
+ cubeCards.add(new CardIdentity("Alesha, Who Smiles at Death", ""));
+ cubeCards.add(new CardIdentity("Alhammarret's Archive", ""));
+ cubeCards.add(new CardIdentity("All Suns' Dawn", ""));
+ cubeCards.add(new CardIdentity("Anafenza, Kin-Tree Spirit", ""));
+ cubeCards.add(new CardIdentity("Anger of the Gods", ""));
+ cubeCards.add(new CardIdentity("Anticipate", ""));
+ cubeCards.add(new CardIdentity("Arashi, the Sky Asunder", ""));
+ cubeCards.add(new CardIdentity("Arcane Denial", ""));
+ cubeCards.add(new CardIdentity("Arcane Sanctum", ""));
+ cubeCards.add(new CardIdentity("Arcanis the Omnipotent", ""));
+ cubeCards.add(new CardIdentity("Arid Mesa", ""));
+ cubeCards.add(new CardIdentity("Armillary Sphere", ""));
+ cubeCards.add(new CardIdentity("Ascendant Evincar", ""));
+ cubeCards.add(new CardIdentity("Ashling the Pilgrim", ""));
+ cubeCards.add(new CardIdentity("Ashling, the Extinguisher", ""));
+ cubeCards.add(new CardIdentity("Atarka, World Render", ""));
+ cubeCards.add(new CardIdentity("Austere Command", ""));
+ cubeCards.add(new CardIdentity("Avacyn, Angel of Hope", ""));
+ cubeCards.add(new CardIdentity("Ayumi, the Last Visitor", ""));
+ cubeCards.add(new CardIdentity("Azami, Lady of Scrolls", ""));
+ cubeCards.add(new CardIdentity("Azorius Chancery", ""));
+ cubeCards.add(new CardIdentity("Azorius Signet", ""));
+ cubeCards.add(new CardIdentity("Azusa, Lost but Seeking", ""));
+ cubeCards.add(new CardIdentity("Bad River", ""));
+ cubeCards.add(new CardIdentity("Badlands", ""));
+ cubeCards.add(new CardIdentity("Banishing Light", ""));
+ cubeCards.add(new CardIdentity("Basalt Monolith", ""));
+ cubeCards.add(new CardIdentity("Basilisk Collar", ""));
+ cubeCards.add(new CardIdentity("Bayou", ""));
+ cubeCards.add(new CardIdentity("Beacon of Destruction", ""));
+ cubeCards.add(new CardIdentity("Beacon of Tomorrows", ""));
+ cubeCards.add(new CardIdentity("Beast Within", ""));
+ cubeCards.add(new CardIdentity("Berserkers' Onslaught", ""));
+ cubeCards.add(new CardIdentity("Black Market", ""));
+ cubeCards.add(new CardIdentity("Black Sun's Zenith", ""));
+ cubeCards.add(new CardIdentity("Blasphemous Act", ""));
+ cubeCards.add(new CardIdentity("Blood Crypt", ""));
+ cubeCards.add(new CardIdentity("Bloodstained Mire", ""));
+ cubeCards.add(new CardIdentity("Bonfire of the Damned", ""));
+ cubeCards.add(new CardIdentity("Boros Garrison", ""));
+ cubeCards.add(new CardIdentity("Boros Signet", ""));
+ cubeCards.add(new CardIdentity("Brago, King Eternal", ""));
+ cubeCards.add(new CardIdentity("Brainbite", ""));
+ cubeCards.add(new CardIdentity("Brainstorm", ""));
+ cubeCards.add(new CardIdentity("Breeding Pool", ""));
+ cubeCards.add(new CardIdentity("Brimaz, King of Oreskos", ""));
+ cubeCards.add(new CardIdentity("Brion Stoutarm", ""));
+ cubeCards.add(new CardIdentity("Brothers Yamazaki", ""));
+ cubeCards.add(new CardIdentity("Brothers Yamazaki", ""));
+ cubeCards.add(new CardIdentity("Caged Sun", ""));
+ cubeCards.add(new CardIdentity("Calciform Pools", ""));
+ cubeCards.add(new CardIdentity("Canopy Vista", ""));
+ cubeCards.add(new CardIdentity("Captain Sisay", ""));
+ cubeCards.add(new CardIdentity("Careful Consideration", ""));
+ cubeCards.add(new CardIdentity("Cascade Bluffs", ""));
+ cubeCards.add(new CardIdentity("Catch // Release", ""));
+ cubeCards.add(new CardIdentity("Cauldron of Souls", ""));
+ cubeCards.add(new CardIdentity("Chain Reaction", ""));
+ cubeCards.add(new CardIdentity("Chainer's Edict", ""));
+ cubeCards.add(new CardIdentity("Champion's Helm", ""));
+ cubeCards.add(new CardIdentity("Chandra, Fire of Kaladesh", ""));
+ cubeCards.add(new CardIdentity("Charcoal Diamond", ""));
+ cubeCards.add(new CardIdentity("Cho-Manno, Revolutionary", ""));
+ cubeCards.add(new CardIdentity("Chromatic Lantern", ""));
+ cubeCards.add(new CardIdentity("Chromatic Sphere", ""));
+ cubeCards.add(new CardIdentity("Chromatic Star", ""));
+ cubeCards.add(new CardIdentity("Cinder Glade", ""));
+ cubeCards.add(new CardIdentity("Clifftop Retreat", ""));
+ cubeCards.add(new CardIdentity("Coalition Relic", ""));
+ cubeCards.add(new CardIdentity("Coalition Victory", ""));
+ cubeCards.add(new CardIdentity("Coldsteel Heart", ""));
+ cubeCards.add(new CardIdentity("Commander Eesha", ""));
+ cubeCards.add(new CardIdentity("Compulsive Research", ""));
+ cubeCards.add(new CardIdentity("Condemn", ""));
+ cubeCards.add(new CardIdentity("Conflux", ""));
+ cubeCards.add(new CardIdentity("Contagion Clasp", ""));
+ cubeCards.add(new CardIdentity("Council's Judgment", ""));
+ cubeCards.add(new CardIdentity("Crackling Doom", ""));
+ cubeCards.add(new CardIdentity("Crib Swap", ""));
+ cubeCards.add(new CardIdentity("Cromat", ""));
+ cubeCards.add(new CardIdentity("Crovax, Ascendant Hero", ""));
+ cubeCards.add(new CardIdentity("Cruel Ultimatum", ""));
+ cubeCards.add(new CardIdentity("Crumbling Necropolis", ""));
+ cubeCards.add(new CardIdentity("Crux of Fate", ""));
+ cubeCards.add(new CardIdentity("Crystal Ball", ""));
+ cubeCards.add(new CardIdentity("Cultivate", ""));
+ cubeCards.add(new CardIdentity("Cyclonic Rift", ""));
+ cubeCards.add(new CardIdentity("Daretti, Scrap Savant", ""));
+ cubeCards.add(new CardIdentity("Dark Depths", ""));
+ cubeCards.add(new CardIdentity("Daxos of Meletis", ""));
+ cubeCards.add(new CardIdentity("Day of Destiny", ""));
+ cubeCards.add(new CardIdentity("Death Denied", ""));
+ cubeCards.add(new CardIdentity("Detention Sphere", ""));
+ cubeCards.add(new CardIdentity("Devour Flesh", ""));
+ cubeCards.add(new CardIdentity("Devour in Shadow", ""));
+ cubeCards.add(new CardIdentity("Diabolic Tutor", ""));
+ cubeCards.add(new CardIdentity("Diaochan, Artful Beauty", ""));
+ cubeCards.add(new CardIdentity("Dimir Aqueduct", ""));
+ cubeCards.add(new CardIdentity("Dimir Signet", ""));
+ cubeCards.add(new CardIdentity("Disenchant", ""));
+ cubeCards.add(new CardIdentity("Dismantling Blow", ""));
+ cubeCards.add(new CardIdentity("Divine Reckoning", ""));
+ cubeCards.add(new CardIdentity("Door to Nothingness", ""));
+ cubeCards.add(new CardIdentity("Doran, the Siege Tower", ""));
+ cubeCards.add(new CardIdentity("Doubling Season", ""));
+ cubeCards.add(new CardIdentity("Dragon Breath", ""));
+ cubeCards.add(new CardIdentity("Dragonlord Atarka", ""));
+ cubeCards.add(new CardIdentity("Dragonlord Dromoka", ""));
+ cubeCards.add(new CardIdentity("Dragonlord Ojutai", ""));
+ cubeCards.add(new CardIdentity("Dragonlord Silumgar", ""));
+ cubeCards.add(new CardIdentity("Dragonskull Summit", ""));
+ cubeCards.add(new CardIdentity("Drana, Kalastria Bloodchief", ""));
+ cubeCards.add(new CardIdentity("Drana, Liberator of Malakir", ""));
+ cubeCards.add(new CardIdentity("Dreadship Reef", ""));
+ cubeCards.add(new CardIdentity("Dromoka's Command", ""));
+ cubeCards.add(new CardIdentity("Drowned Catacomb", ""));
+ cubeCards.add(new CardIdentity("Duress", ""));
+ cubeCards.add(new CardIdentity("Dwynen, Gilt-Leaf Daen", ""));
+ cubeCards.add(new CardIdentity("Edric, Spymaster of Trest", ""));
+ cubeCards.add(new CardIdentity("Eiganjo Castle", ""));
+ cubeCards.add(new CardIdentity("Eight-and-a-Half-Tails", ""));
+ cubeCards.add(new CardIdentity("Eladamri's Call", ""));
+ cubeCards.add(new CardIdentity("Eladamri, Lord of Leaves", ""));
+ cubeCards.add(new CardIdentity("Elbrus, the Binding Blade", ""));
+ cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite", ""));
+ cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn", ""));
+ cubeCards.add(new CardIdentity("Endrek Sahr, Master Breeder", ""));
+ cubeCards.add(new CardIdentity("Engineered Explosives", ""));
+ cubeCards.add(new CardIdentity("Enlightened Tutor", ""));
+ cubeCards.add(new CardIdentity("Esper Charm", ""));
+ cubeCards.add(new CardIdentity("Everflowing Chalice", ""));
+ cubeCards.add(new CardIdentity("Evolving Wilds", ""));
+ cubeCards.add(new CardIdentity("Exava, Rakdos Blood Witch", ""));
+ cubeCards.add(new CardIdentity("Experiment Kraj", ""));
+ cubeCards.add(new CardIdentity("Explore", ""));
+ cubeCards.add(new CardIdentity("Explosive Vegetation", ""));
+ cubeCards.add(new CardIdentity("Expunge", ""));
+ cubeCards.add(new CardIdentity("Ezuri, Claw of Progress", ""));
+ cubeCards.add(new CardIdentity("Fact or Fiction", ""));
+ cubeCards.add(new CardIdentity("Faith's Fetters", ""));
+ cubeCards.add(new CardIdentity("Faithless Looting", ""));
+ cubeCards.add(new CardIdentity("Far // Away", ""));
+ cubeCards.add(new CardIdentity("Farseek", ""));
+ cubeCards.add(new CardIdentity("Fellwar Stone", ""));
+ cubeCards.add(new CardIdentity("Fetid Heath", ""));
+ cubeCards.add(new CardIdentity("Fiery Confluence", ""));
+ cubeCards.add(new CardIdentity("Fiery Fall", ""));
+ cubeCards.add(new CardIdentity("Finest Hour", ""));
+ cubeCards.add(new CardIdentity("Fire Diamond", ""));
+ cubeCards.add(new CardIdentity("Fire-Lit Thicket", ""));
+ cubeCards.add(new CardIdentity("Firebolt", ""));
+ cubeCards.add(new CardIdentity("Fires of Yavimaya", ""));
+ cubeCards.add(new CardIdentity("Flood Plain", ""));
+ cubeCards.add(new CardIdentity("Flooded Grove", ""));
+ cubeCards.add(new CardIdentity("Flooded Strand", ""));
+ cubeCards.add(new CardIdentity("Forbidden Alchemy", ""));
+ cubeCards.add(new CardIdentity("Foresee", ""));
+ cubeCards.add(new CardIdentity("Frontier Bivouac", ""));
+ cubeCards.add(new CardIdentity("Fungal Reaches", ""));
+ cubeCards.add(new CardIdentity("Genesis Wave", ""));
+ cubeCards.add(new CardIdentity("Genju of the Realm", ""));
+ cubeCards.add(new CardIdentity("Ghave, Guru of Spores", ""));
+ cubeCards.add(new CardIdentity("Ghoulcaller Gisa", ""));
+ cubeCards.add(new CardIdentity("Gift of the Gargantuan", ""));
+ cubeCards.add(new CardIdentity("Gilded Light", ""));
+ cubeCards.add(new CardIdentity("Gilded Lotus", ""));
+ cubeCards.add(new CardIdentity("Gisela, Blade of Goldnight", ""));
+ cubeCards.add(new CardIdentity("Glacial Fortress", ""));
+ cubeCards.add(new CardIdentity("Gleam of Resistance", ""));
+ cubeCards.add(new CardIdentity("Glissa Sunseeker", ""));
+ cubeCards.add(new CardIdentity("Glissa, the Traitor", ""));
+ cubeCards.add(new CardIdentity("Godless Shrine", ""));
+ cubeCards.add(new CardIdentity("Godo, Bandit Warlord", ""));
+ cubeCards.add(new CardIdentity("Gods Willing", ""));
+ cubeCards.add(new CardIdentity("Golgari Rot Farm", ""));
+ cubeCards.add(new CardIdentity("Golgari Signet", ""));
+ cubeCards.add(new CardIdentity("Grasslands", ""));
+ cubeCards.add(new CardIdentity("Graven Cairns", ""));
+ cubeCards.add(new CardIdentity("Grenzo, Dungeon Warden", ""));
+ cubeCards.add(new CardIdentity("Griselbrand", ""));
+ cubeCards.add(new CardIdentity("Gruul Signet", ""));
+ cubeCards.add(new CardIdentity("Gruul Turf", ""));
+ cubeCards.add(new CardIdentity("Hallowed Fountain", ""));
+ cubeCards.add(new CardIdentity("Hanna, Ship's Navigator", ""));
+ cubeCards.add(new CardIdentity("Harmonize", ""));
+ cubeCards.add(new CardIdentity("Heartless Hidetsugu", ""));
+ cubeCards.add(new CardIdentity("Hedron Archive", ""));
+ cubeCards.add(new CardIdentity("Helvault", ""));
+ cubeCards.add(new CardIdentity("Hero's Blade", ""));
+ cubeCards.add(new CardIdentity("Hero's Demise", ""));
+ cubeCards.add(new CardIdentity("Hero's Downfall", ""));
+ cubeCards.add(new CardIdentity("Heroes' Podium", ""));
+ cubeCards.add(new CardIdentity("Hide // Seek", ""));
+ cubeCards.add(new CardIdentity("Hidetsugu's Second Rite", ""));
+ cubeCards.add(new CardIdentity("Hinterland Harbor", ""));
+ cubeCards.add(new CardIdentity("Homicidal Seclusion", ""));
+ cubeCards.add(new CardIdentity("Honden of Cleansing Fire", ""));
+ cubeCards.add(new CardIdentity("Honden of Infinite Rage", ""));
+ cubeCards.add(new CardIdentity("Honden of Life's Web", ""));
+ cubeCards.add(new CardIdentity("Honden of Night's Reach", ""));
+ cubeCards.add(new CardIdentity("Honden of Seeing Winds", ""));
+ cubeCards.add(new CardIdentity("Honor-Worn Shaku", ""));
+ cubeCards.add(new CardIdentity("Horobi, Death's Wail", ""));
+ cubeCards.add(new CardIdentity("Hua Tuo, Honored Physician", ""));
+ cubeCards.add(new CardIdentity("Hull Breach", ""));
+ cubeCards.add(new CardIdentity("Hythonia the Cruel", ""));
+ cubeCards.add(new CardIdentity("Ichor Wellspring", ""));
+ cubeCards.add(new CardIdentity("Impulse", ""));
+ cubeCards.add(new CardIdentity("Into the Roil", ""));
+ cubeCards.add(new CardIdentity("Isamaru, Hound of Konda", ""));
+ cubeCards.add(new CardIdentity("Isao, Enlightened Bushi", ""));
+ cubeCards.add(new CardIdentity("Isolated Chapel", ""));
+ cubeCards.add(new CardIdentity("Ith, High Arcanist", ""));
+ cubeCards.add(new CardIdentity("Izzet Boilerworks", ""));
+ cubeCards.add(new CardIdentity("Izzet Signet", ""));
+ cubeCards.add(new CardIdentity("Jace, Vryn's Prodigy", ""));
+ cubeCards.add(new CardIdentity("Jareth, Leonine Titan", ""));
+ cubeCards.add(new CardIdentity("Jaya Ballard, Task Mage", ""));
+ cubeCards.add(new CardIdentity("Jazal Goldmane", ""));
+ cubeCards.add(new CardIdentity("Jenara, Asura of War", ""));
+ cubeCards.add(new CardIdentity("Jeska, Warrior Adept", ""));
+ cubeCards.add(new CardIdentity("Jeskai Ascendancy", ""));
+ cubeCards.add(new CardIdentity("Jin-Gitaxias, Core Augur", ""));
+ cubeCards.add(new CardIdentity("Jiwari, the Earth Aflame", ""));
+ cubeCards.add(new CardIdentity("Jor Kadeen, the Prevailer", ""));
+ cubeCards.add(new CardIdentity("Jungle Shrine", ""));
+ cubeCards.add(new CardIdentity("Kaervek the Merciless", ""));
+ cubeCards.add(new CardIdentity("Kagemaro, First to Suffer", ""));
+ cubeCards.add(new CardIdentity("Kaho, Minamo Historian", ""));
+ cubeCards.add(new CardIdentity("Kalemne, Disciple of Iroas", ""));
+ cubeCards.add(new CardIdentity("Kalitas, Bloodchief of Ghet", ""));
+ cubeCards.add(new CardIdentity("Kamahl, Fist of Krosa", ""));
+ cubeCards.add(new CardIdentity("Kamahl, Pit Fighter", ""));
+ cubeCards.add(new CardIdentity("Karador, Ghost Chieftain", ""));
+ cubeCards.add(new CardIdentity("Karlov of the Ghost Council", ""));
+ cubeCards.add(new CardIdentity("Karn, Silver Golem", ""));
+ cubeCards.add(new CardIdentity("Kataki, War's Wage", ""));
+ cubeCards.add(new CardIdentity("Kazuul, Tyrant of the Cliffs", ""));
+ cubeCards.add(new CardIdentity("Keiga, the Tide Star", ""));
+ cubeCards.add(new CardIdentity("Kemba, Kha Regent", ""));
+ cubeCards.add(new CardIdentity("Keranos, God of Storms", ""));
+ cubeCards.add(new CardIdentity("Kira, Great Glass-Spinner", ""));
+ cubeCards.add(new CardIdentity("Kodama of the North Tree", ""));
+ cubeCards.add(new CardIdentity("Kodama's Reach", ""));
+ cubeCards.add(new CardIdentity("Kokusho, the Evening Star", ""));
+ cubeCards.add(new CardIdentity("Kolaghan's Command", ""));
+ cubeCards.add(new CardIdentity("Kolaghan, the Storm's Fury", ""));
+ cubeCards.add(new CardIdentity("Konda's Banner", ""));
+ cubeCards.add(new CardIdentity("Kongming, 'Sleeping Dragon'", ""));
+ cubeCards.add(new CardIdentity("Kozilek, Butcher of Truth", ""));
+ cubeCards.add(new CardIdentity("Krenko, Mob Boss", ""));
+ cubeCards.add(new CardIdentity("Kresh the Bloodbraided", ""));
+ cubeCards.add(new CardIdentity("Krosan Grip", ""));
+ cubeCards.add(new CardIdentity("Krosan Verge", ""));
+ cubeCards.add(new CardIdentity("Kumano, Master Yamabushi", ""));
+ cubeCards.add(new CardIdentity("Kurkesh, Onakke Ancient", ""));
+ cubeCards.add(new CardIdentity("Kytheon, Hero of Akros", ""));
+ cubeCards.add(new CardIdentity("Last Stand", ""));
+ cubeCards.add(new CardIdentity("Lavalanche", ""));
+ cubeCards.add(new CardIdentity("Legacy Weapon", ""));
+ cubeCards.add(new CardIdentity("Life's Legacy", ""));
+ cubeCards.add(new CardIdentity("Lightning Bolt", ""));
+ cubeCards.add(new CardIdentity("Lightning Greaves", ""));
+ cubeCards.add(new CardIdentity("Liliana, Heretical Healer", ""));
+ cubeCards.add(new CardIdentity("Linvala, Keeper of Silence", ""));
+ cubeCards.add(new CardIdentity("Llawan, Cephalid Empress", ""));
+ cubeCards.add(new CardIdentity("Lorthos, the Tidemaker", ""));
+ cubeCards.add(new CardIdentity("Lu Xun, Scholar General", ""));
+ cubeCards.add(new CardIdentity("Lyzolda, the Blood Witch", ""));
+ cubeCards.add(new CardIdentity("Maelstrom Nexus", ""));
+ cubeCards.add(new CardIdentity("Maelstrom Wanderer", ""));
+ cubeCards.add(new CardIdentity("Maga, Traitor to Mortals", ""));
+ cubeCards.add(new CardIdentity("Mage's Guile", ""));
+ cubeCards.add(new CardIdentity("Mageta the Lion", ""));
+ cubeCards.add(new CardIdentity("Mana Reflection", ""));
+ cubeCards.add(new CardIdentity("Marath, Will of the Wild", ""));
+ cubeCards.add(new CardIdentity("Marble Diamond", ""));
+ cubeCards.add(new CardIdentity("March of the Machines", ""));
+ cubeCards.add(new CardIdentity("Marchesa, the Black Rose", ""));
+ cubeCards.add(new CardIdentity("Marsh Flats", ""));
+ cubeCards.add(new CardIdentity("Mayael's Aria", ""));
+ cubeCards.add(new CardIdentity("Melek, Izzet Paragon", ""));
+ cubeCards.add(new CardIdentity("Memnarch", ""));
+ cubeCards.add(new CardIdentity("Meng Huo, Barbarian King", ""));
+ cubeCards.add(new CardIdentity("Meren of Clan Nel Toth", ""));
+ cubeCards.add(new CardIdentity("Mikaeus, the Lunarch", ""));
+ cubeCards.add(new CardIdentity("Mikaeus, the Unhallowed", ""));
+ cubeCards.add(new CardIdentity("Mikokoro, Center of the Sea", ""));
+ cubeCards.add(new CardIdentity("Minamo, School at Water's Edge", ""));
+ cubeCards.add(new CardIdentity("Mind Stone", ""));
+ cubeCards.add(new CardIdentity("Mind's Eye", ""));
+ cubeCards.add(new CardIdentity("Mindslaver", ""));
+ cubeCards.add(new CardIdentity("Mirari", ""));
+ cubeCards.add(new CardIdentity("Mirari's Wake", ""));
+ cubeCards.add(new CardIdentity("Miren, the Moaning Well", ""));
+ cubeCards.add(new CardIdentity("Mirri the Cursed", ""));
+ cubeCards.add(new CardIdentity("Mirri, Cat Warrior", ""));
+ cubeCards.add(new CardIdentity("Misdirection", ""));
+ cubeCards.add(new CardIdentity("Misty Rainforest", ""));
+ cubeCards.add(new CardIdentity("Mizzium Mortars", ""));
+ cubeCards.add(new CardIdentity("Mizzix of the Izmagnus", ""));
+ cubeCards.add(new CardIdentity("Mizzix's Mastery", ""));
+ cubeCards.add(new CardIdentity("Molten Slagheap", ""));
+ cubeCards.add(new CardIdentity("Momentous Fall", ""));
+ cubeCards.add(new CardIdentity("Mortify", ""));
+ cubeCards.add(new CardIdentity("Moss Diamond", ""));
+ cubeCards.add(new CardIdentity("Mountain Valley", ""));
+ cubeCards.add(new CardIdentity("Muddle the Mixture", ""));
+ cubeCards.add(new CardIdentity("Multani, Maro-Sorcerer", ""));
+ cubeCards.add(new CardIdentity("Muzzio, Visionary Architect", ""));
+ cubeCards.add(new CardIdentity("Mycosynth Wellspring", ""));
+ cubeCards.add(new CardIdentity("Myojin of Cleansing Fire", ""));
+ cubeCards.add(new CardIdentity("Myojin of Life's Web", ""));
+ cubeCards.add(new CardIdentity("Myriad Landscape", ""));
+ cubeCards.add(new CardIdentity("Mystic Confluence", ""));
+ cubeCards.add(new CardIdentity("Mystic Gate", ""));
+ cubeCards.add(new CardIdentity("Mystic Monastery", ""));
+ cubeCards.add(new CardIdentity("Nagao, Bound by Honor", ""));
+ cubeCards.add(new CardIdentity("Nath of the Gilt-Leaf", ""));
+ cubeCards.add(new CardIdentity("Naturalize", ""));
+ cubeCards.add(new CardIdentity("Negate", ""));
+ cubeCards.add(new CardIdentity("Night's Whisper", ""));
+ cubeCards.add(new CardIdentity("Nissa's Revelation", ""));
+ cubeCards.add(new CardIdentity("Nissa, Vastwood Seer", ""));
+ cubeCards.add(new CardIdentity("Niv-Mizzet, Dracogenius", ""));
+ cubeCards.add(new CardIdentity("Niv-Mizzet, the Firemind", ""));
+ cubeCards.add(new CardIdentity("Nomad Outpost", ""));
+ cubeCards.add(new CardIdentity("Noyan Dar, Roil Shaper", ""));
+ cubeCards.add(new CardIdentity("Ob Nixilis, the Fallen", ""));
+ cubeCards.add(new CardIdentity("Obelisk of Alara", ""));
+ cubeCards.add(new CardIdentity("Oblation", ""));
+ cubeCards.add(new CardIdentity("Oblivion Ring", ""));
+ cubeCards.add(new CardIdentity("Oblivion Stone", ""));
+ cubeCards.add(new CardIdentity("Obzedat, Ghost Council", ""));
+ cubeCards.add(new CardIdentity("Odric, Master Tactician", ""));
+ cubeCards.add(new CardIdentity("Okina, Temple to the Grandfathers", ""));
+ cubeCards.add(new CardIdentity("Omnath, Locus of Mana", ""));
+ cubeCards.add(new CardIdentity("Omnath, Locus of Rage", ""));
+ cubeCards.add(new CardIdentity("Opal-Eye, Konda's Yojimbo", ""));
+ cubeCards.add(new CardIdentity("Opulent Palace", ""));
+ cubeCards.add(new CardIdentity("Oran-Rief, the Vastwood", ""));
+ cubeCards.add(new CardIdentity("Orim, Samite Healer", ""));
+ cubeCards.add(new CardIdentity("Orzhov Basilica", ""));
+ cubeCards.add(new CardIdentity("Orzhov Signet", ""));
+ cubeCards.add(new CardIdentity("Outpost Siege", ""));
+ cubeCards.add(new CardIdentity("Overgrown Tomb", ""));
+ cubeCards.add(new CardIdentity("Panoptic Mirror", ""));
+ cubeCards.add(new CardIdentity("Pariah", ""));
+ cubeCards.add(new CardIdentity("Path to Exile", ""));
+ cubeCards.add(new CardIdentity("Pernicious Deed", ""));
+ cubeCards.add(new CardIdentity("Phage the Untouchable", ""));
+ cubeCards.add(new CardIdentity("Phyrexian Arena", ""));
+ cubeCards.add(new CardIdentity("Pia and Kiran Nalaar", ""));
+ cubeCards.add(new CardIdentity("Pianna, Nomad Captain", ""));
+ cubeCards.add(new CardIdentity("Pithing Needle", ""));
+ cubeCards.add(new CardIdentity("Plateau", ""));
+ cubeCards.add(new CardIdentity("Polluted Delta", ""));
+ cubeCards.add(new CardIdentity("Polukranos, World Eater", ""));
+ cubeCards.add(new CardIdentity("Praetor's Counsel", ""));
+ cubeCards.add(new CardIdentity("Prairie Stream", ""));
+ cubeCards.add(new CardIdentity("Prime Speaker Zegana", ""));
+ cubeCards.add(new CardIdentity("Primeval Bounty", ""));
+ cubeCards.add(new CardIdentity("Prismatic Lens", ""));
+ cubeCards.add(new CardIdentity("Progenitus", ""));
+ cubeCards.add(new CardIdentity("Prophetic Prism", ""));
+ cubeCards.add(new CardIdentity("Psychotic Fury", ""));
+ cubeCards.add(new CardIdentity("Pure // Simple", ""));
+ cubeCards.add(new CardIdentity("Putrefy", ""));
+ cubeCards.add(new CardIdentity("Pyromancer's Goggles", ""));
+ cubeCards.add(new CardIdentity("Radha, Heir to Keld", ""));
+ cubeCards.add(new CardIdentity("Radiant Purge", ""));
+ cubeCards.add(new CardIdentity("Radiant's Judgment", ""));
+ cubeCards.add(new CardIdentity("Rafiq of the Many", ""));
+ cubeCards.add(new CardIdentity("Rakdos Carnarium", ""));
+ cubeCards.add(new CardIdentity("Rakdos Signet", ""));
+ cubeCards.add(new CardIdentity("Rakka Mar", ""));
+ cubeCards.add(new CardIdentity("Rampant Growth", ""));
+ cubeCards.add(new CardIdentity("Ray of Command", ""));
+ cubeCards.add(new CardIdentity("Read the Bones", ""));
+ cubeCards.add(new CardIdentity("Recoup", ""));
+ cubeCards.add(new CardIdentity("Reflecting Pool", ""));
+ cubeCards.add(new CardIdentity("Regrowth", ""));
+ cubeCards.add(new CardIdentity("Reiterate", ""));
+ cubeCards.add(new CardIdentity("Reki, the History of Kamigawa", ""));
+ cubeCards.add(new CardIdentity("Repeal", ""));
+ cubeCards.add(new CardIdentity("Repulse", ""));
+ cubeCards.add(new CardIdentity("Rescind", ""));
+ cubeCards.add(new CardIdentity("Reya Dawnbringer", ""));
+ cubeCards.add(new CardIdentity("Rhys the Redeemed", ""));
+ cubeCards.add(new CardIdentity("Righteous Confluence", ""));
+ cubeCards.add(new CardIdentity("Rings of Brighthearth", ""));
+ cubeCards.add(new CardIdentity("Rocky Tar Pit", ""));
+ cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary", ""));
+ cubeCards.add(new CardIdentity("Rootbound Crag", ""));
+ cubeCards.add(new CardIdentity("Rorix Bladewing", ""));
+ cubeCards.add(new CardIdentity("Rugged Prairie", ""));
+ cubeCards.add(new CardIdentity("Rupture Spire", ""));
+ cubeCards.add(new CardIdentity("Ruric Thar, the Unbowed", ""));
+ cubeCards.add(new CardIdentity("Rush of Knowledge", ""));
+ cubeCards.add(new CardIdentity("Ryusei, the Falling Star", ""));
+ cubeCards.add(new CardIdentity("Sachi, Daughter of Seshiro", ""));
+ cubeCards.add(new CardIdentity("Sacred Foundry", ""));
+ cubeCards.add(new CardIdentity("Saffi Eriksdotter", ""));
+ cubeCards.add(new CardIdentity("Sakashima the Impostor", ""));
+ cubeCards.add(new CardIdentity("Saltcrusted Steppe", ""));
+ cubeCards.add(new CardIdentity("Sandsteppe Citadel", ""));
+ cubeCards.add(new CardIdentity("Savage Lands", ""));
+ cubeCards.add(new CardIdentity("Savannah", ""));
+ cubeCards.add(new CardIdentity("Scalding Tarn", ""));
+ cubeCards.add(new CardIdentity("Scion of the Ur-Dragon", ""));
+ cubeCards.add(new CardIdentity("Scrap", ""));
+ cubeCards.add(new CardIdentity("Scrubland", ""));
+ cubeCards.add(new CardIdentity("Sculpting Steel", ""));
+ cubeCards.add(new CardIdentity("Search for Tomorrow", ""));
+ cubeCards.add(new CardIdentity("Seaside Citadel", ""));
+ cubeCards.add(new CardIdentity("Seizan, Perverter of Truth", ""));
+ cubeCards.add(new CardIdentity("Selesnya Sanctuary", ""));
+ cubeCards.add(new CardIdentity("Selesnya Signet", ""));
+ cubeCards.add(new CardIdentity("Sensei Golden-Tail", ""));
+ cubeCards.add(new CardIdentity("Sharuum the Hegemon", ""));
+ cubeCards.add(new CardIdentity("Shattergang Brothers", ""));
+ cubeCards.add(new CardIdentity("Sheoldred, Whispering One", ""));
+ cubeCards.add(new CardIdentity("Shinka, the Bloodsoaked Keep", ""));
+ cubeCards.add(new CardIdentity("Shizo, Death's Storehouse", ""));
+ cubeCards.add(new CardIdentity("Shu Yun, the Silent Tempest", ""));
+ cubeCards.add(new CardIdentity("Sidar Jabari", ""));
+ cubeCards.add(new CardIdentity("Sidisi, Brood Tyrant", ""));
+ cubeCards.add(new CardIdentity("Sidisi, Undead Vizier", ""));
+ cubeCards.add(new CardIdentity("Sigarda, Host of Herons", ""));
+ cubeCards.add(new CardIdentity("Sign in Blood", ""));
+ cubeCards.add(new CardIdentity("Silence the Believers", ""));
+ cubeCards.add(new CardIdentity("Silumgar's Command", ""));
+ cubeCards.add(new CardIdentity("Silumgar, the Drifting Death", ""));
+ cubeCards.add(new CardIdentity("Silvos, Rogue Elemental", ""));
+ cubeCards.add(new CardIdentity("Simic Growth Chamber", ""));
+ cubeCards.add(new CardIdentity("Simic Signet", ""));
+ cubeCards.add(new CardIdentity("Skullbriar, the Walking Grave", ""));
+ cubeCards.add(new CardIdentity("Sky Diamond", ""));
+ cubeCards.add(new CardIdentity("Skyship Weatherlight", ""));
+ cubeCards.add(new CardIdentity("Smoldering Marsh", ""));
+ cubeCards.add(new CardIdentity("Song of the Dryads", ""));
+ cubeCards.add(new CardIdentity("Sorin's Vengeance", ""));
+ cubeCards.add(new CardIdentity("Soul's Fire", ""));
+ cubeCards.add(new CardIdentity("Sphere of the Suns", ""));
+ cubeCards.add(new CardIdentity("Sphinx-Bone Wand", ""));
+ cubeCards.add(new CardIdentity("Spine of Ish Sah", ""));
+ cubeCards.add(new CardIdentity("Spirit of the Night", ""));
+ cubeCards.add(new CardIdentity("Spite // Malice", ""));
+ cubeCards.add(new CardIdentity("Squee, Goblin Nabob", ""));
+ cubeCards.add(new CardIdentity("Staff of Nin", ""));
+ cubeCards.add(new CardIdentity("Steam Vents", ""));
+ cubeCards.add(new CardIdentity("Stitcher Geralf", ""));
+ cubeCards.add(new CardIdentity("Stomping Ground", ""));
+ cubeCards.add(new CardIdentity("Stubborn Denial", ""));
+ cubeCards.add(new CardIdentity("Sulfur Falls", ""));
+ cubeCards.add(new CardIdentity("Sultai Charm", ""));
+ cubeCards.add(new CardIdentity("Sun Ce, Young Conquerer", ""));
+ cubeCards.add(new CardIdentity("Sun Quan, Lord of Wu", ""));
+ cubeCards.add(new CardIdentity("Sunken Hollow", ""));
+ cubeCards.add(new CardIdentity("Sunken Ruins", ""));
+ cubeCards.add(new CardIdentity("Sunpetal Grove", ""));
+ cubeCards.add(new CardIdentity("Surrak Dragonclaw", ""));
+ cubeCards.add(new CardIdentity("Surrak, the Hunt Caller", ""));
+ cubeCards.add(new CardIdentity("Swiftfoot Boots", ""));
+ cubeCards.add(new CardIdentity("Sword of the Animist", ""));
+ cubeCards.add(new CardIdentity("Sword of the Chosen", ""));
+ cubeCards.add(new CardIdentity("Sydri, Galvanic Genius", ""));
+ cubeCards.add(new CardIdentity("Sygg, River Cutthroat", ""));
+ cubeCards.add(new CardIdentity("Sygg, River Guide", ""));
+ cubeCards.add(new CardIdentity("Sylvan Bounty", ""));
+ cubeCards.add(new CardIdentity("Tahngarth, Talruum Hero", ""));
+ cubeCards.add(new CardIdentity("Taiga", ""));
+ cubeCards.add(new CardIdentity("Tainted Pact", ""));
+ cubeCards.add(new CardIdentity("Tajic, Blade of the Legion", ""));
+ cubeCards.add(new CardIdentity("Talisman of Dominance", ""));
+ cubeCards.add(new CardIdentity("Talisman of Impulse", ""));
+ cubeCards.add(new CardIdentity("Talisman of Indulgence", ""));
+ cubeCards.add(new CardIdentity("Talisman of Progress", ""));
+ cubeCards.add(new CardIdentity("Talisman of Unity", ""));
+ cubeCards.add(new CardIdentity("Talrand, Sky Summoner", ""));
+ cubeCards.add(new CardIdentity("Tasigur, the Golden Fang", ""));
+ cubeCards.add(new CardIdentity("Tatsumasa, the Dragon's Fang", ""));
+ cubeCards.add(new CardIdentity("Teferi, Mage of Zhalfir", ""));
+ cubeCards.add(new CardIdentity("Temple Garden", ""));
+ cubeCards.add(new CardIdentity("Temple of Abandon", ""));
+ cubeCards.add(new CardIdentity("Temple of Deceit", ""));
+ cubeCards.add(new CardIdentity("Temple of Enlightenment", ""));
+ cubeCards.add(new CardIdentity("Temple of Epiphany", ""));
+ cubeCards.add(new CardIdentity("Temple of Malady", ""));
+ cubeCards.add(new CardIdentity("Temple of Malice", ""));
+ cubeCards.add(new CardIdentity("Temple of Mystery", ""));
+ cubeCards.add(new CardIdentity("Temple of Plenty", ""));
+ cubeCards.add(new CardIdentity("Temple of Silence", ""));
+ cubeCards.add(new CardIdentity("Temple of the False God", ""));
+ cubeCards.add(new CardIdentity("Temple of Triumph", ""));
+ cubeCards.add(new CardIdentity("Temur Ascendancy", ""));
+ cubeCards.add(new CardIdentity("Temur Battle Rage", ""));
+ cubeCards.add(new CardIdentity("Tenza, Godo's Maul", ""));
+ cubeCards.add(new CardIdentity("Terminate", ""));
+ cubeCards.add(new CardIdentity("Terramorphic Expanse", ""));
+ cubeCards.add(new CardIdentity("Terrarion", ""));
+ cubeCards.add(new CardIdentity("Teysa, Envoy of Ghosts", ""));
+ cubeCards.add(new CardIdentity("Tezzeret the Seeker", ""));
+ cubeCards.add(new CardIdentity("Thada Adel, Acquisitor", ""));
+ cubeCards.add(new CardIdentity("That Which Was Taken", ""));
+ cubeCards.add(new CardIdentity("The Mimeoplasm", ""));
+ cubeCards.add(new CardIdentity("Thirst for Knowledge", ""));
+ cubeCards.add(new CardIdentity("Thran Dynamo", ""));
+ cubeCards.add(new CardIdentity("Thraximundar", ""));
+ cubeCards.add(new CardIdentity("Thrun, the Last Troll", ""));
+ cubeCards.add(new CardIdentity("Time of Need", ""));
+ cubeCards.add(new CardIdentity("Time Stop", ""));
+ cubeCards.add(new CardIdentity("Time Warp", ""));
+ cubeCards.add(new CardIdentity("Titania, Protector of Argoth", ""));
+ cubeCards.add(new CardIdentity("Tithe", ""));
+ cubeCards.add(new CardIdentity("Tolsimir Wolfblood", ""));
+ cubeCards.add(new CardIdentity("Tomorrow, Azami's Familiar", ""));
+ cubeCards.add(new CardIdentity("Tormenting Voice", ""));
+ cubeCards.add(new CardIdentity("Toshiro Umezawa", ""));
+ cubeCards.add(new CardIdentity("Toxic Deluge", ""));
+ cubeCards.add(new CardIdentity("Trading Post", ""));
+ cubeCards.add(new CardIdentity("Tragic Slip", ""));
+ cubeCards.add(new CardIdentity("Transguild Promenade", ""));
+ cubeCards.add(new CardIdentity("Traumatic Visions", ""));
+ cubeCards.add(new CardIdentity("Tribute to Hunger", ""));
+ cubeCards.add(new CardIdentity("Tromokratis", ""));
+ cubeCards.add(new CardIdentity("Tropical Island", ""));
+ cubeCards.add(new CardIdentity("Tsabo Tavoc", ""));
+ cubeCards.add(new CardIdentity("Tuktuk the Explorer", ""));
+ cubeCards.add(new CardIdentity("Tumble Magnet", ""));
+ cubeCards.add(new CardIdentity("Tundra", ""));
+ cubeCards.add(new CardIdentity("Turn // Burn", ""));
+ cubeCards.add(new CardIdentity("Twilight Mire", ""));
+ cubeCards.add(new CardIdentity("Tymaret, the Murder King", ""));
+ cubeCards.add(new CardIdentity("Ugin's Insight", ""));
+ cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre", ""));
+ cubeCards.add(new CardIdentity("Ultimate Price", ""));
+ cubeCards.add(new CardIdentity("Underground Sea", ""));
+ cubeCards.add(new CardIdentity("Unexpectedly Absent", ""));
+ cubeCards.add(new CardIdentity("Unstable Obelisk", ""));
+ cubeCards.add(new CardIdentity("Untaidake, the Cloud Keeper", ""));
+ cubeCards.add(new CardIdentity("Urabrask the Hidden", ""));
+ cubeCards.add(new CardIdentity("Urban Evolution", ""));
+ cubeCards.add(new CardIdentity("Urza's Rage", ""));
+ cubeCards.add(new CardIdentity("Utter End", ""));
+ cubeCards.add(new CardIdentity("Uyo, Silent Prophet", ""));
+ cubeCards.add(new CardIdentity("Valorous Stance", ""));
+ cubeCards.add(new CardIdentity("Vampiric Tutor", ""));
+ cubeCards.add(new CardIdentity("Vanish into Memory", ""));
+ cubeCards.add(new CardIdentity("Vedalken Orrery", ""));
+ cubeCards.add(new CardIdentity("Vendetta", ""));
+ cubeCards.add(new CardIdentity("Vendilion Clique", ""));
+ cubeCards.add(new CardIdentity("Venser, Shaper Savant", ""));
+ cubeCards.add(new CardIdentity("Verdant Catacombs", ""));
+ cubeCards.add(new CardIdentity("Verdant Confluence", ""));
+ cubeCards.add(new CardIdentity("Verdeloth the Ancient", ""));
+ cubeCards.add(new CardIdentity("Vicious Shadows", ""));
+ cubeCards.add(new CardIdentity("Visara the Dreadful", ""));
+ cubeCards.add(new CardIdentity("Vish Kal, Blood Arbiter", ""));
+ cubeCards.add(new CardIdentity("Volcanic Island", ""));
+ cubeCards.add(new CardIdentity("Vorel of the Hull Clade", ""));
+ cubeCards.add(new CardIdentity("Vorinclex, Voice of Hunger", ""));
+ cubeCards.add(new CardIdentity("Warstorm Surge", ""));
+ cubeCards.add(new CardIdentity("Watery Grave", ""));
+ cubeCards.add(new CardIdentity("Wayfarer's Bauble", ""));
+ cubeCards.add(new CardIdentity("Wear // Tear", ""));
+ cubeCards.add(new CardIdentity("Whispers of the Muse", ""));
+ cubeCards.add(new CardIdentity("Wild Ricochet", ""));
+ cubeCards.add(new CardIdentity("Windswept Heath", ""));
+ cubeCards.add(new CardIdentity("Wooded Bastion", ""));
+ cubeCards.add(new CardIdentity("Wooded Foothills", ""));
+ cubeCards.add(new CardIdentity("Woodland Cemetery", ""));
+ cubeCards.add(new CardIdentity("Word of Seizing", ""));
+ cubeCards.add(new CardIdentity("Worldly Tutor", ""));
+ cubeCards.add(new CardIdentity("Worn Powerstone", ""));
+ cubeCards.add(new CardIdentity("Wort, the Raidmother", ""));
+ cubeCards.add(new CardIdentity("Wrath of God", ""));
+ cubeCards.add(new CardIdentity("Wretched Confluence", ""));
+ cubeCards.add(new CardIdentity("Wrexial, the Risen Deep", ""));
+ cubeCards.add(new CardIdentity("Wydwen, the Biting Gale", ""));
+ cubeCards.add(new CardIdentity("Xenagos, God of Revels", ""));
+ cubeCards.add(new CardIdentity("Xiahou Dun, the One-Eyed", ""));
+ cubeCards.add(new CardIdentity("Yasova Dragonclaw", ""));
+ cubeCards.add(new CardIdentity("Yawgmoth's Agenda", ""));
+ cubeCards.add(new CardIdentity("Yeva, Nature's Herald", ""));
+ cubeCards.add(new CardIdentity("Yisan, the Wanderer Bard", ""));
+ cubeCards.add(new CardIdentity("Yomiji, Who Bars the Way", ""));
+ cubeCards.add(new CardIdentity("Yosei, the Morning Star", ""));
+ cubeCards.add(new CardIdentity("Zedruu the Greathearted", ""));
+ cubeCards.add(new CardIdentity("Zirilan of the Claw", ""));
+ cubeCards.add(new CardIdentity("Zurgo Bellstriker", ""));
+ cubeCards.add(new CardIdentity("Zurgo Helmsmasher", ""));
+ }
+}
diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCube.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCube.java
index 468be41dc97..5221f4668ca 100644
--- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCube.java
+++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCube.java
@@ -1,643 +1,642 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.tournament.cubes;
-
-import mage.game.draft.DraftCube;
-
-/**
- *
- * @author LevelX2
- */
-
-public class MTGOLegacyCube extends DraftCube {
-
- public MTGOLegacyCube() {
- super("MTGO Legacy Cube (600 cards)");
- cubeCards.add(new CardIdentity("Accorder Paladin",""));
- cubeCards.add(new CardIdentity("Abrupt Decay",""));
- cubeCards.add(new CardIdentity("Acidic Slime",""));
- cubeCards.add(new CardIdentity("Act of Aggression",""));
- cubeCards.add(new CardIdentity("Adarkar Wastes",""));
- cubeCards.add(new CardIdentity("AEther Vial",""));
- cubeCards.add(new CardIdentity("Ajani Goldmane",""));
- cubeCards.add(new CardIdentity("Ajani Steadfast",""));
- cubeCards.add(new CardIdentity("Ajani Vengeant",""));
- cubeCards.add(new CardIdentity("Ajani, Caller of the Pride",""));
- cubeCards.add(new CardIdentity("Ajani, Mentor of Heroes",""));
- cubeCards.add(new CardIdentity("Ancestral Vision",""));
- cubeCards.add(new CardIdentity("Ancient Grudge",""));
- cubeCards.add(new CardIdentity("Ancient Tomb",""));
- cubeCards.add(new CardIdentity("Angel of Serenity",""));
- cubeCards.add(new CardIdentity("Angelic Destiny",""));
- cubeCards.add(new CardIdentity("Anger of the Gods",""));
- cubeCards.add(new CardIdentity("Animate Dead",""));
- cubeCards.add(new CardIdentity("Arbor Elf",""));
- cubeCards.add(new CardIdentity("Arc Trail",""));
- cubeCards.add(new CardIdentity("Archangel of Thune",""));
- cubeCards.add(new CardIdentity("Arid Mesa",""));
- cubeCards.add(new CardIdentity("Armageddon",""));
- cubeCards.add(new CardIdentity("Ashcloud Phoenix",""));
- cubeCards.add(new CardIdentity("Ashiok, Nightmare Weaver",""));
- cubeCards.add(new CardIdentity("Augur of Bolas",""));
- cubeCards.add(new CardIdentity("Avacyn's Pilgrim",""));
- cubeCards.add(new CardIdentity("Avalanche Riders",""));
- cubeCards.add(new CardIdentity("Avenger of Zendikar",""));
- cubeCards.add(new CardIdentity("Awakening Zone",""));
- cubeCards.add(new CardIdentity("Bad Moon",""));
- cubeCards.add(new CardIdentity("Badlands",""));
- cubeCards.add(new CardIdentity("Baleful Strix",""));
- cubeCards.add(new CardIdentity("Baneslayer Angel",""));
- cubeCards.add(new CardIdentity("Banisher Priest",""));
- cubeCards.add(new CardIdentity("Banishing Light",""));
- cubeCards.add(new CardIdentity("Basalt Monolith",""));
- cubeCards.add(new CardIdentity("Basilisk Collar",""));
- cubeCards.add(new CardIdentity("Batterskull",""));
- cubeCards.add(new CardIdentity("Battlefield Forge",""));
- cubeCards.add(new CardIdentity("Bayou",""));
- cubeCards.add(new CardIdentity("Beast Within",""));
- cubeCards.add(new CardIdentity("Beetleback Chief",""));
- cubeCards.add(new CardIdentity("Bident of Thassa",""));
- cubeCards.add(new CardIdentity("Birds of Paradise",""));
- cubeCards.add(new CardIdentity("Birthing Pod",""));
- cubeCards.add(new CardIdentity("Bitterblossom",""));
- cubeCards.add(new CardIdentity("Black Sun's Zenith",""));
- cubeCards.add(new CardIdentity("Blade Splicer",""));
- cubeCards.add(new CardIdentity("Blood Crypt",""));
- cubeCards.add(new CardIdentity("Bloodbraid Elf",""));
- cubeCards.add(new CardIdentity("Bloodghast",""));
- cubeCards.add(new CardIdentity("Bloodline Keeper",""));
- cubeCards.add(new CardIdentity("Bloodsoaked Champion",""));
- cubeCards.add(new CardIdentity("Bloodstained Mire",""));
- cubeCards.add(new CardIdentity("Bone Shredder",""));
- cubeCards.add(new CardIdentity("Bonesplitter",""));
- cubeCards.add(new CardIdentity("Bonfire of the Damned",""));
- cubeCards.add(new CardIdentity("Boon Satyr",""));
- cubeCards.add(new CardIdentity("Borderland Marauder",""));
- cubeCards.add(new CardIdentity("Boros Charm",""));
- cubeCards.add(new CardIdentity("Boros Elite",""));
- cubeCards.add(new CardIdentity("Boros Reckoner",""));
- cubeCards.add(new CardIdentity("Brago, King Eternal",""));
- cubeCards.add(new CardIdentity("Brain Maggot",""));
- cubeCards.add(new CardIdentity("Brainstorm",""));
- cubeCards.add(new CardIdentity("Breeding Pool",""));
- cubeCards.add(new CardIdentity("Brimaz, King of Oreskos",""));
- cubeCards.add(new CardIdentity("Brimstone Volley",""));
- cubeCards.add(new CardIdentity("Brushland",""));
- cubeCards.add(new CardIdentity("Burning-Tree Emissary",""));
- cubeCards.add(new CardIdentity("Burst Lightning",""));
- cubeCards.add(new CardIdentity("Call of the Herd",""));
- cubeCards.add(new CardIdentity("Carnophage",""));
- cubeCards.add(new CardIdentity("Caves of Koilos",""));
- cubeCards.add(new CardIdentity("Chain Lightning",""));
- cubeCards.add(new CardIdentity("Chainer's Edict",""));
- cubeCards.add(new CardIdentity("Chameleon Colossus",""));
- cubeCards.add(new CardIdentity("Champion of the Parish",""));
- cubeCards.add(new CardIdentity("Chandra, Pyromaster",""));
- cubeCards.add(new CardIdentity("Chandra's Phoenix",""));
- cubeCards.add(new CardIdentity("Char",""));
- cubeCards.add(new CardIdentity("Chasm Skulker",""));
- cubeCards.add(new CardIdentity("Chord of Calling",""));
- cubeCards.add(new CardIdentity("Chrome Mox",""));
- cubeCards.add(new CardIdentity("City of Brass",""));
- cubeCards.add(new CardIdentity("Clifftop Retreat",""));
- cubeCards.add(new CardIdentity("Cloudfin Raptor",""));
- cubeCards.add(new CardIdentity("Cloudgoat Ranger",""));
- cubeCards.add(new CardIdentity("Coalition Relic",""));
- cubeCards.add(new CardIdentity("Commune with the Gods",""));
- cubeCards.add(new CardIdentity("Compulsive Research",""));
- cubeCards.add(new CardIdentity("Condemn",""));
- cubeCards.add(new CardIdentity("Condescend",""));
- cubeCards.add(new CardIdentity("Consecrated Sphinx",""));
- cubeCards.add(new CardIdentity("Consuming Vapors",""));
- cubeCards.add(new CardIdentity("Control Magic",""));
- cubeCards.add(new CardIdentity("Coralhelm Commander",""));
- cubeCards.add(new CardIdentity("Corrupt",""));
- cubeCards.add(new CardIdentity("Council's Judgment",""));
- cubeCards.add(new CardIdentity("Counterspell",""));
- cubeCards.add(new CardIdentity("Courser of Kruphix",""));
- cubeCards.add(new CardIdentity("Crater's Claws",""));
- cubeCards.add(new CardIdentity("Craterhoof Behemoth",""));
- cubeCards.add(new CardIdentity("Crusade",""));
- cubeCards.add(new CardIdentity("Cryptic Command",""));
- cubeCards.add(new CardIdentity("Cultivate",""));
- cubeCards.add(new CardIdentity("Cunning Sparkmage",""));
- cubeCards.add(new CardIdentity("Curse of Predation",""));
- cubeCards.add(new CardIdentity("Cursed Scroll",""));
- cubeCards.add(new CardIdentity("Cyclonic Rift",""));
- cubeCards.add(new CardIdentity("Damnation",""));
- cubeCards.add(new CardIdentity("Dark Confidant",""));
- cubeCards.add(new CardIdentity("Dark Ritual",""));
- cubeCards.add(new CardIdentity("Darkblast",""));
- cubeCards.add(new CardIdentity("Day of Judgment",""));
- cubeCards.add(new CardIdentity("Daze",""));
- cubeCards.add(new CardIdentity("Deceiver Exarch",""));
- cubeCards.add(new CardIdentity("Deep Analysis",""));
- cubeCards.add(new CardIdentity("Delver of Secrets",""));
- cubeCards.add(new CardIdentity("Deranged Hermit",""));
- cubeCards.add(new CardIdentity("Desecration Demon",""));
- cubeCards.add(new CardIdentity("Detention Sphere",""));
- cubeCards.add(new CardIdentity("Devil's Play",""));
- cubeCards.add(new CardIdentity("Diabolic Servitude",""));
- cubeCards.add(new CardIdentity("Dictate of Heliod",""));
- cubeCards.add(new CardIdentity("Dig Through Time",""));
- cubeCards.add(new CardIdentity("Diregraf Ghoul",""));
- cubeCards.add(new CardIdentity("Disciple of Bolas",""));
- cubeCards.add(new CardIdentity("Disenchant",""));
- cubeCards.add(new CardIdentity("Disfigure",""));
- cubeCards.add(new CardIdentity("Dismember",""));
- cubeCards.add(new CardIdentity("Dismiss",""));
- cubeCards.add(new CardIdentity("Dissolve",""));
- cubeCards.add(new CardIdentity("Domri Rade",""));
- cubeCards.add(new CardIdentity("Doom Blade",""));
- cubeCards.add(new CardIdentity("Doomed Traveler",""));
- cubeCards.add(new CardIdentity("Dragon Fodder",""));
- cubeCards.add(new CardIdentity("Dragonskull Summit",""));
- cubeCards.add(new CardIdentity("Dread Return",""));
- cubeCards.add(new CardIdentity("Dreadbore",""));
- cubeCards.add(new CardIdentity("Drowned Catacomb",""));
- cubeCards.add(new CardIdentity("Dualcaster Mage",""));
- cubeCards.add(new CardIdentity("Dungeon Geists",""));
- cubeCards.add(new CardIdentity("Duplicant",""));
- cubeCards.add(new CardIdentity("Duress",""));
- cubeCards.add(new CardIdentity("Edric, Spymaster of Trest",""));
- cubeCards.add(new CardIdentity("Eight-and-a-Half-Tails",""));
- cubeCards.add(new CardIdentity("Electrolyze",""));
- cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite",""));
- cubeCards.add(new CardIdentity("Elite Vanguard",""));
- cubeCards.add(new CardIdentity("Elspeth Tirel",""));
- cubeCards.add(new CardIdentity("Elspeth, Knight-Errant",""));
- cubeCards.add(new CardIdentity("Elspeth, Sun's Champion",""));
- cubeCards.add(new CardIdentity("Elves of Deep Shadow",""));
- cubeCards.add(new CardIdentity("Elvish Mystic",""));
- cubeCards.add(new CardIdentity("Emeria Angel",""));
- cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn",""));
- cubeCards.add(new CardIdentity("Entomb",""));
- cubeCards.add(new CardIdentity("Entreat the Angels",""));
- cubeCards.add(new CardIdentity("Essence Scatter",""));
- cubeCards.add(new CardIdentity("Eternal Dragon",""));
- cubeCards.add(new CardIdentity("Eternal Witness",""));
- cubeCards.add(new CardIdentity("Eureka",""));
- cubeCards.add(new CardIdentity("Everflowing Chalice",""));
- cubeCards.add(new CardIdentity("Exalted Angel",""));
- cubeCards.add(new CardIdentity("Exhume",""));
- cubeCards.add(new CardIdentity("Explore",""));
- cubeCards.add(new CardIdentity("Fact or Fiction",""));
- cubeCards.add(new CardIdentity("Faith's Fetters",""));
- cubeCards.add(new CardIdentity("Falkenrath Aristocrat",""));
- cubeCards.add(new CardIdentity("Far // Away",""));
- cubeCards.add(new CardIdentity("Farseek",""));
- cubeCards.add(new CardIdentity("Fauna Shaman",""));
- cubeCards.add(new CardIdentity("Figure of Destiny",""));
- cubeCards.add(new CardIdentity("Fire // Ice",""));
- cubeCards.add(new CardIdentity("Fireblast",""));
- cubeCards.add(new CardIdentity("Firebolt",""));
- cubeCards.add(new CardIdentity("Firedrinker Satyr",""));
- cubeCards.add(new CardIdentity("Firefist Striker",""));
- cubeCards.add(new CardIdentity("Flame Slash",""));
- cubeCards.add(new CardIdentity("Flametongue Kavu",""));
- cubeCards.add(new CardIdentity("Fleecemane Lion",""));
- cubeCards.add(new CardIdentity("Flickerwisp",""));
- cubeCards.add(new CardIdentity("Flooded Strand",""));
- cubeCards.add(new CardIdentity("Forbid",""));
- cubeCards.add(new CardIdentity("Forbidden Alchemy",""));
- cubeCards.add(new CardIdentity("Force of Will",""));
- cubeCards.add(new CardIdentity("Force Spike",""));
- cubeCards.add(new CardIdentity("Frenzied Goblin",""));
- cubeCards.add(new CardIdentity("Freyalise, Llanowar's Fury",""));
- cubeCards.add(new CardIdentity("Frontline Medic",""));
- cubeCards.add(new CardIdentity("Frost Titan",""));
- cubeCards.add(new CardIdentity("Future Sight",""));
- cubeCards.add(new CardIdentity("Fyndhorn Elves",""));
- cubeCards.add(new CardIdentity("Gaea's Cradle",""));
- cubeCards.add(new CardIdentity("Garruk Relentless",""));
- cubeCards.add(new CardIdentity("Garruk Wildspeaker",""));
- cubeCards.add(new CardIdentity("Garruk, Apex Predator",""));
- cubeCards.add(new CardIdentity("Garruk, Caller of Beasts",""));
- cubeCards.add(new CardIdentity("Garruk, Primal Hunter",""));
- cubeCards.add(new CardIdentity("Gatekeeper of Malakir",""));
- cubeCards.add(new CardIdentity("Gather the Townsfolk",""));
- cubeCards.add(new CardIdentity("Geist of Saint Traft",""));
- cubeCards.add(new CardIdentity("Genesis Wave",""));
- cubeCards.add(new CardIdentity("Geralf's Messenger",""));
- cubeCards.add(new CardIdentity("Gerrard's Verdict",""));
- cubeCards.add(new CardIdentity("Ghor-Clan Rampager",""));
- cubeCards.add(new CardIdentity("Gideon Jura",""));
- cubeCards.add(new CardIdentity("Gifts Ungiven",""));
- cubeCards.add(new CardIdentity("Gilded Lotus",""));
- cubeCards.add(new CardIdentity("Glacial Fortress",""));
- cubeCards.add(new CardIdentity("Glen Elendra Archmage",""));
- cubeCards.add(new CardIdentity("Glorious Anthem",""));
- cubeCards.add(new CardIdentity("Gnarled Scarhide",""));
- cubeCards.add(new CardIdentity("Go for the Throat",""));
- cubeCards.add(new CardIdentity("Goblin Bombardment",""));
- cubeCards.add(new CardIdentity("Goblin Bushwhacker",""));
- cubeCards.add(new CardIdentity("Goblin Electromancer",""));
- cubeCards.add(new CardIdentity("Goblin Guide",""));
- cubeCards.add(new CardIdentity("Goblin Rabblemaster",""));
- cubeCards.add(new CardIdentity("Goblin Wardriver",""));
- cubeCards.add(new CardIdentity("Godless Shrine",""));
- cubeCards.add(new CardIdentity("Gore-House Chainwalker",""));
- cubeCards.add(new CardIdentity("Grafted Wargear",""));
- cubeCards.add(new CardIdentity("Grave Titan",""));
- cubeCards.add(new CardIdentity("Graveborn Muse",""));
- cubeCards.add(new CardIdentity("Gravecrawler",""));
- cubeCards.add(new CardIdentity("Gray Merchant of Asphodel",""));
- cubeCards.add(new CardIdentity("Greater Gargadon",""));
- cubeCards.add(new CardIdentity("Green Sun's Zenith",""));
- cubeCards.add(new CardIdentity("Grim Lavamancer",""));
- cubeCards.add(new CardIdentity("Grim Monolith",""));
- cubeCards.add(new CardIdentity("Griselbrand",""));
- cubeCards.add(new CardIdentity("Grisly Salvage",""));
- cubeCards.add(new CardIdentity("Guttersnipe",""));
- cubeCards.add(new CardIdentity("Hall of Triumph",""));
- cubeCards.add(new CardIdentity("Hallowed Fountain",""));
- cubeCards.add(new CardIdentity("Hallowed Spiritkeeper",""));
- cubeCards.add(new CardIdentity("Hammer of Purphoros",""));
- cubeCards.add(new CardIdentity("Harmonize",""));
- cubeCards.add(new CardIdentity("Hellrider",""));
- cubeCards.add(new CardIdentity("Herald of Torment",""));
- cubeCards.add(new CardIdentity("Hero of Bladehold",""));
- cubeCards.add(new CardIdentity("Hero of Oxid Ridge",""));
- cubeCards.add(new CardIdentity("Hero's Downfall",""));
- cubeCards.add(new CardIdentity("Hinterland Harbor",""));
- cubeCards.add(new CardIdentity("Honor of the Pure",""));
- cubeCards.add(new CardIdentity("Hordeling Outburst",""));
- cubeCards.add(new CardIdentity("Hornet Queen",""));
- cubeCards.add(new CardIdentity("Huntmaster of the Fells",""));
- cubeCards.add(new CardIdentity("Hymn to Tourach",""));
- cubeCards.add(new CardIdentity("Hypnotic Specter",""));
- cubeCards.add(new CardIdentity("Imperial Recruiter",""));
- cubeCards.add(new CardIdentity("Imposing Sovereign",""));
- cubeCards.add(new CardIdentity("Impulse",""));
- cubeCards.add(new CardIdentity("Incinerate",""));
- cubeCards.add(new CardIdentity("Indrik Stomphowler",""));
- cubeCards.add(new CardIdentity("Inferno Titan",""));
- cubeCards.add(new CardIdentity("Inquisition of Kozilek",""));
- cubeCards.add(new CardIdentity("Into the Roil",""));
- cubeCards.add(new CardIdentity("Intuition",""));
- cubeCards.add(new CardIdentity("Isamaru, Hound of Konda",""));
- cubeCards.add(new CardIdentity("Isochron Scepter",""));
- cubeCards.add(new CardIdentity("Isolated Chapel",""));
- cubeCards.add(new CardIdentity("Jace Beleren",""));
- cubeCards.add(new CardIdentity("Jace, Architect of Thought",""));
- cubeCards.add(new CardIdentity("Jace, the Mind Sculptor",""));
- cubeCards.add(new CardIdentity("Jackal Pup",""));
- cubeCards.add(new CardIdentity("Joraga Treespeaker",""));
- cubeCards.add(new CardIdentity("Journey to Nowhere",""));
- cubeCards.add(new CardIdentity("Kami of Ancient Law",""));
- cubeCards.add(new CardIdentity("Karmic Guide",""));
- cubeCards.add(new CardIdentity("Karn Liberated",""));
- cubeCards.add(new CardIdentity("Karplusan Forest",""));
- cubeCards.add(new CardIdentity("Keiga, the Tide Star",""));
- cubeCards.add(new CardIdentity("Keranos, God of Storms",""));
- cubeCards.add(new CardIdentity("Kiki-Jiki, Mirror Breaker",""));
- cubeCards.add(new CardIdentity("Kiln Fiend",""));
- cubeCards.add(new CardIdentity("Kiora, the Crashing Wave",""));
- cubeCards.add(new CardIdentity("Kira, Great Glass-Spinner",""));
- cubeCards.add(new CardIdentity("Kitchen Finks",""));
- cubeCards.add(new CardIdentity("Knight of Infamy",""));
- cubeCards.add(new CardIdentity("Kodama's Reach",""));
- cubeCards.add(new CardIdentity("Kokusho, the Evening Star",""));
- cubeCards.add(new CardIdentity("Kor Skyfisher",""));
- cubeCards.add(new CardIdentity("Koth of the Hammer",""));
- cubeCards.add(new CardIdentity("Kozilek, Butcher of Truth",""));
- cubeCards.add(new CardIdentity("Krenko's Command",""));
- cubeCards.add(new CardIdentity("Krosan Grip",""));
- cubeCards.add(new CardIdentity("Land Tax",""));
- cubeCards.add(new CardIdentity("Legacy's Allure",""));
- cubeCards.add(new CardIdentity("Lifebane Zombie",""));
- cubeCards.add(new CardIdentity("Lightning Bolt",""));
- cubeCards.add(new CardIdentity("Lightning Greaves",""));
- cubeCards.add(new CardIdentity("Lightning Helix",""));
- cubeCards.add(new CardIdentity("Lightning Mauler",""));
- cubeCards.add(new CardIdentity("Lightning Strike",""));
- cubeCards.add(new CardIdentity("Liliana of the Veil",""));
- cubeCards.add(new CardIdentity("Liliana Vess",""));
- cubeCards.add(new CardIdentity("Lingering Souls",""));
- cubeCards.add(new CardIdentity("Linvala, Keeper of Silence",""));
- cubeCards.add(new CardIdentity("Living Death",""));
- cubeCards.add(new CardIdentity("Llanowar Elves",""));
- cubeCards.add(new CardIdentity("Llanowar Wastes",""));
- cubeCards.add(new CardIdentity("Looter il-Kor",""));
- cubeCards.add(new CardIdentity("Lotleth Troll",""));
- cubeCards.add(new CardIdentity("Lotus Cobra",""));
- cubeCards.add(new CardIdentity("Loxodon Warhammer",""));
- cubeCards.add(new CardIdentity("Madcap Skills",""));
- cubeCards.add(new CardIdentity("Maelstrom Pulse",""));
- cubeCards.add(new CardIdentity("Magma Jet",""));
- cubeCards.add(new CardIdentity("Man-o'-War",""));
- cubeCards.add(new CardIdentity("Mana Confluence",""));
- cubeCards.add(new CardIdentity("Mana Leak",""));
- cubeCards.add(new CardIdentity("Mana Tithe",""));
- cubeCards.add(new CardIdentity("Marsh Flats",""));
- cubeCards.add(new CardIdentity("Martial Coup",""));
- cubeCards.add(new CardIdentity("Massacre Wurm",""));
- cubeCards.add(new CardIdentity("Master of the Feast",""));
- cubeCards.add(new CardIdentity("Master of the Wild Hunt",""));
- cubeCards.add(new CardIdentity("Master of Waves",""));
- cubeCards.add(new CardIdentity("Meloku the Clouded Mirror",""));
- cubeCards.add(new CardIdentity("Mentor of the Meek",""));
- cubeCards.add(new CardIdentity("Merfolk Looter",""));
- cubeCards.add(new CardIdentity("Mesmeric Fiend",""));
- cubeCards.add(new CardIdentity("Mind Stone",""));
- cubeCards.add(new CardIdentity("Mirari's Wake",""));
- cubeCards.add(new CardIdentity("Mirran Crusader",""));
- cubeCards.add(new CardIdentity("Miscalculation",""));
- cubeCards.add(new CardIdentity("Mishra's Factory",""));
- cubeCards.add(new CardIdentity("Misty Rainforest",""));
- cubeCards.add(new CardIdentity("Mizzium Mortars",""));
- cubeCards.add(new CardIdentity("Mogg Fanatic",""));
- cubeCards.add(new CardIdentity("Mogg War Marshal",""));
- cubeCards.add(new CardIdentity("Molten Rain",""));
- cubeCards.add(new CardIdentity("Molten-Tail Masticore",""));
- cubeCards.add(new CardIdentity("Momentary Blink",""));
- cubeCards.add(new CardIdentity("Mother of Runes",""));
- cubeCards.add(new CardIdentity("Mox Diamond",""));
- cubeCards.add(new CardIdentity("Mulch",""));
- cubeCards.add(new CardIdentity("Mulldrifter",""));
- cubeCards.add(new CardIdentity("Murderous Cut",""));
- cubeCards.add(new CardIdentity("Murderous Redcap",""));
- cubeCards.add(new CardIdentity("Mutagenic Growth",""));
- cubeCards.add(new CardIdentity("Mutavault",""));
- cubeCards.add(new CardIdentity("Myr Battlesphere",""));
- cubeCards.add(new CardIdentity("Mystic Snake",""));
- cubeCards.add(new CardIdentity("Mystical Teachings",""));
- cubeCards.add(new CardIdentity("Nantuko Shade",""));
- cubeCards.add(new CardIdentity("Natural Order",""));
- cubeCards.add(new CardIdentity("Naturalize",""));
- cubeCards.add(new CardIdentity("Negate",""));
- cubeCards.add(new CardIdentity("Nekrataal",""));
- cubeCards.add(new CardIdentity("Nicol Bolas, Planeswalker",""));
- cubeCards.add(new CardIdentity("Night's Whisper",""));
- cubeCards.add(new CardIdentity("Nighthowler",""));
- cubeCards.add(new CardIdentity("Nightveil Specter",""));
- cubeCards.add(new CardIdentity("Nissa, Worldwaker",""));
- cubeCards.add(new CardIdentity("Noble Hierarch",""));
- cubeCards.add(new CardIdentity("Nykthos, Shrine to Nyx",""));
- cubeCards.add(new CardIdentity("Oblivion Ring",""));
- cubeCards.add(new CardIdentity("Obstinate Baloth",""));
- cubeCards.add(new CardIdentity("Old Man of the Sea",""));
- cubeCards.add(new CardIdentity("Olivia Voldaren",""));
- cubeCards.add(new CardIdentity("Ophiomancer",""));
- cubeCards.add(new CardIdentity("Opposition",""));
- cubeCards.add(new CardIdentity("Oracle of Mul Daya",""));
- cubeCards.add(new CardIdentity("Oust",""));
- cubeCards.add(new CardIdentity("Overgrown Battlement",""));
- cubeCards.add(new CardIdentity("Overgrown Tomb",""));
- cubeCards.add(new CardIdentity("Pact of Negation",""));
- cubeCards.add(new CardIdentity("Pain Seer",""));
- cubeCards.add(new CardIdentity("Parallax Wave",""));
- cubeCards.add(new CardIdentity("Path to Exile",""));
- cubeCards.add(new CardIdentity("Pestermite",""));
- cubeCards.add(new CardIdentity("Phantasmal Image",""));
- cubeCards.add(new CardIdentity("Phantom Centaur",""));
- cubeCards.add(new CardIdentity("Phyrexian Arena",""));
- cubeCards.add(new CardIdentity("Phyrexian Metamorph",""));
- cubeCards.add(new CardIdentity("Phyrexian Obliterator",""));
- cubeCards.add(new CardIdentity("Phyrexian Revoker",""));
- cubeCards.add(new CardIdentity("Pillar of Flame",""));
- cubeCards.add(new CardIdentity("Plateau",""));
- cubeCards.add(new CardIdentity("Plow Under",""));
- cubeCards.add(new CardIdentity("Polluted Delta",""));
- cubeCards.add(new CardIdentity("Polukranos, World Eater",""));
- cubeCards.add(new CardIdentity("Ponder",""));
- cubeCards.add(new CardIdentity("Porcelain Legionnaire",""));
- cubeCards.add(new CardIdentity("Precinct Captain",""));
- cubeCards.add(new CardIdentity("Precursor Golem",""));
- cubeCards.add(new CardIdentity("Preordain",""));
- cubeCards.add(new CardIdentity("Primal Command",""));
- cubeCards.add(new CardIdentity("Prime Speaker Zegana",""));
- cubeCards.add(new CardIdentity("Primeval Titan",""));
- cubeCards.add(new CardIdentity("Profane Command",""));
- cubeCards.add(new CardIdentity("Progenitus",""));
- cubeCards.add(new CardIdentity("Prophetic Bolt",""));
- cubeCards.add(new CardIdentity("Prophetic Flamespeaker",""));
- cubeCards.add(new CardIdentity("Psychatog",""));
- cubeCards.add(new CardIdentity("Purphoros, God of the Forge",""));
- cubeCards.add(new CardIdentity("Qasali Pridemage",""));
- cubeCards.add(new CardIdentity("Raise the Alarm",""));
- cubeCards.add(new CardIdentity("Rakdos Cackler",""));
- cubeCards.add(new CardIdentity("Ral Zarek",""));
- cubeCards.add(new CardIdentity("Rampant Growth",""));
- cubeCards.add(new CardIdentity("Rancor",""));
- cubeCards.add(new CardIdentity("Ranger of Eos",""));
- cubeCards.add(new CardIdentity("Ravages of War",""));
- cubeCards.add(new CardIdentity("Reanimate",""));
- cubeCards.add(new CardIdentity("Reclamation Sage",""));
- cubeCards.add(new CardIdentity("Recurring Nightmare",""));
- cubeCards.add(new CardIdentity("Reflecting Pool",""));
- cubeCards.add(new CardIdentity("Regrowth",""));
- cubeCards.add(new CardIdentity("Remand",""));
- cubeCards.add(new CardIdentity("Remove Soul",""));
- cubeCards.add(new CardIdentity("Repeal",""));
- cubeCards.add(new CardIdentity("Restoration Angel",""));
- cubeCards.add(new CardIdentity("Reveillark",""));
- cubeCards.add(new CardIdentity("Rift Bolt",""));
- cubeCards.add(new CardIdentity("Riftwing Cloudskate",""));
- cubeCards.add(new CardIdentity("Riptide Laboratory",""));
- cubeCards.add(new CardIdentity("Rishadan Port",""));
- cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary",""));
- cubeCards.add(new CardIdentity("Rootbound Crag",""));
- cubeCards.add(new CardIdentity("Sacred Foundry",""));
- cubeCards.add(new CardIdentity("Sakashima's Student",""));
- cubeCards.add(new CardIdentity("Sakura-Tribe Elder",""));
- cubeCards.add(new CardIdentity("Sarcomancy",""));
- cubeCards.add(new CardIdentity("Sarkhan, the Dragonspeaker",""));
- cubeCards.add(new CardIdentity("Satyr Wayfinder",""));
- cubeCards.add(new CardIdentity("Savannah",""));
- cubeCards.add(new CardIdentity("Savannah Lions",""));
- cubeCards.add(new CardIdentity("Scalding Tarn",""));
- cubeCards.add(new CardIdentity("Scavenging Ooze",""));
- cubeCards.add(new CardIdentity("Scorched Rusalka",""));
- cubeCards.add(new CardIdentity("Scrubland",""));
- cubeCards.add(new CardIdentity("Sea Gate Oracle",""));
- cubeCards.add(new CardIdentity("Seal of Cleansing",""));
- cubeCards.add(new CardIdentity("Seal of Fire",""));
- cubeCards.add(new CardIdentity("Search for Tomorrow",""));
- cubeCards.add(new CardIdentity("Searing Blaze",""));
- cubeCards.add(new CardIdentity("Searing Blood",""));
- cubeCards.add(new CardIdentity("Searing Spear",""));
- cubeCards.add(new CardIdentity("Seeker of the Way",""));
- cubeCards.add(new CardIdentity("Sensei's Divining Top",""));
- cubeCards.add(new CardIdentity("Serendib Efreet",""));
- cubeCards.add(new CardIdentity("Serum Visions",""));
- cubeCards.add(new CardIdentity("Setessan Tactics",""));
- cubeCards.add(new CardIdentity("Shadowmage Infiltrator",""));
- cubeCards.add(new CardIdentity("Shardless Agent",""));
- cubeCards.add(new CardIdentity("Sheoldred, Whispering One",""));
- cubeCards.add(new CardIdentity("Shivan Reef",""));
- cubeCards.add(new CardIdentity("Show and Tell",""));
- cubeCards.add(new CardIdentity("Shriekmaw",""));
- cubeCards.add(new CardIdentity("Shrine of Burning Rage",""));
- cubeCards.add(new CardIdentity("Siege-Gang Commander",""));
- cubeCards.add(new CardIdentity("Silverblade Paladin",""));
- cubeCards.add(new CardIdentity("Sin Collector",""));
- cubeCards.add(new CardIdentity("Sinkhole",""));
- cubeCards.add(new CardIdentity("Skinrender",""));
- cubeCards.add(new CardIdentity("Skullcrack",""));
- cubeCards.add(new CardIdentity("Slagstorm",""));
- cubeCards.add(new CardIdentity("Slaughter Pact",""));
- cubeCards.add(new CardIdentity("Smash to Smithereens",""));
- cubeCards.add(new CardIdentity("Snapcaster Mage",""));
- cubeCards.add(new CardIdentity("Sneak Attack",""));
- cubeCards.add(new CardIdentity("Soldier of the Pantheon",""));
- cubeCards.add(new CardIdentity("Solemn Simulacrum",""));
- cubeCards.add(new CardIdentity("Song of the Dryads",""));
- cubeCards.add(new CardIdentity("Sorin Markov",""));
- cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad",""));
- cubeCards.add(new CardIdentity("Sorin, Solemn Visitor",""));
- cubeCards.add(new CardIdentity("Soul of Innistrad",""));
- cubeCards.add(new CardIdentity("Sower of Temptation",""));
- cubeCards.add(new CardIdentity("Spear of Heliod",""));
- cubeCards.add(new CardIdentity("Spectral Procession",""));
- cubeCards.add(new CardIdentity("Spellskite",""));
- cubeCards.add(new CardIdentity("Sphere of the Suns",""));
- cubeCards.add(new CardIdentity("Sphinx's Revelation",""));
- cubeCards.add(new CardIdentity("Spikeshot Elder",""));
- cubeCards.add(new CardIdentity("Spiteful Returned",""));
- cubeCards.add(new CardIdentity("Splinter Twin",""));
- cubeCards.add(new CardIdentity("Staggershock",""));
- cubeCards.add(new CardIdentity("Steam Vents",""));
- cubeCards.add(new CardIdentity("Stinkweed Imp",""));
- cubeCards.add(new CardIdentity("Stoke the Flames",""));
- cubeCards.add(new CardIdentity("Stomping Ground",""));
- cubeCards.add(new CardIdentity("Stormbreath Dragon",""));
- cubeCards.add(new CardIdentity("Stroke of Genius",""));
- cubeCards.add(new CardIdentity("Stromkirk Noble",""));
- cubeCards.add(new CardIdentity("Student of Warfare",""));
- cubeCards.add(new CardIdentity("Sublime Archangel",""));
- cubeCards.add(new CardIdentity("Sulfur Falls",""));
- cubeCards.add(new CardIdentity("Sulfuric Vortex",""));
- cubeCards.add(new CardIdentity("Sulfurous Springs",""));
- cubeCards.add(new CardIdentity("Summoning Trap",""));
- cubeCards.add(new CardIdentity("Sun Titan",""));
- cubeCards.add(new CardIdentity("Sundering Titan",""));
- cubeCards.add(new CardIdentity("Sunpetal Grove",""));
- cubeCards.add(new CardIdentity("Supreme Verdict",""));
- cubeCards.add(new CardIdentity("Swords to Plowshares",""));
- cubeCards.add(new CardIdentity("Sylvan Caryatid",""));
- cubeCards.add(new CardIdentity("Sylvan Library",""));
- cubeCards.add(new CardIdentity("Taiga",""));
- cubeCards.add(new CardIdentity("Talrand, Sky Summoner",""));
- cubeCards.add(new CardIdentity("Tamiyo, the Moon Sage",""));
- cubeCards.add(new CardIdentity("Tangle Wire",""));
- cubeCards.add(new CardIdentity("Tarmogoyf",""));
- cubeCards.add(new CardIdentity("Tectonic Edge",""));
- cubeCards.add(new CardIdentity("Teetering Peaks",""));
- cubeCards.add(new CardIdentity("Teferi, Mage of Zhalfir",""));
- cubeCards.add(new CardIdentity("Temple Garden",""));
- cubeCards.add(new CardIdentity("Temple of Abandon",""));
- cubeCards.add(new CardIdentity("Temple of Deceit",""));
- cubeCards.add(new CardIdentity("Temple of Enlightenment",""));
- cubeCards.add(new CardIdentity("Temple of Epiphany",""));
- cubeCards.add(new CardIdentity("Temple of Malady",""));
- cubeCards.add(new CardIdentity("Temple of Malice",""));
- cubeCards.add(new CardIdentity("Temple of Mystery",""));
- cubeCards.add(new CardIdentity("Temple of Plenty",""));
- cubeCards.add(new CardIdentity("Temple of Silence",""));
- cubeCards.add(new CardIdentity("Temple of Triumph",""));
- cubeCards.add(new CardIdentity("Tempt with Vengeance",""));
- cubeCards.add(new CardIdentity("Tendrils of Corruption",""));
- cubeCards.add(new CardIdentity("Terastodon",""));
- cubeCards.add(new CardIdentity("Terminate",""));
- cubeCards.add(new CardIdentity("Terminus",""));
- cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben",""));
- cubeCards.add(new CardIdentity("Thassa, God of the Sea",""));
- cubeCards.add(new CardIdentity("Think Twice",""));
- cubeCards.add(new CardIdentity("Thoughtseize",""));
- cubeCards.add(new CardIdentity("Thragtusk",""));
- cubeCards.add(new CardIdentity("Thran Dynamo",""));
- cubeCards.add(new CardIdentity("Through the Breach",""));
- cubeCards.add(new CardIdentity("Thrun, the Last Troll",""));
- cubeCards.add(new CardIdentity("Thundermaw Hellkite",""));
- cubeCards.add(new CardIdentity("Tidehollow Sculler",""));
- cubeCards.add(new CardIdentity("Time Warp",""));
- cubeCards.add(new CardIdentity("Tooth and Nail",""));
- cubeCards.add(new CardIdentity("Toxic Deluge",""));
- cubeCards.add(new CardIdentity("Tracker's Instincts",""));
- cubeCards.add(new CardIdentity("Tradewind Rider",""));
- cubeCards.add(new CardIdentity("Treachery",""));
- cubeCards.add(new CardIdentity("Troll Ascetic",""));
- cubeCards.add(new CardIdentity("Tropical Island",""));
- cubeCards.add(new CardIdentity("Trygon Predator",""));
- cubeCards.add(new CardIdentity("Tundra",""));
- cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre",""));
- cubeCards.add(new CardIdentity("Ultimate Price",""));
- cubeCards.add(new CardIdentity("Umezawa's Jitte",""));
- cubeCards.add(new CardIdentity("Unburial Rites",""));
- cubeCards.add(new CardIdentity("Underground River",""));
- cubeCards.add(new CardIdentity("Underground Sea",""));
- cubeCards.add(new CardIdentity("Underworld Connections",""));
- cubeCards.add(new CardIdentity("Unexpectedly Absent",""));
- cubeCards.add(new CardIdentity("Upheaval",""));
- cubeCards.add(new CardIdentity("Vampire Hexmage",""));
- cubeCards.add(new CardIdentity("Vampire Lacerator",""));
- cubeCards.add(new CardIdentity("Vampire Nighthawk",""));
- cubeCards.add(new CardIdentity("Vedalken Shackles",""));
- cubeCards.add(new CardIdentity("Vendilion Clique",""));
- cubeCards.add(new CardIdentity("Vengevine",""));
- cubeCards.add(new CardIdentity("Venser, Shaper Savant",""));
- cubeCards.add(new CardIdentity("Venser, the Sojourner",""));
- cubeCards.add(new CardIdentity("Verdant Catacombs",""));
- cubeCards.add(new CardIdentity("Vindicate",""));
- cubeCards.add(new CardIdentity("Visara the Dreadful",""));
- cubeCards.add(new CardIdentity("Voice of Resurgence",""));
- cubeCards.add(new CardIdentity("Volcanic Island",""));
- cubeCards.add(new CardIdentity("Volrath's Stronghold",""));
- cubeCards.add(new CardIdentity("Vraska the Unseen",""));
- cubeCards.add(new CardIdentity("Wake Thrasher",""));
- cubeCards.add(new CardIdentity("Wall of Blossoms",""));
- cubeCards.add(new CardIdentity("Wall of Omens",""));
- cubeCards.add(new CardIdentity("Wall of Roots",""));
- cubeCards.add(new CardIdentity("Warleader's Helix",""));
- cubeCards.add(new CardIdentity("Wasteland",""));
- cubeCards.add(new CardIdentity("Waterfront Bouncer",""));
- cubeCards.add(new CardIdentity("Watery Grave",""));
- cubeCards.add(new CardIdentity("Whip of Erebos",""));
- cubeCards.add(new CardIdentity("Wild Mongrel",""));
- cubeCards.add(new CardIdentity("Windbrisk Heights",""));
- cubeCards.add(new CardIdentity("Windswept Heath",""));
- cubeCards.add(new CardIdentity("Winter Orb",""));
- cubeCards.add(new CardIdentity("Wolfir Silverheart",""));
- cubeCards.add(new CardIdentity("Wood Elves",""));
- cubeCards.add(new CardIdentity("Wooded Foothills",""));
- cubeCards.add(new CardIdentity("Woodfall Primus",""));
- cubeCards.add(new CardIdentity("Woodland Cemetery",""));
- cubeCards.add(new CardIdentity("Worn Powerstone",""));
- cubeCards.add(new CardIdentity("Wrath of God",""));
- cubeCards.add(new CardIdentity("Wurmcoil Engine",""));
- cubeCards.add(new CardIdentity("Xathrid Necromancer",""));
- cubeCards.add(new CardIdentity("Xenagos, the Reveler",""));
- cubeCards.add(new CardIdentity("Yavimaya Coast",""));
- cubeCards.add(new CardIdentity("Yavimaya Elder",""));
- cubeCards.add(new CardIdentity("Yosei, the Morning Star",""));
- cubeCards.add(new CardIdentity("Young Pyromancer",""));
- cubeCards.add(new CardIdentity("Zealous Conscripts",""));
-
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.tournament.cubes;
+
+import mage.game.draft.DraftCube;
+
+/**
+ *
+ * @author LevelX2
+ */
+
+public class MTGOLegacyCube extends DraftCube {
+
+ public MTGOLegacyCube() {
+ super("MTGO Legacy Cube (600 cards)");
+ cubeCards.add(new CardIdentity("Accorder Paladin",""));
+ cubeCards.add(new CardIdentity("Abrupt Decay",""));
+ cubeCards.add(new CardIdentity("Acidic Slime",""));
+ cubeCards.add(new CardIdentity("Act of Aggression",""));
+ cubeCards.add(new CardIdentity("Adarkar Wastes",""));
+ cubeCards.add(new CardIdentity("AEther Vial",""));
+ cubeCards.add(new CardIdentity("Ajani Goldmane",""));
+ cubeCards.add(new CardIdentity("Ajani Steadfast",""));
+ cubeCards.add(new CardIdentity("Ajani Vengeant",""));
+ cubeCards.add(new CardIdentity("Ajani, Caller of the Pride",""));
+ cubeCards.add(new CardIdentity("Ajani, Mentor of Heroes",""));
+ cubeCards.add(new CardIdentity("Ancestral Vision",""));
+ cubeCards.add(new CardIdentity("Ancient Grudge",""));
+ cubeCards.add(new CardIdentity("Ancient Tomb",""));
+ cubeCards.add(new CardIdentity("Angel of Serenity",""));
+ cubeCards.add(new CardIdentity("Angelic Destiny",""));
+ cubeCards.add(new CardIdentity("Anger of the Gods",""));
+ cubeCards.add(new CardIdentity("Animate Dead",""));
+ cubeCards.add(new CardIdentity("Arbor Elf",""));
+ cubeCards.add(new CardIdentity("Arc Trail",""));
+ cubeCards.add(new CardIdentity("Archangel of Thune",""));
+ cubeCards.add(new CardIdentity("Arid Mesa",""));
+ cubeCards.add(new CardIdentity("Armageddon",""));
+ cubeCards.add(new CardIdentity("Ashcloud Phoenix",""));
+ cubeCards.add(new CardIdentity("Ashiok, Nightmare Weaver",""));
+ cubeCards.add(new CardIdentity("Augur of Bolas",""));
+ cubeCards.add(new CardIdentity("Avacyn's Pilgrim",""));
+ cubeCards.add(new CardIdentity("Avalanche Riders",""));
+ cubeCards.add(new CardIdentity("Avenger of Zendikar",""));
+ cubeCards.add(new CardIdentity("Awakening Zone",""));
+ cubeCards.add(new CardIdentity("Bad Moon",""));
+ cubeCards.add(new CardIdentity("Badlands",""));
+ cubeCards.add(new CardIdentity("Baleful Strix",""));
+ cubeCards.add(new CardIdentity("Baneslayer Angel",""));
+ cubeCards.add(new CardIdentity("Banisher Priest",""));
+ cubeCards.add(new CardIdentity("Banishing Light",""));
+ cubeCards.add(new CardIdentity("Basalt Monolith",""));
+ cubeCards.add(new CardIdentity("Basilisk Collar",""));
+ cubeCards.add(new CardIdentity("Batterskull",""));
+ cubeCards.add(new CardIdentity("Battlefield Forge",""));
+ cubeCards.add(new CardIdentity("Bayou",""));
+ cubeCards.add(new CardIdentity("Beast Within",""));
+ cubeCards.add(new CardIdentity("Beetleback Chief",""));
+ cubeCards.add(new CardIdentity("Bident of Thassa",""));
+ cubeCards.add(new CardIdentity("Birds of Paradise",""));
+ cubeCards.add(new CardIdentity("Birthing Pod",""));
+ cubeCards.add(new CardIdentity("Bitterblossom",""));
+ cubeCards.add(new CardIdentity("Black Sun's Zenith",""));
+ cubeCards.add(new CardIdentity("Blade Splicer",""));
+ cubeCards.add(new CardIdentity("Blood Crypt",""));
+ cubeCards.add(new CardIdentity("Bloodbraid Elf",""));
+ cubeCards.add(new CardIdentity("Bloodghast",""));
+ cubeCards.add(new CardIdentity("Bloodline Keeper",""));
+ cubeCards.add(new CardIdentity("Bloodsoaked Champion",""));
+ cubeCards.add(new CardIdentity("Bloodstained Mire",""));
+ cubeCards.add(new CardIdentity("Bone Shredder",""));
+ cubeCards.add(new CardIdentity("Bonesplitter",""));
+ cubeCards.add(new CardIdentity("Bonfire of the Damned",""));
+ cubeCards.add(new CardIdentity("Boon Satyr",""));
+ cubeCards.add(new CardIdentity("Borderland Marauder",""));
+ cubeCards.add(new CardIdentity("Boros Charm",""));
+ cubeCards.add(new CardIdentity("Boros Elite",""));
+ cubeCards.add(new CardIdentity("Boros Reckoner",""));
+ cubeCards.add(new CardIdentity("Brago, King Eternal",""));
+ cubeCards.add(new CardIdentity("Brain Maggot",""));
+ cubeCards.add(new CardIdentity("Brainstorm",""));
+ cubeCards.add(new CardIdentity("Breeding Pool",""));
+ cubeCards.add(new CardIdentity("Brimaz, King of Oreskos",""));
+ cubeCards.add(new CardIdentity("Brimstone Volley",""));
+ cubeCards.add(new CardIdentity("Brushland",""));
+ cubeCards.add(new CardIdentity("Burning-Tree Emissary",""));
+ cubeCards.add(new CardIdentity("Burst Lightning",""));
+ cubeCards.add(new CardIdentity("Call of the Herd",""));
+ cubeCards.add(new CardIdentity("Carnophage",""));
+ cubeCards.add(new CardIdentity("Caves of Koilos",""));
+ cubeCards.add(new CardIdentity("Chain Lightning",""));
+ cubeCards.add(new CardIdentity("Chainer's Edict",""));
+ cubeCards.add(new CardIdentity("Chameleon Colossus",""));
+ cubeCards.add(new CardIdentity("Champion of the Parish",""));
+ cubeCards.add(new CardIdentity("Chandra, Pyromaster",""));
+ cubeCards.add(new CardIdentity("Chandra's Phoenix",""));
+ cubeCards.add(new CardIdentity("Char",""));
+ cubeCards.add(new CardIdentity("Chasm Skulker",""));
+ cubeCards.add(new CardIdentity("Chord of Calling",""));
+ cubeCards.add(new CardIdentity("Chrome Mox",""));
+ cubeCards.add(new CardIdentity("City of Brass",""));
+ cubeCards.add(new CardIdentity("Clifftop Retreat",""));
+ cubeCards.add(new CardIdentity("Cloudfin Raptor",""));
+ cubeCards.add(new CardIdentity("Cloudgoat Ranger",""));
+ cubeCards.add(new CardIdentity("Coalition Relic",""));
+ cubeCards.add(new CardIdentity("Commune with the Gods",""));
+ cubeCards.add(new CardIdentity("Compulsive Research",""));
+ cubeCards.add(new CardIdentity("Condemn",""));
+ cubeCards.add(new CardIdentity("Condescend",""));
+ cubeCards.add(new CardIdentity("Consecrated Sphinx",""));
+ cubeCards.add(new CardIdentity("Consuming Vapors",""));
+ cubeCards.add(new CardIdentity("Control Magic",""));
+ cubeCards.add(new CardIdentity("Coralhelm Commander",""));
+ cubeCards.add(new CardIdentity("Corrupt",""));
+ cubeCards.add(new CardIdentity("Council's Judgment",""));
+ cubeCards.add(new CardIdentity("Counterspell",""));
+ cubeCards.add(new CardIdentity("Courser of Kruphix",""));
+ cubeCards.add(new CardIdentity("Crater's Claws",""));
+ cubeCards.add(new CardIdentity("Craterhoof Behemoth",""));
+ cubeCards.add(new CardIdentity("Crusade",""));
+ cubeCards.add(new CardIdentity("Cryptic Command",""));
+ cubeCards.add(new CardIdentity("Cultivate",""));
+ cubeCards.add(new CardIdentity("Cunning Sparkmage",""));
+ cubeCards.add(new CardIdentity("Curse of Predation",""));
+ cubeCards.add(new CardIdentity("Cursed Scroll",""));
+ cubeCards.add(new CardIdentity("Cyclonic Rift",""));
+ cubeCards.add(new CardIdentity("Damnation",""));
+ cubeCards.add(new CardIdentity("Dark Confidant",""));
+ cubeCards.add(new CardIdentity("Dark Ritual",""));
+ cubeCards.add(new CardIdentity("Darkblast",""));
+ cubeCards.add(new CardIdentity("Day of Judgment",""));
+ cubeCards.add(new CardIdentity("Daze",""));
+ cubeCards.add(new CardIdentity("Deceiver Exarch",""));
+ cubeCards.add(new CardIdentity("Deep Analysis",""));
+ cubeCards.add(new CardIdentity("Delver of Secrets",""));
+ cubeCards.add(new CardIdentity("Deranged Hermit",""));
+ cubeCards.add(new CardIdentity("Desecration Demon",""));
+ cubeCards.add(new CardIdentity("Detention Sphere",""));
+ cubeCards.add(new CardIdentity("Devil's Play",""));
+ cubeCards.add(new CardIdentity("Diabolic Servitude",""));
+ cubeCards.add(new CardIdentity("Dictate of Heliod",""));
+ cubeCards.add(new CardIdentity("Dig Through Time",""));
+ cubeCards.add(new CardIdentity("Diregraf Ghoul",""));
+ cubeCards.add(new CardIdentity("Disciple of Bolas",""));
+ cubeCards.add(new CardIdentity("Disenchant",""));
+ cubeCards.add(new CardIdentity("Disfigure",""));
+ cubeCards.add(new CardIdentity("Dismember",""));
+ cubeCards.add(new CardIdentity("Dismiss",""));
+ cubeCards.add(new CardIdentity("Dissolve",""));
+ cubeCards.add(new CardIdentity("Domri Rade",""));
+ cubeCards.add(new CardIdentity("Doom Blade",""));
+ cubeCards.add(new CardIdentity("Doomed Traveler",""));
+ cubeCards.add(new CardIdentity("Dragon Fodder",""));
+ cubeCards.add(new CardIdentity("Dragonskull Summit",""));
+ cubeCards.add(new CardIdentity("Dread Return",""));
+ cubeCards.add(new CardIdentity("Dreadbore",""));
+ cubeCards.add(new CardIdentity("Drowned Catacomb",""));
+ cubeCards.add(new CardIdentity("Dualcaster Mage",""));
+ cubeCards.add(new CardIdentity("Dungeon Geists",""));
+ cubeCards.add(new CardIdentity("Duplicant",""));
+ cubeCards.add(new CardIdentity("Duress",""));
+ cubeCards.add(new CardIdentity("Edric, Spymaster of Trest",""));
+ cubeCards.add(new CardIdentity("Eight-and-a-Half-Tails",""));
+ cubeCards.add(new CardIdentity("Electrolyze",""));
+ cubeCards.add(new CardIdentity("Elesh Norn, Grand Cenobite",""));
+ cubeCards.add(new CardIdentity("Elite Vanguard",""));
+ cubeCards.add(new CardIdentity("Elspeth Tirel",""));
+ cubeCards.add(new CardIdentity("Elspeth, Knight-Errant",""));
+ cubeCards.add(new CardIdentity("Elspeth, Sun's Champion",""));
+ cubeCards.add(new CardIdentity("Elves of Deep Shadow",""));
+ cubeCards.add(new CardIdentity("Elvish Mystic",""));
+ cubeCards.add(new CardIdentity("Emeria Angel",""));
+ cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn",""));
+ cubeCards.add(new CardIdentity("Entomb",""));
+ cubeCards.add(new CardIdentity("Entreat the Angels",""));
+ cubeCards.add(new CardIdentity("Essence Scatter",""));
+ cubeCards.add(new CardIdentity("Eternal Dragon",""));
+ cubeCards.add(new CardIdentity("Eternal Witness",""));
+ cubeCards.add(new CardIdentity("Eureka",""));
+ cubeCards.add(new CardIdentity("Everflowing Chalice",""));
+ cubeCards.add(new CardIdentity("Exalted Angel",""));
+ cubeCards.add(new CardIdentity("Exhume",""));
+ cubeCards.add(new CardIdentity("Explore",""));
+ cubeCards.add(new CardIdentity("Fact or Fiction",""));
+ cubeCards.add(new CardIdentity("Faith's Fetters",""));
+ cubeCards.add(new CardIdentity("Falkenrath Aristocrat",""));
+ cubeCards.add(new CardIdentity("Far // Away",""));
+ cubeCards.add(new CardIdentity("Farseek",""));
+ cubeCards.add(new CardIdentity("Fauna Shaman",""));
+ cubeCards.add(new CardIdentity("Figure of Destiny",""));
+ cubeCards.add(new CardIdentity("Fire // Ice",""));
+ cubeCards.add(new CardIdentity("Fireblast",""));
+ cubeCards.add(new CardIdentity("Firebolt",""));
+ cubeCards.add(new CardIdentity("Firedrinker Satyr",""));
+ cubeCards.add(new CardIdentity("Firefist Striker",""));
+ cubeCards.add(new CardIdentity("Flame Slash",""));
+ cubeCards.add(new CardIdentity("Flametongue Kavu",""));
+ cubeCards.add(new CardIdentity("Fleecemane Lion",""));
+ cubeCards.add(new CardIdentity("Flickerwisp",""));
+ cubeCards.add(new CardIdentity("Flooded Strand",""));
+ cubeCards.add(new CardIdentity("Forbid",""));
+ cubeCards.add(new CardIdentity("Forbidden Alchemy",""));
+ cubeCards.add(new CardIdentity("Force of Will",""));
+ cubeCards.add(new CardIdentity("Force Spike",""));
+ cubeCards.add(new CardIdentity("Frenzied Goblin",""));
+ cubeCards.add(new CardIdentity("Freyalise, Llanowar's Fury",""));
+ cubeCards.add(new CardIdentity("Frontline Medic",""));
+ cubeCards.add(new CardIdentity("Frost Titan",""));
+ cubeCards.add(new CardIdentity("Future Sight",""));
+ cubeCards.add(new CardIdentity("Fyndhorn Elves",""));
+ cubeCards.add(new CardIdentity("Gaea's Cradle",""));
+ cubeCards.add(new CardIdentity("Garruk Relentless",""));
+ cubeCards.add(new CardIdentity("Garruk Wildspeaker",""));
+ cubeCards.add(new CardIdentity("Garruk, Apex Predator",""));
+ cubeCards.add(new CardIdentity("Garruk, Caller of Beasts",""));
+ cubeCards.add(new CardIdentity("Garruk, Primal Hunter",""));
+ cubeCards.add(new CardIdentity("Gatekeeper of Malakir",""));
+ cubeCards.add(new CardIdentity("Gather the Townsfolk",""));
+ cubeCards.add(new CardIdentity("Geist of Saint Traft",""));
+ cubeCards.add(new CardIdentity("Genesis Wave",""));
+ cubeCards.add(new CardIdentity("Geralf's Messenger",""));
+ cubeCards.add(new CardIdentity("Gerrard's Verdict",""));
+ cubeCards.add(new CardIdentity("Ghor-Clan Rampager",""));
+ cubeCards.add(new CardIdentity("Gideon Jura",""));
+ cubeCards.add(new CardIdentity("Gifts Ungiven",""));
+ cubeCards.add(new CardIdentity("Gilded Lotus",""));
+ cubeCards.add(new CardIdentity("Glacial Fortress",""));
+ cubeCards.add(new CardIdentity("Glen Elendra Archmage",""));
+ cubeCards.add(new CardIdentity("Glorious Anthem",""));
+ cubeCards.add(new CardIdentity("Gnarled Scarhide",""));
+ cubeCards.add(new CardIdentity("Go for the Throat",""));
+ cubeCards.add(new CardIdentity("Goblin Bombardment",""));
+ cubeCards.add(new CardIdentity("Goblin Bushwhacker",""));
+ cubeCards.add(new CardIdentity("Goblin Electromancer",""));
+ cubeCards.add(new CardIdentity("Goblin Guide",""));
+ cubeCards.add(new CardIdentity("Goblin Rabblemaster",""));
+ cubeCards.add(new CardIdentity("Goblin Wardriver",""));
+ cubeCards.add(new CardIdentity("Godless Shrine",""));
+ cubeCards.add(new CardIdentity("Gore-House Chainwalker",""));
+ cubeCards.add(new CardIdentity("Grafted Wargear",""));
+ cubeCards.add(new CardIdentity("Grave Titan",""));
+ cubeCards.add(new CardIdentity("Graveborn Muse",""));
+ cubeCards.add(new CardIdentity("Gravecrawler",""));
+ cubeCards.add(new CardIdentity("Gray Merchant of Asphodel",""));
+ cubeCards.add(new CardIdentity("Greater Gargadon",""));
+ cubeCards.add(new CardIdentity("Green Sun's Zenith",""));
+ cubeCards.add(new CardIdentity("Grim Lavamancer",""));
+ cubeCards.add(new CardIdentity("Grim Monolith",""));
+ cubeCards.add(new CardIdentity("Griselbrand",""));
+ cubeCards.add(new CardIdentity("Grisly Salvage",""));
+ cubeCards.add(new CardIdentity("Guttersnipe",""));
+ cubeCards.add(new CardIdentity("Hall of Triumph",""));
+ cubeCards.add(new CardIdentity("Hallowed Fountain",""));
+ cubeCards.add(new CardIdentity("Hallowed Spiritkeeper",""));
+ cubeCards.add(new CardIdentity("Hammer of Purphoros",""));
+ cubeCards.add(new CardIdentity("Harmonize",""));
+ cubeCards.add(new CardIdentity("Hellrider",""));
+ cubeCards.add(new CardIdentity("Herald of Torment",""));
+ cubeCards.add(new CardIdentity("Hero of Bladehold",""));
+ cubeCards.add(new CardIdentity("Hero of Oxid Ridge",""));
+ cubeCards.add(new CardIdentity("Hero's Downfall",""));
+ cubeCards.add(new CardIdentity("Hinterland Harbor",""));
+ cubeCards.add(new CardIdentity("Honor of the Pure",""));
+ cubeCards.add(new CardIdentity("Hordeling Outburst",""));
+ cubeCards.add(new CardIdentity("Hornet Queen",""));
+ cubeCards.add(new CardIdentity("Huntmaster of the Fells",""));
+ cubeCards.add(new CardIdentity("Hymn to Tourach",""));
+ cubeCards.add(new CardIdentity("Hypnotic Specter",""));
+ cubeCards.add(new CardIdentity("Imperial Recruiter",""));
+ cubeCards.add(new CardIdentity("Imposing Sovereign",""));
+ cubeCards.add(new CardIdentity("Impulse",""));
+ cubeCards.add(new CardIdentity("Incinerate",""));
+ cubeCards.add(new CardIdentity("Indrik Stomphowler",""));
+ cubeCards.add(new CardIdentity("Inferno Titan",""));
+ cubeCards.add(new CardIdentity("Inquisition of Kozilek",""));
+ cubeCards.add(new CardIdentity("Into the Roil",""));
+ cubeCards.add(new CardIdentity("Intuition",""));
+ cubeCards.add(new CardIdentity("Isamaru, Hound of Konda",""));
+ cubeCards.add(new CardIdentity("Isochron Scepter",""));
+ cubeCards.add(new CardIdentity("Isolated Chapel",""));
+ cubeCards.add(new CardIdentity("Jace Beleren",""));
+ cubeCards.add(new CardIdentity("Jace, Architect of Thought",""));
+ cubeCards.add(new CardIdentity("Jace, the Mind Sculptor",""));
+ cubeCards.add(new CardIdentity("Jackal Pup",""));
+ cubeCards.add(new CardIdentity("Joraga Treespeaker",""));
+ cubeCards.add(new CardIdentity("Journey to Nowhere",""));
+ cubeCards.add(new CardIdentity("Kami of Ancient Law",""));
+ cubeCards.add(new CardIdentity("Karmic Guide",""));
+ cubeCards.add(new CardIdentity("Karn Liberated",""));
+ cubeCards.add(new CardIdentity("Karplusan Forest",""));
+ cubeCards.add(new CardIdentity("Keiga, the Tide Star",""));
+ cubeCards.add(new CardIdentity("Keranos, God of Storms",""));
+ cubeCards.add(new CardIdentity("Kiki-Jiki, Mirror Breaker",""));
+ cubeCards.add(new CardIdentity("Kiln Fiend",""));
+ cubeCards.add(new CardIdentity("Kiora, the Crashing Wave",""));
+ cubeCards.add(new CardIdentity("Kira, Great Glass-Spinner",""));
+ cubeCards.add(new CardIdentity("Kitchen Finks",""));
+ cubeCards.add(new CardIdentity("Knight of Infamy",""));
+ cubeCards.add(new CardIdentity("Kodama's Reach",""));
+ cubeCards.add(new CardIdentity("Kokusho, the Evening Star",""));
+ cubeCards.add(new CardIdentity("Kor Skyfisher",""));
+ cubeCards.add(new CardIdentity("Koth of the Hammer",""));
+ cubeCards.add(new CardIdentity("Kozilek, Butcher of Truth",""));
+ cubeCards.add(new CardIdentity("Krenko's Command",""));
+ cubeCards.add(new CardIdentity("Krosan Grip",""));
+ cubeCards.add(new CardIdentity("Land Tax",""));
+ cubeCards.add(new CardIdentity("Legacy's Allure",""));
+ cubeCards.add(new CardIdentity("Lifebane Zombie",""));
+ cubeCards.add(new CardIdentity("Lightning Bolt",""));
+ cubeCards.add(new CardIdentity("Lightning Greaves",""));
+ cubeCards.add(new CardIdentity("Lightning Helix",""));
+ cubeCards.add(new CardIdentity("Lightning Mauler",""));
+ cubeCards.add(new CardIdentity("Lightning Strike",""));
+ cubeCards.add(new CardIdentity("Liliana of the Veil",""));
+ cubeCards.add(new CardIdentity("Liliana Vess",""));
+ cubeCards.add(new CardIdentity("Lingering Souls",""));
+ cubeCards.add(new CardIdentity("Linvala, Keeper of Silence",""));
+ cubeCards.add(new CardIdentity("Living Death",""));
+ cubeCards.add(new CardIdentity("Llanowar Elves",""));
+ cubeCards.add(new CardIdentity("Llanowar Wastes",""));
+ cubeCards.add(new CardIdentity("Looter il-Kor",""));
+ cubeCards.add(new CardIdentity("Lotleth Troll",""));
+ cubeCards.add(new CardIdentity("Lotus Cobra",""));
+ cubeCards.add(new CardIdentity("Loxodon Warhammer",""));
+ cubeCards.add(new CardIdentity("Madcap Skills",""));
+ cubeCards.add(new CardIdentity("Maelstrom Pulse",""));
+ cubeCards.add(new CardIdentity("Magma Jet",""));
+ cubeCards.add(new CardIdentity("Man-o'-War",""));
+ cubeCards.add(new CardIdentity("Mana Confluence",""));
+ cubeCards.add(new CardIdentity("Mana Leak",""));
+ cubeCards.add(new CardIdentity("Mana Tithe",""));
+ cubeCards.add(new CardIdentity("Marsh Flats",""));
+ cubeCards.add(new CardIdentity("Martial Coup",""));
+ cubeCards.add(new CardIdentity("Massacre Wurm",""));
+ cubeCards.add(new CardIdentity("Master of the Feast",""));
+ cubeCards.add(new CardIdentity("Master of the Wild Hunt",""));
+ cubeCards.add(new CardIdentity("Master of Waves",""));
+ cubeCards.add(new CardIdentity("Meloku the Clouded Mirror",""));
+ cubeCards.add(new CardIdentity("Mentor of the Meek",""));
+ cubeCards.add(new CardIdentity("Merfolk Looter",""));
+ cubeCards.add(new CardIdentity("Mesmeric Fiend",""));
+ cubeCards.add(new CardIdentity("Mind Stone",""));
+ cubeCards.add(new CardIdentity("Mirari's Wake",""));
+ cubeCards.add(new CardIdentity("Mirran Crusader",""));
+ cubeCards.add(new CardIdentity("Miscalculation",""));
+ cubeCards.add(new CardIdentity("Mishra's Factory",""));
+ cubeCards.add(new CardIdentity("Misty Rainforest",""));
+ cubeCards.add(new CardIdentity("Mizzium Mortars",""));
+ cubeCards.add(new CardIdentity("Mogg Fanatic",""));
+ cubeCards.add(new CardIdentity("Mogg War Marshal",""));
+ cubeCards.add(new CardIdentity("Molten Rain",""));
+ cubeCards.add(new CardIdentity("Molten-Tail Masticore",""));
+ cubeCards.add(new CardIdentity("Momentary Blink",""));
+ cubeCards.add(new CardIdentity("Mother of Runes",""));
+ cubeCards.add(new CardIdentity("Mox Diamond",""));
+ cubeCards.add(new CardIdentity("Mulch",""));
+ cubeCards.add(new CardIdentity("Mulldrifter",""));
+ cubeCards.add(new CardIdentity("Murderous Cut",""));
+ cubeCards.add(new CardIdentity("Murderous Redcap",""));
+ cubeCards.add(new CardIdentity("Mutagenic Growth",""));
+ cubeCards.add(new CardIdentity("Mutavault",""));
+ cubeCards.add(new CardIdentity("Myr Battlesphere",""));
+ cubeCards.add(new CardIdentity("Mystic Snake",""));
+ cubeCards.add(new CardIdentity("Mystical Teachings",""));
+ cubeCards.add(new CardIdentity("Nantuko Shade",""));
+ cubeCards.add(new CardIdentity("Natural Order",""));
+ cubeCards.add(new CardIdentity("Naturalize",""));
+ cubeCards.add(new CardIdentity("Negate",""));
+ cubeCards.add(new CardIdentity("Nekrataal",""));
+ cubeCards.add(new CardIdentity("Nicol Bolas, Planeswalker",""));
+ cubeCards.add(new CardIdentity("Night's Whisper",""));
+ cubeCards.add(new CardIdentity("Nighthowler",""));
+ cubeCards.add(new CardIdentity("Nightveil Specter",""));
+ cubeCards.add(new CardIdentity("Nissa, Worldwaker",""));
+ cubeCards.add(new CardIdentity("Noble Hierarch",""));
+ cubeCards.add(new CardIdentity("Nykthos, Shrine to Nyx",""));
+ cubeCards.add(new CardIdentity("Oblivion Ring",""));
+ cubeCards.add(new CardIdentity("Obstinate Baloth",""));
+ cubeCards.add(new CardIdentity("Old Man of the Sea",""));
+ cubeCards.add(new CardIdentity("Olivia Voldaren",""));
+ cubeCards.add(new CardIdentity("Ophiomancer",""));
+ cubeCards.add(new CardIdentity("Opposition",""));
+ cubeCards.add(new CardIdentity("Oracle of Mul Daya",""));
+ cubeCards.add(new CardIdentity("Oust",""));
+ cubeCards.add(new CardIdentity("Overgrown Battlement",""));
+ cubeCards.add(new CardIdentity("Overgrown Tomb",""));
+ cubeCards.add(new CardIdentity("Pact of Negation",""));
+ cubeCards.add(new CardIdentity("Pain Seer",""));
+ cubeCards.add(new CardIdentity("Parallax Wave",""));
+ cubeCards.add(new CardIdentity("Path to Exile",""));
+ cubeCards.add(new CardIdentity("Pestermite",""));
+ cubeCards.add(new CardIdentity("Phantasmal Image",""));
+ cubeCards.add(new CardIdentity("Phantom Centaur",""));
+ cubeCards.add(new CardIdentity("Phyrexian Arena",""));
+ cubeCards.add(new CardIdentity("Phyrexian Metamorph",""));
+ cubeCards.add(new CardIdentity("Phyrexian Obliterator",""));
+ cubeCards.add(new CardIdentity("Phyrexian Revoker",""));
+ cubeCards.add(new CardIdentity("Pillar of Flame",""));
+ cubeCards.add(new CardIdentity("Plateau",""));
+ cubeCards.add(new CardIdentity("Plow Under",""));
+ cubeCards.add(new CardIdentity("Polluted Delta",""));
+ cubeCards.add(new CardIdentity("Polukranos, World Eater",""));
+ cubeCards.add(new CardIdentity("Ponder",""));
+ cubeCards.add(new CardIdentity("Porcelain Legionnaire",""));
+ cubeCards.add(new CardIdentity("Precinct Captain",""));
+ cubeCards.add(new CardIdentity("Precursor Golem",""));
+ cubeCards.add(new CardIdentity("Preordain",""));
+ cubeCards.add(new CardIdentity("Primal Command",""));
+ cubeCards.add(new CardIdentity("Prime Speaker Zegana",""));
+ cubeCards.add(new CardIdentity("Primeval Titan",""));
+ cubeCards.add(new CardIdentity("Profane Command",""));
+ cubeCards.add(new CardIdentity("Progenitus",""));
+ cubeCards.add(new CardIdentity("Prophetic Bolt",""));
+ cubeCards.add(new CardIdentity("Prophetic Flamespeaker",""));
+ cubeCards.add(new CardIdentity("Psychatog",""));
+ cubeCards.add(new CardIdentity("Purphoros, God of the Forge",""));
+ cubeCards.add(new CardIdentity("Qasali Pridemage",""));
+ cubeCards.add(new CardIdentity("Raise the Alarm",""));
+ cubeCards.add(new CardIdentity("Rakdos Cackler",""));
+ cubeCards.add(new CardIdentity("Ral Zarek",""));
+ cubeCards.add(new CardIdentity("Rampant Growth",""));
+ cubeCards.add(new CardIdentity("Rancor",""));
+ cubeCards.add(new CardIdentity("Ranger of Eos",""));
+ cubeCards.add(new CardIdentity("Ravages of War",""));
+ cubeCards.add(new CardIdentity("Reanimate",""));
+ cubeCards.add(new CardIdentity("Reclamation Sage",""));
+ cubeCards.add(new CardIdentity("Recurring Nightmare",""));
+ cubeCards.add(new CardIdentity("Reflecting Pool",""));
+ cubeCards.add(new CardIdentity("Regrowth",""));
+ cubeCards.add(new CardIdentity("Remand",""));
+ cubeCards.add(new CardIdentity("Remove Soul",""));
+ cubeCards.add(new CardIdentity("Repeal",""));
+ cubeCards.add(new CardIdentity("Restoration Angel",""));
+ cubeCards.add(new CardIdentity("Reveillark",""));
+ cubeCards.add(new CardIdentity("Rift Bolt",""));
+ cubeCards.add(new CardIdentity("Riftwing Cloudskate",""));
+ cubeCards.add(new CardIdentity("Riptide Laboratory",""));
+ cubeCards.add(new CardIdentity("Rishadan Port",""));
+ cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary",""));
+ cubeCards.add(new CardIdentity("Rootbound Crag",""));
+ cubeCards.add(new CardIdentity("Sacred Foundry",""));
+ cubeCards.add(new CardIdentity("Sakashima's Student",""));
+ cubeCards.add(new CardIdentity("Sakura-Tribe Elder",""));
+ cubeCards.add(new CardIdentity("Sarcomancy",""));
+ cubeCards.add(new CardIdentity("Sarkhan, the Dragonspeaker",""));
+ cubeCards.add(new CardIdentity("Satyr Wayfinder",""));
+ cubeCards.add(new CardIdentity("Savannah",""));
+ cubeCards.add(new CardIdentity("Savannah Lions",""));
+ cubeCards.add(new CardIdentity("Scalding Tarn",""));
+ cubeCards.add(new CardIdentity("Scavenging Ooze",""));
+ cubeCards.add(new CardIdentity("Scorched Rusalka",""));
+ cubeCards.add(new CardIdentity("Scrubland",""));
+ cubeCards.add(new CardIdentity("Sea Gate Oracle",""));
+ cubeCards.add(new CardIdentity("Seal of Cleansing",""));
+ cubeCards.add(new CardIdentity("Seal of Fire",""));
+ cubeCards.add(new CardIdentity("Search for Tomorrow",""));
+ cubeCards.add(new CardIdentity("Searing Blaze",""));
+ cubeCards.add(new CardIdentity("Searing Blood",""));
+ cubeCards.add(new CardIdentity("Searing Spear",""));
+ cubeCards.add(new CardIdentity("Seeker of the Way",""));
+ cubeCards.add(new CardIdentity("Sensei's Divining Top",""));
+ cubeCards.add(new CardIdentity("Serendib Efreet",""));
+ cubeCards.add(new CardIdentity("Serum Visions",""));
+ cubeCards.add(new CardIdentity("Setessan Tactics",""));
+ cubeCards.add(new CardIdentity("Shadowmage Infiltrator",""));
+ cubeCards.add(new CardIdentity("Shardless Agent",""));
+ cubeCards.add(new CardIdentity("Sheoldred, Whispering One",""));
+ cubeCards.add(new CardIdentity("Shivan Reef",""));
+ cubeCards.add(new CardIdentity("Show and Tell",""));
+ cubeCards.add(new CardIdentity("Shriekmaw",""));
+ cubeCards.add(new CardIdentity("Shrine of Burning Rage",""));
+ cubeCards.add(new CardIdentity("Siege-Gang Commander",""));
+ cubeCards.add(new CardIdentity("Silverblade Paladin",""));
+ cubeCards.add(new CardIdentity("Sin Collector",""));
+ cubeCards.add(new CardIdentity("Sinkhole",""));
+ cubeCards.add(new CardIdentity("Skinrender",""));
+ cubeCards.add(new CardIdentity("Skullcrack",""));
+ cubeCards.add(new CardIdentity("Slagstorm",""));
+ cubeCards.add(new CardIdentity("Slaughter Pact",""));
+ cubeCards.add(new CardIdentity("Smash to Smithereens",""));
+ cubeCards.add(new CardIdentity("Snapcaster Mage",""));
+ cubeCards.add(new CardIdentity("Sneak Attack",""));
+ cubeCards.add(new CardIdentity("Soldier of the Pantheon",""));
+ cubeCards.add(new CardIdentity("Solemn Simulacrum",""));
+ cubeCards.add(new CardIdentity("Song of the Dryads",""));
+ cubeCards.add(new CardIdentity("Sorin Markov",""));
+ cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad",""));
+ cubeCards.add(new CardIdentity("Sorin, Solemn Visitor",""));
+ cubeCards.add(new CardIdentity("Soul of Innistrad",""));
+ cubeCards.add(new CardIdentity("Sower of Temptation",""));
+ cubeCards.add(new CardIdentity("Spear of Heliod",""));
+ cubeCards.add(new CardIdentity("Spectral Procession",""));
+ cubeCards.add(new CardIdentity("Spellskite",""));
+ cubeCards.add(new CardIdentity("Sphere of the Suns",""));
+ cubeCards.add(new CardIdentity("Sphinx's Revelation",""));
+ cubeCards.add(new CardIdentity("Spikeshot Elder",""));
+ cubeCards.add(new CardIdentity("Spiteful Returned",""));
+ cubeCards.add(new CardIdentity("Splinter Twin",""));
+ cubeCards.add(new CardIdentity("Staggershock",""));
+ cubeCards.add(new CardIdentity("Steam Vents",""));
+ cubeCards.add(new CardIdentity("Stinkweed Imp",""));
+ cubeCards.add(new CardIdentity("Stoke the Flames",""));
+ cubeCards.add(new CardIdentity("Stomping Ground",""));
+ cubeCards.add(new CardIdentity("Stormbreath Dragon",""));
+ cubeCards.add(new CardIdentity("Stroke of Genius",""));
+ cubeCards.add(new CardIdentity("Stromkirk Noble",""));
+ cubeCards.add(new CardIdentity("Student of Warfare",""));
+ cubeCards.add(new CardIdentity("Sublime Archangel",""));
+ cubeCards.add(new CardIdentity("Sulfur Falls",""));
+ cubeCards.add(new CardIdentity("Sulfuric Vortex",""));
+ cubeCards.add(new CardIdentity("Sulfurous Springs",""));
+ cubeCards.add(new CardIdentity("Summoning Trap",""));
+ cubeCards.add(new CardIdentity("Sun Titan",""));
+ cubeCards.add(new CardIdentity("Sundering Titan",""));
+ cubeCards.add(new CardIdentity("Sunpetal Grove",""));
+ cubeCards.add(new CardIdentity("Supreme Verdict",""));
+ cubeCards.add(new CardIdentity("Swords to Plowshares",""));
+ cubeCards.add(new CardIdentity("Sylvan Caryatid",""));
+ cubeCards.add(new CardIdentity("Sylvan Library",""));
+ cubeCards.add(new CardIdentity("Taiga",""));
+ cubeCards.add(new CardIdentity("Talrand, Sky Summoner",""));
+ cubeCards.add(new CardIdentity("Tamiyo, the Moon Sage",""));
+ cubeCards.add(new CardIdentity("Tangle Wire",""));
+ cubeCards.add(new CardIdentity("Tarmogoyf",""));
+ cubeCards.add(new CardIdentity("Tectonic Edge",""));
+ cubeCards.add(new CardIdentity("Teetering Peaks",""));
+ cubeCards.add(new CardIdentity("Teferi, Mage of Zhalfir",""));
+ cubeCards.add(new CardIdentity("Temple Garden",""));
+ cubeCards.add(new CardIdentity("Temple of Abandon",""));
+ cubeCards.add(new CardIdentity("Temple of Deceit",""));
+ cubeCards.add(new CardIdentity("Temple of Enlightenment",""));
+ cubeCards.add(new CardIdentity("Temple of Epiphany",""));
+ cubeCards.add(new CardIdentity("Temple of Malady",""));
+ cubeCards.add(new CardIdentity("Temple of Malice",""));
+ cubeCards.add(new CardIdentity("Temple of Mystery",""));
+ cubeCards.add(new CardIdentity("Temple of Plenty",""));
+ cubeCards.add(new CardIdentity("Temple of Silence",""));
+ cubeCards.add(new CardIdentity("Temple of Triumph",""));
+ cubeCards.add(new CardIdentity("Tempt with Vengeance",""));
+ cubeCards.add(new CardIdentity("Tendrils of Corruption",""));
+ cubeCards.add(new CardIdentity("Terastodon",""));
+ cubeCards.add(new CardIdentity("Terminate",""));
+ cubeCards.add(new CardIdentity("Terminus",""));
+ cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben",""));
+ cubeCards.add(new CardIdentity("Thassa, God of the Sea",""));
+ cubeCards.add(new CardIdentity("Think Twice",""));
+ cubeCards.add(new CardIdentity("Thoughtseize",""));
+ cubeCards.add(new CardIdentity("Thragtusk",""));
+ cubeCards.add(new CardIdentity("Thran Dynamo",""));
+ cubeCards.add(new CardIdentity("Through the Breach",""));
+ cubeCards.add(new CardIdentity("Thrun, the Last Troll",""));
+ cubeCards.add(new CardIdentity("Thundermaw Hellkite",""));
+ cubeCards.add(new CardIdentity("Tidehollow Sculler",""));
+ cubeCards.add(new CardIdentity("Time Warp",""));
+ cubeCards.add(new CardIdentity("Tooth and Nail",""));
+ cubeCards.add(new CardIdentity("Toxic Deluge",""));
+ cubeCards.add(new CardIdentity("Tracker's Instincts",""));
+ cubeCards.add(new CardIdentity("Tradewind Rider",""));
+ cubeCards.add(new CardIdentity("Treachery",""));
+ cubeCards.add(new CardIdentity("Troll Ascetic",""));
+ cubeCards.add(new CardIdentity("Tropical Island",""));
+ cubeCards.add(new CardIdentity("Trygon Predator",""));
+ cubeCards.add(new CardIdentity("Tundra",""));
+ cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre",""));
+ cubeCards.add(new CardIdentity("Ultimate Price",""));
+ cubeCards.add(new CardIdentity("Umezawa's Jitte",""));
+ cubeCards.add(new CardIdentity("Unburial Rites",""));
+ cubeCards.add(new CardIdentity("Underground River",""));
+ cubeCards.add(new CardIdentity("Underground Sea",""));
+ cubeCards.add(new CardIdentity("Underworld Connections",""));
+ cubeCards.add(new CardIdentity("Unexpectedly Absent",""));
+ cubeCards.add(new CardIdentity("Upheaval",""));
+ cubeCards.add(new CardIdentity("Vampire Hexmage",""));
+ cubeCards.add(new CardIdentity("Vampire Lacerator",""));
+ cubeCards.add(new CardIdentity("Vampire Nighthawk",""));
+ cubeCards.add(new CardIdentity("Vedalken Shackles",""));
+ cubeCards.add(new CardIdentity("Vendilion Clique",""));
+ cubeCards.add(new CardIdentity("Vengevine",""));
+ cubeCards.add(new CardIdentity("Venser, Shaper Savant",""));
+ cubeCards.add(new CardIdentity("Venser, the Sojourner",""));
+ cubeCards.add(new CardIdentity("Verdant Catacombs",""));
+ cubeCards.add(new CardIdentity("Vindicate",""));
+ cubeCards.add(new CardIdentity("Visara the Dreadful",""));
+ cubeCards.add(new CardIdentity("Voice of Resurgence",""));
+ cubeCards.add(new CardIdentity("Volcanic Island",""));
+ cubeCards.add(new CardIdentity("Volrath's Stronghold",""));
+ cubeCards.add(new CardIdentity("Vraska the Unseen",""));
+ cubeCards.add(new CardIdentity("Wake Thrasher",""));
+ cubeCards.add(new CardIdentity("Wall of Blossoms",""));
+ cubeCards.add(new CardIdentity("Wall of Omens",""));
+ cubeCards.add(new CardIdentity("Wall of Roots",""));
+ cubeCards.add(new CardIdentity("Warleader's Helix",""));
+ cubeCards.add(new CardIdentity("Wasteland",""));
+ cubeCards.add(new CardIdentity("Waterfront Bouncer",""));
+ cubeCards.add(new CardIdentity("Watery Grave",""));
+ cubeCards.add(new CardIdentity("Whip of Erebos",""));
+ cubeCards.add(new CardIdentity("Wild Mongrel",""));
+ cubeCards.add(new CardIdentity("Windbrisk Heights",""));
+ cubeCards.add(new CardIdentity("Windswept Heath",""));
+ cubeCards.add(new CardIdentity("Winter Orb",""));
+ cubeCards.add(new CardIdentity("Wolfir Silverheart",""));
+ cubeCards.add(new CardIdentity("Wood Elves",""));
+ cubeCards.add(new CardIdentity("Wooded Foothills",""));
+ cubeCards.add(new CardIdentity("Woodfall Primus",""));
+ cubeCards.add(new CardIdentity("Woodland Cemetery",""));
+ cubeCards.add(new CardIdentity("Worn Powerstone",""));
+ cubeCards.add(new CardIdentity("Wrath of God",""));
+ cubeCards.add(new CardIdentity("Wurmcoil Engine",""));
+ cubeCards.add(new CardIdentity("Xathrid Necromancer",""));
+ cubeCards.add(new CardIdentity("Xenagos, the Reveler",""));
+ cubeCards.add(new CardIdentity("Yavimaya Coast",""));
+ cubeCards.add(new CardIdentity("Yavimaya Elder",""));
+ cubeCards.add(new CardIdentity("Yosei, the Morning Star",""));
+ cubeCards.add(new CardIdentity("Young Pyromancer",""));
+ cubeCards.add(new CardIdentity("Zealous Conscripts",""));
+ }
+}
diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCube2015.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCubeMarch2015.java
similarity index 99%
rename from Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCube2015.java
rename to Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCubeMarch2015.java
index ff78a85711d..6bfd5c837cc 100644
--- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCube2015.java
+++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCubeMarch2015.java
@@ -34,10 +34,10 @@ import mage.game.draft.DraftCube;
* @author fireshoes
*/
-public class MTGOLegacyCube2015 extends DraftCube {
+public class MTGOLegacyCubeMarch2015 extends DraftCube {
- public MTGOLegacyCube2015() {
- super("MTGO Legacy Cube 2015 (600 cards)");
+ public MTGOLegacyCubeMarch2015() {
+ super("MTGO Legacy Cube March 2015 (600 cards)");
cubeCards.add(new DraftCube.CardIdentity("Accorder Paladin",""));
cubeCards.add(new DraftCube.CardIdentity("Abrupt Decay",""));
cubeCards.add(new DraftCube.CardIdentity("Acidic Slime",""));
@@ -88,6 +88,7 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Bitterblossom",""));
cubeCards.add(new DraftCube.CardIdentity("Blade of the Bloodchief",""));
cubeCards.add(new DraftCube.CardIdentity("Blade Splicer",""));
+ cubeCards.add(new DraftCube.CardIdentity("Blood Artist",""));
cubeCards.add(new DraftCube.CardIdentity("Blood Crypt",""));
cubeCards.add(new DraftCube.CardIdentity("Bloodbraid Elf",""));
cubeCards.add(new DraftCube.CardIdentity("Bloodcrazed Neonate",""));
@@ -95,13 +96,13 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Bloodline Keeper",""));
cubeCards.add(new DraftCube.CardIdentity("Bloodlord of Vaasgoth",""));
cubeCards.add(new DraftCube.CardIdentity("Bloodstained Mire",""));
+ cubeCards.add(new DraftCube.CardIdentity("Bloodthrone Vampire",""));
cubeCards.add(new DraftCube.CardIdentity("Bogardan Hellkite",""));
cubeCards.add(new DraftCube.CardIdentity("Bone Shredder",""));
cubeCards.add(new DraftCube.CardIdentity("Bonesplitter",""));
cubeCards.add(new DraftCube.CardIdentity("Bonfire of the Damned",""));
cubeCards.add(new DraftCube.CardIdentity("Boon Satyr",""));
cubeCards.add(new DraftCube.CardIdentity("Boros Charm",""));
- cubeCards.add(new DraftCube.CardIdentity("Boros Elite",""));
cubeCards.add(new DraftCube.CardIdentity("Boros Reckoner",""));
cubeCards.add(new DraftCube.CardIdentity("Brago, King Eternal",""));
cubeCards.add(new DraftCube.CardIdentity("Brainstorm",""));
@@ -113,7 +114,6 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Burst Lightning",""));
cubeCards.add(new DraftCube.CardIdentity("Call of the Herd",""));
cubeCards.add(new DraftCube.CardIdentity("Captivating Vampire",""));
- cubeCards.add(new DraftCube.CardIdentity("Carnophage",""));
cubeCards.add(new DraftCube.CardIdentity("Caves of Koilos",""));
cubeCards.add(new DraftCube.CardIdentity("Chain Lightning",""));
cubeCards.add(new DraftCube.CardIdentity("Chainer's Edict",""));
@@ -257,7 +257,6 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Glacial Fortress",""));
cubeCards.add(new DraftCube.CardIdentity("Glen Elendra Archmage",""));
cubeCards.add(new DraftCube.CardIdentity("Glorious Anthem",""));
- cubeCards.add(new DraftCube.CardIdentity("Gnarled Scarhide",""));
cubeCards.add(new DraftCube.CardIdentity("Go for the Throat",""));
cubeCards.add(new DraftCube.CardIdentity("Goblin Bombardment",""));
cubeCards.add(new DraftCube.CardIdentity("Goblin Bushwhacker",""));
@@ -281,6 +280,7 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Hallowed Spiritkeeper",""));
cubeCards.add(new DraftCube.CardIdentity("Hammer of Purphoros",""));
cubeCards.add(new DraftCube.CardIdentity("Harmonize",""));
+ cubeCards.add(new DraftCube.CardIdentity("Harrow",""));
cubeCards.add(new DraftCube.CardIdentity("Hellrider",""));
cubeCards.add(new DraftCube.CardIdentity("Herald of Torment",""));
cubeCards.add(new DraftCube.CardIdentity("Hero of Bladehold",""));
@@ -359,6 +359,7 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Mana Leak",""));
cubeCards.add(new DraftCube.CardIdentity("Mana Tithe",""));
cubeCards.add(new DraftCube.CardIdentity("Manic Vandal",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mardu Woe Reaper",""));
cubeCards.add(new DraftCube.CardIdentity("Marsh Flats",""));
cubeCards.add(new DraftCube.CardIdentity("Martial Coup",""));
cubeCards.add(new DraftCube.CardIdentity("Massacre Wurm",""));
@@ -382,7 +383,6 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Monastery Swiftspear",""));
cubeCards.add(new DraftCube.CardIdentity("Mother of Runes",""));
cubeCards.add(new DraftCube.CardIdentity("Mox Diamond",""));
- cubeCards.add(new DraftCube.CardIdentity("Mulch",""));
cubeCards.add(new DraftCube.CardIdentity("Mulldrifter",""));
cubeCards.add(new DraftCube.CardIdentity("Murderous Cut",""));
cubeCards.add(new DraftCube.CardIdentity("Mutavault",""));
@@ -638,6 +638,5 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Yosei, the Morning Star",""));
cubeCards.add(new DraftCube.CardIdentity("Young Pyromancer",""));
cubeCards.add(new DraftCube.CardIdentity("Zealous Conscripts",""));
-
}
}
diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCubeSeptember2015.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCubeSeptember2015.java
new file mode 100644
index 00000000000..14f4a608c0a
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/MTGOLegacyCubeSeptember2015.java
@@ -0,0 +1,642 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.tournament.cubes;
+
+import mage.game.draft.DraftCube;
+
+/**
+ *
+ * @author fireshoes
+ */
+
+public class MTGOLegacyCubeSeptember2015 extends DraftCube {
+
+ public MTGOLegacyCubeSeptember2015() {
+ super("MTGO Legacy Cube September 2015 (600 cards)");
+ cubeCards.add(new DraftCube.CardIdentity("Abbot of Keral Keep",""));
+ cubeCards.add(new DraftCube.CardIdentity("Abhorrent Overlord",""));
+ cubeCards.add(new DraftCube.CardIdentity("Abrupt Decay",""));
+ cubeCards.add(new DraftCube.CardIdentity("Abyssal Persecutor",""));
+ cubeCards.add(new DraftCube.CardIdentity("Accorder Paladin",""));
+ cubeCards.add(new DraftCube.CardIdentity("Acidic Slime",""));
+ cubeCards.add(new DraftCube.CardIdentity("Act of Aggression",""));
+ cubeCards.add(new DraftCube.CardIdentity("Adarkar Wastes",""));
+ cubeCards.add(new DraftCube.CardIdentity("AEther Vial",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ainok Survivalist",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ajani Goldmane",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ajani Vengeant",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ajani, Caller of the Pride",""));
+ cubeCards.add(new DraftCube.CardIdentity("Akroma's Vengeance",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ancestral Vision",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ancient Tomb",""));
+ cubeCards.add(new DraftCube.CardIdentity("Angel of Serenity",""));
+ cubeCards.add(new DraftCube.CardIdentity("Angelic Destiny",""));
+ cubeCards.add(new DraftCube.CardIdentity("Anger of the Gods",""));
+ cubeCards.add(new DraftCube.CardIdentity("Animate Dead",""));
+ cubeCards.add(new DraftCube.CardIdentity("Arbor Elf",""));
+ cubeCards.add(new DraftCube.CardIdentity("Arc Trail",""));
+ cubeCards.add(new DraftCube.CardIdentity("Archangel of Thune",""));
+ cubeCards.add(new DraftCube.CardIdentity("Arid Mesa",""));
+ cubeCards.add(new DraftCube.CardIdentity("Armageddon",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ashcloud Phoenix",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ashen Rider",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ashenmoor Gouger",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ashiok, Nightmare Weaver",""));
+ cubeCards.add(new DraftCube.CardIdentity("Assemble the Legion",""));
+ cubeCards.add(new DraftCube.CardIdentity("Attrition",""));
+ cubeCards.add(new DraftCube.CardIdentity("Augur of Bolas",""));
+ cubeCards.add(new DraftCube.CardIdentity("Avacyn's Pilgrim",""));
+ cubeCards.add(new DraftCube.CardIdentity("Avalanche Riders",""));
+ cubeCards.add(new DraftCube.CardIdentity("Avenger of Zendikar",""));
+ cubeCards.add(new DraftCube.CardIdentity("Badlands",""));
+ cubeCards.add(new DraftCube.CardIdentity("Baleful Strix",""));
+ cubeCards.add(new DraftCube.CardIdentity("Banefire",""));
+ cubeCards.add(new DraftCube.CardIdentity("Baneslayer Angel",""));
+ cubeCards.add(new DraftCube.CardIdentity("Banisher Priest",""));
+ cubeCards.add(new DraftCube.CardIdentity("Banishing Light",""));
+ cubeCards.add(new DraftCube.CardIdentity("Basalt Monolith",""));
+ cubeCards.add(new DraftCube.CardIdentity("Basilisk Collar",""));
+ cubeCards.add(new DraftCube.CardIdentity("Batterskull",""));
+ cubeCards.add(new DraftCube.CardIdentity("Battlefield Forge",""));
+ cubeCards.add(new DraftCube.CardIdentity("Bayou",""));
+ cubeCards.add(new DraftCube.CardIdentity("Beast Within",""));
+ cubeCards.add(new DraftCube.CardIdentity("Beetleback Chief",""));
+ cubeCards.add(new DraftCube.CardIdentity("Birds of Paradise",""));
+ cubeCards.add(new DraftCube.CardIdentity("Birthing Pod",""));
+ cubeCards.add(new DraftCube.CardIdentity("Bitterblossom",""));
+ cubeCards.add(new DraftCube.CardIdentity("Blade Splicer",""));
+ cubeCards.add(new DraftCube.CardIdentity("Blood Crypt",""));
+ cubeCards.add(new DraftCube.CardIdentity("Bloodbraid Elf",""));
+ cubeCards.add(new DraftCube.CardIdentity("Bloodghast",""));
+ cubeCards.add(new DraftCube.CardIdentity("Bloodsoaked Champion",""));
+ cubeCards.add(new DraftCube.CardIdentity("Bloodstained Mire",""));
+ cubeCards.add(new DraftCube.CardIdentity("Bogardan Hellkite",""));
+ cubeCards.add(new DraftCube.CardIdentity("Bone Shredder",""));
+ cubeCards.add(new DraftCube.CardIdentity("Bonesplitter",""));
+ cubeCards.add(new DraftCube.CardIdentity("Bonfire of the Damned",""));
+ cubeCards.add(new DraftCube.CardIdentity("Boros Charm",""));
+ cubeCards.add(new DraftCube.CardIdentity("Boros Reckoner",""));
+ cubeCards.add(new DraftCube.CardIdentity("Brago, King Eternal",""));
+ cubeCards.add(new DraftCube.CardIdentity("Brainstorm",""));
+ cubeCards.add(new DraftCube.CardIdentity("Breeding Pool",""));
+ cubeCards.add(new DraftCube.CardIdentity("Brimaz, King of Oreskos",""));
+ cubeCards.add(new DraftCube.CardIdentity("Brimstone Volley",""));
+ cubeCards.add(new DraftCube.CardIdentity("Brushland",""));
+ cubeCards.add(new DraftCube.CardIdentity("Buried Alive",""));
+ cubeCards.add(new DraftCube.CardIdentity("Burst Lightning",""));
+ cubeCards.add(new DraftCube.CardIdentity("Careful Study",""));
+ cubeCards.add(new DraftCube.CardIdentity("Carrion Feeder",""));
+ cubeCards.add(new DraftCube.CardIdentity("Caves of Koilos",""));
+ cubeCards.add(new DraftCube.CardIdentity("Chain Lightning",""));
+ cubeCards.add(new DraftCube.CardIdentity("Chainer's Edict",""));
+ cubeCards.add(new DraftCube.CardIdentity("Chameleon Colossus",""));
+ cubeCards.add(new DraftCube.CardIdentity("Champion of the Parish",""));
+ cubeCards.add(new DraftCube.CardIdentity("Chandra Nalaar",""));
+ cubeCards.add(new DraftCube.CardIdentity("Chandra, Fire of Kaladesh",""));
+ cubeCards.add(new DraftCube.CardIdentity("Chandra, Pyromaster",""));
+ cubeCards.add(new DraftCube.CardIdentity("Chandra's Phoenix",""));
+ cubeCards.add(new DraftCube.CardIdentity("Char",""));
+ cubeCards.add(new DraftCube.CardIdentity("Chasm Skulker",""));
+ cubeCards.add(new DraftCube.CardIdentity("Chord of Calling",""));
+ cubeCards.add(new DraftCube.CardIdentity("Chromatic Lantern",""));
+ cubeCards.add(new DraftCube.CardIdentity("Chrome Mox",""));
+ cubeCards.add(new DraftCube.CardIdentity("City of Brass",""));
+ cubeCards.add(new DraftCube.CardIdentity("Clifftop Retreat",""));
+ cubeCards.add(new DraftCube.CardIdentity("Cloudgoat Ranger",""));
+ cubeCards.add(new DraftCube.CardIdentity("Coalition Relic",""));
+ cubeCards.add(new DraftCube.CardIdentity("Collected Company",""));
+ cubeCards.add(new DraftCube.CardIdentity("Compulsive Research",""));
+ cubeCards.add(new DraftCube.CardIdentity("Condemn",""));
+ cubeCards.add(new DraftCube.CardIdentity("Condescend",""));
+ cubeCards.add(new DraftCube.CardIdentity("Consecrated Sphinx",""));
+ cubeCards.add(new DraftCube.CardIdentity("Control Magic",""));
+ cubeCards.add(new DraftCube.CardIdentity("Corpse Dance",""));
+ cubeCards.add(new DraftCube.CardIdentity("Council's Judgment",""));
+ cubeCards.add(new DraftCube.CardIdentity("Counterspell",""));
+ cubeCards.add(new DraftCube.CardIdentity("Courser of Kruphix",""));
+ cubeCards.add(new DraftCube.CardIdentity("Crater's Claws",""));
+ cubeCards.add(new DraftCube.CardIdentity("Craterhoof Behemoth",""));
+ cubeCards.add(new DraftCube.CardIdentity("Crusade",""));
+ cubeCards.add(new DraftCube.CardIdentity("Crux of Fate",""));
+ cubeCards.add(new DraftCube.CardIdentity("Cryptic Command",""));
+ cubeCards.add(new DraftCube.CardIdentity("Cultivate",""));
+ cubeCards.add(new DraftCube.CardIdentity("Cunning Sparkmage",""));
+ cubeCards.add(new DraftCube.CardIdentity("Cursed Scroll",""));
+ cubeCards.add(new DraftCube.CardIdentity("Cyclonic Rift",""));
+ cubeCards.add(new DraftCube.CardIdentity("Damnation",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dance of the Dead",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dark Confidant",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dark Depths",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dark Petition",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dark Ritual",""));
+ cubeCards.add(new DraftCube.CardIdentity("Day of Judgment",""));
+ cubeCards.add(new DraftCube.CardIdentity("Daze",""));
+ cubeCards.add(new DraftCube.CardIdentity("Deathrite Shaman",""));
+ cubeCards.add(new DraftCube.CardIdentity("Deceiver Exarch",""));
+ cubeCards.add(new DraftCube.CardIdentity("Deep Analysis",""));
+ cubeCards.add(new DraftCube.CardIdentity("Delver of Secrets",""));
+ cubeCards.add(new DraftCube.CardIdentity("Demonic Pact",""));
+ cubeCards.add(new DraftCube.CardIdentity("Den Protector",""));
+ cubeCards.add(new DraftCube.CardIdentity("Deranged Hermit",""));
+ cubeCards.add(new DraftCube.CardIdentity("Desecration Demon",""));
+ cubeCards.add(new DraftCube.CardIdentity("Devil's Play",""));
+ cubeCards.add(new DraftCube.CardIdentity("Diabolic Servitude",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dictate of Heliod",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dig Through Time",""));
+ cubeCards.add(new DraftCube.CardIdentity("Disciple of Bolas",""));
+ cubeCards.add(new DraftCube.CardIdentity("Disfigure",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dismember",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dismiss",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dissipate",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dissolve",""));
+ cubeCards.add(new DraftCube.CardIdentity("Divinity of Pride",""));
+ cubeCards.add(new DraftCube.CardIdentity("Domri Rade",""));
+ cubeCards.add(new DraftCube.CardIdentity("Doom Blade",""));
+ cubeCards.add(new DraftCube.CardIdentity("Doomed Necromancer",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dragon Fodder",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dragonlord Atarka",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dragonlord Dromoka",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dragonlord Ojutai",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dragonlord Silumgar",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dragonskull Summit",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dread Return",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dreadbore",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dromoka's Command",""));
+ cubeCards.add(new DraftCube.CardIdentity("Drowned Catacomb",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dualcaster Mage",""));
+ cubeCards.add(new DraftCube.CardIdentity("Dungeon Geists",""));
+ cubeCards.add(new DraftCube.CardIdentity("Duplicant",""));
+ cubeCards.add(new DraftCube.CardIdentity("Duress",""));
+ cubeCards.add(new DraftCube.CardIdentity("Edric, Spymaster of Trest",""));
+ cubeCards.add(new DraftCube.CardIdentity("Eight-and-a-Half-Tails",""));
+ cubeCards.add(new DraftCube.CardIdentity("Electrolyze",""));
+ cubeCards.add(new DraftCube.CardIdentity("Elesh Norn, Grand Cenobite",""));
+ cubeCards.add(new DraftCube.CardIdentity("Elite Vanguard",""));
+ cubeCards.add(new DraftCube.CardIdentity("Elixir of Immortality",""));
+ cubeCards.add(new DraftCube.CardIdentity("Elspeth Tirel",""));
+ cubeCards.add(new DraftCube.CardIdentity("Elspeth, Knight-Errant",""));
+ cubeCards.add(new DraftCube.CardIdentity("Elspeth, Sun's Champion",""));
+ cubeCards.add(new DraftCube.CardIdentity("Elves of Deep Shadow",""));
+ cubeCards.add(new DraftCube.CardIdentity("Elvish Mystic",""));
+ cubeCards.add(new DraftCube.CardIdentity("Emeria Angel",""));
+ cubeCards.add(new DraftCube.CardIdentity("Emrakul, the Aeons Torn",""));
+ cubeCards.add(new DraftCube.CardIdentity("Entomb",""));
+ cubeCards.add(new DraftCube.CardIdentity("Entreat the Angels",""));
+ cubeCards.add(new DraftCube.CardIdentity("Erebos, God of the Dead",""));
+ cubeCards.add(new DraftCube.CardIdentity("Erebos's Titan",""));
+ cubeCards.add(new DraftCube.CardIdentity("Essence Scatter",""));
+ cubeCards.add(new DraftCube.CardIdentity("Eternal Dragon",""));
+ cubeCards.add(new DraftCube.CardIdentity("Eternal Witness",""));
+ cubeCards.add(new DraftCube.CardIdentity("Eureka",""));
+ cubeCards.add(new DraftCube.CardIdentity("Everflowing Chalice",""));
+ cubeCards.add(new DraftCube.CardIdentity("Exalted Angel",""));
+ cubeCards.add(new DraftCube.CardIdentity("Exhume",""));
+ cubeCards.add(new DraftCube.CardIdentity("Explore",""));
+ cubeCards.add(new DraftCube.CardIdentity("Exquisite Firecraft",""));
+ cubeCards.add(new DraftCube.CardIdentity("Fact or Fiction",""));
+ cubeCards.add(new DraftCube.CardIdentity("Faith's Fetters",""));
+ cubeCards.add(new DraftCube.CardIdentity("Falkenrath Aristocrat",""));
+ cubeCards.add(new DraftCube.CardIdentity("Farseek",""));
+ cubeCards.add(new DraftCube.CardIdentity("Fauna Shaman",""));
+ cubeCards.add(new DraftCube.CardIdentity("Fertile Ground",""));
+ cubeCards.add(new DraftCube.CardIdentity("Fiend Hunter",""));
+ cubeCards.add(new DraftCube.CardIdentity("Fire // Ice",""));
+ cubeCards.add(new DraftCube.CardIdentity("Firebolt",""));
+ cubeCards.add(new DraftCube.CardIdentity("Firefist Striker",""));
+ cubeCards.add(new DraftCube.CardIdentity("Flame Slash",""));
+ cubeCards.add(new DraftCube.CardIdentity("Flametongue Kavu",""));
+ cubeCards.add(new DraftCube.CardIdentity("Flamewake Phoenix",""));
+ cubeCards.add(new DraftCube.CardIdentity("Fleecemane Lion",""));
+ cubeCards.add(new DraftCube.CardIdentity("Flickerwisp",""));
+ cubeCards.add(new DraftCube.CardIdentity("Flooded Strand",""));
+ cubeCards.add(new DraftCube.CardIdentity("Forbid",""));
+ cubeCards.add(new DraftCube.CardIdentity("Forbidden Alchemy",""));
+ cubeCards.add(new DraftCube.CardIdentity("Force of Will",""));
+ cubeCards.add(new DraftCube.CardIdentity("Force Spike",""));
+ cubeCards.add(new DraftCube.CardIdentity("Forked Bolt",""));
+ cubeCards.add(new DraftCube.CardIdentity("Frenzied Goblin",""));
+ cubeCards.add(new DraftCube.CardIdentity("Freyalise, Llanowar's Fury",""));
+ cubeCards.add(new DraftCube.CardIdentity("Frontline Medic",""));
+ cubeCards.add(new DraftCube.CardIdentity("Frost Titan",""));
+ cubeCards.add(new DraftCube.CardIdentity("Future Sight",""));
+ cubeCards.add(new DraftCube.CardIdentity("Fyndhorn Elves",""));
+ cubeCards.add(new DraftCube.CardIdentity("Gaea's Cradle",""));
+ cubeCards.add(new DraftCube.CardIdentity("Garruk Relentless",""));
+ cubeCards.add(new DraftCube.CardIdentity("Garruk Wildspeaker",""));
+ cubeCards.add(new DraftCube.CardIdentity("Garruk, Apex Predator",""));
+ cubeCards.add(new DraftCube.CardIdentity("Garruk, Caller of Beasts",""));
+ cubeCards.add(new DraftCube.CardIdentity("Garruk, Primal Hunter",""));
+ cubeCards.add(new DraftCube.CardIdentity("Gatekeeper of Malakir",""));
+ cubeCards.add(new DraftCube.CardIdentity("Gather the Townsfolk",""));
+ cubeCards.add(new DraftCube.CardIdentity("Geist of Saint Traft",""));
+ cubeCards.add(new DraftCube.CardIdentity("Genesis Wave",""));
+ cubeCards.add(new DraftCube.CardIdentity("Geralf's Messenger",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ghor-Clan Rampager",""));
+ cubeCards.add(new DraftCube.CardIdentity("Gideon Jura",""));
+ cubeCards.add(new DraftCube.CardIdentity("Gifts Ungiven",""));
+ cubeCards.add(new DraftCube.CardIdentity("Gilded Lotus",""));
+ cubeCards.add(new DraftCube.CardIdentity("Gilt-Leaf Winnower",""));
+ cubeCards.add(new DraftCube.CardIdentity("Gitaxian Probe",""));
+ cubeCards.add(new DraftCube.CardIdentity("Glacial Fortress",""));
+ cubeCards.add(new DraftCube.CardIdentity("Glen Elendra Archmage",""));
+ cubeCards.add(new DraftCube.CardIdentity("Glorious Anthem",""));
+ cubeCards.add(new DraftCube.CardIdentity("Go for the Throat",""));
+ cubeCards.add(new DraftCube.CardIdentity("Goblin Bushwhacker",""));
+ cubeCards.add(new DraftCube.CardIdentity("Goblin Glory Chaser",""));
+ cubeCards.add(new DraftCube.CardIdentity("Goblin Guide",""));
+ cubeCards.add(new DraftCube.CardIdentity("Goblin Rabblemaster",""));
+ cubeCards.add(new DraftCube.CardIdentity("Godless Shrine",""));
+ cubeCards.add(new DraftCube.CardIdentity("Gore-House Chainwalker",""));
+ cubeCards.add(new DraftCube.CardIdentity("Grafted Wargear",""));
+ cubeCards.add(new DraftCube.CardIdentity("Grave Titan",""));
+ cubeCards.add(new DraftCube.CardIdentity("Gravecrawler",""));
+ cubeCards.add(new DraftCube.CardIdentity("Gray Merchant of Asphodel",""));
+ cubeCards.add(new DraftCube.CardIdentity("Greater Gargadon",""));
+ cubeCards.add(new DraftCube.CardIdentity("Green Sun's Zenith",""));
+ cubeCards.add(new DraftCube.CardIdentity("Grim Lavamancer",""));
+ cubeCards.add(new DraftCube.CardIdentity("Griselbrand",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hall of Triumph",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hallowed Fountain",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hallowed Spiritkeeper",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hammer of Purphoros",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hangarback Walker",""));
+ cubeCards.add(new DraftCube.CardIdentity("Harbinger of the Tides",""));
+ cubeCards.add(new DraftCube.CardIdentity("Harmonize",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hellrider",""));
+ cubeCards.add(new DraftCube.CardIdentity("Herald of Torment",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hero of Bladehold",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hero's Downfall",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hidden Dragonslayer",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hinterland Harbor",""));
+ cubeCards.add(new DraftCube.CardIdentity("Honor of the Pure",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hordeling Outburst",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hornet Queen",""));
+ cubeCards.add(new DraftCube.CardIdentity("Huntmaster of the Fells",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hymn to Tourach",""));
+ cubeCards.add(new DraftCube.CardIdentity("Hypnotic Specter",""));
+ cubeCards.add(new DraftCube.CardIdentity("Imperial Recruiter",""));
+ cubeCards.add(new DraftCube.CardIdentity("Impulse",""));
+ cubeCards.add(new DraftCube.CardIdentity("Incinerate",""));
+ cubeCards.add(new DraftCube.CardIdentity("Indrik Stomphowler",""));
+ cubeCards.add(new DraftCube.CardIdentity("Inferno Titan",""));
+ cubeCards.add(new DraftCube.CardIdentity("Inquisition of Kozilek",""));
+ cubeCards.add(new DraftCube.CardIdentity("Into the Roil",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ire Shaman",""));
+ cubeCards.add(new DraftCube.CardIdentity("Isamaru, Hound of Konda",""));
+ cubeCards.add(new DraftCube.CardIdentity("Isochron Scepter",""));
+ cubeCards.add(new DraftCube.CardIdentity("Isolated Chapel",""));
+ cubeCards.add(new DraftCube.CardIdentity("Izzet Charm",""));
+ cubeCards.add(new DraftCube.CardIdentity("Jace Beleren",""));
+ cubeCards.add(new DraftCube.CardIdentity("Jace, Architect of Thought",""));
+ cubeCards.add(new DraftCube.CardIdentity("Jace, the Mind Sculptor",""));
+ cubeCards.add(new DraftCube.CardIdentity("Jace, Vryn's Prodigy",""));
+ cubeCards.add(new DraftCube.CardIdentity("Jackal Pup",""));
+ cubeCards.add(new DraftCube.CardIdentity("Joraga Treespeaker",""));
+ cubeCards.add(new DraftCube.CardIdentity("Journey to Nowhere",""));
+ cubeCards.add(new DraftCube.CardIdentity("Kami of Ancient Law",""));
+ cubeCards.add(new DraftCube.CardIdentity("Karmic Guide",""));
+ cubeCards.add(new DraftCube.CardIdentity("Karn Liberated",""));
+ cubeCards.add(new DraftCube.CardIdentity("Karplusan Forest",""));
+ cubeCards.add(new DraftCube.CardIdentity("Keiga, the Tide Star",""));
+ cubeCards.add(new DraftCube.CardIdentity("Keranos, God of Storms",""));
+ cubeCards.add(new DraftCube.CardIdentity("Kiki-Jiki, Mirror Breaker",""));
+ cubeCards.add(new DraftCube.CardIdentity("Kiln Fiend",""));
+ cubeCards.add(new DraftCube.CardIdentity("Kiora, the Crashing Wave",""));
+ cubeCards.add(new DraftCube.CardIdentity("Kiora's Follower",""));
+ cubeCards.add(new DraftCube.CardIdentity("Kira, Great Glass-Spinner",""));
+ cubeCards.add(new DraftCube.CardIdentity("Kitchen Finks",""));
+ cubeCards.add(new DraftCube.CardIdentity("Kodama's Reach",""));
+ cubeCards.add(new DraftCube.CardIdentity("Kokusho, the Evening Star",""));
+ cubeCards.add(new DraftCube.CardIdentity("Kor Skyfisher",""));
+ cubeCards.add(new DraftCube.CardIdentity("Koth of the Hammer",""));
+ cubeCards.add(new DraftCube.CardIdentity("Kozilek, Butcher of Truth",""));
+ cubeCards.add(new DraftCube.CardIdentity("Krenko's Command",""));
+ cubeCards.add(new DraftCube.CardIdentity("Kytheon, Hero of Akros",""));
+ cubeCards.add(new DraftCube.CardIdentity("Land Tax",""));
+ cubeCards.add(new DraftCube.CardIdentity("Legacy's Allure",""));
+ cubeCards.add(new DraftCube.CardIdentity("Leonin Relic-Warder",""));
+ cubeCards.add(new DraftCube.CardIdentity("Lightning Bolt",""));
+ cubeCards.add(new DraftCube.CardIdentity("Lightning Greaves",""));
+ cubeCards.add(new DraftCube.CardIdentity("Lightning Helix",""));
+ cubeCards.add(new DraftCube.CardIdentity("Lightning Mauler",""));
+ cubeCards.add(new DraftCube.CardIdentity("Lightning Strike",""));
+ cubeCards.add(new DraftCube.CardIdentity("Liliana of the Veil",""));
+ cubeCards.add(new DraftCube.CardIdentity("Liliana Vess",""));
+ cubeCards.add(new DraftCube.CardIdentity("Liliana, Heretical Healer",""));
+ cubeCards.add(new DraftCube.CardIdentity("Lingering Souls",""));
+ cubeCards.add(new DraftCube.CardIdentity("Linvala, Keeper of Silence",""));
+ cubeCards.add(new DraftCube.CardIdentity("Living Death",""));
+ cubeCards.add(new DraftCube.CardIdentity("Llanowar Elves",""));
+ cubeCards.add(new DraftCube.CardIdentity("Llanowar Mentor",""));
+ cubeCards.add(new DraftCube.CardIdentity("Llanowar Wastes",""));
+ cubeCards.add(new DraftCube.CardIdentity("Looter il-Kor",""));
+ cubeCards.add(new DraftCube.CardIdentity("Lotleth Troll",""));
+ cubeCards.add(new DraftCube.CardIdentity("Lotus Cobra",""));
+ cubeCards.add(new DraftCube.CardIdentity("Loxodon Warhammer",""));
+ cubeCards.add(new DraftCube.CardIdentity("Maelstrom Pulse",""));
+ cubeCards.add(new DraftCube.CardIdentity("Magma Jet",""));
+ cubeCards.add(new DraftCube.CardIdentity("Makeshift Mannequin",""));
+ cubeCards.add(new DraftCube.CardIdentity("Malicious Affliction",""));
+ cubeCards.add(new DraftCube.CardIdentity("Man-o'-War",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mana Confluence",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mana Leak",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mana Tithe",""));
+ cubeCards.add(new DraftCube.CardIdentity("Managorger Hydra",""));
+ cubeCards.add(new DraftCube.CardIdentity("Manic Vandal",""));
+ cubeCards.add(new DraftCube.CardIdentity("Marsh Flats",""));
+ cubeCards.add(new DraftCube.CardIdentity("Martial Coup",""));
+ cubeCards.add(new DraftCube.CardIdentity("Massacre Wurm",""));
+ cubeCards.add(new DraftCube.CardIdentity("Master of the Wild Hunt",""));
+ cubeCards.add(new DraftCube.CardIdentity("Master of Waves",""));
+ cubeCards.add(new DraftCube.CardIdentity("Meloku the Clouded Mirror",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mentor of the Meek",""));
+ cubeCards.add(new DraftCube.CardIdentity("Merfolk Looter",""));
+ cubeCards.add(new DraftCube.CardIdentity("Midnight Banshee",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mind Stone",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mirari's Wake",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mirran Crusader",""));
+ cubeCards.add(new DraftCube.CardIdentity("Miscalculation",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mishra's Factory",""));
+ cubeCards.add(new DraftCube.CardIdentity("Misty Rainforest",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mizzium Mortars",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mogg Fanatic",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mogg War Marshal",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mogis's Marauder",""));
+ cubeCards.add(new DraftCube.CardIdentity("Monastery Mentor",""));
+ cubeCards.add(new DraftCube.CardIdentity("Monastery Swiftspear",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mother of Runes",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mox Diamond",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mulldrifter",""));
+ cubeCards.add(new DraftCube.CardIdentity("Murderous Cut",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mutavault",""));
+ cubeCards.add(new DraftCube.CardIdentity("Myr Battlesphere",""));
+ cubeCards.add(new DraftCube.CardIdentity("Mystic Snake",""));
+ cubeCards.add(new DraftCube.CardIdentity("Natural Order",""));
+ cubeCards.add(new DraftCube.CardIdentity("Nature's Lore",""));
+ cubeCards.add(new DraftCube.CardIdentity("Necromancy",""));
+ cubeCards.add(new DraftCube.CardIdentity("Negate",""));
+ cubeCards.add(new DraftCube.CardIdentity("Nekrataal",""));
+ cubeCards.add(new DraftCube.CardIdentity("Nicol Bolas, Planeswalker",""));
+ cubeCards.add(new DraftCube.CardIdentity("Nightveil Specter",""));
+ cubeCards.add(new DraftCube.CardIdentity("Nissa, Vastwood Seer",""));
+ cubeCards.add(new DraftCube.CardIdentity("Nissa, Worldwaker",""));
+ cubeCards.add(new DraftCube.CardIdentity("Noble Hierarch",""));
+ cubeCards.add(new DraftCube.CardIdentity("Nykthos, Shrine to Nyx",""));
+ cubeCards.add(new DraftCube.CardIdentity("Oblivion Ring",""));
+ cubeCards.add(new DraftCube.CardIdentity("Obstinate Baloth",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ohran Viper",""));
+ cubeCards.add(new DraftCube.CardIdentity("Old Man of the Sea",""));
+ cubeCards.add(new DraftCube.CardIdentity("Olivia Voldaren",""));
+ cubeCards.add(new DraftCube.CardIdentity("Oona's Prowler",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ophiomancer",""));
+ cubeCards.add(new DraftCube.CardIdentity("Opposition",""));
+ cubeCards.add(new DraftCube.CardIdentity("Oracle of Mul Daya",""));
+ cubeCards.add(new DraftCube.CardIdentity("Oust",""));
+ cubeCards.add(new DraftCube.CardIdentity("Outpost Siege",""));
+ cubeCards.add(new DraftCube.CardIdentity("Overgrown Battlement",""));
+ cubeCards.add(new DraftCube.CardIdentity("Overgrown Tomb",""));
+ cubeCards.add(new DraftCube.CardIdentity("Overrun",""));
+ cubeCards.add(new DraftCube.CardIdentity("Pack Rat",""));
+ cubeCards.add(new DraftCube.CardIdentity("Pact of Negation",""));
+ cubeCards.add(new DraftCube.CardIdentity("Parallax Wave",""));
+ cubeCards.add(new DraftCube.CardIdentity("Path to Exile",""));
+ cubeCards.add(new DraftCube.CardIdentity("Pestermite",""));
+ cubeCards.add(new DraftCube.CardIdentity("Phantasmal Image",""));
+ cubeCards.add(new DraftCube.CardIdentity("Phyrexian Arena",""));
+ cubeCards.add(new DraftCube.CardIdentity("Phyrexian Metamorph",""));
+ cubeCards.add(new DraftCube.CardIdentity("Phyrexian Obliterator",""));
+ cubeCards.add(new DraftCube.CardIdentity("Phyrexian Revoker",""));
+ cubeCards.add(new DraftCube.CardIdentity("Pillar of Flame",""));
+ cubeCards.add(new DraftCube.CardIdentity("Plateau",""));
+ cubeCards.add(new DraftCube.CardIdentity("Polluted Delta",""));
+ cubeCards.add(new DraftCube.CardIdentity("Polukranos, World Eater",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ponder",""));
+ cubeCards.add(new DraftCube.CardIdentity("Porcelain Legionnaire",""));
+ cubeCards.add(new DraftCube.CardIdentity("Precinct Captain",""));
+ cubeCards.add(new DraftCube.CardIdentity("Precursor Golem",""));
+ cubeCards.add(new DraftCube.CardIdentity("Preordain",""));
+ cubeCards.add(new DraftCube.CardIdentity("Primal Command",""));
+ cubeCards.add(new DraftCube.CardIdentity("Primeval Titan",""));
+ cubeCards.add(new DraftCube.CardIdentity("Profane Command",""));
+ cubeCards.add(new DraftCube.CardIdentity("Progenitus",""));
+ cubeCards.add(new DraftCube.CardIdentity("Prophetic Bolt",""));
+ cubeCards.add(new DraftCube.CardIdentity("Prophetic Flamespeaker",""));
+ cubeCards.add(new DraftCube.CardIdentity("Psychatog",""));
+ cubeCards.add(new DraftCube.CardIdentity("Purphoros, God of the Forge",""));
+ cubeCards.add(new DraftCube.CardIdentity("Qasali Pridemage",""));
+ cubeCards.add(new DraftCube.CardIdentity("Raise the Alarm",""));
+ cubeCards.add(new DraftCube.CardIdentity("Rakdos's Return",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ral Zarek",""));
+ cubeCards.add(new DraftCube.CardIdentity("Rampaging Baloths",""));
+ cubeCards.add(new DraftCube.CardIdentity("Rampant Growth",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ranger of Eos",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ratchet Bomb",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ravages of War",""));
+ cubeCards.add(new DraftCube.CardIdentity("Read the Bones",""));
+ cubeCards.add(new DraftCube.CardIdentity("Reanimate",""));
+ cubeCards.add(new DraftCube.CardIdentity("Reclamation Sage",""));
+ cubeCards.add(new DraftCube.CardIdentity("Recurring Nightmare",""));
+ cubeCards.add(new DraftCube.CardIdentity("Reflecting Pool",""));
+ cubeCards.add(new DraftCube.CardIdentity("Regrowth",""));
+ cubeCards.add(new DraftCube.CardIdentity("Remand",""));
+ cubeCards.add(new DraftCube.CardIdentity("Remove Soul",""));
+ cubeCards.add(new DraftCube.CardIdentity("Repeal",""));
+ cubeCards.add(new DraftCube.CardIdentity("Restoration Angel",""));
+ cubeCards.add(new DraftCube.CardIdentity("Reveillark",""));
+ cubeCards.add(new DraftCube.CardIdentity("Rift Bolt",""));
+ cubeCards.add(new DraftCube.CardIdentity("Riftwing Cloudskate",""));
+ cubeCards.add(new DraftCube.CardIdentity("Rishadan Port",""));
+ cubeCards.add(new DraftCube.CardIdentity("Roast",""));
+ cubeCards.add(new DraftCube.CardIdentity("Rofellos, Llanowar Emissary",""));
+ cubeCards.add(new DraftCube.CardIdentity("Rootbound Crag",""));
+ cubeCards.add(new DraftCube.CardIdentity("Rotting Rats",""));
+ cubeCards.add(new DraftCube.CardIdentity("Rune-Scarred Demon",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sacred Foundry",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sakura-Tribe Elder",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sarkhan, the Dragonspeaker",""));
+ cubeCards.add(new DraftCube.CardIdentity("Savannah",""));
+ cubeCards.add(new DraftCube.CardIdentity("Scalding Tarn",""));
+ cubeCards.add(new DraftCube.CardIdentity("Scavenging Ooze",""));
+ cubeCards.add(new DraftCube.CardIdentity("Scrubland",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sea Gate Oracle",""));
+ cubeCards.add(new DraftCube.CardIdentity("Seal of Fire",""));
+ cubeCards.add(new DraftCube.CardIdentity("Search for Tomorrow",""));
+ cubeCards.add(new DraftCube.CardIdentity("Searing Spear",""));
+ cubeCards.add(new DraftCube.CardIdentity("Secure the Wastes",""));
+ cubeCards.add(new DraftCube.CardIdentity("Seeker of the Way",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sensei's Divining Top",""));
+ cubeCards.add(new DraftCube.CardIdentity("Serendib Efreet",""));
+ cubeCards.add(new DraftCube.CardIdentity("Serum Visions",""));
+ cubeCards.add(new DraftCube.CardIdentity("Shadowmage Infiltrator",""));
+ cubeCards.add(new DraftCube.CardIdentity("Shallow Grave",""));
+ cubeCards.add(new DraftCube.CardIdentity("Shardless Agent",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sheoldred, Whispering One",""));
+ cubeCards.add(new DraftCube.CardIdentity("Shivan Reef",""));
+ cubeCards.add(new DraftCube.CardIdentity("Show and Tell",""));
+ cubeCards.add(new DraftCube.CardIdentity("Shriekmaw",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sidisi, Undead Vizier",""));
+ cubeCards.add(new DraftCube.CardIdentity("Siege-Gang Commander",""));
+ cubeCards.add(new DraftCube.CardIdentity("Silverblade Paladin",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sin Collector",""));
+ cubeCards.add(new DraftCube.CardIdentity("Skinrender",""));
+ cubeCards.add(new DraftCube.CardIdentity("Skullcrack",""));
+ cubeCards.add(new DraftCube.CardIdentity("Slagstorm",""));
+ cubeCards.add(new DraftCube.CardIdentity("Slaughter Pact",""));
+ cubeCards.add(new DraftCube.CardIdentity("Snapcaster Mage",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sneak Attack",""));
+ cubeCards.add(new DraftCube.CardIdentity("Soldier of the Pantheon",""));
+ cubeCards.add(new DraftCube.CardIdentity("Solemn Simulacrum",""));
+ cubeCards.add(new DraftCube.CardIdentity("Song of the Dryads",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sorin Markov",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sorin, Solemn Visitor",""));
+ cubeCards.add(new DraftCube.CardIdentity("Soulfire Grand Master",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sower of Temptation",""));
+ cubeCards.add(new DraftCube.CardIdentity("Spear of Heliod",""));
+ cubeCards.add(new DraftCube.CardIdentity("Spectral Procession",""));
+ cubeCards.add(new DraftCube.CardIdentity("Spellskite",""));
+ cubeCards.add(new DraftCube.CardIdentity("Spell Pierce",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sphere of the Suns",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sphinx's Revelation",""));
+ cubeCards.add(new DraftCube.CardIdentity("Spikeshot Elder",""));
+ cubeCards.add(new DraftCube.CardIdentity("Splinter Twin",""));
+ cubeCards.add(new DraftCube.CardIdentity("Staggershock",""));
+ cubeCards.add(new DraftCube.CardIdentity("Steam Vents",""));
+ cubeCards.add(new DraftCube.CardIdentity("Stoke the Flames",""));
+ cubeCards.add(new DraftCube.CardIdentity("Stomping Ground",""));
+ cubeCards.add(new DraftCube.CardIdentity("Stormbreath Dragon",""));
+ cubeCards.add(new DraftCube.CardIdentity("Stormtide Leviathan",""));
+ cubeCards.add(new DraftCube.CardIdentity("Stratus Dancer",""));
+ cubeCards.add(new DraftCube.CardIdentity("Stroke of Genius",""));
+ cubeCards.add(new DraftCube.CardIdentity("Stromkirk Noble",""));
+ cubeCards.add(new DraftCube.CardIdentity("Student of Warfare",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sublime Archangel",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sulfur Falls",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sulfurous Springs",""));
+ cubeCards.add(new DraftCube.CardIdentity("Summoning Trap",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sun Titan",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sundering Titan",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sunpetal Grove",""));
+ cubeCards.add(new DraftCube.CardIdentity("Supreme Verdict",""));
+ cubeCards.add(new DraftCube.CardIdentity("Surrak, the Hunt Caller",""));
+ cubeCards.add(new DraftCube.CardIdentity("Swords to Plowshares",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sylvan Caryatid",""));
+ cubeCards.add(new DraftCube.CardIdentity("Sylvan Library",""));
+ cubeCards.add(new DraftCube.CardIdentity("Taiga",""));
+ cubeCards.add(new DraftCube.CardIdentity("Talrand, Sky Summoner",""));
+ cubeCards.add(new DraftCube.CardIdentity("Tamiyo, the Moon Sage",""));
+ cubeCards.add(new DraftCube.CardIdentity("Tangle Wire",""));
+ cubeCards.add(new DraftCube.CardIdentity("Tarmogoyf",""));
+ cubeCards.add(new DraftCube.CardIdentity("Tasigur, the Golden Fang",""));
+ cubeCards.add(new DraftCube.CardIdentity("Tectonic Edge",""));
+ cubeCards.add(new DraftCube.CardIdentity("Teferi, Mage of Zhalfir",""));
+ cubeCards.add(new DraftCube.CardIdentity("Temple Garden",""));
+ cubeCards.add(new DraftCube.CardIdentity("Temple of Abandon",""));
+ cubeCards.add(new DraftCube.CardIdentity("Temple of Deceit",""));
+ cubeCards.add(new DraftCube.CardIdentity("Temple of Enlightenment",""));
+ cubeCards.add(new DraftCube.CardIdentity("Temple of Epiphany",""));
+ cubeCards.add(new DraftCube.CardIdentity("Temple of Malady",""));
+ cubeCards.add(new DraftCube.CardIdentity("Temple of Malice",""));
+ cubeCards.add(new DraftCube.CardIdentity("Temple of Mystery",""));
+ cubeCards.add(new DraftCube.CardIdentity("Temple of Plenty",""));
+ cubeCards.add(new DraftCube.CardIdentity("Temple of Silence",""));
+ cubeCards.add(new DraftCube.CardIdentity("Temple of Triumph",""));
+ cubeCards.add(new DraftCube.CardIdentity("Tempt with Vengeance",""));
+ cubeCards.add(new DraftCube.CardIdentity("Terastodon",""));
+ cubeCards.add(new DraftCube.CardIdentity("Terminate",""));
+ cubeCards.add(new DraftCube.CardIdentity("Terminus",""));
+ cubeCards.add(new DraftCube.CardIdentity("Thalia, Guardian of Thraben",""));
+ cubeCards.add(new DraftCube.CardIdentity("Thassa, God of the Sea",""));
+ cubeCards.add(new DraftCube.CardIdentity("Thespian's Stage",""));
+ cubeCards.add(new DraftCube.CardIdentity("Thoughtseize",""));
+ cubeCards.add(new DraftCube.CardIdentity("Thragtusk",""));
+ cubeCards.add(new DraftCube.CardIdentity("Thran Dynamo",""));
+ cubeCards.add(new DraftCube.CardIdentity("Through the Breach",""));
+ cubeCards.add(new DraftCube.CardIdentity("Thrun, the Last Troll",""));
+ cubeCards.add(new DraftCube.CardIdentity("Thunderbreak Regent",""));
+ cubeCards.add(new DraftCube.CardIdentity("Thundermaw Hellkite",""));
+ cubeCards.add(new DraftCube.CardIdentity("Tidehollow Sculler",""));
+ cubeCards.add(new DraftCube.CardIdentity("Time Warp",""));
+ cubeCards.add(new DraftCube.CardIdentity("Tooth and Nail",""));
+ cubeCards.add(new DraftCube.CardIdentity("Toxic Deluge",""));
+ cubeCards.add(new DraftCube.CardIdentity("Treachery",""));
+ cubeCards.add(new DraftCube.CardIdentity("Tropical Island",""));
+ cubeCards.add(new DraftCube.CardIdentity("Trygon Predator",""));
+ cubeCards.add(new DraftCube.CardIdentity("Tundra",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ugin, the Spirit Dragon",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ulamog, the Infinite Gyre",""));
+ cubeCards.add(new DraftCube.CardIdentity("Ultimate Price",""));
+ cubeCards.add(new DraftCube.CardIdentity("Unburial Rites",""));
+ cubeCards.add(new DraftCube.CardIdentity("Underground River",""));
+ cubeCards.add(new DraftCube.CardIdentity("Underground Sea",""));
+ cubeCards.add(new DraftCube.CardIdentity("Underworld Connections",""));
+ cubeCards.add(new DraftCube.CardIdentity("Unexpectedly Absent",""));
+ cubeCards.add(new DraftCube.CardIdentity("Upheaval",""));
+ cubeCards.add(new DraftCube.CardIdentity("Utopia Sprawl",""));
+ cubeCards.add(new DraftCube.CardIdentity("Vampire Hexmage",""));
+ cubeCards.add(new DraftCube.CardIdentity("Vampire Nighthawk",""));
+ cubeCards.add(new DraftCube.CardIdentity("Vedalken Shackles",""));
+ cubeCards.add(new DraftCube.CardIdentity("Vendilion Clique",""));
+ cubeCards.add(new DraftCube.CardIdentity("Vengevine",""));
+ cubeCards.add(new DraftCube.CardIdentity("Venser, Shaper Savant",""));
+ cubeCards.add(new DraftCube.CardIdentity("Venser, the Sojourner",""));
+ cubeCards.add(new DraftCube.CardIdentity("Verdant Catacombs",""));
+ cubeCards.add(new DraftCube.CardIdentity("Vindicate",""));
+ cubeCards.add(new DraftCube.CardIdentity("Volcanic Island",""));
+ cubeCards.add(new DraftCube.CardIdentity("Volrath's Stronghold",""));
+ cubeCards.add(new DraftCube.CardIdentity("Voyaging Satyr",""));
+ cubeCards.add(new DraftCube.CardIdentity("Vraska the Unseen",""));
+ cubeCards.add(new DraftCube.CardIdentity("Wake Thrasher",""));
+ cubeCards.add(new DraftCube.CardIdentity("Wall of Blossoms",""));
+ cubeCards.add(new DraftCube.CardIdentity("Wall of Omens",""));
+ cubeCards.add(new DraftCube.CardIdentity("Wall of Roots",""));
+ cubeCards.add(new DraftCube.CardIdentity("Warleader's Helix",""));
+ cubeCards.add(new DraftCube.CardIdentity("Waterfront Bouncer",""));
+ cubeCards.add(new DraftCube.CardIdentity("Watery Grave",""));
+ cubeCards.add(new DraftCube.CardIdentity("Whip of Erebos",""));
+ cubeCards.add(new DraftCube.CardIdentity("Whisperwood Elemental",""));
+ cubeCards.add(new DraftCube.CardIdentity("Wild Mongrel",""));
+ cubeCards.add(new DraftCube.CardIdentity("Windbrisk Heights",""));
+ cubeCards.add(new DraftCube.CardIdentity("Windswept Heath",""));
+ cubeCards.add(new DraftCube.CardIdentity("Winter Orb",""));
+ cubeCards.add(new DraftCube.CardIdentity("Wolfir Silverheart",""));
+ cubeCards.add(new DraftCube.CardIdentity("Wood Elves",""));
+ cubeCards.add(new DraftCube.CardIdentity("Wooded Foothills",""));
+ cubeCards.add(new DraftCube.CardIdentity("Woodfall Primus",""));
+ cubeCards.add(new DraftCube.CardIdentity("Woodland Bellower",""));
+ cubeCards.add(new DraftCube.CardIdentity("Woodland Cemetery",""));
+ cubeCards.add(new DraftCube.CardIdentity("Worn Powerstone",""));
+ cubeCards.add(new DraftCube.CardIdentity("Wrath of God",""));
+ cubeCards.add(new DraftCube.CardIdentity("Wurmcoil Engine",""));
+ cubeCards.add(new DraftCube.CardIdentity("Xenagos, the Reveler",""));
+ cubeCards.add(new DraftCube.CardIdentity("Yavimaya Coast",""));
+ cubeCards.add(new DraftCube.CardIdentity("Yavimaya Elder",""));
+ cubeCards.add(new DraftCube.CardIdentity("Yosei, the Morning Star",""));
+ cubeCards.add(new DraftCube.CardIdentity("Young Pyromancer",""));
+ cubeCards.add(new DraftCube.CardIdentity("Zealous Conscripts",""));
+ }
+}
diff --git a/Mage.Server.Plugins/Mage.Tournament.Constructed/pom.xml b/Mage.Server.Plugins/Mage.Tournament.Constructed/pom.xml
index 884159dba8a..df970bfe867 100644
--- a/Mage.Server.Plugins/Mage.Tournament.Constructed/pom.xml
+++ b/Mage.Server.Plugins/Mage.Tournament.Constructed/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-tournament-constructed
diff --git a/Mage.Server.Plugins/Mage.Tournament.Sealed/pom.xml b/Mage.Server.Plugins/Mage.Tournament.Sealed/pom.xml
index 30abbd2009c..94f10534af6 100644
--- a/Mage.Server.Plugins/Mage.Tournament.Sealed/pom.xml
+++ b/Mage.Server.Plugins/Mage.Tournament.Sealed/pom.xml
@@ -7,7 +7,7 @@
org.magemage-server-plugins
- 1.4.3
+ 1.4.5mage-tournament-sealed
diff --git a/Mage.Server.Plugins/pom.xml b/Mage.Server.Plugins/pom.xml
index 49073190dca..2ba6c35a8ac 100644
--- a/Mage.Server.Plugins/pom.xml
+++ b/Mage.Server.Plugins/pom.xml
@@ -6,7 +6,7 @@
org.magemage-root
- 1.4.3
+ 1.4.5mage-server-plugins
@@ -17,9 +17,10 @@
Mage.Deck.ConstructedMage.Deck.Limited
- Mage.Game.CommanderDuel
+ Mage.Game.CommanderDuelMage.Game.CommanderFreeForAllMage.Game.FreeForAll
+ Mage.Game.MomirDuelMage.Game.TinyLeadersDuelMage.Game.TwoPlayerDuelMage.Player.AI
diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml
index 41ae2e3bfff..f043debc6a5 100644
--- a/Mage.Server/config/config.xml
+++ b/Mage.Server/config/config.xml
@@ -49,6 +49,7 @@
+
@@ -65,16 +66,20 @@
+
+
-
+
+
+
@@ -82,14 +87,16 @@
-
+
-
-
+
+
+
+
diff --git a/Mage.Server/pom.xml b/Mage.Server/pom.xml
index a3b4db6ffdf..60418e808d1 100644
--- a/Mage.Server/pom.xml
+++ b/Mage.Server/pom.xml
@@ -6,7 +6,7 @@
org.magemage-root
- 1.4.3
+ 1.4.5mage-server
@@ -142,6 +142,12 @@
${project.version}runtime
+
+ ${project.groupId}
+ mage-game-momirduel
+ ${project.version}
+ runtime
+
diff --git a/Mage.Server/release/config/config.xml b/Mage.Server/release/config/config.xml
index a7e5eaa0a4d..b4d0356c3fc 100644
--- a/Mage.Server/release/config/config.xml
+++ b/Mage.Server/release/config/config.xml
@@ -28,6 +28,7 @@
+
@@ -44,16 +45,20 @@
+
+
-
+
+
+
@@ -61,14 +66,16 @@
-
+
-
-
+
+
+
+
diff --git a/Mage.Server/src/main/java/mage/server/Main.java b/Mage.Server/src/main/java/mage/server/Main.java
index d9f8aec6c2b..7e83044274d 100644
--- a/Mage.Server/src/main/java/mage/server/Main.java
+++ b/Mage.Server/src/main/java/mage/server/Main.java
@@ -166,12 +166,9 @@ public class Main {
else {
logger.fatal("Unable to start MAGE server - another server is already started");
}
- } catch (IOException ex) {
- logger.fatal("Failed to start server - " + connection.toString(), ex);
} catch (Exception ex) {
logger.fatal("Failed to start server - " + connection.toString(), ex);
}
-
}
static void initStatistics() {
diff --git a/Mage.Server/src/main/java/mage/server/Session.java b/Mage.Server/src/main/java/mage/server/Session.java
index c705ffd740a..9a03b6e0e0f 100644
--- a/Mage.Server/src/main/java/mage/server/Session.java
+++ b/Mage.Server/src/main/java/mage/server/Session.java
@@ -36,6 +36,7 @@ import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import mage.MageException;
+import mage.constants.Constants;
import mage.interfaces.callback.ClientCallback;
import mage.players.net.UserData;
import mage.players.net.UserGroup;
@@ -91,15 +92,15 @@ public class Session {
return "User name Admin already in use";
}
if (userName.length() > ConfigSettings.getInstance().getMaxUserNameLength()) {
- return new StringBuilder("User name may not be longer than ").append(ConfigSettings.getInstance().getMaxUserNameLength()).append(" characters").toString();
+ return "User name may not be longer than " + ConfigSettings.getInstance().getMaxUserNameLength() + " characters";
}
if (userName.length() < ConfigSettings.getInstance().getMinUserNameLength()) {
- return new StringBuilder("User name may not be shorter than ").append(ConfigSettings.getInstance().getMinUserNameLength()).append(" characters").toString();
+ return "User name may not be shorter than " + ConfigSettings.getInstance().getMinUserNameLength() + " characters";
}
Pattern p = Pattern.compile(ConfigSettings.getInstance().getUserNamePattern(), Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(userName);
if (m.find()) {
- return new StringBuilder("User name '").append(userName).append("' includes not allowed characters: use a-z, A-Z and 0-9").toString();
+ return "User name '" + userName + "' includes not allowed characters: use a-z, A-Z and 0-9";
}
User user = UserManager.getInstance().createUser(userName, host);
boolean reconnect = false;
@@ -117,11 +118,11 @@ public class Session {
SessionManager.getInstance().disconnect(user.getSessionId(), DisconnectReason.ConnectingOtherInstance);
}
} else {
- return new StringBuilder("User name ").append(userName).append(" already in use (or your IP address changed)").toString();
+ return "User name " + userName + " already in use (or your IP address changed)";
}
}
if (!UserManager.getInstance().connectToSession(sessionId, user.getId())) {
- return new StringBuilder("Error connecting ").append(userName).toString();
+ return "Error connecting " + userName;
}
this.userId = user.getId();
if (reconnect) { // must be connected to receive the message
@@ -157,7 +158,11 @@ public class Session {
} else {
user.getUserData().update(userData);
}
- if (user.getUserData().getAvatarId() == 51) {
+ if (user.getUserData().getAvatarId() < Constants.MIN_AVATAR_ID
+ || user.getUserData().getAvatarId() > Constants.MAX_AVATAR_ID) {
+ user.getUserData().setAvatarId(Constants.DEFAULT_AVATAR_ID);
+ }
+ if (user.getUserData().getAvatarId() == 11) {
user.getUserData().setAvatarId(updateAvatar(user.getName()));
}
return true;
@@ -169,22 +174,16 @@ public class Session {
//TODO: move to separate class
//TODO: add for checking for private key
switch (userName) {
- case "nantuko":
- return 1000;
case "North":
return 1006;
case "BetaSteward":
return 1008;
- case "loki":
- return 1012;
- case "Ayrat":
- return 1018;
case "Bandit":
return 1020;
- case "Wehk":
- return 66;
+ case "fireshoes":
+ return 1021;
}
- return 51;
+ return 11;
}
public String getId() {
diff --git a/Mage.Server/src/main/java/mage/server/game/GameController.java b/Mage.Server/src/main/java/mage/server/game/GameController.java
index 30fbe4fcd17..07a5763a51a 100644
--- a/Mage.Server/src/main/java/mage/server/game/GameController.java
+++ b/Mage.Server/src/main/java/mage/server/game/GameController.java
@@ -228,7 +228,7 @@ public class GameController implements GameCallback {
try {
switch (event.getQueryType()) {
case ASK:
- ask(event.getPlayerId(), event.getMessage());
+ ask(event.getPlayerId(), event.getMessage(), event.getOptions());
break;
case PICK_TARGET:
target(event.getPlayerId(), event.getMessage(), event.getCards(), event.getPerms(), event.getTargets(), event.isRequired(), event.getOptions());
@@ -582,7 +582,7 @@ public class GameController implements GameCallback {
}
break;
default:
- game.sendPlayerAction(playerAction, getPlayerId(userId));
+ game.sendPlayerAction(playerAction, getPlayerId(userId), data);
}
}
@@ -774,11 +774,11 @@ public class GameController implements GameCallback {
// TODO: inform watchers about game end and who won
}
- private synchronized void ask(UUID playerId, final String question) throws MageException {
+ private synchronized void ask(UUID playerId, final String question, final Map options) throws MageException {
perform(playerId, new Command() {
@Override
public void execute(UUID playerId) {
- getGameSession(playerId).ask(question);
+ getGameSession(playerId).ask(question, options);
}
});
@@ -825,8 +825,11 @@ public class GameController implements GameCallback {
@Override
public void execute(UUID playerId) {
if (cards != null) {
- Zone targetZone = (Zone) options.get("targetZone");
- boolean showFaceDown = targetZone != null && targetZone.equals(Zone.PICK);
+ // Zone targetZone = (Zone) options.get("targetZone");
+ // Are there really situations where a player selects from a list of face down cards?
+ // So always show face up for selection
+ // boolean showFaceDown = targetZone != null && targetZone.equals(Zone.PICK);
+ boolean showFaceDown = true;
getGameSession(playerId).target(question, new CardsView(game, cards.getCards(game), showFaceDown), targets, required, options);
} else if (perms != null) {
CardsView permsView = new CardsView();
@@ -846,7 +849,8 @@ public class GameController implements GameCallback {
perform(playerId, new Command() {
@Override
public void execute(UUID playerId) {
- getGameSession(playerId).target(question, new CardsView(abilities, game), null, required, options);
+ CardsView cardsView = new CardsView(abilities, game);
+ getGameSession(playerId).target(question, cardsView, null, required, options);
}
});
}
diff --git a/Mage.Server/src/main/java/mage/server/game/GameSessionPlayer.java b/Mage.Server/src/main/java/mage/server/game/GameSessionPlayer.java
index 157211555e0..2f93e943768 100644
--- a/Mage.Server/src/main/java/mage/server/game/GameSessionPlayer.java
+++ b/Mage.Server/src/main/java/mage/server/game/GameSessionPlayer.java
@@ -78,11 +78,11 @@ public class GameSessionPlayer extends GameSessionWatcher {
super.CleanUp();
}
- public void ask(final String question) {
+ public void ask(final String question, final Map options) {
if (!killed) {
User user = UserManager.getInstance().getUser(userId);
if (user != null) {
- user.fireCallback(new ClientCallback("gameAsk", game.getId(), new GameClientMessage(getGameView(), question)));
+ user.fireCallback(new ClientCallback("gameAsk", game.getId(), new GameClientMessage(getGameView(), question, options)));
}
}
}
diff --git a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java
index 63edac13488..9afcea78466 100644
--- a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java
+++ b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java
@@ -228,13 +228,15 @@ class TableListSorter implements Comparator
{
@Override
public int compare(Table one, Table two) {
- if (!one.getState().equals(TableState.SIDEBOARDING) && !one.getState().equals(TableState.DUELING)) {
- if (one.getState().compareTo(two.getState()) != 0) {
- return one.getState().compareTo(two.getState());
- }
- } else if (!two.getState().equals(TableState.SIDEBOARDING) && !two.getState().equals(TableState.DUELING)) {
- if (one.getState().compareTo(two.getState()) != 0) {
- return one.getState().compareTo(two.getState());
+ if (one.getState() != null && two.getState() != null) {
+ if (!TableState.SIDEBOARDING.equals(one.getState()) && !TableState.DUELING.equals(one.getState())) {
+ if (one.getState().compareTo(two.getState()) != 0) {
+ return one.getState().compareTo(two.getState());
+ }
+ } else if (!TableState.SIDEBOARDING.equals(two.getState()) && !TableState.DUELING.equals(two.getState())) {
+ if (one.getState().compareTo(two.getState()) != 0) {
+ return one.getState().compareTo(two.getState());
+ }
}
}
if (two.getEndTime() != null) {
diff --git a/Mage.Sets/pom.xml b/Mage.Sets/pom.xml
index a206bff7596..ab84711c0db 100644
--- a/Mage.Sets/pom.xml
+++ b/Mage.Sets/pom.xml
@@ -7,7 +7,7 @@
org.magemage-root
- 1.4.3
+ 1.4.5org.mage
diff --git a/Mage.Sets/src/mage/sets/BattleForZendikar.java b/Mage.Sets/src/mage/sets/BattleForZendikar.java
index b6dc6ad2d77..f21179f9746 100644
--- a/Mage.Sets/src/mage/sets/BattleForZendikar.java
+++ b/Mage.Sets/src/mage/sets/BattleForZendikar.java
@@ -25,18 +25,21 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets;
+import java.util.ArrayList;
import java.util.GregorianCalendar;
+import java.util.List;
import mage.cards.ExpansionSet;
+import mage.cards.repository.CardCriteria;
+import mage.cards.repository.CardInfo;
+import mage.cards.repository.CardRepository;
import mage.constants.SetType;
/**
*
* @author fireshoes
*/
-
public class BattleForZendikar extends ExpansionSet {
private static final BattleForZendikar fINSTANCE = new BattleForZendikar();
@@ -45,16 +48,33 @@ public class BattleForZendikar extends ExpansionSet {
return fINSTANCE;
}
+ List savedSpecialLand = new ArrayList<>();
+
private BattleForZendikar() {
super("Battle for Zendikar", "BFZ", "mage.sets.battleforzendikar", new GregorianCalendar(2015, 10, 2).getTime(), SetType.EXPANSION);
this.blockName = "Battle for Zendikar";
this.hasBoosters = true;
this.hasBasicLands = true;
this.numBoosterLands = 1;
+ this.ratioBoosterSpecialLand = 20; // Approximately as rare as opening a foil mythic = 8 * 6 = ~every 48th booster includes one
+ // I set it to 20 to get it more often
this.numBoosterCommon = 10;
this.numBoosterUncommon = 3;
this.numBoosterRare = 1;
this.ratioBoosterMythic = 8;
+ this.numBoosterSpecial = 0;
}
+ @Override
+ public List getSpecialLand() {
+ List specialLand = new ArrayList<>();
+ if (savedSpecialLand.isEmpty()) {
+ CardCriteria criteria = new CardCriteria();
+ criteria.setCodes("EXP");
+ specialLand.addAll(CardRepository.instance.findCards(criteria));
+ }
+
+ specialLand.addAll(savedSpecialLand);
+ return specialLand;
+ }
}
diff --git a/Mage.Sets/src/mage/sets/Chronicles.java b/Mage.Sets/src/mage/sets/Chronicles.java
new file mode 100644
index 00000000000..6f24be32909
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/Chronicles.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets;
+
+import java.util.GregorianCalendar;
+import mage.cards.ExpansionSet;
+import mage.constants.SetType;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Chronicles extends ExpansionSet {
+
+ private static final Chronicles fINSTANCE = new Chronicles();
+
+ public static Chronicles getInstance() {
+ return fINSTANCE;
+ }
+
+ private Chronicles() {
+ super("Chronicles", "CHR", "mage.sets.chronicles", new GregorianCalendar(1995, 6, 1).getTime(), SetType.SUPPLEMENTAL);
+ this.blockName = "Reprint";
+ this.hasBasicLands = false;
+ this.hasBoosters = true;
+ this.numBoosterLands = 0;
+ this.numBoosterCommon = 9;
+ this.numBoosterUncommon = 2;
+ this.numBoosterRare = 1;
+ this.ratioBoosterMythic = 0;
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/Commander2015.java b/Mage.Sets/src/mage/sets/Commander2015.java
new file mode 100644
index 00000000000..d1069bda220
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/Commander2015.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets;
+
+import java.util.GregorianCalendar;
+import mage.cards.ExpansionSet;
+import mage.constants.SetType;
+
+/**
+ *
+ * @author fireshoes
+ */
+
+public class Commander2015 extends ExpansionSet {
+
+ private static final Commander2015 fINSTANCE = new Commander2015();
+
+ public static Commander2015 getInstance() {
+ return fINSTANCE;
+ }
+
+ private Commander2015() {
+ super("Commander 2015 Edition", "C15", "mage.sets.commander2015", new GregorianCalendar(2015, 11, 13).getTime(), SetType.SUPPLEMENTAL);
+ this.blockName = "Command Zone";
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/FateReforged.java b/Mage.Sets/src/mage/sets/FateReforged.java
index 76d31b292a2..d3359435df5 100644
--- a/Mage.Sets/src/mage/sets/FateReforged.java
+++ b/Mage.Sets/src/mage/sets/FateReforged.java
@@ -57,7 +57,7 @@ public class FateReforged extends ExpansionSet {
super("Fate Reforged", "FRF", "mage.sets.fatereforged", new GregorianCalendar(2015, 1, 23).getTime(), SetType.EXPANSION);
this.blockName = "Khans of Tarkir";
this.parentSet = KhansOfTarkir.getInstance();
- this.hasBasicLands = false;
+ this.hasBasicLands = true;
this.hasBoosters = true;
this.numBoosterSpecial = 1;
this.numBoosterLands = 0;
diff --git a/Mage.Sets/src/mage/sets/Gatecrash.java b/Mage.Sets/src/mage/sets/Gatecrash.java
index 46679ecbbfc..9a89355f6ea 100644
--- a/Mage.Sets/src/mage/sets/Gatecrash.java
+++ b/Mage.Sets/src/mage/sets/Gatecrash.java
@@ -44,15 +44,15 @@ public class Gatecrash extends ExpansionSet {
}
private Gatecrash() {
- super("Gatecrash", "GTC", "mage.sets.gatecrash", new GregorianCalendar(2013, 2, 01).getTime(), SetType.EXPANSION);
+ super("Gatecrash", "GTC", "mage.sets.gatecrash", new GregorianCalendar(2013, 2, 1).getTime(), SetType.EXPANSION);
this.blockName = "Return to Ravnica";
+ this.parentSet = ReturnToRavnica.getInstance();
+ this.hasBasicLands = false;
this.hasBoosters = true;
this.numBoosterLands = 1;
this.numBoosterCommon = 10;
this.numBoosterUncommon = 3;
this.numBoosterRare = 1;
this.ratioBoosterMythic = 8;
- this.parentSet = ReturnToRavnica.getInstance();
- this.hasBasicLands = false;
}
}
diff --git a/Mage.Sets/src/mage/sets/JourneyIntoNyx.java b/Mage.Sets/src/mage/sets/JourneyIntoNyx.java
index c5252356ea3..18365532892 100644
--- a/Mage.Sets/src/mage/sets/JourneyIntoNyx.java
+++ b/Mage.Sets/src/mage/sets/JourneyIntoNyx.java
@@ -50,8 +50,8 @@ public class JourneyIntoNyx extends ExpansionSet {
this.parentSet = Theros.getInstance();
this.hasBasicLands = false;
this.hasBoosters = true;
- this.numBoosterLands = 0;
- this.numBoosterCommon = 11;
+ this.numBoosterLands = 1;
+ this.numBoosterCommon = 10;
this.numBoosterUncommon = 3;
this.numBoosterRare = 1;
this.ratioBoosterMythic = 8;
diff --git a/Mage.Sets/src/mage/sets/MastersEditionII.java b/Mage.Sets/src/mage/sets/MastersEditionII.java
index 0637ada20b5..4ff6cebfa37 100644
--- a/Mage.Sets/src/mage/sets/MastersEditionII.java
+++ b/Mage.Sets/src/mage/sets/MastersEditionII.java
@@ -45,7 +45,7 @@ public class MastersEditionII extends ExpansionSet {
private MastersEditionII() {
super("Masters Edition II", "ME2", "mage.sets.masterseditionii", new GregorianCalendar(2008, 9, 22).getTime(), SetType.MAGIC_ONLINE);
- this.hasBasicLands = true;
+ this.hasBasicLands = false;
this.hasBoosters = true;
this.numBoosterLands = 1;
this.numBoosterCommon = 10;
diff --git a/Mage.Sets/src/mage/sets/MastersEditionIV.java b/Mage.Sets/src/mage/sets/MastersEditionIV.java
index 2c9f75e2a54..37b62cf137c 100644
--- a/Mage.Sets/src/mage/sets/MastersEditionIV.java
+++ b/Mage.Sets/src/mage/sets/MastersEditionIV.java
@@ -46,7 +46,7 @@ public class MastersEditionIV extends ExpansionSet {
private MastersEditionIV() {
super("Masters Edition IV", "ME4", "mage.sets.masterseditioniv", new GregorianCalendar(2011, 1, 10).getTime(), SetType.MAGIC_ONLINE);
- this.hasBasicLands = true;
+ this.hasBasicLands = false;
this.hasBoosters = true;
this.numBoosterLands = 1;
this.numBoosterCommon = 10;
diff --git a/Mage.Sets/src/mage/sets/OathOfTheGatewatch.java b/Mage.Sets/src/mage/sets/OathOfTheGatewatch.java
new file mode 100644
index 00000000000..8d1d9030923
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/OathOfTheGatewatch.java
@@ -0,0 +1,35 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package mage.sets;
+
+import java.util.GregorianCalendar;
+import mage.cards.ExpansionSet;
+import mage.constants.SetType;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class OathOfTheGatewatch extends ExpansionSet {
+
+ private static final OathOfTheGatewatch fINSTANCE = new OathOfTheGatewatch();
+
+ public static OathOfTheGatewatch getInstance() {
+ return fINSTANCE;
+ }
+
+ private OathOfTheGatewatch() {
+ super("Oath of the Gatewatch", "OGW", "mage.sets.oathofthegatewatch", new GregorianCalendar(2016, 1, 22).getTime(), SetType.EXPANSION);
+ this.blockName = "Battle for Zendikar";
+ this.hasBoosters = true;
+ this.hasBasicLands = false;
+ this.numBoosterLands = 1;
+ this.numBoosterCommon = 10;
+ this.numBoosterUncommon = 3;
+ this.numBoosterRare = 1;
+ this.ratioBoosterMythic = 8;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/PortalThreeKingdoms.java b/Mage.Sets/src/mage/sets/PortalThreeKingdoms.java
index f64b8803066..91b2c7313cc 100644
--- a/Mage.Sets/src/mage/sets/PortalThreeKingdoms.java
+++ b/Mage.Sets/src/mage/sets/PortalThreeKingdoms.java
@@ -36,15 +36,10 @@ import mage.constants.SetType;
*
* @author LevelX2
*/
-
public class PortalThreeKingdoms extends ExpansionSet {
private static final PortalThreeKingdoms fINSTANCE = new PortalThreeKingdoms();
- /**
- *
- * @return
- */
public static PortalThreeKingdoms getInstance() {
return fINSTANCE;
}
@@ -56,7 +51,7 @@ public class PortalThreeKingdoms extends ExpansionSet {
this.hasBoosters = true;
this.numBoosterLands = 2;
this.numBoosterCommon = 5;
- this.numBoosterUncommon = 5;
+ this.numBoosterUncommon = 2;
this.numBoosterRare = 1;
this.ratioBoosterMythic = 0;
}
diff --git a/Mage.Sets/src/mage/sets/Starter1999.java b/Mage.Sets/src/mage/sets/Starter1999.java
index 0e3ad40a75a..90a6197afd8 100644
--- a/Mage.Sets/src/mage/sets/Starter1999.java
+++ b/Mage.Sets/src/mage/sets/Starter1999.java
@@ -36,15 +36,10 @@ import mage.constants.SetType;
*
* @author LevelX2
*/
-
public class Starter1999 extends ExpansionSet {
private static final Starter1999 fINSTANCE = new Starter1999();
- /**
- *
- * @return
- */
public static Starter1999 getInstance() {
return fINSTANCE;
}
@@ -54,8 +49,8 @@ public class Starter1999 extends ExpansionSet {
this.blockName = "Beginner";
this.hasBasicLands = true;
this.hasBoosters = true;
- this.numBoosterLands = 1;
- this.numBoosterCommon = 10;
+ this.numBoosterLands = 2;
+ this.numBoosterCommon = 9;
this.numBoosterUncommon = 3;
this.numBoosterRare = 1;
this.ratioBoosterMythic = 0;
diff --git a/Mage.Sets/src/mage/sets/UnlimitedEdition.java b/Mage.Sets/src/mage/sets/UnlimitedEdition.java
index 2b3eaee6192..5e2e9c30212 100644
--- a/Mage.Sets/src/mage/sets/UnlimitedEdition.java
+++ b/Mage.Sets/src/mage/sets/UnlimitedEdition.java
@@ -20,8 +20,8 @@ public class UnlimitedEdition extends ExpansionSet {
private UnlimitedEdition() {
super("Unlimited Edition", "2ED", "mage.sets.unlimitededition", new GregorianCalendar(1993, 11, 1).getTime(), SetType.CORE);
this.hasBoosters = true;
- this.numBoosterLands = 1;
- this.numBoosterCommon = 10;
+ this.numBoosterLands = 0;
+ this.numBoosterCommon = 11;
this.numBoosterUncommon = 3;
this.numBoosterRare = 1;
this.ratioBoosterMythic = 0;
diff --git a/Mage.Sets/src/mage/sets/ZendikarExpeditions.java b/Mage.Sets/src/mage/sets/ZendikarExpeditions.java
new file mode 100644
index 00000000000..ed7759f4c8e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/ZendikarExpeditions.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets;
+
+import java.util.GregorianCalendar;
+import mage.cards.ExpansionSet;
+import mage.constants.SetType;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ZendikarExpeditions extends ExpansionSet {
+
+ private static final ZendikarExpeditions fINSTANCE = new ZendikarExpeditions();
+
+ public static ZendikarExpeditions getInstance() {
+ return fINSTANCE;
+ }
+
+ private ZendikarExpeditions() {
+ super("Zendikar Expeditions", "EXP", "mage.sets.zendikarexpeditions", new GregorianCalendar(2015, 10, 2).getTime(), SetType.PROMOTIONAL);
+ this.hasBoosters = false;
+ this.hasBasicLands = false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/ZendikarVsEldrazi.java b/Mage.Sets/src/mage/sets/ZendikarVsEldrazi.java
new file mode 100644
index 00000000000..4a0d7003f79
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/ZendikarVsEldrazi.java
@@ -0,0 +1,52 @@
+/*
+* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without modification, are
+* permitted provided that the following conditions are met:
+*
+* 1. Redistributions of source code must retain the above copyright notice, this list of
+* conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright notice, this list
+* of conditions and the following disclaimer in the documentation and/or other materials
+* provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* The views and conclusions contained in the software and documentation are those of the
+* authors and should not be interpreted as representing official policies, either expressed
+* or implied, of BetaSteward_at_googlemail.com.
+*/
+
+package mage.sets;
+
+import java.util.GregorianCalendar;
+import mage.cards.ExpansionSet;
+import mage.constants.SetType;
+
+/**
+ *
+ * @author fireshoes
+ */
+
+public class ZendikarVsEldrazi extends ExpansionSet {
+ private static final ZendikarVsEldrazi fINSTANCE = new ZendikarVsEldrazi();
+
+ public static ZendikarVsEldrazi getInstance() {
+ return fINSTANCE;
+ }
+
+ private ZendikarVsEldrazi() {
+ super("Duel Decks: Zendikar vs. Eldrazi", "DDP", "mage.sets.zendikarvseldrazi", new GregorianCalendar(2015, 8, 28).getTime(), SetType.SUPPLEMENTAL);
+ this.blockName = "Duel Decks";
+ this.hasBasicLands = false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alarareborn/ArsenalThresher.java b/Mage.Sets/src/mage/sets/alarareborn/ArsenalThresher.java
index 16bc181405a..af33a411bba 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/ArsenalThresher.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/ArsenalThresher.java
@@ -41,7 +41,6 @@ import mage.constants.Rarity;
import mage.counters.CounterType;
import mage.filter.common.FilterArtifactCard;
import mage.filter.predicate.mageobject.AnotherCardPredicate;
-import mage.filter.predicate.permanent.AnotherPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@@ -62,7 +61,8 @@ public class ArsenalThresher extends CardImpl {
this.toughness = new MageInt(2);
// As Arsenal Thresher enters the battlefield, you may reveal any number of other artifact cards from your hand. Arsenal Thresher enters the battlefield with a +1/+1 counter on it for each card revealed this way.
- this.addAbility(new AsEntersBattlefieldAbility(new ArsenalThresherEffect(), "you may reveal any number of other artifact cards from your hand. {this} enters the battlefield with a +1/+1 counter on it for each card revealed this way"));
+ this.addAbility(new AsEntersBattlefieldAbility(new ArsenalThresherEffect(),
+ "you may reveal any number of other artifact cards from your hand. {this} enters the battlefield with a +1/+1 counter on it for each card revealed this way"));
}
public ArsenalThresher(final ArsenalThresher card) {
@@ -92,29 +92,29 @@ class ArsenalThresherEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Player you = game.getPlayer(source.getControllerId());
- if (you == null) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller == null) {
return false;
}
- Permanent arsenalThresher = game.getPermanent(source.getSourceId());
+ Permanent arsenalThresher = game.getPermanentEntering(source.getSourceId());
FilterArtifactCard filter = new FilterArtifactCard();
filter.add(new AnotherCardPredicate());
- if (you.chooseUse(Outcome.Benefit, "Do you want to reveal other artifacts in your hand?", source, game)) {
+ if (controller.chooseUse(Outcome.Benefit, "Do you want to reveal other artifacts in your hand?", source, game)) {
Cards cards = new CardsImpl();
- if (you.getHand().count(filter, source.getSourceId(), source.getControllerId(), game) > 0) {
+ if (controller.getHand().count(filter, source.getSourceId(), source.getControllerId(), game) > 0) {
TargetCardInHand target = new TargetCardInHand(0, Integer.MAX_VALUE, filter);
- if (you.choose(Outcome.Benefit, target, source.getSourceId(), game)) {
+ if (controller.choose(Outcome.Benefit, target, source.getSourceId(), game)) {
for (UUID uuid : target.getTargets()) {
- cards.add(you.getHand().get(uuid, game));
+ cards.add(controller.getHand().get(uuid, game));
}
- you.revealCards("Revealed cards", cards, game);
if (arsenalThresher != null) {
+ controller.revealCards(arsenalThresher.getIdName(), cards, game);
arsenalThresher.addCounters(CounterType.P1P1.createInstance(cards.size()), game);
- return true;
}
}
}
+ return true;
}
return false;
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/alarareborn/FieldmistBorderpost.java b/Mage.Sets/src/mage/sets/alarareborn/FieldmistBorderpost.java
index fd91cace663..2db77ebb0ef 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/FieldmistBorderpost.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/FieldmistBorderpost.java
@@ -34,7 +34,7 @@ import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.costs.AlternativeCostSourceAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.mana.BlueManaAbility;
import mage.abilities.mana.WhiteManaAbility;
@@ -64,7 +64,7 @@ public class FieldmistBorderpost extends CardImpl {
// You may pay {1} and return a basic land you control to its owner's hand rather than pay Fieldmist Borderpost's mana cost.
Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1));
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
// Fieldmist Borderpost enters the battlefield tapped.
diff --git a/Mage.Sets/src/mage/sets/alarareborn/FirewildBorderpost.java b/Mage.Sets/src/mage/sets/alarareborn/FirewildBorderpost.java
index 586307655c0..e0464f950e2 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/FirewildBorderpost.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/FirewildBorderpost.java
@@ -32,7 +32,7 @@ import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.costs.AlternativeCostSourceAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.mana.GreenManaAbility;
import mage.abilities.mana.RedManaAbility;
@@ -64,7 +64,7 @@ public class FirewildBorderpost extends CardImpl {
// You may pay {1} and return a basic land you control to its owner's hand rather than pay Firewild Borderpost's mana cost.
Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1));
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
// Veinfire Firewild enters the battlefield tapped.
diff --git a/Mage.Sets/src/mage/sets/alarareborn/GloryscaleViashino.java b/Mage.Sets/src/mage/sets/alarareborn/GloryscaleViashino.java
index 7d87143fc83..cb81497e510 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/GloryscaleViashino.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/GloryscaleViashino.java
@@ -30,17 +30,14 @@ package mage.sets.alarareborn;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
-import mage.constants.Zone;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.events.GameEvent.EventType;
-import mage.game.stack.Spell;
+import mage.filter.FilterSpell;
+import mage.filter.predicate.mageobject.MulticoloredPredicate;
/**
*
@@ -48,17 +45,23 @@ import mage.game.stack.Spell;
*/
public class GloryscaleViashino extends CardImpl {
+ private static final FilterSpell filter = new FilterSpell("a multicolored spell");
+
+ static {
+ filter.add(new MulticoloredPredicate());
+ }
+
public GloryscaleViashino (UUID ownerId) {
super(ownerId, 120, "Gloryscale Viashino", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}{G}{W}");
this.expansionSetCode = "ARB";
this.subtype.add("Viashino");
this.subtype.add("Soldier");
-
-
this.power = new MageInt(3);
this.toughness = new MageInt(3);
- this.addAbility(new GloryscaleViashinoAbility());
+
+ // Whenever you cast a multicolored spell, Gloryscale Viashino gets +3/+3 until end of turn.
+ this.addAbility(new SpellCastControllerTriggeredAbility(new BoostSourceEffect(3, 3, Duration.EndOfTurn), filter, false));
}
public GloryscaleViashino (final GloryscaleViashino card) {
@@ -69,36 +72,4 @@ public class GloryscaleViashino extends CardImpl {
public GloryscaleViashino copy() {
return new GloryscaleViashino(this);
}
-
}
-
-class GloryscaleViashinoAbility extends TriggeredAbilityImpl {
- public GloryscaleViashinoAbility() {
- super(Zone.BATTLEFIELD, new BoostSourceEffect(3, 3, Duration.EndOfTurn));
- }
-
- public GloryscaleViashinoAbility(final GloryscaleViashinoAbility ability) {
- super(ability);
- }
-
- @Override
- public GloryscaleViashinoAbility copy() {
- return new GloryscaleViashinoAbility(this);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == EventType.SPELL_CAST;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- Spell spell = game.getStack().getSpell(event.getTargetId());
- return spell != null && spell.getColor(game).isMulticolored() && event.getPlayerId().equals(getControllerId());
- }
-
- @Override
- public String getRule() {
- return "Whenever you cast a multicolored spell, {this} gets +3/+3 until end of turn.";
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/alarareborn/LordOfExtinction.java b/Mage.Sets/src/mage/sets/alarareborn/LordOfExtinction.java
index 7e2ab26e168..abcb06b0024 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/LordOfExtinction.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/LordOfExtinction.java
@@ -53,13 +53,11 @@ public class LordOfExtinction extends CardImpl {
this.expansionSetCode = "ARB";
this.subtype.add("Elemental");
-
-
this.power = new MageInt(0);
this.toughness = new MageInt(0);
// Lord of Extinction's power and toughness are each equal to the number of cards in all graveyards.
- this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(new LordOfExtinctionDynamicCount(), Duration.WhileOnBattlefield)));
+ this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(new LordOfExtinctionDynamicCount(), Duration.EndOfGame)));
}
public LordOfExtinction(final LordOfExtinction card) {
diff --git a/Mage.Sets/src/mage/sets/alarareborn/MaelstromNexus.java b/Mage.Sets/src/mage/sets/alarareborn/MaelstromNexus.java
index 6a4f024517a..655dea82e26 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/MaelstromNexus.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/MaelstromNexus.java
@@ -27,21 +27,28 @@
*/
package mage.sets.alarareborn;
+import java.util.HashMap;
+import java.util.Map;
import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.TriggeredAbilityImpl;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.keyword.CascadeAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Layer;
import mage.constants.Outcome;
import mage.constants.Rarity;
+import mage.constants.SubLayer;
import mage.constants.WatcherScope;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
import mage.game.stack.Spell;
-import mage.target.targetpointer.FixedTarget;
+import mage.game.stack.StackObject;
+import mage.players.Player;
import mage.watchers.Watcher;
/**
@@ -55,7 +62,7 @@ public class MaelstromNexus extends CardImpl {
this.expansionSetCode = "ARB";
// The first spell you cast each turn has cascade.
- this.addAbility(new MaelstromNexusTriggeredAbility(), new FirstSpellCastThisTurnWatcher());
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MaelstromNexusGainCascadeFirstSpellEffect()), new FirstSpellCastThisTurnWatcher());
}
@@ -69,52 +76,51 @@ public class MaelstromNexus extends CardImpl {
}
}
-class MaelstromNexusTriggeredAbility extends TriggeredAbilityImpl {
+class MaelstromNexusGainCascadeFirstSpellEffect extends ContinuousEffectImpl {
- public MaelstromNexusTriggeredAbility() {
- super(Zone.BATTLEFIELD, new CascadeEffect());
+ private Ability cascadeAbility = new CascadeAbility();
+
+ public MaelstromNexusGainCascadeFirstSpellEffect() {
+ super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility);
+ staticText = "The first spell you cast each turn has cascade";
}
- public MaelstromNexusTriggeredAbility(MaelstromNexusTriggeredAbility ability) {
- super(ability);
+ public MaelstromNexusGainCascadeFirstSpellEffect(final MaelstromNexusGainCascadeFirstSpellEffect effect) {
+ super(effect);
}
@Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == GameEvent.EventType.SPELL_CAST;
+ public MaelstromNexusGainCascadeFirstSpellEffect copy() {
+ return new MaelstromNexusGainCascadeFirstSpellEffect(this);
}
-
@Override
- public boolean checkTrigger(GameEvent event, Game game) {
- Spell spell = game.getStack().getSpell(event.getTargetId());
- FirstSpellCastThisTurnWatcher watcher = (FirstSpellCastThisTurnWatcher) game.getState().getWatchers().get("FirstSpellCastThisTurn", this.getSourceId());
- if (spell != null
- && watcher != null
- && watcher.conditionMet()) {
- this.getEffects().get(0).setTargetPointer(new FixedTarget(spell.getSourceId()));
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ for (StackObject stackObject : game.getStack()) {
+ // only spells cast, so no copies of spells
+ if ((stackObject instanceof Spell) && !stackObject.isCopy() && stackObject.getControllerId().equals(source.getControllerId())) {
+ Spell spell = (Spell) stackObject;
+ FirstSpellCastThisTurnWatcher watcher = (FirstSpellCastThisTurnWatcher) game.getState().getWatchers().get("FirstSpellCastThisTurn");
+ if (watcher != null && spell.getId().equals(watcher.getIdOfFirstCastSpell(source.getControllerId()))) {
+ game.getState().addOtherAbility(spell.getCard(), cascadeAbility);
+ }
+ }
+ }
return true;
}
return false;
}
-
- @Override
- public MaelstromNexusTriggeredAbility copy() {
- return new MaelstromNexusTriggeredAbility(this);
- }
-
- @Override
- public String getRule() {
- return "The first spell you cast each turn has cascade.";
- }
}
class FirstSpellCastThisTurnWatcher extends Watcher {
- int spellCount = 0;
+ Map playerFirstSpellCast = new HashMap<>();
+ Map playerFirstCastSpell = new HashMap<>();
public FirstSpellCastThisTurnWatcher() {
- super("FirstSpellCastThisTurn", WatcherScope.CARD);
+ super("FirstSpellCastThisTurn", WatcherScope.GAME);
}
public FirstSpellCastThisTurnWatcher(final FirstSpellCastThisTurnWatcher watcher) {
@@ -123,16 +129,18 @@ class FirstSpellCastThisTurnWatcher extends Watcher {
@Override
public void watch(GameEvent event, Game game) {
- if (event.getType() == GameEvent.EventType.SPELL_CAST && event.getPlayerId() == controllerId) {
- Spell spell = (Spell) game.getObject(event.getTargetId());
- if (spell != null) {
- spellCount++;
- if (spellCount == 1) {
- condition = true;
- } else {
- condition = false;
+ switch (event.getType()) {
+ case SPELL_CAST:
+ case CAST_SPELL:
+ Spell spell = (Spell) game.getObject(event.getTargetId());
+ if (spell != null && !playerFirstSpellCast.containsKey(spell.getControllerId())) {
+ if (event.getType().equals(EventType.SPELL_CAST)) {
+ playerFirstSpellCast.put(spell.getControllerId(), spell.getId());
+ } else if (event.getType().equals(EventType.CAST_SPELL)) {
+ playerFirstCastSpell.put(spell.getControllerId(), spell.getId());
+ }
+
}
- }
}
}
@@ -144,28 +152,15 @@ class FirstSpellCastThisTurnWatcher extends Watcher {
@Override
public void reset() {
super.reset();
- spellCount = 0;
+ playerFirstSpellCast.clear();
+ playerFirstCastSpell.clear();
+ }
+
+ public UUID getIdOfFirstCastSpell(UUID playerId) {
+ if (playerFirstSpellCast.get(playerId) == null) {
+ return playerFirstCastSpell.get(playerId);
+ } else {
+ return playerFirstSpellCast.get(playerId);
+ }
}
}
-
-class CascadeEffect extends OneShotEffect {
-
- public CascadeEffect() {
- super(Outcome.PutCardInPlay);
- }
-
- public CascadeEffect(CascadeEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- return CascadeAbility.applyCascade(outcome, game, source);
- }
-
- @Override
- public CascadeEffect copy() {
- return new CascadeEffect(this);
- }
-
-}
diff --git a/Mage.Sets/src/mage/sets/alarareborn/MayaelsAria.java b/Mage.Sets/src/mage/sets/alarareborn/MayaelsAria.java
index 5787e85e87c..a23c65749a7 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/MayaelsAria.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/MayaelsAria.java
@@ -38,7 +38,9 @@ import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.counters.CounterType;
+import mage.filter.Filter;
import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.PowerPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@@ -53,13 +55,10 @@ public class MayaelsAria extends CardImpl {
super(ownerId, 121, "Mayael's Aria", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{R}{G}{W}");
this.expansionSetCode = "ARB";
-
-
-
-
- // At the beginning of your upkeep, put a +1/+1 counter on each creature you control if you control a creature with power 5 or greater. Then you gain 10 life if you control a creature with power 10 or greater. Then you win the game if you control a creature with power 20 or greater.
+ // At the beginning of your upkeep, put a +1/+1 counter on each creature you control if you control a creature with power 5 or greater.
+ // Then you gain 10 life if you control a creature with power 10 or greater.
+ // Then you win the game if you control a creature with power 20 or greater.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new MayaelsAriaEffect(), TargetController.YOU, false));
-
}
public MayaelsAria(final MayaelsAria card) {
@@ -90,31 +89,32 @@ class MayaelsAriaEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- boolean condition1 = false;
- boolean condition2 = false;
- Player you = game.getPlayer(source.getControllerId());
- if (you == null) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller == null) {
return false;
}
+ // put a +1/+1 counter on each creature you control if you control a creature with power 5 or greater.
FilterCreaturePermanent filter = new FilterCreaturePermanent();
- for (Permanent creature : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) {
- if (creature.getPower().getValue() > 4) {
- condition1 = true;
- }
- if (creature.getPower().getValue() > 9) {
- condition2 = true;
- }
- if (creature.getPower().getValue() > 19) {
- you.won(game);
- }
- }
- if (condition1) {
+ filter.add(new PowerPredicate(Filter.ComparisonType.GreaterThan, 4));
+ if (game.getState().getBattlefield().countAll(filter, controller.getId(), game) > 0) {
for (Permanent creature : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) {
creature.addCounters(CounterType.P1P1.createInstance(), game);
}
}
- if (condition2) {
- you.gainLife(10, game);
+ game.applyEffects(); // needed because otehrwise the +1/+1 counters wouldn't be taken into account
+
+ // Then you gain 10 life if you control a creature with power 10 or greater.
+ filter = new FilterCreaturePermanent();
+ filter.add(new PowerPredicate(Filter.ComparisonType.GreaterThan, 9));
+ if (game.getState().getBattlefield().countAll(filter, controller.getId(), game) > 0) {
+ controller.gainLife(10, game);
+ }
+
+ // Then you win the game if you control a creature with power 20 or greater.
+ filter = new FilterCreaturePermanent();
+ filter.add(new PowerPredicate(Filter.ComparisonType.GreaterThan, 19));
+ if (game.getState().getBattlefield().countAll(filter, controller.getId(), game) > 0) {
+ controller.won(game);
}
return true;
}
diff --git a/Mage.Sets/src/mage/sets/alarareborn/MistveinBorderpost.java b/Mage.Sets/src/mage/sets/alarareborn/MistveinBorderpost.java
index dc01e983b54..050cda79a5d 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/MistveinBorderpost.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/MistveinBorderpost.java
@@ -34,7 +34,7 @@ import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.costs.AlternativeCostSourceAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.mana.BlackManaAbility;
import mage.abilities.mana.BlueManaAbility;
@@ -64,7 +64,7 @@ public class MistveinBorderpost extends CardImpl {
// You may pay {1} and return a basic land you control to its owner's hand rather than pay Mistvein Borderpost's mana cost.
Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1));
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
// Mistvein Borderpost enters the battlefield tapped.
diff --git a/Mage.Sets/src/mage/sets/alarareborn/SlaveOfBolas.java b/Mage.Sets/src/mage/sets/alarareborn/SlaveOfBolas.java
index 414e9e9cee0..da0c98d4ea7 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/SlaveOfBolas.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/SlaveOfBolas.java
@@ -43,6 +43,7 @@ import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.game.Game;
+import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.FixedTarget;
@@ -56,10 +57,6 @@ public class SlaveOfBolas extends CardImpl {
super(ownerId, 136, "Slave of Bolas", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{U/R}{B}");
this.expansionSetCode = "ARB";
-
-
-
-
// Gain control of target creature. Untap that creature. It gains haste until end of turn. Sacrifice it at the beginning of the next end step.
this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfTurn));
this.getSpellAbility().addEffect(new UntapTargetEffect());
@@ -96,13 +93,17 @@ class SlaveOfBolasEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice this");
- sacrificeEffect.setTargetPointer(new FixedTarget(source.getFirstTarget()));
- DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect);
- delayedAbility.setSourceId(source.getSourceId());
- delayedAbility.setControllerId(source.getControllerId());
- delayedAbility.setSourceObject(source.getSourceObject(game), game);
- game.addDelayedTriggeredAbility(delayedAbility);
- return true;
+ Permanent permanent = game.getPermanent(source.getFirstTarget());
+ if (permanent != null) {
+ SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice this", source.getControllerId());
+ sacrificeEffect.setTargetPointer(new FixedTarget(permanent, game));
+ DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect);
+ delayedAbility.setSourceId(source.getSourceId());
+ delayedAbility.setControllerId(source.getControllerId());
+ delayedAbility.setSourceObject(source.getSourceObject(game), game);
+ game.addDelayedTriggeredAbility(delayedAbility);
+ return true;
+ }
+ return false;
}
}
diff --git a/Mage.Sets/src/mage/sets/alarareborn/Terminate.java b/Mage.Sets/src/mage/sets/alarareborn/Terminate.java
index d69a6c1ee7a..bb1c6bf8971 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/Terminate.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/Terminate.java
@@ -1,38 +1,37 @@
/*
-* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification, are
-* permitted provided that the following conditions are met:
-*
-* 1. Redistributions of source code must retain the above copyright notice, this list of
-* conditions and the following disclaimer.
-*
-* 2. Redistributions in binary form must reproduce the above copyright notice, this list
-* of conditions and the following disclaimer in the documentation and/or other materials
-* provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
-* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* The views and conclusions contained in the software and documentation are those of the
-* authors and should not be interpreted as representing official policies, either expressed
-* or implied, of BetaSteward_at_googlemail.com.
-*/
-
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
package mage.sets.alarareborn;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
import mage.target.common.TargetCreaturePermanent;
/**
@@ -44,8 +43,6 @@ public class Terminate extends CardImpl {
public Terminate(UUID ownerId) {
super(ownerId, 46, "Terminate", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{B}{R}");
this.expansionSetCode = "ARB";
-
-
// Destroy target creature. It can't be regenerated.
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
diff --git a/Mage.Sets/src/mage/sets/alarareborn/Thraximundar.java b/Mage.Sets/src/mage/sets/alarareborn/Thraximundar.java
index 9fe05560f06..08898a2dcce 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/Thraximundar.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/Thraximundar.java
@@ -60,9 +60,6 @@ public class Thraximundar extends CardImpl {
this.subtype.add("Zombie");
this.subtype.add("Assassin");
-
-
-
this.power = new MageInt(6);
this.toughness = new MageInt(6);
@@ -116,7 +113,8 @@ class ThraximundarTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- if (event.getSourceId() == this.getSourceId()) {
+ if (event.getSourceId() != null
+ && event.getSourceId().equals(this.getSourceId())) {
UUID defender = game.getCombat().getDefendingPlayerId(this.getSourceId(), game);
this.getEffects().get(0).setTargetPointer(new FixedTarget(defender));
return true;
@@ -160,4 +158,4 @@ class PlayerSacrificesCreatureTriggeredAbility extends TriggeredAbilityImpl {
public PlayerSacrificesCreatureTriggeredAbility copy() {
return new PlayerSacrificesCreatureTriggeredAbility(this);
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/alarareborn/VeinfireBorderpost.java b/Mage.Sets/src/mage/sets/alarareborn/VeinfireBorderpost.java
index 29ca354d0c0..82c2243a1cb 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/VeinfireBorderpost.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/VeinfireBorderpost.java
@@ -34,7 +34,7 @@ import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.costs.AlternativeCostSourceAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.mana.BlackManaAbility;
import mage.abilities.mana.RedManaAbility;
@@ -64,7 +64,7 @@ public class VeinfireBorderpost extends CardImpl {
// You may pay {1} and return a basic land you control to its owner's hand rather than pay Veinfire Borderpost's mana cost.
Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1));
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
// Veinfire Borderpost enters the battlefield tapped.
diff --git a/Mage.Sets/src/mage/sets/alarareborn/Wargate.java b/Mage.Sets/src/mage/sets/alarareborn/Wargate.java
index db3728446e6..38654b08777 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/Wargate.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/Wargate.java
@@ -28,14 +28,13 @@
package mage.sets.alarareborn;
import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
+import mage.constants.CardType;
import mage.constants.Outcome;
+import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.Filter;
import mage.filter.common.FilterPermanentCard;
@@ -54,10 +53,6 @@ public class Wargate extends CardImpl {
super(ownerId, 129, "Wargate", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{X}{G}{W}{U}");
this.expansionSetCode = "ARB";
-
-
-
-
// Search your library for a permanent card with converted mana cost X or less, put it onto the battlefield, then shuffle your library.
this.getSpellAbility().addEffect(new WargateEffect());
}
@@ -72,8 +67,8 @@ public class Wargate extends CardImpl {
}
}
-
class WargateEffect extends OneShotEffect {
+
WargateEffect() {
super(Outcome.PutCreatureInPlay);
staticText = "Search your library for a permanent card with converted mana cost X or less, put it onto the battlefield, then shuffle your library";
@@ -97,7 +92,7 @@ class WargateEffect extends OneShotEffect {
if (target.getTargets().size() > 0) {
Card card = controller.getLibrary().getCard(target.getFirstTarget(), game);
if (card != null) {
- controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId());
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game);
}
}
}
diff --git a/Mage.Sets/src/mage/sets/alarareborn/WildfieldBorderpost.java b/Mage.Sets/src/mage/sets/alarareborn/WildfieldBorderpost.java
index 2015f45f10a..f167e516df3 100644
--- a/Mage.Sets/src/mage/sets/alarareborn/WildfieldBorderpost.java
+++ b/Mage.Sets/src/mage/sets/alarareborn/WildfieldBorderpost.java
@@ -34,7 +34,7 @@ import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.costs.AlternativeCostSourceAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.mana.GreenManaAbility;
import mage.abilities.mana.WhiteManaAbility;
@@ -64,7 +64,7 @@ public class WildfieldBorderpost extends CardImpl {
// You may pay {1} and return a basic land you control to its owner's hand rather than pay Wildfield Borderpost's mana cost.
Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1));
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
// Wildfield Borderpost enters the battlefield tapped.
diff --git a/Mage.Sets/src/mage/sets/alliances/AgentOfStromgald1.java b/Mage.Sets/src/mage/sets/alliances/AgentOfStromgald1.java
new file mode 100644
index 00000000000..5abea54055d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/AgentOfStromgald1.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.Mana;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.mana.SimpleManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AgentOfStromgald1 extends CardImpl {
+
+ public AgentOfStromgald1(UUID ownerId) {
+ super(ownerId, 94, "Agent of Stromgald", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{R}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Human");
+ this.subtype.add("Knight");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {R}: Add {B} to your mana pool.
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana, new ManaCostsImpl("{R}")));
+ }
+
+ public AgentOfStromgald1(final AgentOfStromgald1 card) {
+ super(card);
+ }
+
+ @Override
+ public AgentOfStromgald1 copy() {
+ return new AgentOfStromgald1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/AgentOfStromgald2.java b/Mage.Sets/src/mage/sets/alliances/AgentOfStromgald2.java
new file mode 100644
index 00000000000..2c2d51c3237
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/AgentOfStromgald2.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AgentOfStromgald2 extends AgentOfStromgald1 {
+
+ public AgentOfStromgald2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 95;
+ }
+
+ public AgentOfStromgald2(final AgentOfStromgald2 card) {
+ super(card);
+ }
+
+ @Override
+ public AgentOfStromgald2 copy() {
+ return new AgentOfStromgald2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/BalduvianWarMakers1.java b/Mage.Sets/src/mage/sets/alliances/BalduvianWarMakers1.java
new file mode 100644
index 00000000000..3922ab3d508
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/BalduvianWarMakers1.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.HasteAbility;
+import mage.abilities.keyword.RampageAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BalduvianWarMakers1 extends CardImpl {
+
+ public BalduvianWarMakers1(UUID ownerId) {
+ super(ownerId, 97, "Balduvian War-Makers", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{R}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Human");
+ this.subtype.add("Barbarian");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Haste
+ this.addAbility(HasteAbility.getInstance());
+ // Rampage 1
+ this.addAbility(new RampageAbility(1));
+ }
+
+ public BalduvianWarMakers1(final BalduvianWarMakers1 card) {
+ super(card);
+ }
+
+ @Override
+ public BalduvianWarMakers1 copy() {
+ return new BalduvianWarMakers1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/BalduvianWarMakers2.java b/Mage.Sets/src/mage/sets/alliances/BalduvianWarMakers2.java
new file mode 100644
index 00000000000..175ba8a2141
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/BalduvianWarMakers2.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BalduvianWarMakers2 extends BalduvianWarMakers1 {
+
+ public BalduvianWarMakers2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 98;
+ }
+
+ public BalduvianWarMakers2(final BalduvianWarMakers2 card) {
+ super(card);
+ }
+
+ @Override
+ public BalduvianWarMakers2 copy() {
+ return new BalduvianWarMakers2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/Burnout.java b/Mage.Sets/src/mage/sets/alliances/Burnout.java
new file mode 100644
index 00000000000..e0c33b0a1c1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/Burnout.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.filter.FilterSpell;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.game.Game;
+import mage.game.stack.Spell;
+import mage.target.TargetSpell;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Burnout extends CardImpl {
+
+ private static final FilterSpell filter = new FilterSpell("instant spell");
+
+ static {
+ filter.add(new CardTypePredicate(CardType.INSTANT));
+ }
+
+ public Burnout(UUID ownerId) {
+ super(ownerId, 101, "Burnout", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{R}");
+ this.expansionSetCode = "ALL";
+
+ // Counter target instant spell if it's blue.
+ Effect effect = new BurnoutCounterTargetEffect();
+ effect.setText("Counter target instant spell if it's blue");
+ this.getSpellAbility().addTarget(new TargetSpell(filter));
+ this.getSpellAbility().addEffect(effect);
+
+ // Draw a card at the beginning of the next turn's upkeep.
+ this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(
+ new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false));
+ }
+
+ public Burnout(final Burnout card) {
+ super(card);
+ }
+
+ @Override
+ public Burnout copy() {
+ return new Burnout(this);
+ }
+}
+
+class BurnoutCounterTargetEffect extends OneShotEffect {
+
+ public BurnoutCounterTargetEffect() {
+ super(Outcome.Detriment);
+ }
+
+ public BurnoutCounterTargetEffect(final BurnoutCounterTargetEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public BurnoutCounterTargetEffect copy() {
+ return new BurnoutCounterTargetEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Spell targetSpell = game.getStack().getSpell(source.getFirstTarget());
+ if(targetSpell != null && targetSpell.getColor(game).isBlue()){
+ game.getStack().counter(source.getFirstTarget(), source.getSourceId(), game);
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/alliances/CarrierPigeons1.java b/Mage.Sets/src/mage/sets/alliances/CarrierPigeons1.java
new file mode 100644
index 00000000000..a4b0a0bc0ef
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/CarrierPigeons1.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CarrierPigeons1 extends CardImpl {
+
+ public CarrierPigeons1(UUID ownerId) {
+ super(ownerId, 125, "Carrier Pigeons", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{W}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Bird");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // When Carrier Pigeons enters the battlefield, draw a card at the beginning of the next turn's upkeep.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateDelayedTriggeredAbilityEffect(
+ new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false)));
+ }
+
+ public CarrierPigeons1(final CarrierPigeons1 card) {
+ super(card);
+ }
+
+ @Override
+ public CarrierPigeons1 copy() {
+ return new CarrierPigeons1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/CarrierPigeons2.java b/Mage.Sets/src/mage/sets/alliances/CarrierPigeons2.java
new file mode 100644
index 00000000000..974a74f0358
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/CarrierPigeons2.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CarrierPigeons2 extends mage.sets.alliances.CarrierPigeons1 {
+
+ public CarrierPigeons2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 126;
+ this.expansionSetCode = "ALL";
+ }
+
+ public CarrierPigeons2(final CarrierPigeons1 card) {
+ super(card);
+ }
+
+ @Override
+ public CarrierPigeons1 copy() {
+ return new CarrierPigeons1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/EnslavedScout1.java b/Mage.Sets/src/mage/sets/alliances/EnslavedScout1.java
new file mode 100644
index 00000000000..0c8467c1de9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/EnslavedScout1.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.MountainwalkAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class EnslavedScout1 extends CardImpl {
+
+ public EnslavedScout1(UUID ownerId) {
+ super(ownerId, 104, "Enslaved Scout", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Goblin");
+ this.subtype.add("Scout");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {2}: Enslaved Scout gains mountainwalk until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD,
+ new GainAbilitySourceEffect(new MountainwalkAbility(false), Duration.EndOfTurn),
+ new GenericManaCost(2)));
+ }
+
+ public EnslavedScout1(final EnslavedScout1 card) {
+ super(card);
+ }
+
+ @Override
+ public EnslavedScout1 copy() {
+ return new EnslavedScout1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/EnslavedScout2.java b/Mage.Sets/src/mage/sets/alliances/EnslavedScout2.java
new file mode 100644
index 00000000000..51a1f2cffa8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/EnslavedScout2.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class EnslavedScout2 extends mage.sets.alliances.EnslavedScout1 {
+
+ public EnslavedScout2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 105;
+ this.expansionSetCode = "ALL";
+ }
+
+ public EnslavedScout2(final EnslavedScout1 card) {
+ super(card);
+ }
+
+ @Override
+ public EnslavedScout1 copy() {
+ return new EnslavedScout1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/FeveredStrength1.java b/Mage.Sets/src/mage/sets/alliances/FeveredStrength1.java
new file mode 100644
index 00000000000..8dbc22aa5dc
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/FeveredStrength1.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class FeveredStrength1 extends CardImpl {
+
+ public FeveredStrength1(UUID ownerId) {
+ super(ownerId, 10, "Fevered Strength", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{B}");
+ this.expansionSetCode = "ALL";
+
+ // Target creature gets +2/+0 until end of turn.
+ this.getSpellAbility().addEffect(new BoostTargetEffect(2, 0, Duration.EndOfTurn));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+
+ // Draw a card at the beginning of the next turn's upkeep.
+ this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(
+ new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false));
+ }
+
+ public FeveredStrength1(final FeveredStrength1 card) {
+ super(card);
+ }
+
+ @Override
+ public FeveredStrength1 copy() {
+ return new FeveredStrength1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/FeveredStrength2.java b/Mage.Sets/src/mage/sets/alliances/FeveredStrength2.java
new file mode 100644
index 00000000000..9f87d7e30de
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/FeveredStrength2.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class FeveredStrength2 extends mage.sets.alliances.FeveredStrength1 {
+
+ public FeveredStrength2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 11;
+ this.expansionSetCode = "ALL";
+ }
+
+ public FeveredStrength2(final FeveredStrength1 card) {
+ super(card);
+ }
+
+ @Override
+ public FeveredStrength1 copy() {
+ return new FeveredStrength1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/GorillaBerserkers1.java b/Mage.Sets/src/mage/sets/alliances/GorillaBerserkers1.java
new file mode 100644
index 00000000000..9c5d4381512
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/GorillaBerserkers1.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.combat.CantBeBlockedByOneEffect;
+import mage.abilities.keyword.RampageAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GorillaBerserkers1 extends CardImpl {
+
+ public GorillaBerserkers1(UUID ownerId) {
+ super(ownerId, 75, "Gorilla Berserkers", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Ape");
+ this.subtype.add("Berserker");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // Rampage 2
+ this.addAbility(new RampageAbility(2));
+ // Gorilla Berserkers can't be blocked except by three or more creatures.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByOneEffect(3)));
+ }
+
+ public GorillaBerserkers1(final GorillaBerserkers1 card) {
+ super(card);
+ }
+
+ @Override
+ public GorillaBerserkers1 copy() {
+ return new GorillaBerserkers1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/GorillaBerserkers2.java b/Mage.Sets/src/mage/sets/alliances/GorillaBerserkers2.java
new file mode 100644
index 00000000000..1991e685628
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/GorillaBerserkers2.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GorillaBerserkers2 extends GorillaBerserkers1 {
+
+ public GorillaBerserkers2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 76;
+ }
+
+ public GorillaBerserkers2(final GorillaBerserkers2 card) {
+ super(card);
+ }
+
+ @Override
+ public GorillaBerserkers2 copy() {
+ return new GorillaBerserkers2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/GorillaShaman1.java b/Mage.Sets/src/mage/sets/alliances/GorillaShaman1.java
index edb27282bc7..3fd9f9e798b 100644
--- a/Mage.Sets/src/mage/sets/alliances/GorillaShaman1.java
+++ b/Mage.Sets/src/mage/sets/alliances/GorillaShaman1.java
@@ -52,6 +52,8 @@ import mage.target.TargetPermanent;
*/
public class GorillaShaman1 extends CardImpl {
+ private final UUID originalId;
+
public GorillaShaman1(UUID ownerId) {
super(ownerId, 106, "Gorilla Shaman", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{R}");
this.expansionSetCode = "ALL";
@@ -63,12 +65,13 @@ public class GorillaShaman1 extends CardImpl {
// {X}{X}{1}: Destroy target noncreature artifact with converted mana cost X.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{X}{X}{1}"));
ability.addTarget(new TargetPermanent(new FilterArtifactPermanent("noncreature artifact with converted mana cost X")));
+ originalId = ability.getOriginalId();
this.addAbility(ability);
}
@Override
public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SimpleActivatedAbility) {
+ if (ability.getOriginalId().equals(originalId)) {
int xValue = ability.getManaCostsToPay().getX();
ability.getTargets().clear();
FilterArtifactPermanent filter = new FilterArtifactPermanent(new StringBuilder("noncreature artifact with converted mana cost ").append(xValue).toString());
@@ -81,6 +84,7 @@ public class GorillaShaman1 extends CardImpl {
public GorillaShaman1(final GorillaShaman1 card) {
super(card);
+ this.originalId = card.originalId;
}
@Override
diff --git a/Mage.Sets/src/mage/sets/alliances/GorillaWarCry1.java b/Mage.Sets/src/mage/sets/alliances/GorillaWarCry1.java
new file mode 100644
index 00000000000..8ee452418b5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/GorillaWarCry1.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GorillaWarCry1 extends mage.sets.masterseditioniv.GorillaWarCry {
+
+ public GorillaWarCry1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 108;
+ this.expansionSetCode = "ALL";
+ }
+
+ public GorillaWarCry1(final GorillaWarCry1 card) {
+ super(card);
+ }
+
+ @Override
+ public GorillaWarCry1 copy() {
+ return new GorillaWarCry1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/GorillaWarCry2.java b/Mage.Sets/src/mage/sets/alliances/GorillaWarCry2.java
new file mode 100644
index 00000000000..657c2278db0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/GorillaWarCry2.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GorillaWarCry2 extends mage.sets.masterseditioniv.GorillaWarCry {
+
+ public GorillaWarCry2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 109;
+ this.expansionSetCode = "ALL";
+ }
+
+ public GorillaWarCry2(final GorillaWarCry2 card) {
+ super(card);
+ }
+
+ @Override
+ public GorillaWarCry2 copy() {
+ return new GorillaWarCry2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/InsidiousBookworms1.java b/Mage.Sets/src/mage/sets/alliances/InsidiousBookworms1.java
new file mode 100644
index 00000000000..893647e1340
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/InsidiousBookworms1.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.discard.DiscardTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.TargetPlayer;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class InsidiousBookworms1 extends CardImpl {
+
+ public InsidiousBookworms1(UUID ownerId) {
+ super(ownerId, 12, "Insidious Bookworms", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Worm");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // When Insidious Bookworms dies, you may pay {1}{B}. If you do, target player discards a card at random.
+ Ability ability = new DiesTriggeredAbility(new DoIfCostPaid(new DiscardTargetEffect(1, true), new ManaCostsImpl("{1}{B}")));
+ ability.addTarget(new TargetPlayer());
+ this.addAbility(ability);
+ }
+
+ public InsidiousBookworms1(final InsidiousBookworms1 card) {
+ super(card);
+ }
+
+ @Override
+ public InsidiousBookworms1 copy() {
+ return new InsidiousBookworms1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/InsidiousBookworms2.java b/Mage.Sets/src/mage/sets/alliances/InsidiousBookworms2.java
new file mode 100644
index 00000000000..6b8167641ec
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/InsidiousBookworms2.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class InsidiousBookworms2 extends InsidiousBookworms1 {
+
+ public InsidiousBookworms2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 13;
+ }
+
+ public InsidiousBookworms2(final InsidiousBookworms2 card) {
+ super(card);
+ }
+
+ @Override
+ public InsidiousBookworms2 copy() {
+ return new InsidiousBookworms2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/JuniperOrderAdvocate.java b/Mage.Sets/src/mage/sets/alliances/JuniperOrderAdvocate.java
new file mode 100644
index 00000000000..6faff763326
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/JuniperOrderAdvocate.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.ObjectColor;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.InvertCondition;
+import mage.abilities.condition.common.SourceTappedCondition;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.continuous.BoostAllEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class JuniperOrderAdvocate extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("green creatures you control");
+
+ static {
+ filter.add(new ColorPredicate(ObjectColor.GREEN));
+ filter.add(new ControllerPredicate(TargetController.YOU));
+ }
+
+ public JuniperOrderAdvocate(UUID ownerId) {
+ super(ownerId, 132, "Juniper Order Advocate", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{W}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Human");
+ this.subtype.add("Knight");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // As long as Juniper Order Advocate is untapped, green creatures you control get +1/+1.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(
+ new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, false),
+ new InvertCondition(new SourceTappedCondition()),
+ "As long as {this} is untapped, green creatures you control get +1/+1.")));
+ }
+
+ public JuniperOrderAdvocate(final JuniperOrderAdvocate card) {
+ super(card);
+ }
+
+ @Override
+ public JuniperOrderAdvocate copy() {
+ return new JuniperOrderAdvocate(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/KeeperOfTresserhorn.java b/Mage.Sets/src/mage/sets/alliances/KeeperOfTresserhorn.java
new file mode 100644
index 00000000000..0b4b039c706
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/KeeperOfTresserhorn.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.LoseLifeTargetEffect;
+import mage.abilities.effects.common.continuous.AssignNoCombatDamageSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class KeeperOfTresserhorn extends CardImpl {
+
+ public KeeperOfTresserhorn(UUID ownerId) {
+ super(ownerId, 14, "Keeper of Tresserhorn", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{B}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Avatar");
+ this.power = new MageInt(6);
+ this.toughness = new MageInt(6);
+
+ // Whenever Keeper of Tresserhorn attacks and isn't blocked, it assigns no combat damage this turn and defending player loses 2 life.
+ Effect effect = new AssignNoCombatDamageSourceEffect(Duration.EndOfTurn);
+ effect.setText("it assigns no combat damage this turn");
+ Ability ability = new AttacksAndIsNotBlockedTriggeredAbility(effect, false, true);
+ effect = new LoseLifeTargetEffect(2);
+ effect.setText("and defending player loses 2 life");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public KeeperOfTresserhorn(final KeeperOfTresserhorn card) {
+ super(card);
+ }
+
+ @Override
+ public KeeperOfTresserhorn copy() {
+ return new KeeperOfTresserhorn(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/LimDulsHighGuard1.java b/Mage.Sets/src/mage/sets/alliances/LimDulsHighGuard1.java
new file mode 100644
index 00000000000..6c260c65c1b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/LimDulsHighGuard1.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.RegenerateSourceEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LimDulsHighGuard1 extends CardImpl {
+
+ public LimDulsHighGuard1(UUID ownerId) {
+ super(ownerId, 17, "Lim-Dul's High Guard", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Skeleton");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // First strike
+ this.addAbility(FirstStrikeAbility.getInstance());
+ // {1}{B}: Regenerate Lim-Dul's High Guard.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{1}{B}")));
+ }
+
+ public LimDulsHighGuard1(final LimDulsHighGuard1 card) {
+ super(card);
+ }
+
+ @Override
+ public LimDulsHighGuard1 copy() {
+ return new LimDulsHighGuard1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/LimDulsHighGuard2.java b/Mage.Sets/src/mage/sets/alliances/LimDulsHighGuard2.java
new file mode 100644
index 00000000000..f3eeba47ccf
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/LimDulsHighGuard2.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LimDulsHighGuard2 extends LimDulsHighGuard1 {
+
+ public LimDulsHighGuard2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 18;
+ }
+
+ public LimDulsHighGuard2(final LimDulsHighGuard2 card) {
+ super(card);
+ }
+
+ @Override
+ public LimDulsHighGuard2 copy() {
+ return new LimDulsHighGuard2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/LimDulsPaladin.java b/Mage.Sets/src/mage/sets/alliances/LimDulsPaladin.java
new file mode 100644
index 00000000000..a534ba9793f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/LimDulsPaladin.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.common.BecomesBlockedTriggeredAbility;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.costs.common.DiscardTargetCost;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.LoseLifeTargetEffect;
+import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
+import mage.abilities.effects.common.continuous.AssignNoCombatDamageSourceEffect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetCardInHand;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LimDulsPaladin extends CardImpl {
+
+ public LimDulsPaladin(UUID ownerId) {
+ super(ownerId, 191, "Lim-Dul's Paladin", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{B}{R}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Human");
+ this.subtype.add("Knight");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(3);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // At the beginning of your upkeep, you may discard a card. If you don't, sacrifice Lim-Dul's Paladin and draw a card.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new LimDulsPaladinEffect(), TargetController.YOU, false));
+ // Whenever Lim-Dul's Paladin becomes blocked, it gets +6/+3 until end of turn.
+ this.addAbility(new BecomesBlockedTriggeredAbility(new BoostSourceEffect(6, 3, Duration.EndOfTurn), false));
+ // Whenever Lim-Dul's Paladin attacks and isn't blocked, it assigns no combat damage to defending player this turn and that player loses 4 life.
+ Effect effect = new AssignNoCombatDamageSourceEffect(Duration.EndOfTurn);
+ effect.setText("it assigns no combat damage this turn");
+ Ability ability = new AttacksAndIsNotBlockedTriggeredAbility(effect, false, true);
+ effect = new LoseLifeTargetEffect(4);
+ effect.setText("and defending player loses 4 life");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public LimDulsPaladin(final LimDulsPaladin card) {
+ super(card);
+ }
+
+ @Override
+ public LimDulsPaladin copy() {
+ return new LimDulsPaladin(this);
+ }
+}
+
+class LimDulsPaladinEffect extends SacrificeSourceUnlessPaysEffect {
+
+ public LimDulsPaladinEffect() {
+ super(new DiscardTargetCost(new TargetCardInHand()));
+ staticText = "you may discard a card. If you don't, sacrifice {this} and draw a card.";
+ }
+
+ public LimDulsPaladinEffect(final LimDulsPaladinEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public LimDulsPaladinEffect copy() {
+ return new LimDulsPaladinEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getSourceId());
+ if(permanent != null) {
+ super.apply(game, source);
+ // Not in play anymore -> was sacrificed, draw a card
+ if(game.getPermanent(source.getSourceId()) == null) {
+ return new DrawCardSourceControllerEffect(1).apply(game, source);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/LordOfTresserhorn.java b/Mage.Sets/src/mage/sets/alliances/LordOfTresserhorn.java
index 615bff39518..12dc40a8961 100644
--- a/Mage.Sets/src/mage/sets/alliances/LordOfTresserhorn.java
+++ b/Mage.Sets/src/mage/sets/alliances/LordOfTresserhorn.java
@@ -37,16 +37,13 @@ import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DrawCardTargetEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.abilities.effects.common.RegenerateSourceEffect;
-import mage.abilities.effects.common.SacrificeTargetEffect;
+import mage.abilities.effects.common.SacrificeControllerEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent;
-import mage.target.Target;
-import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetOpponent;
-import mage.target.targetpointer.SecondTargetPointer;
/**
*
@@ -65,15 +62,13 @@ public class LordOfTresserhorn extends CardImpl {
// When Lord of Tresserhorn enters the battlefield, you lose 2 life, you sacrifice two creatures, and target opponent draws two cards.
Ability ability = new EntersBattlefieldTriggeredAbility(new LoseLifeSourceControllerEffect(2), false);
- ability.addEffect(new SacrificeTargetEffect(", you sacrifice two creatures"));
- Target target = new TargetControlledCreaturePermanent(2,2, new FilterControlledCreaturePermanent(), true);
- ability.addTarget(target);
+ ability.addEffect(new SacrificeControllerEffect(new FilterControlledCreaturePermanent("creatures"), 2, "you"));
Effect effect = new DrawCardTargetEffect(2);
effect.setText(", and target opponent draws two cards");
- effect.setTargetPointer(new SecondTargetPointer());
ability.addEffect(effect);
ability.addTarget(new TargetOpponent());
this.addAbility(ability);
+
// {B}: Regenerate Lord of Tresserhorn.
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{B}")));
}
diff --git a/Mage.Sets/src/mage/sets/alliances/PhyrexianDevourer.java b/Mage.Sets/src/mage/sets/alliances/PhyrexianDevourer.java
index a7ba4876f7b..36a4e5d6da8 100644
--- a/Mage.Sets/src/mage/sets/alliances/PhyrexianDevourer.java
+++ b/Mage.Sets/src/mage/sets/alliances/PhyrexianDevourer.java
@@ -27,8 +27,6 @@
*/
package mage.sets.alliances;
-import java.util.ArrayList;
-import java.util.List;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
@@ -100,10 +98,7 @@ class PhyrexianDevourerStateTriggeredAbility extends StateTriggeredAbility {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Permanent permanent = game.getPermanent(getSourceId());
- if(permanent != null && permanent.getPower().getValue() >= 7){
- return true;
- }
- return false;
+ return permanent != null && permanent.getPower().getValue() >= 7;
}
@Override
@@ -134,9 +129,9 @@ class PhyrexianDevourerEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
Card card = null;
- for (Cost cost: source.getCosts()) {
+ for (Cost cost : source.getCosts()) {
if (cost instanceof ExileTopCardLibraryCost) {
- card = ((ExileTopCardLibraryCost)cost).getCard();
+ card = ((ExileTopCardLibraryCost) cost).getCard();
}
}
if (card != null) {
@@ -170,7 +165,7 @@ class ExileTopCardLibraryCost extends CostImpl {
if (controller != null) {
card = controller.getLibrary().getFromTop(game);
if (card != null) {
- paid = controller.moveCardToExileWithInfo(card, null, "", sourceId, game, Zone.LIBRARY, true);
+ paid = controller.moveCards(card, null, Zone.EXILED, ability, game);
}
}
return paid;
diff --git a/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast1.java b/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast1.java
index 5dad7465e1b..e91607c20c2 100644
--- a/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast1.java
+++ b/Mage.Sets/src/mage/sets/alliances/PhyrexianWarBeast1.java
@@ -33,7 +33,7 @@ import mage.abilities.Ability;
import mage.abilities.common.LeavesBattlefieldTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageControllerEffect;
-import mage.abilities.effects.common.SacrificeTargetEffect;
+import mage.abilities.effects.common.SacrificeControllerEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
@@ -54,10 +54,8 @@ public class PhyrexianWarBeast1 extends CardImpl {
this.toughness = new MageInt(4);
// When Phyrexian War Beast leaves the battlefield, sacrifice a land and Phyrexian War Beast deals 1 damage to you.
- Effect effect = new SacrificeTargetEffect();
- effect.setText("sacrifice a land");
- Ability ability = new LeavesBattlefieldTriggeredAbility(effect, false);
- effect = new DamageControllerEffect(1);
+ Ability ability = new LeavesBattlefieldTriggeredAbility(new SacrificeControllerEffect(new FilterControlledLandPermanent(), 1, ""), false);
+ Effect effect = new DamageControllerEffect(1);
effect.setText("and {this} deals 1 damage to you");
ability.addEffect(effect);
ability.addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent()));
diff --git a/Mage.Sets/src/mage/sets/alliances/Reinforcements1.java b/Mage.Sets/src/mage/sets/alliances/Reinforcements1.java
new file mode 100644
index 00000000000..7863eca7cb7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/Reinforcements1.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Reinforcements1 extends mage.sets.masterseditionii.Reinforcements {
+
+ public Reinforcements1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 142;
+ this.expansionSetCode = "ALL";
+ }
+
+ public Reinforcements1(final Reinforcements1 card) {
+ super(card);
+ }
+
+ @Override
+ public Reinforcements1 copy() {
+ return new Reinforcements1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/Reinforcements2.java b/Mage.Sets/src/mage/sets/alliances/Reinforcements2.java
new file mode 100644
index 00000000000..e9010af8794
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/Reinforcements2.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Reinforcements2 extends mage.sets.masterseditionii.Reinforcements {
+
+ public Reinforcements2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 143;
+ this.expansionSetCode = "ALL";
+ }
+
+ public Reinforcements2(final Reinforcements2 card) {
+ super(card);
+ }
+
+ @Override
+ public Reinforcements2 copy() {
+ return new Reinforcements2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/RitualOfTheMachine.java b/Mage.Sets/src/mage/sets/alliances/RitualOfTheMachine.java
new file mode 100644
index 00000000000..c9fc32a7e9f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/RitualOfTheMachine.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class RitualOfTheMachine extends mage.sets.masterseditionii.RitualOfTheMachine {
+
+ public RitualOfTheMachine(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 24;
+ this.expansionSetCode = "ALL";
+ }
+
+ public RitualOfTheMachine(final RitualOfTheMachine card) {
+ super(card);
+ }
+
+ @Override
+ public RitualOfTheMachine copy() {
+ return new RitualOfTheMachine(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/SoldeviAdnate1.java b/Mage.Sets/src/mage/sets/alliances/SoldeviAdnate1.java
new file mode 100644
index 00000000000..6dc868b548c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/SoldeviAdnate1.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.Mana;
+import mage.ObjectColor;
+import mage.abilities.Ability;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.dynamicvalue.common.SacrificeCostConvertedMana;
+import mage.abilities.mana.DynamicManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SoldeviAdnate1 extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("black or artifact creature");
+
+ static {
+ filter.add(Predicates.or(new ColorPredicate(ObjectColor.BLACK), new CardTypePredicate(CardType.ARTIFACT)));
+ }
+
+ public SoldeviAdnate1(UUID ownerId) {
+ super(ownerId, 25, "Soldevi Adnate", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Human");
+ this.subtype.add("Cleric");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // {T}, Sacrifice a black or artifact creature: Add to your mana pool an amount of {B} equal to the sacrificed creature's converted mana cost.
+ Ability ability = new DynamicManaAbility(Mana.BlackMana, new SacrificeCostConvertedMana("creature"),
+ new TapSourceCost(), "add to your mana pool an amount of {B} equal to the sacrificed creature's converted mana cost");
+ ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
+ this.addAbility(ability);
+ }
+
+ public SoldeviAdnate1(final SoldeviAdnate1 card) {
+ super(card);
+ }
+
+ @Override
+ public SoldeviAdnate1 copy() {
+ return new SoldeviAdnate1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/SoldeviAdnate2.java b/Mage.Sets/src/mage/sets/alliances/SoldeviAdnate2.java
new file mode 100644
index 00000000000..644ac231489
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/SoldeviAdnate2.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SoldeviAdnate2 extends SoldeviAdnate1 {
+
+ public SoldeviAdnate2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 26;
+ }
+
+ public SoldeviAdnate2(final SoldeviAdnate2 card) {
+ super(card);
+ }
+
+ @Override
+ public SoldeviAdnate2 copy() {
+ return new SoldeviAdnate2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/SwampMosquito1.java b/Mage.Sets/src/mage/sets/alliances/SwampMosquito1.java
new file mode 100644
index 00000000000..de42480ab1a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/SwampMosquito1.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.counter.AddPoisonCounterTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SwampMosquito1 extends CardImpl {
+
+ public SwampMosquito1(UUID ownerId) {
+ super(ownerId, 30, "Swamp Mosquito", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Insect");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(1);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // Whenever Swamp Mosquito attacks and isn't blocked, defending player gets a poison counter.
+ Effect effect = new AddPoisonCounterTargetEffect(1);
+ effect.setText("defending player gets a poison counter");
+ this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(effect, false, true));
+ }
+
+ public SwampMosquito1(final SwampMosquito1 card) {
+ super(card);
+ }
+
+ @Override
+ public SwampMosquito1 copy() {
+ return new SwampMosquito1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/SwampMosquito2.java b/Mage.Sets/src/mage/sets/alliances/SwampMosquito2.java
new file mode 100644
index 00000000000..9b44a183cb3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/SwampMosquito2.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SwampMosquito2 extends SwampMosquito1 {
+
+ public SwampMosquito2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 31;
+ }
+
+ public SwampMosquito2(final SwampMosquito2 card) {
+ super(card);
+ }
+
+ @Override
+ public SwampMosquito2 copy() {
+ return new SwampMosquito2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/ThoughtLash.java b/Mage.Sets/src/mage/sets/alliances/ThoughtLash.java
new file mode 100644
index 00000000000..6f9c9f2720c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/ThoughtLash.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author emerald000
+ */
+public class ThoughtLash extends mage.sets.masterseditionii.ThoughtLash {
+
+ public ThoughtLash(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 58;
+ this.expansionSetCode = "ALL";
+ }
+
+ public ThoughtLash(final ThoughtLash card) {
+ super(card);
+ }
+
+ @Override
+ public ThoughtLash copy() {
+ return new ThoughtLash(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/VisceridArmor1.java b/Mage.Sets/src/mage/sets/alliances/VisceridArmor1.java
new file mode 100644
index 00000000000..dbb63d09e49
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/VisceridArmor1.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class VisceridArmor1 extends mage.sets.masterseditionii.VisceridArmor {
+
+ public VisceridArmor1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 60;
+ this.expansionSetCode = "ALL";
+ }
+
+ public VisceridArmor1(final VisceridArmor1 card) {
+ super(card);
+ }
+
+ @Override
+ public VisceridArmor1 copy() {
+ return new VisceridArmor1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/VisceridArmor2.java b/Mage.Sets/src/mage/sets/alliances/VisceridArmor2.java
new file mode 100644
index 00000000000..18ce8c47e5d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/VisceridArmor2.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class VisceridArmor2 extends mage.sets.masterseditionii.VisceridArmor {
+
+ public VisceridArmor2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 61;
+ this.expansionSetCode = "ALL";
+ }
+
+ public VisceridArmor2(final VisceridArmor2 card) {
+ super(card);
+ }
+
+ @Override
+ public VisceridArmor2 copy() {
+ return new VisceridArmor2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/WanderingMage.java b/Mage.Sets/src/mage/sets/alliances/WanderingMage.java
new file mode 100644
index 00000000000..20d38dca7c9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/WanderingMage.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class WanderingMage extends mage.sets.masterseditioniii.WanderingMage {
+
+ public WanderingMage(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 198;
+ this.expansionSetCode = "ALL";
+ }
+
+ public WanderingMage(final WanderingMage card) {
+ super(card);
+ }
+
+ @Override
+ public WanderingMage copy() {
+ return new WanderingMage(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/WhipVine1.java b/Mage.Sets/src/mage/sets/alliances/WhipVine1.java
new file mode 100644
index 00000000000..f10a6da77b1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/WhipVine1.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SkipUntapOptionalAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.DontUntapAsLongAsSourceTappedEffect;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.abilities.keyword.DefenderAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.ReachAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.AbilityPredicate;
+import mage.filter.predicate.permanent.BlockedByIdPredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WhipVine1 extends CardImpl {
+
+ public WhipVine1(UUID ownerId) {
+ super(ownerId, 89, "Whip Vine", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{G}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Plant");
+ this.subtype.add("Wall");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(4);
+
+ // Defender
+ this.addAbility(DefenderAbility.getInstance());
+ // Reach
+ this.addAbility(ReachAbility.getInstance());
+ // You may choose not to untap Whip Vine during your untap step.
+ this.addAbility(new SkipUntapOptionalAbility());
+ // {tap}: Tap target creature with flying blocked by Whip Vine. That creature doesn't untap during its controller's untap step for as long as Whip Vine remains tapped.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TapTargetEffect(), new TapSourceCost());
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with flying blocked by {this}");
+ filter.add(new AbilityPredicate(FlyingAbility.class));
+ filter.add(new BlockedByIdPredicate(this.getId()));
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ ability.addEffect(new DontUntapAsLongAsSourceTappedEffect());
+ this.addAbility(ability);
+ }
+
+ public WhipVine1(final WhipVine1 card) {
+ super(card);
+ }
+
+ @Override
+ public WhipVine1 copy() {
+ return new WhipVine1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/WhipVine2.java b/Mage.Sets/src/mage/sets/alliances/WhipVine2.java
new file mode 100644
index 00000000000..33fab718470
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/WhipVine2.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WhipVine2 extends WhipVine1 {
+
+ public WhipVine2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 90;
+ }
+
+ public WhipVine2(final WhipVine2 card) {
+ super(card);
+ }
+
+ @Override
+ public WhipVine2 copy() {
+ return new WhipVine2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/WildAesthir1.java b/Mage.Sets/src/mage/sets/alliances/WildAesthir1.java
new file mode 100644
index 00000000000..7f7c7851621
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/WildAesthir1.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author nigelzor
+ */
+public class WildAesthir1 extends mage.sets.masterseditioniv.WildAesthir {
+
+ public WildAesthir1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 154;
+ this.expansionSetCode = "ALL";
+ }
+
+ public WildAesthir1(final WildAesthir1 card) {
+ super(card);
+ }
+
+ @Override
+ public WildAesthir1 copy() {
+ return new WildAesthir1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/WildAesthir2.java b/Mage.Sets/src/mage/sets/alliances/WildAesthir2.java
new file mode 100644
index 00000000000..59c160f0ccd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/WildAesthir2.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author nigelzor
+ */
+public class WildAesthir2 extends mage.sets.masterseditioniv.WildAesthir {
+
+ public WildAesthir2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 155;
+ this.expansionSetCode = "ALL";
+ }
+
+ public WildAesthir2(final WildAesthir2 card) {
+ super(card);
+ }
+
+ @Override
+ public WildAesthir2 copy() {
+ return new WildAesthir2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/YavimayaAncients1.java b/Mage.Sets/src/mage/sets/alliances/YavimayaAncients1.java
new file mode 100644
index 00000000000..c215b3b8332
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/YavimayaAncients1.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class YavimayaAncients1 extends mage.sets.masterseditionii.YavimayaAncients {
+
+ public YavimayaAncients1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 91;
+ this.expansionSetCode = "ALL";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public YavimayaAncients1(final YavimayaAncients1 card) {
+ super(card);
+ }
+
+ @Override
+ public YavimayaAncients1 copy() {
+ return new YavimayaAncients1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/YavimayaAncients2.java b/Mage.Sets/src/mage/sets/alliances/YavimayaAncients2.java
new file mode 100644
index 00000000000..a3df8b2b283
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/YavimayaAncients2.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.alliances;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class YavimayaAncients2 extends mage.sets.masterseditionii.YavimayaAncients {
+
+ public YavimayaAncients2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 92;
+ this.expansionSetCode = "ALL";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public YavimayaAncients2(final YavimayaAncients2 card) {
+ super(card);
+ }
+
+ @Override
+ public YavimayaAncients2 copy() {
+ return new YavimayaAncients2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/anthologyjacevschandra/Hostility.java b/Mage.Sets/src/mage/sets/anthologyjacevschandra/Hostility.java
new file mode 100644
index 00000000000..4769a6c8b3b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/anthologyjacevschandra/Hostility.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.anthologyjacevschandra;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Hostility extends mage.sets.jacevschandra.Hostility {
+
+ public Hostility(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 48;
+ this.expansionSetCode = "DD3D";
+ }
+
+ public Hostility(final Hostility card) {
+ super(card);
+ }
+
+ @Override
+ public Hostility copy() {
+ return new Hostility(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/anthologyjacevschandra/Ophidian.java b/Mage.Sets/src/mage/sets/anthologyjacevschandra/Ophidian.java
new file mode 100644
index 00000000000..bf513964994
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/anthologyjacevschandra/Ophidian.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.anthologyjacevschandra;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Ophidian extends mage.sets.vintagemasters.Ophidian {
+
+ public Ophidian(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 9;
+ this.expansionSetCode = "DD3D";
+ }
+
+ public Ophidian(final Ophidian card) {
+ super(card);
+ }
+
+ @Override
+ public Ophidian copy() {
+ return new Ophidian(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/ArgivianBlacksmith.java b/Mage.Sets/src/mage/sets/antiquities/ArgivianBlacksmith.java
new file mode 100644
index 00000000000..c789f94e247
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/ArgivianBlacksmith.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.PreventDamageToTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterPermanent;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.target.TargetPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ArgivianBlacksmith extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterPermanent("target artifact creature");
+
+ static {
+ filter.add(new CardTypePredicate(CardType.ARTIFACT));
+ filter.add(new CardTypePredicate(CardType.CREATURE));
+ }
+
+ public ArgivianBlacksmith(UUID ownerId) {
+ super(ownerId, 95, "Argivian Blacksmith", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}{W}");
+ this.expansionSetCode = "ATQ";
+ this.subtype.add("Human");
+ this.subtype.add("Artificer");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {tap}: Prevent the next 2 damage that would be dealt to target artifact creature this turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
+ new PreventDamageToTargetEffect(Duration.EndOfTurn, 2), new TapSourceCost());
+ ability.addTarget(new TargetPermanent(filter));
+ this.addAbility(ability);
+ }
+
+ public ArgivianBlacksmith(final ArgivianBlacksmith card) {
+ super(card);
+ }
+
+ @Override
+ public ArgivianBlacksmith copy() {
+ return new ArgivianBlacksmith(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/AshnodsBattleGear.java b/Mage.Sets/src/mage/sets/antiquities/AshnodsBattleGear.java
new file mode 100644
index 00000000000..faef4ae4a09
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/AshnodsBattleGear.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SkipUntapOptionalAbility;
+import mage.abilities.condition.common.SourceTappedCondition;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AshnodsBattleGear extends CardImpl {
+
+ public AshnodsBattleGear(UUID ownerId) {
+ super(ownerId, 4, "Ashnod's Battle Gear", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}");
+ this.expansionSetCode = "ATQ";
+
+ // You may choose not to untap Ashnod's Battle Gear during your untap step.
+ this.addAbility(new SkipUntapOptionalAbility());
+ // {2}, {tap}: Target creature you control gets +2/-2 for as long as Ashnod's Battle Gear remains tapped.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(
+ new BoostTargetEffect(2, -2, Duration.Custom), SourceTappedCondition.getInstance(),
+ "target creature you control gets +2/-2 for as long as {this} remains tapped"), new ManaCostsImpl("{2}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetControlledCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public AshnodsBattleGear(final AshnodsBattleGear card) {
+ super(card);
+ }
+
+ @Override
+ public AshnodsBattleGear copy() {
+ return new AshnodsBattleGear(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/CoralHelm.java b/Mage.Sets/src/mage/sets/antiquities/CoralHelm.java
new file mode 100644
index 00000000000..033986635c5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/CoralHelm.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author nigelzor
+ */
+public class CoralHelm extends mage.sets.masterseditioniv.CoralHelm {
+
+ public CoralHelm(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 12;
+ this.expansionSetCode = "ATQ";
+ this.rarity = Rarity.RARE;
+ }
+
+ public CoralHelm(final CoralHelm card) {
+ super(card);
+ }
+
+ @Override
+ public CoralHelm copy() {
+ return new CoralHelm(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/Crumble.java b/Mage.Sets/src/mage/sets/antiquities/Crumble.java
new file mode 100644
index 00000000000..e9ca8886e69
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/Crumble.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Crumble extends mage.sets.masterseditioniv.Crumble {
+
+ public Crumble(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 62;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public Crumble(final Crumble card) {
+ super(card);
+ }
+
+ @Override
+ public Crumble copy() {
+ return new Crumble(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/Detonate.java b/Mage.Sets/src/mage/sets/antiquities/Detonate.java
new file mode 100644
index 00000000000..532834aed00
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/Detonate.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Detonate extends mage.sets.fifthedition.Detonate {
+
+ public Detonate(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 89;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public Detonate(final Detonate card) {
+ super(card);
+ }
+
+ @Override
+ public Detonate copy() {
+ return new Detonate(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/DrafnasRestoration.java b/Mage.Sets/src/mage/sets/antiquities/DrafnasRestoration.java
new file mode 100644
index 00000000000..fc24c4ffcbb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/DrafnasRestoration.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.filter.common.FilterArtifactCard;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.stack.StackObject;
+import mage.players.Player;
+import mage.target.TargetPlayer;
+import mage.target.common.TargetCardInGraveyard;
+
+/**
+ *
+ * @author emerald000
+ */
+public class DrafnasRestoration extends CardImpl {
+
+ public DrafnasRestoration(UUID ownerId) {
+ super(ownerId, 52, "Drafna's Restoration", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{U}");
+ this.expansionSetCode = "ATQ";
+
+ // Return any number of target artifact cards from target player's graveyard to the top of his or her library in any order.
+ this.getSpellAbility().addEffect(new DrafnasRestorationEffect());
+ this.getSpellAbility().addTarget(new TargetPlayer());
+ this.getSpellAbility().addTarget(new DrafnasRestorationTarget());
+ }
+
+ public DrafnasRestoration(final DrafnasRestoration card) {
+ super(card);
+ }
+
+ @Override
+ public DrafnasRestoration copy() {
+ return new DrafnasRestoration(this);
+ }
+}
+
+class DrafnasRestorationTarget extends TargetCardInGraveyard {
+
+ DrafnasRestorationTarget() {
+ super(0, Integer.MAX_VALUE, new FilterArtifactCard("any number of artifact cards from that player's graveyard"));
+ }
+
+ DrafnasRestorationTarget(final DrafnasRestorationTarget target) {
+ super(target);
+ }
+
+ @Override
+ public boolean canTarget(UUID id, Ability source, Game game) {
+ Player targetPlayer = game.getPlayer(source.getFirstTarget());
+ return targetPlayer != null && targetPlayer.getGraveyard().contains(id) && super.canTarget(id, source, game);
+ }
+
+ @Override
+ public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
+ Set possibleTargets = new HashSet<>();
+ MageObject object = game.getObject(sourceId);
+ if (object != null && object instanceof StackObject) {
+ Player targetPlayer = game.getPlayer(((StackObject) object).getStackAbility().getFirstTarget());
+ if (targetPlayer != null) {
+ for (Card card : targetPlayer.getGraveyard().getCards(filter, sourceId, sourceControllerId, game)) {
+ if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, card.getId(), sourceId, sourceControllerId))) {
+ possibleTargets.add(card.getId());
+ }
+ }
+ }
+ }
+ return possibleTargets;
+ }
+
+ @Override
+ public DrafnasRestorationTarget copy() {
+ return new DrafnasRestorationTarget(this);
+ }
+}
+
+class DrafnasRestorationEffect extends OneShotEffect {
+
+ DrafnasRestorationEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "Return any number of target artifact cards from target player's graveyard to the top of his or her library in any order";
+ }
+
+ DrafnasRestorationEffect(final DrafnasRestorationEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public DrafnasRestorationEffect copy() {
+ return new DrafnasRestorationEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ Cards cards = new CardsImpl(source.getTargets().get(1).getTargets());
+ controller.putCardsOnTopOfLibrary(cards, game, source, true);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/DwarvenWeaponsmith.java b/Mage.Sets/src/mage/sets/antiquities/DwarvenWeaponsmith.java
new file mode 100644
index 00000000000..e6ae84b22ad
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/DwarvenWeaponsmith.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class DwarvenWeaponsmith extends mage.sets.revisededition.DwarvenWeaponsmith {
+
+ public DwarvenWeaponsmith(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 90;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public DwarvenWeaponsmith(final DwarvenWeaponsmith card) {
+ super(card);
+ }
+
+ @Override
+ public DwarvenWeaponsmith copy() {
+ return new DwarvenWeaponsmith(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/GateToPhyrexia.java b/Mage.Sets/src/mage/sets/antiquities/GateToPhyrexia.java
new file mode 100644
index 00000000000..4d902ed4b3b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/GateToPhyrexia.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.LimitedTimesPerTurnActivatedAbility;
+import mage.abilities.costs.Cost;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.PhaseStep;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.target.common.TargetArtifactPermanent;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GateToPhyrexia extends CardImpl {
+
+ public GateToPhyrexia(UUID ownerId) {
+ super(ownerId, 46, "Gate to Phyrexia", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{B}{B}");
+ this.expansionSetCode = "ATQ";
+
+ // Sacrifice a creature: Destroy target artifact. Activate this ability only during your upkeep and only once each turn.
+ Ability ability = new GateToPhyrexiaAbility(new DestroyTargetEffect(), new SacrificeTargetCost(new TargetControlledCreaturePermanent()));
+ ability.addTarget(new TargetArtifactPermanent());
+ this.addAbility(ability);
+ }
+
+ public GateToPhyrexia(final GateToPhyrexia card) {
+ super(card);
+ }
+
+ @Override
+ public GateToPhyrexia copy() {
+ return new GateToPhyrexia(this);
+ }
+}
+
+class GateToPhyrexiaAbility extends LimitedTimesPerTurnActivatedAbility {
+
+ public GateToPhyrexiaAbility(Effect effect, Cost cost) {
+ super(Zone.BATTLEFIELD, effect, cost);
+ }
+
+ public GateToPhyrexiaAbility(final GateToPhyrexiaAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public GateToPhyrexiaAbility copy() {
+ return new GateToPhyrexiaAbility(this);
+ }
+
+ @Override
+ public boolean canActivate(UUID playerId, Game game) {
+ if (!game.getActivePlayerId().equals(controllerId) || !PhaseStep.UPKEEP.equals(game.getStep().getType())) {
+ return false;
+ }
+ return super.canActivate(playerId, game);
+ }
+
+ @Override
+ public String getRule() {
+ return "Sacrifice a creature: Destroy target artifact. Activate this ability only during your upkeep and only once each turn.";
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/MishrasFactory.java b/Mage.Sets/src/mage/sets/antiquities/MishrasFactory1.java
similarity index 86%
rename from Mage.Sets/src/mage/sets/antiquities/MishrasFactory.java
rename to Mage.Sets/src/mage/sets/antiquities/MishrasFactory1.java
index 6d6b78a838e..22b9008494e 100644
--- a/Mage.Sets/src/mage/sets/antiquities/MishrasFactory.java
+++ b/Mage.Sets/src/mage/sets/antiquities/MishrasFactory1.java
@@ -1,52 +1,52 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets.antiquities;
-
-import java.util.UUID;
-
-/**
- *
- * @author North
- */
-public class MishrasFactory extends mage.sets.elspethvstezzeret.MishrasFactory {
-
- public MishrasFactory(UUID ownerId) {
- super(ownerId);
- this.cardNumber = 66;
- this.expansionSetCode = "ATQ";
- }
-
- public MishrasFactory(final MishrasFactory card) {
- super(card);
- }
-
- @Override
- public MishrasFactory copy() {
- return new MishrasFactory(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author North
+ */
+public class MishrasFactory1 extends mage.sets.elspethvstezzeret.MishrasFactory {
+
+ public MishrasFactory1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 66;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public MishrasFactory1(final MishrasFactory1 card) {
+ super(card);
+ }
+
+ @Override
+ public MishrasFactory1 copy() {
+ return new MishrasFactory1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/MishrasFactory2.java b/Mage.Sets/src/mage/sets/antiquities/MishrasFactory2.java
new file mode 100644
index 00000000000..9458ff624d1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/MishrasFactory2.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author North
+ */
+public class MishrasFactory2 extends mage.sets.elspethvstezzeret.MishrasFactory {
+
+ public MishrasFactory2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 67;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public MishrasFactory2(final MishrasFactory2 card) {
+ super(card);
+ }
+
+ @Override
+ public MishrasFactory2 copy() {
+ return new MishrasFactory2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/MishrasFactory3.java b/Mage.Sets/src/mage/sets/antiquities/MishrasFactory3.java
new file mode 100644
index 00000000000..b16a376ccc6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/MishrasFactory3.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author North
+ */
+public class MishrasFactory3 extends mage.sets.elspethvstezzeret.MishrasFactory {
+
+ public MishrasFactory3(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 68;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public MishrasFactory3(final MishrasFactory3 card) {
+ super(card);
+ }
+
+ @Override
+ public MishrasFactory3 copy() {
+ return new MishrasFactory3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/MishrasFactory4.java b/Mage.Sets/src/mage/sets/antiquities/MishrasFactory4.java
new file mode 100644
index 00000000000..231cc38ca58
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/MishrasFactory4.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author North
+ */
+public class MishrasFactory4 extends mage.sets.elspethvstezzeret.MishrasFactory {
+
+ public MishrasFactory4(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 69;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public MishrasFactory4(final MishrasFactory4 card) {
+ super(card);
+ }
+
+ @Override
+ public MishrasFactory4 copy() {
+ return new MishrasFactory4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/OrcishMechanics.java b/Mage.Sets/src/mage/sets/antiquities/OrcishMechanics.java
new file mode 100644
index 00000000000..652a31eb97a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/OrcishMechanics.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledArtifactPermanent;
+import mage.target.common.TargetControlledPermanent;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class OrcishMechanics extends CardImpl {
+
+ public OrcishMechanics(UUID ownerId) {
+ super(ownerId, 92, "Orcish Mechanics", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}");
+ this.expansionSetCode = "ATQ";
+ this.subtype.add("Orc");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {tap}, Sacrifice an artifact: Orcish Mechanics deals 2 damage to target creature or player.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new TapSourceCost());
+ ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent("an artifact"))));
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public OrcishMechanics(final OrcishMechanics card) {
+ super(card);
+ }
+
+ @Override
+ public OrcishMechanics copy() {
+ return new OrcishMechanics(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/PhyrexianGremlins.java b/Mage.Sets/src/mage/sets/antiquities/PhyrexianGremlins.java
new file mode 100644
index 00000000000..884198052d5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/PhyrexianGremlins.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SkipUntapOptionalAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.DontUntapAsLongAsSourceTappedEffect;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetArtifactPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class PhyrexianGremlins extends CardImpl {
+
+ public PhyrexianGremlins(UUID ownerId) {
+ super(ownerId, 48, "Phyrexian Gremlins", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}");
+ this.expansionSetCode = "ATQ";
+ this.subtype.add("Gremlin");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // You may choose not to untap Phyrexian Gremlins during your untap step.
+ this.addAbility(new SkipUntapOptionalAbility());
+ // {tap}: Tap target artifact. It doesn't untap during its controller's untap step for as long as Phyrexian Gremlins remains tapped.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TapTargetEffect(), new TapSourceCost());
+ ability.addTarget(new TargetArtifactPermanent());
+ ability.addEffect(new DontUntapAsLongAsSourceTappedEffect());
+ this.addAbility(ability);
+ }
+
+ public PhyrexianGremlins(final PhyrexianGremlins card) {
+ super(card);
+ }
+
+ @Override
+ public PhyrexianGremlins copy() {
+ return new PhyrexianGremlins(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/PowerArtifact.java b/Mage.Sets/src/mage/sets/antiquities/PowerArtifact.java
index 64ac7fd00bf..b36596b5cbe 100644
--- a/Mage.Sets/src/mage/sets/antiquities/PowerArtifact.java
+++ b/Mage.Sets/src/mage/sets/antiquities/PowerArtifact.java
@@ -8,6 +8,7 @@ package mage.sets.antiquities;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability;
+import mage.abilities.ActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
@@ -32,48 +33,46 @@ import mage.util.CardUtil;
* @author nick.myers
*/
public class PowerArtifact extends CardImpl {
-
+
public PowerArtifact(UUID ownerId) {
super(ownerId, 55, "Power Artifact", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{U}{U}");
this.expansionSetCode = "ATQ";
this.subtype.add("Aura");
-
+
// Enchant artifact
TargetPermanent auraTarget = new TargetArtifactPermanent();
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.Benefit));
Ability ability = new EnchantAbility(auraTarget.getTargetName());
this.addAbility(ability);
-
- // The activation cost of target artifact is reduced by {2}. If this would reduce target
- // artifact's activation cost below {1}, target artifact's activation cost becomes {1}.
- // Power Artifact has no effect on artifacts that have no activation cost or whose activation
- // cost is {0}.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PowerArtifactCostModificationEffect()));
+
+ // Enchanted artifact's activated abilities cost less to activate.
+ // This effect can't reduce the amount of mana an ability costs to activate to less than one mana.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PowerArtifactCostModificationEffect()));
}
-
+
public PowerArtifact(final PowerArtifact card) {
super(card);
}
-
+
@Override
public PowerArtifact copy() {
return new PowerArtifact(this);
- }
+ }
}
class PowerArtifactCostModificationEffect extends CostModificationEffectImpl {
-
+
PowerArtifactCostModificationEffect() {
super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST);
staticText = "The activation cost of target artifact is reduced by {2}. If this would reduce target artifact's activation cost below {1}, target artifact's activation cost becomes {1}. Power artifact has no effect on artifacts that have no activation cost or whose activation cost is {0}.";
-
+
}
-
+
PowerArtifactCostModificationEffect(PowerArtifactCostModificationEffect effect) {
super(effect);
}
-
+
@Override
public boolean apply(Game game, Ability source, Ability abilityToModify) {
Player controller = game.getPlayer(abilityToModify.getControllerId());
@@ -90,21 +89,22 @@ class PowerArtifactCostModificationEffect extends CostModificationEffectImpl {
}
return true;
}
-
+
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
Permanent artifact = game.getPermanent(abilityToModify.getSourceId());
if (artifact != null && artifact.getAttachments().contains(source.getSourceId())) {
- if (abilityToModify.getAbilityType().equals(AbilityType.ACTIVATED)) {
+ if (abilityToModify.getAbilityType().equals(AbilityType.ACTIVATED)
+ || (abilityToModify.getAbilityType().equals(AbilityType.MANA) && (abilityToModify instanceof ActivatedAbility))) {
return true;
}
}
return false;
}
-
- @Override
+
+ @Override
public PowerArtifactCostModificationEffect copy() {
return new PowerArtifactCostModificationEffect(this);
}
-
+
}
diff --git a/Mage.Sets/src/mage/sets/antiquities/PriestOfYawgmoth.java b/Mage.Sets/src/mage/sets/antiquities/PriestOfYawgmoth.java
new file mode 100644
index 00000000000..e648e0db971
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/PriestOfYawgmoth.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.Mana;
+import mage.abilities.Ability;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.dynamicvalue.common.SacrificeCostConvertedMana;
+import mage.abilities.mana.DynamicManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledArtifactPermanent;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class PriestOfYawgmoth extends CardImpl {
+
+ public PriestOfYawgmoth(UUID ownerId) {
+ super(ownerId, 49, "Priest of Yawgmoth", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
+ this.expansionSetCode = "ATQ";
+ this.subtype.add("Human");
+ this.subtype.add("Cleric");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // {T}, Sacrifice an artifact: Add to your mana pool an amount of {B} equal to the sacrificed artifact's converted mana cost.
+ Ability ability = new DynamicManaAbility(Mana.BlackMana, new SacrificeCostConvertedMana("artifact"),
+ new TapSourceCost(), "add to your mana pool an amount of {B} equal to the sacrificed artifact's converted mana cost");
+ ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent())));
+ this.addAbility(ability);
+ }
+
+ public PriestOfYawgmoth(final PriestOfYawgmoth card) {
+ super(card);
+ }
+
+ @Override
+ public PriestOfYawgmoth copy() {
+ return new PriestOfYawgmoth(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/StripMine.java b/Mage.Sets/src/mage/sets/antiquities/StripMine1.java
similarity index 87%
rename from Mage.Sets/src/mage/sets/antiquities/StripMine.java
rename to Mage.Sets/src/mage/sets/antiquities/StripMine1.java
index 3c782223293..c79ee940f21 100644
--- a/Mage.Sets/src/mage/sets/antiquities/StripMine.java
+++ b/Mage.Sets/src/mage/sets/antiquities/StripMine1.java
@@ -1,52 +1,52 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets.antiquities;
-
-import java.util.UUID;
-
-/**
- *
- * @author jeffwadsworth
- */
-public class StripMine extends mage.sets.fourthedition.StripMine {
-
- public StripMine(UUID ownerId) {
- super(ownerId);
- this.cardNumber = 71;
- this.expansionSetCode = "ATQ";
- }
-
- public StripMine(final StripMine card) {
- super(card);
- }
-
- @Override
- public StripMine copy() {
- return new StripMine(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class StripMine1 extends mage.sets.fourthedition.StripMine {
+
+ public StripMine1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 71;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public StripMine1(final StripMine1 card) {
+ super(card);
+ }
+
+ @Override
+ public StripMine1 copy() {
+ return new StripMine1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/StripMine2.java b/Mage.Sets/src/mage/sets/antiquities/StripMine2.java
new file mode 100644
index 00000000000..5c21b154770
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/StripMine2.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class StripMine2 extends mage.sets.fourthedition.StripMine {
+
+ public StripMine2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 72;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public StripMine2(final StripMine2 card) {
+ super(card);
+ }
+
+ @Override
+ public StripMine2 copy() {
+ return new StripMine2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/StripMine3.java b/Mage.Sets/src/mage/sets/antiquities/StripMine3.java
new file mode 100644
index 00000000000..f88759c681b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/StripMine3.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class StripMine3 extends mage.sets.fourthedition.StripMine {
+
+ public StripMine3(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 73;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public StripMine3(final StripMine3 card) {
+ super(card);
+ }
+
+ @Override
+ public StripMine3 copy() {
+ return new StripMine3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/StripMine4.java b/Mage.Sets/src/mage/sets/antiquities/StripMine4.java
new file mode 100644
index 00000000000..86e04cbcc99
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/StripMine4.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class StripMine4 extends mage.sets.fourthedition.StripMine {
+
+ public StripMine4(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 74;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public StripMine4(final StripMine4 card) {
+ super(card);
+ }
+
+ @Override
+ public StripMine4 copy() {
+ return new StripMine4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/TawnossWeaponry.java b/Mage.Sets/src/mage/sets/antiquities/TawnossWeaponry.java
new file mode 100644
index 00000000000..153f22154a2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/TawnossWeaponry.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TawnossWeaponry extends mage.sets.fifthedition.TawnossWeaponry {
+
+ public TawnossWeaponry(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 35;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public TawnossWeaponry(final TawnossWeaponry card) {
+ super(card);
+ }
+
+ @Override
+ public TawnossWeaponry copy() {
+ return new TawnossWeaponry(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/TransmuteArtifact.java b/Mage.Sets/src/mage/sets/antiquities/TransmuteArtifact.java
index d0b6d85fde4..7a12056f9a8 100644
--- a/Mage.Sets/src/mage/sets/antiquities/TransmuteArtifact.java
+++ b/Mage.Sets/src/mage/sets/antiquities/TransmuteArtifact.java
@@ -27,7 +27,6 @@
*/
package mage.sets.antiquities;
-import java.util.List;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.costs.mana.GenericManaCost;
@@ -43,7 +42,6 @@ import mage.filter.common.FilterControlledArtifactPermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
-import mage.target.common.TargetArtifactPermanent;
import mage.target.common.TargetCardInLibrary;
import mage.target.common.TargetControlledPermanent;
@@ -57,7 +55,6 @@ public class TransmuteArtifact extends CardImpl {
super(ownerId, 58, "Transmute Artifact", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{U}{U}");
this.expansionSetCode = "ATQ";
-
// Sacrifice an artifact. If you do, search your library for an artifact card. If that card's converted mana cost is less than or equal to the sacrificed artifact's converted mana cost, put it onto the battlefield. If it's greater, you may pay {X}, where X is the difference. If you do, put it onto the battlefield. If you don't, put it into its owner's graveyard. Then shuffle your library.
this.getSpellAbility().addEffect(new TransmuteArtifactEffect());
}
@@ -74,7 +71,6 @@ public class TransmuteArtifact extends CardImpl {
class TransmuteArtifactEffect extends SearchEffect {
-
public TransmuteArtifactEffect() {
super(new TargetCardInLibrary(new FilterArtifactCard()), Outcome.PutCardInPlay);
staticText = "Sacrifice an artifact. If you do, search your library for an artifact card. If that card's converted mana cost is less than or equal to the sacrificed artifact's converted mana cost, put it onto the battlefield. If it's greater, you may pay {X}, where X is the difference. If you do, put it onto the battlefield. If you don't, put it into its owner's graveyard. Then shuffle your library";
@@ -95,41 +91,36 @@ class TransmuteArtifactEffect extends SearchEffect {
if (controller == null) {
return false;
}
- //Sacrifice an artifact.
+ //Sacrifice an artifact.
int convertedManaCost = 0;
boolean sacrifice = false;
TargetControlledPermanent targetArtifact = new TargetControlledPermanent(new FilterControlledArtifactPermanent());
- if(controller.chooseTarget(Outcome.Sacrifice, targetArtifact, source, game)){
+ if (controller.chooseTarget(Outcome.Sacrifice, targetArtifact, source, game)) {
Permanent permanent = game.getPermanent(targetArtifact.getFirstTarget());
- if(permanent != null){
+ if (permanent != null) {
convertedManaCost = permanent.getManaCost().convertedManaCost();
sacrifice = permanent.sacrifice(source.getSourceId(), game);
}
- }
- else
- {
+ } else {
return true;
}
- //If you do, search your library for an artifact card.
+ //If you do, search your library for an artifact card.
if (sacrifice && controller.searchLibrary(target, game)) {
if (target.getTargets().size() > 0) {
- for (UUID cardId: target.getTargets()) {
+ for (UUID cardId : target.getTargets()) {
Card card = controller.getLibrary().getCard(cardId, game);
if (card != null) {
- //If that card's converted mana cost is less than or equal to the sacrificed artifact's converted mana cost, put it onto the battlefield.
- if(card.getManaCost().convertedManaCost() <= convertedManaCost){
- controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId());
- }
- else
- {
- //If it's greater, you may pay {X}, where X is the difference. If you do, put it onto the battlefield.
+ //If that card's converted mana cost is less than or equal to the sacrificed artifact's converted mana cost, put it onto the battlefield.
+ if (card.getManaCost().convertedManaCost() <= convertedManaCost) {
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game);
+ } else {
+ //If it's greater, you may pay {X}, where X is the difference. If you do, put it onto the battlefield.
GenericManaCost cost = new GenericManaCost(card.getManaCost().convertedManaCost() - convertedManaCost);
- if(cost.pay(source, game, source.getSourceId(), source.getControllerId(), false)){
- controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId());
- }
- else{
+ if (cost.pay(source, game, source.getSourceId(), source.getControllerId(), false)) {
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game);
+ } else {
//If you don't, put it into its owner's graveyard. Then shuffle your library
- controller.moveCards(card, Zone.LIBRARY, Zone.GRAVEYARD, source, game);
+ controller.moveCards(card, Zone.GRAVEYARD, source, game);
}
}
}
@@ -142,5 +133,4 @@ class TransmuteArtifactEffect extends SearchEffect {
return false;
}
-
}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasMine1.java b/Mage.Sets/src/mage/sets/antiquities/UrzasMine1.java
new file mode 100644
index 00000000000..fc87a23f361
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/UrzasMine1.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class UrzasMine1 extends mage.sets.fifthedition.UrzasMine {
+
+ public UrzasMine1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 75;
+ this.expansionSetCode = "ATQ";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public UrzasMine1(final UrzasMine1 card) {
+ super(card);
+ }
+
+ @Override
+ public UrzasMine1 copy() {
+ return new UrzasMine1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasMine2.java b/Mage.Sets/src/mage/sets/antiquities/UrzasMine2.java
new file mode 100644
index 00000000000..d57c1ea7d7e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/UrzasMine2.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class UrzasMine2 extends mage.sets.fifthedition.UrzasMine {
+
+ public UrzasMine2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 76;
+ this.expansionSetCode = "ATQ";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public UrzasMine2(final UrzasMine2 card) {
+ super(card);
+ }
+
+ @Override
+ public UrzasMine2 copy() {
+ return new UrzasMine2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasMine3.java b/Mage.Sets/src/mage/sets/antiquities/UrzasMine3.java
new file mode 100644
index 00000000000..73e045a5ae7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/UrzasMine3.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class UrzasMine3 extends mage.sets.fifthedition.UrzasMine {
+
+ public UrzasMine3(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 77;
+ this.expansionSetCode = "ATQ";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public UrzasMine3(final UrzasMine3 card) {
+ super(card);
+ }
+
+ @Override
+ public UrzasMine3 copy() {
+ return new UrzasMine3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasMine4.java b/Mage.Sets/src/mage/sets/antiquities/UrzasMine4.java
new file mode 100644
index 00000000000..024ab021ba6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/UrzasMine4.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class UrzasMine4 extends mage.sets.fifthedition.UrzasMine {
+
+ public UrzasMine4(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 78;
+ this.expansionSetCode = "ATQ";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public UrzasMine4(final UrzasMine4 card) {
+ super(card);
+ }
+
+ @Override
+ public UrzasMine4 copy() {
+ return new UrzasMine4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant1.java b/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant1.java
new file mode 100644
index 00000000000..d829ecee1fb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant1.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class UrzasPowerPlant1 extends mage.sets.fifthedition.UrzasPowerPlant {
+
+ public UrzasPowerPlant1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 79;
+ this.expansionSetCode = "ATQ";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public UrzasPowerPlant1(final UrzasPowerPlant1 card) {
+ super(card);
+ }
+
+ @Override
+ public UrzasPowerPlant1 copy() {
+ return new UrzasPowerPlant1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant2.java b/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant2.java
new file mode 100644
index 00000000000..db3047ee783
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant2.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class UrzasPowerPlant2 extends mage.sets.fifthedition.UrzasPowerPlant {
+
+ public UrzasPowerPlant2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 80;
+ this.expansionSetCode = "ATQ";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public UrzasPowerPlant2(final UrzasPowerPlant2 card) {
+ super(card);
+ }
+
+ @Override
+ public UrzasPowerPlant2 copy() {
+ return new UrzasPowerPlant2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant3.java b/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant3.java
new file mode 100644
index 00000000000..03a017e941b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant3.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class UrzasPowerPlant3 extends mage.sets.fifthedition.UrzasPowerPlant {
+
+ public UrzasPowerPlant3(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 81;
+ this.expansionSetCode = "ATQ";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public UrzasPowerPlant3(final UrzasPowerPlant3 card) {
+ super(card);
+ }
+
+ @Override
+ public UrzasPowerPlant3 copy() {
+ return new UrzasPowerPlant3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant4.java b/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant4.java
new file mode 100644
index 00000000000..35ab56cf636
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant4.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class UrzasPowerPlant4 extends mage.sets.fifthedition.UrzasPowerPlant {
+
+ public UrzasPowerPlant4(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 82;
+ this.expansionSetCode = "ATQ";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public UrzasPowerPlant4(final UrzasPowerPlant4 card) {
+ super(card);
+ }
+
+ @Override
+ public UrzasPowerPlant4 copy() {
+ return new UrzasPowerPlant4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasTower1.java b/Mage.Sets/src/mage/sets/antiquities/UrzasTower1.java
new file mode 100644
index 00000000000..9164d8a9ebc
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/UrzasTower1.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class UrzasTower1 extends mage.sets.fifthedition.UrzasTower {
+
+ public UrzasTower1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 83;
+ this.expansionSetCode = "ATQ";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public UrzasTower1(final UrzasTower1 card) {
+ super(card);
+ }
+
+ @Override
+ public UrzasTower1 copy() {
+ return new UrzasTower1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasTower2.java b/Mage.Sets/src/mage/sets/antiquities/UrzasTower2.java
new file mode 100644
index 00000000000..78554254747
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/UrzasTower2.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class UrzasTower2 extends mage.sets.fifthedition.UrzasTower {
+
+ public UrzasTower2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 84;
+ this.expansionSetCode = "ATQ";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public UrzasTower2(final UrzasTower2 card) {
+ super(card);
+ }
+
+ @Override
+ public UrzasTower2 copy() {
+ return new UrzasTower2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasTower3.java b/Mage.Sets/src/mage/sets/antiquities/UrzasTower3.java
new file mode 100644
index 00000000000..6df76eb4e6c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/UrzasTower3.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class UrzasTower3 extends mage.sets.fifthedition.UrzasTower {
+
+ public UrzasTower3(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 85;
+ this.expansionSetCode = "ATQ";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public UrzasTower3(final UrzasTower3 card) {
+ super(card);
+ }
+
+ @Override
+ public UrzasTower3 copy() {
+ return new UrzasTower3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasTower4.java b/Mage.Sets/src/mage/sets/antiquities/UrzasTower4.java
new file mode 100644
index 00000000000..9c7633bcc0e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/UrzasTower4.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.antiquities;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class UrzasTower4 extends mage.sets.fifthedition.UrzasTower {
+
+ public UrzasTower4(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 86;
+ this.expansionSetCode = "ATQ";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public UrzasTower4(final UrzasTower4 card) {
+ super(card);
+ }
+
+ @Override
+ public UrzasTower4 copy() {
+ return new UrzasTower4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/apocalypse/Anavolver.java b/Mage.Sets/src/mage/sets/apocalypse/Anavolver.java
index 0452fbb018e..a746e9877c9 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/Anavolver.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/Anavolver.java
@@ -68,14 +68,14 @@ public class Anavolver extends CardImpl {
// If Anavolver was kicked with its {1}{U} kicker, it enters the battlefield with two +1/+1 counters on it and with flying.
EntersBattlefieldAbility ability1 = new EntersBattlefieldAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance(2),false),
- new KickedCostCondition("{1}{U}"), true, "If {this} was kicked with its {1}{U} kicker, it enters the battlefield with two +1/+1 counters on it and with flying.",
+ new KickedCostCondition("{1}{U}"), "If {this} was kicked with its {1}{U} kicker, it enters the battlefield with two +1/+1 counters on it and with flying.",
"{this} enters the battlefield with two +1/+1 counters on it and with flying");
((EntersBattlefieldEffect)ability1.getEffects().get(0)).addEffect(new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.WhileOnBattlefield));
this.addAbility(ability1);
// If Anavolver was kicked with its {B} kicker, it enters the battlefield with a +1/+1 counter on it and with "Pay 3 life: Regenerate Anavolver."
EntersBattlefieldAbility ability2 = new EntersBattlefieldAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance(1),false), new KickedCostCondition("{B}"), true,
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance(1),false), new KickedCostCondition("{B}"),
"If {this} was kicked with its {B} kicker, it enters the battlefield with a +1/+1 counter on it and with \"Pay 3 life: Regenerate Anavolver.\"",
"{this} enters the battlefield with a +1/+1 counter on it and with \"Pay 3 life: Regenerate Anavolver.\"");
((EntersBattlefieldEffect)ability2.getEffects().get(0)).addEffect(new GainAbilitySourceEffect(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new PayLifeCost(3)), Duration.WhileOnBattlefield));
diff --git a/Mage.Sets/src/mage/sets/apocalypse/BogGnarr.java b/Mage.Sets/src/mage/sets/apocalypse/BogGnarr.java
index efc75cfd615..560c89d024e 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/BogGnarr.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/BogGnarr.java
@@ -31,25 +31,26 @@ package mage.sets.apocalypse;
import java.util.UUID;
import mage.MageInt;
import mage.ObjectColor;
-import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.SpellCastAllTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
-import mage.constants.Zone;
-import mage.filter.FilterCard;
+import mage.filter.FilterSpell;
import mage.filter.predicate.mageobject.ColorPredicate;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.events.GameEvent.EventType;
-import mage.game.stack.Spell;
/**
* @author Loki
*/
public class BogGnarr extends CardImpl {
+ private static final FilterSpell filter = new FilterSpell("a black spell");
+
+ static {
+ filter.add(new ColorPredicate(ObjectColor.BLACK));
+ }
+
public BogGnarr(UUID ownerId) {
super(ownerId, 76, "Bog Gnarr", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{G}");
this.expansionSetCode = "APC";
@@ -57,7 +58,9 @@ public class BogGnarr extends CardImpl {
this.power = new MageInt(2);
this.toughness = new MageInt(2);
- this.addAbility(new BogGnarrTriggeredAbility());
+
+ // Whenever a player casts a black spell, Bog Gnarr gets +2/+2 until end of turn.
+ this.addAbility(new SpellCastAllTriggeredAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), filter, false));
}
public BogGnarr(final BogGnarr card) {
@@ -68,43 +71,4 @@ public class BogGnarr extends CardImpl {
public BogGnarr copy() {
return new BogGnarr(this);
}
-
}
-
-class BogGnarrTriggeredAbility extends TriggeredAbilityImpl {
-
- private static final FilterCard filter = new FilterCard("a black spell");
-
- static {
- filter.add(new ColorPredicate(ObjectColor.BLACK));
- }
-
- public BogGnarrTriggeredAbility() {
- super(Zone.BATTLEFIELD, new BoostSourceEffect(2, 2, Duration.EndOfTurn), false);
- }
-
- public BogGnarrTriggeredAbility(final BogGnarrTriggeredAbility ability) {
- super(ability);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == EventType.SPELL_CAST;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- Spell spell = game.getStack().getSpell(event.getTargetId());
- return spell != null && filter.match(spell, game);
- }
-
- @Override
- public String getRule() {
- return "Whenever a player casts " + filter.getMessage() + ", " + super.getRule();
- }
-
- @Override
- public BogGnarrTriggeredAbility copy() {
- return new BogGnarrTriggeredAbility(this);
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/apocalypse/Cetavolver.java b/Mage.Sets/src/mage/sets/apocalypse/Cetavolver.java
index 8a040de3b0d..16029793e73 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/Cetavolver.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/Cetavolver.java
@@ -65,14 +65,14 @@ public class Cetavolver extends CardImpl {
// If Cetavolver was kicked with its {1}{R} kicker, it enters the battlefield with two +1/+1 counters on it and with first strike.
EntersBattlefieldAbility ability1 = new EntersBattlefieldAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance(2),false),
- new KickedCostCondition("{1}{R}"), true, "If Cetavolver was kicked with its {1}{R} kicker, it enters the battlefield with two +1/+1 counters on it and with first strike.",
+ new KickedCostCondition("{1}{R}"), "If Cetavolver was kicked with its {1}{R} kicker, it enters the battlefield with two +1/+1 counters on it and with first strike.",
"{this} enters the battlefield with two +1/+1 counters on it and with first strike");
((EntersBattlefieldEffect)ability1.getEffects().get(0)).addEffect(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield));
this.addAbility(ability1);
// If Cetavolver was kicked with its {G} kicker, it enters the battlefield with a +1/+1 counter on it and with trample.
EntersBattlefieldAbility ability2 = new EntersBattlefieldAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance(1),false), new KickedCostCondition("{G}"), true,
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance(1),false), new KickedCostCondition("{G}"),
"If Cetavolver was kicked with its {G} kicker, it enters the battlefield with a +1/+1 counter on it and with trample.",
"{this} enters the battlefield with a +1/+1 counter on it and with trample");
((EntersBattlefieldEffect)ability2.getEffects().get(0)).addEffect(new GainAbilitySourceEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield));
diff --git a/Mage.Sets/src/mage/sets/apocalypse/Degavolver.java b/Mage.Sets/src/mage/sets/apocalypse/Degavolver.java
index 87577042db5..c0b557454ac 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/Degavolver.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/Degavolver.java
@@ -69,14 +69,14 @@ public class Degavolver extends CardImpl {
// If Degavolver was kicked with its {1}{B} kicker, it enters the battlefield with two +1/+1 counters on it and with "Pay 3 life: Regenerate Degavolver."
EntersBattlefieldAbility ability1 = new EntersBattlefieldAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance(2),false),
- new KickedCostCondition("{1}{B}"), true, "If Degavolver was kicked with its {1}{B} kicker, it enters the battlefield with two +1/+1 counters on it and with \"Pay 3 life: Regenerate Degavolver.\"",
+ new KickedCostCondition("{1}{B}"), "If Degavolver was kicked with its {1}{B} kicker, it enters the battlefield with two +1/+1 counters on it and with \"Pay 3 life: Regenerate Degavolver.\"",
"{this} enters the battlefield with two +1/+1 counters on it and with \"Pay 3 life: Regenerate Degavolver.\"");
((EntersBattlefieldEffect)ability1.getEffects().get(0)).addEffect(new GainAbilitySourceEffect(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new PayLifeCost(3)), Duration.WhileOnBattlefield));
this.addAbility(ability1);
// If Degavolver was kicked with its {R} kicker, it enters the battlefield with a +1/+1 counter on it and with first strike.
EntersBattlefieldAbility ability2 = new EntersBattlefieldAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance(1),false), new KickedCostCondition("{R}"), true,
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance(1),false), new KickedCostCondition("{R}"),
"If Degavolver was kicked with its {R} kicker, it enters the battlefield with a +1/+1 counter on it and with first strike.",
"{this} enters the battlefield with a +1/+1 counter on it and with first strike");
((EntersBattlefieldEffect)ability2.getEffects().get(0)).addEffect(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield));
diff --git a/Mage.Sets/src/mage/sets/apocalypse/DesolationAngel.java b/Mage.Sets/src/mage/sets/apocalypse/DesolationAngel.java
index 4c32f5136e9..be3613ad5a8 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/DesolationAngel.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/DesolationAngel.java
@@ -25,31 +25,35 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.apocalypse;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
import mage.MageInt;
-import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.DestroyAllEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.KickerAbility;
-import mage.cards.Card;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
import mage.filter.common.FilterLandPermanent;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
/**
* @author Loki
*/
public class DesolationAngel extends CardImpl {
+ private static final FilterLandPermanent filter = new FilterLandPermanent("lands");
+ private static final FilterLandPermanent filter2 = new FilterLandPermanent("lands you control");
+
+ static {
+ filter2.add(new ControllerPredicate(TargetController.YOU));
+ }
+
public DesolationAngel(UUID ownerId) {
super(ownerId, 38, "Desolation Angel", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
this.expansionSetCode = "APC";
@@ -65,7 +69,8 @@ public class DesolationAngel extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// When Desolation Angel enters the battlefield, destroy all lands you control. If it was kicked, destroy all lands instead.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new DesolationAngelEntersBattlefieldEffect()));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new ConditionalOneShotEffect(new DestroyAllEffect(filter),
+ new DestroyAllEffect(filter2), KickedCondition.getInstance(), "destroy all lands you control. If it was kicked, destroy all lands instead.")));
}
public DesolationAngel(final DesolationAngel card) {
@@ -77,33 +82,3 @@ public class DesolationAngel extends CardImpl {
return new DesolationAngel(this);
}
}
-
-class DesolationAngelEntersBattlefieldEffect extends OneShotEffect {
- DesolationAngelEntersBattlefieldEffect() {
- super(Outcome.DestroyPermanent);
- staticText = "destroy all lands you control. If it was kicked, destroy all lands instead";
- }
-
- DesolationAngelEntersBattlefieldEffect(final DesolationAngelEntersBattlefieldEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Card p = game.getCard(source.getSourceId());
- boolean kicked = KickedCondition.getInstance().apply(game, source);
- for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterLandPermanent(), source.getControllerId(), source.getSourceId(), game)) {
- if ((!kicked && permanent.getControllerId() == source.getControllerId())
- || kicked) {
- permanent.destroy(source.getSourceId(), game, false);
- }
- }
- return true;
- }
-
- @Override
- public DesolationAngelEntersBattlefieldEffect copy() {
- return new DesolationAngelEntersBattlefieldEffect(this);
- }
-
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/apocalypse/DwarvenLandslide.java b/Mage.Sets/src/mage/sets/apocalypse/DwarvenLandslide.java
index 4edae4f5649..65b47b76d27 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/DwarvenLandslide.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/DwarvenLandslide.java
@@ -29,6 +29,7 @@ package mage.sets.apocalypse;
import java.util.UUID;
import mage.abilities.Ability;
+import mage.abilities.SpellAbility;
import mage.abilities.condition.common.KickedCondition;
import mage.abilities.costs.Cost;
import mage.abilities.costs.Costs;
@@ -41,6 +42,7 @@ import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.filter.common.FilterControlledLandPermanent;
+import mage.filter.common.FilterLandPermanent;
import mage.game.Game;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetLandPermanent;
@@ -62,6 +64,7 @@ public class DwarvenLandslide extends CardImpl {
this.addAbility(new KickerAbility(kickerCosts));
// Destroy target land. If Dwarven Landslide was kicked, destroy another target land.
getSpellAbility().addEffect(new DestroyTargetEffect("Destroy target land. If {this} was kicked, destroy another target land"));
+ getSpellAbility().addTarget(new TargetLandPermanent());
}
public DwarvenLandslide(final DwarvenLandslide card) {
@@ -70,7 +73,11 @@ public class DwarvenLandslide extends CardImpl {
@Override
public void adjustTargets(Ability ability, Game game) {
- ability.addTarget(new TargetLandPermanent(KickedCondition.getInstance().apply(game, ability) ? 2 : 1));
+ if (ability instanceof SpellAbility) {
+ if (KickedCondition.getInstance().apply(game, ability)) {
+ getSpellAbility().addTarget(new TargetLandPermanent(new FilterLandPermanent("land (Kicker)")));
+ }
+ }
}
@Override
diff --git a/Mage.Sets/src/mage/sets/apocalypse/FungalShambler.java b/Mage.Sets/src/mage/sets/apocalypse/FungalShambler.java
index 385de243c2c..b9f0b5e9ec4 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/FungalShambler.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/FungalShambler.java
@@ -58,7 +58,7 @@ public class FungalShambler extends CardImpl {
// Whenever Fungal Shambler deals damage to an opponent, you draw a card and that opponent discards a card.
Effect effect = new DrawCardSourceControllerEffect(1);
effect.setText("you draw a card");
- Ability ability = new DealsDamageToOpponentTriggeredAbility(effect, false);
+ Ability ability = new DealsDamageToOpponentTriggeredAbility(effect, false, false, true);
effect = new DiscardTargetEffect(1);
effect.setText("and that opponent discards a card");
ability.addEffect(effect);
diff --git a/Mage.Sets/src/mage/sets/apocalypse/GladeGnarr.java b/Mage.Sets/src/mage/sets/apocalypse/GladeGnarr.java
index 4ff643a49d7..d09a25aafdc 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/GladeGnarr.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/GladeGnarr.java
@@ -30,25 +30,26 @@ package mage.sets.apocalypse;
import java.util.UUID;
import mage.MageInt;
import mage.ObjectColor;
-import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.SpellCastAllTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
-import mage.constants.Zone;
-import mage.filter.FilterCard;
+import mage.filter.FilterSpell;
import mage.filter.predicate.mageobject.ColorPredicate;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.events.GameEvent.EventType;
-import mage.game.stack.Spell;
/**
* @author Loki
*/
public class GladeGnarr extends CardImpl {
+ private static final FilterSpell filter = new FilterSpell("a blue spell");
+
+ static {
+ filter.add(new ColorPredicate(ObjectColor.BLUE));
+ }
+
public GladeGnarr(UUID ownerId) {
super(ownerId, 78, "Glade Gnarr", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}{G}");
this.expansionSetCode = "APC";
@@ -56,7 +57,9 @@ public class GladeGnarr extends CardImpl {
this.power = new MageInt(4);
this.toughness = new MageInt(4);
- this.addAbility(new GladeGnarrTriggeredAbility());
+
+ // Whenever a player casts a blue spell, Glade Gnarr gets +2/+2 until end of turn.
+ this.addAbility(new SpellCastAllTriggeredAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), filter, false));
}
public GladeGnarr(final GladeGnarr card) {
@@ -68,41 +71,3 @@ public class GladeGnarr extends CardImpl {
return new GladeGnarr(this);
}
}
-
-class GladeGnarrTriggeredAbility extends TriggeredAbilityImpl {
-
- private static final FilterCard filter = new FilterCard("a black spell");
-
- static {
- filter.add(new ColorPredicate(ObjectColor.BLACK));
- }
-
- public GladeGnarrTriggeredAbility() {
- super(Zone.BATTLEFIELD, new BoostSourceEffect(2, 2, Duration.EndOfTurn), false);
- }
-
- public GladeGnarrTriggeredAbility(final GladeGnarrTriggeredAbility ability) {
- super(ability);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == EventType.SPELL_CAST;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- Spell spell = game.getStack().getSpell(event.getTargetId());
- return spell != null && filter.match(spell, game);
- }
-
- @Override
- public String getRule() {
- return "Whenever a player casts " + filter.getMessage() + ", " + super.getRule();
- }
-
- @Override
- public GladeGnarrTriggeredAbility copy() {
- return new GladeGnarrTriggeredAbility(this);
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/apocalypse/LifeDeath.java b/Mage.Sets/src/mage/sets/apocalypse/LifeDeath.java
index 1db52a16d06..0cdede7a804 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/LifeDeath.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/LifeDeath.java
@@ -25,7 +25,6 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.apocalypse;
import java.util.UUID;
@@ -34,11 +33,11 @@ import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.BecomesCreatureAllEffect;
import mage.cards.Card;
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.cards.SplitCard;
+import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
+import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.common.FilterControlledLandPermanent;
import mage.filter.common.FilterCreatureCard;
@@ -52,7 +51,6 @@ import mage.target.common.TargetCardInYourGraveyard;
*
* @author LevelX2
*/
-
public class LifeDeath extends SplitCard {
public LifeDeath(UUID ownerId) {
@@ -61,8 +59,8 @@ public class LifeDeath extends SplitCard {
// Life
// All lands you control become 1/1 creatures until end of turn. They're still lands.
- getLeftHalfCard().getSpellAbility().addEffect(new BecomesCreatureAllEffect(new LifeLandToken(), "lands",
- new FilterControlledLandPermanent("lands you control"), Duration.EndOfTurn));
+ getLeftHalfCard().getSpellAbility().addEffect(new BecomesCreatureAllEffect(new LifeLandToken(), "lands",
+ new FilterControlledLandPermanent("lands you control"), Duration.EndOfTurn));
// Death
// Return target creature card from your graveyard to the battlefield. You lose life equal to its converted mana cost.
@@ -83,6 +81,7 @@ public class LifeDeath extends SplitCard {
}
class LifeLandToken extends Token {
+
public LifeLandToken() {
super("", "1/1 creatures");
cardType.add(CardType.CREATURE);
@@ -115,10 +114,10 @@ class DeathEffect extends OneShotEffect {
if (creatureCard != null && controller != null) {
boolean result = false;
if (game.getState().getZone(creatureCard.getId()).equals(Zone.GRAVEYARD)) {
- result = controller.putOntoBattlefieldWithInfo(creatureCard, game, Zone.GRAVEYARD, source.getSourceId());
- }
+ controller.moveCards(creatureCard, Zone.BATTLEFIELD, source, game);
+ }
controller.loseLife(creatureCard.getManaCost().convertedManaCost(), game);
- return result;
+ return true;
}
return false;
}
diff --git a/Mage.Sets/src/mage/sets/apocalypse/Necravolver.java b/Mage.Sets/src/mage/sets/apocalypse/Necravolver.java
index 03427cbaf88..1a37ec37553 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/Necravolver.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/Necravolver.java
@@ -64,12 +64,12 @@ public class Necravolver extends CardImpl {
this.addAbility(kickerAbility);
// If Necravolver was kicked with its {1}{G} kicker, it enters the battlefield with two +1/+1 counters on it and with trample.
Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)),
- new KickedCostCondition("{1}{G}"), true, "If {this} was kicked with its {1}{G} kicker, it enters the battlefield with two +1/+1 counters on it and with trample.", "");
+ new KickedCostCondition("{1}{G}"), "If {this} was kicked with its {1}{G} kicker, it enters the battlefield with two +1/+1 counters on it and with trample.", "");
ability.addEffect(new GainAbilitySourceEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield));
this.addAbility(ability);
// If Necravolver was kicked with its {W} kicker, it enters the battlefield with a +1/+1 counter on it and with "Whenever Necravolver deals damage, you gain that much life."
ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)),
- new KickedCostCondition("{W}"), true, "If {this} was kicked with its {W} kicker, it enters the battlefield with a +1/+1 counter on it and with \"Whenever {this} deals damage, you gain that much life.\"", "");
+ new KickedCostCondition("{W}"), "If {this} was kicked with its {W} kicker, it enters the battlefield with a +1/+1 counter on it and with \"Whenever {this} deals damage, you gain that much life.\"", "");
ability.addEffect(new GainAbilitySourceEffect(new DealsDamageGainLifeSourceTriggeredAbility(), Duration.WhileOnBattlefield));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/apocalypse/Rakavolver.java b/Mage.Sets/src/mage/sets/apocalypse/Rakavolver.java
index 62444bed93b..e020d9fd2ff 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/Rakavolver.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/Rakavolver.java
@@ -64,12 +64,12 @@ public class Rakavolver extends CardImpl {
this.addAbility(kickerAbility);
// If Rakavolver was kicked with its {1}{W} kicker, it enters the battlefield with two +1/+1 counters on it and with "Whenever Rakavolver deals damage, you gain that much life."
Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)),
- new KickedCostCondition("{1}{W}"), true, "If {this} was kicked with its {1}{W} kicker, it enters the battlefield with two +1/+1 counters on it and with \"Whenever {this} deals damage, you gain that much life.\"", "");
+ new KickedCostCondition("{1}{W}"), "If {this} was kicked with its {1}{W} kicker, it enters the battlefield with two +1/+1 counters on it and with \"Whenever {this} deals damage, you gain that much life.\"", "");
ability.addEffect(new GainAbilitySourceEffect(new DealsDamageGainLifeSourceTriggeredAbility(), Duration.WhileOnBattlefield));
this.addAbility(ability);
// If Rakavolver was kicked with its {U} kicker, it enters the battlefield with a +1/+1 counter on it and with flying.
ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)),
- new KickedCostCondition("{U}"), true, "If {this} was kicked with its {U} kicker, it enters the battlefield with a +1/+1 counter on it and with flying.", "");
+ new KickedCostCondition("{U}"), "If {this} was kicked with its {U} kicker, it enters the battlefield with a +1/+1 counter on it and with flying.", "");
ability.addEffect(new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.WhileOnBattlefield));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/sets/apocalypse/Smash.java b/Mage.Sets/src/mage/sets/apocalypse/Smash.java
index d744e0f308a..7cffc876212 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/Smash.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/Smash.java
@@ -46,7 +46,7 @@ public class Smash extends CardImpl {
this.expansionSetCode = "APC";
// Destroy target artifact.
- this.getSpellAbility().addEffect(new DestroyTargetEffect(true));
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
this.getSpellAbility().addTarget(new TargetPermanent(new FilterArtifactPermanent()));
// Draw a card.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
diff --git a/Mage.Sets/src/mage/sets/apocalypse/UnnaturalSelection.java b/Mage.Sets/src/mage/sets/apocalypse/UnnaturalSelection.java
index 57e913f07b4..0106d3ca2fc 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/UnnaturalSelection.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/UnnaturalSelection.java
@@ -33,25 +33,13 @@ import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.GenericManaCost;
-import mage.abilities.effects.ContinuousEffect;
-import mage.abilities.effects.Effect;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.continuous.BecomesChosenNonWallCreatureTypeTargetEffect;
-import mage.abilities.effects.common.continuous.BecomesSubtypeTargetEffect;
+import mage.abilities.effects.common.continuous.BecomesChosenCreatureTypeTargetEffect;
import mage.cards.CardImpl;
-import mage.cards.repository.CardRepository;
-import mage.choices.Choice;
-import mage.choices.ChoiceImpl;
import mage.constants.CardType;
import mage.constants.Duration;
-import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
-import mage.target.targetpointer.FixedTarget;
/**
*
@@ -64,7 +52,7 @@ public class UnnaturalSelection extends CardImpl {
this.expansionSetCode = "APC";
// {1}: Choose a creature type other than Wall. Target creature becomes that type until end of turn.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesChosenNonWallCreatureTypeTargetEffect(), new GenericManaCost(1));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesChosenCreatureTypeTargetEffect(true), new GenericManaCost(1));
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
@@ -77,4 +65,4 @@ public class UnnaturalSelection extends CardImpl {
public UnnaturalSelection copy() {
return new UnnaturalSelection(this);
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/Aladdin.java b/Mage.Sets/src/mage/sets/arabiannights/Aladdin.java
new file mode 100644
index 00000000000..51906a0d334
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/Aladdin.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author nigelzor
+ */
+public class Aladdin extends mage.sets.masterseditioniv.Aladdin {
+
+ public Aladdin(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 42;
+ this.expansionSetCode = "ARN";
+ }
+
+ public Aladdin(final Aladdin card) {
+ super(card);
+ }
+
+ @Override
+ public Aladdin copy() {
+ return new Aladdin(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/ArmyOfAllah.java b/Mage.Sets/src/mage/sets/arabiannights/ArmyOfAllah.java
new file mode 100644
index 00000000000..77bc94ac9a7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/ArmyOfAllah.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+import mage.abilities.effects.common.continuous.BoostAllEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterAttackingCreature;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ArmyOfAllah extends CardImpl {
+
+ private static final FilterAttackingCreature filter = new FilterAttackingCreature("Attacking creatures");
+
+ public ArmyOfAllah(UUID ownerId) {
+ super(ownerId, 56, "Army of Allah", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}{W}");
+ this.expansionSetCode = "ARN";
+
+ // Attacking creatures get +2/+0 until end of turn.
+ this.getSpellAbility().addEffect(new BoostAllEffect(2, 0, Duration.EndOfTurn, filter, false));
+ }
+
+ public ArmyOfAllah(final ArmyOfAllah card) {
+ super(card);
+ }
+
+ @Override
+ public ArmyOfAllah copy() {
+ return new ArmyOfAllah(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/BirdMaiden.java b/Mage.Sets/src/mage/sets/arabiannights/BirdMaiden1.java
similarity index 87%
rename from Mage.Sets/src/mage/sets/arabiannights/BirdMaiden.java
rename to Mage.Sets/src/mage/sets/arabiannights/BirdMaiden1.java
index 42d94fcf21f..af3bc6ebc12 100644
--- a/Mage.Sets/src/mage/sets/arabiannights/BirdMaiden.java
+++ b/Mage.Sets/src/mage/sets/arabiannights/BirdMaiden1.java
@@ -1,52 +1,52 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets.arabiannights;
-
-import java.util.UUID;
-
-/**
- *
- * @author North
- */
-public class BirdMaiden extends mage.sets.fifthedition.BirdMaiden {
-
- public BirdMaiden(UUID ownerId) {
- super(ownerId);
- this.cardNumber = 45;
- this.expansionSetCode = "ARN";
- }
-
- public BirdMaiden(final BirdMaiden card) {
- super(card);
- }
-
- @Override
- public BirdMaiden copy() {
- return new BirdMaiden(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author North
+ */
+public class BirdMaiden1 extends mage.sets.fifthedition.BirdMaiden {
+
+ public BirdMaiden1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 45;
+ this.expansionSetCode = "ARN";
+ }
+
+ public BirdMaiden1(final BirdMaiden1 card) {
+ super(card);
+ }
+
+ @Override
+ public BirdMaiden1 copy() {
+ return new BirdMaiden1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/BirdMaiden2.java b/Mage.Sets/src/mage/sets/arabiannights/BirdMaiden2.java
new file mode 100644
index 00000000000..fe4077e9c4e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/BirdMaiden2.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author North
+ */
+public class BirdMaiden2 extends mage.sets.fifthedition.BirdMaiden {
+
+ public BirdMaiden2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 46;
+ this.expansionSetCode = "ARN";
+ }
+
+ public BirdMaiden2(final BirdMaiden2 card) {
+ super(card);
+ }
+
+ @Override
+ public BirdMaiden2 copy() {
+ return new BirdMaiden2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/ErgRaiders.java b/Mage.Sets/src/mage/sets/arabiannights/ErgRaiders1.java
similarity index 87%
rename from Mage.Sets/src/mage/sets/arabiannights/ErgRaiders.java
rename to Mage.Sets/src/mage/sets/arabiannights/ErgRaiders1.java
index 840710323ef..30162adc48e 100644
--- a/Mage.Sets/src/mage/sets/arabiannights/ErgRaiders.java
+++ b/Mage.Sets/src/mage/sets/arabiannights/ErgRaiders1.java
@@ -1,53 +1,53 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets.arabiannights;
-
-import java.util.UUID;
-
-/**
- *
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+
+/**
+ *
* @author LoneFox
-
- */
-public class ErgRaiders extends mage.sets.fourthedition.ErgRaiders {
-
- public ErgRaiders(UUID ownerId) {
- super(ownerId);
- this.cardNumber = 3;
- this.expansionSetCode = "ARN";
- }
-
- public ErgRaiders(final ErgRaiders card) {
- super(card);
- }
-
- @Override
- public ErgRaiders copy() {
- return new ErgRaiders(this);
- }
-}
+
+ */
+public class ErgRaiders1 extends mage.sets.fourthedition.ErgRaiders {
+
+ public ErgRaiders1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 3;
+ this.expansionSetCode = "ARN";
+ }
+
+ public ErgRaiders1(final ErgRaiders1 card) {
+ super(card);
+ }
+
+ @Override
+ public ErgRaiders1 copy() {
+ return new ErgRaiders1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/ErgRaiders2.java b/Mage.Sets/src/mage/sets/arabiannights/ErgRaiders2.java
new file mode 100644
index 00000000000..542000552a9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/ErgRaiders2.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+
+ */
+public class ErgRaiders2 extends mage.sets.fourthedition.ErgRaiders {
+
+ public ErgRaiders2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 4;
+ this.expansionSetCode = "ARN";
+ }
+
+ public ErgRaiders2(final ErgRaiders2 card) {
+ super(card);
+ }
+
+ @Override
+ public ErgRaiders2 copy() {
+ return new ErgRaiders2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/FishliverOil.java b/Mage.Sets/src/mage/sets/arabiannights/FishliverOil1.java
similarity index 93%
rename from Mage.Sets/src/mage/sets/arabiannights/FishliverOil.java
rename to Mage.Sets/src/mage/sets/arabiannights/FishliverOil1.java
index 26176b08226..623b9ca2a32 100644
--- a/Mage.Sets/src/mage/sets/arabiannights/FishliverOil.java
+++ b/Mage.Sets/src/mage/sets/arabiannights/FishliverOil1.java
@@ -47,9 +47,9 @@ import mage.target.common.TargetCreaturePermanent;
/**
* @author Laxika
*/
-public class FishliverOil extends CardImpl {
+public class FishliverOil1 extends CardImpl {
- public FishliverOil(UUID ownerId) {
+ public FishliverOil1(UUID ownerId) {
super(ownerId, 17, "Fishliver Oil", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}");
this.expansionSetCode = "ARN";
this.subtype.add("Aura");
@@ -66,12 +66,12 @@ public class FishliverOil extends CardImpl {
new GainAbilityAttachedEffect(new IslandwalkAbility(), AttachmentType.AURA, Duration.WhileOnBattlefield)));
}
- public FishliverOil(final FishliverOil card) {
+ public FishliverOil1(final FishliverOil1 card) {
super(card);
}
@Override
- public FishliverOil copy() {
- return new FishliverOil(this);
+ public FishliverOil1 copy() {
+ return new FishliverOil1(this);
}
}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/FishliverOil2.java b/Mage.Sets/src/mage/sets/arabiannights/FishliverOil2.java
new file mode 100644
index 00000000000..7540256d518
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/FishliverOil2.java
@@ -0,0 +1,31 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class FishliverOil2 extends mage.sets.arabiannights.FishliverOil1 {
+
+ public FishliverOil2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 18;
+ this.expansionSetCode = "ARN";
+ }
+
+ public FishliverOil2(final FishliverOil2 card) {
+ super(card);
+ }
+
+ @Override
+ public FishliverOil2 copy() {
+ return new FishliverOil2(this);
+ }
+}
+
diff --git a/Mage.Sets/src/mage/sets/arabiannights/GiantTortoise.java b/Mage.Sets/src/mage/sets/arabiannights/GiantTortoise1.java
similarity index 86%
rename from Mage.Sets/src/mage/sets/arabiannights/GiantTortoise.java
rename to Mage.Sets/src/mage/sets/arabiannights/GiantTortoise1.java
index 2f8af150c36..c91458b42a6 100644
--- a/Mage.Sets/src/mage/sets/arabiannights/GiantTortoise.java
+++ b/Mage.Sets/src/mage/sets/arabiannights/GiantTortoise1.java
@@ -1,52 +1,52 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets.arabiannights;
-
-import java.util.UUID;
-
-/**
- *
- * @author LevelX2
- */
-public class GiantTortoise extends mage.sets.fourthedition.GiantTortoise {
-
- public GiantTortoise(UUID ownerId) {
- super(ownerId);
- this.cardNumber = 20;
- this.expansionSetCode = "ARN";
- }
-
- public GiantTortoise(final GiantTortoise card) {
- super(card);
- }
-
- @Override
- public GiantTortoise copy() {
- return new GiantTortoise(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class GiantTortoise1 extends mage.sets.fourthedition.GiantTortoise {
+
+ public GiantTortoise1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 20;
+ this.expansionSetCode = "ARN";
+ }
+
+ public GiantTortoise1(final GiantTortoise1 card) {
+ super(card);
+ }
+
+ @Override
+ public GiantTortoise1 copy() {
+ return new GiantTortoise1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/GiantTortoise2.java b/Mage.Sets/src/mage/sets/arabiannights/GiantTortoise2.java
new file mode 100644
index 00000000000..2e9ca156d75
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/GiantTortoise2.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class GiantTortoise2 extends mage.sets.fourthedition.GiantTortoise {
+
+ public GiantTortoise2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 21;
+ this.expansionSetCode = "ARN";
+ }
+
+ public GiantTortoise2(final GiantTortoise2 card) {
+ super(card);
+ }
+
+ @Override
+ public GiantTortoise2 copy() {
+ return new GiantTortoise2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/HasranOgress1.java b/Mage.Sets/src/mage/sets/arabiannights/HasranOgress1.java
new file mode 100644
index 00000000000..dc6dea357e6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/HasranOgress1.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+
+ */
+public class HasranOgress1 extends mage.sets.masterseditioniv.HasranOgress {
+
+ public HasranOgress1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 6;
+ this.expansionSetCode = "ARN";
+ }
+
+ public HasranOgress1(final HasranOgress1 card) {
+ super(card);
+ }
+
+ @Override
+ public HasranOgress1 copy() {
+ return new HasranOgress1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/HasranOgress2.java b/Mage.Sets/src/mage/sets/arabiannights/HasranOgress2.java
new file mode 100644
index 00000000000..9b64f3a8e8e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/HasranOgress2.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+
+ */
+public class HasranOgress2 extends mage.sets.masterseditioniv.HasranOgress {
+
+ public HasranOgress2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 7;
+ this.expansionSetCode = "ARN";
+ }
+
+ public HasranOgress2(final HasranOgress2 card) {
+ super(card);
+ }
+
+ @Override
+ public HasranOgress2 copy() {
+ return new HasranOgress2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/IslandFishJasconius.java b/Mage.Sets/src/mage/sets/arabiannights/IslandFishJasconius.java
new file mode 100644
index 00000000000..165b82a7109
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/IslandFishJasconius.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class IslandFishJasconius extends mage.sets.fourthedition.IslandFishJasconius {
+
+ public IslandFishJasconius(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 22;
+ this.expansionSetCode = "ARN";
+ }
+
+ public IslandFishJasconius(final IslandFishJasconius card) {
+ super(card);
+ }
+
+ @Override
+ public IslandFishJasconius copy() {
+ return new IslandFishJasconius(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/JununEfreet.java b/Mage.Sets/src/mage/sets/arabiannights/JununEfreet.java
new file mode 100644
index 00000000000..58ca657c481
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/JununEfreet.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class JununEfreet extends mage.sets.fourthedition.JununEfreet {
+
+ public JununEfreet(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 8;
+ this.expansionSetCode = "ARN";
+ this.rarity = Rarity.RARE;
+ }
+
+ public JununEfreet(final JununEfreet card) {
+ super(card);
+ }
+
+ @Override
+ public JununEfreet copy() {
+ return new JununEfreet(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/KhabalGhoul.java b/Mage.Sets/src/mage/sets/arabiannights/KhabalGhoul.java
new file mode 100644
index 00000000000..6ba202dbc5f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/KhabalGhoul.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class KhabalGhoul extends mage.sets.mastersedition.KhabalGhoul {
+
+ public KhabalGhoul(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 10;
+ this.expansionSetCode = "ARN";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public KhabalGhoul(final KhabalGhoul card) {
+ super(card);
+ }
+
+ @Override
+ public KhabalGhoul copy() {
+ return new KhabalGhoul(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/MerchantShip.java b/Mage.Sets/src/mage/sets/arabiannights/MerchantShip.java
new file mode 100644
index 00000000000..6f4fa5ff9b7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/MerchantShip.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.SacrificeSourceEffect;
+import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.Filter;
+import mage.filter.common.FilterLandPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MerchantShip extends CardImpl {
+
+ public MerchantShip(UUID ownerId) {
+ super(ownerId, 23, "Merchant Ship", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{U}");
+ this.expansionSetCode = "ARN";
+ this.subtype.add("Human");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(2);
+
+ // Merchant Ship can't attack unless defending player controls an Island.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island", "an Island"))));
+ // Whenever Merchant Ship attacks and isn't blocked, you gain 2 life.
+ this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(new GainLifeEffect(2)));
+ // When you control no Islands, sacrifice Merchant Ship.
+ this.addAbility(new ControlsPermanentsControllerTriggeredAbility(
+ new FilterLandPermanent("Island", "no Islands"), Filter.ComparisonType.Equal, 0,
+ new SacrificeSourceEffect()));
+ }
+
+ public MerchantShip(final MerchantShip card) {
+ super(card);
+ }
+
+ @Override
+ public MerchantShip copy() {
+ return new MerchantShip(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/MoorishCavalry.java b/Mage.Sets/src/mage/sets/arabiannights/MoorishCavalry1.java
similarity index 86%
rename from Mage.Sets/src/mage/sets/arabiannights/MoorishCavalry.java
rename to Mage.Sets/src/mage/sets/arabiannights/MoorishCavalry1.java
index b23fcaf7717..98a8c4369e8 100644
--- a/Mage.Sets/src/mage/sets/arabiannights/MoorishCavalry.java
+++ b/Mage.Sets/src/mage/sets/arabiannights/MoorishCavalry1.java
@@ -1,54 +1,54 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets.arabiannights;
-
-import java.util.UUID;
-import mage.constants.Rarity;
-
-/**
- *
- * @author North
- */
-public class MoorishCavalry extends mage.sets.timeshifted.MoorishCavalry {
-
- public MoorishCavalry(UUID ownerId) {
- super(ownerId);
- this.cardNumber = 62;
- this.expansionSetCode = "ARN";
- this.rarity = Rarity.COMMON;
- }
-
- public MoorishCavalry(final MoorishCavalry card) {
- super(card);
- }
-
- @Override
- public MoorishCavalry copy() {
- return new MoorishCavalry(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class MoorishCavalry1 extends mage.sets.timeshifted.MoorishCavalry {
+
+ public MoorishCavalry1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 62;
+ this.expansionSetCode = "ARN";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public MoorishCavalry1(final MoorishCavalry1 card) {
+ super(card);
+ }
+
+ @Override
+ public MoorishCavalry1 copy() {
+ return new MoorishCavalry1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/MoorishCavalry2.java b/Mage.Sets/src/mage/sets/arabiannights/MoorishCavalry2.java
new file mode 100644
index 00000000000..f394fa38940
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/MoorishCavalry2.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author North
+ */
+public class MoorishCavalry2 extends mage.sets.timeshifted.MoorishCavalry {
+
+ public MoorishCavalry2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 63;
+ this.expansionSetCode = "ARN";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public MoorishCavalry2(final MoorishCavalry2 card) {
+ super(card);
+ }
+
+ @Override
+ public MoorishCavalry2 copy() {
+ return new MoorishCavalry2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/Mountain1.java b/Mage.Sets/src/mage/sets/arabiannights/Mountain1.java
index 2a8a566afa3..6e8f256143d 100644
--- a/Mage.Sets/src/mage/sets/arabiannights/Mountain1.java
+++ b/Mage.Sets/src/mage/sets/arabiannights/Mountain1.java
@@ -27,19 +27,20 @@
*/
package mage.sets.arabiannights;
+import mage.constants.Rarity;
+
import java.util.UUID;
/**
*
* @author LevelX2
*/
-
-
public class Mountain1 extends mage.cards.basiclands.Mountain {
public Mountain1(UUID ownerId) {
super(ownerId, 91);
this.expansionSetCode = "ARN";
+ this.rarity = Rarity.COMMON;
}
public Mountain1(final Mountain1 card) {
diff --git a/Mage.Sets/src/mage/sets/arabiannights/RukhEgg.java b/Mage.Sets/src/mage/sets/arabiannights/RukhEgg1.java
similarity index 95%
rename from Mage.Sets/src/mage/sets/arabiannights/RukhEgg.java
rename to Mage.Sets/src/mage/sets/arabiannights/RukhEgg1.java
index 393148c71c3..41dc334a37c 100644
--- a/Mage.Sets/src/mage/sets/arabiannights/RukhEgg.java
+++ b/Mage.Sets/src/mage/sets/arabiannights/RukhEgg1.java
@@ -45,9 +45,9 @@ import mage.game.permanent.token.Token;
*
* @author anonymous
*/
-public class RukhEgg extends CardImpl {
+public class RukhEgg1 extends CardImpl {
- public RukhEgg(UUID ownerId) {
+ public RukhEgg1(UUID ownerId) {
super(ownerId, 52, "Rukh Egg", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}");
this.expansionSetCode = "ARN";
this.subtype.add("Bird");
@@ -61,13 +61,13 @@ public class RukhEgg extends CardImpl {
this.addAbility(ability);
}
- public RukhEgg(final RukhEgg card) {
+ public RukhEgg1(final RukhEgg1 card) {
super(card);
}
@Override
- public RukhEgg copy() {
- return new RukhEgg(this);
+ public RukhEgg1 copy() {
+ return new RukhEgg1(this);
}
}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/RukhEgg2.java b/Mage.Sets/src/mage/sets/arabiannights/RukhEgg2.java
new file mode 100644
index 00000000000..1b5866538c2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/RukhEgg2.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+
+ */
+public class RukhEgg2 extends mage.sets.arabiannights.RukhEgg1 {
+
+ public RukhEgg2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 53;
+ this.expansionSetCode = "ARN";
+ }
+
+ public RukhEgg2(final RukhEgg2 card) {
+ super(card);
+ }
+
+ @Override
+ public RukhEgg2 copy() {
+ return new RukhEgg2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/SorceressQueen.java b/Mage.Sets/src/mage/sets/arabiannights/SorceressQueen.java
new file mode 100644
index 00000000000..879a3dc6386
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/SorceressQueen.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class SorceressQueen extends mage.sets.revisededition.SorceressQueen {
+
+ public SorceressQueen(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 13;
+ this.expansionSetCode = "ARN";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public SorceressQueen(final SorceressQueen card) {
+ super(card);
+ }
+
+ @Override
+ public SorceressQueen copy() {
+ return new SorceressQueen(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/StoneThrowingDevils.java b/Mage.Sets/src/mage/sets/arabiannights/StoneThrowingDevils1.java
similarity index 88%
rename from Mage.Sets/src/mage/sets/arabiannights/StoneThrowingDevils.java
rename to Mage.Sets/src/mage/sets/arabiannights/StoneThrowingDevils1.java
index 49f849fd727..8414e847aad 100644
--- a/Mage.Sets/src/mage/sets/arabiannights/StoneThrowingDevils.java
+++ b/Mage.Sets/src/mage/sets/arabiannights/StoneThrowingDevils1.java
@@ -1,63 +1,63 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets.arabiannights;
-
-import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.MageInt;
-import mage.abilities.keyword.FirstStrikeAbility;
-import mage.cards.CardImpl;
-
-/**
- *
- * @author North
- */
-public class StoneThrowingDevils extends CardImpl {
-
- public StoneThrowingDevils(UUID ownerId) {
- super(ownerId, 14, "Stone-Throwing Devils", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}");
- this.expansionSetCode = "ARN";
- this.subtype.add("Devil");
-
- this.power = new MageInt(1);
- this.toughness = new MageInt(1);
-
- // First strike
- this.addAbility(FirstStrikeAbility.getInstance());
- }
-
- public StoneThrowingDevils(final StoneThrowingDevils card) {
- super(card);
- }
-
- @Override
- public StoneThrowingDevils copy() {
- return new StoneThrowingDevils(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.MageInt;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+
+/**
+ *
+ * @author North
+ */
+public class StoneThrowingDevils1 extends CardImpl {
+
+ public StoneThrowingDevils1(UUID ownerId) {
+ super(ownerId, 14, "Stone-Throwing Devils", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}");
+ this.expansionSetCode = "ARN";
+ this.subtype.add("Devil");
+
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // First strike
+ this.addAbility(FirstStrikeAbility.getInstance());
+ }
+
+ public StoneThrowingDevils1(final StoneThrowingDevils1 card) {
+ super(card);
+ }
+
+ @Override
+ public StoneThrowingDevils1 copy() {
+ return new StoneThrowingDevils1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/StoneThrowingDevils2.java b/Mage.Sets/src/mage/sets/arabiannights/StoneThrowingDevils2.java
new file mode 100644
index 00000000000..90262547593
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/StoneThrowingDevils2.java
@@ -0,0 +1,31 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class StoneThrowingDevils2 extends mage.sets.arabiannights.StoneThrowingDevils1 {
+
+ public StoneThrowingDevils2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 15;
+ this.expansionSetCode = "ARN";
+ }
+
+ public StoneThrowingDevils2(final StoneThrowingDevils2 card) {
+ super(card);
+ }
+
+ @Override
+ public StoneThrowingDevils2 copy() {
+ return new StoneThrowingDevils2(this);
+ }
+}
+
diff --git a/Mage.Sets/src/mage/sets/arabiannights/WyluliWolf.java b/Mage.Sets/src/mage/sets/arabiannights/WyluliWolf1.java
similarity index 89%
rename from Mage.Sets/src/mage/sets/arabiannights/WyluliWolf.java
rename to Mage.Sets/src/mage/sets/arabiannights/WyluliWolf1.java
index 4cddf18a716..1b15f355179 100644
--- a/Mage.Sets/src/mage/sets/arabiannights/WyluliWolf.java
+++ b/Mage.Sets/src/mage/sets/arabiannights/WyluliWolf1.java
@@ -34,21 +34,21 @@ import mage.constants.Rarity;
*
* @author Quercitron
*/
-public class WyluliWolf extends mage.sets.fifthedition.WyluliWolf {
+public class WyluliWolf1 extends mage.sets.fifthedition.WyluliWolf {
- public WyluliWolf(UUID ownerId) {
+ public WyluliWolf1(UUID ownerId) {
super(ownerId);
this.cardNumber = 40;
this.expansionSetCode = "ARN";
this.rarity = Rarity.COMMON;
}
- public WyluliWolf(final WyluliWolf card) {
+ public WyluliWolf1(final WyluliWolf1 card) {
super(card);
}
@Override
- public WyluliWolf copy() {
- return new WyluliWolf(this);
+ public WyluliWolf1 copy() {
+ return new WyluliWolf1(this);
}
}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/WyluliWolf2.java b/Mage.Sets/src/mage/sets/arabiannights/WyluliWolf2.java
new file mode 100644
index 00000000000..9f2e093f71d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/WyluliWolf2.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.arabiannights;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author Quercitron
+ */
+public class WyluliWolf2 extends mage.sets.fifthedition.WyluliWolf {
+
+ public WyluliWolf2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 41;
+ this.expansionSetCode = "ARN";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public WyluliWolf2(final WyluliWolf2 card) {
+ super(card);
+ }
+
+ @Override
+ public WyluliWolf2 copy() {
+ return new WyluliWolf2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/archenemy/BatteringCraghorn.java b/Mage.Sets/src/mage/sets/archenemy/BatteringCraghorn.java
new file mode 100644
index 00000000000..af9b1c23038
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/archenemy/BatteringCraghorn.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.archenemy;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.keyword.MorphAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BatteringCraghorn extends CardImpl {
+
+ public BatteringCraghorn(UUID ownerId) {
+ super(ownerId, 30, "Battering Craghorn", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}{R}");
+ this.expansionSetCode = "ARC";
+ this.subtype.add("Goat");
+ this.subtype.add("Beast");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(1);
+
+ // First strike
+ this.addAbility(FirstStrikeAbility.getInstance());
+ // Morph {1}{R}{R}
+ this.addAbility(new MorphAbility(this, new ManaCostsImpl("{1}{R}{R}")));
+ }
+
+ public BatteringCraghorn(final BatteringCraghorn card) {
+ super(card);
+ }
+
+ @Override
+ public BatteringCraghorn copy() {
+ return new BatteringCraghorn(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/archenemy/BogWitch.java b/Mage.Sets/src/mage/sets/archenemy/BogWitch.java
new file mode 100644
index 00000000000..616a6836a57
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/archenemy/BogWitch.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.archenemy;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BogWitch extends mage.sets.mercadianmasques.BogWitch {
+
+ public BogWitch(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 11;
+ this.expansionSetCode = "ARC";
+ }
+
+ public BogWitch(final BogWitch card) {
+ super(card);
+ }
+
+ @Override
+ public BogWitch copy() {
+ return new BogWitch(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/archenemy/DragonBreath.java b/Mage.Sets/src/mage/sets/archenemy/DragonBreath.java
new file mode 100644
index 00000000000..82eab473946
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/archenemy/DragonBreath.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.archenemy;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ColoredManaCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
+import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.ColoredManaSymbol;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.SetTargetPointer;
+import mage.constants.Zone;
+import mage.filter.Filter.ComparisonType;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author emerald000
+ */
+public class DragonBreath extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature with converted mana cost 6 or greater");
+ static {
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.GreaterThan, 5));
+ }
+
+ public DragonBreath(UUID ownerId) {
+ super(ownerId, 33, "Dragon Breath", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}");
+ this.expansionSetCode = "ARC";
+ this.subtype.add("Aura");
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+
+ // Enchanted creature has haste.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(HasteAbility.getInstance(), AttachmentType.AURA)));
+
+ // {R}: Enchanted creature gets +1/+0 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 0, Duration.EndOfTurn), new ColoredManaCost(ColoredManaSymbol.R)));
+
+ // When a creature with converted mana cost 6 or greater enters the battlefield, you may return Dragon Breath from your graveyard to the battlefield attached to that creature.
+ this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.GRAVEYARD, new DragonBreathEffect(), filter, true, SetTargetPointer.PERMANENT, null));
+ }
+
+ public DragonBreath(final DragonBreath card) {
+ super(card);
+ }
+
+ @Override
+ public DragonBreath copy() {
+ return new DragonBreath(this);
+ }
+}
+
+class DragonBreathEffect extends OneShotEffect {
+
+ DragonBreathEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "return {this} from your graveyard to the battlefield attached to that creature";
+ }
+
+ DragonBreathEffect(final DragonBreathEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public DragonBreathEffect copy() {
+ return new DragonBreathEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Card sourceCard = (Card) source.getSourceObjectIfItStillExists(game);
+ Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source));
+ Player controller = game.getPlayer(source.getControllerId());
+ if (sourceCard != null && permanent != null && controller != null) {
+ game.getState().setValue("attachTo:" + sourceCard.getId(), permanent);
+ if (controller.moveCards(sourceCard, Zone.BATTLEFIELD, source, game)) {
+ permanent.addAttachment(sourceCard.getId(), game);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/archenemy/ForgottenAncient.java b/Mage.Sets/src/mage/sets/archenemy/ForgottenAncient.java
new file mode 100644
index 00000000000..0ac189d66b9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/archenemy/ForgottenAncient.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.archenemy;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author Blinke
+ */
+public class ForgottenAncient extends mage.sets.scourge.ForgottenAncient {
+
+ public ForgottenAncient(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 57;
+ this.expansionSetCode = "ARC";
+ }
+
+ public ForgottenAncient(final ForgottenAncient card) {
+ super(card);
+ }
+
+ @Override
+ public ForgottenAncient copy() {
+ return new ForgottenAncient(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/archenemy/MakeshiftMannequin.java b/Mage.Sets/src/mage/sets/archenemy/MakeshiftMannequin.java
index e6f6c9a72df..cf248de7b5d 100644
--- a/Mage.Sets/src/mage/sets/archenemy/MakeshiftMannequin.java
+++ b/Mage.Sets/src/mage/sets/archenemy/MakeshiftMannequin.java
@@ -44,6 +44,7 @@ import mage.constants.Rarity;
import mage.constants.SubLayer;
import mage.constants.Zone;
import mage.counters.CounterType;
+import mage.counters.Counters;
import mage.filter.common.FilterCreatureCard;
import mage.game.Game;
import mage.game.permanent.Permanent;
@@ -77,21 +78,21 @@ public class MakeshiftMannequin extends CardImpl {
}
class MakeshiftMannequinEffect extends OneShotEffect {
-
+
MakeshiftMannequinEffect() {
super(Outcome.PutCreatureInPlay);
this.staticText = "Return target creature card from your graveyard to the battlefield with a mannequin counter on it. For as long as that creature has a mannequin counter on it, it has \"When this creature becomes the target of a spell or ability, sacrifice it.\"";
}
-
+
MakeshiftMannequinEffect(final MakeshiftMannequinEffect effect) {
super(effect);
}
-
+
@Override
public MakeshiftMannequinEffect copy() {
return new MakeshiftMannequinEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
@@ -99,12 +100,14 @@ class MakeshiftMannequinEffect extends OneShotEffect {
UUID cardId = this.getTargetPointer().getFirst(game, source);
Card card = controller.getGraveyard().get(cardId, game);
if (card != null) {
- if (controller.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId())) {
+ Counters counters = new Counters();
+ counters.addCounter(CounterType.MANNEQUIN.createInstance());
+ game.setEnterWithCounters(cardId, counters);
+ if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) {
Permanent permanent = game.getPermanent(cardId);
if (permanent != null) {
- permanent.addCounters(CounterType.MANNEQUIN.createInstance(), game);
ContinuousEffect gainedEffect = new MakeshiftMannequinGainAbilityEffect();
- gainedEffect.setTargetPointer(new FixedTarget(cardId));
+ gainedEffect.setTargetPointer(new FixedTarget(permanent, game));
game.addEffect(gainedEffect, source);
}
}
diff --git a/Mage.Sets/src/mage/sets/archenemy/SkirkCommando.java b/Mage.Sets/src/mage/sets/archenemy/SkirkCommando.java
new file mode 100644
index 00000000000..c364916e666
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/archenemy/SkirkCommando.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.archenemy;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.keyword.MorphAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.ControllerIdPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author BursegSardaukar
+ */
+public class SkirkCommando extends CardImpl {
+
+ public SkirkCommando(UUID ownerId) {
+ super(ownerId, 47, "Skirk Commando", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}{R}");
+ this.expansionSetCode = "ARC";
+ this.subtype.add("Goblin");
+
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ //Whenever Skirk Commando deals combat damage to a player, you may have it deal 2 damage to target creature that player controls.
+ this.addAbility(new SkirkCommandoTriggeredAbility());
+
+ //Morph {2}{R} (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.)
+ this.addAbility(new MorphAbility(this, new ManaCostsImpl("{2}{R}")));
+
+ }
+
+ public SkirkCommando(final SkirkCommando card) {
+ super(card);
+ }
+
+ @Override
+ public SkirkCommando copy() {
+ return new SkirkCommando(this);
+ }
+}
+
+class SkirkCommandoTriggeredAbility extends DealsCombatDamageToAPlayerTriggeredAbility {
+
+ public SkirkCommandoTriggeredAbility() {
+ super(new DamageTargetEffect(2), true, false);
+ }
+
+ public SkirkCommandoTriggeredAbility(SkirkCommandoTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (super.checkTrigger(event, game)) {
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature that player controls");
+ filter.add(new ControllerIdPredicate(event.getPlayerId()));
+ addTarget(new TargetCreaturePermanent(filter));
+ }
+ return false;
+ }
+
+ @Override
+ public SkirkCommandoTriggeredAbility copy() {
+ return new SkirkCommandoTriggeredAbility(this);
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever {this} deals combat damage to a player, you may have it deal 2 damage to target creature that player controls.";
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/archenemy/SpinIntoMyth.java b/Mage.Sets/src/mage/sets/archenemy/SpinIntoMyth.java
index a06b14131b3..2d0e7b1cc47 100644
--- a/Mage.Sets/src/mage/sets/archenemy/SpinIntoMyth.java
+++ b/Mage.Sets/src/mage/sets/archenemy/SpinIntoMyth.java
@@ -50,7 +50,7 @@ public class SpinIntoMyth extends CardImpl {
this.getSpellAbility().addEffect(new PutOnLibraryTargetEffect(true));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
Effect effect = new FatesealEffect(2);
- effect.setText("then fateseal 2. (To fateseal 2, look at the top two cards of an opponent's library, then put any number of them on the bottom of that player's library and the rest on top in any order.)");
+ effect.setText(", then fateseal 2. (To fateseal 2, look at the top two cards of an opponent's library, then put any number of them on the bottom of that player's library and the rest on top in any order.)");
this.getSpellAbility().addEffect(effect);
}
diff --git a/Mage.Sets/src/mage/sets/archenemy/YavimayaDryad.java b/Mage.Sets/src/mage/sets/archenemy/YavimayaDryad.java
new file mode 100644
index 00000000000..c83ae5e7b38
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/archenemy/YavimayaDryad.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.archenemy;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
+import mage.abilities.keyword.ForestwalkAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandCard;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.target.common.TargetCardInLibrary;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class YavimayaDryad extends CardImpl {
+
+ private static final FilterLandCard filter = new FilterLandCard("a Forest card");
+
+ static {
+ filter.add(new SubtypePredicate("Forest"));
+ }
+
+ public YavimayaDryad(UUID ownerId) {
+ super(ownerId, 75, "Yavimaya Dryad", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{G}{G}");
+ this.expansionSetCode = "ARC";
+ this.subtype.add("Dryad");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Forestwalk
+ this.addAbility(new ForestwalkAbility());
+ // When Yavimaya Dryad enters the battlefield, you may search your library for a Forest card and put it onto the battlefield tapped under target player's control. If you do, shuffle your library.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), true));
+ }
+
+ public YavimayaDryad(final YavimayaDryad card) {
+ super(card);
+ }
+
+ @Override
+ public YavimayaDryad copy() {
+ return new YavimayaDryad(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/AbundantGrowth.java b/Mage.Sets/src/mage/sets/avacynrestored/AbundantGrowth.java
index af12b061514..9ed4bfca997 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/AbundantGrowth.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/AbundantGrowth.java
@@ -27,22 +27,26 @@
*/
package mage.sets.avacynrestored;
-import mage.constants.*;
+import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.target.TargetPermanent;
import mage.target.common.TargetLandPermanent;
-import java.util.UUID;
-
/**
* @author noxx
*/
@@ -53,7 +57,6 @@ public class AbundantGrowth extends CardImpl {
this.expansionSetCode = "AVR";
this.subtype.add("Aura");
-
// Enchant land
TargetPermanent auraTarget = new TargetLandPermanent();
this.getSpellAbility().addTarget(auraTarget);
@@ -64,9 +67,11 @@ public class AbundantGrowth extends CardImpl {
// When Abundant Growth enters the battlefield, draw a card.
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false));
- // Enchanted land has "{tap}: Add one mana of any color to your mana pool."
+ // Enchanted land has "{T}: Add one mana of any color to your mana pool."
Ability gainedAbility = new AnyColorManaAbility(new TapSourceCost());
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA)));
+ Effect effect = new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA);
+ effect.setText("Enchanted land has \"{T}: Add one mana of any color to your mana pool.\"");
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
}
public AbundantGrowth(final AbundantGrowth card) {
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/AvacynAngelOfHope.java b/Mage.Sets/src/mage/sets/avacynrestored/AvacynAngelOfHope.java
index c826ac7ef58..8ad91046a02 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/AvacynAngelOfHope.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/AvacynAngelOfHope.java
@@ -28,10 +28,6 @@
package mage.sets.avacynrestored;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effect;
@@ -40,6 +36,10 @@ import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.common.FilterControlledPermanent;
@@ -57,13 +57,15 @@ public class AvacynAngelOfHope extends CardImpl {
this.power = new MageInt(8);
this.toughness = new MageInt(8);
+ // Flying, vigilance, indestructible
this.addAbility(FlyingAbility.getInstance());
this.addAbility(VigilanceAbility.getInstance());
+ this.addAbility(IndestructibleAbility.getInstance());
- // Avacyn, Angel of Hope and other permanents you control are indestructible.
- FilterControlledPermanent filter = new FilterControlledPermanent("Avacyn, Angel of Hope and other permanents you control");
- Effect effect = new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filter, false);
- effect.setText("{this} and other permanents you control are indestructible");
+ // Other permanents you control are indestructible.
+ FilterControlledPermanent filter = new FilterControlledPermanent("Other permanents you control");
+ Effect effect = new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filter, true);
+ effect.setText("Other permanents you control are indestructible");
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/CallToServe.java b/Mage.Sets/src/mage/sets/avacynrestored/CallToServe.java
index a0453080103..72e5a85d72f 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/CallToServe.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/CallToServe.java
@@ -28,11 +28,10 @@
package mage.sets.avacynrestored;
import java.util.UUID;
-
-import mage.constants.*;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.continuous.AddCardSubtypeAttachedEffect;
import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
@@ -40,6 +39,12 @@ import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ColorPredicate;
@@ -51,6 +56,7 @@ import mage.target.common.TargetCreaturePermanent;
* @author Loki
*/
public class CallToServe extends CardImpl {
+
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nonblack creature");
static {
@@ -62,18 +68,22 @@ public class CallToServe extends CardImpl {
this.expansionSetCode = "AVR";
this.subtype.add("Aura");
-
// Enchant nonblack creature
- TargetPermanent auraTarget = new TargetCreaturePermanent();
+ TargetPermanent auraTarget = new TargetCreaturePermanent(filter);
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
Ability ability = new EnchantAbility(auraTarget.getTargetName());
this.addAbility(ability);
// Enchanted creature gets +1/+2, has flying, and is an Angel in addition to its other types.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 2, Duration.WhileOnBattlefield)));
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA)));
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AddCardSubtypeAttachedEffect("Angel", Duration.WhileOnBattlefield, AttachmentType.AURA)));
+ ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 2, Duration.WhileOnBattlefield));
+ Effect effect = new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA);
+ effect.setText(", has flying");
+ ability.addEffect(effect);
+ effect = new AddCardSubtypeAttachedEffect("Angel", Duration.WhileOnBattlefield, AttachmentType.AURA);
+ effect.setText(", and is an Angel in addition to its other types");
+ ability.addEffect(effect);
+ this.addAbility(ability);
}
public CallToServe(final CallToServe card) {
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/CavernOfSouls.java b/Mage.Sets/src/mage/sets/avacynrestored/CavernOfSouls.java
index 00e88453cb5..5ff7b12ef69 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/CavernOfSouls.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/CavernOfSouls.java
@@ -38,15 +38,12 @@ import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ChooseCreatureTypeEffect;
import mage.abilities.mana.ColorlessManaAbility;
import mage.abilities.mana.ConditionalAnyColorManaAbility;
import mage.abilities.mana.builder.ConditionalManaBuilder;
import mage.abilities.mana.conditional.CreatureCastManaCondition;
import mage.cards.CardImpl;
-import mage.cards.repository.CardRepository;
-import mage.choices.Choice;
-import mage.choices.ChoiceImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
@@ -55,10 +52,8 @@ import mage.constants.WatcherScope;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
-import mage.game.permanent.Permanent;
import mage.game.stack.Spell;
import mage.players.Player;
-import mage.util.CardUtil;
import mage.watchers.Watcher;
/**
@@ -67,14 +62,12 @@ import mage.watchers.Watcher;
*/
public class CavernOfSouls extends CardImpl {
- private static final String ruleText = "choose a creature type";
-
public CavernOfSouls(UUID ownerId) {
super(ownerId, 226, "Cavern of Souls", Rarity.RARE, new CardType[]{CardType.LAND}, "");
this.expansionSetCode = "AVR";
// As Cavern of Souls enters the battlefield, choose a creature type.
- this.addAbility(new AsEntersBattlefieldAbility(new CavernOfSoulsEffect(), ruleText));
+ this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.BoostCreature)));
// {T}: Add {1} to your mana pool.
this.addAbility(new ColorlessManaAbility());
@@ -82,7 +75,7 @@ public class CavernOfSouls extends CardImpl {
// {T}: Add one mana of any color to your mana pool. Spend this mana only to cast a creature spell of the chosen type, and that spell can't be countered.
Ability ability = new ConditionalAnyColorManaAbility(new TapSourceCost(), 1, new CavernOfSoulsManaBuilder(), true);
this.addAbility(ability, new CavernOfSoulsWatcher(ability.getOriginalId()));
- this.addAbility(new SimpleStaticAbility(Zone.ALL, new CavernOfSoulsCantCounterEffect()));
+ this.addAbility(new SimpleStaticAbility(Zone.ALL, new CavernOfSoulsCantCounterEffect()));
}
public CavernOfSouls(final CavernOfSouls card) {
@@ -95,60 +88,23 @@ public class CavernOfSouls extends CardImpl {
}
}
-class CavernOfSoulsEffect extends OneShotEffect {
-
- public CavernOfSoulsEffect() {
- super(Outcome.Benefit);
- staticText = "As {this} enters the battlefield, choose a creature type";
- }
-
- public CavernOfSoulsEffect(final CavernOfSoulsEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- Permanent permanent = game.getPermanent(source.getSourceId());
- if (player != null && permanent != null) {
- Choice typeChoice = new ChoiceImpl(true);
- typeChoice.setMessage("Choose creature type");
- typeChoice.setChoices(CardRepository.instance.getCreatureTypes());
- while (!player.choose(Outcome.Benefit, typeChoice, game)) {
- if (!player.canRespond()) {
- return false;
- }
- }
- game.informPlayers(permanent.getName() + ": " + player.getLogName() + " has chosen " + typeChoice.getChoice());
- game.getState().setValue(permanent.getId() + "_type", typeChoice.getChoice());
- permanent.addInfo("chosen type", CardUtil.addToolTipMarkTags("Chosen type: " + typeChoice.getChoice()), game);
- }
- return false;
- }
-
- @Override
- public CavernOfSoulsEffect copy() {
- return new CavernOfSoulsEffect(this);
- }
-}
-
class CavernOfSoulsManaBuilder extends ConditionalManaBuilder {
String creatureType;
-
+
@Override
public ConditionalManaBuilder setMana(Mana mana, Ability source, Game game) {
Object value = game.getState().getValue(source.getSourceId() + "_type");
if (value != null && value instanceof String) {
creatureType = (String) value;
- }
+ }
Player controller = game.getPlayer(source.getControllerId());
MageObject sourceObject = game.getObject(source.getSourceId());
if (controller != null && sourceObject != null) {
- game.informPlayers(controller.getLogName() + " produces " + mana.toString() + " with " + sourceObject.getLogName() +
- " (can only be spend to cast for creatures of type " + creatureType + " and that spell can't be countered)");
- }
- return super.setMana(mana, source, game);
+ game.informPlayers(controller.getLogName() + " produces " + mana.toString() + " with " + sourceObject.getLogName()
+ + " (can only be spend to cast for creatures of type " + creatureType + " and that spell can't be countered)");
+ }
+ return super.setMana(mana, source, game);
}
@Override
@@ -174,11 +130,11 @@ class CavernOfSoulsConditionalMana extends ConditionalMana {
class CavernOfSoulsManaCondition extends CreatureCastManaCondition {
String creatureType;
-
+
CavernOfSoulsManaCondition(String creatureType) {
this.creatureType = creatureType;
}
-
+
@Override
public boolean apply(Game game, Ability source, UUID manaProducer) {
// check: ... to cast a creature spell
@@ -197,7 +153,7 @@ class CavernOfSoulsWatcher extends Watcher {
private List spells = new ArrayList<>();
private final String originalId;
-
+
public CavernOfSoulsWatcher(UUID originalId) {
super("ManaPaidFromCavernOfSoulsWatcher", WatcherScope.CARD);
this.originalId = originalId.toString();
@@ -222,7 +178,7 @@ class CavernOfSoulsWatcher extends Watcher {
}
}
}
-
+
public boolean spellCantBeCountered(UUID spellId) {
return spells.contains(spellId);
}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/Cloudshift.java b/Mage.Sets/src/mage/sets/avacynrestored/Cloudshift.java
index 49d08482134..42c785000e2 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/Cloudshift.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/Cloudshift.java
@@ -27,15 +27,15 @@
*/
package mage.sets.avacynrestored;
-import mage.constants.CardType;
-import mage.constants.Rarity;
+import java.util.UUID;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ExileTargetForSourceEffect;
import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
import mage.target.common.TargetControlledCreaturePermanent;
-import java.util.UUID;
-
/**
*
* @author noxx
@@ -46,10 +46,11 @@ public class Cloudshift extends CardImpl {
super(ownerId, 12, "Cloudshift", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{W}");
this.expansionSetCode = "AVR";
-
// Exile target creature you control, then return that card to the battlefield under your control.
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
- this.getSpellAbility().addEffect(new ExileTargetForSourceEffect());
+ Effect effect = new ExileTargetForSourceEffect();
+ effect.setApplyEffectsAfter();
+ this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addEffect(new ReturnToBattlefieldUnderYourControlTargetEffect(true));
}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/CommandersAuthority.java b/Mage.Sets/src/mage/sets/avacynrestored/CommandersAuthority.java
index 7ec41d11dad..a408d0b7fe4 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/CommandersAuthority.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/CommandersAuthority.java
@@ -28,8 +28,6 @@
package mage.sets.avacynrestored;
import java.util.UUID;
-
-import mage.constants.*;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -38,6 +36,13 @@ import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.game.permanent.token.HumanToken;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/DemonicRising.java b/Mage.Sets/src/mage/sets/avacynrestored/DemonicRising.java
index b3f1f6ee608..c320fa32841 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/DemonicRising.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/DemonicRising.java
@@ -29,7 +29,6 @@ package mage.sets.avacynrestored;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.TriggeredAbility;
import mage.abilities.common.BeginningOfYourEndStepTriggeredAbility;
@@ -38,7 +37,7 @@ import mage.abilities.decorator.ConditionalTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.DemonToken;
import java.util.UUID;
@@ -53,7 +52,6 @@ public class DemonicRising extends CardImpl {
super(ownerId, 94, "Demonic Rising", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}");
this.expansionSetCode = "AVR";
-
// At the beginning of your end step, if you control exactly one creature, put a 5/5 black Demon creature token with flying onto the battlefield.
TriggeredAbility ability = new BeginningOfYourEndStepTriggeredAbility(new CreateTokenEffect(new DemonToken()), false);
this.addAbility(new ConditionalTriggeredAbility(ability, OneControlledCreatureCondition.getInstance(), ruleText));
@@ -68,15 +66,3 @@ public class DemonicRising extends CardImpl {
return new DemonicRising(this);
}
}
-
-class DemonToken extends Token {
- public DemonToken() {
- super("Demon", "a 5/5 black Demon creature token with flying");
- cardType.add(CardType.CREATURE);
- color.setBlack(true);
- subtype.add("Demon");
- power = new MageInt(5);
- toughness = new MageInt(5);
- addAbility(FlyingAbility.getInstance());
- }
-}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/DevastationTide.java b/Mage.Sets/src/mage/sets/avacynrestored/DevastationTide.java
index 2a13b1ecf80..126fc303e65 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/DevastationTide.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/DevastationTide.java
@@ -27,20 +27,23 @@
*/
package mage.sets.avacynrestored;
+import java.util.LinkedHashSet;
+import java.util.Set;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.abilities.Ability;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.MiracleAbility;
+import mage.cards.Card;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.common.FilterNonlandPermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
-
+import mage.players.Player;
/**
*
@@ -52,7 +55,6 @@ public class DevastationTide extends CardImpl {
super(ownerId, 48, "Devastation Tide", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{U}{U}");
this.expansionSetCode = "AVR";
-
// Return all nonland permanents to their owners' hands.
this.getSpellAbility().addEffect(new DevastationTideEffect());
@@ -83,10 +85,17 @@ class DevastationTideEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- for (Permanent creature : game.getBattlefield().getActivePermanents(new FilterNonlandPermanent(), source.getControllerId(), source.getSourceId(), game)) {
- creature.moveToZone(Zone.HAND, source.getSourceId(), game, true);
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ Set cardsToHand = new LinkedHashSet<>();
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterNonlandPermanent(), source.getControllerId(), source.getSourceId(), game)) {
+ cardsToHand.add((Card) permanent);
+ }
+ controller.moveCards(cardsToHand, null, Zone.HAND, source, game);
+ return true;
+
}
- return true;
+ return false;
}
@Override
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/GallowsAtWillowHill.java b/Mage.Sets/src/mage/sets/avacynrestored/GallowsAtWillowHill.java
index 0d5cdcee9d5..7a5f29fbcd0 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/GallowsAtWillowHill.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/GallowsAtWillowHill.java
@@ -34,6 +34,7 @@ import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.common.TapTargetCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
@@ -46,7 +47,6 @@ import mage.filter.predicate.permanent.TappedPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.SpiritWhiteToken;
-import mage.game.permanent.token.Token;
import mage.players.Player;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetCreaturePermanent;
@@ -111,8 +111,7 @@ class GallowsAtWillowHillEffect extends OneShotEffect {
Player controller = game.getPlayer(permanent.getControllerId());
permanent.destroy(source.getSourceId(), game, false);
if (controller != null) {
- Token spirit = new SpiritWhiteToken("AVR", 1);
- spirit.putOntoBattlefield(1, game, source.getSourceId(), controller.getId());
+ new CreateTokenEffect(new SpiritWhiteToken()).apply(game, source);
}
affectedTargets++;
}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/GloomSurgeon.java b/Mage.Sets/src/mage/sets/avacynrestored/GloomSurgeon.java
index 1e1c67ad312..b1881c58e86 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/GloomSurgeon.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/GloomSurgeon.java
@@ -27,20 +27,22 @@
*/
package mage.sets.avacynrestored;
-import mage.constants.*;
+import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ReplacementEffectImpl;
-import mage.cards.Card;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.DamageCreatureEvent;
import mage.game.events.GameEvent;
import mage.players.Player;
-import java.util.UUID;
-
/**
* @author noxx
*/
@@ -86,19 +88,19 @@ class GloomSurgeonEffect extends ReplacementEffectImpl {
int preventedDamage = event.getAmount();
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.PREVENTED_DAMAGE, source.getFirstTarget(), source.getSourceId(), source.getControllerId(), preventedDamage));
Player player = game.getPlayer(source.getControllerId());
- if (player != null) {
- player.moveCards(player.getLibrary().getTopCards(game, preventedDamage), Zone.LIBRARY, Zone.EXILED, source, game);
+ if (player != null) {
+ player.moveCards(player.getLibrary().getTopCards(game, preventedDamage), Zone.EXILED, source, game);
}
return true;
}
return false;
}
-
+
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGE_CREATURE;
}
-
+
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (event.getTargetId().equals(source.getSourceId())) {
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/InfiniteReflection.java b/Mage.Sets/src/mage/sets/avacynrestored/InfiniteReflection.java
index 3f79caf503d..e2b81f4ec57 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/InfiniteReflection.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/InfiniteReflection.java
@@ -27,7 +27,8 @@
*/
package mage.sets.avacynrestored;
-import mage.constants.*;
+import java.util.UUID;
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -37,9 +38,15 @@ import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.game.Game;
+import mage.game.events.EntersTheBattlefieldEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.permanent.PermanentToken;
@@ -47,8 +54,6 @@ import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.util.functions.EmptyApplyToPermanent;
-import java.util.UUID;
-
/**
*
* @author noxx
@@ -60,7 +65,6 @@ public class InfiniteReflection extends CardImpl {
this.expansionSetCode = "AVR";
this.subtype.add("Aura");
-
// Enchant creature
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget);
@@ -109,9 +113,9 @@ class InfiniteReflectionTriggeredEffect extends OneShotEffect {
if (sourcePermanent != null && sourcePermanent.getAttachedTo() != null) {
Permanent toCopyFromPermanent = game.getPermanent(sourcePermanent.getAttachedTo());
if (toCopyFromPermanent != null) {
- for (Permanent toCopyToPermanent: game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) {
+ for (Permanent toCopyToPermanent : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) {
if (!toCopyToPermanent.equals(toCopyFromPermanent) && !(toCopyToPermanent instanceof PermanentToken)) {
- game.copyPermanent(toCopyFromPermanent, toCopyToPermanent, source, new EmptyApplyToPermanent());
+ game.copyPermanent(toCopyFromPermanent, toCopyToPermanent.getId(), source, new EmptyApplyToPermanent());
}
}
return true;
@@ -135,24 +139,23 @@ class InfiniteReflectionEntersBattlefieldEffect extends ReplacementEffectImpl {
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
}
-
+
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- Permanent permanent = game.getPermanent(event.getTargetId());
+ Permanent permanent = ((EntersTheBattlefieldEvent) event).getTarget();
return permanent != null && permanent.getControllerId().equals(source.getControllerId())
&& permanent.getCardType().contains(CardType.CREATURE)
&& !(permanent instanceof PermanentToken);
}
-
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- Permanent toCopyToPermanent = game.getPermanent(event.getTargetId());
+ MageObject toCopyToObject = ((EntersTheBattlefieldEvent) event).getTarget();
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
- if (sourcePermanent != null && toCopyToPermanent != null && sourcePermanent.getAttachedTo() != null) {
+ if (sourcePermanent != null && toCopyToObject != null && sourcePermanent.getAttachedTo() != null) {
Permanent toCopyFromPermanent = game.getPermanent(sourcePermanent.getAttachedTo());
if (toCopyFromPermanent != null) {
- game.copyPermanent(toCopyFromPermanent, toCopyToPermanent, source, new EmptyApplyToPermanent());
+ game.copyPermanent(toCopyFromPermanent, toCopyToObject.getId(), source, new EmptyApplyToPermanent());
}
}
return false;
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/MoonsilverSpear.java b/Mage.Sets/src/mage/sets/avacynrestored/MoonsilverSpear.java
index 83d3afff427..66ed9f70c7f 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/MoonsilverSpear.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/MoonsilverSpear.java
@@ -54,7 +54,7 @@ public class MoonsilverSpear extends CardImpl {
// Equipped creature has first strike.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.EQUIPMENT)));
// Whenever equipped creature attacks, put a 4/4 white Angel creature token with flying onto the battlefield.
- this.addAbility(new AttacksAttachedTriggeredAbility(new CreateTokenEffect(new AngelToken(expansionSetCode))));
+ this.addAbility(new AttacksAttachedTriggeredAbility(new CreateTokenEffect(new AngelToken())));
// Equip {4}
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(4)));
}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/NephaliaSmuggler.java b/Mage.Sets/src/mage/sets/avacynrestored/NephaliaSmuggler.java
index e5cdcfb0e65..d939c4a073e 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/NephaliaSmuggler.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/NephaliaSmuggler.java
@@ -38,6 +38,8 @@ import mage.abilities.effects.common.ExileTargetForSourceEffect;
import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEffect;
import mage.cards.CardImpl;
import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.permanent.AnotherPredicate;
import mage.target.common.TargetControlledCreaturePermanent;
import java.util.UUID;
@@ -47,6 +49,11 @@ import java.util.UUID;
*/
public class NephaliaSmuggler extends CardImpl {
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another target creature you control");
+ static {
+ filter.add(new AnotherPredicate());
+ }
+
public NephaliaSmuggler(UUID ownerId) {
super(ownerId, 69, "Nephalia Smuggler", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{U}");
this.expansionSetCode = "AVR";
@@ -60,7 +67,7 @@ public class NephaliaSmuggler extends CardImpl {
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetForSourceEffect(), new ManaCostsImpl("{3}{U}"));
ability.addCost(new TapSourceCost());
ability.addEffect(new ReturnToBattlefieldUnderYourControlTargetEffect(true));
- ability.addTarget(new TargetControlledCreaturePermanent());
+ ability.addTarget(new TargetControlledCreaturePermanent(filter));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/PillarOfFlame.java b/Mage.Sets/src/mage/sets/avacynrestored/PillarOfFlame.java
index 014284bd8e5..ed8b8b3b02c 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/PillarOfFlame.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/PillarOfFlame.java
@@ -74,51 +74,3 @@ public class PillarOfFlame extends CardImpl {
return new PillarOfFlame(this);
}
}
-
-class PillarOfFlameEffect extends ReplacementEffectImpl {
-
- public PillarOfFlameEffect() {
- super(Duration.EndOfTurn, Outcome.Exile);
- staticText = "If a creature dealt damage this way would die this turn, exile it instead";
- }
-
- public PillarOfFlameEffect(final PillarOfFlameEffect effect) {
- super(effect);
- }
-
- @Override
- public PillarOfFlameEffect copy() {
- return new PillarOfFlameEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- return true;
- }
-
- @Override
- public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- Player controller = game.getPlayer(source.getControllerId());
- Permanent permanent = ((ZoneChangeEvent) event).getTarget();
- if (controller != null && permanent != null) {
- return controller.moveCards(permanent, Zone.BATTLEFIELD, Zone.EXILED, source, game);
- }
- return false;
- }
-
- @Override
- public boolean checksEventType(GameEvent event, Game game) {
- return event.getType() == EventType.ZONE_CHANGE;
- }
-
- @Override
- public boolean applies(GameEvent event, Ability source, Game game) {
- if (((ZoneChangeEvent) event).isDiesEvent()) {
- DamagedByWatcher watcher = (DamagedByWatcher) game.getState().getWatchers().get("DamagedByWatcher", source.getSourceId());
- if (watcher != null) {
- return watcher.wasDamaged(event.getTargetId(), game);
- }
- }
- return false;
- }
-}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/ReforgeTheSoul.java b/Mage.Sets/src/mage/sets/avacynrestored/ReforgeTheSoul.java
index 7047040a5fc..90ac73de417 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/ReforgeTheSoul.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/ReforgeTheSoul.java
@@ -28,17 +28,14 @@
package mage.sets.avacynrestored;
import java.util.UUID;
-import mage.abilities.Ability;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DrawCardAllEffect;
+import mage.abilities.effects.common.discard.DiscardHandAllEffect;
import mage.abilities.keyword.MiracleAbility;
-import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
-import mage.constants.Outcome;
import mage.constants.Rarity;
-import mage.game.Game;
-import mage.players.Player;
/**
*
@@ -50,9 +47,11 @@ public class ReforgeTheSoul extends CardImpl {
super(ownerId, 151, "Reforge the Soul", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{R}{R}");
this.expansionSetCode = "AVR";
-
// Each player discards his or her hand, then draws seven cards.
- this.getSpellAbility().addEffect(new ReforgeTheSoulEffect());
+ this.getSpellAbility().addEffect(new DiscardHandAllEffect());
+ Effect effect = new DrawCardAllEffect(7);
+ effect.setText(", then draws seven cards");
+ this.getSpellAbility().addEffect(effect);
// Miracle {1}{R}
this.addAbility(new MiracleAbility(this, new ManaCostsImpl("{1}{R}")));
@@ -67,39 +66,3 @@ public class ReforgeTheSoul extends CardImpl {
return new ReforgeTheSoul(this);
}
}
-
-class ReforgeTheSoulEffect extends OneShotEffect {
-
- public ReforgeTheSoulEffect() {
- super(Outcome.DrawCard);
- this.staticText = "Each player discards his or her hand, then draws seven cards";
- }
-
- public ReforgeTheSoulEffect(final ReforgeTheSoulEffect effect) {
- super(effect);
- }
-
- @Override
- public ReforgeTheSoulEffect copy() {
- return new ReforgeTheSoulEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller != null) {
- for (UUID playerId : controller.getInRange()) {
- Player player = game.getPlayer(playerId);
- if (player != null) {
- for (Card card : player.getHand().getCards(game)) {
- player.discard(card, source, game);
- }
-
- player.drawCards(7, game);
- }
- }
- return true;
- }
- return false;
- }
-}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/RestorationAngel.java b/Mage.Sets/src/mage/sets/avacynrestored/RestorationAngel.java
index bd3043c6e72..65582db1bf7 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/RestorationAngel.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/RestorationAngel.java
@@ -51,7 +51,7 @@ import mage.target.common.TargetControlledCreaturePermanent;
/**
*
* @author noxx
-
+ *
*/
public class RestorationAngel extends CardImpl {
@@ -71,7 +71,7 @@ public class RestorationAngel extends CardImpl {
this.addAbility(FlashAbility.getInstance());
this.addAbility(FlyingAbility.getInstance());
-
+
// When Restoration Angel enters the battlefield, you may exile target non-Angel creature you control, then return that card to the battlefield under your control
Ability ability = new EntersBattlefieldTriggeredAbility(new RestorationAngelEffect(), true);
ability.addTarget(new TargetControlledCreaturePermanent(1, 1, filter, false));
@@ -111,11 +111,13 @@ class RestorationAngelEffect extends OneShotEffect {
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
if (permanent != null && sourcePermanent != null) {
- controller.moveCardToExileWithInfo(permanent, source.getSourceId(), sourcePermanent.getIdName(), source.getSourceId(), game, Zone.BATTLEFIELD, true);
- Card card = game.getCard(targetPointer.getFirst(game, source));
- if (card != null) {
- Zone currentZone = game.getState().getZone(card.getId());
- return controller.putOntoBattlefieldWithInfo(card, game, currentZone, source.getSourceId());
+ int zcc = permanent.getZoneChangeCounter(game);
+ controller.moveCards(permanent, Zone.EXILED, source, game);
+ Card card = game.getCard(permanent.getId());
+ if (card != null
+ && card.getZoneChangeCounter(game) == zcc + 1
+ && game.getState().getZone(card.getId()).equals(Zone.EXILED)) {
+ return controller.moveCards(card, Zone.BATTLEFIELD, source, game);
}
}
}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/RidersOfGavony.java b/Mage.Sets/src/mage/sets/avacynrestored/RidersOfGavony.java
index 8a0ead3bfc9..2f687150aa7 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/RidersOfGavony.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/RidersOfGavony.java
@@ -27,27 +27,28 @@
*/
package mage.sets.avacynrestored;
-import mage.constants.*;
+import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousEffectImpl;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ChooseCreatureTypeEffect;
import mage.abilities.keyword.ProtectionAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
-import mage.cards.repository.CardRepository;
-import mage.choices.Choice;
-import mage.choices.ChoiceImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Layer;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.SubLayer;
+import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
-import mage.players.Player;
-
-import java.util.UUID;
/**
* @author noxx
@@ -66,7 +67,7 @@ public class RidersOfGavony extends CardImpl {
this.addAbility(VigilanceAbility.getInstance());
// As Riders of Gavony enters the battlefield, choose a creature type.
- this.addAbility(new AsEntersBattlefieldAbility(new RidersOfGavonyEffect()));
+ this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.Protect)));
// Human creatures you control have protection from creatures of the chosen type.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new RidersOfGavonyGainAbilityControlledEffect()));
@@ -82,46 +83,6 @@ public class RidersOfGavony extends CardImpl {
}
}
-class RidersOfGavonyEffect extends OneShotEffect {
-
- public RidersOfGavonyEffect() {
- super(Outcome.BoostCreature);
- staticText = "choose a creature type";
- }
-
- public RidersOfGavonyEffect(final RidersOfGavonyEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- Permanent permanent = game.getPermanent(source.getSourceId());
- if (player != null && permanent != null) {
- Choice typeChoice = new ChoiceImpl(true);
- typeChoice.setMessage("Choose creature type");
- typeChoice.setChoices(CardRepository.instance.getCreatureTypes());
- while (!player.choose(Outcome.BoostCreature, typeChoice, game)) {
- if (!player.canRespond()) {
- return false;
- }
- }
- if (typeChoice.getChoice() != null) {
- game.informPlayers(permanent.getName() + ": " + player.getLogName() + " has chosen " + typeChoice.getChoice());
- game.getState().setValue(permanent.getId() + "_type", typeChoice.getChoice());
- permanent.addInfo("chosen type", "Chosen type: " + typeChoice.getChoice() + "", game);
- }
- }
- return false;
- }
-
- @Override
- public RidersOfGavonyEffect copy() {
- return new RidersOfGavonyEffect(this);
- }
-
-}
-
class RidersOfGavonyGainAbilityControlledEffect extends ContinuousEffectImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Human creatures you control");
@@ -154,13 +115,13 @@ class RidersOfGavonyGainAbilityControlledEffect extends ContinuousEffectImpl {
if (permanent != null) {
String subtype = (String) game.getState().getValue(permanent.getId() + "_type");
if (subtype != null) {
- protectionFilter = new FilterPermanent(subtype+"s");
+ protectionFilter = new FilterPermanent(subtype + "s");
protectionFilter.add(new SubtypePredicate(subtype));
}
}
}
if (protectionFilter != null) {
- for (Permanent perm: game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) {
+ for (Permanent perm : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) {
perm.addAbility(new ProtectionAbility(protectionFilter), source.getSourceId(), game);
}
return true;
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/SternMentor.java b/Mage.Sets/src/mage/sets/avacynrestored/SternMentor.java
index 23757600e70..feb58ede09a 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/SternMentor.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/SternMentor.java
@@ -47,7 +47,7 @@ import mage.target.TargetPlayer;
*/
public class SternMentor extends CardImpl {
- private static final String ruleText = "As long as {this} is paired with another creature, each of those creatures has \"{tap}: Target player puts the top two cards of his or her library into his or her graveyard.\"";
+ private static final String ruleText = "As long as {this} is paired with another creature, each of those creatures has \"{T}: Target player puts the top two cards of his or her library into his or her graveyard.\"";
public SternMentor(UUID ownerId) {
super(ownerId, 77, "Stern Mentor", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{U}");
@@ -61,7 +61,7 @@ public class SternMentor extends CardImpl {
// Soulbond
this.addAbility(SoulbondAbility.getInstance());
- // As long as Stern Mentor is paired with another creature, each of those creatures has "{t}: Target player puts the top two cards of his or her library into his or her graveyard."
+ // As long as Stern Mentor is paired with another creature, each of those creatures has "{T}: Target player puts the top two cards of his or her library into his or her graveyard."
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLibraryIntoGraveTargetEffect(2), new TapSourceCost());
ability.addTarget(new TargetPlayer());
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityPairedEffect(ability, ruleText)));
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/StolenGoods.java b/Mage.Sets/src/mage/sets/avacynrestored/StolenGoods.java
index 7709f8614fb..591adb8e6a1 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/StolenGoods.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/StolenGoods.java
@@ -27,21 +27,24 @@
*/
package mage.sets.avacynrestored;
-import mage.constants.*;
+import java.util.UUID;
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.effects.AsThoughEffectImpl;
+import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
-import mage.cards.CardsImpl;
+import mage.constants.AsThoughEffectType;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.game.Game;
import mage.players.Library;
import mage.players.Player;
import mage.target.common.TargetOpponent;
-
-import java.util.UUID;
-import mage.MageObject;
-import mage.abilities.effects.ContinuousEffect;
import mage.target.targetpointer.FixedTarget;
/**
@@ -54,7 +57,6 @@ public class StolenGoods extends CardImpl {
super(ownerId, 78, "Stolen Goods", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{U}");
this.expansionSetCode = "AVR";
-
// Target opponent exiles cards from the top of his or her library until he or she exiles a nonland card. Until end of turn, you may cast that card without paying its mana cost.
this.getSpellAbility().addEffect(new StolenGoodsEffect());
this.getSpellAbility().addTarget(new TargetOpponent());
@@ -96,14 +98,13 @@ class StolenGoodsEffect extends OneShotEffect {
do {
card = library.removeFromTop(game);
if (card != null) {
- opponent.moveCardToExileWithInfo(card, source.getSourceId(), sourceObject.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true);
+ opponent.moveCardsToExile(card, source, game, true, source.getSourceId(), sourceObject.getIdName());
}
} while (library.size() > 0 && card != null && card.getCardType().contains(CardType.LAND));
if (card != null) {
- opponent.revealCards("Card to cast", new CardsImpl(card), game);
ContinuousEffect effect = new StolenGoodsCastFromExileEffect();
- effect.setTargetPointer(new FixedTarget(card.getId()));
+ effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game)));
game.addEffect(effect, source);
}
return true;
@@ -135,11 +136,12 @@ class StolenGoodsCastFromExileEffect extends AsThoughEffectImpl {
@Override
public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) {
- if (getTargetPointer().getFirst(game, source).equals(sourceId) && affectedControllerId.equals(source.getControllerId())) {
+ if (sourceId != null && sourceId.equals(getTargetPointer().getFirst(game, source))
+ && affectedControllerId.equals(source.getControllerId())) {
Card card = game.getCard(sourceId);
if (card != null && game.getState().getZone(sourceId) == Zone.EXILED) {
Player player = game.getPlayer(affectedControllerId);
- player.setCastSourceIdWithAlternateMana(sourceId, null);
+ player.setCastSourceIdWithAlternateMana(sourceId, null, null);
return true;
}
}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/TamiyoTheMoonSage.java b/Mage.Sets/src/mage/sets/avacynrestored/TamiyoTheMoonSage.java
index 9e716508d32..19905589e8d 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/TamiyoTheMoonSage.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/TamiyoTheMoonSage.java
@@ -30,19 +30,18 @@ package mage.sets.avacynrestored;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
-import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.GetEmblemEffect;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
-import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect;
import mage.abilities.effects.common.TapTargetEffect;
import mage.abilities.effects.common.continuous.MaximumHandSizeControllerEffect;
import mage.abilities.effects.common.continuous.MaximumHandSizeControllerEffect.HandSizeModification;
-import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
@@ -50,7 +49,6 @@ import mage.constants.Rarity;
import mage.constants.SetTargetPointer;
import mage.constants.TargetController;
import mage.constants.Zone;
-import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.TappedPredicate;
@@ -71,8 +69,7 @@ public class TamiyoTheMoonSage extends CardImpl {
this.expansionSetCode = "AVR";
this.subtype.add("Tamiyo");
-
- this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(4)), false));
+ this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
// +1: Tap target permanent. It doesn't untap during its controller's next untap step.
LoyaltyAbility ability = new LoyaltyAbility(new TapTargetEffect(), 1);
@@ -130,7 +127,8 @@ class TappedCreaturesControlledByTargetCount implements DynamicValue {
}
/**
- * Emblem with "You have no maximum hand size" and "Whenever a card is put into your graveyard from anywhere, you may return it to your hand."
+ * Emblem with "You have no maximum hand size" and "Whenever a card is put into
+ * your graveyard from anywhere, you may return it to your hand."
*/
class TamiyoTheMoonSageEmblem extends Emblem {
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/ThatcherRevolt.java b/Mage.Sets/src/mage/sets/avacynrestored/ThatcherRevolt.java
index 141d60e8284..3e3518eebde 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/ThatcherRevolt.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/ThatcherRevolt.java
@@ -28,19 +28,19 @@
package mage.sets.avacynrestored;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.Ability;
-import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.SacrificeTargetEffect;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
import mage.game.Game;
+import mage.game.permanent.Permanent;
import mage.game.permanent.token.Token;
import mage.target.targetpointer.FixedTarget;
@@ -54,7 +54,6 @@ public class ThatcherRevolt extends CardImpl {
super(ownerId, 158, "Thatcher Revolt", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{R}");
this.expansionSetCode = "AVR";
-
// Put three 1/1 red Human creature tokens with haste onto the battlefield. Sacrifice those tokens at the beginning of the next end step.
this.getSpellAbility().addEffect(new ThatcherRevoltEffect());
}
@@ -87,17 +86,15 @@ class ThatcherRevoltEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- for (int i = 0; i < 3; i++) {
- RedHumanToken token = new RedHumanToken();
- token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId());
-
- SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice this token");
- sacrificeEffect.setTargetPointer(new FixedTarget(token.getLastAddedToken()));
- DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect);
- delayedAbility.setSourceId(source.getSourceId());
- delayedAbility.setControllerId(source.getControllerId());
- delayedAbility.setSourceObject(source.getSourceObject(game), game);
- game.addDelayedTriggeredAbility(delayedAbility);
+ RedHumanToken token = new RedHumanToken();
+ token.putOntoBattlefield(3, game, source.getSourceId(), source.getControllerId());
+ for (UUID tokenId : token.getLastAddedTokenIds()) {
+ Permanent tokenPermanent = game.getPermanent(tokenId);
+ if (tokenPermanent != null) {
+ SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect();
+ sacrificeEffect.setTargetPointer(new FixedTarget(tokenPermanent, game));
+ game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect), source);
+ }
}
return true;
}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/TibaltTheFiendBlooded.java b/Mage.Sets/src/mage/sets/avacynrestored/TibaltTheFiendBlooded.java
index b899d7e651a..b17f824dd78 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/TibaltTheFiendBlooded.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/TibaltTheFiendBlooded.java
@@ -29,29 +29,27 @@ package mage.sets.avacynrestored;
import java.util.List;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Layer;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.SubLayer;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
-import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DamageTargetEffect;
-import mage.abilities.effects.common.discard.DiscardControllerEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
-import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.effects.common.discard.DiscardControllerEffect;
import mage.abilities.keyword.HasteAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
-import mage.counters.CounterType;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Layer;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.SubLayer;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
@@ -70,8 +68,7 @@ public class TibaltTheFiendBlooded extends CardImpl {
this.expansionSetCode = "AVR";
this.subtype.add("Tibalt");
-
- this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(2)), false));
+ this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(2));
// +1: Draw a card, then discard a card at random.
LoyaltyAbility ability = new LoyaltyAbility(new DrawCardSourceControllerEffect(1), 1);
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/TormentorsTrident.java b/Mage.Sets/src/mage/sets/avacynrestored/TormentorsTrident.java
index 6978d7118c5..ce92e18fccf 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/TormentorsTrident.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/TormentorsTrident.java
@@ -27,16 +27,21 @@
*/
package mage.sets.avacynrestored;
-import mage.constants.*;
-import mage.abilities.common.AttacksEachTurnStaticAbility;
+import java.util.UUID;
+import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.combat.AttacksIfAbleAttachedEffect;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
-import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.EquipAbility;
import mage.cards.CardImpl;
-
-import java.util.UUID;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
/**
*
@@ -51,8 +56,11 @@ public class TormentorsTrident extends CardImpl {
this.subtype.add("Equipment");
// Equipped creature gets +3/+0 and attacks each turn if able.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(3, 0)));
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(new AttacksEachTurnStaticAbility(), AttachmentType.EQUIPMENT)));
+ Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(3, 0));
+ Effect effect = new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.EQUIPMENT);
+ effect.setText("and attacks each turn if able");
+ ability.addEffect(effect);
+ this.addAbility(ability);
// Equip {3}
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(3)));
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/VoiceOfTheProvinces.java b/Mage.Sets/src/mage/sets/avacynrestored/VoiceOfTheProvinces.java
index 552e5d59c41..4cb50e37fe1 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/VoiceOfTheProvinces.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/VoiceOfTheProvinces.java
@@ -36,7 +36,7 @@ import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.HumanToken;
/**
*
@@ -66,15 +66,3 @@ public class VoiceOfTheProvinces extends CardImpl {
return new VoiceOfTheProvinces(this);
}
}
-
-class HumanToken extends Token {
- public HumanToken() {
- super("Human", "1/1 white Human creature token");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
-
- subtype.add("Human");
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/AdverseConditions.java b/Mage.Sets/src/mage/sets/battleforzendikar/AdverseConditions.java
new file mode 100644
index 00000000000..fef0c55058b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/AdverseConditions.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.game.permanent.token.EldraziScionToken;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AdverseConditions extends CardImpl {
+
+ public AdverseConditions(UUID ownerId) {
+ super(ownerId, 54, "Adverse Conditions", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+
+ // Tap up to two target creatures. Those creatures don't untap during their controller's next untap step.
+ this.getSpellAbility().addEffect(new TapTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2));
+ this.getSpellAbility().addEffect(new DontUntapInControllersNextUntapStepTargetEffect());
+ // Put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."
+ Effect effect = new CreateTokenEffect(new EldraziScionToken());
+ effect.setText("put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has \"Sacrifice this creature: Add {1} to your mana pool.\"");
+ this.getSpellAbility().addEffect(effect);
+
+ }
+
+ public AdverseConditions(final AdverseConditions card) {
+ super(card);
+ }
+
+ @Override
+ public AdverseConditions copy() {
+ return new AdverseConditions(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/AkoumFirebird.java b/Mage.Sets/src/mage/sets/battleforzendikar/AkoumFirebird.java
new file mode 100644
index 00000000000..d7333dbecc9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/AkoumFirebird.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.AttacksEachTurnStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AkoumFirebird extends CardImpl {
+
+ public AkoumFirebird(UUID ownerId) {
+ super(ownerId, 138, "Akoum Firebird", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{2}{R}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Phoenix");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Haste
+ this.addAbility(HasteAbility.getInstance());
+
+ // Akoum Firebird attacks each turn if able.
+ this.addAbility(new AttacksEachTurnStaticAbility());
+
+ // Landfall-Whenever a land enters the battlefield under your control, you may pay {4}{R}{R}.
+ // If you do, return Akoum Firebird from your graveyard to the battlefield.
+ this.addAbility(new AkoumFirebirdLandfallAbility(new DoIfCostPaid(
+ new ReturnSourceFromGraveyardToBattlefieldEffect(), new ManaCostsImpl("{4}{R}{R}")), false));
+ }
+
+ public AkoumFirebird(final AkoumFirebird card) {
+ super(card);
+ }
+
+ @Override
+ public AkoumFirebird copy() {
+ return new AkoumFirebird(this);
+ }
+}
+
+class AkoumFirebirdLandfallAbility extends TriggeredAbilityImpl {
+
+ public AkoumFirebirdLandfallAbility(Effect effect, boolean optional) {
+ this(Zone.GRAVEYARD, effect, optional);
+ }
+
+ public AkoumFirebirdLandfallAbility (Zone zone, Effect effect, Boolean optional ) {
+ super(zone, effect, optional);
+ }
+
+ public AkoumFirebirdLandfallAbility(final AkoumFirebirdLandfallAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent permanent = game.getPermanent(event.getTargetId());
+ return permanent != null && permanent.getCardType().contains(CardType.LAND) && permanent.getControllerId().equals(this.controllerId);
+ }
+
+ @Override
+ public String getRule() {
+ return "Landfall — Whenever a land enters the battlefield under your control, " + super.getRule();
+ }
+
+ @Override
+ public AkoumFirebirdLandfallAbility copy() {
+ return new AkoumFirebirdLandfallAbility(this);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/AkoumHellkite.java b/Mage.Sets/src/mage/sets/battleforzendikar/AkoumHellkite.java
new file mode 100644
index 00000000000..b1987a95f8f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/AkoumHellkite.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCreatureOrPlayer;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AkoumHellkite extends CardImpl {
+
+ public AkoumHellkite(UUID ownerId) {
+ super(ownerId, 139, "Akoum Hellkite", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{R}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Dragon");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Landfall-Whenever a land enters the battlefield under you control, Akoum Hellkite deals 1 damage to target creature or player.
+ // If that land is a Mountain, Akoum Hellkite deals 2 damage to that creature or player instead.
+ Ability ability = new AkoumHellkiteTriggeredAbility();
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public AkoumHellkite(final AkoumHellkite card) {
+ super(card);
+ }
+
+ @Override
+ public AkoumHellkite copy() {
+ return new AkoumHellkite(this);
+ }
+}
+
+class AkoumHellkiteTriggeredAbility extends TriggeredAbilityImpl {
+
+ private static final String text = "Landfall - Whenever a land enters the battlefield under your control, {this} deals 1 damage to target creature or player. "
+ + "If that land is a Mountain, Akoum Hellkite deals 2 damage to that creature or player instead.";
+
+ public AkoumHellkiteTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new AkoumHellkiteDamageEffect());
+ }
+
+ public AkoumHellkiteTriggeredAbility(final AkoumHellkiteTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public AkoumHellkiteTriggeredAbility copy() {
+ return new AkoumHellkiteTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent permanent = game.getPermanent(event.getTargetId());
+ if (permanent != null
+ && permanent.getCardType().contains(CardType.LAND)
+ && permanent.getControllerId().equals(getControllerId())) {
+ Permanent sourcePermanent = game.getPermanent(getSourceId());
+ if (sourcePermanent != null)
+ for (Effect effect : getEffects()) {
+ if (effect instanceof AkoumHellkiteDamageEffect) {
+ effect.setTargetPointer(new FixedTarget(permanent, game));
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return text;
+ }
+}
+
+class AkoumHellkiteDamageEffect extends OneShotEffect {
+
+ public AkoumHellkiteDamageEffect() {
+ super(Outcome.Damage);
+ }
+
+ public AkoumHellkiteDamageEffect(final AkoumHellkiteDamageEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public AkoumHellkiteDamageEffect copy() {
+ return new AkoumHellkiteDamageEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent land = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source));
+ Player player = game.getPlayer(source.getFirstTarget());
+ if (land != null && player != null) {
+ if (land.hasSubtype("Mountain")) {
+ player.damage(2, source.getSourceId(), game, false, true);
+ } else {
+ player.damage(1, source.getSourceId(), game, false, true);
+ }
+ return true;
+ }
+ Permanent permanent = game.getPermanent(source.getFirstTarget());
+ if (land != null && permanent != null) {
+ if (land.hasSubtype("Mountain")) {
+ permanent.damage(2, source.getSourceId(), game, false, true);
+ } else {
+ permanent.damage(1, source.getSourceId(), game, false, true);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/AkoumStonewaker.java b/Mage.Sets/src/mage/sets/battleforzendikar/AkoumStonewaker.java
new file mode 100644
index 00000000000..66d3ca61ff6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/AkoumStonewaker.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.game.permanent.token.Token;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AkoumStonewaker extends CardImpl {
+
+ public AkoumStonewaker(UUID ownerId) {
+ super(ownerId, 140, "Akoum Stonewaker", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Shaman");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Landfall — Whenever a land enters the battlefield under your control, you may pay {2}{R}. If you do, put a 3/1 red Elemental creature token with trample and haste onto the battlefield.
+ // Exile that token at the beginning of the next end step.
+ this.addAbility(new LandfallAbility(new DoIfCostPaid(new AkoumStonewakerEffect(), new ManaCostsImpl("{2}{R}")), false));
+
+ }
+
+ public AkoumStonewaker(final AkoumStonewaker card) {
+ super(card);
+ }
+
+ @Override
+ public AkoumStonewaker copy() {
+ return new AkoumStonewaker(this);
+ }
+}
+
+class AkoumStonewakerEffect extends OneShotEffect {
+
+ public AkoumStonewakerEffect() {
+ super(Outcome.PutCreatureInPlay);
+ this.staticText = "put a 3/1 red Elemental creature token with trample and haste onto the battlefield. Exile that token at the beginning of the next end step";
+ }
+
+ public AkoumStonewakerEffect(final AkoumStonewakerEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public AkoumStonewakerEffect copy() {
+ return new AkoumStonewakerEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Token token = new AkoumStonewakerElementalToken();
+ if (token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId())) {
+ for (UUID tokenId : token.getLastAddedTokenIds()) {
+ Permanent tokenPermanent = game.getPermanent(tokenId);
+ if (tokenPermanent != null) {
+ ExileTargetEffect exileEffect = new ExileTargetEffect();
+ exileEffect.setTargetPointer(new FixedTarget(tokenPermanent, game));
+ game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect), source);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
+
+class AkoumStonewakerElementalToken extends Token {
+
+ public AkoumStonewakerElementalToken() {
+ super("Elemental", "3/1 red Elemental creature token with trample and haste");
+ cardType.add(CardType.CREATURE);
+ color.setRed(true);
+ subtype.add("Elemental");
+ power = new MageInt(3);
+ toughness = new MageInt(1);
+ this.addAbility(TrampleAbility.getInstance());
+ this.addAbility(HasteAbility.getInstance());
+ this.setOriginalExpansionSetCode("BFZ");
+ this.setTokenType(1);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/AlignedHedronNetwork.java b/Mage.Sets/src/mage/sets/battleforzendikar/AlignedHedronNetwork.java
new file mode 100644
index 00000000000..297ea626a5d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/AlignedHedronNetwork.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.delayed.OnLeaveReturnExiledToBattlefieldAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.filter.Filter;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.PowerPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.util.CardUtil;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AlignedHedronNetwork extends CardImpl {
+
+ public AlignedHedronNetwork(UUID ownerId) {
+ super(ownerId, 222, "Aligned Hedron Network", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{4}");
+ this.expansionSetCode = "BFZ";
+
+ // When Aligned Hedron Network enters the battlefield, exile all creatures with power 5 or greater until Aligned Hedron Network leaves the battlefield.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new AlignedHedronNetworkExileEffect(), false));
+ }
+
+ public AlignedHedronNetwork(final AlignedHedronNetwork card) {
+ super(card);
+ }
+
+ @Override
+ public AlignedHedronNetwork copy() {
+ return new AlignedHedronNetwork(this);
+ }
+}
+
+class AlignedHedronNetworkExileEffect extends OneShotEffect {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures with power 5 or greater");
+
+ static {
+ filter.add(new PowerPredicate(Filter.ComparisonType.GreaterThan, 4));
+ }
+
+ public AlignedHedronNetworkExileEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "exile all creatures with power 5 or greater until {this} leaves the battlefield";
+ }
+
+ public AlignedHedronNetworkExileEffect(final AlignedHedronNetworkExileEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public AlignedHedronNetworkExileEffect copy() {
+ return new AlignedHedronNetworkExileEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Permanent permanent = game.getPermanent(source.getSourceId());
+ // If Whale leaves the battlefield before its triggered ability resolves,
+ // the target creature won't be exiled.
+ if (controller != null && permanent != null) {
+ Set toExile = new LinkedHashSet<>();
+ for (Permanent creature : game.getBattlefield().getActivePermanents(filter, controller.getId(), source.getSourceId(), game)) {
+ toExile.add(creature);
+ }
+ if (!toExile.isEmpty()) {
+ controller.moveCardsToExile(toExile, source, game, true, CardUtil.getCardExileZoneId(game, source), permanent.getIdName());
+ new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility()).apply(game, source);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/AllyEncampment.java b/Mage.Sets/src/mage/sets/battleforzendikar/AllyEncampment.java
new file mode 100644
index 00000000000..8f2e4c81fb0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/AllyEncampment.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.ReturnToHandTargetEffect;
+import mage.abilities.mana.ColorlessManaAbility;
+import mage.abilities.mana.ConditionalAnyColorManaAbility;
+import mage.abilities.mana.conditional.ConditionalSpellManaBuilder;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterSpell;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AllyEncampment extends CardImpl {
+
+ private static final FilterSpell filter = new FilterSpell("an Ally spell");
+
+ static {
+ filter.add(new SubtypePredicate("Ally"));
+ }
+
+ public AllyEncampment(UUID ownerId) {
+ super(ownerId, 228, "Ally Encampment", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // {T}: Add {1} to your mana pool.
+ this.addAbility(new ColorlessManaAbility());
+
+ // {T} Add one mana of any color to your mana pool. Spend this mana only to cast an Ally spell.
+ this.addAbility(new ConditionalAnyColorManaAbility(new TapSourceCost(), 1, new ConditionalSpellManaBuilder(filter), true));
+
+ // {1}, {T}, Sacrifice Ally Encampment: Return target Ally you control to its owner's hand.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new GenericManaCost(1));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ ability.addTarget(new TargetControlledCreaturePermanent(new FilterControlledCreaturePermanent("Ally", "Ally you control")));
+ this.addAbility(ability);
+ }
+
+ public AllyEncampment(final AllyEncampment card) {
+ super(card);
+ }
+
+ @Override
+ public AllyEncampment copy() {
+ return new AllyEncampment(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/AltarsReap.java b/Mage.Sets/src/mage/sets/battleforzendikar/AltarsReap.java
new file mode 100644
index 00000000000..6af209c70a5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/AltarsReap.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AltarsReap extends mage.sets.innistrad.AltarsReap {
+
+ public AltarsReap(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 103;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public AltarsReap(final AltarsReap card) {
+ super(card);
+ }
+
+ @Override
+ public AltarsReap copy() {
+ return new AltarsReap(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/AngelOfRenewal.java b/Mage.Sets/src/mage/sets/battleforzendikar/AngelOfRenewal.java
new file mode 100644
index 00000000000..67671cfd94a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/AngelOfRenewal.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AngelOfRenewal extends CardImpl {
+
+ public AngelOfRenewal(UUID ownerId) {
+ super(ownerId, 18, "Angel of Renewal", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{5}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Angel");
+ this.subtype.add("Ally");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // When Angel of Renewal enters the battlefield, you gain 1 life for each creature you control.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(
+ new PermanentsOnBattlefieldCount(new FilterControlledCreaturePermanent()))));
+
+ }
+
+ public AngelOfRenewal(final AngelOfRenewal card) {
+ super(card);
+ }
+
+ @Override
+ public AngelOfRenewal copy() {
+ return new AngelOfRenewal(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/AngelicCaptain.java b/Mage.Sets/src/mage/sets/battleforzendikar/AngelicCaptain.java
new file mode 100644
index 00000000000..f984cb8a502
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/AngelicCaptain.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterAttackingCreature;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.permanent.AnotherPredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AngelicCaptain extends CardImpl {
+
+ private static final FilterAttackingCreature filter = new FilterAttackingCreature("other attacking Ally");
+
+ static {
+ filter.add(new SubtypePredicate("Ally"));
+ filter.add(new AnotherPredicate());
+ }
+
+ public AngelicCaptain(UUID ownerId) {
+ super(ownerId, 208, "Angelic Captain", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{R}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Angel");
+ this.subtype.add("Ally");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(3);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Whenever Angelic Captain attacks, it gets +1/+1 until end of turn for each other attacking Ally.
+ PermanentsOnBattlefieldCount value = new PermanentsOnBattlefieldCount(filter);
+ this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(value, value, Duration.EndOfTurn, true), false));
+ }
+
+ public AngelicCaptain(final AngelicCaptain card) {
+ super(card);
+ }
+
+ @Override
+ public AngelicCaptain copy() {
+ return new AngelicCaptain(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/AngelicGift.java b/Mage.Sets/src/mage/sets/battleforzendikar/AngelicGift.java
new file mode 100644
index 00000000000..66d622f82e5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/AngelicGift.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AngelicGift extends CardImpl {
+
+ public AngelicGift(UUID ownerId) {
+ super(ownerId, 19, "Angelic Gift", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Aura");
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+
+ // When Angelic Gift enters the battlefield, draw a card.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false));
+
+ // Enchanted creature has flying.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA)));
+ }
+
+ public AngelicGift(final AngelicGift card) {
+ super(card);
+ }
+
+ @Override
+ public AngelicGift copy() {
+ return new AngelicGift(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Anticipate.java b/Mage.Sets/src/mage/sets/battleforzendikar/Anticipate.java
new file mode 100644
index 00000000000..820a17c2723
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Anticipate.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Anticipate extends mage.sets.dragonsoftarkir.Anticipate {
+
+ public Anticipate(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 69;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Anticipate(final Anticipate card) {
+ super(card);
+ }
+
+ @Override
+ public Anticipate copy() {
+ return new Anticipate(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BaneOfBalaGed.java b/Mage.Sets/src/mage/sets/battleforzendikar/BaneOfBalaGed.java
new file mode 100644
index 00000000000..38e38e9c644
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BaneOfBalaGed.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.SetTargetPointer;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.Target;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BaneOfBalaGed extends CardImpl {
+
+ public BaneOfBalaGed(UUID ownerId) {
+ super(ownerId, 1, "Bane of Bala Ged", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{7}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(7);
+ this.toughness = new MageInt(5);
+
+ // Whenever Bane of Bala Ged attacks, defending player exiles two permanents he or she controls.
+ this.addAbility(new AttacksTriggeredAbility(new BaneOfBalaGedEffect(), false, "", SetTargetPointer.PLAYER));
+ }
+
+ public BaneOfBalaGed(final BaneOfBalaGed card) {
+ super(card);
+ }
+
+ @Override
+ public BaneOfBalaGed copy() {
+ return new BaneOfBalaGed(this);
+ }
+}
+
+class BaneOfBalaGedEffect extends OneShotEffect {
+
+ public BaneOfBalaGedEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "defending player exiles two permanents he or she controls";
+ }
+
+ public BaneOfBalaGedEffect(final BaneOfBalaGedEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public BaneOfBalaGedEffect copy() {
+ return new BaneOfBalaGedEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player defendingPlayer = game.getPlayer(getTargetPointer().getFirst(game, source));
+ if (defendingPlayer != null) {
+ Target target = new TargetControlledPermanent(2);
+ defendingPlayer.chooseTarget(outcome, target, source, game);
+ defendingPlayer.moveCards(new CardsImpl(target.getTargets()), null, Zone.EXILED, source, game);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BarrageTyrant.java b/Mage.Sets/src/mage/sets/battleforzendikar/BarrageTyrant.java
new file mode 100644
index 00000000000..d2c7973283f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BarrageTyrant.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesPower;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.target.common.TargetControlledCreaturePermanent;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BarrageTyrant extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another colorless creature");
+
+ static {
+ filter.add(new AnotherPredicate());
+ filter.add(new ColorlessPredicate());
+ }
+
+ public BarrageTyrant(UUID ownerId) {
+ super(ownerId, 127, "Barrage Tyrant", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // {2}{R}, Sacrifice another colorless creature: Barrage Tyrant deals damage equal to the sacrificed creature's power to target creature or player.
+ Effect effect = new DamageTargetEffect(new SacrificeCostCreaturesPower());
+ effect.setText("{this} deals damage equal to the sacrificed creature's power to target creature or player");
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{2}{R}"));
+ ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter)));
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public BarrageTyrant(final BarrageTyrant card) {
+ super(card);
+ }
+
+ @Override
+ public BarrageTyrant copy() {
+ return new BarrageTyrant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BeastcallerSavant.java b/Mage.Sets/src/mage/sets/battleforzendikar/BeastcallerSavant.java
new file mode 100644
index 00000000000..70fca955764
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BeastcallerSavant.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.HasteAbility;
+import mage.abilities.mana.ConditionalAnyColorManaAbility;
+import mage.abilities.mana.conditional.ConditionalSpellManaBuilder;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreatureSpell;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BeastcallerSavant extends CardImpl {
+
+ public BeastcallerSavant(UUID ownerId) {
+ super(ownerId, 170, "Beastcaller Savant", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elf");
+ this.subtype.add("Shaman");
+ this.subtype.add("Ally");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Haste
+ this.addAbility(HasteAbility.getInstance());
+
+ // {T}: Add one mana of any color to your mana pool. Spend this mana only to cast creature spells.
+ this.addAbility(new ConditionalAnyColorManaAbility(1, new ConditionalSpellManaBuilder(new FilterCreatureSpell("creature spells"))));
+ }
+
+ public BeastcallerSavant(final BeastcallerSavant card) {
+ super(card);
+ }
+
+ @Override
+ public BeastcallerSavant copy() {
+ return new BeastcallerSavant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BelligerentWhiptail.java b/Mage.Sets/src/mage/sets/battleforzendikar/BelligerentWhiptail.java
new file mode 100644
index 00000000000..587fa780eed
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BelligerentWhiptail.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BelligerentWhiptail extends CardImpl {
+
+ public BelligerentWhiptail(UUID ownerId) {
+ super(ownerId, 141, "Belligerent Whiptail", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Wurm");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(2);
+
+ // Landfall — Whenever a land enters the battlefield under your control, Belligerent Whiptail gains first strike until end of turn.
+ this.addAbility(new LandfallAbility(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn), false));
+
+ }
+
+ public BelligerentWhiptail(final BelligerentWhiptail card) {
+ super(card);
+ }
+
+ @Override
+ public BelligerentWhiptail copy() {
+ return new BelligerentWhiptail(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BenthicInfiltrator.java b/Mage.Sets/src/mage/sets/battleforzendikar/BenthicInfiltrator.java
new file mode 100644
index 00000000000..dd07f088f12
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BenthicInfiltrator.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.CantBeBlockedSourceAbility;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.IngestAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BenthicInfiltrator extends CardImpl {
+
+ public BenthicInfiltrator(UUID ownerId) {
+ super(ownerId, 55, "Benthic Infiltrator", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(4);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Ingest
+ this.addAbility(new IngestAbility());
+
+ // Benthic Infiltrator can't be blocked.
+ this.addAbility(new CantBeBlockedSourceAbility());
+ }
+
+ public BenthicInfiltrator(final BenthicInfiltrator card) {
+ super(card);
+ }
+
+ @Override
+ public BenthicInfiltrator copy() {
+ return new BenthicInfiltrator(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BlightHerder.java b/Mage.Sets/src/mage/sets/battleforzendikar/BlightHerder.java
new file mode 100644
index 00000000000..d6317ebf1bf
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BlightHerder.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CastSourceTriggeredAbility;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.filter.predicate.other.OwnerPredicate;
+import mage.game.Game;
+import mage.game.permanent.token.EldraziScionToken;
+import mage.players.Player;
+import mage.target.Target;
+import mage.target.common.TargetCardInExile;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BlightHerder extends CardImpl {
+
+ public BlightHerder(UUID ownerId) {
+ super(ownerId, 2, "Blight Herder", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Processor");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(5);
+
+ // When you cast Blight Herder, you may put two cards your opponents own from exile into their owners' graveyards. If you do, put three 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool."
+ this.addAbility(new CastSourceTriggeredAbility(new BlightHerderEffect(), true));
+ }
+
+ public BlightHerder(final BlightHerder card) {
+ super(card);
+ }
+
+ @Override
+ public BlightHerder copy() {
+ return new BlightHerder(this);
+ }
+}
+
+class BlightHerderEffect extends OneShotEffect {
+
+ private final static FilterCard filter = new FilterCard("cards your opponents own from exile");
+
+ static {
+ filter.add(new OwnerPredicate(TargetController.OPPONENT));
+ }
+
+ public BlightHerderEffect() {
+ super(Outcome.PutCreatureInPlay);
+ this.staticText = "you may put two cards your opponents own from exile into their owners' graveyards. If you do, put three 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have \"Sacrifice this creature: Add {1} to your mana pool.";
+ }
+
+ public BlightHerderEffect(final BlightHerderEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public BlightHerderEffect copy() {
+ return new BlightHerderEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ Target target = new TargetCardInExile(2, 2, filter, null);
+ if (target.canChoose(source.getSourceId(), source.getControllerId(), game)) {
+ if (controller.chooseTarget(outcome, target, source, game)) {
+ Cards cardsToGraveyard = new CardsImpl(target.getTargets());
+ controller.moveCards(cardsToGraveyard, null, Zone.GRAVEYARD, source, game);
+ return new CreateTokenEffect(new EldraziScionToken(), 3).apply(game, source);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BlightedCataract.java b/Mage.Sets/src/mage/sets/battleforzendikar/BlightedCataract.java
new file mode 100644
index 00000000000..a94c79afa25
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BlightedCataract.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.mana.ColorlessManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BlightedCataract extends CardImpl {
+
+ public BlightedCataract(UUID ownerId) {
+ super(ownerId, 229, "Blighted Cataract", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // {T}: Add {1} to your mana pool.
+ this.addAbility(new ColorlessManaAbility());
+
+ // {5}{U}, {T}, Sacrifice Blighted Cataract: Draw two cards.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(2), new ManaCostsImpl("{5}{U}"));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ this.addAbility(ability);
+ }
+
+ public BlightedCataract(final BlightedCataract card) {
+ super(card);
+ }
+
+ @Override
+ public BlightedCataract copy() {
+ return new BlightedCataract(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BlightedFen.java b/Mage.Sets/src/mage/sets/battleforzendikar/BlightedFen.java
new file mode 100644
index 00000000000..253e3d337c9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BlightedFen.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.SacrificeEffect;
+import mage.abilities.mana.ColorlessManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.target.common.TargetOpponent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BlightedFen extends CardImpl {
+
+ public BlightedFen(UUID ownerId) {
+ super(ownerId, 230, "Blighted Fen", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // {T}: Add {1} to your mana pool.
+ this.addAbility(new ColorlessManaAbility());
+
+ // {4}{B}, {T}, Sacrifice Blighted Fen: Target opponent sacrifices a creature.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
+ new SacrificeEffect(new FilterCreaturePermanent(), 1, "Target opponent"),
+ new ManaCostsImpl<>("{4}{B}"));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ ability.addTarget(new TargetOpponent());
+ this.addAbility(ability);
+ }
+
+ public BlightedFen(final BlightedFen card) {
+ super(card);
+ }
+
+ @Override
+ public BlightedFen copy() {
+ return new BlightedFen(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BlightedGorge.java b/Mage.Sets/src/mage/sets/battleforzendikar/BlightedGorge.java
new file mode 100644
index 00000000000..b67954fd390
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BlightedGorge.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.mana.ColorlessManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BlightedGorge extends CardImpl {
+
+ public BlightedGorge(UUID ownerId) {
+ super(ownerId, 231, "Blighted Gorge", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // {T}: Add {1} to your mana pool.
+ this.addAbility(new ColorlessManaAbility());
+
+ // {4}{R}, {T}, Sacrifice Blighted Gorge: Blighted Gorge deals 2 damage to target creature or player.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
+ new DamageTargetEffect(2),
+ new ManaCostsImpl<>("{4}{R}"));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public BlightedGorge(final BlightedGorge card) {
+ super(card);
+ }
+
+ @Override
+ public BlightedGorge copy() {
+ return new BlightedGorge(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BlightedSteppe.java b/Mage.Sets/src/mage/sets/battleforzendikar/BlightedSteppe.java
new file mode 100644
index 00000000000..c0c4d00ff6f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BlightedSteppe.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.mana.ColorlessManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BlightedSteppe extends CardImpl {
+
+ public BlightedSteppe(UUID ownerId) {
+ super(ownerId, 232, "Blighted Steppe", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // {T}: Add {1} to your mana pool.
+ this.addAbility(new ColorlessManaAbility());
+
+ // {3}{W}, {T}, Sacrifice Blighted Steppe: You gain 2 life for each creature you control.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
+ new GainLifeEffect(new PermanentsOnBattlefieldCount(new FilterControlledCreaturePermanent("creature you control"), 2)),
+ new ManaCostsImpl<>("{3}{W}"));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ this.addAbility(ability);
+ }
+
+ public BlightedSteppe(final BlightedSteppe card) {
+ super(card);
+ }
+
+ @Override
+ public BlightedSteppe copy() {
+ return new BlightedSteppe(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BlightedWoodland.java b/Mage.Sets/src/mage/sets/battleforzendikar/BlightedWoodland.java
new file mode 100644
index 00000000000..694a2e74187
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BlightedWoodland.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
+import mage.abilities.mana.ColorlessManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterBasicLandCard;
+import mage.target.common.TargetCardInLibrary;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BlightedWoodland extends CardImpl {
+
+ public BlightedWoodland(UUID ownerId) {
+ super(ownerId, 233, "Blighted Woodland", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // {T}: Add {1} to your mana pool.
+ this.addAbility(new ColorlessManaAbility());
+
+ // {3}{G}, {T}, Sacrifice Blighted Woodland: Search your library for up to two basic land cards and put them onto the battlefield tapped. Then shuffle your library.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
+ new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(0, 2, new FilterBasicLandCard()), true, true),
+ new ManaCostsImpl<>("{3}{G}"));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ this.addAbility(ability);
+ }
+
+ public BlightedWoodland(final BlightedWoodland card) {
+ super(card);
+ }
+
+ @Override
+ public BlightedWoodland copy() {
+ return new BlightedWoodland(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Blisterpod.java b/Mage.Sets/src/mage/sets/battleforzendikar/Blisterpod.java
new file mode 100644
index 00000000000..41398c4c2d7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Blisterpod.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.game.permanent.token.EldraziScionToken;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Blisterpod extends CardImpl {
+
+ public Blisterpod(UUID ownerId) {
+ super(ownerId, 163, "Blisterpod", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+ // When Blisterpod dies, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."
+ Effect effect = new CreateTokenEffect(new EldraziScionToken());
+ effect.setText("put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has \"Sacrifice this creature: Add {1} to your mana pool.\"");
+ this.addAbility(new DiesTriggeredAbility(effect, false));
+ }
+
+ public Blisterpod(final Blisterpod card) {
+ super(card);
+ }
+
+ @Override
+ public Blisterpod copy() {
+ return new Blisterpod(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BloodbondVampire.java b/Mage.Sets/src/mage/sets/battleforzendikar/BloodbondVampire.java
new file mode 100644
index 00000000000..c2e4713537b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BloodbondVampire.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.GainLifeControllerTriggeredAbility;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.counters.CounterType;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BloodbondVampire extends CardImpl {
+
+ public BloodbondVampire(UUID ownerId) {
+ super(ownerId, 104, "Bloodbond Vampire", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Vampire");
+ this.subtype.add("Shaman");
+ this.subtype.add("Ally");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Whenever you gain life, put a +1/+1 counter on Bloodbond Vampire.
+ this.addAbility(new GainLifeControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false));
+ }
+
+ public BloodbondVampire(final BloodbondVampire card) {
+ super(card);
+ }
+
+ @Override
+ public BloodbondVampire copy() {
+ return new BloodbondVampire(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BoilingEarth.java b/Mage.Sets/src/mage/sets/battleforzendikar/BoilingEarth.java
new file mode 100644
index 00000000000..45dbf95132a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BoilingEarth.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DamageAllEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BoilingEarth extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("creature your opponents control");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public BoilingEarth(UUID ownerId) {
+ super(ownerId, 142, "Boiling Earth", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Boiling Earth deals 1 damage to each creature your opponents control.
+ this.getSpellAbility().addEffect(new DamageAllEffect(1, filter));
+
+ // Awaken 4—{6}{R}
+ this.addAbility(new AwakenAbility(this, 4, "{6}{R}"));
+ }
+
+ public BoilingEarth(final BoilingEarth card) {
+ super(card);
+ }
+
+ @Override
+ public BoilingEarth copy() {
+ return new BoilingEarth(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BoneSplinters.java b/Mage.Sets/src/mage/sets/battleforzendikar/BoneSplinters.java
new file mode 100644
index 00000000000..275ba4d99d0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BoneSplinters.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BoneSplinters extends mage.sets.shardsofalara.BoneSplinters {
+
+ public BoneSplinters(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 105;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public BoneSplinters(final BoneSplinters card) {
+ super(card);
+ }
+
+ @Override
+ public BoneSplinters copy() {
+ return new BoneSplinters(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BreakerOfArmies.java b/Mage.Sets/src/mage/sets/battleforzendikar/BreakerOfArmies.java
new file mode 100644
index 00000000000..2ab9d9d7361
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BreakerOfArmies.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.combat.MustBeBlockedByAllSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BreakerOfArmies extends CardImpl {
+
+ public BreakerOfArmies(UUID ownerId) {
+ super(ownerId, 3, "Breaker of Armies", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{8}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(10);
+ this.toughness = new MageInt(8);
+
+ // All creatures able to block Breaker of Armies do so.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MustBeBlockedByAllSourceEffect(Duration.WhileOnBattlefield)));
+ }
+
+ public BreakerOfArmies(final BreakerOfArmies card) {
+ super(card);
+ }
+
+ @Override
+ public BreakerOfArmies copy() {
+ return new BreakerOfArmies(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BrilliantSpectrum.java b/Mage.Sets/src/mage/sets/battleforzendikar/BrilliantSpectrum.java
new file mode 100644
index 00000000000..b1874062817
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BrilliantSpectrum.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.discard.DiscardControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.AbilityWord;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BrilliantSpectrum extends CardImpl {
+
+ public BrilliantSpectrum(UUID ownerId) {
+ super(ownerId, 70, "Brilliant Spectrum", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{3}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Converge — Draw X cards, where X is the number of colors of mana spent to cast Brilliant Spectrum. Then discard two cards.
+ this.getSpellAbility().setAbilityWord(AbilityWord.CONVERGE);
+ Effect effect = new DrawCardSourceControllerEffect(ColorsOfManaSpentToCastCount.getInstance());
+ effect.setText("Draw X cards, where X is the number of colors of mana spent to cast {this}");
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addEffect(new DiscardControllerEffect(2));
+ }
+
+ public BrilliantSpectrum(final BrilliantSpectrum card) {
+ super(card);
+ }
+
+ @Override
+ public BrilliantSpectrum copy() {
+ return new BrilliantSpectrum(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BringToLight.java b/Mage.Sets/src/mage/sets/battleforzendikar/BringToLight.java
new file mode 100644
index 00000000000..5419dc82641
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BringToLight.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.Filter;
+import mage.filter.FilterCard;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.common.TargetCardInLibrary;
+import org.apache.log4j.Logger;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BringToLight extends CardImpl {
+
+ public BringToLight(UUID ownerId) {
+ super(ownerId, 209, "Bring to Light", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{G}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Converge-Search your library for a creature, instant, or sorcery card with converted mana
+ // cost less than or equal to the number of colors of mana spent to cast Bring to Light, exile that card,
+ // then shuffle your library. You may cast that card without paying its mana cost.
+ this.getSpellAbility().addEffect(new BringToLightEffect());
+ }
+
+ public BringToLight(final BringToLight card) {
+ super(card);
+ }
+
+ @Override
+ public BringToLight copy() {
+ return new BringToLight(this);
+ }
+}
+
+class BringToLightEffect extends OneShotEffect {
+
+ public BringToLightEffect() {
+ super(Outcome.PlayForFree);
+ this.staticText = "Converge — Search your library for a creature, instant, or sorcery card with converted mana "
+ + "cost less than or equal to the number of colors of mana spent to cast {this}, exile that card, "
+ + "then shuffle your library. You may cast that card without paying its mana cost";
+ }
+
+ public BringToLightEffect(final BringToLightEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public BringToLightEffect copy() {
+ return new BringToLightEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ int numberColors = ColorsOfManaSpentToCastCount.getInstance().calculate(game, source, this);
+ FilterCard filter = new FilterCard();
+ filter.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.INSTANT), new CardTypePredicate(CardType.SORCERY)));
+ filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, numberColors + 1));
+ TargetCardInLibrary target = new TargetCardInLibrary(filter);
+ controller.searchLibrary(target, game);
+ Card card = controller.getLibrary().getCard(target.getFirstTarget(), game);
+ if (card != null) {
+ controller.moveCards(card, Zone.EXILED, source, game);
+ }
+ controller.shuffleLibrary(game);
+ if (card != null) {
+ if (controller.chooseUse(outcome, "Cast " + card.getName() + " without paying its mana cost?", source, game)) {
+ if (card.getSpellAbility() != null) {
+ controller.cast(card.getSpellAbility(), game, true);
+ } else {
+ Logger.getLogger(BringToLightEffect.class).error("Bring to Light: spellAbility == null " + card.getName());
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BroodButcher.java b/Mage.Sets/src/mage/sets/battleforzendikar/BroodButcher.java
new file mode 100644
index 00000000000..15f532eb8db
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BroodButcher.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.game.permanent.token.EldraziScionToken;
+import mage.target.common.TargetControlledCreaturePermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BroodButcher extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a creature");
+
+ public BroodButcher(UUID ownerId) {
+ super(ownerId, 199, "Brood Butcher", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // When Brood Butcher enters the battlefield, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new EldraziScionToken()), false));
+
+ // {B}{G}, Sacrifice a creature: Target creature gets -2/-2 until end of turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(-2, -2, Duration.EndOfTurn), new ManaCostsImpl("{B}{G}"));
+ ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter)));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public BroodButcher(final BroodButcher card) {
+ super(card);
+ }
+
+ @Override
+ public BroodButcher copy() {
+ return new BroodButcher(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BroodMonitor.java b/Mage.Sets/src/mage/sets/battleforzendikar/BroodMonitor.java
new file mode 100644
index 00000000000..ecf6c1431d5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BroodMonitor.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.game.permanent.token.EldraziScionToken;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BroodMonitor extends CardImpl {
+
+ public BroodMonitor(UUID ownerId) {
+ super(ownerId, 164, "Brood Monitor", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{G}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+ // When Brood Monitor enters the battlefield, put three 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool."
+ Effect effect = new CreateTokenEffect(new EldraziScionToken(), 3);
+ effect.setText("put three 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have \"Sacrifice this creature: Add {1} to your mana pool.\"");
+ this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false));
+
+ }
+
+ public BroodMonitor(final BroodMonitor card) {
+ super(card);
+ }
+
+ @Override
+ public BroodMonitor copy() {
+ return new BroodMonitor(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BroodhunterWurm.java b/Mage.Sets/src/mage/sets/battleforzendikar/BroodhunterWurm.java
new file mode 100644
index 00000000000..59dcb212687
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BroodhunterWurm.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BroodhunterWurm extends CardImpl {
+
+ public BroodhunterWurm(UUID ownerId) {
+ super(ownerId, 171, "Broodhunter Wurm", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Wurm");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(3);
+ }
+
+ public BroodhunterWurm(final BroodhunterWurm card) {
+ super(card);
+ }
+
+ @Override
+ public BroodhunterWurm copy() {
+ return new BroodhunterWurm(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BrutalExpulsion.java b/Mage.Sets/src/mage/sets/battleforzendikar/BrutalExpulsion.java
new file mode 100644
index 00000000000..fcddf947e1b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BrutalExpulsion.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.Mode;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.ReturnToHandTargetEffect;
+import mage.abilities.effects.common.replacement.DealtDamageToCreatureBySourceDies;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.common.FilterSpellOrPermanent;
+import mage.target.common.TargetCreatureOrPlaneswalker;
+import mage.target.common.TargetSpellOrPermanent;
+import mage.watchers.common.DamagedByWatcher;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BrutalExpulsion extends CardImpl {
+
+ private static final FilterSpellOrPermanent filter = new FilterSpellOrPermanent("spell or creature");
+
+ static {
+ filter.setPermanentFilter(new FilterCreaturePermanent());
+ }
+
+ public BrutalExpulsion(UUID ownerId) {
+ super(ownerId, 200, "Brutal Expulsion", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{2}{U}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+ // Choose one or both
+ this.getSpellAbility().getModes().setMinModes(1);
+ this.getSpellAbility().getModes().setMaxModes(2);
+ // - Return target spell or creature to its owner's hand;
+ this.getSpellAbility().addTarget(new TargetSpellOrPermanent(1, 1, filter, false));
+ this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
+ // or Brutal Expulsion deals 2 damage to target creature or planeswalker. If that permanent would be put into a graveyard this turn, exile it instead.
+ Mode mode = new Mode();
+ mode.getEffects().add(new DamageTargetEffect(2));
+ mode.getTargets().add(new TargetCreatureOrPlaneswalker());
+ Effect effect = new DealtDamageToCreatureBySourceDies(this, Duration.EndOfTurn);
+ effect.setText("If that permanent would be put into a graveyard this turn, exile it instead");
+ mode.getEffects().add(effect);
+ this.getSpellAbility().addMode(mode);
+ this.getSpellAbility().addWatcher(new DamagedByWatcher());
+ }
+
+ public BrutalExpulsion(final BrutalExpulsion card) {
+ super(card);
+ }
+
+ @Override
+ public BrutalExpulsion copy() {
+ return new BrutalExpulsion(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CallTheScions.java b/Mage.Sets/src/mage/sets/battleforzendikar/CallTheScions.java
new file mode 100644
index 00000000000..439dbe84a3a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CallTheScions.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.game.permanent.token.EldraziScionToken;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CallTheScions extends CardImpl {
+
+ public CallTheScions(UUID ownerId) {
+ super(ownerId, 165, "Call the Scions", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{G}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+ // Put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: add {1} to your mana pool."
+ Effect effect = new CreateTokenEffect(new EldraziScionToken(), 2);
+ effect.setText("put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have \"Sacrifice this creature: Add {1} to your mana pool.\"");
+ this.getSpellAbility().addEffect(effect);
+
+ }
+
+ public CallTheScions(final CallTheScions card) {
+ super(card);
+ }
+
+ @Override
+ public CallTheScions copy() {
+ return new CallTheScions(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CanopyVista.java b/Mage.Sets/src/mage/sets/battleforzendikar/CanopyVista.java
new file mode 100644
index 00000000000..97dcdb7afae
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CanopyVista.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.InvertCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.TapSourceEffect;
+import mage.abilities.mana.GreenManaAbility;
+import mage.abilities.mana.WhiteManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CanopyVista extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent();
+
+ static {
+ filter.add(new SupertypePredicate("Basic"));
+ }
+
+ public CanopyVista(UUID ownerId) {
+ super(ownerId, 234, "Canopy Vista", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Forest");
+ this.subtype.add("Plains");
+
+ // Canopy Vista enters the battlefield tapped unless you control two or more basic lands.
+ Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN, 1));
+ String abilityText = "tapped unless you control two or more basic lands";
+ this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText));
+ this.addAbility(new GreenManaAbility());
+ this.addAbility(new WhiteManaAbility());
+ }
+
+ public CanopyVista(final CanopyVista card) {
+ super(card);
+ }
+
+ @Override
+ public CanopyVista copy() {
+ return new CanopyVista(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CarrierThrall.java b/Mage.Sets/src/mage/sets/battleforzendikar/CarrierThrall.java
new file mode 100644
index 00000000000..a3097ea8114
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CarrierThrall.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.game.permanent.token.EldraziScionToken;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CarrierThrall extends CardImpl {
+
+ public CarrierThrall(UUID ownerId) {
+ super(ownerId, 106, "Carrier Thrall", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Vampire");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // When Carrier Thrall dies, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature. Add {1} to your mana pool."
+ Effect effect = new CreateTokenEffect(new EldraziScionToken());
+ effect.setText("put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has \"Sacrifice this creature: Add {1} to your mana pool.\"");
+ this.addAbility(new DiesTriggeredAbility(effect, false));
+
+ }
+
+ public CarrierThrall(final CarrierThrall card) {
+ super(card);
+ }
+
+ @Override
+ public CarrierThrall copy() {
+ return new CarrierThrall(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CatacombSifter.java b/Mage.Sets/src/mage/sets/battleforzendikar/CatacombSifter.java
new file mode 100644
index 00000000000..7faeaddd544
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CatacombSifter.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DiesCreatureTriggeredAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.keyword.ScryEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.game.permanent.token.EldraziScionToken;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CatacombSifter extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature you control");
+ static {
+ filter.add(new AnotherPredicate());
+ filter.add(new ControllerPredicate(TargetController.YOU));
+ }
+
+ public CatacombSifter(UUID ownerId) {
+ super(ownerId, 201, "Catacomb Sifter", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // When Catacomb Sifter enters the battlefield, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new EldraziScionToken())));
+
+ // Whenever another creature you control dies, scry 1
+ this.addAbility(new DiesCreatureTriggeredAbility(new ScryEffect(1), false, filter));
+ }
+
+ public CatacombSifter(final CatacombSifter card) {
+ super(card);
+ }
+
+ @Override
+ public CatacombSifter copy() {
+ return new CatacombSifter(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ChasmGuide.java b/Mage.Sets/src/mage/sets/battleforzendikar/ChasmGuide.java
new file mode 100644
index 00000000000..ecade73ae51
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ChasmGuide.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ChasmGuide extends CardImpl {
+
+ public ChasmGuide(UUID ownerId) {
+ super(ownerId, 143, "Chasm Guide", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Goblin");
+ this.subtype.add("Scout");
+ this.subtype.add("Ally");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Rally — Whenever Chasm Guide or another Ally enters the battlefield under your control, creatures you control gain haste until end of turn.
+ this.addAbility(new AllyEntersBattlefieldTriggeredAbility(
+ new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent("creatures you control")), false));
+ }
+
+ public ChasmGuide(final ChasmGuide card) {
+ super(card);
+ }
+
+ @Override
+ public ChasmGuide copy() {
+ return new ChasmGuide(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CinderGlade.java b/Mage.Sets/src/mage/sets/battleforzendikar/CinderGlade.java
new file mode 100644
index 00000000000..69cad63bd57
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CinderGlade.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.InvertCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.TapSourceEffect;
+import mage.abilities.mana.GreenManaAbility;
+import mage.abilities.mana.RedManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CinderGlade extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent();
+
+ static {
+ filter.add(new SupertypePredicate("Basic"));
+ }
+
+ public CinderGlade(UUID ownerId) {
+ super(ownerId, 235, "Cinder Glade", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Mountain");
+ this.subtype.add("Forest");
+
+ // Cinder Glade enters the battlefield tapped unless you control two or more basic lands.
+ Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN, 1));
+ String abilityText = "tapped unless you control two or more basic lands";
+ this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText));
+ this.addAbility(new RedManaAbility());
+ this.addAbility(new GreenManaAbility());
+ }
+
+ public CinderGlade(final CinderGlade card) {
+ super(card);
+ }
+
+ @Override
+ public CinderGlade copy() {
+ return new CinderGlade(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CliffsideLookout.java b/Mage.Sets/src/mage/sets/battleforzendikar/CliffsideLookout.java
new file mode 100644
index 00000000000..a362b9e360f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CliffsideLookout.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CliffsideLookout extends CardImpl {
+
+ public CliffsideLookout(UUID ownerId) {
+ super(ownerId, 20, "Cliffside Lookout", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Kor");
+ this.subtype.add("Scout");
+ this.subtype.add("Ally");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {4}{W}: Creatures you control get +1/+1 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl<>("{4}{W}")));
+ }
+
+ public CliffsideLookout(final CliffsideLookout card) {
+ super(card);
+ }
+
+ @Override
+ public CliffsideLookout copy() {
+ return new CliffsideLookout(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CloudManta.java b/Mage.Sets/src/mage/sets/battleforzendikar/CloudManta.java
new file mode 100644
index 00000000000..6771fb73cdb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CloudManta.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CloudManta extends CardImpl {
+
+ public CloudManta(UUID ownerId) {
+ super(ownerId, 71, "Cloud Manta", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Fish");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ }
+
+ public CloudManta(final CloudManta card) {
+ super(card);
+ }
+
+ @Override
+ public CloudManta copy() {
+ return new CloudManta(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ClutchOfCurrents.java b/Mage.Sets/src/mage/sets/battleforzendikar/ClutchOfCurrents.java
new file mode 100644
index 00000000000..2619589cb6a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ClutchOfCurrents.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.ReturnToHandTargetEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ClutchOfCurrents extends CardImpl {
+
+ public ClutchOfCurrents(UUID ownerId) {
+ super(ownerId, 72, "Clutch of Currents", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Return target creature to its owner's hand.
+ this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+
+ // Awaken 3—{4}{U}
+ this.addAbility(new AwakenAbility(this, 3, "{4}{U}"));
+ }
+
+ public ClutchOfCurrents(final ClutchOfCurrents card) {
+ super(card);
+ }
+
+ @Override
+ public ClutchOfCurrents copy() {
+ return new ClutchOfCurrents(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CoastalDiscovery.java b/Mage.Sets/src/mage/sets/battleforzendikar/CoastalDiscovery.java
new file mode 100644
index 00000000000..36c7f87a4f6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CoastalDiscovery.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CoastalDiscovery extends CardImpl {
+
+ public CoastalDiscovery(UUID ownerId) {
+ super(ownerId, 73, "Coastal Discovery", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Draw two cards.
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(2));
+
+ // Awaken 4 - {5}U}
+ this.addAbility(new AwakenAbility(this, 4, "{5}{U}"));
+ }
+
+ public CoastalDiscovery(final CoastalDiscovery card) {
+ super(card);
+ }
+
+ @Override
+ public CoastalDiscovery copy() {
+ return new CoastalDiscovery(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CompleteDisregard.java b/Mage.Sets/src/mage/sets/battleforzendikar/CompleteDisregard.java
new file mode 100644
index 00000000000..9a923541d9c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CompleteDisregard.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.Filter;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.PowerPredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CompleteDisregard extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power 3 or less");
+
+ static {
+ filter.add(new PowerPredicate(Filter.ComparisonType.LessThan, 4));
+ }
+
+ public CompleteDisregard(UUID ownerId) {
+ super(ownerId, 90, "Complete Disregard", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{B}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+
+ // Exile target creature with power 3 or less.
+ this.getSpellAbility().addEffect(new ExileTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
+ }
+
+ public CompleteDisregard(final CompleteDisregard card) {
+ super(card);
+ }
+
+ @Override
+ public CompleteDisregard copy() {
+ return new CompleteDisregard(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ConduitOfRuin.java b/Mage.Sets/src/mage/sets/battleforzendikar/ConduitOfRuin.java
new file mode 100644
index 00000000000..772c7872c79
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ConduitOfRuin.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CastSourceTriggeredAbility;
+import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
+import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.WatcherScope;
+import mage.constants.Zone;
+import mage.filter.Filter;
+import mage.filter.common.FilterCreatureCard;
+import mage.filter.predicate.ObjectPlayer;
+import mage.filter.predicate.ObjectPlayerPredicate;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.game.Controllable;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.stack.Spell;
+import mage.target.common.TargetCardInLibrary;
+import mage.watchers.Watcher;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ConduitOfRuin extends CardImpl {
+
+ private static final FilterCreatureCard filter = new FilterCreatureCard("a colorless creature card with converted mana cost 7 or greater");
+ private static final FilterCreatureCard filterCost = new FilterCreatureCard("The first creature spell");
+
+ static {
+ filter.add(new ColorlessPredicate());
+ filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.GreaterThan, 6));
+ filterCost.add(new FirstCastCreatureSpellPredicate());
+ }
+
+ public ConduitOfRuin(UUID ownerId) {
+ super(ownerId, 4, "Conduit of Ruin", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{6}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // When you cast Conduit of Ruin, you may search your library for a colorless creature card with converted mana cost 7 or greater, then shuffle your library and put that card on top of it.
+ TargetCardInLibrary target = new TargetCardInLibrary(filter);
+ this.addAbility(new CastSourceTriggeredAbility(new SearchLibraryPutOnLibraryEffect(target, true, true), true));
+
+ // The first creature spell you cast each turn costs {2} less to cast.
+ Effect effect = new SpellsCostReductionControllerEffect(filterCost, 2);
+ effect.setText("The first creature spell you cast each turn costs {2} less to cast");
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect), new ConduitOfRuinWatcher());
+ }
+
+ public ConduitOfRuin(final ConduitOfRuin card) {
+ super(card);
+ }
+
+ @Override
+ public ConduitOfRuin copy() {
+ return new ConduitOfRuin(this);
+ }
+}
+
+class ConduitOfRuinWatcher extends Watcher {
+
+ Map playerCreatureSpells;
+ int spellCount = 0;
+
+ public ConduitOfRuinWatcher() {
+ super("FirstCreatureSpellCastThisTurn", WatcherScope.GAME);
+ playerCreatureSpells = new HashMap<>();
+ }
+
+ public ConduitOfRuinWatcher(final ConduitOfRuinWatcher watcher) {
+ super(watcher);
+ this.playerCreatureSpells = new HashMap<>();
+ playerCreatureSpells.putAll(watcher.playerCreatureSpells);
+ }
+
+ @Override
+ public void watch(GameEvent event, Game game) {
+ if (event.getType() == GameEvent.EventType.SPELL_CAST) {
+ Spell spell = (Spell) game.getObject(event.getTargetId());
+ if (spell != null && spell.getCardType().contains(CardType.CREATURE)) {
+ if (playerCreatureSpells.containsKey(event.getPlayerId())) {
+ playerCreatureSpells.put(event.getPlayerId(), playerCreatureSpells.get(event.getPlayerId()) + 1);
+ } else {
+ playerCreatureSpells.put(event.getPlayerId(), 1);
+ }
+ }
+ }
+ }
+
+ public int creatureSpellsCastThisTurn(UUID playerId) {
+ if (playerCreatureSpells.containsKey(playerId)) {
+ return playerCreatureSpells.get(playerId);
+ }
+ return 0;
+ }
+
+ @Override
+ public ConduitOfRuinWatcher copy() {
+ return new ConduitOfRuinWatcher(this);
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ playerCreatureSpells.clear();
+ }
+}
+
+class FirstCastCreatureSpellPredicate implements ObjectPlayerPredicate> {
+
+ @Override
+ public boolean apply(ObjectPlayer input, Game game) {
+ if (input.getObject() instanceof Spell
+ && ((Spell) input.getObject()).getCardType().contains(CardType.CREATURE)) {
+ ConduitOfRuinWatcher watcher = (ConduitOfRuinWatcher) game.getState().getWatchers().get("FirstCreatureSpellCastThisTurn");
+ return watcher != null && watcher.creatureSpellsCastThisTurn(input.getPlayerId()) == 0;
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return "The first creature spell you cast each turn";
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CoralhelmGuide.java b/Mage.Sets/src/mage/sets/battleforzendikar/CoralhelmGuide.java
new file mode 100644
index 00000000000..30105514328
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CoralhelmGuide.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CoralhelmGuide extends CardImpl {
+
+ public CoralhelmGuide(UUID ownerId) {
+ super(ownerId, 74, "Coralhelm Guide", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Merfolk");
+ this.subtype.add("Scout");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // {4}{U}: Target creature can't be blocked this turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBeBlockedTargetEffect(Duration.EndOfTurn), new ManaCostsImpl<>("{4}{U}"));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public CoralhelmGuide(final CoralhelmGuide card) {
+ super(card);
+ }
+
+ @Override
+ public CoralhelmGuide copy() {
+ return new CoralhelmGuide(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CourierGriffin.java b/Mage.Sets/src/mage/sets/battleforzendikar/CourierGriffin.java
new file mode 100644
index 00000000000..88a03fe4f6f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CourierGriffin.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CourierGriffin extends CardImpl {
+
+ public CourierGriffin(UUID ownerId) {
+ super(ownerId, 21, "Courier Griffin", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Griffin");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // When Courier Griffin enters the battlefield, you gain 2 life.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(2), false));
+ }
+
+ public CourierGriffin(final CourierGriffin card) {
+ super(card);
+ }
+
+ @Override
+ public CourierGriffin copy() {
+ return new CourierGriffin(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CrumbleToDust.java b/Mage.Sets/src/mage/sets/battleforzendikar/CrumbleToDust.java
new file mode 100644
index 00000000000..fcbcf0a1c03
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CrumbleToDust.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.common.ExileTargetAndSearchGraveyardHandLibraryEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetNonBasicLandPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CrumbleToDust extends CardImpl {
+
+ public CrumbleToDust(UUID ownerId) {
+ super(ownerId, 128, "Crumble to Dust", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+
+ // Exile target nonbasic land. Search its controller's graveyard, hand, and library for any number of cards with the same name as that land and exile them. Then that player shuffles his or her library.
+ this.getSpellAbility().addTarget(new TargetNonBasicLandPermanent());
+ this.getSpellAbility().addEffect(new ExileTargetAndSearchGraveyardHandLibraryEffect(false, "its controller's", "any number of cards with the same name as that land"));
+ }
+
+ public CrumbleToDust(final CrumbleToDust card) {
+ super(card);
+ }
+
+ @Override
+ public CrumbleToDust copy() {
+ return new CrumbleToDust(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CrypticCruiser.java b/Mage.Sets/src/mage/sets/battleforzendikar/CrypticCruiser.java
new file mode 100644
index 00000000000..e54defd0ce1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CrypticCruiser.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.ExileOpponentsCardFromExileToGraveyardCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CrypticCruiser extends CardImpl {
+
+ public CrypticCruiser(UUID ownerId) {
+ super(ownerId, 56, "Cryptic Cruiser", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Processor");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+ // {2}{U}, Put a card an opponent owns from exile into that player's graveyard: Tap target creature.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TapTargetEffect(), new ManaCostsImpl<>("{2}{U}"));
+ ability.addCost(new ExileOpponentsCardFromExileToGraveyardCost(true));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+
+ }
+
+ public CrypticCruiser(final CrypticCruiser card) {
+ super(card);
+ }
+
+ @Override
+ public CrypticCruiser copy() {
+ return new CrypticCruiser(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CullingDrone.java b/Mage.Sets/src/mage/sets/battleforzendikar/CullingDrone.java
new file mode 100644
index 00000000000..a3aa372f585
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CullingDrone.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.IngestAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CullingDrone extends CardImpl {
+
+ public CullingDrone(UUID ownerId) {
+ super(ownerId, 91, "Culling Drone", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Ingest
+ this.addAbility(new IngestAbility());
+ }
+
+ public CullingDrone(final CullingDrone card) {
+ super(card);
+ }
+
+ @Override
+ public CullingDrone copy() {
+ return new CullingDrone(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DampeningPulse.java b/Mage.Sets/src/mage/sets/battleforzendikar/DampeningPulse.java
new file mode 100644
index 00000000000..e03a58c6f97
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DampeningPulse.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.continuous.BoostAllEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DampeningPulse extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures your opponents control");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public DampeningPulse(UUID ownerId) {
+ super(ownerId, 75, "Dampening Pulse", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Creatures your opponents control get -1/-0.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(-1, -0, Duration.WhileOnBattlefield, filter, false)));
+
+ }
+
+ public DampeningPulse(final DampeningPulse card) {
+ super(card);
+ }
+
+ @Override
+ public DampeningPulse copy() {
+ return new DampeningPulse(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DeathlessBehemoth.java b/Mage.Sets/src/mage/sets/battleforzendikar/DeathlessBehemoth.java
new file mode 100644
index 00000000000..36085ecf6d1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DeathlessBehemoth.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.ActivateAsSorceryActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.effects.common.ReturnToHandSourceEffect;
+import mage.abilities.keyword.VigilanceAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DeathlessBehemoth extends CardImpl {
+
+ private final static FilterControlledPermanent filter = new FilterControlledPermanent("two Eldrazi Scions");
+
+ static {
+ filter.add(Predicates.and(
+ new SubtypePredicate("Eldrazi"),
+ new SubtypePredicate("Scion")));
+ }
+
+ public DeathlessBehemoth(UUID ownerId) {
+ super(ownerId, 5, "Deathless Behemoth", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{6}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(6);
+ this.toughness = new MageInt(6);
+
+ // Vigilance
+ this.addAbility(VigilanceAbility.getInstance());
+
+ // Sacrifice two Eldrazi Scions: Return Deathless Behemoth from your graveyard to your hand. Activate this ability only any time you could cast a sorcery.
+ this.addAbility(new ActivateAsSorceryActivatedAbility(Zone.GRAVEYARD,
+ new ReturnToHandSourceEffect(), new SacrificeTargetCost(new TargetControlledPermanent(2, 2, filter, true))));
+ }
+
+ public DeathlessBehemoth(final DeathlessBehemoth card) {
+ super(card);
+ }
+
+ @Override
+ public DeathlessBehemoth copy() {
+ return new DeathlessBehemoth(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DefiantBloodlord.java b/Mage.Sets/src/mage/sets/battleforzendikar/DefiantBloodlord.java
new file mode 100644
index 00000000000..e1bb3d98f1a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DefiantBloodlord.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.common.LoseLifeTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.target.common.TargetOpponent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DefiantBloodlord extends CardImpl {
+
+ public DefiantBloodlord(UUID ownerId) {
+ super(ownerId, 107, "Defiant Bloodlord", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{B}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Vampire");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(5);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Whenever you gain life, target opponent loses that much life.
+ DefiantBloodlordTriggeredAbility ability = new DefiantBloodlordTriggeredAbility();
+ ability.addTarget(new TargetOpponent());
+ this.addAbility(ability);
+ }
+
+ public DefiantBloodlord(final DefiantBloodlord card) {
+ super(card);
+ }
+
+ @Override
+ public DefiantBloodlord copy() {
+ return new DefiantBloodlord(this);
+ }
+}
+
+class DefiantBloodlordTriggeredAbility extends TriggeredAbilityImpl {
+
+ public DefiantBloodlordTriggeredAbility() {
+ super(Zone.BATTLEFIELD, null);
+ }
+
+ public DefiantBloodlordTriggeredAbility(final DefiantBloodlordTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public DefiantBloodlordTriggeredAbility copy() {
+ return new DefiantBloodlordTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.GAINED_LIFE;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (event.getPlayerId().equals(this.controllerId)) {
+ this.getEffects().clear();
+ this.addEffect(new LoseLifeTargetEffect(event.getAmount()));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever you gain life, target opponent loses that much life.";
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DemonsGrasp.java b/Mage.Sets/src/mage/sets/battleforzendikar/DemonsGrasp.java
new file mode 100644
index 00000000000..33b905ad211
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DemonsGrasp.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DemonsGrasp extends CardImpl {
+
+ public DemonsGrasp(UUID ownerId) {
+ super(ownerId, 108, "Demon's Grasp", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{4}{B}");
+ this.expansionSetCode = "BFZ";
+
+ // Target creature gets -5/-5 until end of turn.
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ this.getSpellAbility().addEffect(new BoostTargetEffect(-5, -5, Duration.EndOfTurn));
+ }
+
+ public DemonsGrasp(final DemonsGrasp card) {
+ super(card);
+ }
+
+ @Override
+ public DemonsGrasp copy() {
+ return new DemonsGrasp(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DesolationTwin.java b/Mage.Sets/src/mage/sets/battleforzendikar/DesolationTwin.java
new file mode 100644
index 00000000000..83c7cb97d34
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DesolationTwin.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.permanent.token.Token;
+import mage.game.stack.Spell;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DesolationTwin extends CardImpl {
+
+ public DesolationTwin(UUID ownerId) {
+ super(ownerId, 6, "Desolation Twin", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{10}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(10);
+ this.toughness = new MageInt(10);
+
+ // When you cast Desolation Twin, put a 10/10 colorless Eldrazi creature token onto the battlefield.
+ this.addAbility(new DesolationTwinOnCastAbility());
+ }
+
+ public DesolationTwin(final DesolationTwin card) {
+ super(card);
+ }
+
+ @Override
+ public DesolationTwin copy() {
+ return new DesolationTwin(this);
+ }
+}
+
+class DesolationTwinOnCastAbility extends TriggeredAbilityImpl {
+
+ DesolationTwinOnCastAbility() {
+ super(Zone.STACK, new CreateTokenEffect(new EldraziToken()));
+ }
+
+ DesolationTwinOnCastAbility(DesolationTwinOnCastAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.SPELL_CAST;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Spell spell = (Spell) game.getObject(event.getTargetId());
+ return this.getSourceId().equals(spell.getSourceId());
+ }
+
+ @Override
+ public DesolationTwinOnCastAbility copy() {
+ return new DesolationTwinOnCastAbility(this);
+ }
+
+ @Override
+ public String getRule() {
+ return "When you cast {this}, " + super.getRule();
+ }
+}
+
+class EldraziToken extends Token {
+
+ public EldraziToken() {
+ super("Eldrazi", "10/10 colorless Eldrazi creature token");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Eldrazi");
+ power = new MageInt(10);
+ toughness = new MageInt(10);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Dispel.java b/Mage.Sets/src/mage/sets/battleforzendikar/Dispel.java
new file mode 100644
index 00000000000..7a408452173
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Dispel.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Dispel extends mage.sets.worldwake.Dispel {
+
+ public Dispel(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 76;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Dispel(final Dispel card) {
+ super(card);
+ }
+
+ @Override
+ public Dispel copy() {
+ return new Dispel(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DominatorDrone.java b/Mage.Sets/src/mage/sets/battleforzendikar/DominatorDrone.java
new file mode 100644
index 00000000000..0d52800b415
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DominatorDrone.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.TriggeredAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.decorator.ConditionalTriggeredAbility;
+import mage.abilities.effects.common.DamagePlayersEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.IngestAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.filter.predicate.permanent.AnotherPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DominatorDrone extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another colorless creature");
+
+ static {
+ filter.add(new AnotherPredicate());
+ filter.add(new ColorlessPredicate());
+ }
+
+ public DominatorDrone(UUID ownerId) {
+ super(ownerId, 92, "Dominator Drone", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Ingest (Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)
+ this.addAbility(new IngestAbility());
+
+ // When Dominator Drone enters the battlefield, if you control another colorless creature, each opponent loses 2 life.
+ TriggeredAbility triggeredAbility = new EntersBattlefieldTriggeredAbility(new DamagePlayersEffect(2, TargetController.OPPONENT));
+ this.addAbility(new ConditionalTriggeredAbility(
+ triggeredAbility,
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 0),
+ "When {this} enters the battlefield, if you control another colorless creature, each opponent loses 2 life."));
+
+ }
+
+ public DominatorDrone(final DominatorDrone card) {
+ super(card);
+ }
+
+ @Override
+ public DominatorDrone copy() {
+ return new DominatorDrone(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DragonmasterOutcast.java b/Mage.Sets/src/mage/sets/battleforzendikar/DragonmasterOutcast.java
new file mode 100644
index 00000000000..8689e99c970
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DragonmasterOutcast.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DragonmasterOutcast extends mage.sets.worldwake.DragonmasterOutcast {
+
+ public DragonmasterOutcast(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 144;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public DragonmasterOutcast(final DragonmasterOutcast card) {
+ super(card);
+ }
+
+ @Override
+ public DragonmasterOutcast copy() {
+ return new DragonmasterOutcast(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DranaLiberatorOfMalakir.java b/Mage.Sets/src/mage/sets/battleforzendikar/DranaLiberatorOfMalakir.java
new file mode 100644
index 00000000000..e6076d394af
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DranaLiberatorOfMalakir.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
+import mage.abilities.effects.common.counter.AddCountersAllEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.counters.CounterType;
+import mage.filter.common.FilterAttackingCreature;
+import mage.filter.predicate.permanent.ControllerPredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DranaLiberatorOfMalakir extends CardImpl {
+
+ private static final FilterAttackingCreature filter = new FilterAttackingCreature("each attacking creature you control");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.YOU));
+ }
+
+ public DranaLiberatorOfMalakir(UUID ownerId) {
+ super(ownerId, 109, "Drana, Liberator of Malakir", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
+ this.expansionSetCode = "BFZ";
+ this.supertype.add("Legendary");
+ this.subtype.add("Vampire");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // First strike
+ this.addAbility(FirstStrikeAbility.getInstance());
+
+ // Whenever Drana, Liberator of Malakir deals combat damage to player, put a +1/+1 counter on each attacking creature you control.
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter), false));
+ }
+
+ public DranaLiberatorOfMalakir(final DranaLiberatorOfMalakir card) {
+ super(card);
+ }
+
+ @Override
+ public DranaLiberatorOfMalakir copy() {
+ return new DranaLiberatorOfMalakir(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DranasEmissary.java b/Mage.Sets/src/mage/sets/battleforzendikar/DranasEmissary.java
new file mode 100644
index 00000000000..2b3b6c56394
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DranasEmissary.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.LoseLifeOpponentsEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DranasEmissary extends CardImpl {
+
+ public DranasEmissary(UUID ownerId) {
+ super(ownerId, 210, "Drana's Emissary", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{W}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Vampire");
+ this.subtype.add("Cleric");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // At the beginning of your upkeep, each opponent loses 1 life and you gain 1 life.
+ Effect effect = new GainLifeEffect(1);
+ effect.setText("and you gain 1 life");
+ Ability ability = new BeginningOfUpkeepTriggeredAbility(new LoseLifeOpponentsEffect(1), TargetController.YOU, false);
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public DranasEmissary(final DranasEmissary card) {
+ super(card);
+ }
+
+ @Override
+ public DranasEmissary copy() {
+ return new DranasEmissary(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DrownerOfHope.java b/Mage.Sets/src/mage/sets/battleforzendikar/DrownerOfHope.java
new file mode 100644
index 00000000000..c71ed280b54
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DrownerOfHope.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.permanent.token.EldraziScionToken;
+import mage.target.common.TargetControlledPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DrownerOfHope extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("an Eldrazi Scion");
+
+ static {
+ filter.add(Predicates.and(
+ new SubtypePredicate("Eldrazi"),
+ new SubtypePredicate("Scion")));
+ }
+
+ public DrownerOfHope(UUID ownerId) {
+ super(ownerId, 57, "Drowner of Hope", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // When Drowner of Hope enters the battlefield, put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool."
+ Effect effect = new CreateTokenEffect(new EldraziScionToken(), 2);
+ effect.setText("put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have \"Sacrifice this creature: Add {1} to your mana pool");
+ this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false));
+
+ // Sacrifice an Eldrazi Scion: Tap target creature.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TapTargetEffect(), new SacrificeTargetCost(new TargetControlledPermanent(filter)));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public DrownerOfHope(final DrownerOfHope card) {
+ super(card);
+ }
+
+ @Override
+ public DrownerOfHope copy() {
+ return new DrownerOfHope(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DustStalker.java b/Mage.Sets/src/mage/sets/battleforzendikar/DustStalker.java
new file mode 100644
index 00000000000..15b94094f9c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DustStalker.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.effects.common.ReturnToHandSourceEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.filter.predicate.permanent.AnotherPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DustStalker extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("if you control no other colorless creatures");
+
+ static {
+ filter.add(new AnotherPredicate());
+ filter.add(new ColorlessPredicate());
+ }
+
+ public DustStalker(UUID ownerId) {
+ super(ownerId, 202, "Dust Stalker", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+ // Haste
+ this.addAbility(HasteAbility.getInstance());
+ // At the beginning of each end step, if you control no other colorless creatures, return Dust Stalker to its owner's hand.
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(), TargetController.ANY,
+ new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.EQUAL_TO, 0), false));
+ }
+
+ public DustStalker(final DustStalker card) {
+ super(card);
+ }
+
+ @Override
+ public DustStalker copy() {
+ return new DustStalker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DutifulReturn.java b/Mage.Sets/src/mage/sets/battleforzendikar/DutifulReturn.java
new file mode 100644
index 00000000000..16f15a891a4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DutifulReturn.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DutifulReturn extends mage.sets.khansoftarkir.DutifulReturn {
+
+ public DutifulReturn(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 110;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public DutifulReturn(final DutifulReturn card) {
+ super(card);
+ }
+
+ @Override
+ public DutifulReturn copy() {
+ return new DutifulReturn(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/EarthenArms.java b/Mage.Sets/src/mage/sets/battleforzendikar/EarthenArms.java
new file mode 100644
index 00000000000..b59920c5383
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/EarthenArms.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.counters.CounterType;
+import mage.target.TargetPermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class EarthenArms extends CardImpl {
+
+ public EarthenArms(UUID ownerId) {
+ super(ownerId, 172, "Earthen Arms", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{G}");
+ this.expansionSetCode = "BFZ";
+
+ // Put two +1/+1 counters on target permanent.
+ this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance(2)));
+ this.getSpellAbility().addTarget(new TargetPermanent());
+
+ // Awaken 4 - {6}{G}
+ this.addAbility(new AwakenAbility(this, 4, "{6}{G}"));
+ }
+
+ public EarthenArms(final EarthenArms card) {
+ super(card);
+ }
+
+ @Override
+ public EarthenArms copy() {
+ return new EarthenArms(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/EldraziDevastator.java b/Mage.Sets/src/mage/sets/battleforzendikar/EldraziDevastator.java
new file mode 100644
index 00000000000..75c5c88beaa
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/EldraziDevastator.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class EldraziDevastator extends CardImpl {
+
+ public EldraziDevastator(UUID ownerId) {
+ super(ownerId, 7, "Eldrazi Devastator", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{8}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(8);
+ this.toughness = new MageInt(9);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ }
+
+ public EldraziDevastator(final EldraziDevastator card) {
+ super(card);
+ }
+
+ @Override
+ public EldraziDevastator copy() {
+ return new EldraziDevastator(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/EldraziSkyspawner.java b/Mage.Sets/src/mage/sets/battleforzendikar/EldraziSkyspawner.java
new file mode 100644
index 00000000000..f741b022af0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/EldraziSkyspawner.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.game.permanent.token.EldraziScionToken;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class EldraziSkyspawner extends CardImpl {
+
+ public EldraziSkyspawner(UUID ownerId) {
+ super(ownerId, 58, "Eldrazi Skyspawner", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // When Eldrazi Skyspawner enters the battlefield, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."
+ Effect effect = new CreateTokenEffect(new EldraziScionToken());
+ effect.setText("put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has \"Sacrifice this creature: Add {1} to your mana pool.\"");
+ this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false));
+ }
+
+ public EldraziSkyspawner(final EldraziSkyspawner card) {
+ super(card);
+ }
+
+ @Override
+ public EldraziSkyspawner copy() {
+ return new EldraziSkyspawner(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/EmeriaShepherd.java b/Mage.Sets/src/mage/sets/battleforzendikar/EmeriaShepherd.java
new file mode 100644
index 00000000000..df914e83869
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/EmeriaShepherd.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterPermanentCard;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCardInYourGraveyard;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class EmeriaShepherd extends CardImpl {
+
+ private static final FilterPermanentCard filter = new FilterPermanentCard("nonland permanent card from your graveyard");
+
+ static {
+ filter.add(Predicates.not(new CardTypePredicate(CardType.LAND)));
+ }
+
+ public EmeriaShepherd(UUID ownerId) {
+ super(ownerId, 22, "Emeria Shepherd", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{W}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Angel");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // Landfall — Whenever a land enters the battlefield under your control, you may return target nonland permanent card from your graveyard to your hand.
+ // If that land is a Plains, you may return that nonland permanent card to the battlefield instead.
+ Ability ability = new LandfallAbility(Zone.BATTLEFIELD, new EmeriaShepherdReturnToHandTargetEffect(), true);
+ ability.addTarget(new TargetCardInYourGraveyard(new FilterPermanentCard(filter)));
+ this.addAbility(ability);
+ }
+
+ public EmeriaShepherd(final EmeriaShepherd card) {
+ super(card);
+ }
+
+ @Override
+ public EmeriaShepherd copy() {
+ return new EmeriaShepherd(this);
+ }
+}
+
+class EmeriaShepherdReturnToHandTargetEffect extends OneShotEffect {
+
+ public EmeriaShepherdReturnToHandTargetEffect() {
+ super(Outcome.ReturnToHand);
+ staticText = "you may return target nonland permanent card from your graveyard to your hand. If that land is a Plains, you may return that nonland permanent card to the battlefield instead";
+ }
+
+ public EmeriaShepherdReturnToHandTargetEffect(final EmeriaShepherdReturnToHandTargetEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public EmeriaShepherdReturnToHandTargetEffect copy() {
+ return new EmeriaShepherdReturnToHandTargetEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Permanent triggeringLand = ((LandfallAbility) source).getTriggeringPermanent();
+ if (controller == null || triggeringLand == null) {
+ return false;
+ }
+ Zone toZone = Zone.HAND;
+ if (triggeringLand.getSubtype().contains("Plains")
+ && controller.chooseUse(Outcome.PutCardInPlay, "Put the card to battlefield instead?", source, game)) {
+ toZone = Zone.BATTLEFIELD;
+ }
+ return controller.moveCards(new CardsImpl(targetPointer.getTargets(game, source)), toZone, source, game);
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/EncirclingFissure.java b/Mage.Sets/src/mage/sets/battleforzendikar/EncirclingFissure.java
new file mode 100644
index 00000000000..3722f671901
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/EncirclingFissure.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.PreventionEffectImpl;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.game.Game;
+import mage.game.events.DamageEvent;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetOpponent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class EncirclingFissure extends CardImpl {
+
+ public EncirclingFissure(UUID ownerId) {
+ super(ownerId, 23, "Encircling Fissure", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Prevent all combat damage that would be dealt this turn by creatures target opponent controls.
+ this.getSpellAbility().addEffect(new EncirclingFissurePreventEffect());
+ this.getSpellAbility().addTarget(new TargetOpponent());
+
+ // Awaken 2 —{4}{W}
+ this.addAbility(new AwakenAbility(this, 2, "{4}{W}"));
+ }
+
+ public EncirclingFissure(final EncirclingFissure card) {
+ super(card);
+ }
+
+ @Override
+ public EncirclingFissure copy() {
+ return new EncirclingFissure(this);
+ }
+}
+
+class EncirclingFissurePreventEffect extends PreventionEffectImpl {
+
+ public EncirclingFissurePreventEffect() {
+ super(Duration.EndOfTurn, Integer.MAX_VALUE, true, false);
+ staticText = "Prevent all combat damage that would be dealt this turn by creatures target opponent controls";
+ }
+
+ public EncirclingFissurePreventEffect(final EncirclingFissurePreventEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public EncirclingFissurePreventEffect copy() {
+ return new EncirclingFissurePreventEffect(this);
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ if (super.applies(event, source, game) && event instanceof DamageEvent && event.getAmount() > 0) {
+ DamageEvent damageEvent = (DamageEvent) event;
+ if (damageEvent.isCombatDamage()) {
+ Permanent permanent = game.getPermanent(damageEvent.getSourceId());
+ if (permanent != null
+ && permanent.getCardType().contains(CardType.CREATURE)
+ && permanent.getControllerId().equals(getTargetPointer().getFirst(game, source))) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/EndlessOne.java b/Mage.Sets/src/mage/sets/battleforzendikar/EndlessOne.java
new file mode 100644
index 00000000000..54a615e10a1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/EndlessOne.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.counters.CounterType;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class EndlessOne extends CardImpl {
+
+ public EndlessOne(UUID ownerId) {
+ super(ownerId, 8, "Endless One", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{X}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(0);
+
+ // Endless One enters the battlefield with X +1/+1 counters on it.
+ this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.P1P1.createInstance())));
+ }
+
+ public EndlessOne(final EndlessOne card) {
+ super(card);
+ }
+
+ @Override
+ public EndlessOne copy() {
+ return new EndlessOne(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ExertInfluence.java b/Mage.Sets/src/mage/sets/battleforzendikar/ExertInfluence.java
new file mode 100644
index 00000000000..479fdb7709e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ExertInfluence.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.continuous.GainControlTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.AbilityWord;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ExertInfluence extends CardImpl {
+
+ public ExertInfluence(UUID ownerId) {
+ super(ownerId, 77, "Exert Influence", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{4}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Converge-Gain control of target creature if its power is less than or equal to the number of colors spent to cast Exert Influence.
+ getSpellAbility().setAbilityWord(AbilityWord.CONVERGE);
+ getSpellAbility().addEffect(new ExertInfluenceEffect());
+ getSpellAbility().addTarget(new TargetCreaturePermanent());
+
+ }
+
+ public ExertInfluence(final ExertInfluence card) {
+ super(card);
+ }
+
+ @Override
+ public ExertInfluence copy() {
+ return new ExertInfluence(this);
+ }
+}
+
+class ExertInfluenceEffect extends OneShotEffect {
+
+ public ExertInfluenceEffect() {
+ super(Outcome.GainControl);
+ this.staticText = "Gain control of target creature if its power is less than or equal to the number of colors spent to cast {this}";
+ }
+
+ public ExertInfluenceEffect(final ExertInfluenceEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public ExertInfluenceEffect copy() {
+ return new ExertInfluenceEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ MageObject sourceObject = game.getObject(source.getSourceId());
+ Player controller = game.getPlayer(source.getControllerId());
+ Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
+ if (controller != null && sourceObject != null) {
+ int colors = new ColorsOfManaSpentToCastCount().calculate(game, source, this);
+ if (targetCreature.getPower().getValue() <= colors) {
+ game.addEffect(new GainControlTargetEffect(Duration.Custom, true), source);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ExpeditionEnvoy.java b/Mage.Sets/src/mage/sets/battleforzendikar/ExpeditionEnvoy.java
new file mode 100644
index 00000000000..2238af4b527
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ExpeditionEnvoy.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ExpeditionEnvoy extends CardImpl {
+
+ public ExpeditionEnvoy(UUID ownerId) {
+ super(ownerId, 24, "Expedition Envoy", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Scout");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+ }
+
+ public ExpeditionEnvoy(final ExpeditionEnvoy card) {
+ super(card);
+ }
+
+ @Override
+ public ExpeditionEnvoy copy() {
+ return new ExpeditionEnvoy(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/EyelessWatcher.java b/Mage.Sets/src/mage/sets/battleforzendikar/EyelessWatcher.java
new file mode 100644
index 00000000000..f21d030f168
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/EyelessWatcher.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.game.permanent.token.EldraziScionToken;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class EyelessWatcher extends CardImpl {
+
+ public EyelessWatcher(UUID ownerId) {
+ super(ownerId, 166, "Eyeless Watcher", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+ // When Eyeless Watcher enters the battlefield, put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool."
+ Effect effect = new CreateTokenEffect(new EldraziScionToken(), 2);
+ effect.setText("put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have \"Sacrifice this creature: Add {1} to your mana pool.\"");
+ this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false));
+
+ }
+
+ public EyelessWatcher(final EyelessWatcher card) {
+ super(card);
+ }
+
+ @Override
+ public EyelessWatcher copy() {
+ return new EyelessWatcher(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/FathomFeeder.java b/Mage.Sets/src/mage/sets/battleforzendikar/FathomFeeder.java
new file mode 100644
index 00000000000..7b2034d276a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/FathomFeeder.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.keyword.DeathtouchAbility;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.IngestAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class FathomFeeder extends CardImpl {
+
+ public FathomFeeder(UUID ownerId) {
+ super(ownerId, 203, "Fathom Feeder", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{U}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Deathtouch
+ this.addAbility(DeathtouchAbility.getInstance());
+
+ // Ingest
+ this.addAbility(new IngestAbility());
+
+ // {3}{U}{B}: Draw a card. Each opponent exiles the top card of his or her library.
+ Effect effect = new FathomFeederEffect();
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new ManaCostsImpl("{3}{U}{B}"));
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public FathomFeeder(final FathomFeeder card) {
+ super(card);
+ }
+
+ @Override
+ public FathomFeeder copy() {
+ return new FathomFeeder(this);
+ }
+}
+
+class FathomFeederEffect extends OneShotEffect {
+ public FathomFeederEffect() {
+ super(Outcome.Exile);
+ this.staticText = "Each opponent exiles the top card of his or her library";
+ }
+
+ public FathomFeederEffect(final FathomFeederEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public FathomFeederEffect copy() {
+ return new FathomFeederEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ for (UUID opponentId: game.getOpponents(source.getControllerId())) {
+ Player player = game.getPlayer(opponentId);
+ if (player != null) {
+ Card card = player.getLibrary().getFromTop(game);
+ if (card != null) {
+ player.moveCards(card, Zone.LIBRARY, Zone.EXILED, source, game);
+ }
+ }
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/FelidarCub.java b/Mage.Sets/src/mage/sets/battleforzendikar/FelidarCub.java
new file mode 100644
index 00000000000..c6afaf9d4c5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/FelidarCub.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetEnchantmentPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class FelidarCub extends CardImpl {
+
+ public FelidarCub(UUID ownerId) {
+ super(ownerId, 25, "Felidar Cub", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Cat");
+ this.subtype.add("Beast");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Sacrifice Felidar Cub: Destroy target enchantment.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new SacrificeSourceCost());
+ ability.addTarget(new TargetEnchantmentPermanent());
+ this.addAbility(ability);
+ }
+
+ public FelidarCub(final FelidarCub card) {
+ super(card);
+ }
+
+ @Override
+ public FelidarCub copy() {
+ return new FelidarCub(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/FelidarSovereign.java b/Mage.Sets/src/mage/sets/battleforzendikar/FelidarSovereign.java
new file mode 100644
index 00000000000..4b5683b1f39
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/FelidarSovereign.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class FelidarSovereign extends mage.sets.zendikar.FelidarSovereign {
+
+ public FelidarSovereign(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 26;
+ this.expansionSetCode = "BFZ";
+ this.rarity = Rarity.RARE;
+ }
+
+ public FelidarSovereign(final FelidarSovereign card) {
+ super(card);
+ }
+
+ @Override
+ public FelidarSovereign copy() {
+ return new FelidarSovereign(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/FertileThicket.java b/Mage.Sets/src/mage/sets/battleforzendikar/FertileThicket.java
new file mode 100644
index 00000000000..fde59a38378
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/FertileThicket.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.mana.GreenManaAbility;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterBasicLandCard;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.TargetCard;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class FertileThicket extends CardImpl {
+
+ public FertileThicket(UUID ownerId) {
+ super(ownerId, 237, "Fertile Thicket", Rarity.COMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // Fertile Thicket enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // When Fertile Thicket enters the battlefield, you may look at the top five cards of your library. If you do, reveal up to one basic land card from among them, then put that card on top of your library and the rest on the bottom in any order.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new FertileThicketEffect(), true));
+
+ // {T}: Add {G} to your mana pool.
+ this.addAbility(new GreenManaAbility());
+ }
+
+ public FertileThicket(final FertileThicket card) {
+ super(card);
+ }
+
+ @Override
+ public FertileThicket copy() {
+ return new FertileThicket(this);
+ }
+}
+
+class FertileThicketEffect extends OneShotEffect {
+
+ public FertileThicketEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "you may look at the top five cards of your library. If you do, reveal up to one basic land card from among them, then put that card on top of your library and the rest on the bottom in any order";
+ }
+
+ public FertileThicketEffect(final FertileThicketEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public FertileThicketEffect copy() {
+ return new FertileThicketEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ MageObject sourceObject = game.getObject(source.getSourceId());
+ if (controller != null && sourceObject != null) {
+ Cards cards = new CardsImpl();
+ cards.addAll(controller.getLibrary().getTopCards(game, 5));
+ controller.lookAtCards(sourceObject.getIdName(), cards, game);
+ TargetCard target = new TargetCard(0, 1, Zone.LIBRARY, new FilterBasicLandCard());
+ controller.chooseTarget(outcome, cards, target, source, game);
+ Cards cardsRevealed = new CardsImpl(target.getTargets());
+ if (!cardsRevealed.isEmpty()) {
+ controller.revealCards(sourceObject.getIdName(), cardsRevealed, game);
+ cards.removeAll(cardsRevealed);
+ controller.putCardsOnTopOfLibrary(cardsRevealed, game, source, true);
+ }
+ controller.putCardsOnBottomOfLibrary(cards, game, source, true);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/FiremantleMage.java b/Mage.Sets/src/mage/sets/battleforzendikar/FiremantleMage.java
new file mode 100644
index 00000000000..4dfae72574a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/FiremantleMage.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
+import mage.abilities.keyword.MenaceAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class FiremantleMage extends CardImpl {
+
+ public FiremantleMage(UUID ownerId) {
+ super(ownerId, 145, "Firemantle Mage", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Shaman");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Rally — Whenver Firemantle Mage or another Ally enters the battlefield under your control, creatures you control gain menace until end of turn.
+ this.addAbility(new AllyEntersBattlefieldTriggeredAbility(
+ new GainAbilityControlledEffect(new MenaceAbility(), Duration.EndOfTurn, new FilterControlledCreaturePermanent("creatures you control")), false));
+ }
+
+ public FiremantleMage(final FiremantleMage card) {
+ super(card);
+ }
+
+ @Override
+ public FiremantleMage copy() {
+ return new FiremantleMage(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ForerunnerOfSlaughter.java b/Mage.Sets/src/mage/sets/battleforzendikar/ForerunnerOfSlaughter.java
new file mode 100644
index 00000000000..45bdcdabc95
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ForerunnerOfSlaughter.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ForerunnerOfSlaughter extends mage.sets.zendikarvseldrazi.ForerunnerOfSlaughter {
+
+ public ForerunnerOfSlaughter(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 204;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public ForerunnerOfSlaughter(final ForerunnerOfSlaughter card) {
+ super(card);
+ }
+
+ @Override
+ public ForerunnerOfSlaughter copy() {
+ return new ForerunnerOfSlaughter(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Forest1.java b/Mage.Sets/src/mage/sets/battleforzendikar/Forest1.java
new file mode 100644
index 00000000000..d62397e6e1d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Forest1.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Forest1 extends mage.cards.basiclands.Forest {
+
+ public Forest1(UUID ownerId) {
+ super(ownerId, 270);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Forest1(final Forest1 card) {
+ super(card);
+ }
+
+ @Override
+ public Forest1 copy() {
+ return new Forest1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Forest2.java b/Mage.Sets/src/mage/sets/battleforzendikar/Forest2.java
new file mode 100644
index 00000000000..ec7f4c906a8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Forest2.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Forest2 extends mage.cards.basiclands.Forest {
+
+ public Forest2(UUID ownerId) {
+ super(ownerId, 271);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Forest2(final Forest2 card) {
+ super(card);
+ }
+
+ @Override
+ public Forest2 copy() {
+ return new Forest2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Forest3.java b/Mage.Sets/src/mage/sets/battleforzendikar/Forest3.java
new file mode 100644
index 00000000000..951dce0ba38
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Forest3.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Forest3 extends mage.cards.basiclands.Forest {
+
+ public Forest3(UUID ownerId) {
+ super(ownerId, 272);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Forest3(final Forest3 card) {
+ super(card);
+ }
+
+ @Override
+ public Forest3 copy() {
+ return new Forest3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Forest4.java b/Mage.Sets/src/mage/sets/battleforzendikar/Forest4.java
new file mode 100644
index 00000000000..647fe973505
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Forest4.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Forest4 extends mage.cards.basiclands.Forest {
+
+ public Forest4(UUID ownerId) {
+ super(ownerId, 273);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Forest4(final Forest4 card) {
+ super(card);
+ }
+
+ @Override
+ public Forest4 copy() {
+ return new Forest4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Forest5.java b/Mage.Sets/src/mage/sets/battleforzendikar/Forest5.java
new file mode 100644
index 00000000000..22ed1741346
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Forest5.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Forest5 extends mage.cards.basiclands.Forest {
+
+ public Forest5(UUID ownerId) {
+ super(ownerId, 274);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Forest5(final Forest5 card) {
+ super(card);
+ }
+
+ @Override
+ public Forest5 copy() {
+ return new Forest5(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/FortifiedRampart.java b/Mage.Sets/src/mage/sets/battleforzendikar/FortifiedRampart.java
new file mode 100644
index 00000000000..73543737e94
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/FortifiedRampart.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.DefenderAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class FortifiedRampart extends CardImpl {
+
+ public FortifiedRampart(UUID ownerId) {
+ super(ownerId, 27, "Fortified Rampart", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Wall");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(6);
+
+ // Defender
+ this.addAbility(DefenderAbility.getInstance());
+ }
+
+ public FortifiedRampart(final FortifiedRampart card) {
+ super(card);
+ }
+
+ @Override
+ public FortifiedRampart copy() {
+ return new FortifiedRampart(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/FromBeyond.java b/Mage.Sets/src/mage/sets/battleforzendikar/FromBeyond.java
new file mode 100644
index 00000000000..048f5b9264b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/FromBeyond.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.permanent.token.EldraziScionToken;
+import mage.target.common.TargetCardInLibrary;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class FromBeyond extends CardImpl {
+
+ private static final FilterCard filter = new FilterCard("Eldrazi card");
+
+ static {
+ filter.add(new SubtypePredicate("Eldrazi"));
+ }
+
+ public FromBeyond(UUID ownerId) {
+ super(ownerId, 167, "From Beyond", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // At the beginning of your upkeep, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new EldraziScionToken()), TargetController.YOU, false));
+
+ // {1}{G}, Sacrifice From Beyond: Search your library for an Eldrazi card, reveal it, put it into your hand, then shuffle your library.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
+ new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true, true),
+ new ManaCostsImpl("{1}{G}"));
+ ability.addCost(new SacrificeSourceCost());
+ this.addAbility(ability);
+ }
+
+ public FromBeyond(final FromBeyond card) {
+ super(card);
+ }
+
+ @Override
+ public FromBeyond copy() {
+ return new FromBeyond(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GeyserfieldStalker.java b/Mage.Sets/src/mage/sets/battleforzendikar/GeyserfieldStalker.java
new file mode 100644
index 00000000000..4dac3868387
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GeyserfieldStalker.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.MenaceAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class GeyserfieldStalker extends CardImpl {
+
+ public GeyserfieldStalker(UUID ownerId) {
+ super(ownerId, 111, "Geyserfield Stalker", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elemental");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Menace
+ this.addAbility(new MenaceAbility());
+ // Landfall - Whenever a land enters the battlefield under your control, Geyserfield Stalker gets +2/+2 until end of turn.
+ this.addAbility(new LandfallAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), false));
+ }
+
+ public GeyserfieldStalker(final GeyserfieldStalker card) {
+ super(card);
+ }
+
+ @Override
+ public GeyserfieldStalker copy() {
+ return new GeyserfieldStalker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GhostlySentinel.java b/Mage.Sets/src/mage/sets/battleforzendikar/GhostlySentinel.java
new file mode 100644
index 00000000000..c9397deeb45
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GhostlySentinel.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.VigilanceAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class GhostlySentinel extends CardImpl {
+
+ public GhostlySentinel(UUID ownerId) {
+ super(ownerId, 28, "Ghostly Sentinel", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Kor");
+ this.subtype.add("Spirit");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // Vigilance
+ this.addAbility(VigilanceAbility.getInstance());
+ }
+
+ public GhostlySentinel(final GhostlySentinel card) {
+ super(card);
+ }
+
+ @Override
+ public GhostlySentinel copy() {
+ return new GhostlySentinel(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GiantMantis.java b/Mage.Sets/src/mage/sets/battleforzendikar/GiantMantis.java
new file mode 100644
index 00000000000..02586302d79
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GiantMantis.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class GiantMantis extends mage.sets.mirage.GiantMantis {
+
+ public GiantMantis(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 173;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public GiantMantis(final GiantMantis card) {
+ super(card);
+ }
+
+ @Override
+ public GiantMantis copy() {
+ return new GiantMantis(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GideonAllyOfZendikar.java b/Mage.Sets/src/mage/sets/battleforzendikar/GideonAllyOfZendikar.java
new file mode 100644
index 00000000000..07c4d334a5e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GideonAllyOfZendikar.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.LoyaltyAbility;
+import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.GetEmblemEffect;
+import mage.abilities.effects.common.PreventAllDamageToSourceEffect;
+import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.keyword.IndestructibleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.command.Emblem;
+import mage.game.permanent.token.Token;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GideonAllyOfZendikar extends CardImpl {
+
+ public GideonAllyOfZendikar(UUID ownerId) {
+ super(ownerId, 29, "Gideon, Ally of Zendikar", Rarity.MYTHIC, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Gideon");
+
+ this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
+
+ // +1: Until end of turn, Gideon, Ally of Zendikar becomes a 5/5 Human Soldier Ally creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn.
+ LoyaltyAbility ability = new LoyaltyAbility(new BecomesCreatureSourceEffect(new GideonAllyOfZendikarToken(), "planeswalker", Duration.EndOfTurn), 1);
+ Effect effect = new PreventAllDamageToSourceEffect(Duration.EndOfTurn);
+ effect.setText("Prevent all damage that would be dealt to him this turn");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+
+ // 0: Put a 2/2 white Knight Ally creature token onto the battlefield.
+ this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new KnightAllyToken()), 0));
+
+ // -4: You get an emblem with "Creatures you control get +1/+1."
+ this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new GideonAllyOfZendikarEmblem()), -4));
+ }
+
+ public GideonAllyOfZendikar(final GideonAllyOfZendikar card) {
+ super(card);
+ }
+
+ @Override
+ public GideonAllyOfZendikar copy() {
+ return new GideonAllyOfZendikar(this);
+ }
+}
+
+class GideonAllyOfZendikarEmblem extends Emblem {
+
+ public GideonAllyOfZendikarEmblem() {
+ this.setName("EMBLEM: Gideon, Ally of Zendikar");
+ BoostControlledEffect effect = new BoostControlledEffect(1, 1, Duration.EndOfGame);
+ Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect);
+ this.getAbilities().add(ability);
+ this.setExpansionSetCodeForImage("BFZ");
+ }
+}
+
+class GideonAllyOfZendikarToken extends Token {
+
+ public GideonAllyOfZendikarToken() {
+ super("", "5/5 Human Soldier Ally creature with indestructible");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Human");
+ subtype.add("Soldier");
+ subtype.add("Ally");
+ power = new MageInt(5);
+ toughness = new MageInt(5);
+
+ addAbility(IndestructibleAbility.getInstance());
+ }
+}
+
+class KnightAllyToken extends Token {
+
+ public KnightAllyToken() {
+ super("Knight Ally", "2/2 white Knight Ally creature token");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Knight");
+ subtype.add("Ally");
+ color.setWhite(true);
+ power = new MageInt(2);
+ toughness = new MageInt(2);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GideonsReproach.java b/Mage.Sets/src/mage/sets/battleforzendikar/GideonsReproach.java
new file mode 100644
index 00000000000..c12411f150e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GideonsReproach.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetAttackingOrBlockingCreature;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GideonsReproach extends CardImpl {
+
+ public GideonsReproach(UUID ownerId) {
+ super(ownerId, 30, "Gideon's Reproach", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Gideon's Reproach deals 4 damage to target attacking or blocking creature.
+ getSpellAbility().addEffect(new DamageTargetEffect(4));
+ getSpellAbility().addTarget(new TargetAttackingOrBlockingCreature());
+ }
+
+ public GideonsReproach(final GideonsReproach card) {
+ super(card);
+ }
+
+ @Override
+ public GideonsReproach copy() {
+ return new GideonsReproach(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GoblinWarPaint.java b/Mage.Sets/src/mage/sets/battleforzendikar/GoblinWarPaint.java
new file mode 100644
index 00000000000..454e583840b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GoblinWarPaint.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class GoblinWarPaint extends mage.sets.zendikar.GoblinWarPaint {
+
+ public GoblinWarPaint(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 146;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public GoblinWarPaint(final GoblinWarPaint card) {
+ super(card);
+ }
+
+ @Override
+ public GoblinWarPaint copy() {
+ return new GoblinWarPaint(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GraveBirthing.java b/Mage.Sets/src/mage/sets/battleforzendikar/GraveBirthing.java
new file mode 100644
index 00000000000..a33a559e1bd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GraveBirthing.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.token.EldraziScionToken;
+import mage.players.Player;
+import mage.target.Target;
+import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.common.TargetOpponent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class GraveBirthing extends CardImpl {
+
+ public GraveBirthing(UUID ownerId) {
+ super(ownerId, 93, "Grave Birthing", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{B}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+ // Target opponent exiles a card from his or her graveyard. You put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."
+ this.getSpellAbility().addEffect(new GraveBirthingEffect());
+ this.getSpellAbility().addTarget(new TargetOpponent());
+ Effect effect = new CreateTokenEffect(new EldraziScionToken());
+ effect.setText("You put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has \"Sacrifice this creature: Add {1} to your mana pool.\" ");
+ this.getSpellAbility().addEffect(effect); // Draw a card.
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
+ }
+
+ public GraveBirthing(final GraveBirthing card) {
+ super(card);
+ }
+
+ @Override
+ public GraveBirthing copy() {
+ return new GraveBirthing(this);
+ }
+}
+
+class GraveBirthingEffect extends OneShotEffect {
+
+ public GraveBirthingEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "Target opponent exiles a card from his or her graveyard";
+ }
+
+ public GraveBirthingEffect(final GraveBirthingEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public GraveBirthingEffect copy() {
+ return new GraveBirthingEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player opponent = game.getPlayer(getTargetPointer().getFirst(game, source));
+ if (opponent != null) {
+ Target target = new TargetCardInYourGraveyard();
+ target.setNotTarget(true);
+ opponent.chooseTarget(outcome, target, source, game);
+ Card card = game.getCard(target.getFirstTarget());
+ opponent.moveCards(card, null, Zone.EXILED, source, game);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GreenwardenOfMurasa.java b/Mage.Sets/src/mage/sets/battleforzendikar/GreenwardenOfMurasa.java
new file mode 100644
index 00000000000..be82aa3643e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GreenwardenOfMurasa.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ExileSourceEffect;
+import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
+import mage.abilities.effects.common.ReturnToHandTargetEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GreenwardenOfMurasa extends CardImpl {
+
+ public GreenwardenOfMurasa(UUID ownerId) {
+ super(ownerId, 174, "Greenwarden of Murasa", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{4}{G}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elemental");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(4);
+
+ // When Greenwarden of Murasa enters the battlefield, you may return target card from your graveyard to your hand.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect(), true);
+ ability.addTarget(new TargetCardInYourGraveyard());
+ this.addAbility(ability);
+
+ // When Greenwarden of Murasa dies, you may exile it. If you do, return target card from your graveyard to your hand.
+ ability = new DiesTriggeredAbility(new GreenwardenOfMurasaEffect(), false);
+ ability.addTarget(new TargetCardInYourGraveyard());
+ this.addAbility(ability);
+ }
+
+ public GreenwardenOfMurasa(final GreenwardenOfMurasa card) {
+ super(card);
+ }
+
+ @Override
+ public GreenwardenOfMurasa copy() {
+ return new GreenwardenOfMurasa(this);
+ }
+}
+
+class GreenwardenOfMurasaEffect extends OneShotEffect {
+
+ public GreenwardenOfMurasaEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "you may exile it. If you do, return target card from your graveyard to your hand";
+ }
+
+ public GreenwardenOfMurasaEffect(final GreenwardenOfMurasaEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public GreenwardenOfMurasaEffect copy() {
+ return new GreenwardenOfMurasaEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ MageObject sourceObject = game.getObject(source.getSourceId());
+ Card targetCard = game.getCard(getTargetPointer().getFirst(game, source));
+ if (controller != null && sourceObject != null && targetCard != null) {
+ if (controller.chooseUse(outcome, "Exile " + sourceObject.getLogName() + " to return card from your graveyard to your hand?", source, game)) {
+ // Setting the fixed target prevents to return Greenwarden of Murasa itself (becuase it's exiled meanwhile),
+ // but of course you can target it as the ability triggers I guess
+ Effect effect = new ReturnToHandTargetEffect();
+ effect.setTargetPointer(new FixedTarget(targetCard.getId(), targetCard.getZoneChangeCounter(game)));
+ new ExileSourceEffect().apply(game, source);
+ return effect.apply(game, source);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GripOfDesolation.java b/Mage.Sets/src/mage/sets/battleforzendikar/GripOfDesolation.java
new file mode 100644
index 00000000000..ab18f020a02
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GripOfDesolation.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+import mage.target.common.TargetLandPermanent;
+import mage.target.targetpointer.SecondTargetPointer;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class GripOfDesolation extends CardImpl {
+
+ public GripOfDesolation(UUID ownerId) {
+ super(ownerId, 94, "Grip of Desolation", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{4}{B}{B}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+ // Exile target creature and target land.
+ this.getSpellAbility().addEffect(new ExileTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ Effect effect = new ExileTargetEffect();
+ effect.setTargetPointer(new SecondTargetPointer());
+ effect.setText("and target land");
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addTarget(new TargetLandPermanent());
+
+ }
+
+ public GripOfDesolation(final GripOfDesolation card) {
+ super(card);
+ }
+
+ @Override
+ public GripOfDesolation copy() {
+ return new GripOfDesolation(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GroveRumbler.java b/Mage.Sets/src/mage/sets/battleforzendikar/GroveRumbler.java
new file mode 100644
index 00000000000..830d1fddf12
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GroveRumbler.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GroveRumbler extends CardImpl {
+
+ public GroveRumbler(UUID ownerId) {
+ super(ownerId, 211, "Grove Rumbler", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elemental");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+
+ // Landfall-Whenever a land enters the battlefield under your control, Grove Rumbler gets +2/+2 until end of turn.
+ this.addAbility(new LandfallAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), false));
+ }
+
+ public GroveRumbler(final GroveRumbler card) {
+ super(card);
+ }
+
+ @Override
+ public GroveRumbler copy() {
+ return new GroveRumbler(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GrovetenderDruids.java b/Mage.Sets/src/mage/sets/battleforzendikar/GrovetenderDruids.java
new file mode 100644
index 00000000000..fa502b0d489
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GrovetenderDruids.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.costs.Cost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.game.Game;
+import mage.game.permanent.token.Token;
+import mage.players.Player;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GrovetenderDruids extends CardImpl {
+
+ public GrovetenderDruids(UUID ownerId) {
+ super(ownerId, 212, "Grovetender Druids", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{G}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elf");
+ this.subtype.add("Druid");
+ this.subtype.add("Ally");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Rally-Whenever Grovetender Druids or another Ally enters the battlefield under your control, you may pay {1}.
+ // If you do, put a 1/1 green Plant creature token onto the battlefield.
+ this.addAbility(new AllyEntersBattlefieldTriggeredAbility(new GrovetenderDruidsEffect(), false));
+ }
+
+ public GrovetenderDruids(final GrovetenderDruids card) {
+ super(card);
+ }
+
+ @Override
+ public GrovetenderDruids copy() {
+ return new GrovetenderDruids(this);
+ }
+}
+
+class GrovetenderDruidsEffect extends OneShotEffect {
+
+ GrovetenderDruidsEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "you may pay {1}. If you do, put a 1/1 green Plant creature token onto the battlefield";
+ }
+
+ GrovetenderDruidsEffect(final GrovetenderDruidsEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public GrovetenderDruidsEffect copy() {
+ return new GrovetenderDruidsEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if(player != null) {
+ if(player.chooseUse(Outcome.BoostCreature, "Do you want to to pay {1}?", source, game)) {
+ Cost cost = new ManaCostsImpl("{1}");
+ if(cost.pay(source, game, source.getSourceId(), source.getControllerId(), false)) {
+ new CreateTokenEffect(new GrovetenderDruidsPlantToken()).apply(game, source);
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+class GrovetenderDruidsPlantToken extends Token {
+
+ public GrovetenderDruidsPlantToken() {
+ super("Plant", "1/1 green Plant creature");
+ cardType.add(CardType.CREATURE);
+ color.setGreen(true);
+ subtype.add("Plant");
+ power = new MageInt(1);
+ toughness = new MageInt(1);
+ this.setOriginalExpansionSetCode("BFZ");
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GruesomeSlaughter.java b/Mage.Sets/src/mage/sets/battleforzendikar/GruesomeSlaughter.java
new file mode 100644
index 00000000000..189f4108e21
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GruesomeSlaughter.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GruesomeSlaughter extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("colorless creatures you control");
+
+ static {
+ filter.add(new ColorlessPredicate());
+ }
+
+ public GruesomeSlaughter(UUID ownerId) {
+ super(ownerId, 9, "Gruesome Slaughter", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{6}");
+ this.expansionSetCode = "BFZ";
+
+ // Until end of turn, colorless creatures you control gain "{T}: This creature deals damage equal to its power to target creature."
+ Effect effect = new DamageTargetEffect(new SourcePermanentPowerCount());
+ effect.setText("{this} deals damage equal to its power to target creature.");
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.getSpellAbility().addEffect(new GainAbilityControlledEffect(ability, Duration.EndOfTurn, filter));
+ }
+
+ public GruesomeSlaughter(final GruesomeSlaughter card) {
+ super(card);
+ }
+
+ @Override
+ public GruesomeSlaughter copy() {
+ return new GruesomeSlaughter(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GuardianOfTazeem.java b/Mage.Sets/src/mage/sets/battleforzendikar/GuardianOfTazeem.java
new file mode 100644
index 00000000000..d82f72d6ad5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GuardianOfTazeem.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GuardianOfTazeem extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public GuardianOfTazeem(UUID ownerId) {
+ super(ownerId, 78, "Guardian of Tazeem", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{U}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Sphinx");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(5);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Landfall - Whenever a land enters the battlefield under you control, tap target creature an opponent controls. If that land is an Island, that creature doesn't untap during its controller's next untap step.
+ Ability ability = new GuardianOfTazeemTriggeredAbility();
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ this.addAbility(ability);
+ }
+
+ public GuardianOfTazeem(final GuardianOfTazeem card) {
+ super(card);
+ }
+
+ @Override
+ public GuardianOfTazeem copy() {
+ return new GuardianOfTazeem(this);
+ }
+}
+
+class GuardianOfTazeemTriggeredAbility extends TriggeredAbilityImpl {
+
+ public GuardianOfTazeemTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new TapTargetEffect(), false);
+ addEffect(new GuardianOfTazeemEffect());
+ }
+
+ public GuardianOfTazeemTriggeredAbility(final GuardianOfTazeemTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public GuardianOfTazeemTriggeredAbility copy() {
+ return new GuardianOfTazeemTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent permanent = game.getPermanent(event.getTargetId());
+ if (permanent != null
+ && permanent.getCardType().contains(CardType.LAND)
+ && permanent.getControllerId().equals(getControllerId())) {
+ for (Effect effect : getEffects()) {
+ if (effect instanceof GuardianOfTazeemEffect) {
+ effect.setTargetPointer(new FixedTarget(permanent, game));
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Landfall - Whenever a land enters the battlefield under your control, " + super.getRule();
+ }
+}
+
+class GuardianOfTazeemEffect extends OneShotEffect {
+
+ public GuardianOfTazeemEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "If that land is an Island, that creature doesn't untap during its controller's next untap step";
+ }
+
+ public GuardianOfTazeemEffect(final GuardianOfTazeemEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public GuardianOfTazeemEffect copy() {
+ return new GuardianOfTazeemEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent land = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source));
+ Permanent targetCreature = game.getPermanent(source.getFirstTarget());
+ if (land != null && targetCreature != null) {
+ if (land.hasSubtype("Island")) {
+ ContinuousEffect effect = new DontUntapInControllersNextUntapStepTargetEffect("that creature");
+ effect.setTargetPointer(new FixedTarget(targetCreature, game));
+ game.addEffect(effect, source);
+ }
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GuulDrazOverseer.java b/Mage.Sets/src/mage/sets/battleforzendikar/GuulDrazOverseer.java
new file mode 100644
index 00000000000..745e55c2a94
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GuulDrazOverseer.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.SetTargetPointer;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class GuulDrazOverseer extends CardImpl {
+
+ public GuulDrazOverseer(UUID ownerId) {
+ super(ownerId, 112, "Guul Draz Overseer", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{B}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Vampire");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(4);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // Landfall- Whenever a land enters the battlefield under your control, other creatures you control get +1/+0 until end of turn. If that land is a Swamp, those creatures get +2/+0 until end of turn instead.
+ this.addAbility(new LandfallAbility(Zone.BATTLEFIELD, new GuulDrazOverseerEffect(), false, SetTargetPointer.PERMANENT));
+ }
+
+ public GuulDrazOverseer(final GuulDrazOverseer card) {
+ super(card);
+ }
+
+ @Override
+ public GuulDrazOverseer copy() {
+ return new GuulDrazOverseer(this);
+ }
+}
+
+class GuulDrazOverseerEffect extends OneShotEffect {
+
+ public GuulDrazOverseerEffect() {
+ super(Outcome.BoostCreature);
+ this.staticText = "other creatures you control get +1/+0 until end of turn. If that land is a Swamp, those creatures get +2/+0 until end of turn instead";
+ }
+
+ public GuulDrazOverseerEffect(final GuulDrazOverseerEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public GuulDrazOverseerEffect copy() {
+ return new GuulDrazOverseerEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Permanent land = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source));
+ if (controller != null && land != null) {
+ int boost = 1;
+ if (land.getSubtype().contains("Swamp")) {
+ boost = 2;
+ }
+ game.addEffect(new BoostControlledEffect(boost, 0, Duration.EndOfTurn, true), source);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/HagraSharpshooter.java b/Mage.Sets/src/mage/sets/battleforzendikar/HagraSharpshooter.java
new file mode 100644
index 00000000000..848b4e1aab4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/HagraSharpshooter.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class HagraSharpshooter extends CardImpl {
+
+ public HagraSharpshooter(UUID ownerId) {
+ super(ownerId, 113, "Hagra Sharpshooter", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Assassin");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {4}{B}: Target creature gets -1/-1 until end of turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(-1, -1, Duration.EndOfTurn), new ManaCostsImpl("{4}{B}"));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public HagraSharpshooter(final HagraSharpshooter card) {
+ super(card);
+ }
+
+ @Override
+ public HagraSharpshooter copy() {
+ return new HagraSharpshooter(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/HalimarTidecaller.java b/Mage.Sets/src/mage/sets/battleforzendikar/HalimarTidecaller.java
new file mode 100644
index 00000000000..7afb519a95f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/HalimarTidecaller.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.ReturnToHandTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.filter.FilterPermanent;
+import mage.filter.predicate.mageobject.AbilityPredicate;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.target.common.TargetCardInYourGraveyard;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class HalimarTidecaller extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterPermanent("Land creatures");
+ private static final FilterCard filterCard = new FilterCard("card with awaken from your graveyard");
+
+ static {
+ filter.add(new CardTypePredicate(CardType.LAND));
+ filter.add(new CardTypePredicate(CardType.CREATURE));
+ filterCard.add(new AbilityPredicate(AwakenAbility.class));
+ }
+
+ public HalimarTidecaller(UUID ownerId) {
+ super(ownerId, 79, "Halimar Tidecaller", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Wizard");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // When Halimar Tidecaller enters the battlefield, you may return target card with awaken from your graveyard to your hand.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), true);
+ ability.addTarget(new TargetCardInYourGraveyard(filterCard));
+
+ this.addAbility(ability);
+
+ // Land creatures you control have flying.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(FlyingAbility.getInstance(), Duration.WhileOnBattlefield, filter)));
+
+ }
+
+ public HalimarTidecaller(final HalimarTidecaller card) {
+ super(card);
+ }
+
+ @Override
+ public HalimarTidecaller copy() {
+ return new HalimarTidecaller(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/HedronArchive.java b/Mage.Sets/src/mage/sets/battleforzendikar/HedronArchive.java
new file mode 100644
index 00000000000..460abc0d4e7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/HedronArchive.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.Mana;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.mana.SimpleManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class HedronArchive extends CardImpl {
+
+ public HedronArchive(UUID ownerId) {
+ super(ownerId, 223, "Hedron Archive", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{4}");
+ this.expansionSetCode = "BFZ";
+
+ // {T}: Add {2} to your mana pool.
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana(2), new TapSourceCost()));
+
+ // {2}, {T}, Sacrifice Hedron Archive: Draw two cards.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(2), new GenericManaCost(2));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ this.addAbility(ability);
+ }
+
+ public HedronArchive(final HedronArchive card) {
+ super(card);
+ }
+
+ @Override
+ public HedronArchive copy() {
+ return new HedronArchive(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/HedronBlade.java b/Mage.Sets/src/mage/sets/battleforzendikar/HedronBlade.java
new file mode 100644
index 00000000000..a91a6049a96
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/HedronBlade.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostEquippedEffect;
+import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
+import mage.abilities.keyword.DeathtouchAbility;
+import mage.abilities.keyword.EquipAbility;
+import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.combat.CombatGroup;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.permanent.Permanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class HedronBlade extends CardImpl {
+
+ public HedronBlade(UUID ownerId) {
+ super(ownerId, 224, "Hedron Blade", Rarity.COMMON, new CardType[]{CardType.ARTIFACT}, "{1}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Equipment");
+
+ // Equipped creature gets +1/+1.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(1, 1)));
+
+ // Whenever equipped creature becomes blocked by one or more colorless creatures, it gains deathtouch until end of turn.
+ this.addAbility(new HedronBladeTriggeredAbility(
+ new GainAbilityAttachedEffect(DeathtouchAbility.getInstance(), AttachmentType.EQUIPMENT, Duration.EndOfTurn)));
+
+ // Equip {2}
+ this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(2)));
+ }
+
+ public HedronBlade(final HedronBlade card) {
+ super(card);
+ }
+
+ @Override
+ public HedronBlade copy() {
+ return new HedronBlade(this);
+ }
+}
+
+class HedronBladeTriggeredAbility extends TriggeredAbilityImpl {
+
+ HedronBladeTriggeredAbility(Effect effect) {
+ super(Zone.BATTLEFIELD, effect, false);
+ }
+
+ HedronBladeTriggeredAbility(final HedronBladeTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public HedronBladeTriggeredAbility copy() {
+ return new HedronBladeTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.DECLARED_BLOCKERS;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent equipment = game.getPermanentOrLKIBattlefield((this.getSourceId()));
+ if (equipment != null && equipment.getAttachedTo() != null) {
+ Permanent equippedPermanent = game.getPermanentOrLKIBattlefield((equipment.getAttachedTo()));
+ if (equippedPermanent != null) {
+ if (equippedPermanent.isAttacking()) {
+ for (CombatGroup group : game.getCombat().getGroups()) {
+ if (group.getAttackers().contains(equippedPermanent.getId())) {
+ for (UUID blockerId : group.getBlockers()) {
+ Permanent blocker = game.getPermanent(blockerId);
+ if (blocker != null && blocker.getColor(game).isColorless()) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever equipped creature becomes blocked by one or more colorless creatures, " + super.getRule();
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/HeraldOfKozilek.java b/Mage.Sets/src/mage/sets/battleforzendikar/HeraldOfKozilek.java
new file mode 100644
index 00000000000..a5c74c30a41
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/HeraldOfKozilek.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class HeraldOfKozilek extends CardImpl {
+
+ private static final FilterCard filter = new FilterCard("Colorless spells");
+
+ static {
+ filter.add(new ColorlessPredicate());
+ }
+
+ public HeraldOfKozilek(UUID ownerId) {
+ super(ownerId, 205, "Herald of Kozilek", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(4);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Colorless spells you cast cost {1} less to cast.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(filter, 1)));
+ }
+
+ public HeraldOfKozilek(final HeraldOfKozilek card) {
+ super(card);
+ }
+
+ @Override
+ public HeraldOfKozilek copy() {
+ return new HeraldOfKozilek(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/HeroOfGomaFada.java b/Mage.Sets/src/mage/sets/battleforzendikar/HeroOfGomaFada.java
new file mode 100644
index 00000000000..1ea0b04ce62
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/HeroOfGomaFada.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
+import mage.abilities.keyword.IndestructibleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class HeroOfGomaFada extends CardImpl {
+
+ public HeroOfGomaFada(UUID ownerId) {
+ super(ownerId, 31, "Hero of Goma Fada", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Knight");
+ this.subtype.add("Ally");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(3);
+
+ // Rally - Whenever Hero of Goma Fada or another Ally enters the battlefield under your control, creatures you control gain indestructible until end of turn.
+ Ability ability = new AllyEntersBattlefieldTriggeredAbility(
+ new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn,
+ new FilterControlledCreaturePermanent("creatures you control")), false);
+ this.addAbility(ability);
+ }
+
+ public HeroOfGomaFada(final HeroOfGomaFada card) {
+ super(card);
+ }
+
+ @Override
+ public HeroOfGomaFada copy() {
+ return new HeroOfGomaFada(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/HorriblyAwry.java b/Mage.Sets/src/mage/sets/battleforzendikar/HorriblyAwry.java
new file mode 100644
index 00000000000..40d9e1f3104
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/HorriblyAwry.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.common.CounterTargetWithReplacementEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.Filter;
+import mage.filter.common.FilterCreatureSpell;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.target.TargetSpell;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class HorriblyAwry extends CardImpl {
+
+ private static final FilterCreatureSpell filter = new FilterCreatureSpell("creature spell with converted mana cost 4 or less");
+
+ static {
+ filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, 5));
+ }
+
+ public HorriblyAwry(UUID ownerId) {
+ super(ownerId, 59, "Horribly Awry", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+ // Counter target creature spell with converted mana cost 4 or less. If that spell is countered this way, exile it instead of putting it into its owner's graveyard.
+ this.getSpellAbility().addEffect(new CounterTargetWithReplacementEffect(Zone.EXILED));
+ this.getSpellAbility().addTarget(new TargetSpell(filter));
+ }
+
+ public HorriblyAwry(final HorriblyAwry card) {
+ super(card);
+ }
+
+ @Override
+ public HorriblyAwry copy() {
+ return new HorriblyAwry(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/IncubatorDrone.java b/Mage.Sets/src/mage/sets/battleforzendikar/IncubatorDrone.java
new file mode 100644
index 00000000000..aeba4330a7e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/IncubatorDrone.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.game.permanent.token.EldraziScionToken;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class IncubatorDrone extends CardImpl {
+
+ public IncubatorDrone(UUID ownerId) {
+ super(ownerId, 60, "Incubator Drone", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Whenever Incubator Drone enters the battlefield, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."
+ Effect effect = new CreateTokenEffect(new EldraziScionToken());
+ effect.setText("put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has \"Sacrifice this creature: Add {1} to your mana pool.\"");
+ this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false));
+ }
+
+ public IncubatorDrone(final IncubatorDrone card) {
+ super(card);
+ }
+
+ @Override
+ public IncubatorDrone copy() {
+ return new IncubatorDrone(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/InfuseWithTheElements.java b/Mage.Sets/src/mage/sets/battleforzendikar/InfuseWithTheElements.java
new file mode 100644
index 00000000000..5f30903dbf6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/InfuseWithTheElements.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.AbilityWord;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.counters.CounterType;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class InfuseWithTheElements extends CardImpl {
+
+ public InfuseWithTheElements(UUID ownerId) {
+ super(ownerId, 175, "Infuse with the Elements", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}{G}");
+ this.expansionSetCode = "BFZ";
+
+ // Converge - Put X +1/+1 counters on target creature, where X is the number of colors of mana spent to cast Infuse with the Elements.
+ this.getSpellAbility().setAbilityWord(AbilityWord.CONVERGE);
+ Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(0), ColorsOfManaSpentToCastCount.getInstance());
+ effect.setText("Put X +1/+1 counters on target creature, where X is the number of colors of mana spent to cast {this}");
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ // That creature gains trample until end of turn.
+ effect = new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn);
+ effect.setText("That creature gains trample until end of turn");
+ this.getSpellAbility().addEffect(effect);
+ }
+
+ public InfuseWithTheElements(final InfuseWithTheElements card) {
+ super(card);
+ }
+
+ @Override
+ public InfuseWithTheElements copy() {
+ return new InfuseWithTheElements(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/InspiredCharge.java b/Mage.Sets/src/mage/sets/battleforzendikar/InspiredCharge.java
new file mode 100644
index 00000000000..3b5d54435b3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/InspiredCharge.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class InspiredCharge extends mage.sets.magic2011.InspiredCharge {
+
+ public InspiredCharge(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 32;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public InspiredCharge(final InspiredCharge card) {
+ super(card);
+ }
+
+ @Override
+ public InspiredCharge copy() {
+ return new InspiredCharge(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Island1.java b/Mage.Sets/src/mage/sets/battleforzendikar/Island1.java
new file mode 100644
index 00000000000..d7c7643785a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Island1.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Island1 extends mage.cards.basiclands.Island {
+
+ public Island1(UUID ownerId) {
+ super(ownerId, 255);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Island1(final Island1 card) {
+ super(card);
+ }
+
+ @Override
+ public Island1 copy() {
+ return new Island1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Island2.java b/Mage.Sets/src/mage/sets/battleforzendikar/Island2.java
new file mode 100644
index 00000000000..191e7a9c944
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Island2.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Island2 extends mage.cards.basiclands.Island {
+
+ public Island2(UUID ownerId) {
+ super(ownerId, 256);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Island2(final Island2 card) {
+ super(card);
+ }
+
+ @Override
+ public Island2 copy() {
+ return new Island2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Island3.java b/Mage.Sets/src/mage/sets/battleforzendikar/Island3.java
new file mode 100644
index 00000000000..d097e0fe234
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Island3.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Island3 extends mage.cards.basiclands.Island {
+
+ public Island3(UUID ownerId) {
+ super(ownerId, 257);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Island3(final Island3 card) {
+ super(card);
+ }
+
+ @Override
+ public Island3 copy() {
+ return new Island3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Island4.java b/Mage.Sets/src/mage/sets/battleforzendikar/Island4.java
new file mode 100644
index 00000000000..7346a47f65e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Island4.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Island4 extends mage.cards.basiclands.Island {
+
+ public Island4(UUID ownerId) {
+ super(ownerId, 258);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Island4(final Island4 card) {
+ super(card);
+ }
+
+ @Override
+ public Island4 copy() {
+ return new Island4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Island5.java b/Mage.Sets/src/mage/sets/battleforzendikar/Island5.java
new file mode 100644
index 00000000000..508d1081cc6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Island5.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Island5 extends mage.cards.basiclands.Island {
+
+ public Island5(UUID ownerId) {
+ super(ownerId, 259);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Island5(final Island5 card) {
+ super(card);
+ }
+
+ @Override
+ public Island5 copy() {
+ return new Island5(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/JaddiOffshoot.java b/Mage.Sets/src/mage/sets/battleforzendikar/JaddiOffshoot.java
new file mode 100644
index 00000000000..20a35fa49f3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/JaddiOffshoot.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.keyword.DefenderAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class JaddiOffshoot extends CardImpl {
+
+ public JaddiOffshoot(UUID ownerId) {
+ super(ownerId, 176, "Jaddi Offshoot", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Plant");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(3);
+
+ // Defender
+ this.addAbility(DefenderAbility.getInstance());
+ // Landfall - Whenever a land enters the battlefield under your control, you gain 1 life.
+ this.addAbility(new LandfallAbility(new GainLifeEffect(1), false));
+ }
+
+ public JaddiOffshoot(final JaddiOffshoot card) {
+ super(card);
+ }
+
+ @Override
+ public JaddiOffshoot copy() {
+ return new JaddiOffshoot(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/KalastriaHealer.java b/Mage.Sets/src/mage/sets/battleforzendikar/KalastriaHealer.java
new file mode 100644
index 00000000000..961116a0201
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/KalastriaHealer.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.LoseLifeOpponentsEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class KalastriaHealer extends CardImpl {
+
+ public KalastriaHealer(UUID ownerId) {
+ super(ownerId, 114, "Kalastria Healer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Vampire");
+ this.subtype.add("Cleric");
+ this.subtype.add("Ally");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // Rally - Whenever Kalastria Healer or another Ally enters the battlefield under your control, each opponent loses 1 life and you gain 1 life.
+ Ability ability = new AllyEntersBattlefieldTriggeredAbility(new LoseLifeOpponentsEffect(1), false);
+ Effect effect = new GainLifeEffect(1);
+ effect.setText("and you gain 1 life");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public KalastriaHealer(final KalastriaHealer card) {
+ super(card);
+ }
+
+ @Override
+ public KalastriaHealer copy() {
+ return new KalastriaHealer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/KalastriaNightwatch.java b/Mage.Sets/src/mage/sets/battleforzendikar/KalastriaNightwatch.java
new file mode 100644
index 00000000000..46641e624ae
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/KalastriaNightwatch.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.GainLifeControllerTriggeredAbility;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class KalastriaNightwatch extends CardImpl {
+
+ public KalastriaNightwatch(UUID ownerId) {
+ super(ownerId, 115, "Kalastria Nightwatch", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Vampire");
+ this.subtype.add("Warrior");
+ this.subtype.add("Ally");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(5);
+
+ // Whenever you gain life, Kalastria Nightwatch gains flying until end of turn.
+ this.addAbility(new GainLifeControllerTriggeredAbility(new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), false));
+ }
+
+ public KalastriaNightwatch(final KalastriaNightwatch card) {
+ super(card);
+ }
+
+ @Override
+ public KalastriaNightwatch copy() {
+ return new KalastriaNightwatch(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java b/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java
new file mode 100644
index 00000000000..ead4e657e67
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java
@@ -0,0 +1,259 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.LoyaltyAbility;
+import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
+import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.GetEmblemEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.SetTargetPointer;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreatureCard;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.common.FilterLandCard;
+import mage.filter.common.FilterLandPermanent;
+import mage.game.Game;
+import mage.game.command.Emblem;
+import mage.game.permanent.Permanent;
+import mage.game.permanent.token.Token;
+import mage.players.Player;
+import mage.target.TargetCard;
+import mage.target.common.TargetCreaturePermanent;
+import mage.target.common.TargetLandPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class KioraMasterOfTheDepths extends CardImpl {
+
+ public KioraMasterOfTheDepths(UUID ownerId) {
+ super(ownerId, 213, "Kiora, Master of the Depths", Rarity.MYTHIC, new CardType[]{CardType.PLANESWALKER}, "{2}{G}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Kiora");
+
+ this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
+
+ // +1: Untap up to one target creature and up to one target land.
+ LoyaltyAbility ability1 = new LoyaltyAbility(new KioraUntapEffect(), 1);
+ ability1.addTarget(new TargetCreaturePermanent(0, 1, new FilterCreaturePermanent(), false));
+ ability1.addTarget(new TargetLandPermanent(0, 1, new FilterLandPermanent(), false));
+ this.addAbility(ability1);
+
+ // -2: Reveal the top four cards of your library. You may put a creature card and/or a land card from among them into your hand. Put the rest into your graveyard.
+ this.addAbility(new LoyaltyAbility(new KioraRevealEffect(), -2));
+
+ // -8: You get an emblem with "Whenever a creature enters the battlefield under your control, you may have it fight target creature." Then put three 8/8 blue Octopus creature tokens onto the battlefield.
+ Effect effect = new CreateTokenEffect(new OctopusToken(), 3);
+ effect.setText("Then put three 8/8 blue Octopus creature tokens onto the battlefield");
+ LoyaltyAbility ability3 = new LoyaltyAbility(new GetEmblemEffect(new KioraMasterOfTheDepthsEmblem()), -8);
+ ability3.addEffect(effect);
+ this.addAbility(ability3);
+ }
+
+ public KioraMasterOfTheDepths(final KioraMasterOfTheDepths card) {
+ super(card);
+ }
+
+ @Override
+ public KioraMasterOfTheDepths copy() {
+ return new KioraMasterOfTheDepths(this);
+ }
+}
+
+class KioraUntapEffect extends OneShotEffect {
+
+ public KioraUntapEffect() {
+ super(Outcome.Untap);
+ this.staticText = "Untap up to one target creature and up to one target land";
+ }
+
+ public KioraUntapEffect(final KioraUntapEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public KioraUntapEffect copy() {
+ return new KioraUntapEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent firstTarget = game.getPermanent(source.getTargets().get(0).getFirstTarget());
+ Permanent secondTarget = game.getPermanent(source.getTargets().get(1).getFirstTarget());
+ if (firstTarget != null) {
+ firstTarget.untap(game);
+ }
+ if (secondTarget != null) {
+ return secondTarget.untap(game);
+ }
+ return true;
+ }
+}
+
+class KioraRevealEffect extends OneShotEffect {
+
+ public KioraRevealEffect() {
+ super(Outcome.DrawCard);
+ this.staticText = "Reveal the top four cards of your library. You may put a creature card and/or a land card from among them into your hand. Put the rest into your graveyard";
+ }
+
+ public KioraRevealEffect(final KioraRevealEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public KioraRevealEffect copy() {
+ return new KioraRevealEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ MageObject sourceObject = game.getObject(source.getSourceId());
+ if (sourceObject != null && controller != null) {
+ Cards cards = new CardsImpl(Zone.LIBRARY);
+ cards.addAll(controller.getLibrary().getTopCards(game, 4));
+ boolean creatureCardFound = false;
+ boolean landCardFound = false;
+ for (UUID cardId : cards) {
+ Card card = game.getCard(cardId);
+ if (card != null) {
+ cards.add(card);
+ if (card.getCardType().contains(CardType.CREATURE)) {
+ creatureCardFound = true;
+ }
+ if (card.getCardType().contains(CardType.LAND)) {
+ landCardFound = true;
+ }
+ }
+ }
+
+ if (!cards.isEmpty()) {
+ controller.revealCards(sourceObject.getName(), cards, game);
+ if ((creatureCardFound || landCardFound)
+ && controller.chooseUse(Outcome.DrawCard,
+ "Put a creature card and/or a land card into your hand?", source, game)) {
+ TargetCard target = new TargetCard(Zone.PICK, new FilterCreatureCard("creature card to put into your hand"));
+ if (creatureCardFound && controller.chooseTarget(Outcome.DrawCard, cards, target, source, game)) {
+ Card card = cards.get(target.getFirstTarget(), game);
+ if (card != null) {
+ cards.remove(card);
+ controller.moveCards(card, null, Zone.HAND, source, game);
+ }
+ }
+
+ target = new TargetCard(Zone.LIBRARY, new FilterLandCard("land card to put into your hand"));
+ if (landCardFound && controller.chooseTarget(Outcome.DrawCard, cards, target, source, game)) {
+ Card card = cards.get(target.getFirstTarget(), game);
+ if (card != null) {
+ cards.remove(card);
+ controller.moveCards(card, null, Zone.HAND, source, game);
+ }
+ }
+ }
+ }
+ controller.moveCards(cards, null, Zone.GRAVEYARD, source, game);
+ return true;
+ }
+ return false;
+ }
+}
+
+class KioraMasterOfTheDepthsEmblem extends Emblem {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures");
+
+ public KioraMasterOfTheDepthsEmblem() {
+ this.setName("EMBLEM: Kiora, Master of the Depths");
+
+ Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.COMMAND,
+ new KioraFightEffect(), filter, true, SetTargetPointer.PERMANENT,
+ "Whenever a creature enters the battlefield under your control, you may have it fight target creature.");
+ ability.addTarget(new TargetCreaturePermanent());
+ this.getAbilities().add(ability);
+ this.setExpansionSetCodeForImage("BFZ");
+ }
+}
+
+class KioraFightEffect extends OneShotEffect {
+
+ KioraFightEffect() {
+ super(Outcome.Damage);
+ }
+
+ KioraFightEffect(final KioraFightEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent triggeredCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
+ Permanent target = game.getPermanent(source.getFirstTarget());
+ if (triggeredCreature != null
+ && target != null
+ && triggeredCreature.getCardType().contains(CardType.CREATURE)
+ && target.getCardType().contains(CardType.CREATURE)) {
+ triggeredCreature.fight(target, source, game);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public KioraFightEffect copy() {
+ return new KioraFightEffect(this);
+ }
+}
+
+class OctopusToken extends Token {
+
+ public OctopusToken() {
+ super("Octopus", "8/8 blue Octopus creature token");
+ cardType.add(CardType.CREATURE);
+ color.setBlue(true);
+ subtype.add("Octopus");
+ power = new MageInt(8);
+ toughness = new MageInt(8);
+ this.setOriginalExpansionSetCode("BFZ");
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/KitesailScout.java b/Mage.Sets/src/mage/sets/battleforzendikar/KitesailScout.java
new file mode 100644
index 00000000000..4bc5547dbd3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/KitesailScout.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class KitesailScout extends CardImpl {
+
+ public KitesailScout(UUID ownerId) {
+ super(ownerId, 33, "Kitesail Scout", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Kor");
+ this.subtype.add("Scout");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ }
+
+ public KitesailScout(final KitesailScout card) {
+ super(card);
+ }
+
+ @Override
+ public KitesailScout copy() {
+ return new KitesailScout(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/KorBladewhirl.java b/Mage.Sets/src/mage/sets/battleforzendikar/KorBladewhirl.java
new file mode 100644
index 00000000000..283723fab14
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/KorBladewhirl.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class KorBladewhirl extends CardImpl {
+
+ public KorBladewhirl(UUID ownerId) {
+ super(ownerId, 34, "Kor Bladewhirl", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Kor");
+ this.subtype.add("Soldier");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Rally — Whenever Kor Bladewhirl or another Ally enters the battlefield under your control, creatures you control gain first strike until end of turn.
+ this.addAbility(new AllyEntersBattlefieldTriggeredAbility(
+ new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent("creatures you control")), false));
+ }
+
+ public KorBladewhirl(final KorBladewhirl card) {
+ super(card);
+ }
+
+ @Override
+ public KorBladewhirl copy() {
+ return new KorBladewhirl(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/KorCastigator.java b/Mage.Sets/src/mage/sets/battleforzendikar/KorCastigator.java
new file mode 100644
index 00000000000..2595f18b8b3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/KorCastigator.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleEvasionAbility;
+import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class KorCastigator extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Eldrazi Scions");
+
+ static {
+ filter.add(new SubtypePredicate("Eldrazi"));
+ filter.add(new SubtypePredicate("Scion"));
+ }
+
+ public KorCastigator(UUID ownerId) {
+ super(ownerId, 35, "Kor Castigator", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Kor");
+ this.subtype.add("Wizard");
+ this.subtype.add("Ally");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(1);
+
+ // Kor Castigator can't be blocked by Eldrazi Scions.
+ this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield)));
+ }
+
+ public KorCastigator(final KorCastigator card) {
+ super(card);
+ }
+
+ @Override
+ public KorCastigator copy() {
+ return new KorCastigator(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/KorEntanglers.java b/Mage.Sets/src/mage/sets/battleforzendikar/KorEntanglers.java
new file mode 100644
index 00000000000..7e4e28338d5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/KorEntanglers.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class KorEntanglers extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public KorEntanglers(UUID ownerId) {
+ super(ownerId, 36, "Kor Entanglers", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Kor");
+ this.subtype.add("Soldier");
+ this.subtype.add("Ally");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(4);
+
+ // Rally — Whenever Kor Entanglers or another Ally enters the battlefield under your control, tap target creature an opponent controls.
+ Ability ability = new AllyEntersBattlefieldTriggeredAbility(new TapTargetEffect(), false);
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ this.addAbility(ability);
+
+ }
+
+ public KorEntanglers(final KorEntanglers card) {
+ super(card);
+ }
+
+ @Override
+ public KorEntanglers copy() {
+ return new KorEntanglers(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/KozileksChanneler.java b/Mage.Sets/src/mage/sets/battleforzendikar/KozileksChanneler.java
new file mode 100644
index 00000000000..f2542a772a9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/KozileksChanneler.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.Mana;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.mana.SimpleManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class KozileksChanneler extends CardImpl {
+
+ public KozileksChanneler(UUID ownerId) {
+ super(ownerId, 10, "Kozilek's Channeler", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // {T}: Add {2} to your mana pool.
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana(2), new TapSourceCost()));
+ }
+
+ public KozileksChanneler(final KozileksChanneler card) {
+ super(card);
+ }
+
+ @Override
+ public KozileksChanneler copy() {
+ return new KozileksChanneler(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/KozileksSentinel.java b/Mage.Sets/src/mage/sets/battleforzendikar/KozileksSentinel.java
new file mode 100644
index 00000000000..2832635146f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/KozileksSentinel.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SpellCastControllerTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.FilterSpell;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class KozileksSentinel extends CardImpl {
+
+ private static final FilterSpell filterSpell = new FilterSpell("a colorless spell");
+
+ static {
+ filterSpell.add(new ColorlessPredicate());
+ }
+
+ public KozileksSentinel(UUID ownerId) {
+ super(ownerId, 129, "Kozilek's Sentinel", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(4);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Whenever you cast a colorless spell, Kozilek's Sentinel gets +1/+0 until end of turn.
+ this.addAbility(new SpellCastControllerTriggeredAbility(new BoostSourceEffect(1, 0, Duration.EndOfTurn), filterSpell, false));
+
+ }
+
+ public KozileksSentinel(final KozileksSentinel card) {
+ super(card);
+ }
+
+ @Override
+ public KozileksSentinel copy() {
+ return new KozileksSentinel(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/LanternScout.java b/Mage.Sets/src/mage/sets/battleforzendikar/LanternScout.java
new file mode 100644
index 00000000000..c06ef6c5116
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/LanternScout.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
+import mage.abilities.keyword.LifelinkAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardIdPredicate;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class LanternScout extends CardImpl {
+
+ public LanternScout(UUID ownerId) {
+ super(ownerId, 37, "Lantern Scout", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Scout");
+ this.subtype.add("Ally");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ FilterPermanent filter = new FilterPermanent("{this} or another Ally");
+ filter.add(Predicates.or(
+ new CardIdPredicate(this.getId()),
+ new SubtypePredicate("Ally")));
+
+ // Rally - Whenever Lantern Scout or another Ally enters the battlefield under your control, creatures you control gain lifelink until end of turn.
+ Effect effect = new GainAbilityAllEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent());
+ effect.setText("creatures you control gain lifelink until end of turn");
+ Ability ability = new AllyEntersBattlefieldTriggeredAbility(
+ effect, false);
+ this.addAbility(ability);
+ }
+
+ public LanternScout(final LanternScout card) {
+ super(card);
+ }
+
+ @Override
+ public LanternScout copy() {
+ return new LanternScout(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/LavastepRaider.java b/Mage.Sets/src/mage/sets/battleforzendikar/LavastepRaider.java
new file mode 100644
index 00000000000..e418f4d8807
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/LavastepRaider.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class LavastepRaider extends CardImpl {
+
+ public LavastepRaider(UUID ownerId) {
+ super(ownerId, 147, "Lavastep Raider", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Goblin");
+ this.subtype.add("Warrior");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // {2}{R}: Lavastep Raider gets +2/+0 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(2, 0, Duration.EndOfTurn), new ManaCostsImpl<>("{2}{R}")));
+ }
+
+ public LavastepRaider(final LavastepRaider card) {
+ super(card);
+ }
+
+ @Override
+ public LavastepRaider copy() {
+ return new LavastepRaider(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/LifespringDruid.java b/Mage.Sets/src/mage/sets/battleforzendikar/LifespringDruid.java
new file mode 100644
index 00000000000..72cfe4c7392
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/LifespringDruid.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.mana.AnyColorManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class LifespringDruid extends CardImpl {
+
+ public LifespringDruid(UUID ownerId) {
+ super(ownerId, 177, "Lifespring Druid", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elf");
+ this.subtype.add("Druid");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // {T}: Add one mana of any color to your mana pool.
+ this.addAbility(new AnyColorManaAbility());
+ }
+
+ public LifespringDruid(final LifespringDruid card) {
+ super(card);
+ }
+
+ @Override
+ public LifespringDruid copy() {
+ return new LifespringDruid(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/LithomancersFocus.java b/Mage.Sets/src/mage/sets/battleforzendikar/LithomancersFocus.java
new file mode 100644
index 00000000000..93abab3bb34
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/LithomancersFocus.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.effects.PreventionEffectImpl;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class LithomancersFocus extends CardImpl {
+
+ public LithomancersFocus(UUID ownerId) {
+ super(ownerId, 38, "Lithomancer's Focus", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Target creature gets +2/+2 until end of turn.
+ this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+
+ // Prevent all damage that would be dealt to that creature this turn by colorless sources.
+ this.getSpellAbility().addEffect(new LithomancersFocusPreventDamageToTargetEffect());
+ }
+
+ public LithomancersFocus(final LithomancersFocus card) {
+ super(card);
+ }
+
+ @Override
+ public LithomancersFocus copy() {
+ return new LithomancersFocus(this);
+ }
+}
+
+class LithomancersFocusPreventDamageToTargetEffect extends PreventionEffectImpl {
+
+ public LithomancersFocusPreventDamageToTargetEffect() {
+ super(Duration.EndOfTurn, Integer.MAX_VALUE, false);
+ staticText = "Prevent all damage that would be dealt to that creature this turn by colorless sources";
+ }
+
+ public LithomancersFocusPreventDamageToTargetEffect(final LithomancersFocusPreventDamageToTargetEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public LithomancersFocusPreventDamageToTargetEffect copy() {
+ return new LithomancersFocusPreventDamageToTargetEffect(this);
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ if (super.applies(event, source, game) && event.getTargetId().equals(targetPointer.getFirst(game, source))) {
+ MageObject object = game.getObject(event.getSourceId());
+ return object != null && object.getColor(game).isColorless();
+ }
+ return false;
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/LoomingSpires.java b/Mage.Sets/src/mage/sets/battleforzendikar/LoomingSpires.java
new file mode 100644
index 00000000000..910c974d2fa
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/LoomingSpires.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.abilities.mana.RedManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class LoomingSpires extends CardImpl {
+
+ public LoomingSpires(UUID ownerId) {
+ super(ownerId, 238, "Looming Spires", Rarity.COMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // Looming Spires enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // When Looming Spires enters the battlefield, target creature gets +1/+1 and gain first strike until end of turn.
+ Effect effect = new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn);
+ effect.setText("and gains first strike");
+ Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(1, 1, Duration.EndOfTurn), false);
+ ability.addEffect(effect);
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+
+ // {T}: Add {R} to your mana pool.
+ this.addAbility(new RedManaAbility());
+ }
+
+ public LoomingSpires(final LoomingSpires card) {
+ super(card);
+ }
+
+ @Override
+ public LoomingSpires copy() {
+ return new LoomingSpires(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/LumberingFalls.java b/Mage.Sets/src/mage/sets/battleforzendikar/LumberingFalls.java
new file mode 100644
index 00000000000..1ab770d2fc0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/LumberingFalls.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
+import mage.abilities.keyword.HexproofAbility;
+import mage.abilities.mana.BlueManaAbility;
+import mage.abilities.mana.GreenManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.permanent.token.Token;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class LumberingFalls extends CardImpl {
+
+ public LumberingFalls(UUID ownerId) {
+ super(ownerId, 239, "Lumbering Falls", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // Lumbering Falls enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // {T}: Add {G} or {U} to your mana pool.
+ this.addAbility(new BlueManaAbility());
+ this.addAbility(new GreenManaAbility());
+
+ // {2}{G}{U}: Lumbering Falls becomes a 3/3 green and blue Elemental creature with hexproof until end of turn. It's still a land.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new LumberingFallsToken(), "land", Duration.EndOfTurn), new ManaCostsImpl("{2}{G}{U}")));
+ }
+
+ public LumberingFalls(final LumberingFalls card) {
+ super(card);
+ }
+
+ @Override
+ public LumberingFalls copy() {
+ return new LumberingFalls(this);
+ }
+}
+
+class LumberingFallsToken extends Token {
+
+ public LumberingFallsToken() {
+ super("", "3/3 green and blue Elemental creature with hexproof");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Elemental");
+ color.setBlue(true);
+ color.setGreen(true);
+ power = new MageInt(3);
+ toughness = new MageInt(3);
+ addAbility(HexproofAbility.getInstance());
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/MakindiPatrol.java b/Mage.Sets/src/mage/sets/battleforzendikar/MakindiPatrol.java
new file mode 100644
index 00000000000..693d998a174
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/MakindiPatrol.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
+import mage.abilities.keyword.VigilanceAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class MakindiPatrol extends CardImpl {
+
+ public MakindiPatrol(UUID ownerId) {
+ super(ownerId, 39, "Makindi Patrol", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Knight");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Rally — Whenever Makindi Patrol or another Ally enters the battlefield under your control, creatures you control gain vigilance until end of turn.
+ this.addAbility(new AllyEntersBattlefieldTriggeredAbility(
+ new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent("creatures")), false));
+ }
+
+ public MakindiPatrol(final MakindiPatrol card) {
+ super(card);
+ }
+
+ @Override
+ public MakindiPatrol copy() {
+ return new MakindiPatrol(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/MakindiSliderunner.java b/Mage.Sets/src/mage/sets/battleforzendikar/MakindiSliderunner.java
new file mode 100644
index 00000000000..4f596ad3576
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/MakindiSliderunner.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class MakindiSliderunner extends CardImpl {
+
+ public MakindiSliderunner(UUID ownerId) {
+ super(ownerId, 148, "Makindi Sliderunner", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Beast");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+
+ // Landfall- Whenever a land enters the battlefield under your control, Makindi Sliderunner gets +1/+1 until end of turn.
+ this.addAbility(new LandfallAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), false));
+ }
+
+ public MakindiSliderunner(final MakindiSliderunner card) {
+ super(card);
+ }
+
+ @Override
+ public MakindiSliderunner copy() {
+ return new MakindiSliderunner(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/MalakirFamiliar.java b/Mage.Sets/src/mage/sets/battleforzendikar/MalakirFamiliar.java
new file mode 100644
index 00000000000..2fc7b1abe4b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/MalakirFamiliar.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.GainLifeControllerTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.DeathtouchAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class MalakirFamiliar extends CardImpl {
+
+ public MalakirFamiliar(UUID ownerId) {
+ super(ownerId, 116, "Malakir Familiar", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Bat");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // Deahtouch
+ this.addAbility(DeathtouchAbility.getInstance());
+ // Whenever you gain life, Malakir Familiar gets +1/+1 until end of turn.
+ this.addAbility(new GainLifeControllerTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), false));
+
+ }
+
+ public MalakirFamiliar(final MalakirFamiliar card) {
+ super(card);
+ }
+
+ @Override
+ public MalakirFamiliar copy() {
+ return new MalakirFamiliar(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/MarchFromTheTomb.java b/Mage.Sets/src/mage/sets/battleforzendikar/MarchFromTheTomb.java
new file mode 100644
index 00000000000..0fcc73f4c8f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/MarchFromTheTomb.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.FilterCard;
+import mage.filter.common.FilterCreatureCard;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.Game;
+import mage.target.common.TargetCardInYourGraveyard;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class MarchFromTheTomb extends CardImpl {
+
+ public MarchFromTheTomb(UUID ownerId) {
+ super(ownerId, 214, "March from the Tomb", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{W}{B}");
+ this.expansionSetCode = "BFZ";
+
+ // Return any number of target Ally creature cards with total converted mana cost of 8 or less from your graveyard to the battlefield.
+ Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect();
+ effect.setText("Return any number of target Ally creature cards with total converted mana cost of 8 or less from your graveyard to the battlefield");
+ this.getSpellAbility().addEffect(effect);
+ FilterCard filter = new FilterCreatureCard();
+ filter.add(new SubtypePredicate("Ally"));
+ this.getSpellAbility().addTarget(new MarchFromTheTombTarget(0, Integer.MAX_VALUE, filter));
+ }
+
+ public MarchFromTheTomb(final MarchFromTheTomb card) {
+ super(card);
+ }
+
+ @Override
+ public MarchFromTheTomb copy() {
+ return new MarchFromTheTomb(this);
+ }
+}
+
+class MarchFromTheTombTarget extends TargetCardInYourGraveyard {
+
+ public MarchFromTheTombTarget(int minNumTargets, int maxNumTargets, FilterCard filter) {
+ super(minNumTargets, maxNumTargets, filter);
+ }
+
+ public MarchFromTheTombTarget(MarchFromTheTombTarget target) {
+ super(target);
+ }
+
+ @Override
+ public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
+ int cmcLeft = 8;
+ for (UUID targetId : this.getTargets()) {
+ Card card = game.getCard(targetId);
+ if (card != null) {
+ cmcLeft -= card.getManaCost().convertedManaCost();
+ }
+ }
+ Set possibleTargets = super.possibleTargets(sourceId, sourceControllerId, game);
+ Set leftPossibleTargets = new HashSet<>();
+ for (UUID targetId : possibleTargets) {
+ Card card = game.getCard(targetId);
+ if (card != null && card.getManaCost().convertedManaCost() <= cmcLeft) {
+ leftPossibleTargets.add(targetId);
+ }
+ }
+ setTargetName("any number of target Ally creature cards with total converted mana cost of 8 or less (" + cmcLeft + " left) from your graveyard");
+ return leftPossibleTargets;
+ }
+
+ @Override
+ public boolean canTarget(UUID playerId, UUID objectId, Ability source, Game game) {
+ if (super.canTarget(playerId, objectId, source, game)) {
+ int cmcLeft = 8;
+ for (UUID targetId : this.getTargets()) {
+ Card card = game.getCard(targetId);
+ if (card != null) {
+ cmcLeft -= card.getManaCost().convertedManaCost();
+ }
+ }
+ Card card = game.getCard(objectId);
+ return card != null && card.getManaCost().convertedManaCost() <= cmcLeft;
+ }
+ return false;
+ }
+
+ @Override
+ public MarchFromTheTombTarget copy() {
+ return new MarchFromTheTombTarget(this);
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/MindRaker.java b/Mage.Sets/src/mage/sets/battleforzendikar/MindRaker.java
new file mode 100644
index 00000000000..a03fa277ee2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/MindRaker.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.costs.common.ExileOpponentsCardFromExileToGraveyardCost;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class MindRaker extends CardImpl {
+
+ public MindRaker(UUID ownerId) {
+ super(ownerId, 95, "Mind Raker", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Processor");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // When Mind Raker enters the battlefield, you may put a card an opponent owns from exile into that player's graveyard. If you do, each opponent discards a card.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new DoIfCostPaid(new DiscardEachPlayerEffect(TargetController.OPPONENT), new ExileOpponentsCardFromExileToGraveyardCost(true)), false));
+ }
+
+ public MindRaker(final MindRaker card) {
+ super(card);
+ }
+
+ @Override
+ public MindRaker copy() {
+ return new MindRaker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/MiresMalice.java b/Mage.Sets/src/mage/sets/battleforzendikar/MiresMalice.java
new file mode 100644
index 00000000000..be28d713154
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/MiresMalice.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.discard.DiscardTargetEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetOpponent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class MiresMalice extends CardImpl {
+
+ public MiresMalice(UUID ownerId) {
+ super(ownerId, 117, "Mire's Malice", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{3}{B}");
+ this.expansionSetCode = "BFZ";
+
+ // Target opponent discards two cards.
+ this.getSpellAbility().addEffect(new DiscardTargetEffect(2));
+ this.getSpellAbility().addTarget(new TargetOpponent());
+ // Awaken 3 - {5}{B}
+ this.addAbility(new AwakenAbility(this, 3, "{5}{B}"));
+ }
+
+ public MiresMalice(final MiresMalice card) {
+ super(card);
+ }
+
+ @Override
+ public MiresMalice copy() {
+ return new MiresMalice(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/MistIntruder.java b/Mage.Sets/src/mage/sets/battleforzendikar/MistIntruder.java
new file mode 100644
index 00000000000..87ee253668f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/MistIntruder.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.IngestAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class MistIntruder extends CardImpl {
+
+ public MistIntruder(UUID ownerId) {
+ super(ownerId, 61, "Mist Intruder", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Ingest
+ this.addAbility(new IngestAbility());
+ }
+
+ public MistIntruder(final MistIntruder card) {
+ super(card);
+ }
+
+ @Override
+ public MistIntruder copy() {
+ return new MistIntruder(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/MoltenNursery.java b/Mage.Sets/src/mage/sets/battleforzendikar/MoltenNursery.java
new file mode 100644
index 00000000000..71404a42606
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/MoltenNursery.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SpellCastControllerTriggeredAbility;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.FilterSpell;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class MoltenNursery extends CardImpl {
+
+ private static final FilterSpell filter = new FilterSpell("colorless spell");
+
+ static {
+ filter.add(new ColorlessPredicate());
+ }
+
+ public MoltenNursery(UUID ownerId) {
+ super(ownerId, 130, "Molten Nursery", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Whenever you cast a colorless spell, Molten Nursery deals 1 damage to target creature or player.
+ Ability ability = new SpellCastControllerTriggeredAbility(new DamageTargetEffect(1), filter, false);
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+
+ }
+
+ public MoltenNursery(final MoltenNursery card) {
+ super(card);
+ }
+
+ @Override
+ public MoltenNursery copy() {
+ return new MoltenNursery(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/MortuaryMire.java b/Mage.Sets/src/mage/sets/battleforzendikar/MortuaryMire.java
new file mode 100644
index 00000000000..b97e7232c24
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/MortuaryMire.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.PutOnLibraryTargetEffect;
+import mage.abilities.mana.BlackManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreatureCard;
+import mage.target.common.TargetCardInYourGraveyard;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class MortuaryMire extends CardImpl {
+
+ public MortuaryMire(UUID ownerId) {
+ super(ownerId, 240, "Mortuary Mire", Rarity.COMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // Mortuary Mire enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // When Mortuary Mire enters the battlefield, you may put target creature card from your graveyard on top of your library.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new PutOnLibraryTargetEffect(true), true);
+ ability.addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard("creature card from your graveyard")));
+ this.addAbility(ability);
+
+ // {T}: Add {B} to your mana pool.
+ this.addAbility(new BlackManaAbility());
+ }
+
+ public MortuaryMire(final MortuaryMire card) {
+ super(card);
+ }
+
+ @Override
+ public MortuaryMire copy() {
+ return new MortuaryMire(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Mountain1.java b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain1.java
new file mode 100644
index 00000000000..049c251e4c5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain1.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Mountain1 extends mage.cards.basiclands.Mountain {
+
+ public Mountain1(UUID ownerId) {
+ super(ownerId, 265);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Mountain1(final Mountain1 card) {
+ super(card);
+ }
+
+ @Override
+ public Mountain1 copy() {
+ return new Mountain1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Mountain2.java b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain2.java
new file mode 100644
index 00000000000..adb01c46713
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain2.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Mountain2 extends mage.cards.basiclands.Mountain {
+
+ public Mountain2(UUID ownerId) {
+ super(ownerId, 266);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Mountain2(final Mountain2 card) {
+ super(card);
+ }
+
+ @Override
+ public Mountain2 copy() {
+ return new Mountain2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Mountain3.java b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain3.java
new file mode 100644
index 00000000000..38e5f5c4b61
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain3.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Mountain3 extends mage.cards.basiclands.Mountain {
+
+ public Mountain3(UUID ownerId) {
+ super(ownerId, 267);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Mountain3(final Mountain3 card) {
+ super(card);
+ }
+
+ @Override
+ public Mountain3 copy() {
+ return new Mountain3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Mountain4.java b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain4.java
new file mode 100644
index 00000000000..3d72ef0dbc1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain4.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Mountain4 extends mage.cards.basiclands.Mountain {
+
+ public Mountain4(UUID ownerId) {
+ super(ownerId, 268);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Mountain4(final Mountain4 card) {
+ super(card);
+ }
+
+ @Override
+ public Mountain4 copy() {
+ return new Mountain4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Mountain5.java b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain5.java
new file mode 100644
index 00000000000..913411db522
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain5.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Mountain5 extends mage.cards.basiclands.Mountain {
+
+ public Mountain5(UUID ownerId) {
+ super(ownerId, 269);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Mountain5(final Mountain5 card) {
+ super(card);
+ }
+
+ @Override
+ public Mountain5 copy() {
+ return new Mountain5(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/MundaAmbushLeader.java b/Mage.Sets/src/mage/sets/battleforzendikar/MundaAmbushLeader.java
new file mode 100644
index 00000000000..dd3b890bd03
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/MundaAmbushLeader.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.TargetCard;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class MundaAmbushLeader extends CardImpl {
+
+ public MundaAmbushLeader(UUID ownerId) {
+ super(ownerId, 215, "Munda, Ambush Leader", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}{W}");
+ this.expansionSetCode = "BFZ";
+ this.supertype.add("Legendary");
+ this.subtype.add("Kor");
+ this.subtype.add("Ally");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(4);
+
+ // Haste
+ this.addAbility(HasteAbility.getInstance());
+ // Rally-Whenever Munda, Ambush Leader or another Ally enters the battlefield under your control, you may look at the top four cards of your library. If you do, reveal any number of Ally cards from among them, then put those cards on top of your library in any order and the rest on the bottom in any order.
+ this.addAbility(new AllyEntersBattlefieldTriggeredAbility(new MundaAmbushLeaderEffect(), true));
+
+ }
+
+ public MundaAmbushLeader(final MundaAmbushLeader card) {
+ super(card);
+ }
+
+ @Override
+ public MundaAmbushLeader copy() {
+ return new MundaAmbushLeader(this);
+ }
+}
+
+class MundaAmbushLeaderEffect extends OneShotEffect {
+
+ private static final FilterCard filter = new FilterCard("Ally cards to reveal and put on top of your library");
+
+ static {
+ filter.add(new SubtypePredicate("Ally"));
+ }
+
+ public MundaAmbushLeaderEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "you may look at the top four cards of your library. If you do, reveal any number of Ally cards from among them, then put those cards on top of your library in any order and the rest on the bottom in any order";
+ }
+
+ public MundaAmbushLeaderEffect(final MundaAmbushLeaderEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public MundaAmbushLeaderEffect copy() {
+ return new MundaAmbushLeaderEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ MageObject sourceObject = game.getObject(source.getSourceId());
+ if (controller != null && sourceObject != null) {
+ Cards allCards = new CardsImpl();
+ allCards.addAll(controller.getLibrary().getTopCards(game, 4));
+ controller.lookAtCards(sourceObject.getIdName(), allCards, game);
+ if (!allCards.isEmpty()) {
+ Cards cardsToReveal = new CardsImpl();
+ TargetCard target = new TargetCard(0, Integer.MAX_VALUE, Zone.LIBRARY, filter);
+ controller.chooseTarget(outcome, allCards, target, source, game);
+ cardsToReveal.addAll(target.getTargets());
+ if (!cardsToReveal.isEmpty()) {
+ controller.revealCards(sourceObject.getIdName(), cardsToReveal, game, true);
+ allCards.removeAll(cardsToReveal);
+ }
+ controller.putCardsOnTopOfLibrary(cardsToReveal, game, source, true);
+ }
+ if (!allCards.isEmpty()) {
+ controller.putCardsOnBottomOfLibrary(allCards, game, source, true);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/MurasaRanger.java b/Mage.Sets/src/mage/sets/battleforzendikar/MurasaRanger.java
new file mode 100644
index 00000000000..39b26a74afb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/MurasaRanger.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.counters.CounterType;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class MurasaRanger extends CardImpl {
+
+ public MurasaRanger(UUID ownerId) {
+ super(ownerId, 178, "Murasa Ranger", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Warrior");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Landfall - Whenever a land enters the battlefield under your control, you may pay {3}{G}. IF you do, put two +1/+1 counters on Murasa Ranger.
+ this.addAbility(new LandfallAbility(new DoIfCostPaid(new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)), new ManaCostsImpl("{3}{G}")), false));
+ }
+
+ public MurasaRanger(final MurasaRanger card) {
+ super(card);
+ }
+
+ @Override
+ public MurasaRanger copy() {
+ return new MurasaRanger(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/MurkStrider.java b/Mage.Sets/src/mage/sets/battleforzendikar/MurkStrider.java
new file mode 100644
index 00000000000..0cc67d861b1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/MurkStrider.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.costs.common.ExileOpponentsCardFromExileToGraveyardCost;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.ReturnToHandTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class MurkStrider extends CardImpl {
+
+ public MurkStrider(UUID ownerId) {
+ super(ownerId, 62, "Murk Strider", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Processor");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // When Murk Strider enters the battlefield, you may put a card an opponent owns from exile into that player's graveyard. If you do, return target creature to its owner's hand.
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new DoIfCostPaid(new ReturnToHandTargetEffect(), new ExileOpponentsCardFromExileToGraveyardCost(true)), true);
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public MurkStrider(final MurkStrider card) {
+ super(card);
+ }
+
+ @Override
+ public MurkStrider copy() {
+ return new MurkStrider(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/NaturalConnection.java b/Mage.Sets/src/mage/sets/battleforzendikar/NaturalConnection.java
new file mode 100644
index 00000000000..acd8ac264e2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/NaturalConnection.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterBasicLandCard;
+import mage.target.common.TargetCardInLibrary;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class NaturalConnection extends CardImpl {
+
+ public NaturalConnection(UUID ownerId) {
+ super(ownerId, 179, "Natural Connection", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{G}");
+ this.expansionSetCode = "BFZ";
+
+ // Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.
+ TargetCardInLibrary target = new TargetCardInLibrary(new FilterBasicLandCard());
+ this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(target, true));
+
+ }
+
+ public NaturalConnection(final NaturalConnection card) {
+ super(card);
+ }
+
+ @Override
+ public NaturalConnection copy() {
+ return new NaturalConnection(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/NettleDrone.java b/Mage.Sets/src/mage/sets/battleforzendikar/NettleDrone.java
new file mode 100644
index 00000000000..8c3a075642b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/NettleDrone.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SpellCastControllerTriggeredAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.DamagePlayersEffect;
+import mage.abilities.effects.common.UntapSourceEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.FilterSpell;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class NettleDrone extends CardImpl {
+
+ private static final FilterSpell filterSpell = new FilterSpell("a colorless spell");
+
+ static {
+ filterSpell.add(new ColorlessPredicate());
+ }
+
+ public NettleDrone(UUID ownerId) {
+ super(ownerId, 131, "Nettle Drone", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(1);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // {T}: Nettle Drone deals 1 damage to each opponent.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamagePlayersEffect(1, TargetController.OPPONENT), new TapSourceCost()));
+
+ // Whenever you cast a colorless spell, untap Nettle Drone.
+ this.addAbility(new SpellCastControllerTriggeredAbility(new UntapSourceEffect(), filterSpell, false));
+ }
+
+ public NettleDrone(final NettleDrone card) {
+ super(card);
+ }
+
+ @Override
+ public NettleDrone copy() {
+ return new NettleDrone(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/NirkanaAssassin.java b/Mage.Sets/src/mage/sets/battleforzendikar/NirkanaAssassin.java
new file mode 100644
index 00000000000..53442a1ddf5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/NirkanaAssassin.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.GainLifeControllerTriggeredAbility;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.DeathtouchAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class NirkanaAssassin extends CardImpl {
+
+ public NirkanaAssassin(UUID ownerId) {
+ super(ownerId, 118, "Nirkana Assassin", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Vampire");
+ this.subtype.add("Assassin");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Whenever you gain life, Nirkana Assassin gains deathtouch until end of turn.
+ this.addAbility(new GainLifeControllerTriggeredAbility(new GainAbilitySourceEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn), false));
+ }
+
+ public NirkanaAssassin(final NirkanaAssassin card) {
+ super(card);
+ }
+
+ @Override
+ public NirkanaAssassin copy() {
+ return new NirkanaAssassin(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/NissasRenewal.java b/Mage.Sets/src/mage/sets/battleforzendikar/NissasRenewal.java
new file mode 100644
index 00000000000..c1fd2e8648b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/NissasRenewal.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterBasicLandCard;
+import mage.target.common.TargetCardInLibrary;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class NissasRenewal extends CardImpl {
+
+ public NissasRenewal(UUID ownerId) {
+ super(ownerId, 180, "Nissa's Renewal", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{5}{G}");
+ this.expansionSetCode = "BFZ";
+
+ // Search your library for up to three basic land cards, put them onto the battlefield tapped, then shuffle your library. You gain 7 life.
+ this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(0, 3, new FilterBasicLandCard()), true));
+ this.getSpellAbility().addEffect(new GainLifeEffect(7));
+ }
+
+ public NissasRenewal(final NissasRenewal card) {
+ super(card);
+ }
+
+ @Override
+ public NissasRenewal copy() {
+ return new NissasRenewal(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/NoyanDarRoilShaper.java b/Mage.Sets/src/mage/sets/battleforzendikar/NoyanDarRoilShaper.java
new file mode 100644
index 00000000000..0c9c9b6a4b6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/NoyanDarRoilShaper.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SpellCastControllerTriggeredAbility;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.counters.CounterType;
+import mage.filter.FilterSpell;
+import mage.filter.common.FilterControlledLandPermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.game.Game;
+import mage.game.permanent.token.Token;
+import mage.target.Target;
+import mage.target.common.TargetControlledPermanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class NoyanDarRoilShaper extends CardImpl {
+
+ private static final FilterSpell filter = new FilterSpell("instant or sorcery card");
+
+ static {
+ filter.add(Predicates.or(
+ new CardTypePredicate(CardType.INSTANT),
+ new CardTypePredicate(CardType.SORCERY)));
+ }
+
+ public NoyanDarRoilShaper(UUID ownerId) {
+ super(ownerId, 216, "Noyan Dar, Roil Shaper", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{W}{U}");
+ this.expansionSetCode = "BFZ";
+ this.supertype.add("Legendary");
+ this.subtype.add("Merfolk");
+ this.subtype.add("Ally");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Whenever you cast an instant or sorcery spell, you may put three +1/+1 counters on target land you control.
+ // If you do, that land becomes a 0/0 Elemental creature with haste that's still a land.
+ Ability ability = new SpellCastControllerTriggeredAbility(new NoyanDarEffect(), filter, false);
+ ability.addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent()));
+ this.addAbility(ability);
+ }
+
+ public NoyanDarRoilShaper(final NoyanDarRoilShaper card) {
+ super(card);
+ }
+
+ @Override
+ public NoyanDarRoilShaper copy() {
+ return new NoyanDarRoilShaper(this);
+ }
+}
+
+class NoyanDarEffect extends OneShotEffect {
+
+ public NoyanDarEffect() {
+ super(Outcome.BoostCreature);
+ this.staticText = "put three +1/+1 counters on target land you control. If you do, that land becomes a 0/0 Elemental creature with haste that's still a land.";
+ }
+
+ public NoyanDarEffect(final NoyanDarEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public NoyanDarEffect copy() {
+ return new NoyanDarEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ UUID targetId = null;
+ for (Target target : source.getTargets()) {
+ targetId = target.getFirstTarget();
+ }
+ if (targetId != null) {
+ FixedTarget fixedTarget = new FixedTarget(targetId);
+ ContinuousEffect continuousEffect = new BecomesCreatureTargetEffect(new AwakenElementalToken(), false, true, Duration.Custom);
+ continuousEffect.setTargetPointer(fixedTarget);
+ game.addEffect(continuousEffect, source);
+ Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(3));
+ effect.setTargetPointer(fixedTarget);
+ return effect.apply(game, source);
+ }
+ return true;
+ }
+}
+
+
+class AwakenElementalToken extends Token {
+
+ public AwakenElementalToken() {
+ super("", "0/0 Elemental creature with haste");
+ this.cardType.add(CardType.CREATURE);
+
+ this.subtype.add("Elemental");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(0);
+
+ this.addAbility(HasteAbility.getInstance());
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ObNixilisReignited.java b/Mage.Sets/src/mage/sets/battleforzendikar/ObNixilisReignited.java
new file mode 100644
index 00000000000..242438d7fdd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ObNixilisReignited.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.LoyaltyAbility;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.GetEmblemTargetPlayerEffect;
+import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.command.Emblem;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.target.common.TargetCreaturePermanent;
+import mage.target.common.TargetOpponent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ObNixilisReignited extends CardImpl {
+
+ public ObNixilisReignited(UUID ownerId) {
+ super(ownerId, 119, "Ob Nixilis Reignited", Rarity.MYTHIC, new CardType[]{CardType.PLANESWALKER}, "{3}{B}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Nixilis");
+
+ this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5));
+
+ // +1: You draw a card and you lose 1 life.
+ Effect effect = new DrawCardSourceControllerEffect(1);
+ effect.setText("You draw a card");
+ LoyaltyAbility ability1 = new LoyaltyAbility(effect, 1);
+ effect = new LoseLifeSourceControllerEffect(1);
+ effect.setText("and you lose 1 life");
+ ability1.addEffect(effect);
+ this.addAbility(ability1);
+
+ // -3: Destroy target creature.
+ LoyaltyAbility ability2 = new LoyaltyAbility(new DestroyTargetEffect(), -3);
+ ability2.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability2);
+
+ // -8: Target opponent gets an emblem with "Whenever a player draws a card, you lose 2 life."
+ effect = new GetEmblemTargetPlayerEffect(new ObNixilisReignitedEmblem());
+ effect.setText("Target opponent gets an emblem with \"Whenever a player draws a card, you lose 2 life.\"");
+ LoyaltyAbility ability3 = new LoyaltyAbility(effect, -8);
+ ability3.addTarget(new TargetOpponent());
+ this.addAbility(ability3);
+ }
+
+ public ObNixilisReignited(final ObNixilisReignited card) {
+ super(card);
+ }
+
+ @Override
+ public ObNixilisReignited copy() {
+ return new ObNixilisReignited(this);
+ }
+}
+
+class ObNixilisReignitedEmblem extends Emblem {
+
+ public ObNixilisReignitedEmblem() {
+ setName("EMBLEM: Ob Nixilis Reignited");
+
+ this.getAbilities().add(new ObNixilisEmblemTriggeredAbility(new LoseLifeSourceControllerEffect(2), false));
+ this.setExpansionSetCodeForImage("BFZ");
+ }
+}
+
+class ObNixilisEmblemTriggeredAbility extends TriggeredAbilityImpl {
+
+ public ObNixilisEmblemTriggeredAbility(Effect effect, boolean optional) {
+ super(Zone.COMMAND, effect, optional);
+ }
+
+ public ObNixilisEmblemTriggeredAbility(final ObNixilisEmblemTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.DREW_CARD;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ return event.getPlayerId() != null;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever a player draws a card, you lose 2 life.";
+ }
+
+ @Override
+ public ObNixilisEmblemTriggeredAbility copy() {
+ return new ObNixilisEmblemTriggeredAbility(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/OblivionSower.java b/Mage.Sets/src/mage/sets/battleforzendikar/OblivionSower.java
new file mode 100644
index 00000000000..533a88f299a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/OblivionSower.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CastSourceTriggeredAbility;
+import mage.abilities.effects.common.ExileCardsFromTopOfLibraryTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.filter.common.FilterLandCard;
+import mage.filter.predicate.other.OwnerIdPredicate;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.TargetCard;
+import mage.target.common.TargetOpponent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class OblivionSower extends CardImpl {
+
+ public OblivionSower(UUID ownerId) {
+ super(ownerId, 11, "Oblivion Sower", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{6}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(8);
+
+ // When you cast Oblivion Sower, target opponent exiles the top four cards of his or her library, then you may put any number of land cards that player owns from exile onto the battlefield under your control.
+ Ability ability = new CastSourceTriggeredAbility(new ExileCardsFromTopOfLibraryTargetEffect(4, "target opponent"), false);
+ ability.addEffect(new OblivionSowerEffect());
+ ability.addTarget(new TargetOpponent());
+ this.addAbility(ability);
+ }
+
+ public OblivionSower(final OblivionSower card) {
+ super(card);
+ }
+
+ @Override
+ public OblivionSower copy() {
+ return new OblivionSower(this);
+ }
+}
+
+class OblivionSowerEffect extends OneShotEffect {
+
+ public OblivionSowerEffect() {
+ super(Outcome.PutLandInPlay);
+ this.staticText = ", then you may put any number of land cards that player owns from exile onto the battlefield under your control";
+ }
+
+ public OblivionSowerEffect(final OblivionSowerEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public OblivionSowerEffect copy() {
+ return new OblivionSowerEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source));
+ if (controller != null && targetPlayer != null) {
+ FilterLandCard filter = new FilterLandCard();
+ filter.add(new OwnerIdPredicate(targetPlayer.getId()));
+ Cards exiledCards = new CardsImpl();
+ exiledCards.addAll(game.getExile().getAllCards(game));
+ Cards exiledLands = new CardsImpl();
+ exiledLands.addAll(exiledCards.getCards(filter, source.getSourceId(), controller.getId(), game));
+ if (!exiledLands.isEmpty() && controller.chooseUse(outcome, "Put lands into play?", source, game)) {
+ FilterCard filterToPlay = new FilterCard("land"
+ + (exiledLands.size() > 1 ? "s" : "") + " from exile owned by "
+ + targetPlayer.getName() + " to put into play under your control");
+ TargetCard targetCards = new TargetCard(0, exiledLands.size(), Zone.EXILED, filterToPlay);
+ if (controller.chooseTarget(outcome, exiledLands, targetCards, source, game)) {
+ controller.moveCards(new CardsImpl(targetCards.getTargets()), Zone.BATTLEFIELD, source, game);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/OmnathLocusOfRage.java b/Mage.Sets/src/mage/sets/battleforzendikar/OmnathLocusOfRage.java
new file mode 100644
index 00000000000..fff58c51cfa
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/OmnathLocusOfRage.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesThisOrAnotherCreatureTriggeredAbility;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.game.permanent.token.Token;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class OmnathLocusOfRage extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Elemental you control");
+
+ static {
+ filter.add(new SubtypePredicate("Elemental"));
+ filter.add(new ControllerPredicate(TargetController.YOU));
+ }
+
+ public OmnathLocusOfRage(UUID ownerId) {
+ super(ownerId, 217, "Omnath, Locus of Rage", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{3}{R}{R}{G}{G}");
+ this.expansionSetCode = "BFZ";
+ this.supertype.add("Legendary");
+ this.subtype.add("Elemental");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // Landfall - Whenever a land enters the battlefield under your control, put a 5/5 red and green Elemental creature token onto the battlefield.
+ this.addAbility(new LandfallAbility(new CreateTokenEffect(new OmnathElementalToken()), false));
+
+ // Whenever Omnath, Locus of Rage or another Elemental you control dies, Omnath deals 3 damage to target creature or player.
+ Ability ability = new DiesThisOrAnotherCreatureTriggeredAbility(new DamageTargetEffect(3), false, filter);
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public OmnathLocusOfRage(final OmnathLocusOfRage card) {
+ super(card);
+ }
+
+ @Override
+ public OmnathLocusOfRage copy() {
+ return new OmnathLocusOfRage(this);
+ }
+}
+
+class OmnathElementalToken extends Token {
+
+ OmnathElementalToken() {
+ super("Elemental", "5/5 red and green Elemental creature token");
+ setTokenType(2);
+ setOriginalExpansionSetCode("BFZ");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Elemental");
+
+ color.setRed(true);
+ color.setGreen(true);
+ power = new MageInt(5);
+ toughness = new MageInt(5);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/OnduChampion.java b/Mage.Sets/src/mage/sets/battleforzendikar/OnduChampion.java
new file mode 100644
index 00000000000..1db9a5e52e2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/OnduChampion.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class OnduChampion extends CardImpl {
+
+ public OnduChampion(UUID ownerId) {
+ super(ownerId, 149, "Ondu Champion", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Minotaur");
+ this.subtype.add("Warrior");
+ this.subtype.add("Ally");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(3);
+
+ // Rally — Whenever Ondu Champion or another Ally enters the battlefield under your control, creatures you control gain trample until end of turn.
+ this.addAbility(new AllyEntersBattlefieldTriggeredAbility(
+ new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent("creatures you control")), false));
+ }
+
+ public OnduChampion(final OnduChampion card) {
+ super(card);
+ }
+
+ @Override
+ public OnduChampion copy() {
+ return new OnduChampion(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/OnduGreathorn.java b/Mage.Sets/src/mage/sets/battleforzendikar/OnduGreathorn.java
new file mode 100644
index 00000000000..008e92ca918
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/OnduGreathorn.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class OnduGreathorn extends CardImpl {
+
+ public OnduGreathorn(UUID ownerId) {
+ super(ownerId, 40, "Ondu Greathorn", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Beast");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // First strike
+ this.addAbility(FirstStrikeAbility.getInstance());
+ // Landfall — Whenever a land enters the battlefield under your control, Ondu Greathorn gets +2/+2 until end of turn.
+ this.addAbility(new LandfallAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), false));
+ }
+
+ public OnduGreathorn(final OnduGreathorn card) {
+ super(card);
+ }
+
+ @Override
+ public OnduGreathorn copy() {
+ return new OnduGreathorn(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/OnduRising.java b/Mage.Sets/src/mage/sets/battleforzendikar/OnduRising.java
new file mode 100644
index 00000000000..5e8d6d4defa
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/OnduRising.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.DelayedTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.abilities.keyword.LifelinkAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.permanent.Permanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class OnduRising extends CardImpl {
+
+ public OnduRising(UUID ownerId) {
+ super(ownerId, 41, "Ondu Rising", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{1}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Whenever a creature attacks this turn, it gains lifelink until end of turn.
+ this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new OnduRisingTriggeredAbility()));
+
+ // Awaken 4—{4}{W}
+ this.addAbility(new AwakenAbility(this, 4, "{4}{W}"));
+ }
+
+ public OnduRising(final OnduRising card) {
+ super(card);
+ }
+
+ @Override
+ public OnduRising copy() {
+ return new OnduRising(this);
+ }
+}
+
+class OnduRisingTriggeredAbility extends DelayedTriggeredAbility {
+
+ public OnduRisingTriggeredAbility() {
+ super(new GainAbilityTargetEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn), Duration.EndOfTurn, false);
+ }
+
+ public OnduRisingTriggeredAbility(OnduRisingTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.ATTACKER_DECLARED;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent permanent = game.getPermanent(event.getSourceId());
+ if (permanent != null) {
+ for (Effect effect : getEffects()) {
+ effect.setTargetPointer(new FixedTarget(permanent, game));
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public OnduRisingTriggeredAbility copy() {
+ return new OnduRisingTriggeredAbility(this);
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever a creature attacks this turn, it gains lifelink until end of turn.";
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/OracleOfDust.java b/Mage.Sets/src/mage/sets/battleforzendikar/OracleOfDust.java
new file mode 100644
index 00000000000..26cfc75ed68
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/OracleOfDust.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.ExileOpponentsCardFromExileToGraveyardCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DrawDiscardControllerEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class OracleOfDust extends CardImpl {
+
+ public OracleOfDust(UUID ownerId) {
+ super(ownerId, 63, "Oracle of Dust", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Processor");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(5);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+ // {2}, Put a card an opponent owns from exile into that player's graveyard: Draw a card, then discard a card.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawDiscardControllerEffect(1, 1), new ManaCostsImpl<>("{2}"));
+ ability.addCost(new ExileOpponentsCardFromExileToGraveyardCost(true));
+ this.addAbility(ability);
+ }
+
+ public OracleOfDust(final OracleOfDust card) {
+ super(card);
+ }
+
+ @Override
+ public OracleOfDust copy() {
+ return new OracleOfDust(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/OranRiefHydra.java b/Mage.Sets/src/mage/sets/battleforzendikar/OranRiefHydra.java
new file mode 100644
index 00000000000..a997e01fd4b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/OranRiefHydra.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class OranRiefHydra extends CardImpl {
+
+ public OranRiefHydra(UUID ownerId) {
+ super(ownerId, 181, "Oran-Rief Hydra", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{G}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Hydra");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+
+ // Landfall - Whenever a land enters the battlefield under your control, put a +1/+1 counter on Oran-Rief Hydra.
+ // If that land is a Forest, put two +1/+1 counters on Oran-Rief Hydra instead.
+ this.addAbility(new OranRiefHydraTriggeredAbility());
+ }
+
+ public OranRiefHydra(final OranRiefHydra card) {
+ super(card);
+ }
+
+ @Override
+ public OranRiefHydra copy() {
+ return new OranRiefHydra(this);
+ }
+}
+
+class OranRiefHydraTriggeredAbility extends TriggeredAbilityImpl {
+
+ private static final String text = "Landfall - Whenever a land enters the battlefield under your control, put a +1/+1 counter on {this}. "
+ + "If that land is a Forest, put two +1/+1 counters on {this} instead.";
+
+ public OranRiefHydraTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new OranRiefHydraEffect());
+ }
+
+ public OranRiefHydraTriggeredAbility(final OranRiefHydraTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public OranRiefHydraTriggeredAbility copy() {
+ return new OranRiefHydraTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent permanent = game.getPermanent(event.getTargetId());
+ if (permanent != null
+ && permanent.getCardType().contains(CardType.LAND)
+ && permanent.getControllerId().equals(getControllerId())) {
+ Permanent sourcePermanent = game.getPermanent(getSourceId());
+ if (sourcePermanent != null) {
+ for (Effect effect : getEffects()) {
+ if (effect instanceof OranRiefHydraEffect) {
+ effect.setTargetPointer(new FixedTarget(permanent, game));
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return text;
+ }
+}
+
+class OranRiefHydraEffect extends OneShotEffect {
+
+ public OranRiefHydraEffect() {
+ super(Outcome.BoostCreature);
+ }
+
+ public OranRiefHydraEffect(final OranRiefHydraEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public OranRiefHydraEffect copy() {
+ return new OranRiefHydraEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent land = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source));
+ Permanent sourcePermanent = game.getPermanent(source.getSourceId());
+ if (land != null && sourcePermanent != null) {
+ if (land.hasSubtype("Forest")) {
+ sourcePermanent.addCounters(CounterType.P1P1.createInstance(2), game);
+ } else {
+ sourcePermanent.addCounters(CounterType.P1P1.createInstance(), game);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/OranRiefInvoker.java b/Mage.Sets/src/mage/sets/battleforzendikar/OranRiefInvoker.java
new file mode 100644
index 00000000000..3328a451a09
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/OranRiefInvoker.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class OranRiefInvoker extends CardImpl {
+
+ public OranRiefInvoker(UUID ownerId) {
+ super(ownerId, 182, "Oran-Rief Invoker", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Shaman");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {8}: Oran-Rief Invoker gets +5/+5 and gains trample until end of turn.
+ Effect effect = new BoostSourceEffect(5, 5, Duration.EndOfTurn);
+ effect.setText("{source} gets +5/+5");
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(8));
+ effect = new GainAbilitySourceEffect(TrampleAbility.getInstance(), Duration.EndOfTurn);
+ effect.setText("and gains trample until end of turn");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public OranRiefInvoker(final OranRiefInvoker card) {
+ super(card);
+ }
+
+ @Override
+ public OranRiefInvoker copy() {
+ return new OranRiefInvoker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Outnumber.java b/Mage.Sets/src/mage/sets/battleforzendikar/Outnumber.java
new file mode 100644
index 00000000000..1c11d5b6658
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Outnumber.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Outnumber extends CardImpl {
+
+ public Outnumber(UUID ownerId) {
+ super(ownerId, 150, "Outnumber", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Outnumber deals damage to target creature equal to the number of creatures you control.
+ Effect effect = new DamageTargetEffect(new PermanentsOnBattlefieldCount(new FilterControlledCreaturePermanent("the number of creatures you control")));
+ effect.setText("{this} deals damage to target creature equal to the number of creatures you control");
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+
+ }
+
+ public Outnumber(final Outnumber card) {
+ super(card);
+ }
+
+ @Override
+ public Outnumber copy() {
+ return new Outnumber(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/PainfulTruths.java b/Mage.Sets/src/mage/sets/battleforzendikar/PainfulTruths.java
new file mode 100644
index 00000000000..c8e1fd01582
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/PainfulTruths.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.AbilityWord;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class PainfulTruths extends CardImpl {
+
+ public PainfulTruths(UUID ownerId) {
+ super(ownerId, 120, "Painful Truths", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{B}");
+ this.expansionSetCode = "BFZ";
+
+ // Converge - You draw X cards and lose X life, where X is the number of colors of mana spent to cast Painful Truths.
+ getSpellAbility().setAbilityWord(AbilityWord.CONVERGE);
+ Effect effect = new DrawCardSourceControllerEffect(ColorsOfManaSpentToCastCount.getInstance());
+ effect.setText("You draw X cards");
+ getSpellAbility().addEffect(effect);
+ effect = new LoseLifeSourceControllerEffect(ColorsOfManaSpentToCastCount.getInstance());
+ effect.setText("and lose X life, where X is the number of colors of mana spent to cast {this}");
+ getSpellAbility().addEffect(effect);
+ }
+
+ public PainfulTruths(final PainfulTruths card) {
+ super(card);
+ }
+
+ @Override
+ public PainfulTruths copy() {
+ return new PainfulTruths(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/PartTheWaterveil.java b/Mage.Sets/src/mage/sets/battleforzendikar/PartTheWaterveil.java
new file mode 100644
index 00000000000..b2f050b44e1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/PartTheWaterveil.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.ExileSpellEffect;
+import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class PartTheWaterveil extends CardImpl {
+
+ public PartTheWaterveil(UUID ownerId) {
+ super(ownerId, 80, "Part the Waterveil", Rarity.MYTHIC, new CardType[]{CardType.SORCERY}, "{4}{U}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Take an extra turn after this one. Exile Part the Waterveil.
+ this.getSpellAbility().addEffect(new AddExtraTurnControllerEffect());
+ this.getSpellAbility().addEffect(ExileSpellEffect.getInstance());
+
+ // Awaken 6-{6}{U}{U}{U}
+ this.addAbility(new AwakenAbility(this, 6, "{6}{U}{U}{U}"));
+ }
+
+ public PartTheWaterveil(final PartTheWaterveil card) {
+ super(card);
+ }
+
+ @Override
+ public PartTheWaterveil copy() {
+ return new PartTheWaterveil(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/PathwayArrows.java b/Mage.Sets/src/mage/sets/battleforzendikar/PathwayArrows.java
new file mode 100644
index 00000000000..ae0a741649f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/PathwayArrows.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
+import mage.abilities.keyword.EquipAbility;
+import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class PathwayArrows extends CardImpl {
+
+ public PathwayArrows(UUID ownerId) {
+ super(ownerId, 225, "Pathway Arrows", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{1}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Equipment");
+
+ // Equipped creature has "{2}, {T}: This creature deals 1 damage to target creature. If a colorless creature is dealt damage this way, tap it."
+ SimpleActivatedAbility ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PathwayArrowsEffect(), new GenericManaCost(2));
+ ability2.addCost(new TapSourceCost());
+ ability2.addTarget(new TargetCreaturePermanent());
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(ability2, AttachmentType.EQUIPMENT)));
+
+ // Equip {2}
+ this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(2)));
+ }
+
+ public PathwayArrows(final PathwayArrows card) {
+ super(card);
+ }
+
+ @Override
+ public PathwayArrows copy() {
+ return new PathwayArrows(this);
+ }
+}
+
+class PathwayArrowsEffect extends OneShotEffect {
+
+ public PathwayArrowsEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "This creature deals 1 damage to target creature. If a colorless creature is dealt damage this way, tap it";
+ }
+
+ public PathwayArrowsEffect(final PathwayArrowsEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public PathwayArrowsEffect copy() {
+ return new PathwayArrowsEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
+ if (targetCreature != null) {
+ int damageDealt = targetCreature.damage(1, source.getSourceId(), game, false, true);
+ if (damageDealt > 0 && targetCreature.getColor(game).isColorless()) {
+ targetCreature.tap(game);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/PilgrimsEye.java b/Mage.Sets/src/mage/sets/battleforzendikar/PilgrimsEye.java
new file mode 100644
index 00000000000..67f74e4c74d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/PilgrimsEye.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class PilgrimsEye extends mage.sets.worldwake.PilgrimsEye {
+
+ public PilgrimsEye(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 226;
+ this.expansionSetCode = "BFZ";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public PilgrimsEye(final PilgrimsEye card) {
+ super(card);
+ }
+
+ @Override
+ public PilgrimsEye copy() {
+ return new PilgrimsEye(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Plains1.java b/Mage.Sets/src/mage/sets/battleforzendikar/Plains1.java
new file mode 100644
index 00000000000..4b2a1798cf6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Plains1.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Plains1 extends mage.cards.basiclands.Plains {
+
+ public Plains1(UUID ownerId) {
+ super(ownerId, 250);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Plains1(final Plains1 card) {
+ super(card);
+ }
+
+ @Override
+ public Plains1 copy() {
+ return new Plains1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Plains2.java b/Mage.Sets/src/mage/sets/battleforzendikar/Plains2.java
new file mode 100644
index 00000000000..d278d488fbd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Plains2.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Plains2 extends mage.cards.basiclands.Plains {
+
+ public Plains2(UUID ownerId) {
+ super(ownerId, 251);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Plains2(final Plains2 card) {
+ super(card);
+ }
+
+ @Override
+ public Plains2 copy() {
+ return new Plains2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Plains3.java b/Mage.Sets/src/mage/sets/battleforzendikar/Plains3.java
new file mode 100644
index 00000000000..93a2b32e206
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Plains3.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Plains3 extends mage.cards.basiclands.Plains {
+
+ public Plains3(UUID ownerId) {
+ super(ownerId, 252);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Plains3(final Plains3 card) {
+ super(card);
+ }
+
+ @Override
+ public Plains3 copy() {
+ return new Plains3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Plains4.java b/Mage.Sets/src/mage/sets/battleforzendikar/Plains4.java
new file mode 100644
index 00000000000..7c95ef89458
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Plains4.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Plains4 extends mage.cards.basiclands.Plains {
+
+ public Plains4(UUID ownerId) {
+ super(ownerId, 253);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Plains4(final Plains4 card) {
+ super(card);
+ }
+
+ @Override
+ public Plains4 copy() {
+ return new Plains4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Plains5.java b/Mage.Sets/src/mage/sets/battleforzendikar/Plains5.java
new file mode 100644
index 00000000000..df7ccc8563b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Plains5.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Plains5 extends mage.cards.basiclands.Plains {
+
+ public Plains5(UUID ownerId) {
+ super(ownerId, 254);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Plains5(final Plains5 card) {
+ super(card);
+ }
+
+ @Override
+ public Plains5 copy() {
+ return new Plains5(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/PlanarOutburst.java b/Mage.Sets/src/mage/sets/battleforzendikar/PlanarOutburst.java
new file mode 100644
index 00000000000..20819210fb9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/PlanarOutburst.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DestroyAllEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class PlanarOutburst extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("nonland creatures");
+
+ static {
+ filter.add(Predicates.not(new CardTypePredicate(CardType.LAND)));
+ }
+
+ public PlanarOutburst(UUID ownerId) {
+ super(ownerId, 42, "Planar Outburst", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{W}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Destroy all nonland creatures.
+ this.getSpellAbility().addEffect(new DestroyAllEffect(filter, false));
+
+ // Awaken 4-{5}{W}{W}{W}
+ this.addAbility(new AwakenAbility(this, 4, "{5}{W}{W}{W}"));
+ }
+
+ public PlanarOutburst(final PlanarOutburst card) {
+ super(card);
+ }
+
+ @Override
+ public PlanarOutburst copy() {
+ return new PlanarOutburst(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/PlatedCrusher.java b/Mage.Sets/src/mage/sets/battleforzendikar/PlatedCrusher.java
new file mode 100644
index 00000000000..cb0d151b5ec
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/PlatedCrusher.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.TrampleAbility;
+import mage.abilities.keyword.HexproofAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class PlatedCrusher extends CardImpl {
+
+ public PlatedCrusher(UUID ownerId) {
+ super(ownerId, 183, "Plated Crusher", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{G}{G}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Beast");
+ this.power = new MageInt(7);
+ this.toughness = new MageInt(6);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // Hexproof
+ this.addAbility(HexproofAbility.getInstance());
+ }
+
+ public PlatedCrusher(final PlatedCrusher card) {
+ super(card);
+ }
+
+ @Override
+ public PlatedCrusher copy() {
+ return new PlatedCrusher(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Plummet.java b/Mage.Sets/src/mage/sets/battleforzendikar/Plummet.java
new file mode 100644
index 00000000000..a1aad2c25e9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Plummet.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Plummet extends mage.sets.magic2011.Plummet {
+
+ public Plummet(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 184;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Plummet(final Plummet card) {
+ super(card);
+ }
+
+ @Override
+ public Plummet copy() {
+ return new Plummet(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/PrairieStream.java b/Mage.Sets/src/mage/sets/battleforzendikar/PrairieStream.java
new file mode 100644
index 00000000000..872fca6ef52
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/PrairieStream.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.InvertCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.TapSourceEffect;
+import mage.abilities.mana.BlueManaAbility;
+import mage.abilities.mana.WhiteManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class PrairieStream extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent();
+
+ static {
+ filter.add(new SupertypePredicate("Basic"));
+ }
+
+ public PrairieStream(UUID ownerId) {
+ super(ownerId, 241, "Prairie Stream", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Plains");
+ this.subtype.add("Island");
+
+ // Prairie Stream enters the battlefield tapped unless you control two or more basic lands.
+ Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN, 1));
+ String abilityText = "tapped unless you control two or more basic lands";
+ this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText));
+ this.addAbility(new WhiteManaAbility());
+ this.addAbility(new BlueManaAbility());
+ }
+
+ public PrairieStream(final PrairieStream card) {
+ super(card);
+ }
+
+ @Override
+ public PrairieStream copy() {
+ return new PrairieStream(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/PrismArray.java b/Mage.Sets/src/mage/sets/battleforzendikar/PrismArray.java
new file mode 100644
index 00000000000..c86c1acfc31
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/PrismArray.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.RemoveCountersSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.effects.keyword.ScryEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class PrismArray extends CardImpl {
+
+ public PrismArray(UUID ownerId) {
+ super(ownerId, 81, "Prism Array", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{4}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Converge - Prism Array enters the battlefield with a crystal counter on it for each color of mana spent to cast it.
+ this.addAbility(new EntersBattlefieldAbility(
+ new AddCountersSourceEffect(CounterType.CRYSTAL.createInstance(), ColorsOfManaSpentToCastCount.getInstance(), true),
+ null, "Converge — {this} enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.", null));
+
+ // Remove a crystal counter from Prism Array: Tap target creature.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
+ new TapTargetEffect(),
+ new RemoveCountersSourceCost(CounterType.CRYSTAL.createInstance(1)));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+
+ // {W}{U}{B}{R}{G}: Scry 3.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ScryEffect(3), new ManaCostsImpl("{W}{U}{B}{R}{G}")));
+ }
+
+ public PrismArray(final PrismArray card) {
+ super(card);
+ }
+
+ @Override
+ public PrismArray copy() {
+ return new PrismArray(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ProcessorAssault.java b/Mage.Sets/src/mage/sets/battleforzendikar/ProcessorAssault.java
new file mode 100644
index 00000000000..dbcf4c0b8df
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ProcessorAssault.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.costs.common.ExileOpponentsCardFromExileToGraveyardCost;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ProcessorAssault extends CardImpl {
+
+ public ProcessorAssault(UUID ownerId) {
+ super(ownerId, 132, "Processor Assault", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{1}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+
+ // As an additional cost to cast Processor Assault, put a card an opponent owns from exile into its owner's graveyard.
+ this.getSpellAbility().addCost(new ExileOpponentsCardFromExileToGraveyardCost(false));
+
+ // Processor Assault deals 5 damage to target creature.
+ this.getSpellAbility().addEffect(new DamageTargetEffect(5));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ }
+
+ public ProcessorAssault(final ProcessorAssault card) {
+ super(card);
+ }
+
+ @Override
+ public ProcessorAssault copy() {
+ return new ProcessorAssault(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/QuarantineField.java b/Mage.Sets/src/mage/sets/battleforzendikar/QuarantineField.java
new file mode 100644
index 00000000000..491b8a58b8a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/QuarantineField.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.delayed.OnLeaveReturnExiledToBattlefieldAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.counters.Counter;
+import mage.filter.common.FilterNonlandPermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.TargetPermanent;
+import mage.util.CardUtil;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class QuarantineField extends CardImpl {
+
+ public QuarantineField(UUID ownerId) {
+ super(ownerId, 43, "Quarantine Field", Rarity.MYTHIC, new CardType[]{CardType.ENCHANTMENT}, "{X}{X}{W}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Quarantine Field enters the battlefield with X isolation counters on it.
+ this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(new Counter("isolation"))));
+
+ // When Quarantine Field enters the battlefield, for each isolation counter on it, exile up to one target nonland permanent an opponenet controls until Quarantine Field leaves the battlefield.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new QuarantineFieldEffect(), false);
+ ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility()));
+ this.addAbility(ability);
+
+ }
+
+ public QuarantineField(final QuarantineField card) {
+ super(card);
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ if (ability instanceof EntersBattlefieldTriggeredAbility) {
+ Permanent sourceObject = game.getPermanent(ability.getSourceId());
+ if (sourceObject != null) {
+ int isolationCounters = sourceObject.getCounters(game).getCount("isolation");
+ FilterNonlandPermanent filter = new FilterNonlandPermanent("up to " + isolationCounters + " nonland permanents controlled by any opponents");
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ ability.addTarget(new TargetPermanent(0, isolationCounters, filter, false));
+ }
+
+ }
+ }
+
+ @Override
+ public QuarantineField copy() {
+ return new QuarantineField(this);
+ }
+}
+
+class QuarantineFieldEffect extends OneShotEffect {
+
+ public QuarantineFieldEffect() {
+ super(Outcome.Exile);
+ this.staticText = "for each isolation counter on it, exile up to one target nonland permanent an opponenet controls until {this} leaves the battlefield";
+ }
+
+ public QuarantineFieldEffect(final QuarantineFieldEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public QuarantineFieldEffect copy() {
+ return new QuarantineFieldEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getSourceId());
+ // If the source permanent leaves the battlefield before its triggered ability resolves,
+ // the targets won't be exiled.
+ if (permanent != null) {
+ return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getIdName()).apply(game, source);
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RadiantFlames.java b/Mage.Sets/src/mage/sets/battleforzendikar/RadiantFlames.java
new file mode 100644
index 00000000000..da9829e3905
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RadiantFlames.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
+import mage.abilities.effects.common.DamageAllEffect;
+import mage.cards.CardImpl;
+import mage.constants.AbilityWord;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RadiantFlames extends CardImpl {
+
+ public RadiantFlames(UUID ownerId) {
+ super(ownerId, 151, "Radiant Flames", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Converge — Radiant Flames deals X damage to each creature, where X is the number of colors of mana spent to cast Radiant Flames.
+ getSpellAbility().setAbilityWord(AbilityWord.CONVERGE);
+ getSpellAbility().addEffect(new DamageAllEffect(ColorsOfManaSpentToCastCount.getInstance(), new FilterCreaturePermanent()));
+ }
+
+ public RadiantFlames(final RadiantFlames card) {
+ super(card);
+ }
+
+ @Override
+ public RadiantFlames copy() {
+ return new RadiantFlames(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RecklessCohort.java b/Mage.Sets/src/mage/sets/battleforzendikar/RecklessCohort.java
new file mode 100644
index 00000000000..3bebab684a3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RecklessCohort.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalRequirementEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.combat.AttacksIfAbleSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.permanent.AnotherPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RecklessCohort extends CardImpl {
+
+ private final static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another Ally");
+
+ static {
+ filter.add(new AnotherPredicate());
+ filter.add(new SubtypePredicate("Ally"));
+ }
+
+ public RecklessCohort(UUID ownerId) {
+ super(ownerId, 152, "Reckless Cohort", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Warrior");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Reckless Cohort attacks each combat if able unless you control another Ally.
+ Effect effect = new ConditionalRequirementEffect(
+ new AttacksIfAbleSourceEffect(Duration.WhileOnBattlefield, true),
+ new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.FEWER_THAN, 1));
+ effect.setText("{this} attacks each combat if able unless you control another Ally");
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
+ }
+
+ public RecklessCohort(final RecklessCohort card) {
+ super(card);
+ }
+
+ @Override
+ public RecklessCohort copy() {
+ return new RecklessCohort(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ReclaimingVines.java b/Mage.Sets/src/mage/sets/battleforzendikar/ReclaimingVines.java
new file mode 100644
index 00000000000..8481715ce96
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ReclaimingVines.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.FilterPermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.target.TargetPermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ReclaimingVines extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterPermanent("artifact, enchantment, or land");
+
+ static {
+ filter.add(Predicates.or(
+ new CardTypePredicate(CardType.ARTIFACT),
+ new CardTypePredicate(CardType.ENCHANTMENT),
+ new CardTypePredicate(CardType.LAND)));
+ }
+
+ public ReclaimingVines(UUID ownerId) {
+ super(ownerId, 185, "Reclaiming Vines", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{G}{G}");
+ this.expansionSetCode = "BFZ";
+
+ // Destroy target artifact, enchantment, or land.
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
+ this.getSpellAbility().addTarget(new TargetPermanent(filter));
+ }
+
+ public ReclaimingVines(final ReclaimingVines card) {
+ super(card);
+ }
+
+ @Override
+ public ReclaimingVines copy() {
+ return new ReclaimingVines(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ResoluteBlademaster.java b/Mage.Sets/src/mage/sets/battleforzendikar/ResoluteBlademaster.java
new file mode 100644
index 00000000000..44e98d3a31f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ResoluteBlademaster.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
+import mage.abilities.keyword.DoubleStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ResoluteBlademaster extends CardImpl {
+
+ public ResoluteBlademaster(UUID ownerId) {
+ super(ownerId, 218, "Resolute Blademaster", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Rally-Whenever Resolute Blademaster or another Ally enters the battlefield under your control,
+ // you control gain double strike until end of turn.
+ Ability ability = new AllyEntersBattlefieldTriggeredAbility(
+ new GainAbilityAllEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn,
+ new FilterControlledCreaturePermanent("creatures you control")), false);
+ this.addAbility(ability);
+ }
+
+ public ResoluteBlademaster(final ResoluteBlademaster card) {
+ super(card);
+ }
+
+ @Override
+ public ResoluteBlademaster copy() {
+ return new ResoluteBlademaster(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToCoralhelm.java b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToCoralhelm.java
new file mode 100644
index 00000000000..d331ef31a7a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToCoralhelm.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Mode;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.MayTapOrUntapTargetEffect;
+import mage.abilities.effects.keyword.ScryEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RetreatToCoralhelm extends CardImpl {
+
+ public RetreatToCoralhelm(UUID ownerId) {
+ super(ownerId, 82, "Retreat to Coralhelm", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Landfall- Whenever a land enters the battlefield under your control, choose one - You may tap or untap target creature; or Scry 1.
+ LandfallAbility ability = new LandfallAbility(new MayTapOrUntapTargetEffect(), false);
+ ability.addTarget(new TargetCreaturePermanent());
+ Mode mode = new Mode();
+ mode.getEffects().add(new ScryEffect(1));
+ ability.addMode(mode);
+ this.addAbility(ability);
+ }
+
+ public RetreatToCoralhelm(final RetreatToCoralhelm card) {
+ super(card);
+ }
+
+ @Override
+ public RetreatToCoralhelm copy() {
+ return new RetreatToCoralhelm(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToEmeria.java b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToEmeria.java
new file mode 100644
index 00000000000..6aa51bd4f38
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToEmeria.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Mode;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.game.permanent.token.Token;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RetreatToEmeria extends CardImpl {
+
+ public RetreatToEmeria(UUID ownerId) {
+ super(ownerId, 44, "Retreat to Emeria", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Landfall - Whenever a land enters the battlefield under you control, choose one - Put a 1/1 white Kor Ally creature token onto the battlefield; or Creatures you control get +1/+1 until end of turn.
+ LandfallAbility ability = new LandfallAbility(new CreateTokenEffect(new KorAllyToken()), false);
+ Mode mode = new Mode();
+ mode.getEffects().add(new BoostControlledEffect(1, 1, Duration.EndOfTurn));
+ ability.addMode(mode);
+ this.addAbility(ability);
+ }
+
+ public RetreatToEmeria(final RetreatToEmeria card) {
+ super(card);
+ }
+
+ @Override
+ public RetreatToEmeria copy() {
+ return new RetreatToEmeria(this);
+ }
+}
+
+class KorAllyToken extends Token {
+
+ public KorAllyToken() {
+ super("Kor Ally", "1/1 white Kor Ally creature token");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Kor");
+ subtype.add("Ally");
+ color.setWhite(true);
+ power = new MageInt(1);
+ toughness = new MageInt(1);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToHagra.java b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToHagra.java
new file mode 100644
index 00000000000..49dd0bc33ad
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToHagra.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Mode;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.LoseLifeOpponentsEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.DeathtouchAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RetreatToHagra extends CardImpl {
+
+ public RetreatToHagra(UUID ownerId) {
+ super(ownerId, 121, "Retreat to Hagra", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}");
+ this.expansionSetCode = "BFZ";
+
+ // Landfall- Whenever a land enters the battlefield under your control, choose one - Target creature gets +1/+0 and gains deathtouch until end of turn;
+ LandfallAbility ability = new LandfallAbility(new BoostTargetEffect(1, 0, Duration.EndOfTurn), false);
+ ability.addEffect(new GainAbilityTargetEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn));
+ ability.addTarget(new TargetCreaturePermanent());
+
+ // or Each opponent loses 1 life and you gain 1 life.
+ Mode mode = new Mode();
+ mode.getEffects().add(new LoseLifeOpponentsEffect(1));
+ Effect effect = new GainLifeEffect(1);
+ effect.setText("and you gain 1 life");
+ mode.getEffects().add(effect);
+ ability.addMode(mode);
+ this.addAbility(ability);
+ }
+
+ public RetreatToHagra(final RetreatToHagra card) {
+ super(card);
+ }
+
+ @Override
+ public RetreatToHagra copy() {
+ return new RetreatToHagra(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToKazandu.java b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToKazandu.java
new file mode 100644
index 00000000000..8d767821c63
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToKazandu.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RetreatToKazandu extends mage.sets.zendikarvseldrazi.RetreatToKazandu {
+
+ public RetreatToKazandu(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 186;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public RetreatToKazandu(final RetreatToKazandu card) {
+ super(card);
+ }
+
+ @Override
+ public RetreatToKazandu copy() {
+ return new RetreatToKazandu(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToValakut.java b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToValakut.java
new file mode 100644
index 00000000000..d078c696bc8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToValakut.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Mode;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.combat.CantBlockTargetEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RetreatToValakut extends CardImpl {
+
+ public RetreatToValakut(UUID ownerId) {
+ super(ownerId, 153, "Retreat to Valakut", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Landfall- Whenever a land enters the battlefield under your control, choose one - Target creature gets +2/+0 until end of turn;
+ LandfallAbility ability = new LandfallAbility(new BoostTargetEffect(2, 0, Duration.EndOfTurn), false);
+ ability.addTarget(new TargetCreaturePermanent());
+
+ // or Target creature can't block this turn.
+ Mode mode = new Mode();
+ mode.getEffects().add(new CantBlockTargetEffect(Duration.EndOfTurn));
+ mode.getTargets().add(new TargetCreaturePermanent());
+ ability.addMode(mode);
+ this.addAbility(ability);
+ }
+
+ public RetreatToValakut(final RetreatToValakut card) {
+ super(card);
+ }
+
+ @Override
+ public RetreatToValakut copy() {
+ return new RetreatToValakut(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RisingMiasma.java b/Mage.Sets/src/mage/sets/battleforzendikar/RisingMiasma.java
new file mode 100644
index 00000000000..0fd0a1fe951
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RisingMiasma.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.continuous.BoostAllEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RisingMiasma extends CardImpl {
+
+ public RisingMiasma(UUID ownerId) {
+ super(ownerId, 122, "Rising Miasma", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{B}");
+ this.expansionSetCode = "BFZ";
+
+ // All creatures get -2/-2 until end of turn.
+ this.getSpellAbility().addEffect(new BoostAllEffect(-2, -2, Duration.EndOfTurn));
+
+ // Awaken 3 - {5}{B}{B}
+ this.addAbility(new AwakenAbility(this, 3, "{5}{B}{B}"));
+ }
+
+ public RisingMiasma(final RisingMiasma card) {
+ super(card);
+ }
+
+ @Override
+ public RisingMiasma copy() {
+ return new RisingMiasma(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RoilSpout.java b/Mage.Sets/src/mage/sets/battleforzendikar/RoilSpout.java
new file mode 100644
index 00000000000..6dd137db445
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RoilSpout.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.PutOnLibraryTargetEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RoilSpout extends CardImpl {
+
+ public RoilSpout(UUID ownerId) {
+ super(ownerId, 219, "Roil Spout", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{1}{W}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Put target creature on top of its owner's library.
+ this.getSpellAbility().addEffect(new PutOnLibraryTargetEffect(true));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+
+ // Awaken 4-{4}{W}{U}
+ this.addAbility(new AwakenAbility(this, 4, "{4}{W}{U}"));
+ }
+
+ public RoilSpout(final RoilSpout card) {
+ super(card);
+ }
+
+ @Override
+ public RoilSpout copy() {
+ return new RoilSpout(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RoilmagesTrick.java b/Mage.Sets/src/mage/sets/battleforzendikar/RoilmagesTrick.java
new file mode 100644
index 00000000000..de6e77d02c8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RoilmagesTrick.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
+import mage.abilities.dynamicvalue.common.SignInversionDynamicValue;
+import mage.abilities.dynamicvalue.common.StaticValue;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.continuous.BoostAllEffect;
+import mage.cards.CardImpl;
+import mage.constants.AbilityWord;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RoilmagesTrick extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures your opponents control");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public RoilmagesTrick(UUID ownerId) {
+ super(ownerId, 83, "Roilmage's Trick", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{3}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Converge — Creatures your opponents control get -X/-0 until end of turn, where X is the number of colors of mana spent to cast Roilmage's Trick.
+ this.getSpellAbility().setAbilityWord(AbilityWord.CONVERGE);
+ this.getSpellAbility().addEffect(new BoostAllEffect(
+ new SignInversionDynamicValue(ColorsOfManaSpentToCastCount.getInstance()), new StaticValue(-0), Duration.EndOfTurn, filter, false,
+ "Creatures your opponents control get -X/-0 until end of turn, where X is the number of colors of mana spent to cast {this}. ", true));
+
+ // Draw a card.
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
+ }
+
+ public RoilmagesTrick(final RoilmagesTrick card) {
+ super(card);
+ }
+
+ @Override
+ public RoilmagesTrick copy() {
+ return new RoilmagesTrick(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RoilsRetribution.java b/Mage.Sets/src/mage/sets/battleforzendikar/RoilsRetribution.java
new file mode 100644
index 00000000000..b94090773f5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RoilsRetribution.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DamageMultiEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterAttackingOrBlockingCreature;
+import mage.target.common.TargetCreaturePermanentAmount;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RoilsRetribution extends CardImpl {
+
+ public RoilsRetribution(UUID ownerId) {
+ super(ownerId, 45, "Roil's Retribution", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}{W}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Roil's Retribution deals 5 damage divided as you choose among any number of target attacking or blocking creatures.
+ this.getSpellAbility().addEffect(new DamageMultiEffect(5));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(5, new FilterAttackingOrBlockingCreature("attacking or blocking creatures")));
+ }
+
+ public RoilsRetribution(final RoilsRetribution card) {
+ super(card);
+ }
+
+ @Override
+ public RoilsRetribution copy() {
+ return new RoilsRetribution(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RollingThunder.java b/Mage.Sets/src/mage/sets/battleforzendikar/RollingThunder.java
new file mode 100644
index 00000000000..5201f9e3cea
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RollingThunder.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RollingThunder extends mage.sets.tempestremastered.RollingThunder {
+
+ public RollingThunder(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 154;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public RollingThunder(final RollingThunder card) {
+ super(card);
+ }
+
+ @Override
+ public RollingThunder copy() {
+ return new RollingThunder(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RotShambler.java b/Mage.Sets/src/mage/sets/battleforzendikar/RotShambler.java
new file mode 100644
index 00000000000..b42c874827b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RotShambler.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DiesCreatureTriggeredAbility;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.counters.CounterType;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RotShambler extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature you control");
+
+ static {
+ filter.add(new AnotherPredicate());
+ filter.add(new ControllerPredicate(TargetController.YOU));
+ }
+
+ public RotShambler(UUID ownerId) {
+ super(ownerId, 187, "Rot Shambler", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Fungus");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Whenever another creature you control dies, put a +1/+1 counter on Rot Shambler.
+ this.addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, filter));
+
+ }
+
+ public RotShambler(final RotShambler card) {
+ super(card);
+ }
+
+ @Override
+ public RotShambler copy() {
+ return new RotShambler(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RuinProcessor.java b/Mage.Sets/src/mage/sets/battleforzendikar/RuinProcessor.java
new file mode 100644
index 00000000000..32c73d263fc
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RuinProcessor.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.costs.common.ExileOpponentsCardFromExileToGraveyardCost;
+import mage.abilities.effects.common.CastSourceTriggeredAbility;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RuinProcessor extends CardImpl {
+
+ public RuinProcessor(UUID ownerId) {
+ super(ownerId, 12, "Ruin Processor", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{7}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Processor");
+ this.power = new MageInt(7);
+ this.toughness = new MageInt(8);
+
+ // When you cast Ruin Processor, you may put a card an opponent owns from exile into that player's graveyard. If you do, you gain 5 life.
+ this.addAbility(new CastSourceTriggeredAbility(
+ new DoIfCostPaid(new GainLifeEffect(5), new ExileOpponentsCardFromExileToGraveyardCost(true)), true));
+
+ }
+
+ public RuinProcessor(final RuinProcessor card) {
+ super(card);
+ }
+
+ @Override
+ public RuinProcessor copy() {
+ return new RuinProcessor(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RuinationGuide.java b/Mage.Sets/src/mage/sets/battleforzendikar/RuinationGuide.java
new file mode 100644
index 00000000000..128a4ae5697
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RuinationGuide.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.IngestAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RuinationGuide extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Other colorless creatures you control");
+
+ static {
+ filter.add(new ColorlessPredicate());
+ }
+
+ public RuinationGuide(UUID ownerId) {
+ super(ownerId, 64, "Ruination Guide", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+ // Ingest
+ this.addAbility(new IngestAbility());
+ // Other colorless creatures you control get +1/+0.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 0, Duration.WhileOnBattlefield, filter, true)));
+ }
+
+ public RuinationGuide(final RuinationGuide card) {
+ super(card);
+ }
+
+ @Override
+ public RuinationGuide copy() {
+ return new RuinationGuide(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RuinousPath.java b/Mage.Sets/src/mage/sets/battleforzendikar/RuinousPath.java
new file mode 100644
index 00000000000..61df7d66f0b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RuinousPath.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreatureOrPlaneswalker;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RuinousPath extends CardImpl {
+
+ public RuinousPath(UUID ownerId) {
+ super(ownerId, 123, "Ruinous Path", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{1}{B}{B}");
+ this.expansionSetCode = "BFZ";
+
+ // Destroy target creature or planeswalker.
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker());
+
+ // Awaken 4-{5}{B}{B}
+ this.addAbility(new AwakenAbility(this, 4, "{5}{B}{B}"));
+ }
+
+ public RuinousPath(final RuinousPath card) {
+ super(card);
+ }
+
+ @Override
+ public RuinousPath copy() {
+ return new RuinousPath(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RushOfIce.java b/Mage.Sets/src/mage/sets/battleforzendikar/RushOfIce.java
new file mode 100644
index 00000000000..284b9088325
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RushOfIce.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RushOfIce extends CardImpl {
+
+ public RushOfIce(UUID ownerId) {
+ super(ownerId, 84, "Rush of Ice", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Tap target creature. It doesn't untap during its controller's next untap step.
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ this.getSpellAbility().addEffect(new TapTargetEffect());
+ this.getSpellAbility().addEffect(new DontUntapInControllersNextUntapStepTargetEffect("It"));
+
+ // Awaken 3—{4}{U}
+ this.addAbility(new AwakenAbility(this, 3, "{4}{U}"));
+ }
+
+ public RushOfIce(final RushOfIce card) {
+ super(card);
+ }
+
+ @Override
+ public RushOfIce copy() {
+ return new RushOfIce(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SalvageDrone.java b/Mage.Sets/src/mage/sets/battleforzendikar/SalvageDrone.java
new file mode 100644
index 00000000000..ddc93565ded
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SalvageDrone.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.effects.common.DrawDiscardControllerEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.IngestAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SalvageDrone extends CardImpl {
+
+ public SalvageDrone(UUID ownerId) {
+ super(ownerId, 65, "Salvage Drone", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+ // Ingest (Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)
+ this.addAbility(new IngestAbility());
+ // When Salvage Drone dies, you may draw a card. If you do, discard a card.
+ this.addAbility(new DiesTriggeredAbility(new DrawDiscardControllerEffect(1, 1, true), false));
+
+ }
+
+ public SalvageDrone(final SalvageDrone card) {
+ super(card);
+ }
+
+ @Override
+ public SalvageDrone copy() {
+ return new SalvageDrone(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SanctumOfUgin.java b/Mage.Sets/src/mage/sets/battleforzendikar/SanctumOfUgin.java
new file mode 100644
index 00000000000..43f2551ad26
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SanctumOfUgin.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.common.SpellCastControllerTriggeredAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
+import mage.abilities.mana.ColorlessManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.Filter.ComparisonType;
+import mage.filter.FilterSpell;
+import mage.filter.common.FilterCreatureCard;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.target.common.TargetCardInLibrary;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SanctumOfUgin extends CardImpl {
+
+ private static final FilterCreatureCard filter = new FilterCreatureCard("colorless creature card");
+ private static final FilterSpell filterSpells = new FilterSpell("colorless spell with converted mana cost 7 or greater");
+
+ static {
+ filter.add(new ColorlessPredicate());
+ filterSpells.add(new ColorlessPredicate());
+ filterSpells.add(new ConvertedManaCostPredicate(ComparisonType.GreaterThan, 6));
+ }
+
+ public SanctumOfUgin(UUID ownerId) {
+ super(ownerId, 242, "Sanctum of Ugin", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // {T}: Add {1} to your mana pool.
+ this.addAbility(new ColorlessManaAbility());
+
+ // Whenever you cast a colorless spell with converted mana cost 7 or greater, you may sacrifice Sanctum of Ugin.
+ // If you do, search your library for a colorless creature card, reveal it, put it into your hand, then shuffle your library.
+ Effect effect = new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true);
+ effect.setText("search your library for a colorless creature card, reveal it, put it into your hand, then shuffle your library");
+ this.addAbility(new SpellCastControllerTriggeredAbility(new DoIfCostPaid(effect, new SacrificeSourceCost()), filterSpells, false));
+ }
+
+ public SanctumOfUgin(final SanctumOfUgin card) {
+ super(card);
+ }
+
+ @Override
+ public SanctumOfUgin copy() {
+ return new SanctumOfUgin(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SandstoneBridge.java b/Mage.Sets/src/mage/sets/battleforzendikar/SandstoneBridge.java
new file mode 100644
index 00000000000..59094744fdc
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SandstoneBridge.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.VigilanceAbility;
+import mage.abilities.mana.WhiteManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SandstoneBridge extends CardImpl {
+
+ public SandstoneBridge(UUID ownerId) {
+ super(ownerId, 243, "Sandstone Bridge", Rarity.COMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // Sandstone Bridge enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // When Sandstone Bridge enters the battlefield, target creature gets +1/+1 and gains vigilance until end of turn.
+ Effect effect = new GainAbilityTargetEffect(VigilanceAbility.getInstance(), Duration.EndOfTurn);
+ effect.setText("and gains vigilance");
+ Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(1, 1, Duration.EndOfTurn), false);
+ ability.addEffect(effect);
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+
+ // {T}: Add {W} to your mana pool.
+ this.addAbility(new WhiteManaAbility());
+ }
+
+ public SandstoneBridge(final SandstoneBridge card) {
+ super(card);
+ }
+
+ @Override
+ public SandstoneBridge copy() {
+ return new SandstoneBridge(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ScatterToTheWinds.java b/Mage.Sets/src/mage/sets/battleforzendikar/ScatterToTheWinds.java
new file mode 100644
index 00000000000..d040bebf35e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ScatterToTheWinds.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.CounterTargetEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.TargetSpell;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ScatterToTheWinds extends CardImpl {
+
+ public ScatterToTheWinds(UUID ownerId) {
+ super(ownerId, 85, "Scatter to the Winds", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{1}{U}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Counter target spell.
+ this.getSpellAbility().addEffect(new CounterTargetEffect());
+ this.getSpellAbility().addTarget(new TargetSpell());
+
+ // Awaken 3-{4}{U}{U}
+ this.addAbility(new AwakenAbility(this, 3, "{4}{U}{U}"));
+ }
+
+ public ScatterToTheWinds(final ScatterToTheWinds card) {
+ super(card);
+ }
+
+ @Override
+ public ScatterToTheWinds copy() {
+ return new ScatterToTheWinds(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ScourFromExistence.java b/Mage.Sets/src/mage/sets/battleforzendikar/ScourFromExistence.java
new file mode 100644
index 00000000000..4b0f6795c60
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ScourFromExistence.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.TargetPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ScourFromExistence extends CardImpl {
+
+ public ScourFromExistence(UUID ownerId) {
+ super(ownerId, 13, "Scour from Existence", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{7}");
+ this.expansionSetCode = "BFZ";
+
+ // Exile target permanent.
+ this.getSpellAbility().addEffect(new ExileTargetEffect());
+ this.getSpellAbility().addTarget(new TargetPermanent());
+ }
+
+ public ScourFromExistence(final ScourFromExistence card) {
+ super(card);
+ }
+
+ @Override
+ public ScourFromExistence copy() {
+ return new ScourFromExistence(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ScytheLeopard.java b/Mage.Sets/src/mage/sets/battleforzendikar/ScytheLeopard.java
new file mode 100644
index 00000000000..7e1b5ded1bc
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ScytheLeopard.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ScytheLeopard extends CardImpl {
+
+ public ScytheLeopard(UUID ownerId) {
+ super(ownerId, 188, "Scythe Leopard", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Cat");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Landfall-Whenever a land enters the battlefield under your control, Scythe Leopard gets +1/+1 until end of turn.
+ this.addAbility(new LandfallAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), false));
+ }
+
+ public ScytheLeopard(final ScytheLeopard card) {
+ super(card);
+ }
+
+ @Override
+ public ScytheLeopard copy() {
+ return new ScytheLeopard(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SeekTheWilds.java b/Mage.Sets/src/mage/sets/battleforzendikar/SeekTheWilds.java
new file mode 100644
index 00000000000..40a3d84db60
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SeekTheWilds.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.dynamicvalue.common.StaticValue;
+import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.FilterCard;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SeekTheWilds extends CardImpl {
+
+ private static final FilterCard filter = new FilterCard("a creature or land card");
+
+ static {
+ filter.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.LAND)));
+ }
+
+ public SeekTheWilds(UUID ownerId) {
+ super(ownerId, 189, "Seek the Wilds", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{G}");
+ this.expansionSetCode = "BFZ";
+
+ // Look at the top four cards of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in any order.
+ this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect(new StaticValue(4), false, new StaticValue(1), filter, false));
+
+ }
+
+ public SeekTheWilds(final SeekTheWilds card) {
+ super(card);
+ }
+
+ @Override
+ public SeekTheWilds copy() {
+ return new SeekTheWilds(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SereneSteward.java b/Mage.Sets/src/mage/sets/battleforzendikar/SereneSteward.java
new file mode 100644
index 00000000000..3b965ef9d60
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SereneSteward.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.GainLifeControllerTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.counters.CounterType;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SereneSteward extends CardImpl {
+
+ public SereneSteward(UUID ownerId) {
+ super(ownerId, 46, "Serene Steward", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Cleric");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever you gain life, you may pay {W}. If you do, put a +1/+1 counter on target creature.
+ Ability ability = new GainLifeControllerTriggeredAbility(
+ new DoIfCostPaid(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new ManaCostsImpl("{W}")),
+ false);
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public SereneSteward(final SereneSteward card) {
+ super(card);
+ }
+
+ @Override
+ public SereneSteward copy() {
+ return new SereneSteward(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SerpentineSpike.java b/Mage.Sets/src/mage/sets/battleforzendikar/SerpentineSpike.java
new file mode 100644
index 00000000000..292dc45afd9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SerpentineSpike.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.replacement.DealtDamageToCreatureBySourceDies;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.AnotherTargetPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetCreaturePermanent;
+import mage.watchers.common.DamagedByWatcher;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SerpentineSpike extends CardImpl {
+
+ public SerpentineSpike(UUID ownerId) {
+ super(ownerId, 133, "Serpentine Spike", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{5}{R}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+ // Serpentine Spike deals 2 damage to target creature, 3 damage to another target creature, and 4 damage to a third target creature. If a creature dealt damage this way would die this turn, exile it instead.
+ this.getSpellAbility().addEffect(new SerpentineSpikeEffect());
+
+ TargetCreaturePermanent target = new TargetCreaturePermanent(new FilterCreaturePermanent("creature (2 damage)"));
+ target.setTargetTag(1);
+ this.getSpellAbility().addTarget(target);
+
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature (3 damage)");
+ filter.add(new AnotherTargetPredicate(2));
+ target = new TargetCreaturePermanent(filter);
+ target.setTargetTag(2);
+ this.getSpellAbility().addTarget(target);
+
+ filter = new FilterCreaturePermanent("another target creature (4 damage)");
+ filter.add(new AnotherTargetPredicate(3));
+ target = new TargetCreaturePermanent(filter);
+ target.setTargetTag(3);
+ this.getSpellAbility().addTarget(target);
+
+ Effect effect = new DealtDamageToCreatureBySourceDies(this, Duration.EndOfTurn);
+ effect.setText("If a creature dealt damage this way would die this turn, exile it instead");
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addWatcher(new DamagedByWatcher());
+ }
+
+ public SerpentineSpike(final SerpentineSpike card) {
+ super(card);
+ }
+
+ @Override
+ public SerpentineSpike copy() {
+ return new SerpentineSpike(this);
+ }
+}
+
+class SerpentineSpikeEffect extends OneShotEffect {
+
+ public SerpentineSpikeEffect() {
+ super(Outcome.Damage);
+ this.staticText = "{this} deals 2 damage to target creature, 3 damage to another target creature, and 4 damage to a third target creature";
+ }
+
+ public SerpentineSpikeEffect(final SerpentineSpikeEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public SerpentineSpikeEffect copy() {
+ return new SerpentineSpikeEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getTargets().get(0).getFirstTarget());
+ if (permanent != null) {
+ permanent.damage(2, source.getSourceId(), game, false, true);
+ }
+ permanent = game.getPermanent(source.getTargets().get(1).getFirstTarget());
+ if (permanent != null) {
+ permanent.damage(3, source.getSourceId(), game, false, true);
+ }
+ permanent = game.getPermanent(source.getTargets().get(2).getFirstTarget());
+ if (permanent != null) {
+ permanent.damage(4, source.getSourceId(), game, false, true);
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ShadowGlider.java b/Mage.Sets/src/mage/sets/battleforzendikar/ShadowGlider.java
new file mode 100644
index 00000000000..786eac4e37e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ShadowGlider.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ShadowGlider extends CardImpl {
+
+ public ShadowGlider(UUID ownerId) {
+ super(ownerId, 47, "Shadow Glider", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Kor");
+ this.subtype.add("Soldier");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ }
+
+ public ShadowGlider(final ShadowGlider card) {
+ super(card);
+ }
+
+ @Override
+ public ShadowGlider copy() {
+ return new ShadowGlider(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ShamblingVent.java b/Mage.Sets/src/mage/sets/battleforzendikar/ShamblingVent.java
new file mode 100644
index 00000000000..359b32ed5ee
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ShamblingVent.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
+import mage.abilities.keyword.LifelinkAbility;
+import mage.abilities.mana.BlackManaAbility;
+import mage.abilities.mana.WhiteManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.permanent.token.Token;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ShamblingVent extends CardImpl {
+
+ public ShamblingVent(UUID ownerId) {
+ super(ownerId, 244, "Shambling Vent", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // Shambling Vent enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // {T}: Add {W} or {B} to your mana pool.
+ this.addAbility(new WhiteManaAbility());
+ this.addAbility(new BlackManaAbility());
+
+ // {1}{W}{B}: Shambling Vent becomes a 2/3 white and black Elemental creature with lifelink until end of turn. It's still a land.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(
+ new ShamblingVentToken(), "land", Duration.EndOfTurn), new ManaCostsImpl("{1}{W}{B}")));
+ }
+
+ public ShamblingVent(final ShamblingVent card) {
+ super(card);
+ }
+
+ @Override
+ public ShamblingVent copy() {
+ return new ShamblingVent(this);
+ }
+}
+
+class ShamblingVentToken extends Token {
+
+ public ShamblingVentToken() {
+ super("", "2/3 white and black Elemental creature with lifelink");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Elemental");
+ color.setWhite(true);
+ color.setBlack(true);
+ power = new MageInt(2);
+ toughness = new MageInt(3);
+ addAbility(LifelinkAbility.getInstance());
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ShatterskullRecruit.java b/Mage.Sets/src/mage/sets/battleforzendikar/ShatterskullRecruit.java
new file mode 100644
index 00000000000..b60833dab6a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ShatterskullRecruit.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.MenaceAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ShatterskullRecruit extends CardImpl {
+
+ public ShatterskullRecruit(UUID ownerId) {
+ super(ownerId, 155, "Shatterskull Recruit", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Giant");
+ this.subtype.add("Warrior");
+ this.subtype.add("Ally");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Menace
+ this.addAbility(new MenaceAbility());
+ }
+
+ public ShatterskullRecruit(final ShatterskullRecruit card) {
+ super(card);
+ }
+
+ @Override
+ public ShatterskullRecruit copy() {
+ return new ShatterskullRecruit(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SheerDrop.java b/Mage.Sets/src/mage/sets/battleforzendikar/SheerDrop.java
new file mode 100644
index 00000000000..23eb73d84ae
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SheerDrop.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SheerDrop extends mage.sets.zendikarvseldrazi.SheerDrop {
+
+ public SheerDrop(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 48;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public SheerDrop(final SheerDrop card) {
+ super(card);
+ }
+
+ @Override
+ public SheerDrop copy() {
+ return new SheerDrop(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ShrineOfTheForsakenGods.java b/Mage.Sets/src/mage/sets/battleforzendikar/ShrineOfTheForsakenGods.java
new file mode 100644
index 00000000000..70a54cc1a08
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ShrineOfTheForsakenGods.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.AddConditionalColorlessManaEffect;
+import mage.abilities.mana.ActivateIfConditionManaAbility;
+import mage.abilities.mana.ColorlessManaAbility;
+import mage.abilities.mana.conditional.ConditionalSpellManaBuilder;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterSpell;
+import mage.filter.common.FilterControlledLandPermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ShrineOfTheForsakenGods extends CardImpl {
+
+ private static final FilterSpell filter = new FilterSpell("colorless spells");
+
+ static {
+ filter.add(new ColorlessPredicate());
+ }
+
+ public ShrineOfTheForsakenGods(UUID ownerId) {
+ super(ownerId, 245, "Shrine of the Forsaken Gods", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // {T}: Add {1} to your mana pool.
+ this.addAbility(new ColorlessManaAbility());
+
+ // {T}: Add {2} to your mana pool. Spend this mana only to cast colorless spells. Activate this ability only if you control seven or more lands.
+ this.addAbility(new ActivateIfConditionManaAbility(
+ Zone.BATTLEFIELD,
+ new AddConditionalColorlessManaEffect(2, new ConditionalSpellManaBuilder(filter)),
+ new TapSourceCost(),
+ new PermanentsOnTheBattlefieldCondition(new FilterControlledLandPermanent("you control seven or more lands"), PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN, 6)));
+ }
+
+ public ShrineOfTheForsakenGods(final ShrineOfTheForsakenGods card) {
+ super(card);
+ }
+
+ @Override
+ public ShrineOfTheForsakenGods copy() {
+ return new ShrineOfTheForsakenGods(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SilentSkimmer.java b/Mage.Sets/src/mage/sets/battleforzendikar/SilentSkimmer.java
new file mode 100644
index 00000000000..bd3526bc99b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SilentSkimmer.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.effects.common.LoseLifeTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.SetTargetPointer;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SilentSkimmer extends CardImpl {
+
+ public SilentSkimmer(UUID ownerId) {
+ super(ownerId, 96, "Silent Skimmer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(4);
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // Whenever Silent Skimmer attacks, defending player loses 2 life.
+ this.addAbility(new AttacksTriggeredAbility(new LoseLifeTargetEffect(2), false,
+ "Whenever {this} attacks, defending player loses 2 life", SetTargetPointer.PLAYER));
+
+ }
+
+ public SilentSkimmer(final SilentSkimmer card) {
+ super(card);
+ }
+
+ @Override
+ public SilentSkimmer copy() {
+ return new SilentSkimmer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SireOfStagnation.java b/Mage.Sets/src/mage/sets/battleforzendikar/SireOfStagnation.java
new file mode 100644
index 00000000000..126dbb1d10c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SireOfStagnation.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.ExileCardsFromTopOfLibraryTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.SetTargetPointer;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SireOfStagnation extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent();
+ private static final String rule = "Whenever a land enters the battlefield under an opponent's control, that player exiles the top two cards of his or her library and you draw two cards.";
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public SireOfStagnation(UUID ownerId) {
+ super(ownerId, 206, "Sire of Stagnation", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{4}{U}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(7);
+
+ // Devoid (This card has no color.)
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Whenever a land enters the battlefield under an opponent's control, that player exiles the top two cards of his or her library and you draw two cards.
+ Ability ability = new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD,
+ new ExileCardsFromTopOfLibraryTargetEffect(2, "that player"), filter, false, SetTargetPointer.PLAYER, rule, false);
+ ability.addEffect(new DrawCardSourceControllerEffect(2));
+ this.addAbility(ability);
+ }
+
+ public SireOfStagnation(final SireOfStagnation card) {
+ super(card);
+ }
+
+ @Override
+ public SireOfStagnation copy() {
+ return new SireOfStagnation(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Skitterskin.java b/Mage.Sets/src/mage/sets/battleforzendikar/Skitterskin.java
new file mode 100644
index 00000000000..02439832d6a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Skitterskin.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateIfConditionActivatedAbility;
+import mage.abilities.common.CantBlockAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.RegenerateSourceEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.filter.predicate.permanent.AnotherPredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Skitterskin extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("you control another colorless creature");
+
+ static {
+ filter.add(new AnotherPredicate());
+ filter.add(new ColorlessPredicate());
+ }
+
+ public Skitterskin(UUID ownerId) {
+ super(ownerId, 97, "Skitterskin", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Skitterskin can't block.
+ this.addAbility(new CantBlockAbility());
+
+ // {1}{B}: Regenerate Skitterskin. Activate this ability only if you control another colorless creature.
+ Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD,
+ new RegenerateSourceEffect(),
+ new ManaCostsImpl("{1}{B}"),
+ new PermanentsOnTheBattlefieldCondition(filter));
+ this.addAbility(ability);
+ }
+
+ public Skitterskin(final Skitterskin card) {
+ super(card);
+ }
+
+ @Override
+ public Skitterskin copy() {
+ return new Skitterskin(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SkylineCascade.java b/Mage.Sets/src/mage/sets/battleforzendikar/SkylineCascade.java
new file mode 100644
index 00000000000..1f2078bb003
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SkylineCascade.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect;
+import mage.abilities.mana.BlueManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SkylineCascade extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public SkylineCascade(UUID ownerId) {
+ super(ownerId, 246, "Skyline Cascade", Rarity.COMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // Skyline Cascade enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // When Skyline Cascade enters the battlefield, target creature an opponent controls doesn't untap during its controller's next untap step.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DontUntapInControllersNextUntapStepTargetEffect(), false);
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ this.addAbility(ability);
+
+ // {T}: Add {U} to your mana pool.
+ this.addAbility(new BlueManaAbility());
+ }
+
+ public SkylineCascade(final SkylineCascade card) {
+ super(card);
+ }
+
+ @Override
+ public SkylineCascade copy() {
+ return new SkylineCascade(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SkyriderElf.java b/Mage.Sets/src/mage/sets/battleforzendikar/SkyriderElf.java
new file mode 100644
index 00000000000..d02eccfbc59
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SkyriderElf.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.counters.CounterType;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SkyriderElf extends CardImpl {
+
+ public SkyriderElf(UUID ownerId) {
+ super(ownerId, 220, "Skyrider Elf", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{X}{G}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elf");
+ this.subtype.add("Warrior");
+ this.subtype.add("Ally");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(0);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Converge-Skyrider Elf enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.
+ this.addAbility(new EntersBattlefieldAbility(
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance(), ColorsOfManaSpentToCastCount.getInstance(), true),
+ null, "Converge — {this} enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.", null));
+
+ }
+
+ public SkyriderElf(final SkyriderElf card) {
+ super(card);
+ }
+
+ @Override
+ public SkyriderElf copy() {
+ return new SkyriderElf(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SlabHammer.java b/Mage.Sets/src/mage/sets/battleforzendikar/SlabHammer.java
new file mode 100644
index 00000000000..98e97a9e68e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SlabHammer.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAttachedTriggeredAbility;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.continuous.BoostEquippedEffect;
+import mage.abilities.keyword.EquipAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledLandPermanent;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SlabHammer extends CardImpl {
+
+ public SlabHammer(UUID ownerId) {
+ super(ownerId, 227, "Slab Hammer", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Equipment");
+
+ // Whenever equipped creature attacks, you may return a land you control to its owner's hand. If you do, the creature gets +2/+2 until end of turn.
+ Ability ability = new AttacksAttachedTriggeredAbility(
+ new DoIfCostPaid(new BoostEquippedEffect(2, 2, Duration.EndOfTurn),
+ new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(new FilterControlledLandPermanent())),
+ "Return a land you control to its owner's hand? (giving +2/+2 to the equipped creature)"));
+ this.addAbility(ability);
+
+ // Equip {2}
+ this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(2)));
+
+ }
+
+ public SlabHammer(final SlabHammer card) {
+ super(card);
+ }
+
+ @Override
+ public SlabHammer copy() {
+ return new SlabHammer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SludgeCrawler.java b/Mage.Sets/src/mage/sets/battleforzendikar/SludgeCrawler.java
new file mode 100644
index 00000000000..e758d0d2264
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SludgeCrawler.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.IngestAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SludgeCrawler extends CardImpl {
+
+ public SludgeCrawler(UUID ownerId) {
+ super(ownerId, 98, "Sludge Crawler", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+ // Ingest
+ this.addAbility(new IngestAbility());
+ // {2}: Sludge Crawler gets +1/+1 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn), new GenericManaCost(2)));
+ }
+
+ public SludgeCrawler(final SludgeCrawler card) {
+ super(card);
+ }
+
+ @Override
+ public SludgeCrawler copy() {
+ return new SludgeCrawler(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SmiteTheMonstrous.java b/Mage.Sets/src/mage/sets/battleforzendikar/SmiteTheMonstrous.java
new file mode 100644
index 00000000000..3599031904a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SmiteTheMonstrous.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SmiteTheMonstrous extends mage.sets.innistrad.SmiteTheMonstrous {
+
+ public SmiteTheMonstrous(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 49;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public SmiteTheMonstrous(final SmiteTheMonstrous card) {
+ super(card);
+ }
+
+ @Override
+ public SmiteTheMonstrous copy() {
+ return new SmiteTheMonstrous(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SmolderingMarsh.java b/Mage.Sets/src/mage/sets/battleforzendikar/SmolderingMarsh.java
new file mode 100644
index 00000000000..cf49a37bcaa
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SmolderingMarsh.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.InvertCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.TapSourceEffect;
+import mage.abilities.mana.BlackManaAbility;
+import mage.abilities.mana.RedManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SmolderingMarsh extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent();
+
+ static {
+ filter.add(new SupertypePredicate("Basic"));
+ }
+
+ public SmolderingMarsh(UUID ownerId) {
+ super(ownerId, 247, "Smoldering Marsh", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Swamp");
+ this.subtype.add("Mountain");
+
+ // Smoldering Marsh enters the battlefield tapped unless you control two or more basic lands.
+ Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN, 1));
+ String abilityText = "tapped unless you control two or more basic lands";
+ this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText));
+ this.addAbility(new BlackManaAbility());
+ this.addAbility(new RedManaAbility());
+ }
+
+ public SmolderingMarsh(final SmolderingMarsh card) {
+ super(card);
+ }
+
+ @Override
+ public SmolderingMarsh copy() {
+ return new SmolderingMarsh(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SmotheringAbomination.java b/Mage.Sets/src/mage/sets/battleforzendikar/SmotheringAbomination.java
new file mode 100644
index 00000000000..e7d2ec93608
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SmotheringAbomination.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.SacrificeControllerEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SmotheringAbomination extends CardImpl {
+
+ public SmotheringAbomination(UUID ownerId) {
+ super(ownerId, 99, "Smothering Abomination", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // At the beginning of your upkeep, sacrifice a creature
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect(
+ new FilterCreaturePermanent(), 1, null), TargetController.YOU, false));
+
+ // Whenever you sacrifice a creature, draw a card.
+ this.addAbility(new SmotheringAbominationTriggeredAbility());
+ }
+
+ public SmotheringAbomination(final SmotheringAbomination card) {
+ super(card);
+ }
+
+ @Override
+ public SmotheringAbomination copy() {
+ return new SmotheringAbomination(this);
+ }
+}
+
+class SmotheringAbominationTriggeredAbility extends TriggeredAbilityImpl {
+
+ public SmotheringAbominationTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1));
+ }
+
+ public SmotheringAbominationTriggeredAbility(final SmotheringAbominationTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public SmotheringAbominationTriggeredAbility copy() {
+ return new SmotheringAbominationTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.SACRIFICED_PERMANENT;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ return event.getPlayerId().equals(this.getControllerId())
+ && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getCardType().contains(CardType.CREATURE);
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever you sacrifice a creature, " + super.getRule();
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SnappingGnarlid.java b/Mage.Sets/src/mage/sets/battleforzendikar/SnappingGnarlid.java
new file mode 100644
index 00000000000..299d4bee641
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SnappingGnarlid.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SnappingGnarlid extends CardImpl {
+
+ public SnappingGnarlid(UUID ownerId) {
+ super(ownerId, 190, "Snapping Gnarlid", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Beast");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Landfall- Whenever a land enters the battlefield under your control, Snapping Gnarlid gets +1/+1 until end of turn.
+ this.addAbility(new LandfallAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), false));
+ }
+
+ public SnappingGnarlid(final SnappingGnarlid card) {
+ super(card);
+ }
+
+ @Override
+ public SnappingGnarlid copy() {
+ return new SnappingGnarlid(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SpawningBed.java b/Mage.Sets/src/mage/sets/battleforzendikar/SpawningBed.java
new file mode 100644
index 00000000000..1dc801574ed
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SpawningBed.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.mana.ColorlessManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.permanent.token.EldraziScionToken;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SpawningBed extends CardImpl {
+
+ public SpawningBed(UUID ownerId) {
+ super(ownerId, 248, "Spawning Bed", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // {T}: Add {1} to your mana pool.
+ this.addAbility(new ColorlessManaAbility());
+
+ // {6}, {T}, Sacrifice Spawning Bed: Put three 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool."
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new EldraziScionToken(), 3), new ManaCostsImpl("{6}"));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ this.addAbility(ability);
+ }
+
+ public SpawningBed(final SpawningBed card) {
+ super(card);
+ }
+
+ @Override
+ public SpawningBed copy() {
+ return new SpawningBed(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SpellShrivel.java b/Mage.Sets/src/mage/sets/battleforzendikar/SpellShrivel.java
new file mode 100644
index 00000000000..0ad2aad05c5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SpellShrivel.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.Mode;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.stack.Spell;
+import mage.game.stack.StackObject;
+import mage.players.Player;
+import mage.target.TargetSpell;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SpellShrivel extends CardImpl {
+
+ public SpellShrivel(UUID ownerId) {
+ super(ownerId, 66, "Spell Shrivel", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+ // Counter target spell unless its controller pays {4}. If that spell is countered this way, exile it instead of putting it into its owner's graveyard.
+ this.getSpellAbility().addEffect(new SpellShrivelCounterUnlessPaysEffect());
+ this.getSpellAbility().addTarget(new TargetSpell());
+ }
+
+ public SpellShrivel(final SpellShrivel card) {
+ super(card);
+ }
+
+ @Override
+ public SpellShrivel copy() {
+ return new SpellShrivel(this);
+ }
+}
+
+class SpellShrivelCounterUnlessPaysEffect extends OneShotEffect {
+
+ public SpellShrivelCounterUnlessPaysEffect() {
+ super(Outcome.Detriment);
+ }
+
+ public SpellShrivelCounterUnlessPaysEffect(final SpellShrivelCounterUnlessPaysEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public SpellShrivelCounterUnlessPaysEffect copy() {
+ return new SpellShrivelCounterUnlessPaysEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ StackObject spell = game.getStack().getStackObject(targetPointer.getFirst(game, source));
+ MageObject sourceObject = source.getSourceObject(game);
+ if (spell != null && (spell instanceof Spell) && sourceObject != null) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ int amount = 4;
+ if (amount > 0) {
+ GenericManaCost cost = new GenericManaCost(amount);
+ if (!cost.pay(source, game, spell.getControllerId(), spell.getControllerId(), false)) {
+ StackObject stackObject = game.getStack().getStackObject(source.getFirstTarget());
+ if (stackObject != null && !game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER, source.getFirstTarget(), source.getSourceId(), stackObject.getControllerId()))) {
+ game.informPlayers(sourceObject.getIdName() + ": cost wasn't payed - countering " + stackObject.getName());
+ game.rememberLKI(source.getFirstTarget(), Zone.STACK, (Spell) stackObject);
+ controller.moveCards((Spell) spell, null, Zone.EXILED, source, game);
+ game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTERED, source.getFirstTarget(), source.getSourceId(), stackObject.getControllerId()));
+ return true;
+ }
+ return false;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getText(Mode mode) {
+ return "Counter target spell unless its controller pays {4}. If that spell is countered this way, exile it instead of putting it into its owner's graveyard";
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/StasisSnare.java b/Mage.Sets/src/mage/sets/battleforzendikar/StasisSnare.java
new file mode 100644
index 00000000000..ac6704bb5cd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/StasisSnare.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.delayed.OnLeaveReturnExiledToBattlefieldAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.abilities.keyword.FlashAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetCreaturePermanent;
+import mage.util.CardUtil;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class StasisSnare extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public StasisSnare(UUID ownerId) {
+ super(ownerId, 50, "Stasis Snare", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Flash
+ this.addAbility(FlashAbility.getInstance());
+
+ // When Stasis Snare enters the battlefield, exile target creature an opponent controls until Stasis Snare leaves the battlefield.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new StasisSnareExileEffect());
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility()));
+ this.addAbility(ability);
+ }
+
+ public StasisSnare(final StasisSnare card) {
+ super(card);
+ }
+
+ @Override
+ public StasisSnare copy() {
+ return new StasisSnare(this);
+ }
+}
+
+class StasisSnareExileEffect extends OneShotEffect {
+
+ public StasisSnareExileEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "exile target creature an opponent controls until Stasis Snare leaves the battlefield";
+ }
+
+ public StasisSnareExileEffect(final StasisSnareExileEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public StasisSnareExileEffect copy() {
+ return new StasisSnareExileEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getSourceId());
+ // If Stasis Snare leaves the battlefield before its triggered ability resolves,
+ // the target won't be exiled.
+ if (permanent != null) {
+ return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getIdName()).apply(game, source);
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/StoneHavenMedic.java b/Mage.Sets/src/mage/sets/battleforzendikar/StoneHavenMedic.java
new file mode 100644
index 00000000000..1395376edab
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/StoneHavenMedic.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class StoneHavenMedic extends CardImpl {
+
+ public StoneHavenMedic(UUID ownerId) {
+ super(ownerId, 51, "Stone Haven Medic", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Kor");
+ this.subtype.add("Cleric");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(3);
+
+ // {W}, {T}: You gain 1 life.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(1), new ManaCostsImpl("{W}"));
+ ability.addCost(new TapSourceCost());
+ this.addAbility(ability);
+ }
+
+ public StoneHavenMedic(final StoneHavenMedic card) {
+ super(card);
+ }
+
+ @Override
+ public StoneHavenMedic copy() {
+ return new StoneHavenMedic(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Stonefury.java b/Mage.Sets/src/mage/sets/battleforzendikar/Stonefury.java
new file mode 100644
index 00000000000..8c58f9e9520
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Stonefury.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledLandPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Stonefury extends CardImpl {
+
+ public Stonefury(UUID ownerId) {
+ super(ownerId, 156, "Stonefury", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{3}{R}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Stonefury deals damage to target creature equal to the number of lands you control.
+ Effect effect = new DamageTargetEffect(new PermanentsOnBattlefieldCount(new FilterControlledLandPermanent("the number of lands you control")));
+ effect.setText("{this} deals damage to target creature equal to the number of lands you control");
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ }
+
+ public Stonefury(final Stonefury card) {
+ super(card);
+ }
+
+ @Override
+ public Stonefury copy() {
+ return new Stonefury(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SunkenHollow.java b/Mage.Sets/src/mage/sets/battleforzendikar/SunkenHollow.java
new file mode 100644
index 00000000000..0f9edc0a55a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SunkenHollow.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.InvertCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.TapSourceEffect;
+import mage.abilities.mana.BlackManaAbility;
+import mage.abilities.mana.BlueManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SunkenHollow extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent();
+
+ static {
+ filter.add(new SupertypePredicate("Basic"));
+ }
+
+ public SunkenHollow(UUID ownerId) {
+ super(ownerId, 249, "Sunken Hollow", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Island");
+ this.subtype.add("Swamp");
+
+ // Sunken Hollow enters the battlefield tapped unless you control two or more basic lands.
+ Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN, 1));
+ String abilityText = "tapped unless you control two or more basic lands";
+ this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText));
+ this.addAbility(new BlueManaAbility());
+ this.addAbility(new BlackManaAbility());
+ }
+
+ public SunkenHollow(final SunkenHollow card) {
+ super(card);
+ }
+
+ @Override
+ public SunkenHollow copy() {
+ return new SunkenHollow(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SureStrike.java b/Mage.Sets/src/mage/sets/battleforzendikar/SureStrike.java
new file mode 100644
index 00000000000..be9007a33d4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SureStrike.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SureStrike extends CardImpl {
+
+ public SureStrike(UUID ownerId) {
+ super(ownerId, 157, "Sure Strike", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Target creature gets +3/+0 and gains first strike until end of turn.
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ Effect effect = new BoostTargetEffect(3, 0, Duration.EndOfTurn);
+ effect.setText("Target creature gets +3/+0");
+ this.getSpellAbility().addEffect(effect);
+ effect = new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn);
+ effect.setText("and gains first strike until end of turn");
+ this.getSpellAbility().addEffect(effect);
+ }
+
+ public SureStrike(final SureStrike card) {
+ super(card);
+ }
+
+ @Override
+ public SureStrike copy() {
+ return new SureStrike(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Swamp1.java b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp1.java
new file mode 100644
index 00000000000..bea737b3749
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp1.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Swamp1 extends mage.cards.basiclands.Swamp {
+
+ public Swamp1(UUID ownerId) {
+ super(ownerId, 260);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Swamp1(final Swamp1 card) {
+ super(card);
+ }
+
+ @Override
+ public Swamp1 copy() {
+ return new Swamp1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Swamp2.java b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp2.java
new file mode 100644
index 00000000000..0436899d9cd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp2.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Swamp2 extends mage.cards.basiclands.Swamp {
+
+ public Swamp2(UUID ownerId) {
+ super(ownerId, 261);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Swamp2(final Swamp2 card) {
+ super(card);
+ }
+
+ @Override
+ public Swamp2 copy() {
+ return new Swamp2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Swamp3.java b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp3.java
new file mode 100644
index 00000000000..4bceb8a424f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp3.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Swamp3 extends mage.cards.basiclands.Swamp {
+
+ public Swamp3(UUID ownerId) {
+ super(ownerId, 262);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Swamp3(final Swamp3 card) {
+ super(card);
+ }
+
+ @Override
+ public Swamp3 copy() {
+ return new Swamp3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Swamp4.java b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp4.java
new file mode 100644
index 00000000000..87bd2b49c77
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp4.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Swamp4 extends mage.cards.basiclands.Swamp {
+
+ public Swamp4(UUID ownerId) {
+ super(ownerId, 263);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Swamp4(final Swamp4 card) {
+ super(card);
+ }
+
+ @Override
+ public Swamp4 copy() {
+ return new Swamp4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Swamp5.java b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp5.java
new file mode 100644
index 00000000000..b2ebc6e3935
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp5.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Swamp5 extends mage.cards.basiclands.Swamp {
+
+ public Swamp5(UUID ownerId) {
+ super(ownerId, 264);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Swamp5(final Swamp5 card) {
+ super(card);
+ }
+
+ @Override
+ public Swamp5 copy() {
+ return new Swamp5(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SwarmSurge.java b/Mage.Sets/src/mage/sets/battleforzendikar/SwarmSurge.java
new file mode 100644
index 00000000000..4c86dffec66
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SwarmSurge.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SwarmSurge extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Colorless creatures you control");
+
+ static {
+ filter.add(new ColorlessPredicate());
+ }
+
+ public SwarmSurge(UUID ownerId) {
+ super(ownerId, 100, "Swarm Surge", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{B}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+
+ // Creatures you control get +2/+0 until end of turn.
+ this.getSpellAbility().addEffect(new BoostControlledEffect(2, 0, Duration.EndOfTurn));
+
+ // Colorless creatures you control also gain first strike until end of turn.
+ Effect effect = new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, filter);
+ effect.setText("Colorless creatures you control also gain first strike until end of turn");
+ this.getSpellAbility().addEffect(effect);
+ }
+
+ public SwarmSurge(final SwarmSurge card) {
+ super(card);
+ }
+
+ @Override
+ public SwarmSurge copy() {
+ return new SwarmSurge(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SwellOfGrowth.java b/Mage.Sets/src/mage/sets/battleforzendikar/SwellOfGrowth.java
new file mode 100644
index 00000000000..21da131ea05
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SwellOfGrowth.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SwellOfGrowth extends CardImpl {
+
+ public SwellOfGrowth(UUID ownerId) {
+ super(ownerId, 191, "Swell of Growth", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{G}");
+ this.expansionSetCode = "BFZ";
+
+ // Target creature gets +2/+2 until end of turn. You may put a land card from your hand onto the battlefield.
+ this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ this.getSpellAbility().addEffect(new PutLandFromHandOntoBattlefieldEffect());
+ }
+
+ public SwellOfGrowth(final SwellOfGrowth card) {
+ super(card);
+ }
+
+ @Override
+ public SwellOfGrowth copy() {
+ return new SwellOfGrowth(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SylvanScrying.java b/Mage.Sets/src/mage/sets/battleforzendikar/SylvanScrying.java
new file mode 100644
index 00000000000..c583cbf1f46
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SylvanScrying.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SylvanScrying extends mage.sets.tenthedition.SylvanScrying {
+
+ public SylvanScrying(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 192;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public SylvanScrying(final SylvanScrying card) {
+ super(card);
+ }
+
+ @Override
+ public SylvanScrying copy() {
+ return new SylvanScrying(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TajuruBeastmaster.java b/Mage.Sets/src/mage/sets/battleforzendikar/TajuruBeastmaster.java
new file mode 100644
index 00000000000..a73c8265b5e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TajuruBeastmaster.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TajuruBeastmaster extends CardImpl {
+
+ public TajuruBeastmaster(UUID ownerId) {
+ super(ownerId, 193, "Tajuru Beastmaster", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elf");
+ this.subtype.add("Warrior");
+ this.subtype.add("Ally");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // Rally - Whenever Tajuru Beastmaster or another Ally creature enters the battlefield under your control, creatures you control get +1/+1 until end of turn.
+ this.addAbility(new AllyEntersBattlefieldTriggeredAbility(new BoostControlledEffect(1, 1, Duration.EndOfTurn), false));
+ }
+
+ public TajuruBeastmaster(final TajuruBeastmaster card) {
+ super(card);
+ }
+
+ @Override
+ public TajuruBeastmaster copy() {
+ return new TajuruBeastmaster(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TajuruStalwart.java b/Mage.Sets/src/mage/sets/battleforzendikar/TajuruStalwart.java
new file mode 100644
index 00000000000..73947b4132e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TajuruStalwart.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.counters.CounterType;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TajuruStalwart extends CardImpl {
+
+ public TajuruStalwart(UUID ownerId) {
+ super(ownerId, 194, "Tajuru Stalwart", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elf");
+ this.subtype.add("Scout");
+ this.subtype.add("Ally");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(1);
+
+ // Converge - Tajuru Stalwart enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.
+ this.addAbility(new EntersBattlefieldAbility(
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance(), ColorsOfManaSpentToCastCount.getInstance(), true),
+ null, "Converge - {this} enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.", null));
+
+ }
+
+ public TajuruStalwart(final TajuruStalwart card) {
+ super(card);
+ }
+
+ @Override
+ public TajuruStalwart copy() {
+ return new TajuruStalwart(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TajuruWarcaller.java b/Mage.Sets/src/mage/sets/battleforzendikar/TajuruWarcaller.java
new file mode 100644
index 00000000000..ea6a0665eed
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TajuruWarcaller.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class TajuruWarcaller extends CardImpl {
+
+ public TajuruWarcaller(UUID ownerId) {
+ super(ownerId, 195, "Tajuru Warcaller", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elf");
+ this.subtype.add("Warrior");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Rally-Whenever Tajuru Warcaller or another Ally enters the battlefield under your control, creatures you control get +2/+2 until end of turn.
+ this.addAbility(new AllyEntersBattlefieldTriggeredAbility(new BoostControlledEffect(2, 2, Duration.EndOfTurn), false));
+ }
+
+ public TajuruWarcaller(final TajuruWarcaller card) {
+ super(card);
+ }
+
+ @Override
+ public TajuruWarcaller copy() {
+ return new TajuruWarcaller(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TandemTactics.java b/Mage.Sets/src/mage/sets/battleforzendikar/TandemTactics.java
new file mode 100644
index 00000000000..d766749c509
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TandemTactics.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class TandemTactics extends CardImpl {
+
+ public TandemTactics(UUID ownerId) {
+ super(ownerId, 52, "Tandem Tactics", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Up to two target creatures each get +1/+2 until end of turn. You gain 2 life.
+ Effect effect = new BoostTargetEffect(1, 2, Duration.EndOfTurn);
+ effect.setText("Up to two target creatures each get +1/+2 until end of turn");
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2));
+ this.getSpellAbility().addEffect(new GainLifeEffect(2));
+ }
+
+ public TandemTactics(final TandemTactics card) {
+ super(card);
+ }
+
+ @Override
+ public TandemTactics copy() {
+ return new TandemTactics(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TerritorialBaloth.java b/Mage.Sets/src/mage/sets/battleforzendikar/TerritorialBaloth.java
new file mode 100644
index 00000000000..11c2e194b31
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TerritorialBaloth.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TerritorialBaloth extends mage.sets.zendikar.TerritorialBaloth {
+
+ public TerritorialBaloth(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 196;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public TerritorialBaloth(final TerritorialBaloth card) {
+ super(card);
+ }
+
+ @Override
+ public TerritorialBaloth copy() {
+ return new TerritorialBaloth(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TideDrifter.java b/Mage.Sets/src/mage/sets/battleforzendikar/TideDrifter.java
new file mode 100644
index 00000000000..43dcbe4827d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TideDrifter.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TideDrifter extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Other colorless creatures you control");
+
+ static {
+ filter.add(new ColorlessPredicate());
+ }
+
+ public TideDrifter(UUID ownerId) {
+ super(ownerId, 67, "Tide Drifter", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(5);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+ // Other colorless creatures you control get +0/+1.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(0, 1, Duration.WhileOnBattlefield, filter, true)));
+
+ }
+
+ public TideDrifter(final TideDrifter card) {
+ super(card);
+ }
+
+ @Override
+ public TideDrifter copy() {
+ return new TideDrifter(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TighteningCoils.java b/Mage.Sets/src/mage/sets/battleforzendikar/TighteningCoils.java
new file mode 100644
index 00000000000..229c632b796
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TighteningCoils.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
+import mage.abilities.effects.common.continuous.LoseAbilityAttachedEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TighteningCoils extends CardImpl {
+
+ public TighteningCoils(UUID ownerId) {
+ super(ownerId, 86, "Tightening Coils", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Aura");
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+
+ // Enchanted creature gets -6/-0 and loses flying.
+ ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(-6, 0, Duration.WhileOnBattlefield));
+ Effect effect = new LoseAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA);
+ effect.setText("and loses flying");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+
+ }
+
+ public TighteningCoils(final TighteningCoils card) {
+ super(card);
+ }
+
+ @Override
+ public TighteningCoils copy() {
+ return new TighteningCoils(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TitansPresence.java b/Mage.Sets/src/mage/sets/battleforzendikar/TitansPresence.java
new file mode 100644
index 00000000000..e9910dbcd65
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TitansPresence.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.List;
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.costs.common.RevealTargetFromHandCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreatureCard;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCardInHand;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TitansPresence extends CardImpl {
+
+ private static final FilterCreatureCard filter = new FilterCreatureCard("a colorless creature card from your hand");
+
+ static {
+ filter.add(new ColorlessPredicate());
+ }
+
+ public TitansPresence(UUID ownerId) {
+ super(ownerId, 14, "Titan's Presence", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}");
+ this.expansionSetCode = "BFZ";
+
+ // As an additional cost to cast Titan's Presence, reveal a colorless creature card from your hand.
+ this.getSpellAbility().addCost(new RevealTargetFromHandCost(new TargetCardInHand(filter)));
+
+ // Exile target creature if its power is less than or equal to the revealed card's power.
+ this.getSpellAbility().addEffect(new TitansPresenceEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ }
+
+ public TitansPresence(final TitansPresence card) {
+ super(card);
+ }
+
+ @Override
+ public TitansPresence copy() {
+ return new TitansPresence(this);
+ }
+}
+
+class TitansPresenceEffect extends OneShotEffect {
+
+ public TitansPresenceEffect() {
+ super(Outcome.Exile);
+ staticText = "Exile target creature if its power is less than or equal to the revealed card's power";
+ }
+
+ public TitansPresenceEffect(TitansPresenceEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ RevealTargetFromHandCost cost = (RevealTargetFromHandCost) source.getCosts().get(0);
+ Permanent creature = game.getPermanent(getTargetPointer().getFirst(game, source));
+ Player controller = game.getPlayer(source.getControllerId());
+ if (cost != null && creature != null && controller != null) {
+ List revealedCards = cost.getRevealedCards();
+ if (!revealedCards.isEmpty()) {
+ Card card = revealedCards.iterator().next();
+ if (card != null && card.getPower().getValue() >= creature.getPower().getValue()) {
+ controller.moveCards(creature, null, Zone.EXILED, source, game);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public TitansPresenceEffect copy() {
+ return new TitansPresenceEffect(this);
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TouchOfTheVoid.java b/Mage.Sets/src/mage/sets/battleforzendikar/TouchOfTheVoid.java
new file mode 100644
index 00000000000..3ade709aaba
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TouchOfTheVoid.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.replacement.DealtDamageToCreatureBySourceDies;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreatureOrPlayer;
+import mage.watchers.common.DamagedByWatcher;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TouchOfTheVoid extends CardImpl {
+
+ public TouchOfTheVoid(UUID ownerId) {
+ super(ownerId, 134, "Touch of the Void", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+ // Touch of the Void deals 3 damage to target creature or player. If a creature dealt damage this way would die this turn, exile it instead.
+ this.getSpellAbility().addEffect(new DamageTargetEffect(3));
+ this.getSpellAbility().addTarget(new TargetCreatureOrPlayer());
+ Effect effect = new DealtDamageToCreatureBySourceDies(this, Duration.EndOfTurn);
+ effect.setText("If a creature dealt damage this way would die this turn, exile it instead");
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addWatcher(new DamagedByWatcher());
+ }
+
+ public TouchOfTheVoid(final TouchOfTheVoid card) {
+ super(card);
+ }
+
+ @Override
+ public TouchOfTheVoid copy() {
+ return new TouchOfTheVoid(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TransgressTheMind.java b/Mage.Sets/src/mage/sets/battleforzendikar/TransgressTheMind.java
new file mode 100644
index 00000000000..aaaef82e6cf
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TransgressTheMind.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.ExileCardYouChooseTargetOpponentEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.Filter;
+import mage.filter.FilterCard;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.target.TargetPlayer;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class TransgressTheMind extends CardImpl {
+
+ private static final FilterCard filter = new FilterCard("a card from it with converted mana cost 3 or greater");
+
+ static {
+ filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.GreaterThan, 2));
+ }
+
+ public TransgressTheMind(UUID ownerId) {
+ super(ownerId, 101, "Transgress the Mind", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{1}{B}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+
+ // Target player reveals his or her hand. You may choose a card from it with converted mana cost 3 or greater and exile that card.
+ Effect effect = new ExileCardYouChooseTargetOpponentEffect(filter);
+ effect.setText("Target player reveals his or her hand. You may choose a card from it with converted mana cost 3 or greater and exile that card");
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addTarget(new TargetPlayer());
+ }
+
+ public TransgressTheMind(final TransgressTheMind card) {
+ super(card);
+ }
+
+ @Override
+ public TransgressTheMind copy() {
+ return new TransgressTheMind(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TunnelingGeopede.java b/Mage.Sets/src/mage/sets/battleforzendikar/TunnelingGeopede.java
new file mode 100644
index 00000000000..c93253bcf38
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TunnelingGeopede.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.DamagePlayersEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TunnelingGeopede extends CardImpl {
+
+ public TunnelingGeopede(UUID ownerId) {
+ super(ownerId, 158, "Tunneling Geopede", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Insect");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Landfall - Whenever a land enters the battlefield under your control, Tunneling Geopede deals 1 damage to each opponent.
+ this.addAbility(new LandfallAbility(new DamagePlayersEffect(1, TargetController.OPPONENT), false));
+ }
+
+ public TunnelingGeopede(final TunnelingGeopede card) {
+ super(card);
+ }
+
+ @Override
+ public TunnelingGeopede copy() {
+ return new TunnelingGeopede(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TurnAgainst.java b/Mage.Sets/src/mage/sets/battleforzendikar/TurnAgainst.java
new file mode 100644
index 00000000000..50defaa5d03
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TurnAgainst.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.common.UntapTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.effects.common.continuous.GainControlTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TurnAgainst extends CardImpl {
+
+ public TurnAgainst(UUID ownerId) {
+ super(ownerId, 135, "Turn Against", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{4}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+ // Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn.
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfTurn));
+ this.getSpellAbility().addEffect(new UntapTargetEffect());
+ this.getSpellAbility().addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn));
+ }
+
+ public TurnAgainst(final TurnAgainst card) {
+ super(card);
+ }
+
+ @Override
+ public TurnAgainst copy() {
+ return new TurnAgainst(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/UginsInsight.java b/Mage.Sets/src/mage/sets/battleforzendikar/UginsInsight.java
new file mode 100644
index 00000000000..97e768c1c32
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/UginsInsight.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.dynamicvalue.common.HighestConvertedManaCostValue;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class UginsInsight extends CardImpl {
+
+ public UginsInsight(UUID ownerId) {
+ super(ownerId, 87, "Ugin's Insight", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{U}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Scry X, where X is the highest converted mana cost among permanents you control, then draw three cards.
+ this.getSpellAbility().addEffect(new UginsInsightEffect());
+ }
+
+ public UginsInsight(final UginsInsight card) {
+ super(card);
+ }
+
+ @Override
+ public UginsInsight copy() {
+ return new UginsInsight(this);
+ }
+}
+
+class UginsInsightEffect extends OneShotEffect {
+
+ public UginsInsightEffect() {
+ super(Outcome.DrawCard);
+ this.staticText = "Scry X, where X is the highest converted mana cost among permanents you control, then draw three cards";
+ }
+
+ public UginsInsightEffect(final UginsInsightEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public UginsInsightEffect copy() {
+ return new UginsInsightEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ int highCMC = new HighestConvertedManaCostValue().calculate(game, source, this);
+ if (highCMC > 0) {
+ controller.scry(highCMC, source, game);
+ }
+ controller.drawCards(3, game);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/UlamogTheCeaselessHunger.java b/Mage.Sets/src/mage/sets/battleforzendikar/UlamogTheCeaselessHunger.java
new file mode 100644
index 00000000000..038df1a77e9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/UlamogTheCeaselessHunger.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.abilities.keyword.IndestructibleAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterPermanent;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.permanent.Permanent;
+import mage.game.stack.Spell;
+import mage.players.Player;
+import mage.target.TargetPermanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class UlamogTheCeaselessHunger extends CardImpl {
+
+ public UlamogTheCeaselessHunger(UUID ownerId) {
+ super(ownerId, 15, "Ulamog, the Ceaseless Hunger", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{10}");
+ this.expansionSetCode = "BFZ";
+ this.supertype.add("Legendary");
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(10);
+ this.toughness = new MageInt(10);
+
+ // When you cast Ulamog, the Ceaseless Hunger, exile two target permanents.
+ this.addAbility(new UlamogExilePermanentsOnCastAbility());
+
+ // Indestructible
+ this.addAbility(IndestructibleAbility.getInstance());
+
+ // Whenever Ulamog attacks, defending player exiles the top twenty cards of his or her library.
+ Effect effect = new UlamogExileLibraryEffect();
+ effect.setText("defending player exiles the top twenty cards of his or her library");
+ this.addAbility(new UlamogAttackTriggeredAbility(effect));
+ }
+
+ public UlamogTheCeaselessHunger(final UlamogTheCeaselessHunger card) {
+ super(card);
+ }
+
+ @Override
+ public UlamogTheCeaselessHunger copy() {
+ return new UlamogTheCeaselessHunger(this);
+ }
+}
+
+class UlamogExilePermanentsOnCastAbility extends TriggeredAbilityImpl {
+
+ UlamogExilePermanentsOnCastAbility() {
+ super(Zone.STACK, new ExileTargetEffect("exile two target permanents"));
+ this.addTarget(new TargetPermanent(2, new FilterPermanent()));
+ }
+
+ UlamogExilePermanentsOnCastAbility(UlamogExilePermanentsOnCastAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.SPELL_CAST;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Spell spell = (Spell) game.getObject(event.getTargetId());
+ return this.getSourceId().equals(spell.getSourceId());
+ }
+
+ @Override
+ public UlamogExilePermanentsOnCastAbility copy() {
+ return new UlamogExilePermanentsOnCastAbility(this);
+ }
+
+ @Override
+ public String getRule() {
+ return "When you cast {this}, " + super.getRule();
+ }
+}
+
+class UlamogAttackTriggeredAbility extends TriggeredAbilityImpl {
+
+ public UlamogAttackTriggeredAbility(Effect effect) {
+ super(Zone.BATTLEFIELD, effect);
+ }
+
+ public UlamogAttackTriggeredAbility(final UlamogAttackTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public UlamogAttackTriggeredAbility copy() {
+ return new UlamogAttackTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.ATTACKER_DECLARED;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent sourcePermanent = game.getPermanent(this.getSourceId());
+ if (sourcePermanent != null
+ && event.getSourceId() != null
+ && event.getSourceId().equals(this.getSourceId())) {
+ UUID defender = game.getCombat().getDefendingPlayerId(this.getSourceId(), game);
+ this.getEffects().get(0).setTargetPointer(new FixedTarget(defender));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return new StringBuilder("Whenever {this} attacks, ").append(super.getRule()).toString();
+ }
+}
+
+class UlamogExileLibraryEffect extends OneShotEffect {
+
+ public UlamogExileLibraryEffect() {
+ super(Outcome.Exile);
+ this.staticText = "defending player exiles the top twenty cards of his or her library";
+ }
+
+ public UlamogExileLibraryEffect(final UlamogExileLibraryEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public UlamogExileLibraryEffect copy() {
+ return new UlamogExileLibraryEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player defender = game.getPlayer(targetPointer.getFirst(game, source));
+ if (defender != null) {
+ int count = Math.min(defender.getLibrary().size(), 20);
+ for (int i = 0; i < count; i++) {
+ Card card = defender.getLibrary().removeFromTop(game);
+ if (card != null) {
+ card.moveToExile(null, null, source.getSourceId(), game);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/UlamogsDespoiler.java b/Mage.Sets/src/mage/sets/battleforzendikar/UlamogsDespoiler.java
new file mode 100644
index 00000000000..bcf90209c59
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/UlamogsDespoiler.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.filter.FilterCard;
+import mage.filter.predicate.other.OwnerPredicate;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.Target;
+import mage.target.common.TargetCardInExile;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class UlamogsDespoiler extends CardImpl {
+
+ public UlamogsDespoiler(UUID ownerId) {
+ super(ownerId, 16, "Ulamog's Despoiler", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{6}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Processor");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // As Ulamog's Despoiler enters the battlefield, you may put two cards your opponents own from exile into their owners' graveyards. If you do, Ulamog's Despoiler enters the battlefield with four +1/+1 counters on it.
+ this.addAbility(new EntersBattlefieldAbility(new UlamogsDespoilerEffect(), null,
+ "As {this} enters the battlefield, you may put two cards your opponents own from exile into their owners' graveyards. If you do, {this} enters the battlefield with four +1/+1 counters on it", null));
+ }
+
+ public UlamogsDespoiler(final UlamogsDespoiler card) {
+ super(card);
+ }
+
+ @Override
+ public UlamogsDespoiler copy() {
+ return new UlamogsDespoiler(this);
+ }
+}
+
+class UlamogsDespoilerEffect extends OneShotEffect {
+
+ private final static FilterCard filter = new FilterCard("cards your opponents own from exile");
+
+ static {
+ filter.add(new OwnerPredicate(TargetController.OPPONENT));
+ }
+
+ public UlamogsDespoilerEffect() {
+ super(Outcome.PutCreatureInPlay);
+ this.staticText = "you may put two cards your opponents own from exile into their owners' graveyards. If you do, {this} enters the battlefield with four +1/+1 counters on it";
+ }
+
+ public UlamogsDespoilerEffect(final UlamogsDespoilerEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public UlamogsDespoilerEffect copy() {
+ return new UlamogsDespoilerEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ Target target = new TargetCardInExile(2, 2, filter, null);
+ if (target.canChoose(source.getSourceId(), source.getControllerId(), game)) {
+ if (controller.chooseTarget(outcome, target, source, game)) {
+ Cards cardsToGraveyard = new CardsImpl(target.getTargets());
+ controller.moveCards(cardsToGraveyard, null, Zone.GRAVEYARD, source, game);
+ return new AddCountersSourceEffect(CounterType.P1P1.createInstance(4)).apply(game, source);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/UlamogsNullifier.java b/Mage.Sets/src/mage/sets/battleforzendikar/UlamogsNullifier.java
new file mode 100644
index 00000000000..dcdff1c328f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/UlamogsNullifier.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.FlashAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.filter.predicate.other.OwnerPredicate;
+import mage.game.Game;
+import mage.game.stack.Spell;
+import mage.players.Player;
+import mage.target.Target;
+import mage.target.TargetSpell;
+import mage.target.common.TargetCardInExile;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class UlamogsNullifier extends CardImpl {
+
+ public UlamogsNullifier(UUID ownerId) {
+ super(ownerId, 207, "Ulamog's Nullifier", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{U}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Processor");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Flash
+ this.addAbility(FlashAbility.getInstance());
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // When Ulamog's Nullifier enters the battlefield, you may put two cards your opponents own
+ // from exile into their owners' graveyards. If you do, counter target spell.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new UlamogsNullifierEffect(), true);
+ ability.addTarget(new TargetSpell());
+ this.addAbility(ability);
+ }
+
+ public UlamogsNullifier(final UlamogsNullifier card) {
+ super(card);
+ }
+
+ @Override
+ public UlamogsNullifier copy() {
+ return new UlamogsNullifier(this);
+ }
+}
+
+class UlamogsNullifierEffect extends OneShotEffect {
+
+ private final static FilterCard filter = new FilterCard("cards your opponents own from exile");
+
+ static {
+ filter.add(new OwnerPredicate(TargetController.OPPONENT));
+ }
+
+ public UlamogsNullifierEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "you may put two cards your opponents own from exile into their owners' graveyards. If you do, counter target spell.";
+ }
+
+ public UlamogsNullifierEffect(final UlamogsNullifierEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public UlamogsNullifierEffect copy() {
+ return new UlamogsNullifierEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Spell spell = game.getStack().getSpell(source.getFirstTarget());
+ if (controller != null && spell != null) {
+ Target target = new TargetCardInExile(2, 2, filter, null);
+ if (target.canChoose(source.getSourceId(), source.getControllerId(), game)) {
+ if (controller.chooseTarget(outcome, target, source, game)) {
+ Cards cardsToGraveyard = new CardsImpl(target.getTargets());
+ controller.moveCards(cardsToGraveyard, null, Zone.GRAVEYARD, source, game);
+ game.getStack().counter(source.getFirstTarget(), source.getSourceId(), game);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/UlamogsReclaimer.java b/Mage.Sets/src/mage/sets/battleforzendikar/UlamogsReclaimer.java
new file mode 100644
index 00000000000..5d9788b7724
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/UlamogsReclaimer.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.costs.common.ExileOpponentsCardFromExileToGraveyardCost;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterInstantOrSorceryCard;
+import mage.target.common.TargetCardInYourGraveyard;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class UlamogsReclaimer extends CardImpl {
+
+ public UlamogsReclaimer(UUID ownerId) {
+ super(ownerId, 68, "Ulamog's Reclaimer", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Processor");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(5);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+ // When Ulamog's Reclaimer enters the battlefield, you may put a card an opponent owns from exile into that player's graveyard. If you do, return target instant or sorcery card from your graveyard to your hand.
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new DoIfCostPaid(new ReturnFromGraveyardToHandTargetEffect(), new ExileOpponentsCardFromExileToGraveyardCost(true)), true);
+ ability.addTarget(new TargetCardInYourGraveyard(new FilterInstantOrSorceryCard("instant or sorcery card from your graveyard")));
+ this.addAbility(ability);
+ }
+
+ public UlamogsReclaimer(final UlamogsReclaimer card) {
+ super(card);
+ }
+
+ @Override
+ public UlamogsReclaimer copy() {
+ return new UlamogsReclaimer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/UndergrowthChampion.java b/Mage.Sets/src/mage/sets/battleforzendikar/UndergrowthChampion.java
new file mode 100644
index 00000000000..504b6eec6a6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/UndergrowthChampion.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.PreventionEffectImpl;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.PhaseStep;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.game.turn.Step;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class UndergrowthChampion extends CardImpl {
+
+ public UndergrowthChampion(UUID ownerId) {
+ super(ownerId, 197, "Undergrowth Champion", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{1}{G}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elemental");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // If damage would be dealt to Undergrowth Champion while it has a +1/+1 counter on it, prevent that damage and remove a +1/+1 counter from Undergrowth Champion.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new UndergrowthChampionPreventionEffect()));
+
+ // Landfall-Whenever a land enters the battlefield under your control, put a +1/+1 counter on Undergrowth Champion.
+ this.addAbility(new LandfallAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false));
+ }
+
+ public UndergrowthChampion(final UndergrowthChampion card) {
+ super(card);
+ }
+
+ @Override
+ public UndergrowthChampion copy() {
+ return new UndergrowthChampion(this);
+ }
+}
+
+class UndergrowthChampionPreventionEffect extends PreventionEffectImpl {
+
+ // remember turn and phase step to check if counter in this step was already removed
+ private int turn = 0;
+ private Step combatPhaseStep = null;
+
+ public UndergrowthChampionPreventionEffect() {
+ super(Duration.WhileOnBattlefield);
+ staticText = "If damage would be dealt to {this} while it has a +1/+1 counter on it, prevent that damage and remove a +1/+1 counter from {this}";
+ }
+
+ public UndergrowthChampionPreventionEffect(final UndergrowthChampionPreventionEffect effect) {
+ super(effect);
+ this.turn = effect.turn;
+ this.combatPhaseStep = effect.combatPhaseStep;
+ }
+
+ @Override
+ public UndergrowthChampionPreventionEffect copy() {
+ return new UndergrowthChampionPreventionEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return true;
+ }
+
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ Permanent permanent = game.getPermanent(source.getSourceId());
+ if (permanent != null) {
+ boolean removeCounter = true;
+ // check if in the same combat damage step already a counter was removed
+ if (game.getTurn().getPhase().getStep().getType().equals(PhaseStep.COMBAT_DAMAGE)) {
+ if (game.getTurnNum() == turn
+ && game.getTurn().getStep().equals(combatPhaseStep)) {
+ removeCounter = false;
+ } else {
+ turn = game.getTurnNum();
+ combatPhaseStep = game.getTurn().getStep();
+ }
+ }
+
+ if(removeCounter && permanent.getCounters().containsKey(CounterType.P1P1)) {
+ preventDamageAction(event, source, game);
+ StringBuilder sb = new StringBuilder(permanent.getName()).append(": ");
+ permanent.removeCounters(CounterType.P1P1.createInstance(), game);
+ sb.append("Removed a +1/+1 counter ");
+ game.informPlayers(sb.toString());
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ if (super.applies(event, source, game)) {
+ if (event.getTargetId().equals(source.getSourceId())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/UnifiedFront.java b/Mage.Sets/src/mage/sets/battleforzendikar/UnifiedFront.java
new file mode 100644
index 00000000000..a80690b6504
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/UnifiedFront.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.cards.CardImpl;
+import mage.constants.AbilityWord;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class UnifiedFront extends CardImpl {
+
+ public UnifiedFront(UUID ownerId) {
+ super(ownerId, 53, "Unified Front", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Converge — Put a 1/1 white Kor Ally creature token onto the battlefield for each color of mana spent to cast Unified Front.
+ getSpellAbility().setAbilityWord(AbilityWord.CONVERGE);
+ Effect effect = new CreateTokenEffect(new KorAllyToken(), ColorsOfManaSpentToCastCount.getInstance());
+ effect.setText("Put a 1/1 white Kor Ally creature token onto the battlefield for each color of mana spent to cast {this}");
+ getSpellAbility().addEffect(effect);
+ }
+
+ public UnifiedFront(final UnifiedFront card) {
+ super(card);
+ }
+
+ @Override
+ public UnifiedFront copy() {
+ return new UnifiedFront(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/UnnaturalAggression.java b/Mage.Sets/src/mage/sets/battleforzendikar/UnnaturalAggression.java
new file mode 100644
index 00000000000..2bc63e6feed
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/UnnaturalAggression.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.ReplacementEffectImpl;
+import mage.abilities.effects.common.FightTargetsEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.events.ZoneChangeEvent;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetControlledCreaturePermanent;
+import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class UnnaturalAggression extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public UnnaturalAggression(UUID ownerId) {
+ super(ownerId, 168, "Unnatural Aggression", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{G}");
+ this.expansionSetCode = "BFZ";
+
+ // Devoid
+ Ability ability = new DevoidAbility(this.color);
+ ability.setRuleAtTheTop(true);
+ this.addAbility(ability);
+ // Target creature you control fights target creature an opponent controls.
+ this.getSpellAbility().addEffect(new FightTargetsEffect());
+ this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
+ // If the creature an opponent controls would die this turn, exile it instead.
+ this.getSpellAbility().addEffect(new DealtDamageToOpponentsCreatureDiesEffect(Duration.EndOfTurn));
+ }
+
+ public UnnaturalAggression(final UnnaturalAggression card) {
+ super(card);
+ }
+
+ @Override
+ public UnnaturalAggression copy() {
+ return new UnnaturalAggression(this);
+ }
+}
+
+class DealtDamageToOpponentsCreatureDiesEffect extends ReplacementEffectImpl {
+
+ public DealtDamageToOpponentsCreatureDiesEffect(Duration duration) {
+ super(Duration.EndOfTurn, Outcome.Exile);
+ staticText = "If the creature an opponent controls would die this turn, exile it instead";
+ }
+
+ public DealtDamageToOpponentsCreatureDiesEffect(final DealtDamageToOpponentsCreatureDiesEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public DealtDamageToOpponentsCreatureDiesEffect copy() {
+ return new DealtDamageToOpponentsCreatureDiesEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return true;
+ }
+
+ @Override
+ public void init(Ability source, Game game) {
+ super.init(source, game);
+ Permanent opponentCreature = game.getPermanent(source.getTargets().get(1).getFirstTarget());
+ if (opponentCreature != null) {
+ this.setTargetPointer(new FixedTarget(opponentCreature, game));
+ } else {
+ discard();
+ }
+ }
+
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ Permanent permanent = ((ZoneChangeEvent) event).getTarget();
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null && permanent != null) {
+ return controller.moveCards(permanent, null, Zone.EXILED, source, game);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.ZONE_CHANGE;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ ZoneChangeEvent zce = (ZoneChangeEvent) event;
+ return zce.isDiesEvent() && zce.getTargetId().equals(getTargetPointer().getFirst(game, source));
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ValakutInvoker.java b/Mage.Sets/src/mage/sets/battleforzendikar/ValakutInvoker.java
new file mode 100644
index 00000000000..e974588fa5e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ValakutInvoker.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ValakutInvoker extends CardImpl {
+
+ public ValakutInvoker(UUID ownerId) {
+ super(ownerId, 159, "Valakut Invoker", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Shaman");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // {8}: Valakut Invoker deals 3 damage to target creature or player.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(3), new GenericManaCost(8));
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public ValakutInvoker(final ValakutInvoker card) {
+ super(card);
+ }
+
+ @Override
+ public ValakutInvoker copy() {
+ return new ValakutInvoker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ValakutPredator.java b/Mage.Sets/src/mage/sets/battleforzendikar/ValakutPredator.java
new file mode 100644
index 00000000000..21e53fa69eb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ValakutPredator.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ValakutPredator extends CardImpl {
+
+ public ValakutPredator(UUID ownerId) {
+ super(ownerId, 160, "Valakut Predator", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elemental");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Landfall - Whenever a land enters the battlefield under your control, Valakut Predator gets +2/+2 until end of turn.
+ this.addAbility(new LandfallAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), false));
+ }
+
+ public ValakutPredator(final ValakutPredator card) {
+ super(card);
+ }
+
+ @Override
+ public ValakutPredator copy() {
+ return new ValakutPredator(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/VampiricRites.java b/Mage.Sets/src/mage/sets/battleforzendikar/VampiricRites.java
new file mode 100644
index 00000000000..349e6d21773
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/VampiricRites.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class VampiricRites extends CardImpl {
+
+ public VampiricRites(UUID ownerId) {
+ super(ownerId, 124, "Vampiric Rites", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{B}");
+ this.expansionSetCode = "BFZ";
+
+ // {1}{B}, Sacrifice a creature: You gain 1 life and draw a card.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(1), new ManaCostsImpl<>("{1}{B}"));
+ ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(new FilterControlledCreaturePermanent("a creature"))));
+ Effect effect = new DrawCardSourceControllerEffect(1);
+ effect.setText("and draw a card");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public VampiricRites(final VampiricRites card) {
+ super(card);
+ }
+
+ @Override
+ public VampiricRites copy() {
+ return new VampiricRites(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/VestigeOfEmrakul.java b/Mage.Sets/src/mage/sets/battleforzendikar/VestigeOfEmrakul.java
new file mode 100644
index 00000000000..3f49bcfc75c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/VestigeOfEmrakul.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class VestigeOfEmrakul extends CardImpl {
+
+ public VestigeOfEmrakul(UUID ownerId) {
+ super(ownerId, 136, "Vestige of Emrakul", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(4);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ }
+
+ public VestigeOfEmrakul(final VestigeOfEmrakul card) {
+ super(card);
+ }
+
+ @Override
+ public VestigeOfEmrakul copy() {
+ return new VestigeOfEmrakul(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/VeteranWarleader.java b/Mage.Sets/src/mage/sets/battleforzendikar/VeteranWarleader.java
new file mode 100644
index 00000000000..e46455b6092
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/VeteranWarleader.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class VeteranWarleader extends mage.sets.zendikarvseldrazi.VeteranWarleader {
+
+ public VeteranWarleader(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 221;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public VeteranWarleader(final VeteranWarleader card) {
+ super(card);
+ }
+
+ @Override
+ public VeteranWarleader copy() {
+ return new VeteranWarleader(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/VileAggregate.java b/Mage.Sets/src/mage/sets/battleforzendikar/VileAggregate.java
new file mode 100644
index 00000000000..60d925eb737
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/VileAggregate.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.SetPowerSourceEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.IngestAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class VileAggregate extends CardImpl {
+
+ private final static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("colorless creatures you control");
+
+ static {
+ filter.add(new ColorlessPredicate());
+ }
+
+ public VileAggregate(UUID ownerId) {
+ super(ownerId, 137, "Vile Aggregate", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(5);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+ // Vile Aggregate's power is equal to the number of colorless creatures you control.
+ Effect effect = new SetPowerSourceEffect(new PermanentsOnBattlefieldCount(filter), Duration.EndOfGame);
+ this.addAbility(new SimpleStaticAbility(Zone.ALL, effect));
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // Ingest
+ this.addAbility(new IngestAbility());
+ }
+
+ public VileAggregate(final VileAggregate card) {
+ super(card);
+ }
+
+ @Override
+ public VileAggregate copy() {
+ return new VileAggregate(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/VoidAttendant.java b/Mage.Sets/src/mage/sets/battleforzendikar/VoidAttendant.java
new file mode 100644
index 00000000000..44baa72841d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/VoidAttendant.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.ExileOpponentsCardFromExileToGraveyardCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.permanent.token.EldraziScionToken;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class VoidAttendant extends CardImpl {
+
+ public VoidAttendant(UUID ownerId) {
+ super(ownerId, 169, "Void Attendant", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Processor");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // {1}{G}, Put a card an opponent owns from exile into that player's graveyard: Put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."
+ Effect effect = new CreateTokenEffect(new EldraziScionToken());
+ effect.setText("put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has \"Sacrifice this creature: Add {1} to your mana pool.\"");
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{1}{G}"));
+ ability.addCost(new ExileOpponentsCardFromExileToGraveyardCost(true));
+ this.addAbility(ability);
+
+ }
+
+ public VoidAttendant(final VoidAttendant card) {
+ super(card);
+ }
+
+ @Override
+ public VoidAttendant copy() {
+ return new VoidAttendant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/VoidWinnower.java b/Mage.Sets/src/mage/sets/battleforzendikar/VoidWinnower.java
new file mode 100644
index 00000000000..474486e7019
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/VoidWinnower.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
+import mage.abilities.effects.RestrictionEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.permanent.Permanent;
+import mage.game.stack.Spell;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class VoidWinnower extends CardImpl {
+
+ public VoidWinnower(UUID ownerId) {
+ super(ownerId, 17, "Void Winnower", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{9}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+
+ this.power = new MageInt(11);
+ this.toughness = new MageInt(9);
+
+ // Your opponent can't cast spells with even converted mana costs. (Zero is even.)
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new VoidWinnowerCantCastEffect()));
+
+ // Your opponents can't block with creatures with even converted mana costs.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new VoidWinnowerCantBlockEffect()));
+ }
+
+ public VoidWinnower(final VoidWinnower card) {
+ super(card);
+ }
+
+ @Override
+ public VoidWinnower copy() {
+ return new VoidWinnower(this);
+ }
+}
+
+class VoidWinnowerCantCastEffect extends ContinuousRuleModifyingEffectImpl {
+
+ public VoidWinnowerCantCastEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Benefit);
+ staticText = "Your opponent can't cast spells with even converted mana costs. (Zero is even.)";
+ }
+
+ public VoidWinnowerCantCastEffect(final VoidWinnowerCantCastEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public VoidWinnowerCantCastEffect copy() {
+ return new VoidWinnowerCantCastEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return true;
+ }
+
+ @Override
+ public String getInfoMessage(Ability source, GameEvent event, Game game) {
+ MageObject mageObject = game.getObject(source.getSourceId());
+ if (mageObject != null) {
+ return "You can't cast spells with even converted mana costs (" + mageObject.getIdName() + ").";
+ }
+ return null;
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.CAST_SPELL_LATE;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ if (game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) {
+ Spell spell = game.getStack().getSpell(event.getTargetId());
+ if (spell != null) {
+ // the low bit will always be set on an odd number.
+ return (spell.getConvertedManaCost() & 1) == 0;
+ }
+ }
+ return false;
+ }
+}
+
+class VoidWinnowerCantBlockEffect extends RestrictionEffect {
+
+ public VoidWinnowerCantBlockEffect() {
+ super(Duration.WhileOnBattlefield);
+ staticText = "Your opponents can't block with creatures with even converted mana costs";
+ }
+
+ public VoidWinnowerCantBlockEffect(final VoidWinnowerCantBlockEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public VoidWinnowerCantBlockEffect copy() {
+ return new VoidWinnowerCantBlockEffect(this);
+ }
+
+ @Override
+ public boolean applies(Permanent permanent, Ability source, Game game) {
+ if (game.getOpponents(source.getControllerId()).contains(permanent.getControllerId())) {
+ // the low bit will always be set on an odd number.
+ return (permanent.getManaCost().convertedManaCost() & 1) == 0;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) {
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/VolcanicUpheaval.java b/Mage.Sets/src/mage/sets/battleforzendikar/VolcanicUpheaval.java
new file mode 100644
index 00000000000..dfb56c8fb84
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/VolcanicUpheaval.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetLandPermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class VolcanicUpheaval extends CardImpl {
+
+ public VolcanicUpheaval(UUID ownerId) {
+ super(ownerId, 161, "Volcanic Upheaval", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{3}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Destroy target land.
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
+ this.getSpellAbility().addTarget(new TargetLandPermanent());
+
+ }
+
+ public VolcanicUpheaval(final VolcanicUpheaval card) {
+ super(card);
+ }
+
+ @Override
+ public VolcanicUpheaval copy() {
+ return new VolcanicUpheaval(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/VoraciousNull.java b/Mage.Sets/src/mage/sets/battleforzendikar/VoraciousNull.java
new file mode 100644
index 00000000000..e8ddb52479b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/VoraciousNull.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateAsSorceryActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class VoraciousNull extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature");
+
+ static {
+ filter.add(new AnotherPredicate());
+ }
+
+ public VoraciousNull(UUID ownerId) {
+ super(ownerId, 125, "Voracious Null", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Zombie");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {1}{B}, Sacrifice another creature: Put two +1/+1 counters on Voracious Null. Activate this ability only any time you could cast a sorcery.
+ Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)), new ManaCostsImpl("{1}{B}"));
+ ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, false)));
+ this.addAbility(ability);
+ }
+
+ public VoraciousNull(final VoraciousNull card) {
+ super(card);
+ }
+
+ @Override
+ public VoraciousNull copy() {
+ return new VoraciousNull(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/WastelandStrangler.java b/Mage.Sets/src/mage/sets/battleforzendikar/WastelandStrangler.java
new file mode 100644
index 00000000000..739f0d27721
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/WastelandStrangler.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.costs.common.ExileOpponentsCardFromExileToGraveyardCost;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class WastelandStrangler extends CardImpl {
+
+ public WastelandStrangler(UUID ownerId) {
+ super(ownerId, 102, "Wasteland Strangler", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Processor");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // When Wasteland Strangler enters the battlefield, you may put a card an opponent owns from exile into that player's graveyard. If you do, target creature gets -3/-3 until end of turn.
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new DoIfCostPaid(new BoostTargetEffect(-3, -3, Duration.EndOfTurn), new ExileOpponentsCardFromExileToGraveyardCost(true)), true);
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public WastelandStrangler(final WastelandStrangler card) {
+ super(card);
+ }
+
+ @Override
+ public WastelandStrangler copy() {
+ return new WastelandStrangler(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/WaveWingElemental.java b/Mage.Sets/src/mage/sets/battleforzendikar/WaveWingElemental.java
new file mode 100644
index 00000000000..6baccf24d65
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/WaveWingElemental.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class WaveWingElemental extends CardImpl {
+
+ public WaveWingElemental(UUID ownerId) {
+ super(ownerId, 88, "Wave-Wing Elemental", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elemental");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(4);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // Landfall — Whenever a land enters the battlefield under your control, Wave-Wing Elemental gets +2/+2 until end of turn.
+ this.addAbility(new LandfallAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), false));
+
+ }
+
+ public WaveWingElemental(final WaveWingElemental card) {
+ super(card);
+ }
+
+ @Override
+ public WaveWingElemental copy() {
+ return new WaveWingElemental(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/WindriderPatrol.java b/Mage.Sets/src/mage/sets/battleforzendikar/WindriderPatrol.java
new file mode 100644
index 00000000000..bde6805b885
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/WindriderPatrol.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
+import mage.abilities.effects.keyword.ScryEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class WindriderPatrol extends CardImpl {
+
+ public WindriderPatrol(UUID ownerId) {
+ super(ownerId, 89, "Windrider Patrol", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{U}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Merfolk");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(3);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // Whenever Windrider Patrol deals combat damage to a player, scry 2.
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new ScryEffect(2), false));
+ }
+
+ public WindriderPatrol(final WindriderPatrol card) {
+ super(card);
+ }
+
+ @Override
+ public WindriderPatrol copy() {
+ return new WindriderPatrol(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/WoodlandWanderer.java b/Mage.Sets/src/mage/sets/battleforzendikar/WoodlandWanderer.java
new file mode 100644
index 00000000000..0ddd17b5cbf
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/WoodlandWanderer.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.abilities.keyword.VigilanceAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.counters.CounterType;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class WoodlandWanderer extends CardImpl {
+
+ public WoodlandWanderer(UUID ownerId) {
+ super(ownerId, 198, "Woodland Wanderer", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elemental");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Vigilance
+ this.addAbility(VigilanceAbility.getInstance());
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // Converge - Woodland Wanderer enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.
+ this.addAbility(new EntersBattlefieldAbility(
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance(), ColorsOfManaSpentToCastCount.getInstance(), true),
+ null, "Converge — {this} enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.", null));
+ }
+
+ public WoodlandWanderer(final WoodlandWanderer card) {
+ super(card);
+ }
+
+ @Override
+ public WoodlandWanderer copy() {
+ return new WoodlandWanderer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ZadaHedronGrinder.java b/Mage.Sets/src/mage/sets/battleforzendikar/ZadaHedronGrinder.java
new file mode 100644
index 00000000000..e20744b3694
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ZadaHedronGrinder.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.Mode;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.game.stack.Spell;
+import mage.players.Player;
+import mage.target.Target;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ZadaHedronGrinder extends CardImpl {
+
+ public ZadaHedronGrinder(UUID ownerId) {
+ super(ownerId, 162, "Zada, Hedron Grinder", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{R}");
+ this.expansionSetCode = "BFZ";
+ this.supertype.add("Legendary");
+ this.subtype.add("Goblin");
+ this.subtype.add("Ally");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Whenever you cast an instant or sorcery spell that targets only Zada, Hedron Grinder, copy that spell for each other creature you control that the spell could target. Each copy targets a different one of those creatures.
+ this.addAbility(new ZadaHedronGrinderTriggeredAbility());
+
+ }
+
+ public ZadaHedronGrinder(final ZadaHedronGrinder card) {
+ super(card);
+ }
+
+ @Override
+ public ZadaHedronGrinder copy() {
+ return new ZadaHedronGrinder(this);
+ }
+}
+
+class ZadaHedronGrinderTriggeredAbility extends TriggeredAbilityImpl {
+
+ ZadaHedronGrinderTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new ZadaHedronGrinderEffect(), false);
+ }
+
+ ZadaHedronGrinderTriggeredAbility(final ZadaHedronGrinderTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public ZadaHedronGrinderTriggeredAbility copy() {
+ return new ZadaHedronGrinderTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.SPELL_CAST;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (event.getPlayerId().equals(this.getControllerId())) {
+ Spell spell = game.getStack().getSpell(event.getTargetId());
+ if (isControlledInstantOrSorcery(spell)) {
+ boolean targetsSource = false;
+ for (Mode mode : spell.getSpellAbility().getModes().getSelectedModes()) {
+ for (Target target : mode.getTargets()) {
+ for (UUID targetId : target.getTargets()) {
+ if (targetId.equals(getSourceId())) {
+ targetsSource = true;
+ } else {
+ return false;
+ }
+ }
+ }
+ }
+ if (targetsSource) {
+ this.getEffects().get(0).setTargetPointer(new FixedTarget(spell.getId()));
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean isControlledInstantOrSorcery(Spell spell) {
+ return spell != null
+ && (spell.getControllerId().equals(this.getControllerId()))
+ && (spell.getCardType().contains(CardType.INSTANT) || spell.getCardType().contains(CardType.SORCERY));
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever you cast an instant or sorcery spell that targets only {this}, copy that spell for each other creature you control that the spell could target. Each copy targets a different one of those creatures.";
+ }
+}
+
+class ZadaHedronGrinderEffect extends OneShotEffect {
+
+ public ZadaHedronGrinderEffect() {
+ super(Outcome.Detriment);
+ this.staticText = "copy that spell for each other creature you control that the spell could target. Each copy targets a different one of those creatures";
+ }
+
+ public ZadaHedronGrinderEffect(final ZadaHedronGrinderEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public ZadaHedronGrinderEffect copy() {
+ return new ZadaHedronGrinderEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Spell spell = game.getStack().getSpell(targetPointer.getFirst(game, source));
+ if (spell == null) {
+ spell = (Spell) game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.STACK);
+ }
+ Player controller = game.getPlayer(source.getControllerId());
+ if (spell != null && controller != null) {
+ Target usedTarget = null;
+ setUsedTarget:
+ for (Mode mode : spell.getSpellAbility().getModes().getSelectedModes()) {
+ for (Target target : mode.getTargets()) {
+ if (target.getFirstTarget().equals(source.getSourceId())) {
+ usedTarget = target.copy();
+ usedTarget.clearChosen();
+ break setUsedTarget;
+ }
+ }
+ }
+ if (usedTarget == null) {
+ return false;
+ }
+ for (Permanent creature : game.getState().getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), game)) {
+ if (!creature.getId().equals(source.getSourceId()) && usedTarget.canTarget(source.getControllerId(), creature.getId(), source, game)) {
+ Spell copy = spell.copySpell();
+ setTarget:
+ for (Mode mode : spell.getSpellAbility().getModes().getSelectedModes()) {
+ for (Target target : mode.getTargets()) {
+ if (target.getClass().equals(usedTarget.getClass())) {
+ target.clearChosen(); // For targets with Max > 1 we need to clear before the text is comapred
+ if (target.getMessage().equals(usedTarget.getMessage())) {
+ target.add(creature.getId(), game);
+ break setTarget;
+ }
+ }
+ }
+ }
+ copy.setControllerId(source.getControllerId());
+ copy.setCopiedSpell(true);
+ game.getStack().push(copy);
+ String activateMessage = copy.getActivatedMessage(game);
+ if (activateMessage.startsWith(" casts ")) {
+ activateMessage = activateMessage.substring(6);
+ }
+ if (!game.isSimulation()) {
+ game.informPlayers(controller.getLogName() + activateMessage);
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ZulaportCutthroat.java b/Mage.Sets/src/mage/sets/battleforzendikar/ZulaportCutthroat.java
new file mode 100644
index 00000000000..0264a61edf6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ZulaportCutthroat.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesThisOrAnotherCreatureTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.LoseLifeOpponentsEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ZulaportCutthroat extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature you control");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.YOU));
+ }
+
+ public ZulaportCutthroat(UUID ownerId) {
+ super(ownerId, 126, "Zulaport Cutthroat", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Rogue");
+ this.subtype.add("Ally");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Whenever Zulaport Cutthroat or another creature you control dies, each opponent loses 1 life and you gain 1 life.
+ Ability ability = new DiesThisOrAnotherCreatureTriggeredAbility(new LoseLifeOpponentsEffect(1), false, filter);
+ Effect effect = new GainLifeEffect(1);
+ effect.setText("and you gain 1 life");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+
+ }
+
+ public ZulaportCutthroat(final ZulaportCutthroat card) {
+ super(card);
+ }
+
+ @Override
+ public ZulaportCutthroat copy() {
+ return new ZulaportCutthroat(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/BlindingPowder.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/BlindingPowder.java
index d1030fbd9c8..727a67b0c6f 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/BlindingPowder.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/BlindingPowder.java
@@ -61,7 +61,7 @@ public class BlindingPowder extends CardImpl {
// Equipped creature has "Unattach Blinding Powder: Prevent all combat damage that would be dealt to this creature this turn."
Effect effect = new PreventCombatDamageToSourceEffect(Duration.EndOfTurn);
effect.setText("Prevent all combat damage that would be dealt to this creature this turn");
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new BlindingPowderUnattachCost());
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new BlindingPowderUnattachCost(getName(), getId()));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(ability, AttachmentType.EQUIPMENT, Duration.WhileOnBattlefield)));
// Equip {2}
this.addAbility(new EquipAbility(Outcome.PreventDamage, new GenericManaCost(2)));
@@ -79,28 +79,32 @@ public class BlindingPowder extends CardImpl {
class BlindingPowderUnattachCost extends CostImpl {
- public BlindingPowderUnattachCost() {
- this.text = "Unattach Blinding Powder";
+ protected UUID sourceEquipmentId;
+
+ public BlindingPowderUnattachCost(String name, UUID sourceId) {
+ this.text = "Unattach " + name;
+ this.sourceEquipmentId = sourceId;
}
public BlindingPowderUnattachCost(final BlindingPowderUnattachCost cost) {
super(cost);
+ this.sourceEquipmentId = cost.sourceEquipmentId;
}
@Override
public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) {
Permanent permanent = game.getPermanent(sourceId);
if (permanent != null) {
- for (UUID attachmentId :permanent.getAttachments()) {
+ for (UUID attachmentId : permanent.getAttachments()) {
Permanent attachment = game.getPermanent(attachmentId);
- if (attachment != null && attachment.getName().equals("Blinding Powder")) {
+ if (attachment != null && attachment.getId().equals(sourceEquipmentId)) {
paid = permanent.removeAttachment(attachmentId, game);
if (paid) {
break;
}
}
}
-
+
}
return paid;
}
@@ -109,9 +113,9 @@ class BlindingPowderUnattachCost extends CostImpl {
public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) {
Permanent permanent = game.getPermanent(sourceId);
if (permanent != null) {
- for (UUID attachmentId :permanent.getAttachments()) {
+ for (UUID attachmentId : permanent.getAttachments()) {
Permanent attachment = game.getPermanent(attachmentId);
- if (attachment != null && attachment.getName().equals("Blinding Powder")) {
+ if (attachment != null && attachment.getId().equals(sourceEquipmentId)) {
return true;
}
}
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/Floodbringer.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/Floodbringer.java
index fa8a52c1232..cc2eab2da77 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/Floodbringer.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/Floodbringer.java
@@ -31,7 +31,7 @@ import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.TapTargetEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -64,7 +64,7 @@ public class Floodbringer extends CardImpl {
// {2}, Return a land you control to its owner's hand: Tap target land.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TapTargetEffect(), new GenericManaCost(2));
- ReturnToHandTargetPermanentCost cost = new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter));
+ ReturnToHandChosenControlledPermanentCost cost = new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter));
cost.setText("Return a land you control to its owner's hand");
ability.addCost(cost);
ability.addTarget(new TargetLandPermanent());
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/FumikoTheLowblood.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/FumikoTheLowblood.java
index aa93e4cf8d5..02af73fe030 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/FumikoTheLowblood.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/FumikoTheLowblood.java
@@ -40,6 +40,7 @@ import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.watchers.common.AttackedThisTurnWatcher;
/**
*
@@ -63,7 +64,7 @@ public class FumikoTheLowblood extends CardImpl {
// Creatures your opponents control attack each turn if able.
FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures your opponents control");
filter.add(new ControllerPredicate(TargetController.OPPONENT));
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AttacksIfAbleAllEffect(filter)));
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AttacksIfAbleAllEffect(filter)), new AttackedThisTurnWatcher());
}
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/GenjuOfTheRealm.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/GenjuOfTheRealm.java
index d973dc72a98..6afd9f2b81a 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/GenjuOfTheRealm.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/GenjuOfTheRealm.java
@@ -62,6 +62,7 @@ public class GenjuOfTheRealm extends CardImpl {
super(ownerId, 151, "Genju of the Realm", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{W}{U}{B}{R}{G}");
this.expansionSetCode = "BOK";
this.subtype.add("Aura");
+ this.supertype.add("Legendary");
// Enchant Land
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/GoryosVengeance.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/GoryosVengeance.java
index 87999170a71..16bef199b09 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/GoryosVengeance.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/GoryosVengeance.java
@@ -70,7 +70,6 @@ public class GoryosVengeance extends CardImpl {
this.expansionSetCode = "BOK";
this.subtype.add("Arcane");
-
// Return target legendary creature card from your graveyard to the battlefield. That creature gains haste. Exile it at the beginning of the next end step.
this.getSpellAbility().addEffect(new GoryosVengeanceEffect());
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter));
@@ -111,16 +110,16 @@ class GoryosVengeanceEffect extends OneShotEffect {
if (controller != null) {
Card card = game.getCard(targetPointer.getFirst(game, source));
if (card != null) {
- if (controller.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId())) {
+ if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) {
Permanent permanent = game.getPermanent(card.getId());
if (permanent != null) {
// Haste
ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom);
- effect.setTargetPointer(new FixedTarget(permanent.getId()));
+ effect.setTargetPointer(new FixedTarget(permanent, game));
game.addEffect(effect, source);
// Exile it at end of turn
- Effect exileEffect = new ExileTargetEffect(new StringBuilder("Exile ").append(permanent.getName()).append(" at the beginning of the next end step").toString());
- exileEffect.setTargetPointer(new FixedTarget(card.getId()));
+ Effect exileEffect = new ExileTargetEffect("Exile " + permanent.getName() + " at the beginning of the next end step");
+ exileEffect.setTargetPointer(new FixedTarget(permanent, game));
DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect);
delayedAbility.setSourceId(source.getSourceId());
delayedAbility.setControllerId(source.getControllerId());
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/HokoriDustDrinker.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/HokoriDustDrinker.java
index 62bb2f97366..6a126e4d3de 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/HokoriDustDrinker.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/HokoriDustDrinker.java
@@ -62,7 +62,7 @@ public class HokoriDustDrinker extends CardImpl {
this.subtype.add("Spirit");
this.power = new MageInt(2);
- this.toughness = new MageInt(1);
+ this.toughness = new MageInt(2);
// Lands don't untap during their controllers' untap steps.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, new FilterLandPermanent("Lands"))));
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/IwamoriOfTheOpenFist.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/IwamoriOfTheOpenFist.java
index 98bc1dbe5f7..b37336ee341 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/IwamoriOfTheOpenFist.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/IwamoriOfTheOpenFist.java
@@ -84,26 +84,26 @@ public class IwamoriOfTheOpenFist extends CardImpl {
class IwamoriOfTheOpenFistEffect extends OneShotEffect {
private static final FilterCard filter = new FilterCard("legendary creature card");
-
+
static {
filter.add(new SupertypePredicate("Legendary"));
filter.add(new CardTypePredicate(CardType.CREATURE));
}
-
+
public IwamoriOfTheOpenFistEffect() {
super(Outcome.Detriment);
this.staticText = "each opponent may put a legendary creature card from his or her hand onto the battlefield";
}
-
+
public IwamoriOfTheOpenFistEffect(final IwamoriOfTheOpenFistEffect effect) {
super(effect);
}
-
+
@Override
public IwamoriOfTheOpenFistEffect copy() {
return new IwamoriOfTheOpenFistEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
@@ -123,14 +123,7 @@ class IwamoriOfTheOpenFistEffect extends OneShotEffect {
}
}
}
- if (cards.size() > 0) {
- for (Card card: cards.getCards(game)) {
- Player player = game.getPlayer(card.getOwnerId());
- if (player != null) {
- player.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId());
- }
- }
- }
+ controller.moveCards(cards.getCards(game), Zone.BATTLEFIELD, source, game, false, false, true, null);
return true;
}
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/KiraGreatGlassSpinner.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/KiraGreatGlassSpinner.java
index abdfe0da0fe..1c2c466eeb1 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/KiraGreatGlassSpinner.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/KiraGreatGlassSpinner.java
@@ -31,8 +31,10 @@ import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import mage.MageInt;
+import mage.MageObjectReference;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CounterTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -40,12 +42,15 @@ import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
+import mage.constants.WatcherScope;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
-import mage.target.TargetStackObject;
+import mage.game.permanent.Permanent;
+import mage.target.targetpointer.FixedTarget;
+import mage.watchers.Watcher;
/**
*
@@ -59,7 +64,6 @@ public class KiraGreatGlassSpinner extends CardImpl {
this.subtype.add("Spirit");
this.supertype.add("Legendary");
-
this.power = new MageInt(2);
this.toughness = new MageInt(2);
@@ -67,7 +71,10 @@ public class KiraGreatGlassSpinner extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Creatures you control have "Whenever this creature becomes the target of a spell or ability for the first time in a turn, counter that spell or ability."
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(new KiraGreatGlassSpinnerAbility(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures you control"))));
+ Effect effect = new CounterTargetEffect();
+ effect.setText("counter that spell or ability");
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(new KiraGreatGlassSpinnerAbility(effect), Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures you control"))),
+ new CreatureWasTargetedThisTurnWatcher());
}
@@ -80,21 +87,15 @@ public class KiraGreatGlassSpinner extends CardImpl {
return new KiraGreatGlassSpinner(this);
}
}
-// TODO:
-// not perfectly implemented. It doesnt't handles if a creature was already targeted the turn Kira comes into play.
-// Maybe it's better to implement it with a watcher
class KiraGreatGlassSpinnerAbility extends TriggeredAbilityImpl {
- protected Map turnUsed = new HashMap<>();
-
- public KiraGreatGlassSpinnerAbility() {
- super(Zone.BATTLEFIELD, new CounterTargetEffect(), false);
+ public KiraGreatGlassSpinnerAbility(Effect effect) {
+ super(Zone.BATTLEFIELD, effect, false);
}
public KiraGreatGlassSpinnerAbility(final KiraGreatGlassSpinnerAbility ability) {
super(ability);
- turnUsed = ability.turnUsed;
}
@Override
@@ -110,20 +111,15 @@ class KiraGreatGlassSpinnerAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getTargetId().equals(this.getSourceId())) {
- Integer turn = turnUsed.get(event.getTargetId());
- if (turn == null || turn < game.getTurnNum()) {
- this.getTargets().clear();
- TargetStackObject target = new TargetStackObject();
- target.add(event.getSourceId(), game);
- this.addTarget(target);
- if (turnUsed.containsKey(event.getTargetId())) {
- turnUsed.remove(event.getTargetId());
- turnUsed.put(event.getTargetId(), game.getTurnNum());
- } else {
- turnUsed.put(event.getTargetId(), game.getTurnNum());
+ Permanent permanent = game.getPermanent(event.getTargetId());
+ if (permanent != null && permanent.getCardType().contains(CardType.CREATURE)) {
+ CreatureWasTargetedThisTurnWatcher watcher = (CreatureWasTargetedThisTurnWatcher) game.getState().getWatchers().get("CreatureWasTargetedThisTurn");
+ if (watcher != null && watcher.notMoreThanOnceTargetedThisTurn(permanent, game)) {
+ for (Effect effect : getEffects()) {
+ effect.setTargetPointer(new FixedTarget(event.getSourceId()));
+ }
+ return true;
}
-
- return true;
}
}
return false;
@@ -135,3 +131,50 @@ class KiraGreatGlassSpinnerAbility extends TriggeredAbilityImpl {
}
}
+
+class CreatureWasTargetedThisTurnWatcher extends Watcher {
+
+ private final Map creaturesTargeted = new HashMap<>();
+
+ public CreatureWasTargetedThisTurnWatcher() {
+ super("CreatureWasTargetedThisTurn", WatcherScope.GAME);
+ }
+
+ public CreatureWasTargetedThisTurnWatcher(final CreatureWasTargetedThisTurnWatcher watcher) {
+ super(watcher);
+ this.creaturesTargeted.putAll(creaturesTargeted);
+ }
+
+ @Override
+ public void watch(GameEvent event, Game game) {
+ if (event.getType() == GameEvent.EventType.TARGETED) {
+ Permanent permanent = game.getPermanent(event.getTargetId());
+ if (permanent != null && permanent.getCardType().contains(CardType.CREATURE)) {
+ MageObjectReference mor = new MageObjectReference(permanent, game);
+ int amount = 0;
+ if (creaturesTargeted.containsKey(mor)) {
+ amount = creaturesTargeted.get(mor);
+ }
+ creaturesTargeted.put(mor, ++amount);
+ }
+ }
+ }
+
+ public boolean notMoreThanOnceTargetedThisTurn(Permanent creature, Game game) {
+ if (creaturesTargeted.containsKey(new MageObjectReference(creature, game))) {
+ return creaturesTargeted.get(new MageObjectReference(creature, game)) < 2;
+ }
+ return true;
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ creaturesTargeted.clear();
+ }
+
+ @Override
+ public CreatureWasTargetedThisTurnWatcher copy() {
+ return new CreatureWasTargetedThisTurnWatcher(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/KitsunePalliator.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/KitsunePalliator.java
index 4940e8ce24f..9af055fbbd3 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/KitsunePalliator.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/KitsunePalliator.java
@@ -39,8 +39,6 @@ import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.PreventDamageToTargetEffect;
import mage.cards.CardImpl;
import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.filter.predicate.permanent.ControllerPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@@ -52,12 +50,6 @@ import mage.target.targetpointer.FixedTarget;
*/
public class KitsunePalliator extends CardImpl {
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Samurai you control");
- static {
- filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new SubtypePredicate("Samurai"));
- }
-
public KitsunePalliator(UUID ownerId) {
super(ownerId, 14, "Kitsune Palliator", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{W}");
this.expansionSetCode = "BOK";
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/MinamoSightbender.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/MinamoSightbender.java
index 10062690021..60331f9d608 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/MinamoSightbender.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/MinamoSightbender.java
@@ -28,9 +28,6 @@
package mage.sets.betrayersofkamigawa;
import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -39,6 +36,8 @@ import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.Filter;
import mage.filter.common.FilterCreaturePermanent;
@@ -54,6 +53,7 @@ import mage.target.common.TargetCreaturePermanent;
public class MinamoSightbender extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power X or less");
+ private final UUID originalId;
public MinamoSightbender(UUID ownerId) {
super(ownerId, 41, "Minamo Sightbender", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}");
@@ -62,26 +62,27 @@ public class MinamoSightbender extends CardImpl {
this.subtype.add("Wizard");
this.power = new MageInt(1);
- this.toughness = new MageInt(1);
+ this.toughness = new MageInt(2);
// {X}, {T}: Target creature with power X or less can't be blocked this turn.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBeBlockedTargetEffect(), new ManaCostsImpl("{X}"));
Target target = new TargetCreaturePermanent(filter);
ability.addTarget(target);
ability.addCost(new TapSourceCost());
+ originalId = ability.getOriginalId();
this.addAbility(ability);
}
@Override
public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SimpleActivatedAbility) {
- for (Effect effect :ability.getEffects()) {
+ if (ability.getOriginalId().equals(originalId)) {
+ for (Effect effect : ability.getEffects()) {
if (effect instanceof CantBeBlockedTargetEffect) {
int manaX = ability.getManaCostsToPay().getX();
ability.getTargets().clear();
FilterCreaturePermanent newFilter = new FilterCreaturePermanent(new StringBuilder("creature with power ").append(manaX).append(" or less").toString());
- filter.add(new PowerPredicate(Filter.ComparisonType.LessThan, manaX +1));
+ filter.add(new PowerPredicate(Filter.ComparisonType.LessThan, manaX + 1));
Target target = new TargetCreaturePermanent(newFilter);
ability.addTarget(target);
break;
@@ -92,6 +93,7 @@ public class MinamoSightbender extends CardImpl {
public MinamoSightbender(final MinamoSightbender card) {
super(card);
+ this.originalId = card.originalId;
}
@Override
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/OrbOfDreams.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/OrbOfDreams.java
index b896f12a2c3..487d04fcf35 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/OrbOfDreams.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/OrbOfDreams.java
@@ -28,13 +28,17 @@
package mage.sets.betrayersofkamigawa;
import java.util.UUID;
-
-import mage.constants.*;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.game.Game;
+import mage.game.events.EntersTheBattlefieldEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
@@ -47,7 +51,7 @@ public class OrbOfDreams extends CardImpl {
public OrbOfDreams(UUID ownerId) {
super(ownerId, 156, "Orb of Dreams", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{3}");
this.expansionSetCode = "BOK";
-
+
// Permanents enter the battlefield tapped.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new OrbOfDreamsEffect()));
}
@@ -60,7 +64,7 @@ public class OrbOfDreams extends CardImpl {
public OrbOfDreams copy() {
return new OrbOfDreams(this);
}
-
+
private class OrbOfDreamsEffect extends ReplacementEffectImpl {
OrbOfDreamsEffect() {
@@ -79,23 +83,22 @@ public class OrbOfDreams extends CardImpl {
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- Permanent permanent = game.getPermanent(event.getTargetId());
+ Permanent permanent = ((EntersTheBattlefieldEvent) event).getTarget();
if (permanent != null) {
permanent.setTapped(true);
}
return false;
}
-
+
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
}
-
+
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
return true;
}
- }
+ }
}
-
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/OrnateKanzashi.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/OrnateKanzashi.java
index 504916c8d76..29b2018d772 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/OrnateKanzashi.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/OrnateKanzashi.java
@@ -79,6 +79,7 @@ public class OrnateKanzashi extends CardImpl {
}
}
+
class OrnateKanzashiEffect extends OneShotEffect {
public OrnateKanzashiEffect() {
@@ -98,14 +99,14 @@ class OrnateKanzashiEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player opponent = game.getPlayer(targetPointer.getFirst(game, source));
- MageObject sourceObject = game.getObject(source.getSourceId());
+ MageObject sourceObject = game.getObject(source.getSourceId());
if (sourceObject != null && opponent != null) {
if (opponent.getLibrary().size() > 0) {
Library library = opponent.getLibrary();
Card card = library.getFromTop(game);
if (card != null) {
opponent.moveCardToExileWithInfo(card, source.getSourceId(), sourceObject.getName(), source.getSourceId(), game, Zone.LIBRARY, true);
- ContinuousEffect effect = new OrnateKanzashiCastFromExileEffect(card.getId());
+ ContinuousEffect effect = new OrnateKanzashiCastFromExileEffect();
effect.setTargetPointer(new FixedTarget(card.getId()));
game.addEffect(effect, source);
}
@@ -118,7 +119,7 @@ class OrnateKanzashiEffect extends OneShotEffect {
class OrnateKanzashiCastFromExileEffect extends AsThoughEffectImpl {
- public OrnateKanzashiCastFromExileEffect(UUID cardId) {
+ public OrnateKanzashiCastFromExileEffect() {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit);
staticText = "You may play that card from exile this turn";
}
@@ -139,6 +140,7 @@ class OrnateKanzashiCastFromExileEffect extends AsThoughEffectImpl {
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
- return source.getControllerId().equals(affectedControllerId) && objectId.equals(getTargetPointer().getFirst(game, source));
+ return source.getControllerId().equals(affectedControllerId)
+ && objectId.equals(getTargetPointer().getFirst(game, source));
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/PatronOfTheMoon.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/PatronOfTheMoon.java
index 826408a71be..f6d16875adc 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/PatronOfTheMoon.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/PatronOfTheMoon.java
@@ -35,8 +35,8 @@ import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.OfferingAbility;
-import mage.cards.Card;
import mage.cards.CardImpl;
+import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
@@ -100,13 +100,8 @@ class PatronOfTheMoonEffect extends OneShotEffect {
if (controller != null) {
TargetCard target = new TargetCardInHand(0, 2, new FilterLandCard("up to two land cards to put onto the battlefield tapped"));
controller.chooseTarget(outcome, controller.getHand(), target, source, game);
- for (UUID cardId : target.getTargets()) {
- Card card = game.getCard(cardId);
- if (card != null) {
- controller.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId(), true);
- }
- }
- return true;
+ return controller.moveCards(new CardsImpl(target.getTargets()).getCards(game),
+ Zone.BATTLEFIELD, source, game, true, false, false, null);
}
return false;
}
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/QuillmaneBaku.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/QuillmaneBaku.java
index b367b8f020f..f20848de39f 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/QuillmaneBaku.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/QuillmaneBaku.java
@@ -59,6 +59,7 @@ import mage.target.common.TargetCreaturePermanent;
public class QuillmaneBaku extends CardImpl {
private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard();
+ private final UUID originalId;
public QuillmaneBaku(UUID ownerId) {
super(ownerId, 48, "Quillmane Baku", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{U}");
@@ -76,12 +77,13 @@ public class QuillmaneBaku extends CardImpl {
ability.addCost(new TapSourceCost());
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.KI.createInstance(1)));
ability.addTarget(new TargetCreaturePermanent());
+ originalId = ability.getOriginalId();
this.addAbility(ability);
}
@Override
public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SimpleActivatedAbility) {
+ if (ability.getOriginalId().equals(originalId)) {
int maxConvManaCost = 0;
for (Cost cost : ability.getCosts()) {
if (cost instanceof RemoveVariableCountersSourceCost) {
@@ -98,6 +100,7 @@ public class QuillmaneBaku extends CardImpl {
public QuillmaneBaku(final QuillmaneBaku card) {
super(card);
+ this.originalId = card.originalId;
}
@Override
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/SoratamiMindsweeper.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/SoratamiMindsweeper.java
index 141dfacf5e8..d3905fda60b 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/SoratamiMindsweeper.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/SoratamiMindsweeper.java
@@ -31,7 +31,7 @@ import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.PutLibraryIntoGraveTargetEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -66,7 +66,7 @@ public class SoratamiMindsweeper extends CardImpl {
// {2}, Return a land you control to its owner's hand: Target player puts the top two cards of his or her library into his or her graveyard.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,new PutLibraryIntoGraveTargetEffect(2), new ManaCostsImpl("{2}"));
ability.addTarget(new TargetPlayer());
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/SwayOfTheStars.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/SwayOfTheStars.java
index 5641bb5968e..4764132a428 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/SwayOfTheStars.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/SwayOfTheStars.java
@@ -28,14 +28,18 @@
package mage.sets.betrayersofkamigawa;
import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DrawCardAllEffect;
+import mage.abilities.effects.common.SetPlayerLifeAllEffect;
+import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
-import mage.abilities.Ability;
-import mage.abilities.effects.OneShotEffect;
-import mage.cards.Card;
-import mage.cards.CardImpl;
+import mage.filter.FilterPermanent;
+import mage.filter.predicate.other.OwnerIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@@ -50,9 +54,12 @@ public class SwayOfTheStars extends CardImpl {
super(ownerId, 54, "Sway of the Stars", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{8}{U}{U}");
this.expansionSetCode = "BOK";
-
// Each player shuffles his or her hand, graveyard, and permanents he or she owns into his or her library, then draws seven cards. Each player's life total becomes 7.
this.getSpellAbility().addEffect(new SwayOfTheStarsEffect());
+ Effect effect = new DrawCardAllEffect(7);
+ effect.setText(", then draws seven cards");
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addEffect(new SetPlayerLifeAllEffect(7));
}
@@ -66,7 +73,6 @@ public class SwayOfTheStars extends CardImpl {
}
}
-
class SwayOfTheStarsEffect extends OneShotEffect {
public SwayOfTheStarsEffect() {
@@ -80,24 +86,19 @@ class SwayOfTheStarsEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Player sourcePlayer = game.getPlayer(source.getControllerId());
+ Player controller = game.getPlayer(source.getControllerId());
- for (Permanent permanent : game.getBattlefield().getActivePermanents(source.getControllerId(), game)) {
- permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
- }
-
- for (UUID playerId: sourcePlayer.getInRange()) {
+ for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
Player player = game.getPlayer(playerId);
if (player != null) {
- for (Card card: player.getHand().getCards(game)) {
- card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
- }
- for (Card card: player.getGraveyard().getCards(game)) {
- card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
- }
+ player.moveCards(player.getHand(), Zone.HAND, Zone.LIBRARY, source, game);
+ player.moveCards(player.getGraveyard(), Zone.GRAVEYARD, Zone.LIBRARY, source, game);
+ FilterPermanent filter = new FilterPermanent();
+ filter.add(new OwnerIdPredicate(playerId));
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, controller.getId(), source.getSourceId(), game)) {
+ permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
+ }
player.shuffleLibrary(game);
- player.drawCards(7, game);
- player.setLife(7, game);
}
}
return true;
@@ -108,4 +109,4 @@ class SwayOfTheStarsEffect extends OneShotEffect {
return new SwayOfTheStarsEffect(this);
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/VeilOfSecrecy.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/VeilOfSecrecy.java
index c0184c3793c..7b4c81b3575 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/VeilOfSecrecy.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/VeilOfSecrecy.java
@@ -29,7 +29,7 @@ package mage.sets.betrayersofkamigawa;
import java.util.UUID;
import mage.ObjectColor;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
@@ -71,7 +71,7 @@ public class VeilOfSecrecy extends CardImpl {
this.getSpellAbility().addEffect(effect);
// Splice onto Arcane-Return a blue creature you control to its owner's hand.
- this.addAbility(new SpliceOntoArcaneAbility(new ReturnToHandTargetPermanentCost(new TargetControlledCreaturePermanent(filter))));
+ this.addAbility(new SpliceOntoArcaneAbility(new ReturnToHandChosenControlledPermanentCost(new TargetControlledCreaturePermanent(filter))));
}
public VeilOfSecrecy(final VeilOfSecrecy card) {
diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/WardOfPiety.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/WardOfPiety.java
index 1edee8058ed..94b13e99c31 100644
--- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/WardOfPiety.java
+++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/WardOfPiety.java
@@ -28,11 +28,11 @@
package mage.sets.betrayersofkamigawa;
import java.util.UUID;
+import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.PreventionEffectData;
-import mage.abilities.effects.PreventionEffectImpl;
+import mage.abilities.effects.RedirectionEffect;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
@@ -44,7 +44,6 @@ import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
-import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreatureOrPlayer;
import mage.target.common.TargetCreaturePermanent;
@@ -60,7 +59,6 @@ public class WardOfPiety extends CardImpl {
this.expansionSetCode = "BOK";
this.subtype.add("Aura");
-
// Enchant creature
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget);
@@ -84,10 +82,12 @@ public class WardOfPiety extends CardImpl {
}
}
-class WardOfPietyPreventDamageTargetEffect extends PreventionEffectImpl {
+class WardOfPietyPreventDamageTargetEffect extends RedirectionEffect {
+
+ protected MageObjectReference redirectToObject;
public WardOfPietyPreventDamageTargetEffect() {
- super(Duration.EndOfTurn, 1, false, true);
+ super(Duration.EndOfTurn, 1, true);
staticText = "The next 1 damage that would be dealt to enchanted creature this turn is dealt to target creature or player instead";
}
@@ -106,35 +106,21 @@ class WardOfPietyPreventDamageTargetEffect extends PreventionEffectImpl {
}
@Override
- public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- PreventionEffectData preventionData = preventDamageAction(event, source, game);
- // deal damage now
- if (preventionData.getPreventedDamage() > 0) {
- Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
- if (permanent != null) {
- game.informPlayers("Dealing " + preventionData.getPreventedDamage() + " damage to " + permanent.getLogName() + " instead");
- // keep the original source id as it is redirecting
- permanent.damage(preventionData.getPreventedDamage(), event.getSourceId(), game, false, true);
- }
- Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
- if (player != null) {
- game.informPlayers("Dealing " + preventionData.getPreventedDamage() + " damage to " + player.getLogName() + " instead");
- // keep the original source id as it is redirecting
- player.damage(preventionData.getPreventedDamage(), event.getSourceId(), game, false, true);
- }
- }
- return false;
+ public void init(Ability source, Game game) {
+ super.init(source, game);
+ redirectToObject = new MageObjectReference(source.getTargets().get(0).getFirstTarget(), game);
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- if (super.applies(event, source, game)) {
- Permanent enchantment = game.getPermanent(source.getSourceId());
- if (enchantment != null && event.getTargetId().equals(enchantment.getAttachedTo())) {
+ Permanent enchantment = game.getPermanent(source.getSourceId());
+ if (enchantment != null && event.getTargetId().equals(enchantment.getAttachedTo())) {
+ if (redirectToObject.equals(new MageObjectReference(source.getTargets().get(0).getFirstTarget(), game))) {
+ redirectTarget = source.getTargets().get(0);
return true;
}
}
return false;
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/AstralCornucopia.java b/Mage.Sets/src/mage/sets/bornofthegods/AstralCornucopia.java
index 72046e837c1..6d57185c284 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/AstralCornucopia.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/AstralCornucopia.java
@@ -31,17 +31,14 @@ import java.util.List;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.effects.EntersBattlefieldEffect;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
import mage.abilities.effects.common.ManaEffect;
import mage.abilities.mana.ManaAbility;
import mage.cards.CardImpl;
import mage.choices.ChoiceColor;
import mage.constants.CardType;
-import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.counters.CounterType;
@@ -60,7 +57,7 @@ public class AstralCornucopia extends CardImpl {
this.expansionSetCode = "BNG";
// Astral Cornucopia enters the battlefield with X charge counters on it.
- this.addAbility(new EntersBattlefieldAbility(new AstralCornucopiaEffect(), "with X charge counters on it"));
+ this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.CHARGE.createInstance())));
// {T}: Choose a color. Add one mana of that color to your mana pool for each charge counter on Astral Cornucopia.
this.addAbility(new AstralCornucopiaManaAbility());
@@ -76,38 +73,6 @@ public class AstralCornucopia extends CardImpl {
}
}
-class AstralCornucopiaEffect extends OneShotEffect {
- public AstralCornucopiaEffect() {
- super(Outcome.Benefit);
- }
-
- public AstralCornucopiaEffect(final AstralCornucopiaEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent permanent = game.getPermanent(source.getSourceId());
- if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility) {
- // delete to prevent using it again if put into battlefield from other effect
- setValue(mage.abilities.effects.EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY, null);
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
- if (amount > 0) {
- permanent.addCounters(CounterType.CHARGE.createInstance(amount), game);
- }
- }
- }
- return true;
- }
-
- @Override
- public AstralCornucopiaEffect copy() {
- return new AstralCornucopiaEffect(this);
- }
-}
-
class AstralCornucopiaManaAbility extends ManaAbility {
public AstralCornucopiaManaAbility() {
@@ -130,7 +95,7 @@ class AstralCornucopiaManaAbility extends ManaAbility {
if (sourcePermanent != null) {
int counters = sourcePermanent.getCounters().getCount(CounterType.CHARGE.getName());
if (counters > 0) {
- netMana.add(new Mana(0,0,0,0,0,0,counters));
+ netMana.add(new Mana(0, 0, 0, 0, 0, 0, counters));
}
}
return netMana;
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/BrimazKingOfOreskos.java b/Mage.Sets/src/mage/sets/bornofthegods/BrimazKingOfOreskos.java
index 7d967d2d226..8ebc5ab5fc8 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/BrimazKingOfOreskos.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/BrimazKingOfOreskos.java
@@ -64,10 +64,10 @@ public class BrimazKingOfOreskos extends CardImpl {
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
-
+
// Whenever Brimaz, King of Oreskos attacks, put a 1/1 white Cat Soldier creature token with vigilance onto the battlefield attacking.
this.addAbility(new AttacksTriggeredAbility(new CreateTokenEffect(new CatSoldierCreatureToken(), 1, false, true), false));
-
+
// Whenever Brimaz blocks a creature, put a 1/1 white Cat Soldier creature token with vigilance onto the battlefield blocking that creature.
this.addAbility(new BlocksCreatureTriggeredAbility(new BrimazKingOfOreskosEffect(), false, true));
}
@@ -83,44 +83,49 @@ public class BrimazKingOfOreskos extends CardImpl {
}
class BrimazKingOfOreskosEffect extends OneShotEffect {
-
+
public BrimazKingOfOreskosEffect() {
super(Outcome.Benefit);
this.staticText = "put a 1/1 white Cat Soldier creature token with vigilance onto the battlefield blocking that creature";
}
-
+
public BrimazKingOfOreskosEffect(final BrimazKingOfOreskosEffect effect) {
super(effect);
}
-
+
@Override
public BrimazKingOfOreskosEffect copy() {
return new BrimazKingOfOreskosEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
-
+
if (controller != null) {
Token token = new CatSoldierCreatureToken();
token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId());
- Permanent catToken = game.getPermanent(token.getLastAddedToken());
- Permanent attackingCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
- if (catToken != null && attackingCreature != null && game.getState().getCombat() != null) {
+ Permanent attackingCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
+ if (attackingCreature != null && game.getState().getCombat() != null) {
// Possible ruling (see Ætherplasm)
// The token you put onto the battlefield is blocking the attacking creature,
// even if the block couldn't legally be declared (for example, if that creature
- // enters the battlefield tapped, or it can't block, or the attacking creature
+ // enters the battlefield tapped, or it can't block, or the attacking creature
// has protection from it)
CombatGroup combatGroup = game.getState().getCombat().findGroup(attackingCreature.getId());
if (combatGroup != null) {
- combatGroup.addBlocker(catToken.getId(), source.getControllerId(), game);
- game.getCombat().addBlockingGroup(catToken.getId(),attackingCreature.getId() , source.getControllerId(), game);
+ for (UUID tokenId : token.getLastAddedTokenIds()) {
+ Permanent catToken = game.getPermanent(tokenId);
+ if (catToken != null) {
+ combatGroup.addBlocker(tokenId, source.getControllerId(), game);
+ game.getCombat().addBlockingGroup(tokenId, attackingCreature.getId(), controller.getId(), game);
+ }
+ }
+ combatGroup.pickBlockerOrder(attackingCreature.getControllerId(), game);
}
}
return true;
- }
+ }
return false;
}
}
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/ChampionOfStraySouls.java b/Mage.Sets/src/mage/sets/bornofthegods/ChampionOfStraySouls.java
index a59de281863..421d4ef2737 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/ChampionOfStraySouls.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/ChampionOfStraySouls.java
@@ -27,6 +27,7 @@
*/
package mage.sets.bornofthegods;
+import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -47,14 +48,13 @@ import mage.filter.predicate.permanent.AnotherPredicate;
import mage.game.Game;
import mage.target.common.TargetCardInYourGraveyard;
-import java.util.UUID;
-
/**
*
* @author LevelX2
*/
public class ChampionOfStraySouls extends CardImpl {
+ private final UUID originalId;
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("other creatures");
static {
@@ -71,8 +71,9 @@ public class ChampionOfStraySouls extends CardImpl {
this.toughness = new MageInt(4);
/**
- * You choose the targets of the first ability as you activate that ability,
- * before you pay any costs. You can't target any of the creatures you sacrifice.
+ * You choose the targets of the first ability as you activate that
+ * ability, before you pay any costs. You can't target any of the
+ * creatures you sacrifice.
*/
// {3}{B}{B}, {T}, Sacrifice X other creatures: Return X target creatures from your graveyard to the battlefield.
Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect();
@@ -80,11 +81,12 @@ public class ChampionOfStraySouls extends CardImpl {
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{3}{B}{B}"));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeXTargetCost(filter));
- ability.addTarget(new TargetCardInYourGraveyard(0,Integer.MAX_VALUE, new FilterCreatureCard("creature cards from your graveyard")));
+ ability.addTarget(new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, new FilterCreatureCard("creature cards from your graveyard")));
+ originalId = ability.getOriginalId();
this.addAbility(ability);
// {5}{B}{B}: Put Champion of Stray Souls on top of your library from your graveyard.
- this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD,
+ this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD,
new PutOnLibrarySourceEffect(true, "Put {this} on top of your library from your graveyard"),
new ManaCostsImpl("{5}{B}{B}")));
@@ -92,12 +94,12 @@ public class ChampionOfStraySouls extends CardImpl {
@Override
public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SimpleActivatedAbility) {
+ if (ability.getOriginalId().equals(originalId)) {
for (Effect effect : ability.getEffects()) {
if (effect instanceof ReturnFromGraveyardToBattlefieldTargetEffect) {
int xValue = new GetXValue().calculate(game, ability, null);
ability.getTargets().clear();
- ability.addTarget(new TargetCardInYourGraveyard(xValue,xValue, new FilterCreatureCard("creature cards from your graveyard")));
+ ability.addTarget(new TargetCardInYourGraveyard(xValue, xValue, new FilterCreatureCard("creature cards from your graveyard")));
}
}
}
@@ -105,6 +107,7 @@ public class ChampionOfStraySouls extends CardImpl {
public ChampionOfStraySouls(final ChampionOfStraySouls card) {
super(card);
+ this.originalId = card.originalId;
}
@Override
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/EverflameEidolon.java b/Mage.Sets/src/mage/sets/bornofthegods/EverflameEidolon.java
index 3239aff414b..dc091c0b57f 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/EverflameEidolon.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/EverflameEidolon.java
@@ -29,19 +29,22 @@ package mage.sets.bornofthegods;
import java.util.UUID;
import mage.MageInt;
+import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.condition.common.SourceHasSubtypeCondition;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.BestowAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
+import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
/**
*
@@ -60,12 +63,7 @@ public class EverflameEidolon extends CardImpl {
// Bestow {2}{R}
this.addAbility(new BestowAbility(this, "{2}{R}"));
// {R}: Everflame Eidolon gets +1/+0 until end of turn. If it's an Aura, enchanted creature gets +1/+0 until end of turn instead.
- this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(
- new BoostEnchantedEffect(1, 0, Duration.EndOfTurn),
- new BoostSourceEffect(1, 0, Duration.EndOfTurn),
- new SourceHasSubtypeCondition("Aura"),
- "{this} gets +1/+0 until end of turn. If it's an Aura, enchanted creature gets +1/+0 until end of turn instead"),
- new ManaCostsImpl("{R}")));
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new EverflameEidolonEffect(), new ManaCostsImpl("{R}")));
// Enchanted creature gets +1/+1.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield)));
}
@@ -79,3 +77,34 @@ public class EverflameEidolon extends CardImpl {
return new EverflameEidolon(this);
}
}
+
+class EverflameEidolonEffect extends OneShotEffect {
+
+ public EverflameEidolonEffect() {
+ super(Outcome.BoostCreature);
+ this.staticText = "{this} gets +1/+0 until end of turn. If it's an Aura, enchanted creature gets +1/+0 until end of turn instead";
+ }
+
+ public EverflameEidolonEffect(final EverflameEidolonEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public EverflameEidolonEffect copy() {
+ return new EverflameEidolonEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent sourceObject = game.getPermanentOrLKIBattlefield(source.getSourceId());
+ if (sourceObject != null) {
+ if (sourceObject.getSubtype().contains("Aura")) {
+ new BoostEnchantedEffect(1, 0, Duration.EndOfTurn).apply(game, source);
+ } else {
+ game.addEffect(new BoostSourceEffect(1, 0, Duration.EndOfTurn), source);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/FelhideSpiritbinder.java b/Mage.Sets/src/mage/sets/bornofthegods/FelhideSpiritbinder.java
index 31d52cf2d2f..7d31be41b06 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/FelhideSpiritbinder.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/FelhideSpiritbinder.java
@@ -71,7 +71,7 @@ public class FelhideSpiritbinder extends CardImpl {
this.toughness = new MageInt(4);
// Inspired - Whenever Felhide Spiritbinder becomes untapped, you may pay {1}{R}. If you do, put a token onto the battlefield that's a copy of another target creature except it's an enchantment in addition to its other types. It gains haste. Exile it at the beginning of the next end step.
- Ability ability = new InspiredAbility(new DoIfCostPaid(new FelhideSpiritbinderEffect(), new ManaCostsImpl("{1}{R}"),"Use effect of {source}?"));
+ Ability ability = new InspiredAbility(new DoIfCostPaid(new FelhideSpiritbinderEffect(), new ManaCostsImpl("{1}{R}"), "Use effect of {source}?"));
ability.addTarget(new TargetCreaturePermanent(filter));
this.addAbility(ability);
}
@@ -108,15 +108,16 @@ class FelhideSpiritbinderEffect extends OneShotEffect {
if (permanent != null) {
PutTokenOntoBattlefieldCopyTargetEffect effect = new PutTokenOntoBattlefieldCopyTargetEffect(null, CardType.ENCHANTMENT, true);
effect.setTargetPointer(getTargetPointer());
- if (effect.apply(game, source) && effect.getAddedPermanent() != null) {
- ExileTargetEffect exileEffect = new ExileTargetEffect();
- exileEffect.setTargetPointer(new FixedTarget(effect.getAddedPermanent().getId()));
- DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect);
- delayedAbility.setSourceId(source.getSourceId());
- delayedAbility.setControllerId(source.getControllerId());
- delayedAbility.setSourceObject(source.getSourceObject(game), game);
- game.addDelayedTriggeredAbility(delayedAbility);
-
+ if (effect.apply(game, source)) {
+ for (Permanent tokenPermanent : effect.getAddedPermanent()) {
+ ExileTargetEffect exileEffect = new ExileTargetEffect();
+ exileEffect.setTargetPointer(new FixedTarget(tokenPermanent, game));
+ DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect);
+ delayedAbility.setSourceId(source.getSourceId());
+ delayedAbility.setControllerId(source.getControllerId());
+ delayedAbility.setSourceObject(source.getSourceObject(game), game);
+ game.addDelayedTriggeredAbility(delayedAbility);
+ }
return true;
}
}
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/FloodtideSerpent.java b/Mage.Sets/src/mage/sets/bornofthegods/FloodtideSerpent.java
index 0fcebf1fd79..16e5cd91835 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/FloodtideSerpent.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/FloodtideSerpent.java
@@ -31,7 +31,7 @@ import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.effects.PayCostToAttackBlockEffectImpl;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.combat.CantAttackBlockUnlessPaysSourceEffect;
@@ -71,7 +71,7 @@ public class FloodtideSerpent extends CardImpl {
// Floodtide Serpent can't attack unless you return an enchantment you control to its owner's hand (This cost is paid as attackers are declared.)
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackBlockUnlessPaysSourceEffect(
- new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)), PayCostToAttackBlockEffectImpl.RestrictType.ATTACK)));
+ new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)), PayCostToAttackBlockEffectImpl.RestrictType.ATTACK)));
}
@@ -106,7 +106,7 @@ class FloodtideSerpentReplacementEffect extends ReplacementEffectImpl {
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Player player = game.getPlayer(event.getPlayerId());
if (player != null) {
- ReturnToHandTargetPermanentCost attackCost = new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter));
+ ReturnToHandChosenControlledPermanentCost attackCost = new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter));
if (attackCost.canPay(source, source.getSourceId(), event.getPlayerId(), game)
&& player.chooseUse(Outcome.Neutral, "Return an enchantment you control to hand to attack?", source, game)) {
if (attackCost.pay(source, game, source.getSourceId(), event.getPlayerId(), true)) {
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/ImpetuousSunchaser.java b/Mage.Sets/src/mage/sets/bornofthegods/ImpetuousSunchaser.java
index 3e50e54d85d..2a8c1ac7024 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/ImpetuousSunchaser.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/ImpetuousSunchaser.java
@@ -30,12 +30,10 @@ package mage.sets.bornofthegods;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.AttacksEachTurnStaticAbility;
-import mage.abilities.effects.common.combat.AttacksIfAbleSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
-import mage.constants.Duration;
import mage.constants.Rarity;
/**
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/KioraTheCrashingWave.java b/Mage.Sets/src/mage/sets/bornofthegods/KioraTheCrashingWave.java
index e7d04f82ebb..ccfb16f61e7 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/KioraTheCrashingWave.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/KioraTheCrashingWave.java
@@ -32,20 +32,18 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
-import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
import mage.abilities.effects.PreventionEffectImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.GetEmblemEffect;
import mage.abilities.effects.common.continuous.PlayAdditionalLandsControllerEffect;
-import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.constants.Zone;
-import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.predicate.permanent.ControllerPredicate;
import mage.game.Game;
@@ -64,6 +62,7 @@ import mage.util.CardUtil;
public class KioraTheCrashingWave extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("permanent an opponent control");
+
static {
filter.add(new ControllerPredicate(TargetController.OPPONENT));
}
@@ -73,8 +72,7 @@ public class KioraTheCrashingWave extends CardImpl {
this.expansionSetCode = "BNG";
this.subtype.add("Kiora");
-
- this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(2)), false));
+ this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(2));
// +1: Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls.
LoyaltyAbility ability = new LoyaltyAbility(new KioraPreventionEffect(), 1);
@@ -89,7 +87,6 @@ public class KioraTheCrashingWave extends CardImpl {
// -5: You get an emblem with "At the beginning of your end step, put a 9/9 blue Kraken creature token onto the battlefield."
this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new KioraEmblem()), -5));
-
}
public KioraTheCrashingWave(final KioraTheCrashingWave card) {
@@ -126,10 +123,10 @@ class KioraPreventionEffect extends PreventionEffectImpl {
@Override
public void init(Ability source, Game game) {
super.init(source, game);
- for(UUID targetId :this.getTargetPointer().getTargets(game, source)) {
+ for (UUID targetId : this.getTargetPointer().getTargets(game, source)) {
Permanent permanent = game.getPermanent(targetId);
if (permanent != null) {
- permanent.addInfo(new StringBuilder("kioraPrevention").append(getId()).toString(),CardUtil.addToolTipMarkTags("All damage that would be dealt to and dealt by this permanent is prevented."), game);
+ permanent.addInfo(new StringBuilder("kioraPrevention").append(getId()).toString(), CardUtil.addToolTipMarkTags("All damage that would be dealt to and dealt by this permanent is prevented."), game);
}
}
}
@@ -138,7 +135,7 @@ class KioraPreventionEffect extends PreventionEffectImpl {
public boolean applies(GameEvent event, Ability source, Game game) {
if (super.applies(event, source, game) && event instanceof DamageEvent) {
Permanent targetPermanent = game.getPermanent(this.getTargetPointer().getFirst(game, source));
- if (targetPermanent != null
+ if (targetPermanent != null
&& (event.getSourceId().equals(targetPermanent.getId()) || event.getTargetId().equals(targetPermanent.getId()))) {
return true;
}
@@ -149,10 +146,10 @@ class KioraPreventionEffect extends PreventionEffectImpl {
@Override
public boolean isInactive(Ability source, Game game) {
if (super.isInactive(source, game)) {
- for(UUID targetId :this.getTargetPointer().getTargets(game, source)) {
+ for (UUID targetId : this.getTargetPointer().getTargets(game, source)) {
Permanent permanent = game.getPermanent(targetId);
if (permanent != null) {
- permanent.addInfo(new StringBuilder("kioraPrevention").append(getId()).toString(),"", game);
+ permanent.addInfo(new StringBuilder("kioraPrevention").append(getId()).toString(), "", game);
}
}
return true;
@@ -162,9 +159,11 @@ class KioraPreventionEffect extends PreventionEffectImpl {
}
/**
- * Emblem: "At the beginning of your end step, put a 9/9 blue Kraken creature token onto the battlefield."
+ * Emblem: "At the beginning of your end step, put a 9/9 blue Kraken creature
+ * token onto the battlefield."
*/
class KioraEmblem extends Emblem {
+
public KioraEmblem() {
this.setName("EMBLEM: Kiora, the Crashing Wave");
Ability ability = new BeginningOfEndStepTriggeredAbility(Zone.COMMAND, new CreateTokenEffect(new KioraKrakenToken()), TargetController.YOU, null, false);
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/Mindreaver.java b/Mage.Sets/src/mage/sets/bornofthegods/Mindreaver.java
index 231854d0afb..7d218025f4a 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/Mindreaver.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/Mindreaver.java
@@ -58,8 +58,7 @@ import mage.target.TargetSpell;
import mage.util.CardUtil;
/**
- import mage.constants.Outcome;
-*
+ *
* @author LevelX2
*/
public class Mindreaver extends CardImpl {
@@ -77,10 +76,10 @@ public class Mindreaver extends CardImpl {
Ability ability = new HeroicAbility(new MindreaverExileEffect(), false);
ability.addTarget(new TargetPlayer());
this.addAbility(ability);
-
- // {U}{U}, Sacrifice Mindreaver: Counter target spell with the same name as a card exiled with mindreaver.
+
+ // {U}{U}, Sacrifice Mindreaver: Counter target spell with the same name as a card exiled with Mindreaver.
ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterTargetEffect(), new ManaCostsImpl("{U}{U}"));
- FilterSpell filter = new FilterSpell("spell with the same name as a card exiled with mindreaver");
+ FilterSpell filter = new FilterSpell("spell with the same name as a card exiled with {this}");
filter.add(new MindreaverNamePredicate(this.getId()));
ability.addTarget(new TargetSpell(filter));
ability.addCost(new SacrificeSourceCost());
@@ -116,12 +115,13 @@ class MindreaverExileEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
UUID exileId = CardUtil.getCardExileZoneId(game, source);
+ MageObject sourceObject = source.getSourceObject(game);
Player opponent = game.getPlayer(this.getTargetPointer().getFirst(game, source));
- if (opponent != null) {
+ if (opponent != null && sourceObject != null) {
for (int i = 0; i < 3; i++) {
Card card = opponent.getLibrary().getFromTop(game);
if (card != null) {
- card.moveToExile(exileId, "Mindreaver", source.getSourceId(), game);
+ card.moveToExile(exileId, sourceObject.getIdName(), source.getSourceId(), game);
}
}
}
@@ -130,29 +130,29 @@ class MindreaverExileEffect extends OneShotEffect {
}
class MindreaverNamePredicate implements Predicate {
-
+
private final UUID sourceId;
-
+
public MindreaverNamePredicate(UUID sourceId) {
this.sourceId = sourceId;
}
-
+
@Override
public boolean apply(MageObject input, Game game) {
Set cardNames = new HashSet();
UUID exileId = CardUtil.getCardExileZoneId(game, sourceId);
ExileZone exileZone = game.getExile().getExileZone(exileId);
if (exileZone != null) {
- for(Card card : exileZone.getCards(game)) {
+ for (Card card : exileZone.getCards(game)) {
cardNames.add(card.getName());
}
}
- // If a player names a card, the player may name either half of a split card, but not both.
+ // If a player names a card, the player may name either half of a split card, but not both.
// A split card has the chosen name if one of its two names matches the chosen name.
if (input instanceof SplitCard) {
- return cardNames.contains(((SplitCard)input).getLeftHalfCard().getName()) || cardNames.contains(((SplitCard)input).getRightHalfCard().getName());
- } else if (input instanceof Spell && ((Spell)input).getSpellAbility().getSpellAbilityType().equals(SpellAbilityType.SPLIT_FUSED)){
- SplitCard card = (SplitCard) ((Spell)input).getCard();
+ return cardNames.contains(((SplitCard) input).getLeftHalfCard().getName()) || cardNames.contains(((SplitCard) input).getRightHalfCard().getName());
+ } else if (input instanceof Spell && ((Spell) input).getSpellAbility().getSpellAbilityType().equals(SpellAbilityType.SPLIT_FUSED)) {
+ SplitCard card = (SplitCard) ((Spell) input).getCard();
return cardNames.contains(card.getLeftHalfCard().getName()) || cardNames.contains(card.getRightHalfCard().getName());
} else {
return cardNames.contains(input.getName());
@@ -163,4 +163,4 @@ class MindreaverNamePredicate implements Predicate {
public String toString() {
return "spell with the same name as a card exiled with {source}";
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/MogisGodOfSlaughter.java b/Mage.Sets/src/mage/sets/bornofthegods/MogisGodOfSlaughter.java
index 85fb229bf73..d5bd22552ac 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/MogisGodOfSlaughter.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/MogisGodOfSlaughter.java
@@ -74,9 +74,9 @@ public class MogisGodOfSlaughter extends CardImpl {
// As long as your devotion to black and red is less than seven, Mogis isn't a creature.
Effect effect = new LoseCreatureTypeSourceEffect(new DevotionCount(ColoredManaSymbol.B, ColoredManaSymbol.R), 7);
effect.setText("As long as your devotion to black and red is less than seven, Mogis isn't a creature");
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
-
- // At the beginning of each opponent's upkeep, Mogis deals 2 damage to that player unless he or she sacrifices a creature.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
+
+ // At the beginning of each opponent's upkeep, Mogis deals 2 damage to that player unless he or she sacrifices a creature.
effect = new DoUnlessTargetPaysCost(new DamageTargetEffect(2, false, "that player"), new SacrificeTargetCost(new TargetControlledCreaturePermanent()),
"Sacrifice a creature? (otherwise you get 2 damage)");
effect.setText("Mogis deals 2 damage to that player unless he or she sacrifices a creature");
@@ -95,6 +95,7 @@ public class MogisGodOfSlaughter extends CardImpl {
}
class DoUnlessTargetPaysCost extends OneShotEffect {
+
private final OneShotEffect executingEffect;
private final Cost cost;
private final String userMessage;
@@ -102,6 +103,7 @@ class DoUnlessTargetPaysCost extends OneShotEffect {
public DoUnlessTargetPaysCost(OneShotEffect effect, Cost cost) {
this(effect, cost, null);
}
+
public DoUnlessTargetPaysCost(OneShotEffect effect, Cost cost, String userMessage) {
super(Outcome.Benefit);
this.executingEffect = effect;
@@ -123,7 +125,7 @@ class DoUnlessTargetPaysCost extends OneShotEffect {
if (player != null && mageObject != null) {
String message = userMessage;
if (message == null) {
- message = new StringBuilder(getCostText()).append(" to prevent ").append(executingEffect.getText(source.getModes().getMode())).append("?").toString();
+ message = getCostText() + " to prevent " + executingEffect.getText(source.getModes().getMode()) + "?";
}
message = CardUtil.replaceSourceName(message, mageObject.getLogName());
cost.clearPaid();
@@ -132,8 +134,8 @@ class DoUnlessTargetPaysCost extends OneShotEffect {
}
if (!cost.isPaid()) {
executingEffect.setTargetPointer(this.targetPointer);
- return executingEffect.apply(game, source);
- }
+ return executingEffect.apply(game, source);
+ }
return true;
}
return false;
@@ -153,8 +155,8 @@ class DoUnlessTargetPaysCost extends OneShotEffect {
private String getCostText() {
StringBuilder sb = new StringBuilder();
String costText = cost.getText();
- if (costText != null &&
- !costText.toLowerCase().startsWith("discard")
+ if (costText != null
+ && !costText.toLowerCase().startsWith("discard")
&& !costText.toLowerCase().startsWith("sacrifice")
&& !costText.toLowerCase().startsWith("remove")) {
sb.append("pay ");
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/Ornitharch.java b/Mage.Sets/src/mage/sets/bornofthegods/Ornitharch.java
index 4095a377198..930ff9345d3 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/Ornitharch.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/Ornitharch.java
@@ -29,7 +29,6 @@ package mage.sets.bornofthegods;
import java.util.UUID;
import mage.MageInt;
-import mage.ObjectColor;
import mage.abilities.TriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.TributeNotPaidCondition;
@@ -40,7 +39,7 @@ import mage.abilities.keyword.TributeAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.BirdToken;
/**
*
@@ -63,7 +62,7 @@ public class Ornitharch extends CardImpl {
// When Ornitharch enters the battlefield, if tribute wasn't paid, put two 1/1 white Bird creature tokens with flying onto the battlefield.
TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new BirdToken(), 2), false);
this.addAbility(new ConditionalTriggeredAbility(ability, TributeNotPaidCondition.getInstance(),
- "When {this} enters the battlefield, if its tribute wasn't paid, put two 1/1 white Bird creature tokens with flying onto the battlefield."));
+ "When {this} enters the battlefield, if its tribute wasn't paid, put two 1/1 white Bird creature tokens with flying onto the battlefield."));
}
public Ornitharch(final Ornitharch card) {
@@ -75,20 +74,3 @@ public class Ornitharch extends CardImpl {
return new Ornitharch(this);
}
}
-
-class BirdToken extends Token {
-
- public BirdToken() {
- super("Bird", "1/1 white Bird creature tokens with flying");
- this.setOriginalExpansionSetCode("BNG");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
-
- subtype.add("Bird");
- power = new MageInt(1);
- toughness = new MageInt(1);
-
- this.addAbility(FlyingAbility.getInstance());
- }
-
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/Peregrination.java b/Mage.Sets/src/mage/sets/bornofthegods/Peregrination.java
index d5fdc7aca32..688d96d8083 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/Peregrination.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/Peregrination.java
@@ -113,14 +113,13 @@ class PeregrinationEffect extends OneShotEffect {
TargetCard target2 = new TargetCard(Zone.LIBRARY, filter);
controller.choose(Outcome.Benefit, revealed, target2, game);
Card card = revealed.get(target2.getFirstTarget(), game);
-
- controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true);
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, false, null);
revealed.remove(card);
card = revealed.getCards(game).iterator().next();
- controller.moveCards(card, null, Zone.HAND, source, game);
+ controller.moveCards(card, Zone.HAND, source, game);
} else if (target.getTargets().size() == 1) {
Card card = revealed.getCards(game).iterator().next();
- controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true);
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, false, null);
}
}
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/PillarOfWar.java b/Mage.Sets/src/mage/sets/bornofthegods/PillarOfWar.java
index 7cad13237fc..cc7caa3973d 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/PillarOfWar.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/PillarOfWar.java
@@ -1,78 +1,78 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets.bornofthegods;
-
-import java.util.UUID;
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.condition.common.EnchantedCondition;
-import mage.abilities.decorator.ConditionalAsThoughEffect;
-import mage.abilities.effects.Effect;
-import mage.abilities.effects.common.combat.CanAttackAsThoughtItDidntHaveDefenderSourceEffect;
-import mage.abilities.keyword.DefenderAbility;
-import mage.cards.CardImpl;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Rarity;
-import mage.constants.Zone;
-
-/**
- *
- * @author LevelX2
- */
-public class PillarOfWar extends CardImpl {
-
- public PillarOfWar(UUID ownerId) {
- super(ownerId, 160, "Pillar of War", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}");
- this.expansionSetCode = "BNG";
- this.subtype.add("Golem");
-
- this.power = new MageInt(3);
- this.toughness = new MageInt(3);
-
- // Defender
- this.addAbility(DefenderAbility.getInstance());
- // As long as Pillar of War is enchanted, it can attack as though it didn't have defender.
- Effect effect = new ConditionalAsThoughEffect(
- new CanAttackAsThoughtItDidntHaveDefenderSourceEffect(Duration.WhileOnBattlefield),
- new EnchantedCondition());
- effect.setText("As long as {this} is enchanted, it can attack as though it didn't have defender");
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
-
- }
-
- public PillarOfWar(final PillarOfWar card) {
- super(card);
- }
-
- @Override
- public PillarOfWar copy() {
- return new PillarOfWar(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.bornofthegods;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.common.EnchantedCondition;
+import mage.abilities.decorator.ConditionalAsThoughEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.combat.CanAttackAsThoughItDidntHaveDefenderSourceEffect;
+import mage.abilities.keyword.DefenderAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class PillarOfWar extends CardImpl {
+
+ public PillarOfWar(UUID ownerId) {
+ super(ownerId, 160, "Pillar of War", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}");
+ this.expansionSetCode = "BNG";
+ this.subtype.add("Golem");
+
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Defender
+ this.addAbility(DefenderAbility.getInstance());
+ // As long as Pillar of War is enchanted, it can attack as though it didn't have defender.
+ Effect effect = new ConditionalAsThoughEffect(
+ new CanAttackAsThoughItDidntHaveDefenderSourceEffect(Duration.WhileOnBattlefield),
+ new EnchantedCondition());
+ effect.setText("As long as {this} is enchanted, it can attack as though it didn't have defender");
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
+
+ }
+
+ public PillarOfWar(final PillarOfWar card) {
+ super(card);
+ }
+
+ @Override
+ public PillarOfWar copy() {
+ return new PillarOfWar(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/RaisedByWolves.java b/Mage.Sets/src/mage/sets/bornofthegods/RaisedByWolves.java
index 9ae5c235150..d0f51973bd3 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/RaisedByWolves.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/RaisedByWolves.java
@@ -28,7 +28,6 @@
package mage.sets.bornofthegods;
import java.util.UUID;
-import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -47,7 +46,7 @@ import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.WolfToken;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
@@ -92,16 +91,3 @@ public class RaisedByWolves extends CardImpl {
return new RaisedByWolves(this);
}
}
-
-class WolfToken extends Token {
-
- public WolfToken() {
- super("Wolf", "2/2 green Wolf creature token");
- this.setOriginalExpansionSetCode("BNG");
- cardType.add(CardType.CREATURE);
- color.setGreen(true);
- subtype.add("Wolf");
- power = new MageInt(2);
- toughness = new MageInt(2);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/SatyrNyxSmith.java b/Mage.Sets/src/mage/sets/bornofthegods/SatyrNyxSmith.java
index 0c39cbb9c97..79f54d94c8f 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/SatyrNyxSmith.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/SatyrNyxSmith.java
@@ -29,7 +29,6 @@ package mage.sets.bornofthegods;
import java.util.UUID;
import mage.MageInt;
-import mage.ObjectColor;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DoIfCostPaid;
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/SpitefulReturned.java b/Mage.Sets/src/mage/sets/bornofthegods/SpitefulReturned.java
index 3f132ca5074..93a3d82a419 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/SpitefulReturned.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/SpitefulReturned.java
@@ -67,7 +67,7 @@ public class SpitefulReturned extends CardImpl {
effect.setText("defending player loses 2 life");
this.addAbility(new SpitefulReturnedTriggeredAbility(effect));
// Enchanted creature gets +1/+1.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1,1, Duration.WhileOnBattlefield)));
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield)));
}
public SpitefulReturned(final SpitefulReturned card) {
@@ -105,7 +105,8 @@ class SpitefulReturnedTriggeredAbility extends TriggeredAbilityImpl {
Permanent sourcePermanent = game.getPermanent(this.getSourceId());
if (sourcePermanent != null) {
if (sourcePermanent.getCardType().contains(CardType.CREATURE)) {
- if (event.getSourceId() == this.getSourceId()) {
+ if (event.getSourceId() != null
+ && event.getSourceId().equals(this.getSourceId())) {
UUID defender = game.getCombat().getDefendingPlayerId(this.getSourceId(), game);
this.getEffects().get(0).setTargetPointer(new FixedTarget(defender));
return true;
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/UnravelTheAEther.java b/Mage.Sets/src/mage/sets/bornofthegods/UnravelTheAEther.java
index 94705d22086..fd87b5d72d8 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/UnravelTheAEther.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/UnravelTheAEther.java
@@ -53,17 +53,16 @@ public class UnravelTheAEther extends CardImpl {
static {
filter.add(Predicates.or(new CardTypePredicate(CardType.ARTIFACT),
- new CardTypePredicate(CardType.ENCHANTMENT)));
+ new CardTypePredicate(CardType.ENCHANTMENT)));
}
public UnravelTheAEther(UUID ownerId) {
super(ownerId, 143, "Unravel the AEther", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{G}");
this.expansionSetCode = "BNG";
-
// Choose target artifact or enchantment. Its owner shuffles it into his or her library.
this.getSpellAbility().addEffect(new UnravelTheAEtherShuffleIntoLibraryEffect());
- Target target = new TargetPermanent(1,1,filter,true);
+ Target target = new TargetPermanent(1, 1, filter, false);
this.getSpellAbility().addTarget(target);
}
@@ -76,6 +75,7 @@ public class UnravelTheAEther extends CardImpl {
return new UnravelTheAEther(this);
}
}
+
class UnravelTheAEtherShuffleIntoLibraryEffect extends OneShotEffect {
public UnravelTheAEtherShuffleIntoLibraryEffect() {
@@ -96,7 +96,7 @@ class UnravelTheAEtherShuffleIntoLibraryEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
if (permanent != null) {
- if (permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true) ) {
+ if (permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true)) {
game.getPlayer(permanent.getOwnerId()).shuffleLibrary(game);
return true;
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/BloodthirstyOgre.java b/Mage.Sets/src/mage/sets/championsofkamigawa/BloodthirstyOgre.java
index ac0d7e7614c..d1a0b5dda3c 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/BloodthirstyOgre.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/BloodthirstyOgre.java
@@ -28,14 +28,11 @@
package mage.sets.championsofkamigawa;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
+import mage.abilities.common.ActivateIfConditionActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.ControlPermanentCost;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.CountersCount;
@@ -43,6 +40,10 @@ import mage.abilities.dynamicvalue.common.SignInversionDynamicValue;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
@@ -54,7 +55,8 @@ import mage.target.common.TargetCreaturePermanent;
*/
public class BloodthirstyOgre extends CardImpl {
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("Demon");
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control a Demon");
+
static {
filter.add(new SubtypePredicate("Demon"));
}
@@ -71,11 +73,13 @@ public class BloodthirstyOgre extends CardImpl {
// {T}: Put a devotion counter on Bloodthirsty Ogre
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.DEVOTION.createInstance()),new TapSourceCost()));
+
// {T}: Target creature gets -X/-X until end of turn, where X is the number of devotion counters on Bloodthirsty Ogre. Activate this ability only if you control a Demon.
DynamicValue devotionCounters = new SignInversionDynamicValue(new CountersCount(CounterType.DEVOTION));
- Ability ability;
- ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(devotionCounters,devotionCounters, Duration.EndOfTurn, true),new TapSourceCost());
- ability.addCost(new ControlPermanentCost(filter));
+ Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD,
+ new BoostTargetEffect(devotionCounters,devotionCounters, Duration.EndOfTurn, true),
+ new TapSourceCost(),
+ new PermanentsOnTheBattlefieldCondition(filter));
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
@@ -87,6 +91,6 @@ public class BloodthirstyOgre extends CardImpl {
@Override
public BloodthirstyOgre copy() {
return new BloodthirstyOgre(this);
- }
+ }
}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/CrushingPain.java b/Mage.Sets/src/mage/sets/championsofkamigawa/CrushingPain.java
index 048fa176252..8d797e53819 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/CrushingPain.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/CrushingPain.java
@@ -54,7 +54,7 @@ public class CrushingPain extends CardImpl {
public CrushingPain (UUID ownerId) {
super(ownerId, 162, "Crushing Pain", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{R}");
this.expansionSetCode = "CHK";
-
+ this.subtype.add("Arcane");
// Crushing Pain deals 6 damage to target creature that was dealt damage this turn.
this.getSpellAbility().addEffect(new DamageTargetEffect(6));
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/EtherealHaze.java b/Mage.Sets/src/mage/sets/championsofkamigawa/EtherealHaze.java
index 8c6eb77fe52..308de9cef81 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/EtherealHaze.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/EtherealHaze.java
@@ -45,7 +45,7 @@ public class EtherealHaze extends CardImpl {
public EtherealHaze (UUID ownerId) {
super(ownerId, 9, "Ethereal Haze", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{W}");
this.expansionSetCode = "CHK";
-
+ this.subtype.add("Arcane");
// Prevent all damage that would be dealt by creatures this turn.
this.getSpellAbility().addEffect(new PreventAllDamageByAllEffect(new FilterCreaturePermanent("creatures"), Duration.EndOfTurn, false));
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/HallOfTheBanditLord.java b/Mage.Sets/src/mage/sets/championsofkamigawa/HallOfTheBanditLord.java
index b07a5806979..a23e783906b 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/HallOfTheBanditLord.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/HallOfTheBanditLord.java
@@ -69,7 +69,7 @@ public class HallOfTheBanditLord extends CardImpl {
// Hall of the Bandit Lord enters the battlefield tapped.
this.addAbility(new EntersBattlefieldTappedAbility());
-
+
// {T}, Pay 3 life: Add {1} to your mana pool. If that mana is spent on a creature spell, it gains haste.
Mana mana = Mana.ColorlessMana;
mana.setFlag(true);
@@ -94,12 +94,12 @@ class HallOfTheBanditLordWatcher extends Watcher {
private final Ability source;
private final List creatures = new ArrayList<>();
-
+
HallOfTheBanditLordWatcher(Ability source) {
super("HallOfTheBanditLordWatcher", WatcherScope.CARD);
this.source = source;
}
-
+
HallOfTheBanditLordWatcher(final HallOfTheBanditLordWatcher watcher) {
super(watcher);
this.creatures.addAll(watcher.creatures);
@@ -110,22 +110,25 @@ class HallOfTheBanditLordWatcher extends Watcher {
public HallOfTheBanditLordWatcher copy() {
return new HallOfTheBanditLordWatcher(this);
}
-
+
@Override
public void watch(GameEvent event, Game game) {
if (event.getType() == EventType.MANA_PAYED) {
MageObject target = game.getObject(event.getTargetId());
- if (event.getSourceId() == this.getSourceId() && target != null && target.getCardType().contains(CardType.CREATURE) && event.getFlag()) {
+ if (event.getSourceId() != null
+ && event.getSourceId().equals(this.getSourceId())
+ && target != null && target.getCardType().contains(CardType.CREATURE)
+ && event.getFlag()) {
if (target instanceof Spell) {
this.creatures.add(((Spell) target).getCard().getId());
}
}
}
if (event.getType() == EventType.COUNTERED) {
- if (creatures.contains(event.getTargetId())) {
+ if (creatures.contains(event.getTargetId())) {
creatures.remove(event.getSourceId());
- }
- }
+ }
+ }
if (event.getType() == EventType.ZONE_CHANGE) {
if (creatures.contains(event.getSourceId())) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
@@ -133,22 +136,22 @@ class HallOfTheBanditLordWatcher extends Watcher {
if (zEvent.getToZone() == Zone.STACK) {
creatures.remove(event.getSourceId());
}
- }
- }
+ }
+ }
if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD) {
- if (creatures.contains(event.getSourceId())) {
+ if (creatures.contains(event.getSourceId())) {
ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom);
effect.setTargetPointer(new FixedTarget(event.getSourceId()));
game.addEffect(effect, source);
creatures.remove(event.getSourceId());
- }
+ }
}
}
-
+
@Override
public void reset() {
super.reset();
creatures.clear();
}
-
+
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/HearthKami.java b/Mage.Sets/src/mage/sets/championsofkamigawa/HearthKami.java
index 1b9764a3912..8920c45bf6d 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/HearthKami.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/HearthKami.java
@@ -25,20 +25,19 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.championsofkamigawa;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
-import mage.abilities.costs.mana.*;
+import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.Filter;
import mage.filter.common.FilterArtifactPermanent;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
@@ -51,6 +50,8 @@ import mage.target.TargetPermanent;
*/
public class HearthKami extends CardImpl {
+ private final UUID originalId;
+
public HearthKami(UUID ownerId) {
super(ownerId, 171, "Hearth Kami", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}");
this.expansionSetCode = "CHK";
@@ -63,12 +64,13 @@ public class HearthKami extends CardImpl {
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{X}"));
ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetPermanent(new FilterArtifactPermanent("artifact with converted mana cost X")));
+ originalId = ability.getOriginalId();
this.addAbility(ability);
}
@Override
public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SimpleActivatedAbility) {
+ if (ability.getOriginalId().equals(originalId)) {
int xValue = ability.getManaCostsToPay().getX();
ability.getTargets().clear();
FilterArtifactPermanent filter = new FilterArtifactPermanent(new StringBuilder("artifact with converted mana cost ").append(xValue).toString());
@@ -80,6 +82,7 @@ public class HearthKami extends CardImpl {
public HearthKami(final HearthKami card) {
super(card);
+ this.originalId = card.originalId;
}
@Override
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/Hinder.java b/Mage.Sets/src/mage/sets/championsofkamigawa/Hinder.java
index dac84fa0c2d..378e07cfa4a 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/Hinder.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/Hinder.java
@@ -28,27 +28,12 @@
package mage.sets.championsofkamigawa;
import java.util.UUID;
+import mage.abilities.effects.common.CounterTargetWithReplacementEffect;
+import mage.cards.CardImpl;
import mage.constants.CardType;
-import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
-import mage.MageObject;
-import mage.abilities.Ability;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.ReplacementEffectImpl;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.constants.Duration;
-import mage.constants.PhaseStep;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.events.GameEvent.EventType;
-import mage.game.events.ZoneChangeEvent;
-import mage.game.stack.Spell;
-import mage.game.stack.StackObject;
-import mage.players.Player;
import mage.target.TargetSpell;
-import mage.target.targetpointer.FixedTarget;
/**
*
@@ -61,7 +46,7 @@ public class Hinder extends CardImpl {
this.expansionSetCode = "CHK";
// Counter target spell. If that spell is countered this way, put that card on the top or bottom of its owner's library instead of into that player's graveyard.
- this.getSpellAbility().addEffect(new HinderEffect());
+ this.getSpellAbility().addEffect(new CounterTargetWithReplacementEffect(Zone.LIBRARY, true));
this.getSpellAbility().addTarget(new TargetSpell());
}
@@ -74,119 +59,3 @@ public class Hinder extends CardImpl {
return new Hinder(this);
}
}
-
-class HinderEffect extends OneShotEffect {
-
- public HinderEffect() {
- super(Outcome.Detriment);
- this.staticText = "Counter target spell. If that spell is countered this way, put that card on the top or bottom of its owner's library instead of into that player's graveyard";
- }
-
- public HinderEffect(final HinderEffect effect) {
- super(effect);
- }
-
- @Override
- public HinderEffect copy() {
- return new HinderEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- UUID objectId = source.getFirstTarget();
- UUID sourceId = source.getSourceId();
- // counter code from Spellstack
- StackObject stackObject = game.getStack().getStackObject(objectId);
- MageObject sourceObject = game.getObject(sourceId);
- if (stackObject != null && sourceObject != null) {
- if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER, objectId, sourceId, stackObject.getControllerId()))) {
- if ( stackObject instanceof Spell ) {
- game.rememberLKI(objectId, Zone.STACK, (Spell)stackObject);
- }
- // Hinder specific code
- ReplacementEffectImpl effect = new HinderReplacementEffect();
- effect.setTargetPointer(new FixedTarget(stackObject.getId()));
- game.addEffect(effect, source);
- // Hinder specific code end
- game.informPlayers(new StringBuilder(stackObject.getName()).append(" is countered by ").append(sourceObject.getLogName()).toString());
- game.getStack().remove(stackObject);
- stackObject.counter(sourceId, game); // tries to move to graveyard
- game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTERED, objectId, sourceId, stackObject.getControllerId()));
- } else {
- game.informPlayers(new StringBuilder(stackObject.getName()).append(" could not be countered by ").append(sourceObject.getLogName()).toString());
- }
- return true;
- }
- return false;
- // counter code from Spellstack end
- }
-}
-
-class HinderReplacementEffect extends ReplacementEffectImpl {
-
- private PhaseStep phaseStep;
-
- public HinderReplacementEffect() {
- super(Duration.OneUse, Outcome.Benefit);
- staticText = "If that spell is countered this way, put that card on the top or bottom of its owner's library instead of into that player's graveyard";
- phaseStep = null;
- }
-
- public HinderReplacementEffect(final HinderReplacementEffect effect) {
- super(effect);
- phaseStep = effect.phaseStep;
- }
-
- @Override
- public HinderReplacementEffect copy() {
- return new HinderReplacementEffect(this);
- }
-
- @Override
- public boolean isInactive(Ability source, Game game) {
- if (!game.getPhase().getStep().getType().equals(phaseStep)) {
- return true;
- }
- return super.isInactive(source, game);
- }
-
- @Override
- public void init(Ability source, Game game) {
- phaseStep = game.getPhase().getStep().getType();
- super.init(source, game);
- }
-
- @Override
- public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- MageObject targetObject = game.getObject(event.getTargetId());
- if (targetObject instanceof Card) {
- Card card = (Card) targetObject;
- Player player = game.getPlayer(source.getControllerId());
- if (player != null) {
- boolean top = player.chooseUse(Outcome.Neutral, "Put " + card.getName() + " on top of the library? Otherwise it will be put on the bottom.", source, game);
- if (card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, top, event.getAppliedEffects())) {
- game.informPlayers(player.getLogName() + " has put " + card.getName() + " on " + (top ? "top" : "the bottom") + " of the library.");
- }
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean checksEventType(GameEvent event, Game game) {
- return event.getType() == EventType.ZONE_CHANGE;
- }
-
- @Override
- public boolean applies(GameEvent event, Ability source, Game game) {
- if (((ZoneChangeEvent)event).getToZone().equals(Zone.GRAVEYARD)) {
- MageObject mageObject = game.getLastKnownInformation(getTargetPointer().getFirst(game, source), Zone.STACK);
- if (mageObject instanceof Spell) {
- return ((Spell)mageObject).getSourceId().equals(event.getTargetId());
- }
- }
- return false;
- }
-
-}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/HorobiDeathsWail.java b/Mage.Sets/src/mage/sets/championsofkamigawa/HorobiDeathsWail.java
index a254027b6a5..3e81a41733e 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/HorobiDeathsWail.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/HorobiDeathsWail.java
@@ -37,8 +37,6 @@ import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
-import mage.filter.common.FilterControlledPermanent;
-import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
@@ -51,11 +49,6 @@ import mage.target.targetpointer.FixedTarget;
*/
public class HorobiDeathsWail extends CardImpl {
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("Demon");
- static {
- filter.add(new SubtypePredicate("Demon"));
- }
-
public HorobiDeathsWail(UUID ownerId) {
super(ownerId, 117, "Horobi, Death's Wail", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
this.expansionSetCode = "CHK";
@@ -67,6 +60,7 @@ public class HorobiDeathsWail extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
+
// Whenever a creature becomes the target of a spell or ability, destroy that creature.
this.addAbility(new HorobiDeathsWailAbility(new DestroyTargetEffect()));
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/InameDeathAspect.java b/Mage.Sets/src/mage/sets/championsofkamigawa/InameDeathAspect.java
index 238a54f0116..006973f52e9 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/InameDeathAspect.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/InameDeathAspect.java
@@ -1,111 +1,108 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets.championsofkamigawa;
-
-import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.effects.SearchEffect;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.Cards;
-import mage.cards.CardsImpl;
-import mage.constants.Outcome;
-import mage.constants.Zone;
-import mage.filter.common.FilterCreatureCard;
-import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.game.Game;
-import mage.players.Player;
-import mage.target.common.TargetCardInLibrary;
-
-/**
- *
- * @author Loki
- */
-public class InameDeathAspect extends CardImpl {
-
- public InameDeathAspect(UUID ownerId) {
- super(ownerId, 118, "Iname, Death Aspect", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{B}{B}");
- this.expansionSetCode = "CHK";
- this.supertype.add("Legendary");
- this.subtype.add("Spirit");
-
- this.power = new MageInt(4);
- this.toughness = new MageInt(4);
- this.addAbility(new EntersBattlefieldTriggeredAbility(new InameDeathAspectEffect(), true));
- }
-
- public InameDeathAspect(final InameDeathAspect card) {
- super(card);
- }
-
- @Override
- public InameDeathAspect copy() {
- return new InameDeathAspect(this);
- }
-}
-
-class InameDeathAspectEffect extends SearchEffect {
-
- private static final FilterCreatureCard filter = new FilterCreatureCard();
-
- static {
- filter.add(new SubtypePredicate("Spirit"));
- }
-
- public InameDeathAspectEffect() {
- super(new TargetCardInLibrary(0, Integer.MAX_VALUE, filter), Outcome.Neutral);
- staticText = "search your library for any number of Spirit cards and put them into your graveyard. If you do, shuffle your library";
- }
-
- public InameDeathAspectEffect(final InameDeathAspectEffect effect) {
- super(effect);
- }
-
- @Override
- public InameDeathAspectEffect copy() {
- return new InameDeathAspectEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- if (player != null && player.searchLibrary(target, game)) {
- if (target.getTargets().size() > 0) {
- player.moveCards(new CardsImpl(target.getTargets()), Zone.LIBRARY, Zone.GRAVEYARD, source, game);
- }
- player.shuffleLibrary(game);
- return true;
- }
- return false;
- }
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.championsofkamigawa;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.SearchEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreatureCard;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.common.TargetCardInLibrary;
+
+/**
+ *
+ * @author Loki
+ */
+public class InameDeathAspect extends CardImpl {
+
+ public InameDeathAspect(UUID ownerId) {
+ super(ownerId, 118, "Iname, Death Aspect", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{B}{B}");
+ this.expansionSetCode = "CHK";
+ this.supertype.add("Legendary");
+ this.subtype.add("Spirit");
+
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new InameDeathAspectEffect(), true));
+ }
+
+ public InameDeathAspect(final InameDeathAspect card) {
+ super(card);
+ }
+
+ @Override
+ public InameDeathAspect copy() {
+ return new InameDeathAspect(this);
+ }
+}
+
+class InameDeathAspectEffect extends SearchEffect {
+
+ private static final FilterCreatureCard filter = new FilterCreatureCard();
+
+ static {
+ filter.add(new SubtypePredicate("Spirit"));
+ }
+
+ public InameDeathAspectEffect() {
+ super(new TargetCardInLibrary(0, Integer.MAX_VALUE, filter), Outcome.Neutral);
+ staticText = "search your library for any number of Spirit cards and put them into your graveyard. If you do, shuffle your library";
+ }
+
+ public InameDeathAspectEffect(final InameDeathAspectEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public InameDeathAspectEffect copy() {
+ return new InameDeathAspectEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (player != null && player.searchLibrary(target, game)) {
+ if (target.getTargets().size() > 0) {
+ player.moveCards(new CardsImpl(target.getTargets()), Zone.LIBRARY, Zone.GRAVEYARD, source, game);
+ }
+ player.shuffleLibrary(game);
+ return true;
+ }
+ return false;
+ }
}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/InameLifeAspect.java b/Mage.Sets/src/mage/sets/championsofkamigawa/InameLifeAspect.java
index f9352d28dc8..fc3414cf5e7 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/InameLifeAspect.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/InameLifeAspect.java
@@ -28,20 +28,18 @@
package mage.sets.championsofkamigawa;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.DiesTriggeredAbility;
-import mage.abilities.costs.common.ExileSourceFromGraveCost;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.ExileSourceEffect;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
import mage.constants.Outcome;
-import mage.constants.Zone;
+import mage.constants.Rarity;
import mage.filter.FilterCard;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.Game;
@@ -107,8 +105,11 @@ class InameLifeAspectEffect extends OneShotEffect {
MageObject sourceObject = game.getObject(source.getSourceId());
if (controller != null && sourceObject != null) {
if (controller.chooseUse(outcome, "Exile " + sourceObject.getLogName() + " to return Spirit cards?", source, game)) {
+ Effect effect = new ReturnToHandTargetEffect();
+ effect.setTargetPointer(getTargetPointer());
+ effect.getTargetPointer().init(game, source);
new ExileSourceEffect().apply(game, source);
- return new ReturnToHandTargetEffect().apply(game, source);
+ return effect.apply(game, source);
}
return true;
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/JunkyoBell.java b/Mage.Sets/src/mage/sets/championsofkamigawa/JunkyoBell.java
index 7e1c9efce0f..da08e4cd46b 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/JunkyoBell.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/JunkyoBell.java
@@ -25,13 +25,9 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.championsofkamigawa;
import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
@@ -41,8 +37,10 @@ import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.SacrificeTargetEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
+import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.game.Game;
@@ -58,8 +56,8 @@ public class JunkyoBell extends CardImpl {
public JunkyoBell(UUID ownerId) {
super(ownerId, 258, "Junkyo Bell", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{4}");
this.expansionSetCode = "CHK";
-
- // At the beginning of your upkeep, you may have target creature you control get +X/+X until end of turn,
+
+ // At the beginning of your upkeep, you may have target creature you control get +X/+X until end of turn,
// where X is the number of creatures you control. If you do, sacrifice that creature at the beginning of the next end step.
PermanentsOnBattlefieldCount amount = new PermanentsOnBattlefieldCount(new FilterControlledCreaturePermanent());
Ability ability = new BeginningOfUpkeepTriggeredAbility(new BoostTargetEffect(amount, amount, Duration.EndOfTurn), TargetController.YOU, true);
@@ -77,37 +75,36 @@ public class JunkyoBell extends CardImpl {
return new JunkyoBell(this);
}
-
-private class JunkyoBellSacrificeEffect extends OneShotEffect {
+ private class JunkyoBellSacrificeEffect extends OneShotEffect {
- public JunkyoBellSacrificeEffect() {
- super(Outcome.Sacrifice);
- this.staticText = "If you do, sacrifice that creature at the beginning of the next end step";
- }
-
- public JunkyoBellSacrificeEffect(final JunkyoBellSacrificeEffect effect) {
- super(effect);
- }
-
- @Override
- public JunkyoBellSacrificeEffect copy() {
- return new JunkyoBellSacrificeEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent creature = game.getPermanent(source.getFirstTarget());
- if (creature != null) {
- SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice boosted " + creature.getName());
- sacrificeEffect.setTargetPointer(new FixedTarget(source.getFirstTarget()));
- DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect);
- delayedAbility.setSourceId(source.getSourceId());
- delayedAbility.setControllerId(source.getControllerId());
- delayedAbility.setSourceObject(source.getSourceObject(game), game);
- game.addDelayedTriggeredAbility(delayedAbility);
- return true;
+ public JunkyoBellSacrificeEffect() {
+ super(Outcome.Sacrifice);
+ this.staticText = "If you do, sacrifice that creature at the beginning of the next end step";
+ }
+
+ public JunkyoBellSacrificeEffect(final JunkyoBellSacrificeEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public JunkyoBellSacrificeEffect copy() {
+ return new JunkyoBellSacrificeEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent creature = game.getPermanent(source.getFirstTarget());
+ if (creature != null) {
+ SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice boosted " + creature.getName(), source.getControllerId());
+ sacrificeEffect.setTargetPointer(new FixedTarget(creature, game));
+ DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect);
+ delayedAbility.setSourceId(source.getSourceId());
+ delayedAbility.setControllerId(source.getControllerId());
+ delayedAbility.setSourceObject(source.getSourceObject(game), game);
+ game.addDelayedTriggeredAbility(delayedAbility);
+ return true;
+ }
+ return false;
}
- return false;
}
- }
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/KikiJikiMirrorBreaker.java b/Mage.Sets/src/mage/sets/championsofkamigawa/KikiJikiMirrorBreaker.java
index 3d8eac8a7cd..8eef2b60f3a 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/KikiJikiMirrorBreaker.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/KikiJikiMirrorBreaker.java
@@ -28,10 +28,6 @@
package mage.sets.championsofkamigawa;
import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
@@ -39,19 +35,21 @@ import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.PutTokenOntoBattlefieldCopyTargetEffect;
import mage.abilities.effects.common.SacrificeTargetEffect;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.SupertypePredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
-import mage.game.permanent.token.EmptyToken;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.targetpointer.FixedTarget;
-import mage.util.CardUtil;
/**
*
@@ -112,26 +110,20 @@ class KikiJikiMirrorBreakerEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Permanent permanent = game.getPermanent(source.getFirstTarget());
- if (permanent == null) {
- permanent = (Permanent) game.getLastKnownInformation(source.getFirstTarget(), Zone.BATTLEFIELD);
- }
-
+ Permanent permanent = game.getPermanentOrLKIBattlefield(source.getFirstTarget());
if (permanent != null) {
- EmptyToken token = new EmptyToken();
- CardUtil.copyTo(token).from(permanent);
-
- token.addAbility(HasteAbility.getInstance());
- token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId());
-
- SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect();
- sacrificeEffect.setText("Sacrifice the token at the beginning of the next end step");
- sacrificeEffect.setTargetPointer(new FixedTarget(token.getLastAddedToken()));
- DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect);
- delayedAbility.setSourceId(source.getSourceId());
- delayedAbility.setControllerId(source.getControllerId());
- delayedAbility.setSourceObject(source.getSourceObject(game), game);
- game.addDelayedTriggeredAbility(delayedAbility);
+ PutTokenOntoBattlefieldCopyTargetEffect effect = new PutTokenOntoBattlefieldCopyTargetEffect(source.getControllerId(), null, true);
+ effect.setTargetPointer(new FixedTarget(permanent, game));
+ effect.apply(game, source);
+ for (Permanent addedToken : effect.getAddedPermanent()) {
+ SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("Sacrifice the token at the beginning of the next end step", source.getControllerId());
+ sacrificeEffect.setTargetPointer(new FixedTarget(addedToken.getId()));
+ DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect);
+ delayedAbility.setSourceId(source.getSourceId());
+ delayedAbility.setControllerId(source.getControllerId());
+ delayedAbility.setSourceObject(source.getSourceObject(game), game);
+ game.addDelayedTriggeredAbility(delayedAbility);
+ }
return true;
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/KondasBanner.java b/Mage.Sets/src/mage/sets/championsofkamigawa/KondasBanner.java
index 14109095917..ede835d57b0 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/KondasBanner.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/KondasBanner.java
@@ -154,14 +154,16 @@ class KondasBannerColorBoostEffect extends BoostAllEffect {
Permanent equipment = game.getPermanent(source.getSourceId());
if (equipment != null && equipment.getAttachedTo() != null) {
Permanent equipedCreature = game.getPermanent(equipment.getAttachedTo());
- for (Permanent perm : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) {
- if (equipedCreature.getColor(game).shares(perm.getColor(game))) {
- perm.addPower(power.calculate(game, source, this));
- perm.addToughness(toughness.calculate(game, source, this));
+ if (equipedCreature != null) {
+ for (Permanent perm : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) {
+ if (equipedCreature.getColor(game).shares(perm.getColor(game))) {
+ perm.addPower(power.calculate(game, source, this));
+ perm.addToughness(toughness.calculate(game, source, this));
+ }
}
+ return true;
}
- return true;
}
return false;
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/MelokuTheCloudedMirror.java b/Mage.Sets/src/mage/sets/championsofkamigawa/MelokuTheCloudedMirror.java
index d4e8b1e5690..f1678c2c14c 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/MelokuTheCloudedMirror.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/MelokuTheCloudedMirror.java
@@ -35,7 +35,7 @@ import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -66,7 +66,7 @@ public class MelokuTheCloudedMirror extends CardImpl {
// {1}, Return a land you control to its owner's hand: Put a 1/1 blue Illusion creature token with flying onto the battlefield.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new MelokuTheCloudedMirrorToken(), 1), new GenericManaCost(1));
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/MyojinOfInfiniteRage.java b/Mage.Sets/src/mage/sets/championsofkamigawa/MyojinOfInfiniteRage.java
index bc9ef137476..ac250e6c060 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/MyojinOfInfiniteRage.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/MyojinOfInfiniteRage.java
@@ -59,7 +59,7 @@ public class MyojinOfInfiniteRage extends CardImpl {
private static final FilterLandPermanent filter = new FilterLandPermanent("lands");
public MyojinOfInfiniteRage(UUID ownerId) {
- super(ownerId, 181, "Myojin Of Infinite Rage", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{7}{R}{R}{R}");
+ super(ownerId, 181, "Myojin of Infinite Rage", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{7}{R}{R}{R}");
this.expansionSetCode = "CHK";
this.supertype.add("Legendary");
this.subtype.add("Spirit");
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/NightDealings.java b/Mage.Sets/src/mage/sets/championsofkamigawa/NightDealings.java
index 2a9ee7434df..79ca6d3680c 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/NightDealings.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/NightDealings.java
@@ -25,14 +25,9 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.championsofkamigawa;
import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleActivatedAbility;
@@ -44,7 +39,10 @@ import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.Cards;
import mage.cards.CardsImpl;
+import mage.constants.CardType;
import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.Filter;
import mage.filter.common.FilterNonlandCard;
@@ -61,7 +59,7 @@ import mage.target.common.TargetCardInLibrary;
*/
public class NightDealings extends CardImpl {
- public NightDealings (UUID ownerId) {
+ public NightDealings(UUID ownerId) {
super(ownerId, 132, "Night Dealings", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}{B}");
this.expansionSetCode = "CHK";
@@ -74,7 +72,7 @@ public class NightDealings extends CardImpl {
this.addAbility(ability);
}
- public NightDealings (final NightDealings card) {
+ public NightDealings(final NightDealings card) {
super(card);
}
@@ -83,7 +81,6 @@ public class NightDealings extends CardImpl {
return new NightDealings(this);
}
-
private class NightDealingsTriggeredAbility extends TriggeredAbilityImpl {
public NightDealingsTriggeredAbility() {
@@ -106,17 +103,17 @@ public class NightDealings extends CardImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- // to another player
+ // to another player
if (this.getControllerId() != event.getTargetId()) {
// a source you control
UUID sourceControllerId = game.getControllerId(event.getSourceId());
- if (sourceControllerId != null && sourceControllerId == this.getControllerId()) {
+ if (sourceControllerId != null && sourceControllerId.equals(this.getControllerId())) {
// save amount of damage to effect
this.getEffects().get(0).setValue("damageAmount", event.getAmount());
return true;
}
}
- return false;
+ return false;
}
@Override
@@ -181,9 +178,9 @@ public class NightDealings extends CardImpl {
int cmc = 0;
for (Cost cost : source.getCosts()) {
if (cost instanceof RemoveVariableCountersSourceCost) {
- cmc = ((RemoveVariableCountersSourceCost)cost).getAmount();
+ cmc = ((RemoveVariableCountersSourceCost) cost).getAmount();
}
- }
+ }
FilterNonlandCard filter = new FilterNonlandCard("nonland card with converted mana cost X = " + cmc);
filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.Equal, cmc));
@@ -192,8 +189,8 @@ public class NightDealings extends CardImpl {
if (player.searchLibrary(target, game)) {
Card card = player.getLibrary().getCard(target.getFirstTarget(), game);
if (card != null) {
- card.moveToZone(Zone.HAND, source.getSourceId(), game, false);
-
+ card.moveToZone(Zone.HAND, source.getSourceId(), game, false);
+
String name = "Reveal";
Cards cards = new CardsImpl();
cards.add(card);
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/NineRingedBo.java b/Mage.Sets/src/mage/sets/championsofkamigawa/NineRingedBo.java
index 6914d9ff5bb..8f5ac8aaffa 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/NineRingedBo.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/NineRingedBo.java
@@ -28,27 +28,19 @@
package mage.sets.championsofkamigawa;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.Effect;
-import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.replacement.DealtDamageToCreatureBySourceDies;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.events.GameEvent.EventType;
-import mage.game.events.ZoneChangeEvent;
-import mage.game.permanent.Permanent;
-import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.watchers.common.DamagedByWatcher;
@@ -74,7 +66,7 @@ public class NineRingedBo extends CardImpl {
Effect effect = new DealtDamageToCreatureBySourceDies(this, Duration.EndOfTurn);
effect.setText("If that creature would die this turn, exile it instead");
ability.addEffect(effect);
- this.addAbility(ability);
+ this.addAbility(ability, new DamagedByWatcher());
}
public NineRingedBo(final NineRingedBo card) {
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/OniPossession.java b/Mage.Sets/src/mage/sets/championsofkamigawa/OniPossession.java
index bc1c23d49e2..44fd1be0eb2 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/OniPossession.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/OniPossession.java
@@ -30,22 +30,26 @@ package mage.sets.championsofkamigawa;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
-
-import mage.constants.*;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
-import mage.abilities.effects.common.SacrificeTargetEffect;
+import mage.abilities.effects.common.SacrificeControllerEffect;
import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.effects.common.continuous.SetCardSubtypeAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.target.TargetPermanent;
-import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
/**
@@ -54,7 +58,8 @@ import mage.target.common.TargetCreaturePermanent;
*/
public class OniPossession extends CardImpl {
- private static final List setSubtypes = new ArrayList();
+ private static final List setSubtypes = new ArrayList<>();
+
static {
setSubtypes.add("Demon");
setSubtypes.add("Spirit");
@@ -67,13 +72,14 @@ public class OniPossession extends CardImpl {
// Enchant creature
TargetPermanent auraTarget = new TargetCreaturePermanent();
- this.getSpellAbility().addTarget(auraTarget);
- this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
- Ability ability = new EnchantAbility(auraTarget.getTargetName());
- this.addAbility(ability);
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+
// At the beginning of your upkeep, sacrifice a creature.
- Ability ability2 = new BeginningOfUpkeepTriggeredAbility(new SacrificeTargetEffect("sacrifice a creature"), TargetController.YOU, false);
- ability2.addTarget(new TargetControlledCreaturePermanent(1,1, new FilterControlledCreaturePermanent(),false));
+ Ability ability2 = new BeginningOfUpkeepTriggeredAbility(
+ new SacrificeControllerEffect(new FilterControlledCreaturePermanent(), 1, ""), TargetController.YOU, false);
this.addAbility(ability2);
// Enchanted creature gets +3/+3 and has trample.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(3, 3, Duration.WhileOnBattlefield)));
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/OrochiHatchery.java b/Mage.Sets/src/mage/sets/championsofkamigawa/OrochiHatchery.java
index 242e3557c13..ca6ed57092f 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/OrochiHatchery.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/OrochiHatchery.java
@@ -1,16 +1,16 @@
/*
* Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
@@ -20,7 +20,7 @@
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
+ *
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
@@ -28,24 +28,19 @@
package mage.sets.championsofkamigawa;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.common.CountersCount;
-import mage.abilities.effects.EntersBattlefieldEffect;
-import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.counters.CounterType;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
import mage.game.permanent.token.SnakeToken;
/**
@@ -58,10 +53,10 @@ public class OrochiHatchery extends CardImpl {
this.expansionSetCode = "CHK";
// Orochi Hatchery enters the battlefield with X charge counters on it.
- this.addAbility(new EntersBattlefieldAbility(new OrochiHatcheryEffect(), "with X charge counters on it"));
+ this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.CHARGE.createInstance())));
// {5}, {T}: Put a 1/1 green Snake creature token onto the battlefield for each charge counter on Orochi Hatchery.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new SnakeToken(),new CountersCount(CounterType.CHARGE)), new GenericManaCost(5));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new SnakeToken(), new CountersCount(CounterType.CHARGE)), new GenericManaCost(5));
ability.addCost(new TapSourceCost());
this.addAbility(ability);
}
@@ -76,35 +71,3 @@ public class OrochiHatchery extends CardImpl {
}
}
-
-class OrochiHatcheryEffect extends OneShotEffect {
- public OrochiHatcheryEffect() {
- super(Outcome.Benefit);
- }
-
- public OrochiHatcheryEffect(final OrochiHatcheryEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent permanent = game.getPermanent(source.getSourceId());
- if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility) {
- // delete to prevent using it again if put into battlefield from other effect
- setValue(mage.abilities.effects.EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY, null);
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
- if (amount > 0) {
- permanent.addCounters(CounterType.CHARGE.createInstance(amount), game);
- }
- }
- }
- return true;
- }
-
- @Override
- public OrochiHatcheryEffect copy() {
- return new OrochiHatcheryEffect(this);
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/OtherworldlyJourney.java b/Mage.Sets/src/mage/sets/championsofkamigawa/OtherworldlyJourney.java
index 00a11497edb..248b962c6f1 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/OtherworldlyJourney.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/OtherworldlyJourney.java
@@ -25,14 +25,10 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.championsofkamigawa;
import java.util.UUID;
import mage.MageObjectReference;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
@@ -40,12 +36,15 @@ import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.cards.Card;
import mage.cards.CardImpl;
+import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
+import mage.constants.Rarity;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.ExileZone;
import mage.game.Game;
+import mage.game.events.EntersTheBattlefieldEvent;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent;
@@ -61,7 +60,7 @@ public class OtherworldlyJourney extends CardImpl {
super(ownerId, 37, "Otherworldly Journey", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{W}");
this.expansionSetCode = "CHK";
this.subtype.add("Arcane");
-
+
// Exile target creature. At the beginning of the next end step, return that card to the battlefield under its owner's control with a +1/+1 counter on it.
this.getSpellAbility().addEffect(new OtherworldlyJourneyEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
@@ -82,7 +81,7 @@ class OtherworldlyJourneyEffect extends OneShotEffect {
private static final String effectText = "Exile target creature. At the beginning of the next end step, return that card to the battlefield under its owner's control with a +1/+1 counter on it";
- OtherworldlyJourneyEffect ( ) {
+ OtherworldlyJourneyEffect() {
super(Outcome.Benefit);
staticText = effectText;
}
@@ -102,12 +101,12 @@ class OtherworldlyJourneyEffect extends OneShotEffect {
Card card = game.getCard(permanent.getId());
if (card != null) {
//create delayed triggered ability
- DelayedTriggeredAbility delayedAbility =
- new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new OtherworldlyJourneyReturnFromExileEffect(new MageObjectReference(card, game)));
+ DelayedTriggeredAbility delayedAbility
+ = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new OtherworldlyJourneyReturnFromExileEffect(new MageObjectReference(card, game)));
delayedAbility.setSourceId(source.getSourceId());
delayedAbility.setControllerId(source.getControllerId());
delayedAbility.setSourceObject(source.getSourceObject(game), game);
- game.addDelayedTriggeredAbility(delayedAbility);
+ game.addDelayedTriggeredAbility(delayedAbility);
}
}
return true;
@@ -126,6 +125,7 @@ class OtherworldlyJourneyEffect extends OneShotEffect {
class OtherworldlyJourneyReturnFromExileEffect extends OneShotEffect {
MageObjectReference objectToReturn;
+
public OtherworldlyJourneyReturnFromExileEffect(MageObjectReference objectToReturn) {
super(Outcome.PutCardInPlay);
this.objectToReturn = objectToReturn;
@@ -148,19 +148,18 @@ class OtherworldlyJourneyReturnFromExileEffect extends OneShotEffect {
if (card != null && objectToReturn.refersTo(card, game)) {
Player owner = game.getPlayer(card.getOwnerId());
if (owner != null) {
- game.addEffect(new OtherworldlyJourneyEntersBattlefieldEffect(objectToReturn), source);
- owner.putOntoBattlefieldWithInfo(card, game, Zone.EXILED, source.getSourceId());
+ game.addEffect(new OtherworldlyJourneyEntersBattlefieldEffect(objectToReturn), source);
+ owner.moveCards(card, Zone.BATTLEFIELD, source, game, false, false, true, null);
}
}
return true;
}
}
-
class OtherworldlyJourneyEntersBattlefieldEffect extends ReplacementEffectImpl {
-
+
MageObjectReference objectToReturn;
-
+
public OtherworldlyJourneyEntersBattlefieldEffect(MageObjectReference objectToReturn) {
super(Duration.Custom, Outcome.BoostCreature);
this.objectToReturn = objectToReturn;
@@ -187,7 +186,7 @@ class OtherworldlyJourneyEntersBattlefieldEffect extends ReplacementEffectImpl {
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- Permanent permanent = game.getPermanent(event.getTargetId());
+ Permanent permanent = ((EntersTheBattlefieldEvent) event).getTarget();
if (permanent != null) {
permanent.addCounters(CounterType.P1P1.createInstance(), game);
discard(); // use only once
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/Reciprocate.java b/Mage.Sets/src/mage/sets/championsofkamigawa/Reciprocate.java
index 65eac2b615a..5098fa1427c 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/Reciprocate.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/Reciprocate.java
@@ -25,7 +25,6 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.championsofkamigawa;
import java.util.HashSet;
@@ -48,8 +47,8 @@ import mage.watchers.common.PlayerDamagedBySourceWatcher;
*/
public class Reciprocate extends CardImpl {
- public Reciprocate(UUID ownerId) {
- super(ownerId, 40, "Reciprocate", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{W}");
+ public Reciprocate(UUID ownerId) {
+ super(ownerId, 40, "Reciprocate", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{W}");
this.expansionSetCode = "CHK";
// Exile target creature that dealt damage to you this turn.
@@ -81,7 +80,7 @@ class ReciprocateTarget extends TargetPermanent {
@Override
public boolean canTarget(UUID id, Ability source, Game game) {
- PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource",source.getControllerId());
+ PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource", source.getControllerId());
if (watcher != null && watcher.hasSourceDoneDamage(id, game)) {
return super.canTarget(id, source, game);
}
@@ -95,7 +94,7 @@ class ReciprocateTarget extends TargetPermanent {
PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource", sourceControllerId);
for (UUID targetId : availablePossibleTargets) {
Permanent permanent = game.getPermanent(targetId);
- if(permanent != null && watcher != null && watcher.hasSourceDoneDamage(targetId, game)){
+ if (permanent != null && watcher != null && watcher.hasSourceDoneDamage(targetId, game)) {
possibleTargets.add(targetId);
}
}
@@ -111,14 +110,14 @@ class ReciprocateTarget extends TargetPermanent {
int count = 0;
MageObject targetSource = game.getObject(sourceId);
PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource", sourceControllerId);
- for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
- if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
+ if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)
&& watcher != null && watcher.hasSourceDoneDamage(permanent.getId(), game)) {
- count++;
- if (count >= remainingTargets) {
- return true;
- }
+ count++;
+ if (count >= remainingTargets) {
+ return true;
}
+ }
}
return false;
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/Reweave.java b/Mage.Sets/src/mage/sets/championsofkamigawa/Reweave.java
index 665831faad9..6a82d96309c 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/Reweave.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/Reweave.java
@@ -28,6 +28,7 @@
package mage.sets.championsofkamigawa;
import java.util.UUID;
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.SpliceOntoArcaneAbility;
@@ -58,7 +59,6 @@ public class Reweave extends CardImpl {
this.expansionSetCode = "CHK";
this.subtype.add("Arcane");
-
// Target permanent's controller sacrifices it. If he or she does, that player reveals cards from the top of his or her library until he or she reveals a permanent card that shares a card type with the sacrificed permanent, puts that card onto the battlefield, then shuffles his or her library.
this.getSpellAbility().addEffect(new ReweaveEffect());
Target target = new TargetPermanent();
@@ -97,9 +97,10 @@ class ReweaveEffect extends OneShotEffect {
}
@Override
- public boolean apply(Game game, Ability source) {
- Permanent permanent = game.getPermanent(source.getTargets().getFirstTarget());
- if (permanent != null) {
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
+ MageObject sourceObject = source.getSourceObject(game);
+ if (permanent != null && sourceObject != null) {
if (permanent.sacrifice(source.getSourceId(), game)) {
Player permanentController = game.getPlayer(permanent.getControllerId());
if (permanentController != null) {
@@ -122,11 +123,11 @@ class ReweaveEffect extends OneShotEffect {
}
}
} while (!cardFound && library.size() > 0);
- permanentController.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId());
+ permanentController.moveCards(card, Zone.BATTLEFIELD, source, game);
}
if (cards.size() > 0) {
- permanentController.revealCards("Reweave", cards, game);
+ permanentController.revealCards(sourceObject.getIdName(), cards, game);
if (cardFound && card != null) {
cards.remove(card);
}
@@ -137,7 +138,7 @@ class ReweaveEffect extends OneShotEffect {
return true;
}
return false;
- }
+ }
}
return true;
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/RyuseiTheFallingStar.java b/Mage.Sets/src/mage/sets/championsofkamigawa/RyuseiTheFallingStar.java
index 22072830492..db772aa455f 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/RyuseiTheFallingStar.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/RyuseiTheFallingStar.java
@@ -53,7 +53,7 @@ public class RyuseiTheFallingStar extends CardImpl {
}
public RyuseiTheFallingStar(UUID ownerID) {
- super(ownerID, 185, "Ryusei, The Falling Star", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{R}");
+ super(ownerID, 185, "Ryusei, the Falling Star", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{R}");
this.expansionSetCode = "CHK";
this.supertype.add("Legendary");
this.subtype.add("Dragon");
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/ShimatsuTheBloodcloaked.java b/Mage.Sets/src/mage/sets/championsofkamigawa/ShimatsuTheBloodcloaked.java
index 49f139f2639..958837afe7a 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/ShimatsuTheBloodcloaked.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/ShimatsuTheBloodcloaked.java
@@ -28,16 +28,20 @@
package mage.sets.championsofkamigawa;
import java.util.UUID;
-
-import mage.constants.*;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.common.FilterControlledPermanent;
import mage.game.Game;
+import mage.game.events.EntersTheBattlefieldEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
@@ -61,7 +65,7 @@ public class ShimatsuTheBloodcloaked extends CardImpl {
this.toughness = new MageInt(0);
// As Shimatsu the Bloodcloaked enters the battlefield, sacrifice any number of permanents. Shimatsu enters the battlefield with that many +1/+1 counters on it.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ShimatsuTheBloodcloakedEffect()));
+ this.addAbility(new SimpleStaticAbility(Zone.ALL, new ShimatsuTheBloodcloakedEffect()));
}
public ShimatsuTheBloodcloaked(final ShimatsuTheBloodcloaked card) {
@@ -75,16 +79,16 @@ public class ShimatsuTheBloodcloaked extends CardImpl {
}
class ShimatsuTheBloodcloakedEffect extends ReplacementEffectImpl {
-
+
public ShimatsuTheBloodcloakedEffect() {
- super(Duration.WhileOnBattlefield, Outcome.BoostCreature);
+ super(Duration.EndOfGame, Outcome.BoostCreature);
this.staticText = "As {this} enters the battlefield, sacrifice any number of permanents. {this} enters the battlefield with that many +1/+1 counters on it";
}
-
+
public ShimatsuTheBloodcloakedEffect(final ShimatsuTheBloodcloakedEffect effect) {
super(effect);
}
-
+
@Override
public ShimatsuTheBloodcloakedEffect copy() {
return new ShimatsuTheBloodcloakedEffect(this);
@@ -94,15 +98,15 @@ class ShimatsuTheBloodcloakedEffect extends ReplacementEffectImpl {
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
}
-
+
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- return event.getTargetId().equals(source.getSourceId());
+ return event.getTargetId().equals(source.getSourceId());
}
-
+
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- Permanent creature = game.getPermanent(event.getTargetId());
+ Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget();
Player controller = game.getPlayer(source.getControllerId());
if (creature != null && controller != null) {
Target target = new TargetControlledPermanent(0, Integer.MAX_VALUE, new FilterControlledPermanent(), true);
@@ -112,8 +116,8 @@ class ShimatsuTheBloodcloakedEffect extends ReplacementEffectImpl {
controller.chooseTarget(Outcome.Detriment, target, source, game);
if (target.getTargets().size() > 0) {
int sacrificedCreatures = target.getTargets().size();
- game.informPlayers(new StringBuilder(controller.getLogName()).append(" sacrifices ").append(sacrificedCreatures).append(" creatures for ").append(creature.getName()).toString());
- for (UUID targetId: target.getTargets()) {
+ game.informPlayers(controller.getLogName() + " sacrifices " + sacrificedCreatures + " creatures for " + creature.getLogName());
+ for (UUID targetId : target.getTargets()) {
Permanent targetCreature = game.getPermanent(targetId);
if (targetCreature == null || !targetCreature.sacrifice(source.getSourceId(), game)) {
return false;
@@ -124,5 +128,5 @@ class ShimatsuTheBloodcloakedEffect extends ReplacementEffectImpl {
}
return false;
}
-
+
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SiftThroughSands.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SiftThroughSands.java
index 58e84d068ab..2e2206feef0 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/SiftThroughSands.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SiftThroughSands.java
@@ -32,8 +32,8 @@ import mage.abilities.Ability;
import mage.abilities.condition.Condition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.Effect;
-import mage.abilities.effects.common.discard.DiscardControllerEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.discard.DiscardControllerEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
@@ -56,6 +56,7 @@ public class SiftThroughSands extends CardImpl {
private static final String rule = "If you've cast a spell named Peer Through Depths and a spell named Reach Through Mists this turn, you may search your library for a card named The Unspeakable, put it onto the battlefield, then shuffle your library";
private static final FilterCreatureCard filter = new FilterCreatureCard("a card named The Unspeakable");
+
static {
filter.add(new NamePredicate("The Unspeakable"));
}
@@ -65,13 +66,12 @@ public class SiftThroughSands extends CardImpl {
this.expansionSetCode = "CHK";
this.subtype.add("Arcane");
-
// Draw two cards, then discard a card.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(2));
Effect effect = new DiscardControllerEffect(1);
effect.setText(", then discard a card");
this.getSpellAbility().addEffect(effect);
-
+
// If you've cast a spell named Peer Through Depths and a spell named Reach Through Mists this turn, you may search your library for a card named The Unspeakable, put it onto the battlefield, then shuffle your library.
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), false, true), new SiftThroughSandsCondition(), rule));
this.getSpellAbility().addWatcher(new SiftThroughSandsWatcher());
@@ -125,7 +125,7 @@ class SiftThroughSandsWatcher extends Watcher {
return;
}
if (event.getType() == EventType.SPELL_CAST
- && controllerId == event.getPlayerId()) {
+ && controllerId.equals(event.getPlayerId())) {
Spell spell = game.getStack().getSpell(event.getTargetId());
if (spell.getCard().getName().equals("Peer Through Depths")) {
castPeerThroughDepths = true;
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiCloudskater.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiCloudskater.java
index bbcd6a5665e..4832aa5cd82 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiCloudskater.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiCloudskater.java
@@ -25,21 +25,20 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.championsofkamigawa;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.common.FilterControlledLandPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.target.common.TargetControlledPermanent;
@@ -65,7 +64,7 @@ public class SoratamiCloudskater extends CardImpl {
// {2}, Return a land you control to its owner's hand: Draw a card, then discard a card.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawDiscardControllerEffect(), new GenericManaCost(2));
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(1, 1, filter, true)));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorGuard.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorGuard.java
index c429582b1d1..f06f9b1ef96 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorGuard.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorGuard.java
@@ -35,7 +35,7 @@ import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -74,7 +74,7 @@ public class SoratamiMirrorGuard extends CardImpl {
// {2}, Return a land you control to its owner's hand: Target creature with power 2 or less can't be blocked this turn.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBeBlockedTargetEffect(), new GenericManaCost(2));
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
ability.addTarget(new TargetCreaturePermanent(filterCreature));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorMage.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorMage.java
index 458fdc8a00c..e93013bedc7 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorMage.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorMage.java
@@ -25,21 +25,20 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.championsofkamigawa;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.common.FilterControlledLandPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.target.common.TargetControlledPermanent;
@@ -66,7 +65,7 @@ public class SoratamiMirrorMage extends CardImpl {
// {3}, Return three lands you control to their owner's hand: Return target creature to its owner's hand.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new GenericManaCost(3));
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(3, 3, filter, false)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(3, 3, filter, true)));
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiRainshaper.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiRainshaper.java
index 7f32cbe86db..3d0e59bc518 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiRainshaper.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiRainshaper.java
@@ -35,7 +35,7 @@ import mage.constants.Rarity;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -69,7 +69,7 @@ public class SoratamiRainshaper extends CardImpl {
// {3}, Return a land you control to its owner's hand: Target creature you control gains shroud until end of turn. (It can't be the target of spells or abilities.)
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityTargetEffect(ShroudAbility.getInstance(), Duration.EndOfTurn), new GenericManaCost(3));
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSavant.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSavant.java
index 1060fdd8b36..9d479f7d85e 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSavant.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSavant.java
@@ -35,7 +35,7 @@ import mage.constants.Rarity;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.CounterUnlessPaysEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -67,7 +67,7 @@ public class SoratamiSavant extends CardImpl {
// {3}, Return a land you control to its owner's hand: Counter target spell unless its controller pays {3}.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(new GenericManaCost(3)), new GenericManaCost(3));
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
ability.addTarget(new TargetSpell());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSeer.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSeer.java
index 344923e03db..9887cb743b1 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSeer.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSeer.java
@@ -36,7 +36,7 @@ import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -70,7 +70,7 @@ public class SoratamiSeer extends CardImpl {
// {4}, Return two lands you control to their owner's hand: Discard all the cards in your hand, then draw that many cards.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SoratamiSeerEffect(), new GenericManaCost(4));
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(2, 2, filter, false)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(2, 2, filter, false)));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SosukeSonOfSeshiro.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SosukeSonOfSeshiro.java
index 29c128af844..8cdf926c72c 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/SosukeSonOfSeshiro.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SosukeSonOfSeshiro.java
@@ -29,17 +29,16 @@ package mage.sets.championsofkamigawa;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
-import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
@@ -76,7 +75,10 @@ public class SosukeSonOfSeshiro extends CardImpl {
// Other Snake creatures you control get +1/+0.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 0, Duration.WhileOnBattlefield, filter, true)));
// Whenever a Warrior you control deals combat damage to a creature, destroy that creature at end of combat.
- this.addAbility(new SosukeSonOfSeshiroTriggeredAbility());
+ Effect effect = new CreateDelayedTriggeredAbilityEffect(
+ new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect()), true);
+ effect.setText("destroy that creature at end of combat");
+ this.addAbility(new SosukeSonOfSeshiroTriggeredAbility(effect));
}
public SosukeSonOfSeshiro(final SosukeSonOfSeshiro card) {
@@ -91,8 +93,8 @@ public class SosukeSonOfSeshiro extends CardImpl {
class SosukeSonOfSeshiroTriggeredAbility extends TriggeredAbilityImpl {
- SosukeSonOfSeshiroTriggeredAbility() {
- super(Zone.BATTLEFIELD, new SosukeSonOfSeshiroEffect());
+ SosukeSonOfSeshiroTriggeredAbility(Effect effect) {
+ super(Zone.BATTLEFIELD, effect);
}
SosukeSonOfSeshiroTriggeredAbility(final SosukeSonOfSeshiroTriggeredAbility ability) {
@@ -128,35 +130,3 @@ class SosukeSonOfSeshiroTriggeredAbility extends TriggeredAbilityImpl {
return "Whenever a Warrior you control deals combat damage to a creature, destroy that creature at end of combat.";
}
}
-
-class SosukeSonOfSeshiroEffect extends OneShotEffect {
-
- SosukeSonOfSeshiroEffect() {
- super(Outcome.DestroyPermanent);
- staticText = "destroy that creature at end of combat";
- }
-
- SosukeSonOfSeshiroEffect(final SosukeSonOfSeshiroEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent targetCreature = game.getPermanent(this.getTargetPointer().getFirst(game, source));
- if (targetCreature != null) {
- AtTheEndOfCombatDelayedTriggeredAbility delayedAbility = new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect());
- delayedAbility.setSourceId(source.getSourceId());
- delayedAbility.setControllerId(source.getControllerId());
- delayedAbility.setSourceObject(source.getSourceObject(game), game);
- delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(targetCreature.getId()));
- game.addDelayedTriggeredAbility(delayedAbility);
- return true;
- }
- return false;
- }
-
- @Override
- public SosukeSonOfSeshiroEffect copy() {
- return new SosukeSonOfSeshiroEffect(this);
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/TatsumasaTheDragonsFang.java b/Mage.Sets/src/mage/sets/championsofkamigawa/TatsumasaTheDragonsFang.java
index a9e7ff37dbf..1cd6c9b8a55 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/TatsumasaTheDragonsFang.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/TatsumasaTheDragonsFang.java
@@ -35,9 +35,10 @@ import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.ExileSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlSourceEffect;
+import mage.abilities.effects.common.ReturnToBattlefieldUnderOwnerControlTargetEffect;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
import mage.abilities.keyword.EquipAbility;
import mage.abilities.keyword.FlyingAbility;
@@ -51,6 +52,7 @@ import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.events.ZoneChangeEvent;
+import mage.game.permanent.Permanent;
import mage.game.permanent.token.Token;
import mage.target.targetpointer.FixedTarget;
@@ -73,7 +75,7 @@ public class TatsumasaTheDragonsFang extends CardImpl {
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TatsumaTheDragonsFangEffect(), new GenericManaCost(6));
ability.addCost(new ExileSourceCost(true));
this.addAbility(ability);
-
+
// Equip {3}
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(3)));
}
@@ -106,14 +108,21 @@ class TatsumaTheDragonsFangEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- CreateTokenEffect effect = new CreateTokenEffect(new TatsumaDragonToken());
+ CreateTokenEffect effect = new CreateTokenEffect(new TatsumaDragonToken());
effect.apply(game, source);
- FixedTarget fixedTarget = new FixedTarget(effect.getLastAddedTokenId());
- DelayedTriggeredAbility delayedAbility = new TatsumaTheDragonsFangTriggeredAbility(fixedTarget);
- delayedAbility.setSourceId(source.getSourceId());
- delayedAbility.setControllerId(source.getControllerId());
- delayedAbility.setSourceObject(source.getSourceObject(game), game);
- game.addDelayedTriggeredAbility(delayedAbility);
+ for (UUID tokenId : effect.getLastAddedTokenIds()) { // by cards like Doubling Season multiple tokens can be added to the battlefield
+ Permanent tokenPermanent = game.getPermanent(tokenId);
+ if (tokenPermanent != null) {
+ FixedTarget fixedTarget = new FixedTarget(tokenPermanent, game);
+ Effect returnEffect = new ReturnToBattlefieldUnderOwnerControlTargetEffect();
+ returnEffect.setTargetPointer(new FixedTarget(source.getSourceId(), game.getState().getZoneChangeCounter(source.getSourceId())));
+ DelayedTriggeredAbility delayedAbility = new TatsumaTheDragonsFangTriggeredAbility(fixedTarget, returnEffect);
+ delayedAbility.setSourceId(source.getSourceId());
+ delayedAbility.setControllerId(source.getControllerId());
+ delayedAbility.setSourceObject(source.getSourceObject(game), game);
+ game.addDelayedTriggeredAbility(delayedAbility);
+ }
+ }
return true;
}
@@ -123,8 +132,8 @@ class TatsumaTheDragonsFangTriggeredAbility extends DelayedTriggeredAbility {
protected FixedTarget fixedTarget;
- public TatsumaTheDragonsFangTriggeredAbility(FixedTarget fixedTarget) {
- super(new ReturnToBattlefieldUnderYourControlSourceEffect(), Duration.OneUse);
+ public TatsumaTheDragonsFangTriggeredAbility(FixedTarget fixedTarget, Effect effect) {
+ super(effect, Duration.OneUse);
this.fixedTarget = fixedTarget;
}
@@ -155,11 +164,12 @@ class TatsumaTheDragonsFangTriggeredAbility extends DelayedTriggeredAbility {
@Override
public String getRule() {
- return "Return {this} to the battlefield under its owner's control when that token dies." ;
+ return "Return {this} to the battlefield under its owner's control when that token dies.";
}
}
class TatsumaDragonToken extends Token {
+
public TatsumaDragonToken() {
super("Dragon Spirit", "5/5 blue Dragon Spirit creature token with flying");
cardType.add(CardType.CREATURE);
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/ThroughTheBreach.java b/Mage.Sets/src/mage/sets/championsofkamigawa/ThroughTheBreach.java
index 86980d0f771..f8510304312 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/ThroughTheBreach.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/ThroughTheBreach.java
@@ -63,7 +63,6 @@ public class ThroughTheBreach extends CardImpl {
this.expansionSetCode = "CHK";
this.subtype.add("Arcane");
-
// You may put a creature card from your hand onto the battlefield. That creature gains haste. Sacrifice that creature at the beginning of the next end step.
this.getSpellAbility().addEffect(new ThroughTheBreachEffect());
// Splice onto Arcane {2}{R}{R}
@@ -81,7 +80,7 @@ public class ThroughTheBreach extends CardImpl {
}
class ThroughTheBreachEffect extends OneShotEffect {
-
+
private static final String choiceText = "Put a creature card from your hand onto the battlefield?";
public ThroughTheBreachEffect() {
@@ -107,14 +106,14 @@ class ThroughTheBreachEffect extends OneShotEffect {
if (controller.choose(Outcome.PutCreatureInPlay, target, source.getSourceId(), game)) {
Card card = game.getCard(target.getFirstTarget());
if (card != null) {
- if (controller.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId())) {
+ if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) {
Permanent permanent = game.getPermanent(card.getId());
if (permanent != null) {
ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom);
- effect.setTargetPointer(new FixedTarget(permanent.getId()));
+ effect.setTargetPointer(new FixedTarget(permanent, game));
game.addEffect(effect, source);
- SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice " + card.getName());
- sacrificeEffect.setTargetPointer(new FixedTarget(card.getId()));
+ SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice " + card.getName(), source.getControllerId());
+ sacrificeEffect.setTargetPointer(new FixedTarget(permanent, game));
DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect);
delayedAbility.setSourceId(source.getSourceId());
delayedAbility.setControllerId(source.getControllerId());
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/UnearthlyBlizzard.java b/Mage.Sets/src/mage/sets/championsofkamigawa/UnearthlyBlizzard.java
index 242df18ed16..29f76f4196d 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/UnearthlyBlizzard.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/UnearthlyBlizzard.java
@@ -43,7 +43,7 @@ import mage.target.common.TargetCreaturePermanent;
public class UnearthlyBlizzard extends CardImpl {
public UnearthlyBlizzard(UUID ownerId) {
- super(ownerId, 196, "Unearthly Blizzard", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{R}");
+ super(ownerId, 196, "Unearthly Blizzard", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{R}");
this.expansionSetCode = "CHK";
this.subtype.add("Arcane");
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/UyoSilentProphet.java b/Mage.Sets/src/mage/sets/championsofkamigawa/UyoSilentProphet.java
index 9b0b414d4ae..e3f4928b4fa 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/UyoSilentProphet.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/UyoSilentProphet.java
@@ -34,7 +34,7 @@ import mage.constants.Rarity;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.CopyTargetSpellEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -75,7 +75,7 @@ public class UyoSilentProphet extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// {2}, Return two lands you control to their owner's hand: Copy target instant or sorcery spell. You may choose new targets for the copy.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new GenericManaCost(2));
- ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(2, 2, new FilterControlledLandPermanent("lands"), false)));
+ ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(2, 2, new FilterControlledLandPermanent("lands"), false)));
ability.addTarget(new TargetSpell(filter));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/VassalsDuty.java b/Mage.Sets/src/mage/sets/championsofkamigawa/VassalsDuty.java
index 71230bc44e6..abd2d87510e 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/VassalsDuty.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/VassalsDuty.java
@@ -31,8 +31,7 @@ import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.GenericManaCost;
-import mage.abilities.effects.PreventionEffectData;
-import mage.abilities.effects.PreventionEffectImpl;
+import mage.abilities.effects.RedirectionEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
@@ -42,8 +41,7 @@ import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.mageobject.SupertypePredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
-import mage.game.permanent.Permanent;
-import mage.players.Player;
+import mage.target.TargetPlayer;
import mage.target.common.TargetControlledCreaturePermanent;
/**
@@ -53,6 +51,7 @@ import mage.target.common.TargetControlledCreaturePermanent;
public class VassalsDuty extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("legendary creature you control");
+
static {
filter.add(new SupertypePredicate("Legendary"));
}
@@ -61,10 +60,9 @@ public class VassalsDuty extends CardImpl {
super(ownerId, 48, "Vassal's Duty", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}");
this.expansionSetCode = "CHK";
-
// {1}: The next 1 damage that would be dealt to target legendary creature you control this turn is dealt to you instead.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new VassalsDutyPreventDamageTargetEffect(Duration.EndOfTurn, 1), new GenericManaCost(1));
- ability.addTarget(new TargetControlledCreaturePermanent(1,1,filter, false));
+ ability.addTarget(new TargetControlledCreaturePermanent(1, 1, filter, false));
this.addAbility(ability);
}
@@ -78,10 +76,10 @@ public class VassalsDuty extends CardImpl {
}
}
-class VassalsDutyPreventDamageTargetEffect extends PreventionEffectImpl {
+class VassalsDutyPreventDamageTargetEffect extends RedirectionEffect {
public VassalsDutyPreventDamageTargetEffect(Duration duration, int amount) {
- super(duration, amount, false);
+ super(duration, amount, true);
staticText = "The next " + amount + " damage that would be dealt to target legendary creature you control this turn is dealt to you instead";
}
@@ -94,29 +92,13 @@ class VassalsDutyPreventDamageTargetEffect extends PreventionEffectImpl {
return new VassalsDutyPreventDamageTargetEffect(this);
}
- @Override
- public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- PreventionEffectData preventionResult = preventDamageAction(event, source, game);
- // deal damage now
- if (preventionResult.getPreventedDamage() > 0) {
- UUID redirectTo = source.getControllerId();
- Player player = game.getPlayer(redirectTo);
- if (player != null) {
- game.informPlayers("Dealing " + preventionResult.getPreventedDamage() + " to " + player.getLogName() + " instead");
- // keep the original source id as it is redirecting
- player.damage(preventionResult.getPreventedDamage(), event.getSourceId(), game, false, true);
- }
- }
- // damage amount is reduced or set to 0 so complete replacement of damage event is never neccessary
- return false;
- }
-
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- if (!this.used && super.applies(event, source, game)) {
- if (event.getTargetId().equals(getTargetPointer().getFirst(game, source))) {
- return game.getPermanent(event.getTargetId()) != null;
- }
+ if (event.getTargetId().equals(getTargetPointer().getFirst(game, source))) {
+ TargetPlayer target = new TargetPlayer();
+ target.add(source.getControllerId(), game);
+ redirectTarget = target;
+ return true;
}
return false;
}
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/YamabushisStorm.java b/Mage.Sets/src/mage/sets/championsofkamigawa/YamabushisStorm.java
index 9ec4a27bccf..ad1ceef375e 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/YamabushisStorm.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/YamabushisStorm.java
@@ -77,45 +77,3 @@ public class YamabushisStorm extends CardImpl {
}
}
-
-class YamabushisStormEffect extends ReplacementEffectImpl {
-
- public YamabushisStormEffect() {
- super(Duration.EndOfTurn, Outcome.Exile);
- staticText = "If a creature dealt damage this way would die this turn, exile it instead";
- }
-
- public YamabushisStormEffect(final YamabushisStormEffect effect) {
- super(effect);
- }
-
- @Override
- public YamabushisStormEffect copy() {
- return new YamabushisStormEffect(this);
- }
-
- @Override
- public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- Player controller = game.getPlayer(source.getControllerId());
- Permanent permanent = ((ZoneChangeEvent) event).getTarget();
- if (controller != null && permanent != null) {
- return controller.moveCardToExileWithInfo(permanent, null, "", source.getSourceId(), game, Zone.BATTLEFIELD, true);
- }
- return false;
- }
-
- @Override
- public boolean checksEventType(GameEvent event, Game game) {
- return event.getType() == EventType.ZONE_CHANGE;
- }
-
- @Override
- public boolean applies(GameEvent event, Ability source, Game game) {
- if (((ZoneChangeEvent) event).isDiesEvent()) {
- DamagedByWatcher watcher = (DamagedByWatcher) game.getState().getWatchers().get("DamagedByWatcher", source.getSourceId());
- return watcher != null && watcher.wasDamaged(event.getTargetId(), game);
- }
- return false;
- }
-
-}
diff --git a/Mage.Sets/src/mage/sets/chronicles/ActiveVolcano.java b/Mage.Sets/src/mage/sets/chronicles/ActiveVolcano.java
new file mode 100644
index 00000000000..609dc9bf888
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/ActiveVolcano.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ActiveVolcano extends mage.sets.legends.ActiveVolcano {
+
+ public ActiveVolcano(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 43;
+ this.expansionSetCode = "CHR";
+ }
+
+ public ActiveVolcano(final ActiveVolcano card) {
+ super(card);
+ }
+
+ @Override
+ public ActiveVolcano copy() {
+ return new ActiveVolcano(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/AkronLegionnaire.java b/Mage.Sets/src/mage/sets/chronicles/AkronLegionnaire.java
new file mode 100644
index 00000000000..fa86851783d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/AkronLegionnaire.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AkronLegionnaire extends mage.sets.legends.AkronLegionnaire {
+
+ public AkronLegionnaire(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 58;
+ this.expansionSetCode = "CHR";
+ }
+
+ public AkronLegionnaire(final AkronLegionnaire card) {
+ super(card);
+ }
+
+ @Override
+ public AkronLegionnaire copy() {
+ return new AkronLegionnaire(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/Aladdin.java b/Mage.Sets/src/mage/sets/chronicles/Aladdin.java
new file mode 100644
index 00000000000..fc6e364fec4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/Aladdin.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Aladdin extends mage.sets.masterseditioniv.Aladdin {
+
+ public Aladdin(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 44;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.RARE; // U1
+ }
+
+ public Aladdin(final Aladdin card) {
+ super(card);
+ }
+
+ @Override
+ public Aladdin copy() {
+ return new Aladdin(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/ArcadesSabboth.java b/Mage.Sets/src/mage/sets/chronicles/ArcadesSabboth.java
new file mode 100644
index 00000000000..8da622b1bac
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/ArcadesSabboth.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ArcadesSabboth extends mage.sets.masterseditioniii.ArcadesSabboth {
+
+ public ArcadesSabboth(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 106;
+ this.expansionSetCode = "CHR";
+ }
+
+ public ArcadesSabboth(final ArcadesSabboth card) {
+ super(card);
+ }
+
+ @Override
+ public ArcadesSabboth copy() {
+ return new ArcadesSabboth(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/ArenaOfTheAncients.java b/Mage.Sets/src/mage/sets/chronicles/ArenaOfTheAncients.java
new file mode 100644
index 00000000000..949c905e289
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/ArenaOfTheAncients.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ArenaOfTheAncients extends mage.sets.legends.ArenaOfTheAncients {
+
+ public ArenaOfTheAncients(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 71;
+ this.expansionSetCode = "CHR";
+ }
+
+ public ArenaOfTheAncients(final ArenaOfTheAncients card) {
+ super(card);
+ }
+
+ @Override
+ public ArenaOfTheAncients copy() {
+ return new ArenaOfTheAncients(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/AshnodsAltar.java b/Mage.Sets/src/mage/sets/chronicles/AshnodsAltar.java
new file mode 100644
index 00000000000..35e6c8a928e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/AshnodsAltar.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AshnodsAltar extends mage.sets.fifthedition.AshnodsAltar {
+
+ public AshnodsAltar(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 72;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public AshnodsAltar(final AshnodsAltar card) {
+ super(card);
+ }
+
+ @Override
+ public AshnodsAltar copy() {
+ return new AshnodsAltar(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/AshnodsTransmogrant.java b/Mage.Sets/src/mage/sets/chronicles/AshnodsTransmogrant.java
new file mode 100644
index 00000000000..82f86a2c7e1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/AshnodsTransmogrant.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AshnodsTransmogrant extends mage.sets.fifthedition.AshnodsTransmogrant {
+
+ public AshnodsTransmogrant(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 73;
+ this.expansionSetCode = "CHR";
+ }
+
+ public AshnodsTransmogrant(final AshnodsTransmogrant card) {
+ super(card);
+ }
+
+ @Override
+ public AshnodsTransmogrant copy() {
+ return new AshnodsTransmogrant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/AzureDrake.java b/Mage.Sets/src/mage/sets/chronicles/AzureDrake.java
new file mode 100644
index 00000000000..f101b17327b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/AzureDrake.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AzureDrake extends mage.sets.magic2011.AzureDrake {
+
+ public AzureDrake(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 15;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public AzureDrake(final AzureDrake card) {
+ super(card);
+ }
+
+ @Override
+ public AzureDrake copy() {
+ return new AzureDrake(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/BarlsCage.java b/Mage.Sets/src/mage/sets/chronicles/BarlsCage.java
new file mode 100644
index 00000000000..ce0b7e01fb8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/BarlsCage.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BarlsCage extends mage.sets.thedark.BarlsCage {
+
+ public BarlsCage(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 74;
+ this.expansionSetCode = "CHR";
+ }
+
+ public BarlsCage(final BarlsCage card) {
+ super(card);
+ }
+
+ @Override
+ public BarlsCage copy() {
+ return new BarlsCage(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/BloodMoon.java b/Mage.Sets/src/mage/sets/chronicles/BloodMoon.java
new file mode 100644
index 00000000000..5d9ec363d5c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/BloodMoon.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BloodMoon extends mage.sets.ninthedition.BloodMoon {
+
+ public BloodMoon(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 46;
+ this.expansionSetCode = "CHR";
+ }
+
+ public BloodMoon(final BloodMoon card) {
+ super(card);
+ }
+
+ @Override
+ public BloodMoon copy() {
+ return new BloodMoon(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/BogRats.java b/Mage.Sets/src/mage/sets/chronicles/BogRats.java
new file mode 100644
index 00000000000..43bdee011ee
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/BogRats.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BogRats extends mage.sets.thedark.BogRats {
+
+ public BogRats(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 2;
+ this.expansionSetCode = "CHR";
+ }
+
+ public BogRats(final BogRats card) {
+ super(card);
+ }
+
+ @Override
+ public BogRats copy() {
+ return new BogRats(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/BookOfRass.java b/Mage.Sets/src/mage/sets/chronicles/BookOfRass.java
new file mode 100644
index 00000000000..0619b5de2bc
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/BookOfRass.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BookOfRass extends mage.sets.thedark.BookOfRass {
+
+ public BookOfRass(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 75;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.RARE;
+ }
+
+ public BookOfRass(final BookOfRass card) {
+ super(card);
+ }
+
+ @Override
+ public BookOfRass copy() {
+ return new BookOfRass(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/Boomerang.java b/Mage.Sets/src/mage/sets/chronicles/Boomerang.java
new file mode 100644
index 00000000000..fcbcab9d347
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/Boomerang.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Boomerang extends mage.sets.tenthedition.Boomerang {
+
+ public Boomerang(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 16;
+ this.expansionSetCode = "CHR";
+ }
+
+ public Boomerang(final Boomerang card) {
+ super(card);
+ }
+
+ @Override
+ public Boomerang copy() {
+ return new Boomerang(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/CatWarriors.java b/Mage.Sets/src/mage/sets/chronicles/CatWarriors.java
new file mode 100644
index 00000000000..c72a5f8e779
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/CatWarriors.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CatWarriors extends mage.sets.fifthedition.CatWarriors {
+
+ public CatWarriors(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 30;
+ this.expansionSetCode = "CHR";
+ }
+
+ public CatWarriors(final CatWarriors card) {
+ super(card);
+ }
+
+ @Override
+ public CatWarriors copy() {
+ return new CatWarriors(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/Chromium.java b/Mage.Sets/src/mage/sets/chronicles/Chromium.java
new file mode 100644
index 00000000000..d537746a3a3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/Chromium.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Chromium extends mage.sets.masterseditioniii.Chromium {
+
+ public Chromium(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 109;
+ this.expansionSetCode = "CHR";
+ }
+
+ public Chromium(final Chromium card) {
+ super(card);
+ }
+
+ @Override
+ public Chromium copy() {
+ return new Chromium(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/CityOfBrass.java b/Mage.Sets/src/mage/sets/chronicles/CityOfBrass.java
new file mode 100644
index 00000000000..734a42b855c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/CityOfBrass.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CityOfBrass extends mage.sets.seventhedition.CityOfBrass {
+
+ public CityOfBrass(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 92;
+ this.expansionSetCode = "CHR";
+ }
+
+ public CityOfBrass(final CityOfBrass card) {
+ super(card);
+ }
+
+ @Override
+ public CityOfBrass copy() {
+ return new CityOfBrass(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/ConcordantCrossroads.java b/Mage.Sets/src/mage/sets/chronicles/ConcordantCrossroads.java
new file mode 100644
index 00000000000..3115c10a6ce
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/ConcordantCrossroads.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ConcordantCrossroads extends mage.sets.masterseditioniii.ConcordantCrossroads {
+
+ public ConcordantCrossroads(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 32;
+ this.expansionSetCode = "CHR";
+ }
+
+ public ConcordantCrossroads(final ConcordantCrossroads card) {
+ super(card);
+ }
+
+ @Override
+ public ConcordantCrossroads copy() {
+ return new ConcordantCrossroads(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/CrawGiant.java b/Mage.Sets/src/mage/sets/chronicles/CrawGiant.java
new file mode 100644
index 00000000000..11cb2e90afa
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/CrawGiant.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CrawGiant extends mage.sets.legends.CrawGiant {
+
+ public CrawGiant(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 33;
+ this.expansionSetCode = "CHR";
+ }
+
+ public CrawGiant(final CrawGiant card) {
+ super(card);
+ }
+
+ @Override
+ public CrawGiant copy() {
+ return new CrawGiant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/eighthedition/GiantOctopus.java b/Mage.Sets/src/mage/sets/chronicles/CuombajjWitches.java
similarity index 82%
rename from Mage.Sets/src/mage/sets/eighthedition/GiantOctopus.java
rename to Mage.Sets/src/mage/sets/chronicles/CuombajjWitches.java
index 81c464613c1..dea6e097dff 100644
--- a/Mage.Sets/src/mage/sets/eighthedition/GiantOctopus.java
+++ b/Mage.Sets/src/mage/sets/chronicles/CuombajjWitches.java
@@ -25,7 +25,7 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-package mage.sets.eighthedition;
+package mage.sets.chronicles;
import java.util.UUID;
@@ -33,20 +33,20 @@ import java.util.UUID;
*
* @author LevelX2
*/
-public class GiantOctopus extends mage.sets.seventhedition.GiantOctopus {
+public class CuombajjWitches extends mage.sets.mastersedition.CuombajjWitches {
- public GiantOctopus(UUID ownerId) {
+ public CuombajjWitches(UUID ownerId) {
super(ownerId);
this.cardNumber = 3;
- this.expansionSetCode = "8ED";
+ this.expansionSetCode = "CHR";
}
- public GiantOctopus(final GiantOctopus card) {
+ public CuombajjWitches(final CuombajjWitches card) {
super(card);
}
@Override
- public GiantOctopus copy() {
- return new GiantOctopus(this);
+ public CuombajjWitches copy() {
+ return new CuombajjWitches(this);
}
}
diff --git a/Mage.Sets/src/mage/sets/chronicles/DAvenantArcher.java b/Mage.Sets/src/mage/sets/chronicles/DAvenantArcher.java
new file mode 100644
index 00000000000..c730cf781a9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/DAvenantArcher.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DAvenantArcher extends mage.sets.fifthedition.DAvenantArcher {
+
+ public DAvenantArcher(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 61;
+ this.expansionSetCode = "CHR";
+ }
+
+ public DAvenantArcher(final DAvenantArcher card) {
+ super(card);
+ }
+
+ @Override
+ public DAvenantArcher copy() {
+ return new DAvenantArcher(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/DakkonBlackblade.java b/Mage.Sets/src/mage/sets/chronicles/DakkonBlackblade.java
new file mode 100644
index 00000000000..c2e877d05de
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/DakkonBlackblade.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DakkonBlackblade extends mage.sets.legends.DakkonBlackblade {
+
+ public DakkonBlackblade(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 110;
+ this.expansionSetCode = "CHR";
+ }
+
+ public DakkonBlackblade(final DakkonBlackblade card) {
+ super(card);
+ }
+
+ @Override
+ public DakkonBlackblade copy() {
+ return new DakkonBlackblade(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/DanceOfMany.java b/Mage.Sets/src/mage/sets/chronicles/DanceOfMany.java
new file mode 100644
index 00000000000..70efd0bc8f8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/DanceOfMany.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DanceOfMany extends mage.sets.thedark.DanceOfMany {
+
+ public DanceOfMany(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 17;
+ this.expansionSetCode = "CHR";
+ }
+
+ public DanceOfMany(final DanceOfMany card) {
+ super(card);
+ }
+
+ @Override
+ public DanceOfMany copy() {
+ return new DanceOfMany(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/Dandan.java b/Mage.Sets/src/mage/sets/chronicles/Dandan.java
new file mode 100644
index 00000000000..3c00a357d01
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/Dandan.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Dandan extends mage.sets.fifthedition.Dandan {
+
+ public Dandan(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 18;
+ this.expansionSetCode = "CHR";
+ }
+
+ public Dandan(final Dandan card) {
+ super(card);
+ }
+
+ @Override
+ public Dandan copy() {
+ return new Dandan(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/DivineOffering.java b/Mage.Sets/src/mage/sets/chronicles/DivineOffering.java
new file mode 100644
index 00000000000..3875e9ed8a7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/DivineOffering.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DivineOffering extends mage.sets.mirrodinbesieged.DivineOffering {
+
+ public DivineOffering(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 62;
+ this.expansionSetCode = "CHR";
+ }
+
+ public DivineOffering(final DivineOffering card) {
+ super(card);
+ }
+
+ @Override
+ public DivineOffering copy() {
+ return new DivineOffering(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/ErhnamDjinn.java b/Mage.Sets/src/mage/sets/chronicles/ErhnamDjinn.java
new file mode 100644
index 00000000000..f7504e6689f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/ErhnamDjinn.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ErhnamDjinn extends mage.sets.judgment.ErhnamDjinn {
+
+ public ErhnamDjinn(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 36;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public ErhnamDjinn(final ErhnamDjinn card) {
+ super(card);
+ }
+
+ @Override
+ public ErhnamDjinn copy() {
+ return new ErhnamDjinn(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/FallenAngel.java b/Mage.Sets/src/mage/sets/chronicles/FallenAngel.java
new file mode 100644
index 00000000000..3399b9f7b4b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/FallenAngel.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class FallenAngel extends mage.sets.seventhedition.FallenAngel {
+
+ public FallenAngel(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 4;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public FallenAngel(final FallenAngel card) {
+ super(card);
+ }
+
+ @Override
+ public FallenAngel copy() {
+ return new FallenAngel(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/FeldonsCane.java b/Mage.Sets/src/mage/sets/chronicles/FeldonsCane.java
new file mode 100644
index 00000000000..652f6cb1251
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/FeldonsCane.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class FeldonsCane extends mage.sets.timeshifted.FeldonsCane {
+
+ public FeldonsCane(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 77;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public FeldonsCane(final FeldonsCane card) {
+ super(card);
+ }
+
+ @Override
+ public FeldonsCane copy() {
+ return new FeldonsCane(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/FireDrake.java b/Mage.Sets/src/mage/sets/chronicles/FireDrake.java
new file mode 100644
index 00000000000..495eed1b302
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/FireDrake.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class FireDrake extends mage.sets.fifthedition.FireDrake {
+
+ public FireDrake(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 47;
+ this.expansionSetCode = "CHR";
+ }
+
+ public FireDrake(final FireDrake card) {
+ super(card);
+ }
+
+ @Override
+ public FireDrake copy() {
+ return new FireDrake(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/FlashFlood.java b/Mage.Sets/src/mage/sets/chronicles/FlashFlood.java
new file mode 100644
index 00000000000..42961156fa0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/FlashFlood.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class FlashFlood extends mage.sets.legends.FlashFlood {
+
+ public FlashFlood(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 21;
+ this.expansionSetCode = "CHR";
+ }
+
+ public FlashFlood(final FlashFlood card) {
+ super(card);
+ }
+
+ @Override
+ public FlashFlood copy() {
+ return new FlashFlood(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/FountainOfYouth.java b/Mage.Sets/src/mage/sets/chronicles/FountainOfYouth.java
new file mode 100644
index 00000000000..c1bcf6311d9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/FountainOfYouth.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class FountainOfYouth extends mage.sets.tenthedition.FountainOfYouth {
+
+ public FountainOfYouth(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 78;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public FountainOfYouth(final FountainOfYouth card) {
+ super(card);
+ }
+
+ @Override
+ public FountainOfYouth copy() {
+ return new FountainOfYouth(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/GoblinDiggingTeam.java b/Mage.Sets/src/mage/sets/chronicles/GoblinDiggingTeam.java
new file mode 100644
index 00000000000..2e9152c2ef6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/GoblinDiggingTeam.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class GoblinDiggingTeam extends mage.sets.thedark.GoblinDiggingTeam {
+
+ public GoblinDiggingTeam(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 49;
+ this.expansionSetCode = "CHR";
+ }
+
+ public GoblinDiggingTeam(final GoblinDiggingTeam card) {
+ super(card);
+ }
+
+ @Override
+ public GoblinDiggingTeam copy() {
+ return new GoblinDiggingTeam(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/GoblinsOfTheFlarg.java b/Mage.Sets/src/mage/sets/chronicles/GoblinsOfTheFlarg.java
new file mode 100644
index 00000000000..fbe8a0072c9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/GoblinsOfTheFlarg.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class GoblinsOfTheFlarg extends mage.sets.thedark.GoblinsOfTheFlarg {
+
+ public GoblinsOfTheFlarg(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 51;
+ this.expansionSetCode = "CHR";
+ }
+
+ public GoblinsOfTheFlarg(final GoblinsOfTheFlarg card) {
+ super(card);
+ }
+
+ @Override
+ public GoblinsOfTheFlarg copy() {
+ return new GoblinsOfTheFlarg(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/HasranOgress.java b/Mage.Sets/src/mage/sets/chronicles/HasranOgress.java
similarity index 93%
rename from Mage.Sets/src/mage/sets/arabiannights/HasranOgress.java
rename to Mage.Sets/src/mage/sets/chronicles/HasranOgress.java
index 767c07fa5c3..6071dbb25af 100644
--- a/Mage.Sets/src/mage/sets/arabiannights/HasranOgress.java
+++ b/Mage.Sets/src/mage/sets/chronicles/HasranOgress.java
@@ -25,21 +25,20 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-package mage.sets.arabiannights;
+package mage.sets.chronicles;
import java.util.UUID;
/**
*
- * @author LoneFox
-
+ * @author LevelX2
*/
public class HasranOgress extends mage.sets.masterseditioniv.HasranOgress {
public HasranOgress(UUID ownerId) {
super(ownerId);
this.cardNumber = 6;
- this.expansionSetCode = "ARN";
+ this.expansionSetCode = "CHR";
}
public HasranOgress(final HasranOgress card) {
diff --git a/Mage.Sets/src/mage/sets/chronicles/HellsCaretaker.java b/Mage.Sets/src/mage/sets/chronicles/HellsCaretaker.java
new file mode 100644
index 00000000000..a067672e161
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/HellsCaretaker.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class HellsCaretaker extends mage.sets.ninthedition.HellsCaretaker {
+
+ public HellsCaretaker(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 7;
+ this.expansionSetCode = "CHR";
+ }
+
+ public HellsCaretaker(final HellsCaretaker card) {
+ super(card);
+ }
+
+ @Override
+ public HellsCaretaker copy() {
+ return new HellsCaretaker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/HornOfDeafening.java b/Mage.Sets/src/mage/sets/chronicles/HornOfDeafening.java
new file mode 100644
index 00000000000..cbd9780da1a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/HornOfDeafening.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class HornOfDeafening extends mage.sets.legends.HornOfDeafening {
+
+ public HornOfDeafening(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 80;
+ this.expansionSetCode = "CHR";
+ }
+
+ public HornOfDeafening(final HornOfDeafening card) {
+ super(card);
+ }
+
+ @Override
+ public HornOfDeafening copy() {
+ return new HornOfDeafening(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/IvoryGuardians.java b/Mage.Sets/src/mage/sets/chronicles/IvoryGuardians.java
new file mode 100644
index 00000000000..2819a071d27
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/IvoryGuardians.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class IvoryGuardians extends mage.sets.legends.IvoryGuardians {
+
+ public IvoryGuardians(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 64;
+ this.expansionSetCode = "CHR";
+ }
+
+ public IvoryGuardians(final IvoryGuardians card) {
+ super(card);
+ }
+
+ @Override
+ public IvoryGuardians copy() {
+ return new IvoryGuardians(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/JalumTome.java b/Mage.Sets/src/mage/sets/chronicles/JalumTome.java
new file mode 100644
index 00000000000..baf68f49246
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/JalumTome.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class JalumTome extends mage.sets.seventhedition.JalumTome {
+
+ public JalumTome(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 81;
+ this.expansionSetCode = "CHR";
+ }
+
+ public JalumTome(final JalumTome card) {
+ super(card);
+ }
+
+ @Override
+ public JalumTome copy() {
+ return new JalumTome(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/Juxtapose.java b/Mage.Sets/src/mage/sets/chronicles/Juxtapose.java
new file mode 100644
index 00000000000..78d68a0e715
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/Juxtapose.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Juxtapose extends mage.sets.fifthedition.Juxtapose {
+
+ public Juxtapose(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 22;
+ this.expansionSetCode = "CHR";
+ }
+
+ public Juxtapose(final Juxtapose card) {
+ super(card);
+ }
+
+ @Override
+ public Juxtapose copy() {
+ return new Juxtapose(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/KeepersOfTheFaith.java b/Mage.Sets/src/mage/sets/chronicles/KeepersOfTheFaith.java
new file mode 100644
index 00000000000..2ab714d0f34
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/KeepersOfTheFaith.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class KeepersOfTheFaith extends mage.sets.legends.KeepersOfTheFaith {
+
+ public KeepersOfTheFaith(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 65;
+ this.expansionSetCode = "CHR";
+ }
+
+ public KeepersOfTheFaith(final KeepersOfTheFaith card) {
+ super(card);
+ }
+
+ @Override
+ public KeepersOfTheFaith copy() {
+ return new KeepersOfTheFaith(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/KeiTakahashi.java b/Mage.Sets/src/mage/sets/chronicles/KeiTakahashi.java
new file mode 100644
index 00000000000..2f6f3960acb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/KeiTakahashi.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class KeiTakahashi extends mage.sets.masterseditioniii.KeiTakahashi {
+
+ public KeiTakahashi(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 113;
+ this.expansionSetCode = "CHR";
+ }
+
+ public KeiTakahashi(final KeiTakahashi card) {
+ super(card);
+ }
+
+ @Override
+ public KeiTakahashi copy() {
+ return new KeiTakahashi(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/MarhaultElsdragon.java b/Mage.Sets/src/mage/sets/chronicles/MarhaultElsdragon.java
new file mode 100644
index 00000000000..8e8e8cc446f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/MarhaultElsdragon.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class MarhaultElsdragon extends mage.sets.legends.MarhaultElsdragon {
+
+ public MarhaultElsdragon(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 114;
+ this.expansionSetCode = "CHR";
+ }
+
+ public MarhaultElsdragon(final MarhaultElsdragon card) {
+ super(card);
+ }
+
+ @Override
+ public MarhaultElsdragon copy() {
+ return new MarhaultElsdragon(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/MountainYeti.java b/Mage.Sets/src/mage/sets/chronicles/MountainYeti.java
new file mode 100644
index 00000000000..ccac499bab6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/MountainYeti.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class MountainYeti extends mage.sets.legends.MountainYeti {
+
+ public MountainYeti(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 53;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public MountainYeti(final MountainYeti card) {
+ super(card);
+ }
+
+ @Override
+ public MountainYeti copy() {
+ return new MountainYeti(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/NicolBolas.java b/Mage.Sets/src/mage/sets/chronicles/NicolBolas.java
new file mode 100644
index 00000000000..f22cb409534
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/NicolBolas.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class NicolBolas extends mage.sets.legends.NicolBolas {
+
+ public NicolBolas(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 116;
+ this.expansionSetCode = "CHR";
+ }
+
+ public NicolBolas(final NicolBolas card) {
+ super(card);
+ }
+
+ @Override
+ public NicolBolas copy() {
+ return new NicolBolas(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/PalladiaMors.java b/Mage.Sets/src/mage/sets/chronicles/PalladiaMors.java
new file mode 100644
index 00000000000..9557eb555d1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/PalladiaMors.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class PalladiaMors extends mage.sets.masterseditioniii.PalladiaMors {
+
+ public PalladiaMors(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 117;
+ this.expansionSetCode = "CHR";
+ }
+
+ public PalladiaMors(final PalladiaMors card) {
+ super(card);
+ }
+
+ @Override
+ public PalladiaMors copy() {
+ return new PalladiaMors(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/Recall.java b/Mage.Sets/src/mage/sets/chronicles/Recall.java
new file mode 100644
index 00000000000..796d838744b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/Recall.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Recall extends mage.sets.fifthedition.Recall {
+
+ public Recall(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 24;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public Recall(final Recall card) {
+ super(card);
+ }
+
+ @Override
+ public Recall copy() {
+ return new Recall(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/RemoveSoul.java b/Mage.Sets/src/mage/sets/chronicles/RemoveSoul.java
new file mode 100644
index 00000000000..2b747e9bd1d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/RemoveSoul.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RemoveSoul extends mage.sets.tenthedition.RemoveSoul {
+
+ public RemoveSoul(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 25;
+ this.expansionSetCode = "CHR";
+ }
+
+ public RemoveSoul(final RemoveSoul card) {
+ super(card);
+ }
+
+ @Override
+ public RemoveSoul copy() {
+ return new RemoveSoul(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/RepentantBlacksmith.java b/Mage.Sets/src/mage/sets/chronicles/RepentantBlacksmith.java
new file mode 100644
index 00000000000..8b2c4969154
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/RepentantBlacksmith.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RepentantBlacksmith extends mage.sets.fifthedition.RepentantBlacksmith {
+
+ public RepentantBlacksmith(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 67;
+ this.expansionSetCode = "CHR";
+ }
+
+ public RepentantBlacksmith(final RepentantBlacksmith card) {
+ super(card);
+ }
+
+ @Override
+ public RepentantBlacksmith copy() {
+ return new RepentantBlacksmith(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/Revelation.java b/Mage.Sets/src/mage/sets/chronicles/Revelation.java
new file mode 100644
index 00000000000..4da02eed941
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/Revelation.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Revelation extends mage.sets.legends.Revelation {
+
+ public Revelation(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 87;
+ this.expansionSetCode = "CHR";
+ }
+
+ public Revelation(final Revelation card) {
+ super(card);
+ }
+
+ @Override
+ public Revelation copy() {
+ return new Revelation(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/RubiniaSoulsinger.java b/Mage.Sets/src/mage/sets/chronicles/RubiniaSoulsinger.java
new file mode 100644
index 00000000000..09bfe646c1e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/RubiniaSoulsinger.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RubiniaSoulsinger extends mage.sets.commander2013.RubiniaSoulsinger {
+
+ public RubiniaSoulsinger(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 118;
+ this.expansionSetCode = "CHR";
+ }
+
+ public RubiniaSoulsinger(final RubiniaSoulsinger card) {
+ super(card);
+ }
+
+ @Override
+ public RubiniaSoulsinger copy() {
+ return new RubiniaSoulsinger(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/SafeHaven.java b/Mage.Sets/src/mage/sets/chronicles/SafeHaven.java
new file mode 100644
index 00000000000..e46fba9d594
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/SafeHaven.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SafeHaven extends mage.sets.thedark.SafeHaven {
+
+ public SafeHaven(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 93;
+ this.expansionSetCode = "CHR";
+ }
+
+ public SafeHaven(final SafeHaven card) {
+ super(card);
+ }
+
+ @Override
+ public SafeHaven copy() {
+ return new SafeHaven(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/ScavengerFolk.java b/Mage.Sets/src/mage/sets/chronicles/ScavengerFolk.java
new file mode 100644
index 00000000000..5949e815c89
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/ScavengerFolk.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ScavengerFolk extends mage.sets.fifthedition.ScavengerFolk {
+
+ public ScavengerFolk(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 41;
+ this.expansionSetCode = "CHR";
+ }
+
+ public ScavengerFolk(final ScavengerFolk card) {
+ super(card);
+ }
+
+ @Override
+ public ScavengerFolk copy() {
+ return new ScavengerFolk(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/Sentinel.java b/Mage.Sets/src/mage/sets/chronicles/Sentinel.java
new file mode 100644
index 00000000000..f0804924335
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/Sentinel.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Sentinel extends mage.sets.legends.Sentinel {
+
+ public Sentinel(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 281;
+ this.expansionSetCode = "CHR";
+ }
+
+ public Sentinel(final Sentinel card) {
+ super(card);
+ }
+
+ @Override
+ public Sentinel copy() {
+ return new Sentinel(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/ShieldWall.java b/Mage.Sets/src/mage/sets/chronicles/ShieldWall.java
new file mode 100644
index 00000000000..5c3fb0ba3a8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/ShieldWall.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ShieldWall extends mage.sets.legends.ShieldWall {
+
+ public ShieldWall(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 68;
+ this.expansionSetCode = "CHR";
+ }
+
+ public ShieldWall(final ShieldWall card) {
+ super(card);
+ }
+
+ @Override
+ public ShieldWall copy() {
+ return new ShieldWall(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/SivitriScarzam.java b/Mage.Sets/src/mage/sets/chronicles/SivitriScarzam.java
new file mode 100644
index 00000000000..def65aa7fc1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/SivitriScarzam.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SivitriScarzam extends mage.sets.legends.SivitriScarzam {
+
+ public SivitriScarzam(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 119;
+ this.expansionSetCode = "CHR";
+ }
+
+ public SivitriScarzam(final SivitriScarzam card) {
+ super(card);
+ }
+
+ @Override
+ public SivitriScarzam copy() {
+ return new SivitriScarzam(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/SolkanarTheSwampKing.java b/Mage.Sets/src/mage/sets/chronicles/SolkanarTheSwampKing.java
new file mode 100644
index 00000000000..99081a82801
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/SolkanarTheSwampKing.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SolkanarTheSwampKing extends mage.sets.timeshifted.SolkanarTheSwampKing {
+
+ public SolkanarTheSwampKing(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 120;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.RARE;
+ }
+
+ public SolkanarTheSwampKing(final SolkanarTheSwampKing card) {
+ super(card);
+ }
+
+ @Override
+ public SolkanarTheSwampKing copy() {
+ return new SolkanarTheSwampKing(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/StormSeeker.java b/Mage.Sets/src/mage/sets/chronicles/StormSeeker.java
new file mode 100644
index 00000000000..8d0515a2542
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/StormSeeker.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class StormSeeker extends mage.sets.mastersedition.StormSeeker {
+
+ public StormSeeker(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 42;
+ this.expansionSetCode = "CHR";
+ }
+
+ public StormSeeker(final StormSeeker card) {
+ super(card);
+ }
+
+ @Override
+ public StormSeeker copy() {
+ return new StormSeeker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/TheWretched.java b/Mage.Sets/src/mage/sets/chronicles/TheWretched.java
new file mode 100644
index 00000000000..1b2326ce759
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/TheWretched.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TheWretched extends mage.sets.fifthedition.TheWretched {
+
+ public TheWretched(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 11;
+ this.expansionSetCode = "CHR";
+ }
+
+ public TheWretched(final TheWretched card) {
+ super(card);
+ }
+
+ @Override
+ public TheWretched copy() {
+ return new TheWretched(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/TobiasAndrion.java b/Mage.Sets/src/mage/sets/chronicles/TobiasAndrion.java
new file mode 100644
index 00000000000..0ab33718406
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/TobiasAndrion.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TobiasAndrion extends mage.sets.legends.TobiasAndrion {
+
+ public TobiasAndrion(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 122;
+ this.expansionSetCode = "CHR";
+ }
+
+ public TobiasAndrion(final TobiasAndrion card) {
+ super(card);
+ }
+
+ @Override
+ public TobiasAndrion copy() {
+ return new TobiasAndrion(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/TorWauki.java b/Mage.Sets/src/mage/sets/chronicles/TorWauki.java
new file mode 100644
index 00000000000..4bc994b5666
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/TorWauki.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TorWauki extends mage.sets.legends.TorWauki {
+
+ public TorWauki(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 123;
+ this.expansionSetCode = "CHR";
+ }
+
+ public TorWauki(final TorWauki card) {
+ super(card);
+ }
+
+ @Override
+ public TorWauki copy() {
+ return new TorWauki(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/TormodsCrypt.java b/Mage.Sets/src/mage/sets/chronicles/TormodsCrypt.java
new file mode 100644
index 00000000000..a6d5dc22cff
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/TormodsCrypt.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TormodsCrypt extends mage.sets.timeshifted.TormodsCrypt {
+
+ public TormodsCrypt(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 89;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public TormodsCrypt(final TormodsCrypt card) {
+ super(card);
+ }
+
+ @Override
+ public TormodsCrypt copy() {
+ return new TormodsCrypt(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/Transmutation.java b/Mage.Sets/src/mage/sets/chronicles/Transmutation.java
new file mode 100644
index 00000000000..a111c343cbe
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/Transmutation.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Transmutation extends mage.sets.legends.Transmutation {
+
+ public Transmutation(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 12;
+ this.expansionSetCode = "CHR";
+ }
+
+ public Transmutation(final Transmutation card) {
+ super(card);
+ }
+
+ @Override
+ public Transmutation copy() {
+ return new Transmutation(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/TriassicEgg.java b/Mage.Sets/src/mage/sets/chronicles/TriassicEgg.java
new file mode 100644
index 00000000000..c847ab3d56e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/TriassicEgg.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TriassicEgg extends mage.sets.legends.TriassicEgg {
+
+ public TriassicEgg(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 90;
+ this.expansionSetCode = "CHR";
+ }
+
+ public TriassicEgg(final TriassicEgg card) {
+ super(card);
+ }
+
+ @Override
+ public TriassicEgg copy() {
+ return new TriassicEgg(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasMine.java b/Mage.Sets/src/mage/sets/chronicles/UrzasMine.java
similarity index 92%
rename from Mage.Sets/src/mage/sets/antiquities/UrzasMine.java
rename to Mage.Sets/src/mage/sets/chronicles/UrzasMine.java
index 559743cbbb2..f72d01b125e 100644
--- a/Mage.Sets/src/mage/sets/antiquities/UrzasMine.java
+++ b/Mage.Sets/src/mage/sets/chronicles/UrzasMine.java
@@ -25,21 +25,21 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-package mage.sets.antiquities;
+package mage.sets.chronicles;
import java.util.UUID;
import mage.constants.Rarity;
/**
*
- * @author North
+ * @author LevelX2
*/
public class UrzasMine extends mage.sets.fifthedition.UrzasMine {
public UrzasMine(UUID ownerId) {
super(ownerId);
- this.cardNumber = 75;
- this.expansionSetCode = "ATQ";
+ this.cardNumber = 94;
+ this.expansionSetCode = "CHR";
this.rarity = Rarity.UNCOMMON;
}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant.java b/Mage.Sets/src/mage/sets/chronicles/UrzasPowerPlant.java
similarity index 92%
rename from Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant.java
rename to Mage.Sets/src/mage/sets/chronicles/UrzasPowerPlant.java
index 2dbae8f015b..69f0205044c 100644
--- a/Mage.Sets/src/mage/sets/antiquities/UrzasPowerPlant.java
+++ b/Mage.Sets/src/mage/sets/chronicles/UrzasPowerPlant.java
@@ -25,21 +25,21 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-package mage.sets.antiquities;
+package mage.sets.chronicles;
import java.util.UUID;
import mage.constants.Rarity;
/**
*
- * @author North
+ * @author LevelX2
*/
public class UrzasPowerPlant extends mage.sets.fifthedition.UrzasPowerPlant {
public UrzasPowerPlant(UUID ownerId) {
super(ownerId);
- this.cardNumber = 79;
- this.expansionSetCode = "ATQ";
+ this.cardNumber = 98;
+ this.expansionSetCode = "CHR";
this.rarity = Rarity.UNCOMMON;
}
diff --git a/Mage.Sets/src/mage/sets/antiquities/UrzasTower.java b/Mage.Sets/src/mage/sets/chronicles/UrzasTower.java
similarity index 92%
rename from Mage.Sets/src/mage/sets/antiquities/UrzasTower.java
rename to Mage.Sets/src/mage/sets/chronicles/UrzasTower.java
index dbca4117bf7..ffdca13343a 100644
--- a/Mage.Sets/src/mage/sets/antiquities/UrzasTower.java
+++ b/Mage.Sets/src/mage/sets/chronicles/UrzasTower.java
@@ -25,21 +25,21 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-package mage.sets.antiquities;
+package mage.sets.chronicles;
import java.util.UUID;
import mage.constants.Rarity;
/**
*
- * @author North
+ * @author LevelX2
*/
public class UrzasTower extends mage.sets.fifthedition.UrzasTower {
public UrzasTower(UUID ownerId) {
super(ownerId);
- this.cardNumber = 83;
- this.expansionSetCode = "ATQ";
+ this.cardNumber = 102;
+ this.expansionSetCode = "CHR";
this.rarity = Rarity.UNCOMMON;
}
diff --git a/Mage.Sets/src/mage/sets/chronicles/VaevictisAsmadi.java b/Mage.Sets/src/mage/sets/chronicles/VaevictisAsmadi.java
new file mode 100644
index 00000000000..595eb6b55ae
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/VaevictisAsmadi.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class VaevictisAsmadi extends mage.sets.masterseditioniii.VaevictisAsmadi {
+
+ public VaevictisAsmadi(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 124;
+ this.expansionSetCode = "CHR";
+ }
+
+ public VaevictisAsmadi(final VaevictisAsmadi card) {
+ super(card);
+ }
+
+ @Override
+ public VaevictisAsmadi copy() {
+ return new VaevictisAsmadi(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/WallOfHeat.java b/Mage.Sets/src/mage/sets/chronicles/WallOfHeat.java
new file mode 100644
index 00000000000..25c84670ea7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/WallOfHeat.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class WallOfHeat extends mage.sets.legends.WallOfHeat {
+
+ public WallOfHeat(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 55;
+ this.expansionSetCode = "CHR";
+ }
+
+ public WallOfHeat(final WallOfHeat card) {
+ super(card);
+ }
+
+ @Override
+ public WallOfHeat copy() {
+ return new WallOfHeat(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/WallOfWonder.java b/Mage.Sets/src/mage/sets/chronicles/WallOfWonder.java
new file mode 100644
index 00000000000..2aafbe3e6b4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/WallOfWonder.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class WallOfWonder extends mage.sets.seventhedition.WallOfWonder {
+
+ public WallOfWonder(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 28;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public WallOfWonder(final WallOfWonder card) {
+ super(card);
+ }
+
+ @Override
+ public WallOfWonder copy() {
+ return new WallOfWonder(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/WitchHunter.java b/Mage.Sets/src/mage/sets/chronicles/WitchHunter.java
new file mode 100644
index 00000000000..d2fb61367f5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/WitchHunter.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class WitchHunter extends mage.sets.thedark.WitchHunter {
+
+ public WitchHunter(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 70;
+ this.expansionSetCode = "CHR";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public WitchHunter(final WitchHunter card) {
+ super(card);
+ }
+
+ @Override
+ public WitchHunter copy() {
+ return new WitchHunter(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/chronicles/XiraArien.java b/Mage.Sets/src/mage/sets/chronicles/XiraArien.java
new file mode 100644
index 00000000000..32e258892c1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/chronicles/XiraArien.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.chronicles;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class XiraArien extends mage.sets.legends.XiraArien {
+
+ public XiraArien(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 125;
+ this.expansionSetCode = "CHR";
+ }
+
+ public XiraArien(final XiraArien card) {
+ super(card);
+ }
+
+ @Override
+ public XiraArien copy() {
+ return new XiraArien(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/classicsixthedition/CelestialDawn.java b/Mage.Sets/src/mage/sets/classicsixthedition/CelestialDawn.java
new file mode 100644
index 00000000000..8d4443648a9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/classicsixthedition/CelestialDawn.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.classicsixthedition;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CelestialDawn extends mage.sets.timeshifted.CelestialDawn {
+
+ public CelestialDawn(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 7;
+ this.expansionSetCode = "6ED";
+ this.rarity = Rarity.RARE;
+ }
+
+ public CelestialDawn(final CelestialDawn card) {
+ super(card);
+ }
+
+ @Override
+ public CelestialDawn copy() {
+ return new CelestialDawn(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/AdarkarWindform.java b/Mage.Sets/src/mage/sets/coldsnap/AdarkarWindform.java
new file mode 100644
index 00000000000..8d37e4cf9bb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/AdarkarWindform.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.LoseAbilityTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AdarkarWindform extends CardImpl {
+
+ public AdarkarWindform(UUID ownerId) {
+ super(ownerId, 26, "Adarkar Windform", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{U}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Illusion");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // {1}{S}: Target creature loses flying until end of turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseAbilityTargetEffect(
+ FlyingAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{1}{S}"));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public AdarkarWindform(final AdarkarWindform card) {
+ super(card);
+ }
+
+ @Override
+ public AdarkarWindform copy() {
+ return new AdarkarWindform(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/ArcumDagsson.java b/Mage.Sets/src/mage/sets/coldsnap/ArcumDagsson.java
index 653bb2a81d0..7205351a470 100644
--- a/Mage.Sets/src/mage/sets/coldsnap/ArcumDagsson.java
+++ b/Mage.Sets/src/mage/sets/coldsnap/ArcumDagsson.java
@@ -56,8 +56,9 @@ import mage.target.common.TargetCardInLibrary;
* @author emerald000
*/
public class ArcumDagsson extends CardImpl {
-
+
private static final FilterPermanent filter = new FilterArtifactPermanent("artifact creature");
+
static {
filter.add(new CardTypePredicate(CardType.CREATURE));
}
@@ -88,26 +89,27 @@ public class ArcumDagsson extends CardImpl {
}
class ArcumDagssonEffect extends OneShotEffect {
-
+
private static final FilterCard filter = new FilterArtifactCard("noncreature artifact card");
+
static {
filter.add(Predicates.not(new CardTypePredicate(CardType.CREATURE)));
}
-
+
ArcumDagssonEffect() {
super(Outcome.Removal);
this.staticText = "Target artifact creature's controller sacrifices it. That player may search his or her library for a noncreature artifact card, put it onto the battlefield, then shuffle his or her library";
}
-
+
ArcumDagssonEffect(final ArcumDagssonEffect effect) {
super(effect);
}
-
+
@Override
public ArcumDagssonEffect copy() {
return new ArcumDagssonEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
Permanent artifactCreature = game.getPermanent(this.getTargetPointer().getFirst(game, source));
@@ -120,7 +122,7 @@ class ArcumDagssonEffect extends OneShotEffect {
if (player.searchLibrary(target, game)) {
Card card = game.getCard(target.getFirstTarget());
if (card != null) {
- player.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId());
+ player.moveCards(card, Zone.BATTLEFIELD, source, game);
}
}
player.shuffleLibrary(game);
diff --git a/Mage.Sets/src/mage/sets/coldsnap/AurochsHerd.java b/Mage.Sets/src/mage/sets/coldsnap/AurochsHerd.java
new file mode 100644
index 00000000000..c22028e8bea
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/AurochsHerd.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.dynamicvalue.common.StaticValue;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.FilterCard;
+import mage.filter.common.FilterAttackingCreature;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.target.common.TargetCardInLibrary;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AurochsHerd extends CardImpl {
+
+ private static final FilterCard filter1 = new FilterCard("Aurocs card");
+ private static final FilterAttackingCreature filter2 = new FilterAttackingCreature("other attacking Aurochs");
+
+ static {
+ filter1.add(new SubtypePredicate("Aurochs"));
+ filter2.add(new SubtypePredicate("Aurochs"));
+ filter2.add(new AnotherPredicate());
+ }
+
+ public AurochsHerd(UUID ownerId) {
+ super(ownerId, 103, "Aurochs Herd", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}{G}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Aurochs");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // When Aurochs Herd enters the battlefield, you may search your library for an Aurochs card, reveal it, and put it into your hand. If you do, shuffle your library.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(
+ new TargetCardInLibrary(filter1), true), true));
+ // Whenever Aurochs Herd attacks, it gets +1/+0 until end of turn for each other attacking Aurochs.
+ PermanentsOnBattlefieldCount value = new PermanentsOnBattlefieldCount(filter2, 1);
+ this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(value, new StaticValue(0), Duration.EndOfTurn, true), false));
+ }
+
+ public AurochsHerd(final AurochsHerd card) {
+ super(card);
+ }
+
+ @Override
+ public AurochsHerd copy() {
+ return new AurochsHerd(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/BlizzardSpecter.java b/Mage.Sets/src/mage/sets/coldsnap/BlizzardSpecter.java
index e9e77e9fbdf..dbebe6e16fc 100644
--- a/Mage.Sets/src/mage/sets/coldsnap/BlizzardSpecter.java
+++ b/Mage.Sets/src/mage/sets/coldsnap/BlizzardSpecter.java
@@ -32,7 +32,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
-import mage.abilities.costs.common.DiscardTargetCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.discard.DiscardTargetEffect;
import mage.abilities.keyword.FlyingAbility;
@@ -41,7 +40,6 @@ import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
-import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
@@ -65,14 +63,17 @@ public class BlizzardSpecter extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
- // Whenever Blizzard Specter deals combat damage to a player, choose one - That player returns a permanent he or she controls to its owner's hand; or that player discards a card.
- Ability ability2 = new DealsCombatDamageToAPlayerTriggeredAbility(new ReturnToHandEffect(), false);
-
- Mode mode2 = new Mode();
- mode2.getEffects().add(new DiscardTargetEffect(1, false));
- ability2.addMode(mode2);
-
- this.addAbility(ability2);
+
+ // Whenever Blizzard Specter deals combat damage to a player, choose one
+ // - That player returns a permanent he or she controls to its owner's hand;
+ Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new ReturnToHandEffect(), false, true);
+
+ // or that player discards a card.
+ Mode mode = new Mode();
+ mode.getEffects().add(new DiscardTargetEffect(1, false));
+ ability.addMode(mode);
+
+ this.addAbility(ability);
}
public BlizzardSpecter(final BlizzardSpecter card) {
@@ -103,26 +104,19 @@ class ReturnToHandEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- boolean result = false;
-
- Player player = game.getPlayer(targetPointer.getFirst(game, source));
- if (player == null) {
+ Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source));
+ if (targetPlayer == null) {
return false;
}
-
Target target = new TargetControlledPermanent(1, 1, new FilterControlledPermanent(), true);
- if (target.canChoose(player.getId(), game)) {
- while (player.canRespond() && !target.isChosen() && target.canChoose(player.getId(), game)) {
- player.chooseTarget(Outcome.ReturnToHand, target, source, game);
+ if (target.canChoose(targetPlayer.getId(), game)) {
+ targetPlayer.chooseTarget(Outcome.ReturnToHand, target, source, game);
+ Permanent permanent = game.getPermanent(target.getFirstTarget());
+ if (permanent != null) {
+ targetPlayer.moveCards(permanent, null, Zone.HAND, source, game);
}
- for (UUID targetId: target.getTargets()) {
- Permanent permanent = game.getPermanent(targetId);
- if (permanent != null) {
- result |= permanent.moveToZone(Zone.HAND, source.getSourceId(), game, false);
- }
- }
}
- return result;
+ return true;
}
}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/BorealCentaur.java b/Mage.Sets/src/mage/sets/coldsnap/BorealCentaur.java
new file mode 100644
index 00000000000..dfd766231be
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/BorealCentaur.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LimitedTimesPerTurnActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BorealCentaur extends CardImpl {
+
+ public BorealCentaur(UUID ownerId) {
+ super(ownerId, 104, "Boreal Centaur", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{G}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Centaur");
+ this.subtype.add("Warrior");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {S}: Boreal Centaur gets +1/+1 until end of turn. Activate this ability only once each turn.
+ this.addAbility(new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{S}")));
+ }
+
+ public BorealCentaur(final BorealCentaur card) {
+ super(card);
+ }
+
+ @Override
+ public BorealCentaur copy() {
+ return new BorealCentaur(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/BorealGriffin.java b/Mage.Sets/src/mage/sets/coldsnap/BorealGriffin.java
new file mode 100644
index 00000000000..713afdec699
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/BorealGriffin.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BorealGriffin extends CardImpl {
+
+ public BorealGriffin(UUID ownerId) {
+ super(ownerId, 2, "Boreal Griffin", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{W}{W}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Griffin");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // {S}: Boreal Griffin gains first strike until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(
+ FirstStrikeAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{S}")));
+ }
+
+ public BorealGriffin(final BorealGriffin card) {
+ super(card);
+ }
+
+ @Override
+ public BorealGriffin copy() {
+ return new BorealGriffin(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/BraidOfFire.java b/Mage.Sets/src/mage/sets/coldsnap/BraidOfFire.java
new file mode 100644
index 00000000000..e08dc4e32f9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/BraidOfFire.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.Mana;
+import mage.abilities.Ability;
+import mage.abilities.costs.CostImpl;
+import mage.abilities.keyword.CumulativeUpkeepAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author AlumiuN
+ */
+public class BraidOfFire extends CardImpl {
+
+ public BraidOfFire(UUID ownerId) {
+ super(ownerId, 78, "Braid of Fire", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}");
+ this.expansionSetCode = "CSP";
+
+ // Cumulative upkeep-Add {R} to your mana pool.
+ this.addAbility(new CumulativeUpkeepAbility(new BraidOfFireCost()));
+ }
+
+ public BraidOfFire(final BraidOfFire card) {
+ super(card);
+ }
+
+ @Override
+ public BraidOfFire copy() {
+ return new BraidOfFire(this);
+ }
+}
+
+class BraidOfFireCost extends CostImpl {
+
+ public BraidOfFireCost() {
+ this.text = "Add {R} to your mana pool";
+ }
+
+ public BraidOfFireCost(BraidOfFireCost cost) {
+ super(cost);
+ }
+
+ @Override
+ public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) {
+ Player player = game.getPlayer(controllerId);
+ player.getManaPool().addMana(Mana.RedMana, game, ability);
+ paid = true;
+ return true;
+ }
+
+ @Override
+ public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) {
+ return game.getPlayer(controllerId) != null;
+ }
+
+ @Override
+ public BraidOfFireCost copy() {
+ return new BraidOfFireCost(this);
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/BullAurochs.java b/Mage.Sets/src/mage/sets/coldsnap/BullAurochs.java
new file mode 100644
index 00000000000..0d1ed967d00
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/BullAurochs.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.dynamicvalue.common.StaticValue;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterAttackingCreature;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.permanent.AnotherPredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BullAurochs extends CardImpl {
+
+ private static final FilterAttackingCreature filter = new FilterAttackingCreature("other attacking Aurochs");
+
+ static {
+ filter.add(new SubtypePredicate("Aurochs"));
+ filter.add(new AnotherPredicate());
+ }
+
+ public BullAurochs(UUID ownerId) {
+ super(ownerId, 107, "Bull Aurochs", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{G}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Aurochs");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // Whenever Bull Aurochs attacks, it gets +1/+0 until end of turn for each other attacking Aurochs.
+ PermanentsOnBattlefieldCount value = new PermanentsOnBattlefieldCount(filter, 1);
+ this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(value, new StaticValue(0), Duration.EndOfTurn, true), false));
+ }
+
+ public BullAurochs(final BullAurochs card) {
+ super(card);
+ }
+
+ @Override
+ public BullAurochs copy() {
+ return new BullAurochs(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/ChillToTheBone.java b/Mage.Sets/src/mage/sets/coldsnap/ChillToTheBone.java
new file mode 100644
index 00000000000..45d1b5b365e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/ChillToTheBone.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ChillToTheBone extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nonsnow creature");
+
+ static {
+ filter.add(Predicates.not(new SupertypePredicate("Snow")));
+ }
+
+ public ChillToTheBone(UUID ownerId) {
+ super(ownerId, 52, "Chill to the Bone", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{3}{B}");
+ this.expansionSetCode = "CSP";
+
+ // Destroy target nonsnow creature.
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
+ }
+
+ public ChillToTheBone(final ChillToTheBone card) {
+ super(card);
+ }
+
+ @Override
+ public ChillToTheBone copy() {
+ return new ChillToTheBone(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/ChillingShade.java b/Mage.Sets/src/mage/sets/coldsnap/ChillingShade.java
new file mode 100644
index 00000000000..7b528f7e90c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/ChillingShade.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ChillingShade extends CardImpl {
+
+ public ChillingShade(UUID ownerId) {
+ super(ownerId, 53, "Chilling Shade", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Shade");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // {S}: Chilling Shade gets +1/+1 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{S}")));
+ }
+
+ public ChillingShade(final ChillingShade card) {
+ super(card);
+ }
+
+ @Override
+ public ChillingShade copy() {
+ return new ChillingShade(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/ColdsteelHeart.java b/Mage.Sets/src/mage/sets/coldsnap/ColdsteelHeart.java
index 14bfb69089a..73bcef4442d 100644
--- a/Mage.Sets/src/mage/sets/coldsnap/ColdsteelHeart.java
+++ b/Mage.Sets/src/mage/sets/coldsnap/ColdsteelHeart.java
@@ -60,8 +60,8 @@ public class ColdsteelHeart extends CardImpl {
// Coldsteel Heart enters the battlefield tapped.
this.addAbility(new EntersBattlefieldTappedAbility());
// As Coldsteel Heart enters the battlefield, choose a color.
- this.addAbility(new EntersBattlefieldAbility(new ChooseColorEffect(Outcome.Neutral)));
- // {tap}: Add one mana of the chosen color to your mana pool.
+ this.addAbility(new EntersBattlefieldAbility(new ChooseColorEffect(Outcome.Neutral), null, "As {this} enters the battlefield, choose a color.", null));
+ // {T}: Add one mana of the chosen color to your mana pool.
this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new ColdsteelHeartManaEffect(), new TapSourceCost()));
}
@@ -90,7 +90,7 @@ class ColdsteelHeartManaEffect extends ManaEffect {
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player != null) {
- player.getManaPool().addMana(getMana(game, source), game, source);
+ player.getManaPool().addMana(getMana(game, source), game, source);
}
return true;
}
@@ -109,4 +109,4 @@ class ColdsteelHeartManaEffect extends ManaEffect {
public ColdsteelHeartManaEffect copy() {
return new ColdsteelHeartManaEffect(this);
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/DiamondFaerie.java b/Mage.Sets/src/mage/sets/coldsnap/DiamondFaerie.java
new file mode 100644
index 00000000000..0edd7386510
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/DiamondFaerie.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class DiamondFaerie extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Snow creatures");
+
+ static {
+ filter.add(new SupertypePredicate("Snow"));
+ }
+
+ public DiamondFaerie(UUID ownerId) {
+ super(ownerId, 128, "Diamond Faerie", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{G}{W}{U}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Faerie");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // {1}{S}: Snow creatures you control get +1/+1 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1,
+ Duration.EndOfTurn, filter), new ManaCostsImpl("{1}{S}")));
+ }
+
+ public DiamondFaerie(final DiamondFaerie card) {
+ super(card);
+ }
+
+ @Override
+ public DiamondFaerie copy() {
+ return new DiamondFaerie(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/DiscipleOfTeveshSzat.java b/Mage.Sets/src/mage/sets/coldsnap/DiscipleOfTeveshSzat.java
new file mode 100644
index 00000000000..4d5297e1013
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/DiscipleOfTeveshSzat.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class DiscipleOfTeveshSzat extends CardImpl {
+
+ public DiscipleOfTeveshSzat(UUID ownerId) {
+ super(ownerId, 55, "Disciple of Tevesh Szat", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Human");
+ this.subtype.add("Cleric");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(1);
+
+ // {tap}: Target creature gets -1/-1 until end of turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(-1, -1, Duration.EndOfTurn), new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ // {4}{B}{B}, {tap}, Sacrifice Disciple of Tevesh Szat: Target creature gets -6/-6 until end of turn.
+ ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(-6, -6, Duration.EndOfTurn), new ManaCostsImpl("{4}{B}{B}"));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public DiscipleOfTeveshSzat(final DiscipleOfTeveshSzat card) {
+ super(card);
+ }
+
+ @Override
+ public DiscipleOfTeveshSzat copy() {
+ return new DiscipleOfTeveshSzat(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/Drelnoch.java b/Mage.Sets/src/mage/sets/coldsnap/Drelnoch.java
new file mode 100644
index 00000000000..d13ed83c9be
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/Drelnoch.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.BecomesBlockedTriggeredAbility;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Drelnoch extends CardImpl {
+
+ public Drelnoch(UUID ownerId) {
+ super(ownerId, 32, "Drelnoch", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{U}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Yeti");
+ this.subtype.add("Mutant");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Whenever Drelnoch becomes blocked, you may draw two cards.
+ this.addAbility(new BecomesBlockedTriggeredAbility(new DrawCardSourceControllerEffect(2), true));
+ }
+
+ public Drelnoch(final Drelnoch card) {
+ super(card);
+ }
+
+ @Override
+ public Drelnoch copy() {
+ return new Drelnoch(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/FrostRaptor.java b/Mage.Sets/src/mage/sets/coldsnap/FrostRaptor.java
new file mode 100644
index 00000000000..b355fcbd3cb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/FrostRaptor.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.ShroudAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FrostRaptor extends CardImpl {
+
+ public FrostRaptor(UUID ownerId) {
+ super(ownerId, 34, "Frost Raptor", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Bird");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // {S}{S}: Frost Raptor gains shroud until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(
+ ShroudAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{S}{S}")));
+ }
+
+ public FrostRaptor(final FrostRaptor card) {
+ super(card);
+ }
+
+ @Override
+ public FrostRaptor copy() {
+ return new FrostRaptor(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/FrozenSolid.java b/Mage.Sets/src/mage/sets/coldsnap/FrozenSolid.java
new file mode 100644
index 00000000000..750dcca0a40
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/FrozenSolid.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.DamageDealtToAttachedTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.DestroyAttachedEffect;
+import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FrozenSolid extends CardImpl {
+
+ public FrozenSolid(UUID ownerId) {
+ super(ownerId, 35, "Frozen Solid", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}{U}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Aura");
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+ // Enchanted creature doesn't untap during its controller's untap step.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepEnchantedEffect()));
+ // When enchanted creature is dealt damage, destroy it.
+ this.addAbility(new DamageDealtToAttachedTriggeredAbility(new DestroyAttachedEffect("it"), false));
+ }
+
+ public FrozenSolid(final FrozenSolid card) {
+ super(card);
+ }
+
+ @Override
+ public FrozenSolid copy() {
+ return new FrozenSolid(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/GreaterStoneSpirit.java b/Mage.Sets/src/mage/sets/coldsnap/GreaterStoneSpirit.java
new file mode 100644
index 00000000000..44c03edc0f7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/GreaterStoneSpirit.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GreaterStoneSpirit extends mage.sets.venservskoth.GreaterStoneSpirit {
+
+ public GreaterStoneSpirit(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 84;
+ this.expansionSetCode = "CSP";
+ }
+
+ public GreaterStoneSpirit(final GreaterStoneSpirit card) {
+ super(card);
+ }
+
+ @Override
+ public GreaterStoneSpirit copy() {
+ return new GreaterStoneSpirit(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/GristleGrinner.java b/Mage.Sets/src/mage/sets/coldsnap/GristleGrinner.java
new file mode 100644
index 00000000000..46edb011e8b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/GristleGrinner.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DiesCreatureTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GristleGrinner extends CardImpl {
+
+ public GristleGrinner(UUID ownerId) {
+ super(ownerId, 59, "Gristle Grinner", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{B}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Zombie");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Whenever a creature dies, Gristle Grinner gets +2/+2 until end of turn.
+ this.addAbility(new DiesCreatureTriggeredAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), false));
+ }
+
+ public GristleGrinner(final GristleGrinner card) {
+ super(card);
+ }
+
+ @Override
+ public GristleGrinner copy() {
+ return new GristleGrinner(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/GutlessGhoul.java b/Mage.Sets/src/mage/sets/coldsnap/GutlessGhoul.java
new file mode 100644
index 00000000000..61c564f1459
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/GutlessGhoul.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GutlessGhoul extends CardImpl {
+
+ public GutlessGhoul(UUID ownerId) {
+ super(ownerId, 60, "Gutless Ghoul", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Zombie");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {1}, Sacrifice a creature: You gain 2 life.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(2), new ManaCostsImpl("{1}"));
+ ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(new FilterControlledCreaturePermanent("a creature"))));
+ this.addAbility(ability);
+ }
+
+ public GutlessGhoul(final GutlessGhoul card) {
+ super(card);
+ }
+
+ @Override
+ public GutlessGhoul copy() {
+ return new GutlessGhoul(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/HeidarRimewindMaster.java b/Mage.Sets/src/mage/sets/coldsnap/HeidarRimewindMaster.java
new file mode 100644
index 00000000000..6011ac418d9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/HeidarRimewindMaster.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateIfConditionActivatedAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.ReturnToHandTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+import mage.target.TargetPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class HeidarRimewindMaster extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control four or more snow permanents");
+
+ static {
+ filter.add(new SupertypePredicate("Snow"));
+ }
+
+ public HeidarRimewindMaster(UUID ownerId) {
+ super(ownerId, 36, "Heidar, Rimewind Master", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{U}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // {2}, {tap}: Return target permanent to its owner's hand. Activate this ability only if you control four or more snow permanents.
+ Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD,
+ new ReturnToHandTargetEffect(),
+ new GenericManaCost(2),
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 3));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetPermanent());
+ this.addAbility(ability);
+ }
+
+ public HeidarRimewindMaster(final HeidarRimewindMaster card) {
+ super(card);
+ }
+
+ @Override
+ public HeidarRimewindMaster copy() {
+ return new HeidarRimewindMaster(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/HibernationsEnd.java b/Mage.Sets/src/mage/sets/coldsnap/HibernationsEnd.java
new file mode 100644
index 00000000000..09d46b4974c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/HibernationsEnd.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
+import mage.abilities.keyword.CumulativeUpkeepAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.Filter;
+import mage.filter.FilterCard;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCardInLibrary;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class HibernationsEnd extends CardImpl {
+
+ public HibernationsEnd(UUID ownerId) {
+ super(ownerId, 110, "Hibernation's End", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{4}{G}");
+ this.expansionSetCode = "CSP";
+
+ // Cumulative upkeep {1}
+ this.addAbility(new CumulativeUpkeepAbility(new ManaCostsImpl("{1}")));
+ // Whenever you pay Hibernation's End's cumulative upkeep, you may search your library for a creature card with converted mana cost equal to the number of age counters on Hibernation's End and put it onto the battlefield. If you do, shuffle your library.
+ this.addAbility(new HibernationsEndAbility());
+ }
+
+ public HibernationsEnd(final HibernationsEnd card) {
+ super(card);
+ }
+
+ @Override
+ public HibernationsEnd copy() {
+ return new HibernationsEnd(this);
+ }
+}
+
+class HibernationsEndAbility extends TriggeredAbilityImpl {
+
+ public HibernationsEndAbility() {
+ super(Zone.BATTLEFIELD, new HibernationsEndEffect(), true);
+ }
+
+ public HibernationsEndAbility(final HibernationsEndAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public HibernationsEndAbility copy() {
+ return new HibernationsEndAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.PAID_CUMULATIVE_UPKEEP;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ return event.getSourceId() != null && event.getSourceId().equals(this.getSourceId());
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever you pay {this}'s cumulative upkeep, " + super.getRule();
+ }
+}
+
+class HibernationsEndEffect extends OneShotEffect {
+
+ public HibernationsEndEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "search your library for a creature card with converted mana cost equal to the number of age counters on {this} and put it onto the battlefield. If you do, shuffle your library.";
+ }
+
+ public HibernationsEndEffect(final HibernationsEndEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public HibernationsEndEffect copy() {
+ return new HibernationsEndEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
+ if (sourcePermanent != null && player != null) {
+ int newConvertedCost = sourcePermanent.getCounters().getCount("age");
+ FilterCard filter = new FilterCard("creature card with converted mana cost " + newConvertedCost);
+ filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.Equal, newConvertedCost));
+ filter.add(new CardTypePredicate(CardType.CREATURE));
+ TargetCardInLibrary target = new TargetCardInLibrary(filter);
+ return new SearchLibraryPutInPlayEffect(target).apply(game, source);
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/Jokulmorder.java b/Mage.Sets/src/mage/sets/coldsnap/Jokulmorder.java
new file mode 100644
index 00000000000..f35509c7ac3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/Jokulmorder.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect;
+import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
+import mage.abilities.effects.common.UntapSourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledLandPermanent;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Jokulmorder extends CardImpl {
+
+ public Jokulmorder(UUID ownerId) {
+ super(ownerId, 37, "Jokulmorder", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{U}{U}{U}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Leviathan");
+ this.power = new MageInt(12);
+ this.toughness = new MageInt(12);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+
+ // Jokulmorder enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // When Jokulmorder enters the battlefield, sacrifice it unless you sacrifice five lands.
+ Effect effect = new SacrificeSourceUnlessPaysEffect(
+ new SacrificeTargetCost(new TargetControlledPermanent(5, 5, new FilterControlledLandPermanent("five lands"), true)));
+ effect.setText("sacrifice it unless you sacrifice five lands");
+ this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false));
+
+ // Jokulmorder doesn't untap during your untap step.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepSourceEffect()));
+
+ // Whenever you play an Island, you may untap Jokulmorder.
+ this.addAbility(new JokulmorderTriggeredAbility());
+ }
+
+ public Jokulmorder(final Jokulmorder card) {
+ super(card);
+ }
+
+ @Override
+ public Jokulmorder copy() {
+ return new Jokulmorder(this);
+ }
+}
+
+class JokulmorderTriggeredAbility extends TriggeredAbilityImpl {
+
+ JokulmorderTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new UntapSourceEffect(), true);
+ }
+
+ JokulmorderTriggeredAbility(JokulmorderTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.LAND_PLAYED;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent land = game.getPermanent(event.getTargetId());
+ return land.getSubtype().contains("Island")
+ && land.getControllerId().equals(this.controllerId);
+ }
+
+ @Override
+ public JokulmorderTriggeredAbility copy() {
+ return new JokulmorderTriggeredAbility(this);
+ }
+
+ @Override
+ public String getRule() {
+ return "When you play an Island, you may untap {this}";
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/KjeldoranOutrider.java b/Mage.Sets/src/mage/sets/coldsnap/KjeldoranOutrider.java
new file mode 100644
index 00000000000..f7fe42c7c35
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/KjeldoranOutrider.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class KjeldoranOutrider extends CardImpl {
+
+ public KjeldoranOutrider(UUID ownerId) {
+ super(ownerId, 12, "Kjeldoran Outrider", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {W}: Kjeldoran Outrider gets +0/+1 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(0, 1, Duration.EndOfTurn), new ManaCostsImpl("{W}")));
+ }
+
+ public KjeldoranOutrider(final KjeldoranOutrider card) {
+ super(card);
+ }
+
+ @Override
+ public KjeldoranOutrider copy() {
+ return new KjeldoranOutrider(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/LightningSerpent.java b/Mage.Sets/src/mage/sets/coldsnap/LightningSerpent.java
new file mode 100644
index 00000000000..fb07bb59cd7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/LightningSerpent.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
+import mage.abilities.effects.common.SacrificeSourceEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.counters.CounterType;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LightningSerpent extends CardImpl {
+
+ public LightningSerpent(UUID ownerId) {
+ super(ownerId, 88, "Lightning Serpent", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{X}{R}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Elemental");
+ this.subtype.add("Serpent");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // Haste
+ this.addAbility(HasteAbility.getInstance());
+ // Lightning Serpent enters the battlefield with X +1/+0 counters on it.
+ this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.P1P0.createInstance())));
+ // At the beginning of the end step, sacrifice Lightning Serpent.
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(new SacrificeSourceEffect(), TargetController.ANY, false));
+ }
+
+ public LightningSerpent(final LightningSerpent card) {
+ super(card);
+ }
+
+ @Override
+ public LightningSerpent copy() {
+ return new LightningSerpent(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/LightningStorm.java b/Mage.Sets/src/mage/sets/coldsnap/LightningStorm.java
index fd05403b5b5..4505fa176ca 100644
--- a/Mage.Sets/src/mage/sets/coldsnap/LightningStorm.java
+++ b/Mage.Sets/src/mage/sets/coldsnap/LightningStorm.java
@@ -29,6 +29,7 @@ package mage.sets.coldsnap;
import java.util.UUID;
import mage.abilities.Ability;
+import mage.abilities.ActivatedAbilityImpl;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.DiscardTargetCost;
import mage.abilities.dynamicvalue.DynamicValue;
@@ -59,7 +60,6 @@ public class LightningStorm extends CardImpl {
super(ownerId, 89, "Lightning Storm", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{R}{R}");
this.expansionSetCode = "CSP";
-
// Lightning Storm deals X damage to target creature or player, where X is 3 plus the number of charge counters on it.
Effect effect = new DamageTargetEffect(new LightningStormCountCondition(CounterType.CHARGE));
effect.setText("{this} deals X damage to target creature or player, where X is 3 plus the number of charge counters on it");
@@ -67,7 +67,7 @@ public class LightningStorm extends CardImpl {
this.getSpellAbility().addTarget(new TargetCreatureOrPlayer());
// Discard a land card: Put two charge counters on Lightning Storm. You may choose a new target for it. Any player may activate this ability but only if Lightning Storm is on the stack.
SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.STACK,
- new LightningStormAddCounterEffect() ,
+ new LightningStormAddCounterEffect(),
new DiscardTargetCost(new TargetCardInHand(new FilterLandCard())));
ability.setMayActivate(TargetController.ANY);
ability.addEffect(new InfoEffect("Any player may activate this ability but only if {this} is on the stack"));
@@ -85,6 +85,7 @@ public class LightningStorm extends CardImpl {
}
class LightningStormCountCondition implements DynamicValue {
+
private final CounterType counter;
public LightningStormCountCondition(CounterType counter) {
@@ -141,7 +142,7 @@ class LightningStormAddCounterEffect extends OneShotEffect {
Spell spell = game.getStack().getSpell(source.getSourceId());
if (spell != null) {
spell.addCounters(CounterType.CHARGE.createInstance(2), game);
- return spell.chooseNewTargets(game, source.getControllerId(), false, false, null);
+ return spell.chooseNewTargets(game, ((ActivatedAbilityImpl) source).getActivatorId(), false, false, null);
}
return false;
}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/LovisaColdeyes.java b/Mage.Sets/src/mage/sets/coldsnap/LovisaColdeyes.java
new file mode 100644
index 00000000000..ebdff5a9086
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/LovisaColdeyes.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LovisaColdeyes extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature you control that's a Barbarian, a Warrior, or a Berserker");
+
+ static {
+ filter.add(Predicates.or(new SubtypePredicate("Barbarian"), new SubtypePredicate("Warrior"), new SubtypePredicate("Berserker")));
+ }
+
+ public LovisaColdeyes(UUID ownerId) {
+ super(ownerId, 90, "Lovisa Coldeyes", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{R}{R}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Each creature you control that's a Barbarian, a Warrior, or a Berserker gets +2/+2 and has haste.
+ Effect effect = new BoostControlledEffect(2, 2, Duration.WhileOnBattlefield, filter, false);
+ effect.setText("Each creature you control that's a Barbarian, a Warrior, or a Berserker gets +2/+2");
+ Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect);
+ effect = new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter, false);
+ effect.setText("and has haste");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public LovisaColdeyes(final LovisaColdeyes card) {
+ super(card);
+ }
+
+ @Override
+ public LovisaColdeyes copy() {
+ return new LovisaColdeyes(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/MartyrOfBones.java b/Mage.Sets/src/mage/sets/coldsnap/MartyrOfBones.java
index a08beb1ada4..0c017fd3786 100644
--- a/Mage.Sets/src/mage/sets/coldsnap/MartyrOfBones.java
+++ b/Mage.Sets/src/mage/sets/coldsnap/MartyrOfBones.java
@@ -57,6 +57,8 @@ import mage.target.common.TargetCardInHand;
*/
public class MartyrOfBones extends CardImpl {
+ private final UUID originalId;
+
public MartyrOfBones(UUID ownerId) {
super(ownerId, 65, "Martyr of Bones", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}");
this.expansionSetCode = "CSP";
@@ -72,16 +74,18 @@ public class MartyrOfBones extends CardImpl {
ability.addCost(new RevealVariableBlackCardsFromHandCost());
ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetCardInASingleGraveyard(0, 1, new FilterCard("cards in a single graveyard")));
+ originalId = ability.getOriginalId();
this.addAbility(ability);
}
-
+
public MartyrOfBones(final MartyrOfBones card) {
super(card);
+ this.originalId = card.originalId;
}
@Override
public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SimpleActivatedAbility) {
+ if (ability.getOriginalId().equals(originalId)) {
int amount = 0;
for (Cost cost : ability.getCosts()) {
if (cost instanceof RevealVariableBlackCardsFromHandCost) {
@@ -100,36 +104,37 @@ public class MartyrOfBones extends CardImpl {
}
class RevealVariableBlackCardsFromHandCost extends VariableCostImpl {
-
+
private static final FilterCard filter = new FilterCard("X black cards from your hand");
+
static {
filter.add(new ColorPredicate(ObjectColor.BLACK));
}
-
+
RevealVariableBlackCardsFromHandCost() {
super("black cards to reveal");
this.text = new StringBuilder("Reveal ").append(xText).append(" black cards from {this}").toString();
}
-
+
RevealVariableBlackCardsFromHandCost(final RevealVariableBlackCardsFromHandCost cost) {
super(cost);
}
-
+
@Override
public RevealVariableBlackCardsFromHandCost copy() {
return new RevealVariableBlackCardsFromHandCost(this);
}
-
+
@Override
public Cost getFixedCostsFromAnnouncedValue(int xValue) {
return new RevealTargetFromHandCost(new TargetCardInHand(0, xValue, filter));
}
-
+
@Override
public int getMinValue(Ability source, Game game) {
return 0;
}
-
+
@Override
public int getMaxValue(Ability source, Game game) {
Player player = game.getPlayer(source.getControllerId());
@@ -138,4 +143,4 @@ class RevealVariableBlackCardsFromHandCost extends VariableCostImpl {
}
return 0;
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/MouthOfRonom.java b/Mage.Sets/src/mage/sets/coldsnap/MouthOfRonom.java
index 97e51075d93..b4ea1d2ab05 100644
--- a/Mage.Sets/src/mage/sets/coldsnap/MouthOfRonom.java
+++ b/Mage.Sets/src/mage/sets/coldsnap/MouthOfRonom.java
@@ -52,15 +52,15 @@ public class MouthOfRonom extends CardImpl {
this.expansionSetCode = "CSP";
this.supertype.add("Snow");
- // {tap}: Add {1} to your mana pool.
+ // {T}: Add {1} to your mana pool.
this.addAbility(new ColorlessManaAbility());
- // {4}{snow}, {tap}, Sacrifice Mouth of Ronom: Mouth of Ronom deals 4 damage to target creature.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(4), new ManaCostsImpl("{4}{snow}"));
+ // {4}{S}, {T}, Sacrifice Mouth of Ronom: Mouth of Ronom deals 4 damage to target creature.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(4), new ManaCostsImpl("{4}{S}"));
ability.addTarget(new TargetCreaturePermanent());
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
-
+
}
public MouthOfRonom(final MouthOfRonom card) {
diff --git a/Mage.Sets/src/mage/sets/coldsnap/MysticMelting.java b/Mage.Sets/src/mage/sets/coldsnap/MysticMelting.java
new file mode 100644
index 00000000000..df32d4ef617
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/MysticMelting.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterArtifactOrEnchantmentPermanent;
+import mage.target.TargetPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class MysticMelting extends CardImpl {
+
+ public MysticMelting(UUID ownerId) {
+ super(ownerId, 114, "Mystic Melting", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}{G}");
+ this.expansionSetCode = "CSP";
+
+ // Destroy target artifact or enchantment.
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
+ this.getSpellAbility().addTarget(new TargetPermanent(new FilterArtifactOrEnchantmentPermanent()));
+
+ // Draw a card at the beginning of the next turn's upkeep.
+ this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(
+ new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false));
+ }
+
+ public MysticMelting(final MysticMelting card) {
+ super(card);
+ }
+
+ @Override
+ public MysticMelting copy() {
+ return new MysticMelting(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/OhranYeti.java b/Mage.Sets/src/mage/sets/coldsnap/OhranYeti.java
new file mode 100644
index 00000000000..cd5fcb64786
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/OhranYeti.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class OhranYeti extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("snow creature");
+
+ static {
+ filter.add(new SupertypePredicate("Snow"));
+ }
+
+ public OhranYeti(UUID ownerId) {
+ super(ownerId, 93, "Ohran Yeti", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Yeti");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // {2}{S}: Target snow creature gains first strike until end of turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityTargetEffect(
+ FirstStrikeAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{2}{S}"));
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ this.addAbility(ability);
+ }
+
+ public OhranYeti(final OhranYeti card) {
+ super(card);
+ }
+
+ @Override
+ public OhranYeti copy() {
+ return new OhranYeti(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/PhobianPhantasm.java b/Mage.Sets/src/mage/sets/coldsnap/PhobianPhantasm.java
new file mode 100644
index 00000000000..f70ed990556
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/PhobianPhantasm.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.keyword.CumulativeUpkeepAbility;
+import mage.abilities.keyword.FearAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class PhobianPhantasm extends CardImpl {
+
+ public PhobianPhantasm(UUID ownerId) {
+ super(ownerId, 66, "Phobian Phantasm", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Illusion");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Flying; fear
+ this.addAbility(FlyingAbility.getInstance());
+ this.addAbility(FearAbility.getInstance());
+ // Cumulative upkeep {B}
+ this.addAbility(new CumulativeUpkeepAbility(new ManaCostsImpl("{B}")));
+ }
+
+ public PhobianPhantasm(final PhobianPhantasm card) {
+ super(card);
+ }
+
+ @Override
+ public PhobianPhantasm copy() {
+ return new PhobianPhantasm(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/PhyrexianIronfoot.java b/Mage.Sets/src/mage/sets/coldsnap/PhyrexianIronfoot.java
new file mode 100644
index 00000000000..978939a710d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/PhyrexianIronfoot.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect;
+import mage.abilities.effects.common.UntapSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class PhyrexianIronfoot extends CardImpl {
+
+ public PhyrexianIronfoot(UUID ownerId) {
+ super(ownerId, 139, "Phyrexian Ironfoot", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Construct");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(4);
+
+ // Phyrexian Ironfoot doesn't untap during your untap step.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepSourceEffect()));
+
+ // {1}{S}: Untap Phyrexian Ironfoot.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapSourceEffect(), new ManaCostsImpl("{1}{S}")));
+ }
+
+ public PhyrexianIronfoot(final PhyrexianIronfoot card) {
+ super(card);
+ }
+
+ @Override
+ public PhyrexianIronfoot copy() {
+ return new PhyrexianIronfoot(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/PhyrexianSnowcrusher.java b/Mage.Sets/src/mage/sets/coldsnap/PhyrexianSnowcrusher.java
new file mode 100644
index 00000000000..5d72c75fddc
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/PhyrexianSnowcrusher.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksEachTurnStaticAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class PhyrexianSnowcrusher extends CardImpl {
+
+ public PhyrexianSnowcrusher(UUID ownerId) {
+ super(ownerId, 140, "Phyrexian Snowcrusher", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{6}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Juggernaut");
+ this.power = new MageInt(6);
+ this.toughness = new MageInt(5);
+
+ // Phyrexian Snowcrusher attacks each turn if able.
+ this.addAbility(new AttacksEachTurnStaticAbility());
+ // {1}{S}: Phyrexian Snowcrusher gets +1/+0 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl("{1}{S}")));
+ }
+
+ public PhyrexianSnowcrusher(final PhyrexianSnowcrusher card) {
+ super(card);
+ }
+
+ @Override
+ public PhyrexianSnowcrusher copy() {
+ return new PhyrexianSnowcrusher(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/RimeTransfusion.java b/Mage.Sets/src/mage/sets/coldsnap/RimeTransfusion.java
new file mode 100644
index 00000000000..9e0941fbcfa
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/RimeTransfusion.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleEvasionAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect;
+import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
+import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RimeTransfusion extends CardImpl {
+
+ static final String rule = "and has \"{S}: This creature can't be blocked this turn except by snow creatures.\"";
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("except by snow creatures until end of turn");
+
+ static {
+ filter.add(Predicates.not(new SupertypePredicate("Snow")));
+ }
+
+ public RimeTransfusion(UUID ownerId) {
+ super(ownerId, 68, "Rime Transfusion", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Aura");
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+
+ // Enchanted creature gets +2/+1 and has "{S}: This creature can't be blocked this turn except by snow creatures."
+ SimpleStaticAbility ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 1, Duration.WhileOnBattlefield));
+ Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.EndOfTurn))),new ManaCostsImpl("{S}"));
+ ability2.addEffect(new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA, Duration.WhileOnBattlefield, rule));
+ this.addAbility(ability2);
+ }
+
+ public RimeTransfusion(final RimeTransfusion card) {
+ super(card);
+ }
+
+ @Override
+ public RimeTransfusion copy() {
+ return new RimeTransfusion(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/RimeboundDead.java b/Mage.Sets/src/mage/sets/coldsnap/RimeboundDead.java
new file mode 100644
index 00000000000..f204b09e073
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/RimeboundDead.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.RegenerateSourceEffect;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class RimeboundDead extends CardImpl {
+
+ public RimeboundDead(UUID ownerId) {
+ super(ownerId, 69, "Rimebound Dead", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Skeleton");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {S}: Regenerate Rimebound Dead.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{S}")));
+ }
+
+ public RimeboundDead(final RimeboundDead card) {
+ super(card);
+ }
+
+ @Override
+ public RimeboundDead copy() {
+ return new RimeboundDead(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/RimewindCryomancer.java b/Mage.Sets/src/mage/sets/coldsnap/RimewindCryomancer.java
new file mode 100644
index 00000000000..41775a35a3b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/RimewindCryomancer.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateIfConditionActivatedAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.CounterTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+import mage.target.common.TargetActivatedAbility;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RimewindCryomancer extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control four or more snow permanents");
+
+ static {
+ filter.add(new SupertypePredicate("Snow"));
+ }
+
+ public RimewindCryomancer(UUID ownerId) {
+ super(ownerId, 43, "Rimewind Cryomancer", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{U}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Human");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // {1}, {tap}: Counter target activated ability. Activate this ability only if you control four or more snow permanents.
+ Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD,
+ new CounterTargetEffect(),
+ new GenericManaCost(1),
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 3));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetActivatedAbility());
+ this.addAbility(ability);
+ }
+
+ public RimewindCryomancer(final RimewindCryomancer card) {
+ super(card);
+ }
+
+ @Override
+ public RimewindCryomancer copy() {
+ return new RimewindCryomancer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/RimewindTaskmage.java b/Mage.Sets/src/mage/sets/coldsnap/RimewindTaskmage.java
new file mode 100644
index 00000000000..420ca2ecc6c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/RimewindTaskmage.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateIfConditionActivatedAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.MayTapOrUntapTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+import mage.target.TargetPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RimewindTaskmage extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control four or more snow permanents");
+
+ static {
+ filter.add(new SupertypePredicate("Snow"));
+ }
+
+ public RimewindTaskmage(UUID ownerId) {
+ super(ownerId, 44, "Rimewind Taskmage", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Human");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // {1}, {tap}: You may tap or untap target permanent. Activate this ability only if you control four or more snow permanents.
+ Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD,
+ new MayTapOrUntapTargetEffect(),
+ new GenericManaCost(1),
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 3));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetPermanent());
+ this.addAbility(ability);
+ }
+
+ public RimewindTaskmage(final RimewindTaskmage card) {
+ super(card);
+ }
+
+ @Override
+ public RimewindTaskmage copy() {
+ return new RimewindTaskmage(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/RonomHulk.java b/Mage.Sets/src/mage/sets/coldsnap/RonomHulk.java
new file mode 100644
index 00000000000..3ccf0bb3e21
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/RonomHulk.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.keyword.CumulativeUpkeepAbility;
+import mage.abilities.keyword.ProtectionAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.FilterCard;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class RonomHulk extends CardImpl {
+
+ private static final FilterCard filter = new FilterCard("snow");
+
+ static {
+ filter.add(new SupertypePredicate("Snow"));
+ }
+
+ public RonomHulk(UUID ownerId) {
+ super(ownerId, 119, "Ronom Hulk", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{G}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Beast");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(6);
+
+ // Protection from snow
+ this.addAbility(new ProtectionAbility(filter));
+ // Cumulative upkeep {1}
+ this.addAbility(new CumulativeUpkeepAbility(new ManaCostsImpl("{1}")));
+ }
+
+ public RonomHulk(final RonomHulk card) {
+ super(card);
+ }
+
+ @Override
+ public RonomHulk copy() {
+ return new RonomHulk(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/ScryingSheets.java b/Mage.Sets/src/mage/sets/coldsnap/ScryingSheets.java
index 2669da9ec02..0aaf3714f36 100644
--- a/Mage.Sets/src/mage/sets/coldsnap/ScryingSheets.java
+++ b/Mage.Sets/src/mage/sets/coldsnap/ScryingSheets.java
@@ -59,8 +59,8 @@ public class ScryingSheets extends CardImpl {
// {tap}: Add {1} to your mana pool.
this.addAbility(new ColorlessManaAbility());
- // {1}{snow}, {tap}: Look at the top card of your library. If that card is snow, you may reveal it and put it into your hand.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ScryingSheetsEffect(), new ManaCostsImpl<>("{1}{snow}"));
+ // {1}{S}, {T}: Look at the top card of your library. If that card is snow, you may reveal it and put it into your hand.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ScryingSheetsEffect(), new ManaCostsImpl<>("{1}{S}"));
ability.addCost(new TapSourceCost());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/SimianBrawler.java b/Mage.Sets/src/mage/sets/coldsnap/SimianBrawler.java
new file mode 100644
index 00000000000..937acb55a3c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/SimianBrawler.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.DiscardCardCost;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterLandCard;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SimianBrawler extends CardImpl {
+
+ public SimianBrawler(UUID ownerId) {
+ super(ownerId, 122, "Simian Brawler", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{G}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Ape");
+ this.subtype.add("Warrior");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Discard a land card: Simian Brawler gets +1/+1 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn),
+ new DiscardCardCost(new FilterLandCard("a land card"))));
+ }
+
+ public SimianBrawler(final SimianBrawler card) {
+ super(card);
+ }
+
+ @Override
+ public SimianBrawler copy() {
+ return new SimianBrawler(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/SteamSpitter.java b/Mage.Sets/src/mage/sets/coldsnap/SteamSpitter.java
new file mode 100644
index 00000000000..bc75f972163
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/SteamSpitter.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.ReachAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SteamSpitter extends CardImpl {
+
+ public SteamSpitter(UUID ownerId) {
+ super(ownerId, 124, "Steam Spitter", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{G}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Spider");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(5);
+
+ // Reach
+ this.addAbility(ReachAbility.getInstance());
+ // {R}: Steam Spitter gets +1/+0 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl("{R}")));
+ }
+
+ public SteamSpitter(final SteamSpitter card) {
+ super(card);
+ }
+
+ @Override
+ public SteamSpitter copy() {
+ return new SteamSpitter(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/SurgingAEther.java b/Mage.Sets/src/mage/sets/coldsnap/SurgingAEther.java
new file mode 100644
index 00000000000..49a2b4d0791
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/SurgingAEther.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.abilities.effects.common.ReturnToHandTargetEffect;
+import mage.abilities.keyword.RippleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.TargetPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SurgingAEther extends CardImpl {
+
+ public SurgingAEther(UUID ownerId) {
+ super(ownerId, 47, "Surging AEther", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{3}{U}");
+ this.expansionSetCode = "CSP";
+
+ // Ripple 4
+ this.addAbility(new RippleAbility(4));
+ // Return target permanent to its owner's hand.
+ this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
+ this.getSpellAbility().addTarget(new TargetPermanent());
+ }
+
+ public SurgingAEther(final SurgingAEther card) {
+ super(card);
+ }
+
+ @Override
+ public SurgingAEther copy() {
+ return new SurgingAEther(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/SurgingFlame.java b/Mage.Sets/src/mage/sets/coldsnap/SurgingFlame.java
new file mode 100644
index 00000000000..3976ad6ba80
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/SurgingFlame.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.keyword.RippleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SurgingFlame extends CardImpl {
+
+ public SurgingFlame(UUID ownerId) {
+ super(ownerId, 99, "Surging Flame", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{R}");
+ this.expansionSetCode = "CSP";
+
+ // Ripple 4
+ this.addAbility(new RippleAbility(4));
+ // Surging Flame deals 2 damage to target creature or player.
+ this.getSpellAbility().addEffect(new DamageTargetEffect(2));
+ this.getSpellAbility().addTarget(new TargetCreatureOrPlayer());
+ }
+
+ public SurgingFlame(final SurgingFlame card) {
+ super(card);
+ }
+
+ @Override
+ public SurgingFlame copy() {
+ return new SurgingFlame(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/SurgingMight.java b/Mage.Sets/src/mage/sets/coldsnap/SurgingMight.java
new file mode 100644
index 00000000000..b932abbe517
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/SurgingMight.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.abilities.keyword.RippleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SurgingMight extends CardImpl {
+
+ public SurgingMight(UUID ownerId) {
+ super(ownerId, 125, "Surging Might", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Aura");
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+ // Enchanted creature gets +2/+2.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield)));
+ // Ripple 4
+ this.addAbility(new RippleAbility(4));
+ }
+
+ public SurgingMight(final SurgingMight card) {
+ super(card);
+ }
+
+ @Override
+ public SurgingMight copy() {
+ return new SurgingMight(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/SurgingSentinels.java b/Mage.Sets/src/mage/sets/coldsnap/SurgingSentinels.java
new file mode 100644
index 00000000000..01ef0154caa
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/SurgingSentinels.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.abilities.keyword.RippleAbility;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SurgingSentinels extends CardImpl {
+
+ public SurgingSentinels(UUID ownerId) {
+ super(ownerId, 20, "Surging Sentinels", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // First strike
+ this.addAbility(FirstStrikeAbility.getInstance());
+ // Ripple 4
+ this.addAbility(new RippleAbility(4));
+ }
+
+ public SurgingSentinels(final SurgingSentinels card) {
+ super(card);
+ }
+
+ @Override
+ public SurgingSentinels copy() {
+ return new SurgingSentinels(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/SwiftManeuver.java b/Mage.Sets/src/mage/sets/coldsnap/SwiftManeuver.java
new file mode 100644
index 00000000000..a503d425883
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/SwiftManeuver.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.PreventDamageToTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SwiftManeuver extends CardImpl {
+
+ public SwiftManeuver(UUID ownerId) {
+ super(ownerId, 21, "Swift Maneuver", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}");
+ this.expansionSetCode = "CSP";
+
+ // Prevent the next 2 damage that would be dealt to target creature or player this turn.
+ this.getSpellAbility().addEffect(new PreventDamageToTargetEffect(Duration.EndOfTurn, 2));
+ this.getSpellAbility().addTarget(new TargetCreatureOrPlayer());
+
+ // Draw a card at the beginning of the next turn's upkeep.
+ this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(
+ new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false));
+ }
+
+ public SwiftManeuver(final SwiftManeuver card) {
+ super(card);
+ }
+
+ @Override
+ public SwiftManeuver copy() {
+ return new SwiftManeuver(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/Thermopod.java b/Mage.Sets/src/mage/sets/coldsnap/Thermopod.java
new file mode 100644
index 00000000000..910a63f366b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/Thermopod.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.Mana;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.abilities.mana.SimpleManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Thermopod extends CardImpl {
+
+ public Thermopod(UUID ownerId) {
+ super(ownerId, 100, "Thermopod", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{R}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Slug");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(3);
+
+ // {S}: Thermopod gains haste until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(
+ HasteAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{S}")));
+ // Sacrifice a creature: Add {R} to your mana pool.
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.RedMana(1), new SacrificeTargetCost(
+ new TargetControlledCreaturePermanent(new FilterControlledCreaturePermanent("a creature")))));
+ }
+
+ public Thermopod(final Thermopod card) {
+ super(card);
+ }
+
+ @Override
+ public Thermopod copy() {
+ return new Thermopod(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/UrsineFylgja.java b/Mage.Sets/src/mage/sets/coldsnap/UrsineFylgja.java
new file mode 100644
index 00000000000..98a464f1cb4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/UrsineFylgja.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.RemoveCountersSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.PreventDamageToSourceEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class UrsineFylgja extends CardImpl {
+
+ public UrsineFylgja(UUID ownerId) {
+ super(ownerId, 22, "Ursine Fylgja", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{W}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Spirit");
+ this.subtype.add("Bear");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Ursine Fylgja enters the battlefield with four healing counters on it.
+ Effect effect = new AddCountersSourceEffect(CounterType.HEALING.createInstance(4));
+ effect.setText("with four healing counters on it.");
+ this.addAbility(new EntersBattlefieldAbility(effect));
+ // Remove a healing counter from Ursine Fylgja: Prevent the next 1 damage that would be dealt to Ursine Fylgja this turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PreventDamageToSourceEffect(Duration.EndOfTurn, 1),
+ new RemoveCountersSourceCost(CounterType.HEALING.createInstance(1))));
+ // {2}{W}: Put a healing counter on Ursine Fylgja.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.HEALING.createInstance(1)),
+ new ManaCostsImpl("{2}{W}")));
+ }
+
+ public UrsineFylgja(final UrsineFylgja card) {
+ super(card);
+ }
+
+ @Override
+ public UrsineFylgja copy() {
+ return new UrsineFylgja(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/WildernessElemental.java b/Mage.Sets/src/mage/sets/coldsnap/WildernessElemental.java
new file mode 100644
index 00000000000..97909523dff
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/WildernessElemental.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.common.continuous.SetPowerSourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WildernessElemental extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent("nonbasic lands your opponents control");
+
+ static {
+ filter.add(Predicates.not(new SupertypePredicate("Basic")));
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public WildernessElemental(UUID ownerId) {
+ super(ownerId, 134, "Wilderness Elemental", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}{G}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Elemental");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(3);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // Wilderness Elemental's power is equal to the number of nonbasic lands your opponents control.
+ this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerSourceEffect(new PermanentsOnBattlefieldCount(filter), Duration.EndOfGame)));
+ }
+
+ public WildernessElemental(final WildernessElemental card) {
+ super(card);
+ }
+
+ @Override
+ public WildernessElemental copy() {
+ return new WildernessElemental(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/WoollyRazorback.java b/Mage.Sets/src/mage/sets/coldsnap/WoollyRazorback.java
new file mode 100644
index 00000000000..9183bf81de9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/WoollyRazorback.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.BlocksTriggeredAbility;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.common.SourceHasCounterCondition;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.decorator.ConditionalReplacementEffect;
+import mage.abilities.effects.common.PreventCombatDamageBySourceEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
+import mage.abilities.keyword.DefenderAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WoollyRazorback extends CardImpl {
+
+ public WoollyRazorback(UUID ownerId) {
+ super(ownerId, 25, "Woolly Razorback", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}{W}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Boar");
+ this.subtype.add("Beast");
+ this.power = new MageInt(7);
+ this.toughness = new MageInt(7);
+
+ // Woolly Razorback enters the battlefield with three ice counters on it.
+ this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.ICE.createInstance(3)),
+ "with three ice counters on it"));
+ // As long as Woolly Razorback has an ice counter on it, prevent all combat damage it would deal and it has defender.
+ ConditionalReplacementEffect effect = new ConditionalReplacementEffect(new PreventCombatDamageBySourceEffect(Duration.WhileOnBattlefield),
+ new SourceHasCounterCondition(CounterType.ICE));
+ effect.setText("as long as {this} has an ice counter on it, prevent all combat damage it would deal");
+ Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalReplacementEffect(effect));
+ ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(DefenderAbility.getInstance()),
+ new SourceHasCounterCondition(CounterType.ICE), "and it has defender"));
+ this.addAbility(ability);
+ // Whenever Woolly Razorback blocks, remove an ice counter from it.
+ this.addAbility(new BlocksTriggeredAbility(new RemoveCounterSourceEffect(CounterType.ICE.createInstance()), false));
+ }
+
+ public WoollyRazorback(final WoollyRazorback card) {
+ super(card);
+ }
+
+ @Override
+ public WoollyRazorback copy() {
+ return new WoollyRazorback(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander/AcornCatapult.java b/Mage.Sets/src/mage/sets/commander/AcornCatapult.java
new file mode 100644
index 00000000000..c1bcbce94e4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander/AcornCatapult.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.game.permanent.token.SquirrelToken;
+import mage.players.Player;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AcornCatapult extends CardImpl {
+
+ public AcornCatapult(UUID ownerId) {
+ super(ownerId, 241, "Acorn Catapult", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{4}");
+ this.expansionSetCode = "CMD";
+
+ // {1}, {tap}: Acorn Catapult deals 1 damage to target creature or player. That creature's controller or that player puts a 1/1 green Squirrel creature token onto the battlefield.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new ManaCostsImpl("{1}"));
+ ability.addCost(new TapSourceCost());
+ ability.addEffect(new AcornCatapultEffect());
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public AcornCatapult(final AcornCatapult card) {
+ super(card);
+ }
+
+ @Override
+ public AcornCatapult copy() {
+ return new AcornCatapult(this);
+ }
+}
+
+
+class AcornCatapultEffect extends OneShotEffect {
+
+ public AcornCatapultEffect() {
+ super(Outcome.PutCreatureInPlay);
+ staticText = "that creature's controller or that player puts a 1/1 green Squirrel creature token onto the battlefield";
+ }
+
+ public AcornCatapultEffect(final AcornCatapultEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public AcornCatapultEffect copy() {
+ return new AcornCatapultEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ UUID targetId = getTargetPointer().getFirst(game, source);
+ Player player = game.getPlayer(targetId);
+ if(player == null) {
+ Permanent permanent = game.getPermanent(targetId);
+ if(permanent != null) {
+ player = game.getPlayer(permanent.getControllerId());
+ }
+ }
+
+ if(player != null) {
+ new SquirrelToken().putOntoBattlefield(1, game, source.getSourceId(), player.getId());
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java b/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java
index bfe50914d20..2213b77abfe 100644
--- a/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java
+++ b/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java
@@ -41,6 +41,7 @@ import mage.constants.Duration;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
+import mage.watchers.common.AttackedThisTurnWatcher;
/**
*
@@ -56,13 +57,13 @@ public class AvatarOfSlaughter extends CardImpl {
this.toughness = new MageInt(8);
// All creatures have double strike and attack each turn if able.
- Effect effect = new GainAbilityAllEffect(DoubleStrikeAbility.getInstance(), Duration.WhileOnBattlefield);
+ Effect effect = new GainAbilityAllEffect(DoubleStrikeAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("creatures"));
effect.setText("All creatures have double strike");
Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect);
effect = new AttacksIfAbleAllEffect(new FilterCreaturePermanent("creatures"));
effect.setText("and attack each turn if able");
ability.addEffect(effect);
- this.addAbility(ability);
+ this.addAbility(ability, new AttackedThisTurnWatcher());
}
public AvatarOfSlaughter(final AvatarOfSlaughter card) {
diff --git a/Mage.Sets/src/mage/sets/commander/ChorusOfTheConclave.java b/Mage.Sets/src/mage/sets/commander/ChorusOfTheConclave.java
index 7454b495669..4875d2aca7e 100644
--- a/Mage.Sets/src/mage/sets/commander/ChorusOfTheConclave.java
+++ b/Mage.Sets/src/mage/sets/commander/ChorusOfTheConclave.java
@@ -46,9 +46,9 @@ import mage.constants.Rarity;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
+import mage.game.events.EntersTheBattlefieldEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
-import mage.game.stack.Spell;
import mage.players.Player;
/**
@@ -102,33 +102,6 @@ class ChorusOfTheConclaveReplacementEffect extends ReplacementEffectImpl {
return new ChorusOfTheConclaveReplacementEffect(this);
}
- @Override
- public boolean apply(Game game, Ability source) {
- return true;
- }
-
- @Override
- public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- int xCost = 0;
- Player you = game.getPlayer(source.getControllerId());
- if (you != null) {
- if (you.chooseUse(Outcome.Benefit, "Do you wish to pay the additonal cost to add +1/+1 counters to the creature you cast?", source, game)) {
- xCost += playerPaysXGenericMana(you, source, game);
- // save the x value to be available for ETB replacement effect
- Object object = game.getState().getValue("spellX" + source.getSourceId());
- Map spellX;
- if (object != null && object instanceof Map) {
- spellX = (Map) object;
- } else {
- spellX = new HashMap<>();
- }
- spellX.put(event.getSourceId(), xCost);
- game.getState().setValue("spellX" + source.getSourceId(), spellX);
- }
- }
- return false;
- }
-
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.CAST_SPELL;
@@ -136,7 +109,7 @@ class ChorusOfTheConclaveReplacementEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- if (event.getPlayerId() == source.getControllerId()) {
+ if (event.getPlayerId().equals(source.getControllerId())) {
MageObject spellObject = game.getObject(event.getSourceId());
if (spellObject != null) {
return spellObject.getCardType().contains(CardType.CREATURE);
@@ -145,6 +118,28 @@ class ChorusOfTheConclaveReplacementEffect extends ReplacementEffectImpl {
return false;
}
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ int xCost = 0;
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ if (controller.chooseUse(Outcome.Benefit, "Do you wish to pay the additonal cost to add +1/+1 counters to the creature you cast?", source, game)) {
+ xCost += playerPaysXGenericMana(controller, source, game);
+ // save the x value to be available for ETB replacement effect
+ Object object = game.getState().getValue("spellX" + source.getSourceId());
+ Map spellX;
+ if (object != null && object instanceof Map) {
+ spellX = (Map) object;
+ } else {
+ spellX = new HashMap<>();
+ }
+ spellX.put(event.getSourceId().toString() + game.getState().getZoneChangeCounter(event.getSourceId()), xCost);
+ game.getState().setValue("spellX" + source.getSourceId(), spellX);
+ }
+ }
+ return false;
+ }
+
protected static int playerPaysXGenericMana(Player player, Ability source, Game game) {
int xValue = 0;
boolean payed = false;
@@ -157,7 +152,7 @@ class ChorusOfTheConclaveReplacementEffect extends ReplacementEffectImpl {
payed = true;
}
}
- game.informPlayers(new StringBuilder(player.getLogName()).append(" pays {").append(xValue).append("}.").toString());
+ game.informPlayers(player.getLogName() + " pays {" + xValue + "}");
return xValue;
}
@@ -191,22 +186,25 @@ class ChorusOfTheConclaveReplacementEffect2 extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- Map spellX = (Map) game.getState().getValue("spellX" + source.getSourceId());
- return spellX != null && spellX.containsKey(event.getSourceId());
+ Map spellX = (Map) game.getState().getValue("spellX" + source.getSourceId());
+ return spellX != null
+ && event.getSourceId() != null
+ && spellX.containsKey(event.getSourceId().toString() + (game.getState().getZoneChangeCounter(event.getSourceId()) - 1));
}
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- Permanent creature = game.getPermanent(event.getSourceId());
- Map spellX = (Map) game.getState().getValue("spellX" + source.getSourceId());
+ Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget();
+ Map spellX = (Map) game.getState().getValue("spellX" + source.getSourceId());
MageObject sourceObject = source.getSourceObject(game);
if (sourceObject != null && creature != null && spellX != null) {
- int xValue = spellX.get(event.getSourceId());
+ String key = event.getSourceId().toString() + (game.getState().getZoneChangeCounter(event.getSourceId()) - 1);
+ int xValue = spellX.get(key);
if (xValue > 0) {
creature.addCounters(CounterType.P1P1.createInstance(xValue), game);
- game.informPlayers(sourceObject.getName() +": Added " + xValue +" +1/+1 counter" + (xValue > 1 ? "s":"") + "on " + creature.getName());
+ game.informPlayers(sourceObject.getLogName() + ": " + creature.getLogName() + " enters the battlefield with " + xValue + " +1/+1 counter" + (xValue > 1 ? "s" : "") + " on it");
}
- spellX.remove(event.getSourceId());
+ spellX.remove(key);
}
return false;
}
diff --git a/Mage.Sets/src/mage/sets/commander/CrescendoOfWar.java b/Mage.Sets/src/mage/sets/commander/CrescendoOfWar.java
new file mode 100644
index 00000000000..a2799d9dfc0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander/CrescendoOfWar.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CrescendoOfWar extends mage.sets.vintagemasters.CrescendoOfWar {
+
+ public CrescendoOfWar(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 12;
+ this.expansionSetCode = "CMD";
+ }
+
+ public CrescendoOfWar(final CrescendoOfWar card) {
+ super(card);
+ }
+
+ @Override
+ public CrescendoOfWar copy() {
+ return new CrescendoOfWar(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander/DeathByDragons.java b/Mage.Sets/src/mage/sets/commander/DeathByDragons.java
index b9498933341..60572acafe6 100644
--- a/Mage.Sets/src/mage/sets/commander/DeathByDragons.java
+++ b/Mage.Sets/src/mage/sets/commander/DeathByDragons.java
@@ -28,16 +28,15 @@
package mage.sets.commander;
import java.util.UUID;
-import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
-import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.game.Game;
+import mage.game.permanent.token.DragonToken2;
import mage.game.permanent.token.Token;
import mage.players.Player;
import mage.target.TargetPlayer;
@@ -90,7 +89,7 @@ class DeathByDragonsEffect extends OneShotEffect {
if (controller != null) {
for (UUID playerId : controller.getInRange()) {
if (!playerId.equals(this.getTargetPointer().getFirst(game, source))) {
- Token token = new DragonToken();
+ Token token = new DragonToken2();
token.putOntoBattlefield(1, game, source.getSourceId(), playerId);
}
}
@@ -99,18 +98,3 @@ class DeathByDragonsEffect extends OneShotEffect {
return false;
}
}
-
-class DragonToken extends Token {
-
- public DragonToken() {
- super("Dragon", "5/5 red Dragon creature token with flying");
- cardType.add(CardType.CREATURE);
- color.setRed(true);
- subtype.add("Dragon");
- power = new MageInt(5);
- toughness = new MageInt(5);
- addAbility(FlyingAbility.getInstance());
- // set a set with correct token image
- this.setOriginalExpansionSetCode("WWK");
- }
-}
diff --git a/Mage.Sets/src/mage/sets/commander/GwyllionHedgeMage.java b/Mage.Sets/src/mage/sets/commander/GwyllionHedgeMage.java
index 8e1840aac88..d596de1eae2 100644
--- a/Mage.Sets/src/mage/sets/commander/GwyllionHedgeMage.java
+++ b/Mage.Sets/src/mage/sets/commander/GwyllionHedgeMage.java
@@ -40,30 +40,28 @@ import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.counters.CounterType;
-import mage.filter.common.FilterCreaturePermanent;
import mage.filter.common.FilterLandPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.permanent.token.KithkinToken;
-import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
/**
*
* @author jeffwadsworth
-
+ *
*/
public class GwyllionHedgeMage extends CardImpl {
-
+
private static final FilterLandPermanent filter = new FilterLandPermanent("Plains");
private static final FilterLandPermanent filter2 = new FilterLandPermanent("Swamps");
- private static final FilterCreaturePermanent filter3 = new FilterCreaturePermanent();
static {
filter.add(new SubtypePredicate("Plains"));
- filter2.add(new SubtypePredicate("Swamps"));
+ filter2.add(new SubtypePredicate("Swamp"));
}
-
- private String rule1 = "When {this} enters the battlefield, if you control two or more Plains, you may put a 1/1 white Kithkin Soldier creature token onto the battlefield.";
- private String rule2 = "When {this} enters the battlefield, if you control two or more Swamps, you may put a -1/-1 counter on target creature.";
+
+ private final String rule1 = "When {this} enters the battlefield, if you control two or more Plains, you may put a 1/1 white Kithkin Soldier creature token onto the battlefield.";
+ private final String rule2 = "When {this} enters the battlefield, if you control two or more Swamps, you may put a -1/-1 counter on target creature.";
public GwyllionHedgeMage(UUID ownerId) {
super(ownerId, 202, "Gwyllion Hedge-Mage", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{W/B}");
@@ -77,12 +75,15 @@ public class GwyllionHedgeMage extends CardImpl {
// When Gwyllion Hedge-Mage enters the battlefield, if you control two or more Plains, you may put a 1/1 white Kithkin Soldier creature token onto the battlefield.
Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new KithkinToken()), true), new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 1), rule1);
this.addAbility(ability);
-
+
// When Gwyllion Hedge-Mage enters the battlefield, if you control two or more Swamps, you may put a -1/-1 counter on target creature.
- Ability ability2 = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new AddCountersTargetEffect(CounterType.M1M1.createInstance()), true), new PermanentsOnTheBattlefieldCondition(filter2, CountType.MORE_THAN, 1), rule2);
- ability2.addTarget(new TargetPermanent(filter3));
+ Ability ability2 = new ConditionalTriggeredAbility(
+ new EntersBattlefieldTriggeredAbility(new AddCountersTargetEffect(CounterType.M1M1.createInstance()), true),
+ new PermanentsOnTheBattlefieldCondition(filter2, CountType.MORE_THAN, 1),
+ rule2);
+ ability2.addTarget(new TargetCreaturePermanent());
this.addAbility(ability2);
-
+
}
public GwyllionHedgeMage(final GwyllionHedgeMage card) {
diff --git a/Mage.Sets/src/mage/sets/commander/HydraOmnivore.java b/Mage.Sets/src/mage/sets/commander/HydraOmnivore.java
index fea88abc3d2..2f56264ff0f 100644
--- a/Mage.Sets/src/mage/sets/commander/HydraOmnivore.java
+++ b/Mage.Sets/src/mage/sets/commander/HydraOmnivore.java
@@ -55,7 +55,7 @@ public class HydraOmnivore extends CardImpl {
this.toughness = new MageInt(8);
// Whenever Hydra Omnivore deals combat damage to an opponent, it deals that much damage to each other opponent.
- this.addAbility(new DealsDamageToOpponentTriggeredAbility(new HydraOmnivoreEffect(), false, true));
+ this.addAbility(new DealsDamageToOpponentTriggeredAbility(new HydraOmnivoreEffect(), false, true, true));
}
public HydraOmnivore(final HydraOmnivore card) {
diff --git a/Mage.Sets/src/mage/sets/commander/KaaliaOfTheVast.java b/Mage.Sets/src/mage/sets/commander/KaaliaOfTheVast.java
index ae71daeb4db..ab1c397d693 100644
--- a/Mage.Sets/src/mage/sets/commander/KaaliaOfTheVast.java
+++ b/Mage.Sets/src/mage/sets/commander/KaaliaOfTheVast.java
@@ -1,16 +1,16 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
@@ -20,7 +20,7 @@
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
+ *
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
@@ -148,20 +148,19 @@ class KaaliaOfTheVastEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- if (player == null || !player.chooseUse(Outcome.PutCreatureInPlay, "Put an Angel, Demon, or Dragon creature card from your hand onto the battlefield tapped and attacking?", source, game)) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller == null || !controller.chooseUse(Outcome.PutCreatureInPlay, "Put an Angel, Demon, or Dragon creature card from your hand onto the battlefield tapped and attacking?", source, game)) {
return false;
}
TargetCardInHand target = new TargetCardInHand(filter);
- if (target.canChoose(player.getId(), game) && target.choose(getOutcome(), player.getId(), source.getSourceId(), game)) {
+ if (target.canChoose(controller.getId(), game) && target.choose(getOutcome(), controller.getId(), source.getSourceId(), game)) {
if (target.getTargets().size() > 0) {
UUID cardId = target.getFirstTarget();
Card card = game.getCard(cardId);
if (card != null && game.getCombat() != null) {
UUID defenderId = game.getCombat().getDefendingPlayerId(source.getSourceId(), game);
if (defenderId != null) {
- player.getHand().remove(card);
- player.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId(), true);
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, false, null);
Permanent creature = game.getPermanent(cardId);
if (creature != null) {
game.getCombat().addAttackerToCombat(card.getId(), defenderId, game);
diff --git a/Mage.Sets/src/mage/sets/commander/KodamasReach.java b/Mage.Sets/src/mage/sets/commander/KodamasReach.java
index 6b7883e9e8b..103a617285c 100644
--- a/Mage.Sets/src/mage/sets/commander/KodamasReach.java
+++ b/Mage.Sets/src/mage/sets/commander/KodamasReach.java
@@ -110,17 +110,17 @@ class KodamasReachEffect extends OneShotEffect {
controller.choose(Outcome.Benefit, revealed, target2, game);
Card card = revealed.get(target2.getFirstTarget(), game);
if (card != null) {
- controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true);
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, false, null);
revealed.remove(card);
}
card = revealed.getCards(game).iterator().next();
if (card != null) {
- controller.moveCards(card, null, Zone.HAND, source, game);
+ controller.moveCards(card, Zone.HAND, source, game);
}
} else if (target.getTargets().size() == 1) {
Card card = revealed.getCards(game).iterator().next();
if (card != null) {
- controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true);
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, false, null);
}
}
diff --git a/Mage.Sets/src/mage/sets/commander/ReinsOfPower.java b/Mage.Sets/src/mage/sets/commander/ReinsOfPower.java
new file mode 100644
index 00000000000..5d5f0064b44
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander/ReinsOfPower.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author emerald000
+ */
+public class ReinsOfPower extends mage.sets.stronghold.ReinsOfPower {
+
+ public ReinsOfPower(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 57;
+ this.expansionSetCode = "CMD";
+ }
+
+ public ReinsOfPower(final ReinsOfPower card) {
+ super(card);
+ }
+
+ @Override
+ public ReinsOfPower copy() {
+ return new ReinsOfPower(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander/RikuOfTwoReflections.java b/Mage.Sets/src/mage/sets/commander/RikuOfTwoReflections.java
index e975b2db45b..f1d4582bf77 100644
--- a/Mage.Sets/src/mage/sets/commander/RikuOfTwoReflections.java
+++ b/Mage.Sets/src/mage/sets/commander/RikuOfTwoReflections.java
@@ -30,11 +30,13 @@ package mage.sets.commander;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
+import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.PutTokenOntoBattlefieldCopyTargetEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
@@ -48,11 +50,8 @@ import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.filter.predicate.permanent.AnotherPredicate;
import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.game.permanent.token.EmptyToken;
import mage.game.stack.Spell;
import mage.players.Player;
-import mage.util.CardUtil;
/**
*
@@ -62,6 +61,7 @@ public class RikuOfTwoReflections extends CardImpl {
private static final FilterSpell filter = new FilterSpell("an instant or sorcery spell");
private static final FilterControlledCreaturePermanent filterPermanent = new FilterControlledCreaturePermanent("another nontoken creature");
+
static {
filter.add(Predicates.or(
new CardTypePredicate(CardType.INSTANT),
@@ -85,12 +85,10 @@ public class RikuOfTwoReflections extends CardImpl {
this.addAbility(new SpellCastControllerTriggeredAbility(new DoIfCostPaid(new RikuOfTwoReflectionsCopyEffect(), new ManaCostsImpl("{U}{R}")), filter, false, true));
// Whenever another nontoken creature enters the battlefield under your control, you may pay {G}{U}. If you do, put a token that's a copy of that creature onto the battlefield.
- Ability ability = new EntersBattlefieldAllTriggeredAbility(
- Zone.BATTLEFIELD, new RikuOfTwoReflectionsCopyTokenEffect(),filterPermanent, false, SetTargetPointer.PERMANENT,
- "Whenever another nontoken creature enters the battlefield under your control, you may pay {G}{U}. If you do, put a token that's a copy of that creature onto the battlefield.",
- true);
- ability.addCost(new ManaCostsImpl("{G}{U}"));
- this.addAbility(ability);
+ Effect effect = new DoIfCostPaid(new PutTokenOntoBattlefieldCopyTargetEffect(),
+ new ManaCostsImpl("{G}{U}"), "Put a token that's a copy of that creature onto the battlefield?");
+ effect.setText("you may pay {G}{U}. If you do, put a token that's a copy of that creature onto the battlefield");
+ this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, effect, filterPermanent, false, SetTargetPointer.PERMANENT, null));
}
public RikuOfTwoReflections(final RikuOfTwoReflections card) {
@@ -139,32 +137,3 @@ class RikuOfTwoReflectionsCopyEffect extends OneShotEffect {
return new RikuOfTwoReflectionsCopyEffect(this);
}
}
-
-class RikuOfTwoReflectionsCopyTokenEffect extends OneShotEffect {
-
- public RikuOfTwoReflectionsCopyTokenEffect() {
- super(Outcome.PutCreatureInPlay);
- this.staticText = "put a token that's a copy of that creature onto the battlefield";
- }
-
- public RikuOfTwoReflectionsCopyTokenEffect(final RikuOfTwoReflectionsCopyTokenEffect effect) {
- super(effect);
- }
-
- @Override
- public RikuOfTwoReflectionsCopyTokenEffect copy() {
- return new RikuOfTwoReflectionsCopyTokenEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent permanent = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source));
- if (permanent != null) {
- EmptyToken token = new EmptyToken();
- CardUtil.copyTo(token).from(permanent);
- token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId());
- return true;
- }
- return false;
- }
-}
diff --git a/Mage.Sets/src/mage/sets/commander/ScatteringStroke.java b/Mage.Sets/src/mage/sets/commander/ScatteringStroke.java
index 7512eb1a801..7f7cdd7bccc 100644
--- a/Mage.Sets/src/mage/sets/commander/ScatteringStroke.java
+++ b/Mage.Sets/src/mage/sets/commander/ScatteringStroke.java
@@ -1,112 +1,110 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets.commander;
-
-import java.util.UUID;
-import mage.Mana;
-import mage.abilities.Ability;
-import mage.abilities.common.delayed.AtTheBeginOMainPhaseDelayedTriggeredAbility;
-import mage.abilities.effects.Effect;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect;
-import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect;
-import mage.abilities.effects.common.ClashEffect;
-import mage.cards.CardImpl;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.TargetController;
-import mage.game.Game;
-import mage.game.stack.Spell;
-import mage.players.Player;
-import mage.target.TargetSpell;
-import mage.target.targetpointer.FixedTarget;
-
-/**
- *
- * @author LevelX2
- */
-public class ScatteringStroke extends CardImpl {
-
- public ScatteringStroke(UUID ownerId) {
- super(ownerId, 60, "Scattering Stroke", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{U}{U}");
- this.expansionSetCode = "CMD";
-
-
- // Counter target spell. Clash with an opponent. If you win, at the beginning of your next main phase, you may add {X} to your mana pool, where X is that spell's converted mana cost.
- this.getSpellAbility().addEffect(new ScatteringStrokeEffect());
- this.getSpellAbility().addTarget(new TargetSpell());
- }
-
- public ScatteringStroke(final ScatteringStroke card) {
- super(card);
- }
-
- @Override
- public ScatteringStroke copy() {
- return new ScatteringStroke(this);
- }
-}
-
-
-class ScatteringStrokeEffect extends OneShotEffect {
-
- public ScatteringStrokeEffect() {
- super(Outcome.Benefit);
- this.staticText = "Counter target spell. Clash with an opponent. If you win, at the beginning of your next main phase, you may add {X} to your mana pool, where X is that spell's converted mana cost";
- }
-
- public ScatteringStrokeEffect(final ScatteringStrokeEffect effect) {
- super(effect);
- }
-
- @Override
- public ScatteringStrokeEffect copy() {
- return new ScatteringStrokeEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Spell spell = (Spell) game.getStack().getStackObject(getTargetPointer().getFirst(game, source));
- Player controller = game.getPlayer(source.getControllerId());
- if (controller != null && spell != null) {
- game.getStack().counter(spell.getId(), source.getSourceId(), game);
- if (ClashEffect.getInstance().apply(game, source)) {
- Effect effect = new AddManaToManaPoolSourceControllerEffect(new Mana(0,0,0,0,0,spell.getConvertedManaCost(),0));
- AtTheBeginOMainPhaseDelayedTriggeredAbility delayedAbility =
- new AtTheBeginOMainPhaseDelayedTriggeredAbility(effect, true, TargetController.YOU, AtTheBeginOMainPhaseDelayedTriggeredAbility.PhaseSelection.NEXT_MAIN);
- delayedAbility.setSourceId(source.getSourceId());
- delayedAbility.setControllerId(source.getControllerId());
- delayedAbility.setSourceObject(source.getSourceObject(game), game);
- game.addDelayedTriggeredAbility(delayedAbility);
- }
- return true;
- }
- return false;
- }
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander;
+
+import java.util.UUID;
+import mage.Mana;
+import mage.abilities.Ability;
+import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect;
+import mage.abilities.effects.common.ClashEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.game.Game;
+import mage.game.stack.Spell;
+import mage.players.Player;
+import mage.target.TargetSpell;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ScatteringStroke extends CardImpl {
+
+ public ScatteringStroke(UUID ownerId) {
+ super(ownerId, 60, "Scattering Stroke", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{U}{U}");
+ this.expansionSetCode = "CMD";
+
+
+ // Counter target spell. Clash with an opponent. If you win, at the beginning of your next main phase, you may add {X} to your mana pool, where X is that spell's converted mana cost.
+ this.getSpellAbility().addEffect(new ScatteringStrokeEffect());
+ this.getSpellAbility().addTarget(new TargetSpell());
+ }
+
+ public ScatteringStroke(final ScatteringStroke card) {
+ super(card);
+ }
+
+ @Override
+ public ScatteringStroke copy() {
+ return new ScatteringStroke(this);
+ }
+}
+
+
+class ScatteringStrokeEffect extends OneShotEffect {
+
+ public ScatteringStrokeEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "Counter target spell. Clash with an opponent. If you win, at the beginning of your next main phase, you may add {X} to your mana pool, where X is that spell's converted mana cost";
+ }
+
+ public ScatteringStrokeEffect(final ScatteringStrokeEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public ScatteringStrokeEffect copy() {
+ return new ScatteringStrokeEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Spell spell = (Spell) game.getStack().getStackObject(getTargetPointer().getFirst(game, source));
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null && spell != null) {
+ game.getStack().counter(spell.getId(), source.getSourceId(), game);
+ if (ClashEffect.getInstance().apply(game, source)) {
+ Effect effect = new AddManaToManaPoolSourceControllerEffect(new Mana(0,0,0,0,0,spell.getConvertedManaCost(),0));
+ AtTheBeginOfMainPhaseDelayedTriggeredAbility delayedAbility =
+ new AtTheBeginOfMainPhaseDelayedTriggeredAbility(effect, true, TargetController.YOU, AtTheBeginOfMainPhaseDelayedTriggeredAbility.PhaseSelection.NEXT_MAIN);
+ delayedAbility.setSourceId(source.getSourceId());
+ delayedAbility.setControllerId(source.getControllerId());
+ delayedAbility.setSourceObject(source.getSourceObject(game), game);
+ game.addDelayedTriggeredAbility(delayedAbility);
+ }
+ return true;
+ }
+ return false;
+ }
}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/commander/SewerNemesis.java b/Mage.Sets/src/mage/sets/commander/SewerNemesis.java
index fa7df34d3fa..e8955959eee 100644
--- a/Mage.Sets/src/mage/sets/commander/SewerNemesis.java
+++ b/Mage.Sets/src/mage/sets/commander/SewerNemesis.java
@@ -35,7 +35,7 @@ import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ChoosePlayerEffect;
import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveTargetEffect;
import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect;
import mage.cards.CardImpl;
@@ -47,9 +47,7 @@ import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
-import mage.game.permanent.Permanent;
import mage.players.Player;
-import mage.target.TargetPlayer;
import mage.target.targetpointer.FixedTarget;
/**
@@ -67,7 +65,7 @@ public class SewerNemesis extends CardImpl {
this.toughness = new MageInt(0);
// As Sewer Nemesis enters the battlefield, choose a player.
- this.addAbility(new AsEntersBattlefieldAbility(new SewerNemesisChoosePlayerEffect()));
+ this.addAbility(new AsEntersBattlefieldAbility(new ChoosePlayerEffect(Outcome.Detriment)));
// Sewer Nemesis's power and toughness are each equal to the number of cards in the chosen player's graveyard.
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(new CardsInTargetOpponentsGraveyardCount(), Duration.WhileOnBattlefield)));
// Whenever the chosen player casts a spell, that player puts the top card of his or her library into his or her graveyard.
@@ -85,42 +83,8 @@ public class SewerNemesis extends CardImpl {
}
}
-class SewerNemesisChoosePlayerEffect extends OneShotEffect {
-
- public SewerNemesisChoosePlayerEffect() {
- super(Outcome.Detriment);
- this.staticText = "choose a player";
- }
-
- public SewerNemesisChoosePlayerEffect(final SewerNemesisChoosePlayerEffect effect) {
- super(effect);
- }
-
- @Override
- public SewerNemesisChoosePlayerEffect copy() {
- return new SewerNemesisChoosePlayerEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- Permanent permanent = game.getPermanent(source.getSourceId());
- if (player != null && permanent != null) {
- TargetPlayer target = new TargetPlayer(1,1,true);
- if (player.choose(this.outcome, target, source.getSourceId(), game)) {
- Player chosenPlayer = game.getPlayer(target.getFirstTarget());
- if (chosenPlayer != null) {
- game.informPlayers(permanent.getLogName() + ": " + player.getLogName() + " has chosen " + chosenPlayer.getLogName());
- game.getState().setValue(permanent.getId() + "_player", target.getFirstTarget());
- return true;
- }
- }
- }
- return false;
- }
-}
-
class CardsInTargetOpponentsGraveyardCount implements DynamicValue {
+
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
if (sourceAbility != null) {
diff --git a/Mage.Sets/src/mage/sets/commander/Spawnwrithe.java b/Mage.Sets/src/mage/sets/commander/Spawnwrithe.java
index fed6939173d..9fc589a8482 100644
--- a/Mage.Sets/src/mage/sets/commander/Spawnwrithe.java
+++ b/Mage.Sets/src/mage/sets/commander/Spawnwrithe.java
@@ -30,7 +30,7 @@ package mage.sets.commander;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
-import mage.abilities.effects.common.PutTokenOntoBattlefieldCopySource;
+import mage.abilities.effects.PutTokenOntoBattlefieldCopySourceEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
@@ -53,7 +53,7 @@ public class Spawnwrithe extends CardImpl {
// Trample
this.addAbility(TrampleAbility.getInstance());
// Whenever Spawnwrithe deals combat damage to a player, put a token that's a copy of Spawnwrithe onto the battlefield.
- this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new PutTokenOntoBattlefieldCopySource(), false));
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new PutTokenOntoBattlefieldCopySourceEffect(), false));
}
diff --git a/Mage.Sets/src/mage/sets/commander/SpellCrumple.java b/Mage.Sets/src/mage/sets/commander/SpellCrumple.java
index 08c38924c81..1f1c8bd5f31 100644
--- a/Mage.Sets/src/mage/sets/commander/SpellCrumple.java
+++ b/Mage.Sets/src/mage/sets/commander/SpellCrumple.java
@@ -28,28 +28,17 @@
package mage.sets.commander;
import java.util.UUID;
-import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.ReturnToLibrarySpellEffect;
-import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
-import mage.constants.Duration;
import mage.constants.Outcome;
-import mage.constants.PhaseStep;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.events.GameEvent.EventType;
-import mage.game.events.ZoneChangeEvent;
-import mage.game.stack.Spell;
-import mage.game.stack.StackObject;
import mage.players.Player;
import mage.target.TargetSpell;
-import mage.target.targetpointer.FixedTarget;
/**
*
@@ -63,7 +52,7 @@ public class SpellCrumple extends CardImpl {
// Counter target spell. If that spell is countered this way, put it on the bottom of its owner's library instead of into that player's graveyard. Put Spell Crumple on the bottom of its owner's library.
this.getSpellAbility().addTarget(new TargetSpell());
- this.getSpellAbility().addEffect(new SpellCrumpleCounterEffect());
+ this.getSpellAbility().addEffect(new SpellCrumpleCounterEffect());
this.getSpellAbility().addEffect(new ReturnToLibrarySpellEffect(false));
}
@@ -95,99 +84,10 @@ class SpellCrumpleCounterEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- UUID objectId = source.getFirstTarget();
- UUID sourceId = source.getSourceId();
- // counter code from SpellStack
- StackObject stackObject = game.getStack().getStackObject(objectId);
- MageObject sourceObject = game.getObject(sourceId);
- if (stackObject != null && sourceObject != null) {
- if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER, objectId, sourceId, stackObject.getControllerId()))) {
- if ( stackObject instanceof Spell ) {
- game.rememberLKI(objectId, Zone.STACK, (Spell)stackObject);
- }
- // Spell Crumple specific code
- ReplacementEffectImpl effect = new SpellCrumpleReplacementEffect();
- effect.setTargetPointer(new FixedTarget(stackObject.getId()));
- game.addEffect(effect, source);
- // Spell Crumple specific code end
- game.informPlayers(new StringBuilder(stackObject.getName()).append(" is countered by ").append(sourceObject.getLogName()).toString());
- game.getStack().remove(stackObject);
- stackObject.counter(sourceId, game); // tries to move to graveyard
- game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTERED, objectId, sourceId, stackObject.getControllerId()));
- } else {
- game.informPlayers(new StringBuilder(stackObject.getName()).append(" could not be countered by ").append(sourceObject.getLogName()).toString());
- }
- return true;
- }
- return false;
- // counter code from SpellStack end
- }
-}
-
-class SpellCrumpleReplacementEffect extends ReplacementEffectImpl {
-
- private PhaseStep phaseStep;
-
- public SpellCrumpleReplacementEffect() {
- super(Duration.OneUse, Outcome.Benefit);
- staticText = "If that spell is countered this way, put it on the bottom of its owner's library instead of into that player's graveyard";
- phaseStep = null;
- }
-
- public SpellCrumpleReplacementEffect(final SpellCrumpleReplacementEffect effect) {
- super(effect);
- phaseStep = effect.phaseStep;
- }
-
- @Override
- public SpellCrumpleReplacementEffect copy() {
- return new SpellCrumpleReplacementEffect(this);
- }
-
- @Override
- public boolean isInactive(Ability source, Game game) {
- if (!game.getPhase().getStep().getType().equals(phaseStep)) {
- return true;
- }
- return super.isInactive(source, game);
- }
-
- @Override
- public void init(Ability source, Game game) {
- phaseStep = game.getPhase().getStep().getType();
- super.init(source, game);
- }
-
- @Override
- public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- MageObject targetObject = game.getObject(event.getTargetId());
- if (targetObject instanceof Card) {
- Card card = (Card) targetObject;
- if (card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false, event.getAppliedEffects())) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller != null) {
- game.informPlayers(controller.getLogName() + " has put " + card.getName() + " on the bottom of the library.");
- }
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean checksEventType(GameEvent event, Game game) {
- return event.getType() == EventType.ZONE_CHANGE;
- }
-
- @Override
- public boolean applies(GameEvent event, Ability source, Game game) {
- if (((ZoneChangeEvent)event).getToZone().equals(Zone.GRAVEYARD)) {
- MageObject mageObject = game.getLastKnownInformation(getTargetPointer().getFirst(game, source), Zone.STACK);
- if (mageObject instanceof Spell) {
- return ((Spell)mageObject).getSourceId().equals(event.getTargetId());
- }
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ return game.getStack().counter(targetPointer.getFirst(game, source), source.getSourceId(), game, Zone.LIBRARY, false, false);
}
return false;
}
-
}
diff --git a/Mage.Sets/src/mage/sets/commander/TarielReckonerOfSouls.java b/Mage.Sets/src/mage/sets/commander/TarielReckonerOfSouls.java
index 7cfe1e0b577..cb464431dbc 100644
--- a/Mage.Sets/src/mage/sets/commander/TarielReckonerOfSouls.java
+++ b/Mage.Sets/src/mage/sets/commander/TarielReckonerOfSouls.java
@@ -110,7 +110,7 @@ class TarielReckonerOfSoulsEffect extends OneShotEffect {
}
if (!creatureCards.isEmpty()) {
Card card = creatureCards.getRandom(game);
- controller.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId());
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game);
}
return true;
}
diff --git a/Mage.Sets/src/mage/sets/commander/TheMimeoplasm.java b/Mage.Sets/src/mage/sets/commander/TheMimeoplasm.java
index 5be1bed0a24..f5d7604ef74 100644
--- a/Mage.Sets/src/mage/sets/commander/TheMimeoplasm.java
+++ b/Mage.Sets/src/mage/sets/commander/TheMimeoplasm.java
@@ -80,27 +80,27 @@ public class TheMimeoplasm extends CardImpl {
}
class TheMimeoplasmEffect extends OneShotEffect {
-
+
TheMimeoplasmEffect() {
super(Outcome.Copy);
}
-
+
TheMimeoplasmEffect(final TheMimeoplasmEffect effect) {
super(effect);
}
-
+
@Override
public TheMimeoplasmEffect copy() {
return new TheMimeoplasmEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
- Permanent permanent = game.getPermanent(source.getSourceId());
+ Permanent permanent = game.getPermanentEntering(source.getSourceId());
if (controller != null && permanent != null) {
if (new CardsInAllGraveyardsCount(new FilterCreatureCard()).calculate(game, source, this) >= 2) {
- if (controller.chooseUse(Outcome.Benefit, "Do you want to exile two creature cards from graveyards?", source, game)) {
+ if (controller.chooseUse(Outcome.Benefit, "Do you want to exile two creature cards from graveyards?", source, game)) {
TargetCardInGraveyard targetCopy = new TargetCardInGraveyard(new FilterCreatureCard("creature card to become a copy of"));
TargetCardInGraveyard targetCounters = new TargetCardInGraveyard(new FilterCreatureCard("creature card to determine amount of additional +1/+1 counters"));
if (controller.choose(Outcome.Copy, targetCopy, source.getSourceId(), game)) {
@@ -112,7 +112,7 @@ class TheMimeoplasmEffect extends OneShotEffect {
Cards cardsToExile = new CardsImpl();
cardsToExile.add(cardToCopy);
cardsToExile.add(cardForCounters);
- controller.moveCards(cardsToExile, Zone.GRAVEYARD, Zone.EXILED, source, game);
+ controller.moveCards(cardsToExile, Zone.EXILED, source, game);
CopyEffect copyEffect = new CopyEffect(Duration.Custom, cardToCopy, source.getSourceId());
game.addEffect(copyEffect, source);
permanent.addCounters(CounterType.P1P1.createInstance(cardForCounters.getPower().getValue()), game);
@@ -122,7 +122,7 @@ class TheMimeoplasmEffect extends OneShotEffect {
}
}
}
- return true;
+ return true;
}
return false;
}
diff --git a/Mage.Sets/src/mage/sets/commander/TrenchGorger.java b/Mage.Sets/src/mage/sets/commander/TrenchGorger.java
index cc5820767c1..b9ca2c24126 100644
--- a/Mage.Sets/src/mage/sets/commander/TrenchGorger.java
+++ b/Mage.Sets/src/mage/sets/commander/TrenchGorger.java
@@ -40,6 +40,7 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Rarity;
+import mage.constants.SubLayer;
import mage.constants.Zone;
import mage.filter.common.FilterLandCard;
import mage.game.Game;
@@ -100,13 +101,13 @@ class TrenchGorgerEffect extends OneShotEffect {
TargetCardInLibrary target = new TargetCardInLibrary(0, Integer.MAX_VALUE, new FilterLandCard("any number of land cards"));
target.choose(outcome, controller.getId(), controller.getId(), game);
int count = 0;
- for (UUID cardId: target.getTargets()) {
+ for (UUID cardId : target.getTargets()) {
Card card = game.getCard(cardId);
controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY, true);
count++;
}
controller.shuffleLibrary(game);
- game.addEffect(new SetPowerToughnessSourceEffect(count, count, Duration.EndOfGame), source);
+ game.addEffect(new SetPowerToughnessSourceEffect(count, count, Duration.EndOfGame, SubLayer.SetPT_7b), source);
return true;
}
return false;
diff --git a/Mage.Sets/src/mage/sets/commander/Triskelavus.java b/Mage.Sets/src/mage/sets/commander/Triskelavus.java
new file mode 100644
index 00000000000..4c7a7f021c3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander/Triskelavus.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Triskelavus extends mage.sets.timespiral.Triskelavus {
+
+ public Triskelavus(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 263;
+ this.expansionSetCode = "CMD";
+ }
+
+ public Triskelavus(final Triskelavus card) {
+ super(card);
+ }
+
+ @Override
+ public Triskelavus copy() {
+ return new Triskelavus(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2013/CurseOfShallowGraves.java b/Mage.Sets/src/mage/sets/commander2013/CurseOfShallowGraves.java
index fa2e34e982f..d51655b3c7d 100644
--- a/Mage.Sets/src/mage/sets/commander2013/CurseOfShallowGraves.java
+++ b/Mage.Sets/src/mage/sets/commander2013/CurseOfShallowGraves.java
@@ -28,9 +28,11 @@
package mage.sets.commander2013;
import java.util.UUID;
+import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.CreateTokenTargetEffect;
import mage.abilities.keyword.EnchantAbility;
@@ -44,6 +46,7 @@ import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.ZombieToken;
+import mage.players.Player;
import mage.target.TargetPlayer;
import mage.target.targetpointer.FixedTarget;
@@ -59,7 +62,6 @@ public class CurseOfShallowGraves extends CardImpl {
this.subtype.add("Aura");
this.subtype.add("Curse");
-
// Enchant player
TargetPlayer auraTarget = new TargetPlayer();
this.getSpellAbility().addTarget(auraTarget);
@@ -83,7 +85,7 @@ public class CurseOfShallowGraves extends CardImpl {
class CurseOfShallowTriggeredAbility extends TriggeredAbilityImpl {
public CurseOfShallowTriggeredAbility() {
- super(Zone.BATTLEFIELD, new CreateTokenTargetEffect(new ZombieToken(), new StaticValue(1), true, false), true);
+ super(Zone.BATTLEFIELD, new CurseOfShallowEffect());
}
public CurseOfShallowTriggeredAbility(Effect effect, boolean optional, String text) {
@@ -105,7 +107,7 @@ class CurseOfShallowTriggeredAbility extends TriggeredAbilityImpl {
if (enchantment != null
&& enchantment.getAttachedTo() != null
&& game.getCombat().getPlayerDefenders(game).contains(enchantment.getAttachedTo())) {
- for (Effect effect: this.getEffects()) {
+ for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(game.getCombat().getAttackerId()));
}
return true;
@@ -124,3 +126,31 @@ class CurseOfShallowTriggeredAbility extends TriggeredAbilityImpl {
}
}
+
+class CurseOfShallowEffect extends OneShotEffect {
+
+ public CurseOfShallowEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "that attacking player may put a 2/2 black Zombie creature token onto the battlefield tapped";
+ }
+
+ public CurseOfShallowEffect(final CurseOfShallowEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public CurseOfShallowEffect copy() {
+ return new CurseOfShallowEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player attacker = game.getPlayer(this.getTargetPointer().getFirst(game, source));
+ if (attacker != null && attacker.chooseUse(outcome, "Put a 2/2 black Zombie creature token onto the battlefield tapped?", source, game)) {
+ Effect effect = new CreateTokenTargetEffect(new ZombieToken(), new StaticValue(1), true, false);
+ effect.setTargetPointer(targetPointer);
+ return effect.apply(game, source);
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2013/DeepfireElemental.java b/Mage.Sets/src/mage/sets/commander2013/DeepfireElemental.java
index e49ad954f6c..d3b093498b2 100644
--- a/Mage.Sets/src/mage/sets/commander2013/DeepfireElemental.java
+++ b/Mage.Sets/src/mage/sets/commander2013/DeepfireElemental.java
@@ -52,11 +52,14 @@ import mage.target.TargetPermanent;
*/
public class DeepfireElemental extends CardImpl {
+ private final UUID originalId;
+
private static final FilterPermanent filter = new FilterPermanent("artifact or creature with converted mana cost X");
+
static {
filter.add(Predicates.or(new CardTypePredicate(CardType.ARTIFACT), new CardTypePredicate(CardType.CREATURE)));
}
-
+
public DeepfireElemental(UUID ownerId) {
super(ownerId, 185, "Deepfire Elemental", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{B}{R}");
this.expansionSetCode = "C13";
@@ -68,12 +71,13 @@ public class DeepfireElemental extends CardImpl {
// {X}{X}{1}: Destroy target artifact or creature with converted mana cost X.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{X}{X}{1}"));
ability.addTarget(new TargetPermanent(filter));
+ originalId = ability.getOriginalId();
this.addAbility(ability);
}
@Override
public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SimpleActivatedAbility) {
+ if (ability.getOriginalId().equals(originalId)) {
ability.getTargets().clear();
FilterPermanent newFilter = filter.copy();
newFilter.setMessage(new StringBuilder("artifact or creature with converted mana cost {").append(ability.getManaCostsToPay().getX()).append("}").toString());
@@ -85,6 +89,7 @@ public class DeepfireElemental extends CardImpl {
public DeepfireElemental(final DeepfireElemental card) {
super(card);
+ this.originalId = card.originalId;
}
@Override
diff --git a/Mage.Sets/src/mage/sets/commander2013/EndrekSahrMasterBreeder.java b/Mage.Sets/src/mage/sets/commander2013/EndrekSahrMasterBreeder.java
index dfed94b5507..a0f9f59306a 100644
--- a/Mage.Sets/src/mage/sets/commander2013/EndrekSahrMasterBreeder.java
+++ b/Mage.Sets/src/mage/sets/commander2013/EndrekSahrMasterBreeder.java
@@ -45,7 +45,7 @@ import mage.filter.FilterSpell;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.game.Game;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.ThrullToken;
import mage.game.stack.Spell;
import mage.target.targetpointer.FixedTarget;
@@ -114,22 +114,10 @@ class EndrekSahrMasterBreederEffect extends OneShotEffect {
if (spell != null) {
int cmc = spell.getConvertedManaCost();
if (cmc > 0) {
- return new CreateTokenEffect(new EndrekSahrMasterBreederThrullToken(), cmc).apply(game, source);
+ return new CreateTokenEffect(new ThrullToken(), cmc).apply(game, source);
}
return true;
}
return false;
}
}
-
-class EndrekSahrMasterBreederThrullToken extends Token {
-
- public EndrekSahrMasterBreederThrullToken() {
- super("Thrull", "1/1 black Thrull creature token");
- cardType.add(CardType.CREATURE);
- color.setBlack(true);
- subtype.add("Thrull");
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/commander2013/HullBreach.java b/Mage.Sets/src/mage/sets/commander2013/HullBreach.java
index c47d23d6667..0ab48a04ed8 100644
--- a/Mage.Sets/src/mage/sets/commander2013/HullBreach.java
+++ b/Mage.Sets/src/mage/sets/commander2013/HullBreach.java
@@ -38,7 +38,7 @@ import mage.filter.common.FilterEnchantmentPermanent;
import mage.target.Target;
import mage.target.TargetPermanent;
import mage.target.common.TargetArtifactPermanent;
-import mage.target.targetpointer.SecondTargetPointer;
+import mage.target.common.TargetEnchantmentPermanent;
/**
*
@@ -50,7 +50,6 @@ public class HullBreach extends CardImpl {
super(ownerId, 193, "Hull Breach", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{R}{G}");
this.expansionSetCode = "C13";
-
// Choose one - Destroy target artifact;
this.getSpellAbility().addEffect(new DestroyTargetEffect());
Target target = new TargetArtifactPermanent();
@@ -63,18 +62,13 @@ public class HullBreach extends CardImpl {
this.getSpellAbility().addMode(mode);
// or destroy target artifact and target enchantment.
mode = new Mode();
- mode.getEffects().add(new DestroyTargetEffect());
- target = new TargetArtifactPermanent();
- mode.getTargets().add(target);
- Effect effect = new DestroyTargetEffect();
- effect.setTargetPointer(new SecondTargetPointer());
- effect.setText("and target enchantment");
+ Effect effect = new DestroyTargetEffect(false, true);
+ effect.setText("destroy target artifact and target enchantment");
mode.getEffects().add(effect);
- target = new TargetPermanent(new FilterEnchantmentPermanent());
- mode.getTargets().add(target);
+ mode.getTargets().add(new TargetArtifactPermanent());
+ mode.getTargets().add(new TargetEnchantmentPermanent());
this.getSpellAbility().addMode(mode);
-
}
public HullBreach(final HullBreach card) {
diff --git a/Mage.Sets/src/mage/sets/commander2013/IncendiaryCommand.java b/Mage.Sets/src/mage/sets/commander2013/IncendiaryCommand.java
index 133206403f4..15d7bd457fe 100644
--- a/Mage.Sets/src/mage/sets/commander2013/IncendiaryCommand.java
+++ b/Mage.Sets/src/mage/sets/commander2013/IncendiaryCommand.java
@@ -27,6 +27,8 @@
*/
package mage.sets.commander2013;
+import java.util.HashMap;
+import java.util.Map;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.Mode;
@@ -54,8 +56,7 @@ public class IncendiaryCommand extends CardImpl {
super(ownerId, 113, "Incendiary Command", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{R}{R}");
this.expansionSetCode = "C13";
-
- // Choose two -
+ // Choose two -
this.getSpellAbility().getModes().setMinModes(2);
this.getSpellAbility().getModes().setMaxModes(2);
// Incendiary Command deals 4 damage to target player;
@@ -107,16 +108,23 @@ class IncendiaryCommandDrawEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- for (UUID playerId : controller.getInRange()) {
+ Map cardsToDraw = new HashMap<>();
+ for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
Player player = game.getPlayer(playerId);
if (player != null) {
- int cards = player.getHand().size();
- if (cards > 0) {
- player.discard(cards, source, game);
- player.drawCards(cards, game);
+ int cardsInHand = player.getHand().size();
+ player.discard(cardsInHand, false, source, game);
+ if (cardsInHand > 0) {
+ cardsToDraw.put(playerId, cardsInHand);
}
}
}
+ for (UUID playerId : cardsToDraw.keySet()) {
+ Player player = game.getPlayer(playerId);
+ if (player != null) {
+ player.drawCards(cardsToDraw.get(playerId), game);
+ }
+ }
return true;
}
return false;
diff --git a/Mage.Sets/src/mage/sets/commander2013/JelevaNephaliasScourge.java b/Mage.Sets/src/mage/sets/commander2013/JelevaNephaliasScourge.java
index 4fbc4aba7cb..965cb69fd59 100644
--- a/Mage.Sets/src/mage/sets/commander2013/JelevaNephaliasScourge.java
+++ b/Mage.Sets/src/mage/sets/commander2013/JelevaNephaliasScourge.java
@@ -116,7 +116,7 @@ class JelevaNephaliasScourgeEffect extends OneShotEffect {
Player player = game.getPlayer(playerId);
if (player != null) {
int cardsToExile = Math.min(player.getLibrary().size(), xValue);
- for(int i = 0; i < cardsToExile; i++) {
+ for (int i = 0; i < cardsToExile; i++) {
Card card = player.getLibrary().removeFromTop(game);
if (card != null) {
card.moveToExile(CardUtil.getCardExileZoneId(game, source), sourceCard.getName(), source.getSourceId(), game);
@@ -170,7 +170,7 @@ class JelevaNephaliasCastEffect extends OneShotEffect {
class JelevaNephaliasWatcher extends Watcher {
- private Map manaSpendToCast = new HashMap<>(); // cast
+ private final Map manaSpendToCast = new HashMap<>(); // cast
public JelevaNephaliasWatcher() {
super("ManaPaidToCastJelevaNephalias", WatcherScope.CARD);
@@ -190,10 +190,10 @@ class JelevaNephaliasWatcher extends Watcher {
if (event.getType() == GameEvent.EventType.SPELL_CAST && event.getSourceId().equals(sourceId)) {
if (!game.getStack().isEmpty()) {
for (StackObject stackObject : game.getStack()) {
- if (stackObject instanceof Spell && ((Spell)stackObject).getSourceId().equals(sourceId)) {
+ if (stackObject instanceof Spell && ((Spell) stackObject).getSourceId().equals(sourceId)) {
Card card = game.getCard(sourceId);
if (!manaSpendToCast.containsValue(card.getZoneChangeCounter(game))) {
- manaSpendToCast.put(new Integer(card.getZoneChangeCounter(game)), new Integer(((Spell)stackObject).getSpellAbility().getManaCostsToPay().convertedManaCost()));
+ manaSpendToCast.put(card.getZoneChangeCounter(game), ((Spell) stackObject).getSpellAbility().getManaCostsToPay().convertedManaCost());
}
}
}
diff --git a/Mage.Sets/src/mage/sets/commander2013/KirtarsWrath.java b/Mage.Sets/src/mage/sets/commander2013/KirtarsWrath.java
index 1fd341cdece..0ace8899522 100644
--- a/Mage.Sets/src/mage/sets/commander2013/KirtarsWrath.java
+++ b/Mage.Sets/src/mage/sets/commander2013/KirtarsWrath.java
@@ -59,7 +59,7 @@ public class KirtarsWrath extends CardImpl {
new KirtarsWrathEffect(),
new DestroyAllEffect(new FilterCreaturePermanent("all creatures"), true),
new CardsInControllerGraveCondition(7),
- "Destroy all creatures. They can't be regenerated.
Threshold - If seven or more cards are in your graveyard, instead destroy all creatures, then put two 1/1 white Spirit creature tokens with flying onto the battlefield. Creatures destroyed this way can't be regenerated"));
+ "Destroy all creatures. They can't be regenerated.
Threshold - If seven or more cards are in your graveyard, instead destroy all creatures, then put two 1/1 white Spirit creature tokens with flying onto the battlefield. Creatures destroyed this way can't be regenerated"));
}
diff --git a/Mage.Sets/src/mage/sets/commander2013/LeafdrakeRoost.java b/Mage.Sets/src/mage/sets/commander2013/LeafdrakeRoost.java
index 97101a89d01..b8ee63186e4 100644
--- a/Mage.Sets/src/mage/sets/commander2013/LeafdrakeRoost.java
+++ b/Mage.Sets/src/mage/sets/commander2013/LeafdrakeRoost.java
@@ -70,7 +70,7 @@ public class LeafdrakeRoost extends CardImpl {
this.addAbility(ability);
// Enchanted land has "{G}{U}, {tap}: Put a 2/2 green and blue Drake creature token with flying onto the battlefield."
- Ability abilityToGain = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new LeafdrakeRoostDragonToken()), new ManaCostsImpl("{G}{U}"));
+ Ability abilityToGain = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new LeafdrakeRoostDrakeToken()), new ManaCostsImpl("{G}{U}"));
abilityToGain.addCost(new TapSourceCost());
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(abilityToGain, AttachmentType.AURA, Duration.WhileOnBattlefield,
"Enchanted land has \"{G}{U}, {t}: Put a 2/2 green and blue Drake creature token with flying onto the battlefield.\"")));
@@ -87,14 +87,14 @@ public class LeafdrakeRoost extends CardImpl {
}
}
-class LeafdrakeRoostDragonToken extends Token {
+class LeafdrakeRoostDrakeToken extends Token {
- public LeafdrakeRoostDragonToken() {
- super("Dragon", "2/2 green and blue Drake creature token with flying");
+ public LeafdrakeRoostDrakeToken() {
+ super("Drake", "2/2 green and blue Drake creature token with flying");
cardType.add(CardType.CREATURE);
color.setGreen(true);
color.setBlue(true);
- subtype.add("Dragon");
+ subtype.add("Drake");
power = new MageInt(2);
toughness = new MageInt(2);
this.addAbility(FlyingAbility.getInstance());
diff --git a/Mage.Sets/src/mage/sets/commander2013/Mirari.java b/Mage.Sets/src/mage/sets/commander2013/Mirari.java
index a0ed6f66ee0..a2129f2259d 100644
--- a/Mage.Sets/src/mage/sets/commander2013/Mirari.java
+++ b/Mage.Sets/src/mage/sets/commander2013/Mirari.java
@@ -30,6 +30,7 @@ package mage.sets.commander2013;
import java.util.UUID;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CopyTargetSpellEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.cards.CardImpl;
@@ -44,6 +45,7 @@ import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.stack.Spell;
import mage.target.TargetSpell;
+import mage.target.targetpointer.FixedTarget;
/**
*
@@ -71,7 +73,6 @@ public class Mirari extends CardImpl {
}
}
-
class MirariTriggeredAbility extends TriggeredAbilityImpl {
private static final FilterSpell filter = new FilterSpell();
@@ -106,8 +107,9 @@ class MirariTriggeredAbility extends TriggeredAbilityImpl {
if (event.getPlayerId().equals(this.getControllerId())) {
Spell spell = game.getStack().getSpell(event.getTargetId());
if (isControlledInstantOrSorcery(spell)) {
- this.getTargets().get(0).clearChosen();
- this.getTargets().get(0).add(spell.getId(), game);
+ for (Effect effect : getEffects()) {
+ effect.setTargetPointer(new FixedTarget(spell.getId()));
+ }
return true;
}
}
@@ -115,9 +117,9 @@ class MirariTriggeredAbility extends TriggeredAbilityImpl {
}
private boolean isControlledInstantOrSorcery(Spell spell) {
- return spell != null &&
- (spell.getControllerId().equals(this.getControllerId())) &&
- (spell.getCardType().contains(CardType.INSTANT) || spell.getCardType().contains(CardType.SORCERY));
+ return spell != null
+ && (spell.getControllerId().equals(this.getControllerId()))
+ && (spell.getCardType().contains(CardType.INSTANT) || spell.getCardType().contains(CardType.SORCERY));
}
@Override
diff --git a/Mage.Sets/src/mage/sets/commander2013/NayaSoulbeast.java b/Mage.Sets/src/mage/sets/commander2013/NayaSoulbeast.java
index a858e59187f..64a2febb12e 100644
--- a/Mage.Sets/src/mage/sets/commander2013/NayaSoulbeast.java
+++ b/Mage.Sets/src/mage/sets/commander2013/NayaSoulbeast.java
@@ -66,8 +66,9 @@ public class NayaSoulbeast extends CardImpl {
// Trample
this.addAbility(TrampleAbility.getInstance());
- // When you cast Naya Soulbeast, each player reveals the top card of his or her library. Naya Soulbeast enters the battlefield with X +1/+1 counters on it, where X is the total converted mana cost of all cards revealed this way.
+ // When you cast Naya Soulbeast, each player reveals the top card of his or her library.
Ability ability = new CastSourceTriggeredAbility(new NayaSoulbeastCastEffect(), false);
+ // Naya Soulbeast enters the battlefield with X +1/+1 counters on it, where X is the total converted mana cost of all cards revealed this way.
ability.addEffect(new NayaSoulbeastReplacementEffect());
this.addAbility(ability);
}
@@ -104,7 +105,7 @@ class NayaSoulbeastCastEffect extends OneShotEffect {
MageObject sourceObject = source.getSourceObject(game);
if (controller != null && sourceObject != null) {
int cmc = 0;
- for (UUID playerId :controller.getInRange()) {
+ for (UUID playerId : controller.getInRange()) {
Player player = game.getPlayer(playerId);
if (player != null) {
if (player.getLibrary().size() > 0) {
@@ -130,19 +131,19 @@ class NayaSoulbeastReplacementEffect extends ReplacementEffectImpl {
public static final String SOURCE_CAST_SPELL_ABILITY = "sourceCastSpellAbility";
public NayaSoulbeastReplacementEffect() {
- super(Duration.OneUse, Outcome.BoostCreature, true);
+ super(Duration.OneUse, Outcome.BoostCreature);
staticText = "{this} enters the battlefield with X +1/+1 counters on it, where X is the total converted mana cost of all cards revealed this way";
}
public NayaSoulbeastReplacementEffect(final NayaSoulbeastReplacementEffect effect) {
super(effect);
}
-
+
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == EventType.ENTERS_THE_BATTLEFIELD;
}
-
+
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
return event.getTargetId().equals(source.getSourceId());
@@ -152,7 +153,7 @@ class NayaSoulbeastReplacementEffect extends ReplacementEffectImpl {
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Object object = this.getValue("NayaSoulbeastCounters");
if (object instanceof Integer) {
- int amount = ((Integer)object);
+ int amount = ((Integer) object);
new AddCountersSourceEffect(CounterType.P1P1.createInstance(amount)).apply(game, source);
}
return false;
diff --git a/Mage.Sets/src/mage/sets/commander2013/OloroAgelessAscetic.java b/Mage.Sets/src/mage/sets/commander2013/OloroAgelessAscetic.java
index 569209b09f5..766fb5bd628 100644
--- a/Mage.Sets/src/mage/sets/commander2013/OloroAgelessAscetic.java
+++ b/Mage.Sets/src/mage/sets/commander2013/OloroAgelessAscetic.java
@@ -29,23 +29,20 @@ package mage.sets.commander2013;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.GainLifeControllerTriggeredAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.common.StaticValue;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.DamagePlayersEffect;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
-import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.constants.Zone;
-import mage.game.Game;
/**
*
@@ -65,11 +62,17 @@ public class OloroAgelessAscetic extends CardImpl {
// At the beginning of your upkeep, you gain 2 life.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new GainLifeEffect(2), TargetController.YOU, false));
+
// Whenever you gain life, you may pay {1}. If you do, draw a card and each opponent loses 1 life.
- this.addAbility(new GainLifeControllerTriggeredAbility(new DoIfCostPaid(new OloroAgelessAsceticEffect(), new GenericManaCost(1)),false));
+ DoIfCostPaid effect = new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new GenericManaCost(1));
+ Effect effectToAdd = new LoseLifeOpponentsEffect(1);
+ effectToAdd.setText("and each opponent loses 1 life");
+ effect.addEffect(effectToAdd);
+ this.addAbility(new GainLifeControllerTriggeredAbility(effect, false));
+
// At the beginning of your upkeep, if Oloro, Ageless Ascetic is in the command zone, you gain 2 life.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND,
- new GainLifeEffect(new StaticValue(2), "if Oloro, Ageless Ascetic is in the command zone, you gain 2 life"),TargetController.YOU, false));
+ new GainLifeEffect(new StaticValue(2), "if {this} is in the command zone, you gain 2 life"), TargetController.YOU, false));
}
public OloroAgelessAscetic(final OloroAgelessAscetic card) {
@@ -81,27 +84,3 @@ public class OloroAgelessAscetic extends CardImpl {
return new OloroAgelessAscetic(this);
}
}
-
-class OloroAgelessAsceticEffect extends OneShotEffect {
-
- public OloroAgelessAsceticEffect() {
- super(Outcome.Benefit);
- this.staticText = "draw a card and each opponent loses 1 life";
- }
-
- public OloroAgelessAsceticEffect(final OloroAgelessAsceticEffect effect) {
- super(effect);
- }
-
- @Override
- public OloroAgelessAsceticEffect copy() {
- return new OloroAgelessAsceticEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- new DrawCardSourceControllerEffect(1).apply(game, source);
- new DamagePlayersEffect(1, TargetController.OPPONENT).apply(game, source);
- return false;
- }
-}
diff --git a/Mage.Sets/src/mage/sets/commander2013/OpalPalace.java b/Mage.Sets/src/mage/sets/commander2013/OpalPalace.java
index 4601e1a29d5..53bb7eb50b8 100644
--- a/Mage.Sets/src/mage/sets/commander2013/OpalPalace.java
+++ b/Mage.Sets/src/mage/sets/commander2013/OpalPalace.java
@@ -47,6 +47,7 @@ import mage.constants.WatcherScope;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
+import mage.game.events.EntersTheBattlefieldEvent;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent;
@@ -74,7 +75,7 @@ public class OpalPalace extends CardImpl {
ability = new SimpleStaticAbility(Zone.ALL, new OpalPalaceEntersBattlefieldEffect());
ability.setRuleVisible(false);
this.addAbility(ability);
-
+
}
public OpalPalace(final OpalPalace card) {
@@ -91,10 +92,10 @@ class OpalPalaceWatcher extends Watcher {
public List commanderId = new ArrayList<>();
private final String originalId;
-
+
public OpalPalaceWatcher(String originalId) {
super("ManaPaidFromOpalPalaceWatcher", WatcherScope.CARD);
- this.originalId = originalId;
+ this.originalId = originalId;
}
public OpalPalaceWatcher(final OpalPalaceWatcher watcher) {
@@ -116,16 +117,16 @@ class OpalPalaceWatcher extends Watcher {
if (spell != null) {
Card card = spell.getCard();
if (card != null) {
- for (UUID playerId :game.getPlayerList()) {
+ for (UUID playerId : game.getPlayerList()) {
Player player = game.getPlayer(playerId);
if (player != null) {
if (player.getCommanderId() != null && player.getCommanderId().equals(card.getId())) {
commanderId.add(card.getId());
break;
}
- }
+ }
}
- }
+ }
}
}
}
@@ -153,19 +154,19 @@ class OpalPalaceEntersBattlefieldEffect extends ReplacementEffectImpl {
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == EventType.ENTERS_THE_BATTLEFIELD;
}
-
+
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
OpalPalaceWatcher watcher = (OpalPalaceWatcher) game.getState().getWatchers().get("ManaPaidFromOpalPalaceWatcher", source.getSourceId());
- return watcher != null &&
- watcher.commanderId.contains(event.getTargetId());
+ return watcher != null
+ && watcher.commanderId.contains(event.getTargetId());
}
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- Permanent permanent = game.getPermanent(event.getTargetId());
+ Permanent permanent = ((EntersTheBattlefieldEvent) event).getTarget();
if (permanent != null) {
- Integer castCount = (Integer)game.getState().getValue(permanent.getId() + "_castCount");
+ Integer castCount = (Integer) game.getState().getValue(permanent.getId() + "_castCount");
if (castCount != null && castCount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(castCount), game);
}
diff --git a/Mage.Sets/src/mage/sets/commander2013/PrimalVigor.java b/Mage.Sets/src/mage/sets/commander2013/PrimalVigor.java
index ee069e6b007..468b0b9fae7 100644
--- a/Mage.Sets/src/mage/sets/commander2013/PrimalVigor.java
+++ b/Mage.Sets/src/mage/sets/commander2013/PrimalVigor.java
@@ -51,7 +51,6 @@ public class PrimalVigor extends CardImpl {
super(ownerId, 162, "Primal Vigor", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{4}{G}");
this.expansionSetCode = "C13";
-
// If one or more tokens would be put onto the battlefield, twice that many of those tokens are put onto the battlefield instead.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PrimalVigorTokenEffect()));
// If one or more +1/+1 counters would be placed on a creature, twice that many +1/+1 counters are placed on that creature instead.
@@ -121,7 +120,7 @@ class PrimalVigorCounterEffect extends ReplacementEffectImpl {
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- event.setAmount(event.getAmount() *2);
+ event.setAmount(event.getAmount() * 2);
return false;
}
@@ -132,8 +131,11 @@ class PrimalVigorCounterEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- Permanent target = game.getPermanent(event.getTargetId());
- if (target != null && target.getCardType().contains(CardType.CREATURE)
+ Permanent permanent = game.getPermanent(event.getTargetId());
+ if (permanent == null) {
+ permanent = game.getPermanentEntering(event.getTargetId());
+ }
+ if (permanent != null && permanent.getCardType().contains(CardType.CREATURE)
&& event.getData() != null && event.getData().equals("+1/+1")) {
return true;
}
diff --git a/Mage.Sets/src/mage/sets/commander2013/RubiniaSoulsinger.java b/Mage.Sets/src/mage/sets/commander2013/RubiniaSoulsinger.java
index 0580c020d38..26b8c62ebfa 100644
--- a/Mage.Sets/src/mage/sets/commander2013/RubiniaSoulsinger.java
+++ b/Mage.Sets/src/mage/sets/commander2013/RubiniaSoulsinger.java
@@ -92,9 +92,9 @@ class RubiniaSoulsingerCondition implements Condition {
controllerId = source.getControllerId();
}
Permanent permanent = game.getBattlefield().getPermanent(source.getSourceId());
- if (permanent != null){
- if (permanent.isTapped()){
- return controllerId == source.getControllerId();
+ if (permanent != null) {
+ if (permanent.isTapped()) {
+ return controllerId.equals(source.getControllerId());
}
}
return false;
diff --git a/Mage.Sets/src/mage/sets/commander2013/SpringjackPasture.java b/Mage.Sets/src/mage/sets/commander2013/SpringjackPasture.java
index 8fafdc13ef2..d4873e2dd16 100644
--- a/Mage.Sets/src/mage/sets/commander2013/SpringjackPasture.java
+++ b/Mage.Sets/src/mage/sets/commander2013/SpringjackPasture.java
@@ -50,7 +50,7 @@ import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.Game;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.GoatToken;
import mage.players.Player;
/**
@@ -136,17 +136,3 @@ class SpringjackPastureEffect extends OneShotEffect {
return new SpringjackPastureEffect(this);
}
}
-
-class GoatToken extends Token {
-
- public GoatToken() {
- super("Goat", "0/1 white Goat creature token");
- setOriginalExpansionSetCode("EVE");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
-
- subtype.add("Goat");
- power = new MageInt(0);
- toughness = new MageInt(1);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/commander2013/Stonecloaker.java b/Mage.Sets/src/mage/sets/commander2013/Stonecloaker.java
index 5cc2d1a4c95..92b4f50836f 100644
--- a/Mage.Sets/src/mage/sets/commander2013/Stonecloaker.java
+++ b/Mage.Sets/src/mage/sets/commander2013/Stonecloaker.java
@@ -32,14 +32,14 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.ExileTargetEffect;
-import mage.abilities.effects.common.ReturnToHandTargetEffect;
+import mage.abilities.effects.common.ReturnToHandChosenControlledPermanentEffect;
import mage.abilities.keyword.FlashAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
import mage.target.common.TargetCardInGraveyard;
-import mage.target.common.TargetControlledCreaturePermanent;
/**
*
@@ -60,8 +60,8 @@ public class Stonecloaker extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
// When Stonecloaker enters the battlefield, return a creature you control to its owner's hand.
- Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), false);
- ability.addTarget(new TargetControlledCreaturePermanent());
+ Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandChosenControlledPermanentEffect(new FilterControlledCreaturePermanent()), true);
+
this.addAbility(ability);
// When Stonecloaker enters the battlefield, exile target card from a graveyard.
ability = new EntersBattlefieldTriggeredAbility(new ExileTargetEffect(), false);
diff --git a/Mage.Sets/src/mage/sets/commander2013/TemptWithDiscovery.java b/Mage.Sets/src/mage/sets/commander2013/TemptWithDiscovery.java
index e684acd3028..608f28407cd 100644
--- a/Mage.Sets/src/mage/sets/commander2013/TemptWithDiscovery.java
+++ b/Mage.Sets/src/mage/sets/commander2013/TemptWithDiscovery.java
@@ -27,6 +27,8 @@
*/
package mage.sets.commander2013;
+import java.util.LinkedHashSet;
+import java.util.Set;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
@@ -51,7 +53,6 @@ public class TemptWithDiscovery extends CardImpl {
super(ownerId, 174, "Tempt with Discovery", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{G}");
this.expansionSetCode = "C13";
-
// Tempting offer - Search your library for a land card and put it onto the battlefield.
// Each opponent may search his or her library for a land card and put it onto the battlefield.
// For each opponent who searches a library this way, search your library for a land card and put it onto the battlefield.
@@ -89,12 +90,14 @@ class TemptWithDiscoveryEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
+ Set playersShuffle = new LinkedHashSet<>();
+ playersShuffle.add(controller.getId());
TargetCardInLibrary target = new TargetCardInLibrary(new FilterLandCard());
if (controller.searchLibrary(target, game)) {
- for (UUID cardId: target.getTargets()) {
+ for (UUID cardId : target.getTargets()) {
Card card = game.getCard(cardId);
if (card != null) {
- card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), controller.getId());
+ controller.moveCards(card, null, Zone.BATTLEFIELD, source, game);
}
}
}
@@ -105,11 +108,12 @@ class TemptWithDiscoveryEffect extends OneShotEffect {
if (opponent.chooseUse(outcome, "Search your library for a land card and put it onto the battlefield?", source, game)) {
target.clearChosen();
opponentsUsedSearch++;
+ playersShuffle.add(playerId);
if (opponent.searchLibrary(target, game)) {
- for (UUID cardId: target.getTargets()) {
+ for (UUID cardId : target.getTargets()) {
Card card = game.getCard(cardId);
if (card != null) {
- card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), opponent.getId());
+ opponent.moveCards(card, null, Zone.BATTLEFIELD, source, game);
}
}
}
@@ -119,17 +123,23 @@ class TemptWithDiscoveryEffect extends OneShotEffect {
if (opponentsUsedSearch > 0) {
target = new TargetCardInLibrary(0, opponentsUsedSearch, new FilterLandCard());
if (controller.searchLibrary(target, game)) {
- for (UUID cardId: target.getTargets()) {
+ for (UUID cardId : target.getTargets()) {
Card card = game.getCard(cardId);
if (card != null) {
- card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), controller.getId());
+ controller.moveCards(card, null, Zone.BATTLEFIELD, source, game);
}
}
}
}
+ for (UUID playerId : playersShuffle) {
+ Player player = game.getPlayer(playerId);
+ if (player != null) {
+ player.shuffleLibrary(game);
+ }
+ }
return true;
}
-
+
return false;
}
}
diff --git a/Mage.Sets/src/mage/sets/commander2013/TemptWithReflections.java b/Mage.Sets/src/mage/sets/commander2013/TemptWithReflections.java
index 53cecb0c1c1..a32f7140ef4 100644
--- a/Mage.Sets/src/mage/sets/commander2013/TemptWithReflections.java
+++ b/Mage.Sets/src/mage/sets/commander2013/TemptWithReflections.java
@@ -40,12 +40,9 @@ import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.game.Game;
import mage.game.permanent.Permanent;
-import mage.game.permanent.token.EmptyToken;
-import mage.game.permanent.token.Token;
import mage.players.Player;
import mage.players.PlayerList;
import mage.target.common.TargetControlledCreaturePermanent;
-import mage.util.CardUtil;
/**
*
@@ -57,7 +54,6 @@ public class TemptWithReflections extends CardImpl {
super(ownerId, 60, "Tempt with Reflections", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{U}");
this.expansionSetCode = "C13";
-
// Tempting offer - Choose target creature you control. Put a token onto the battlefield that's a copy of that creature. Each opponent may put a token onto the battlefield that's a copy of that creature. For each opponent who does, put a token onto the battlefield that's a copy of that creature.
this.getSpellAbility().addEffect(new TemptWithReflectionsEffect());
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
@@ -115,16 +111,16 @@ class TemptWithReflectionsEffect extends OneShotEffect {
player = playerList.getNext(game);
} while (!player.getId().equals(game.getActivePlayerId()));
- for (UUID playerId: playersSaidYes) {
+ for (UUID playerId : playersSaidYes) {
effect = new PutTokenOntoBattlefieldCopyTargetEffect(playerId);
effect.setTargetPointer(getTargetPointer());
- effect.apply(game, source);
+ effect.apply(game, source);
}
if (playersSaidYes.size() > 0) {
effect = new PutTokenOntoBattlefieldCopyTargetEffect();
effect.setTargetPointer(getTargetPointer());
- effect.apply(game, source);
+ effect.apply(game, source);
}
return true;
}
diff --git a/Mage.Sets/src/mage/sets/commander2013/TerraRavager.java b/Mage.Sets/src/mage/sets/commander2013/TerraRavager.java
index 79aa1e48467..0dda70fa4d0 100644
--- a/Mage.Sets/src/mage/sets/commander2013/TerraRavager.java
+++ b/Mage.Sets/src/mage/sets/commander2013/TerraRavager.java
@@ -106,6 +106,6 @@ class TerraRavagerLandCount implements DynamicValue {
@Override
public String getMessage() {
- return "land defending player controls";
+ return "the number of lands defending player controls";
}
}
diff --git a/Mage.Sets/src/mage/sets/commander2013/TrueNameNemesis.java b/Mage.Sets/src/mage/sets/commander2013/TrueNameNemesis.java
index 18c7db6b708..6c3967a3e6d 100644
--- a/Mage.Sets/src/mage/sets/commander2013/TrueNameNemesis.java
+++ b/Mage.Sets/src/mage/sets/commander2013/TrueNameNemesis.java
@@ -30,9 +30,8 @@ package mage.sets.commander2013;
import java.util.UUID;
import mage.MageInt;
import mage.MageObject;
-import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ChoosePlayerEffect;
import mage.abilities.keyword.ProtectionAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
@@ -44,18 +43,19 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.stack.Spell;
import mage.game.stack.StackObject;
-import mage.players.Player;
-import mage.target.TargetPlayer;
/**
- * Protection from a player is a new variant of the protection ability. It means the following:
- * -- True-Name Nemesis can’t be the target of spells or abilities controlled by the chosen player.
- * -- True-Name Nemesis can’t be enchanted by Auras or equipped by Equipment controlled
- * by the chosen player. (The same is true for Fortifications controlled by the chosen player,
- * if True-Name Nemesis becomes a land.)
- * -- True-Name Nemesis can’t be blocked by creatures controlled by the chosen player.
- * -- All damage that would be dealt to True-Name Nemesis by sources controlled by the chosen player
- * is prevented. (The same is true for sources owned by the chosen player that don’t have controllers.)
+ * Protection from a player is a new variant of the protection ability. It means
+ * the following: -- True-Name Nemesis can’t be the target of spells or
+ * abilities controlled by the chosen player. -- True-Name Nemesis can’t be
+ * enchanted by Auras or equipped by Equipment controlled by the chosen player.
+ * (The same is true for Fortifications controlled by the chosen player, if
+ * True-Name Nemesis becomes a land.) -- True-Name Nemesis can’t be blocked by
+ * creatures controlled by the chosen player. -- All damage that would be dealt
+ * to True-Name Nemesis by sources controlled by the chosen player is prevented.
+ * (The same is true for sources owned by the chosen player that don’t have
+ * controllers.)
+ *
* @author LevelX2
*/
public class TrueNameNemesis extends CardImpl {
@@ -70,7 +70,7 @@ public class TrueNameNemesis extends CardImpl {
this.toughness = new MageInt(1);
// As True-Name Nemesis enters the battlefield, choose a player.
- this.addAbility(new AsEntersBattlefieldAbility(new TrueNameNemesisChoosePlayerEffect()));
+ this.addAbility(new AsEntersBattlefieldAbility(new ChoosePlayerEffect(Outcome.Protect)));
// True-Name Nemesis has protection from the chosen player.
this.addAbility(new ProtectionFromPlayerAbility());
}
@@ -85,42 +85,6 @@ public class TrueNameNemesis extends CardImpl {
}
}
-class TrueNameNemesisChoosePlayerEffect extends OneShotEffect {
-
- public TrueNameNemesisChoosePlayerEffect() {
- super(Outcome.Detriment);
- this.staticText = "choose a player";
- }
-
- public TrueNameNemesisChoosePlayerEffect(final TrueNameNemesisChoosePlayerEffect effect) {
- super(effect);
- }
-
- @Override
- public TrueNameNemesisChoosePlayerEffect copy() {
- return new TrueNameNemesisChoosePlayerEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- Permanent permanent = game.getPermanent(source.getSourceId());
- if (player != null && permanent != null) {
- TargetPlayer target = new TargetPlayer(1,1,true);
- if (player.choose(this.outcome, target, source.getSourceId(), game)) {
- Player chosenPlayer = game.getPlayer(target.getFirstTarget());
- if (chosenPlayer != null) {
- game.informPlayers(permanent.getName() + ": " + player.getLogName() + " has chosen " + chosenPlayer.getLogName());
- game.getState().setValue(permanent.getId() + "_player", target.getFirstTarget());
- permanent.addInfo("chosen player", "Chosen player: " + chosenPlayer.getLogName() + "", game);
- return true;
- }
- }
- }
- return false;
- }
-}
-
class ProtectionFromPlayerAbility extends ProtectionAbility {
public ProtectionFromPlayerAbility() {
diff --git a/Mage.Sets/src/mage/sets/commander2014/BitterFeud.java b/Mage.Sets/src/mage/sets/commander2014/BitterFeud.java
index 7ba41f23715..0ce63beead1 100644
--- a/Mage.Sets/src/mage/sets/commander2014/BitterFeud.java
+++ b/Mage.Sets/src/mage/sets/commander2014/BitterFeud.java
@@ -91,7 +91,7 @@ class BitterFeudEntersBattlefieldEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
- Permanent permanent = game.getPermanent(source.getSourceId());
+ Permanent permanent = game.getPermanentEntering(source.getSourceId());
if (controller != null && permanent != null) {
TargetPlayer target = new TargetPlayer(2, 2, true);
controller.chooseTarget(outcome, target, source, game);
diff --git a/Mage.Sets/src/mage/sets/commander2014/CoralAtoll.java b/Mage.Sets/src/mage/sets/commander2014/CoralAtoll.java
index d2a186eb83c..3785405c2c3 100644
--- a/Mage.Sets/src/mage/sets/commander2014/CoralAtoll.java
+++ b/Mage.Sets/src/mage/sets/commander2014/CoralAtoll.java
@@ -31,7 +31,7 @@ import java.util.UUID;
import mage.Mana;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
import mage.abilities.mana.SimpleManaAbility;
@@ -66,7 +66,7 @@ public class CoralAtoll extends CardImpl {
// Coral Atoll enters the battlefield tapped.
this.addAbility(new EntersBattlefieldTappedAbility());
// When Coral Atoll enters the battlefield, sacrifice it unless you return an untapped Island you control to its owner's hand.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)))));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)))));
// {tap}: Add {1}{U} to your mana pool.
this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 1, 0, 0, 1,0 ), new TapSourceCost()));
diff --git a/Mage.Sets/src/mage/sets/commander2014/DarettiScrapSavant.java b/Mage.Sets/src/mage/sets/commander2014/DarettiScrapSavant.java
index 48b846573c7..0f07b4a61ab 100644
--- a/Mage.Sets/src/mage/sets/commander2014/DarettiScrapSavant.java
+++ b/Mage.Sets/src/mage/sets/commander2014/DarettiScrapSavant.java
@@ -33,13 +33,12 @@ import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.LoyaltyAbility;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.CanBeYourCommanderAbility;
-import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.GetEmblemEffect;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
-import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
@@ -47,7 +46,6 @@ import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.constants.Zone;
-import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.common.FilterArtifactCard;
import mage.filter.common.FilterControlledArtifactPermanent;
@@ -75,7 +73,7 @@ public class DarettiScrapSavant extends CardImpl {
this.expansionSetCode = "C14";
this.subtype.add("Daretti");
- this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(3)), false));
+ this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
// +2: Discard up to two cards, then draw that many cards.
this.addAbility(new LoyaltyAbility(new DarettiDiscardDrawEffect(), 2));
@@ -166,7 +164,7 @@ class DarettiSacrificeEffect extends OneShotEffect {
if (artifact != null && artifact.sacrifice(source.getSourceId(), game)) {
Card card = game.getCard(getTargetPointer().getFirst(game, source));
if (card != null) {
- return controller.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId());
+ return controller.moveCards(card, Zone.BATTLEFIELD, source, game);
}
}
}
@@ -179,7 +177,6 @@ class DarettiSacrificeEffect extends OneShotEffect {
class DarettiScrapSavantEmblem extends Emblem {
// You get an emblem with "Whenever an artifact is put into your graveyard from the battlefield, return that card to the battlefield at the beginning of the next end step."
-
public DarettiScrapSavantEmblem() {
this.setName("Emblem - Daretti");
this.getAbilities().add(new DarettiScrapSavantTriggeredAbility());
diff --git a/Mage.Sets/src/mage/sets/commander2014/DomineeringWill.java b/Mage.Sets/src/mage/sets/commander2014/DomineeringWill.java
index df27ae5176b..31497d4ee8a 100644
--- a/Mage.Sets/src/mage/sets/commander2014/DomineeringWill.java
+++ b/Mage.Sets/src/mage/sets/commander2014/DomineeringWill.java
@@ -30,25 +30,25 @@ package mage.sets.commander2014;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.ContinuousEffect;
-import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.RequirementEffect;
+import mage.abilities.effects.common.UntapTargetEffect;
+import mage.abilities.effects.common.combat.BlocksIfAbleTargetEffect;
+import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
-import mage.constants.Layer;
import mage.constants.Outcome;
import mage.constants.Rarity;
-import mage.constants.SubLayer;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.AttackingPredicate;
import mage.game.Game;
-import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPlayer;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetpointer.SecondTargetPointer;
/**
*
@@ -66,7 +66,6 @@ public class DomineeringWill extends CardImpl {
super(ownerId, 13, "Domineering Will", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{3}{U}");
this.expansionSetCode = "C14";
-
// Target player gains control of up to three target nonattacking creatures until end of turn. Untap those creatures. They block this turn if able.
this.getSpellAbility().addEffect(new DomineeringWillEffect());
this.getSpellAbility().addTarget(new TargetPlayer());
@@ -102,14 +101,20 @@ class DomineeringWillEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source));
+ Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source));
if (targetPlayer != null) {
- ContinuousEffect effect = new DomineeringWillControlEffect();
+ ContinuousEffect effect = new GainControlTargetEffect(Duration.EndOfTurn, targetPlayer.getId());
+ effect.setTargetPointer(new SecondTargetPointer());
+ effect.setText("Target player gains control of up to three target nonattacking creatures until end of turn");
game.addEffect(effect, source);
- Effect effect2 = new DomineeringWillUntapTargetEffect();
+
+ Effect effect2 = new UntapTargetEffect();
+ effect2.setTargetPointer(new SecondTargetPointer());
effect2.setText("Untap those creatures");
effect2.apply(game, source);
- RequirementEffect effect3 = new DomineeringWillBlocksIfAbleTargetEffect(Duration.EndOfTurn);
+
+ RequirementEffect effect3 = new BlocksIfAbleTargetEffect(Duration.EndOfTurn);
+ effect3.setTargetPointer(new SecondTargetPointer());
effect3.setText("They block this turn if able");
game.addEffect(effect3, source);
return true;
@@ -117,109 +122,3 @@ class DomineeringWillEffect extends OneShotEffect {
return false;
}
}
-
-class DomineeringWillControlEffect extends ContinuousEffectImpl {
-
- public DomineeringWillControlEffect() {
- super(Duration.EndOfTurn, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl);
- }
-
- public DomineeringWillControlEffect(final DomineeringWillControlEffect effect) {
- super(effect);
- }
-
- @Override
- public DomineeringWillControlEffect copy() {
- return new DomineeringWillControlEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source));
- if (targetPlayer != null) {
- boolean targetStillExists = false;
- for (UUID permanentId : source.getTargets().get(1).getTargets()) {
- Permanent permanent = game.getPermanent(permanentId);
- if (permanent != null) {
- targetStillExists = true;
- if (targetPlayer != null) {
- permanent.changeControllerId(targetPlayer.getId(), game);
- permanent.getAbilities().setControllerId(targetPlayer.getId());
- } else {
- permanent.changeControllerId(source.getControllerId(), game);
- permanent.getAbilities().setControllerId(source.getControllerId());
- }
- }
- }
- if (!targetStillExists) {
- // no valid target exists, effect can be discarded
- discard();
- }
- return true;
- }
- return false;
- }
-}
-
-class DomineeringWillUntapTargetEffect extends OneShotEffect {
-
- public DomineeringWillUntapTargetEffect() {
- super(Outcome.Untap);
- }
-
- public DomineeringWillUntapTargetEffect(final DomineeringWillUntapTargetEffect effect) {
- super(effect);
- }
-
- @Override
- public DomineeringWillUntapTargetEffect copy() {
- return new DomineeringWillUntapTargetEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- for (UUID target : source.getTargets().get(1).getTargets()) {
- Permanent permanent = game.getPermanent(target);
- if (permanent != null) {
- permanent.untap(game);
- }
- }
- return true;
- }
-}
-
-class DomineeringWillBlocksIfAbleTargetEffect extends RequirementEffect {
-
- public DomineeringWillBlocksIfAbleTargetEffect(Duration duration) {
- super(duration);
- }
-
- public DomineeringWillBlocksIfAbleTargetEffect(final DomineeringWillBlocksIfAbleTargetEffect effect) {
- super(effect);
- }
-
- @Override
- public DomineeringWillBlocksIfAbleTargetEffect copy() {
- return new DomineeringWillBlocksIfAbleTargetEffect(this);
- }
-
- @Override
- public boolean applies(Permanent permanent, Ability source, Game game) {
- return source.getTargets().get(1).getTargets().contains(permanent.getId());
- }
-
- @Override
- public boolean mustAttack(Game game) {
- return false;
- }
-
- @Override
- public boolean mustBlock(Game game) {
- return false;
- }
-
- @Override
- public boolean mustBlockAny(Game game) {
- return true;
- }
-}
diff --git a/Mage.Sets/src/mage/sets/commander2014/DormantVolcano.java b/Mage.Sets/src/mage/sets/commander2014/DormantVolcano.java
index 800f515fca7..c4b046863bd 100644
--- a/Mage.Sets/src/mage/sets/commander2014/DormantVolcano.java
+++ b/Mage.Sets/src/mage/sets/commander2014/DormantVolcano.java
@@ -31,7 +31,7 @@ import java.util.UUID;
import mage.Mana;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
import mage.abilities.mana.SimpleManaAbility;
@@ -66,7 +66,7 @@ public class DormantVolcano extends CardImpl {
this.addAbility(new EntersBattlefieldTappedAbility());
// When Dormant Volcano enters the battlefield, sacrifice it unless you return an untapped Mountain you control to its owner's hand.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)))));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)))));
// {tap}: Add {1}{R} to your mana pool.
this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(1, 0, 0, 0, 0, 1,0 ), new TapSourceCost()));
diff --git a/Mage.Sets/src/mage/sets/commander2014/Everglades.java b/Mage.Sets/src/mage/sets/commander2014/Everglades.java
index 7cf1f874132..e9693d66a88 100644
--- a/Mage.Sets/src/mage/sets/commander2014/Everglades.java
+++ b/Mage.Sets/src/mage/sets/commander2014/Everglades.java
@@ -31,7 +31,7 @@ import java.util.UUID;
import mage.Mana;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
import mage.abilities.mana.SimpleManaAbility;
@@ -53,7 +53,7 @@ public class Everglades extends CardImpl {
private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("an untapped Swamp");
- static{
+ static {
filter.add(new SubtypePredicate("Swamp"));
filter.add(Predicates.not(new TappedPredicate()));
}
@@ -66,10 +66,10 @@ public class Everglades extends CardImpl {
this.addAbility(new EntersBattlefieldTappedAbility());
// When Everglades enters the battlefield, sacrifice it unless you return an untapped Swamp you control to its owner's hand.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)))));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(1, 1, filter, true)))));
// {tap}: Add {1}{B} to your mana pool.
- this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 0, 0, 1, 1,0 ), new TapSourceCost()));
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 0, 0, 1, 1, 0), new TapSourceCost()));
}
diff --git a/Mage.Sets/src/mage/sets/commander2014/FeldonOfTheThirdPath.java b/Mage.Sets/src/mage/sets/commander2014/FeldonOfTheThirdPath.java
index ad667be3a2f..77840101add 100644
--- a/Mage.Sets/src/mage/sets/commander2014/FeldonOfTheThirdPath.java
+++ b/Mage.Sets/src/mage/sets/commander2014/FeldonOfTheThirdPath.java
@@ -36,8 +36,8 @@ import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbil
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.PutTokenOntoBattlefieldCopyTargetEffect;
import mage.abilities.effects.common.SacrificeTargetEffect;
-import mage.abilities.keyword.HasteAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
@@ -46,10 +46,9 @@ import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.common.FilterCreatureCard;
import mage.game.Game;
-import mage.game.permanent.token.EmptyToken;
+import mage.game.permanent.Permanent;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.targetpointer.FixedTarget;
-import mage.util.CardUtil;
/**
*
@@ -104,24 +103,18 @@ class FeldonOfTheThirdPathEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Card card = game.getCard(getTargetPointer().getFirst(game, source));
if (card != null) {
- EmptyToken token = new EmptyToken();
- // TODO: This fails if a card will be copied, that uses adjustTargets() method.
- CardUtil.copyTo(token).from(card);
-
- if (!token.getCardType().contains(CardType.ARTIFACT)) {
- token.getCardType().add(CardType.ARTIFACT);
+ PutTokenOntoBattlefieldCopyTargetEffect effect = new PutTokenOntoBattlefieldCopyTargetEffect(source.getControllerId(), CardType.ARTIFACT, true);
+ effect.setTargetPointer(new FixedTarget(card.getId(), game.getState().getZoneChangeCounter(card.getId())));
+ effect.apply(game, source);
+ for (Permanent addedToken : effect.getAddedPermanent()) {
+ SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("Sacrifice the token at the beginning of the next end step", source.getControllerId());
+ sacrificeEffect.setTargetPointer(new FixedTarget(addedToken, game));
+ DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect);
+ delayedAbility.setSourceId(source.getSourceId());
+ delayedAbility.setControllerId(source.getControllerId());
+ delayedAbility.setSourceObject(source.getSourceObject(game), game);
+ game.addDelayedTriggeredAbility(delayedAbility);
}
- token.addAbility(HasteAbility.getInstance());
- token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId());
-
- SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect();
- sacrificeEffect.setText("Sacrifice the token at the beginning of the next end step");
- sacrificeEffect.setTargetPointer(new FixedTarget(token.getLastAddedToken()));
- DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect);
- delayedAbility.setSourceId(source.getSourceId());
- delayedAbility.setControllerId(source.getControllerId());
- delayedAbility.setSourceObject(source.getSourceObject(game), game);
- game.addDelayedTriggeredAbility(delayedAbility);
return true;
}
diff --git a/Mage.Sets/src/mage/sets/commander2014/FreyaliseLlanowarsFury.java b/Mage.Sets/src/mage/sets/commander2014/FreyaliseLlanowarsFury.java
index adf5daa6ca5..e8d82a0618a 100644
--- a/Mage.Sets/src/mage/sets/commander2014/FreyaliseLlanowarsFury.java
+++ b/Mage.Sets/src/mage/sets/commander2014/FreyaliseLlanowarsFury.java
@@ -32,19 +32,17 @@ import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.CanBeYourCommanderAbility;
-import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
-import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.mana.GreenManaAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.counters.CounterType;
-import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterArtifactOrEnchantmentPermanent;
+import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.mageobject.ColorPredicate;
import mage.game.permanent.token.Token;
import mage.target.TargetPermanent;
@@ -56,6 +54,7 @@ import mage.target.TargetPermanent;
public class FreyaliseLlanowarsFury extends CardImpl {
private static final FilterControlledCreaturePermanent filterGreen = new FilterControlledCreaturePermanent("green creature you control");
+
static {
filterGreen.add(new ColorPredicate(ObjectColor.GREEN));
}
@@ -65,8 +64,8 @@ public class FreyaliseLlanowarsFury extends CardImpl {
this.expansionSetCode = "C14";
this.subtype.add("Freyalise");
- this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(3)), false));
-
+ this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
+
// +2: Put a 1/1 green Elf Druid creature token onto the battlefield with "{T}: Add {G} to your mana pool."
this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new FreyaliseLlanowarsFuryToken()), 2));
// -2: Destroy target artifact or enchantment.
@@ -106,4 +105,4 @@ class FreyaliseLlanowarsFuryToken extends Token {
// {T}: Add {G} to your mana pool.
this.addAbility(new GreenManaAbility());
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/commander2014/GiftOfEstates.java b/Mage.Sets/src/mage/sets/commander2014/GiftOfEstates.java
index c87bb2c1f4f..e4c6731a64d 100644
--- a/Mage.Sets/src/mage/sets/commander2014/GiftOfEstates.java
+++ b/Mage.Sets/src/mage/sets/commander2014/GiftOfEstates.java
@@ -28,7 +28,7 @@
package mage.sets.commander2014;
import java.util.UUID;
-import mage.abilities.condition.common.OpponentControllsMoreCondition;
+import mage.abilities.condition.common.OpponentControlsMoreCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
import mage.cards.CardImpl;
@@ -60,7 +60,7 @@ public class GiftOfEstates extends CardImpl {
// If an opponent controls more lands than you, search your library for up to three Plains cards, reveal them, and put them into your hand. Then shuffle your library.
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 3, filter), true),
- new OpponentControllsMoreCondition(new FilterLandPermanent("lands"))));
+ new OpponentControlsMoreCondition(new FilterLandPermanent("lands"))));
}
public GiftOfEstates(final GiftOfEstates card) {
diff --git a/Mage.Sets/src/mage/sets/commander2014/HallowedSpiritkeeper.java b/Mage.Sets/src/mage/sets/commander2014/HallowedSpiritkeeper.java
index b052260ed7e..e9fd02c7262 100644
--- a/Mage.Sets/src/mage/sets/commander2014/HallowedSpiritkeeper.java
+++ b/Mage.Sets/src/mage/sets/commander2014/HallowedSpiritkeeper.java
@@ -39,7 +39,7 @@ import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.filter.common.FilterCreatureCard;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.SpiritWhiteToken;
/**
*
@@ -59,7 +59,7 @@ public class HallowedSpiritkeeper extends CardImpl {
this.addAbility(VigilanceAbility.getInstance());
// When Hallowed Spiritkeeper dies, put X 1/1 white Spirit creature tokens with flying onto the battlefield, where X is the number of creature cards in your graveyard.
- Effect effect = new CreateTokenEffect(new HallowedSpiritkeeperSpiritToken(), new CardsInControllerGraveyardCount(new FilterCreatureCard("creature cards")));
+ Effect effect = new CreateTokenEffect(new SpiritWhiteToken(), new CardsInControllerGraveyardCount(new FilterCreatureCard("creature cards")));
effect.setText("put X 1/1 white Spirit creature tokens with flying onto the battlefield, where X is the number of creature cards in your graveyard");
this.addAbility(new DiesTriggeredAbility(effect, false));
@@ -74,19 +74,3 @@ public class HallowedSpiritkeeper extends CardImpl {
return new HallowedSpiritkeeper(this);
}
}
-
-class HallowedSpiritkeeperSpiritToken extends Token {
-
- public HallowedSpiritkeeperSpiritToken() {
- super("Spirit", "1/1 white Spirit creature token with flying");
- setOriginalExpansionSetCode("C14");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
- subtype.add("Spirit");
- power = new MageInt(1);
- toughness = new MageInt(1);
-
- addAbility(FlyingAbility.getInstance());
-
- }
-}
diff --git a/Mage.Sets/src/mage/sets/commander2014/InfernalOffering.java b/Mage.Sets/src/mage/sets/commander2014/InfernalOffering.java
index f0bb1741adc..07816fa09d4 100644
--- a/Mage.Sets/src/mage/sets/commander2014/InfernalOffering.java
+++ b/Mage.Sets/src/mage/sets/commander2014/InfernalOffering.java
@@ -61,10 +61,9 @@ public class InfernalOffering extends CardImpl {
super(ownerId, 24, "Infernal Offering", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{4}{B}");
this.expansionSetCode = "C14";
-
// Choose an opponent. You and that player each sacrifice a creature. Each player who sacrificed a creature this way draws two cards.
this.getSpellAbility().addEffect(new InfernalOfferingSacrificeEffect());
-
+
// Choose an opponent. Return a creature card from your graveyard to the battlefield, then that player returns a creature card from his or her graveyard to the battlefield.
this.getSpellAbility().addEffect(new InfernalOfferingReturnEffect());
}
@@ -80,21 +79,21 @@ public class InfernalOffering extends CardImpl {
}
class InfernalOfferingSacrificeEffect extends OneShotEffect {
-
+
InfernalOfferingSacrificeEffect() {
super(Outcome.Sacrifice);
this.staticText = "Choose an opponent. You and that player each sacrifice a creature. Each player who sacrificed a creature this way draws two cards";
}
-
+
InfernalOfferingSacrificeEffect(final InfernalOfferingSacrificeEffect effect) {
super(effect);
}
-
+
@Override
public InfernalOfferingSacrificeEffect copy() {
return new InfernalOfferingSacrificeEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
@@ -105,8 +104,8 @@ class InfernalOfferingSacrificeEffect extends OneShotEffect {
if (opponent != null) {
//Choose creatures to sacrifice
Map toSacrifice = new HashMap<>(2);
- for (UUID playerId : player.getInRange()) {
- if (playerId == player.getId() || playerId == opponent.getId()) {
+ for (UUID playerId : game.getState().getPlayersInRange(player.getId(), game)) {
+ if (playerId.equals(player.getId()) || playerId.equals(opponent.getId())) {
target = new TargetControlledCreaturePermanent(1, 1, new FilterControlledCreaturePermanent(), true);
if (target.choose(Outcome.Sacrifice, playerId, source.getControllerId(), game)) {
toSacrifice.put(playerId, target.getFirstTarget());
@@ -138,33 +137,33 @@ class InfernalOfferingSacrificeEffect extends OneShotEffect {
}
class InfernalOfferingReturnEffect extends OneShotEffect {
-
+
InfernalOfferingReturnEffect() {
super(Outcome.PutCreatureInPlay);
this.staticText = "Choose an opponent. Return a creature card from your graveyard to the battlefield, then that player returns a creature card from his or her graveyard to the battlefield";
}
-
+
InfernalOfferingReturnEffect(final InfernalOfferingReturnEffect effect) {
super(effect);
}
-
+
@Override
public InfernalOfferingReturnEffect copy() {
return new InfernalOfferingReturnEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- if (player != null) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
Target target = new TargetOpponent(true);
target.choose(Outcome.PutCreatureInPlay, source.getControllerId(), source.getSourceId(), game);
Player opponent = game.getPlayer(target.getFirstTarget());
target = new TargetCardInYourGraveyard(new FilterCreatureCard("creature card in your graveyard"));
- if (target.choose(Outcome.PutCreatureInPlay, player.getId(), source.getSourceId(), game)) {
- Card card = player.getGraveyard().get(target.getFirstTarget(), game);
+ if (target.choose(Outcome.PutCreatureInPlay, controller.getId(), source.getSourceId(), game)) {
+ Card card = controller.getGraveyard().get(target.getFirstTarget(), game);
if (card != null) {
- player.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId());
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game);
}
}
if (opponent != null) {
@@ -172,7 +171,7 @@ class InfernalOfferingReturnEffect extends OneShotEffect {
if (target.choose(Outcome.PutCreatureInPlay, opponent.getId(), source.getSourceId(), game)) {
Card card = opponent.getGraveyard().get(target.getFirstTarget(), game);
if (card != null) {
- opponent.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId());
+ opponent.moveCards(card, Zone.BATTLEFIELD, source, game);
}
}
}
diff --git a/Mage.Sets/src/mage/sets/commander2014/JungleBasin.java b/Mage.Sets/src/mage/sets/commander2014/JungleBasin.java
index c90e7f0e107..dfa53c525a9 100644
--- a/Mage.Sets/src/mage/sets/commander2014/JungleBasin.java
+++ b/Mage.Sets/src/mage/sets/commander2014/JungleBasin.java
@@ -31,7 +31,7 @@ import java.util.UUID;
import mage.Mana;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
import mage.abilities.mana.SimpleManaAbility;
@@ -66,7 +66,7 @@ public class JungleBasin extends CardImpl {
this.addAbility(new EntersBattlefieldTappedAbility());
// When Jungle Basin enters the battlefield, sacrifice it unless you return an untapped Forest you control to its owner's hand.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)))));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)))));
// {tap}: Add {1}{G} to your mana pool.
this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 1, 0, 0, 0, 1,0 ), new TapSourceCost()));
diff --git a/Mage.Sets/src/mage/sets/commander2014/Karoo.java b/Mage.Sets/src/mage/sets/commander2014/Karoo.java
index eed52e1bc32..095d04b79d6 100644
--- a/Mage.Sets/src/mage/sets/commander2014/Karoo.java
+++ b/Mage.Sets/src/mage/sets/commander2014/Karoo.java
@@ -31,7 +31,7 @@ import java.util.UUID;
import mage.Mana;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
+import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
import mage.abilities.mana.SimpleManaAbility;
@@ -66,7 +66,7 @@ public class Karoo extends CardImpl {
this.addAbility(new EntersBattlefieldTappedAbility());
// When Karoo enters the battlefield, sacrifice it unless you return an untapped Plains you control to its owner's hand.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)))));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)))));
// {tap}: Add {1}{W} to your mana pool.
this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 0, 1, 0, 1,0 ), new TapSourceCost()));
diff --git a/Mage.Sets/src/mage/sets/commander2014/LifebloodHydra.java b/Mage.Sets/src/mage/sets/commander2014/LifebloodHydra.java
index dbe2f5c4441..9dad251209d 100644
--- a/Mage.Sets/src/mage/sets/commander2014/LifebloodHydra.java
+++ b/Mage.Sets/src/mage/sets/commander2014/LifebloodHydra.java
@@ -30,11 +30,10 @@ package mage.sets.commander2014;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.common.DiesTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility;
-import mage.abilities.effects.EntersBattlefieldEffect;
import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
@@ -61,9 +60,9 @@ public class LifebloodHydra extends CardImpl {
// Trample
this.addAbility(TrampleAbility.getInstance());
-
+
// Lifeblood Hydra enters the battlefield with X +1/+1 counters on it.
- this.addAbility(new EntersBattlefieldAbility(new LifebloodHydraComesIntoPlayEffect(), "with X +1/+1 counters on it"));
+ this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.P1P1.createInstance())));
// When Lifeblood Hydra dies, you gain life and draw cards equal to its power.
this.addAbility(new DiesTriggeredAbility(new LifebloodHydraEffect(), false));
@@ -79,38 +78,6 @@ public class LifebloodHydra extends CardImpl {
}
}
-class LifebloodHydraComesIntoPlayEffect extends OneShotEffect {
-
- public LifebloodHydraComesIntoPlayEffect() {
- super(Outcome.BoostCreature);
- staticText = "{this} enters the battlefield with X +1/+1 counters on it";
- }
-
- public LifebloodHydraComesIntoPlayEffect(final LifebloodHydraComesIntoPlayEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent permanent = game.getPermanent(source.getSourceId());
- if (permanent != null && !permanent.isFaceDown(game)) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
- if (amount > 0) {
- permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
- }
- }
- }
- return true;
- }
-
- @Override
- public LifebloodHydraComesIntoPlayEffect copy() {
- return new LifebloodHydraComesIntoPlayEffect(this);
- }
-
-}
class LifebloodHydraEffect extends OneShotEffect {
public LifebloodHydraEffect() {
@@ -132,7 +99,7 @@ class LifebloodHydraEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- Permanent diedPermanent = (Permanent) getValue("diedPermanent");
+ Permanent diedPermanent = (Permanent) getValue("permanentLeftBattlefield");
if (diedPermanent != null) {
controller.gainLife(diedPermanent.getPower().getValue(), game);
controller.drawCards(diedPermanent.getPower().getValue(), game);
diff --git a/Mage.Sets/src/mage/sets/commander2014/MasterworkOfIngenuity.java b/Mage.Sets/src/mage/sets/commander2014/MasterworkOfIngenuity.java
index 7485d6c1534..1ec61bbb10e 100644
--- a/Mage.Sets/src/mage/sets/commander2014/MasterworkOfIngenuity.java
+++ b/Mage.Sets/src/mage/sets/commander2014/MasterworkOfIngenuity.java
@@ -28,14 +28,11 @@
package mage.sets.commander2014;
import java.util.UUID;
-import mage.abilities.Ability;
-import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.effects.EntersBattlefieldEffect;
+import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.effects.common.CopyPermanentEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.filter.predicate.mageobject.SubtypePredicate;
@@ -45,6 +42,7 @@ import mage.filter.predicate.mageobject.SubtypePredicate;
* @author LevelX2
*/
public class MasterworkOfIngenuity extends CardImpl {
+
private static final FilterPermanent filter = new FilterPermanent("artifact");
static {
@@ -58,12 +56,7 @@ public class MasterworkOfIngenuity extends CardImpl {
this.subtype.add("Equipment");
// You may have Masterwork of Ingenuity enter the battlefield as a copy of any Equipment on the battlefield.
- Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new EntersBattlefieldEffect(
- new CopyPermanentEffect(filter),
- "You may have {this} enter the battlefield as a copy of any Equipment on the battlefield",
- true));
- this.addAbility(ability);
-
+ this.addAbility(new EntersBattlefieldAbility(new CopyPermanentEffect(filter), true));
}
public MasterworkOfIngenuity(final MasterworkOfIngenuity card) {
diff --git a/Mage.Sets/src/mage/sets/commander2014/NahiriTheLithomancer.java b/Mage.Sets/src/mage/sets/commander2014/NahiriTheLithomancer.java
index 826add7420e..0e303f39bcf 100644
--- a/Mage.Sets/src/mage/sets/commander2014/NahiriTheLithomancer.java
+++ b/Mage.Sets/src/mage/sets/commander2014/NahiriTheLithomancer.java
@@ -27,15 +27,11 @@
*/
package mage.sets.commander2014;
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
import java.util.UUID;
-import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.CanBeYourCommanderAbility;
-import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.Effect;
@@ -43,7 +39,6 @@ import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
-import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.abilities.keyword.EquipAbility;
import mage.abilities.keyword.IndestructibleAbility;
@@ -55,12 +50,12 @@ import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
-import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
+import mage.game.permanent.token.KorSoldierToken;
import mage.game.permanent.token.Token;
import mage.players.Player;
import mage.target.Target;
@@ -79,20 +74,19 @@ public class NahiriTheLithomancer extends CardImpl {
this.expansionSetCode = "C14";
this.subtype.add("Nahiri");
-
- this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(3)), false));
+ this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
// +2: Put a 1/1 white Kor Soldier creature token onto the battlefield. You may attach an Equipment you control to it.
this.addAbility(new LoyaltyAbility(new NahiriTheLithomancerFirstAbilityEffect(), 2));
-
+
// -2: You may put an Equipment card from your hand or graveyard onto the battlefield.
this.addAbility(new LoyaltyAbility(new NahiriTheLithomancerSecondAbilityEffect(), -2));
-
+
// -10: Put a colorless Equipment artifact token named Stoneforged Blade onto the battlefield. It has indestructible, "Equipped creature gets +5/+5 and has double strike," and equip {0}.
Effect effect = new CreateTokenEffect(new NahiriTheLithomancerEquipmentToken());
effect.setText("Put a colorless Equipment artifact token named Stoneforged Blade onto the battlefield. It has indestructible, \"Equipped creature gets +5/+5 and has double strike,\" and equip {0}");
this.addAbility(new LoyaltyAbility(effect, -10));
-
+
// Nahiri, the Lithomancer can be your commander.
this.addAbility(CanBeYourCommanderAbility.getInstance());
}
@@ -108,46 +102,49 @@ public class NahiriTheLithomancer extends CardImpl {
}
class NahiriTheLithomancerFirstAbilityEffect extends OneShotEffect {
-
+
private static final FilterControlledPermanent filter = new FilterControlledPermanent("an Equipment you control");
+
static {
filter.add(new SubtypePredicate("Equipment"));
}
-
+
NahiriTheLithomancerFirstAbilityEffect() {
super(Outcome.PutCreatureInPlay);
this.staticText = "Put a 1/1 white Kor Soldier creature token onto the battlefield. You may attach an Equipment you control to it";
}
-
+
NahiriTheLithomancerFirstAbilityEffect(final NahiriTheLithomancerFirstAbilityEffect effect) {
super(effect);
}
-
+
@Override
public NahiriTheLithomancerFirstAbilityEffect copy() {
return new NahiriTheLithomancerFirstAbilityEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- Token token = new NahiriTheLithomancerKorSoldierToken();
+ Token token = new KorSoldierToken();
if (token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId())) {
- Permanent tokenPermanent = game.getPermanent(token.getLastAddedToken());
- if (tokenPermanent != null) {
- //TODO: Make sure the Equipment can legally enchant the token, preferably on targetting.
- Target target = new TargetControlledPermanent(0, 1, filter, true);
- if (target.canChoose(source.getSourceId(), controller.getId(), game) &&
- controller.chooseUse(outcome, "Attach an Equipment you control to the created Token?", source, game)) {
- if (target.choose(Outcome.Neutral, source.getControllerId(), source.getSourceId(), game)) {
- Permanent equipmentPermanent = game.getPermanent(target.getFirstTarget());
- if (equipmentPermanent != null) {
- Permanent attachedTo = game.getPermanent(equipmentPermanent.getAttachedTo());
- if (attachedTo != null) {
- attachedTo.removeAttachment(equipmentPermanent.getId(), game);
+ for (UUID tokenId : token.getLastAddedTokenIds()) {
+ Permanent tokenPermanent = game.getPermanent(tokenId);
+ if (tokenPermanent != null) {
+ //TODO: Make sure the Equipment can legally enchant the token, preferably on targetting.
+ Target target = new TargetControlledPermanent(0, 1, filter, true);
+ if (target.canChoose(source.getSourceId(), controller.getId(), game)
+ && controller.chooseUse(outcome, "Attach an Equipment you control to the created " + tokenPermanent.getIdName() + "?", source, game)) {
+ if (target.choose(Outcome.Neutral, source.getControllerId(), source.getSourceId(), game)) {
+ Permanent equipmentPermanent = game.getPermanent(target.getFirstTarget());
+ if (equipmentPermanent != null) {
+ Permanent attachedTo = game.getPermanent(equipmentPermanent.getAttachedTo());
+ if (attachedTo != null) {
+ attachedTo.removeAttachment(equipmentPermanent.getId(), game);
+ }
+ tokenPermanent.addAttachment(equipmentPermanent.getId(), game);
}
- tokenPermanent.addAttachment(equipmentPermanent.getId(), game);
}
}
}
@@ -160,41 +157,28 @@ class NahiriTheLithomancerFirstAbilityEffect extends OneShotEffect {
}
}
-class NahiriTheLithomancerKorSoldierToken extends Token {
-
- NahiriTheLithomancerKorSoldierToken() {
- super("Kor Soldier", "1/1 white Kor Soldier creature token");
- setOriginalExpansionSetCode("C14");
- cardType.add(CardType.CREATURE);
- color.setWhite(true);
- subtype.add("Kor");
- subtype.add("Soldier");
- power = new MageInt(1);
- toughness = new MageInt(1);
- }
-}
-
class NahiriTheLithomancerSecondAbilityEffect extends OneShotEffect {
-
+
private static final FilterCard filter = new FilterCard("an Equipment");
+
static {
filter.add(new SubtypePredicate("Equipment"));
}
-
+
NahiriTheLithomancerSecondAbilityEffect() {
super(Outcome.PutCardInPlay);
this.staticText = "You may put an Equipment card from your hand or graveyard onto the battlefield";
}
-
+
NahiriTheLithomancerSecondAbilityEffect(final NahiriTheLithomancerSecondAbilityEffect effect) {
super(effect);
}
-
+
@Override
public NahiriTheLithomancerSecondAbilityEffect copy() {
return new NahiriTheLithomancerSecondAbilityEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
@@ -204,15 +188,14 @@ class NahiriTheLithomancerSecondAbilityEffect extends OneShotEffect {
controller.choose(outcome, target, source.getSourceId(), game);
Card card = controller.getHand().get(target.getFirstTarget(), game);
if (card != null) {
- controller.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId());
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game);
}
- }
- else {
+ } else {
Target target = new TargetCardInYourGraveyard(0, 1, filter);
target.choose(Outcome.PutCardInPlay, source.getControllerId(), source.getSourceId(), game);
Card card = controller.getGraveyard().get(target.getFirstTarget(), game);
if (card != null) {
- controller.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId());
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game);
}
}
return true;
@@ -227,13 +210,13 @@ class NahiriTheLithomancerEquipmentToken extends Token {
super("Stoneforged Blade", "colorless Equipment artifact token named Stoneforged Blade with indestructible, \"Equipped creature gets +5/+5 and has double strike,\" and equip {0}");
cardType.add(CardType.ARTIFACT);
subtype.add("Equipment");
-
+
this.addAbility(IndestructibleAbility.getInstance());
-
+
Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(5, 5));
ability.addEffect(new GainAbilityAttachedEffect(DoubleStrikeAbility.getInstance(), AttachmentType.EQUIPMENT, Duration.WhileOnBattlefield, "and has double strike"));
this.addAbility(ability);
-
+
this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(0)));
}
}
diff --git a/Mage.Sets/src/mage/sets/commander2014/NecromanticSelection.java b/Mage.Sets/src/mage/sets/commander2014/NecromanticSelection.java
index b595331cf91..240f34a2f5f 100644
--- a/Mage.Sets/src/mage/sets/commander2014/NecromanticSelection.java
+++ b/Mage.Sets/src/mage/sets/commander2014/NecromanticSelection.java
@@ -71,7 +71,6 @@ public class NecromanticSelection extends CardImpl {
super(ownerId, 26, "Necromantic Selection", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{4}{B}{B}{B}");
this.expansionSetCode = "C14";
-
// Destroy all creatures, then return a creature card put into a graveyard this way to the battlefield under your control. It's a black Zombie in addition to its other colors and types. Exile Necromantic Selection.
this.getSpellAbility().addEffect(new NecromanticSelectionEffect());
this.getSpellAbility().addEffect(ExileSpellEffect.getInstance());
@@ -110,7 +109,7 @@ class NecromanticSelectionEffect extends OneShotEffect {
MageObject sourceObject = game.getObject(source.getSourceId());
if (sourceObject != null && controller != null) {
Cards cards = new CardsImpl();
- for(Permanent permanent: game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), controller.getId(), source.getSourceId(), game)) {
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), controller.getId(), source.getSourceId(), game)) {
permanent.destroy(source.getSourceId(), game, false);
if (game.getState().getZone(permanent.getId()).equals(Zone.GRAVEYARD)) {
cards.add(permanent);
@@ -118,7 +117,7 @@ class NecromanticSelectionEffect extends OneShotEffect {
}
FilterCard filter = new FilterCreatureCard("creature card put into a graveyard with " + sourceObject.getLogName());
ArrayList> cardIdPredicates = new ArrayList<>();
- for(UUID cardId: cards) {
+ for (UUID cardId : cards) {
cardIdPredicates.add(new CardIdPredicate(cardId));
}
filter.add(Predicates.or(cardIdPredicates));
@@ -126,7 +125,7 @@ class NecromanticSelectionEffect extends OneShotEffect {
if (controller.chooseTarget(outcome, target, source, game)) {
Card card = game.getCard(target.getFirstTarget());
if (card != null) {
- controller.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId());
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game);
ContinuousEffect effect = new NecromanticSelectionContinuousEffect();
effect.setTargetPointer(new FixedTarget(card.getId()));
game.addEffect(effect, source);
diff --git a/Mage.Sets/src/mage/sets/commander2014/ObNixilisOfTheBlackOath.java b/Mage.Sets/src/mage/sets/commander2014/ObNixilisOfTheBlackOath.java
index 79cb66aa248..2a1e6544c52 100644
--- a/Mage.Sets/src/mage/sets/commander2014/ObNixilisOfTheBlackOath.java
+++ b/Mage.Sets/src/mage/sets/commander2014/ObNixilisOfTheBlackOath.java
@@ -28,11 +28,10 @@
package mage.sets.commander2014;
import java.util.UUID;
-import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.CanBeYourCommanderAbility;
-import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.ManaCostsImpl;
@@ -45,17 +44,14 @@ import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.GetEmblemEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
-import mage.abilities.effects.common.counter.AddCountersSourceEffect;
-import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
-import mage.counters.CounterType;
import mage.game.Game;
import mage.game.command.Emblem;
-import mage.game.permanent.token.Token;
+import mage.game.permanent.token.DemonToken;
import mage.players.Player;
import mage.target.common.TargetControlledCreaturePermanent;
@@ -70,20 +66,19 @@ public class ObNixilisOfTheBlackOath extends CardImpl {
this.expansionSetCode = "C14";
this.subtype.add("Nixilis");
-
- this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(3)), false));
+ this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
// +2: Each opponent loses 1 life. You gain life equal to the life lost this way.
this.addAbility(new LoyaltyAbility(new ObNixilisOfTheBlackOathEffect1(), 2));
// -2: Put a 5/5 black Demon creature token with flying onto the battlefield. You lose 2 life.
- LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new CreateTokenEffect(new ObNixilisDemonToken()), -2);
+ LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new CreateTokenEffect(new DemonToken()), -2);
loyaltyAbility.addEffect(new LoseLifeSourceControllerEffect(2));
this.addAbility(loyaltyAbility);
// -8: You get an emblem with "{1}{B}, Sacrifice a creature: You gain X life and draw X cards, where X is the sacrificed creature's power."
this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new ObNixilisOfTheBlackOathEmblem()), -8));
-
+
// Ob Nixilis of the Black Oath can be your commander.
this.addAbility(CanBeYourCommanderAbility.getInstance());
}
@@ -114,7 +109,7 @@ class ObNixilisOfTheBlackOathEffect1 extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
int loseLife = 0;
- for (UUID opponentId: game.getOpponents(source.getControllerId())) {
+ for (UUID opponentId : game.getOpponents(source.getControllerId())) {
Player opponent = game.getPlayer(opponentId);
if (opponent != null) {
loseLife += opponent.loseLife(1, game);
@@ -134,31 +129,16 @@ class ObNixilisOfTheBlackOathEffect1 extends OneShotEffect {
}
-class ObNixilisDemonToken extends Token {
-
- ObNixilisDemonToken() {
- super("Demon", "5/5 black Demon creature token with flying");
- setTokenType(1);
- setOriginalExpansionSetCode("C14");
- cardType.add(CardType.CREATURE);
- subtype.add("Demon");
-
- color.setBlack(true);
- power = new MageInt(5);
- toughness = new MageInt(5);
-
- addAbility(FlyingAbility.getInstance());
- }
-}
-
class ObNixilisOfTheBlackOathEmblem extends Emblem {
+
// You get an emblem with "{1}{B}, Sacrifice a creature: You gain X life and draw X cards, where X is the sacrificed creature's power."
+
public ObNixilisOfTheBlackOathEmblem() {
this.setName("EMBLEM: Ob Nixilis of the Black Oath");
DynamicValue xValue = new SacrificeCostCreaturesPower();
Effect effect = new GainLifeEffect(xValue);
effect.setText("You gain X life");
- Ability ability = new SimpleActivatedAbility(Zone.COMMAND, effect, new ManaCostsImpl("{1}{B}"));
+ Ability ability = new SimpleActivatedAbility(Zone.COMMAND, effect, new ManaCostsImpl("{1}{B}"));
ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent()));
effect = new DrawCardSourceControllerEffect(xValue);
effect.setText("and draw X cards, where X is the sacrificed creature's power");
diff --git a/Mage.Sets/src/mage/sets/commander2014/RushOfKnowledge.java b/Mage.Sets/src/mage/sets/commander2014/RushOfKnowledge.java
index fbaf91c4549..e288a020a36 100644
--- a/Mage.Sets/src/mage/sets/commander2014/RushOfKnowledge.java
+++ b/Mage.Sets/src/mage/sets/commander2014/RushOfKnowledge.java
@@ -28,15 +28,11 @@
package mage.sets.commander2014;
import java.util.UUID;
-import mage.abilities.Ability;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.dynamicvalue.common.HighestConvertedManaCostValue;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
-import mage.constants.Outcome;
import mage.constants.Rarity;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.players.Player;
/**
*
@@ -48,10 +44,10 @@ public class RushOfKnowledge extends CardImpl {
super(ownerId, 123, "Rush of Knowledge", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{4}{U}");
this.expansionSetCode = "C14";
-
// Draw cards equal to the highest converted mana cost among permanents you control.
- this.getSpellAbility().addEffect(new RushOfKnowledgeEffect());
-
+ DrawCardSourceControllerEffect effect = new DrawCardSourceControllerEffect(new HighestConvertedManaCostValue());
+ effect.setText("Draw cards equal to the highest converted mana cost among permanents you control");
+ this.getSpellAbility().addEffect(effect);
}
public RushOfKnowledge(final RushOfKnowledge card) {
@@ -63,41 +59,3 @@ public class RushOfKnowledge extends CardImpl {
return new RushOfKnowledge(this);
}
}
-
-class RushOfKnowledgeEffect extends OneShotEffect {
-
- public RushOfKnowledgeEffect() {
- super(Outcome.DrawCard);
- this.staticText = "Draw cards equal to the highest converted mana cost among permanents you control";
- }
-
- public RushOfKnowledgeEffect(final RushOfKnowledgeEffect effect) {
- super(effect);
- }
-
- @Override
- public RushOfKnowledgeEffect copy() {
- return new RushOfKnowledgeEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller != null) {
- int highCMC = 0;
- for (Permanent permanent : game.getBattlefield().getAllActivePermanents(controller.getId())) {
- if (permanent.getSpellAbility() != null) {
- int cmc = permanent.getSpellAbility().getManaCosts().convertedManaCost();
- if (cmc > highCMC) {
- highCMC = cmc;
- }
- }
- }
- if (highCMC > 0) {
- controller.drawCards(highCMC, game);
- }
- return true;
- }
- return false;
- }
-}
diff --git a/Mage.Sets/src/mage/sets/commander2014/ScrapMastery.java b/Mage.Sets/src/mage/sets/commander2014/ScrapMastery.java
index 95c2ae286fc..badafeb966f 100644
--- a/Mage.Sets/src/mage/sets/commander2014/ScrapMastery.java
+++ b/Mage.Sets/src/mage/sets/commander2014/ScrapMastery.java
@@ -28,7 +28,6 @@
package mage.sets.commander2014;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
@@ -56,7 +55,6 @@ public class ScrapMastery extends CardImpl {
super(ownerId, 38, "Scrap Mastery", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{R}{R}");
this.expansionSetCode = "C14";
-
// Each player exiles all artifact cards from his or her graveyard, then sacrifices all artifacts he or she controls, then puts all cards he or she exiled this way onto the battlefield.
this.getSpellAbility().addEffect(new ScrapMasteryEffect());
}
@@ -91,38 +89,30 @@ class ScrapMasteryEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- Map> exiledCards = new HashMap<>();
+ Map> exiledCards = new HashMap<>();
// exile artifacts from graveyard
- for (UUID playerId: controller.getInRange()) {
+ for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
Player player = game.getPlayer(playerId);
if (player != null) {
- Set cards = new HashSet<>();
- for (Card card: player.getGraveyard().getCards(new FilterArtifactCard(), game)) {
- cards.add(card.getId());
- player.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.GRAVEYARD, true);
- }
+ Set cards = player.getGraveyard().getCards(new FilterArtifactCard(), game);
+ controller.moveCards(cards, Zone.EXILED, source, game);
exiledCards.put(player.getId(), cards);
}
}
// sacrifice all artifacts
- for (UUID playerId: controller.getInRange()) {
+ for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
Player player = game.getPlayer(playerId);
if (player != null) {
- for (Permanent permanent: game.getBattlefield().getAllActivePermanents(new FilterArtifactPermanent(), playerId, game)) {
+ for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterArtifactPermanent(), playerId, game)) {
permanent.sacrifice(source.getSourceId(), game);
}
}
}
// puts all cards he or she exiled this way onto the battlefield
- for (UUID playerId: controller.getInRange()) {
+ for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
Player player = game.getPlayer(playerId);
if (player != null) {
- for (UUID cardId: exiledCards.get(playerId)) {
- Card card = game.getCard(cardId);
- if (card != null) {
- player.putOntoBattlefieldWithInfo(card, game, Zone.EXILED, cardId);
- }
- }
+ controller.moveCards(exiledCards.get(playerId), Zone.BATTLEFIELD, source, game);
}
}
return true;
diff --git a/Mage.Sets/src/mage/sets/commander2014/SongOfTheDryads.java b/Mage.Sets/src/mage/sets/commander2014/SongOfTheDryads.java
index 8af2e622f3c..f37d1508087 100644
--- a/Mage.Sets/src/mage/sets/commander2014/SongOfTheDryads.java
+++ b/Mage.Sets/src/mage/sets/commander2014/SongOfTheDryads.java
@@ -30,14 +30,20 @@ package mage.sets.commander2014;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.common.AttachEffect;
-import mage.abilities.effects.common.continuous.BecomesBasicLandEnchantedEffect;
import mage.abilities.keyword.EnchantAbility;
+import mage.abilities.mana.GreenManaAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Layer;
import mage.constants.Outcome;
import mage.constants.Rarity;
+import mage.constants.SubLayer;
import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
/**
@@ -51,7 +57,6 @@ public class SongOfTheDryads extends CardImpl {
this.expansionSetCode = "C14";
this.subtype.add("Aura");
-
// Enchant permanent
TargetPermanent auraTarget = new TargetPermanent();
this.getSpellAbility().addTarget(auraTarget);
@@ -60,7 +65,7 @@ public class SongOfTheDryads extends CardImpl {
this.addAbility(ability);
// Enchanted permanent is a colorless Forest land.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesBasicLandEnchantedEffect("Forest")));
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesColorlessForestLandEffect()));
}
@@ -73,3 +78,61 @@ public class SongOfTheDryads extends CardImpl {
return new SongOfTheDryads(this);
}
}
+
+class BecomesColorlessForestLandEffect extends ContinuousEffectImpl {
+
+ public BecomesColorlessForestLandEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Detriment);
+ this.staticText = "Enchanted permanent is a colorless Forest land";
+ }
+
+ public BecomesColorlessForestLandEffect(final BecomesColorlessForestLandEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return false;
+ }
+
+ @Override
+ public BecomesColorlessForestLandEffect copy() {
+ return new BecomesColorlessForestLandEffect(this);
+ }
+
+ @Override
+ public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
+ Permanent enchantment = game.getPermanent(source.getSourceId());
+ if (enchantment != null && enchantment.getAttachedTo() != null) {
+ Permanent permanent = game.getPermanent(enchantment.getAttachedTo());
+ if (permanent != null) {
+ switch (layer) {
+ case ColorChangingEffects_5:
+ permanent.getColor(game).setWhite(false);
+ permanent.getColor(game).setGreen(false);
+ permanent.getColor(game).setBlack(false);
+ permanent.getColor(game).setBlue(false);
+ permanent.getColor(game).setRed(false);
+ break;
+ case AbilityAddingRemovingEffects_6:
+ permanent.removeAllAbilities(source.getSourceId(), game);
+ permanent.addAbility(new GreenManaAbility(), source.getSourceId(), game);
+ break;
+ case TypeChangingEffects_4:
+ permanent.getCardType().clear();
+ permanent.getCardType().add(CardType.LAND);
+ permanent.getSubtype().clear();
+ permanent.getSubtype().add("Forest");
+ break;
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean hasLayer(Layer layer) {
+ return layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.ColorChangingEffects_5 || layer == Layer.TypeChangingEffects_4;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2014/SylvanOffering.java b/Mage.Sets/src/mage/sets/commander2014/SylvanOffering.java
index 069978000ba..fab6eea4bed 100644
--- a/Mage.Sets/src/mage/sets/commander2014/SylvanOffering.java
+++ b/Mage.Sets/src/mage/sets/commander2014/SylvanOffering.java
@@ -41,6 +41,7 @@ import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.game.Game;
import mage.game.permanent.token.SpiritWhiteToken;
+import mage.game.permanent.token.ElfToken;
import mage.game.permanent.token.Token;
import mage.players.Player;
import mage.target.Target;
@@ -149,28 +150,13 @@ class SylvanOfferingEffect2 extends OneShotEffect {
Player opponent = game.getPlayer(target.getFirstTarget());
if (opponent != null) {
int xValue = source.getManaCostsToPay().getX();
- Effect effect = new CreateTokenTargetEffect(new SylvanOfferingElfWarriorToken(), xValue);
+ Effect effect = new CreateTokenTargetEffect(new ElfToken(), xValue);
effect.setTargetPointer(new FixedTarget(opponent.getId()));
effect.apply(game, source);
- new CreateTokenEffect(new SylvanOfferingElfWarriorToken(), xValue).apply(game, source);
+ new CreateTokenEffect(new ElfToken(), xValue).apply(game, source);
return true;
}
}
return false;
}
}
-
-class SylvanOfferingElfWarriorToken extends Token {
-
- public SylvanOfferingElfWarriorToken() {
- super("Elf Warrior", "1/1 green Elf Warrior creature token");
- setOriginalExpansionSetCode("C14");
- cardType.add(CardType.CREATURE);
- subtype.add("Elf");
- subtype.add("Warrior");
- color.setGreen(true);
- power = new MageInt(1);
- toughness = new MageInt(1);
-
- }
-}
diff --git a/Mage.Sets/src/mage/sets/commander2014/TeferiTemporalArchmage.java b/Mage.Sets/src/mage/sets/commander2014/TeferiTemporalArchmage.java
index bbe6c7346a5..bf6477bc1ea 100644
--- a/Mage.Sets/src/mage/sets/commander2014/TeferiTemporalArchmage.java
+++ b/Mage.Sets/src/mage/sets/commander2014/TeferiTemporalArchmage.java
@@ -31,14 +31,13 @@ import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.CanBeYourCommanderAbility;
-import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.common.GetEmblemEffect;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.effects.common.UntapTargetEffect;
-import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.constants.AsThoughEffectType;
import mage.constants.CardType;
@@ -46,12 +45,10 @@ import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
-import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.command.Emblem;
-import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
/**
@@ -65,21 +62,20 @@ public class TeferiTemporalArchmage extends CardImpl {
this.expansionSetCode = "C14";
this.subtype.add("Teferi");
-
- this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(5)), false));
+ this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5));
// +1: Look at the top two cards of your library. Put one of them into your hand and the other on the bottom of your library.
this.addAbility(new LoyaltyAbility(new LookLibraryAndPickControllerEffect(
new StaticValue(2), false, new StaticValue(1), new FilterCard(), Zone.LIBRARY, false, false), 1));
// -1: Untap up to four target permanents.
- LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new UntapTargetEffect(), -1);
- loyaltyAbility.addTarget(new TargetPermanent(0,4, new FilterPermanent(), false));
+ LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new UntapTargetEffect(), -1);
+ loyaltyAbility.addTarget(new TargetPermanent(0, 4, new FilterPermanent(), false));
this.addAbility(loyaltyAbility);
// -10: You get an emblem with "You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant."
this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new TeferiTemporalArchmageEmblem()), -10));
-
+
// Teferi, Temporal Archmage can be your commander.
this.addAbility(CanBeYourCommanderAbility.getInstance());
@@ -96,6 +92,7 @@ public class TeferiTemporalArchmage extends CardImpl {
}
class TeferiTemporalArchmageEmblem extends Emblem {
+
// "You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant."
public TeferiTemporalArchmageEmblem() {
this.setName("EMBLEM: Teferi, Temporal Archmage");
@@ -114,7 +111,6 @@ class TeferiTemporalArchmageAsThoughEffect extends AsThoughEffectImpl {
super(effect);
}
-
@Override
public boolean apply(Game game, Ability source) {
return true;
@@ -135,7 +131,7 @@ class TeferiTemporalArchmageAsThoughEffect extends AsThoughEffectImpl {
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
- return false; // Not used
+ return false; // Not used
}
}
diff --git a/Mage.Sets/src/mage/sets/commander2014/TyrantsFamiliar.java b/Mage.Sets/src/mage/sets/commander2014/TyrantsFamiliar.java
index df09c2e46e2..38017589d07 100644
--- a/Mage.Sets/src/mage/sets/commander2014/TyrantsFamiliar.java
+++ b/Mage.Sets/src/mage/sets/commander2014/TyrantsFamiliar.java
@@ -38,7 +38,6 @@ import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
-import mage.constants.AbilityType;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.filter.common.FilterCreaturePermanent;
@@ -52,6 +51,8 @@ import mage.target.common.TargetCreaturePermanent;
*/
public class TyrantsFamiliar extends CardImpl {
+ private final UUID originalId;
+
public TyrantsFamiliar(UUID ownerId) {
super(ownerId, 39, "Tyrant's Familiar", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{R}{R}");
this.expansionSetCode = "C14";
@@ -62,30 +63,32 @@ public class TyrantsFamiliar extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
-
+
// Haste
this.addAbility(HasteAbility.getInstance());
-
+
// Lieutenant - As long as you control your commander, Tyrant's Familiar gets +2/+2 and has "Whenever Tyrant's Familiar attacks, it deals 7 damage to target creature defending player controls."
Ability gainedAbility = new AttacksTriggeredAbility(new DamageTargetEffect(7), false);
gainedAbility.addTarget(new TargetCreaturePermanent());
ContinuousEffect effect = new GainAbilitySourceEffect(gainedAbility);
effect.setText("and has \"Whenever {this} attacks, it deals 7 damage to target creature defending player controls\"");
+ originalId = gainedAbility.getOriginalId();
this.addAbility(new LieutenantAbility(effect));
}
public TyrantsFamiliar(final TyrantsFamiliar card) {
super(card);
+ this.originalId = card.originalId;
}
@Override
public TyrantsFamiliar copy() {
return new TyrantsFamiliar(this);
}
-
+
@Override
public void adjustTargets(Ability ability, Game game) {
- if (ability.getAbilityType().equals(AbilityType.TRIGGERED)) {
+ if (ability.getOriginalId().equals(originalId)) {
ability.getTargets().clear();
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature defending player controls");
UUID defenderId = game.getCombat().getDefenderId(ability.getSourceId());
diff --git a/Mage.Sets/src/mage/sets/commander2014/WakeTheDead.java b/Mage.Sets/src/mage/sets/commander2014/WakeTheDead.java
index f196efa60cf..eb7e9438ae7 100644
--- a/Mage.Sets/src/mage/sets/commander2014/WakeTheDead.java
+++ b/Mage.Sets/src/mage/sets/commander2014/WakeTheDead.java
@@ -33,13 +33,13 @@ import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.SpellAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
-import mage.abilities.dynamicvalue.common.GetXValue;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.SacrificeTargetEffect;
-import mage.cards.Card;
import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
@@ -64,7 +64,6 @@ public class WakeTheDead extends CardImpl {
super(ownerId, 31, "Wake the Dead", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{X}{B}{B}");
this.expansionSetCode = "C14";
-
// Cast Wake the Dead only during combat on an opponent's turn.
Ability ability = new SimpleStaticAbility(Zone.ALL, new WakeTheDeadEffect());
ability.setRuleAtTheTop(true);
@@ -72,7 +71,7 @@ public class WakeTheDead extends CardImpl {
// Return X target creature cards from your graveyard to the battlefield. Sacrifice those creatures at the beginning of the next end step.
this.getSpellAbility().addEffect(new WakeTheDeadReturnFromGraveyardToBattlefieldTargetEffect());
- this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0,Integer.MAX_VALUE, new FilterCreatureCard("creature cards from your graveyard")));
+ this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, new FilterCreatureCard("creature cards from your graveyard")));
}
@Override
@@ -80,7 +79,7 @@ public class WakeTheDead extends CardImpl {
if (ability instanceof SpellAbility) {
int xValue = ability.getManaCostsToPay().getX();
ability.getTargets().clear();
- ability.addTarget(new TargetCardInYourGraveyard(xValue,xValue, new FilterCreatureCard("creature cards from your graveyard")));
+ ability.addTarget(new TargetCardInYourGraveyard(xValue, xValue, new FilterCreatureCard("creature cards from your graveyard")));
}
}
@@ -150,26 +149,22 @@ class WakeTheDeadReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEff
@Override
public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- if (player != null) {
- for (UUID targetId : getTargetPointer().getTargets(game, source)) {
- Card card = game.getCard(targetId);
- if (card != null) {
- if (player.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId(), false)) {
- Permanent permanent = game.getPermanent(source.getSourceId());
- if (permanent != null) {
- permanent.changeControllerId(source.getControllerId(), game);
- Effect effect = new SacrificeTargetEffect("Sacrifice those creatures at the beginning of the next end step");
- effect.setTargetPointer(new FixedTarget(permanent.getId()));
- DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect);
- delayedAbility.setSourceId(source.getSourceId());
- delayedAbility.setControllerId(source.getControllerId());
- delayedAbility.setSourceObject(source.getSourceObject(game), game);
- game.addDelayedTriggeredAbility(delayedAbility);
- }
-
- }
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ Cards cards = new CardsImpl(getTargetPointer().getTargets(game, source));
+ controller.moveCards(cards, Zone.BATTLEFIELD, source, game);
+ for (UUID targetId : cards) {
+ Permanent creature = game.getPermanent(targetId);
+ if (creature != null) {
+ Effect effect = new SacrificeTargetEffect("Sacrifice those creatures at the beginning of the next end step", source.getControllerId());
+ effect.setTargetPointer(new FixedTarget(creature, game));
+ DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect);
+ delayedAbility.setSourceId(source.getSourceId());
+ delayedAbility.setControllerId(source.getControllerId());
+ delayedAbility.setSourceObject(source.getSourceObject(game), game);
+ game.addDelayedTriggeredAbility(delayedAbility);
}
+
}
return true;
}
diff --git a/Mage.Sets/src/mage/sets/commander2014/WarmongerHellkite.java b/Mage.Sets/src/mage/sets/commander2014/WarmongerHellkite.java
index facef8d227a..450a026bcab 100644
--- a/Mage.Sets/src/mage/sets/commander2014/WarmongerHellkite.java
+++ b/Mage.Sets/src/mage/sets/commander2014/WarmongerHellkite.java
@@ -62,7 +62,7 @@ public class WarmongerHellkite extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// All creatures attack each combat if able.
- Effect effect = new AttacksIfAbleAllEffect(new FilterCreaturePermanent("creatures"));
+ Effect effect = new AttacksIfAbleAllEffect(new FilterCreaturePermanent("creatures"), Duration.WhileOnBattlefield, true);
effect.setText("All creatures attack each combat if able");
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
diff --git a/Mage.Sets/src/mage/sets/commander2014/WaveOfVitriol.java b/Mage.Sets/src/mage/sets/commander2014/WaveOfVitriol.java
index 19994d3145c..bb5bb951b94 100644
--- a/Mage.Sets/src/mage/sets/commander2014/WaveOfVitriol.java
+++ b/Mage.Sets/src/mage/sets/commander2014/WaveOfVitriol.java
@@ -28,12 +28,15 @@
package mage.sets.commander2014;
import java.util.HashMap;
+import java.util.LinkedHashSet;
import java.util.Map;
+import java.util.Set;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
-import mage.cards.Card;
import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
@@ -86,9 +89,9 @@ class WaveOfVitriolEffect extends OneShotEffect {
new CardTypePredicate(CardType.LAND),
Predicates.not(new SupertypePredicate("Basic"))
)
-
));
}
+
public WaveOfVitriolEffect() {
super(Outcome.Benefit);
this.staticText = "Each player sacrifices all artifacts, enchantments, and nonbasic lands he or she controls. For each land sacrificed this way, its controller may search his or her library for a basic land card and put it onto the battlefield tapped. Then each player who searched his or her library this way shuffles it";
@@ -108,11 +111,11 @@ class WaveOfVitriolEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
Map sacrificedLands = new HashMap<>();
- for(UUID playerId: controller.getInRange()) {
+ for (UUID playerId : controller.getInRange()) {
Player player = game.getPlayer(playerId);
if (player != null) {
int count = 0;
- for(Permanent permanent: game.getBattlefield().getAllActivePermanents(filter, playerId, game)) {
+ for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, playerId, game)) {
if (permanent.sacrifice(source.getSourceId(), game) && permanent.getCardType().contains(CardType.LAND)) {
count++;
}
@@ -123,25 +126,19 @@ class WaveOfVitriolEffect extends OneShotEffect {
}
}
game.getState().handleSimultaneousEvent(game);
- for(Map.Entry entry: sacrificedLands.entrySet()) {
+ Cards toBattlefield = new CardsImpl();
+ Set playersToShuffle = new LinkedHashSet<>();
+ for (Map.Entry entry : sacrificedLands.entrySet()) {
if (entry.getKey().chooseUse(Outcome.PutLandInPlay, "Search your library for up to " + entry.getValue() + " basic lands?", source, game)) {
Target target = new TargetCardInLibrary(0, entry.getValue(), new FilterBasicLandCard());
entry.getKey().chooseTarget(outcome, target, source, game);
- for(UUID targetId: target.getTargets()) {
- Card card = game.getCard(targetId);
- if (card != null) {
- entry.getKey().putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true);
- }
- }
- entry.getKey().shuffleLibrary(game);
- } else {
- entry.setValue(0);
+ toBattlefield.addAll(target.getTargets());
+ playersToShuffle.add(entry.getKey());
}
}
- for(Map.Entry entry: sacrificedLands.entrySet()) {
- if (entry.getValue() > 0) {
- entry.getKey().shuffleLibrary(game);
- }
+ controller.moveCards(toBattlefield.getCards(game), Zone.BATTLEFIELD, source, game, true, false, true, null);
+ for (Player player : playersToShuffle) {
+ player.shuffleLibrary(game);
}
return true;
diff --git a/Mage.Sets/src/mage/sets/commander2014/WordOfSeizing.java b/Mage.Sets/src/mage/sets/commander2014/WordOfSeizing.java
index 2688c3eb3c0..f503d13fd3d 100644
--- a/Mage.Sets/src/mage/sets/commander2014/WordOfSeizing.java
+++ b/Mage.Sets/src/mage/sets/commander2014/WordOfSeizing.java
@@ -50,17 +50,16 @@ public class WordOfSeizing extends CardImpl {
super(ownerId, 185, "Word of Seizing", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{3}{R}{R}");
this.expansionSetCode = "C14";
-
// Split second
this.addAbility(new SplitSecondAbility());
// Untap target permanent and gain control of it until end of turn. It gains haste until end of turn.
this.getSpellAbility().addEffect(new UntapTargetEffect());
Effect effect = new GainControlTargetEffect(Duration.EndOfTurn);
- effect.setText("and gain control of it until end of turn. ");
+ effect.setText("and gain control of it until end of turn");
this.getSpellAbility().addEffect(effect);
effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn);
- effect.setText("It gains haste until end of turn. ");
+ effect.setText("It gains haste until end of turn");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetPermanent());
diff --git a/Mage.Sets/src/mage/sets/commander2015/AEtherize.java b/Mage.Sets/src/mage/sets/commander2015/AEtherize.java
new file mode 100644
index 00000000000..685ee6dd1f5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/AEtherize.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AEtherize extends mage.sets.gatecrash.AEtherize {
+
+ public AEtherize(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 85;
+ this.expansionSetCode = "C15";
+ }
+
+ public AEtherize(final AEtherize card) {
+ super(card);
+ }
+
+ @Override
+ public AEtherize copy() {
+ return new AEtherize(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/AEthersnatch.java b/Mage.Sets/src/mage/sets/commander2015/AEthersnatch.java
new file mode 100644
index 00000000000..c54aef189ca
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/AEthersnatch.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.game.Game;
+import mage.game.stack.Spell;
+import mage.players.Player;
+import mage.target.TargetSpell;
+
+/**
+ *
+ * @author emerald000
+ */
+public class AEthersnatch extends CardImpl {
+
+ public AEthersnatch(UUID ownerId) {
+ super(ownerId, 9, "AEthersnatch", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{4}{U}{U}");
+ this.expansionSetCode = "C15";
+
+ // Gain control of target spell. You may choose new targets for it.
+ this.getSpellAbility().addEffect(new AEthersnatchEffect());
+ this.getSpellAbility().addTarget(new TargetSpell());
+ }
+
+ public AEthersnatch(final AEthersnatch card) {
+ super(card);
+ }
+
+ @Override
+ public AEthersnatch copy() {
+ return new AEthersnatch(this);
+ }
+}
+
+class AEthersnatchEffect extends OneShotEffect {
+
+ AEthersnatchEffect() {
+ super(Outcome.GainControl);
+ this.staticText = "Gain control of target spell. You may choose new targets for it";
+ }
+
+ AEthersnatchEffect(final AEthersnatchEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public AEthersnatchEffect copy() {
+ return new AEthersnatchEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Spell spell = game.getStack().getSpell(this.getTargetPointer().getFirst(game, source));
+ if (controller != null && spell != null) {
+ spell.setControllerId(controller.getId());
+ spell.chooseNewTargets(game, controller.getId(), false, false, null);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/AcidicSlime.java b/Mage.Sets/src/mage/sets/commander2015/AcidicSlime.java
new file mode 100644
index 00000000000..945b3012712
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/AcidicSlime.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AcidicSlime extends mage.sets.magic2010.AcidicSlime {
+
+ public AcidicSlime(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 173;
+ this.expansionSetCode = "C15";
+ }
+
+ public AcidicSlime(final AcidicSlime card) {
+ super(card);
+ }
+
+ @Override
+ public AcidicSlime copy() {
+ return new AcidicSlime(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/ActOfAggression.java b/Mage.Sets/src/mage/sets/commander2015/ActOfAggression.java
new file mode 100644
index 00000000000..2720002549c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/ActOfAggression.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ActOfAggression extends mage.sets.newphyrexia.ActOfAggression {
+
+ public ActOfAggression(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 141;
+ this.expansionSetCode = "C15";
+ }
+
+ public ActOfAggression(final ActOfAggression card) {
+ super(card);
+ }
+
+ @Override
+ public ActOfAggression copy() {
+ return new ActOfAggression(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/AjanisChosen.java b/Mage.Sets/src/mage/sets/commander2015/AjanisChosen.java
new file mode 100644
index 00000000000..aac099f95e1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/AjanisChosen.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AjanisChosen extends mage.sets.magic2014.AjanisChosen {
+
+ public AjanisChosen(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 57;
+ this.expansionSetCode = "C15";
+ }
+
+ public AjanisChosen(final AjanisChosen card) {
+ super(card);
+ }
+
+ @Override
+ public AjanisChosen copy() {
+ return new AjanisChosen(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/AltarsReap.java b/Mage.Sets/src/mage/sets/commander2015/AltarsReap.java
new file mode 100644
index 00000000000..70e3023ad7e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/AltarsReap.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AltarsReap extends mage.sets.innistrad.AltarsReap {
+
+ public AltarsReap(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 112;
+ this.expansionSetCode = "C15";
+ }
+
+ public AltarsReap(final AltarsReap card) {
+ super(card);
+ }
+
+ @Override
+ public AltarsReap copy() {
+ return new AltarsReap(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/AmbitionsCost.java b/Mage.Sets/src/mage/sets/commander2015/AmbitionsCost.java
new file mode 100644
index 00000000000..b0ebdb59ca0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/AmbitionsCost.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AmbitionsCost extends mage.sets.eighthedition.AmbitionsCost {
+
+ public AmbitionsCost(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 113;
+ this.expansionSetCode = "C15";
+ }
+
+ public AmbitionsCost(final AmbitionsCost card) {
+ super(card);
+ }
+
+ @Override
+ public AmbitionsCost copy() {
+ return new AmbitionsCost(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/AncientAmphitheater.java b/Mage.Sets/src/mage/sets/commander2015/AncientAmphitheater.java
new file mode 100644
index 00000000000..21a5f92ec76
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/AncientAmphitheater.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AncientAmphitheater extends mage.sets.lorwyn.AncientAmphitheater {
+
+ public AncientAmphitheater(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 276;
+ this.expansionSetCode = "C15";
+ }
+
+ public AncientAmphitheater(final AncientAmphitheater card) {
+ super(card);
+ }
+
+ @Override
+ public AncientAmphitheater copy() {
+ return new AncientAmphitheater(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/AncientCraving.java b/Mage.Sets/src/mage/sets/commander2015/AncientCraving.java
new file mode 100644
index 00000000000..ec231cde4a8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/AncientCraving.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AncientCraving extends mage.sets.starter1999.AncientCraving {
+
+ public AncientCraving(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 114;
+ this.expansionSetCode = "C15";
+ }
+
+ public AncientCraving(final AncientCraving card) {
+ super(card);
+ }
+
+ @Override
+ public AncientCraving copy() {
+ return new AncientCraving(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/AngelOfSerenity.java b/Mage.Sets/src/mage/sets/commander2015/AngelOfSerenity.java
new file mode 100644
index 00000000000..f20decba2c1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/AngelOfSerenity.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AngelOfSerenity extends mage.sets.returntoravnica.AngelOfSerenity {
+
+ public AngelOfSerenity(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 58;
+ this.expansionSetCode = "C15";
+ }
+
+ public AngelOfSerenity(final AngelOfSerenity card) {
+ super(card);
+ }
+
+ @Override
+ public AngelOfSerenity copy() {
+ return new AngelOfSerenity(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/AnyaMercilessAngel.java b/Mage.Sets/src/mage/sets/commander2015/AnyaMercilessAngel.java
new file mode 100644
index 00000000000..1bb34a90c3e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/AnyaMercilessAngel.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.dynamicvalue.MultipliedValue;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.IndestructibleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author emerald000
+ */
+public class AnyaMercilessAngel extends CardImpl {
+
+ public AnyaMercilessAngel(UUID ownerId) {
+ super(ownerId, 41, "Anya, Merciless Angel", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{3}{R}{W}");
+ this.expansionSetCode = "C15";
+ this.supertype.add("Legendary");
+ this.subtype.add("Angel");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Anya, Merciless Angel gets +3/+3 for each opponent whose life total is less than half his or her starting life total.
+ DynamicValue dValue = new MultipliedValue(new AnyaMercilessAngelDynamicValue(), 3);
+ Effect effect = new BoostSourceEffect(dValue, dValue, Duration.WhileOnBattlefield);
+ effect.setText("{this{ gets +3/+3 for each opponent whose life total is less than half his or her starting life total");
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(dValue, dValue, Duration.WhileOnBattlefield)));
+
+ // As long as an opponent's life total is less than half his or her starting life total, Anya has indestructible.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD,
+ new ConditionalContinuousEffect(new GainAbilitySourceEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield),
+ AnyaMercilessAngelCondition.getInstance(),
+ "As long as an opponent's life total is less than half his or her starting life total, {this} has indestructible")));
+ }
+
+ public AnyaMercilessAngel(final AnyaMercilessAngel card) {
+ super(card);
+ }
+
+ @Override
+ public AnyaMercilessAngel copy() {
+ return new AnyaMercilessAngel(this);
+ }
+}
+
+class AnyaMercilessAngelDynamicValue implements DynamicValue {
+
+ @Override
+ public int calculate(Game game, Ability sourceAbility, Effect effect) {
+ int opponentCount = 0;
+ Player controller = game.getPlayer(sourceAbility.getControllerId());
+ if (controller != null) {
+ int startingLifeTotal = game.getLife();
+ for (UUID opponentId : game.getOpponents(controller.getId())) {
+ Player opponent = game.getPlayer(opponentId);
+ if (opponent != null && opponent.getLife() < startingLifeTotal / 2) {
+ opponentCount++;
+ }
+ }
+ }
+ return opponentCount;
+ }
+
+ @Override
+ public AnyaMercilessAngelDynamicValue copy() {
+ return new AnyaMercilessAngelDynamicValue();
+ }
+
+ @Override
+ public String getMessage() {
+ return "number of opponents whose life total is less than half his or her starting life total";
+ }
+
+ @Override
+ public String toString() {
+ return "X";
+ }
+}
+
+class AnyaMercilessAngelCondition implements Condition {
+
+ private static final AnyaMercilessAngelCondition fInstance = new AnyaMercilessAngelCondition();
+
+ public static AnyaMercilessAngelCondition getInstance() {
+ return fInstance;
+ };
+
+ private AnyaMercilessAngelCondition() {}
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return new AnyaMercilessAngelDynamicValue().calculate(game, source, null) > 0;
+ }
+
+ @Override
+ public String toString() {
+ return "an opponent's life total is less than half his or her starting life total";
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/Arachnogenesis.java b/Mage.Sets/src/mage/sets/commander2015/Arachnogenesis.java
new file mode 100644
index 00000000000..3f500fc132e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/Arachnogenesis.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.PreventAllDamageByAllEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.Game;
+import mage.game.combat.CombatGroup;
+import mage.game.permanent.token.SpiderToken;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Arachnogenesis extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("non-Spider creatures");
+
+ static {
+ filter.add(Predicates.not(new SubtypePredicate("Spider")));
+ }
+
+ public Arachnogenesis(UUID ownerId) {
+ super(ownerId, 32, "Arachnogenesis", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{2}{G}");
+ this.expansionSetCode = "C15";
+
+ // Put X 1/2 green Spider creature tokens with reach onto the battlefield, where X is the number of creatures attacking you.
+ Effect effect = new CreateTokenEffect(new SpiderToken(), new ArachnogenesisCount());
+ effect.setText("Put X 1/2 green Spider creature tokens with reach onto the battlefield, where X is the number of creatures attacking you");
+ this.getSpellAbility().addEffect(effect);
+
+ // Prevent all combat damage that would be dealt this turn by non-Spider creatures.
+ this.getSpellAbility().addEffect(new PreventAllDamageByAllEffect(filter, Duration.EndOfTurn, true));
+ }
+
+ public Arachnogenesis(final Arachnogenesis card) {
+ super(card);
+ }
+
+ @Override
+ public Arachnogenesis copy() {
+ return new Arachnogenesis(this);
+ }
+}
+
+class ArachnogenesisCount implements DynamicValue {
+
+ @Override
+ public int calculate(Game game, Ability sourceAbility, Effect effect) {
+ int count = 0;
+ for (CombatGroup combatGroup : game.getCombat().getGroups()) {
+ if (combatGroup.getDefenderId().equals(sourceAbility.getControllerId())) {
+ count += combatGroup.getAttackers().size();
+ }
+ }
+ return count;
+ }
+
+ @Override
+ public DynamicValue copy() {
+ return this;
+ }
+
+ @Override
+ public String getMessage() {
+ return "creatures attacking you";
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/commander2015/ArbiterOfKnollridge.java b/Mage.Sets/src/mage/sets/commander2015/ArbiterOfKnollridge.java
new file mode 100644
index 00000000000..9c0a178294d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/ArbiterOfKnollridge.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ArbiterOfKnollridge extends mage.sets.lorwyn.ArbiterOfKnollridge {
+
+ public ArbiterOfKnollridge(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 59;
+ this.expansionSetCode = "C15";
+ }
+
+ public ArbiterOfKnollridge(final ArbiterOfKnollridge card) {
+ super(card);
+ }
+
+ @Override
+ public ArbiterOfKnollridge copy() {
+ return new ArbiterOfKnollridge(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/ArborColossus.java b/Mage.Sets/src/mage/sets/commander2015/ArborColossus.java
new file mode 100644
index 00000000000..9c70b372a2a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/ArborColossus.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ArborColossus extends mage.sets.theros.ArborColossus {
+
+ public ArborColossus(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 174;
+ this.expansionSetCode = "C15";
+ }
+
+ public ArborColossus(final ArborColossus card) {
+ super(card);
+ }
+
+ @Override
+ public ArborColossus copy() {
+ return new ArborColossus(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/ArjunTheShiftingFlame.java b/Mage.Sets/src/mage/sets/commander2015/ArjunTheShiftingFlame.java
new file mode 100644
index 00000000000..2c146818d31
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/ArjunTheShiftingFlame.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SpellCastControllerTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.TargetCard;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ArjunTheShiftingFlame extends CardImpl {
+
+ public ArjunTheShiftingFlame(UUID ownerId) {
+ super(ownerId, 42, "Arjun, the Shifting Flame", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{4}{U}{R}");
+ this.expansionSetCode = "C15";
+ this.supertype.add("Legendary");
+ this.subtype.add("Sphinx");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Whenever you cast a spell, put the cards in your hand on the bottom of your library in any order, then draw that many cards.
+ this.addAbility(new SpellCastControllerTriggeredAbility(new ArjunTheShiftingFlameEffect(), false));
+ }
+
+ public ArjunTheShiftingFlame(final ArjunTheShiftingFlame card) {
+ super(card);
+ }
+
+ @Override
+ public ArjunTheShiftingFlame copy() {
+ return new ArjunTheShiftingFlame(this);
+ }
+}
+
+class ArjunTheShiftingFlameEffect extends OneShotEffect {
+
+ public ArjunTheShiftingFlameEffect() {
+ super(Outcome.Neutral);
+ staticText = "put the cards in your hand on the bottom of your library in any order, then draw that many cards";
+ }
+
+ public ArjunTheShiftingFlameEffect(final ArjunTheShiftingFlameEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player you = game.getPlayer(source.getControllerId());
+ if (you != null) {
+ int count = you.getHand().size();
+ Cards cards = new CardsImpl();
+ for (Card card : you.getHand().getCards(game)) {
+ cards.add(card.getId());
+ }
+ TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library"));
+ while (you.canRespond() && cards.size() > 1) {
+ you.choose(Outcome.Neutral, cards, target, game);
+ Card card = cards.get(target.getFirstTarget(), game);
+ if (card != null) {
+ cards.remove(card);
+ card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false);
+ }
+ target.clearChosen();
+ }
+ if (cards.size() == 1) {
+ Card card = cards.get(cards.iterator().next(), game);
+ card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false);
+ }
+ you.getHand().clear();
+ you.drawCards(count, game);
+ }
+ return true;
+ }
+
+ @Override
+ public ArjunTheShiftingFlameEffect copy() {
+ return new ArjunTheShiftingFlameEffect(this);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/commander2015/AuraOfSilence.java b/Mage.Sets/src/mage/sets/commander2015/AuraOfSilence.java
new file mode 100644
index 00000000000..bde64e9122e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/AuraOfSilence.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AuraOfSilence extends mage.sets.weatherlight.AuraOfSilence {
+
+ public AuraOfSilence(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 60;
+ this.expansionSetCode = "C15";
+ }
+
+ public AuraOfSilence(final AuraOfSilence card) {
+ super(card);
+ }
+
+ @Override
+ public AuraOfSilence copy() {
+ return new AuraOfSilence(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/AwakenTheSkyTyrant.java b/Mage.Sets/src/mage/sets/commander2015/AwakenTheSkyTyrant.java
new file mode 100644
index 00000000000..8f9a09481cb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/AwakenTheSkyTyrant.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.token.DragonToken2;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AwakenTheSkyTyrant extends CardImpl {
+
+ public AwakenTheSkyTyrant(UUID ownerId) {
+ super(ownerId, 24, "Awaken the Sky Tyrant", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}");
+ this.expansionSetCode = "C15";
+
+ // When a source an opponent controls deals damage to you, sacrifice Awaken the Sky Tyrant. If you do, put a 5/5 red Dragon creature token with flying onto the battlefield.
+ this.addAbility(new AwakenTheSkyTyrantTriggeredAbility());
+ }
+
+ public AwakenTheSkyTyrant(final AwakenTheSkyTyrant card) {
+ super(card);
+ }
+
+ @Override
+ public AwakenTheSkyTyrant copy() {
+ return new AwakenTheSkyTyrant(this);
+ }
+}
+
+class AwakenTheSkyTyrantTriggeredAbility extends TriggeredAbilityImpl {
+
+ public AwakenTheSkyTyrantTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new DoIfCostPaid(new CreateTokenEffect(new DragonToken2(), 1), new SacrificeSourceCost(), null, false), false);
+ }
+
+ public AwakenTheSkyTyrantTriggeredAbility(final AwakenTheSkyTyrantTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @java.lang.Override
+ public AwakenTheSkyTyrantTriggeredAbility copy() {
+ return new AwakenTheSkyTyrantTriggeredAbility(this);
+ }
+
+ @java.lang.Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType().equals(GameEvent.EventType.DAMAGED_PLAYER);
+ }
+
+ @java.lang.Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (event.getTargetId().equals(controllerId)) {
+ UUID sourceControllerId = game.getControllerId(event.getSourceId());
+ if (sourceControllerId != null && game.getOpponents(getControllerId()).contains(sourceControllerId)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @java.lang.Override
+ public String getRule() {
+ return "When a source an opponent controls deals damage to you, " + super.getRule();
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BaneOfProgress.java b/Mage.Sets/src/mage/sets/commander2015/BaneOfProgress.java
new file mode 100644
index 00000000000..470b1b0d020
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BaneOfProgress.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BaneOfProgress extends mage.sets.commander2013.BaneOfProgress {
+
+ public BaneOfProgress(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 175;
+ this.expansionSetCode = "C15";
+ }
+
+ public BaneOfProgress(final BaneOfProgress card) {
+ super(card);
+ }
+
+ @Override
+ public BaneOfProgress copy() {
+ return new BaneOfProgress(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BanishingLight.java b/Mage.Sets/src/mage/sets/commander2015/BanishingLight.java
new file mode 100644
index 00000000000..56f19fe651f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BanishingLight.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BanishingLight extends mage.sets.journeyintonyx.BanishingLight {
+
+ public BanishingLight(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 61;
+ this.expansionSetCode = "C15";
+ }
+
+ public BanishingLight(final BanishingLight card) {
+ super(card);
+ }
+
+ @Override
+ public BanishingLight copy() {
+ return new BanishingLight(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BansheeOfTheDreadChoir.java b/Mage.Sets/src/mage/sets/commander2015/BansheeOfTheDreadChoir.java
new file mode 100644
index 00000000000..061d769c8ce
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BansheeOfTheDreadChoir.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
+import mage.abilities.effects.common.discard.DiscardTargetEffect;
+import mage.abilities.keyword.MyriadAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BansheeOfTheDreadChoir extends CardImpl {
+
+ public BansheeOfTheDreadChoir(UUID ownerId) {
+ super(ownerId, 16, "Banshee of the Dread Choir", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
+ this.expansionSetCode = "C15";
+ this.subtype.add("Spirit");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Myriad
+ this.addAbility(new MyriadAbility());
+ // Whenever Banshee of the Dread Choir deals combat damage to a player, that player discards a card.
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(1), false, true));
+ }
+
+ public BansheeOfTheDreadChoir(final BansheeOfTheDreadChoir card) {
+ super(card);
+ }
+
+ @Override
+ public BansheeOfTheDreadChoir copy() {
+ return new BansheeOfTheDreadChoir(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BarrenMoor.java b/Mage.Sets/src/mage/sets/commander2015/BarrenMoor.java
new file mode 100644
index 00000000000..95a642c1e9d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BarrenMoor.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BarrenMoor extends mage.sets.onslaught.BarrenMoor {
+
+ public BarrenMoor(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 277;
+ this.expansionSetCode = "C15";
+ }
+
+ public BarrenMoor(final BarrenMoor card) {
+ super(card);
+ }
+
+ @Override
+ public BarrenMoor copy() {
+ return new BarrenMoor(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BarterInBlood.java b/Mage.Sets/src/mage/sets/commander2015/BarterInBlood.java
new file mode 100644
index 00000000000..88b004a8537
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BarterInBlood.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BarterInBlood extends mage.sets.avacynrestored.BarterInBlood {
+
+ public BarterInBlood(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 115;
+ this.expansionSetCode = "C15";
+ }
+
+ public BarterInBlood(final BarterInBlood card) {
+ super(card);
+ }
+
+ @Override
+ public BarterInBlood copy() {
+ return new BarterInBlood(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BasaltMonolith.java b/Mage.Sets/src/mage/sets/commander2015/BasaltMonolith.java
new file mode 100644
index 00000000000..8caccf89593
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BasaltMonolith.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BasaltMonolith extends mage.sets.limitedalpha.BasaltMonolith {
+
+ public BasaltMonolith(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 244;
+ this.expansionSetCode = "C15";
+ }
+
+ public BasaltMonolith(final BasaltMonolith card) {
+ super(card);
+ }
+
+ @Override
+ public BasaltMonolith copy() {
+ return new BasaltMonolith(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BastionProtector.java b/Mage.Sets/src/mage/sets/commander2015/BastionProtector.java
new file mode 100644
index 00000000000..0293878ca10
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BastionProtector.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
+import mage.abilities.keyword.IndestructibleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.CommanderPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BastionProtector extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("Commander creatures you control");
+
+ static {
+ filter.add(new CommanderPredicate());
+ }
+
+ public BastionProtector(UUID ownerId) {
+ super(ownerId, 1, "Bastion Protector", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}");
+ this.expansionSetCode = "C15";
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Commander creatures you control get +2/+2 and have indestructible.
+ Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(2, 2, Duration.WhileOnBattlefield, filter));
+ Effect effect = new GainAbilityControlledEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filter);
+ effect.setText("and have indestructible");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public BastionProtector(final BastionProtector card) {
+ super(card);
+ }
+
+ @Override
+ public BastionProtector copy() {
+ return new BastionProtector(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BeastmasterAscension.java b/Mage.Sets/src/mage/sets/commander2015/BeastmasterAscension.java
new file mode 100644
index 00000000000..86569950108
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BeastmasterAscension.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BeastmasterAscension extends mage.sets.zendikar.BeastmasterAscension {
+
+ public BeastmasterAscension(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 176;
+ this.expansionSetCode = "C15";
+ }
+
+ public BeastmasterAscension(final BeastmasterAscension card) {
+ super(card);
+ }
+
+ @Override
+ public BeastmasterAscension copy() {
+ return new BeastmasterAscension(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BidentOfThassa.java b/Mage.Sets/src/mage/sets/commander2015/BidentOfThassa.java
new file mode 100644
index 00000000000..3423b6dc814
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BidentOfThassa.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BidentOfThassa extends mage.sets.theros.BidentOfThassa {
+
+ public BidentOfThassa(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 86;
+ this.expansionSetCode = "C15";
+ }
+
+ public BidentOfThassa(final BidentOfThassa card) {
+ super(card);
+ }
+
+ @Override
+ public BidentOfThassa copy() {
+ return new BidentOfThassa(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BiomanticMastery.java b/Mage.Sets/src/mage/sets/commander2015/BiomanticMastery.java
new file mode 100644
index 00000000000..971dd0f6fe0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BiomanticMastery.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BiomanticMastery extends mage.sets.dissension.BiomanticMastery {
+
+ public BiomanticMastery(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 239;
+ this.expansionSetCode = "C15";
+ }
+
+ public BiomanticMastery(final BiomanticMastery card) {
+ super(card);
+ }
+
+ @Override
+ public BiomanticMastery copy() {
+ return new BiomanticMastery(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BlackMarket.java b/Mage.Sets/src/mage/sets/commander2015/BlackMarket.java
new file mode 100644
index 00000000000..e957cb54e9e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BlackMarket.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BlackMarket extends mage.sets.mercadianmasques.BlackMarket {
+
+ public BlackMarket(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 116;
+ this.expansionSetCode = "C15";
+ }
+
+ public BlackMarket(final BlackMarket card) {
+ super(card);
+ }
+
+ @Override
+ public BlackMarket copy() {
+ return new BlackMarket(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BladeOfSelves.java b/Mage.Sets/src/mage/sets/commander2015/BladeOfSelves.java
new file mode 100644
index 00000000000..440c76269a2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BladeOfSelves.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
+import mage.abilities.keyword.EquipAbility;
+import mage.abilities.keyword.MyriadAbility;
+import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BladeOfSelves extends CardImpl {
+
+ public BladeOfSelves(UUID ownerId) {
+ super(ownerId, 51, "Blade of Selves", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{2}");
+ this.expansionSetCode = "C15";
+ this.subtype.add("Equipment");
+
+ // Equipped creature has myriad.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(new MyriadAbility(), AttachmentType.EQUIPMENT)));
+
+ // Equip {4}
+ this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(4)));
+ }
+
+ public BladeOfSelves(final BladeOfSelves card) {
+ super(card);
+ }
+
+ @Override
+ public BladeOfSelves copy() {
+ return new BladeOfSelves(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BlastedLandscape.java b/Mage.Sets/src/mage/sets/commander2015/BlastedLandscape.java
new file mode 100644
index 00000000000..8a3be219592
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BlastedLandscape.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BlastedLandscape extends mage.sets.urzassaga.BlastedLandscape {
+
+ public BlastedLandscape(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 278;
+ this.expansionSetCode = "C15";
+ }
+
+ public BlastedLandscape(final BlastedLandscape card) {
+ super(card);
+ }
+
+ @Override
+ public BlastedLandscape copy() {
+ return new BlastedLandscape(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BlatantThievery.java b/Mage.Sets/src/mage/sets/commander2015/BlatantThievery.java
new file mode 100644
index 00000000000..d201393e233
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BlatantThievery.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BlatantThievery extends mage.sets.onslaught.BlatantThievery {
+
+ public BlatantThievery(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 87;
+ this.expansionSetCode = "C15";
+ }
+
+ public BlatantThievery(final BlatantThievery card) {
+ super(card);
+ }
+
+ @Override
+ public BlatantThievery copy() {
+ return new BlatantThievery(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BloodBairn.java b/Mage.Sets/src/mage/sets/commander2015/BloodBairn.java
new file mode 100644
index 00000000000..a6572bd9fb2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BloodBairn.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BloodBairn extends mage.sets.magic2014.BloodBairn {
+
+ public BloodBairn(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 117;
+ this.expansionSetCode = "C15";
+ }
+
+ public BloodBairn(final BloodBairn card) {
+ super(card);
+ }
+
+ @Override
+ public BloodBairn copy() {
+ return new BloodBairn(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BloodsporeThrinax.java b/Mage.Sets/src/mage/sets/commander2015/BloodsporeThrinax.java
new file mode 100644
index 00000000000..5a5d699db54
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BloodsporeThrinax.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.ReplacementEffectImpl;
+import mage.abilities.effects.common.DevourEffect;
+import mage.abilities.keyword.DevourAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.game.Game;
+import mage.game.events.EntersTheBattlefieldEvent;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.permanent.Permanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BloodsporeThrinax extends CardImpl {
+
+ public BloodsporeThrinax(UUID ownerId) {
+ super(ownerId, 33, "Bloodspore Thrinax", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
+ this.expansionSetCode = "C15";
+ this.subtype.add("Lizard");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Devour 1
+ this.addAbility(new DevourAbility(DevourEffect.DevourFactor.Devour1));
+
+ // Each other creature you control enters the battlefield with an additional X +1/+1 counters on it, where X is the number of +1/+1 counters on Bloodspire Thrinax.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BloodsporeThrinaxEntersBattlefieldEffect()));
+ }
+
+ public BloodsporeThrinax(final BloodsporeThrinax card) {
+ super(card);
+ }
+
+ @Override
+ public BloodsporeThrinax copy() {
+ return new BloodsporeThrinax(this);
+ }
+}
+
+class BloodsporeThrinaxEntersBattlefieldEffect extends ReplacementEffectImpl {
+
+ public BloodsporeThrinaxEntersBattlefieldEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.BoostCreature);
+ staticText = "Each other creature you control enters the battlefield with an additional X +1/+1 counters on it, where X is the number of +1/+1 counters on {this}";
+ }
+
+ public BloodsporeThrinaxEntersBattlefieldEffect(BloodsporeThrinaxEntersBattlefieldEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.ENTERS_THE_BATTLEFIELD;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget();
+ return creature != null && creature.getControllerId().equals(source.getControllerId())
+ && creature.getCardType().contains(CardType.CREATURE)
+ && !event.getTargetId().equals(source.getSourceId());
+ }
+
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ Permanent sourceCreature = game.getPermanent(source.getSourceId());
+ Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget();
+ if (sourceCreature != null && creature != null) {
+ int amount = sourceCreature.getCounters().getCount(CounterType.P1P1);
+ if (amount > 0) {
+ creature.addCounters(CounterType.P1P1.createInstance(amount), game);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public BloodsporeThrinaxEntersBattlefieldEffect copy() {
+ return new BloodsporeThrinaxEntersBattlefieldEffect(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BlueSunsZenith.java b/Mage.Sets/src/mage/sets/commander2015/BlueSunsZenith.java
new file mode 100644
index 00000000000..2b03a31ef30
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BlueSunsZenith.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BlueSunsZenith extends mage.sets.mirrodinbesieged.BlueSunsZenith {
+
+ public BlueSunsZenith(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 88;
+ this.expansionSetCode = "C15";
+ }
+
+ public BlueSunsZenith(final BlueSunsZenith card) {
+ super(card);
+ }
+
+ @Override
+ public BlueSunsZenith copy() {
+ return new BlueSunsZenith(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/Blustersquall.java b/Mage.Sets/src/mage/sets/commander2015/Blustersquall.java
new file mode 100644
index 00000000000..0277432714b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/Blustersquall.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Blustersquall extends mage.sets.returntoravnica.Blustersquall {
+
+ public Blustersquall(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 89;
+ this.expansionSetCode = "C15";
+ }
+
+ public Blustersquall(final Blustersquall card) {
+ super(card);
+ }
+
+ @Override
+ public Blustersquall copy() {
+ return new Blustersquall(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/Bonehoard.java b/Mage.Sets/src/mage/sets/commander2015/Bonehoard.java
new file mode 100644
index 00000000000..1594dc38220
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/Bonehoard.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Bonehoard extends mage.sets.mirrodinbesieged.Bonehoard {
+
+ public Bonehoard(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 245;
+ this.expansionSetCode = "C15";
+ }
+
+ public Bonehoard(final Bonehoard card) {
+ super(card);
+ }
+
+ @Override
+ public Bonehoard copy() {
+ return new Bonehoard(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BorderlandBehemoth.java b/Mage.Sets/src/mage/sets/commander2015/BorderlandBehemoth.java
new file mode 100644
index 00000000000..dc851589646
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BorderlandBehemoth.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.filter.predicate.permanent.PermanentIdPredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BorderlandBehemoth extends CardImpl {
+
+ public BorderlandBehemoth(UUID ownerId) {
+ super(ownerId, 142, "Borderland Behemoth", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{R}{R}");
+ this.expansionSetCode = "C15";
+ this.subtype.add("Giant");
+ this.subtype.add("Warrior");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+
+ // Borderland Behemoth gets +4/+4 for each other Giant you control.
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("other Giant you control");
+ filter.add(new SubtypePredicate("Giant"));
+ filter.add(Predicates.not(new PermanentIdPredicate(this.getId())));
+ filter.add(new ControllerPredicate(TargetController.YOU));
+ DynamicValue xValue = new PermanentsOnBattlefieldCount(filter, 4);
+ Effect effect = new BoostSourceEffect(xValue, xValue, Duration.WhileOnBattlefield, false);
+ effect.setText("{this} gets +4/+4 for each other Giant you control");
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
+ }
+
+ public BorderlandBehemoth(final BorderlandBehemoth card) {
+ super(card);
+ }
+
+ @Override
+ public BorderlandBehemoth copy() {
+ return new BorderlandBehemoth(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BorosCluestone.java b/Mage.Sets/src/mage/sets/commander2015/BorosCluestone.java
new file mode 100644
index 00000000000..c6b00359f38
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BorosCluestone.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BorosCluestone extends mage.sets.dragonsmaze.BorosCluestone {
+
+ public BorosCluestone(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 246;
+ this.expansionSetCode = "C15";
+ }
+
+ public BorosCluestone(final BorosCluestone card) {
+ super(card);
+ }
+
+ @Override
+ public BorosCluestone copy() {
+ return new BorosCluestone(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BorosGarrison.java b/Mage.Sets/src/mage/sets/commander2015/BorosGarrison.java
new file mode 100644
index 00000000000..4228b3b0c76
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BorosGarrison.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BorosGarrison extends mage.sets.planechase.BorosGarrison {
+
+ public BorosGarrison(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 279;
+ this.expansionSetCode = "C15";
+ }
+
+ public BorosGarrison(final BorosGarrison card) {
+ super(card);
+ }
+
+ @Override
+ public BorosGarrison copy() {
+ return new BorosGarrison(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BorosGuildgate.java b/Mage.Sets/src/mage/sets/commander2015/BorosGuildgate.java
new file mode 100644
index 00000000000..e0358daa1e3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BorosGuildgate.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BorosGuildgate extends mage.sets.gatecrash.BorosGuildgate {
+
+ public BorosGuildgate(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 280;
+ this.expansionSetCode = "C15";
+ }
+
+ public BorosGuildgate(final BorosGuildgate card) {
+ super(card);
+ }
+
+ @Override
+ public BorosGuildgate copy() {
+ return new BorosGuildgate(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BorosSignet.java b/Mage.Sets/src/mage/sets/commander2015/BorosSignet.java
new file mode 100644
index 00000000000..c5ff28ea13d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BorosSignet.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BorosSignet extends mage.sets.ravnica.BorosSignet {
+
+ public BorosSignet(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 247;
+ this.expansionSetCode = "C15";
+ }
+
+ public BorosSignet(final BorosSignet card) {
+ super(card);
+ }
+
+ @Override
+ public BorosSignet copy() {
+ return new BorosSignet(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/Brainstorm.java b/Mage.Sets/src/mage/sets/commander2015/Brainstorm.java
new file mode 100644
index 00000000000..d7eed4c41d6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/Brainstorm.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Brainstorm extends mage.sets.fifthedition.Brainstorm {
+
+ public Brainstorm(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 90;
+ this.expansionSetCode = "C15";
+ }
+
+ public Brainstorm(final Brainstorm card) {
+ super(card);
+ }
+
+ @Override
+ public Brainstorm copy() {
+ return new Brainstorm(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BreathOfDarigaaz.java b/Mage.Sets/src/mage/sets/commander2015/BreathOfDarigaaz.java
new file mode 100644
index 00000000000..004bec7ae2c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BreathOfDarigaaz.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BreathOfDarigaaz extends mage.sets.commander.BreathOfDarigaaz {
+
+ public BreathOfDarigaaz(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 143;
+ this.expansionSetCode = "C15";
+ }
+
+ public BreathOfDarigaaz(final BreathOfDarigaaz card) {
+ super(card);
+ }
+
+ @Override
+ public BreathOfDarigaaz copy() {
+ return new BreathOfDarigaaz(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BroodbirthViper.java b/Mage.Sets/src/mage/sets/commander2015/BroodbirthViper.java
new file mode 100644
index 00000000000..4f4c3d16d12
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BroodbirthViper.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.keyword.MyriadAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BroodbirthViper extends CardImpl {
+
+ public BroodbirthViper(UUID ownerId) {
+ super(ownerId, 10, "Broodbirth Viper", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{U}");
+ this.expansionSetCode = "C15";
+ this.subtype.add("Snake");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Myriad
+ this.addAbility(new MyriadAbility());
+ // Whenever Broodbirth Viper deals combat damage to a player, you may draw a card.
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), true, false));
+ }
+
+ public BroodbirthViper(final BroodbirthViper card) {
+ super(card);
+ }
+
+ @Override
+ public BroodbirthViper copy() {
+ return new BroodbirthViper(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/BurnishedHart.java b/Mage.Sets/src/mage/sets/commander2015/BurnishedHart.java
new file mode 100644
index 00000000000..37d613e3eca
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/BurnishedHart.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BurnishedHart extends mage.sets.theros.BurnishedHart {
+
+ public BurnishedHart(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 248;
+ this.expansionSetCode = "C15";
+ }
+
+ public BurnishedHart(final BurnishedHart card) {
+ super(card);
+ }
+
+ @Override
+ public BurnishedHart copy() {
+ return new BurnishedHart(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/ButcherOfMalakir.java b/Mage.Sets/src/mage/sets/commander2015/ButcherOfMalakir.java
new file mode 100644
index 00000000000..cc13809840e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/ButcherOfMalakir.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ButcherOfMalakir extends mage.sets.worldwake.ButcherOfMalakir {
+
+ public ButcherOfMalakir(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 118;
+ this.expansionSetCode = "C15";
+ }
+
+ public ButcherOfMalakir(final ButcherOfMalakir card) {
+ super(card);
+ }
+
+ @Override
+ public ButcherOfMalakir copy() {
+ return new ButcherOfMalakir(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CageOfHands.java b/Mage.Sets/src/mage/sets/commander2015/CageOfHands.java
new file mode 100644
index 00000000000..b66d7722b73
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CageOfHands.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CageOfHands extends mage.sets.championsofkamigawa.CageOfHands {
+
+ public CageOfHands(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 62;
+ this.expansionSetCode = "C15";
+ }
+
+ public CageOfHands(final CageOfHands card) {
+ super(card);
+ }
+
+ @Override
+ public CageOfHands copy() {
+ return new CageOfHands(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CallTheSkybreaker.java b/Mage.Sets/src/mage/sets/commander2015/CallTheSkybreaker.java
new file mode 100644
index 00000000000..6fc69f0e5aa
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CallTheSkybreaker.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CallTheSkybreaker extends mage.sets.commander.CallTheSkybreaker {
+
+ public CallTheSkybreaker(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 240;
+ this.expansionSetCode = "C15";
+ }
+
+ public CallTheSkybreaker(final CallTheSkybreaker card) {
+ super(card);
+ }
+
+ @Override
+ public CallTheSkybreaker copy() {
+ return new CallTheSkybreaker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CallerOfTheClaw.java b/Mage.Sets/src/mage/sets/commander2015/CallerOfTheClaw.java
new file mode 100644
index 00000000000..00e1be423a7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CallerOfTheClaw.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CallerOfTheClaw extends mage.sets.legions.CallerOfTheClaw {
+
+ public CallerOfTheClaw(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 177;
+ this.expansionSetCode = "C15";
+ }
+
+ public CallerOfTheClaw(final CallerOfTheClaw card) {
+ super(card);
+ }
+
+ @Override
+ public CallerOfTheClaw copy() {
+ return new CallerOfTheClaw(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CallerOfThePack.java b/Mage.Sets/src/mage/sets/commander2015/CallerOfThePack.java
new file mode 100644
index 00000000000..c3d55334a4a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CallerOfThePack.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.MyriadAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CallerOfThePack extends CardImpl {
+
+ public CallerOfThePack(UUID ownerId) {
+ super(ownerId, 34, "Caller of the Pack", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{5}{G}{G}");
+ this.expansionSetCode = "C15";
+ this.subtype.add("Beast");
+ this.power = new MageInt(8);
+ this.toughness = new MageInt(6);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+
+ // Myriad (Whenever this creature attacks, for each opponent other than the defending player, put a token that's a copy of this creature onto the battlefield tapped and attacking that player or a planeswalker he or she controls. Exile those tokens at the end of combat.)
+ this.addAbility(new MyriadAbility());
+
+ }
+
+ public CallerOfThePack(final CallerOfThePack card) {
+ super(card);
+ }
+
+ @Override
+ public CallerOfThePack copy() {
+ return new CallerOfThePack(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CelestialAncient.java b/Mage.Sets/src/mage/sets/commander2015/CelestialAncient.java
new file mode 100644
index 00000000000..0d4a44192b2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CelestialAncient.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CelestialAncient extends mage.sets.dissension.CelestialAncient {
+
+ public CelestialAncient(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 63;
+ this.expansionSetCode = "C15";
+ }
+
+ public CelestialAncient(final CelestialAncient card) {
+ super(card);
+ }
+
+ @Override
+ public CelestialAncient copy() {
+ return new CelestialAncient(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CelestialArchon.java b/Mage.Sets/src/mage/sets/commander2015/CelestialArchon.java
new file mode 100644
index 00000000000..efc1c6bcef5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CelestialArchon.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CelestialArchon extends mage.sets.theros.CelestialArchon {
+
+ public CelestialArchon(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 64;
+ this.expansionSetCode = "C15";
+ }
+
+ public CelestialArchon(final CelestialArchon card) {
+ super(card);
+ }
+
+ @Override
+ public CelestialArchon copy() {
+ return new CelestialArchon(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CentaurVinecrasher.java b/Mage.Sets/src/mage/sets/commander2015/CentaurVinecrasher.java
new file mode 100644
index 00000000000..cb5b90bf3be
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CentaurVinecrasher.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.dynamicvalue.common.CardsInAllGraveyardsCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.counters.CounterType;
+import mage.filter.common.FilterLandCard;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CentaurVinecrasher extends CardImpl {
+
+ public CentaurVinecrasher(UUID ownerId) {
+ super(ownerId, 35, "Centaur Vinecrasher", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{G}");
+ this.expansionSetCode = "C15";
+ this.subtype.add("Plant");
+ this.subtype.add("Centaur");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // Centaur Vinecrasher enters the battlefield with a number of +1/+1 counters on it equal to the number of land cards in all graveyards.
+ Effect effect = new AddCountersSourceEffect(CounterType.P1P1.createInstance(0), new CardsInAllGraveyardsCount(new FilterLandCard()), true);
+ effect.setText("with a number of +1/+1 counters on it equal to the number of land cards in all graveyards");
+ this.addAbility(new EntersBattlefieldAbility(effect));
+ // Whenever a land card is put into a graveyard from anywhere, you may pay {G}{G}. If you do, return Centaur Vinecrasher from your graveyard to your hand.
+ this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
+ new DoIfCostPaid(new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl<>("{G}{G}")),
+ false, new FilterLandCard("a land card"), TargetController.ANY
+ ));
+ }
+
+ public CentaurVinecrasher(final CentaurVinecrasher card) {
+ super(card);
+ }
+
+ @Override
+ public CentaurVinecrasher copy() {
+ return new CentaurVinecrasher(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/ChainReaction.java b/Mage.Sets/src/mage/sets/commander2015/ChainReaction.java
new file mode 100644
index 00000000000..f4a7e53e109
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/ChainReaction.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ChainReaction extends mage.sets.worldwake.ChainReaction {
+
+ public ChainReaction(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 144;
+ this.expansionSetCode = "C15";
+ }
+
+ public ChainReaction(final ChainReaction card) {
+ super(card);
+ }
+
+ @Override
+ public ChainReaction copy() {
+ return new ChainReaction(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/ChameleonColossus.java b/Mage.Sets/src/mage/sets/commander2015/ChameleonColossus.java
new file mode 100644
index 00000000000..93d764688fb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/ChameleonColossus.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ChameleonColossus extends mage.sets.morningtide.ChameleonColossus {
+
+ public ChameleonColossus(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 178;
+ this.expansionSetCode = "C15";
+ }
+
+ public ChameleonColossus(final ChameleonColossus card) {
+ super(card);
+ }
+
+ @Override
+ public ChameleonColossus copy() {
+ return new ChameleonColossus(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/ChampionOfStraySouls.java b/Mage.Sets/src/mage/sets/commander2015/ChampionOfStraySouls.java
new file mode 100644
index 00000000000..de9ca779824
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/ChampionOfStraySouls.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ChampionOfStraySouls extends mage.sets.bornofthegods.ChampionOfStraySouls {
+
+ public ChampionOfStraySouls(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 119;
+ this.expansionSetCode = "C15";
+ }
+
+ public ChampionOfStraySouls(final ChampionOfStraySouls card) {
+ super(card);
+ }
+
+ @Override
+ public ChampionOfStraySouls copy() {
+ return new ChampionOfStraySouls(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CharmbreakerDevils.java b/Mage.Sets/src/mage/sets/commander2015/CharmbreakerDevils.java
new file mode 100644
index 00000000000..932ff9b7e47
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CharmbreakerDevils.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CharmbreakerDevils extends mage.sets.innistrad.CharmbreakerDevils {
+
+ public CharmbreakerDevils(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 145;
+ this.expansionSetCode = "C15";
+ }
+
+ public CharmbreakerDevils(final CharmbreakerDevils card) {
+ super(card);
+ }
+
+ @Override
+ public CharmbreakerDevils copy() {
+ return new CharmbreakerDevils(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/Cloudthresher.java b/Mage.Sets/src/mage/sets/commander2015/Cloudthresher.java
new file mode 100644
index 00000000000..8cded421966
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/Cloudthresher.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Cloudthresher extends mage.sets.lorwyn.Cloudthresher {
+
+ public Cloudthresher(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 179;
+ this.expansionSetCode = "C15";
+ }
+
+ public Cloudthresher(final Cloudthresher card) {
+ super(card);
+ }
+
+ @Override
+ public Cloudthresher copy() {
+ return new Cloudthresher(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CobraTrap.java b/Mage.Sets/src/mage/sets/commander2015/CobraTrap.java
new file mode 100644
index 00000000000..d8a6571c1df
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CobraTrap.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CobraTrap extends mage.sets.zendikar.CobraTrap {
+
+ public CobraTrap(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 180;
+ this.expansionSetCode = "C15";
+ }
+
+ public CobraTrap(final CobraTrap card) {
+ super(card);
+ }
+
+ @Override
+ public CobraTrap copy() {
+ return new CobraTrap(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CoilingOracle.java b/Mage.Sets/src/mage/sets/commander2015/CoilingOracle.java
new file mode 100644
index 00000000000..43d7eaa1642
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CoilingOracle.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CoilingOracle extends mage.sets.dissension.CoilingOracle {
+
+ public CoilingOracle(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 213;
+ this.expansionSetCode = "C15";
+ }
+
+ public CoilingOracle(final CoilingOracle card) {
+ super(card);
+ }
+
+ @Override
+ public CoilingOracle copy() {
+ return new CoilingOracle(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/ColdEyedSelkie.java b/Mage.Sets/src/mage/sets/commander2015/ColdEyedSelkie.java
new file mode 100644
index 00000000000..adb74c1e18e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/ColdEyedSelkie.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ColdEyedSelkie extends mage.sets.eventide.ColdEyedSelkie {
+
+ public ColdEyedSelkie(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 241;
+ this.expansionSetCode = "C15";
+ }
+
+ public ColdEyedSelkie(final ColdEyedSelkie card) {
+ super(card);
+ }
+
+ @Override
+ public ColdEyedSelkie copy() {
+ return new ColdEyedSelkie(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/ColdsteelHeart.java b/Mage.Sets/src/mage/sets/commander2015/ColdsteelHeart.java
new file mode 100644
index 00000000000..af66575ecae
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/ColdsteelHeart.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ColdsteelHeart extends mage.sets.coldsnap.ColdsteelHeart {
+
+ public ColdsteelHeart(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 249;
+ this.expansionSetCode = "C15";
+ }
+
+ public ColdsteelHeart(final ColdsteelHeart card) {
+ super(card);
+ }
+
+ @Override
+ public ColdsteelHeart copy() {
+ return new ColdsteelHeart(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CometStorm.java b/Mage.Sets/src/mage/sets/commander2015/CometStorm.java
new file mode 100644
index 00000000000..2da821aaf9a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CometStorm.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CometStorm extends mage.sets.worldwake.CometStorm {
+
+ public CometStorm(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 146;
+ this.expansionSetCode = "C15";
+ }
+
+ public CometStorm(final CometStorm card) {
+ super(card);
+ }
+
+ @Override
+ public CometStorm copy() {
+ return new CometStorm(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CommandBeacon.java b/Mage.Sets/src/mage/sets/commander2015/CommandBeacon.java
new file mode 100644
index 00000000000..9d7004c9e3b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CommandBeacon.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.mana.ColorlessManaAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author emerald000
+ */
+public class CommandBeacon extends CardImpl {
+
+ public CommandBeacon(UUID ownerId) {
+ super(ownerId, 56, "Command Beacon", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "C15";
+
+ // {T}: Add {1} to your mana pool.
+ this.addAbility(new ColorlessManaAbility());
+ // {T}, Sacrifice Command Beacon: Put your commander into your hand from the command zone.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CommandBeaconEffect(), new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ this.addAbility(ability);
+ }
+
+ public CommandBeacon(final CommandBeacon card) {
+ super(card);
+ }
+
+ @Override
+ public CommandBeacon copy() {
+ return new CommandBeacon(this);
+ }
+}
+
+class CommandBeaconEffect extends OneShotEffect {
+
+ CommandBeaconEffect() {
+ super(Outcome.ReturnToHand);
+ this.staticText = "Put your commander into your hand from the command zone";
+ }
+
+ CommandBeaconEffect(final CommandBeaconEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public CommandBeaconEffect copy() {
+ return new CommandBeaconEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ Card commander = game.getCard(controller.getCommanderId());
+ if (commander != null && game.getState().getZone(commander.getId()) == Zone.COMMAND) {
+ controller.moveCards(commander, Zone.HAND, source, game);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CommandTower.java b/Mage.Sets/src/mage/sets/commander2015/CommandTower.java
new file mode 100644
index 00000000000..c49aab943d5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CommandTower.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CommandTower extends mage.sets.commander2013.CommandTower {
+
+ public CommandTower(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 281;
+ this.expansionSetCode = "C15";
+ }
+
+ public CommandTower(final CommandTower card) {
+ super(card);
+ }
+
+ @Override
+ public CommandTower copy() {
+ return new CommandTower(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CorpseAugur.java b/Mage.Sets/src/mage/sets/commander2015/CorpseAugur.java
new file mode 100644
index 00000000000..28a05b4c32f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CorpseAugur.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.dynamicvalue.common.CardsInTargetPlayersGraveyardCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.TargetPlayer;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CorpseAugur extends CardImpl {
+
+ public CorpseAugur(UUID ownerId) {
+ super(ownerId, 17, "Corpse Augur", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{B}");
+ this.expansionSetCode = "C15";
+ this.subtype.add("Zombie");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(2);
+
+ // When Corpse Augur dies, you draw X cards and you lose X life, where X is the number of creature cards in target player's graveyard.
+ Effect effect = new DrawCardSourceControllerEffect(new CardsInTargetPlayersGraveyardCount());
+ effect.setText("You draw X cards");
+ Ability ability = new DiesTriggeredAbility(effect, false);
+ effect = new LoseLifeSourceControllerEffect(new CardsInTargetPlayersGraveyardCount());
+ effect.setText("and you lose X life, where X is the number of creature cards in target player's graveyard");
+ ability.addEffect(effect);
+ ability.addTarget(new TargetPlayer());
+ this.addAbility(ability);
+ }
+
+ public CorpseAugur(final CorpseAugur card) {
+ super(card);
+ }
+
+ @Override
+ public CorpseAugur copy() {
+ return new CorpseAugur(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/Counterflux.java b/Mage.Sets/src/mage/sets/commander2015/Counterflux.java
new file mode 100644
index 00000000000..97bb07599db
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/Counterflux.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Counterflux extends mage.sets.returntoravnica.Counterflux {
+
+ public Counterflux(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 214;
+ this.expansionSetCode = "C15";
+ }
+
+ public Counterflux(final Counterflux card) {
+ super(card);
+ }
+
+ @Override
+ public Counterflux copy() {
+ return new Counterflux(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CribSwap.java b/Mage.Sets/src/mage/sets/commander2015/CribSwap.java
new file mode 100644
index 00000000000..6a8f7f533af
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CribSwap.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CribSwap extends mage.sets.lorwyn.CribSwap {
+
+ public CribSwap(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 65;
+ this.expansionSetCode = "C15";
+ }
+
+ public CribSwap(final CribSwap card) {
+ super(card);
+ }
+
+ @Override
+ public CribSwap copy() {
+ return new CribSwap(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CrystalChimes.java b/Mage.Sets/src/mage/sets/commander2015/CrystalChimes.java
new file mode 100644
index 00000000000..8de0ce6f940
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CrystalChimes.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterEnchantmentCard;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CrystalChimes extends CardImpl {
+
+ public CrystalChimes(UUID ownerId) {
+ super(ownerId, 250, "Crystal Chimes", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{3}");
+ this.expansionSetCode = "C15";
+
+ // {3}, {tap}, Sacrifice Crystal Chimes: Return all enchantment cards from your graveyard to your hand.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CrystalChimesEffect(), new GenericManaCost(3));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ this.addAbility(ability);
+ }
+
+ public CrystalChimes(final CrystalChimes card) {
+ super(card);
+ }
+
+ @Override
+ public CrystalChimes copy() {
+ return new CrystalChimes(this);
+ }
+}
+
+class CrystalChimesEffect extends OneShotEffect {
+
+ CrystalChimesEffect() {
+ super(Outcome.PutCardInPlay);
+ this.staticText = "Return all enchantment cards from your graveyard to your hand";
+ }
+
+ CrystalChimesEffect(final CrystalChimesEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public CrystalChimesEffect copy() {
+ return new CrystalChimesEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ return controller.moveCards(controller.getGraveyard().getCards(new FilterEnchantmentCard(), source.getSourceId(),
+ source.getControllerId(), game), Zone.HAND, source, game);
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/CurseOfTheNightlyHunt.java b/Mage.Sets/src/mage/sets/commander2015/CurseOfTheNightlyHunt.java
new file mode 100644
index 00000000000..51092b5411b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/CurseOfTheNightlyHunt.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CurseOfTheNightlyHunt extends mage.sets.innistrad.CurseOfTheNightlyHunt {
+
+ public CurseOfTheNightlyHunt(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 147;
+ this.expansionSetCode = "C15";
+ }
+
+ public CurseOfTheNightlyHunt(final CurseOfTheNightlyHunt card) {
+ super(card);
+ }
+
+ @Override
+ public CurseOfTheNightlyHunt copy() {
+ return new CurseOfTheNightlyHunt(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DarksteelIngot.java b/Mage.Sets/src/mage/sets/commander2015/DarksteelIngot.java
new file mode 100644
index 00000000000..02be9f3a793
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DarksteelIngot.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DarksteelIngot extends mage.sets.darksteel.DarksteelIngot {
+
+ public DarksteelIngot(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 251;
+ this.expansionSetCode = "C15";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public DarksteelIngot(final DarksteelIngot card) {
+ super(card);
+ }
+
+ @Override
+ public DarksteelIngot copy() {
+ return new DarksteelIngot(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DawnToDusk.java b/Mage.Sets/src/mage/sets/commander2015/DawnToDusk.java
new file mode 100644
index 00000000000..49ebac93230
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DawnToDusk.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DawnToDusk extends mage.sets.bornofthegods.DawnToDusk {
+
+ public DawnToDusk(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 66;
+ this.expansionSetCode = "C15";
+ }
+
+ public DawnToDusk(final DawnToDusk card) {
+ super(card);
+ }
+
+ @Override
+ public DawnToDusk copy() {
+ return new DawnToDusk(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DawnbreakReclaimer.java b/Mage.Sets/src/mage/sets/commander2015/DawnbreakReclaimer.java
new file mode 100644
index 00000000000..6e47df60283
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DawnbreakReclaimer.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+import mage.MageInt;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreatureCard;
+import mage.filter.predicate.other.OwnerIdPredicate;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.common.TargetCardInGraveyard;
+import mage.target.common.TargetCardInOpponentsGraveyard;
+import mage.util.MessageToClient;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DawnbreakReclaimer extends CardImpl {
+
+ public DawnbreakReclaimer(UUID ownerId) {
+ super(ownerId, 2, "Dawnbreak Reclaimer", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{W}{W}");
+ this.expansionSetCode = "C15";
+ this.subtype.add("Angel");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // At the beginning of your end step, choose a creature card in an opponent's graveyard, then that player chooses a creature card in your graveyard.
+ // You may return those cards to the battlefield under their owners' control.
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(new DawnbreakReclaimerEffect(), TargetController.YOU, false));
+ }
+
+ public DawnbreakReclaimer(final DawnbreakReclaimer card) {
+ super(card);
+ }
+
+ @Override
+ public DawnbreakReclaimer copy() {
+ return new DawnbreakReclaimer(this);
+ }
+}
+
+class DawnbreakReclaimerEffect extends OneShotEffect {
+
+ public DawnbreakReclaimerEffect() {
+ super(Outcome.Detriment);
+ this.staticText = "choose a creature card in an opponent's graveyard, then that player chooses a creature card in your graveyard. You may return those cards to the battlefield under their owners' control";
+ }
+
+ public DawnbreakReclaimerEffect(final DawnbreakReclaimerEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public DawnbreakReclaimerEffect copy() {
+ return new DawnbreakReclaimerEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ MageObject sourceObject = source.getSourceObject(game);
+ if (controller != null && sourceObject != null) {
+ TargetCardInOpponentsGraveyard targetCreature = new TargetCardInOpponentsGraveyard(new FilterCreatureCard("a creature card in an opponent's graveyard"));
+ if (controller.choose(Outcome.Detriment, targetCreature, source.getSourceId(), game)) {
+ Card creatureCard = game.getCard(targetCreature.getFirstTarget());
+ Player opponent = game.getPlayer(creatureCard.getOwnerId());
+ if (opponent != null) {
+ game.informPlayers(sourceObject.getLogName() + ": " + controller.getLogName() + " has chosen " + creatureCard.getIdName() + " of " + opponent.getLogName());
+ FilterCreatureCard filter = new FilterCreatureCard("a creature card in " + controller.getName() + "'s the graveyard");
+ filter.add(new OwnerIdPredicate(controller.getId()));
+ TargetCardInGraveyard targetCard = new TargetCardInGraveyard(filter);
+ targetCard.setNotTarget(true);
+ if (opponent.choose(outcome, targetCard, source.getSourceId(), game)) {
+ Card controllerCreatureCard = game.getCard(targetCard.getFirstTarget());
+ if (controllerCreatureCard != null) {
+ MessageToClient message = new MessageToClient("Return those cards to the battlefield under their owners' control?",
+ "Opponent's creature card: " + creatureCard.getLogName() + " - Your creature: " + controllerCreatureCard.getLogName());
+ if (controller.chooseUse(outcome, message, source, game)) {
+ Set cards = new HashSet<>();
+ cards.add(creatureCard);
+ cards.add(controllerCreatureCard);
+ opponent.moveCards(cards, Zone.BATTLEFIELD, source, game, false, false, true, null);
+ }
+ }
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DawnglareInvoker.java b/Mage.Sets/src/mage/sets/commander2015/DawnglareInvoker.java
new file mode 100644
index 00000000000..9fbb403666b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DawnglareInvoker.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DawnglareInvoker extends mage.sets.riseoftheeldrazi.DawnglareInvoker {
+
+ public DawnglareInvoker(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 67;
+ this.expansionSetCode = "C15";
+ }
+
+ public DawnglareInvoker(final DawnglareInvoker card) {
+ super(card);
+ }
+
+ @Override
+ public DawnglareInvoker copy() {
+ return new DawnglareInvoker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DaxosTheReturned.java b/Mage.Sets/src/mage/sets/commander2015/DaxosTheReturned.java
new file mode 100644
index 00000000000..f0909282109
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DaxosTheReturned.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.MageObjectReference;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.common.SpellCastControllerTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.counter.AddCountersControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Layer;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.SubLayer;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.filter.FilterSpell;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.game.permanent.token.Token;
+import mage.players.Player;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DaxosTheReturned extends CardImpl {
+
+ private static final FilterSpell filter = new FilterSpell("an enchantment spell");
+ static {
+ filter.add(new CardTypePredicate(CardType.ENCHANTMENT));
+ }
+
+ public DaxosTheReturned(UUID ownerId) {
+ super(ownerId, 43, "Daxos the Returned", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{1}{W}{B}");
+ this.expansionSetCode = "C15";
+ this.supertype.add("Legendary");
+ this.subtype.add("Zombie");
+ this.subtype.add("Soldier");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever you cast an enchantment spell, you get an experience counter.
+ Effect effect = new AddCountersControllerEffect(CounterType.EXPERIENCE.createInstance(1), false);
+ effect.setText("you get an experience counter");
+ Ability ability = new SpellCastControllerTriggeredAbility(effect, filter, false);
+ this.addAbility(ability);
+
+ // {1}{W}{B}: Put a white and black Spirit enchantment creature token onto the battlefield. It has
+ // "This creature's power and toughness are each equal to the number of experience counters you have."
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new DaxosSpiritToken(), 1), new ManaCostsImpl("{1}{W}{B}")));
+ }
+
+ public DaxosTheReturned(final DaxosTheReturned card) {
+ super(card);
+ }
+
+ @Override
+ public DaxosTheReturned copy() {
+ return new DaxosTheReturned(this);
+ }
+}
+
+
+class DaxosSpiritToken extends Token {
+ DaxosSpiritToken() {
+ super("Spirit", "white and black Spirit enchantment creature token with \"This creature's power and toughness are each equal to the number of experience counters you have.\"");
+ this.setOriginalExpansionSetCode("C15");
+ cardType.add(CardType.CREATURE);
+ cardType.add(CardType.ENCHANTMENT);
+ color.setWhite(true);
+ color.setBlack(true);
+ subtype.add("Spirit");
+ power = new MageInt(0);
+ toughness = new MageInt(0);
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DaxosSpiritSetPTEffect()));
+ }
+}
+
+class DaxosSpiritSetPTEffect extends ContinuousEffectImpl {
+
+ public DaxosSpiritSetPTEffect() {
+ super(Duration.WhileOnBattlefield, Layer.PTChangingEffects_7, SubLayer.SetPT_7b, Outcome.BoostCreature);
+ staticText = "This creature's power and toughness are each equal to the number of experience counters you have";
+ }
+
+ public DaxosSpiritSetPTEffect(final DaxosSpiritSetPTEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public DaxosSpiritSetPTEffect copy() {
+ return new DaxosSpiritSetPTEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ Permanent permanent = game.getPermanent(source.getSourceId());
+ if (permanent != null && new MageObjectReference(source.getSourceObject(game), game).refersTo(permanent, game)) {
+ int amount = controller.getCounters().getCount(CounterType.EXPERIENCE);
+ permanent.getPower().setValue(amount);
+ permanent.getToughness().setValue(amount);
+ return true;
+ } else {
+ discard();
+ }
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/commander2015/DaxossTorment.java b/Mage.Sets/src/mage/sets/commander2015/DaxossTorment.java
new file mode 100644
index 00000000000..1ef4d5f4059
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DaxossTorment.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.abilityword.ConstellationAbility;
+import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.game.permanent.token.Token;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DaxossTorment extends CardImpl {
+
+ public DaxossTorment(UUID ownerId) {
+ super(ownerId, 18, "Daxos's Torment", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}");
+ this.expansionSetCode = "C15";
+
+ // Constellation - Whenever Daxos's Torment or another enchantment enters the battlefield under your control, Daxos's Torment becomes a 5/5 Demon creature with flying and haste until end of turn in addition to its other types.
+ this.addAbility(new ConstellationAbility(new BecomesCreatureSourceEffect(new DaxossTormentToken(), "", Duration.EndOfTurn)));
+ }
+
+ public DaxossTorment(final DaxossTorment card) {
+ super(card);
+ }
+
+ @Override
+ public DaxossTorment copy() {
+ return new DaxossTorment(this);
+ }
+}
+
+class DaxossTormentToken extends Token {
+
+ public DaxossTormentToken() {
+ super("", "a 5/5 Demon creature with flying and haste");
+ cardType.add(CardType.CREATURE);
+
+ subtype.add("Demon");
+ power = new MageInt(5);
+ toughness = new MageInt(5);
+ addAbility(FlyingAbility.getInstance());
+ addAbility(HasteAbility.getInstance());
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DayOfTheDragons.java b/Mage.Sets/src/mage/sets/commander2015/DayOfTheDragons.java
new file mode 100644
index 00000000000..8e29a7a39d3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DayOfTheDragons.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DayOfTheDragons extends mage.sets.scourge.DayOfTheDragons {
+
+ public DayOfTheDragons(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 91;
+ this.expansionSetCode = "C15";
+ }
+
+ public DayOfTheDragons(final DayOfTheDragons card) {
+ super(card);
+ }
+
+ @Override
+ public DayOfTheDragons copy() {
+ return new DayOfTheDragons(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DeadlyTempest.java b/Mage.Sets/src/mage/sets/commander2015/DeadlyTempest.java
new file mode 100644
index 00000000000..7af864bd0f1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DeadlyTempest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.HashMap;
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DeadlyTempest extends CardImpl {
+
+ public DeadlyTempest(UUID ownerId) {
+ super(ownerId, 19, "Deadly Tempest", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{4}{B}{B}");
+ this.expansionSetCode = "C15";
+
+ // Destroy all creatures. Each player loses life equal to the number of creatures he or she controlled that were destroyed this way.
+ getSpellAbility().addEffect(new DeadlyTempestEffect());
+ }
+
+ public DeadlyTempest(final DeadlyTempest card) {
+ super(card);
+ }
+
+ @Override
+ public DeadlyTempest copy() {
+ return new DeadlyTempest(this);
+ }
+}
+
+class DeadlyTempestEffect extends OneShotEffect {
+
+ public DeadlyTempestEffect() {
+ super(Outcome.DestroyPermanent);
+ this.staticText = "Destroy all creatures. Each player loses life equal to the number of creatures he or she controlled that were destroyed this way";
+ }
+
+ public DeadlyTempestEffect(final DeadlyTempestEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public DeadlyTempestEffect copy() {
+ return new DeadlyTempestEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ HashMap destroyedCreatures = new HashMap<>();
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), source.getSourceId(), game)) {
+ if (permanent.destroy(source.getSourceId(), game, false)) {
+ int count = destroyedCreatures.containsKey(permanent.getControllerId()) ? destroyedCreatures.get(permanent.getControllerId()) : 0;
+ destroyedCreatures.put(permanent.getControllerId(), count + 1);
+ }
+ }
+ for (UUID playerId : game.getState().getPlayerList(source.getControllerId())) {
+ int count = destroyedCreatures.containsKey(playerId) ? destroyedCreatures.get(playerId) : 0;
+ if (count > 0) {
+ Player player = game.getPlayer(playerId);
+ if (player != null) {
+ player.damage(count, playerId, game, false, true);
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DeathGrasp.java b/Mage.Sets/src/mage/sets/commander2015/DeathGrasp.java
new file mode 100644
index 00000000000..55f24816b8e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DeathGrasp.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DeathGrasp extends mage.sets.apocalypse.DeathGrasp {
+
+ public DeathGrasp(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 215;
+ this.expansionSetCode = "C15";
+ }
+
+ public DeathGrasp(final DeathGrasp card) {
+ super(card);
+ }
+
+ @Override
+ public DeathGrasp copy() {
+ return new DeathGrasp(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DesertTwister.java b/Mage.Sets/src/mage/sets/commander2015/DesertTwister.java
new file mode 100644
index 00000000000..bd7d8a64ff2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DesertTwister.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DesertTwister extends mage.sets.revisededition.DesertTwister {
+
+ public DesertTwister(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 181;
+ this.expansionSetCode = "C15";
+ }
+
+ public DesertTwister(final DesertTwister card) {
+ super(card);
+ }
+
+ @Override
+ public DesertTwister copy() {
+ return new DesertTwister(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DesolationGiant.java b/Mage.Sets/src/mage/sets/commander2015/DesolationGiant.java
new file mode 100644
index 00000000000..76982a9f582
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DesolationGiant.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DesolationGiant extends mage.sets.apocalypse.DesolationGiant {
+
+ public DesolationGiant(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 148;
+ this.expansionSetCode = "C15";
+ }
+
+ public DesolationGiant(final DesolationGiant card) {
+ super(card);
+ }
+
+ @Override
+ public DesolationGiant copy() {
+ return new DesolationGiant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DesperateRavings.java b/Mage.Sets/src/mage/sets/commander2015/DesperateRavings.java
new file mode 100644
index 00000000000..2991bbcb075
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DesperateRavings.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DesperateRavings extends mage.sets.innistrad.DesperateRavings {
+
+ public DesperateRavings(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 149;
+ this.expansionSetCode = "C15";
+ }
+
+ public DesperateRavings(final DesperateRavings card) {
+ super(card);
+ }
+
+ @Override
+ public DesperateRavings copy() {
+ return new DesperateRavings(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DiabolicServitude.java b/Mage.Sets/src/mage/sets/commander2015/DiabolicServitude.java
new file mode 100644
index 00000000000..7e226b8f4cd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DiabolicServitude.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DiabolicServitude extends mage.sets.urzassaga.DiabolicServitude {
+
+ public DiabolicServitude(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 120;
+ this.expansionSetCode = "C15";
+ }
+
+ public DiabolicServitude(final DiabolicServitude card) {
+ super(card);
+ }
+
+ @Override
+ public DiabolicServitude copy() {
+ return new DiabolicServitude(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DictateOfHeliod.java b/Mage.Sets/src/mage/sets/commander2015/DictateOfHeliod.java
new file mode 100644
index 00000000000..e78f9123474
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DictateOfHeliod.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DictateOfHeliod extends mage.sets.journeyintonyx.DictateOfHeliod {
+
+ public DictateOfHeliod(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 68;
+ this.expansionSetCode = "C15";
+ }
+
+ public DictateOfHeliod(final DictateOfHeliod card) {
+ super(card);
+ }
+
+ @Override
+ public DictateOfHeliod copy() {
+ return new DictateOfHeliod(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DisasterRadius.java b/Mage.Sets/src/mage/sets/commander2015/DisasterRadius.java
new file mode 100644
index 00000000000..cfb6de05ba2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DisasterRadius.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DisasterRadius extends mage.sets.riseoftheeldrazi.DisasterRadius {
+
+ public DisasterRadius(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 150;
+ this.expansionSetCode = "C15";
+ }
+
+ public DisasterRadius(final DisasterRadius card) {
+ super(card);
+ }
+
+ @Override
+ public DisasterRadius copy() {
+ return new DisasterRadius(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/Dominate.java b/Mage.Sets/src/mage/sets/commander2015/Dominate.java
new file mode 100644
index 00000000000..8a6c392e218
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/Dominate.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Dominate extends mage.sets.nemesis.Dominate {
+
+ public Dominate(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 92;
+ this.expansionSetCode = "C15";
+ }
+
+ public Dominate(final Dominate card) {
+ super(card);
+ }
+
+ @Override
+ public Dominate copy() {
+ return new Dominate(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DoomwakeGiant.java b/Mage.Sets/src/mage/sets/commander2015/DoomwakeGiant.java
new file mode 100644
index 00000000000..e4fcc3a412c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DoomwakeGiant.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DoomwakeGiant extends mage.sets.journeyintonyx.DoomwakeGiant {
+
+ public DoomwakeGiant(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 121;
+ this.expansionSetCode = "C15";
+ }
+
+ public DoomwakeGiant(final DoomwakeGiant card) {
+ super(card);
+ }
+
+ @Override
+ public DoomwakeGiant copy() {
+ return new DoomwakeGiant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DragonMage.java b/Mage.Sets/src/mage/sets/commander2015/DragonMage.java
new file mode 100644
index 00000000000..985eeb5a07a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DragonMage.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DragonMage extends mage.sets.scourge.DragonMage {
+
+ public DragonMage(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 151;
+ this.expansionSetCode = "C15";
+ }
+
+ public DragonMage(final DragonMage card) {
+ super(card);
+ }
+
+ @Override
+ public DragonMage copy() {
+ return new DragonMage(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander2015/DreadSummons.java b/Mage.Sets/src/mage/sets/commander2015/DreadSummons.java
new file mode 100644
index 00000000000..4f2b645a370
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/commander2015/DreadSummons.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.commander2015;
+
+import java.util.Set;
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.token.ZombieToken;
+import mage.players.Player;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DreadSummons extends CardImpl {
+
+ public DreadSummons(UUID ownerId) {
+ super(ownerId, 20, "Dread Summons", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{X}{B}{B}");
+ this.expansionSetCode = "C15";
+
+ // Each player puts the top X cards of his or her library into his or her graveyard. For each creature card put into a graveyard this way, you put a 2/2 black Zombie creature token onto the battlefield tapped.
+ getSpellAbility().addEffect(new DreadSummonsEffect());
+ }
+
+ public DreadSummons(final DreadSummons card) {
+ super(card);
+ }
+
+ @Override
+ public DreadSummons copy() {
+ return new DreadSummons(this);
+ }
+}
+
+class DreadSummonsEffect extends OneShotEffect {
+
+ public DreadSummonsEffect() {
+ super(Outcome.PutCreatureInPlay);
+ this.staticText = "Each player puts the top X cards of his or her library into his or her graveyard. For each creature card put into a graveyard this way, you put a 2/2 black Zombie creature token onto the battlefield tapped";
+ }
+
+ public DreadSummonsEffect(final DreadSummonsEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public DreadSummonsEffect copy() {
+ return new DreadSummonsEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ int numberOfCards = source.getManaCostsToPay().getX();
+ if (numberOfCards > 0) {
+ int numberOfCreatureCards = 0;
+ for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
+ Player player = game.getPlayer(playerId);
+ if (player != null) {
+ Set