From fa7a0daae161463c6ea0744f95b95236566aa701 Mon Sep 17 00:00:00 2001 From: Vittorio Alfieri Date: Mon, 20 Dec 2021 18:55:54 +0100 Subject: [PATCH] Added Y22 set, improved Android downloader for Y22 set, added new restriction "librarycast" to check if a card has been casted from library, added new keyword "startingplayer" to retrieve who was the starting player, added a new ability "nodamageremoved" to avoid damage is removed from a card (e.g. "Patient Zero"), fixed a possbile crash when using "andability" option in "moverandom" ability (e.g. cards with seek abilites), added "myname" option to conjure "ability" to refer the orginal source card name (e.g. "Clone Crafter"), added new zone definitions "myhandlibrary" and "opponenthandlibrary" to refer same time hand and library zone of a player, added new ability "nonight" to avoid it can become night (e.g. "Angel of Eternal Dawn"), improved all cards with "it becomes night" ability. --- CHANGELOG.md | 5 +- .../src/net/wagic/utils/ImgDownloader.java | 21 +- projects/mtg/bin/Res/sets/Y22/_cards.dat | 347 ++++++++++++++++++ .../bin/Res/sets/primitives/borderline.txt | 80 ++-- .../bin/Res/sets/primitives/planeswalkers.txt | 78 +++- projects/mtg/include/MTGDefinitions.h | 4 +- projects/mtg/src/AllAbilities.cpp | 5 +- projects/mtg/src/GameObserver.cpp | 2 +- projects/mtg/src/MTGAbility.cpp | 17 + projects/mtg/src/MTGDefinitions.cpp | 4 +- projects/mtg/src/TargetChooser.cpp | 10 + projects/mtg/src/WParsedInt.cpp | 5 + 12 files changed, 522 insertions(+), 56 deletions(-) create mode 100644 projects/mtg/bin/Res/sets/Y22/_cards.dat diff --git a/CHANGELOG.md b/CHANGELOG.md index 8be20b84f..9fd0723e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,11 @@ ## [master] (https://github.com/WagicProject/wagic/tree/master) +### 20/12/21 +- *Committed:* Added Y22 set, improved Android downloader for Y22 set, added new restriction "librarycast" to check if a card has been casted from library, added new keyword "startingplayer" to retrieve who was the starting player, added a new ability "nodamageremoved" to avoid damage is removed from a card (e.g. "Patient Zero"), fixed a possbile crash when using "andability" option in "moverandom" ability (e.g. cards with seek abilites), added "myname" option to conjure "ability" to refer the orginal source card name (e.g. "Clone Crafter"), added new zone definitions "myhandlibrary" and "opponenthandlibrary" to refer same time hand and library zone of a player, added new ability "nonight" to avoid it can become night (e.g. "Angel of Eternal Dawn"), improved all cards with "it becomes night" ability. ([Vitty85](https://github.com/Vitty85)) + ### 18/12/21 -- *Committed:* Fixed several primitives, added a new Commander Deck for AI, Fixed an issue on "blink" return ability (e.g. "Otherworldly Journey"), improved "exerted" trigger adding "turnlimited" option, added a new keyword "losesatype" to remove a specific type from a card (e.g. "Conversion"), improved "vanishing", "fading" and "bloodthirst" keywords in order to allow the usage of variables (e.g. "Tidewalker"), added new triggers "poisonedof" and "poisonedfoeof" to handle the event when a player gets a poison counter, added new keywords "countershroud" to avoid a card can get any kind of counter, added new keywords "expshroud" and "energyshroud" to avoid a player can get one of those counters, added new option "uent" for "transforms" keyword ability to allow transformation effects end at the end of your next turn, fixed an issue on "swap" keyword when a non-creature card is firstly transformed into a creature (e.g. "Wandering Fumarole"). ([Vitty85](https://github.com/Vitty85)) +- *Committed:* Fixed several primitives, added a new Commander Deck for AI, Fixed an issue on "blink" return ability (e.g. "Otherworldly Journey"), improved "exerted" trigger adding "turnlimited" option, added a new keyword "losesatype" to remove a specific type from a card (e.g. "Conversion"), improved "vanishing", "fading" and "bloodthirst" keywords in order to allow the usage of variables (e.g. "Tidewalker"), added new triggers "poisonedof" and "poisonedfoeof" to handle the event when a player gets a poison counter, added new keywords "countershroud" to avoid a card can get any kind of counter, added new keywords "expshroud" and "energyshroud" to avoid a player can get one of those counters, added new option "uent" for "transforms" keyword ability to allow transformation effects end at the end of your next turn, fixed an issue on "swap" keyword when a non-creature card is firstly transformed into a creature (e.g. "Wandering Fumarole"). https://github.com/WagicProject/wagic/commit/7fa03e620dc25732ef9e1d4d7eb1b174c8382bd3 ([Vitty85](https://github.com/Vitty85)) ### 09/12/21 - *Committed:* Fixes to primitives. https://github.com/WagicProject/wagic/commit/8551f556364d5eae66fe72fc81753361f28244e7 ([EduardoMunozGomez](https://github.com/EduardoMunozGomez)) diff --git a/projects/mtg/Android/src/net/wagic/utils/ImgDownloader.java b/projects/mtg/Android/src/net/wagic/utils/ImgDownloader.java index 9e58d01d2..78229b535 100644 --- a/projects/mtg/Android/src/net/wagic/utils/ImgDownloader.java +++ b/projects/mtg/Android/src/net/wagic/utils/ImgDownloader.java @@ -1219,7 +1219,7 @@ public class ImgDownloader { cardurl = "https://img.scryfall.com/cards/large/front/a/c/acd51eed-bd5a-417a-811d-fbd1c08a3715.jpg?1561757812"; else if(id.equals("17955")) cardurl = "https://img.scryfall.com/cards/large/front/b/8/b86ac828-7b49-4663-a718-99fcac904568.jpg?1561756381"; - else if(id.equals("476097t") || id.equals("293685t") || id.equals("293652t") || id.equals("296820t")) //Zombie 2/2 + else if(id.equals("476097t") || id.equals("293685t") || id.equals("293652t") || id.equals("296820t") || id.equals("297499t")) //Zombie 2/2 cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/b/5/b5bd6905-79be-4d2c-a343-f6e6a181b3e6.jpg?1562844819"; else if(id.equals("999901t")) //Monarch Token cardurl = "https://img.scryfall.com/cards/large/front/4/0/40b79918-22a7-4fff-82a6-8ebfe6e87185.jpg?1561897497"; @@ -2353,7 +2353,8 @@ public class ImgDownloader { id.equals("297363t") || id.equals("297358t") || id.equals("297351t") || id.equals("297339t") || id.equals("297330t") || id.equals("297329t") || id.equals("297327t") || id.equals("297317t") || id.equals("297316t") || id.equals("297307t") || id.equals("297308t") || id.equals("297304t") || id.equals("297292t") || id.equals("297290t") || id.equals("297287t") || - id.equals("297271t") || id.equals("297268t") || id.equals("297267t") || id.equals("297256t") || id.equals("297197t")) //Blood + id.equals("297271t") || id.equals("297268t") || id.equals("297267t") || id.equals("297256t") || id.equals("297197t") || + id.equals("297506t") || id.equals("297511t")) //Blood cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/a/6/a6f374bc-cd29-469f-808a-6a6c004ee8aa.jpg?1636041263"; else if(id.equals("541110t") || id.equals("297438t")) // Vampire 1/1 Black&White cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/7/e/7eee78d3-c65f-4454-bd3c-1c55388422f5.jpg?1636630265"; @@ -2757,6 +2758,12 @@ public class ImgDownloader { cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/6/e/6e2ae34f-4558-46e0-95c5-e00d813fa355.jpg?1636629936"; else if (id.equals("297227t")) //Zombie */* blue cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/5/3/539f4b60-667b-469d-9191-eacaad5c0db1.jpg?1636629909"; + else if(id.equals("297522t")) // 1/1 Devil red + cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/3/e/3e78c4b8-371b-43d7-a315-fb299704aa60.jpg?1562086867"; + else if(id.equals("297521")) + cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/2/f/2f986406-bfe3-4e59-bcb6-839ef5f1fbc4.jpg?1638919699"; + else if(id.equals("297543")) + cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/back/2/f/2f986406-bfe3-4e59-bcb6-839ef5f1fbc4.jpg?1638919699"; return cardurl; } @@ -3676,7 +3683,7 @@ public class ImgDownloader { set.equals("UNH") || set.equals("XLN") || set.equals("SOI") || set.equals("SOK") || set.equals("BOK") || set.equals("CHK") || set.equals("ZNR") || set.equals("KHM") || set.equals("STX") || set.equals("MID") || set.equals("CC2") || set.equals("VOW") || - set.equals("DBL")) + set.equals("DBL") || set.equals("Y22")) rarity = ""; if(id != null && !rarity.equals("t") && (negativeId || id.equals("209162") || id.equals("209163") || id.equals("401721") || id.equals("401722") || id.equals("999902"))) @@ -3937,7 +3944,7 @@ public class ImgDownloader { || scryset.equals("ATH") || scryset.equals("HA4") || scryset.equals("TSR") || scryset.equals("HA5") || scryset.equals("H1R") || scryset.equals("HTR18") || scryset.equals("HTR19") || scryset.equals("DKM") || scryset.equals("S00") || scryset.equals("XLN") || scryset.equals("SOI") || scryset.equals("UST") || scryset.equals("PLG21") || scryset.equals("J21") || scryset.equals("CC2") - || scryset.equals("Q06") || scryset.equals("DBL")){ + || scryset.equals("Q06") || scryset.equals("DBL") || scryset.equals("Y22")){ try { doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get(); Elements outlinks = doc.select("body a"); @@ -4104,7 +4111,7 @@ public class ImgDownloader { && !scryset.equals("ATH") && !scryset.equals("HA4") && !scryset.equals("TSR") && !scryset.equals("HA5") && !scryset.equals("H1R") && !scryset.equals("HTR18") && !scryset.equals("HTR19") && !scryset.equals("DKM") && !scryset.equals("S00") && !scryset.equals("XLN") && !scryset.equals("SOI") && !scryset.equals("UST") && !scryset.equals("PLG21") && !scryset.equals("J21") && !scryset.equals("CC2") - && !scryset.equals("Q06") && !scryset.equals("DBL")){ + && !scryset.equals("Q06") && !scryset.equals("DBL") && !scryset.equals("Y22")){ try { doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get(); Elements outlinks = doc.select("body a"); @@ -4222,7 +4229,7 @@ public class ImgDownloader { && !scryset.equals("ATH") && !scryset.equals("HA4") && !scryset.equals("TSR") && !scryset.equals("HA5") && !scryset.equals("H1R") && !scryset.equals("HTR18") && !scryset.equals("HTR19") && !scryset.equals("DKM") && !scryset.equals("S00") && !scryset.equals("XLN") && !scryset.equals("SOI") && !scryset.equals("UST") && !scryset.equals("PLG21") && !scryset.equals("J21") && !scryset.equals("CC2") - && !scryset.equals("Q06") && !scryset.equals("DBL")){ + && !scryset.equals("Q06") && !scryset.equals("DBL") && !scryset.equals("Y22")){ try { doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get(); } catch (Exception e) { @@ -4392,7 +4399,7 @@ public class ImgDownloader { || scryset.equals("HA4") || scryset.equals("TSR") || scryset.equals("HA5") || scryset.equals("H1R") || scryset.equals("HTR18") || scryset.equals("HTR19") || scryset.equals("DKM") || scryset.equals("S00") || scryset.equals("XLN") || scryset.equals("SOI") || scryset.equals("UST") || scryset.equals("PLG21") || scryset.equals("J21") || scryset.equals("CC2") || scryset.equals("Q06") - || scryset.equals("DBL")){ + || scryset.equals("DBL") || scryset.equals("Y22")){ Elements metadata = doc.select("head meta"); if(metadata != null) { for (int j = 0; j < metadata.size(); j++){ diff --git a/projects/mtg/bin/Res/sets/Y22/_cards.dat b/projects/mtg/bin/Res/sets/Y22/_cards.dat new file mode 100644 index 000000000..16ad91f5d --- /dev/null +++ b/projects/mtg/bin/Res/sets/Y22/_cards.dat @@ -0,0 +1,347 @@ +[meta] +author=Wagic Team +name=Alchemy: Innistrad +orderindex=ONL-E.Y22 +year=2021-12-09 +total=68 +[/meta] +[card] +primitive=Devil +id=-297522 +rarity=T +[/card] +[card] +primitive=Blood +id=-297511 +rarity=T +[/card] +[card] +primitive=Blood +id=-297506 +rarity=T +[/card] +[card] +primitive=Zombie +id=-297499 +rarity=T +[/card] +[card] +primitive=Angel of Eternal Dawn +id=297480 +rarity=R +[/card] +[card] +primitive=Angel of Unity +id=297481 +rarity=U +[/card] +[card] +primitive=Captain Eberhart +id=297482 +rarity=M +[/card] +[card] +primitive=Divine Purge +id=297483 +rarity=R +[/card] +[card] +primitive=Ethereal Escort +id=297484 +rarity=M +[/card] +[card] +primitive=Expedition Supplier +id=297485 +rarity=R +[/card] +[card] +primitive=Faithful Disciple +id=297486 +rarity=U +[/card] +[card] +primitive=Inquisitor Captain +id=297487 +rarity=R +[/card] +[card] +primitive=Sigardian Evangel +id=297488 +rarity=R +[/card] +[card] +primitive=Slayer's Bounty +id=297489 +rarity=R +[/card] +[card] +primitive=Suntail Squadron +id=297490 +rarity=R +[/card] +[card] +primitive=Absorb Energy +id=297491 +rarity=R +[/card] +[card] +primitive=Unexpected Conversion +id=297492 +rarity=R +[/card] +[card] +primitive=Clone Crafter +id=297493 +rarity=R +[/card] +[card] +primitive=Discover the Formula +id=297494 +rarity=R +[/card] +[card] +primitive=Geist of Regret +id=297495 +rarity=M +[/card] +[card] +primitive=Geistchanneler +id=297496 +rarity=R +[/card] +[card] +primitive=Kindred Denial +id=297497 +rarity=U +[/card] +[card] +primitive=Obsessive Collector +id=297498 +rarity=R +[/card] +[card] +primitive=Oglor, Devoted Assistant +id=297499 +rarity=M +[/card] +[card] +primitive=Rimewall Protector +id=297500 +rarity=U +[/card] +[card] +primitive=Sinister Reflections +id=297501 +rarity=R +[/card] +[card] +primitive=Tireless Angler +id=297502 +rarity=R +[/card] +[card] +primitive=Cursebound Witch +id=297503 +rarity=U +[/card] +[card] +primitive=Assemble from Parts +id=297504 +rarity=R +[/card] +[card] +primitive=Break Expectations +id=297505 +rarity=U +[/card] +[card] +primitive=Citystalker Connoisseur +id=297506 +rarity=R +[/card] +[card] +primitive=Gutmorn, Pactbound Servant +id=297507 +rarity=M +[/card] +[card] +primitive=Patient Zero +id=297508 +rarity=R +[/card] +[card] +primitive=Predatory Sludge +id=297509 +rarity=R +[/card] +[card] +primitive=Puppet Raiser +id=297510 +rarity=M +[/card] +[card] +primitive=Sanguine Brushstroke +id=297511 +rarity=R +[/card] +[card] +primitive=Sap Vitality +id=297512 +rarity=R +[/card] +[card] +primitive=Veteran Ghoulcaller +id=297513 +rarity=R +[/card] +[card] +primitive=Arms Scavenger +id=297514 +rarity=R +[/card] +[card] +primitive=Bloodrage Alpha +id=297515 +rarity=R +[/card] +[card] +primitive=Brittle Blast +id=297516 +rarity=U +[/card] +[card] +primitive=Conductive Current +id=297517 +rarity=R +[/card] +[card] +primitive=Electrostatic Blast +id=297518 +rarity=R +[/card] +[card] +primitive=Fearsome Whelp +id=297519 +rarity=U +[/card] +[card] +primitive=Frenzied Geistblaster +id=297520 +rarity=R +[/card] +[card] +primitive=Rahilda, Wanted Cutthroat +id=297521 +rarity=M +[/card] +[card] +primitive=Rahilda, Feral Outlaw +id=297543 +rarity=T +[/card] +[card] +primitive=Tibalt, Wicked Tormentor +id=297522 +rarity=M +[/card] +[card] +primitive=Toralf's Disciple +id=297523 +rarity=R +[/card] +[card] +primitive=Town-razer Tyrant +id=297524 +rarity=R +[/card] +[card] +primitive=Antique Collector +id=297525 +rarity=R +[/card] +[card] +primitive=Garruk, Wrath of the Wilds +id=297526 +rarity=M +[/card] +[card] +primitive=Geistpack Alpha +id=297527 +rarity=R +[/card] +[card] +primitive=Grizzled Huntmaster +id=297528 +rarity=R +[/card] +[card] +primitive=Hinterland Chef +id=297529 +rarity=R +[/card] +[card] +primitive=Hollowhenge Wrangler +id=297530 +rarity=R +[/card] +[card] +primitive=Ishkanah, Broodmother +id=297531 +rarity=M +[/card] +[card] +primitive=Lupine Harbingers +id=297532 +rarity=R +[/card] +[card] +primitive=Ravenous Pursuit +id=297533 +rarity=R +[/card] +[card] +primitive=Settle the Wilds +id=297534 +rarity=U +[/card] +[card] +primitive=Tenacious Pup +id=297535 +rarity=U +[/card] +[card] +primitive=Begin Anew +id=297536 +rarity=R +[/card] +[card] +primitive=Gitrog, Horror of Zhava +id=297537 +rarity=R +[/card] +[card] +primitive=Key to the Archive +id=297538 +rarity=R +[/card] +[card] +primitive=Soulstealer Axe +id=297539 +rarity=U +[/card] +[card] +primitive=Wickerwing Effigy +id=297540 +rarity=R +[/card] +[card] +primitive=Ominous Traveler +id=297541 +rarity=R +[/card] +[card] +primitive=Forsaken Crossroads +id=297542 +rarity=R +[/card] diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index f6077cc5e..8c48aa08e 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -4736,7 +4736,7 @@ toughness=3 name=Ballista Wielder abilities=nightbound backside=Ballista Watcher -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto={2}{R}:name(Damage player) target(player) damage:1 auto={2}{R}:name(Damage planeswalker) target(planeswalker) damage:1 auto={2}{R}:name(Damage creature) target(creature) damage:1 && transforms((,newability[cantblock])) ueout @@ -4807,7 +4807,7 @@ toughness=3 name=Baneclaw Marauder abilities=nightbound backside=Baneblade Scoundrel -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=_DIES_name(Lose 1 life) life:-1 controller auto=@combat(blocked,turnlimited) source(this) from(creature|opponentbattlefield):name(Blocking creature gets -1/-1) all(trigger[from]) -1/-1 ueot text=Whenever Baneclaw Marauder becomes blocked, creatures blocking it get -1/-1 until end of turn. -- Whenever a creature blocking Baneclaw Marauder dies, its controller loses 1 life. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Baneblade Scoundrel @@ -7523,7 +7523,7 @@ toughness=2 name=Blossom-Clad Werewolf abilities=nightbound backside=Weaver of Blossoms -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto={T}:add{R}{R} auto={T}:add{W}{W} auto={T}:add{B}{B} @@ -16573,7 +16573,7 @@ toughness=* name=Day abilities=shroud,indestructible,doublefacedeath,nofizzle backside=Night -auto=@each endofturn:name(Check if day or night) moveto(opponentbattlefield) and!( if thisturn(*|opponentstack)~equalto~0 then name(It becomes night next turn) name(It becomes night next turn) phaseaction[untap once sourceinplay] flip(backside) )! +auto=@each endofturn:name(Check if day or night) moveto(opponentbattlefield) and!( if thisturn(*|opponentstack)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night next turn) name(It becomes night next turn) name(It becomes night next turn) phaseaction[untap once sourceinplay] flip(backside) )! auto=lord(*[nightbound]|battlefield) flip(backside) text=(If it becomes day or night or if a daybound permanent enters the battlefield, track day/night for the rest of the game.) -- As it becomes day, transform all nightbound permanents. -- If a player casts no spells during their own turn, it becomes night next turn. type=Emblem @@ -18578,7 +18578,7 @@ toughness=2 name=Dire-Strain Anarchist abilities=nightbound,menace,haste backside=Volatile Arsonist -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=@combat(attacking) source(this):may name(Damage planeswalker) damage:2 target(planeswalker) auto=@combat(attacking) source(this):may name(Damage player) damage:2 target(player) auto=@combat(attacking) source(this):may name(Damage creature) damage:2 target(creature) @@ -18593,7 +18593,7 @@ toughness=5 name=Dire-Strain Brawler abilities=vigilance,nightbound backside=Tireless Hauler -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) text=Vigilance -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Tireless Hauler type=Creature subtype=Werewolf @@ -18605,7 +18605,7 @@ toughness=6 name=Dire-Strain Demolisher abilities=nightbound backside=Burly Breaker -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=@targeted(this) from(*|opponentstack):choice name(This spell costs 3 more) name(This spell costs 3 more) target(*|opponentstack) transforms((,newability[pay[[{3}]] name(pay 3 mana) donothing?fizzle])) oneshot text=Ward {3} (Whenever this creature becomes the target of a spell or ability an opponent controls, counter it unless that player pays {3}.) -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Burly Breaker type=Creature @@ -24203,7 +24203,7 @@ toughness=4 name=Fangblade Eviscerator abilities=nightbound backside=Fangblade Brigand -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto={1}{R}:name(Gets 1/0 and first strike) transforms((,newability[1/0],newability[first strike])) ueot auto={4}{R}:name(All creatures gets 2/0) all(creature|mybattlefield) transforms((,newability[2/0])) ueot text={1}{R}: Fangblade Eviscerator gets +1/+0 and gains first strike until end of turn. -- {4}{R}: Creatures you control get +2/+0 until end of turn. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Fangblade Brigand @@ -24498,7 +24498,7 @@ toughness=1 name=Fearsome Werewolf abilities=nightbound,menace backside=Fearful Villager -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) text=Menace (This creature can't be blocked except by two or more creatures.) -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Fearful Villager type=Creature subtype=Werewolf @@ -27021,7 +27021,7 @@ toughness=4 name=Frenzied Trapbreaker abilities=nightbound backside=Outland Liberator -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto={1}{S}:name(Destroy artifact or enchantment) target(*[artifact;enchantment]|battlefield) destroy auto=@combat(attacking) source(this):name(Destroy artifact or enchantment) target(*[artifact;enchantment]|opponentbattlefield) destroy text={1}, Sacrifice Frenzied Trapbreaker: Destroy target artifact or enchantment. -- Whenever Frenzied Trapbreaker attacks, destroy target artifact or enchantment defending player controls. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Outland Liberator @@ -30880,7 +30880,7 @@ toughness=5 name=Graveyard Glutton abilities=nightbound backside=Graveyard Trespasser -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=@targeted(this) from(*|opponentstack):choice name(Discard or counter) name(Discard or counter) target(*|opponentstack) transforms((,newability[if type(*|myhand)~equalto~0 then all(this|mystack) fizzle else name(Discard a card) pay[[{0}]] name(Discard a card) target(*|myhand) reject?fizzle])) oneshot auto=may name(Exile 2 cards) target(*|graveyard) moveto(exile) and!( if cantargetcard(*[creature]|*) then life:-1 opponent && life:1 controller )! auto=@combat(attacking) source(this):may name(Exile 2 cards) target(*|graveyard) moveto(exile) and!( if cantargetcard(*[creature]|*) then life:-1 opponent && life:1 controller )! @@ -32683,7 +32683,7 @@ type=Sorcery name=Harvesttide Assailant abilities=trample,nightbound backside=Harvesttide Infiltrator -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) text=Trample -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Harvesttide Infiltrator type=Creature subtype=Werewolf @@ -34112,7 +34112,7 @@ toughness=2 name=Hollowhenge Huntmaster abilities=nightbound,opponentshroud backside=Avabruck Caretaker -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=lord(other *|mybattlefield) opponentshroud auto=@each my combatbegins:name(Put 1/1 counters) all(creature|mybattlefield) counter(1/1,2) text=Hexproof -- Other permanents you control have hexproof. -- At the beginning of combat on your turn, put two +1/+1 counters on each creature you control. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Avabruck Caretaker @@ -34665,7 +34665,7 @@ type=Enchantment name=Howlpack Avenger abilities=nightbound backside=Ill-Tempered Loner -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=@damaged(*|mybattlefield):name(Deals damage) target(player,creature,planeswalker) damage:thatmuch auto={1}{R}:name(Gets 2/0) 2/0 ueot text=Whenever a permanent you control is dealt damage, Howlpack Avenger deals that much damage to any target. -- {1}{R}: Howlpack Avenger gets +2/+0 until end of turn. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Ill-Tempered Loner @@ -36493,7 +36493,7 @@ toughness=4 name=Infested Werewolf abilities=nightbound backside=Infestation Expert -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=token(Insect Tok)*2 auto=@combat(attacking) source(this):name(Create Insects) token(Insect Tok)*2 text=Whenever Infested Werewolf enters the battlefield or attacks, create two 1/1 green Insect creature token. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Infestation Expert @@ -37069,7 +37069,7 @@ toughness=6 [/card] [card] name=Into the Night -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=may name(Discard cards) target(*|myhand) reject and!( draw:1 controller )! auto=draw:1 controller text=It becomes night. Discard any number of cards, then draw that many cards plus one. @@ -40932,7 +40932,7 @@ toughness=4 name=Lambholt Ravager backside=Lambholt Raconteur abilities=nightbound -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=@movedTo(*[-creature]|mystack):name(Deals 2 damage) damage:2 opponent text=Whenever you cast a noncreature spell, Lambholt Ravager deals 2 damage to each opponent. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Lambholt Raconteur mana=null @@ -41517,7 +41517,7 @@ type=Instant name=Leeching Lurker abilities=lifelink,nightbound backside=Curse of Leeches -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) text=Lifelink -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Curse of Leeches type=Creature subtype=Leech Horror @@ -42920,7 +42920,7 @@ toughness=6 name=Lord of the Ulvenwald abilities=nightbound backside=Kessig Naturalist -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=@combat(attacking) source(this):name(Add 1 mana) ability$!name(Choose one) choice name(Add red) add{R} doesntempty _ choice name(Add green) add{G} doesntempty!$ controller auto=lord(other *[werewolf]|myBattlefield) 1/1 text=Other Wolves and Werewolves you control get +1/+1. -- Whenever Lord of the Ulvenwald attacks, add {R} or {G}. Until end of turn, you don't lose this mana as steps and phases end. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Kessig Naturalist @@ -46698,7 +46698,7 @@ toughness=2 name=Moonlit Ambusher abilities=nightbound backside=Oakshade Stalker -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) text=Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Oakshade Stalker type=Creature subtype=Werewolf @@ -46728,7 +46728,7 @@ type=Instant name=Moonrage Brute abilities=first strike,nightbound backside=Brutal Cathar -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=name(Exile a creature) target(creature|opponentbattlefield) (blink)forsrc auto=@targeted(this|myBattlefield) from(*[instant;sorcery]|opponentzones):choice name(This spell costs 3 life more) name(This spell costs 3 life more) target(*[instant;sorcery]|opponentzones) transforms((,newability[pay[[{L:3}]] name(pay 3 life) donothing?fizzle])) oneshot text=First strike -- Ward-Pay 3 life. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn) // Brutal Cathar @@ -58539,7 +58539,7 @@ type=Sorcery name=Riphook Raider backside=Hookhand Mariner abilities=nightbound -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=cantbeblockedby(creature[power<=2]) text=Riphook Raider can't be blocked by creatures with power 2 or less. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Hookhand Mariner color=green @@ -61198,7 +61198,7 @@ toughness=1 name=Savage Packmate abilities=nightbound,trample backside=Child of the Pack -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=lord(other creature|mybattlefield) 1/0 text=Trample -- Other creatures you control get +1/+0. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Child of the Pack type=Creature @@ -62112,7 +62112,7 @@ toughness=2 name=Seafaring Werewolf abilities=unblockable,nightbound backside=Suspicious Stowaway -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=@combatdamaged(player) from(this):name(Draw a card) draw:1 controller text=Seafaring Werewolf can't be blocked. -- Whenever Seafaring Werewolf deals combat damage to a player, draw a card. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Suspicious Stowaway type=Creature @@ -67758,7 +67758,7 @@ toughness=2 name=Spellrune Howler abilities=nightbound backside=Spellrune Painter -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=@movedTo(*[instant;sorcery]|mystack):name(Gets 2/2) 2/2 ueot text=Whenever you cast an instant or sorcery spell, Spellrune Howler gets +2/+2 until end of turn. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Spellrune Painter type=Creature @@ -68913,7 +68913,7 @@ toughness=3 name=Stalking Predator abilities=menace,nightbound backside=Shady Traveler -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) text=Menace (This creature can't be blocked except by two or more creatures.) -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Shady Traveler type=Creature subtype=Werewolf @@ -69863,7 +69863,7 @@ type=Sorcery name=Storm-Charged Slasher abilities=nightbound backside=Reckless Stormseeker -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=@each my combatbegins:name(Creature gets 2/0 and trample) target(creature|mybattlefield) transforms((,newability[2/0],newability[trample])) ueot text=At the beginning of combat on your turn, target creature you control gets +2/+0 and gains trample and haste until end of turn. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Reckless Stormseeker type=Creature @@ -72261,7 +72261,7 @@ toughness=3 name=Tavern Smasher abilities=nightbound backside=Tavern Ruffian -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) text=Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Tavern Ruffian type=Creature subtype=Werewolf @@ -73209,7 +73209,7 @@ name=The Celestus auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes day) activate castcard(noevent named!:Day:!) auto={T}:name(Add 1 mana) ability$!name(Choose color) choice name(Add red mana) add{R} _ choice name(Add green mana) add{G} _ choice name(Add black mana) add{B} _ choice name(Add white mana) add{W} _ choice name(Add blue mana) add{U}!$ controller auto=aslongas(night|battlefield) {3}{T}:name(It becomes day) name(It becomes day) all(*[night]|battlefield) flip(backside) asSorcery -auto=aslongas(day|battlefield) {3}{T}:name(It becomes night) name(It becomes night) all(*[day]|battlefield) flip(backside) asSorcery +auto=aslongas(day|battlefield) this(variable{type:*[nonight]:battlefield}=0) {3}{T}:name(It becomes night) name(It becomes night) all(*[day]|battlefield) flip(backside) asSorcery auto=@transformed(*[day;night]|battlefield):may name(Draw and discard) draw:1 controller && transforms((,newability[name(Discard a card) target(*|myhand) reject])) oneshot auto=@transformed(*[day;night]|battlefield):name(Gain 1 life) life:1 controller text=If it's neither day nor night, it becomes day as The Celestus enters the battlefield. -- {T}: Add one mana of any color. -- {3}, {T}: If it's night, it becomes day. Otherwise, it becomes night. Activate only as a sorcery. -- Whenever day becomes night or night becomes day, you gain 1 life. You may draw a card. If you do, discard a card. @@ -75428,7 +75428,7 @@ toughness=6 name=Tovolar's Packleader abilities=nightbound backside=Tovolar's Huntmaster -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=token(Wolf,Creature Wolf,2/2,green)*2 auto={2}{G}{G}:name(Wolf of werewolf fights) target(other *[wolf;werewolf]|mybattlefield) transforms((,newability[name(Fights another creature) target(other creature|opponentbattlefield) dynamicability])) oneshot text=Whenever Tovolar's Packleader enters the battlefield or attacks, create two 2/2 green Wolf creature tokens. -- {2}{G}{G}: Another target Wolf or Werewolf you control fights target creature you don't control. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Tovolar's Huntmaster @@ -75446,8 +75446,8 @@ restriction=compare(isflipped)~equalto~0 anyzone={0}:doubleside(backside) auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes day) activate castcard(noevent named!:Day:!) auto=@damaged(player) from(*[wolf;werewolf]|mybattlefield):name(Draw a card) draw:1 controller -auto=@each my upkeep restriction{type(*[wolf;werewolf]|mybattlefield)~morethan~2}:name(Transform human werewolves) target(human[werewolf&hasbackside]|myBattlefield) flip(backside) -auto=@each my upkeep restriction{type(*[wolf;werewolf]|mybattlefield)~morethan~2}:name(It becomes night) all(*[day]|mybattlefield) flip(backside) +auto=@each my upkeep restriction{type(*[wolf;werewolf]|mybattlefield)~morethan~2,type(*[nonight]|battlefield)~equalto~0}:name(Transform human werewolves) target(human[werewolf&hasbackside]|myBattlefield) flip(backside) +auto=@each my upkeep restriction{type(*[wolf;werewolf]|mybattlefield)~morethan~2,type(*[nonight]|battlefield)~equalto~0}:name(It becomes night) all(*[day]|mybattlefield) flip(backside) text=Whenever a Wolf or Werewolf you control deals combat damage to a player, draw a card. -- At the beginning of your upkeep, if you control three or more Wolves and/or Werewolves, it becomes night. Then transform any number of Human Werewolves you control. -- Daybound // Tovolar, the Midnight Scourge mana={1}{R}{G} type=Legendary Creature @@ -75459,7 +75459,7 @@ toughness=3 name=Tovolar, the Midnight Scourge abilities=nightbound backside=Tovolar, Dire Overlord -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=@damaged(player) from(*[wolf;werewolf]|mybattlefield):name(Draw a card) draw:1 controller auto={R}{G}:name(X=0) target(*[wolf;werewolf]|mybattlefield) transforms((,newability[trample])) ueot auto={1}{R}{G}:name(X=1) target(*[wolf;werewolf]|mybattlefield) transforms((,newability[1/0],newability[trample])) ueot @@ -77408,7 +77408,7 @@ type=Enchantment [card] name=Unnatural Moonrise flashback={2}{R}{G} -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) else if type(*[day]|battlefield)~equalto~1 then name(It becomes night) all(*[day]|battlefield) flip(backside) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) else if type(*[day]|battlefield)~equalto~1 then name(It becomes night) all(*[day]|battlefield) flip(backside) auto=name(Gets 1/0 and trample) target(creature) transforms((,newability[1/0],newability[trample],newability[@combatdamaged(player) from(this):name(Draw a card) draw:1 controller])) ueot text=It becomes night. Until end of turn, target creature gets +1/+0 and gains trample and has "Whenever this creature deals combat damage to a player, draw a card." -- Flashback {2}{R}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) mana={R}{G} @@ -77487,7 +77487,7 @@ toughness=2 name=Untamed Pup abilities=trample,nightbound backside=Hound Tamer -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto={3}{G}:name(Put 1/1 counter) target(creature) counter(1/1) auto=lord(other *[wolf;werewolf]|myBattlefield) trample text=Trample -- Other Wolves and Werewolves you control have trample. -- {3}{G}: Put a +1/+1 counter on target creature. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Hound Tamer @@ -79159,7 +79159,7 @@ toughness=8 name=Village Reavers abilities=nightbound backside=Village Watch -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=lord(*[wolf;werewolf]|mybattlefield) haste text=Wolves and Werewolves you control have haste. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Village Watch type=Creature @@ -81102,7 +81102,7 @@ type=Enchantment name=Wedding Crasher abilities=nightbound backside=Wolfkin Outcast -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=@movedto(*[wolf:werewolf]|graveyard) from(mybattlefield):name(Draw a card) draw:1 controller text=Whenever Wedding Crasher or another Wolf or Werewolf you control dies, draw a card. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Wolfkin Outcast type=Creature @@ -81563,7 +81563,7 @@ toughness=3 name=Wildsong Howler abilities=nightbound backside=Howlpack Piper -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) aicode=activate target(*[zpos=1]|mylibrary) transforms((,newability[if type(creature[zpos<=5]|mylibrary)~equalto~0 then all(*[zpos<=5]|mylibrary) moveto(myreveal) and!( bottomoflibrary )!],newability[if type(creature[zpos<=5]|mylibrary)~morethan~0 then target(creature[zpos<=5]|mylibrary) moveto(myhand) and!( transforms((,newability[all(*[zpos<=5]|mylibrary) moveto(myreveal) and!( bottomoflibrary )!])) oneshot )! ])) oneshot auto=name(Look top 5 cards) reveal:5 optionone name(Get a creature) target(creature|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend text=Whenever this creature enters the battlefield or transforms into Wildsong Howler, look at the top six cards of your library. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Howlpack Piper @@ -81796,7 +81796,7 @@ toughness=3 name=Wing Shredder abilities=reach,nightbound backside=Bird Admirer -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) text=Reach -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Bird Admirer type=Creature subtype=Human Werewolf @@ -82578,7 +82578,7 @@ toughness=2 name=Wrathful Jailbreaker abilities=nightbound,mustattack backside=Weary Prisoner -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) text=Wrathful Jailbreaker attacks each combat if able. -- Nightbound (If a player casts at least two spells during their own turn, it becomes day next turn.) // Weary Prisoner type=Creature subtype=Werewolf diff --git a/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt b/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt index 899128b2b..93a0f48dd 100644 --- a/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt +++ b/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt @@ -265,7 +265,7 @@ subtype=Arlinn name=Arlinn, the Moon's Fury abilities=nightbound backside=Arlinn, the Pack's Hope -auto=if type(*[day;night]|battlefield)~equalto~0 then name(It becomes night) activate castcard(noevent named!:Night:!) +auto=if type(*[day;night]|battlefield)~equalto~0 then if type(*[nonight]|battlefield)~equalto~0 then name(It becomes night) name(It becomes night) name(It becomes night) activate castcard(noevent named!:Night:!) auto=if compare(hascntloyalty)~equalto~0 then counter(0/0,4,loyalty) auto={C(0/0,2,Loyalty)}:name(+2: Add red and green mana) add{R}{G} auto={C(0/0,0,Loyalty)}:name(0: Becomes werewolf) transforms((Creature Werewolf,setpower=5,settoughness=5,newability[trample],newability[indestructible],newability[haste])) ueot @@ -998,6 +998,31 @@ type=Legendary Planeswalker subtype=Garruk [/card] [card] +name=Garruk, Wrath of the Wilds +auto=counter(0/0,3,loyalty) +auto={C(0/0,1,Loyalty)}:name(+1: Creature perpetually gets 1/1) target(creature|myhand) transforms((,newability[counter(1/1.1.PerpetualPT) notrg],newability[changecost(colorless:-1) forcedalive])) forever +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Mosscoat Goriak) conjure cards(Mosscoat Goriak) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Sylvan Brushstrider) conjure cards(Sylvan Brushstrider) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Murasa Rootgrazer) conjure cards(Murasa Rootgrazer) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Dire Wolf Prowler) conjure cards(Dire Wolf Prowler) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Ferocious Pup) conjure cards(Ferocious Pup) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Pestilent Wolf) conjure cards(Pestilent Wolf) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Garruk's Uprising) conjure cards(Garruk's Uprising) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Dawntreader Elk) conjure cards(Dawntreader Elk) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Nessian Hornbeetle) conjure cards(Nessian Hornbeetle) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Territorial Scythecat) conjure cards(Territorial Scythecat) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Trufflesnout) conjure cards(Trufflesnout) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Wary Okapi) conjure cards(Wary Okapi) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Scurrid Colony) conjure cards(Scurrid Colony) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Barkhide Troll) conjure cards(Barkhide Troll) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-1,Loyalty)}:name(-1: Draft Underdark Basilisk) conjure cards(Underdark Basilisk) zone(myreveal) and!( moveto(myBattlefield) )! +auto={C(0/0,-5,Loyalty)}:name(-3: Your creatures get 3/3) all(creature|myBattlefield) transforms((,newability[3/3],newability[trample])) ueot +text=+1: Choose a creature card in your hand. it perpetually gets +1/+1 and perpetually gains "This spell costs {1} less to cast." -- −1: Draft a card from Garruk, Wrath of the Wild's spellbook and put it onto the battlefield. -- −5: Until end of turn, creatures you control get +3/+3 and gain trample. +mana={2}{G}{G} +type=Legendary Planeswalker +subtype=Garruk +[/card] +[card] name=Garruk Wildspeaker auto=counter(0/0,3,loyalty) auto={C(0/0,1,Loyalty)}:name(+1: untap two lands) untap target(<2>land) @@ -2971,15 +2996,60 @@ subtype=Tibalt [card] name=Tibalt, the Fiend-Blooded auto=counter(0/0,2,Loyalty) -auto={counter(0/0,1,Loyalty)}:name(+1: Draw and discard) draw:1 controller && discard:1 controller -auto={counter(0/0,-4,Loyalty)}:name(-4: Deal damage to player) target(player) damage:type:*:targetedpersonshand -auto={counter(0/0,-6,Loyalty)}:name(-6: Gain control of creatures) all(creature|battlefield) moveTo(mybattlefield) and!( transforms((,newability[untap],newability[haste],newability[phaseaction[endofturn once sourceinplay] moveTo(ownerbattlefield)])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draw and discard) draw:1 controller && discard:1 controller +auto={C(0/0,-4,Loyalty)}:name(-4: Deal damage to player) target(player) damage:type:*:targetedpersonshand +auto={C(0/0,-6,Loyalty)}:name(-6: Gain control of creatures) all(creature|battlefield) moveTo(mybattlefield) and!( transforms((,newability[untap],newability[haste],newability[phaseaction[endofturn once sourceinplay] moveTo(ownerbattlefield)])) ueot )! text=+1: Draw a card, then discard a card at random. -- -4: Tibalt, the Fiend-Blooded deals damage equal to the number of cards in target player's hand to that player. -- -6: Gain control of all creatures until end of turn. Untap them. They gain haste until end of turn. mana={R}{R} type=Legendary Planeswalker subtype=Tibalt [/card] [card] +name=Tibalt, Wicked Tormentor +auto=counter(0/0,3,Loyalty) +auto={C(0/0,1,Loyalty)}:name(+1: Draft Chained Brute) conjure cards(Chained Brute) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Charmbreaker Devils) conjure cards(Charmbreaker Devils) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Festival Crasher) conjure cards(Festival Crasher) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Forge Devil) conjure cards(Forge Devil) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Frenzied Devils) conjure cards(Frenzied Devils) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Havoc Jester) conjure cards(Havoc Jester) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Hellrider) conjure cards(Hellrider) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Hobblefiend) conjure cards(Hobblefiend) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Pitchburn Devils) conjure cards(Pitchburn Devils) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Sin Prodder) conjure cards(Sin Prodder) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Spiteful Prankster) conjure cards(Spiteful Prankster) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Tibalt's rager) conjure cards(Tibalt's rager) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Torch Fiend) conjure cards(Torch Fiend) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Brimstone Vandal) conjure cards(Brimstone Vandal) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Draft Devil's Play) conjure cards(Devil's Play) zone(myexile) and!( transforms((,newability[canplayfromexile],newability[add{R}{R}])) ueot )! +auto={C(0/0,1,Loyalty)}:name(+1: Damage opponent creature or planeswalker) target(*[creature;planeswalker]|opponentbattlefield) transforms((,newability[choice name(Damage target) damage:3],newability[choice name(Damage controller) damage:3 controller && ability$!may name(Discard and draw) name(Discard and draw) target(*|myhand) reject and!( draw:1 controller )! !$ opponent])) oneshot +auto={C(0/0,1,Loyalty)}:name(+1: Damage your creature or planeswalker) target(*[creature;planeswalker]|mybattlefield) transforms((,newability[choice name(Damage target) damage:3],newability[choice name(Damage controller) damage:3 controller && ability$!may name(Discard and draw) name(Discard and draw) target(*|myhand) reject and!( draw:1 controller )! !$ controller])) oneshot +auto={C(0/0,-1,Loyalty)}:name(-1: Create 1 devil) token(Devil,Creature Devil,1/1,red) and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-2,Loyalty)}:name(-2: Create 2 devils) token(Devil,Creature Devil,1/1,red)*2 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-3,Loyalty)}:name(-3: Create 3 devils) token(Devil,Creature Devil,1/1,red)*3 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-4,Loyalty)}:name(-4: Create 4 devils) token(Devil,Creature Devil,1/1,red)*4 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-5,Loyalty)}:name(-5: Create 5 devils) token(Devil,Creature Devil,1/1,red)*5 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-6,Loyalty)}:name(-6: Create 6 devils) token(Devil,Creature Devil,1/1,red)*6 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-7,Loyalty)}:name(-7: Create 7 devils) token(Devil,Creature Devil,1/1,red)*7 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-8,Loyalty)}:name(-8: Create 8 devils) token(Devil,Creature Devil,1/1,red)*8 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-9,Loyalty)}:name(-9: Create 9 devils) token(Devil,Creature Devil,1/1,red)*9 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-10,Loyalty)}:name(-10: Create 10 devils) token(Devil,Creature Devil,1/1,red)*10 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-11,Loyalty)}:name(-11: Create 11 devils) token(Devil,Creature Devil,1/1,red)*11 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-12,Loyalty)}:name(-12: Create 12 devils) token(Devil,Creature Devil,1/1,red)*12 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-13,Loyalty)}:name(-13: Create 13 devils) token(Devil,Creature Devil,1/1,red)*13 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-14,Loyalty)}:name(-14: Create 14 devils) token(Devil,Creature Devil,1/1,red)*14 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-15,Loyalty)}:name(-15: Create 15 devils) token(Devil,Creature Devil,1/1,red)*15 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-16,Loyalty)}:name(-16: Create 16 devils) token(Devil,Creature Devil,1/1,red)*16 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-17,Loyalty)}:name(-17: Create 17 devils) token(Devil,Creature Devil,1/1,red)*17 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-18,Loyalty)}:name(-18: Create 18 devils) token(Devil,Creature Devil,1/1,red)*18 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-19,Loyalty)}:name(-19: Create 19 devils) token(Devil,Creature Devil,1/1,red)*19 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +auto={C(0/0,-20,Loyalty)}:name(-20: Create 20 devils) token(Devil,Creature Devil,1/1,red)*20 and!( transforms((,newability[@movedto(this|graveyard) from(battlefield):name(Deal 1 damage) target(player^creature^planeswalker)])) forever )! +text=+1: Add {R}{R}. Draft a card from Tibalt, Wicked Tormenter's spellbook, then exile it. Until end of turn, you may cast that card. -- +1: Tibalt, Wicked Tormenter deals 3 damage to target creature or planeswalker unless its controller has Tibalt deal 3 damage to them. If they do, you may discard a card. If you do, draw card. -- −X: Create X 1/1 red Devil creature tokens with "When this creature dies, it deals 1 damage to any target." +mana={3}{R}{R} +type=Legendary Planeswalker +subtype=Tibalt +[/card] +[card] name=Tyvar Kell auto=counter(0/0,3,Loyalty) auto=lord(elf|mybattlefield) transforms((,newability[{T}:add{B}])) diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index 27f01b6d5..6c2081444 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -336,7 +336,9 @@ class Constants ENERGYSHROUD = 209, EXPSHROUD = 210, COUNTERSHROUD = 211, - NB_BASIC_ABILITIES = 212, + NONIGHT = 212, + NODAMAGEREMOVED = 213, + NB_BASIC_ABILITIES = 214, RARITY_S = 'S', //Special Rarity RARITY_M = 'M', //Mythics diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 5499fc537..5ad060a2e 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -3901,7 +3901,8 @@ ADrawReplacer::~ADrawReplacer() int AAResetDamage::resolve() { MTGCardInstance * _target = (MTGCardInstance *)target; - _target->life = _target->toughness; + if(!_target->has(Constants::NODAMAGEREMOVED)) // Added to avoid damage is removed from a card (e.g. "Patient Zero"). + _target->life = _target->toughness; return 1; } @@ -6330,6 +6331,8 @@ const string AARandomMover::getMenuText() AARandomMover * AARandomMover::clone() const { AARandomMover * a = NEW AARandomMover(*this); + if(andAbility) + a->andAbility = andAbility->clone(); return a; } diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 5dfffec81..505ba6016 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -1035,7 +1035,7 @@ void GameObserver::gameStateBasedEffects() c->flanked -= 1; } c->fresh = 0; - if(c->wasDealtDamage > 0 && c->isInPlay(this)) + if(c->wasDealtDamage > 0 && c->isInPlay(this) && !c->has(Constants::NODAMAGEREMOVED)) // Added to avoid damage is removed from a card (e.g. "Patient Zero"). c->wasDealtDamage = 0; c->damageToController = 0; c->damageToOpponent = 0; diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index fa1e75fb3..2064cae8c 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -329,6 +329,21 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe if(!count) return 0; } + check = restriction[i].find("librarycast"); + if(check != string::npos) + { + int count = 0; + for(unsigned int k = 0; k < player->game->stack->cardsSeenThisTurn.size(); k++) + { + MTGCardInstance * stackCard = player->game->stack->cardsSeenThisTurn[k]; + if(stackCard->next && stackCard->next == card && (card->previousZone == card->controller()->game->library||card->previousZone == card->controller()->opponent()->game->library)) + count++; + if(stackCard == card && (card->previousZone == card->controller()->game->library||card->previousZone == card->controller()->opponent()->game->library)) + count++; + } + if(!count) + return 0; + } check = restriction[i].find("rebound"); if(check != string::npos) { @@ -3479,6 +3494,8 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG { cardName = splitCard[1]; } + if(cardName == "myname") + cardName = card->name; // Added to refer the orginal source card name (e.g. "Clone Crafter"). string cardZone = ""; vector splitZone = parseBetween(s, "zone(", ")"); if (splitZone.size()) diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 95afb808c..b6d834730 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -242,7 +242,9 @@ const char* Constants::MTGBasicAbilities[] = { "training", //Has training ability (e.g. "Gryff Rider") "energyshroud", //Player can't get energy counters (e.g. "Solemnity"). "expshroud", //Player can't get experience counters (e.g. "Solemnity"). - "countershroud" //Card can't get any kind of counter (e.g. "Solemnity"). + "countershroud", //Card can't get any kind of counter (e.g. "Solemnity"). + "nonight", //It can't become night (e.g. "Angel of Eternal Dawn"). + "nodamageremoved" //Damage is not removed from card (e.g. "Patient Zero"). }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 89c2b551b..98ec1c747 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -276,6 +276,11 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta zones[nbzones++] = MTGGameZone::MY_BATTLEFIELD; zones[nbzones++] = MTGGameZone::MY_COMMANDZONE; } + else if (zoneName.compare("myhandlibrary") == 0) + { + zones[nbzones++] = MTGGameZone::MY_HAND; + zones[nbzones++] = MTGGameZone::MY_LIBRARY; + } else if (zoneName.compare("opponentcastingzone") == 0) { zones[nbzones++] = MTGGameZone::OPPONENT_GRAVEYARD; @@ -294,6 +299,11 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta zones[nbzones++] = MTGGameZone::OPPONENT_BATTLEFIELD; zones[nbzones++] = MTGGameZone::OPPONENT_COMMANDZONE; } + else if (zoneName.compare("opponenthandlibrary") == 0) + { + zones[nbzones++] = MTGGameZone::OPPONENT_HAND; + zones[nbzones++] = MTGGameZone::OPPONENT_LIBRARY; + } else if (zoneName.compare("mynonplaynonexile") == 0) { zones[nbzones++] = MTGGameZone::MY_GRAVEYARD; diff --git a/projects/mtg/src/WParsedInt.cpp b/projects/mtg/src/WParsedInt.cpp index 2f60e86c8..6f7f9e320 100644 --- a/projects/mtg/src/WParsedInt.cpp +++ b/projects/mtg/src/WParsedInt.cpp @@ -1496,6 +1496,11 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card) } } } + else if(s.find("startingplayer") != string::npos){ //Return who was the starting player (0 is controller, 1 is opponent). + intValue = card->controller()->getObserver()->turn%2; + if(card->controller()->getObserver()->currentlyActing() != card->controller()) + intValue = 1 - intValue; + } else if(!intValue)//found nothing, try parsing a atoi { intValue = atoi(s.c_str());