Merge branch 'fix_mana' into mana_cleanup

This commit is contained in:
poixen 2015-11-21 12:04:37 +01:00
commit b08dfa48db
820 changed files with 41210 additions and 5085 deletions

1
.gitignore vendored
View file

@ -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

View file

@ -0,0 +1,85 @@
NAME:Call the Spirits (WB)
1 [C15:312] Barren Moor
1 [C15:172] New Benalia
1 [C15:140] Tainted Field
1 [C15:165] Wayfarer's Bauble
1 [C15:116] Black Market
1 [C15:229] Terramorphic Expanse
1 [C15:6] Dawn to Dusk
1 [C15:281] Command Tower
1 [C15:171] Scoured Barrens
3 [C15:323] Plains
3 [C15:324] Plains
3 [C15:325] Plains
1 [C15:155] Orzhov Signet
1 [C15:142] Orzhov Cluestone
2 [C15:326] Plains
1 [C15:26] Karmic Justice
1 [C15:3] Celestial Archon
1 [C15:22] Kor Sanctifiers
1 [C15:12] Ghostblade Eidolon
1 [C15:201] Treasury Thrull
1 [C15:108] Teysa, Envoy of Ghosts
1 [C15:63] Phyrexian Reclamation
1 [C15:236] Evolving Wilds
1 [C15:2] Ajani's Chosen
1 [C15:324] Secluded Steppe
1 [C15:157] Underworld Coinsmith
1 [C15:84] Vow of Duty
1 [C15:109] Fallen Ideal
1 [C15:25] Mesa Enchantress
1 [C15:5] Banishing Light
1 [C15:7] Celestial Ancient
1 [C15:95] Death Grasp
1 [C15:8] Dictate of Heliod
1 [C15:114] Ancient Craving
1 [C15:46] Karlov of the Ghost Council
1 [C15:153] Orzhov Guildgate
1 [C15:20] Monk Idealist
1 [C15:250] Rogue's Passage
1 [C15:26] Silent Sentinel
1 [C15:68] Fate Unraveler
1 [C15:15] Marshal's Anthem
1 [C15:278] Vivid Marsh
1 [C15:21] Open the Vaults
1 [C15:279] Vivid Meadow
1 [C15:55] Thought Vessel
1 [C15:52] Sandstone Oracle
1 [C15:67] Dreadbringer Lampads
1 [C15:140] Vow of Malice
1 [C15:152] Phyrexian Arena
1 [C15:66] Doomwake Giant
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:274] Sol Ring
1 [C15:82] Necromancer's Covenant
1 [C15:73] Gild
1 [C15:240] Ghost Quarter
1 [C15:31] Sigil of the Empty Throne
1 [C15:22] Thief of Blood
1 [C15:213] Burnished Hart
1 [C15:83] Underworld Connections
1 [C15:67] Grave Peril
1 [C15:16] Dawnglare Invoker
1 [C15:6] Aura of Silence
1 [C15:143] Temple of the False God
4 [C15:331] Swamp
3 [C15:332] Swamp
1 [C15:53] Seal of Doom
3 [C15:333] Swamp
3 [C15:334] Swamp
1 [C15:8] Shielded by Faith
1 [C15:7] Righteous Confluence
1 [C15:6] Oreskos Explorer
1 [C15:4] Herald of the Host
1 [C15:3] Cage of Hands
1 [C15:3] Grasp of Fate
1 [C15:18] Seal of Cleansing
1 [C15:1] Bastion Protector
1 [C15:161] Orzhov Basilica
1 [C15:199] Lightning Greaves
1 [C15:292] Crystal Chimes
1 [C15:98] Nighthowler
SB: 1 [C15:43] Daxos the Returned

View file

@ -0,0 +1,84 @@
NAME:Plunder the Graves (GB)
1 [C15:33] Bloodspore Thrinax
1 [C15:229] Terramorphic Expanse
1 [C15:281] Command Tower
1 [C15:278] Golgari Rot Farm
1 [C15:39] Skullwinder
1 [C15:38] Pathbreaker Ibex
1 [C15:189] Overwhelming Stampede
1 [C15:86] Indrik Stomphowler
1 [C15:37] Great Oak Guardian
1 [C15:35] Centaur Vinecrasher
1 [C15:198] Satyr Wayfinder
1 [C15:140] Mycoloth
1 [C15:34] Caller of the Pack
1 [C15:143] Tainted Wood
1 [C15:204] Terastodon
1 [C15:206] Tribute to the Wild
1 [C15:327] Slippery Karst
1 [C15:323] Polluted Mire
1 [C15:166] Victimize
1 [C15:90] Viridian Zealot
1 [C15:238] Vulturous Zombie
1 [C15:149] Golgari Guildgate
1 [C15:118] Ambition's Cost
1 [C15:189] Kessig Cagebreakers
1 [C15:93] Putrefy
1 [C15:236] Evolving Wilds
1 [C15:75] Wall of Blossoms
1 [C15:87] Primal Growth
1 [C15:153] Phyrexian Plaguelord
1 [C15:283] Wood Elves
1 [C15:95] Viridian Emissary
1 [C15:51] Phyrexian Rager
1 [C15:320] High Market
1 [C15:159] Acidic Slime
1 [C15:199] Eldrazi Monument
1 [C15:48] Mazirek, Kraul Death Priest
1 [C15:262] Golgari Signet
1 [C15:177] Lotleth Troll
1 [C15:176] Korozda Guildmage
1 [C15:86] Eternal Witness
1 [C15:44] Extractor Demon
1 [C15:196] Mulch
1 [C15:115] Sever the Bloodline
1 [C15:53] Butcher of Malakir
1 [C15:239] Sakura-Tribe Elder
1 [C15:66] Eater of Hope
1 [C15:103] Altar's Reap
1 [C15:277] Vivid Grove
1 [C15:63] Champion of Stray Souls
1 [C15:278] Vivid Marsh
1 [C15:55] Thought Vessel
1 [C15:85] Barter in Blood
1 [C15:107] Rise from the Grave
3 [C15:340] Forest
3 [C15:341] Forest
1 [C15:17] Corpse Augur
3 [C15:342] Forest
1 [C15:16] Banshee of the Dread Choir
1 [C15:174] Jarad, Golgari Lich Lord
1 [C15:274] Sol Ring
1 [C15:165] Grisly Salvage
1 [C15:307] Verdant Force
1 [C15:203] Spider Spawning
1 [C15:202] Cloudthresher
1 [C15:22] Thief of Blood
1 [C15:21] Scourge of Nel Toth
1 [C15:20] Dread Summons
1 [C15:140] Skullclamp
3 [C15:331] Swamp
4 [C15:332] Swamp
1 [C15:164] Golgari Charm
3 [C15:333] Swamp
1 [C15:169] Jungle Hollow
3 [C15:334] Swamp
1 [C15:23] Wretched Confluence
1 [C15:156] Grim Backwoods
3 [C15:339] Forest
1 [C15:139] Shriekmaw
1 [C15:199] Lightning Greaves
1 [C15:87] Blood Bairn
1 [C15:130] Diabolic Servitude
1 [C15:100] Bonehoard
SB: 1 [C15:49] Meren of Clan Nel Toth

View file

