forked from External/mage
Merge branch 'External-master'
All checks were successful
/ example-docker-compose (push) Successful in 25m30s
All checks were successful
/ example-docker-compose (push) Successful in 25m30s
This commit is contained in:
commit
9e6e731a9e
110 changed files with 5687 additions and 591 deletions
|
|
@ -322,7 +322,6 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
if (cn.equals("acid rain")
|
||||
|| cn.equals("agent of treachery")
|
||||
|| cn.equals("anafenza, the foremost")
|
||||
|| cn.equals("ancient tomb")
|
||||
|| cn.equals("animar, soul of element")
|
||||
|| cn.equals("animate artifact")
|
||||
|| cn.equals("apocalypse")
|
||||
|
|
@ -352,7 +351,6 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("cabal coffers")
|
||||
|| cn.equals("candelabra of tawnos")
|
||||
|| cn.equals("captain sisay")
|
||||
|| cn.equals("card view")
|
||||
|| cn.equals("cataclysm")
|
||||
|| cn.equals("catastrophe")
|
||||
|| cn.equals("celestial dawn")
|
||||
|
|
@ -368,7 +366,6 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("contamination")
|
||||
|| cn.equals("craterhoof behemoth")
|
||||
|| cn.equals("cryptic gateway")
|
||||
|| cn.equals("cyclonic rift")
|
||||
|| cn.equals("deadeye navigator")
|
||||
|| cn.equals("death cloud")
|
||||
|| cn.equals("decree of annihilation")
|
||||
|
|
@ -377,6 +374,7 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("demonic consultation")
|
||||
|| cn.equals("derevi, empyrial tactician")
|
||||
|| cn.equals("devastation")
|
||||
|| cn.equals("dictate of erebos")
|
||||
|| cn.equals("dig through time")
|
||||
|| cn.equals("divine intervention")
|
||||
|| cn.equals("dockside extortionist")
|
||||
|
|
@ -385,34 +383,35 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("drannith magistrate")
|
||||
|| cn.equals("dross scorpion")
|
||||
|| cn.equals("earthcraft")
|
||||
|| cn.equals("edgar markov")
|
||||
|| cn.equals("edric, spymaster of trest")
|
||||
|| cn.equals("elesh norn, grand cenobite")
|
||||
|| cn.equals("elesh norn, mother of machines")
|
||||
|| cn.equals("embargo")
|
||||
|| cn.equals("emrakul, the promised end")
|
||||
|| cn.equals("enter the infinite")
|
||||
|| cn.equals("entomb")
|
||||
|| cn.equals("epicenter")
|
||||
|| cn.equals("erratic portal")
|
||||
|| cn.equals("expropriate")
|
||||
|| cn.equals("exquisite blood")
|
||||
|| cn.equals("fall of the thran")
|
||||
|| cn.equals("fierce guardianship")
|
||||
|| cn.equals("farewell")
|
||||
|| cn.equals("flashfires")
|
||||
|| cn.equals("food chain")
|
||||
|| cn.equals("force of negation")
|
||||
|| cn.equals("force of will")
|
||||
|| cn.equals("future sight")
|
||||
|| cn.equals("gaddock teeg")
|
||||
|| cn.equals("gaea's cradle")
|
||||
|| cn.equals("genesis chamber")
|
||||
|| cn.equals("ghave, guru of spores")
|
||||
|| cn.equals("gilded drake")
|
||||
|| cn.equals("glenn, the voice of calm")
|
||||
|| cn.equals("global ruin")
|
||||
|| cn.equals("golos, tireless pilgrim")
|
||||
|| cn.equals("grand arbiter augustin iv")
|
||||
|| cn.equals("grave pact")
|
||||
|| cn.equals("grave titan")
|
||||
|| cn.equals("great whale")
|
||||
|| cn.equals("gregor, shrewd magistrate")
|
||||
|| cn.equals("greymond, avacyn's stalwart")
|
||||
|| cn.equals("grim monolith")
|
||||
|| cn.equals("grip of chaos")
|
||||
|| cn.equals("gush")
|
||||
|
|
@ -421,21 +420,23 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("hokori, dust drinker")
|
||||
|| cn.equals("humility")
|
||||
|| cn.equals("impending disaster")
|
||||
|| cn.equals("imperial seal")
|
||||
|| cn.equals("intruder alarm")
|
||||
|| cn.equals("invoke prejudice")
|
||||
|| cn.equals("iona, shield of emeria")
|
||||
|| cn.equals("jin-gitaxias, core augur")
|
||||
|| cn.equals("jeweled lotus")
|
||||
|| cn.equals("jin-gitaxias, progress tyrant")
|
||||
|| cn.equals("jokulhaups")
|
||||
|| cn.equals("kaalia of the vast")
|
||||
|| cn.equals("karador, ghost chieftain")
|
||||
|| cn.equals("karakas")
|
||||
|| cn.equals("karn, silver golem")
|
||||
|| cn.equals("karn, the great creator")
|
||||
|| cn.equals("kataki, war's wage")
|
||||
|| cn.equals("keldon firebombers")
|
||||
|| cn.equals("kiki-jiki, mirror breaker")
|
||||
|| cn.equals("kinnan, bonder prodigy")
|
||||
|| cn.equals("knowledge pool")
|
||||
|| cn.equals("koma, cosmos serpent")
|
||||
|| cn.equals("korvold, fae-cursed king")
|
||||
|| cn.equals("kozilek, butcher of truth")
|
||||
|| cn.equals("krark-clan ironworks")
|
||||
|| cn.equals("krenko, mob boss")
|
||||
|
|
@ -452,10 +453,10 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("maelstrom wanderer")
|
||||
|| cn.equals("magister sphinx")
|
||||
|| cn.equals("malfegor")
|
||||
|| cn.equals("malik, grim manipulator")
|
||||
|| cn.equals("mana breach")
|
||||
|| cn.equals("mana crypt")
|
||||
|| cn.equals("mana drain")
|
||||
|| cn.equals("mana vault")
|
||||
|| cn.equals("mana vortex")
|
||||
|| cn.equals("master of cruelties")
|
||||
|| cn.equals("memnarch")
|
||||
|
|
@ -468,6 +469,7 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("minion reflector")
|
||||
|| cn.equals("mycosynth lattice")
|
||||
|| cn.equals("myr turbine")
|
||||
|| cn.equals("nadu, winged wisdom")
|
||||
|| cn.equals("narset, enlightened master")
|
||||
|| cn.equals("narset, parter of veils")
|
||||
|| cn.equals("nath of the gilt-leaf")
|
||||
|
|
@ -487,8 +489,8 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("oloro, ageless ascetic")
|
||||
|| cn.equals("omniscience")
|
||||
|| cn.equals("opalescence")
|
||||
|| cn.equals("opposition agent")
|
||||
|| cn.equals("oppression")
|
||||
|| cn.equals("orcish bowmasters")
|
||||
|| cn.equals("ornithopter")
|
||||
|| cn.equals("overwhelming splendor")
|
||||
|| cn.equals("palinchron")
|
||||
|
|
@ -504,7 +506,6 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("purphoros, god of the forge")
|
||||
|| cn.equals("ravages of war")
|
||||
|| cn.equals("reclamation sage")
|
||||
|| cn.equals("rhystic study")
|
||||
|| cn.equals("rick, steadfast leader")
|
||||
|| cn.equals("rings of brighthearth")
|
||||
|| cn.equals("rising waters")
|
||||
|
|
@ -515,12 +516,11 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("seedborn muse")
|
||||
|| cn.equals("sen triplets")
|
||||
|| cn.equals("sensei's divining top")
|
||||
|| cn.equals("serra's sanctum")
|
||||
|| cn.equals("sheoldred, the apocalypse")
|
||||
|| cn.equals("sheoldred, whispering one")
|
||||
|| cn.equals("sire of insanity")
|
||||
|| cn.equals("skithiryx, the blight dragon")
|
||||
|| cn.equals("smokestack")
|
||||
|| cn.equals("smothering tithe")
|
||||
|| cn.equals("sol ring")
|
||||
|| cn.equals("sorin markov")
|
||||
|| cn.equals("splinter twin")
|
||||
|
|
@ -532,8 +532,6 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("storm cauldron")
|
||||
|| cn.equals("strip mine")
|
||||
|| cn.equals("sunder")
|
||||
|| cn.equals("survival of the fittest")
|
||||
|| cn.equals("table view")
|
||||
|| cn.equals("tainted aether")
|
||||
|| cn.equals("tangle wire")
|
||||
|| cn.equals("tectonic break")
|
||||
|
|
@ -543,21 +541,19 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("teferi, master of time")
|
||||
|| cn.equals("teferi, time raveler")
|
||||
|| cn.equals("temporal manipulation")
|
||||
|| cn.equals("tergrid, god of fright")
|
||||
|| cn.equals("text view")
|
||||
|| cn.equals("tezzeret the seeker")
|
||||
|| cn.equals("thassa's oracle")
|
||||
|| cn.equals("the chain veil")
|
||||
|| cn.equals("the tabernacle at pendrell vale")
|
||||
|| cn.equals("thieves' auction")
|
||||
|| cn.equals("thoughts of ruin")
|
||||
|| cn.equals("thrasios, triton hero")
|
||||
|| cn.equals("time sieve")
|
||||
|| cn.equals("time stretch")
|
||||
|| cn.equals("time warp")
|
||||
|| cn.equals("tinker")
|
||||
|| cn.equals("tooth and nail")
|
||||
|| cn.equals("torment of hailfire")
|
||||
|| cn.equals("torpor orb")
|
||||
|| cn.equals("toxrill, the corrosive")
|
||||
|| cn.equals("training grounds")
|
||||
|| cn.equals("treasure cruise")
|
||||
|| cn.equals("triskelavus")
|
||||
|
|
@ -566,18 +562,20 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("turnabout")
|
||||
|| cn.equals("ugin, the spirit dragon")
|
||||
|| cn.equals("ulamog, the ceaseless hunger")
|
||||
|| cn.equals("ulamog, the defiler")
|
||||
|| cn.equals("ulamog, the infinite gyre")
|
||||
|| cn.equals("umbral mantle")
|
||||
|| cn.equals("urabrask the hidden")
|
||||
|| cn.equals("urza, lord high artificer")
|
||||
|| cn.equals("uyo, silent prophet")
|
||||
|| cn.equals("void winnower")
|
||||
|| cn.equals("voltaic key")
|
||||
|| cn.equals("vorinclex, voice of hunger")
|
||||
|| cn.equals("vorinclex, monstrous raider")
|
||||
|| cn.equals("wake of destruction")
|
||||
|| cn.equals("warp world")
|
||||
|| cn.equals("winter moon")
|
||||
|| cn.equals("winter orb")
|
||||
|| cn.equals("workhorse")
|
||||
|| cn.equals("worldfire")
|
||||
|| cn.equals("worldgorger dragon")
|
||||
|| cn.equals("worthy cause")
|
||||
|| cn.equals("xanathar, guild kingpin")
|
||||
|
|
@ -586,6 +584,111 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator {
|
|||
|| cn.equals("zur the enchanter")) {
|
||||
thisMaxPower = Math.max(thisMaxPower, 12);
|
||||
}
|
||||
|
||||
// Parts of infinite combos
|
||||
if (cn.equals("animate artifact") || cn.equals("animar, soul of element")
|
||||
|| cn.equals("archaeomancer")
|
||||
|| cn.equals("ashnod's altar") || cn.equals("azami, lady of scrolls")
|
||||
|| cn.equals("aura flux")
|
||||
|| cn.equals("basalt monolith") || cn.equals("brago, king eternal")
|
||||
|| cn.equals("candelabra of tawnos") || cn.equals("cephalid aristocrat")
|
||||
|| cn.equals("cephalid illusionist") || cn.equals("changeling berserker")
|
||||
|| cn.equals("consecrated sphinx")
|
||||
|| cn.equals("cyclonic rift")
|
||||
|| cn.equals("the chain veil")
|
||||
|| cn.equals("cinderhaze wretch") || cn.equals("cryptic gateway")
|
||||
|| cn.equals("deadeye navigator") || cn.equals("derevi, empyrial tactician")
|
||||
|| cn.equals("doubling season") || cn.equals("dross scorpion")
|
||||
|| cn.equals("earthcraft") || cn.equals("erratic portal")
|
||||
|| cn.equals("enter the infinite") || cn.equals("omniscience")
|
||||
|| cn.equals("exquisite blood") || cn.equals("future sight")
|
||||
|| cn.equals("genesis chamber")
|
||||
|| cn.equals("ghave, guru of spores")
|
||||
|| cn.equals("grave pact")
|
||||
|| cn.equals("grave titan") || cn.equals("great whale")
|
||||
|| cn.equals("grim monolith") || cn.equals("gush")
|
||||
|| cn.equals("hellkite charger") || cn.equals("intruder alarm")
|
||||
|| cn.equals("helm of obedience")
|
||||
|| cn.equals("hermit druid")
|
||||
|| cn.equals("humility")
|
||||
|| cn.equals("iona, shield of emeria")
|
||||
|| cn.equals("karn, silver golem") || cn.equals("kiki-jiki, mirror breaker")
|
||||
|| cn.equals("krark-clan ironworks") || cn.equals("krenko, mob boss")
|
||||
|| cn.equals("krosan restorer") || cn.equals("laboratory maniac")
|
||||
|| cn.equals("leonin relic-warder") || cn.equals("leyline of the void")
|
||||
|| cn.equals("memnarch")
|
||||
|| cn.equals("meren of clan nel toth") || cn.equals("mikaeus, the unhallowed")
|
||||
|| cn.equals("mindcrank") || cn.equals("mindslaver")
|
||||
|| cn.equals("minion reflector") || cn.equals("mycosynth lattice")
|
||||
|| cn.equals("myr turbine") || cn.equals("narset, enlightened master")
|
||||
|| cn.equals("nekusar, the mindrazer") || cn.equals("norin the wary")
|
||||
|| cn.equals("notion thief")
|
||||
|| cn.equals("opalescence") || cn.equals("ornithopter")
|
||||
|| cn.equals("paradox engine")
|
||||
|| cn.equals("purphoros, god of the forge")
|
||||
|| cn.equals("peregrine drake") || cn.equals("palinchron")
|
||||
|| cn.equals("planar portal") || cn.equals("power artifact")
|
||||
|| cn.equals("rings of brighthearth") || cn.equals("rite of replication")
|
||||
|| cn.equals("sanguine bond") || cn.equals("sensei's divining top")
|
||||
|| cn.equals("splinter twin") || cn.equals("stony silence")
|
||||
|| cn.equals("sunder")
|
||||
|| cn.equals("storm cauldron") || cn.equals("teferi's puzzle box")
|
||||
|| cn.equals("tangle wire")
|
||||
|| cn.equals("teferi, mage of zhalfir")
|
||||
|| cn.equals("tezzeret the seeker") || cn.equals("time stretch")
|
||||
|| cn.equals("time warp") || cn.equals("training grounds")
|
||||
|| cn.equals("triskelavus") || cn.equals("triskelion")
|
||||
|| cn.equals("turnabout") || cn.equals("umbral mantle")
|
||||
|| cn.equals("uyo, silent prophet") || cn.equals("voltaic key")
|
||||
|| cn.equals("workhorse") || cn.equals("worldgorger dragon")
|
||||
|| cn.equals("worthy cause") || cn.equals("yawgmoth's will")
|
||||
|| cn.equals("zealous conscripts")) {
|
||||
thisMaxPower = Math.max(thisMaxPower, 15);
|
||||
}
|
||||
|
||||
// Game changers
|
||||
if (cn.equals("ad nauseam")
|
||||
|| cn.equals("ancient tomb")
|
||||
|| cn.equals("bolas's citadel")
|
||||
|| cn.equals("chrome mox")
|
||||
|| cn.equals("cyclonic rift")
|
||||
|| cn.equals("demonic tutor")
|
||||
|| cn.equals("drannith magistrate")
|
||||
|| cn.equals("enlightened tutor")
|
||||
|| cn.equals("expropriate")
|
||||
|| cn.equals("fierce guardianship")
|
||||
|| cn.equals("force of will")
|
||||
|| cn.equals("gaea's cradle")
|
||||
|| cn.equals("glacial chasm")
|
||||
|| cn.equals("grand arbiter augustin iv")
|
||||
|| cn.equals("grim monolith")
|
||||
|| cn.equals("imperial seal")
|
||||
|| cn.equals("jeska's will")
|
||||
|| cn.equals("jin-gitaxias, core augur")
|
||||
|| cn.equals("kinnan, bonder prodigy")
|
||||
|| cn.equals("lion's eye diamond")
|
||||
|| cn.equals("mana vault")
|
||||
|| cn.equals("mox diamond")
|
||||
|| cn.equals("mystical tutor")
|
||||
|| cn.equals("opposition agent")
|
||||
|| cn.equals("rhystic study")
|
||||
|| cn.equals("serra's sanctum")
|
||||
|| cn.equals("smothering tithe")
|
||||
|| cn.equals("survival of the fittest")
|
||||
|| cn.equals("tergrid, god of fright")
|
||||
|| cn.equals("thassa's oracle")
|
||||
|| cn.equals("the one ring")
|
||||
|| cn.equals("the tabernacle at pendrell vale")
|
||||
|| cn.equals("trinisphere")
|
||||
|| cn.equals("trouble in pairs")
|
||||
|| cn.equals("underworld breach")
|
||||
|| cn.equals("urza, lord high artificer")
|
||||
|| cn.equals("vampiric tutor")
|
||||
|| cn.equals("vorinclex, voice of hunger")
|
||||
|| cn.equals("winota, joiner of forces")
|
||||
|| cn.equals("yuriko, the tiger's shadow")) {
|
||||
thisMaxPower = Math.max(thisMaxPower, 20);
|
||||
}
|
||||
return thisMaxPower;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ public class ScryfallApiCard {
|
|||
//public String watermark; // background watermark image for some cards
|
||||
|
||||
public void prepareCompatibleData() {
|
||||
// take images from main card
|
||||
if (this.image_uris != null) {
|
||||
this.imageSmall = this.image_uris.getOrDefault("small", "");
|
||||
this.imageNormal = this.image_uris.getOrDefault("normal", "");
|
||||
|
|
@ -48,6 +49,7 @@ public class ScryfallApiCard {
|
|||
this.image_uris = null;
|
||||
}
|
||||
|
||||
// take first available images from one of the faces
|
||||
if (this.card_faces != null) {
|
||||
this.card_faces.forEach(ScryfallApiCardFace::prepareCompatibleData);
|
||||
}
|
||||
|
|
@ -88,11 +90,33 @@ public class ScryfallApiCard {
|
|||
// - scryfall: Command Tower // Command Tower
|
||||
// - xmage: Command Tower (second side as diff card and direct link image), example: https://scryfall.com/card/rex/26/command-tower-command-tower
|
||||
if (this.layout.equals("reversible_card")) {
|
||||
if (this.card_faces.get(0).layout == null || this.card_faces.get(0).layout.equals("normal")) {
|
||||
// simple card
|
||||
// Command Tower // Command Tower
|
||||
// https://scryfall.com/card/rex/26/command-tower-command-tower
|
||||
if (!this.card_faces.get(0).name.equals(this.card_faces.get(1).name)) {
|
||||
throw new IllegalArgumentException("Scryfall: unsupported data type, reversible_card has diff faces "
|
||||
throw new IllegalArgumentException("Scryfall: unsupported data type, normal reversible_card must have same name in faces"
|
||||
+ this.set + " - " + this.collector_number + " - " + this.name);
|
||||
}
|
||||
this.name = this.card_faces.get(0).name;
|
||||
} else if (this.card_faces.get(0).layout.equals("adventure")) {
|
||||
// adventure card
|
||||
// Bloomvine Regent // Claim Territory
|
||||
// https://scryfall.com/card/tdm/381/bloomvine-regent-claim-territory-bloomvine-regent
|
||||
this.name = this.card_faces.get(0).name;
|
||||
if (this.card_faces.get(0).name.equals(this.card_faces.get(1).name)) {
|
||||
throw new IllegalArgumentException("Scryfall: unsupported data type, adventure's reversible_card must have diff names in faces "
|
||||
+ this.set + " - " + this.collector_number + " - " + this.name);
|
||||
}
|
||||
} else if (this.card_faces.get(0).layout.equals("token")) {
|
||||
// token (it's not used for xmage's tokens, but must pass checks here anyway)
|
||||
// Mechtitan // Mechtitan
|
||||
// https://scryfall.com/card/sld/1969/mechtitan-mechtitan
|
||||
this.name = this.card_faces.get(0).name;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Scryfall: unsupported layout type in reversible_card - "
|
||||
+ this.card_faces.get(0).layout + " - " + this.set + " - " + this.collector_number + " - " + this.name);
|
||||
}
|
||||
}
|
||||
|
||||
// workaround for non ascii names
|
||||
|
|
@ -104,7 +128,6 @@ public class ScryfallApiCard {
|
|||
// - scryfall uses unicode numbers for reprints like Chandra Nalaar - dd2 - 34★ https://scryfall.com/card/dd2/34%E2%98%85/
|
||||
// - xmage uses ascii alternative Chandra Nalaar - dd2 - 34*
|
||||
this.collector_number = transformCardNumberFromScryfallToXmage(this.collector_number);
|
||||
|
||||
}
|
||||
|
||||
public static String transformCardNumberFromXmageToScryfall(String cardNumber) {
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import java.util.Map;
|
|||
*/
|
||||
public class ScryfallApiCardFace {
|
||||
public String name;
|
||||
public String layout;
|
||||
public Map<String, String> image_uris;
|
||||
|
||||
// fast access fields, fills on loading
|
||||
|
|
|
|||
|
|
@ -511,8 +511,7 @@ public class ScryfallImageSource implements CardImageSource {
|
|||
jsonReader.close();
|
||||
return bulkCardsDatabaseAll.size() > 0;
|
||||
} catch (Exception e) {
|
||||
logger.error("Can't read bulk file (possible reason: broken format)");
|
||||
logger.error(e.toString());
|
||||
logger.error("Can't read bulk file (possible reason: broken scryfall format), details: " + e);
|
||||
try {
|
||||
// clean up
|
||||
if (!SCRYFALL_BULK_FILES_DEBUG_READ_ONLY_MODE) {
|
||||
|
|
|
|||
|
|
@ -2601,7 +2601,7 @@ public class ScryfallImageSupportTokens {
|
|||
put("DFT/Vehicle", "https://api.scryfall.com/cards/tdft/12/en?format=image");
|
||||
put("DFT/Zombie", "https://api.scryfall.com/cards/tdft/3/en?format=image");
|
||||
|
||||
// DTC
|
||||
// DRC
|
||||
put("DRC/Beast/1", "https://api.scryfall.com/cards/tdrc/10/en?format=image");
|
||||
put("DRC/Beast/2", "https://api.scryfall.com/cards/tdrc/11/en?format=image");
|
||||
put("DRC/Construct", "https://api.scryfall.com/cards/tdrc/12/en?format=image");
|
||||
|
|
@ -2615,6 +2615,30 @@ public class ScryfallImageSupportTokens {
|
|||
put("DRC/Zombie Army", "https://api.scryfall.com/cards/tdrc/8/en?format=image");
|
||||
put("DRC/Zombie Warrior", "https://api.scryfall.com/cards/tdrc/9/en?format=image");
|
||||
|
||||
// TDC
|
||||
put("TDC/Angel", "https://api.scryfall.com/cards/ttdc/2/en?format=image");
|
||||
put("TDC/Citizen", "https://api.scryfall.com/cards/ttdc/26/en?format=image");
|
||||
put("TDC/Dog", "https://api.scryfall.com/cards/ttdc/3/en?format=image");
|
||||
put("TDC/Dragon Illusion", "https://api.scryfall.com/cards/ttdc/15/en?format=image");
|
||||
put("TDC/Eldrazi", "https://api.scryfall.com/cards/ttdc/1/en?format=image");
|
||||
put("TDC/Elemental/1", "https://api.scryfall.com/cards/ttdc/16/en?format=image");
|
||||
put("TDC/Elemental/2", "https://api.scryfall.com/cards/ttdc/17/en?format=image");
|
||||
put("TDC/Elemental/3", "https://api.scryfall.com/cards/ttdc/27/en?format=image");
|
||||
put("TDC/First Mate Ragavan", "https://api.scryfall.com/cards/ttdc/18/en?format=image");
|
||||
put("TDC/Goat", "https://api.scryfall.com/cards/ttdc/4/en?format=image");
|
||||
put("TDC/Gold", "https://api.scryfall.com/cards/ttdc/29/en?format=image");
|
||||
put("TDC/Human", "https://api.scryfall.com/cards/ttdc/5/en?format=image");
|
||||
put("TDC/Insect", "https://api.scryfall.com/cards/ttdc/22/en?format=image");
|
||||
put("TDC/Myr", "https://api.scryfall.com/cards/ttdc/30/en?format=image");
|
||||
put("TDC/Plant", "https://api.scryfall.com/cards/ttdc/24/en?format=image");
|
||||
put("TDC/Rat", "https://api.scryfall.com/cards/ttdc/9/en?format=image");
|
||||
put("TDC/Salamander Warrior", "https://api.scryfall.com/cards/ttdc/8/en?format=image");
|
||||
put("TDC/Servo", "https://api.scryfall.com/cards/ttdc/31/en?format=image");
|
||||
put("TDC/Snake", "https://api.scryfall.com/cards/ttdc/10/en?format=image");
|
||||
put("TDC/Soldier", "https://api.scryfall.com/cards/ttdc/32/en?format=image");
|
||||
put("TDC/Spirit", "https://api.scryfall.com/cards/ttdc/6/en?format=image");
|
||||
put("TDC/Thopter", "https://api.scryfall.com/cards/ttdc/33/en?format=image");
|
||||
|
||||
// generate supported sets
|
||||
supportedSets.clear();
|
||||
for (String cardName : this.keySet()) {
|
||||
|
|
|
|||
|
|
@ -581,82 +581,268 @@ public abstract class AbstractCommander extends Constructed {
|
|||
}
|
||||
|
||||
String cn = card.getName().toLowerCase(Locale.ENGLISH);
|
||||
if (cn.equals("ancient tomb")
|
||||
// Saltiest cards (edhrec)
|
||||
if (cn.equals("acid rain")
|
||||
|| cn.equals("agent of treachery")
|
||||
|| cn.equals("anafenza, the foremost")
|
||||
|| cn.equals("animar, soul of element")
|
||||
|| cn.equals("animate artifact")
|
||||
|| cn.equals("apocalypse")
|
||||
|| cn.equals("archaeomancer")
|
||||
|| cn.equals("arcum dagsson")
|
||||
|| cn.equals("armageddon")
|
||||
|| cn.equals("ashnod's altar")
|
||||
|| cn.equals("atraxa, praetors' voice")
|
||||
|| cn.equals("aura flux")
|
||||
|| cn.equals("aura shards")
|
||||
|| cn.equals("avacyn, angel of hope")
|
||||
|| cn.equals("azami, lady of scrolls")
|
||||
|| cn.equals("azusa, lost but seeking")
|
||||
|| cn.equals("back to basics")
|
||||
|| cn.equals("bane of progress")
|
||||
|| cn.equals("basalt monolith")
|
||||
|| cn.equals("bend or break")
|
||||
|| cn.equals("blightsteel collossus")
|
||||
|| cn.equals("blightsteel colossus")
|
||||
|| cn.equals("blood moon")
|
||||
|| cn.equals("boil")
|
||||
|| cn.equals("boiling seas")
|
||||
|| cn.equals("brago, king eternal")
|
||||
|| cn.equals("braids, cabal minion")
|
||||
|| cn.equals("bribery")
|
||||
|| cn.equals("burning sands")
|
||||
|| cn.equals("cabal coffers")
|
||||
|| cn.equals("candelabra of tawnos")
|
||||
|| cn.equals("captain sisay")
|
||||
|| cn.equals("cataclysm")
|
||||
|| cn.equals("catastrophe")
|
||||
|| cn.equals("celestial dawn")
|
||||
|| cn.equals("cephalid aristocrat")
|
||||
|| cn.equals("cephalid illusionist")
|
||||
|| cn.equals("changeling berserker")
|
||||
|| cn.equals("child of alara")
|
||||
|| cn.equals("chulane, teller of tales")
|
||||
|| cn.equals("cinderhaze wretch")
|
||||
|| cn.equals("coalition relic")
|
||||
|| cn.equals("confusion in the ranks")
|
||||
|| cn.equals("consecrated sphinx")
|
||||
|| cn.equals("contamination")
|
||||
|| cn.equals("craterhoof behemoth")
|
||||
|| cn.equals("cryptic gateway")
|
||||
|| cn.equals("deadeye navigator")
|
||||
|| cn.equals("death cloud")
|
||||
|| cn.equals("decree of annihilation")
|
||||
|| cn.equals("decree of silence")
|
||||
|| cn.equals("deepglow skate")
|
||||
|| cn.equals("demonic consultation")
|
||||
|| cn.equals("derevi, empyrial tactician")
|
||||
|| cn.equals("devastation")
|
||||
|| cn.equals("dictate of erebos")
|
||||
|| cn.equals("dig through time")
|
||||
|| cn.equals("divine intervention")
|
||||
|| cn.equals("dockside extortionist")
|
||||
|| cn.equals("doomsday")
|
||||
|| cn.equals("doubling season")
|
||||
|| cn.equals("drannith magistrate")
|
||||
|| cn.equals("dross scorpion")
|
||||
|| cn.equals("earthcraft")
|
||||
|| cn.equals("edgar markov")
|
||||
|| cn.equals("edric, spymaster of trest")
|
||||
|| cn.equals("elesh norn, grand cenobite")
|
||||
|| cn.equals("elesh norn, mother of machines")
|
||||
|| cn.equals("embargo")
|
||||
|| cn.equals("emrakul, the promised end")
|
||||
|| cn.equals("enter the infinite")
|
||||
|| cn.equals("entomb")
|
||||
|| cn.equals("force of will")
|
||||
|| cn.equals("epicenter")
|
||||
|| cn.equals("erratic portal")
|
||||
|| cn.equals("exquisite blood")
|
||||
|| cn.equals("fall of the thran")
|
||||
|| cn.equals("farewell")
|
||||
|| cn.equals("flashfires")
|
||||
|| cn.equals("food chain")
|
||||
|| cn.equals("force of negation")
|
||||
|| cn.equals("future sight")
|
||||
|| cn.equals("gaddock teeg")
|
||||
|| cn.equals("gaea's cradle")
|
||||
|| cn.equals("grand arbiter augustin iv")
|
||||
|| cn.equals("grim monolith")
|
||||
|| cn.equals("genesis chamber")
|
||||
|| cn.equals("ghave, guru of spores")
|
||||
|| cn.equals("gilded drake")
|
||||
|| cn.equals("glenn, the voice of calm")
|
||||
|| cn.equals("global ruin")
|
||||
|| cn.equals("golos, tireless pilgrim")
|
||||
|| cn.equals("grave pact")
|
||||
|| cn.equals("grave titan")
|
||||
|| cn.equals("great whale")
|
||||
|| cn.equals("gregor, shrewd magistrate")
|
||||
|| cn.equals("greymond, avacyn's stalwart")
|
||||
|| cn.equals("grip of chaos")
|
||||
|| cn.equals("gush")
|
||||
|| cn.equals("hellkite charger")
|
||||
|| cn.equals("hermit druid")
|
||||
|| cn.equals("hokori, dust drinker")
|
||||
|| cn.equals("humility")
|
||||
|| cn.equals("imperial seal")
|
||||
|| cn.equals("impending disaster")
|
||||
|| cn.equals("intruder alarm")
|
||||
|| cn.equals("invoke prejudice")
|
||||
|| cn.equals("iona, shield of emeria")
|
||||
|| cn.equals("jin-gitaxias, core augur")
|
||||
|| cn.equals("jeweled lotus")
|
||||
|| cn.equals("jin-gitaxias, progress tyrant")
|
||||
|| cn.equals("jokulhaups")
|
||||
|| cn.equals("kaalia of the vast")
|
||||
|| cn.equals("karador, ghost chieftain")
|
||||
|| cn.equals("karakas")
|
||||
|| cn.equals("karn, silver golem")
|
||||
|| cn.equals("karn, the great creator")
|
||||
|| cn.equals("kataki, war's wage")
|
||||
|| cn.equals("keldon firebombers")
|
||||
|| cn.equals("kiki-jiki, mirror breaker")
|
||||
|| cn.equals("knowledge pool")
|
||||
|| cn.equals("koma, cosmos serpent")
|
||||
|| cn.equals("korvold, fae-cursed king")
|
||||
|| cn.equals("kozilek, butcher of truth")
|
||||
|| cn.equals("krark-clan ironworks")
|
||||
|| cn.equals("krenko, mob boss")
|
||||
|| cn.equals("krosan restorer")
|
||||
|| cn.equals("laboratory maniac")
|
||||
|| cn.equals("land equilibrium")
|
||||
|| cn.equals("leonin relic-warder")
|
||||
|| cn.equals("leovold, emissary of trest")
|
||||
|| cn.equals("leyline of the void")
|
||||
|| cn.equals("linvala, keeper of silence")
|
||||
|| cn.equals("living death")
|
||||
|| cn.equals("llawan, cephalid empress")
|
||||
|| cn.equals("loyal retainers")
|
||||
|| cn.equals("maelstrom wanderer")
|
||||
|| cn.equals("magister sphinx")
|
||||
|| cn.equals("malfegor")
|
||||
|| cn.equals("master of cruelties")
|
||||
|| cn.equals("malik, grim manipulator")
|
||||
|| cn.equals("mana breach")
|
||||
|| cn.equals("mana crypt")
|
||||
|| cn.equals("mana drain")
|
||||
|| cn.equals("mana vault")
|
||||
|| cn.equals("mana vortex")
|
||||
|| cn.equals("master of cruelties")
|
||||
|| cn.equals("memnarch")
|
||||
|| cn.equals("meren of clan nel toth")
|
||||
|| cn.equals("michiko konda, truth seeker")
|
||||
|| cn.equals("mikaeus the unhallowed")
|
||||
|| cn.equals("mikaeus, the unhallowed")
|
||||
|| cn.equals("mindcrank")
|
||||
|| cn.equals("mindslaver")
|
||||
|| cn.equals("minion reflector")
|
||||
|| cn.equals("mycosynth lattice")
|
||||
|| cn.equals("myr turbine")
|
||||
|| cn.equals("nadu, winged wisdom")
|
||||
|| cn.equals("narset, enlightened master")
|
||||
|| cn.equals("narset, parter of veils")
|
||||
|| cn.equals("nath of the gilt-leaf")
|
||||
|| cn.equals("natural order")
|
||||
|| cn.equals("necrotic ooze")
|
||||
|| cn.equals("negan, the cold-blooded")
|
||||
|| cn.equals("nekusar, the mindrazer")
|
||||
|| cn.equals("nether void")
|
||||
|| cn.equals("nexus of fate")
|
||||
|| cn.equals("nicol bolas")
|
||||
|| cn.equals("norin the wary")
|
||||
|| cn.equals("notion thief")
|
||||
|| cn.equals("numot, the devastator")
|
||||
|| cn.equals("oath of druids")
|
||||
|| cn.equals("obliterate")
|
||||
|| cn.equals("oko, thief of crowns")
|
||||
|| cn.equals("oloro, ageless ascetic")
|
||||
|| cn.equals("omniscience")
|
||||
|| cn.equals("opalescence")
|
||||
|| cn.equals("oppression")
|
||||
|| cn.equals("orcish bowmasters")
|
||||
|| cn.equals("ornithopter")
|
||||
|| cn.equals("overwhelming splendor")
|
||||
|| cn.equals("palinchron")
|
||||
|| cn.equals("paradox engine")
|
||||
|| cn.equals("pattern of rebirth")
|
||||
|| cn.equals("peregrine drake")
|
||||
|| cn.equals("planar portal")
|
||||
|| cn.equals("possessed portal")
|
||||
|| cn.equals("power artifact")
|
||||
|| cn.equals("price of glory")
|
||||
|| cn.equals("prossh, skyraider of kher")
|
||||
|| cn.equals("protean hulk")
|
||||
|| cn.equals("purphoros, god of the forge")
|
||||
|| cn.equals("ravages of war")
|
||||
|| cn.equals("reclamation sage")
|
||||
|| cn.equals("rick, steadfast leader")
|
||||
|| cn.equals("rings of brighthearth")
|
||||
|| cn.equals("rising waters")
|
||||
|| cn.equals("rite of replication")
|
||||
|| cn.equals("ruination")
|
||||
|| cn.equals("sanguine bond")
|
||||
|| cn.equals("scrambleverse")
|
||||
|| cn.equals("seedborn muse")
|
||||
|| cn.equals("sen triplets")
|
||||
|| cn.equals("serra's sanctum")
|
||||
|| cn.equals("sensei's divining top")
|
||||
|| cn.equals("sheoldred, the apocalypse")
|
||||
|| cn.equals("sheoldred, whispering one")
|
||||
|| cn.equals("sire of insanity")
|
||||
|| cn.equals("skithiryx, the blight dragon")
|
||||
|| cn.equals("smokestack")
|
||||
|| cn.equals("sol ring")
|
||||
|| cn.equals("sorin markov")
|
||||
|| cn.equals("splinter twin")
|
||||
|| cn.equals("spore frog")
|
||||
|| cn.equals("stasis")
|
||||
|| cn.equals("static orb")
|
||||
|| cn.equals("stony silence")
|
||||
|| cn.equals("storage matrix")
|
||||
|| cn.equals("storm cauldron")
|
||||
|| cn.equals("strip mine")
|
||||
|| cn.equals("the tabernacle at pendrell vale")
|
||||
|| cn.equals("sunder")
|
||||
|| cn.equals("tainted aether")
|
||||
|| cn.equals("tangle wire")
|
||||
|| cn.equals("tectonic break")
|
||||
|| cn.equals("teferi's protection")
|
||||
|| cn.equals("teferi's puzzle box")
|
||||
|| cn.equals("teferi, mage of zhalfir")
|
||||
|| cn.equals("teferi, master of time")
|
||||
|| cn.equals("teferi, time raveler")
|
||||
|| cn.equals("temporal manipulation")
|
||||
|| cn.equals("tezzeret the seeker")
|
||||
|| cn.equals("the chain veil")
|
||||
|| cn.equals("thieves' auction")
|
||||
|| cn.equals("thoughts of ruin")
|
||||
|| cn.equals("thrasios, triton hero")
|
||||
|| cn.equals("time sieve")
|
||||
|| cn.equals("time stretch")
|
||||
|| cn.equals("time warp")
|
||||
|| cn.equals("tinker")
|
||||
|| cn.equals("tooth and nail")
|
||||
|| cn.equals("torment of hailfire")
|
||||
|| cn.equals("torpor orb")
|
||||
|| cn.equals("toxrill, the corrosive")
|
||||
|| cn.equals("training grounds")
|
||||
|| cn.equals("treasure cruise")
|
||||
|| cn.equals("triskelavus")
|
||||
|| cn.equals("triskelion")
|
||||
|| cn.equals("triumph of the hordes")
|
||||
|| cn.equals("turnabout")
|
||||
|| cn.equals("ugin, the spirit dragon")
|
||||
|| cn.equals("ulamog, the ceaseless hunger")
|
||||
|| cn.equals("ulamog, the defiler")
|
||||
|| cn.equals("ulamog, the infinite gyre")
|
||||
|| cn.equals("umbral mantle")
|
||||
|| cn.equals("urabrask the hidden")
|
||||
|| cn.equals("vorinclex, voice of hunger")
|
||||
|| cn.equals("uyo, silent prophet")
|
||||
|| cn.equals("void winnower")
|
||||
|| cn.equals("voltaic key")
|
||||
|| cn.equals("vorinclex, monstrous raider")
|
||||
|| cn.equals("wake of destruction")
|
||||
|| cn.equals("warp world")
|
||||
|| cn.equals("winter moon")
|
||||
|| cn.equals("winter orb")
|
||||
|| cn.equals("workhorse")
|
||||
|| cn.equals("worldfire")
|
||||
|| cn.equals("worldgorger dragon")
|
||||
|| cn.equals("worthy cause")
|
||||
|| cn.equals("xanathar, guild kingpin")
|
||||
|| cn.equals("yawgmoth's will")
|
||||
|| cn.equals("zealous conscripts")
|
||||
|| cn.equals("zur the enchanter")) {
|
||||
thisMaxPower = Math.max(thisMaxPower, 12);
|
||||
}
|
||||
|
|
@ -723,148 +909,49 @@ public abstract class AbstractCommander extends Constructed {
|
|||
numberInfinitePieces++;
|
||||
}
|
||||
|
||||
// Saltiest cards (edhrec)
|
||||
if (cn.equals("acid rain")
|
||||
|| cn.equals("agent of treachery")
|
||||
|| cn.equals("apocalypse")
|
||||
|| cn.equals("armageddon")
|
||||
|| cn.equals("atraxa, praetors' voice")
|
||||
|| cn.equals("aura shards")
|
||||
|| cn.equals("avacyn, angel of hope")
|
||||
|| cn.equals("back to basics")
|
||||
|| cn.equals("bend or break")
|
||||
|| cn.equals("blightsteel colossus")
|
||||
|| cn.equals("blood moon")
|
||||
|| cn.equals("boil")
|
||||
|| cn.equals("boiling seas")
|
||||
|| cn.equals("bribery")
|
||||
|| cn.equals("burning sands")
|
||||
|| cn.equals("card view")
|
||||
|| cn.equals("cataclysm")
|
||||
|| cn.equals("catastrophe")
|
||||
|| cn.equals("chulane, teller of tales")
|
||||
|| cn.equals("confusion in the ranks")
|
||||
|| cn.equals("consecrated sphinx")
|
||||
|| cn.equals("contamination")
|
||||
|| cn.equals("craterhoof behemoth")
|
||||
// Game changers
|
||||
if (cn.equals("ad nauseam")
|
||||
|| cn.equals("ancient tomb")
|
||||
|| cn.equals("bolas's citadel")
|
||||
|| cn.equals("chrome mox")
|
||||
|| cn.equals("cyclonic rift")
|
||||
|| cn.equals("death cloud")
|
||||
|| cn.equals("decree of annihilation")
|
||||
|| cn.equals("decree of silence")
|
||||
|| cn.equals("demonic consultation")
|
||||
|| cn.equals("derevi, empyrial tactician")
|
||||
|| cn.equals("devastation")
|
||||
|| cn.equals("divine intervention")
|
||||
|| cn.equals("dockside extortionist")
|
||||
|| cn.equals("doomsday")
|
||||
|| cn.equals("doubling season")
|
||||
|| cn.equals("demonic tutor")
|
||||
|| cn.equals("drannith magistrate")
|
||||
|| cn.equals("elesh norn, grand cenobite")
|
||||
|| cn.equals("embargo")
|
||||
|| cn.equals("emrakul, the promised end")
|
||||
|| cn.equals("epicenter")
|
||||
|| cn.equals("enlightened tutor")
|
||||
|| cn.equals("expropriate")
|
||||
|| cn.equals("fall of the thran")
|
||||
|| cn.equals("fierce guardianship")
|
||||
|| cn.equals("food chain")
|
||||
|| cn.equals("force of negation")
|
||||
|| cn.equals("force of will")
|
||||
|| cn.equals("gaddock teeg")
|
||||
|| cn.equals("gaea's cradle")
|
||||
|| cn.equals("gilded drake")
|
||||
|| cn.equals("glenn, the voice of calm")
|
||||
|| cn.equals("global ruin")
|
||||
|| cn.equals("golos, tireless pilgrim")
|
||||
|| cn.equals("glacial chasm")
|
||||
|| cn.equals("grand arbiter augustin iv")
|
||||
|| cn.equals("grip of chaos")
|
||||
|| cn.equals("hokori, dust drinker")
|
||||
|| cn.equals("humility")
|
||||
|| cn.equals("impending disaster")
|
||||
|| cn.equals("invoke prejudice")
|
||||
|| cn.equals("iona, shield of emeria")
|
||||
|| cn.equals("grim monolith")
|
||||
|| cn.equals("imperial seal")
|
||||
|| cn.equals("jeska's will")
|
||||
|| cn.equals("jin-gitaxias, core augur")
|
||||
|| cn.equals("jokulhaups")
|
||||
|| cn.equals("keldon firebombers")
|
||||
|| cn.equals("kinnan, bonder prodigy")
|
||||
|| cn.equals("kozilek, butcher of truth")
|
||||
|| cn.equals("land equilibrium")
|
||||
|| cn.equals("linvala, keeper of silence")
|
||||
|| cn.equals("magister sphinx")
|
||||
|| cn.equals("mana breach")
|
||||
|| cn.equals("mana crypt")
|
||||
|| cn.equals("mana drain")
|
||||
|| cn.equals("mana vortex")
|
||||
|| cn.equals("mindslaver")
|
||||
|| cn.equals("narset, enlightened master")
|
||||
|| cn.equals("narset, parter of veils")
|
||||
|| cn.equals("negan, the cold-blooded")
|
||||
|| cn.equals("nether void")
|
||||
|| cn.equals("nexus of fate")
|
||||
|| cn.equals("notion thief")
|
||||
|| cn.equals("obliterate")
|
||||
|| cn.equals("oko, thief of crowns")
|
||||
|| cn.equals("oloro, ageless ascetic")
|
||||
|| cn.equals("omniscience")
|
||||
|| cn.equals("lion's eye diamond")
|
||||
|| cn.equals("mana vault")
|
||||
|| cn.equals("mox diamond")
|
||||
|| cn.equals("mystical tutor")
|
||||
|| cn.equals("opposition agent")
|
||||
|| cn.equals("oppression")
|
||||
|| cn.equals("overwhelming splendor")
|
||||
|| cn.equals("palinchron")
|
||||
|| cn.equals("paradox engine")
|
||||
|| cn.equals("possessed portal")
|
||||
|| cn.equals("price of glory")
|
||||
|| cn.equals("protean hulk")
|
||||
|| cn.equals("ravages of war")
|
||||
|| cn.equals("rhystic study")
|
||||
|| cn.equals("rick, steadfast leader")
|
||||
|| cn.equals("rising waters")
|
||||
|| cn.equals("ruination")
|
||||
|| cn.equals("scrambleverse")
|
||||
|| cn.equals("seedborn muse")
|
||||
|| cn.equals("sen triplets")
|
||||
|| cn.equals("sire of insanity")
|
||||
|| cn.equals("skithiryx, the blight dragon")
|
||||
|| cn.equals("smokestack")
|
||||
|| cn.equals("serra's sanctum")
|
||||
|| cn.equals("smothering tithe")
|
||||
|| cn.equals("sorin markov")
|
||||
|| cn.equals("stasis")
|
||||
|| cn.equals("static orb")
|
||||
|| cn.equals("storage matrix")
|
||||
|| cn.equals("sunder")
|
||||
|| cn.equals("survival of the fittest")
|
||||
|| cn.equals("table view")
|
||||
|| cn.equals("tainted aether")
|
||||
|| cn.equals("tectonic break")
|
||||
|| cn.equals("teferi's protection")
|
||||
|| cn.equals("teferi, master of time")
|
||||
|| cn.equals("teferi, time raveler")
|
||||
|| cn.equals("temporal manipulation")
|
||||
|| cn.equals("tergrid, god of fright")
|
||||
|| cn.equals("text view")
|
||||
|| cn.equals("thassa's oracle")
|
||||
|| cn.equals("the one ring")
|
||||
|| cn.equals("the tabernacle at pendrell vale")
|
||||
|| cn.equals("thieves' auction")
|
||||
|| cn.equals("thoughts of ruin")
|
||||
|| cn.equals("thrasios, triton hero")
|
||||
|| cn.equals("time stretch")
|
||||
|| cn.equals("time warp")
|
||||
|| cn.equals("tooth and nail")
|
||||
|| cn.equals("torment of hailfire")
|
||||
|| cn.equals("torpor orb")
|
||||
|| cn.equals("triumph of the hordes")
|
||||
|| cn.equals("ugin, the spirit dragon")
|
||||
|| cn.equals("ulamog, the ceaseless hunger")
|
||||
|| cn.equals("ulamog, the infinite gyre")
|
||||
|| cn.equals("trinisphere")
|
||||
|| cn.equals("trouble in pairs")
|
||||
|| cn.equals("underworld breach")
|
||||
|| cn.equals("urza, lord high artificer")
|
||||
|| cn.equals("void winnower")
|
||||
|| cn.equals("vampiric tutor")
|
||||
|| cn.equals("vorinclex, voice of hunger")
|
||||
|| cn.equals("wake of destruction")
|
||||
|| cn.equals("warp world")
|
||||
|| cn.equals("winter orb")
|
||||
|| cn.equals("xanathar, guild kingpin")
|
||||
|| cn.equals("zur the enchanter")) {
|
||||
thisMaxPower = Math.max(thisMaxPower, 15);
|
||||
|| cn.equals("winota, joiner of forces")
|
||||
|| cn.equals("yuriko, the tiger's shadow")) {
|
||||
thisMaxPower = Math.max(thisMaxPower, 20);
|
||||
}
|
||||
edhPowerLevel += thisMaxPower;
|
||||
}
|
||||
|
||||
ObjectColor color = null;
|
||||
|
|
|
|||
51
Mage.Sets/src/mage/cards/a/AbzanDevotee.java
Normal file
51
Mage.Sets/src/mage/cards/a/AbzanDevotee.java
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect;
|
||||
import mage.abilities.effects.mana.AddManaFromColorChoicesEffect;
|
||||
import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.ManaType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AbzanDevotee extends CardImpl {
|
||||
|
||||
public AbzanDevotee(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
|
||||
|
||||
this.subtype.add(SubType.DOG);
|
||||
this.subtype.add(SubType.CLERIC);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(1);
|
||||
|
||||
// {1}: Add {W}, {B}, or {G}. Activate only once each turn.
|
||||
this.addAbility(new LimitedTimesPerTurnActivatedManaAbility(
|
||||
new AddManaFromColorChoicesEffect(ManaType.WHITE, ManaType.BLACK, ManaType.GREEN), new GenericManaCost(1)
|
||||
));
|
||||
|
||||
// {2}{B}: Return this card from your graveyard to your hand.
|
||||
this.addAbility(new SimpleActivatedAbility(
|
||||
Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl<>("{2}{B}")
|
||||
));
|
||||
}
|
||||
|
||||
private AbzanDevotee(final AbzanDevotee card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbzanDevotee copy() {
|
||||
return new AbzanDevotee(this);
|
||||
}
|
||||
}
|
||||
101
Mage.Sets/src/mage/cards/a/AbzanMonument.java
Normal file
101
Mage.Sets/src/mage/cards/a/AbzanMonument.java
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.dynamicvalue.common.GreatestToughnessAmongControlledCreaturesValue;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
|
||||
import mage.abilities.hint.Hint;
|
||||
import mage.abilities.hint.ValueHint;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.token.SpiritXXToken;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AbzanMonument extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("a basic Plains, Swamp, or Forest card");
|
||||
|
||||
static {
|
||||
filter.add(SuperType.BASIC.getPredicate());
|
||||
filter.add(Predicates.or(
|
||||
SubType.PLAINS.getPredicate(),
|
||||
SubType.SWAMP.getPredicate(),
|
||||
SubType.FOREST.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
private static final Hint hint = new ValueHint(
|
||||
"Greatest toughness among creatures you control",
|
||||
GreatestToughnessAmongControlledCreaturesValue.instance
|
||||
);
|
||||
|
||||
public AbzanMonument(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
|
||||
|
||||
// When this artifact enters, search your library for a basic Plains, Swamp, or Forest card, reveal it, put it into your hand, then shuffle.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(
|
||||
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true)
|
||||
));
|
||||
|
||||
// {1}{W}{B}{G}, {T}, Sacrifice this artifact: Create an X/X white Spirit creature token, where X is the greatest toughness among creatures you control. Activate only as a sorcery.
|
||||
Ability ability = new ActivateAsSorceryActivatedAbility(
|
||||
new AbzanMonumentEffect(), new ManaCostsImpl<>("{1}{W}{B}{G}")
|
||||
);
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.addCost(new SacrificeSourceCost());
|
||||
this.addAbility(ability.addHint(hint));
|
||||
}
|
||||
|
||||
private AbzanMonument(final AbzanMonument card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbzanMonument copy() {
|
||||
return new AbzanMonument(this);
|
||||
}
|
||||
}
|
||||
|
||||
class AbzanMonumentEffect extends OneShotEffect {
|
||||
|
||||
AbzanMonumentEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "create an X/X white Spirit creature token, " +
|
||||
"where X is the greatest toughness among creatures you control";
|
||||
}
|
||||
|
||||
private AbzanMonumentEffect(final AbzanMonumentEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbzanMonumentEffect copy() {
|
||||
return new AbzanMonumentEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
return new SpiritXXToken(
|
||||
GreatestToughnessAmongControlledCreaturesValue
|
||||
.instance
|
||||
.calculate(game, source, this)
|
||||
).putOntoBattlefield(1, game, source);
|
||||
}
|
||||
}
|
||||
37
Mage.Sets/src/mage/cards/a/AleshasLegacy.java
Normal file
37
Mage.Sets/src/mage/cards/a/AleshasLegacy.java
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||
import mage.abilities.keyword.DeathtouchAbility;
|
||||
import mage.abilities.keyword.IndestructibleAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.target.common.TargetControlledCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AleshasLegacy extends CardImpl {
|
||||
|
||||
public AleshasLegacy(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{B}");
|
||||
|
||||
// Target creature you control gains deathtouch and indestructible until end of turn.
|
||||
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(DeathtouchAbility.getInstance())
|
||||
.setText("target creature you control gains deathtouch"));
|
||||
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(IndestructibleAbility.getInstance())
|
||||
.setText("and indestructible until end of turn"));
|
||||
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
|
||||
}
|
||||
|
||||
private AleshasLegacy(final AleshasLegacy card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AleshasLegacy copy() {
|
||||
return new AleshasLegacy(this);
|
||||
}
|
||||
}
|
||||
62
Mage.Sets/src/mage/cards/a/AmblingStormshell.java
Normal file
62
Mage.Sets/src/mage/cards/a/AmblingStormshell.java
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.AttacksTriggeredAbility;
|
||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.UntapSourceEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||
import mage.abilities.keyword.WardAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterSpell;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AmblingStormshell extends CardImpl {
|
||||
|
||||
private static final FilterSpell filter = new FilterSpell("a Turtle spell");
|
||||
|
||||
static {
|
||||
filter.add(SubType.TURTLE.getPredicate());
|
||||
}
|
||||
|
||||
public AmblingStormshell(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}");
|
||||
|
||||
this.subtype.add(SubType.TURTLE);
|
||||
this.power = new MageInt(5);
|
||||
this.toughness = new MageInt(9);
|
||||
|
||||
// Ward {2}
|
||||
this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}")));
|
||||
|
||||
// Whenever this creature attacks, put three stun counters on it and draw three cards.
|
||||
Ability ability = new AttacksTriggeredAbility(
|
||||
new AddCountersSourceEffect(CounterType.STUN.createInstance(3))
|
||||
.setText("put three stun counters on it")
|
||||
);
|
||||
ability.addEffect(new DrawCardSourceControllerEffect(3).concatBy("and"));
|
||||
this.addAbility(ability);
|
||||
|
||||
// Whenever you cast a Turtle spell, untap this creature.
|
||||
this.addAbility(new SpellCastControllerTriggeredAbility(new UntapSourceEffect(), filter, false));
|
||||
}
|
||||
|
||||
private AmblingStormshell(final AmblingStormshell card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AmblingStormshell copy() {
|
||||
return new AmblingStormshell(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -17,8 +17,8 @@ import mage.constants.SubType;
|
|||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.mageobject.PowerPredicate;
|
||||
import mage.filter.predicate.mageobject.ToughnessPredicate;
|
||||
import mage.filter.predicate.mageobject.BasePowerPredicate;
|
||||
import mage.filter.predicate.mageobject.BaseToughnessPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.token.EldraziAngelToken;
|
||||
|
|
@ -70,8 +70,8 @@ class AngelicAberrationEffect extends OneShotEffect {
|
|||
|
||||
static {
|
||||
filter.add(Predicates.or(
|
||||
new PowerPredicate(ComparisonType.OR_LESS, 1),
|
||||
new ToughnessPredicate(ComparisonType.OR_LESS, 1)
|
||||
new BasePowerPredicate(ComparisonType.OR_LESS, 1),
|
||||
new BaseToughnessPredicate(ComparisonType.OR_LESS, 1)
|
||||
));
|
||||
}
|
||||
|
||||
|
|
|
|||
46
Mage.Sets/src/mage/cards/a/ArmamentDragon.java
Normal file
46
Mage.Sets/src/mage/cards/a/ArmamentDragon.java
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.effects.common.counter.DistributeCountersEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.target.common.TargetCreaturePermanentAmount;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class ArmamentDragon extends CardImpl {
|
||||
|
||||
public ArmamentDragon(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{B}{G}");
|
||||
|
||||
this.subtype.add(SubType.DRAGON);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// When this creature enters, distribute three +1/+1 counters among one, two, or three target creatures you control.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new DistributeCountersEffect(CounterType.P1P1));
|
||||
ability.addTarget(new TargetCreaturePermanentAmount(3));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private ArmamentDragon(final ArmamentDragon card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArmamentDragon copy() {
|
||||
return new ArmamentDragon(this);
|
||||
}
|
||||
}
|
||||
47
Mage.Sets/src/mage/cards/a/AttunedHunter.java
Normal file
47
Mage.Sets/src/mage/cards/a/AttunedHunter.java
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.CardsLeaveGraveyardTriggeredAbility;
|
||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||
import mage.abilities.keyword.TrampleAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AttunedHunter extends CardImpl {
|
||||
|
||||
public AttunedHunter(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.RANGER);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// Trample
|
||||
this.addAbility(TrampleAbility.getInstance());
|
||||
|
||||
// Whenever one or more cards leave your graveyard during your turn, put a +1/+1 counter on this creature.
|
||||
this.addAbility(new CardsLeaveGraveyardTriggeredAbility(
|
||||
new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
|
||||
StaticFilters.FILTER_CARD_CARDS, true
|
||||
));
|
||||
}
|
||||
|
||||
private AttunedHunter(final AttunedHunter card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttunedHunter copy() {
|
||||
return new AttunedHunter(this);
|
||||
}
|
||||
}
|
||||
49
Mage.Sets/src/mage/cards/a/AvengerOfTheFallen.java
Normal file
49
Mage.Sets/src/mage/cards/a/AvengerOfTheFallen.java
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.dynamicvalue.DynamicValue;
|
||||
import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount;
|
||||
import mage.abilities.hint.Hint;
|
||||
import mage.abilities.hint.ValueHint;
|
||||
import mage.abilities.keyword.DeathtouchAbility;
|
||||
import mage.abilities.keyword.MobilizeAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AvengerOfTheFallen extends CardImpl {
|
||||
|
||||
private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURES, null);
|
||||
private static final Hint hint = new ValueHint("Creature cards in your graveyard", xValue);
|
||||
|
||||
public AvengerOfTheFallen(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.WARRIOR);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
// Deathtouch
|
||||
this.addAbility(DeathtouchAbility.getInstance());
|
||||
|
||||
// Mobilize X where X is the number of creature cards in your graveyard.
|
||||
this.addAbility(new MobilizeAbility(xValue).addHint(hint));
|
||||
}
|
||||
|
||||
private AvengerOfTheFallen(final AvengerOfTheFallen card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AvengerOfTheFallen copy() {
|
||||
return new AvengerOfTheFallen(this);
|
||||
}
|
||||
}
|
||||
64
Mage.Sets/src/mage/cards/a/AwakenTheHonoredDead.java
Normal file
64
Mage.Sets/src/mage/cards/a/AwakenTheHonoredDead.java
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.common.SagaAbility;
|
||||
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
||||
import mage.abilities.costs.common.DiscardCardCost;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.effects.common.DoWhenCostPaid;
|
||||
import mage.abilities.effects.common.MillCardsControllerEffect;
|
||||
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SagaChapter;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.target.common.TargetCardInYourGraveyard;
|
||||
import mage.target.common.TargetNonlandPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AwakenTheHonoredDead extends CardImpl {
|
||||
|
||||
public AwakenTheHonoredDead(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}{G}{U}");
|
||||
|
||||
this.subtype.add(SubType.SAGA);
|
||||
|
||||
// (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)
|
||||
SagaAbility sagaAbility = new SagaAbility(this);
|
||||
|
||||
// I -- Destroy target nonland permanent.
|
||||
sagaAbility.addChapterEffect(
|
||||
this, SagaChapter.CHAPTER_I,
|
||||
new DestroyTargetEffect(), new TargetNonlandPermanent()
|
||||
);
|
||||
|
||||
// II -- Mill three cards.
|
||||
sagaAbility.addChapterEffect(
|
||||
this, SagaChapter.CHAPTER_II,
|
||||
new MillCardsControllerEffect(3)
|
||||
);
|
||||
|
||||
// III -- You may discard a card. When you do, return target creature or land card from your graveyard to your hand.
|
||||
ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect(), false);
|
||||
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_OR_LAND));
|
||||
sagaAbility.addChapterEffect(
|
||||
this, SagaChapter.CHAPTER_III,
|
||||
new DoWhenCostPaid(ability, new DiscardCardCost(), "Discard a card?")
|
||||
);
|
||||
this.addAbility(sagaAbility);
|
||||
}
|
||||
|
||||
private AwakenTheHonoredDead(final AwakenTheHonoredDead card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AwakenTheHonoredDead copy() {
|
||||
return new AwakenTheHonoredDead(this);
|
||||
}
|
||||
}
|
||||
37
Mage.Sets/src/mage/cards/b/BewilderingBlizzard.java
Normal file
37
Mage.Sets/src/mage/cards/b/BewilderingBlizzard.java
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
package mage.cards.b;
|
||||
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostAllEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class BewilderingBlizzard extends CardImpl {
|
||||
|
||||
public BewilderingBlizzard(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{U}{U}");
|
||||
|
||||
// Draw three cards. Creatures your opponents control get -3/-0 until end of turn.
|
||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(3));
|
||||
this.getSpellAbility().addEffect(new BoostAllEffect(
|
||||
-3, 0, Duration.EndOfTurn,
|
||||
StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURES, false
|
||||
));
|
||||
}
|
||||
|
||||
private BewilderingBlizzard(final BewilderingBlizzard card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BewilderingBlizzard copy() {
|
||||
return new BewilderingBlizzard(this);
|
||||
}
|
||||
}
|
||||
100
Mage.Sets/src/mage/cards/b/BreachingDragonstorm.java
Normal file
100
Mage.Sets/src/mage/cards/b/BreachingDragonstorm.java
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
package mage.cards.b;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.ReturnToHandSourceEffect;
|
||||
import mage.cards.*;
|
||||
import mage.constants.*;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class BreachingDragonstorm extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent(SubType.DRAGON, "a Dragon");
|
||||
|
||||
public BreachingDragonstorm(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{R}");
|
||||
|
||||
// When this enchantment enters, exile cards from the top of your library until you exile a nonland card. You may cast it without paying its mana cost if that spell's mana value is 8 or less. If you don't, put that card into your hand.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new BreachingDragonstormEffect()));
|
||||
|
||||
// When a Dragon you control enters, return this enchantment to its owner's hand.
|
||||
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new ReturnToHandSourceEffect(), filter));
|
||||
}
|
||||
|
||||
private BreachingDragonstorm(final BreachingDragonstorm card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BreachingDragonstorm copy() {
|
||||
return new BreachingDragonstorm(this);
|
||||
}
|
||||
}
|
||||
|
||||
class BreachingDragonstormEffect extends OneShotEffect {
|
||||
|
||||
private static final FilterCard filter = new FilterCard();
|
||||
|
||||
static {
|
||||
filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 9));
|
||||
}
|
||||
|
||||
BreachingDragonstormEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "exile cards from the top of your library until you exile a nonland card. " +
|
||||
"You may cast it without paying its mana cost if that spell's mana value is 8 or less. " +
|
||||
"If you don't, put that card into your hand";
|
||||
}
|
||||
|
||||
private BreachingDragonstormEffect(final BreachingDragonstormEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BreachingDragonstormEffect copy() {
|
||||
return new BreachingDragonstormEffect(this);
|
||||
}
|
||||
|
||||
private static Card getCard(Player player, Cards cards, Game game, Ability source) {
|
||||
for (Card card : player.getLibrary().getCards(game)) {
|
||||
cards.add(card);
|
||||
player.moveCards(card, Zone.EXILED, source, game);
|
||||
game.processAction();
|
||||
if (!card.isLand(game)) {
|
||||
return card;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
if (player == null) {
|
||||
return false;
|
||||
}
|
||||
Cards cards = new CardsImpl();
|
||||
Card card = getCard(player, cards, game, source);
|
||||
if (card != null) {
|
||||
CardUtil.castSpellWithAttributesForFree(player, source, game, card, filter);
|
||||
if (game.getState().getZone(card.getId()) == Zone.EXILED) {
|
||||
player.moveCards(card, Zone.HAND, source, game);
|
||||
}
|
||||
}
|
||||
cards.retainZone(Zone.EXILED, game);
|
||||
player.putCardsOnBottomOfLibrary(cards, game, source, false);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
108
Mage.Sets/src/mage/cards/c/CallTheSpiritDragons.java
Normal file
108
Mage.Sets/src/mage/cards/c/CallTheSpiritDragons.java
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
package mage.cards.c;
|
||||
|
||||
import mage.ObjectColor;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
import mage.abilities.keyword.IndestructibleAbility;
|
||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterControlledPermanent;
|
||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPermanent;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class CallTheSpiritDragons extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent(SubType.DRAGON, "Dragons");
|
||||
|
||||
public CallTheSpiritDragons(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}{U}{B}{R}{G}");
|
||||
|
||||
// Dragons you control have indestructible.
|
||||
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
|
||||
IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filter
|
||||
)));
|
||||
|
||||
// At the beginning of your upkeep, for each color, put a +1/+1 counter on a Dragon you control of that color. If you put +1/+1 counters on five Dragons this way, you win the game.
|
||||
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CallTheSpiritDragonsEffect()));
|
||||
}
|
||||
|
||||
private CallTheSpiritDragons(final CallTheSpiritDragons card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CallTheSpiritDragons copy() {
|
||||
return new CallTheSpiritDragons(this);
|
||||
}
|
||||
}
|
||||
|
||||
class CallTheSpiritDragonsEffect extends OneShotEffect {
|
||||
|
||||
private static final List<FilterPermanent> filters = new ArrayList<>();
|
||||
|
||||
static {
|
||||
for (ObjectColor color : ObjectColor.getAllColors()) {
|
||||
FilterPermanent filter = new FilterControlledPermanent(
|
||||
SubType.DRAGON, color.getDescription() + " Dragon you control"
|
||||
);
|
||||
filter.add(new ColorPredicate(color));
|
||||
}
|
||||
}
|
||||
|
||||
CallTheSpiritDragonsEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "for each color, put a +1/+1 counter on a Dragon you control of that color. " +
|
||||
"If you put +1/+1 counters on five Dragons this way, you win the game";
|
||||
}
|
||||
|
||||
private CallTheSpiritDragonsEffect(final CallTheSpiritDragonsEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CallTheSpiritDragonsEffect copy() {
|
||||
return new CallTheSpiritDragonsEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
if (player == null) {
|
||||
return false;
|
||||
}
|
||||
Set<UUID> dragons = new HashSet<>();
|
||||
for (FilterPermanent filter : filters) {
|
||||
if (!game.getBattlefield().contains(filter, source, game, 1)) {
|
||||
continue;
|
||||
}
|
||||
TargetPermanent target = new TargetPermanent(filter);
|
||||
target.withNotTarget(true);
|
||||
player.choose(Outcome.BoostCreature, target, source, game);
|
||||
Permanent permanent = game.getPermanent(target.getFirstTarget());
|
||||
if (permanent != null && permanent.addCounters(CounterType.P1P1.createInstance(), source, game)) {
|
||||
dragons.add(permanent.getId());
|
||||
}
|
||||
}
|
||||
if (dragons.size() >= 5) {
|
||||
player.won(game);
|
||||
}
|
||||
return !dragons.isEmpty();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
package mage.cards.c;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.ObjectColor;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.StateTriggeredAbility;
|
||||
|
|
@ -8,8 +7,7 @@ import mage.abilities.common.AsEntersBattlefieldAbility;
|
|||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.MostCommonColorCondition;
|
||||
import mage.abilities.effects.ContinuousEffectImpl;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||
import mage.abilities.effects.common.ChooseColorEffect;
|
||||
import mage.abilities.effects.common.ChooseOpponentEffect;
|
||||
import mage.abilities.effects.common.SacrificeSourceEffect;
|
||||
|
|
@ -18,40 +16,45 @@ import mage.cards.CardImpl;
|
|||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.Layer;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubLayer;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.filter.predicate.permanent.TokenPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class CallToArms extends CardImpl {
|
||||
|
||||
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
|
||||
|
||||
static {
|
||||
filter.add(new ColorPredicate(ObjectColor.WHITE));
|
||||
}
|
||||
|
||||
public CallToArms(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");
|
||||
|
||||
// As Call to Arms enters the battlefield, choose a color and an opponent.
|
||||
Ability ability = new AsEntersBattlefieldAbility(
|
||||
new ChooseColorEffect(Outcome.Detriment)
|
||||
);
|
||||
ability.addEffect(new ChooseOpponentEffect(
|
||||
Outcome.Benefit
|
||||
).setText("and an opponent"));
|
||||
Ability ability = new AsEntersBattlefieldAbility(new ChooseColorEffect(Outcome.Detriment));
|
||||
ability.addEffect(new ChooseOpponentEffect(Outcome.Benefit).setText("and an opponent"));
|
||||
this.addAbility(ability);
|
||||
|
||||
// White creatures get +1/+1 as long as the chosen color is the most common color among nontoken permanents the chosen player controls but isn't tied for most common.
|
||||
this.addAbility(new SimpleStaticAbility(
|
||||
new CallToArmsEffect()
|
||||
));
|
||||
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
|
||||
new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, false),
|
||||
CallToArmsCondition.instance, "white creatures get +1/+1 as long as the chosen color " +
|
||||
"is the most common color among nontoken permanents the chosen player controls but isn't tied for most common"
|
||||
)));
|
||||
|
||||
// When the chosen color isn't the most common color among nontoken permanents the chosen player controls or is tied for most common, sacrifice Call to Arms.
|
||||
this.addAbility(new CallToArmsStateTriggeredAbility());
|
||||
|
|
@ -67,46 +70,17 @@ public final class CallToArms extends CardImpl {
|
|||
}
|
||||
}
|
||||
|
||||
class CallToArmsEffect extends ContinuousEffectImpl {
|
||||
|
||||
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("White creatures");
|
||||
|
||||
static {
|
||||
filter.add(new ColorPredicate(ObjectColor.WHITE));
|
||||
}
|
||||
|
||||
public CallToArmsEffect() {
|
||||
super(Duration.WhileOnBattlefield, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.Benefit);
|
||||
staticText = "White creatures get +1/+1 as long as the chosen color "
|
||||
+ "is the most common color among nontoken permanents "
|
||||
+ "the chosen player controls but isn't tied for most common.";
|
||||
}
|
||||
|
||||
private CallToArmsEffect(final CallToArmsEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CallToArmsEffect copy() {
|
||||
return new CallToArmsEffect(this);
|
||||
}
|
||||
enum CallToArmsCondition implements Condition {
|
||||
instance;
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent permanent = game.getPermanent(source.getSourceId());
|
||||
UUID playerId = (UUID) game.getState().getValue(source.getSourceId() + ChooseOpponentEffect.VALUE_KEY);
|
||||
if (permanent != null) {
|
||||
Player opponent = game.getPlayer(playerId);
|
||||
if (opponent != null) {
|
||||
ObjectColor color = (ObjectColor) game.getState().getValue(permanent.getId() + "_color");
|
||||
Condition condition = new MostCommonColorCondition(color, true, new ControllerIdPredicate(playerId));
|
||||
if (condition.apply(game, source)) {
|
||||
Effect effect = new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, false);
|
||||
return effect.apply(game, source);
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
Player opponent = game.getPlayer((UUID) game.getState().getValue(source.getSourceId() + ChooseOpponentEffect.VALUE_KEY));
|
||||
return permanent != null && opponent != null && new MostCommonColorCondition(
|
||||
(ObjectColor) game.getState().getValue(permanent.getId() + "_color"), true,
|
||||
Predicates.and(TokenPredicate.FALSE, new ControllerIdPredicate(opponent.getId()))
|
||||
).apply(game, source);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -129,17 +103,6 @@ class CallToArmsStateTriggeredAbility extends StateTriggeredAbility {
|
|||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
Permanent permanent = game.getPermanent(getSourceId());
|
||||
UUID playerId = (UUID) game.getState().getValue(getSourceId() + ChooseOpponentEffect.VALUE_KEY);
|
||||
if (permanent != null) {
|
||||
Player opponent = game.getPlayer(playerId);
|
||||
if (opponent != null) {
|
||||
ObjectColor color = (ObjectColor) game.getState().getValue(permanent.getId() + "_color");
|
||||
Condition condition = new MostCommonColorCondition(color, true, new ControllerIdPredicate(playerId));
|
||||
return !condition.apply(game, this);
|
||||
return !CallToArmsCondition.instance.apply(game, this);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
36
Mage.Sets/src/mage/cards/c/ChanneledDragonfire.java
Normal file
36
Mage.Sets/src/mage/cards/c/ChanneledDragonfire.java
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
package mage.cards.c;
|
||||
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.keyword.HarmonizeAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.target.common.TargetAnyTarget;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class ChanneledDragonfire extends CardImpl {
|
||||
|
||||
public ChanneledDragonfire(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{R}");
|
||||
|
||||
// Channeled Dragonfire deals 2 damage to any target.
|
||||
this.getSpellAbility().addEffect(new DamageTargetEffect(2));
|
||||
this.getSpellAbility().addTarget(new TargetAnyTarget());
|
||||
|
||||
// Harmonize {5}{R}{R}
|
||||
this.addAbility(new HarmonizeAbility(this, "{5}{R}{R}"));
|
||||
}
|
||||
|
||||
private ChanneledDragonfire(final ChanneledDragonfire card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChanneledDragonfire copy() {
|
||||
return new ChanneledDragonfire(this);
|
||||
}
|
||||
}
|
||||
43
Mage.Sets/src/mage/cards/c/CoordinatedManeuver.java
Normal file
43
Mage.Sets/src/mage/cards/c/CoordinatedManeuver.java
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
package mage.cards.c;
|
||||
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.dynamicvalue.common.CreaturesYouControlCount;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.hint.common.CreaturesYouControlHint;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.target.common.TargetCreatureOrPlaneswalker;
|
||||
import mage.target.common.TargetEnchantmentPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class CoordinatedManeuver extends CardImpl {
|
||||
|
||||
public CoordinatedManeuver(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}");
|
||||
|
||||
// Choose one --
|
||||
// * Coordinated Maneuver deals damage equal to the number of creatures you control to target creature or planeswalker.
|
||||
this.getSpellAbility().addEffect(new DamageTargetEffect(CreaturesYouControlCount.instance)
|
||||
.setText("{this} deals damage equal to the number of creatures you control to target creature or planeswalker"));
|
||||
this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker());
|
||||
this.getSpellAbility().addHint(CreaturesYouControlHint.instance);
|
||||
|
||||
// * Destroy target enchantment.
|
||||
this.getSpellAbility().addMode(new Mode(new DestroyTargetEffect()).addTarget(new TargetEnchantmentPermanent()));
|
||||
}
|
||||
|
||||
private CoordinatedManeuver(final CoordinatedManeuver card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CoordinatedManeuver copy() {
|
||||
return new CoordinatedManeuver(this);
|
||||
}
|
||||
}
|
||||
62
Mage.Sets/src/mage/cards/c/CoriMountainMonastery.java
Normal file
62
Mage.Sets/src/mage/cards/c/CoriMountainMonastery.java
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
package mage.cards.c;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTappedUnlessAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.condition.common.YouControlPermanentCondition;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect;
|
||||
import mage.abilities.mana.RedManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.predicate.Predicates;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class CoriMountainMonastery extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent("a Plains or an Island");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.or(
|
||||
SubType.PLAINS.getPredicate(),
|
||||
SubType.ISLAND.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter);
|
||||
|
||||
public CoriMountainMonastery(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
|
||||
|
||||
// This land enters tapped unless you control a Plains or an Island.
|
||||
this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint()));
|
||||
|
||||
// {T}: Add {R}.
|
||||
this.addAbility(new RedManaAbility());
|
||||
|
||||
// {3}{R}, {T}: Exile the top card of your library. Until the end of your next turn, you may play that card.
|
||||
Ability ability = new SimpleActivatedAbility(
|
||||
new ExileTopXMayPlayUntilEffect(1, Duration.UntilEndOfYourNextTurn), new ManaCostsImpl<>("{3}{R}")
|
||||
);
|
||||
ability.addCost(new TapSourceCost());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private CoriMountainMonastery(final CoriMountainMonastery card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CoriMountainMonastery copy() {
|
||||
return new CoriMountainMonastery(this);
|
||||
}
|
||||
}
|
||||
60
Mage.Sets/src/mage/cards/c/CoriSteelCutter.java
Normal file
60
Mage.Sets/src/mage/cards/c/CoriSteelCutter.java
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
package mage.cards.c;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.FlurryAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.CreateTokenAttachSourceEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
||||
import mage.abilities.keyword.EquipAbility;
|
||||
import mage.abilities.keyword.HasteAbility;
|
||||
import mage.abilities.keyword.TrampleAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.AttachmentType;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.game.permanent.token.MonasteryMentorToken;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class CoriSteelCutter extends CardImpl {
|
||||
|
||||
public CoriSteelCutter(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{R}");
|
||||
|
||||
this.subtype.add(SubType.EQUIPMENT);
|
||||
|
||||
// Equipped creature gets +1/+1 and has trample and haste.
|
||||
Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(1, 1));
|
||||
ability.addEffect(new GainAbilityAttachedEffect(
|
||||
TrampleAbility.getInstance(), AttachmentType.EQUIPMENT
|
||||
).setText("and has trample"));
|
||||
ability.addEffect(new GainAbilityAttachedEffect(
|
||||
HasteAbility.getInstance(), AttachmentType.EQUIPMENT
|
||||
).setText("and haste"));
|
||||
this.addAbility(ability);
|
||||
|
||||
// Flurry -- Whenever you cast your second spell each turn, create a 1/1 white Monk creature token with prowess. You may attach this Equipment to it.
|
||||
this.addAbility(new FlurryAbility(new CreateTokenAttachSourceEffect(
|
||||
new MonasteryMentorToken(), "", true
|
||||
)));
|
||||
|
||||
// Equip {1}{R}
|
||||
this.addAbility(new EquipAbility(Outcome.BoostCreature, new ManaCostsImpl<>("{1}{R}")));
|
||||
}
|
||||
|
||||
private CoriSteelCutter(final CoriSteelCutter card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CoriSteelCutter copy() {
|
||||
return new CoriSteelCutter(this);
|
||||
}
|
||||
}
|
||||
46
Mage.Sets/src/mage/cards/c/CorrodingDragonstorm.java
Normal file
46
Mage.Sets/src/mage/cards/c/CorrodingDragonstorm.java
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
package mage.cards.c;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.effects.common.LoseLifeOpponentsEffect;
|
||||
import mage.abilities.effects.common.ReturnToHandSourceEffect;
|
||||
import mage.abilities.effects.keyword.SurveilEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class CorrodingDragonstorm extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent(SubType.DRAGON, "a Dragon");
|
||||
|
||||
public CorrodingDragonstorm(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
|
||||
|
||||
// When this enchantment enters, each opponent loses 2 life and you gain 2 life. Surveil 2.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new LoseLifeOpponentsEffect(2));
|
||||
ability.addEffect(new GainLifeEffect(2).concatBy("and"));
|
||||
ability.addEffect(new SurveilEffect(2));
|
||||
this.addAbility(ability);
|
||||
|
||||
// When a Dragon you control enters, return this enchantment to its owner's hand.
|
||||
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new ReturnToHandSourceEffect(), filter));
|
||||
}
|
||||
|
||||
private CorrodingDragonstorm(final CorrodingDragonstorm card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CorrodingDragonstorm copy() {
|
||||
return new CorrodingDragonstorm(this);
|
||||
}
|
||||
}
|
||||
34
Mage.Sets/src/mage/cards/d/DefibrillatingCurrent.java
Normal file
34
Mage.Sets/src/mage/cards/d/DefibrillatingCurrent.java
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.target.common.TargetCreatureOrPlaneswalker;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class DefibrillatingCurrent extends CardImpl {
|
||||
|
||||
public DefibrillatingCurrent(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2/R}{2/W}{2/B}");
|
||||
|
||||
// Defibrillating Current deals 4 damage to target creature or planeswalker and you gain 2 life.
|
||||
this.getSpellAbility().addEffect(new DamageTargetEffect(4));
|
||||
this.getSpellAbility().addEffect(new GainLifeEffect(2).concatBy("and"));
|
||||
this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker());
|
||||
}
|
||||
|
||||
private DefibrillatingCurrent(final DefibrillatingCurrent card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DefibrillatingCurrent copy() {
|
||||
return new DefibrillatingCurrent(this);
|
||||
}
|
||||
}
|
||||
57
Mage.Sets/src/mage/cards/d/DeltaBloodflies.java
Normal file
57
Mage.Sets/src/mage/cards/d/DeltaBloodflies.java
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.AttacksTriggeredAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
||||
import mage.abilities.effects.common.LoseLifeOpponentsEffect;
|
||||
import mage.abilities.hint.ConditionHint;
|
||||
import mage.abilities.hint.Hint;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.CounterAnyPredicate;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class DeltaBloodflies extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterControlledCreaturePermanent("you control a creature with a counter on it");
|
||||
|
||||
static {
|
||||
filter.add(CounterAnyPredicate.instance);
|
||||
}
|
||||
|
||||
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter);
|
||||
private static final Hint hint = new ConditionHint(condition, "You control a creture with a counter on it");
|
||||
|
||||
public DeltaBloodflies(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
|
||||
|
||||
this.subtype.add(SubType.INSECT);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Whenever this creature attacks, if you control a creature with a counter on it, each opponent loses 1 life.
|
||||
this.addAbility(new AttacksTriggeredAbility(new LoseLifeOpponentsEffect(1)).withInterveningIf(condition).addHint(hint));
|
||||
}
|
||||
|
||||
private DeltaBloodflies(final DeltaBloodflies card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DeltaBloodflies copy() {
|
||||
return new DeltaBloodflies(this);
|
||||
}
|
||||
}
|
||||
42
Mage.Sets/src/mage/cards/d/DescendantOfStorms.java
Normal file
42
Mage.Sets/src/mage/cards/d/DescendantOfStorms.java
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.AttacksTriggeredAbility;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.DoIfCostPaid;
|
||||
import mage.abilities.effects.keyword.EndureSourceEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class DescendantOfStorms extends CardImpl {
|
||||
|
||||
public DescendantOfStorms(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.SOLDIER);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(1);
|
||||
|
||||
// Whenever this creature attacks, you may pay {1}{W}. If you do, it endures 1.
|
||||
this.addAbility(new AttacksTriggeredAbility(new DoIfCostPaid(
|
||||
new EndureSourceEffect(1), new ManaCostsImpl<>("{1}{W}")
|
||||
)));
|
||||
}
|
||||
|
||||
private DescendantOfStorms(final DescendantOfStorms card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DescendantOfStorms copy() {
|
||||
return new DescendantOfStorms(this);
|
||||
}
|
||||
}
|
||||
42
Mage.Sets/src/mage/cards/d/DispellingExhale.java
Normal file
42
Mage.Sets/src/mage/cards/d/DispellingExhale.java
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.abilities.condition.common.BeheldDragonCondition;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||
import mage.abilities.effects.common.CounterUnlessPaysEffect;
|
||||
import mage.abilities.keyword.BeholdDragonAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class DispellingExhale extends CardImpl {
|
||||
|
||||
public DispellingExhale(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}");
|
||||
|
||||
// As an additional cost to cast this spell, you may behold a Dragon.
|
||||
this.addAbility(new BeholdDragonAbility());
|
||||
|
||||
// Counter target spell unless its controller pays {2}. If a Dragon was beheld, counter that spell unless its controller pays {4} instead.
|
||||
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
|
||||
new CounterUnlessPaysEffect(new GenericManaCost(4)),
|
||||
new CounterUnlessPaysEffect(new GenericManaCost(2)),
|
||||
BeheldDragonCondition.instance, "counter target spell unless its controller pays {2}. " +
|
||||
"If a Dragon was beheld, counter that spell unless its controller pays {4} instead"
|
||||
));
|
||||
}
|
||||
|
||||
private DispellingExhale(final DispellingExhale card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DispellingExhale copy() {
|
||||
return new DispellingExhale(this);
|
||||
}
|
||||
}
|
||||
48
Mage.Sets/src/mage/cards/d/DragonbroodsRelic.java
Normal file
48
Mage.Sets/src/mage/cards/d/DragonbroodsRelic.java
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||
import mage.abilities.costs.common.TapTargetCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.mana.AnyColorManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.permanent.token.ReliquaryDragonToken;
|
||||
import mage.target.common.TargetControlledPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class DragonbroodsRelic extends CardImpl {
|
||||
|
||||
public DragonbroodsRelic(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{G}");
|
||||
|
||||
// {T}, Tap an untapped creature you control: Add one mana of any color.
|
||||
Ability ability = new AnyColorManaAbility();
|
||||
ability.addCost(new TapTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_UNTAPPED_CREATURE)));
|
||||
this.addAbility(ability);
|
||||
|
||||
// {3}{W}{U}{B}{R}{G}, Sacrifice this artifact: Create a 4/4 Dragon creature token named Reliquary Dragon that's all colors. It has flying, lifelink, and "When this token enters, it deals 3 damage to any target." Activate only as a sorcery.
|
||||
ability = new ActivateAsSorceryActivatedAbility(
|
||||
new CreateTokenEffect(new ReliquaryDragonToken()), new ManaCostsImpl<>("{3}{W}{U}{B}{R}{G}")
|
||||
);
|
||||
ability.addCost(new SacrificeSourceCost());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private DragonbroodsRelic(final DragonbroodsRelic card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DragonbroodsRelic copy() {
|
||||
return new DragonbroodsRelic(this);
|
||||
}
|
||||
}
|
||||
66
Mage.Sets/src/mage/cards/d/Dragonologist.java
Normal file
66
Mage.Sets/src/mage/cards/d/Dragonologist.java
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
import mage.abilities.keyword.HexproofAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.PutCards;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.permanent.TappedPredicate;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class Dragonologist extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("an instant, sorcery, or Dragon card");
|
||||
private static final FilterPermanent filter2 = new FilterPermanent(SubType.DRAGON, "untapped Dragons");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.or(
|
||||
CardType.INSTANT.getPredicate(),
|
||||
CardType.SORCERY.getPredicate(),
|
||||
SubType.DRAGON.getPredicate()
|
||||
));
|
||||
filter2.add(TappedPredicate.UNTAPPED);
|
||||
}
|
||||
|
||||
public Dragonologist(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.WIZARD);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// When this creature enters, look at the top six cards of your library. You may reveal an instant, sorcery, or Dragon card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect(
|
||||
6, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM
|
||||
)));
|
||||
|
||||
// Untapped Dragons you control have hexproof.
|
||||
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
|
||||
HexproofAbility.getInstance(), Duration.WhileOnBattlefield, filter2
|
||||
)));
|
||||
}
|
||||
|
||||
private Dragonologist(final Dragonologist card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dragonologist copy() {
|
||||
return new Dragonologist(this);
|
||||
}
|
||||
}
|
||||
48
Mage.Sets/src/mage/cards/d/DragonsPrey.java
Normal file
48
Mage.Sets/src/mage/cards/d/DragonsPrey.java
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.SourceTargetsPermanentCondition;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.effects.common.cost.SpellCostIncreaseSourceEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class DragonsPrey extends CardImpl {
|
||||
|
||||
private static final Condition condition = new SourceTargetsPermanentCondition(
|
||||
new FilterPermanent(SubType.DRAGON, "a Dragon")
|
||||
);
|
||||
|
||||
public DragonsPrey(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{B}");
|
||||
|
||||
// This spell costs {2} more to cast if it targets a Dragon.
|
||||
this.addAbility(new SimpleStaticAbility(
|
||||
Zone.ALL, new SpellCostIncreaseSourceEffect(2, condition).setCanWorksOnStackOnly(true)
|
||||
).setRuleAtTheTop(true));
|
||||
|
||||
// Destroy target creature.
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
}
|
||||
|
||||
private DragonsPrey(final DragonsPrey card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DragonsPrey copy() {
|
||||
return new DragonsPrey(this);
|
||||
}
|
||||
}
|
||||
59
Mage.Sets/src/mage/cards/d/DragonstormForecaster.java
Normal file
59
Mage.Sets/src/mage/cards/d/DragonstormForecaster.java
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.mageobject.NamePredicate;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class DragonstormForecaster extends CardImpl {
|
||||
|
||||
private static final FilterCard filter
|
||||
= new FilterCard("a card named Dragonstorm Globe or Boulderborn Dragon");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.or(
|
||||
new NamePredicate("Dragonstorm Globe"),
|
||||
new NamePredicate("Boulderborn Dragon")
|
||||
));
|
||||
}
|
||||
|
||||
public DragonstormForecaster(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.SCOUT);
|
||||
this.power = new MageInt(0);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// {2}, {T}: Search your library for a card named Dragonstorm Globe or Boulderborn Dragon, reveal it, put it into your hand, then shuffle.
|
||||
Ability ability = new SimpleActivatedAbility(
|
||||
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true), new GenericManaCost(2)
|
||||
);
|
||||
ability.addCost(new TapSourceCost());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private DragonstormForecaster(final DragonstormForecaster card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DragonstormForecaster copy() {
|
||||
return new DragonstormForecaster(this);
|
||||
}
|
||||
}
|
||||
42
Mage.Sets/src/mage/cards/d/DragonstormGlobe.java
Normal file
42
Mage.Sets/src/mage/cards/d/DragonstormGlobe.java
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.common.EntersWithCountersControlledEffect;
|
||||
import mage.abilities.mana.AnyColorManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class DragonstormGlobe extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent(SubType.DRAGON, "Dragon");
|
||||
|
||||
public DragonstormGlobe(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
|
||||
|
||||
// Each Dragon you control enters with an additional +1/+1 counter on it.
|
||||
this.addAbility(new SimpleStaticAbility(new EntersWithCountersControlledEffect(
|
||||
filter, CounterType.P1P1.createInstance(), false
|
||||
)));
|
||||
|
||||
// {T}: Add one mana of any color.
|
||||
this.addAbility(new AnyColorManaAbility());
|
||||
}
|
||||
|
||||
private DragonstormGlobe(final DragonstormGlobe card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DragonstormGlobe copy() {
|
||||
return new DragonstormGlobe(this);
|
||||
}
|
||||
}
|
||||
45
Mage.Sets/src/mage/cards/d/DutyBeyondDeath.java
Normal file
45
Mage.Sets/src/mage/cards/d/DutyBeyondDeath.java
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||
import mage.abilities.keyword.IndestructibleAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class DutyBeyondDeath extends CardImpl {
|
||||
|
||||
public DutyBeyondDeath(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}");
|
||||
|
||||
// As an additional cost to cast this spell, sacrifice a creature.
|
||||
this.getSpellAbility().addCost(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_A_CREATURE));
|
||||
|
||||
// Creatures you control gain indestructible until end of turn. Put a +1/+1 counter on each creature you control.
|
||||
this.getSpellAbility().addEffect(new GainAbilityControlledEffect(
|
||||
IndestructibleAbility.getInstance(), Duration.EndOfTurn,
|
||||
StaticFilters.FILTER_PERMANENT_CREATURES
|
||||
));
|
||||
this.getSpellAbility().addEffect(new AddCountersAllEffect(
|
||||
CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE
|
||||
));
|
||||
}
|
||||
|
||||
private DutyBeyondDeath(final DutyBeyondDeath card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DutyBeyondDeath copy() {
|
||||
return new DutyBeyondDeath(this);
|
||||
}
|
||||
}
|
||||
93
Mage.Sets/src/mage/cards/e/EmbermouthSentinel.java
Normal file
93
Mage.Sets/src/mage/cards/e/EmbermouthSentinel.java
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
package mage.cards.e;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.CardsImpl;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterControlledPermanent;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class EmbermouthSentinel extends CardImpl {
|
||||
|
||||
public EmbermouthSentinel(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}");
|
||||
|
||||
this.subtype.add(SubType.CHIMERA);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(1);
|
||||
|
||||
// When this creature enters, you may search your library for a basic land card, reveal it, then shuffle and put that card on top. If you control a Dragon, put that card onto the battlefield tapped instead.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new EmbermouthSentinelEffect(), true));
|
||||
}
|
||||
|
||||
private EmbermouthSentinel(final EmbermouthSentinel card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EmbermouthSentinel copy() {
|
||||
return new EmbermouthSentinel(this);
|
||||
}
|
||||
}
|
||||
|
||||
class EmbermouthSentinelEffect extends OneShotEffect {
|
||||
|
||||
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.DRAGON);
|
||||
|
||||
EmbermouthSentinelEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "search your library for a basic land card, reveal it, then shuffle and put that card on top. " +
|
||||
"If you control a Dragon, put that card onto the battlefield tapped instead";
|
||||
}
|
||||
|
||||
private EmbermouthSentinelEffect(final EmbermouthSentinelEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EmbermouthSentinelEffect copy() {
|
||||
return new EmbermouthSentinelEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
if (player == null) {
|
||||
return false;
|
||||
}
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND);
|
||||
player.searchLibrary(target, source, game);
|
||||
Card card = player.getLibrary().getCard(target.getFirstTarget(), game);
|
||||
player.shuffleLibrary(source, game);
|
||||
if (card == null) {
|
||||
return true;
|
||||
}
|
||||
player.revealCards(source, new CardsImpl(card), game);
|
||||
if (game.getBattlefield().contains(filter, source, game, 1)) {
|
||||
player.moveCards(
|
||||
card, Zone.BATTLEFIELD, source, game, true,
|
||||
false, false, null
|
||||
);
|
||||
} else {
|
||||
player.putCardsOnTopOfLibrary(card, game, source, false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
44
Mage.Sets/src/mage/cards/e/EncroachingDragonstorm.java
Normal file
44
Mage.Sets/src/mage/cards/e/EncroachingDragonstorm.java
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
package mage.cards.e;
|
||||
|
||||
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.effects.common.ReturnToHandSourceEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class EncroachingDragonstorm extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent(SubType.DRAGON, "a Dragon");
|
||||
|
||||
public EncroachingDragonstorm(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}");
|
||||
|
||||
// When this enchantment enters, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(
|
||||
new TargetCardInLibrary(0, 2, StaticFilters.FILTER_CARD_BASIC_LANDS), true
|
||||
)));
|
||||
|
||||
// When a Dragon you control enters, return this enchantment to its owner's hand.
|
||||
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new ReturnToHandSourceEffect(), filter));
|
||||
}
|
||||
|
||||
private EncroachingDragonstorm(final EncroachingDragonstorm card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EncroachingDragonstorm copy() {
|
||||
return new EncroachingDragonstorm(this);
|
||||
}
|
||||
}
|
||||
56
Mage.Sets/src/mage/cards/f/FelotharDawnOfTheAbzan.java
Normal file
56
Mage.Sets/src/mage/cards/f/FelotharDawnOfTheAbzan.java
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
package mage.cards.f;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
|
||||
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
||||
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||
import mage.abilities.effects.common.DoWhenCostPaid;
|
||||
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||
import mage.abilities.keyword.TrampleAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class FelotharDawnOfTheAbzan extends CardImpl {
|
||||
|
||||
public FelotharDawnOfTheAbzan(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{B}{G}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.WARRIOR);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// Trample
|
||||
this.addAbility(TrampleAbility.getInstance());
|
||||
|
||||
// Whenever Felothar enters or attacks, you may sacrifice a nonland permanent. When you do, put a +1/+1 counter on each creature you control.
|
||||
this.addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(new DoWhenCostPaid(
|
||||
new ReflexiveTriggeredAbility(new AddCountersAllEffect(
|
||||
CounterType.P1P1.createInstance(),
|
||||
StaticFilters.FILTER_CONTROLLED_CREATURE
|
||||
), false),
|
||||
new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_NON_LAND),
|
||||
"Sacrifice a nonland permanent?"
|
||||
)));
|
||||
}
|
||||
|
||||
private FelotharDawnOfTheAbzan(final FelotharDawnOfTheAbzan card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FelotharDawnOfTheAbzan copy() {
|
||||
return new FelotharDawnOfTheAbzan(this);
|
||||
}
|
||||
}
|
||||
77
Mage.Sets/src/mage/cards/g/GlacialDragonhunt.java
Normal file
77
Mage.Sets/src/mage/cards/g/GlacialDragonhunt.java
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
package mage.cards.g;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.keyword.HarmonizeAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class GlacialDragonhunt extends CardImpl {
|
||||
|
||||
public GlacialDragonhunt(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{U}{R}");
|
||||
|
||||
// Draw a card, then you may discard a card. When you discard a nonland card this way, Glacial Dragonhunt deals 3 damage to target creature.
|
||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
|
||||
this.getSpellAbility().addEffect(new GlacialDragonhuntEffect());
|
||||
|
||||
// Harmonize {4}{U}{R}
|
||||
this.addAbility(new HarmonizeAbility(this, "{4}{U}{R}"));
|
||||
}
|
||||
|
||||
private GlacialDragonhunt(final GlacialDragonhunt card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GlacialDragonhunt copy() {
|
||||
return new GlacialDragonhunt(this);
|
||||
}
|
||||
}
|
||||
|
||||
class GlacialDragonhuntEffect extends OneShotEffect {
|
||||
|
||||
GlacialDragonhuntEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = ", then you may discard a card. When you discard a nonland card this way, " +
|
||||
"{this} deals 3 damage to target creature";
|
||||
}
|
||||
|
||||
private GlacialDragonhuntEffect(final GlacialDragonhuntEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GlacialDragonhuntEffect copy() {
|
||||
return new GlacialDragonhuntEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
if (player == null || player.getHand().isEmpty()
|
||||
|| player
|
||||
.discard(0, 1, true, source, game)
|
||||
.count(StaticFilters.FILTER_CARD_NON_LAND, game) < 1) {
|
||||
return false;
|
||||
}
|
||||
ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new DamageTargetEffect(3), false);
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
game.fireReflexiveTriggeredAbility(ability, source);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
64
Mage.Sets/src/mage/cards/g/GreatArashinCity.java
Normal file
64
Mage.Sets/src/mage/cards/g/GreatArashinCity.java
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
package mage.cards.g;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTappedUnlessAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.condition.common.YouControlPermanentCondition;
|
||||
import mage.abilities.costs.common.ExileFromGraveCost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.mana.BlackManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.permanent.token.SpiritWhiteToken;
|
||||
import mage.target.common.TargetCardInYourGraveyard;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class GreatArashinCity extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent("a Forest or a Plains");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.or(
|
||||
SubType.FOREST.getPredicate(),
|
||||
SubType.PLAINS.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter);
|
||||
|
||||
public GreatArashinCity(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
|
||||
|
||||
// This land enters tapped unless you control a Forest or a Plains.
|
||||
this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint()));
|
||||
|
||||
// {T}: Add {B}.
|
||||
this.addAbility(new BlackManaAbility());
|
||||
|
||||
// {1}{B}, {T}, Exile a creature card from your graveyard: Create a 1/1 white Spirit creature token.
|
||||
Ability ability = new SimpleActivatedAbility(new CreateTokenEffect(new SpiritWhiteToken()), new ManaCostsImpl<>("{1}{B}"));
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE)));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private GreatArashinCity(final GreatArashinCity card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GreatArashinCity copy() {
|
||||
return new GreatArashinCity(this);
|
||||
}
|
||||
}
|
||||
41
Mage.Sets/src/mage/cards/g/GurmagNightwatch.java
Normal file
41
Mage.Sets/src/mage/cards/g/GurmagNightwatch.java
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
package mage.cards.g;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.PutCards;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class GurmagNightwatch extends CardImpl {
|
||||
|
||||
public GurmagNightwatch(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2/B}{2/G}{2/U}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.RANGER);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// When this creature enters, look at the top three cards of your library. You may put one of those cards back on top of your library. Put the rest into your graveyard.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect(
|
||||
3, 1, PutCards.TOP_ANY, PutCards.GRAVEYARD, true
|
||||
)));
|
||||
}
|
||||
|
||||
private GurmagNightwatch(final GurmagNightwatch card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GurmagNightwatch copy() {
|
||||
return new GurmagNightwatch(this);
|
||||
}
|
||||
}
|
||||
51
Mage.Sets/src/mage/cards/h/HardenedTactician.java
Normal file
51
Mage.Sets/src/mage/cards/h/HardenedTactician.java
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
package mage.cards.h;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.predicate.permanent.TokenPredicate;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class HardenedTactician extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent("a token");
|
||||
|
||||
static {
|
||||
filter.add(TokenPredicate.TRUE);
|
||||
}
|
||||
|
||||
public HardenedTactician(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{B}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.WARRIOR);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
// {1}, Sacrifice a token: Draw a card.
|
||||
Ability ability = new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new GenericManaCost(1));
|
||||
ability.addCost(new SacrificeTargetCost(filter));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private HardenedTactician(final HardenedTactician card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HardenedTactician copy() {
|
||||
return new HardenedTactician(this);
|
||||
}
|
||||
}
|
||||
41
Mage.Sets/src/mage/cards/j/JeskaiBrushmaster.java
Normal file
41
Mage.Sets/src/mage/cards/j/JeskaiBrushmaster.java
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
package mage.cards.j;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.keyword.DoubleStrikeAbility;
|
||||
import mage.abilities.keyword.ProwessAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class JeskaiBrushmaster extends CardImpl {
|
||||
|
||||
public JeskaiBrushmaster(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{R}{W}");
|
||||
|
||||
this.subtype.add(SubType.ORC);
|
||||
this.subtype.add(SubType.MONK);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
// Double strike
|
||||
this.addAbility(DoubleStrikeAbility.getInstance());
|
||||
|
||||
// Prowess
|
||||
this.addAbility(new ProwessAbility());
|
||||
}
|
||||
|
||||
private JeskaiBrushmaster(final JeskaiBrushmaster card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JeskaiBrushmaster copy() {
|
||||
return new JeskaiBrushmaster(this);
|
||||
}
|
||||
}
|
||||
48
Mage.Sets/src/mage/cards/j/JeskaiDevotee.java
Normal file
48
Mage.Sets/src/mage/cards/j/JeskaiDevotee.java
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
package mage.cards.j;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.FlurryAbility;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||
import mage.abilities.effects.mana.AddManaFromColorChoicesEffect;
|
||||
import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.ManaType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class JeskaiDevotee extends CardImpl {
|
||||
|
||||
public JeskaiDevotee(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
|
||||
|
||||
this.subtype.add(SubType.ORC);
|
||||
this.subtype.add(SubType.MONK);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
// Flurry -- Whenever you cast your second spell each turn, this creature gets +1/+1 until end of turn.
|
||||
this.addAbility(new FlurryAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn)));
|
||||
|
||||
// {1}: Add {U}, {R}, or {W}. Activate only once each turn.
|
||||
this.addAbility(new LimitedTimesPerTurnActivatedManaAbility(
|
||||
new AddManaFromColorChoicesEffect(ManaType.BLUE, ManaType.RED, ManaType.WHITE), new GenericManaCost(1)
|
||||
));
|
||||
}
|
||||
|
||||
private JeskaiDevotee(final JeskaiDevotee card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JeskaiDevotee copy() {
|
||||
return new JeskaiDevotee(this);
|
||||
}
|
||||
}
|
||||
64
Mage.Sets/src/mage/cards/j/JeskaiMonument.java
Normal file
64
Mage.Sets/src/mage/cards/j/JeskaiMonument.java
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
package mage.cards.j;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.permanent.token.BirdToken;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class JeskaiMonument extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("basic Island, Mountain, or Plains card");
|
||||
|
||||
static {
|
||||
filter.add(SuperType.BASIC.getPredicate());
|
||||
filter.add(Predicates.or(
|
||||
SubType.ISLAND.getPredicate(),
|
||||
SubType.MOUNTAIN.getPredicate(),
|
||||
SubType.PLAINS.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
public JeskaiMonument(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
|
||||
|
||||
// When this artifact enters, search your library for a basic Island, Mountain, or Plains card, reveal it, put it into your hand, then shuffle.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(
|
||||
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true)
|
||||
));
|
||||
|
||||
// {1}{U}{R}{W}, {T}, Sacrifice this artifact: Create two 1/1 white Bird creature tokens with flying. Activate only as a sorcery.
|
||||
Ability ability = new ActivateAsSorceryActivatedAbility(
|
||||
new CreateTokenEffect(new BirdToken(), 2), new ManaCostsImpl<>("{1}{U}{R}{W}")
|
||||
);
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.addCost(new SacrificeSourceCost());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private JeskaiMonument(final JeskaiMonument card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JeskaiMonument copy() {
|
||||
return new JeskaiMonument(this);
|
||||
}
|
||||
}
|
||||
49
Mage.Sets/src/mage/cards/j/JeskaiShrinekeeper.java
Normal file
49
Mage.Sets/src/mage/cards/j/JeskaiShrinekeeper.java
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
package mage.cards.j;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.HasteAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class JeskaiShrinekeeper extends CardImpl {
|
||||
|
||||
public JeskaiShrinekeeper(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{R}{W}");
|
||||
|
||||
this.subtype.add(SubType.DRAGON);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Haste
|
||||
this.addAbility(HasteAbility.getInstance());
|
||||
|
||||
// Whenever this creature deals combat damage to a player, you gain 1 life and draw a card.
|
||||
Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new GainLifeEffect(1));
|
||||
ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and"));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private JeskaiShrinekeeper(final JeskaiShrinekeeper card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JeskaiShrinekeeper copy() {
|
||||
return new JeskaiShrinekeeper(this);
|
||||
}
|
||||
}
|
||||
55
Mage.Sets/src/mage/cards/k/KheruGoldkeeper.java
Normal file
55
Mage.Sets/src/mage/cards/k/KheruGoldkeeper.java
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
package mage.cards.k;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.CardsLeaveGraveyardTriggeredAbility;
|
||||
import mage.abilities.common.RenewAbility;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.permanent.token.TreasureToken;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class KheruGoldkeeper extends CardImpl {
|
||||
|
||||
public KheruGoldkeeper(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{G}{U}");
|
||||
|
||||
this.subtype.add(SubType.DRAGON);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Whenever one or more cards leave your graveyard during your turn, create a Treasure token.
|
||||
this.addAbility(new CardsLeaveGraveyardTriggeredAbility(
|
||||
new CreateTokenEffect(new TreasureToken()),
|
||||
StaticFilters.FILTER_CARD_CARDS, true
|
||||
));
|
||||
|
||||
// Renew -- {2}{B}{G}{U}, Exile this card from your graveyard: Put two +1/+1 counters and a flying counter on target creature. Activate only as a sorcery.
|
||||
this.addAbility(new RenewAbility(
|
||||
"{2}{B}{G}{U}",
|
||||
CounterType.P1P1.createInstance(2),
|
||||
CounterType.FLYING.createInstance()
|
||||
));
|
||||
}
|
||||
|
||||
private KheruGoldkeeper(final KheruGoldkeeper card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public KheruGoldkeeper copy() {
|
||||
return new KheruGoldkeeper(this);
|
||||
}
|
||||
}
|
||||
41
Mage.Sets/src/mage/cards/k/KinTreeSeverance.java
Normal file
41
Mage.Sets/src/mage/cards/k/KinTreeSeverance.java
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
package mage.cards.k;
|
||||
|
||||
import mage.abilities.effects.common.ExileTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.ComparisonType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
||||
import mage.target.TargetPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class KinTreeSeverance extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent("permanent with mana value 3 or greater");
|
||||
|
||||
static {
|
||||
filter.add(new ManaValuePredicate(ComparisonType.MORE_THAN, 2));
|
||||
}
|
||||
|
||||
public KinTreeSeverance(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2/W}{2/B}{2/G}");
|
||||
|
||||
// Exile target permanent with mana value 3 or greater.
|
||||
this.getSpellAbility().addEffect(new ExileTargetEffect());
|
||||
this.getSpellAbility().addTarget(new TargetPermanent(filter));
|
||||
}
|
||||
|
||||
private KinTreeSeverance(final KinTreeSeverance card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public KinTreeSeverance copy() {
|
||||
return new KinTreeSeverance(this);
|
||||
}
|
||||
}
|
||||
45
Mage.Sets/src/mage/cards/k/KishlaSkimmer.java
Normal file
45
Mage.Sets/src/mage/cards/k/KishlaSkimmer.java
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
package mage.cards.k;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.CardsLeaveGraveyardTriggeredAbility;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class KishlaSkimmer extends CardImpl {
|
||||
|
||||
public KishlaSkimmer(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{U}");
|
||||
|
||||
this.subtype.add(SubType.BIRD);
|
||||
this.subtype.add(SubType.SCOUT);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Whenever a card leaves your graveyard during your turn, draw a card. This ability triggers only once each turn.
|
||||
this.addAbility(new CardsLeaveGraveyardTriggeredAbility(
|
||||
new DrawCardSourceControllerEffect(1), StaticFilters.FILTER_CARD, true
|
||||
).setTriggerPhrase("Whenever a card leaves your graveyard during your turn, ").setTriggersLimitEachTurn(1));
|
||||
}
|
||||
|
||||
private KishlaSkimmer(final KishlaSkimmer card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public KishlaSkimmer copy() {
|
||||
return new KishlaSkimmer(this);
|
||||
}
|
||||
}
|
||||
49
Mage.Sets/src/mage/cards/k/KishlaTrawlers.java
Normal file
49
Mage.Sets/src/mage/cards/k/KishlaTrawlers.java
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
package mage.cards.k;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
||||
import mage.abilities.costs.common.ExileFromGraveCost;
|
||||
import mage.abilities.effects.common.DoWhenCostPaid;
|
||||
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.target.common.TargetCardInYourGraveyard;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class KishlaTrawlers extends CardImpl {
|
||||
|
||||
public KishlaTrawlers(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.CITIZEN);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
// When this creature enters, you may exile a creature card from your graveyard. When you do, return target instant or sorcery card from your graveyard to your hand.
|
||||
ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect(), false);
|
||||
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY_FROM_YOUR_GRAVEYARD));
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new DoWhenCostPaid(
|
||||
ability,
|
||||
new ExileFromGraveCost(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)),
|
||||
"Exile a creature card from your graveyard?"
|
||||
)));
|
||||
}
|
||||
|
||||
private KishlaTrawlers(final KishlaTrawlers card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public KishlaTrawlers copy() {
|
||||
return new KishlaTrawlers(this);
|
||||
}
|
||||
}
|
||||
59
Mage.Sets/src/mage/cards/k/KishlaVillage.java
Normal file
59
Mage.Sets/src/mage/cards/k/KishlaVillage.java
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
package mage.cards.k;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTappedUnlessAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.condition.common.YouControlPermanentCondition;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.keyword.SurveilEffect;
|
||||
import mage.abilities.mana.GreenManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.predicate.Predicates;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class KishlaVillage extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent("an Island or a Swamp");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.or(
|
||||
SubType.ISLAND.getPredicate(),
|
||||
SubType.SWAMP.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter);
|
||||
|
||||
public KishlaVillage(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
|
||||
|
||||
// This land enters tapped unless you control an Island or a Swamp.
|
||||
this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint()));
|
||||
|
||||
// {T}: Add {G}.
|
||||
this.addAbility(new GreenManaAbility());
|
||||
|
||||
// {3}{G}, {T}: Surveil 2.
|
||||
Ability ability = new SimpleActivatedAbility(new SurveilEffect(2), new ManaCostsImpl<>("{3}{G}"));
|
||||
ability.addCost(new TapSourceCost());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private KishlaVillage(final KishlaVillage card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public KishlaVillage copy() {
|
||||
return new KishlaVillage(this);
|
||||
}
|
||||
}
|
||||
45
Mage.Sets/src/mage/cards/k/KrotiqNestguard.java
Normal file
45
Mage.Sets/src/mage/cards/k/KrotiqNestguard.java
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
package mage.cards.k;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.combat.CanAttackAsThoughItDidntHaveDefenderSourceEffect;
|
||||
import mage.abilities.keyword.DefenderAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class KrotiqNestguard extends CardImpl {
|
||||
|
||||
public KrotiqNestguard(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}");
|
||||
|
||||
this.subtype.add(SubType.INSECT);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
// Defender
|
||||
this.addAbility(DefenderAbility.getInstance());
|
||||
|
||||
// {2}{G}: This creature can attack this turn as though it didn't have defender.
|
||||
this.addAbility(new SimpleActivatedAbility(
|
||||
new CanAttackAsThoughItDidntHaveDefenderSourceEffect(Duration.EndOfTurn), new ManaCostsImpl<>("{2}{G}")
|
||||
));
|
||||
}
|
||||
|
||||
private KrotiqNestguard(final KrotiqNestguard card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public KrotiqNestguard copy() {
|
||||
return new KrotiqNestguard(this);
|
||||
}
|
||||
}
|
||||
38
Mage.Sets/src/mage/cards/l/LightfootTechnique.java
Normal file
38
Mage.Sets/src/mage/cards/l/LightfootTechnique.java
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
package mage.cards.l;
|
||||
|
||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.IndestructibleAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class LightfootTechnique extends CardImpl {
|
||||
|
||||
public LightfootTechnique(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}");
|
||||
|
||||
// Put a +1/+1 counter on target creature. It gains flying and indestructible until end of turn.
|
||||
this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance()));
|
||||
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance()).setText("it gains flying"));
|
||||
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(IndestructibleAbility.getInstance()).setText("and indestructible until end of turn"));
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
}
|
||||
|
||||
private LightfootTechnique(final LightfootTechnique card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LightfootTechnique copy() {
|
||||
return new LightfootTechnique(this);
|
||||
}
|
||||
}
|
||||
44
Mage.Sets/src/mage/cards/l/LoxodonBattlePriest.java
Normal file
44
Mage.Sets/src/mage/cards/l/LoxodonBattlePriest.java
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
package mage.cards.l;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.target.TargetPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class LoxodonBattlePriest extends CardImpl {
|
||||
|
||||
public LoxodonBattlePriest(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}");
|
||||
|
||||
this.subtype.add(SubType.ELEPHANT);
|
||||
this.subtype.add(SubType.CLERIC);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(5);
|
||||
|
||||
// At the beginning of combat on your turn, put a +1/+1 counter on another target creature you control.
|
||||
Ability ability = new BeginningOfCombatTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()));
|
||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE_YOU_CONTROL));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private LoxodonBattlePriest(final LoxodonBattlePriest card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LoxodonBattlePriest copy() {
|
||||
return new LoxodonBattlePriest(this);
|
||||
}
|
||||
}
|
||||
35
Mage.Sets/src/mage/cards/m/MammothBellow.java
Normal file
35
Mage.Sets/src/mage/cards/m/MammothBellow.java
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
package mage.cards.m;
|
||||
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.keyword.HarmonizeAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.game.permanent.token.Elephant55Token;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class MammothBellow extends CardImpl {
|
||||
|
||||
public MammothBellow(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}{U}{R}");
|
||||
|
||||
// Create a 5/5 green Elephant creature token.
|
||||
this.getSpellAbility().addEffect(new CreateTokenEffect(new Elephant55Token()));
|
||||
|
||||
// Harmonize {5}{G}{U}{R}
|
||||
this.addAbility(new HarmonizeAbility(this, "{5}{G}{U}{R}"));
|
||||
}
|
||||
|
||||
private MammothBellow(final MammothBellow card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MammothBellow copy() {
|
||||
return new MammothBellow(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,25 +1,15 @@
|
|||
|
||||
package mage.cards.m;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.Mana;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.mana.ManaEffect;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.effects.mana.AddManaFromColorChoicesEffect;
|
||||
import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.choices.Choice;
|
||||
import mage.choices.ChoiceColor;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.ColoredManaSymbol;
|
||||
import mage.constants.ManaType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
|
|
@ -36,11 +26,9 @@ public final class ManaforgeCinder extends CardImpl {
|
|||
|
||||
// {1}: Add {B} or {R}. Activate this ability no more than three times each turn.
|
||||
this.addAbility(new LimitedTimesPerTurnActivatedManaAbility(
|
||||
Zone.BATTLEFIELD, new ManaforgeCinderManaEffect(),
|
||||
new ManaCostsImpl<>("{1}"), 3,
|
||||
ManaforgeCinderManaEffect.netMana
|
||||
new AddManaFromColorChoicesEffect(ManaType.BLACK, ManaType.RED),
|
||||
new GenericManaCost(1), 3
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
private ManaforgeCinder(final ManaforgeCinder card) {
|
||||
|
|
@ -52,62 +40,3 @@ public final class ManaforgeCinder extends CardImpl {
|
|||
return new ManaforgeCinder(this);
|
||||
}
|
||||
}
|
||||
|
||||
class ManaforgeCinderManaEffect extends ManaEffect {
|
||||
|
||||
static final List<Mana> netMana = new ArrayList<>();
|
||||
|
||||
static {
|
||||
netMana.add(new Mana(ColoredManaSymbol.R));
|
||||
netMana.add(new Mana(ColoredManaSymbol.B));
|
||||
}
|
||||
|
||||
|
||||
public ManaforgeCinderManaEffect() {
|
||||
super();
|
||||
this.staticText = "Add {B} or {R}";
|
||||
}
|
||||
|
||||
private ManaforgeCinderManaEffect(final ManaforgeCinderManaEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ManaforgeCinderManaEffect copy() {
|
||||
return new ManaforgeCinderManaEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Mana> getNetMana(Game game, Ability source) {
|
||||
return netMana;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mana produceMana(Game game, Ability source) {
|
||||
Mana mana = new Mana();
|
||||
if (game == null) {
|
||||
return mana;
|
||||
}
|
||||
Choice choice = new ChoiceColor(true);
|
||||
choice.getChoices().clear();
|
||||
choice.setMessage("Pick a mana color");
|
||||
choice.getChoices().add("Red");
|
||||
choice.getChoices().add("Black");
|
||||
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
if (player != null) {
|
||||
if (!player.choose(outcome, choice, game)) {
|
||||
return mana;
|
||||
}
|
||||
switch (choice.getChoice()) {
|
||||
case "Black":
|
||||
mana.setBlack(1);
|
||||
break;
|
||||
case "Red":
|
||||
mana.setRed(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return mana;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
47
Mage.Sets/src/mage/cards/m/MarduDevotee.java
Normal file
47
Mage.Sets/src/mage/cards/m/MarduDevotee.java
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
package mage.cards.m;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.effects.keyword.ScryEffect;
|
||||
import mage.abilities.effects.mana.AddManaFromColorChoicesEffect;
|
||||
import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.ManaType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class MarduDevotee extends CardImpl {
|
||||
|
||||
public MarduDevotee(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.SCOUT);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
// When this creature enters, scry 2.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new ScryEffect(2)));
|
||||
|
||||
// {1}: Add {R}, {W}, or {B}. Activate only once each turn.
|
||||
this.addAbility(new LimitedTimesPerTurnActivatedManaAbility(
|
||||
new AddManaFromColorChoicesEffect(ManaType.RED, ManaType.WHITE, ManaType.BLACK), new GenericManaCost(1)
|
||||
));
|
||||
}
|
||||
|
||||
private MarduDevotee(final MarduDevotee card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MarduDevotee copy() {
|
||||
return new MarduDevotee(this);
|
||||
}
|
||||
}
|
||||
98
Mage.Sets/src/mage/cards/m/MarduMonument.java
Normal file
98
Mage.Sets/src/mage/cards/m/MarduMonument.java
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
package mage.cards.m;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
|
||||
import mage.abilities.keyword.HasteAbility;
|
||||
import mage.abilities.keyword.MenaceAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.token.RedWarriorToken;
|
||||
import mage.game.permanent.token.Token;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
import mage.target.targetpointer.FixedTargets;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class MarduMonument extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("a basic Mountain, Plains, or Swamp card");
|
||||
|
||||
static {
|
||||
filter.add(SuperType.BASIC.getPredicate());
|
||||
filter.add(Predicates.or(
|
||||
SubType.MOUNTAIN.getPredicate(),
|
||||
SubType.PLAINS.getPredicate(),
|
||||
SubType.SWAMP.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
public MarduMonument(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
|
||||
|
||||
// When this artifact enters, search your library for a basic Mountain, Plains, or Swamp card, reveal it, put it into your hand, then shuffle.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(
|
||||
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true)
|
||||
));
|
||||
|
||||
// {2}{R}{W}{B}, {T}, Sacrifice this artifact: Create three 1/1 red Warrior creature tokens. They gain menace and haste until end of turn. Activate only as a sorcery.
|
||||
Ability ability = new ActivateAsSorceryActivatedAbility(
|
||||
new MarduMonumentEffect(), new ManaCostsImpl<>("{2}{R}{W}{B}")
|
||||
);
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.addCost(new SacrificeSourceCost());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private MarduMonument(final MarduMonument card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MarduMonument copy() {
|
||||
return new MarduMonument(this);
|
||||
}
|
||||
}
|
||||
|
||||
class MarduMonumentEffect extends OneShotEffect {
|
||||
|
||||
MarduMonumentEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "create three 1/1 red Warrior creature tokens. They gain menace and haste until end of turn";
|
||||
}
|
||||
|
||||
private MarduMonumentEffect(final MarduMonumentEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MarduMonumentEffect copy() {
|
||||
return new MarduMonumentEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Token token = new RedWarriorToken();
|
||||
token.putOntoBattlefield(3, game, source);
|
||||
game.addEffect(new GainAbilityTargetEffect(
|
||||
new MenaceAbility(false), Duration.EndOfTurn
|
||||
).setTargetPointer(new FixedTargets(token, game)), source);
|
||||
game.addEffect(new GainAbilityTargetEffect(
|
||||
HasteAbility.getInstance(), Duration.EndOfTurn
|
||||
).setTargetPointer(new FixedTargets(token, game)), source);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
43
Mage.Sets/src/mage/cards/m/MeticulousArtisan.java
Normal file
43
Mage.Sets/src/mage/cards/m/MeticulousArtisan.java
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
package mage.cards.m;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.keyword.ProwessAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.game.permanent.token.TreasureToken;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class MeticulousArtisan extends CardImpl {
|
||||
|
||||
public MeticulousArtisan(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
|
||||
|
||||
this.subtype.add(SubType.DJINN);
|
||||
this.subtype.add(SubType.ARTIFICER);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// Prowess
|
||||
this.addAbility(new ProwessAbility());
|
||||
|
||||
// When this creature enters, create a Treasure token.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new TreasureToken())));
|
||||
}
|
||||
|
||||
private MeticulousArtisan(final MeticulousArtisan card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MeticulousArtisan copy() {
|
||||
return new MeticulousArtisan(this);
|
||||
}
|
||||
}
|
||||
59
Mage.Sets/src/mage/cards/m/MonasteryMessenger.java
Normal file
59
Mage.Sets/src/mage/cards/m/MonasteryMessenger.java
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
package mage.cards.m;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.effects.common.PutOnLibraryTargetEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.VigilanceAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.common.FilterNoncreatureCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.target.common.TargetCardInYourGraveyard;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class MonasteryMessenger extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterNoncreatureCard("noncreature, nonland card from your graveyard");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.not(CardType.LAND.getPredicate()));
|
||||
}
|
||||
|
||||
public MonasteryMessenger(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2/U}{2/R}{2/W}");
|
||||
|
||||
this.subtype.add(SubType.BIRD);
|
||||
this.subtype.add(SubType.SCOUT);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Vigilance
|
||||
this.addAbility(VigilanceAbility.getInstance());
|
||||
|
||||
// When this creature enters, put up to one target noncreature, nonland card from your graveyard on top of your library.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new PutOnLibraryTargetEffect(true));
|
||||
ability.addTarget(new TargetCardInYourGraveyard(0, 1, filter));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private MonasteryMessenger(final MonasteryMessenger card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MonasteryMessenger copy() {
|
||||
return new MonasteryMessenger(this);
|
||||
}
|
||||
}
|
||||
39
Mage.Sets/src/mage/cards/n/NarsetsRebuke.java
Normal file
39
Mage.Sets/src/mage/cards/n/NarsetsRebuke.java
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
package mage.cards.n;
|
||||
|
||||
import mage.Mana;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.ExileTargetIfDiesEffect;
|
||||
import mage.abilities.effects.mana.BasicManaEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class NarsetsRebuke extends CardImpl {
|
||||
|
||||
public NarsetsRebuke(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{R}");
|
||||
|
||||
// Narset's Rebuke deals 5 damage to target creature. Add {U}{R}{W}. If that creature would die this turn, exile it instead.
|
||||
this.getSpellAbility().addEffect(new DamageTargetEffect(5));
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
this.getSpellAbility().addEffect(new BasicManaEffect(new Mana(
|
||||
1, 1, 0, 1, 0, 0, 0, 0
|
||||
)));
|
||||
this.getSpellAbility().addEffect(new ExileTargetIfDiesEffect());
|
||||
}
|
||||
|
||||
private NarsetsRebuke(final NarsetsRebuke card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NarsetsRebuke copy() {
|
||||
return new NarsetsRebuke(this);
|
||||
}
|
||||
}
|
||||
57
Mage.Sets/src/mage/cards/n/NaturesRhythm.java
Normal file
57
Mage.Sets/src/mage/cards/n/NaturesRhythm.java
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
package mage.cards.n;
|
||||
|
||||
import mage.abilities.dynamicvalue.common.GetXValue;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
|
||||
import mage.abilities.keyword.HarmonizeAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.common.FilterCreatureCard;
|
||||
import mage.filter.predicate.ObjectSourcePlayer;
|
||||
import mage.filter.predicate.ObjectSourcePlayerPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class NaturesRhythm extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCreatureCard("a creature card with mana value X or less");
|
||||
|
||||
static {
|
||||
filter.add(NaturesRhythmPredicate.instance);
|
||||
}
|
||||
|
||||
public NaturesRhythm(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{G}{G}");
|
||||
|
||||
// Search your library for a creature card with mana value X or less, put it onto the battlefield, then shuffle.
|
||||
this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter)));
|
||||
|
||||
// Harmonize {X}{G}{G}{G}{G}
|
||||
this.addAbility(new HarmonizeAbility(this, "{X}{G}{G}{G}{G}"));
|
||||
}
|
||||
|
||||
private NaturesRhythm(final NaturesRhythm card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NaturesRhythm copy() {
|
||||
return new NaturesRhythm(this);
|
||||
}
|
||||
}
|
||||
|
||||
enum NaturesRhythmPredicate implements ObjectSourcePlayerPredicate<Card> {
|
||||
instance;
|
||||
|
||||
@Override
|
||||
public boolean apply(ObjectSourcePlayer<Card> input, Game game) {
|
||||
return input.getObject().getManaValue() <= GetXValue.instance.calculate(game, input.getSource(), null);
|
||||
}
|
||||
}
|
||||
87
Mage.Sets/src/mage/cards/n/NerivHeartOfTheStorm.java
Normal file
87
Mage.Sets/src/mage/cards/n/NerivHeartOfTheStorm.java
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
package mage.cards.n;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.ReplacementEffectImpl;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class NerivHeartOfTheStorm extends CardImpl {
|
||||
|
||||
public NerivHeartOfTheStorm(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{W}{B}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.SPIRIT);
|
||||
this.subtype.add(SubType.DRAGON);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(5);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// If a creature you control that entered this turn would deal damage, it deals twice that much damage instead.
|
||||
this.addAbility(new SimpleStaticAbility(new NerivHeartOfTheStormEffect()));
|
||||
}
|
||||
|
||||
private NerivHeartOfTheStorm(final NerivHeartOfTheStorm card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NerivHeartOfTheStorm copy() {
|
||||
return new NerivHeartOfTheStorm(this);
|
||||
}
|
||||
}
|
||||
|
||||
class NerivHeartOfTheStormEffect extends ReplacementEffectImpl {
|
||||
|
||||
NerivHeartOfTheStormEffect() {
|
||||
super(Duration.WhileOnBattlefield, Outcome.Damage);
|
||||
staticText = "if a creature you control that entered this turn would deal damage, it deals twice that much damage instead";
|
||||
}
|
||||
|
||||
private NerivHeartOfTheStormEffect(final NerivHeartOfTheStormEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NerivHeartOfTheStormEffect copy() {
|
||||
return new NerivHeartOfTheStormEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checksEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGE_PERMANENT ||
|
||||
event.getType() == GameEvent.EventType.DAMAGE_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||
return Optional
|
||||
.ofNullable(game.getPermanentOrLKIBattlefield(event.getSourceId()))
|
||||
.map(permanent -> permanent.isCreature(game)
|
||||
&& permanent.getTurnsOnBattlefield() == 0
|
||||
&& permanent.isControlledBy(source.getControllerId()))
|
||||
.orElse(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
|
||||
event.setAmount(CardUtil.overflowMultiply(event.getAmount(), 2));
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
43
Mage.Sets/src/mage/cards/o/OsseousExhale.java
Normal file
43
Mage.Sets/src/mage/cards/o/OsseousExhale.java
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
package mage.cards.o;
|
||||
|
||||
import mage.abilities.condition.common.BeheldDragonCondition;
|
||||
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.keyword.BeholdDragonAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.target.common.TargetAttackingOrBlockingCreature;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class OsseousExhale extends CardImpl {
|
||||
|
||||
public OsseousExhale(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}");
|
||||
|
||||
// As an additional cost to cast this spell, you may behold a Dragon.
|
||||
this.addAbility(new BeholdDragonAbility());
|
||||
|
||||
// Osseous Exhale deals 5 damage to target attacking or blocking creature. If a Dragon was beheld, you gain 2 life.
|
||||
this.getSpellAbility().addEffect(new DamageTargetEffect(5));
|
||||
this.getSpellAbility().addTarget(new TargetAttackingOrBlockingCreature());
|
||||
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
|
||||
new GainLifeEffect(2), BeheldDragonCondition.instance,
|
||||
"if a Dragon was beheld, you gain 2 life"
|
||||
));
|
||||
}
|
||||
|
||||
private OsseousExhale(final OsseousExhale card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public OsseousExhale copy() {
|
||||
return new OsseousExhale(this);
|
||||
}
|
||||
}
|
||||
45
Mage.Sets/src/mage/cards/p/PiercingExhale.java
Normal file
45
Mage.Sets/src/mage/cards/p/PiercingExhale.java
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
package mage.cards.p;
|
||||
|
||||
import mage.abilities.condition.common.BeheldDragonCondition;
|
||||
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||
import mage.abilities.effects.common.DamageWithPowerFromOneToAnotherTargetEffect;
|
||||
import mage.abilities.effects.keyword.SurveilEffect;
|
||||
import mage.abilities.keyword.BeholdDragonAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.target.common.TargetControlledCreaturePermanent;
|
||||
import mage.target.common.TargetCreatureOrPlaneswalker;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class PiercingExhale extends CardImpl {
|
||||
|
||||
public PiercingExhale(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}");
|
||||
|
||||
// As an additional cost to cast this spell, you may behold a Dragon.
|
||||
this.addAbility(new BeholdDragonAbility());
|
||||
|
||||
// Target creature you control deals damage equal to its power to target creature or planeswalker. If a Dragon was beheld, surveil 2.
|
||||
this.getSpellAbility().addEffect(new DamageWithPowerFromOneToAnotherTargetEffect());
|
||||
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
|
||||
this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker());
|
||||
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
|
||||
new SurveilEffect(2), BeheldDragonCondition.instance,
|
||||
"if a Dragon was beheld, surveil 2"
|
||||
));
|
||||
}
|
||||
|
||||
private PiercingExhale(final PiercingExhale card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PiercingExhale copy() {
|
||||
return new PiercingExhale(this);
|
||||
}
|
||||
}
|
||||
36
Mage.Sets/src/mage/cards/r/RebelliousStrike.java
Normal file
36
Mage.Sets/src/mage/cards/r/RebelliousStrike.java
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
package mage.cards.r;
|
||||
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class RebelliousStrike extends CardImpl {
|
||||
|
||||
public RebelliousStrike(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}");
|
||||
|
||||
// Target creature gets +3/+0 until end of turn.
|
||||
this.getSpellAbility().addEffect(new BoostTargetEffect(3, 0));
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
|
||||
// Draw a card.
|
||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
|
||||
}
|
||||
|
||||
private RebelliousStrike(final RebelliousStrike card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RebelliousStrike copy() {
|
||||
return new RebelliousStrike(this);
|
||||
}
|
||||
}
|
||||
36
Mage.Sets/src/mage/cards/r/RoamersRoutine.java
Normal file
36
Mage.Sets/src/mage/cards/r/RoamersRoutine.java
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
package mage.cards.r;
|
||||
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
|
||||
import mage.abilities.keyword.HarmonizeAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class RoamersRoutine extends CardImpl {
|
||||
|
||||
public RoamersRoutine(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}");
|
||||
|
||||
// Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.
|
||||
this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true));
|
||||
|
||||
// Harmonize {4}{G}
|
||||
this.addAbility(new HarmonizeAbility(this, "{4}{G}"));
|
||||
}
|
||||
|
||||
private RoamersRoutine(final RoamersRoutine card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RoamersRoutine copy() {
|
||||
return new RoamersRoutine(this);
|
||||
}
|
||||
}
|
||||
84
Mage.Sets/src/mage/cards/r/RoarOfEndlessSong.java
Normal file
84
Mage.Sets/src/mage/cards/r/RoarOfEndlessSong.java
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
package mage.cards.r;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SagaAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SagaChapter;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.token.Elephant55Token;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class RoarOfEndlessSong extends CardImpl {
|
||||
|
||||
public RoarOfEndlessSong(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}{U}{R}");
|
||||
|
||||
this.subtype.add(SubType.SAGA);
|
||||
|
||||
// (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)
|
||||
SagaAbility sagaAbility = new SagaAbility(this);
|
||||
|
||||
// I, II -- Create a 5/5 green Elephant creature token.
|
||||
sagaAbility.addChapterEffect(
|
||||
this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
|
||||
new CreateTokenEffect(new Elephant55Token()));
|
||||
|
||||
// III -- Double the power and toughness of each creature you control until end of turn.
|
||||
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new RoarOfEndlessSongEffect());
|
||||
this.addAbility(sagaAbility);
|
||||
}
|
||||
|
||||
private RoarOfEndlessSong(final RoarOfEndlessSong card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RoarOfEndlessSong copy() {
|
||||
return new RoarOfEndlessSong(this);
|
||||
}
|
||||
}
|
||||
|
||||
class RoarOfEndlessSongEffect extends OneShotEffect {
|
||||
|
||||
RoarOfEndlessSongEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "double the power and toughness of each creature you control until end of turn";
|
||||
}
|
||||
|
||||
private RoarOfEndlessSongEffect(final RoarOfEndlessSongEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RoarOfEndlessSongEffect copy() {
|
||||
return new RoarOfEndlessSongEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(
|
||||
StaticFilters.FILTER_CONTROLLED_CREATURE,
|
||||
source.getControllerId(), source, game
|
||||
)) {
|
||||
game.addEffect(new BoostTargetEffect(
|
||||
permanent.getPower().getValue(),
|
||||
permanent.getToughness().getValue()
|
||||
).setTargetPointer(new FixedTarget(permanent, game)), source);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
47
Mage.Sets/src/mage/cards/s/SaltRoadPackbeast.java
Normal file
47
Mage.Sets/src/mage/cards/s/SaltRoadPackbeast.java
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
package mage.cards.s;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.dynamicvalue.common.CreaturesYouControlCount;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.cost.SpellCostReductionForEachSourceEffect;
|
||||
import mage.abilities.hint.common.CreaturesYouControlHint;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class SaltRoadPackbeast extends CardImpl {
|
||||
|
||||
public SaltRoadPackbeast(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{W}");
|
||||
|
||||
this.subtype.add(SubType.BEAST);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// This spell costs {1} less to cast for each creature you control.
|
||||
this.addAbility(new SimpleStaticAbility(
|
||||
Zone.ALL, new SpellCostReductionForEachSourceEffect(1, CreaturesYouControlCount.instance)
|
||||
).addHint(CreaturesYouControlHint.instance));
|
||||
|
||||
// When this creature enters, draw a card.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)));
|
||||
}
|
||||
|
||||
private SaltRoadPackbeast(final SaltRoadPackbeast card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SaltRoadPackbeast copy() {
|
||||
return new SaltRoadPackbeast(this);
|
||||
}
|
||||
}
|
||||
38
Mage.Sets/src/mage/cards/s/SeizeOpportunity.java
Normal file
38
Mage.Sets/src/mage/cards/s/SeizeOpportunity.java
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
package mage.cards.s;
|
||||
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class SeizeOpportunity extends CardImpl {
|
||||
|
||||
public SeizeOpportunity(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}");
|
||||
|
||||
// Choose one --
|
||||
// * Exile the top two cards of your library. Until the end of your next turn, you may play those cards.
|
||||
this.getSpellAbility().addEffect(new ExileTopXMayPlayUntilEffect(2, Duration.UntilEndOfYourNextTurn));
|
||||
|
||||
// * Up to two target creatures each get +2/+1 until end of turn.
|
||||
this.getSpellAbility().addMode(new Mode(new BoostTargetEffect(2, 1)).addTarget(new TargetCreaturePermanent(0, 2)));
|
||||
}
|
||||
|
||||
private SeizeOpportunity(final SeizeOpportunity card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SeizeOpportunity copy() {
|
||||
return new SeizeOpportunity(this);
|
||||
}
|
||||
}
|
||||
49
Mage.Sets/src/mage/cards/s/ShockingSharpshooter.java
Normal file
49
Mage.Sets/src/mage/cards/s/ShockingSharpshooter.java
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
package mage.cards.s;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.keyword.ReachAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.target.common.TargetOpponent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class ShockingSharpshooter extends CardImpl {
|
||||
|
||||
public ShockingSharpshooter(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.ARCHER);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// Reach
|
||||
this.addAbility(ReachAbility.getInstance());
|
||||
|
||||
// Whenever another creature you control enters, this creature deals 1 damage to target opponent.
|
||||
Ability ability = new EntersBattlefieldAllTriggeredAbility(
|
||||
new DamageTargetEffect(1), StaticFilters.FILTER_ANOTHER_CREATURE_YOU_CONTROL
|
||||
);
|
||||
ability.addTarget(new TargetOpponent());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private ShockingSharpshooter(final ShockingSharpshooter card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ShockingSharpshooter copy() {
|
||||
return new ShockingSharpshooter(this);
|
||||
}
|
||||
}
|
||||
46
Mage.Sets/src/mage/cards/s/SinkholeSurveyor.java
Normal file
46
Mage.Sets/src/mage/cards/s/SinkholeSurveyor.java
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
package mage.cards.s;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.AttacksTriggeredAbility;
|
||||
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
|
||||
import mage.abilities.effects.keyword.EndureSourceEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class SinkholeSurveyor extends CardImpl {
|
||||
|
||||
public SinkholeSurveyor(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
|
||||
|
||||
this.subtype.add(SubType.BIRD);
|
||||
this.subtype.add(SubType.SCOUT);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Whenever this creature attacks, you lose 1 life and this creature endures 1.
|
||||
Ability ability = new AttacksTriggeredAbility(new LoseLifeSourceControllerEffect(1));
|
||||
ability.addEffect(new EndureSourceEffect(1, "{this}").concatBy("and"));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private SinkholeSurveyor(final SinkholeSurveyor card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SinkholeSurveyor copy() {
|
||||
return new SinkholeSurveyor(this);
|
||||
}
|
||||
}
|
||||
56
Mage.Sets/src/mage/cards/s/SpectralDenial.java
Normal file
56
Mage.Sets/src/mage/cards/s/SpectralDenial.java
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
package mage.cards.s;
|
||||
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.dynamicvalue.DynamicValue;
|
||||
import mage.abilities.dynamicvalue.common.GetXValue;
|
||||
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
||||
import mage.abilities.effects.common.CounterUnlessPaysEffect;
|
||||
import mage.abilities.effects.common.cost.SpellCostReductionForEachSourceEffect;
|
||||
import mage.abilities.hint.Hint;
|
||||
import mage.abilities.hint.ValueHint;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.ComparisonType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.predicate.mageobject.PowerPredicate;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class SpectralDenial extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterControlledCreaturePermanent("creature you control with power 4 or greater");
|
||||
|
||||
static {
|
||||
filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 3));
|
||||
}
|
||||
|
||||
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter, 1);
|
||||
private static final Hint hint = new ValueHint("Creatures you control with power 4 or greater", xValue);
|
||||
|
||||
public SpectralDenial(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}");
|
||||
|
||||
// This spell costs {1} less to cast for each creature you control with power 4 or greater.
|
||||
this.addAbility(new SimpleStaticAbility(
|
||||
Zone.ALL, new SpellCostReductionForEachSourceEffect(1, xValue)
|
||||
).addHint(hint));
|
||||
|
||||
// Counter target spell unless its controller pays {X}.
|
||||
this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(GetXValue.instance));
|
||||
}
|
||||
|
||||
private SpectralDenial(final SpectralDenial card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SpectralDenial copy() {
|
||||
return new SpectralDenial(this);
|
||||
}
|
||||
}
|
||||
47
Mage.Sets/src/mage/cards/s/SultaiDevotee.java
Normal file
47
Mage.Sets/src/mage/cards/s/SultaiDevotee.java
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
package mage.cards.s;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.effects.mana.AddManaFromColorChoicesEffect;
|
||||
import mage.abilities.keyword.DeathtouchAbility;
|
||||
import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.ManaType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class SultaiDevotee extends CardImpl {
|
||||
|
||||
public SultaiDevotee(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
|
||||
|
||||
this.subtype.add(SubType.ZOMBIE);
|
||||
this.subtype.add(SubType.SNAKE);
|
||||
this.subtype.add(SubType.DRUID);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(1);
|
||||
|
||||
// Deathtouch
|
||||
this.addAbility(DeathtouchAbility.getInstance());
|
||||
|
||||
// {1}: Add {B}, {G}, or {U}. Activate only once each turn.
|
||||
this.addAbility(new LimitedTimesPerTurnActivatedManaAbility(
|
||||
new AddManaFromColorChoicesEffect(ManaType.BLACK, ManaType.GREEN, ManaType.BLUE), new GenericManaCost(1)
|
||||
));
|
||||
}
|
||||
|
||||
private SultaiDevotee(final SultaiDevotee card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SultaiDevotee copy() {
|
||||
return new SultaiDevotee(this);
|
||||
}
|
||||
}
|
||||
64
Mage.Sets/src/mage/cards/s/SultaiMonument.java
Normal file
64
Mage.Sets/src/mage/cards/s/SultaiMonument.java
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
package mage.cards.s;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.permanent.token.ZombieDruidToken;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class SultaiMonument extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("a basic Swamp, Forest, or Island card");
|
||||
|
||||
static {
|
||||
filter.add(SuperType.BASIC.getPredicate());
|
||||
filter.add(Predicates.or(
|
||||
SubType.SWAMP.getPredicate(),
|
||||
SubType.FOREST.getPredicate(),
|
||||
SubType.ISLAND.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
public SultaiMonument(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
|
||||
|
||||
// When this artifact enters, search your library for a basic Swamp, Forest, or Island card, reveal it, put it into your hand, then shuffle.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(
|
||||
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true)
|
||||
));
|
||||
|
||||
// {2}{B}{G}{U}, {T}, Sacrifice this artifact: Create two 2/2 black Zombie Druid creature tokens. Activate only as a sorcery.
|
||||
Ability ability = new ActivateAsSorceryActivatedAbility(
|
||||
new CreateTokenEffect(new ZombieDruidToken(), 2), new ManaCostsImpl<>("{2}{B}{G}{U}")
|
||||
);
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.addCost(new SacrificeSourceCost());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private SultaiMonument(final SultaiMonument card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SultaiMonument copy() {
|
||||
return new SultaiMonument(this);
|
||||
}
|
||||
}
|
||||
63
Mage.Sets/src/mage/cards/s/SunsetStrikemaster.java
Normal file
63
Mage.Sets/src/mage/cards/s/SunsetStrikemaster.java
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
package mage.cards.s;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.mana.RedManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.mageobject.AbilityPredicate;
|
||||
import mage.target.TargetPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class SunsetStrikemaster extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterCreaturePermanent("creature with flying");
|
||||
|
||||
static {
|
||||
filter.add(new AbilityPredicate(FlyingAbility.class));
|
||||
}
|
||||
|
||||
public SunsetStrikemaster(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.MONK);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(1);
|
||||
|
||||
// {T}: Add {R}.
|
||||
this.addAbility(new RedManaAbility());
|
||||
|
||||
// {2}{R}, {T}, Sacrifice this creature: It deals 6 damage to target creature with flying.
|
||||
Ability ability = new SimpleActivatedAbility(
|
||||
new DamageTargetEffect(6, "it"), new ManaCostsImpl<>("{2}{R}")
|
||||
);
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.addCost(new SacrificeSourceCost());
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private SunsetStrikemaster(final SunsetStrikemaster card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SunsetStrikemaster copy() {
|
||||
return new SunsetStrikemaster(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,15 +1,9 @@
|
|||
|
||||
|
||||
package mage.cards.s;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
||||
import mage.abilities.keyword.EquipAbility;
|
||||
|
|
@ -18,29 +12,28 @@ import mage.cards.CardImpl;
|
|||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.AttachmentType;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Zone;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.token.DragonTokenGold;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetControlledCreaturePermanent;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* This creates a "gold" token which is represented as a creature with all colors
|
||||
* as the color gold is not supported in the black-bordered game rules
|
||||
*
|
||||
* @author Saga
|
||||
*/
|
||||
public final class SwordOfDungeonsAndDragons extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("Rogues and from Clerics");
|
||||
static {filter.add(Predicates.or(
|
||||
|
||||
static {
|
||||
filter.add(Predicates.or(
|
||||
SubType.ROGUE.getPredicate(),
|
||||
SubType.CLERIC.getPredicate()
|
||||
));
|
||||
|
|
@ -52,16 +45,18 @@ public final class SwordOfDungeonsAndDragons extends CardImpl {
|
|||
|
||||
// Equipped creature gets +2/+2 and has protection from Rogues and from Clerics.
|
||||
Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(2, 2));
|
||||
Effect effect = new GainAbilityAttachedEffect(new ProtectionAbility(filter), AttachmentType.EQUIPMENT);
|
||||
effect.setText("and has protection from Rogues and from Clerics");
|
||||
ability.addEffect(effect);
|
||||
ability.addEffect(new GainAbilityAttachedEffect(
|
||||
new ProtectionAbility(filter), AttachmentType.EQUIPMENT
|
||||
).setText("and has protection from Rogues and from Clerics"));
|
||||
this.addAbility(ability);
|
||||
|
||||
// Whenever equipped creature deals combat damage to a player, you create a 4/4 gold Dragon creature token with flying and roll a d20. If you roll a 20, repeat this process.
|
||||
this.addAbility(new SwordOfDungeonsAndDragonsAbility());
|
||||
this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(
|
||||
new SwordOfDungeonsAndDragonsEffect(), "equipped creature", false
|
||||
));
|
||||
|
||||
// Equip {2}
|
||||
this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(2), new TargetControlledCreaturePermanent(), false));
|
||||
this.addAbility(new EquipAbility(2));
|
||||
}
|
||||
|
||||
private SwordOfDungeonsAndDragons(final SwordOfDungeonsAndDragons card) {
|
||||
|
|
@ -74,49 +69,12 @@ public final class SwordOfDungeonsAndDragons extends CardImpl {
|
|||
}
|
||||
}
|
||||
|
||||
class SwordOfDungeonsAndDragonsAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public SwordOfDungeonsAndDragonsAbility() {
|
||||
super(Zone.BATTLEFIELD, new SwordOfDungeonsAndDragonsEffect(),false);
|
||||
}
|
||||
|
||||
private SwordOfDungeonsAndDragonsAbility(final SwordOfDungeonsAndDragonsAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SwordOfDungeonsAndDragonsAbility copy() {
|
||||
return new SwordOfDungeonsAndDragonsAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
DamagedPlayerEvent damageEvent = (DamagedPlayerEvent)event;
|
||||
Permanent p = game.getPermanent(event.getSourceId());
|
||||
if (damageEvent.isCombatDamage() && p != null && p.getAttachments().contains(this.getSourceId())) {
|
||||
for (Effect effect : this.getEffects()) {
|
||||
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever equipped creature deals combat damage to a player, you create a 4/4 gold Dragon creature token with flying and roll a d20. If you roll a 20, repeat this process.";
|
||||
}
|
||||
}
|
||||
|
||||
class SwordOfDungeonsAndDragonsEffect extends OneShotEffect {
|
||||
|
||||
public SwordOfDungeonsAndDragonsEffect() {
|
||||
SwordOfDungeonsAndDragonsEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "you create a 4/4 gold Dragon creature token with flying " +
|
||||
"and roll a d20. If you roll a 20, repeat this process";
|
||||
}
|
||||
|
||||
private SwordOfDungeonsAndDragonsEffect(final SwordOfDungeonsAndDragonsEffect effect) {
|
||||
|
|
@ -131,16 +89,15 @@ class SwordOfDungeonsAndDragonsEffect extends OneShotEffect {
|
|||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (controller != null) {
|
||||
int count = 1;
|
||||
int amount = controller.rollDice(outcome, source, game, 20);
|
||||
|
||||
while (amount == 20) {
|
||||
count += 1;
|
||||
amount = controller.rollDice(outcome, source, game, 20);
|
||||
}
|
||||
return new CreateTokenEffect(new DragonTokenGold(), count).apply(game, source);
|
||||
}
|
||||
if (controller == null) {
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < 1000; i++) { // just in case loop goes too long
|
||||
new DragonTokenGold().putOntoBattlefield(1, game, source);
|
||||
if (controller.rollDice(outcome, source, game, 20) != 20) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
46
Mage.Sets/src/mage/cards/t/TemurDevotee.java
Normal file
46
Mage.Sets/src/mage/cards/t/TemurDevotee.java
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
package mage.cards.t;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.effects.mana.AddManaFromColorChoicesEffect;
|
||||
import mage.abilities.keyword.DefenderAbility;
|
||||
import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.ManaType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class TemurDevotee extends CardImpl {
|
||||
|
||||
public TemurDevotee(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.DRUID);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// Defender
|
||||
this.addAbility(DefenderAbility.getInstance());
|
||||
|
||||
// {1}: Add {G}, {U}, or {R}. Activate only once each turn.
|
||||
this.addAbility(new LimitedTimesPerTurnActivatedManaAbility(
|
||||
new AddManaFromColorChoicesEffect(ManaType.GREEN, ManaType.BLUE, ManaType.RED), new GenericManaCost(1)
|
||||
));
|
||||
}
|
||||
|
||||
private TemurDevotee(final TemurDevotee card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TemurDevotee copy() {
|
||||
return new TemurDevotee(this);
|
||||
}
|
||||
}
|
||||
64
Mage.Sets/src/mage/cards/t/TemurMonument.java
Normal file
64
Mage.Sets/src/mage/cards/t/TemurMonument.java
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
package mage.cards.t;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.permanent.token.Elephant55Token;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class TemurMonument extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("a basic Forest, Island, or Mountain card");
|
||||
|
||||
static {
|
||||
filter.add(SuperType.BASIC.getPredicate());
|
||||
filter.add(Predicates.or(
|
||||
SubType.FOREST.getPredicate(),
|
||||
SubType.ISLAND.getPredicate(),
|
||||
SubType.MOUNTAIN.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
public TemurMonument(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
|
||||
|
||||
// When this artifact enters, search your library for a basic Forest, Island, or Mountain card, reveal it, put it into your hand, then shuffle.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(
|
||||
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true)
|
||||
));
|
||||
|
||||
// {3}{G}{U}{R}, {T}, Sacrifice this artifact: Create a 5/5 green Elephant creature token. Activate only as a sorcery.
|
||||
Ability ability = new ActivateAsSorceryActivatedAbility(
|
||||
new CreateTokenEffect(new Elephant55Token(), 2), new ManaCostsImpl<>("{3}{G}{U}{R}")
|
||||
);
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.addCost(new SacrificeSourceCost());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private TemurMonument(final TemurMonument card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TemurMonument copy() {
|
||||
return new TemurMonument(this);
|
||||
}
|
||||
}
|
||||
37
Mage.Sets/src/mage/cards/t/TemurTawnyback.java
Normal file
37
Mage.Sets/src/mage/cards/t/TemurTawnyback.java
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
package mage.cards.t;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.effects.common.DrawDiscardControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class TemurTawnyback extends CardImpl {
|
||||
|
||||
public TemurTawnyback(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2/G}{2/U}{2/R}");
|
||||
|
||||
this.subtype.add(SubType.BEAST);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// When this creature enters, draw a card, then discard a card.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawDiscardControllerEffect(1, 1)));
|
||||
}
|
||||
|
||||
private TemurTawnyback(final TemurTawnyback card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TemurTawnyback copy() {
|
||||
return new TemurTawnyback(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -2,14 +2,13 @@ package mage.cards.t;
|
|||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.CardsLeaveGraveyardTriggeredAbility;
|
||||
import mage.abilities.condition.common.MyTurnCondition;
|
||||
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
|
||||
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.target.common.TargetControlledCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
|
@ -19,16 +18,21 @@ import java.util.UUID;
|
|||
*/
|
||||
public final class ThranVigil extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("artifact and/or creature cards");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.or(
|
||||
CardType.ARTIFACT.getPredicate(),
|
||||
CardType.CREATURE.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
public ThranVigil(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
|
||||
|
||||
// Whenever one or more artifact and/or creature cards leave your graveyard during your turn, put a +1/+1 counter on target creature you control.
|
||||
Ability ability = new ConditionalInterveningIfTriggeredAbility(
|
||||
new CardsLeaveGraveyardTriggeredAbility(
|
||||
new AddCountersTargetEffect(CounterType.P1P1.createInstance()),
|
||||
StaticFilters.FILTER_CARD_ARTIFACT_OR_CREATURE
|
||||
), MyTurnCondition.instance, "Whenever one or more artifact and/or creature cards " +
|
||||
"leave your graveyard during your turn, put a +1/+1 counter on target creature you control."
|
||||
Ability ability = new CardsLeaveGraveyardTriggeredAbility(
|
||||
new AddCountersTargetEffect(CounterType.P1P1.createInstance()), filter, true
|
||||
);
|
||||
ability.addTarget(new TargetControlledCreaturePermanent());
|
||||
this.addAbility(ability);
|
||||
|
|
|
|||
126
Mage.Sets/src/mage/cards/u/UginEyeOfTheStorms.java
Normal file
126
Mage.Sets/src/mage/cards/u/UginEyeOfTheStorms.java
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
package mage.cards.u;
|
||||
|
||||
import mage.Mana;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.LoyaltyAbility;
|
||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.CastSourceTriggeredAbility;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.ExileTargetEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect;
|
||||
import mage.abilities.effects.mana.BasicManaEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.Cards;
|
||||
import mage.cards.CardsImpl;
|
||||
import mage.constants.*;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.FilterSpell;
|
||||
import mage.filter.common.FilterNonlandCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.mageobject.ColorlessPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class UginEyeOfTheStorms extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent("permanent that's one or more colors");
|
||||
private static final FilterSpell filter2 = new FilterSpell("a colorless spell");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.not(ColorlessPredicate.instance));
|
||||
filter2.add(ColorlessPredicate.instance);
|
||||
}
|
||||
|
||||
public UginEyeOfTheStorms(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{7}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.UGIN);
|
||||
this.setStartingLoyalty(7);
|
||||
|
||||
// When you cast this spell, exile up to one target permanent that's one or more colors.
|
||||
Ability ability = new CastSourceTriggeredAbility(new ExileTargetEffect());
|
||||
ability.addTarget(new TargetPermanent(0, 1, filter));
|
||||
this.addAbility(ability);
|
||||
|
||||
// Whenever you cast a colorless spell, exile up to one target permanent that's one or more colors.
|
||||
ability = new SpellCastControllerTriggeredAbility(new ExileTargetEffect(), filter2, false);
|
||||
ability.addTarget(new TargetPermanent(0, 1, filter));
|
||||
this.addAbility(ability);
|
||||
|
||||
// +2: You gain 3 life and draw a card.
|
||||
ability = new LoyaltyAbility(new GainLifeEffect(3), 2);
|
||||
ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and"));
|
||||
this.addAbility(ability);
|
||||
|
||||
// 0: Add {C}{C}{C}.
|
||||
this.addAbility(new LoyaltyAbility(new BasicManaEffect(Mana.ColorlessMana(3)), 0));
|
||||
|
||||
// -11: Search your library for any number of colorless nonland cards, exile them, then shuffle. Until end of turn, you may cast those cards without paying their mana costs.
|
||||
this.addAbility(new LoyaltyAbility(new UginEyeOfTheStormsEffect(), -11));
|
||||
}
|
||||
|
||||
private UginEyeOfTheStorms(final UginEyeOfTheStorms card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UginEyeOfTheStorms copy() {
|
||||
return new UginEyeOfTheStorms(this);
|
||||
}
|
||||
}
|
||||
|
||||
class UginEyeOfTheStormsEffect extends OneShotEffect {
|
||||
|
||||
private static final FilterCard filter = new FilterNonlandCard("colorless nonland cards");
|
||||
|
||||
static {
|
||||
filter.add(ColorlessPredicate.instance);
|
||||
}
|
||||
|
||||
UginEyeOfTheStormsEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "search your library for any number of colorless nonland cards, exile them, then shuffle. " +
|
||||
"Until end of turn, you may cast those cards without paying their mana costs";
|
||||
}
|
||||
|
||||
private UginEyeOfTheStormsEffect(final UginEyeOfTheStormsEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UginEyeOfTheStormsEffect copy() {
|
||||
return new UginEyeOfTheStormsEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
if (player == null) {
|
||||
return false;
|
||||
}
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(0, Integer.MAX_VALUE, filter);
|
||||
player.searchLibrary(target, source, game);
|
||||
Cards cards = new CardsImpl(target.getTargets());
|
||||
cards.retainZone(Zone.LIBRARY, game);
|
||||
if (!cards.isEmpty()) {
|
||||
PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile(
|
||||
game, source, cards.getCards(game), TargetController.YOU,
|
||||
Duration.EndOfTurn, true, false, true
|
||||
);
|
||||
}
|
||||
player.shuffleLibrary(source, game);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
60
Mage.Sets/src/mage/cards/u/UnderfootUnderdogs.java
Normal file
60
Mage.Sets/src/mage/cards/u/UnderfootUnderdogs.java
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
package mage.cards.u;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.ComparisonType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.predicate.mageobject.PowerPredicate;
|
||||
import mage.game.permanent.token.GoblinToken;
|
||||
import mage.target.TargetPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class UnderfootUnderdogs extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter
|
||||
= new FilterControlledCreaturePermanent("creature you control with power 2 or less");
|
||||
|
||||
static {
|
||||
filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3));
|
||||
}
|
||||
|
||||
public UnderfootUnderdogs(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
|
||||
|
||||
this.subtype.add(SubType.GOBLIN);
|
||||
this.subtype.add(SubType.WARRIOR);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
// When this creature enters, create a 1/1 red Goblin creature token.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new GoblinToken())));
|
||||
|
||||
// {1}, {T}: Target creature you control with power 2 or less can't be blocked this turn.
|
||||
Ability ability = new SimpleActivatedAbility(new CantBeBlockedTargetEffect(), new GenericManaCost(1));
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private UnderfootUnderdogs(final UnderfootUnderdogs card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UnderfootUnderdogs copy() {
|
||||
return new UnderfootUnderdogs(this);
|
||||
}
|
||||
}
|
||||
34
Mage.Sets/src/mage/cards/u/UnendingWhisper.java
Normal file
34
Mage.Sets/src/mage/cards/u/UnendingWhisper.java
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
package mage.cards.u;
|
||||
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.keyword.HarmonizeAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class UnendingWhisper extends CardImpl {
|
||||
|
||||
public UnendingWhisper(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{U}");
|
||||
|
||||
// Draw a card.
|
||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
|
||||
|
||||
// Harmonize {5}{U}
|
||||
this.addAbility(new HarmonizeAbility(this, "{5}{U}"));
|
||||
}
|
||||
|
||||
private UnendingWhisper(final UnendingWhisper card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UnendingWhisper copy() {
|
||||
return new UnendingWhisper(this);
|
||||
}
|
||||
}
|
||||
47
Mage.Sets/src/mage/cards/u/UnitedBattlefront.java
Normal file
47
Mage.Sets/src/mage/cards/u/UnitedBattlefront.java
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
package mage.cards.u;
|
||||
|
||||
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.ComparisonType;
|
||||
import mage.constants.PutCards;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
||||
import mage.filter.predicate.mageobject.PermanentPredicate;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class UnitedBattlefront extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("noncreature, nonland permanent cards with mana value 3 or less");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
|
||||
filter.add(Predicates.not(CardType.LAND.getPredicate()));
|
||||
filter.add(PermanentPredicate.instance);
|
||||
filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4));
|
||||
}
|
||||
|
||||
public UnitedBattlefront(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{W}");
|
||||
|
||||
// Look at the top seven cards of your library. Put up to two noncreature, nonland permanent cards with mana value 3 or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.
|
||||
this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect(
|
||||
7, 1, filter, PutCards.BATTLEFIELD, PutCards.BOTTOM_RANDOM
|
||||
));
|
||||
}
|
||||
|
||||
private UnitedBattlefront(final UnitedBattlefront card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UnitedBattlefront copy() {
|
||||
return new UnitedBattlefront(this);
|
||||
}
|
||||
}
|
||||
52
Mage.Sets/src/mage/cards/u/UnsparingBoltcaster.java
Normal file
52
Mage.Sets/src/mage/cards/u/UnsparingBoltcaster.java
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
package mage.cards.u;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterOpponentsCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.WasDealtDamageThisTurnPredicate;
|
||||
import mage.target.TargetPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class UnsparingBoltcaster extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter
|
||||
= new FilterOpponentsCreaturePermanent("creature an opponent controls that was dealt damage this turn");
|
||||
|
||||
static {
|
||||
filter.add(WasDealtDamageThisTurnPredicate.instance);
|
||||
}
|
||||
|
||||
public UnsparingBoltcaster(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
|
||||
|
||||
this.subtype.add(SubType.OGRE);
|
||||
this.subtype.add(SubType.WIZARD);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// When this creature enters, it deals 5 damage to target creature an opponent controls that was dealt damage this turn.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(5));
|
||||
ability.addTarget(new TargetPermanent(filter));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private UnsparingBoltcaster(final UnsparingBoltcaster card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UnsparingBoltcaster copy() {
|
||||
return new UnsparingBoltcaster(this);
|
||||
}
|
||||
}
|
||||
36
Mage.Sets/src/mage/cards/u/UrenisRebuff.java
Normal file
36
Mage.Sets/src/mage/cards/u/UrenisRebuff.java
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
package mage.cards.u;
|
||||
|
||||
import mage.abilities.effects.common.ReturnToHandTargetEffect;
|
||||
import mage.abilities.keyword.HarmonizeAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class UrenisRebuff extends CardImpl {
|
||||
|
||||
public UrenisRebuff(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}");
|
||||
|
||||
// Return target creature to its owner's hand.
|
||||
this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
|
||||
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
|
||||
|
||||
// Harmonize {5}{U}
|
||||
this.addAbility(new HarmonizeAbility(this, "{5}{U}"));
|
||||
}
|
||||
|
||||
private UrenisRebuff(final UrenisRebuff card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UrenisRebuff copy() {
|
||||
return new UrenisRebuff(this);
|
||||
}
|
||||
}
|
||||
59
Mage.Sets/src/mage/cards/w/WingspanStride.java
Normal file
59
Mage.Sets/src/mage/cards/w/WingspanStride.java
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
package mage.cards.w;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.AttachEffect;
|
||||
import mage.abilities.effects.common.ReturnToHandSourceEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
||||
import mage.abilities.keyword.EnchantAbility;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.AttachmentType;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class WingspanStride extends CardImpl {
|
||||
|
||||
public WingspanStride(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}");
|
||||
|
||||
this.subtype.add(SubType.AURA);
|
||||
|
||||
// Enchant creature
|
||||
TargetPermanent auraTarget = new TargetCreaturePermanent();
|
||||
this.getSpellAbility().addTarget(auraTarget);
|
||||
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
|
||||
this.addAbility(new EnchantAbility(auraTarget));
|
||||
|
||||
// Enchanted creature gets +1/+1 and has flying.
|
||||
Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect(1, 1));
|
||||
ability.addEffect(new GainAbilityAttachedEffect(
|
||||
FlyingAbility.getInstance(), AttachmentType.AURA
|
||||
).setText("and has flying"));
|
||||
this.addAbility(ability);
|
||||
|
||||
// {2}{U}: Return this Aura to its owner's hand.
|
||||
this.addAbility(new SimpleActivatedAbility(new ReturnToHandSourceEffect(), new ManaCostsImpl<>("{2}{U}")));
|
||||
}
|
||||
|
||||
private WingspanStride(final WingspanStride card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WingspanStride copy() {
|
||||
return new WingspanStride(this);
|
||||
}
|
||||
}
|
||||
43
Mage.Sets/src/mage/cards/w/WinternightStories.java
Normal file
43
Mage.Sets/src/mage/cards/w/WinternightStories.java
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
package mage.cards.w;
|
||||
|
||||
import mage.abilities.costs.common.DiscardCardCost;
|
||||
import mage.abilities.effects.common.DoIfCostPaid;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.discard.DiscardControllerEffect;
|
||||
import mage.abilities.keyword.HarmonizeAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class WinternightStories extends CardImpl {
|
||||
|
||||
public WinternightStories(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}");
|
||||
|
||||
// Draw three cards. Then discard two cards unless you discard a creature card.
|
||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(3));
|
||||
this.getSpellAbility().addEffect(new DoIfCostPaid(
|
||||
null, new DiscardControllerEffect(2),
|
||||
new DiscardCardCost(StaticFilters.FILTER_CARD_CREATURE)
|
||||
.setText("discard a creature card instead of discarding two cards")
|
||||
).setText("Then discard two cards unless you discard a creature card"));
|
||||
|
||||
// Harmonize {4}{U}
|
||||
this.addAbility(new HarmonizeAbility(this, "{4}{U}"));
|
||||
}
|
||||
|
||||
private WinternightStories(final WinternightStories card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WinternightStories copy() {
|
||||
return new WinternightStories(this);
|
||||
}
|
||||
}
|
||||
37
Mage.Sets/src/mage/cards/w/WorthyCost.java
Normal file
37
Mage.Sets/src/mage/cards/w/WorthyCost.java
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
package mage.cards.w;
|
||||
|
||||
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||
import mage.abilities.effects.common.ExileTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.target.common.TargetCreatureOrPlaneswalker;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class WorthyCost extends CardImpl {
|
||||
|
||||
public WorthyCost(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}");
|
||||
|
||||
// As an additional cost to cast this spell, sacrifice a creature.
|
||||
this.getSpellAbility().addCost(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_CREATURE));
|
||||
|
||||
// Exile target creature or planeswalker.
|
||||
this.getSpellAbility().addEffect(new ExileTargetEffect());
|
||||
this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker());
|
||||
}
|
||||
|
||||
private WorthyCost(final WorthyCost card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WorthyCost copy() {
|
||||
return new WorthyCost(this);
|
||||
}
|
||||
}
|
||||
60
Mage.Sets/src/mage/cards/y/YathanTombguard.java
Normal file
60
Mage.Sets/src/mage/cards/y/YathanTombguard.java
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
package mage.cards.y;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
|
||||
import mage.abilities.keyword.MenaceAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SetTargetPointer;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.CounterAnyPredicate;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class YathanTombguard extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter
|
||||
= new FilterControlledCreaturePermanent("a creature you control with a counter on it");
|
||||
|
||||
static {
|
||||
filter.add(CounterAnyPredicate.instance);
|
||||
}
|
||||
|
||||
public YathanTombguard(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.WARRIOR);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// Menace
|
||||
this.addAbility(new MenaceAbility());
|
||||
|
||||
// Whenever a creature you control with a counter on it deals combat damage to a player, you draw a card and you lose 1 life.
|
||||
Ability ability = new DealsDamageToAPlayerAllTriggeredAbility(
|
||||
new DrawCardSourceControllerEffect(1, true),
|
||||
filter, false, SetTargetPointer.NONE, true
|
||||
);
|
||||
ability.addEffect(new LoseLifeSourceControllerEffect(1).concatBy("and"));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private YathanTombguard(final YathanTombguard card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public YathanTombguard copy() {
|
||||
return new YathanTombguard(this);
|
||||
}
|
||||
}
|
||||
44
Mage.Sets/src/mage/cards/z/ZurgosVanguard.java
Normal file
44
Mage.Sets/src/mage/cards/z/ZurgosVanguard.java
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
package mage.cards.z;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.dynamicvalue.common.CreaturesYouControlCount;
|
||||
import mage.abilities.effects.common.continuous.SetBasePowerSourceEffect;
|
||||
import mage.abilities.keyword.MobilizeAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class ZurgosVanguard extends CardImpl {
|
||||
|
||||
public ZurgosVanguard(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
|
||||
|
||||
this.subtype.add(SubType.DOG);
|
||||
this.subtype.add(SubType.SOLDIER);
|
||||
this.power = new MageInt(0);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// Mobilize 1
|
||||
this.addAbility(new MobilizeAbility(1));
|
||||
|
||||
// This creature's power is equal to the number of creatures you control.
|
||||
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerSourceEffect(CreaturesYouControlCount.instance)));
|
||||
}
|
||||
|
||||
private ZurgosVanguard(final ZurgosVanguard card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ZurgosVanguard copy() {
|
||||
return new ZurgosVanguard(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -4,11 +4,15 @@ import mage.cards.ExpansionSet;
|
|||
import mage.constants.Rarity;
|
||||
import mage.constants.SetType;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class TarkirDragonstorm extends ExpansionSet {
|
||||
|
||||
private static final List<String> unfinished = Arrays.asList("Channeled Dragonfire", "Glacial Dragonhunt", "Mammoth Bellow", "Nature's Rhythm", "Roamer's Routine", "Songcrafter Mage", "Synchronized Charge", "Unending Whisper", "Ureni's Rebuff", "Winternight Stories");
|
||||
private static final TarkirDragonstorm instance = new TarkirDragonstorm();
|
||||
|
||||
public static TarkirDragonstorm getInstance() {
|
||||
|
|
@ -20,74 +24,156 @@ public final class TarkirDragonstorm extends ExpansionSet {
|
|||
this.blockName = "Tarkir: Dragonstorm"; // for sorting in GUI
|
||||
this.hasBasicLands = true;
|
||||
|
||||
cards.add(new SetCardInfo("Abzan Devotee", 68, Rarity.COMMON, mage.cards.a.AbzanDevotee.class));
|
||||
cards.add(new SetCardInfo("Abzan Monument", 238, Rarity.UNCOMMON, mage.cards.a.AbzanMonument.class));
|
||||
cards.add(new SetCardInfo("Aegis Sculptor", 35, Rarity.UNCOMMON, mage.cards.a.AegisSculptor.class));
|
||||
cards.add(new SetCardInfo("Agent of Kotis", 36, Rarity.COMMON, mage.cards.a.AgentOfKotis.class));
|
||||
cards.add(new SetCardInfo("Alesha's Legacy", 72, Rarity.COMMON, mage.cards.a.AleshasLegacy.class));
|
||||
cards.add(new SetCardInfo("Ambling Stormshell", 37, Rarity.RARE, mage.cards.a.AmblingStormshell.class));
|
||||
cards.add(new SetCardInfo("Anafenza, Unyielding Lineage", 2, Rarity.RARE, mage.cards.a.AnafenzaUnyieldingLineage.class));
|
||||
cards.add(new SetCardInfo("Armament Dragon", 168, Rarity.UNCOMMON, mage.cards.a.ArmamentDragon.class));
|
||||
cards.add(new SetCardInfo("Attuned Hunter", 135, Rarity.UNCOMMON, mage.cards.a.AttunedHunter.class));
|
||||
cards.add(new SetCardInfo("Auroral Procession", 169, Rarity.UNCOMMON, mage.cards.a.AuroralProcession.class));
|
||||
cards.add(new SetCardInfo("Avenger of the Fallen", 73, Rarity.RARE, mage.cards.a.AvengerOfTheFallen.class));
|
||||
cards.add(new SetCardInfo("Awaken the Honored Dead", 170, Rarity.RARE, mage.cards.a.AwakenTheHonoredDead.class));
|
||||
cards.add(new SetCardInfo("Barrensteppe Siege", 171, Rarity.RARE, mage.cards.b.BarrensteppeSiege.class));
|
||||
cards.add(new SetCardInfo("Bearer of Glory", 4, Rarity.COMMON, mage.cards.b.BearerOfGlory.class));
|
||||
cards.add(new SetCardInfo("Bewildering Blizzard", 38, Rarity.UNCOMMON, mage.cards.b.BewilderingBlizzard.class));
|
||||
cards.add(new SetCardInfo("Bloodfell Caves", 250, Rarity.COMMON, mage.cards.b.BloodfellCaves.class));
|
||||
cards.add(new SetCardInfo("Blossoming Sands", 251, Rarity.COMMON, mage.cards.b.BlossomingSands.class));
|
||||
cards.add(new SetCardInfo("Bone-Cairn Butcher", 173, Rarity.UNCOMMON, mage.cards.b.BoneCairnButcher.class));
|
||||
cards.add(new SetCardInfo("Boulderborn Dragon", 239, Rarity.COMMON, mage.cards.b.BoulderbornDragon.class));
|
||||
cards.add(new SetCardInfo("Breaching Dragonstorm", 101, Rarity.UNCOMMON, mage.cards.b.BreachingDragonstorm.class));
|
||||
cards.add(new SetCardInfo("Call the Spirit Dragons", 174, Rarity.MYTHIC, mage.cards.c.CallTheSpiritDragons.class));
|
||||
cards.add(new SetCardInfo("Caustic Exhale", 74, Rarity.COMMON, mage.cards.c.CausticExhale.class));
|
||||
cards.add(new SetCardInfo("Channeled Dragonfire", 102, Rarity.UNCOMMON, mage.cards.c.ChanneledDragonfire.class));
|
||||
cards.add(new SetCardInfo("Coordinated Maneuver", 6, Rarity.COMMON, mage.cards.c.CoordinatedManeuver.class));
|
||||
cards.add(new SetCardInfo("Cori Mountain Monastery", 252, Rarity.RARE, mage.cards.c.CoriMountainMonastery.class));
|
||||
cards.add(new SetCardInfo("Cori Mountain Stalwart", 175, Rarity.UNCOMMON, mage.cards.c.CoriMountainStalwart.class));
|
||||
cards.add(new SetCardInfo("Cori-Steel Cutter", 103, Rarity.RARE, mage.cards.c.CoriSteelCutter.class));
|
||||
cards.add(new SetCardInfo("Corroding Dragonstorm", 75, Rarity.UNCOMMON, mage.cards.c.CorrodingDragonstorm.class));
|
||||
cards.add(new SetCardInfo("Craterhoof Behemoth", 138, Rarity.MYTHIC, mage.cards.c.CraterhoofBehemoth.class));
|
||||
cards.add(new SetCardInfo("Cruel Truths", 76, Rarity.COMMON, mage.cards.c.CruelTruths.class));
|
||||
cards.add(new SetCardInfo("Dalkovan Packbeasts", 7, Rarity.UNCOMMON, mage.cards.d.DalkovanPackbeasts.class));
|
||||
cards.add(new SetCardInfo("Defibrillating Current", 177, Rarity.UNCOMMON, mage.cards.d.DefibrillatingCurrent.class));
|
||||
cards.add(new SetCardInfo("Delta Bloodflies", 77, Rarity.COMMON, mage.cards.d.DeltaBloodflies.class));
|
||||
cards.add(new SetCardInfo("Descendant of Storms", 8, Rarity.UNCOMMON, mage.cards.d.DescendantOfStorms.class));
|
||||
cards.add(new SetCardInfo("Devoted Duelist", 104, Rarity.COMMON, mage.cards.d.DevotedDuelist.class));
|
||||
cards.add(new SetCardInfo("Dismal Backwater", 254, Rarity.COMMON, mage.cards.d.DismalBackwater.class));
|
||||
cards.add(new SetCardInfo("Dispelling Exhale", 41, Rarity.COMMON, mage.cards.d.DispellingExhale.class));
|
||||
cards.add(new SetCardInfo("Dracogenesis", 105, Rarity.MYTHIC, mage.cards.d.Dracogenesis.class));
|
||||
cards.add(new SetCardInfo("Dragon's Prey", 79, Rarity.COMMON, mage.cards.d.DragonsPrey.class));
|
||||
cards.add(new SetCardInfo("Dragonback Assault", 179, Rarity.MYTHIC, mage.cards.d.DragonbackAssault.class));
|
||||
cards.add(new SetCardInfo("Dragonback Lancer", 9, Rarity.COMMON, mage.cards.d.DragonbackLancer.class));
|
||||
cards.add(new SetCardInfo("Dragonbroods' Relic", 140, Rarity.UNCOMMON, mage.cards.d.DragonbroodsRelic.class));
|
||||
cards.add(new SetCardInfo("Dragonologist", 42, Rarity.RARE, mage.cards.d.Dragonologist.class));
|
||||
cards.add(new SetCardInfo("Dragonstorm Forecaster", 43, Rarity.UNCOMMON, mage.cards.d.DragonstormForecaster.class));
|
||||
cards.add(new SetCardInfo("Dragonstorm Globe", 241, Rarity.COMMON, mage.cards.d.DragonstormGlobe.class));
|
||||
cards.add(new SetCardInfo("Dusyut Earthcarver", 141, Rarity.COMMON, mage.cards.d.DusyutEarthcarver.class));
|
||||
cards.add(new SetCardInfo("Duty Beyond Death", 10, Rarity.UNCOMMON, mage.cards.d.DutyBeyondDeath.class));
|
||||
cards.add(new SetCardInfo("Embermouth Sentinel", 242, Rarity.COMMON, mage.cards.e.EmbermouthSentinel.class));
|
||||
cards.add(new SetCardInfo("Encroaching Dragonstorm", 142, Rarity.UNCOMMON, mage.cards.e.EncroachingDragonstorm.class));
|
||||
cards.add(new SetCardInfo("Equilibrium Adept", 106, Rarity.UNCOMMON, mage.cards.e.EquilibriumAdept.class));
|
||||
cards.add(new SetCardInfo("Evolving Wilds", 255, Rarity.COMMON, mage.cards.e.EvolvingWilds.class));
|
||||
cards.add(new SetCardInfo("Fangkeeper's Familiar", 183, Rarity.RARE, mage.cards.f.FangkeepersFamiliar.class));
|
||||
cards.add(new SetCardInfo("Felothar, Dawn of the Abzan", 184, Rarity.RARE, mage.cards.f.FelotharDawnOfTheAbzan.class));
|
||||
cards.add(new SetCardInfo("Forest", 285, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Fortress Kin-Guard", 12, Rarity.COMMON, mage.cards.f.FortressKinGuard.class));
|
||||
cards.add(new SetCardInfo("Fresh Start", 46, Rarity.UNCOMMON, mage.cards.f.FreshStart.class));
|
||||
cards.add(new SetCardInfo("Frontier Bivouac", 256, Rarity.UNCOMMON, mage.cards.f.FrontierBivouac.class));
|
||||
cards.add(new SetCardInfo("Glacial Dragonhunt", 188, Rarity.UNCOMMON, mage.cards.g.GlacialDragonhunt.class));
|
||||
cards.add(new SetCardInfo("Great Arashin City", 257, Rarity.RARE, mage.cards.g.GreatArashinCity.class));
|
||||
cards.add(new SetCardInfo("Gurmag Nightwatch", 190, Rarity.COMMON, mage.cards.g.GurmagNightwatch.class));
|
||||
cards.add(new SetCardInfo("Hardened Tactician", 191, Rarity.UNCOMMON, mage.cards.h.HardenedTactician.class));
|
||||
cards.add(new SetCardInfo("Heritage Reclamation", 145, Rarity.COMMON, mage.cards.h.HeritageReclamation.class));
|
||||
cards.add(new SetCardInfo("Inevitable Defeat", 194, Rarity.RARE, mage.cards.i.InevitableDefeat.class));
|
||||
cards.add(new SetCardInfo("Island", 279, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Jade-Cast Sentinel", 243, Rarity.COMMON, mage.cards.j.JadeCastSentinel.class));
|
||||
cards.add(new SetCardInfo("Jeskai Brushmaster", 195, Rarity.UNCOMMON, mage.cards.j.JeskaiBrushmaster.class));
|
||||
cards.add(new SetCardInfo("Jeskai Devotee", 110, Rarity.COMMON, mage.cards.j.JeskaiDevotee.class));
|
||||
cards.add(new SetCardInfo("Jeskai Monument", 244, Rarity.UNCOMMON, mage.cards.j.JeskaiMonument.class));
|
||||
cards.add(new SetCardInfo("Jeskai Shrinekeeper", 197, Rarity.UNCOMMON, mage.cards.j.JeskaiShrinekeeper.class));
|
||||
cards.add(new SetCardInfo("Jungle Hollow", 258, Rarity.COMMON, mage.cards.j.JungleHollow.class));
|
||||
cards.add(new SetCardInfo("Kheru Goldkeeper", 199, Rarity.UNCOMMON, mage.cards.k.KheruGoldkeeper.class));
|
||||
cards.add(new SetCardInfo("Kin-Tree Severance", 200, Rarity.UNCOMMON, mage.cards.k.KinTreeSeverance.class));
|
||||
cards.add(new SetCardInfo("Kishla Skimmer", 201, Rarity.UNCOMMON, mage.cards.k.KishlaSkimmer.class));
|
||||
cards.add(new SetCardInfo("Kishla Trawlers", 50, Rarity.UNCOMMON, mage.cards.k.KishlaTrawlers.class));
|
||||
cards.add(new SetCardInfo("Kishla Village", 259, Rarity.RARE, mage.cards.k.KishlaVillage.class));
|
||||
cards.add(new SetCardInfo("Krotiq Nestguard", 148, Rarity.COMMON, mage.cards.k.KrotiqNestguard.class));
|
||||
cards.add(new SetCardInfo("Lightfoot Technique", 14, Rarity.COMMON, mage.cards.l.LightfootTechnique.class));
|
||||
cards.add(new SetCardInfo("Loxodon Battle Priest", 15, Rarity.UNCOMMON, mage.cards.l.LoxodonBattlePriest.class));
|
||||
cards.add(new SetCardInfo("Mammoth Bellow", 205, Rarity.UNCOMMON, mage.cards.m.MammothBellow.class));
|
||||
cards.add(new SetCardInfo("Mardu Devotee", 16, Rarity.COMMON, mage.cards.m.MarduDevotee.class));
|
||||
cards.add(new SetCardInfo("Mardu Monument", 245, Rarity.UNCOMMON, mage.cards.m.MarduMonument.class));
|
||||
cards.add(new SetCardInfo("Meticulous Artisan", 112, Rarity.COMMON, mage.cards.m.MeticulousArtisan.class));
|
||||
cards.add(new SetCardInfo("Monastery Messenger", 208, Rarity.COMMON, mage.cards.m.MonasteryMessenger.class));
|
||||
cards.add(new SetCardInfo("Mountain", 283, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Mox Jasper", 246, Rarity.MYTHIC, mage.cards.m.MoxJasper.class));
|
||||
cards.add(new SetCardInfo("Mystic Monastery", 262, Rarity.UNCOMMON, mage.cards.m.MysticMonastery.class));
|
||||
cards.add(new SetCardInfo("Narset's Rebuke", 114, Rarity.COMMON, mage.cards.n.NarsetsRebuke.class));
|
||||
cards.add(new SetCardInfo("Narset, Jeskai Waymaster", 209, Rarity.RARE, mage.cards.n.NarsetJeskaiWaymaster.class));
|
||||
cards.add(new SetCardInfo("Nature's Rhythm", 150, Rarity.RARE, mage.cards.n.NaturesRhythm.class));
|
||||
cards.add(new SetCardInfo("Neriv, Heart of the Storm", 210, Rarity.MYTHIC, mage.cards.n.NerivHeartOfTheStorm.class));
|
||||
cards.add(new SetCardInfo("Nomad Outpost", 263, Rarity.UNCOMMON, mage.cards.n.NomadOutpost.class));
|
||||
cards.add(new SetCardInfo("Opulent Palace", 264, Rarity.UNCOMMON, mage.cards.o.OpulentPalace.class));
|
||||
cards.add(new SetCardInfo("Osseous Exhale", 17, Rarity.COMMON, mage.cards.o.OsseousExhale.class));
|
||||
cards.add(new SetCardInfo("Piercing Exhale", 151, Rarity.COMMON, mage.cards.p.PiercingExhale.class));
|
||||
cards.add(new SetCardInfo("Plains", 277, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Qarsi Revenant", 86, Rarity.RARE, mage.cards.q.QarsiRevenant.class));
|
||||
cards.add(new SetCardInfo("Rakshasa's Bargain", 214, Rarity.UNCOMMON, mage.cards.r.RakshasasBargain.class));
|
||||
cards.add(new SetCardInfo("Rally the Monastery", 19, Rarity.UNCOMMON, mage.cards.r.RallyTheMonastery.class));
|
||||
cards.add(new SetCardInfo("Rebellious Strike", 20, Rarity.COMMON, mage.cards.r.RebelliousStrike.class));
|
||||
cards.add(new SetCardInfo("Reigning Victor", 216, Rarity.COMMON, mage.cards.r.ReigningVictor.class));
|
||||
cards.add(new SetCardInfo("Ringing Strike Mastery", 53, Rarity.COMMON, mage.cards.r.RingingStrikeMastery.class));
|
||||
cards.add(new SetCardInfo("Roamer's Routine", 154, Rarity.COMMON, mage.cards.r.RoamersRoutine.class));
|
||||
cards.add(new SetCardInfo("Roar of Endless Song", 220, Rarity.RARE, mage.cards.r.RoarOfEndlessSong.class));
|
||||
cards.add(new SetCardInfo("Roiling Dragonstorm", 55, Rarity.UNCOMMON, mage.cards.r.RoilingDragonstorm.class));
|
||||
cards.add(new SetCardInfo("Rugged Highlands", 265, Rarity.COMMON, mage.cards.r.RuggedHighlands.class));
|
||||
cards.add(new SetCardInfo("Salt Road Packbeast", 23, Rarity.COMMON, mage.cards.s.SaltRoadPackbeast.class));
|
||||
cards.add(new SetCardInfo("Sandsteppe Citadel", 266, Rarity.UNCOMMON, mage.cards.s.SandsteppeCitadel.class));
|
||||
cards.add(new SetCardInfo("Sarkhan's Resolve", 158, Rarity.COMMON, mage.cards.s.SarkhansResolve.class));
|
||||
cards.add(new SetCardInfo("Scoured Barrens", 267, Rarity.COMMON, mage.cards.s.ScouredBarrens.class));
|
||||
cards.add(new SetCardInfo("Seize Opportunity", 119, Rarity.COMMON, mage.cards.s.SeizeOpportunity.class));
|
||||
cards.add(new SetCardInfo("Shiko, Paragon of the Way", 223, Rarity.MYTHIC, mage.cards.s.ShikoParagonOfTheWay.class));
|
||||
cards.add(new SetCardInfo("Shock Brigade", 120, Rarity.COMMON, mage.cards.s.ShockBrigade.class));
|
||||
cards.add(new SetCardInfo("Shocking Sharpshooter", 121, Rarity.UNCOMMON, mage.cards.s.ShockingSharpshooter.class));
|
||||
cards.add(new SetCardInfo("Sinkhole Surveyor", 93, Rarity.RARE, mage.cards.s.SinkholeSurveyor.class));
|
||||
cards.add(new SetCardInfo("Skirmish Rhino", 224, Rarity.UNCOMMON, mage.cards.s.SkirmishRhino.class));
|
||||
cards.add(new SetCardInfo("Smile at Death", 24, Rarity.MYTHIC, mage.cards.s.SmileAtDeath.class));
|
||||
cards.add(new SetCardInfo("Snakeskin Veil", 159, Rarity.COMMON, mage.cards.s.SnakeskinVeil.class));
|
||||
cards.add(new SetCardInfo("Spectral Denial", 58, Rarity.UNCOMMON, mage.cards.s.SpectralDenial.class));
|
||||
cards.add(new SetCardInfo("Stormplain Detainment", 28, Rarity.COMMON, mage.cards.s.StormplainDetainment.class));
|
||||
cards.add(new SetCardInfo("Stormscale Scion", 123, Rarity.MYTHIC, mage.cards.s.StormscaleScion.class));
|
||||
cards.add(new SetCardInfo("Sultai Devotee", 160, Rarity.COMMON, mage.cards.s.SultaiDevotee.class));
|
||||
cards.add(new SetCardInfo("Sultai Monument", 247, Rarity.UNCOMMON, mage.cards.s.SultaiMonument.class));
|
||||
cards.add(new SetCardInfo("Summit Intimidator", 125, Rarity.COMMON, mage.cards.s.SummitIntimidator.class));
|
||||
cards.add(new SetCardInfo("Sunset Strikemaster", 126, Rarity.UNCOMMON, mage.cards.s.SunsetStrikemaster.class));
|
||||
cards.add(new SetCardInfo("Swamp", 281, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Swiftwater Cliffs", 268, Rarity.COMMON, mage.cards.s.SwiftwaterCliffs.class));
|
||||
cards.add(new SetCardInfo("Tempest Hawk", 31, Rarity.COMMON, mage.cards.t.TempestHawk.class));
|
||||
cards.add(new SetCardInfo("Temur Devotee", 61, Rarity.COMMON, mage.cards.t.TemurDevotee.class));
|
||||
cards.add(new SetCardInfo("Temur Monument", 248, Rarity.UNCOMMON, mage.cards.t.TemurMonument.class));
|
||||
cards.add(new SetCardInfo("Temur Tawnyback", 229, Rarity.COMMON, mage.cards.t.TemurTawnyback.class));
|
||||
cards.add(new SetCardInfo("Thornwood Falls", 269, Rarity.COMMON, mage.cards.t.ThornwoodFalls.class));
|
||||
cards.add(new SetCardInfo("Tranquil Cove", 270, Rarity.COMMON, mage.cards.t.TranquilCove.class));
|
||||
cards.add(new SetCardInfo("Ugin, Eye of the Storms", 1, Rarity.MYTHIC, mage.cards.u.UginEyeOfTheStorms.class));
|
||||
cards.add(new SetCardInfo("Underfoot Underdogs", 129, Rarity.COMMON, mage.cards.u.UnderfootUnderdogs.class));
|
||||
cards.add(new SetCardInfo("Undergrowth Leopard", 165, Rarity.COMMON, mage.cards.u.UndergrowthLeopard.class));
|
||||
cards.add(new SetCardInfo("Unending Whisper", 62, Rarity.COMMON, mage.cards.u.UnendingWhisper.class));
|
||||
cards.add(new SetCardInfo("United Battlefront", 32, Rarity.RARE, mage.cards.u.UnitedBattlefront.class));
|
||||
cards.add(new SetCardInfo("Unrooted Ancestor", 96, Rarity.UNCOMMON, mage.cards.u.UnrootedAncestor.class));
|
||||
cards.add(new SetCardInfo("Unsparing Boltcaster", 130, Rarity.UNCOMMON, mage.cards.u.UnsparingBoltcaster.class));
|
||||
cards.add(new SetCardInfo("Ureni's Rebuff", 63, Rarity.UNCOMMON, mage.cards.u.UrenisRebuff.class));
|
||||
cards.add(new SetCardInfo("Venerated Stormsinger", 97, Rarity.UNCOMMON, mage.cards.v.VeneratedStormsinger.class));
|
||||
cards.add(new SetCardInfo("Voice of Victory", 33, Rarity.RARE, mage.cards.v.VoiceOfVictory.class));
|
||||
cards.add(new SetCardInfo("Watcher of the Wayside", 249, Rarity.COMMON, mage.cards.w.WatcherOfTheWayside.class));
|
||||
cards.add(new SetCardInfo("Wind-Scarred Crag", 271, Rarity.COMMON, mage.cards.w.WindScarredCrag.class));
|
||||
cards.add(new SetCardInfo("Wingspan Stride", 66, Rarity.COMMON, mage.cards.w.WingspanStride.class));
|
||||
cards.add(new SetCardInfo("Winternight Stories", 67, Rarity.RARE, mage.cards.w.WinternightStories.class));
|
||||
cards.add(new SetCardInfo("Worthy Cost", 99, Rarity.COMMON, mage.cards.w.WorthyCost.class));
|
||||
cards.add(new SetCardInfo("Yathan Tombguard", 100, Rarity.UNCOMMON, mage.cards.y.YathanTombguard.class));
|
||||
cards.add(new SetCardInfo("Zurgo's Vanguard", 133, Rarity.UNCOMMON, mage.cards.z.ZurgosVanguard.class));
|
||||
|
||||
cards.removeIf(setCardInfo -> unfinished.contains(setCardInfo.getName()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,38 +20,57 @@ public final class TarkirDragonstormCommander extends ExpansionSet {
|
|||
this.hasBasicLands = false;
|
||||
|
||||
cards.add(new SetCardInfo("Abrade", 203, Rarity.UNCOMMON, mage.cards.a.Abrade.class));
|
||||
cards.add(new SetCardInfo("Access Tunnel", 337, Rarity.UNCOMMON, mage.cards.a.AccessTunnel.class));
|
||||
cards.add(new SetCardInfo("Adarkar Wastes", 338, Rarity.RARE, mage.cards.a.AdarkarWastes.class));
|
||||
cards.add(new SetCardInfo("Adeline, Resplendent Cathar", 108, Rarity.RARE, mage.cards.a.AdelineResplendentCathar.class));
|
||||
cards.add(new SetCardInfo("Amphin Mutineer", 143, Rarity.RARE, mage.cards.a.AmphinMutineer.class));
|
||||
cards.add(new SetCardInfo("Ancestral Vision", 144, Rarity.RARE, mage.cards.a.AncestralVision.class));
|
||||
cards.add(new SetCardInfo("Angel of Invention", 109, Rarity.MYTHIC, mage.cards.a.AngelOfInvention.class));
|
||||
cards.add(new SetCardInfo("Anguished Unmaking", 279, Rarity.RARE, mage.cards.a.AnguishedUnmaking.class));
|
||||
cards.add(new SetCardInfo("Arasta of the Endless Web", 244, Rarity.RARE, mage.cards.a.ArastaOfTheEndlessWeb.class));
|
||||
cards.add(new SetCardInfo("Arboreal Grazer", 245, Rarity.COMMON, mage.cards.a.ArborealGrazer.class));
|
||||
cards.add(new SetCardInfo("Arcane Signet", 105, Rarity.UNCOMMON, mage.cards.a.ArcaneSignet.class));
|
||||
cards.add(new SetCardInfo("Archmage Emeritus", 145, Rarity.RARE, mage.cards.a.ArchmageEmeritus.class));
|
||||
cards.add(new SetCardInfo("Aron, Benalia's Ruin", 280, Rarity.UNCOMMON, mage.cards.a.AronBenaliasRuin.class));
|
||||
cards.add(new SetCardInfo("Ash Barrens", 339, Rarity.COMMON, mage.cards.a.AshBarrens.class));
|
||||
cards.add(new SetCardInfo("Assault Formation", 246, Rarity.RARE, mage.cards.a.AssaultFormation.class));
|
||||
cards.add(new SetCardInfo("Atarka, World Render", 281, Rarity.RARE, mage.cards.a.AtarkaWorldRender.class));
|
||||
cards.add(new SetCardInfo("Atsushi, the Blazing Sky", 204, Rarity.MYTHIC, mage.cards.a.AtsushiTheBlazingSky.class));
|
||||
cards.add(new SetCardInfo("Avenger of Zendikar", 247, Rarity.MYTHIC, mage.cards.a.AvengerOfZendikar.class));
|
||||
cards.add(new SetCardInfo("Axebane Guardian", 248, Rarity.COMMON, mage.cards.a.AxebaneGuardian.class));
|
||||
cards.add(new SetCardInfo("Azorius Signet", 312, Rarity.UNCOMMON, mage.cards.a.AzoriusSignet.class));
|
||||
cards.add(new SetCardInfo("Baldin, Century Herdmaster", 110, Rarity.RARE, mage.cards.b.BaldinCenturyHerdmaster.class));
|
||||
cards.add(new SetCardInfo("Baral and Kari Zev", 282, Rarity.RARE, mage.cards.b.BaralAndKariZev.class));
|
||||
cards.add(new SetCardInfo("Baral's Expertise", 146, Rarity.RARE, mage.cards.b.BaralsExpertise.class));
|
||||
cards.add(new SetCardInfo("Bastion of Remembrance", 171, Rarity.UNCOMMON, mage.cards.b.BastionOfRemembrance.class));
|
||||
cards.add(new SetCardInfo("Battlefield Forge", 340, Rarity.RARE, mage.cards.b.BattlefieldForge.class));
|
||||
cards.add(new SetCardInfo("Beast Within", 249, Rarity.UNCOMMON, mage.cards.b.BeastWithin.class));
|
||||
cards.add(new SetCardInfo("Beetleback Chief", 205, Rarity.UNCOMMON, mage.cards.b.BeetlebackChief.class));
|
||||
cards.add(new SetCardInfo("Behind the Scenes", 172, Rarity.UNCOMMON, mage.cards.b.BehindTheScenes.class));
|
||||
cards.add(new SetCardInfo("Betor, Ancestor's Voice", 1, Rarity.MYTHIC, mage.cards.b.BetorAncestorsVoice.class));
|
||||
cards.add(new SetCardInfo("Big Score", 206, Rarity.COMMON, mage.cards.b.BigScore.class));
|
||||
cards.add(new SetCardInfo("Bitter Triumph", 173, Rarity.UNCOMMON, mage.cards.b.BitterTriumph.class));
|
||||
cards.add(new SetCardInfo("Blade of Selves", 313, Rarity.RARE, mage.cards.b.BladeOfSelves.class));
|
||||
cards.add(new SetCardInfo("Blasphemous Act", 207, Rarity.RARE, mage.cards.b.BlasphemousAct.class));
|
||||
cards.add(new SetCardInfo("Blight Pile", 174, Rarity.UNCOMMON, mage.cards.b.BlightPile.class));
|
||||
cards.add(new SetCardInfo("Bojuka Bog", 341, Rarity.COMMON, mage.cards.b.BojukaBog.class));
|
||||
cards.add(new SetCardInfo("Boros Signet", 314, Rarity.UNCOMMON, mage.cards.b.BorosSignet.class));
|
||||
cards.add(new SetCardInfo("Bountiful Landscape", 342, Rarity.COMMON, mage.cards.b.BountifulLandscape.class));
|
||||
cards.add(new SetCardInfo("Caldera Pyremaw", 33, Rarity.RARE, mage.cards.c.CalderaPyremaw.class));
|
||||
cards.add(new SetCardInfo("Canopy Vista", 343, Rarity.RARE, mage.cards.c.CanopyVista.class));
|
||||
cards.add(new SetCardInfo("Canyon Slough", 344, Rarity.RARE, mage.cards.c.CanyonSlough.class));
|
||||
cards.add(new SetCardInfo("Carven Caryatid", 250, Rarity.UNCOMMON, mage.cards.c.CarvenCaryatid.class));
|
||||
cards.add(new SetCardInfo("Cascade Bluffs", 345, Rarity.RARE, mage.cards.c.CascadeBluffs.class));
|
||||
cards.add(new SetCardInfo("Castle Ardenvale", 346, Rarity.RARE, mage.cards.c.CastleArdenvale.class));
|
||||
cards.add(new SetCardInfo("Castle Embereth", 347, Rarity.RARE, mage.cards.c.CastleEmbereth.class));
|
||||
cards.add(new SetCardInfo("Casualties of War", 98, Rarity.COMMON, mage.cards.c.CasualtiesOfWar.class));
|
||||
cards.add(new SetCardInfo("Casualties of War", 98, Rarity.RARE, mage.cards.c.CasualtiesOfWar.class));
|
||||
cards.add(new SetCardInfo("Caves of Koilos", 348, Rarity.RARE, mage.cards.c.CavesOfKoilos.class));
|
||||
cards.add(new SetCardInfo("Cephalid Coliseum", 349, Rarity.UNCOMMON, mage.cards.c.CephalidColiseum.class));
|
||||
cards.add(new SetCardInfo("Chaos Warp", 208, Rarity.RARE, mage.cards.c.ChaosWarp.class));
|
||||
cards.add(new SetCardInfo("Chittering Witch", 175, Rarity.RARE, mage.cards.c.ChitteringWitch.class));
|
||||
cards.add(new SetCardInfo("Cinder Glade", 350, Rarity.RARE, mage.cards.c.CinderGlade.class));
|
||||
cards.add(new SetCardInfo("Clifftop Retreat", 351, Rarity.RARE, mage.cards.c.ClifftopRetreat.class));
|
||||
cards.add(new SetCardInfo("Colfenor's Urn", 315, Rarity.RARE, mage.cards.c.ColfenorsUrn.class));
|
||||
cards.add(new SetCardInfo("Command Beacon", 352, Rarity.RARE, mage.cards.c.CommandBeacon.class));
|
||||
cards.add(new SetCardInfo("Command Tower", 107, Rarity.COMMON, mage.cards.c.CommandTower.class));
|
||||
cards.add(new SetCardInfo("Commander's Insignia", 111, Rarity.RARE, mage.cards.c.CommandersInsignia.class));
|
||||
|
|
@ -60,6 +79,7 @@ public final class TarkirDragonstormCommander extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Consider", 148, Rarity.COMMON, mage.cards.c.Consider.class));
|
||||
cards.add(new SetCardInfo("Consuming Aberration", 283, Rarity.RARE, mage.cards.c.ConsumingAberration.class));
|
||||
cards.add(new SetCardInfo("Contaminated Aquifer", 353, Rarity.COMMON, mage.cards.c.ContaminatedAquifer.class));
|
||||
cards.add(new SetCardInfo("Crashing Drawbridge", 316, Rarity.COMMON, mage.cards.c.CrashingDrawbridge.class));
|
||||
cards.add(new SetCardInfo("Crawling Sensation", 252, Rarity.UNCOMMON, mage.cards.c.CrawlingSensation.class));
|
||||
cards.add(new SetCardInfo("Crypt of Agadeem", 354, Rarity.RARE, mage.cards.c.CryptOfAgadeem.class));
|
||||
cards.add(new SetCardInfo("Cultivate", 253, Rarity.COMMON, mage.cards.c.Cultivate.class));
|
||||
|
|
@ -68,57 +88,90 @@ public final class TarkirDragonstormCommander extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Darkwater Catacombs", 355, Rarity.RARE, mage.cards.d.DarkwaterCatacombs.class));
|
||||
cards.add(new SetCardInfo("Dauthi Voidwalker", 176, Rarity.RARE, mage.cards.d.DauthiVoidwalker.class));
|
||||
cards.add(new SetCardInfo("Deadly Dispute", 177, Rarity.COMMON, mage.cards.d.DeadlyDispute.class));
|
||||
cards.add(new SetCardInfo("Deceptive Landscape", 356, Rarity.COMMON, mage.cards.d.DeceptiveLandscape.class));
|
||||
cards.add(new SetCardInfo("Deep Analysis", 150, Rarity.COMMON, mage.cards.d.DeepAnalysis.class));
|
||||
cards.add(new SetCardInfo("Despark", 284, Rarity.UNCOMMON, mage.cards.d.Despark.class));
|
||||
cards.add(new SetCardInfo("Disciple of Bolas", 178, Rarity.RARE, mage.cards.d.DiscipleOfBolas.class));
|
||||
cards.add(new SetCardInfo("Dismantling Wave", 112, Rarity.RARE, mage.cards.d.DismantlingWave.class));
|
||||
cards.add(new SetCardInfo("Divine Visitation", 113, Rarity.MYTHIC, mage.cards.d.DivineVisitation.class));
|
||||
cards.add(new SetCardInfo("Draconic Lore", 151, Rarity.COMMON, mage.cards.d.DraconicLore.class));
|
||||
cards.add(new SetCardInfo("Dragon Tempest", 94, Rarity.UNCOMMON, mage.cards.d.DragonTempest.class));
|
||||
cards.add(new SetCardInfo("Dragon's Hoard", 317, Rarity.RARE, mage.cards.d.DragonsHoard.class));
|
||||
cards.add(new SetCardInfo("Dragonlord Atarka", 285, Rarity.MYTHIC, mage.cards.d.DragonlordAtarka.class));
|
||||
cards.add(new SetCardInfo("Dragonlord Dromoka", 286, Rarity.MYTHIC, mage.cards.d.DragonlordDromoka.class));
|
||||
cards.add(new SetCardInfo("Dragonlord's Servant", 210, Rarity.UNCOMMON, mage.cards.d.DragonlordsServant.class));
|
||||
cards.add(new SetCardInfo("Dragonmaster Outcast", 211, Rarity.MYTHIC, mage.cards.d.DragonmasterOutcast.class));
|
||||
cards.add(new SetCardInfo("Dragonskull Summit", 357, Rarity.RARE, mage.cards.d.DragonskullSummit.class));
|
||||
cards.add(new SetCardInfo("Dreamroot Cascade", 358, Rarity.RARE, mage.cards.d.DreamrootCascade.class));
|
||||
cards.add(new SetCardInfo("Drownyard Temple", 359, Rarity.RARE, mage.cards.d.DrownyardTemple.class));
|
||||
cards.add(new SetCardInfo("Electrodominance", 212, Rarity.RARE, mage.cards.e.Electrodominance.class));
|
||||
cards.add(new SetCardInfo("Elemental Bond", 254, Rarity.UNCOMMON, mage.cards.e.ElementalBond.class));
|
||||
cards.add(new SetCardInfo("Eliminate the Competition", 179, Rarity.RARE, mage.cards.e.EliminateTheCompetition.class));
|
||||
cards.add(new SetCardInfo("Emeria Angel", 114, Rarity.RARE, mage.cards.e.EmeriaAngel.class));
|
||||
cards.add(new SetCardInfo("Exotic Orchard", 360, Rarity.RARE, mage.cards.e.ExoticOrchard.class));
|
||||
cards.add(new SetCardInfo("Expansion // Explosion", 287, Rarity.RARE, mage.cards.e.ExpansionExplosion.class));
|
||||
cards.add(new SetCardInfo("Expel the Interlopers", 115, Rarity.RARE, mage.cards.e.ExpelTheInterlopers.class));
|
||||
cards.add(new SetCardInfo("Expressive Iteration", 288, Rarity.UNCOMMON, mage.cards.e.ExpressiveIteration.class));
|
||||
cards.add(new SetCardInfo("Faeburrow Elder", 289, Rarity.RARE, mage.cards.f.FaeburrowElder.class));
|
||||
cards.add(new SetCardInfo("Faithless Looting", 213, Rarity.COMMON, mage.cards.f.FaithlessLooting.class));
|
||||
cards.add(new SetCardInfo("Farseek", 255, Rarity.UNCOMMON, mage.cards.f.Farseek.class));
|
||||
cards.add(new SetCardInfo("Farseek", 255, Rarity.COMMON, mage.cards.f.Farseek.class));
|
||||
cards.add(new SetCardInfo("Feed the Swarm", 180, Rarity.COMMON, mage.cards.f.FeedTheSwarm.class));
|
||||
cards.add(new SetCardInfo("Fellwar Stone", 318, Rarity.UNCOMMON, mage.cards.f.FellwarStone.class));
|
||||
cards.add(new SetCardInfo("Ferrous Lake", 361, Rarity.RARE, mage.cards.f.FerrousLake.class));
|
||||
cards.add(new SetCardInfo("Fetid Heath", 362, Rarity.RARE, mage.cards.f.FetidHeath.class));
|
||||
cards.add(new SetCardInfo("Fetid Pools", 363, Rarity.RARE, mage.cards.f.FetidPools.class));
|
||||
cards.add(new SetCardInfo("Flooded Grove", 364, Rarity.RARE, mage.cards.f.FloodedGrove.class));
|
||||
cards.add(new SetCardInfo("Forbidden Alchemy", 152, Rarity.COMMON, mage.cards.f.ForbiddenAlchemy.class));
|
||||
cards.add(new SetCardInfo("Foreboding Landscape", 365, Rarity.COMMON, mage.cards.f.ForebodingLandscape.class));
|
||||
cards.add(new SetCardInfo("Fortified Village", 366, Rarity.RARE, mage.cards.f.FortifiedVillage.class));
|
||||
cards.add(new SetCardInfo("Frantic Search", 153, Rarity.COMMON, mage.cards.f.FranticSearch.class));
|
||||
cards.add(new SetCardInfo("Frontier Siege", 256, Rarity.RARE, mage.cards.f.FrontierSiege.class));
|
||||
cards.add(new SetCardInfo("Gadrak, the Crown-Scourge", 214, Rarity.RARE, mage.cards.g.GadrakTheCrownScourge.class));
|
||||
cards.add(new SetCardInfo("Ghostly Prison", 116, Rarity.UNCOMMON, mage.cards.g.GhostlyPrison.class));
|
||||
cards.add(new SetCardInfo("Gix, Yawgmoth Praetor", 181, Rarity.MYTHIC, mage.cards.g.GixYawgmothPraetor.class));
|
||||
cards.add(new SetCardInfo("Glacial Fortress", 367, Rarity.RARE, mage.cards.g.GlacialFortress.class));
|
||||
cards.add(new SetCardInfo("Glorybringer", 215, Rarity.RARE, mage.cards.g.Glorybringer.class));
|
||||
cards.add(new SetCardInfo("Goblin Electromancer", 99, Rarity.COMMON, mage.cards.g.GoblinElectromancer.class));
|
||||
cards.add(new SetCardInfo("Goldnight Commander", 117, Rarity.UNCOMMON, mage.cards.g.GoldnightCommander.class));
|
||||
cards.add(new SetCardInfo("Golgari Rot Farm", 368, Rarity.UNCOMMON, mage.cards.g.GolgariRotFarm.class));
|
||||
cards.add(new SetCardInfo("Grand Crescendo", 118, Rarity.RARE, mage.cards.g.GrandCrescendo.class));
|
||||
cards.add(new SetCardInfo("Grapple with the Past", 257, Rarity.COMMON, mage.cards.g.GrappleWithThePast.class));
|
||||
cards.add(new SetCardInfo("Gravecrawler", 93, Rarity.COMMON, mage.cards.g.Gravecrawler.class));
|
||||
cards.add(new SetCardInfo("Gravecrawler", 93, Rarity.RARE, mage.cards.g.Gravecrawler.class));
|
||||
cards.add(new SetCardInfo("Grenzo, Havoc Raiser", 216, Rarity.RARE, mage.cards.g.GrenzoHavocRaiser.class));
|
||||
cards.add(new SetCardInfo("Grisly Salvage", 290, Rarity.COMMON, mage.cards.g.GrislySalvage.class));
|
||||
cards.add(new SetCardInfo("Guttersnipe", 217, Rarity.UNCOMMON, mage.cards.g.Guttersnipe.class));
|
||||
cards.add(new SetCardInfo("Harbinger of the Hunt", 291, Rarity.RARE, mage.cards.h.HarbingerOfTheHunt.class));
|
||||
cards.add(new SetCardInfo("Harrow", 258, Rarity.COMMON, mage.cards.h.Harrow.class));
|
||||
cards.add(new SetCardInfo("Haughty Djinn", 154, Rarity.RARE, mage.cards.h.HaughtyDjinn.class));
|
||||
cards.add(new SetCardInfo("Haunted Mire", 369, Rarity.COMMON, mage.cards.h.HauntedMire.class));
|
||||
cards.add(new SetCardInfo("Haven of the Spirit Dragon", 370, Rarity.RARE, mage.cards.h.HavenOfTheSpiritDragon.class));
|
||||
cards.add(new SetCardInfo("Hedron Crab", 155, Rarity.UNCOMMON, mage.cards.h.HedronCrab.class));
|
||||
cards.add(new SetCardInfo("Hellkite Courser", 218, Rarity.MYTHIC, mage.cards.h.HellkiteCourser.class));
|
||||
cards.add(new SetCardInfo("Hero of Bladehold", 119, Rarity.MYTHIC, mage.cards.h.HeroOfBladehold.class));
|
||||
cards.add(new SetCardInfo("Hinterland Harbor", 371, Rarity.RARE, mage.cards.h.HinterlandHarbor.class));
|
||||
cards.add(new SetCardInfo("Hornet Nest", 259, Rarity.RARE, mage.cards.h.HornetNest.class));
|
||||
cards.add(new SetCardInfo("Hour of Reckoning", 120, Rarity.RARE, mage.cards.h.HourOfReckoning.class));
|
||||
cards.add(new SetCardInfo("Idol of Oblivion", 319, Rarity.RARE, mage.cards.i.IdolOfOblivion.class));
|
||||
cards.add(new SetCardInfo("Ikra Shidiqi, the Usurper", 100, Rarity.MYTHIC, mage.cards.i.IkraShidiqiTheUsurper.class));
|
||||
cards.add(new SetCardInfo("Indomitable Ancients", 121, Rarity.RARE, mage.cards.i.IndomitableAncients.class));
|
||||
cards.add(new SetCardInfo("Indulging Patrician", 292, Rarity.UNCOMMON, mage.cards.i.IndulgingPatrician.class));
|
||||
cards.add(new SetCardInfo("Infernal Grasp", 182, Rarity.UNCOMMON, mage.cards.i.InfernalGrasp.class));
|
||||
cards.add(new SetCardInfo("Irrigated Farmland", 372, Rarity.RARE, mage.cards.i.IrrigatedFarmland.class));
|
||||
cards.add(new SetCardInfo("Isolated Chapel", 373, Rarity.RARE, mage.cards.i.IsolatedChapel.class));
|
||||
cards.add(new SetCardInfo("Izzet Signet", 320, Rarity.COMMON, mage.cards.i.IzzetSignet.class));
|
||||
cards.add(new SetCardInfo("Jaddi Offshoot", 260, Rarity.UNCOMMON, mage.cards.j.JaddiOffshoot.class));
|
||||
cards.add(new SetCardInfo("Jarad, Golgari Lich Lord", 293, Rarity.MYTHIC, mage.cards.j.JaradGolgariLichLord.class));
|
||||
cards.add(new SetCardInfo("Junji, the Midnight Sky", 183, Rarity.MYTHIC, mage.cards.j.JunjiTheMidnightSky.class));
|
||||
cards.add(new SetCardInfo("Karplusan Forest", 374, Rarity.RARE, mage.cards.k.KarplusanForest.class));
|
||||
cards.add(new SetCardInfo("Kaya, Geist Hunter", 294, Rarity.MYTHIC, mage.cards.k.KayaGeistHunter.class));
|
||||
cards.add(new SetCardInfo("Keiga, the Tide Star", 156, Rarity.RARE, mage.cards.k.KeigaTheTideStar.class));
|
||||
cards.add(new SetCardInfo("Kessig Wolf Run", 375, Rarity.RARE, mage.cards.k.KessigWolfRun.class));
|
||||
cards.add(new SetCardInfo("Kodama's Reach", 261, Rarity.COMMON, mage.cards.k.KodamasReach.class));
|
||||
cards.add(new SetCardInfo("Lathliss, Dragon Queen", 219, Rarity.RARE, mage.cards.l.LathlissDragonQueen.class));
|
||||
cards.add(new SetCardInfo("Legion Loyalty", 122, Rarity.MYTHIC, mage.cards.l.LegionLoyalty.class));
|
||||
cards.add(new SetCardInfo("Legion Warboss", 220, Rarity.RARE, mage.cards.l.LegionWarboss.class));
|
||||
cards.add(new SetCardInfo("Lethal Scheme", 184, Rarity.RARE, mage.cards.l.LethalScheme.class));
|
||||
cards.add(new SetCardInfo("Leyline Tyrant", 221, Rarity.MYTHIC, mage.cards.l.LeylineTyrant.class));
|
||||
cards.add(new SetCardInfo("Lier, Disciple of the Drowned", 157, Rarity.MYTHIC, mage.cards.l.LierDiscipleOfTheDrowned.class));
|
||||
cards.add(new SetCardInfo("Life from the Loam", 96, Rarity.RARE, mage.cards.l.LifeFromTheLoam.class));
|
||||
cards.add(new SetCardInfo("Lightning Greaves", 102, Rarity.UNCOMMON, mage.cards.l.LightningGreaves.class));
|
||||
|
|
@ -133,23 +186,33 @@ public final class TarkirDragonstormCommander extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Manaform Hellkite", 224, Rarity.MYTHIC, mage.cards.m.ManaformHellkite.class));
|
||||
cards.add(new SetCardInfo("Mangara, the Diplomat", 124, Rarity.RARE, mage.cards.m.MangaraTheDiplomat.class));
|
||||
cards.add(new SetCardInfo("Memorial to Folly", 377, Rarity.UNCOMMON, mage.cards.m.MemorialToFolly.class));
|
||||
cards.add(new SetCardInfo("Meren of Clan Nel Toth", 297, Rarity.RARE, mage.cards.m.MerenOfClanNelToth.class));
|
||||
cards.add(new SetCardInfo("Meren of Clan Nel Toth", 297, Rarity.MYTHIC, mage.cards.m.MerenOfClanNelToth.class));
|
||||
cards.add(new SetCardInfo("Migration Path", 262, Rarity.UNCOMMON, mage.cards.m.MigrationPath.class));
|
||||
cards.add(new SetCardInfo("Millikin", 321, Rarity.UNCOMMON, mage.cards.m.Millikin.class));
|
||||
cards.add(new SetCardInfo("Mindblade Render", 187, Rarity.RARE, mage.cards.m.MindbladeRender.class));
|
||||
cards.add(new SetCardInfo("Monastery Mentor", 125, Rarity.MYTHIC, mage.cards.m.MonasteryMentor.class));
|
||||
cards.add(new SetCardInfo("Morbid Opportunist", 188, Rarity.UNCOMMON, mage.cards.m.MorbidOpportunist.class));
|
||||
cards.add(new SetCardInfo("Mossfire Valley", 378, Rarity.RARE, mage.cards.m.MossfireValley.class));
|
||||
cards.add(new SetCardInfo("Mosswort Bridge", 379, Rarity.RARE, mage.cards.m.MosswortBridge.class));
|
||||
cards.add(new SetCardInfo("Multani, Yavimaya's Avatar", 263, Rarity.MYTHIC, mage.cards.m.MultaniYavimayasAvatar.class));
|
||||
cards.add(new SetCardInfo("Myr Battlesphere", 322, Rarity.RARE, mage.cards.m.MyrBattlesphere.class));
|
||||
cards.add(new SetCardInfo("Myriad Landscape", 380, Rarity.UNCOMMON, mage.cards.m.MyriadLandscape.class));
|
||||
cards.add(new SetCardInfo("Narset's Reversal", 92, Rarity.RARE, mage.cards.n.NarsetsReversal.class));
|
||||
cards.add(new SetCardInfo("Necromantic Selection", 189, Rarity.RARE, mage.cards.n.NecromanticSelection.class));
|
||||
cards.add(new SetCardInfo("Necropolis Fiend", 190, Rarity.RARE, mage.cards.n.NecropolisFiend.class));
|
||||
cards.add(new SetCardInfo("Nesting Dragon", 225, Rarity.RARE, mage.cards.n.NestingDragon.class));
|
||||
cards.add(new SetCardInfo("Nogi, Draco-Zealot", 226, Rarity.MYTHIC, mage.cards.n.NogiDracoZealot.class));
|
||||
cards.add(new SetCardInfo("Noxious Gearhulk", 191, Rarity.MYTHIC, mage.cards.n.NoxiousGearhulk.class));
|
||||
cards.add(new SetCardInfo("Nyx Weaver", 298, Rarity.UNCOMMON, mage.cards.n.NyxWeaver.class));
|
||||
cards.add(new SetCardInfo("Nyx-Fleece Ram", 126, Rarity.UNCOMMON, mage.cards.n.NyxFleeceRam.class));
|
||||
cards.add(new SetCardInfo("Ob Nixilis, the Fallen", 192, Rarity.MYTHIC, mage.cards.o.ObNixilisTheFallen.class));
|
||||
cards.add(new SetCardInfo("Ogre Battledriver", 227, Rarity.RARE, mage.cards.o.OgreBattledriver.class));
|
||||
cards.add(new SetCardInfo("Ophiomancer", 193, Rarity.RARE, mage.cards.o.Ophiomancer.class));
|
||||
cards.add(new SetCardInfo("Opportunistic Dragon", 228, Rarity.RARE, mage.cards.o.OpportunisticDragon.class));
|
||||
cards.add(new SetCardInfo("Opt", 158, Rarity.COMMON, mage.cards.o.Opt.class));
|
||||
cards.add(new SetCardInfo("Orzhov Signet", 323, Rarity.COMMON, mage.cards.o.OrzhovSignet.class));
|
||||
cards.add(new SetCardInfo("Overgrown Battlement", 264, Rarity.UNCOMMON, mage.cards.o.OvergrownBattlement.class));
|
||||
cards.add(new SetCardInfo("Overgrown Farmland", 381, Rarity.RARE, mage.cards.o.OvergrownFarmland.class));
|
||||
cards.add(new SetCardInfo("Path of Ancestry", 382, Rarity.COMMON, mage.cards.p.PathOfAncestry.class));
|
||||
cards.add(new SetCardInfo("Perilous Landscape", 383, Rarity.COMMON, mage.cards.p.PerilousLandscape.class));
|
||||
cards.add(new SetCardInfo("Phyrexian Reclamation", 194, Rarity.UNCOMMON, mage.cards.p.PhyrexianReclamation.class));
|
||||
|
|
@ -159,73 +222,129 @@ public final class TarkirDragonstormCommander extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Preordain", 161, Rarity.COMMON, mage.cards.p.Preordain.class));
|
||||
cards.add(new SetCardInfo("Prismari Command", 299, Rarity.RARE, mage.cards.p.PrismariCommand.class));
|
||||
cards.add(new SetCardInfo("Putrefy", 300, Rarity.UNCOMMON, mage.cards.p.Putrefy.class));
|
||||
cards.add(new SetCardInfo("Radiant Grove", 385, Rarity.COMMON, mage.cards.r.RadiantGrove.class));
|
||||
cards.add(new SetCardInfo("Rampant Growth", 265, Rarity.COMMON, mage.cards.r.RampantGrowth.class));
|
||||
cards.add(new SetCardInfo("Rapacious Dragon", 229, Rarity.UNCOMMON, mage.cards.r.RapaciousDragon.class));
|
||||
cards.add(new SetCardInfo("Rapid Hybridization", 162, Rarity.UNCOMMON, mage.cards.r.RapidHybridization.class));
|
||||
cards.add(new SetCardInfo("Reality Shift", 163, Rarity.UNCOMMON, mage.cards.r.RealityShift.class));
|
||||
cards.add(new SetCardInfo("Reassembling Skeleton", 195, Rarity.UNCOMMON, mage.cards.r.ReassemblingSkeleton.class));
|
||||
cards.add(new SetCardInfo("Reflections of Littjara", 164, Rarity.RARE, mage.cards.r.ReflectionsOfLittjara.class));
|
||||
cards.add(new SetCardInfo("Release the Dogs", 127, Rarity.UNCOMMON, mage.cards.r.ReleaseTheDogs.class));
|
||||
cards.add(new SetCardInfo("Reliquary Tower", 386, Rarity.UNCOMMON, mage.cards.r.ReliquaryTower.class));
|
||||
cards.add(new SetCardInfo("Rhox Faithmender", 128, Rarity.RARE, mage.cards.r.RhoxFaithmender.class));
|
||||
cards.add(new SetCardInfo("Rite of Replication", 165, Rarity.RARE, mage.cards.r.RiteOfReplication.class));
|
||||
cards.add(new SetCardInfo("River Kelpie", 166, Rarity.RARE, mage.cards.r.RiverKelpie.class));
|
||||
cards.add(new SetCardInfo("Rockfall Vale", 387, Rarity.RARE, mage.cards.r.RockfallVale.class));
|
||||
cards.add(new SetCardInfo("Rootbound Crag", 388, Rarity.RARE, mage.cards.r.RootboundCrag.class));
|
||||
cards.add(new SetCardInfo("Rugged Prairie", 389, Rarity.RARE, mage.cards.r.RuggedPrairie.class));
|
||||
cards.add(new SetCardInfo("Sakura-Tribe Elder", 266, Rarity.COMMON, mage.cards.s.SakuraTribeElder.class));
|
||||
cards.add(new SetCardInfo("Sarkhan, Soul Aflame", 301, Rarity.MYTHIC, mage.cards.s.SarkhanSoulAflame.class));
|
||||
cards.add(new SetCardInfo("Satyr Wayfinder", 267, Rarity.COMMON, mage.cards.s.SatyrWayfinder.class));
|
||||
cards.add(new SetCardInfo("Scourge of the Throne", 230, Rarity.RARE, mage.cards.s.ScourgeOfTheThrone.class));
|
||||
cards.add(new SetCardInfo("Seedborn Muse", 268, Rarity.RARE, mage.cards.s.SeedbornMuse.class));
|
||||
cards.add(new SetCardInfo("Selesnya Signet", 324, Rarity.COMMON, mage.cards.s.SelesnyaSignet.class));
|
||||
cards.add(new SetCardInfo("Selfless Spirit", 129, Rarity.RARE, mage.cards.s.SelflessSpirit.class));
|
||||
cards.add(new SetCardInfo("Selvala's Stampede", 269, Rarity.RARE, mage.cards.s.SelvalasStampede.class));
|
||||
cards.add(new SetCardInfo("Shadow Summoning", 101, Rarity.UNCOMMON, mage.cards.s.ShadowSummoning.class));
|
||||
cards.add(new SetCardInfo("Shadrix Silverquill", 302, Rarity.MYTHIC, mage.cards.s.ShadrixSilverquill.class));
|
||||
cards.add(new SetCardInfo("Shalai, Voice of Plenty", 130, Rarity.RARE, mage.cards.s.ShalaiVoiceOfPlenty.class));
|
||||
cards.add(new SetCardInfo("Shattered Landscape", 390, Rarity.COMMON, mage.cards.s.ShatteredLandscape.class));
|
||||
cards.add(new SetCardInfo("Shattered Sanctum", 391, Rarity.RARE, mage.cards.s.ShatteredSanctum.class));
|
||||
cards.add(new SetCardInfo("Sheltered Thicket", 392, Rarity.RARE, mage.cards.s.ShelteredThicket.class));
|
||||
cards.add(new SetCardInfo("Shigeki, Jukai Visionary", 270, Rarity.RARE, mage.cards.s.ShigekiJukaiVisionary.class));
|
||||
cards.add(new SetCardInfo("Shiny Impetus", 231, Rarity.COMMON, mage.cards.s.ShinyImpetus.class));
|
||||
cards.add(new SetCardInfo("Shivan Reef", 393, Rarity.RARE, mage.cards.s.ShivanReef.class));
|
||||
cards.add(new SetCardInfo("Sidar Kondo of Jamuraa", 303, Rarity.MYTHIC, mage.cards.s.SidarKondoOfJamuraa.class));
|
||||
cards.add(new SetCardInfo("Siege-Gang Commander", 232, Rarity.RARE, mage.cards.s.SiegeGangCommander.class));
|
||||
cards.add(new SetCardInfo("Skarrgan Hellkite", 233, Rarity.MYTHIC, mage.cards.s.SkarrganHellkite.class));
|
||||
cards.add(new SetCardInfo("Skull Prophet", 304, Rarity.UNCOMMON, mage.cards.s.SkullProphet.class));
|
||||
cards.add(new SetCardInfo("Skullclamp", 103, Rarity.UNCOMMON, mage.cards.s.Skullclamp.class));
|
||||
cards.add(new SetCardInfo("Skycloud Expanse", 394, Rarity.RARE, mage.cards.s.SkycloudExpanse.class));
|
||||
cards.add(new SetCardInfo("Slaughter the Strong", 131, Rarity.UNCOMMON, mage.cards.s.SlaughterTheStrong.class));
|
||||
cards.add(new SetCardInfo("Smoldering Marsh", 395, Rarity.RARE, mage.cards.s.SmolderingMarsh.class));
|
||||
cards.add(new SetCardInfo("Sol Ring", 106, Rarity.UNCOMMON, mage.cards.s.SolRing.class));
|
||||
cards.add(new SetCardInfo("Solemn Simulacrum", 325, Rarity.RARE, mage.cards.s.SolemnSimulacrum.class));
|
||||
cards.add(new SetCardInfo("Spit Flame", 234, Rarity.RARE, mage.cards.s.SpitFlame.class));
|
||||
cards.add(new SetCardInfo("Springbloom Druid", 271, Rarity.COMMON, mage.cards.s.SpringbloomDruid.class));
|
||||
cards.add(new SetCardInfo("Staff of Compleation", 326, Rarity.MYTHIC, mage.cards.s.StaffOfCompleation.class));
|
||||
cards.add(new SetCardInfo("Steel Hellkite", 327, Rarity.RARE, mage.cards.s.SteelHellkite.class));
|
||||
cards.add(new SetCardInfo("Stitcher's Supplier", 196, Rarity.UNCOMMON, mage.cards.s.StitchersSupplier.class));
|
||||
cards.add(new SetCardInfo("Storm's Wrath", 236, Rarity.RARE, mage.cards.s.StormsWrath.class));
|
||||
cards.add(new SetCardInfo("Storm-Kiln Artist", 235, Rarity.UNCOMMON, mage.cards.s.StormKilnArtist.class));
|
||||
cards.add(new SetCardInfo("Stormbreath Dragon", 237, Rarity.MYTHIC, mage.cards.s.StormbreathDragon.class));
|
||||
cards.add(new SetCardInfo("Stroke of Midnight", 132, Rarity.UNCOMMON, mage.cards.s.StrokeOfMidnight.class));
|
||||
cards.add(new SetCardInfo("Sublime Epiphany", 167, Rarity.RARE, mage.cards.s.SublimeEpiphany.class));
|
||||
cards.add(new SetCardInfo("Sulfur Falls", 396, Rarity.RARE, mage.cards.s.SulfurFalls.class));
|
||||
cards.add(new SetCardInfo("Sun Titan", 133, Rarity.MYTHIC, mage.cards.s.SunTitan.class));
|
||||
cards.add(new SetCardInfo("Sungrass Prairie", 397, Rarity.RARE, mage.cards.s.SungrassPrairie.class));
|
||||
cards.add(new SetCardInfo("Sunken Hollow", 398, Rarity.RARE, mage.cards.s.SunkenHollow.class));
|
||||
cards.add(new SetCardInfo("Sunpetal Grove", 399, Rarity.RARE, mage.cards.s.SunpetalGrove.class));
|
||||
cards.add(new SetCardInfo("Swiftfoot Boots", 328, Rarity.UNCOMMON, mage.cards.s.SwiftfootBoots.class));
|
||||
cards.add(new SetCardInfo("Swords to Plowshares", 134, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class));
|
||||
cards.add(new SetCardInfo("Sylvan Caryatid", 272, Rarity.RARE, mage.cards.s.SylvanCaryatid.class));
|
||||
cards.add(new SetCardInfo("Talisman of Conviction", 329, Rarity.UNCOMMON, mage.cards.t.TalismanOfConviction.class));
|
||||
cards.add(new SetCardInfo("Talisman of Creativity", 330, Rarity.UNCOMMON, mage.cards.t.TalismanOfCreativity.class));
|
||||
cards.add(new SetCardInfo("Talisman of Hierarchy", 331, Rarity.UNCOMMON, mage.cards.t.TalismanOfHierarchy.class));
|
||||
cards.add(new SetCardInfo("Talisman of Impulse", 332, Rarity.UNCOMMON, mage.cards.t.TalismanOfImpulse.class));
|
||||
cards.add(new SetCardInfo("Talisman of Progress", 333, Rarity.UNCOMMON, mage.cards.t.TalismanOfProgress.class));
|
||||
cards.add(new SetCardInfo("Tasigur, the Golden Fang", 197, Rarity.RARE, mage.cards.t.TasigurTheGoldenFang.class));
|
||||
cards.add(new SetCardInfo("Taurean Mauler", 238, Rarity.RARE, mage.cards.t.TaureanMauler.class));
|
||||
cards.add(new SetCardInfo("Tear Asunder", 273, Rarity.UNCOMMON, mage.cards.t.TearAsunder.class));
|
||||
cards.add(new SetCardInfo("Tempest Technique", 16, Rarity.RARE, mage.cards.t.TempestTechnique.class));
|
||||
cards.add(new SetCardInfo("Temple of Abandon", 400, Rarity.RARE, mage.cards.t.TempleOfAbandon.class));
|
||||
cards.add(new SetCardInfo("Temple of Enlightenment", 401, Rarity.RARE, mage.cards.t.TempleOfEnlightenment.class));
|
||||
cards.add(new SetCardInfo("Temple of Epiphany", 402, Rarity.RARE, mage.cards.t.TempleOfEpiphany.class));
|
||||
cards.add(new SetCardInfo("Temple of Malady", 403, Rarity.RARE, mage.cards.t.TempleOfMalady.class));
|
||||
cards.add(new SetCardInfo("Temple of Mystery", 404, Rarity.RARE, mage.cards.t.TempleOfMystery.class));
|
||||
cards.add(new SetCardInfo("Temple of Plenty", 405, Rarity.RARE, mage.cards.t.TempleOfPlenty.class));
|
||||
cards.add(new SetCardInfo("Temple of Silence", 406, Rarity.RARE, mage.cards.t.TempleOfSilence.class));
|
||||
cards.add(new SetCardInfo("Temple of Triumph", 407, Rarity.RARE, mage.cards.t.TempleOfTriumph.class));
|
||||
cards.add(new SetCardInfo("Temple of the Dragon Queen", 104, Rarity.UNCOMMON, mage.cards.t.TempleOfTheDragonQueen.class));
|
||||
cards.add(new SetCardInfo("Tempt with Vengeance", 239, Rarity.RARE, mage.cards.t.TemptWithVengeance.class));
|
||||
cards.add(new SetCardInfo("Temur Ascendancy", 305, Rarity.RARE, mage.cards.t.TemurAscendancy.class));
|
||||
cards.add(new SetCardInfo("Terramorphic Expanse", 408, Rarity.COMMON, mage.cards.t.TerramorphicExpanse.class));
|
||||
cards.add(new SetCardInfo("Territorial Hellkite", 240, Rarity.RARE, mage.cards.t.TerritorialHellkite.class));
|
||||
cards.add(new SetCardInfo("Teval, the Balanced Scale", 8, Rarity.MYTHIC, mage.cards.t.TevalTheBalancedScale.class));
|
||||
cards.add(new SetCardInfo("Thalisse, Reverent Medium", 306, Rarity.UNCOMMON, mage.cards.t.ThalisseReverentMedium.class));
|
||||
cards.add(new SetCardInfo("Think Twice", 168, Rarity.COMMON, mage.cards.t.ThinkTwice.class));
|
||||
cards.add(new SetCardInfo("Third Path Iconoclast", 307, Rarity.UNCOMMON, mage.cards.t.ThirdPathIconoclast.class));
|
||||
cards.add(new SetCardInfo("Thunderbreak Regent", 241, Rarity.RARE, mage.cards.t.ThunderbreakRegent.class));
|
||||
cards.add(new SetCardInfo("Time Wipe", 308, Rarity.RARE, mage.cards.t.TimeWipe.class));
|
||||
cards.add(new SetCardInfo("Timeless Witness", 274, Rarity.UNCOMMON, mage.cards.t.TimelessWitness.class));
|
||||
cards.add(new SetCardInfo("Tocasia's Welcome", 135, Rarity.RARE, mage.cards.t.TocasiasWelcome.class));
|
||||
cards.add(new SetCardInfo("Tower Defense", 275, Rarity.UNCOMMON, mage.cards.t.TowerDefense.class));
|
||||
cards.add(new SetCardInfo("Towering Titan", 276, Rarity.MYTHIC, mage.cards.t.ToweringTitan.class));
|
||||
cards.add(new SetCardInfo("Treasure Cruise", 169, Rarity.COMMON, mage.cards.t.TreasureCruise.class));
|
||||
cards.add(new SetCardInfo("Tree of Redemption", 97, Rarity.MYTHIC, mage.cards.t.TreeOfRedemption.class));
|
||||
cards.add(new SetCardInfo("Twilight Drover", 136, Rarity.RARE, mage.cards.t.TwilightDrover.class));
|
||||
cards.add(new SetCardInfo("Twilight Mire", 409, Rarity.RARE, mage.cards.t.TwilightMire.class));
|
||||
cards.add(new SetCardInfo("Vanquish the Horde", 91, Rarity.RARE, mage.cards.v.VanquishTheHorde.class));
|
||||
cards.add(new SetCardInfo("Vault of the Archangel", 410, Rarity.RARE, mage.cards.v.VaultOfTheArchangel.class));
|
||||
cards.add(new SetCardInfo("Velomachus Lorehold", 309, Rarity.MYTHIC, mage.cards.v.VelomachusLorehold.class));
|
||||
cards.add(new SetCardInfo("Vengeful Ancestor", 242, Rarity.RARE, mage.cards.v.VengefulAncestor.class));
|
||||
cards.add(new SetCardInfo("Verix Bladewing", 243, Rarity.MYTHIC, mage.cards.v.VerixBladewing.class));
|
||||
cards.add(new SetCardInfo("Veyran, Voice of Duality", 310, Rarity.MYTHIC, mage.cards.v.VeyranVoiceOfDuality.class));
|
||||
cards.add(new SetCardInfo("Victimize", 198, Rarity.UNCOMMON, mage.cards.v.Victimize.class));
|
||||
cards.add(new SetCardInfo("Viscera Seer", 199, Rarity.COMMON, mage.cards.v.VisceraSeer.class));
|
||||
cards.add(new SetCardInfo("Wakestone Gargoyle", 137, Rarity.RARE, mage.cards.w.WakestoneGargoyle.class));
|
||||
cards.add(new SetCardInfo("Walking Bulwark", 334, Rarity.UNCOMMON, mage.cards.w.WalkingBulwark.class));
|
||||
cards.add(new SetCardInfo("Wall of Blossoms", 277, Rarity.UNCOMMON, mage.cards.w.WallOfBlossoms.class));
|
||||
cards.add(new SetCardInfo("Wall of Limbs", 200, Rarity.UNCOMMON, mage.cards.w.WallOfLimbs.class));
|
||||
cards.add(new SetCardInfo("Wall of Omens", 138, Rarity.UNCOMMON, mage.cards.w.WallOfOmens.class));
|
||||
cards.add(new SetCardInfo("Wall of Reverence", 139, Rarity.RARE, mage.cards.w.WallOfReverence.class));
|
||||
cards.add(new SetCardInfo("Wall of Roots", 278, Rarity.COMMON, mage.cards.w.WallOfRoots.class));
|
||||
cards.add(new SetCardInfo("Wayfarer's Bauble", 335, Rarity.COMMON, mage.cards.w.WayfarersBauble.class));
|
||||
cards.add(new SetCardInfo("Weathered Sentinels", 336, Rarity.RARE, mage.cards.w.WeatheredSentinels.class));
|
||||
cards.add(new SetCardInfo("Welcoming Vampire", 140, Rarity.RARE, mage.cards.w.WelcomingVampire.class));
|
||||
cards.add(new SetCardInfo("Whirlwind of Thought", 311, Rarity.RARE, mage.cards.w.WhirlwindOfThought.class));
|
||||
cards.add(new SetCardInfo("Windbrisk Heights", 411, Rarity.RARE, mage.cards.w.WindbriskHeights.class));
|
||||
cards.add(new SetCardInfo("Wingmantle Chaplain", 141, Rarity.UNCOMMON, mage.cards.w.WingmantleChaplain.class));
|
||||
cards.add(new SetCardInfo("Woe Strider", 201, Rarity.RARE, mage.cards.w.WoeStrider.class));
|
||||
cards.add(new SetCardInfo("Wonder", 170, Rarity.UNCOMMON, mage.cards.w.Wonder.class));
|
||||
cards.add(new SetCardInfo("Woodland Cemetery", 412, Rarity.RARE, mage.cards.w.WoodlandCemetery.class));
|
||||
cards.add(new SetCardInfo("Yahenni, Undying Partisan", 202, Rarity.RARE, mage.cards.y.YahenniUndyingPartisan.class));
|
||||
cards.add(new SetCardInfo("Yavimaya Coast", 413, Rarity.RARE, mage.cards.y.YavimayaCoast.class));
|
||||
cards.add(new SetCardInfo("Young Pyromancer", 95, Rarity.UNCOMMON, mage.cards.y.YoungPyromancer.class));
|
||||
cards.add(new SetCardInfo("Zetalpa, Primal Dawn", 142, Rarity.RARE, mage.cards.z.ZetalpaPrimalDawn.class));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,10 +5,7 @@ import mage.constants.ColoredManaSymbol;
|
|||
import mage.util.Copyable;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.*;
|
||||
|
||||
public class ObjectColor implements Serializable, Copyable<ObjectColor>, Comparable<ObjectColor> {
|
||||
|
||||
|
|
@ -19,17 +16,13 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
public static final ObjectColor GREEN = new ObjectColor("G");
|
||||
|
||||
public static final ObjectColor COLORLESS = new ObjectColor();
|
||||
|
||||
public static final ObjectColor GOLD = new ObjectColor("O"); // Not multicolored - Sword of Dungeons & Dragons
|
||||
|
||||
private static final List<ObjectColor>allColors= Arrays.asList(WHITE,BLUE,BLACK,RED,GREEN);
|
||||
private boolean white;
|
||||
private boolean blue;
|
||||
private boolean black;
|
||||
private boolean red;
|
||||
private boolean green;
|
||||
|
||||
private boolean gold;
|
||||
|
||||
public ObjectColor() {
|
||||
}
|
||||
|
||||
|
|
@ -51,10 +44,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
case 'G':
|
||||
green = true;
|
||||
break;
|
||||
|
||||
case 'O':
|
||||
gold = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -65,8 +54,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
black = color.black;
|
||||
red = color.red;
|
||||
green = color.green;
|
||||
|
||||
gold = color.gold;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -83,8 +70,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
newColor.black = black || other.black;
|
||||
newColor.red = red || other.red;
|
||||
newColor.green = green || other.green;
|
||||
|
||||
newColor.gold = gold || other.gold;
|
||||
return newColor;
|
||||
}
|
||||
|
||||
|
|
@ -102,8 +87,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
newColor.black = black && other.black;
|
||||
newColor.red = red && other.red;
|
||||
newColor.green = green && other.green;
|
||||
|
||||
newColor.gold = gold && other.gold;
|
||||
return newColor;
|
||||
}
|
||||
|
||||
|
|
@ -124,10 +107,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
if (red) {
|
||||
count++;
|
||||
}
|
||||
|
||||
if (gold) {
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
|
|
@ -176,10 +155,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
if (colors.size() >= 2 && secondColor - firstColor >= 3) {
|
||||
Collections.swap(colors, 0, 1);
|
||||
}
|
||||
|
||||
if (this.isGold()) {
|
||||
colors.add(ObjectColor.GOLD);
|
||||
}
|
||||
return colors;
|
||||
}
|
||||
|
||||
|
|
@ -189,8 +164,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
this.setGreen(color != null && color.isGreen());
|
||||
this.setRed(color != null && color.isRed());
|
||||
this.setWhite(color != null && color.isWhite());
|
||||
|
||||
this.setGold(color != null && color.isGold());
|
||||
}
|
||||
|
||||
public void addColor(ObjectColor color) {
|
||||
|
|
@ -209,10 +182,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
if (color.isGreen()) {
|
||||
setGreen(true);
|
||||
}
|
||||
|
||||
if (color.isGold()) {
|
||||
setGold(true);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isColorless() {
|
||||
|
|
@ -220,32 +189,26 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
}
|
||||
|
||||
public boolean hasColor() {
|
||||
return white || blue || black || red || green
|
||||
|| gold;
|
||||
return white || blue || black || red || green;
|
||||
}
|
||||
|
||||
public boolean isMulticolored() {
|
||||
if (isColorless()) {
|
||||
return false;
|
||||
}
|
||||
if (white && (blue || black || red || green
|
||||
|| gold)) {
|
||||
return true;
|
||||
if (white) {
|
||||
return blue || black || red || green;
|
||||
}
|
||||
if (blue && (black || red || green
|
||||
|| gold)) {
|
||||
return true;
|
||||
if (blue) {
|
||||
return black || red || green;
|
||||
}
|
||||
if (black && (red || green
|
||||
|| gold)) {
|
||||
return true;
|
||||
if (black) {
|
||||
return red || green;
|
||||
}
|
||||
if (red && (green
|
||||
|| gold)) {
|
||||
return true;
|
||||
if (red) {
|
||||
return green;
|
||||
}
|
||||
return green
|
||||
&& gold;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isWhite() {
|
||||
|
|
@ -288,14 +251,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
this.green = green;
|
||||
}
|
||||
|
||||
public boolean isGold() {
|
||||
return gold;
|
||||
}
|
||||
|
||||
public void setGold(boolean gold) {
|
||||
this.gold = gold;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder(5);
|
||||
|
|
@ -314,17 +269,13 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
if (green) {
|
||||
sb.append('G');
|
||||
}
|
||||
|
||||
if (gold) {
|
||||
sb.append('O');
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
if (getColorCount() > 1) {
|
||||
if (isMulticolored()) {
|
||||
return "multicolored";
|
||||
} else {
|
||||
}
|
||||
if (white) {
|
||||
return "white";
|
||||
}
|
||||
|
|
@ -340,11 +291,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
if (green) {
|
||||
return "green";
|
||||
}
|
||||
|
||||
if (gold) {
|
||||
return "gold";
|
||||
}
|
||||
}
|
||||
return "colorless";
|
||||
}
|
||||
|
||||
|
|
@ -372,10 +318,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
if (test.green != this.green) {
|
||||
return false;
|
||||
}
|
||||
if (test.gold != this.gold) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -387,8 +329,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
hash = 23 * hash + (this.black ? 1 : 0);
|
||||
hash = 23 * hash + (this.red ? 1 : 0);
|
||||
hash = 23 * hash + (this.green ? 1 : 0);
|
||||
|
||||
hash = 23 * hash + (this.gold ? 1 : 0);
|
||||
return hash;
|
||||
}
|
||||
|
||||
|
|
@ -411,10 +351,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
if (color.green && this.green) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (color.gold && this.gold) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -422,8 +358,7 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
// 105.4. [...] “Multicolored” is not a color. Neither is “colorless.”
|
||||
return !color.isColorless()
|
||||
&& (color.white && white || color.blue && blue || color.black && black
|
||||
|| color.red && red || color.green && green
|
||||
|| color.gold && gold);
|
||||
|| color.red && red || color.green && green);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -450,8 +385,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
o1 = 4;
|
||||
} else if (this.isWhite()) {
|
||||
o1 = 5;
|
||||
} else if (this.isGold()) {
|
||||
o1 = 6;
|
||||
}
|
||||
|
||||
if (o.isMulticolored()) {
|
||||
|
|
@ -468,8 +401,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
o2 = 4;
|
||||
} else if (o.isWhite()) {
|
||||
o2 = 5;
|
||||
} else if (o.isGold()) {
|
||||
o2 = 6;
|
||||
}
|
||||
|
||||
return o1 - o2;
|
||||
|
|
@ -482,7 +413,6 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
* @return null or
|
||||
*/
|
||||
public ColoredManaSymbol getOneColoredManaSymbol() {
|
||||
|
||||
if (isMulticolored()) {
|
||||
throw new IllegalStateException("Found multicolor object, but was waiting for simple color.");
|
||||
}
|
||||
|
|
@ -503,21 +433,10 @@ public class ObjectColor implements Serializable, Copyable<ObjectColor>, Compara
|
|||
return ColoredManaSymbol.W;
|
||||
}
|
||||
|
||||
if (isGold()) {
|
||||
return ColoredManaSymbol.O;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static List<ObjectColor> getAllColors() {
|
||||
List<ObjectColor> colors = new ArrayList<>();
|
||||
colors.add(ObjectColor.WHITE);
|
||||
colors.add(ObjectColor.BLUE);
|
||||
colors.add(ObjectColor.BLACK);
|
||||
colors.add(ObjectColor.RED);
|
||||
colors.add(ObjectColor.GREEN);
|
||||
|
||||
colors.add(ObjectColor.GOLD);
|
||||
return colors;
|
||||
return allColors;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,20 +18,27 @@ import java.util.Objects;
|
|||
public class CardsLeaveGraveyardTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
private final FilterCard filter;
|
||||
private final boolean yourTurn;
|
||||
|
||||
public CardsLeaveGraveyardTriggeredAbility(Effect effect) {
|
||||
this(effect, StaticFilters.FILTER_CARD_CARDS);
|
||||
}
|
||||
|
||||
public CardsLeaveGraveyardTriggeredAbility(Effect effect, FilterCard filter) {
|
||||
this(effect, filter, false);
|
||||
}
|
||||
|
||||
public CardsLeaveGraveyardTriggeredAbility(Effect effect, FilterCard filter, boolean yourTurn) {
|
||||
super(Zone.BATTLEFIELD, effect, false);
|
||||
this.filter = filter;
|
||||
setTriggerPhrase("Whenever one or more " + filter + " leave your graveyard, ");
|
||||
this.yourTurn = yourTurn;
|
||||
setTriggerPhrase("Whenever one or more " + filter + " leave your graveyard" + (yourTurn ? " during your turn" : "") + ", ");
|
||||
}
|
||||
|
||||
private CardsLeaveGraveyardTriggeredAbility(final CardsLeaveGraveyardTriggeredAbility ability) {
|
||||
super(ability);
|
||||
this.filter = ability.filter;
|
||||
this.yourTurn = ability.yourTurn;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -41,6 +48,9 @@ public class CardsLeaveGraveyardTriggeredAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (yourTurn && !isControlledBy(game.getActivePlayerId())) {
|
||||
return false;
|
||||
}
|
||||
ZoneChangeGroupEvent zEvent = (ZoneChangeGroupEvent) event;
|
||||
return zEvent != null
|
||||
&& Zone.GRAVEYARD == zEvent.getFromZone()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
package mage.abilities.condition.common;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.keyword.BeholdDragonAbility;
|
||||
import mage.game.Game;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
/**
|
||||
* Checks if the spell was cast with the alternate behold a Dragon cost
|
||||
*
|
||||
* @author TheElk801
|
||||
*/
|
||||
public enum BeheldDragonCondition implements Condition {
|
||||
instance;
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
return CardUtil.checkSourceCostsTagExists(game, source, BeholdDragonAbility.BEHOLD_DRAGON_ACTIVATION_VALUE_KEY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Dragon was beheld";
|
||||
}
|
||||
}
|
||||
|
|
@ -4,19 +4,24 @@ import mage.ObjectColor;
|
|||
import mage.abilities.Ability;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.predicate.Predicate;
|
||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class MostCommonColorCondition implements Condition {
|
||||
|
||||
protected final ObjectColor compareColor;
|
||||
protected final boolean isMono;
|
||||
protected final Predicate predicate;
|
||||
protected final FilterPermanent filter;
|
||||
|
||||
public MostCommonColorCondition(ObjectColor color) {
|
||||
this(color, false, null);
|
||||
|
|
@ -26,50 +31,38 @@ public class MostCommonColorCondition implements Condition {
|
|||
public MostCommonColorCondition(ObjectColor color, boolean isMono, Predicate predicate) {
|
||||
this.compareColor = color;
|
||||
this.isMono = isMono;
|
||||
this.predicate = predicate;
|
||||
if (predicate == null) {
|
||||
this.filter = StaticFilters.FILTER_PERMANENT;
|
||||
} else {
|
||||
this.filter = new FilterPermanent();
|
||||
this.filter.add(predicate);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
FilterPermanent[] colorFilters = new FilterPermanent[6];
|
||||
int i = 0;
|
||||
for (ObjectColor color : ObjectColor.getAllColors()) {
|
||||
colorFilters[i] = new FilterPermanent();
|
||||
colorFilters[i].add(new ColorPredicate(color));
|
||||
if (predicate != null) {
|
||||
colorFilters[i].add(predicate);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
int[] colorCounts = new int[6];
|
||||
i = 0;
|
||||
for (ObjectColor color : ObjectColor.getAllColors()) {
|
||||
colorFilters[i].add(new ColorPredicate(color));
|
||||
colorCounts[i] = game.getBattlefield().count(colorFilters[i], source.getControllerId(), source, game);
|
||||
i++;
|
||||
}
|
||||
int max = 0;
|
||||
for (i = 0; i < 5; i++) {
|
||||
if (colorCounts[i] > max) {
|
||||
max = colorCounts[i] * 1;
|
||||
Map<String, Integer> colorMap = new HashMap<>();
|
||||
for (Permanent permanent : game
|
||||
.getBattlefield()
|
||||
.getActivePermanents(filter, source.getControllerId(), source, game)) {
|
||||
for (char c : permanent.getColor(game).toString().toCharArray()) {
|
||||
colorMap.compute("" + c, CardUtil::setOrIncrementValue);
|
||||
}
|
||||
}
|
||||
i = 0;
|
||||
ObjectColor commonest = new ObjectColor();
|
||||
for (ObjectColor color : ObjectColor.getAllColors()) {
|
||||
if (colorCounts[i] == max) {
|
||||
commonest.addColor(color);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if (compareColor.shares(commonest)) {
|
||||
if (isMono) {
|
||||
return !commonest.isMulticolored();
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
int most = colorMap
|
||||
.values()
|
||||
.stream()
|
||||
.mapToInt(x -> x)
|
||||
.max()
|
||||
.orElse(0);
|
||||
ObjectColor common = new ObjectColor(
|
||||
colorMap.entrySet()
|
||||
.stream()
|
||||
.filter(e -> e.getValue() == most)
|
||||
.map(Map.Entry::getKey)
|
||||
.collect(Collectors.joining())
|
||||
);
|
||||
return common.shares(compareColor) && (!isMono || common.getColorCount() == 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -1,27 +1,37 @@
|
|||
package mage.abilities.effects.common;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.constants.Outcome;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.token.Token;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* @author weirddan455
|
||||
*/
|
||||
public class CreateTokenAttachSourceEffect extends CreateTokenEffect {
|
||||
|
||||
private final boolean optional;
|
||||
|
||||
public CreateTokenAttachSourceEffect(Token token) {
|
||||
this(token, ", then");
|
||||
}
|
||||
|
||||
public CreateTokenAttachSourceEffect(Token token, String innerConcat) {
|
||||
this(token, innerConcat, false);
|
||||
}
|
||||
|
||||
public CreateTokenAttachSourceEffect(Token token, String innerConcat, boolean optional) {
|
||||
super(token);
|
||||
staticText = staticText.concat(innerConcat + " attach {this} to it");
|
||||
this.optional = optional;
|
||||
staticText = staticText.concat(innerConcat + (optional ? " you may" : "") + " attach {this} to it");
|
||||
}
|
||||
|
||||
private CreateTokenAttachSourceEffect(final CreateTokenAttachSourceEffect effect) {
|
||||
super(effect);
|
||||
this.optional = effect.optional;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -32,11 +42,22 @@ public class CreateTokenAttachSourceEffect extends CreateTokenEffect {
|
|||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
super.apply(game, source);
|
||||
Permanent token = game.getPermanent(this.getLastAddedTokenIds().stream().findFirst().orElse(null));
|
||||
if (token != null) {
|
||||
Permanent token = this
|
||||
.getLastAddedTokenIds()
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(game::getPermanent)
|
||||
.orElse(null);
|
||||
if (token == null || optional
|
||||
&& !Optional
|
||||
.ofNullable(game.getPlayer(source.getControllerId()))
|
||||
.map(player -> player.chooseUse(
|
||||
Outcome.BoostCreature, "Attach the equipment to the token?", source, game
|
||||
))
|
||||
.orElse(false)) {
|
||||
return false;
|
||||
}
|
||||
token.addAttachment(source.getSourceId(), source, game);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,75 @@
|
|||
package mage.abilities.effects.mana;
|
||||
|
||||
import mage.Mana;
|
||||
import mage.abilities.Ability;
|
||||
import mage.choices.Choice;
|
||||
import mage.constants.ManaType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class AddManaFromColorChoicesEffect extends ManaEffect {
|
||||
|
||||
private final List<ManaType> manaTypes = new ArrayList<>();
|
||||
private final List<Mana> netMana = new ArrayList<>();
|
||||
|
||||
public AddManaFromColorChoicesEffect(ManaType... manaTypes) {
|
||||
super();
|
||||
for (ManaType manaType : manaTypes) {
|
||||
this.manaTypes.add(manaType);
|
||||
}
|
||||
this.manaTypes
|
||||
.stream()
|
||||
.map(CardUtil::manaTypeToColoredManaSymbol)
|
||||
.map(Mana::new)
|
||||
.forEach(netMana::add);
|
||||
staticText = "add " + CardUtil
|
||||
.concatWithOr(this.netMana.stream().map(s -> "{" + s + '}').collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
private AddManaFromColorChoicesEffect(final AddManaFromColorChoicesEffect effect) {
|
||||
super(effect);
|
||||
this.manaTypes.addAll(effect.manaTypes);
|
||||
effect.netMana.stream().map(Mana::copy).forEach(this.netMana::add);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AddManaFromColorChoicesEffect copy() {
|
||||
return new AddManaFromColorChoicesEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Mana> getNetMana(Game game, Ability source) {
|
||||
return netMana;
|
||||
}
|
||||
|
||||
public List<Mana> getNetMana() {
|
||||
return netMana;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mana produceMana(Game game, Ability source) {
|
||||
if (game == null || manaTypes.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
Choice choice = ManaType.getChoiceOfManaTypes(manaTypes, false);
|
||||
if (choice.getChoices().size() <= 1) {
|
||||
choice.setChoice(choice.getChoices().iterator().next());
|
||||
} else {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
if (player == null || !player.choose(Outcome.PutManaInPool, choice, game)) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
ManaType chosenType = ManaType.findByName(choice.getChoice());
|
||||
return chosenType == null ? null : new Mana(chosenType);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
package mage.abilities.keyword;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.SpellAbility;
|
||||
import mage.abilities.StaticAbility;
|
||||
import mage.abilities.costs.*;
|
||||
import mage.abilities.costs.common.BeholdDragonCost;
|
||||
import mage.abilities.costs.common.CollectEvidenceCost;
|
||||
import mage.abilities.hint.common.EvidenceHint;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Zone;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class BeholdDragonAbility extends StaticAbility implements OptionalAdditionalSourceCosts {
|
||||
|
||||
private static final String promptString = "Behold a Dragon";
|
||||
private static final String keywordText = "As an additional cost to cast this spell, you may behold a Dragon";
|
||||
private static final String reminderText = "Choose a Dragon you control or reveal a Dragon card from your hand.";
|
||||
private final String rule;
|
||||
|
||||
public static final String BEHOLD_DRAGON_ACTIVATION_VALUE_KEY = "beholdDragonActivation";
|
||||
|
||||
protected OptionalAdditionalCost additionalCost;
|
||||
|
||||
public static OptionalAdditionalCost makeCost() {
|
||||
OptionalAdditionalCost cost = new OptionalAdditionalCostImpl(keywordText , reminderText, new BeholdDragonCost());
|
||||
cost.setRepeatable(false);
|
||||
return cost;
|
||||
}
|
||||
public BeholdDragonAbility( ) {
|
||||
super(Zone.STACK, null);
|
||||
this.additionalCost = makeCost();
|
||||
this.rule = additionalCost.getName() + ". " + additionalCost.getReminderText();
|
||||
this.setRuleAtTheTop(true);
|
||||
}
|
||||
|
||||
private BeholdDragonAbility(final BeholdDragonAbility ability) {
|
||||
super(ability);
|
||||
this.rule = ability.rule;
|
||||
this.additionalCost = ability.additionalCost.copy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BeholdDragonAbility copy() {
|
||||
return new BeholdDragonAbility(this);
|
||||
}
|
||||
|
||||
public void resetCost() {
|
||||
if (additionalCost != null) {
|
||||
additionalCost.reset();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addOptionalAdditionalCosts(Ability ability, Game game) {
|
||||
if (!(ability instanceof SpellAbility)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = game.getPlayer(ability.getControllerId());
|
||||
if (player == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.resetCost();
|
||||
boolean canPay = additionalCost.canPay(ability, this, ability.getControllerId(), game);
|
||||
if (!canPay || !player.chooseUse(Outcome.Exile, promptString + '?', ability, game)) {
|
||||
return;
|
||||
}
|
||||
|
||||
additionalCost.activate();
|
||||
for (Cost cost : ((Costs<Cost>) additionalCost)) {
|
||||
ability.getCosts().add(cost.copy());
|
||||
}
|
||||
ability.setCostsTag(BEHOLD_DRAGON_ACTIVATION_VALUE_KEY, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCastMessageSuffix() {
|
||||
return additionalCost.getCastSuffixMessage(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return rule;
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue