Added HTR18, HT19, AFR and AFC sets, added/fixed old primitives, improved Android dowloader, fixed it lang file, fixed IMA rarities, fixed order index of some old sets, added all features from D&D such as Dungeon Cards and Dice (d20,d10, adn so on).

This commit is contained in:
Vittorio Alfieri
2021-07-17 02:33:08 +02:00
parent d98956a1b8
commit 31ab9edc81
43 changed files with 9693 additions and 1740 deletions

View File

@@ -1828,6 +1828,20 @@ public class ImgDownloader {
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/9/1/910f48ab-b04e-4874-b31d-a86a7bc5af14.jpg?1617626097";
else if(id.equals("296380t"))
cardurl = "https://deckmaster.info/images/cards/KLD/-3287-hr.jpg";
else if(id.equals("530447"))
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/6/f/6f509dbe-6ec7-4438-ab36-e20be46c9922.jpg?1626139695";
else if(id.equals("530448"))
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/5/9/59b11ff8-f118-4978-87dd-509dc0c8c932.jpg?1626297774";
else if(id.equals("530449"))
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/7/0/70b284bd-7a8f-4b60-8238-f746bdc5b236.jpg?1626297777";
else if(id.equals("530448t"))
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/1/4/1425e965-7eea-419c-a7ec-c8169fa9edbf.jpg?1626139812";
else if(id.equals("530447t"))
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/f/a/fa6fdb57-82f3-4695-b1fa-1f301ea4ef83.jpg?1626139846";
else if(id.equals("527514t"))
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/c/4/c49e8e79-8673-41c2-a1ad-273c37e27aca.jpg?1625767076";
else if(id.equals("527507t"))
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/6/b/6b2c8f52-1580-42d5-8434-c4c70e31e31b.jpg?1626139372";
return cardurl;
}
@@ -2338,7 +2352,40 @@ public class ImgDownloader {
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/1/a/1a2d027f-8996-4761-a776-47cd428f6779.jpg?1618766925";
else if(id.equals("522245t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/3/7/37e32ba6-108a-421f-9dad-3d03f7ebe239.jpg?1623113548";
else if(id.equals("296413t"))
tokenurl = "https://i.pinimg.com/564x/af/cc/4c/afcc4c87d67c9651838fed09217c7eed.jpg";
else if(id.equals("296410t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/9/4/94057dc6-e589-4a29-9bda-90f5bece96c4.jpg?1572489125";
else if(id.equals("527539t") || id.equals("527477t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/a/3/a3a684b7-27e0-4d9e-a064-9e03c6e50c89.jpg?1626139418";
else if(id.equals("527351t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/c/e/ce3c0bd9-8a37-4164-9937-f35d1c210fe8.jpg?1626139016";
else if(id.equals("527378t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/8/6/86881c5f-df5e-4f50-b554-e4c49d5316f9.jpg?1625676073";
else if(id.equals("532511t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/a/3/a378702b-d074-4402-b423-2ca8f44fce7c.jpg?1572370699";
else if(id.equals("532519t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/6/2/62cafc0a-cd02-4265-aa1f-b8a6cb7cc8db.jpg?1592710150";
else if(id.equals("532527t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/8/e/8e3b2942-d1a4-4d27-9d64-65712497ab2e.jpg?1561897504";
else if(id.equals("532560t") || id.equals("532659t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/9/5/95483574-95b7-42a3-b700-616189163b0a.jpg?1598312392";
else if(id.equals("531918t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/0/7/076f934b-a244-45f1-bcb3-7c5e882e9911.jpg?1594733476";
else if(id.equals("532539t") || id.equals("531948t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/4/4/44a4ef4a-a026-424e-88ff-e2bb77aaf05d.jpg?1625974889";
else if(id.equals("532482t") || id.equals("532493t") || id.equals("532491t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/e/4/e43a205e-43ea-4b3e-92ab-c2ee2172a50a.jpg?1572489150";
else if(id.equals("532599t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/9/c/9c8fe0d7-5c40-45fe-b3d8-47852380845e.jpg?1562542392";
else if(id.equals("531833t"))
tokenurl = "https://i.pinimg.com/564x/04/dc/04/04dc041251acb96f97327d67e9c8fe23.jpg";
else if(id.equals("532489t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/6/0/60842b1a-6ae7-4b3b-a23f-0d94a3d89884.jpg?1562639827";
else if(id.equals("531921t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/2/3/2300635e-7771-4676-a5a5-29a9d8f49f1a.jpg?1604194799";
else if(id.equals("531928t") || id.equals("531933t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/0/b/0b08d210-01cb-46c5-9150-4dfb47f50ae7.jpg?1626139197";
return tokenurl;
}
@@ -2359,7 +2406,7 @@ public class ImgDownloader {
id.equals("293198") || id.equals("479634") || id.equals("479702") || id.equals("489837") || id.equals("489861") || id.equals("491359") ||
id.equals("294872") || id.equals("295110") || id.equals("294842") || id.equals("295067") || id.equals("491767") || id.equals("295386") ||
id.equals("295229") || id.equals("295387") || id.equals("295206") || id.equals("295706") || id.equals("497549") || id.equals("497666") ||
id.equals("503860") || id.equals("522280") || id.equals("522111"))
id.equals("503860") || id.equals("522280") || id.equals("522111") || id.equals("527288") || id.equals("531927"))
return false;
return true;
}
@@ -2714,7 +2761,8 @@ public class ImgDownloader {
rarity = "";
if(id != null && (id.equals("209162") || id.equals("209163") || id.equals("401721") || id.equals("401722") || id.equals("491633")))
rarity = "t";
if(id != null && (id.equals("1750411") || id.equals("5176911") || id.equals("44680711") || id.equals("29530711") || id.equals("45108910")))
if(id != null && (id.equals("1750411") || id.equals("5176911") || id.equals("44680711") || id.equals("29530711") || id.equals("45108910")
|| id.equals("530447") || id.equals("530448") || id.equals("530449")))
rarity = "";
int c = lines.indexOf("[/card]", lastIndex);
if (c > 0)
@@ -2733,6 +2781,10 @@ public class ImgDownloader {
mappa.put("513543t", "Pest");
if(id.equals("513634"))
mappa.put("513634t", "Fractal");
if(id.equals("530447"))
mappa.put("530447t", "Skeleton");
if(id.equals("530448"))
mappa.put("530448t", "Goblin");
if (id.equals("114921")) {
mappa.put("11492111t", "Citizen");
mappa.put("11492112t", "Camarid");
@@ -2958,7 +3010,8 @@ public class ImgDownloader {
|| scryset.equals("PAL05") || scryset.equals("PAL06") || scryset.equals("PAL99") || scryset.equals("PARL") || scryset.equals("HA1")
|| scryset.equals("SLD") || scryset.equals("MB1") || scryset.equals("HA2") || scryset.equals("HA3") || scryset.equals("SS3")
|| scryset.equals("AKR") || scryset.equals("ANB") || scryset.equals("PLIST") || scryset.equals("KLR") || scryset.equals("CC1")
|| scryset.equals("ATH") || scryset.equals("HA4") || scryset.equals("TSR") || scryset.equals("HA5") || scryset.equals("H1R")){
|| scryset.equals("ATH") || scryset.equals("HA4") || scryset.equals("TSR") || scryset.equals("HA5") || scryset.equals("H1R")
|| scryset.equals("HTR18") || scryset.equals("HTR19")){
try {
doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get();
Elements outlinks = doc.select("body a");
@@ -3149,7 +3202,8 @@ public class ImgDownloader {
&& !scryset.equals("PAL05") && !scryset.equals("PAL06") && !scryset.equals("PAL99") && !scryset.equals("PARL") && !scryset.equals("HA1")
&& !scryset.equals("SLD") && !scryset.equals("MB1") && !scryset.equals("HA2") && !scryset.equals("HA3") && !scryset.equals("SS3")
&& !scryset.equals("AKR") && !scryset.equals("ANB") && !scryset.equals("PLIST") && !scryset.equals("KLR") && !scryset.equals("CC1")
&& !scryset.equals("ATH") && !scryset.equals("HA4") && !scryset.equals("TSR") && !scryset.equals("HA5") && !scryset.equals("H1R")){
&& !scryset.equals("ATH") && !scryset.equals("HA4") && !scryset.equals("TSR") && !scryset.equals("HA5") && !scryset.equals("H1R")
&& !scryset.equals("HTR18") && !scryset.equals("HTR19")){
try {
doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get();
Elements outlinks = doc.select("body a");
@@ -3264,7 +3318,8 @@ public class ImgDownloader {
&& !scryset.equals("PAL05") && !scryset.equals("PAL06") && !scryset.equals("PAL99") && !scryset.equals("PARL") && !scryset.equals("HA1")
&& !scryset.equals("SLD") && !scryset.equals("MB1") && !scryset.equals("HA2") && !scryset.equals("HA3") && !scryset.equals("SS3")
&& !scryset.equals("AKR") && !scryset.equals("ANB") && !scryset.equals("PLIST") && !scryset.equals("KLR") && !scryset.equals("CC1")
&& !scryset.equals("ATH") && !scryset.equals("HA4") && !scryset.equals("TSR") && !scryset.equals("HA5") && !scryset.equals("H1R")){
&& !scryset.equals("ATH") && !scryset.equals("HA4") && !scryset.equals("TSR") && !scryset.equals("HA5") && !scryset.equals("H1R")
&& !scryset.equals("HTR18") && !scryset.equals("HTR19")){
try {
doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get();
} catch (Exception e) {
@@ -3431,7 +3486,8 @@ public class ImgDownloader {
|| scryset.equals("PAL06") || scryset.equals("PAL99") || scryset.equals("PARL") || scryset.equals("HA1") || scryset.equals("SLD")
|| scryset.equals("MB1") || scryset.equals("HA2") || scryset.equals("HA3") || scryset.equals("SS3") || scryset.equals("AKR")
|| scryset.equals("ANB") || scryset.equals("PLIST") || scryset.equals("KLR") || scryset.equals("CC1") || scryset.equals("ATH")
|| scryset.equals("HA4") || scryset.equals("TSR") || scryset.equals("HA5") || scryset.equals("H1R")){
|| scryset.equals("HA4") || scryset.equals("TSR") || scryset.equals("HA5") || scryset.equals("H1R") || scryset.equals("HTR18")
|| scryset.equals("HTR19")){
Elements metadata = doc.select("head meta");
if(metadata != null) {
for (int j = 0; j < metadata.size(); j++){

View File

@@ -438,17 +438,28 @@ Switch decks without saving=Cambia mazzo senza salvare
Switch Decks=Cambia mazzo
--UNLOCK CARDS--=-SBLOCCA CARTE-
#Vista de la coleccion
#Vista collezione
Click on the card image=Clicca sull'immagine
to add card to deck.=per aggiungere la carta al mazzo.
Your Deck: =Il tuo mazzo:
Sideboard: =La panchina:
Remove Card=Rimuovi la carta
Sideboard: =Panchina:
Commanders: =Comandanti:
Dungeons: =Dungeon:
Remove Card=Togli dal mazzo
Add/Remove Cards=Aggiungi / Rimuovi carte
Add to Deck=Aggiungi al mazzo
Add to Sideboard=Aggiungi alla panchina
Add to Dungeons=Aggiungi ai dungeon
Choose as Commander=Scegli come comandante
Remove from Sideboard=Togli dalla panchina
Remove as Commander=Rimuovi come comandante
Remove from Dungeons=Togli dai dungeon
View SB=Vedi PA
View CMD=Vedi CMZ
View DNG=Vedi DNG
View Coll.=Vedi Coll.
#Ediciones:
#Edizioni:
-Beginners-
Portal Second Age=Portale, la seconda era

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
[meta]
author=Wagic Team
name=Arena Beginner Set
orderindex=PRO-Z8.ANB
orderindex=PRO-ZA.ANB
year=2020-08-13
total=121
[/meta]

View File

@@ -1,7 +1,7 @@
[meta]
author=Wagic Team
name=Historic Anthology 1
orderindex=PRO-Z5.HA1
orderindex=PRO-Z6.HA1
year=2019-11-21
total=22
[/meta]

View File

@@ -1,7 +1,7 @@
[meta]
author=Wagic Team
name=Historic Anthology 2
orderindex=PRO-Z6.HA2
orderindex=PRO-Z7.HA2
year=2020-03-12
total=28
[/meta]

View File

@@ -1,7 +1,7 @@
[meta]
author=Wagic Team
name=Historic Anthology 3
orderindex=PRO-Z7.HA3
orderindex=PRO-Z8.HA3
year=2020-05-21
total=31
[/meta]

View File

@@ -1,7 +1,7 @@
[meta]
author=Wagic Team
name=Historic Anthology 4
orderindex=PRO-ZA.HA4
orderindex=PRO-ZD.HA4
year=2021-03-11
total=30
[/meta]

View File

@@ -1,7 +1,7 @@
[meta]
author=Wagic Team
name=Historic Anthology 5
orderindex=PRO-ZB.HA5
orderindex=PRO-ZE.HA5
year=2021-05-27
total=26
[/meta]

View File

@@ -0,0 +1,42 @@
[meta]
author=Wagic Team
name=Heroes of the Realm 2018
orderindex=PRO-Z5.HTR18
year=2019-08-01
total=6
[/meta]
[card]
primitive=Human Wizard
id=-296413
rarity=T
[/card]
[card]
primitive=Human
id=-296410
rarity=T
[/card]
[card]
primitive=Kharis & the Beholder
id=296410
rarity=M
[/card]
[card]
primitive=Kharis & the Beholder
id=296410
rarity=M
[/card]
[card]
primitive=Optimus Prime, Inspiring Leader
id=296411
rarity=M
[/card]
[card]
primitive=Sol, Advocate Eternal
id=296412
rarity=M
[/card]
[card]
primitive=The Legend of Arena
id=296413
rarity=M
[/card]

View File

@@ -0,0 +1,42 @@
[meta]
author=Wagic Team
name=Heroes of the Realm 2019
orderindex=PRO-Z9.HTR19
year=2020-08-01
total=7
[/meta]
[card]
primitive=Collectigull // Only the Best
id=296414
rarity=M
[/card]
[card]
primitive=Keeper of the Secret Lair
id=296415
rarity=M
[/card]
[card]
primitive=War of the Spark
id=296416
rarity=M
[/card]
[card]
primitive=Champions of Archery // Join the Group
id=296417
rarity=M
[/card]
[card]
primitive=Myntasha, Honored One
id=296418
rarity=M
[/card]
[card]
primitive=The Cinematic Phoenix
id=296419
rarity=M
[/card]
[card]
primitive=Fabled Path of Searo Point
id=296420
rarity=M
[/card]

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
[meta]
author=Wagic Team
name=The List
orderindex=PRO-ZA.PLIST
orderindex=PRO-ZC.PLIST
year=2020-09-26
total=336
[/meta]

View File

@@ -1,7 +1,7 @@
[meta]
author=Wagic Team
name=Strixhaven Mystical Archive
orderindex=EXP-ZZJ.STA
orderindex=EXP-K.STA
year=2021-04-23
total=63
[/meta]

View File

@@ -1,7 +1,7 @@
[meta]
author=Wagic Team
name=Strixhaven: School of Mages
orderindex=EXP-ZZI.STX
orderindex=REP-J.STX
year=2021-04-23
total=340
[/meta]

View File

@@ -1,7 +1,7 @@
[meta]
author=Wagic Team
name=Zendikar Rising Expeditions
orderindex=PRO-Z9.ZNE
orderindex=PRO-ZB.ZNE
year=2020-09-25
total=30
[/meta]

View File

@@ -61,10 +61,11 @@ $AUTO_DEFINE _CLASH_ Put here a code if compare the casting cost based on Errati
#AUTO_DEFINE _METALCRAFT_ aslongas(artifact|mybattlefield) >2
# Proliferate
#AUTO_DEFINE _PROLIFERATE_ name(Proliferate) notAtarget(<anyamount>*) propagate
#AUTO_DEFINE _PROLIFERATE_ name(Proliferate) notatarget(<anyamount>*) duplicatecounters(single)
# Proliferate, still need to target players since the old code doesn't work (*[artifact;creature;...;players]) just let you target creature and player
#AUTO_DEFINE _OLDPROLIFERATE_ name(proliferate) notatarget(<anyamount>*) proliferate
#AUTO_DEFINE _OLDPROLIFERATE_ name(Proliferate) notAtarget(<anyamount>*) propagate
#AUTO_DEFINE _OLDOLDPROLIFERATE_ name(proliferate) notatarget(<anyamount>*) proliferate
# Populate
#AUTO_DEFINE _POPULATE_ name(Populate) clone notAtarget(creature[token]|myBattlefield)

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
#Primitives Pack for Wagic the Homebrew.
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card
#I sorted this programatically so the other comments are removed except for AUTO_DEFINE - Vitty85 16-06-2021
#I sorted this programatically so the other comments are removed except for AUTO_DEFINE - Vitty85 16-07-2021
[card]
name=Abandon Reason
target=<upto:2>creature
@@ -1975,7 +1975,7 @@ type=Enchantment
[/card]
[card]
name=Ajani's Pridemate
auto=@lifeof(player) from(*[-lifefaker]):counter(1/1,1)
auto=@lifeof(player) from(*[-lifefaker]|*):counter(1/1,1)
text=Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate.
mana={1}{W}
type=Creature
@@ -5143,7 +5143,7 @@ toughness=4
[card]
name=Archangel of Thune
abilities=flying,lifelink
auto=@lifeof(player) from(*[-lifefaker]):all(creature|mybattlefield) counter(1/1,1)
auto=@lifeof(player) from(*[-lifefaker]|*):all(creature|mybattlefield) counter(1/1,1)
text=Flying. -- Lifelink. -- Whenever you gain life, put a +1/+1 counter on each creature you control.
mana={3}{W}{W}
type=Creature
@@ -6778,7 +6778,7 @@ toughness=2
[card]
name=Atraxa, Praetors' Voice
abilities=flying,vigilance,deathtouch,lifelink
auto=@each my end:notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
auto=@each my end:name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text=Flying, vigilance, deathtouch, lifelink -- At the beginning of your end step, proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
mana={G}{W}{U}{B}
type=Legendary Creature
@@ -8902,9 +8902,10 @@ type=Instant
[/card]
[card]
name=Bant Panorama
auto={T}:Add{1}
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;island;forest;plains]|myLibrary)
auto={1}{T}{S}:name(search card) reveal:plibrarycount optionone name(choose card) target(*[basic;island;forest;plains]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(tap(noevent))!)! afterrevealedend revealend
auto={T}:Add{C}
auto={1}{T}{S}:name(search forest) target(forest[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
auto={1}{T}{S}:name(search plains) target(plains[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
auto={1}{T}{S}:name(search island) target(island[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
text={T}: Add {1} to your mana pool. -- {1}, {T}, Sacrifice Bant Panorama: Search your library for a basic Forest, Plains, or Island card and put it onto the battlefield tapped. Then shuffle your library.
type=Land
[/card]
@@ -12217,7 +12218,7 @@ type=Enchantment
[/card]
[card]
name=Bloodbond Vampire
auto=@lifeof(player) from(*[-lifefaker]):counter(1/1,1)
auto=@lifeof(player) from(*[-lifefaker]|*):counter(1/1,1)
text=Whenever you gain life, put a +1/+1 counter on Bloodbond Vampire.
mana={2}{B}{B}
type=Creature
@@ -15125,8 +15126,8 @@ toughness=4
[card]
name=Brisela, Voice of Nightmares
auto=meldfrom(Gisela, the Broken Blade|Bruna, the Fading Light)
abilities=flying, first strike, vigilance, lifelink
auto=maxcast(*[manacost<4])0 opponent
abilities=flying,first strike,vigilance,lifelink
auto=maxcast(*[manacost<=3])0 opponent
text=Flying, first strike, vigilance, lifelink -- Your opponents can't cast spells with converted mana cost 3 or less.
type=Legendary Creature
subtype=Eldrazi Angel
@@ -15376,7 +15377,7 @@ type=Enchantment
[/card]
[card]
name=Bruna, the Fading Light
abilities=flying, vigilance
abilities=flying,vigilance
autostack=if casted(this) then may moveTo(mybattlefield) target(creature[angel;human]|mygraveyard)
text=When you cast Bruna, the Fading Light, you may return target Angel or Human creature card from your graveyard to the battlefield. -- Flying, vigilance -- (Melds with Gisela, the Broken Blade.)
mana={5}{W}{W}
@@ -20321,7 +20322,7 @@ toughness=1
[card]
name=Cliffhaven Vampire
abilities=flying
auto=@lifeof(player) from(*[-lifefaker]):life:-1 opponent
auto=@lifeof(player) from(*[-lifefaker]|*):life:-1 opponent
text=Flying -- Whenever you gain life, each opponent loses 1 life.
mana={2}{W}{B}
type=Creature
@@ -22111,7 +22112,7 @@ toughness=1
[card]
name=Contagion Clasp
auto=counter(-1/-1,1) target(creature)
auto={4}{T}:notatarget(<anyamount>*) propagate
auto={4}{T}:name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text=When Contagion Clasp enters the battlefield, put a -1/-1 counter on target creature. -- {4}, Tap: Proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
mana={2}
type=Artifact
@@ -22119,7 +22120,7 @@ type=Artifact
[card]
name=Contagion Engine
auto=target(player) ability$!name(target player) counter(-1/-1,1) all(creature|mybattlefield)!$ targetedplayer
auto={4}{T}:notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) propagate && propagate
auto={4}{T}:name(Proliferate) NotATarget(<anyamount>*) transforms((,newability[duplicatecounters(single)],newability[duplicatecounters(single)])) oneshot
text=When Contagion Engine enters the battlefield, put a -1/-1 counter on each creature target player controls. -- {4},{T}: Proliferate, then proliferate again. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there. Then do it again.)
mana={6}
type=Artifact
@@ -22569,7 +22570,7 @@ toughness=1
[card]
name=Core Prowler
abilities=infect
auto=@movedto(this|mygraveyard) from(this|mybattlefield):notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
auto=@movedto(this|mygraveyard) from(this|mybattlefield):name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text=Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -- When Core Prowler dies, proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
mana={4}
type=Artifact Creature
@@ -22980,8 +22981,7 @@ type=Artifact
[/card]
[card]
name=Courser of Kruphix
abilities=showfromtoplibrary
auto=canplaylandlibrarytop
abilities=showfromtoplibrary,canplaylandlibrarytop
auto=@movedTo(land|mybattlefield):life:1
text=Play with the top card of your library revealed. -- You may play the top card of your library if it's a land card. -- Whenever a land enters the battlefield under your control, you gain 1 life.
mana={1}{G}{G}
@@ -32124,7 +32124,7 @@ toughness=4
[card]
name=Drogskol Reaver
abilities=flying,double strike,lifelink
auto=@lifeof(player) from(*[-lifefaker]):draw:1 controller
auto=@lifeof(player) from(*[-lifefaker]|*):draw:1 controller
text=Flying, double strike, lifelink -- Whenever you gain life, draw a card.
mana={5}{W}{U}
type=Creature
@@ -35515,7 +35515,7 @@ toughness=7
[/card]
[card]
name=Emmessi Tome
auto={5}{T}:auto={T}:draw:2 && transforms((,newability[target(*|myhand) reject])) forever
auto={5}{T}:draw:2 && transforms((,newability[target(*|myhand) reject])) forever
text={5}, {T}: Draw two cards, then discard a card.
mana={4}
type=Artifact
@@ -36845,9 +36845,10 @@ toughness=3
[/card]
[card]
name=Esper Panorama
auto={T}:Add{1}
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;swamp;island;plains]|myLibrary)
auto={1}{T}{S}:name(search card) reveal:plibrarycount optionone name(choose card) target(*[basic;swamp;island;plains]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(tap(noevent))!)! afterrevealedend revealend
auto={T}:Add{C}
auto={1}{T}{S}:name(search swamp) target(swamp[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
auto={1}{T}{S}:name(search plains) target(plains[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
auto={1}{T}{S}:name(search island) target(island[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
text={T}: Add {1} to your mana pool. -- {1}, {T}, Sacrifice Esper Panorama: Search your library for a basic Plains, Island, or Swamp card and put it onto the battlefield tapped. Then shuffle your library.
type=Land
[/card]
@@ -43795,7 +43796,7 @@ type=Sorcery
name=Fuel for the Cause
target=*|stack
auto=fizzle
auto=notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
auto=name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text=Counter target spell, then proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
mana={2}{U}{U}
type=Instant
@@ -44142,8 +44143,7 @@ toughness=8
[/card]
[card]
name=Future Sight
abilities=showfromtoplibrary
auto=canplayfromlibrarytop
abilities=showfromtoplibrary,canplayfromlibrarytop
text=Play with the top card of your library revealed. -- You may play the top card of your library.
mana={2}{U}{U}{U}
type=Enchantment
@@ -44570,8 +44570,7 @@ toughness=2
[/card]
[card]
name=Garruk's Horde
abilities=trample,showfromtoplibrary
auto=canplaycreaturelibrarytop
abilities=trample,showfromtoplibrary,canplaycreaturelibrarytop
text=Trample -- Play with the top card of your library revealed. -- You may cast the top card of your library if it's a creature card. (Do this only any time you could cast that creature card. You still pay the spell's costs.)
mana={5}{G}{G}
type=Creature
@@ -46465,8 +46464,8 @@ type=Sorcery
[/card]
[card]
name=Gisela, the Broken Blade
abilities=flying, first strike, lifelink
auto=@each my endofturn:target(Bruna the Fading Light) meld(Brisela Voice of Nightmares)
abilities=flying,first strike,lifelink
auto=@each my endofturn:target(Bruna^ the Fading Light|mybattlefield) meld(Brisela, Voice of Nightmares)
text=Flying, first strike, lifelink -- At the beginning of your end step, if you both own and control Gisela, the Broken Blade and a creature named Bruna, the Fading Light, exile them, then meld them into Brisela, Voice of Nightmares.
mana={2}{W}{W}
type=Legendary Creature
@@ -49374,6 +49373,15 @@ text=Grasslands enters the battlefield tapped. -- {T}, Sacrifice Grasslands: Sea
type=Land
[/card]
[card]
name=Grave Betrayal
auto=@movedTo(creature|opponentGraveyard) from(Battlefield):all(trigger[to]) transforms((,newability[phaseaction[endofturn once] moveTo(opponentBattlefield)]))
auto=@movedTo(creature[fresh]|myBattlefield) from(opponentGraveyard):all(trigger[to]) transforms((,newability[counter(1/1)]))
auto=@movedTo(creature[fresh]|myBattlefield) from(opponentGraveyard):all(trigger[to]) transforms((Zombie,black)) forever
text=Whenever a creature you don't control dies, return it to the battlefield under your control with an additional +1/+1 counter on it at the beginning of the next end step. That creature is a black Zombie in addition to its other colors and types.
mana={5}{B}{B}
type=Enchantment
[/card]
[card]
name=Grave Birthing
target=opponent
auto=ability$!moveto(exile) notatarget(*|mygraveyard)!$ targetedplayer
@@ -50225,7 +50233,7 @@ subtype=Equipment
name=Grim Affliction
target=creature
auto=counter(-1/-1,1)
auto=notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
auto=name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text=Put a -1/-1 counter on target creature, then proliferate.
mana={2}{B}
type=Instant
@@ -50593,9 +50601,10 @@ toughness=1
[/card]
[card]
name=Grixis Panorama
auto={T}:Add{1}
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;mountain;island;swamp]|myLibrary)
auto={1}{T}{S}:name(search card) reveal:plibrarycount optionone name(choose card) target(*[basic;mountain;island;swamp]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(tap(noevent))!)! afterrevealedend revealend
auto={T}:Add{C}
auto={1}{T}{S}:name(search swamp) target(swamp[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
auto={1}{T}{S}:name(search mountain) target(mountain[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
auto={1}{T}{S}:name(search island) target(island[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
text={T}: Add {1} to your mana pool. -- {1}, {T}, Sacrifice Grixis Panorama: Search your library for a basic Island, Swamp, or Mountain card and put it onto the battlefield tapped. Then shuffle your library.
type=Land
[/card]
@@ -51513,6 +51522,14 @@ power=2
toughness=2
[/card]
[card]
name=Gutter Grime
auto=@movedTo(creature[-token]|myGraveyard) from(myBattlefield):counter(0/0,1,Slime)
auto=@counteradded(0/0,1,Slime) from(this):token(Ooze,Creature Ooze,type:enchantment{counter(0/0,1,Slime)}:mybattlefield/type:enchantment{counter(0/0,1,Slime)}:mybattlefield cdaactive,green)
text=Whenever a notoken creature you control dies, put a slime counter on Gutter Grime, then create a green Ooze creature token with "This creature's power and toughness are each equal to the number of slime counters on Gutter Grime."
mana={4}{G}
type=Enchantment
[/card]
[card]
name=Gutter Skulk
mana={1}{B}
type=Creature
@@ -56951,7 +56968,7 @@ toughness=1
[/card]
[card]
name=Ignorant Bliss
auto=hand(blink)ueot all(*|myhand)
auto=all(*|myhand) moveto(myexile) and!( transforms((,newability[phaseaction[endofturn once checkex] moveto(myhand)])) ueot )!
auto=phaseaction[endofturn once] draw:1
text=Exile all cards from your hand face down. At the beginning of the next end step, return those cards to your hand, then draw a card.
mana={1}{R}
@@ -57864,7 +57881,7 @@ toughness=3
[/card]
[card]
name=Inexorable Tide
auto=@movedto(mystack) from(*|myhand):notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
auto=@movedto(mystack) from(*|myhand):name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text=Whenever you cast a spell, proliferate.
mana={3}{U}{U}
type=Enchantment
@@ -60686,9 +60703,10 @@ toughness=1
[/card]
[card]
name=Jund Panorama
auto={T}:Add{1}
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;mountain;forest;swamp]|myLibrary)
auto={1}{T}{S}:name(search card) reveal:plibrarycount optionone name(choose card) target(*[basic;mountain;forest;swamp]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(tap(noevent))!)! afterrevealedend revealend
auto={T}:Add{C}
auto={1}{T}{S}:name(search swamp) target(swamp[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
auto={1}{T}{S}:name(search mountain) target(mountain[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
auto={1}{T}{S}:name(search forest) target(forest[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
text={T}: Add {1} to your mana pool. -- {1}, {T}, Sacrifice Jund Panorama: Search your library for a basic Swamp, Mountain, or Forest card and put it onto the battlefield tapped. Then shuffle your library.
type=Land
[/card]
@@ -61148,7 +61166,7 @@ toughness=2
[/card]
[card]
name=Kalastria Nightwatch
auto=@lifeof(player) from(*[-lifefaker]):flying ueot
auto=@lifeof(player) from(*[-lifefaker]|*):flying ueot
text=Whenever you gain life, Kalastria Nightwatch gains flying until end of turn.
mana={4}{B}
type=Creature
@@ -61545,7 +61563,7 @@ type=Sorcery
[/card]
[card]
name=Karlov of the Ghost Council
auto=@lifeof(player) from(*[-lifefaker]):counter(1/1,2)
auto=@lifeof(player) from(*[-lifefaker]|*):counter(1/1,2)
auto={W}{B}{C(1/1,-6)}:moveto(exile) target(creature)
text=Whenever you gain life, put two +1/+1 counters on Karlov of the Ghost Council. -- {W}{B}, Remove six +1/+1 counters from Karlov of the Ghost Council: Exile target creature.
mana={W}{B}
@@ -69763,8 +69781,7 @@ toughness=4
[/card]
[card]
name=Magus of the Future
abilities=showfromtoplibrary
auto=canplayfromlibrarytop
abilities=showfromtoplibrary,canplayfromlibrarytop
text=Play with the top card of your library revealed. -- You may play the top card of your library.
mana={2}{U}{U}{U}
type=Creature
@@ -70052,7 +70069,7 @@ toughness=1
[card]
name=Malakir Familiar
abilities=flying,deathtouch
auto=@lifeof(player) from(*[-lifefaker]):1/1 ueot
auto=@lifeof(player) from(*[-lifefaker]|*):1/1 ueot
text=Flying, deathtouch -- Whenever you gain life, Malakir Familiar gets +1/+1 until end of turn.
mana={2}{B}
type=Creature
@@ -72274,8 +72291,7 @@ subtype=Aura
[/card]
[card]
name=Melek, Izzet Paragon
abilities=showfromtoplibrary
auto=canplayinstantsorcerylibrarytop
abilities=showfromtoplibrary,canplayinstantsorcerylibrarytop
auto=@movedto(instant,sorcery|mystack) from(mylibrary):all(trigger[to]) castcard(copied noevent)
text=Play with the top card of your library revealed. -- You may cast the top card of your library if it's an instant or sorcery card. -- Whenever you cast an instant or sorcery spell from your library, copy it. You may choose new targets for the copy.
mana={4}{U}{R}
@@ -78387,9 +78403,10 @@ toughness=1
[/card]
[card]
name=Naya Panorama
auto={T}:Add{1}
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;mountain;forest;plains]|myLibrary)
auto={1}{T}{S}:name(search card) reveal:plibrarycount optionone name(choose card) target(*[basic;mountain;forest;plains]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(tap(noevent))!)! afterrevealedend revealend
auto={T}:Add{C}
auto={1}{T}{S}:name(search plains) target(plains[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
auto={1}{T}{S}:name(search mountain) target(mountain[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
auto={1}{T}{S}:name(search forest) target(forest[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
text={T}: Add {1} to your mana pool. -- {1}, {T}, Sacrifice Naya Panorama: Search your library for a basic Mountain, Forest, or Plains card and put it onto the battlefield tapped. Then shuffle your library.
type=Land
[/card]
@@ -80034,7 +80051,7 @@ toughness=1
[/card]
[card]
name=Nirkana Assassin
auto=@lifeof(player) from(*[-lifefaker]):deathtouch ueot
auto=@lifeof(player) from(*[-lifefaker]|*):deathtouch ueot
text=Whenever you gain life, Nirkana Assassin gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy it.)
mana={2}{B}
type=Creature
@@ -82302,26 +82319,7 @@ toughness=4
[/card]
[card]
name=Opalescence
auto=lord(other enchantment[-aura;manacost=1]) transforms((,newability[becomes(Creature)],setpower=1,settoughness=1))
auto=lord(other enchantment[-aura;manacost=2]) transforms((,newability[becomes(Creature)],setpower=2,settoughness=2))
auto=lord(other enchantment[-aura;manacost=3]) transforms((,newability[becomes(Creature)],setpower=3,settoughness=3))
auto=lord(other enchantment[-aura;manacost=4]) transforms((,newability[becomes(Creature)],setpower=4,settoughness=4))
auto=lord(other enchantment[-aura;manacost=5]) transforms((,newability[becomes(Creature)],setpower=5,settoughness=5))
auto=lord(other enchantment[-aura;manacost=6]) transforms((,newability[becomes(Creature)],setpower=6,settoughness=6))
auto=lord(other enchantment[-aura;manacost=7]) transforms((,newability[becomes(Creature)],setpower=7,settoughness=7))
auto=lord(other enchantment[-aura;manacost=8]) transforms((,newability[becomes(Creature)],setpower=8,settoughness=8))
auto=lord(other enchantment[-aura;manacost=9]) transforms((,newability[becomes(Creature)],setpower=9,settoughness=9))
auto=lord(other enchantment[-aura;manacost=10]) transforms((,newability[becomes(Creature)],setpower=10,settoughness=10))
auto=lord(other enchantment[-aura;manacost=11]) transforms((,newability[becomes(Creature)],setpower=11,settoughness=11))
auto=lord(other enchantment[-aura;manacost=12]) transforms((,newability[becomes(Creature)],setpower=12,settoughness=12))
auto=lord(other enchantment[-aura;manacost=13]) transforms((,newability[becomes(Creature)],setpower=13,settoughness=13))
auto=lord(other enchantment[-aura;manacost=14]) transforms((,newability[becomes(Creature)],setpower=14,settoughness=14))
auto=lord(other enchantment[-aura;manacost=15]) transforms((,newability[becomes(Creature)],setpower=15,settoughness=15))
auto=lord(other enchantment[-aura;manacost=16]) transforms((,newability[becomes(Creature)],setpower=16,settoughness=16))
auto=lord(other enchantment[-aura;manacost=17]) transforms((,newability[becomes(Creature)],setpower=17,settoughness=17))
auto=lord(other enchantment[-aura;manacost=18]) transforms((,newability[becomes(Creature)],setpower=18,settoughness=18))
auto=lord(other enchantment[-aura;manacost=19]) transforms((,newability[becomes(Creature)],setpower=19,settoughness=19))
auto=lord(other enchantment[-aura;manacost=20]) transforms((,newability[becomes(Creature)],setpower=20,settoughness=20))
auto=lord(other enchantment[-aura]) transforms((creature,newability[manacost/manacost]))
mana={2}{W}{W}
type=Enchantment
text=Each other non-Aura enchantment is a creature with power and toughness each equal to its converted mana cost. It's still an enchantment.
@@ -82470,9 +82468,8 @@ toughness=5
[/card]
[card]
name=Oracle of Mul Daya
abilities=showfromtoplibrary
abilities=showfromtoplibrary,canplaylandlibrarytop
auto=maxPlay(land)+1
auto=canplaylandlibrarytop
text=You may play an additional land on each of your turns. -- Play with the top card of your library revealed. -- You may play the top card of your library if it's a land card.
mana={3}{G}
type=Creature
@@ -87050,7 +87047,7 @@ toughness=1
[/card]
[card]
name=Plaguemaw Beast
auto={T}{S(creature|mybattlefield)}:notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
auto={T}{S(creature|mybattlefield)}:name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text={T}, Sacrifice a creature: Proliferate.
mana={3}{G}{G}
type=Creature
@@ -89585,7 +89582,7 @@ toughness=2
[/card]
[card]
name=Puppet's Verdict
auto=flipacoin winability destroy all(creature[power<=2]) winabilityend loseability destroy all(creature[power>=3]) loseabilityend flipend
auto=all(*[zpos=1]|mylibrary) transforms((,newability[@coinflipped(this|mylibrary) once:if compare(lastflipresult)~equalto~compare(lastflipchoice) then all(creature[power<=2]) destroy else all(creature[power>=3]) destroy],newability[name(Filp a coin) flipacoin winability donothing winabilityend loseability donothing loseabilityend flipend])) oneshot
text=Flip a coin. If you win the flip, destroy all creatures with power 2 or less. If you lose the flip, destroy all creatures with power 3 or greater.
mana={1}{R}{R}
type=Instant
@@ -101131,7 +101128,7 @@ type=Instant
[/card]
[card]
name=Searing Meditation
auto=@lifeof(player) from(*[-lifefaker]):pay({2}) target(creature,player) damage:2
auto=@lifeof(player) from(*[-lifefaker]|*):pay({2}) target(creature,player) damage:2
text=Whenever you gain life, you may pay {2}. If you do, Searing Meditation deals 2 damage to target creature or player.
mana={1}{R}{W}
type=Enchantment
@@ -102337,7 +102334,7 @@ type=Sorcery
[/card]
[card]
name=Serene Steward
auto=@lifeof(player) from(*[-lifefaker]):pay({W}) counter(1/1) target(creature)
auto=@lifeof(player) from(*[-lifefaker]|*):pay({W}) counter(1/1) target(creature)
text=Whenever you gain life, you may pay {W}. If you do, put a +1/+1 counter on target creature.
mana={1}{W}
type=Creature
@@ -111876,7 +111873,7 @@ toughness=3
name=Spread the Sickness
target=creature
auto=destroy
auto=notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
auto=name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text=Destroy target creature, then proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
mana={4}{B}
type=Sorcery
@@ -112835,7 +112832,7 @@ type=Sorcery
[card]
name=Steady Progress
auto=draw:1 controller
auto=notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
auto=name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text=Draw a card, then proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
mana={2}{U}
type=Instant
@@ -119276,7 +119273,7 @@ type=Sorcery
[card]
name=Tezzeret's Gambit
auto=draw:2 controller
auto=notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
auto=name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text=Draw two cards, then proliferate.
color=blue
mana={3}{p(U)}
@@ -120842,7 +120839,7 @@ type=Artifact
[/card]
[card]
name=Throne of Geth
auto={S(artifact|mybattlefield)}{T}:_PROLIFERATE_
auto={S(artifact|mybattlefield)}{T}:name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text={T},Sacrifice an artifact: Proliferate.
mana={2}
type=Artifact
@@ -120900,7 +120897,7 @@ toughness=1
[card]
name=Thrummingbird
abilities=flying
auto=@combatdamaged(player) from(this):notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
auto=@combatdamaged(player) from(this):name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text=Flying -- Whenever Thrummingbird deals combat damage to a player, proliferate.
mana={1}{U}
type=Creature
@@ -129085,7 +129082,7 @@ subtype=Aura
[card]
name=Viral Drake
abilities=flying,infect
auto={3}{U}:notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
auto={3}{U}:name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text=Flying -- Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -- {3}{U}: Proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
mana={3}{U}
type=Creature
@@ -130171,7 +130168,7 @@ type=Legendary Land
name=Volt Charge
target=creature,player
auto=damage:3
auto=notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
auto=name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
text=Volt Charge deals 3 damage to target creature or player. Proliferate.
mana={2}{R}
type=Instant
@@ -131076,7 +131073,7 @@ toughness=5
[card]
name=Wall of Limbs
abilities=defender
auto=@lifeof(player) from(*[-lifefaker]):counter(1/1,1)
auto=@lifeof(player) from(*[-lifefaker]|*):counter(1/1,1)
auto={5}{B}{B}{S}:name(Lose Life) target(player) life:-storedpower
text=Defender (This creature can't attack.) -- Whenever you gain life, put a +1/+1 counter on Wall of Limbs. -- {5}{B}{B}, Sacrifice Wall of Limbs: Target player loses X life, where X is Wall of Limbs's power.
mana={2}{B}

View File

@@ -1,7 +1,7 @@
grade=borderline
#Planeswalkers Primitives Pack for Wagic the Homebrew.
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card
#We sorted this in alphabetical order - Luruz & Vitty85 16-06-2021
#We sorted this in alphabetical order - Luruz & Vitty85 16-07-2021
[card]
name=Abian, Luvion Usurper
auto=counter(0/0,5,loyalty)
@@ -84,7 +84,7 @@ subtype=Ajani
[card]
name=Ajani, Mentor of Heroes
auto=counter(0/0,4,loyalty)
auto=activate transforms((,newability[if type(*[creature;aura;planeswalker;zpos<=4]|myLibrary)~morethan~0 then target(*[creature;aura;planeswalker;zpos<=4]|myLibrary) moveTo(myHand) and!( all(other *[zpos<=4]|mylibrary) moveto(myreveal) and!( bottomoflibrary )! )! else all(*[zpos<=4]|mylibrary) moveto(myreveal) and!( bottomoflibrary )! ])) oneshot
aicode=activate transforms((,newability[if type(*[creature;aura;planeswalker;zpos<=4]|myLibrary)~morethan~0 then target(*[creature;aura;planeswalker;zpos<=4]|myLibrary) moveTo(myHand) and!( all(other *[zpos<=4]|mylibrary) moveto(myreveal) and!( bottomoflibrary )! )! else all(*[zpos<=4]|mylibrary) moveto(myreveal) and!( bottomoflibrary )! ])) oneshot
auto={C(0/0,1,Loyalty)}:name(+1: Distribute three +1/+1 counters) ability$!counter(1/1,1) target(creature)!$ controller && ability$!counter(1/1,1) target(creature)!$ controller && ability$!counter(1/1,1) target(creature)!$ controller
auto={C(0/0,1,Loyalty)}:name(+1: Look 4 cards for creature, aura or planeswalker) reveal:4 optionone name(Get a card) target(<1>*[creature;planeswalker;aura]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(<4>*|reveal) bottomoflibrary optiontwoend revealend
auto={C(0/0,-8,Loyalty)}:name(-8: Gain 100 life) life:100 controller
@@ -739,6 +739,18 @@ type=Legendary Planeswalker
subtype=Dovin
[/card]
[card]
name=Ellywick Tumblestrum
aicode=activate transforms((,newability[target(creature[zpos<=6]|myLibrary) moveTo(myHand) and!( transforms((,newability[if cantargetcard(*[legendary]|*) then life:3 controller],newability[all(other *[zpos<=6]|mylibrary) moveto(myreveal) and!( bottomoflibrary )!])) oneshot )!])) oneshot
auto=counter(0/0,4,Loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Venture into the dungeon) if compare(type:*[nodngplr]:mybattlefieldplustype:*[nodngopp]:opponentbattlefieldplusend)~equalto~0 then name(Venture into dungeon) name(Venture into dungeon) transforms((,newability[if type(*[dungeon]|mycommandzone)~morethan~0 then name(Explore the dungeon) name(Explore the dungeon) all(*[dungeon]|mycommandzone) counter(0/0.1.Explore)],newability[if type(*[dungeon]|mycommandzone)~equalto~0 then name(Choose a new dungeon) name(Choose a new dungeon) target(*[dungeon]|mysideboard) moveTo(mycommandzone) and!( counter(0/0.1.Explore) )!])) oneshot asSorcery
auto={C(0/0,-2,Loyalty)}:name(-2: Look top 6 cards) reveal:6 optionone name(Get a creature) target(<upto:1>creature|reveal) moveto(myhand) and!( transforms((,newability[if cantargetcard(*[legendary]|*) then life:3 controller])) oneshot )! optiononeend optiontwo name(Put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend
auto={C(0/0,-7,Loyalty)}:name(-7: Get emblem on your creatures) emblem transforms((,newability[lord(creature|mybattlefield) trample],newability[lord(creature|mybattlefield) foreach(*[dungeoncompleted]|myzones) 2/2])) forever dontremove
text=+1: Venture into the dungeon. (Enter the first room or advance to the next room.) -- -2: Look at the top six cards of your library. You may reveal a creature card from among them and put it into your hand. If its legendary, you gain 3 life. Put the rest on the bottom of your library in a random order. -- -7: You get an emblem with "Creatures you control have trample and haste and get +2/+2 for each differently named dungeon youve completed."
mana={2}{G}{G}
type=Legendary Planeswalker
subtype=Ellywick
[/card]
[card]
name=Elspeth, Knight-Errant
auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Create a 1/1 soldier) create(Soldier:creature Soldier:1/1:white)
@@ -1024,6 +1036,18 @@ subtype=Gideon
color=white
[/card]
[card]
name=Grand Master of Flowers
auto=counter(0/0,3,Loyalty)
auto=this(counter{0/0.1.Loyalty}>=7) becomes(Creature Dragon God,7/7,flying,indestructible)
auto={C(0/0,1,Loyalty)}:name(+1: Creature can't attack) target(creature[-first strike;-double strike;-vigilance]|battlefield) transforms((,newability[cantblock],newability[cantattack],newability[cantpwattack])) uynt
auto={C(0/0,1,Loyalty)}:name(+1: Search Monk in library) target(Monk of the Open Hand|mylibrary) moveto(myhand) and!( shuffle )!
auto={C(0/0,1,Loyalty)}:name(+1: Search Monk in graveyard) target(Monk of the Open Hand|mygraveyard) moveto(myhand)
text=As long as Grand Master of Flowers has seven or more loyalty counters on him, hes a 7/7 Dragon God creature with flying and indestructible. -- +1: Target creature without first strike, double strike, or vigilance cant attack or block until your next turn. -- +1: Search your library and/or graveyard for a card named Monk of the Open Hand, reveal it, and put it into your hand. If you search your library this way, shuffle it.
mana={2}{U}{U}
type=Legendary Planeswalker
subtype=Bahamut
[/card]
[card]
name=Grist, the Hunger Tide
auto=counter(0/0,3,loyalty)
auto=transforms((removealltypes,newability[becomes(Legendary Planeswalker Grist)])) forever
@@ -1105,6 +1129,18 @@ type=Legendary Planeswalker
subtype=Huatli
[/card]
[card]
name=Inzerva, Master of Insights
aicode=activate target(*[zpos<=2]|opponentLibrary) moveto(opponentreveal) and!( bottomoflibrary )!
auto=counter(0/0,4,loyalty)
auto={C(0/0,+2,Loyalty)}:name(+2: Draw 2 cards and discard) draw:2 && reject target(*|myhand)
auto={C(0/0,-2,Loyalty)}:name(-2: Look at opponent library and scry 2) reveal:2 revealzone(opponentlibrary) optionone name(Put on top) target(<upto:2>*|reveal) moveto(ownerlibrary) optiononeend optiontwo name(Put on bottom) target(<2>*|reveal) bottomoflibrary optiontwoend afterrevealed name(Scry 2) scry:2 scrycore delayed dontshow donothing scrycoreend scryend afterrevealedend revealend
auto={C(0/0,-4,Loyalty)}:name(-4: Emblem: Draw to deal damage) token(Inzerva Emblem,Inzerva Emblem,0/0,shroud,indestructible) and!( transforms((,newability[{0}:name(Look opponent hand) target(*|opponenthand) moveTo(myreveal) and!( moveto(opponenthand) )!],newability[@drawfoeof(player):damage:1 opponent] )) forever )!
text=+2: Draw two cards, then discard a card. -- 2: Look at the top two cards of each other players library, then put any number of them on the bottom of that library and the rest on top in any order. Scry 2. -- 4: You get an emblem with "Your opponents play with their hands revealed" and "Whenever an opponent draws a card, this emblem deals 1 damage to them."
mana={1}{2U}{2R}
type=Legendary Planeswalker
subtype=Inzerva
[/card]
[card]
name=Jace, Arcane Strategist
auto=counter(0/0,4,loyalty)
auto=@drawof(player):transforms((,newability[@drawof(player) restriction{once}:counter(1/1,1) target(creature|myBattlefield)])) ueot
@@ -1118,9 +1154,11 @@ subtype=Jace
[card]
name=Jace, Architect of Thought
auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Attacking creatures get -1/-0) all(creature|opponentbattlefield) transforms((,newability[@combat(attacking) source(this):all(trigger[from]) -1/-0 ueot])) uynt oneshot
auto={C(0/0,-2,Loyalty)}:name(-2: CANNOT BE CODED) donothing
auto={C(0/0,-8,Loyalty)}:name(-8: Exile a card from library and cast it) moveto(exile) target(*|opponentLibrary) and!( transforms((,canplayfromexile,castcard(normal))) ueot )!
aicode=activate target(*[zpos<=3]|mylibrary) moveto(myhand) and!( transforms((,newability[all(*[zpos<=3]|mylibrary) moveto(myreveal) and!( bottomoflibrary )!])) oneshot )!
auto={C(0/0,1,Loyalty)}:name(+1: Attacking creatures get -1/-0) transforms((,newability[counter(0/0.1.JaceEffect)],newability[phaseaction[my untap once sourceinplay] counter(0/0.-1.JaceEffect)])) forever
auto=this(counter{0/0.1.JaceEffect}>0) lord(creature|opponentbattlefield) transforms((,newability[@combat(attacking) source(this):-1/0 ueot]))
auto={C(0/0,-2,Loyalty)}:name(-2: Look top 3 cards) reveal:3 optionone name(Put in hand) target(*|reveal) moveto(myhand) optiononeend optiontwo all(*|reveal) bottomoflibrary optiontwoend revealend
auto={C(0/0,-8,Loyalty)}:name(-8: Exile cards from libraries) target(*[-land]|mylibrary) moveto(exile) and!( transforms((,newability[zerocast],newability[canplayfromexile],newability[name(Search opponent library) target(*[-land]|opponentlibrary) moveto(myexile) and!( transforms((,newability[choice name(Cast opponent exiled card) activate castcard(normal)],newability[choice name(Don't cast opponent exiled card) moveto(ownerExile)])) ueot )!])) ueot )!
text=+1: Until your next turn, whenever a creature an opponent controls attacks, it gets -1/-0 until end of turn. -- -2: Reveal the top three cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other on the bottom of your library in any order. -- -8: For each player, search that players library for a nonland card and exile it, then that player shuffles their library. You may cast those cards without paying their mana costs.
mana={2}{U}{U}
type=Legendary Planeswalker
@@ -1518,8 +1556,8 @@ name=Kiora, the Crashing Wave
auto=counter(0/0,2,loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Prevention all damamge dealt by and to) target(*|opponentbattlefield) transforms((,newability[preventalldamage from(this)],newability[preventalldamage to(this)])) uynt
auto={C(0/0,-1,Loyalty)}:name(-1: Draw a card and may play additional land) draw:1 controller && maxPlay(land)+1 ueot
auto={C(0/0,-5,Loyalty)}:name(-5: Emblem: "Each my end of turn create a 9/9 Kraken") emblem transforms((,newability[@each my endofturn:token(Kraken,Creature Kraken,9/9,blue) controller])) forever dontremove
text=+1: Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. -- -1: Draw a card. You may play an additional land this turn. -- -5: You get an emblem with "At the beginning of your end step, put a 9/9 blue Kraken creature token onto the battlefield." -- Starting Loyalty (2)
auto={C(0/0,-5,Loyalty)}:name(-5: Emblem: "Each my end of turn create a 9/9 Kraken") emblem transforms((,newability[@each my endofturn:token(Kraken^Creature Kraken^9/9^blue) controller])) forever dontremove
text=+1: Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. -- -1: Draw a card. You may play an additional land this turn. -- -5: You get an emblem with "At the beginning of your end step, put a 9/9 blue Kraken creature token onto the battlefield."
mana={2}{G}{U}
type=Legendary Planeswalker
subtype=Kiora
@@ -1693,6 +1731,18 @@ type=Legendary Planeswalker
subtype=Liliana
[/card]
[card]
name=Lolth, Spider Queen
auto=counter(0/0,4,Loyalty)
auto=@movedto(creature|graveyard) from(mybattlefield):name(Put loyalty counter) counter(0/0,1,Loyalty)
auto={C(0/0,0,Loyalty)}:name(+0: Draw card and lose life) draw:1 controller && life:-1 controller
auto={C(0/0,-3,Loyalty)}:name(-3: Create spiders) token(Spider,Creature Spider,2/1,black,reach,menace)*2
auto={C(0/0,-8,Loyalty)}:name(-8: Get emblem on combat damage) emblem transforms((,newability[@combatdamagefoeof(player) from(creature|mybattlefield) restriction{compare(oplifelost)~lessthan~8} turnlimited:phaseaction[my combatdamage once] name(Damage opponent) damage:8minusoplifelostminusend opponent])) forever dontremove
text=Whenever a creature you control dies, put a loyalty counter on Lolth, Spider Queen. -- 0: You draw a card and you lose 1 life. -- -3: Create two 2/1 black Spider creature tokens with menace and reach. -- -8: You get an emblem with "Whenever an opponent is dealt combat damage by one or more creatures you control, if that player lost less than 8 life this turn, they lose life equal to the difference."
mana={3}{B}{B}
type=Legendary Planeswalker
subtype=Lolth
[/card]
[card]
name=Lord Windgrace
abilities=canbecommander
auto=counter(0/0,5,Loyalty)
@@ -1729,6 +1779,17 @@ type=Legendary Planeswalker
subtype=Lukka
[/card]
[card]
name=Mordenkainen
auto=counter(0/0,5,Loyalty)
auto={C(0/0,2,Loyalty)}:name(+2: Draw 2 cards) draw:2 && transforms((,newability[name(Put on bottom) target(*|myhand) bottomoflibrary])) forever
auto={C(0/0,-2,Loyalty)}:name(-2: Create Dog Illusion) token(Dog Mor)
auto={C(0/0,-10,Loyalty)}:name(-10: Exchange hand and library) token(Mordenkainen Emblem,Emblem,0/0,shroud,indestructible) and!( transforms((,newability[nomaxhand],newability[all(*|myhand) moveto(myreveal) and!( all(*|mylibrary) moveto(myhand) and!( all(*|myreveal) moveto(mylibrary) and!( shuffle )! )! )!])) forever
text=+2: Draw two cards, then put a card from your hand on the bottom of your library. -- -2: Create a blue Dog Illusion creature token with "This creatures power and toughness are each equal to twice the number of cards in your hand." -- -10: Exchange your hand and library, then shuffle. You get an emblem with "You have no maximum hand size."
mana={4}{U}{U}
type=Legendary Planeswalker
subtype=Mordenkainen
[/card]
[card]
name=Mu Yanling
auto=counter(0/0,5,loyalty)
auto={C(0/0,2,Loyalty)}:name(+2: Target creature can't be blocked) unblockable target(creature)
@@ -1795,10 +1856,11 @@ subtype=Nahiri
[card]
name=Nahiri, the Harbinger
auto=counter(0/0,4,loyalty)
aicode=activate moveto(myBattlefield) notAtarget(artifact,creature|myLibrary) and!( transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveTo(ownerhand)])) forever )!
auto={C(0/0,2,Loyalty)}:name(+2: May discard and draw a card) may notAtarget(*|myHand) transforms((,newability[reject and!(draw:1)!])) forever
aicode=activate target(*[artifact;creature]|myLibrary) moveto(myBattlefield) and!( transforms((,newability[haste],newability[phaseaction[endofturn once sourceinplay] moveTo(ownerhand)])) ueot )!
auto={C(0/0,2,Loyalty)}:name(+2: Don't discard any card) donothing
auto={C(0/0,2,Loyalty)}:name(+2: Discard and draw a card) target(*|myHand) reject and!( draw:1 controller )!
auto={C(0/0,-2,Loyalty)}:name(-2: Exile target enchantment, tapped Artifact or Creature) ability$!name(Choose one) choice name(Exile target enchantment) moveTo(exile) target(enchantment) _ choice name(Exile target tapped creature) moveTo(exile) target(creature[tapped]) _ choice name(Exile target tapped artifact) moveTo(exile) target(artifact[tapped])!$ controller
auto={C(0/0,-8,Loyalty)}:name(-8: Search a creature or artifact) reveal:plibrarycount optionone name(choose a creature or artifact) target(artifact,creature|reveal) moveTo(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveTo(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveTo(ownerlibrary) and!(moveto(myBattlefield) and!( transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveTo(ownerhand)])) oneshot )!)! afterrevealedend revealend
auto={C(0/0,-8,Loyalty)}:name(-8: Search a creature or artifact) reveal:plibrarycount optionone name(choose a creature or artifact) target(*[artifact;creature]|reveal) moveTo(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(*|reveal) moveTo(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!( shuffle )! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(myBattlefield) and!( transforms((,newability[haste],newability[phaseaction[endofturn once sourceinplay] moveTo(ownerhand)])) ueot )! afterrevealedend revealend
text=+2: You may discard a card. If you do, draw a card. -- -2: Exile target enchantment, tapped artifact, or tapped creature. -- -8: Search your library for an artifact or creature card, put it onto the battlefield, then shuffle your library. It gains haste. Return it to your hand at the beginning of the next end step.
mana={2}{R}{W}
type=Legendary Planeswalker
@@ -2835,9 +2897,8 @@ subtype=Vivien
[/card]
[card]
name=Vivien, Monsters' Advocate
abilities=showfromtoplibrary
abilities=showfromtoplibrary,canplaycreaturelibrarytop
aicode=activate moveto(myBattlefield) target(creature[manacost<=storedmanacost]|mylibrary)
auto=canplaycreaturelibrarytop
auto=counter(0/0,3,Loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Create a Creature Beast 3/3) token(Beast Viv)
auto={C(0/0,-2,Loyalty)}:name(-2: Cast a creature to search a lesser creature) emblem transforms((,newability[@movedTo(creature|myStak):moveTo(myBattlefield) target(creature[manacost<=storedmanacost]|myLibrary) && shuffle])) oneshot
@@ -2996,4 +3057,15 @@ text=+1: Add X mana in any combination of {R} and/or {G} to your mana pool, wher
mana={2}{R}{G}
type=Legendary Planeswalker
subtype=Xenagos
[/card]
[/card]
[card]
name=Zariel, Archduke of Avernus
auto=counter(0/0,4,Loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Creatures get 1/0 and haste) all(creature|myBattlefield) transforms((,newability[1/0],newability[haste])) ueot
auto={C(0/0,0,Loyalty)}:name(+0: Create devil) token(Devil,Creature Devil,1/1,red) and!( transforms((,newability[@movedTo(this|graveyard) from(battlefield):name(Deal 1 damage) damage:1 target(player^creature^planeswalker)])) forever )!
auto={C(0/0,-6,Loyalty)}:name(-6: Get emblem on combat phase) emblem transforms((,newability[@combat(attacking) source(creature|myBattlefield) turnlimited:name(Gain new combat phae) nextphasealter(add^combatphases^controller^after<combatends>)],newability[@combat(attacking) source(creature|myBattlefield) turnlimited:name(Untap all creatures after combat ends) all(creature[attacking]|myBattlefield) transforms((,newability[phaseaction[my combatends once sourceinplay] untap])) ueot])) forever dontremove
text=+1: Creatures you control get +1/+0 and gain haste until end of turn. -- 0: Create a 1/1 red Devil creature token with "When this creature dies, it deals 1 damage to any target." -- -6: You get an emblem with "At the end of the first combat phase on your turn, untap target creature you control. After this phase, there is an additional combat phase."
mana={2}{R}{R}
type=Legendary Planeswalker
subtype=Zariel
[/card]

View File

@@ -2,7 +2,7 @@ grade=unsupported
#The cards in this file are not implemented/incomplete yet.
#Updated Card lists not in primitives (Borderline, Crappy, Unsupported and Missing Cards up to Aether Revolt) as of 3/14/2017
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card
#I sorted this programatically - Vitty85 16-06-2021
#I sorted this programatically - Vitty85 16-07-2021
[card]
name="Ach! Hans, Run!"
text=At the beginning of your upkeep, you may say "Ach Hans, run It's the . . ." and name a creature card. If you do, search your library for the named card, put it into play, then shuffle your library. That creature has haste. Remove it from the game at end of turn.
@@ -64,15 +64,6 @@ mana={3}
type=Artifact
[/card]
[card]
name=Absolver Thrull
text=Haunt (When this creature dies, exile it haunting target creature.) -- When Absolver Thrull enters the battlefield or the creature it haunts dies, destroy target enchantment.
mana={3}{W}
type=Creature
subtype=Thrull Cleric
power=2
toughness=3
[/card]
[card]
name=Abstract Iguanart
text=Whenever you cast a spell, note the first letter of its artist's name. If that letter wasn't already noted, put a +1/+1 counter on Abstract Iguanart.
mana={1}{R}
@@ -4730,12 +4721,6 @@ mana={2}{G}
type=Instant
[/card]
[card]
name=Grave Betrayal
text=Whenever a creature you don't control dies, return it to the battlefield under your control with an additional +1/+1 counter on it at the beginning of the next end step. That creature is a black Zombie in addition to its other colors and types.
mana={5}{B}{B}
type=Enchantment
[/card]
[card]
name=Grave Servitude
text=You may cast Grave Servitude as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step. -- Enchant creature -- Enchanted creature gets +3/-1 and is black.
mana={1}{B}
@@ -4889,12 +4874,6 @@ mana={0}
type=Artifact
[/card]
[card]
name=Gutter Grime
text=Whenever a nontoken creature you control dies, put a slime counter on Gutter Grime, then put a green Ooze creature token onto the battlefield with "This creature's power and toughness are each equal to the number of slime counters on Gutter Grime."
mana={4}{G}
type=Enchantment
[/card]
[card]
name=Gyruda, Doom of Depths
text=Companion — Your starting deck contains only cards with even converted mana costs. (If this card is your chosen companion, you may cast it once from outside the game.) -- When Gyruda enters the battlefield, each player puts the top four cards of their library into their graveyard. Put a creature card with an even converted mana cost from among those cards onto the battlefield under your control.
mana={4}{UB}{UB}

View File

@@ -729,6 +729,39 @@ public:
}
};
class TrCardDungeonCompleted: public Trigger
{
public:
bool limitOnceATurn;
int triggeredTurn;
int totaldng;
string playerName;
TrCardDungeonCompleted(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, bool once = false, bool limitOnceATurn = false, int totaldng = 0, string playerName = "") :
Trigger(observer, id, source,once, tc),limitOnceATurn(limitOnceATurn), totaldng(totaldng), playerName(playerName)
{
}
int triggerOnEventImpl(WEvent * event)
{
WEventCardDungeonCompleted * e = dynamic_cast<WEventCardDungeonCompleted *> (event);
if (!e) return 0;
if (limitOnceATurn && triggeredTurn == game->turn)
return 0;
if (totaldng > 0 && totaldng != e->totaldng)
return 0;
if (playerName != "" && playerName != e->playerName)
return 0;
if (!tc->canTarget(e->card)) return 0;
triggeredTurn = game->turn;
return 1;
}
TrCardDungeonCompleted * clone() const
{
return NEW TrCardDungeonCompleted(*this);
}
};
class TrCardRolledDie: public Trigger
{
public:
@@ -747,6 +780,8 @@ public:
if (!e) return 0;
if (limitOnceATurn && triggeredTurn == game->turn)
return 0;
if (rollresult == -1 && e->card->dieNumFaces != e->card->lastRollResult)
return 0;
if (rollresult > 0 && rollresult != e->card->lastRollResult)
return 0;
if (playerName != "" && playerName != e->playerName)
@@ -4027,6 +4062,19 @@ public:
AAExploresEvent * clone() const;
~AAExploresEvent();
};
//Dungeon Completed
class AAAlterDungeonCompleted: public ActivatedAbilityTP
{
public:
int dungeoncounter;
AAAlterDungeonCompleted(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int dungeoncounter, ManaCost * _cost = NULL,
int who = TargetChooser::UNSET);
int resolve();
const string getMenuText();
AAAlterDungeonCompleted * clone() const;
~AAAlterDungeonCompleted();
};
//Yidaro Counter
class AAAlterYidaroCount: public ActivatedAbilityTP
{
@@ -6566,11 +6614,12 @@ class AASetDie: public InstantAbility
{
public:
int side;
int diefaces;
string abilityToAlter;
string abilityWin;
string abilityLose;
MTGAbility * abilityAltered;
AASetDie(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, int side = -1,string toAdd = "");
AASetDie(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, int side = -1, int diefaces = 6, string toAdd = "");
int resolve();
const string getMenuText();
AASetDie * clone() const;
@@ -6582,7 +6631,8 @@ public:
string baseAbility;
AASetDie * setDie;
int userchoice;
GenericRollDie(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, string toAdd = "", ManaCost * cost = NULL, int userchoice = 0);
int diefaces;
GenericRollDie(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, string toAdd = "", ManaCost * cost = NULL, int userchoice = 0, int diefaces = 6);
int resolve();
const string getMenuText();
GenericRollDie * clone() const;

View File

@@ -34,7 +34,8 @@ enum
SBMENU_ADD_NORMAL = 803,
SBMENU_ADD_SB = 804,
SBMENU_ADD_CMD = 805,
SBMENU_ADD_CANCEL = 806
SBMENU_ADD_DNG = 806,
SBMENU_ADD_CANCEL = 807
};
// enums for menu options
@@ -76,7 +77,7 @@ private:
DeckViewerStages mStage;
JMusic * bgMusic;
InteractiveButton *toggleDeckButton, *sb_cmd_Button, *sellCardButton, *statsPrevButton, *filterButton, *toggleViewButton, *toggleUpButton, *toggleDownButton, *toggleLeftButton, *toggleRightButton;
InteractiveButton *toggleDeckButton, *sb_cmd_dng_Button, *sellCardButton, *statsPrevButton, *filterButton, *toggleViewButton, *toggleUpButton, *toggleDownButton, *toggleLeftButton, *toggleRightButton;
WGuiFilters * filterMenu;
WSrcDeckViewer * source;
@@ -91,6 +92,7 @@ private:
DeckDataWrapper * myCollection;
DeckDataWrapper * mySideboard;
DeckDataWrapper * myCommandZone;
DeckDataWrapper * myDungeonZone;
StatsWrapper * mStatsWrapper;
int hudAlpha;
@@ -115,6 +117,7 @@ private:
void toggleView();
void insertSideBoard();
void insertCommandZone();
void insertDungeonZone();
public:
GameStateDeckViewer(GameApp* parent);
virtual ~GameStateDeckViewer();
@@ -122,12 +125,13 @@ public:
void updateFilters();
void rebuildFilters();
void toggleCollection();
void toggleSB_CMD();
void toggleSB_CMD_DNG();
void Start();
virtual void End();
void addRemove(MTGCard * card);
void SBaddRemove(MTGCard * card);
void CMDaddRemove(MTGCard * card);
void DNGaddRemove(MTGCard * card);
void choiceAddRemove(MTGCard * card);
virtual void Update(float dt);
void renderOnScreenBasicInfo();

View File

@@ -117,6 +117,7 @@ public:
int lastFlipResult;
int dieSide;
int lastRollResult;
int dieNumFaces;
int scryedCards;
int stillInUse();

View File

@@ -221,6 +221,7 @@ public:
vector<string> meta_AIHints;
vector<string> Sideboard;
vector<string> CommandZone;
vector<string> DungeonZone;
string meta_unlockRequirements;
int meta_id;
@@ -239,6 +240,7 @@ public:
int remove(MTGCard * card);
void replaceSB(vector<string> newSB = vector<string>());
void replaceCMD(vector<string> newCMD = vector<string>());
void replaceDNG(vector<string> newDNG = vector<string>());
string getFilename();
int save();
int save(const string& destFileName, bool useExpandedDescriptions, const string& deckTitle, const string& deckDesc);

View File

@@ -308,7 +308,13 @@ class Constants
LIFEFAKER = 181,
DOUBLEFACEDEATH = 182,
GAINEDDOUBLEFACEDEATH = 183,
NB_BASIC_ABILITIES = 184,
TWODNGTRG = 184,
NODNGOPP = 185,
NODNGPLR = 186,
CANPLAYAURAEQUIPTOPLIBRARY = 187,//aurasequipment
COUNTERDEATH = 188,
DUNGEONCOMPLETED = 189,
NB_BASIC_ABILITIES = 190,
RARITY_S = 'S', //Special Rarity
RARITY_M = 'M', //Mythics

View File

@@ -250,6 +250,7 @@ public:
MTGCardInstance * putInExile(MTGCardInstance * card);
MTGCardInstance * putInLibrary(MTGCardInstance * card);
MTGCardInstance * putInHand(MTGCardInstance * card);
MTGCardInstance * putInSideboard(MTGCardInstance * card);
MTGCardInstance * putInZone(MTGCardInstance * card, MTGGameZone * from, MTGGameZone * to, bool asCopy = false);
int isInPlay(MTGCardInstance * card);
int isInGrave(MTGCardInstance * card);

View File

@@ -44,6 +44,7 @@ public:
int drawCounter;
int energyCount;
int yidaroCount;
int dungeonCompleted;
int numOfCommandCast;
int monarch;
int surveilOffset;

View File

@@ -390,6 +390,14 @@ struct WEventCardExplored : public WEventCardUpdate {
virtual Targetable * getTarget(int target);
};
//dungeon completed event
struct WEventCardDungeonCompleted : public WEventCardUpdate {
int totaldng;
string playerName;
WEventCardDungeonCompleted(MTGCardInstance * card, int totaldng, string playerName);
virtual Targetable * getTarget(int target);
};
//roll die event
struct WEventCardRollDie : public WEventCardUpdate {
string playerName;

View File

@@ -605,9 +605,14 @@ int PutInGraveyard::resolve()
}
if (card->basicAbilities[(int)Constants::INPLAYDEATH] || card->basicAbilities[(int)Constants::INPLAYTAPDEATH])
{
card->controller()->game->putInZone(card, zone, card->owner->game->battlefield);
if(card->basicAbilities[(int)Constants::INPLAYTAPDEATH])
bool toTap = card->basicAbilities[(int)Constants::INPLAYTAPDEATH];
bool addCounter = card->basicAbilities[(int)Constants::COUNTERDEATH];
card = card->controller()->game->putInZone(card, zone, card->owner->game->graveyard);
card = card->controller()->game->putInZone(card, card->owner->game->graveyard, card->owner->game->battlefield);
if(toTap)
card->tap(true);
if(addCounter)
card->counters->addCounter(1, 1, false);
return 1;
}
if (zone == observer->players[0]->game->inPlay || zone == observer->players[1]->game->inPlay)

View File

@@ -1240,6 +1240,48 @@ AAAlterDevotionOffset::~AAAlterDevotionOffset()
{
}
//AA Dungeon Completed
AAAlterDungeonCompleted::AAAlterDungeonCompleted(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int dungeoncounter, ManaCost * _cost,
int who) :
ActivatedAbilityTP(observer, _id, _source, _target, _cost, who), dungeoncounter(dungeoncounter)
{
}
int AAAlterDungeonCompleted::resolve()
{
Damageable * _target = (Damageable *) getTarget();
if (_target)
{
Player * pTarget = (Player*)_target;
if(pTarget)
{
source = pTarget->game->putInSideboard(source);
source->basicAbilities[Constants::DUNGEONCOMPLETED] = 1;
pTarget->dungeonCompleted += dungeoncounter;
if(pTarget->dungeonCompleted < 0)
pTarget->dungeonCompleted = 0;
WEvent * e = NEW WEventCardDungeonCompleted(source, pTarget->dungeonCompleted, source->controller()->getDisplayName());
game->receiveEvent(e);
}
}
return 0;
}
const string AAAlterDungeonCompleted::getMenuText()
{
WParsedInt parsedNum(dungeoncounter);
return _(parsedNum.getStringValue() + " Dungeon Completed Counter ").c_str();
}
AAAlterDungeonCompleted * AAAlterDungeonCompleted::clone() const
{
return NEW AAAlterDungeonCompleted(*this);
}
AAAlterDungeonCompleted::~AAAlterDungeonCompleted()
{
}
//AA Yidaro Count
AAAlterYidaroCount::AAAlterYidaroCount(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int yidarocount, ManaCost * _cost,
int who) :
@@ -3188,9 +3230,9 @@ AASetCoin::~AASetCoin()
}
//
//rolling a 6 side die
GenericRollDie::GenericRollDie(GameObserver* observer, int id, MTGCardInstance * source, Targetable *, string _toAdd, ManaCost * cost, int userchoice) :
ActivatedAbility(observer, id, source, cost, 0), baseAbility(_toAdd), userchoice(userchoice)
//rolling a generic die
GenericRollDie::GenericRollDie(GameObserver* observer, int id, MTGCardInstance * source, Targetable *, string _toAdd, ManaCost * cost, int userchoice, int diefaces) :
ActivatedAbility(observer, id, source, cost, 0), baseAbility(_toAdd), userchoice(userchoice), diefaces(diefaces)
{
this->GetId();
setDie = NULL;
@@ -3201,17 +3243,17 @@ int GenericRollDie::resolve()
if (!target)
return 0;
vector<MTGAbility*>selection;
if(userchoice > 0 && userchoice < 7){
setDie = NEW AASetDie(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, userchoice, baseAbility);
if(userchoice > 0 && userchoice <= diefaces){
setDie = NEW AASetDie(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, userchoice, diefaces, baseAbility);
MTGAbility * set = setDie->clone();
set->oneShot = true;
game->mLayers->actionLayer()->currentActionCard = (MTGCardInstance *)target;
set->resolve();
SAFE_DELETE(setDie);
} else{
for (int i = 1; i < 7; ++i)
for (int i = 1; i <= diefaces; ++i)
{
setDie = NEW AASetDie(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, i, baseAbility);
setDie = NEW AASetDie(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, i, diefaces, baseAbility);
MTGAbility * set = setDie->clone();
set->oneShot = true;
selection.push_back(set);
@@ -3230,7 +3272,9 @@ int GenericRollDie::resolve()
const string GenericRollDie::getMenuText()
{
return "Roll a Die";
std::stringstream msg;
msg << "Roll a " << diefaces << " faced Die";
return msg.str();
}
GenericRollDie * GenericRollDie::clone() const
@@ -3243,9 +3287,9 @@ GenericRollDie::~GenericRollDie()
{
}
//set color choosen
AASetDie::AASetDie(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * _target, int _side, string toAlter):
InstantAbility(observer, id, source),side(_side), abilityToAlter(toAlter)
//set die result
AASetDie::AASetDie(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * _target, int _side, int _diefaces, string toAlter):
InstantAbility(observer, id, source),side(_side), diefaces(_diefaces), abilityToAlter(toAlter)
{
this->target = _target;
abilityAltered = NULL;
@@ -3256,8 +3300,9 @@ int AASetDie::resolve()
MTGCardInstance * _target = (MTGCardInstance *)target;
_target->dieSide = side;
int roll = 1 + game->getRandomGenerator()->random() % 6;
int roll = 1 + game->getRandomGenerator()->random() % diefaces;
_target->lastRollResult = roll;
_target->dieNumFaces = diefaces;
WEvent * e = NEW WEventCardRollDie(_target, source->controller()->getDisplayName());
game->receiveEvent(e);
vector<string>Win = parseBetween(abilityToAlter,"winability "," winabilityend");
@@ -4473,6 +4518,8 @@ int AAFlip::resolve()
MTGCardInstance * myParent = NULL;
if(_target->target)
myParent = _target->target;
if(_target->nameOrig == "")
_target->nameOrig = _target->name; // Saves the orignal card name before to flip the card.
_target->name = myFlip->name;
_target->setName(myFlip->name);
if(!isflipcard)//transform card

View File

@@ -39,6 +39,7 @@ GameStateDeckViewer::GameStateDeckViewer(GameApp* parent) :
myDeck = NULL;
mySideboard = NULL;
myCommandZone = NULL;
myDungeonZone = NULL;
filterMenu = NULL;
source = NULL;
hudAlpha = 0;
@@ -50,7 +51,7 @@ GameStateDeckViewer::GameStateDeckViewer(GameApp* parent) :
statsPrevButton = NEW InteractiveButton(NULL, kPrevStatsButtonId, Fonts::MAIN_FONT, "Stats", SCREEN_WIDTH_F - 35, SCREEN_HEIGHT_F - 20, JGE_BTN_PREV);
toggleDeckButton = NEW InteractiveButton(NULL, kToggleDeckActionId, Fonts::MAIN_FONT, "View Deck", 10, SCREEN_HEIGHT_F - 20, JGE_BTN_PRI);
sellCardButton = NEW InteractiveButton(NULL, kSellCardActionId, Fonts::MAIN_FONT, "Sell Card", (SCREEN_WIDTH_F/ 2) - 125, SCREEN_HEIGHT_F - 20, JGE_BTN_SEC);
sb_cmd_Button = NEW InteractiveButton(NULL, kSBActionId, Fonts::MAIN_FONT, "View SB/CMD", (SCREEN_WIDTH_F/ 2) - 35, SCREEN_HEIGHT_F - 20, JGE_BTN_SOUND);
sb_cmd_dng_Button = NEW InteractiveButton(NULL, kSBActionId, Fonts::MAIN_FONT, "View SB", (SCREEN_WIDTH_F/ 2) - 35, SCREEN_HEIGHT_F - 20, JGE_BTN_SOUND);
filterButton = NEW InteractiveButton(NULL, kFilterButtonId, Fonts::MAIN_FONT, "Filter", (SCREEN_WIDTH_F - 116), SCREEN_HEIGHT_F - 20, JGE_BTN_CTRL);
//TODO: Check if that button is available:
toggleViewButton = NEW InteractiveButton(NULL, kSwitchViewButton, Fonts::MAIN_FONT, "Grid", (SCREEN_WIDTH_F/ 2) + 50, SCREEN_HEIGHT_F - 20, JGE_BTN_MAX);
@@ -65,7 +66,7 @@ GameStateDeckViewer::~GameStateDeckViewer()
SAFE_DELETE(bgMusic);
SAFE_DELETE(toggleDeckButton);
SAFE_DELETE(sellCardButton);
SAFE_DELETE(sb_cmd_Button);
SAFE_DELETE(sb_cmd_dng_Button);
SAFE_DELETE(statsPrevButton);
SAFE_DELETE(filterButton);
SAFE_DELETE(toggleViewButton);
@@ -90,6 +91,11 @@ GameStateDeckViewer::~GameStateDeckViewer()
SAFE_DELETE(myCommandZone->parent);
SAFE_DELETE(myCommandZone);
}
if (myDungeonZone)
{
SAFE_DELETE(myDungeonZone->parent);
SAFE_DELETE(myDungeonZone);
}
if (myCollection)
{
SAFE_DELETE(myCollection->parent);
@@ -125,7 +131,7 @@ void GameStateDeckViewer::updateFilters()
void GameStateDeckViewer::toggleCollection()
{
if(mView->deck() == mySideboard || mView->deck() == myCommandZone)
if(mView->deck() == mySideboard || mView->deck() == myCommandZone || mView->deck() == myDungeonZone)
return;
if (mView->deck() == myCollection)
@@ -142,7 +148,7 @@ void GameStateDeckViewer::toggleCollection()
updateFilters();
}
void GameStateDeckViewer::toggleSB_CMD()
void GameStateDeckViewer::toggleSB_CMD_DNG()
{
if(mView->deck() == myDeck)
return;
@@ -150,17 +156,22 @@ void GameStateDeckViewer::toggleSB_CMD()
if (mView->deck() == myCollection)
{
mView->SetDeck(mySideboard);
sb_cmd_Button->setText("View CMD");
sb_cmd_dng_Button->setText("View CMD");
}
else if (mView->deck() == mySideboard)
{
mView->SetDeck(myCommandZone);
sb_cmd_Button->setText("View Coll.");
sb_cmd_dng_Button->setText("View DNG");
}
else if (mView->deck() == myCommandZone)
{
mView->SetDeck(myDungeonZone);
sb_cmd_dng_Button->setText("View Coll.");
}
else
{
mView->SetDeck(myCollection);
sb_cmd_Button->setText("View SB/CMD");
sb_cmd_dng_Button->setText("View SB");
}
//source->swapSrc();
//updateFilters();
@@ -210,6 +221,7 @@ void GameStateDeckViewer::Start()
myDeck = NULL;
mySideboard = NULL;
myCommandZone = NULL;
myDungeonZone = NULL;
mStage = STAGE_WELCOME;
last_user_activity = NO_USER_ACTIVITY_HELP_DELAY + 1;
@@ -282,6 +294,11 @@ void GameStateDeckViewer::End()
SAFE_DELETE(myCommandZone->parent);
SAFE_DELETE(myCommandZone);
}
if (myDungeonZone)
{
SAFE_DELETE(myDungeonZone->parent);
SAFE_DELETE(myDungeonZone);
}
SAFE_DELETE(pricelist);
SAFE_DELETE(playerdata);
SAFE_DELETE(filterMenu);
@@ -354,6 +371,28 @@ void GameStateDeckViewer::CMDaddRemove(MTGCard * card)
mView->reloadIndexes();
}
void GameStateDeckViewer::DNGaddRemove(MTGCard * card)
{
if (!card) return;
if ((card->getRarity() != Constants::RARITY_T) || (card->getId() < 1)) return;
if (mView->deck()->Remove(card, 1, (mView->deck() == myDungeonZone)))
{
if (mView->deck() == myCollection)
{
myDungeonZone->Add(card);
myDungeonZone->Sort(WSrcCards::SORT_ALPHA);
}
else
{
myCollection->Add(card);
}
}
myCollection->validate();
myDungeonZone->validate();
mStatsWrapper->needUpdate = true;
mView->reloadIndexes();
}
void GameStateDeckViewer::choiceAddRemove(MTGCard * card)
{
if (!card) return;
@@ -366,19 +405,37 @@ void GameStateDeckViewer::choiceAddRemove(MTGCard * card)
if (mView->deck() == myCollection)
{
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
sbMenu->Add(SBMENU_ADD_NORMAL, "Add to Deck");
sbMenu->Add(SBMENU_ADD_SB, "Add to Sideboard");
if(card->data->hasType("Legendary") && (card->data->hasType("Creature") || card->data->basicAbilities[Constants::CANBECOMMANDER]))
sbMenu->Add(SBMENU_ADD_CMD, "Choose as Commander");
if(!card->data->hasType("Dungeon")){
sbMenu->Add(SBMENU_ADD_NORMAL, "Add to Deck");
sbMenu->Add(SBMENU_ADD_SB, "Add to Sideboard");
if(card->data->hasType("Legendary") && (card->data->hasType("Creature") || card->data->basicAbilities[Constants::CANBECOMMANDER]))
sbMenu->Add(SBMENU_ADD_CMD, "Choose as Commander");
} else
sbMenu->Add(SBMENU_ADD_DNG, "Add to Dungeons");
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
}
else
else if (mView->deck() == myCommandZone)
{
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
sbMenu->Add(SBMENU_ADD_CMD, "Remove as Commander");
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
}
else if (mView->deck() == mySideboard)
{
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
sbMenu->Add(SBMENU_ADD_SB, "Remove from Sideboard");
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
}
else if (mView->deck() == myDungeonZone)
{
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
sbMenu->Add(SBMENU_ADD_DNG, "Remove from Dungeons");
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
}
else if (mView->deck() == myDeck)
{
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
sbMenu->Add(SBMENU_ADD_NORMAL, "Remove Card");
//sbMenu->Add(SBMENU_ADD_SB, "Add to Sideboard");
if(card->data->hasType("Legendary") && (card->data->hasType("Creature") || card->data->basicAbilities[Constants::CANBECOMMANDER]))
sbMenu->Add(SBMENU_ADD_CMD, "Choose as Commander");
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
}
}
@@ -425,6 +482,26 @@ void GameStateDeckViewer::insertCommandZone()
}
}
void GameStateDeckViewer::insertDungeonZone()
{
if(myDungeonZone->getCount())
{
vector<string> newDNG;
for (int i = 0; i < myDungeonZone->Size(true); i++)
{
MTGCard * current = myDungeonZone->getCard(i, true);
int howmanyinDeck = myDungeonZone->count(current);
for (int i = 0; i < howmanyinDeck; i++)
{
stringstream cid;
cid << current->getMTGId();
newDNG.push_back(cid.str());
}
}
myDeck->parent->replaceDNG(newDNG);
}
}
void GameStateDeckViewer::saveDeck()
{
//update the corresponding meta data object
@@ -436,6 +513,8 @@ void GameStateDeckViewer::saveDeck()
insertSideBoard();
//insert commanders to mydeck parents
insertCommandZone();
//insert dungeons to mydeck parents
insertDungeonZone();
//save deck
myDeck->save();
playerdata->save();
@@ -491,7 +570,7 @@ bool GameStateDeckViewer::userPressedButton()
{
return ((toggleDeckButton->ButtonPressed())
|| (sellCardButton->ButtonPressed())
|| (sb_cmd_Button->ButtonPressed())
|| (sb_cmd_dng_Button->ButtonPressed())
|| (statsPrevButton->ButtonPressed())
|| (filterButton->ButtonPressed())
|| (toggleViewButton->ButtonPressed())
@@ -506,7 +585,7 @@ void GameStateDeckViewer::setButtonState(bool state)
{
toggleDeckButton->setIsSelectionValid(state);
sellCardButton->setIsSelectionValid(state);
sb_cmd_Button->setIsSelectionValid(state);
sb_cmd_dng_Button->setIsSelectionValid(state);
statsPrevButton->setIsSelectionValid(state);
filterButton->setIsSelectionValid(state);
toggleViewButton->setIsSelectionValid(state);
@@ -518,12 +597,12 @@ void GameStateDeckViewer::setButtonState(bool state)
void GameStateDeckViewer::RenderButtons()
{
if(mView->deck() != mySideboard && mView->deck() != myCommandZone)
if(mView->deck() != mySideboard && mView->deck() != myCommandZone && mView->deck() != myDungeonZone)
toggleDeckButton->Render();
sellCardButton->Render();
if(mView->deck() != myDeck)
sb_cmd_Button->Render();
if(mView->deck() != mySideboard && mView->deck() != myCommandZone)
sb_cmd_dng_Button->Render();
if(mView->deck() != mySideboard && mView->deck() != myCommandZone && mView->deck() != myDungeonZone)
filterButton->Render();
statsPrevButton->Render();
toggleViewButton->Render();
@@ -631,7 +710,7 @@ void GameStateDeckViewer::Update(float dt)
if (last_user_activity > 0.2)
{
last_user_activity = 0;
toggleSB_CMD();
toggleSB_CMD_DNG();
}
break;
case JGE_BTN_PRI:
@@ -685,9 +764,9 @@ void GameStateDeckViewer::Update(float dt)
break;
case JGE_BTN_MENU:
if(mView->deck() == mySideboard || mView->deck() == myCommandZone)
if(mView->deck() == mySideboard || mView->deck() == myCommandZone || mView->deck() == myDungeonZone)
{
toggleSB_CMD();
toggleSB_CMD_DNG();
}
else
{
@@ -696,7 +775,7 @@ void GameStateDeckViewer::Update(float dt)
}
break;
case JGE_BTN_CTRL:
if (mView->deck() == mySideboard || mView->deck() == myCommandZone)
if (mView->deck() == mySideboard || mView->deck() == myCommandZone || mView->deck() == myDungeonZone)
break;//SB is for viewing add or remove only
else if(!mView->ButtonPressed(JGE_BTN_CTRL))
{
@@ -985,7 +1064,8 @@ void GameStateDeckViewer::renderOnScreenMenu()
int value = myDeck->getCount(WSrcDeck::UNFILTERED_COPIES);
int sb_value = mySideboard->getCount(WSrcDeck::UNFILTERED_COPIES);
int cmd_value = myCommandZone->getCount(WSrcDeck::UNFILTERED_COPIES);
sprintf(buffer, _("Your Deck: %i cards.\nSideboard: %i cards.\nCommanders: %i cards").c_str(), value, sb_value,cmd_value);
int dng_value = myDungeonZone->getCount(WSrcDeck::UNFILTERED_COPIES);
sprintf(buffer, _("Your Deck: %i cards.\nSideboard: %i cards.\nCommanders: %i cards.\nDungeons: %i cards").c_str(), value, sb_value,cmd_value,dng_value);
font->DrawString(buffer, SCREEN_WIDTH - 200 + rightTransition, SCREEN_HEIGHT / 2 + 15);
for (int j = 0; j < Constants::NB_Colors; j++)
@@ -1625,6 +1705,12 @@ int GameStateDeckViewer::loadDeck(int deckid)
SAFE_DELETE(myCommandZone->parent);
SAFE_DELETE(myCommandZone);
}
//dng
if (myDungeonZone)
{
SAFE_DELETE(myDungeonZone->parent);
SAFE_DELETE(myDungeonZone);
}
//temp deck for sb?
MTGDeck * sbtempDeck = NEW MTGDeck(MTGCollection());
if(myDeck->parent)
@@ -1707,10 +1793,52 @@ int GameStateDeckViewer::loadDeck(int deckid)
myCollection->validate();
}
//endcmd
//temp deck for dng?
MTGDeck * dngtempDeck = NEW MTGDeck(MTGCollection());
if(myDeck->parent)
{//add cards from commanders lists
if(myDeck->parent->DungeonZone.size())
{
for(unsigned int j = 0; j < myDeck->parent->DungeonZone.size(); j++)
{
string cardID = myDeck->parent->DungeonZone[j];
dngtempDeck->add(atoi(cardID.c_str()));
}
}
}
myDungeonZone = NEW DeckDataWrapper(dngtempDeck);
for (int i = 0; i < myDungeonZone->Size(true); i++)
{
MTGCard * current = myDungeonZone->getCard(i, true);
int howmanyinDeck = myDungeonZone->count(current);
for (int i = myCollection->count(current); i < howmanyinDeck; i++)
{
cPure = false;
if (cheatmode)
{ //Are we cheating?
playerdata->collection->add(current); //Yup, add it to collection permanently.
myCollection->Add(current);
}
else
{
myDungeonZone->Remove(current,howmanyinDeck-i); //Nope. Remove it from sb.
break;
}
}
myCollection->Remove(current, myDungeonZone->count(current));
}
if (!cPure)
{
myDungeonZone->validate();
myCollection->validate();
}
//enddng
myDeck->Sort(WSrcCards::SORT_ALPHA);
mySideboard->Sort(WSrcCards::SORT_ALPHA);
myCommandZone->Sort(WSrcCards::SORT_ALPHA);
myDungeonZone->Sort(WSrcCards::SORT_ALPHA);
SAFE_DELETE(filterMenu);
rebuildFilters();
mView->reloadIndexes();
@@ -1877,6 +2005,14 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
sbMenu->Close();
break;
}
case SBMENU_ADD_DNG:
{
MTGCard * card = mView->getActiveCard();
if (card)
DNGaddRemove(card);
sbMenu->Close();
break;
}
case SBMENU_ADD_CANCEL:
sbMenu->Close();
break;

View File

@@ -147,7 +147,7 @@ GameState(parent, "duel")
menu = NULL;
popupScreen = NULL;
mGamePhase = DUEL_STATE_UNSET;
taskList = NEW TaskList(options.profileFile(PLAYER_TASKS).c_str());
taskList = NEW TaskList();
#ifdef TESTSUITE
testSuite = NULL;
@@ -190,6 +190,8 @@ void GameStateDuel::Start()
OpponentsDeckid = 0;
bool createDeckMenu=true; // create only a deckmenu if not in tournament
SAFE_DELETE(taskList);
taskList = NEW TaskList();
#ifdef NETWORK_SUPPORT
if(!mParent->mpNetwork) {
@@ -358,6 +360,7 @@ void GameStateDuel::End()
SAFE_DELETE(opponentMenu);
SAFE_DELETE(deckmenu);
SAFE_DELETE(popupScreen);
SAFE_DELETE(taskList);
//reset player for next match (only if actual match is finished)
tournament->End();
@@ -1682,7 +1685,6 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
// break;
case MENUITEM_TASKBOARD:
if(taskList->getState() != TaskList::TASKS_ACTIVE){
taskList->load(options.profileFile(PLAYER_TASKS).c_str());
taskList->Start();
} else {
taskList->End();

View File

@@ -1245,12 +1245,33 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell
if (TargetChooser * tc = parseSimpleTC(s, "explored", card))
return NEW TrCardExplored(observer, id, card, tc, once, limitOnceATurn);
//Dungeon has been completer from a card
if (TargetChooser * tc = parseSimpleTC(s, "dungeoncompleted", card)){
int totaldng = 0;
vector<string>res = parseBetween(s, "total(",")");
if(res.size()){
totaldng = atoi(res[1].c_str());
}
string playerName = "";
vector<string>from = parseBetween(s, "from(",")");
if(from.size() && from[1] == "opponent"){
playerName = card->controller()->opponent()->getDisplayName();
} else if(from.size() && from[1] == "controller"){
playerName = card->controller()->getDisplayName();
}
return NEW TrCardDungeonCompleted(observer, id, card, tc, once, limitOnceATurn, totaldng, playerName);
}
//Roll die has been performed from a card
if (TargetChooser * tc = parseSimpleTC(s, "dierolled", card)){
int rollresult = 0;
vector<string>res = parseBetween(s, "result(",")");
if(res.size()){
rollresult = atoi(res[1].c_str());
if(res[1] == "max"){
rollresult = -1;
} else {
rollresult = atoi(res[1].c_str());
}
}
string playerName = "";
vector<string>from = parseBetween(s, "from(",")");
@@ -1824,6 +1845,10 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
{
size_t pos1 = s.find("transforms(("); // Try to handle pay ability inside ability$! or transforms keywords.
size_t pos2 = s.find("ability$!");
if(pos2 == string::npos)
pos2 = s.find("winability"); // Try to handle pay ability inside winability or loseability keywords.
if(pos2 == string::npos)
pos2 = s.find("loseability");
vector<string> splitMayPaystr = parseBetween(s, "pay(", ")", true);
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && found < pos1 && found < pos2) ||
(pos2 == string::npos && pos1 != string::npos && found < pos1) || (pos1 == string::npos && pos2 != string::npos && found < pos2)){
@@ -1844,9 +1869,13 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
storedAbilityString = splitGrant[1];
size_t pos1 = s.find("transforms(("); // Try to handle grant ability inside ability$! or transforms keywords.
size_t pos2 = s.find("ability$!");
if(pos2 == string::npos)
pos2 = s.find("winability"); // Try to handle grant ability inside winability or loseability keywords.
if(pos2 == string::npos)
pos2 = s.find("loseability");
size_t pos3 = s.find(splitGrant[1]);
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 < pos1 && pos3 < pos2) ||
(pos2 == string::npos && pos1 != string::npos && pos3 < pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 < pos2)){
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 <= pos1 && pos3 <= pos2) ||
(pos2 == string::npos && pos1 != string::npos && pos3 <= pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 <= pos2)){
s = splitGrant[0];
s.append("grant ");
s.append(splitGrant[2]);
@@ -1860,9 +1889,13 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
storedAbilityString = splitRevealx[1];
size_t pos1 = s.find("transforms(("); // Try to handle reveal ability inside ability$! or transforms keywords.
size_t pos2 = s.find("ability$!");
if(pos2 == string::npos)
pos2 = s.find("winability"); // Try to handle reveal ability inside winability or loseability keywords.
if(pos2 == string::npos)
pos2 = s.find("loseability");
size_t pos3 = s.find(splitRevealx[1]);
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 < pos1 && pos3 < pos2) ||
(pos2 == string::npos && pos1 != string::npos && pos3 < pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 < pos2)){
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 <= pos1 && pos3 <= pos2) ||
(pos2 == string::npos && pos1 != string::npos && pos3 <= pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 <= pos2)){
s = splitRevealx[0];
s.append("reveal: ");
s.append(splitRevealx[2]);
@@ -1876,9 +1909,13 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
storedAbilityString = splitScryx[1];
size_t pos1 = s.find("transforms(("); // Try to handle scry ability inside ability$! or transforms keywords.
size_t pos2 = s.find("ability$!");
if(pos2 == string::npos)
pos2 = s.find("winability"); // Try to handle scry ability inside winability or loseability keywords.
if(pos2 == string::npos)
pos2 = s.find("loseability");
size_t pos3 = s.find(splitScryx[1]);
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 < pos1 && pos3 < pos2) ||
(pos2 == string::npos && pos1 != string::npos && pos3 < pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 < pos2)){
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 <= pos1 && pos3 <= pos2) ||
(pos2 == string::npos && pos1 != string::npos && pos3 <= pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 <= pos2)){
s = splitScryx[0];
s.append("scry: ");
s.append(splitScryx[2]);
@@ -1890,6 +1927,10 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
if (found != string::npos && storedString.empty())
{
size_t pos1 = s.find("ability$!"); // Try to handle transforms ability inside ability$! keyword.
if(pos1 == string::npos)
pos1 = s.find("winability"); // Try to handle transforms ability inside winability or loseability keywords.
if(pos1 == string::npos)
pos1 = s.find("loseability");
if(pos1 == string::npos || found < pos1){
size_t real_end = s.find("))", found);
size_t stypesStartIndex = found + 12;
@@ -2687,13 +2728,6 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
return a;
}
//Phase based actions
found = s.find("phaseaction");
if (found != string::npos)
{
return parsePhaseActionAbility(s,card,spell,target,restrictions,id);
}
//flip a coin
vector<string> splitFlipCoin = parseBetween(s, "flipacoin ", " flipend");
if (splitFlipCoin.size())
@@ -2705,22 +2739,124 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
return a;
}
//roll a die
vector<string> splitRollDie = parseBetween(s, "rolladie ", " rollend");
if (splitRollDie.size())
//roll a d4 die
vector<string> splitRollD4 = parseBetween(s, "rolld4 ", " rolld4end");
if (splitRollD4.size())
{
string a1 = splitRollDie[1];
string a1 = splitRollD4[1];
int userchoice = 0;
if(a1[0] >= 48 && a1[0] <= 57){
userchoice = a1[0] - 48;
userchoice = (a1[0] - 48);
a1 = a1.substr(2);
}
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice);
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice, 4);
a->oneShot = 1;
a->canBeInterrupted = false;
return a;
}
//roll a d6 die
vector<string> splitRollD6 = parseBetween(s, "rolld6 ", " rolld6end");
if (splitRollD6.size())
{
string a1 = splitRollD6[1];
int userchoice = 0;
if(a1[0] >= 48 && a1[0] <= 57){
userchoice = (a1[0] - 48);
a1 = a1.substr(2);
}
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice, 6);
a->oneShot = 1;
a->canBeInterrupted = false;
return a;
}
//roll a d8 die
vector<string> splitRollD8 = parseBetween(s, "rolld8 ", " rolld8end");
if (splitRollD8.size())
{
string a1 = splitRollD8[1];
int userchoice = 0;
if(a1[0] >= 48 && a1[0] <= 57){
userchoice = (a1[0] - 48);
a1 = a1.substr(2);
}
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice, 8);
a->oneShot = 1;
a->canBeInterrupted = false;
return a;
}
//roll a d10 die
vector<string> splitRollD10 = parseBetween(s, "rolld10 ", " rolld10end");
if (splitRollD10.size())
{
string a1 = splitRollD10[1];
int userchoice = 0;
if(a1[0] >= 48 && a1[0] <= 57){
if(a1[1] >= 48 && a1[1] <= 57){
userchoice = (a1[0] - 48)*10 + (a1[1] - 48);
a1 = a1.substr(3);
} else {
userchoice = (a1[0] - 48);
a1 = a1.substr(2);
}
}
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice, 10);
a->oneShot = 1;
a->canBeInterrupted = false;
return a;
}
//roll a d12 die
vector<string> splitRollD12 = parseBetween(s, "rolld12 ", " rolld12end");
if (splitRollD12.size())
{
string a1 = splitRollD12[1];
int userchoice = 0;
if(a1[0] >= 48 && a1[0] <= 57){
if(a1[1] >= 48 && a1[1] <= 57){
userchoice = (a1[0] - 48)*10 + (a1[1] - 48);
a1 = a1.substr(3);
} else {
userchoice = (a1[0] - 48);
a1 = a1.substr(2);
}
}
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice, 12);
a->oneShot = 1;
a->canBeInterrupted = false;
return a;
}
//roll a d20 die
vector<string> splitRollD20 = parseBetween(s, "rolld20 ", " rolld20end");
if (splitRollD20.size())
{
string a1 = splitRollD20[1];
int userchoice = 0;
if(a1[0] >= 48 && a1[0] <= 57){
if(a1[1] >= 48 && a1[1] <= 57){
userchoice = (a1[0] - 48)*10 + (a1[1] - 48);
a1 = a1.substr(3);
} else {
userchoice = (a1[0] - 48);
a1 = a1.substr(2);
}
}
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice, 20);
a->oneShot = 1;
a->canBeInterrupted = false;
return a;
}
//Phase based actions
found = s.find("phaseaction");
if (found != string::npos)
{
return parsePhaseActionAbility(s,card,spell,target,restrictions,id);
}
//may pay ability
vector<string> splitMayPaysub = parseBetween(s, "pay[[","]]", true);
if (splitMayPaysub.size())
@@ -3554,6 +3690,17 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
return a;
}
//alter dungeon completed
vector<string> splitDungeonCompleted = parseBetween(s, "completedungeon:", " ", false);
if (splitDungeonCompleted.size())
{
int dungeoncompleted = atoi(splitDungeonCompleted[1].c_str());
Targetable * t = spell ? spell->getNextTarget() : NULL;
MTGAbility * a = NEW AAAlterDungeonCompleted(observer, id, card, t, dungeoncompleted, NULL, who);
a->oneShot = 1;
return a;
}
//alter yidaro counter
vector<string> splitYidaroCounter = parseBetween(s, "alteryidarocount:", " ", false);
if (splitYidaroCounter.size())
@@ -4312,6 +4459,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
if (splitMeldFrom[1].size())
{
splitMeldNames = splitMeldFrom[1];
replace(splitMeldNames.begin(), splitMeldNames.end(), '^', ','); // To allow the usage of ^ instead of , char (e.g. using meldfrom keyword inside transforms)
}
MTGAbility * a = NEW AAMeldFrom(observer, id, card, target, splitMeldNames);
a->oneShot = true;
@@ -4326,6 +4474,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
if (splitMeld[1].size())
{
splitMeldName = splitMeld[1];
replace(splitMeldName.begin(), splitMeldName.end(), '^', ','); // To allow the usage of ^ instead of , char (e.g. using meld keyword inside transforms)
}
MTGAbility * a = NEW AAMeld(observer, id, card, target, splitMeldName);
a->oneShot = true;
@@ -5135,6 +5284,7 @@ int AbilityFactory::abilityEfficiency(MTGAbility * a, Player * p, int mode, Targ
badAbilities[(int)Constants::HANDDEATH] = true;
badAbilities[(int)Constants::GAINEDHANDDEATH] = true;
badAbilities[(int)Constants::INPLAYDEATH] = true;
badAbilities[(int)Constants::COUNTERDEATH] = true;
badAbilities[(int)Constants::INPLAYTAPDEATH] = true;
badAbilities[(int)Constants::DOUBLEFACEDEATH] = true;
badAbilities[(int)Constants::GAINEDDOUBLEFACEDEATH] = true;

View File

@@ -267,6 +267,7 @@ void MTGCardInstance::initMTGCI()
lastFlipResult = -1;
dieSide = 0;
lastRollResult = 0;
dieNumFaces = 0;
scryedCards = 0;
isAttacking = NULL;
storedCard = NULL;
@@ -529,9 +530,14 @@ int MTGCardInstance::toGrave( bool forced )
}
if (basicAbilities[(int)Constants::INPLAYDEATH] || basicAbilities[(int)Constants::INPLAYTAPDEATH])
{
p->game->putInZone(this, p->game->inPlay, owner->game->battlefield);
if(basicAbilities[(int)Constants::INPLAYTAPDEATH])
tap(true);
bool toTap = basicAbilities[(int)Constants::INPLAYTAPDEATH];
bool addCounter = basicAbilities[(int)Constants::COUNTERDEATH];
MTGCardInstance* ret = p->game->putInZone(this, p->game->inPlay, owner->game->graveyard);
ret = p->game->putInZone(ret, owner->game->graveyard, owner->game->battlefield);
if(toTap)
ret->tap(true);
if(addCounter)
ret->counters->addCounter(1, 1, false);
return 1;
}
if (!basicAbilities[(int)Constants::INDESTRUCTIBLE])
@@ -1028,6 +1034,9 @@ bool MTGCardInstance::canPlayFromLibrary()
if(isSorceryorInstant() && (has(Constants::CANPLAYINSTANTSORCERYTOPLIBRARY)
|| (controller()->game->inPlay->nb_cards && controller()->game->inPlay->hasAbility(Constants::CANPLAYINSTANTSORCERYTOPLIBRARY))))
found++;
if((hasSubtype(Subtypes::TYPE_EQUIPMENT) || hasSubtype(Subtypes::TYPE_AURA)) && (has(Constants::CANPLAYAURAEQUIPTOPLIBRARY)
|| (controller()->game->inPlay->nb_cards && controller()->game->inPlay->hasAbility(Constants::CANPLAYAURAEQUIPTOPLIBRARY))))
found++;
if(found > 0)
return true;

View File

@@ -920,9 +920,11 @@ MTGDeck::MTGDeck(const string& config_file, MTGAllCards * _allcards, int meta_on
s.erase(0, s.find_first_not_of("\t\n\v\f\r "));
std::string::const_iterator it = s.begin();
while (it != s.end() && std::isdigit(*it)) ++it;
if(!s.empty() && it == s.end())
Sideboard.push_back(s);
else {
if(!s.empty() && it == s.end()){
MTGCard * card = database->getCardById(atoi(s.c_str()));
if(card && !card->data->hasType("Dungeon")) // To add Dungeons in Sideboard you need to use #DNG tag.
Sideboard.push_back(s);
} else {
int numberOfCopies = 1;
size_t found = s.find(" *");
if (found != string::npos){
@@ -934,9 +936,10 @@ MTGDeck::MTGDeck(const string& config_file, MTGAllCards * _allcards, int meta_on
for (int i = 0; i < numberOfCopies; i++){
std::stringstream str_id;
str_id << card->getId();
Sideboard.push_back(str_id.str());
if(!card->data->hasType("Dungeon")) // To add Dungeons in Sideboard you need to use #DNG tag.
Sideboard.push_back(str_id.str());
}
}else {
} else {
DebugTrace("could not add to Sideboard any card with name: " << s);
}
}
@@ -963,7 +966,7 @@ MTGDeck::MTGDeck(const string& config_file, MTGAllCards * _allcards, int meta_on
CommandZone.push_back(s);
}
}
}else {
} else {
size_t found = s.find(" *");
if (found != string::npos)
s = s.substr(0, found);
@@ -980,12 +983,61 @@ MTGDeck::MTGDeck(const string& config_file, MTGAllCards * _allcards, int meta_on
CommandZone.push_back(str_id.str());
}
}
}else {
} else {
DebugTrace("could not add to CommandZone any card with name: " << s);
}
}
continue;
}
found = s.find("DNG:"); // Now it's possible to add Dungeons even using their Name instead of ID such as normal deck cards.
if (found != string::npos)
{
if(!database) continue;
s = s.substr(found + 4);
s.erase(s.find_last_not_of("\t\n\v\f\r ") + 1);
s.erase(0, s.find_first_not_of("\t\n\v\f\r "));
std::string::const_iterator it = s.begin();
while (it != s.end() && std::isdigit(*it)) ++it;
if(!s.empty() && it == s.end()){
MTGCard * newcard = database->getCardById(atoi(s.c_str()));
if(!DungeonZone.size() && newcard && newcard->data->hasType("Dungeon") && newcard->getRarity() == Constants::RARITY_T) // If no dungeon has been added you can add one.
DungeonZone.push_back(s);
else if(DungeonZone.size() > 0 && newcard && newcard->data->hasType("Dungeon") && newcard->getRarity() == Constants::RARITY_T){ // Try to add the dungeon.
bool found = false;
for(unsigned int i = 0; i < DungeonZone.size(); i++){
MTGCard * oldcard = database->getCardById(atoi((DungeonZone.at(i)).c_str()));
if(oldcard && oldcard->data->name == newcard->data->name)
found = true;
}
if(!found)
DungeonZone.push_back(s);
}
} else {
size_t found = s.find(" *");
if (found != string::npos)
s = s.substr(0, found);
MTGCard * newcard = database->getCardByName(s);
if (newcard){
std::stringstream str_id;
str_id << newcard->getId();
if(!DungeonZone.size() && newcard && newcard->data->hasType("Dungeon") && newcard->getRarity() == Constants::RARITY_T) // If no dungeon has been added you can add one.
DungeonZone.push_back(str_id.str());
else if(DungeonZone.size() > 0 && newcard && newcard->data->hasType("Dungeon") && newcard->getRarity() == Constants::RARITY_T){ // Try to add the dungeon.
bool found = false;
for(unsigned int i = 0; i < DungeonZone.size() && !found; i++){
MTGCard * oldcard = database->getCardById(atoi((DungeonZone.at(i)).c_str()));
if(oldcard && oldcard->data->name == newcard->data->name)
found = true;
}
if(!found)
DungeonZone.push_back(str_id.str());
}
} else {
DebugTrace("could not add to Dungeons any card with name: " << s);
}
}
continue;
}
continue;
}
if (meta_only) continue; //Changed from break in order to read the command tag in metafile.
@@ -1227,6 +1279,16 @@ void MTGDeck::replaceCMD(vector<string> newCMD)
return;
}
void MTGDeck::replaceDNG(vector<string> newDMG)
{
if(newDMG.size())
{
DungeonZone.clear();
DungeonZone = newDMG;
}
return;
}
int MTGDeck::remove(int cardid)
{
if (cards.find(cardid) == cards.end() || cards[cardid] == 0) return 0;
@@ -1318,6 +1380,17 @@ int MTGDeck::save(const string& destFileName, bool useExpandedDescriptions, cons
file << "#CMD:" << checkID << "\n";
}
}
//save dungeons
if(DungeonZone.size())
{
sort(DungeonZone.begin(), DungeonZone.end());
for(unsigned int k = 0; k < DungeonZone.size(); k++)
{
int checkID = atoi(DungeonZone[k].c_str());
if(checkID)
file << "#DNG:" << checkID << "\n";
}
}
file.close();
JFileSystem::GetInstance()->Rename(tmp, destFileName);

View File

@@ -214,7 +214,13 @@ const char* Constants::MTGBasicAbilities[] = {
"undamageable", //It cannot be damaged by any source
"lifefaker", //It's a card wich modify the life increasement when a @lifeof triggers occours (e.g. Angel of Vitality)
"doublefacedeath", //It goes to temp zone after death (e.g. Double face card)
"gaineddoublefacedeath" //It goes to temp after death (use just to give add ability to instants and sorceries which originally have not, e.g. with transforms keyword)
"gaineddoublefacedeath", //It goes to temp after death (use just to give add ability to instants and sorceries which originally have not, e.g. with transforms keyword)
"twodngtrg", //It makes rooms abilities trigger twice (e.g. Hama Pashar, Ruin Seeker)
"nodngopp", //Opponent can't venture (e.g. "Keen-Eared Sentry")
"nodngplr", //Controller can't venture
"canplayauraequiplibrarytop", //auras and equipment
"counterdeath", //It gains a 1/1 counter when it returns from graveyard (to use with inplaydeath and inplaytapdeath)"
"dungeoncompleted" //This dungeon has been completed
};
map<string,int> Constants::MTGBasicAbilitiesMap;

View File

@@ -145,6 +145,21 @@ void MTGPlayerCards::initDeck(MTGDeck * deck)
}
}
}
//dungeon init
if(deck->DungeonZone.size())
{
for(unsigned int j = 0; j < deck->DungeonZone.size(); j++)
{
string cardID = deck->DungeonZone[j];
MTGCard * card = MTGCollection()->getCardById(atoi(cardID.c_str()));
if(card)
{
MTGCardInstance * newCard = NEW MTGCardInstance(card, this);
//Dungeons will be added to sideboard zone...
sideboard->addCard(newCard);
}
}
}
}
MTGPlayerCards::~MTGPlayerCards()
@@ -412,14 +427,25 @@ MTGCardInstance * MTGPlayerCards::putInGraveyard(MTGCardInstance * card)
}
else if (card->getCurrentZone() != card->controller()->game->hand && (card->basicAbilities[(int)Constants::INPLAYDEATH] || card->basicAbilities[(int)Constants::INPLAYTAPDEATH]))
{
MTGCardInstance* ret = putInZone(card, card->getCurrentZone(), card->owner->game->battlefield);
if(card->basicAbilities[(int)Constants::INPLAYTAPDEATH])
bool toTap = card->basicAbilities[(int)Constants::INPLAYTAPDEATH];
bool addCounter = card->basicAbilities[(int)Constants::COUNTERDEATH];
MTGCardInstance* ret = putInZone(card, card->getCurrentZone(), card->owner->game->graveyard);
ret = putInZone(ret, ret->getCurrentZone(), ret->owner->game->battlefield);
if(toTap)
ret->tap(true);
if(addCounter)
ret->counters->addCounter(1, 1, false);
return ret;
}
return putInZone(card, card->currentZone, card->owner->game->graveyard);
}
// Moves a card to its owner's sideboard
MTGCardInstance * MTGPlayerCards::putInSideboard(MTGCardInstance * card)
{
return putInZone(card, card->currentZone, card->owner->game->sideboard);
}
// Moves a card to its owner's exile
MTGCardInstance * MTGPlayerCards::putInExile(MTGCardInstance * card)
{
@@ -836,6 +862,7 @@ MTGCardInstance * MTGGameZone::removeCard(MTGCardInstance * card, int createCopy
copy->basicAbilities[Constants::GAINEDEXILEDEATH] = card->basicAbilities[Constants::GAINEDEXILEDEATH];
copy->basicAbilities[Constants::GAINEDHANDDEATH] = card->basicAbilities[Constants::GAINEDHANDDEATH];
copy->basicAbilities[Constants::GAINEDDOUBLEFACEDEATH] = card->basicAbilities[Constants::GAINEDDOUBLEFACEDEATH];
copy->basicAbilities[Constants::DUNGEONCOMPLETED] = card->basicAbilities[Constants::DUNGEONCOMPLETED];
copy->damageInflictedAsCommander = card->damageInflictedAsCommander;
copy->numofcastfromcommandzone = card->numofcastfromcommandzone;
for (int i = 0; i < ManaCost::MANA_PAID_WITH_BESTOW +1; i++)

View File

@@ -36,6 +36,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck *
drawCounter = 0;
energyCount = 0;
yidaroCount = 0;
dungeonCompleted = 0;
numOfCommandCast = 0;
monarch = 0;
surveilOffset = 0;

View File

@@ -603,6 +603,7 @@ void Rules::initGame(GameObserver *g, bool currentPlayerSet)
p->preventable = initState.playerData[i].player->preventable;
p->energyCount = initState.playerData[i].player->energyCount;
p->yidaroCount = initState.playerData[i].player->yidaroCount;
p->dungeonCompleted = initState.playerData[i].player->dungeonCompleted;
p->numOfCommandCast = initState.playerData[i].player->numOfCommandCast;
p->monarch = initState.playerData[i].player->monarch;
p->surveilOffset = initState.playerData[i].player->surveilOffset;

View File

@@ -317,6 +317,11 @@ WEventCardExplored::WEventCardExplored(MTGCardInstance * card) :
{
}
WEventCardDungeonCompleted::WEventCardDungeonCompleted(MTGCardInstance * card, int totaldng, string playerName) :
WEventCardUpdate(card), totaldng(totaldng), playerName(playerName)
{
}
WEventCardRollDie::WEventCardRollDie(MTGCardInstance * card, string playerName) :
WEventCardUpdate(card), playerName(playerName)
{
@@ -570,6 +575,12 @@ Targetable * WEventCardExplored::getTarget(int target)
return NULL;
}
Targetable * WEventCardDungeonCompleted::getTarget(int target)
{
if (target) return card;
return NULL;
}
Targetable * WEventCardRollDie::getTarget(int target)
{
if (target) return card;

View File

@@ -594,9 +594,21 @@ void WParsedInt::init(string s, Spell * spell, MTGCardInstance * card)
{
intValue = (s == "mypoisoncount")?target->controller()->poisonCount:target->controller()->opponent()->poisonCount;
}
else if(s == "lastrollresult" || s == "lastrollchoice")
else if(s == "lastrollresult" || s == "lastrollchoice" || s == "lastdiefaces" || s == "srclastrollresult" || s == "srclastrollchoice" || s == "srclastdiefaces")
{
intValue = (s == "lastrollresult")?target->lastRollResult:target->dieSide;
intValue = 0;
if(s == "lastrollresult")
intValue = target->lastRollResult;
else if(s == "srclastrollresult")
intValue = card->lastRollResult;
else if(s == "lastrollchoice")
intValue = target->dieSide;
else if(s == "srclastrollchoice")
intValue = card->dieSide;
else if(s == "lastdiefaces")
intValue = target->dieNumFaces;
else if(s == "srclastdiefaces")
intValue = card->dieNumFaces;
}
else if(s == "lastflipresult" || s == "lastflipchoice")
{
@@ -926,6 +938,31 @@ void WParsedInt::init(string s, Spell * spell, MTGCardInstance * card)
}
}
}
else if (s.find("cardcountabil") != string::npos)//Count Total cards with specific ability
{
intValue = 0;
bool different_names = (s.find("diffcardcountabil")!=string::npos)?true:false;
string ability = (s.find("diffcardcountabil")!=string::npos)?s.substr(17):s.substr(13);
vector<string> list;
for (int j = card->controller()->game->inPlay->nb_cards - 1; j >= 0; --j)
{
if (card->controller()->game->inPlay->cards[j]->basicAbilities[Constants::GetBasicAbilityIndex(ability)] == 1){
if(!different_names)
intValue += 1;
else{
bool name_found = false;
for(unsigned int i = 0; i < list.size() && !name_found; i++){
if(list[i] == card->controller()->game->inPlay->cards[j]->name)
name_found = true;
}
if(!name_found){
list.push_back(card->controller()->game->inPlay->cards[j]->name);
intValue += 1;
}
}
}
}
}
else if (s.find("cardcounttype") != string::npos)//Count Total cards of specific type
{
intValue = 0;
@@ -1222,6 +1259,50 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card)
}
}
}
else if (s.find("totalmana") != string::npos)//find the cards with specified total mana in target player library
{
intValue = 0;
bool opponent = (s.find("oppototalmana")!=string::npos)?true:false;
int manavalue = atoi((s.find("oppototalmana")!=string::npos)?s.substr(13).c_str():s.substr(9).c_str());
int totalmana = 0;
Player* p = card->controller();
if (opponent)
p = card->controller()->opponent();
for (int j = p->game->library->nb_cards - 1; j >= 0 && totalmana < manavalue; --j){
totalmana += p->game->library->cards[j]->getManaCost()->getConvertedCost();
intValue = p->game->library->nb_cards - j;
}
}
else if (s == "pdungeoncompleted" || s == "odungeoncompleted")
{
intValue = (s == "pdungeoncompleted")?card->controller()->dungeonCompleted:card->controller()->opponent()->dungeonCompleted;
}
else if (s == "pwrtotatt" || s == "thstotatt")//count Total Power or toughness of attacking creatures (e.g. Battle Cry Goblin)
{
intValue = 0;
for (int j = card->controller()->game->inPlay->nb_cards - 1; j >= 0; --j)
{
if (card->controller()->game->inPlay->cards[j]->hasType(Subtypes::TYPE_CREATURE) && card->controller()->game->inPlay->cards[j]->attacker){
if(s == "pwrtotatt")
intValue += card->controller()->game->inPlay->cards[j]->getCurrentPower();
else
intValue += card->controller()->game->inPlay->cards[j]->getCurrentToughness();
}
}
}
else if (s == "pwrtotblo" || s == "thstotblo")//count Total Power or toughness of blocking creatures
{
intValue = 0;
for (int j = card->controller()->game->inPlay->nb_cards - 1; j >= 0; --j)
{
if (card->controller()->game->inPlay->cards[j]->hasType(Subtypes::TYPE_CREATURE) && card->controller()->game->inPlay->cards[j]->defenser){
if(s == "pwrtotblo")
intValue += card->controller()->game->inPlay->cards[j]->getCurrentPower();
else
intValue += card->controller()->game->inPlay->cards[j]->getCurrentToughness();
}
}
}
else if(!intValue)//found nothing, try parsing a atoi
{
intValue = atoi(s.c_str());