@ -0,0 +1,72 @@
NAME:Seize Control (UR)
1 [C15:32] Arachnogenesis
1 [C15:76] Monk Idealist
2 [C15:31] Warchief Giant
2 [C15:30] Rite of the Raging Storm
1 [C15:74] Marshal's Anthem
1 [C15:281] Command Tower
1 [C15:72] Karmic Justice
1 [C15:71] Jareth, Leonine Titan
1 [C15:162] Magmaquake
1 [C15:70] Ghostblade Eidolon
1 [C15:163] Mizzium Mortars
1 [C15:126] Fate Unraveler
2 [C15:78] Orim's Thunder
1 [C15:205] Thelonite Hermit
4 [C15:327] Island
4 [C15:328] Island
3 [C15:329] Island
2 [C15:87] Blatant Thievery
2 [C15:42] Arjun, the Shifting Flame
1 [C15:41] Anya, Merciless Angel
1 [C15:84] Vow of Duty
1 [C15:151] Dragon Mage
1 [C15:152] Earthquake
2 [C15:274] Wayfarer's Bauble
1 [C15:153] Faithless Looting
1 [C15:275] Worn Powerstone
2 [C15:111] Windfall
1 [C15:276] Ancient Amphitheater
1 [C15:236] Trygon Predator
2 [C15:159] Hunted Dragon
1 [C15:116] Black Market
1 [C15:318] Vivid Grove
1 [C15:11] Gigantoplasm
1 [C15:55] Thought Vessel
1 [C15:98] Mystic Retrieval
1 [C15:10] Broodbirth Viper
1 [C15:54] Seal of the Guildpact
1 [C15:53] Scytheclaw
1 [C15:140] Vow of Malice
1 [C15:143] Breath of Darigaaz
1 [C15:188] Kodama's Reach
1 [C15:100] Plaxmanta
1 [C15:101] Preordain
1 [C15:59] Arbiter of Knollridge
1 [C15:14] Mystic Confluence
1 [C15:57] Ajani's Chosen
1 [C15:13] Mirror Match
1 [C15:12] Illusory Ambusher
1 [C15:227] Melek, Izzet Paragon
1 [C15:229] Necromancer's Covenant
1 [C15:21] Scourge of Nel Toth
1 [C15:64] Celestial Archon
1 [C15:20] Dread Summons
1 [C15:172] Word of Seizing
2 [C15:61] Banishing Light
1 [C15:250] Crystal Chimes
2 [C15:29] Mizzix's Mastery
3 [C15:330] Island
1 [C15:28] Meteor Volley
1 [C15:178] Chameleon Colossus
1 [C15:9] AEthersnatch
1 [C15:24] Awaken the Sky Tyrant
4 [C15:335] Mountain
1 [C15:67] Dawnglare Invoker
3 [C15:336] Mountain
3 [C15:337] Mountain
1 [C15:139] Victimize
1 [C15:217] Etherium-Horn Sorcerer
3 [C15:338] Mountain
1 [ISD:134] Charmbreaker Devils
SB: 1 [C15:50] Mizzix of the Izmagnus

View file

@ -0,0 +1,80 @@
NAME:Swell the Host (GU)
1 [C15:32] Arachnogenesis
1 [C15:76] Monk Idealist
1 [C15:31] Warchief Giant
1 [C15:281] Command Tower
1 [C15:160] Inferno Titan
1 [C15:161] Magma Giant
1 [C15:120] Diabolic Servitude
1 [C15:121] Doomwake Giant
1 [C15:165] Stoneshock Giant
1 [C15:39] Skullwinder
1 [C15:243] Wistful Selkie
1 [C15:320] Vivid Meadow
1 [C15:166] Sunrise Sovereign
1 [C15:37] Great Oak Guardian
1 [C15:36] Ezuri's Predation
1 [C15:202] Spider Spawning
1 [C15:34] Caller of the Pack
3 [C15:327] Island
3 [C15:328] Island
3 [C15:329] Island
2 [C15:44] Ezuri, Claw of Progress
1 [C15:87] Blatant Thievery
1 [C15:190] Loaming Shaman
1 [C15:86] Bident of Thassa
1 [C15:42] Arjun, the Shifting Flame
1 [C15:270] Staff of Nin
1 [C15:40] Verdant Confluence
1 [C15:150] Disaster Radius
1 [C15:197] Patagia Viper
1 [C15:274] Wayfarer's Bauble
1 [C15:276] Ancient Amphitheater
1 [C15:156] Hamletback Goliath
1 [C15:277] Barren Moor
1 [C15:47] Kaseto, Orochi Archmage
1 [C15:236] Trygon Predator
1 [C15:159] Hunted Dragon
1 [C15:115] Barter in Blood
1 [C15:237] Underworld Coinsmith
1 [C15:89] Blustersquall
1 [C15:116] Black Market
1 [C15:239] Biomantic Mastery
1 [C15:119] Champion of Stray Souls
1 [C15:55] Thought Vessel
1 [C15:10] Broodbirth Viper
2 [C15:180] Cobra Trap
1 [C15:53] Scytheclaw
1 [C15:97] Mulldrifter
1 [C15:186] Indrik Stomphowler
4 [C15:340] Forest
1 [C15:142] Borderland Behemoth
3 [C15:341] Forest
1 [C15:221] Golgari Charm
3 [C15:342] Forest
1 [C15:188] Kodama's Reach
1 [C15:101] Preordain
1 [C15:266] Simic Signet
1 [C15:15] Synthetic Destiny
1 [C15:225] Lorescale Coatl
1 [C15:13] Mirror Match
1 [C15:12] Illusory Ambusher
1 [C15:56] Command Beacon
1 [C15:149] Desperate Ravings
1 [C15:227] Melek, Izzet Paragon
1 [C15:228] Mystic Snake
1 [C15:107] Stolen Goods
1 [C15:229] Necromancer's Covenant
1 [C15:308] Smoldering Crater
1 [C15:171] Warstorm Surge
1 [C15:173] Acidic Slime
1 [C15:130] Phyrexian Arena
3 [C15:175] Bane of Progress
1 [C15:29] Mizzix's Mastery
2 [C15:330] Island
1 [C15:133] Phyrexian Reclamation
1 [C15:216] Epic Experiment
1 [C15:217] Etherium-Horn Sorcerer
4 [C15:339] Forest
1 [C15:219] Gisela, Blade of Goldnight
SB: 1 [C15:44] Ezuri, Claw of Progress

View file

@ -0,0 +1,84 @@
NAME:Wade into Battle (RW).
1 [C15:195] Thundercloud Shaman
1 [C15:275] Boros Garrison
1 [C15:31] Warchief Giant
1 [C15:229] Terramorphic Expanse
1 [C15:175] Wind-Scarred Crag
1 [C15:30] Rite of the Raging Storm
1 [C15:275] Vivid Crag
1 [C15:191] Stinkdrinker Daredevil
1 [C15:281] Command Tower
1 [C15:192] Sunrise Sovereign
1 [C15:317] Forgotten Cave
1 [C15:297] Fellwar Stone
1 [C15:134] Earthquake
1 [C15:104] Fumiko the Lowblood
1 [C15:87] Borderland Behemoth
3 [C15:323] Plains
1 [C15:328] Smoldering Crater
3 [C15:324] Plains
3 [C15:325] Plains
1 [C15:72] Magma Giant
2 [C15:326] Plains
1 [C15:209] Gisela, Blade of Goldnight
1 [C15:160] Warstorm Surge
1 [C15:93] Fall of the Hammer
1 [C15:320] Drifting Meadow
1 [C15:236] Evolving Wilds
1 [C15:266] Ancient Amphitheater
1 [C15:147] Boros Guildgate
1 [C15:141] Disaster Radius
1 [C15:15] Orim's Thunder
1 [C15:324] Secluded Steppe
1 [C15:41] Anya, Merciless Angel
1 [C15:11] Crib Swap
1 [C15:5] Banishing Light
1 [C15:147] Inferno Titan
1 [C15:319] Blasted Landscape
1 [C15:43] Jareth, Leonine Titan
1 [C15:318] Worn Powerstone
1 [C15:235] Basalt Monolith
1 [C15:207] Darksteel Ingot
1 [C15:142] Urza's Incubator
1 [C15:279] Vivid Meadow
1 [C15:39] Sun Titan
1 [C15:55] Thought Vessel
1 [C15:131] Hunted Dragon
1 [C15:255] Boros Signet
1 [C15:57] Desolation Giant
1 [C15:176] Hostility
1 [C15:52] Sandstone Oracle
1 [C15:142] Stoneshock Giant
1 [C15:51] Blade of Selves
1 [C15:1] Angel of Serenity
1 [C15:216] Dreamstone Hedron
1 [C15:130] Hammerfist Giant
1 [C15:274] Sol Ring
1 [C15:16] Faith's Fetters
1 [C15:18] Victory's Herald
1 [C15:130] Seer's Sundial
1 [C15:138] Breath of Darigaaz
1 [C15:2] Arbiter of Knollridge
1 [C15:16] Dawnglare Invoker
1 [C15:217] Staff of Nin
1 [C15:136] Hamletback Goliath
1 [C15:28] Meteor Volley
1 [C15:27] Magus of the Wheel
1 [C15:26] Fiery Confluence
1 [C15:25] Dream Pillager
1 [C15:335] Mind Stone
1 [C15:109] Taurean Mauler
1 [C15:332] Loxodon Warhammer
4 [C15:335] Mountain
4 [C15:336] Mountain
1 [C15:6] Oreskos Explorer
3 [C15:337] Mountain
1 [C15:5] Kalemne's Captain
3 [C15:338] Mountain
1 [C15:4] Herald of the Host
1 [C15:2] Dawnbreak Reclaimer
1 [C15:137] Curse of the Nightly Hunt
1 [C15:199] Lightning Greaves
1 [C15:137] Boros Cluestone
1 [CSP:136] Coldsteel Heart
SB: 1 [C15:45] Kalemne, Disciple of Iroas

View file

@ -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

View file

@ -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")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//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<Event> () {
@Override
public void event(Event event) {
drawPlayers();
new Listener<Event>() {
@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();

View file

@ -802,7 +802,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) {

View file

@ -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.");
}

View file

@ -501,7 +501,7 @@ public class TablesPanel extends javax.swing.JPanel {
// type
List<RowFilter<Object, Object>> 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<RowFilter<Object, Object>> skillFilterList = new ArrayList<>();

View file

@ -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:

View file

@ -81,6 +81,7 @@ public class CardPluginImpl implements CardPlugin {
@PluginLoaded
public void newPlugin(CardPlugin plugin) {
log.info(plugin.toString() + " has been loaded.");
}
@Override

View file

@ -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();
}

View file

@ -157,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());

View file

@ -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<String, String> SET_NAMES_REPLACEMENT = new HashMap<String, String>() {
{
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<TokenData> tokensData = getTokensData();
if (tokensData.isEmpty()) {
return null;
}
List<TokenData> matchedTokens = new ArrayList<TokenData>();
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<TokenData> tokensData;
private final Object tokensDataSync = new Object();
private List<TokenData> getTokensData() throws IOException {
if (tokensData == null) {
synchronized (tokensDataSync) {
if (tokensData == null) {
tokensData = new ArrayList<TokenData>();
// get tokens data from resource file
InputStream inputStream = null;
try {
inputStream = this.getClass().getResourceAsStream("/tokens-mtg-onl-list.csv");
List<TokenData> 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<TokenData> siteTokensData = parseTokensData(inputStream);
List<TokenData> newTokensData = new ArrayList<TokenData>();
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<TokenData> parseTokensData(InputStream inputStream) throws IOException {
List<TokenData> tokensData = new ArrayList<TokenData>();
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;
}
}
}

View file

@ -54,10 +54,7 @@ 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;
@ -138,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();
@ -159,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;
@ -361,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 {

File diff suppressed because it is too large Load diff

View file

@ -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.
Can't render this file because it contains an unexpected character in line 549 and column 138.

View file

@ -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);
}
}

View file

@ -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;
@ -311,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("<span color='green'><i>Chosen mode: " + spell.getSpellAbility().getEffects().getText(modes.get(modeId)) + "</i></span>");
for (Mode mode : spell.getSpellAbility().getModes().getSelectedModes()) {
this.rules.add("<span color='green'><i>Chosen mode: " + mode.getEffects().getText(mode) + "</i></span>");
}
}
}

View file

@ -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;

View file

@ -123,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) {
@ -131,11 +132,12 @@ 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 {
if (object instanceof StackAbility) {

View file

@ -132,6 +132,8 @@ public class PlayerView implements Serializable {
}
}
commandList.add(new EmblemView(emblem, sourceCard));
} else {
commandList.add(new EmblemView(emblem));
}
}
} else if (commandObject instanceof Commander) {
@ -229,7 +231,7 @@ public class PlayerView implements Serializable {
return this.userData;
}
public List<CommandObjectView> getCommadObjectList() {
public List<CommandObjectView> getCommandObjectList() {
return commandList;
}

View file

@ -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<String> 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<UUID> 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("<span color='green'><i>Chosen mode: " + ability.getEffects().getText(modes.get(modeId)) + "</i></span>");
for (Mode mode : modes.getSelectedModes()) {
this.rules.add("<span color='green'><i>Chosen mode: " + mode.getEffects().getText(mode) + "</i></span>");
}
}
}

View file

@ -1,50 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.mage</groupId>
<artifactId>mage-plugins</artifactId>
<version>1.4.4</version>
</parent>
<artifactId>mage-theme-plugin</artifactId>
<packaging>jar</packaging>
<version>0.5</version>
<name>Mage Theme Plugin</name>
<description>Contains resources for drawing background</description>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mage-common</artifactId>
<version>${mage-version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mage-client</artifactId>
<version>1.4.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
<finalName>mage-theme-plugin</finalName>
</build>
</project>

View file

@ -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<String, JComponent> 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<String, JComponent> 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);
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 575 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -16,7 +16,6 @@
<description>Mage Plugins POM</description>
<modules>
<module>Mage.Theme.Plugin</module>
<module>Mage.Counter.Plugin</module>
</modules>

View file

@ -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<String> 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;
}
}

View file

@ -0,0 +1,50 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.mage</groupId>
<artifactId>mage-server-plugins</artifactId>
<version>1.4.4</version>
</parent>
<artifactId>mage-game-momirduel</artifactId>
<packaging>jar</packaging>
<name>Mage Game Momir Basic Two Player</name>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mage</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<finalName>mage-game-momirduel</finalName>
</build>
<properties/>
</project>

View file

@ -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<UUID> getOpponents(UUID playerId) {
Set<UUID> 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<CardInfo> 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;
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -1568,9 +1568,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;
}
}

View file

@ -64,7 +64,16 @@ 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;
@ -790,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<ManaCost> costs = (ManaCostsImpl<ManaCost>) unpaid;
for (ManaCost cost : costs.getUnpaid()) {
if (cost instanceof PhyrexianManaCost) {
@ -1284,12 +1294,27 @@ public class HumanPlayer extends PlayerImpl {
if (modes.size() > 1) {
MageObject obj = game.getObject(source.getSourceId());
Map<UUID, String> 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);
}
@ -1316,6 +1341,7 @@ public class HumanPlayer extends PlayerImpl {
}
return null;
}
return modes.getMode();
}

View file

@ -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", ""));
}
}

View file

@ -17,9 +17,10 @@
<modules>
<module>Mage.Deck.Constructed</module>
<module>Mage.Deck.Limited</module>
<module>Mage.Game.CommanderDuel</module>
<module>Mage.Game.CommanderDuel</module>
<module>Mage.Game.CommanderFreeForAll</module>
<module>Mage.Game.FreeForAll</module>
<module>Mage.Game.MomirDuel</module>
<module>Mage.Game.TinyLeadersDuel</module>
<module>Mage.Game.TwoPlayerDuel</module>
<module>Mage.Player.AI</module>

View file

@ -49,6 +49,7 @@
<gameType name="Commander Two Player Duel" jar="mage-game-commanderduel.jar" className="mage.game.CommanderDuelMatch" typeName="mage.game.CommanderDuelType"/>
<gameType name="Commander Free For All" jar="mage-game-commanderfreeforall.jar" className="mage.game.CommanderFreeForAllMatch" typeName="mage.game.CommanderFreeForAllType"/>
<gameType name="Tiny Leaders Two Player Duel" jar="mage-game-tinyleadersduel.jar" className="mage.game.TinyLeadersDuelMatch" typeName="mage.game.TinyLeadersDuelType"/>
<gameType name="Momir Basic Two Player Duel" jar="mage-game-momirduel.jar" className="mage.game.MomirDuelMatch" typeName="mage.game.MomirDuelType"/>
</gameTypes>
<tournamentTypes>
<tournamentType name="Constructed Elimination" jar="mage-tournament-constructed.jar" className="mage.tournament.ConstructedEliminationTournament" typeName="mage.tournament.ConstructedEliminationTournamentType"/>
@ -78,6 +79,7 @@
<draftCube name="MTGO Legacy Cube (600 cards)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.MTGOLegacyCube"/>
<draftCube name="MTGO Legacy Cube March 2015 (600 cards)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.MTGOLegacyCubeMarch2015"/>
<draftCube name="MTGO Legacy Cube September 2015 (600 cards)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.MTGOLegacyCubeSeptember2015"/>
<draftCube name="MTGO Legendary Cube" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.LegendaryCube"/>
<draftCube name="The Peasant's Toolbox (800 cards)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.PeasantsToolboxCube"/>
<draftCube name="www.MTGCube.com (502 cards)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.MTGCube"/>
</draftCubes>
@ -93,6 +95,7 @@
<deckType name="Variant Magic - Commander" jar="mage-deck-constructed.jar" className="mage.deck.Commander"/>
<deckType name="Variant Magic - Duel Commander" jar="mage-deck-constructed.jar" className="mage.deck.DuelCommander"/>
<deckType name="Variant Magic - Tiny Leaders" jar="mage-deck-constructed.jar" className="mage.deck.TinyLeaders"/>
<deckType name="Variant Magic - Momir Basic" jar="mage-deck-constructed.jar" className="mage.deck.Momir"/>
<deckType name="Block Constructed - Battle for Zendikar" jar="mage-deck-constructed.jar" className="mage.deck.BattleForZendikarBlock"/>
<deckType name="Block Constructed - Innistrad" jar="mage-deck-constructed.jar" className="mage.deck.InnistradBlock"/>
<deckType name="Block Constructed - Kamigawa" jar="mage-deck-constructed.jar" className="mage.deck.KamigawaBlock"/>

View file

@ -142,6 +142,12 @@
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mage-game-momirduel</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>

View file

@ -28,6 +28,7 @@
<gameType name="Commander Two Player Duel" jar="mage-game-commanderduel-${project.version}.jar" className="mage.game.CommanderDuelMatch" typeName="mage.game.CommanderDuelType"/>
<gameType name="Commander Free For All" jar="mage-game-commanderfreeforall-${project.version}.jar" className="mage.game.CommanderFreeForAllMatch" typeName="mage.game.CommanderFreeForAllType"/>
<gameType name="Tiny Leaders Two Player Duel" jar="mage-game-tinyleadersduel-${project.version}.jar" className="mage.game.TinyLeadersDuelMatch" typeName="mage.game.TinyLeadersDuelType"/>
<gameType name="Momir Basic Two Player Duel" jar="mage-game-momirduel-${project.version}.jar" className="mage.game.MomirDuelMatch" typeName="mage.game.MomirDuelType"/>
</gameTypes>
<tournamentTypes>
<tournamentType name="Constructed Elimination" jar="mage-tournament-constructed-${project.version}.jar" className="mage.tournament.ConstructedEliminationTournament" typeName="mage.tournament.ConstructedEliminationTournamentType"/>
@ -57,6 +58,7 @@
<draftCube name="MTGO Legacy Cube (600 cards)" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.MTGOLegacyCube"/>
<draftCube name="MTGO Legacy Cube March 2015 (600 cards)" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.MTGOLegacyCubeMarch2015"/>
<draftCube name="MTGO Legacy Cube September 2015 (600 cards)" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.MTGOLegacyCubeSeptember2015"/>
<draftCube name="MTGO Legendary Cube" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.LegendaryCube"/>
<draftCube name="The Peasant's Toolbox (800 cards)" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.PeasantsToolboxCube"/>
<draftCube name="www.MTGCube.com (502 cards)" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.MTGCube"/>
</draftCubes>
@ -72,6 +74,7 @@
<deckType name="Variant Magic - Commander" jar="mage-deck-constructed-${project.version}.jar" className="mage.deck.Commander"/>
<deckType name="Variant Magic - Duel Commander" jar="mage-deck-constructed-${project.version}.jar" className="mage.deck.DuelCommander"/>
<deckType name="Variant Magic - Tiny Leaders" jar="mage-deck-constructed-${project.version}.jar" className="mage.deck.TinyLeaders"/>
<deckType name="Variant Magic - Momir Basic" jar="mage-deck-constructed-${project.version}.jar" className="mage.deck.Momir"/>
<deckType name="Block Constructed - Battle for Zendikar" jar="mage-deck-constructed.jar" className="mage.deck.BattleForZendikarBlock"/>
<deckType name="Block Constructed - Innistrad" jar="mage-deck-constructed-${project.version}.jar" className="mage.deck.InnistradBlock"/>
<deckType name="Block Constructed - Kamigawa" jar="mage-deck-constructed-${project.version}.jar" className="mage.deck.KamigawaBlock"/>

View file

@ -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() {

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -29,26 +29,31 @@ package mage.sets.apocalypse;
import java.util.UUID;
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.Outcome;
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";
@ -64,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) {
@ -76,34 +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().equals(source.getControllerId()))
|| kicked) {
permanent.destroy(source.getSourceId(), game, false);
}
}
return true;
}
@Override
public DesolationAngelEntersBattlefieldEffect copy() {
return new DesolationAngelEntersBattlefieldEffect(this);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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++;
}

View file

@ -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())) {

View file

@ -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)));
}

View file

@ -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);
}

View file

@ -141,7 +141,7 @@ class StolenGoodsCastFromExileEffect extends AsThoughEffectImpl {
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;
}
}

View file

@ -31,7 +31,6 @@ import java.util.UUID;
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;
@ -87,18 +86,14 @@ 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());
Permanent permanent = game.getPermanent(token.getLastAddedToken());
if (permanent != null) {
SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice this token", 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);
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;

View file

@ -30,7 +30,6 @@ package mage.sets.battleforzendikar;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.common.LandfallAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
@ -44,6 +43,7 @@ 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;
@ -97,13 +97,14 @@ class AkoumStonewakerEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Token token = new AkoumStonewakerElementalToken();
if (token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId())) {
ExileTargetEffect exileEffect = new ExileTargetEffect();
exileEffect.setTargetPointer(new FixedTarget(token.getLastAddedToken()));
DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect);
delayedAbility.setSourceId(source.getSourceId());
delayedAbility.setControllerId(source.getControllerId());
delayedAbility.setSourceObject(source.getSourceObject(game), game);
game.addDelayedTriggeredAbility(delayedAbility);
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;
@ -122,5 +123,6 @@ class AkoumStonewakerElementalToken extends Token {
this.addAbility(TrampleAbility.getInstance());
this.addAbility(HasteAbility.getInstance());
this.setOriginalExpansionSetCode("BFZ");
this.setTokenType(1);
}
}

View file

@ -88,7 +88,7 @@ class OmnathElementalToken extends Token {
OmnathElementalToken() {
super("Elemental", "5/5 red and green Elemental creature token");
setTokenType(1);
setTokenType(2);
setOriginalExpansionSetCode("BFZ");
cardType.add(CardType.CREATURE);
subtype.add("Elemental");

View file

@ -109,16 +109,16 @@ class VoidWinnowerCantCastEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == EventType.CAST_SPELL;
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())) {
MageObject object = game.getObject(event.getSourceId());
if (object != null && (object instanceof Spell)) {
Spell spell = game.getStack().getSpell(event.getTargetId());
if (spell != null) {
// the low bit will always be set on an odd number.
return (((Spell) object).getConvertedManaCost() & 1) == 0;
return (spell.getConvertedManaCost() & 1) == 0;
}
}
return false;

View file

@ -30,6 +30,7 @@ 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;
@ -102,9 +103,8 @@ class ZadaHedronGrinderTriggeredAbility extends TriggeredAbilityImpl {
Spell spell = game.getStack().getSpell(event.getTargetId());
if (isControlledInstantOrSorcery(spell)) {
boolean targetsSource = false;
for (UUID modeId : spell.getSpellAbility().getModes().getSelectedModes()) {
spell.getSpellAbility().getModes().setActiveMode(modeId);
for (Target target : spell.getSpellAbility().getTargets()) {
for (Mode mode : spell.getSpellAbility().getModes().getSelectedModes()) {
for (Target target : mode.getTargets()) {
for (UUID targetId : target.getTargets()) {
if (targetId.equals(getSourceId())) {
targetsSource = true;
@ -161,9 +161,8 @@ class ZadaHedronGrinderEffect extends OneShotEffect {
if (spell != null && controller != null) {
Target usedTarget = null;
setUsedTarget:
for (UUID modeId : spell.getSpellAbility().getModes().getSelectedModes()) {
spell.getSpellAbility().getModes().setActiveMode(modeId);
for (Target target : spell.getSpellAbility().getTargets()) {
for (Mode mode : spell.getSpellAbility().getModes().getSelectedModes()) {
for (Target target : mode.getTargets()) {
if (target.getFirstTarget().equals(source.getSourceId())) {
usedTarget = target.copy();
usedTarget.clearChosen();
@ -178,9 +177,8 @@ class ZadaHedronGrinderEffect extends OneShotEffect {
if (!creature.getId().equals(source.getSourceId()) && usedTarget.canTarget(source.getControllerId(), creature.getId(), source, game)) {
Spell copy = spell.copySpell();
setTarget:
for (UUID modeId : spell.getSpellAbility().getModes().getSelectedModes()) {
copy.getSpellAbility().getModes().setActiveMode(modeId);
for (Target target : copy.getSpellAbility().getTargets()) {
for (Mode mode : spell.getSpellAbility().getModes().getSelectedModes()) {
for (Target target : mode.getTargets()) {
if (target.getClass().equals(usedTarget.getClass()) && target.getMessage().equals(usedTarget.getMessage())) {
target.clearChosen();
target.add(creature.getId(), game);

View file

@ -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 ");

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -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);
}
}

View file

@ -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);

View file

@ -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);
}
}

View file

@ -131,7 +131,7 @@ 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";
}

View file

@ -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";
}
}

View file

@ -129,20 +129,22 @@ class NahiriTheLithomancerFirstAbilityEffect extends OneShotEffect {
if (controller != null) {
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);
}
}
}

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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";
}
}

View file

@ -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";
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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();
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

Some files were not shown because too many files have changed in this diff Show more